From 9eb7d6cac2669b3bc40a0694aed09651dd1cc038 Mon Sep 17 00:00:00 2001 From: Paula Quispe Date: Wed, 2 Aug 2017 16:06:56 -0400 Subject: [PATCH] HOR-2689 --- bootstrap/autoload.php | 14 + composer.json | 110 +- gulliver/bin/gulliver.php | 2 - gulliver/bin/tasks/pakeGulliver.php | 54 +- .../tasks/templates/permissionsList.php.tpl | 2 +- gulliver/bin/tasks/templates/pluginClass.tpl | 4 +- .../bin/tasks/templates/pluginMainFile.tpl | 6 +- .../templates/pluginOnTransitList.php.tpl | 4 +- gulliver/bin/tasks/templates/pluginStep.tpl | 2 +- .../pluginStepApplicationAjax.php.tpl | 4 +- .../bin/tasks/templates/pluginWelcome.php.tpl | 2 +- .../bin/tasks/templates/rolesList.php.tpl | 2 +- .../tasks/templates/skinPluginMainClass.tpl | 2 +- .../bin/tasks/templates/sysGeneric.php.tpl | 24 +- gulliver/bin/tasks/templates/unitTest.tpl | 2 +- .../bin/tasks/templates/usersList.php.tpl | 2 +- gulliver/bin/tasks/templates/welcome.php.tpl | 2 +- gulliver/core/Bootstrap.php | 2 +- gulliver/js/grid/core/grid.js | 1 - gulliver/js/maborak/core/maborak.js | 2 +- .../plugins/pmSimpleUploader/uploader.php | 5 +- gulliver/methods/defaultAjax.php | 2 +- gulliver/methods/errors/block.php | 2 +- gulliver/methods/errors/error403.php | 2 +- gulliver/methods/genericAjax.php | 7 +- gulliver/methods/loader.php | 2 - gulliver/methods/pagedTableAjax.php | 9 +- gulliver/methods/propelTableAjax.php | 9 +- gulliver/system/class.bootstrap.php | 360 +- gulliver/system/class.database_mysql.php | 17 +- gulliver/system/class.dbMaintenance.php | 89 +- gulliver/system/class.dbconnection.php | 2 +- gulliver/system/class.g.php | 267 +- gulliver/system/class.headPublisher.php | 2 - gulliver/system/class.helper.php | 2 +- gulliver/system/class.inputfilter.php | 1 - gulliver/system/class.mailer.php | 2 +- gulliver/system/class.menu.php | 2 +- gulliver/system/class.monologProvider.php | 2 - gulliver/system/class.pagedTable.php | 4 +- gulliver/system/class.publisher.php | 17 +- gulliver/system/class.rbac.php | 127 +- gulliver/system/class.soapNtlm.php | 2 +- gulliver/system/class.tree.php | 2 +- gulliver/system/class.webResource.php | 8 +- gulliver/system/class.xmlDocument.php | 4 +- gulliver/system/class.xmlform.php | 13 +- .../thirdparty/pear/archive_tar/.gitignore | 6 + .../thirdparty/pear/archive_tar/.travis.sh | 5 + .../thirdparty/pear/archive_tar/.travis.yml | 15 + .../pear/archive_tar/Archive/Tar.php | 2421 +++++ .../thirdparty/pear/archive_tar/README.md | 33 + .../thirdparty/pear/archive_tar/composer.json | 54 + .../pear/archive_tar/docs/Archive_Tar.txt | 475 + .../thirdparty/pear/archive_tar/package.xml | 544 + .../pear/archive_tar/scripts/phptar.in | 236 + .../thirdparty/pear/archive_tar/sync-php4 | 6 + .../pear/archive_tar/tests/deadlinks.phpt | 46 + .../pear/archive_tar/tests/dirtraversal.phpt | 24 + .../archive_tar/tests/hamidTARtester2.tar | Bin 0 -> 3072 bytes .../pear/archive_tar/tests/invalidblock.phpt | 20 + .../pear/archive_tar/tests/longfilename.phpt | 29 + .../pear/archive_tar/tests/pax.phpt | 13 + .../pear/archive_tar/tests/permissions.phpt | 18 + .../pear/archive_tar/tests/phpt_test.php.inc | 414 + .../pear/archive_tar/tests/setup.php.inc | 4 + .../pear/archive_tar/tests/symlink.phpt | 24 + .../pear/archive_tar/tests/testblock1/a.txt | 1 + .../tests/testblock1/bugTriggeringPng.png | Bin 0 -> 17218 bytes .../archive_tar/tests/testblock2}/.gitignore | 0 .../pear/archive_tar/tests/testpax.tar | Bin 0 -> 10240 bytes .../pear/archive_tar/tests/testperms.tar | Bin 0 -> 10240 bytes .../pear/archive_tar/tests/testsymlink.tar | Bin 0 -> 10240 bytes .../thirdparty/pear/console_getopt/.gitignore | 6 + .../pear/console_getopt/.travis.yml | 9 + .../pear/console_getopt/Console/Getopt.php | 360 + .../thirdparty/pear/console_getopt/LICENSE | 25 + .../thirdparty/pear/console_getopt/README.rst | 26 + .../pear/console_getopt/composer.json | 35 + .../pear/console_getopt/package.xml | 269 + .../pear/console_getopt/tests/001-getopt.phpt | 63 + .../pear/console_getopt/tests/bug10557.phpt | 22 + .../pear/console_getopt/tests/bug11068.phpt | 44 + .../pear/console_getopt/tests/bug13140.phpt | 75 + .../pear/pear-core-minimal/README.rst | 26 + .../pear/pear-core-minimal/composer.json | 32 + .../pear/pear-core-minimal/src/OS/Guess.php | 337 + .../pear/pear-core-minimal/src/PEAR.php | 1113 ++ .../pear/pear-core-minimal/src/PEAR/Error.php | 14 + .../pear-core-minimal/src/PEAR/ErrorStack.php | 979 ++ .../pear/pear-core-minimal/src/System.php | 622 ++ .../thirdparty/pear/pear_exception/.gitignore | 6 + .../pear/pear_exception/.travis.yml | 7 + .../thirdparty/pear/pear_exception/LICENSE | 27 + .../pear/pear_exception/PEAR/Exception.php | 456 + .../pear/pear_exception/composer.json | 43 + .../pear/pear_exception/package.xml | 120 + .../tests/PEAR/ExceptionTest.php | 78 + .../HTMLPurifier/HTMLPurifier.auto.php | 22 +- .../HTMLPurifier/HTMLPurifier.autoload.php | 54 +- .../HTMLPurifier/HTMLPurifier.composer.php | 8 +- .../HTMLPurifier/HTMLPurifier.func.php | 50 +- .../HTMLPurifier/HTMLPurifier.includes.php | 458 +- .../HTMLPurifier/HTMLPurifier.kses.php | 60 +- .../HTMLPurifier/HTMLPurifier.path.php | 22 +- .../HTMLPurifier/HTMLPurifier.php | 584 +- .../HTMLPurifier.safe-includes.php | 446 +- .../HTMLPurifier/HTMLPurifier/Arborize.php | 142 +- .../HTMLPurifier/AttrCollections.php | 286 +- .../HTMLPurifier/HTMLPurifier/AttrDef.php | 276 +- .../HTMLPurifier/HTMLPurifier/AttrDef/CSS.php | 212 +- .../HTMLPurifier/AttrDef/CSS/AlphaValue.php | 68 +- .../HTMLPurifier/AttrDef/CSS/Background.php | 222 +- .../AttrDef/CSS/BackgroundPosition.php | 314 +- .../HTMLPurifier/AttrDef/CSS/Border.php | 112 +- .../HTMLPurifier/AttrDef/CSS/Color.php | 210 +- .../HTMLPurifier/AttrDef/CSS/Composite.php | 96 +- .../AttrDef/CSS/DenyElementDecorator.php | 88 +- .../HTMLPurifier/AttrDef/CSS/Filter.php | 154 +- .../HTMLPurifier/AttrDef/CSS/Font.php | 352 +- .../HTMLPurifier/AttrDef/CSS/FontFamily.php | 438 +- .../HTMLPurifier/AttrDef/CSS/Ident.php | 64 +- .../AttrDef/CSS/ImportantDecorator.php | 112 +- .../HTMLPurifier/AttrDef/CSS/Length.php | 154 +- .../HTMLPurifier/AttrDef/CSS/ListStyle.php | 224 +- .../HTMLPurifier/AttrDef/CSS/Multiple.php | 142 +- .../HTMLPurifier/AttrDef/CSS/Number.php | 168 +- .../HTMLPurifier/AttrDef/CSS/Percentage.php | 108 +- .../AttrDef/CSS/TextDecoration.php | 92 +- .../HTMLPurifier/AttrDef/CSS/URI.php | 148 +- .../HTMLPurifier/AttrDef/Clone.php | 88 +- .../HTMLPurifier/AttrDef/Enum.php | 146 +- .../HTMLPurifier/AttrDef/HTML/Bool.php | 102 +- .../HTMLPurifier/AttrDef/HTML/Class.php | 96 +- .../HTMLPurifier/AttrDef/HTML/Color.php | 102 +- .../HTMLPurifier/AttrDef/HTML/FrameTarget.php | 76 +- .../HTMLPurifier/AttrDef/HTML/ID.php | 210 +- .../HTMLPurifier/AttrDef/HTML/Length.php | 112 +- .../HTMLPurifier/AttrDef/HTML/LinkTypes.php | 144 +- .../HTMLPurifier/AttrDef/HTML/MultiLength.php | 120 +- .../HTMLPurifier/AttrDef/HTML/Nmtokens.php | 140 +- .../HTMLPurifier/AttrDef/HTML/Pixels.php | 152 +- .../HTMLPurifier/AttrDef/Integer.php | 182 +- .../HTMLPurifier/AttrDef/Lang.php | 172 +- .../HTMLPurifier/AttrDef/Switch.php | 106 +- .../HTMLPurifier/AttrDef/Text.php | 42 +- .../HTMLPurifier/HTMLPurifier/AttrDef/URI.php | 222 +- .../HTMLPurifier/AttrDef/URI/Email.php | 40 +- .../AttrDef/URI/Email/SimpleCheck.php | 58 +- .../HTMLPurifier/AttrDef/URI/Host.php | 256 +- .../HTMLPurifier/AttrDef/URI/IPv4.php | 90 +- .../HTMLPurifier/AttrDef/URI/IPv6.php | 178 +- .../HTMLPurifier/AttrTransform.php | 120 +- .../HTMLPurifier/AttrTransform/Background.php | 56 +- .../HTMLPurifier/AttrTransform/BdoDir.php | 54 +- .../HTMLPurifier/AttrTransform/BgColor.php | 56 +- .../HTMLPurifier/AttrTransform/BoolToCSS.php | 94 +- .../HTMLPurifier/AttrTransform/Border.php | 52 +- .../HTMLPurifier/AttrTransform/EnumToCSS.php | 136 +- .../AttrTransform/ImgRequired.php | 96 +- .../HTMLPurifier/AttrTransform/ImgSpace.php | 122 +- .../HTMLPurifier/AttrTransform/Input.php | 112 +- .../HTMLPurifier/AttrTransform/Lang.php | 62 +- .../HTMLPurifier/AttrTransform/Length.php | 90 +- .../HTMLPurifier/AttrTransform/Name.php | 66 +- .../HTMLPurifier/AttrTransform/NameSync.php | 82 +- .../HTMLPurifier/AttrTransform/Nofollow.php | 104 +- .../HTMLPurifier/AttrTransform/SafeEmbed.php | 50 +- .../HTMLPurifier/AttrTransform/SafeObject.php | 56 +- .../HTMLPurifier/AttrTransform/SafeParam.php | 158 +- .../AttrTransform/ScriptRequired.php | 46 +- .../AttrTransform/TargetBlank.php | 90 +- .../HTMLPurifier/AttrTransform/Textarea.php | 54 +- .../HTMLPurifier/HTMLPurifier/AttrTypes.php | 192 +- .../HTMLPurifier/AttrValidator.php | 356 +- .../HTMLPurifier/HTMLPurifier/Bootstrap.php | 248 +- .../HTMLPurifier/CSSDefinition.php | 948 +- .../HTMLPurifier/HTMLPurifier/ChildDef.php | 104 +- .../HTMLPurifier/ChildDef/Chameleon.php | 134 +- .../HTMLPurifier/ChildDef/Custom.php | 204 +- .../HTMLPurifier/ChildDef/Empty.php | 76 +- .../HTMLPurifier/ChildDef/List.php | 172 +- .../HTMLPurifier/ChildDef/Optional.php | 90 +- .../HTMLPurifier/ChildDef/Required.php | 236 +- .../ChildDef/StrictBlockquote.php | 220 +- .../HTMLPurifier/ChildDef/Table.php | 448 +- .../HTMLPurifier/HTMLPurifier/Config.php | 1822 ++-- .../HTMLPurifier/ConfigSchema.php | 352 +- .../ConfigSchema/Builder/ConfigSchema.php | 96 +- .../HTMLPurifier/ConfigSchema/Builder/Xml.php | 288 +- .../HTMLPurifier/ConfigSchema/Exception.php | 22 +- .../HTMLPurifier/ConfigSchema/Interchange.php | 94 +- .../ConfigSchema/Interchange/Directive.php | 178 +- .../ConfigSchema/Interchange/Id.php | 116 +- .../ConfigSchema/InterchangeBuilder.php | 452 +- .../HTMLPurifier/ConfigSchema/Validator.php | 496 +- .../ConfigSchema/ValidatorAtom.php | 260 +- .../HTMLPurifier/ConfigSchema/schema.ser | Bin .../schema/Attr.AllowedClasses.txt | 16 +- .../schema/Attr.AllowedFrameTargets.txt | 24 +- .../ConfigSchema/schema/Attr.AllowedRel.txt | 18 +- .../ConfigSchema/schema/Attr.AllowedRev.txt | 18 +- .../schema/Attr.ClassUseCDATA.txt | 38 +- .../schema/Attr.DefaultImageAlt.txt | 22 +- .../schema/Attr.DefaultInvalidImage.txt | 18 +- .../schema/Attr.DefaultInvalidImageAlt.txt | 16 +- .../schema/Attr.DefaultTextDir.txt | 20 +- .../ConfigSchema/schema/Attr.EnableID.txt | 32 +- .../schema/Attr.ForbiddenClasses.txt | 16 +- .../ConfigSchema/schema/Attr.IDBlacklist.txt | 10 +- .../schema/Attr.IDBlacklistRegexp.txt | 18 +- .../ConfigSchema/schema/Attr.IDPrefix.txt | 24 +- .../schema/Attr.IDPrefixLocal.txt | 28 +- .../schema/AutoFormat.AutoParagraph.txt | 62 +- .../ConfigSchema/schema/AutoFormat.Custom.txt | 24 +- .../schema/AutoFormat.DisplayLinkURI.txt | 22 +- .../schema/AutoFormat.Linkify.txt | 24 +- .../AutoFormat.PurifierLinkify.DocURL.txt | 24 +- .../schema/AutoFormat.PurifierLinkify.txt | 24 +- ...rmat.RemoveEmpty.RemoveNbsp.Exceptions.txt | 22 +- .../AutoFormat.RemoveEmpty.RemoveNbsp.txt | 30 +- .../schema/AutoFormat.RemoveEmpty.txt | 92 +- ...utoFormat.RemoveSpansWithoutAttributes.txt | 22 +- .../schema/CSS.AllowImportant.txt | 16 +- .../ConfigSchema/schema/CSS.AllowTricky.txt | 22 +- .../ConfigSchema/schema/CSS.AllowedFonts.txt | 24 +- .../schema/CSS.AllowedProperties.txt | 36 +- .../ConfigSchema/schema/CSS.DefinitionRev.txt | 22 +- .../schema/CSS.ForbiddenProperties.txt | 26 +- .../ConfigSchema/schema/CSS.MaxImgLength.txt | 32 +- .../ConfigSchema/schema/CSS.Proprietary.txt | 20 +- .../ConfigSchema/schema/CSS.Trusted.txt | 18 +- .../schema/Cache.DefinitionImpl.txt | 28 +- .../schema/Cache.SerializerPath.txt | 26 +- .../schema/Cache.SerializerPermissions.txt | 22 +- .../schema/Core.AggressivelyFixLt.txt | 36 +- .../schema/Core.AllowHostnameUnderscore.txt | 32 +- .../schema/Core.CollectErrors.txt | 24 +- .../schema/Core.ColorKeywords.txt | 58 +- .../schema/Core.ConvertDocumentToFragment.txt | 28 +- .../Core.DirectLexLineNumberSyncInterval.txt | 34 +- .../schema/Core.DisableExcludes.txt | 28 +- .../ConfigSchema/schema/Core.EnableIDNA.txt | 18 +- .../ConfigSchema/schema/Core.Encoding.txt | 30 +- .../schema/Core.EscapeInvalidChildren.txt | 24 +- .../schema/Core.EscapeInvalidTags.txt | 14 +- .../schema/Core.EscapeNonASCIICharacters.txt | 26 +- .../schema/Core.HiddenElements.txt | 38 +- .../ConfigSchema/schema/Core.Language.txt | 20 +- .../ConfigSchema/schema/Core.LexerImpl.txt | 68 +- .../schema/Core.MaintainLineNumbers.txt | 32 +- .../schema/Core.NormalizeNewlines.txt | 22 +- .../schema/Core.RemoveInvalidImg.txt | 24 +- .../Core.RemoveProcessingInstructions.txt | 22 +- .../schema/Core.RemoveScriptContents.txt | 24 +- .../ConfigSchema/schema/Filter.Custom.txt | 22 +- .../Filter.ExtractStyleBlocks.Escaping.txt | 28 +- .../Filter.ExtractStyleBlocks.Scope.txt | 58 +- .../Filter.ExtractStyleBlocks.TidyImpl.txt | 32 +- .../schema/Filter.ExtractStyleBlocks.txt | 148 +- .../ConfigSchema/schema/Filter.YouTube.txt | 32 +- .../ConfigSchema/schema/HTML.Allowed.txt | 50 +- .../schema/HTML.AllowedAttributes.txt | 38 +- .../schema/HTML.AllowedComments.txt | 20 +- .../schema/HTML.AllowedCommentsRegexp.txt | 30 +- .../schema/HTML.AllowedElements.txt | 46 +- .../schema/HTML.AllowedModules.txt | 40 +- .../schema/HTML.Attr.Name.UseCDATA.txt | 22 +- .../ConfigSchema/schema/HTML.BlockWrapper.txt | 36 +- .../ConfigSchema/schema/HTML.CoreModules.txt | 46 +- .../schema/HTML.CustomDoctype.txt | 18 +- .../ConfigSchema/schema/HTML.DefinitionID.txt | 66 +- .../schema/HTML.DefinitionRev.txt | 32 +- .../ConfigSchema/schema/HTML.Doctype.txt | 22 +- .../schema/HTML.FlashAllowFullScreen.txt | 22 +- .../schema/HTML.ForbiddenAttributes.txt | 42 +- .../schema/HTML.ForbiddenElements.txt | 40 +- .../ConfigSchema/schema/HTML.MaxImgLength.txt | 28 +- .../ConfigSchema/schema/HTML.Nofollow.txt | 14 +- .../ConfigSchema/schema/HTML.Parent.txt | 24 +- .../ConfigSchema/schema/HTML.Proprietary.txt | 24 +- .../ConfigSchema/schema/HTML.SafeEmbed.txt | 26 +- .../ConfigSchema/schema/HTML.SafeIframe.txt | 26 +- .../ConfigSchema/schema/HTML.SafeObject.txt | 26 +- .../schema/HTML.SafeScripting.txt | 20 +- .../ConfigSchema/schema/HTML.Strict.txt | 18 +- .../ConfigSchema/schema/HTML.TargetBlank.txt | 16 +- .../ConfigSchema/schema/HTML.TidyAdd.txt | 16 +- .../ConfigSchema/schema/HTML.TidyLevel.txt | 48 +- .../ConfigSchema/schema/HTML.TidyRemove.txt | 16 +- .../ConfigSchema/schema/HTML.Trusted.txt | 18 +- .../ConfigSchema/schema/HTML.XHTML.txt | 22 +- .../schema/Output.CommentScriptContents.txt | 20 +- .../schema/Output.FixInnerHTML.txt | 30 +- .../schema/Output.FlashCompat.txt | 22 +- .../ConfigSchema/schema/Output.Newline.txt | 26 +- .../ConfigSchema/schema/Output.SortAttr.txt | 28 +- .../ConfigSchema/schema/Output.TidyFormat.txt | 50 +- .../ConfigSchema/schema/Test.ForceNoIconv.txt | 14 +- .../schema/URI.AllowedSchemes.txt | 34 +- .../ConfigSchema/schema/URI.Base.txt | 34 +- .../ConfigSchema/schema/URI.DefaultScheme.txt | 20 +- .../ConfigSchema/schema/URI.DefinitionID.txt | 22 +- .../ConfigSchema/schema/URI.DefinitionRev.txt | 22 +- .../ConfigSchema/schema/URI.Disable.txt | 28 +- .../schema/URI.DisableExternal.txt | 22 +- .../schema/URI.DisableExternalResources.txt | 26 +- .../schema/URI.DisableResources.txt | 30 +- .../ConfigSchema/schema/URI.Host.txt | 38 +- .../ConfigSchema/schema/URI.HostBlacklist.txt | 18 +- .../ConfigSchema/schema/URI.MakeAbsolute.txt | 26 +- .../ConfigSchema/schema/URI.Munge.txt | 166 +- .../schema/URI.MungeResources.txt | 34 +- .../schema/URI.MungeSecretKey.txt | 60 +- .../schema/URI.OverrideAllowedSchemes.txt | 18 +- .../schema/URI.SafeIframeRegexp.txt | 44 +- .../HTMLPurifier/ConfigSchema/schema/info.ini | 6 +- .../HTMLPurifier/HTMLPurifier/ContentSets.php | 340 +- .../HTMLPurifier/HTMLPurifier/Context.php | 190 +- .../HTMLPurifier/HTMLPurifier/Definition.php | 110 +- .../HTMLPurifier/DefinitionCache.php | 258 +- .../DefinitionCache/Decorator.php | 224 +- .../DefinitionCache/Decorator/Cleanup.php | 156 +- .../DefinitionCache/Decorator/Memory.php | 170 +- .../DefinitionCache/Decorator/Template.php.in | 164 +- .../HTMLPurifier/DefinitionCache/Null.php | 152 +- .../DefinitionCache/Serializer.php | 642 +- ...6bfe16a0cc6bd18d813b83121ef2eaf16545,1.ser | Bin ...c5afbc77123dbd4e9e026a723c450e9f844b,1.ser | Bin .../DefinitionCache/Serializer/README | 6 +- .../HTMLPurifier/DefinitionCacheFactory.php | 212 +- .../HTMLPurifier/HTMLPurifier/Doctype.php | 146 +- .../HTMLPurifier/DoctypeRegistry.php | 284 +- .../HTMLPurifier/HTMLPurifier/ElementDef.php | 432 +- .../HTMLPurifier/HTMLPurifier/Encoder.php | 1222 +-- .../HTMLPurifier/EntityLookup.php | 96 +- .../HTMLPurifier/EntityLookup/entities.ser | 0 .../HTMLPurifier/EntityParser.php | 306 +- .../HTMLPurifier/ErrorCollector.php | 488 +- .../HTMLPurifier/HTMLPurifier/ErrorStruct.php | 148 +- .../HTMLPurifier/HTMLPurifier/Exception.php | 24 +- .../HTMLPurifier/HTMLPurifier/Filter.php | 112 +- .../Filter/ExtractStyleBlocks.php | 676 +- .../HTMLPurifier/Filter/YouTube.php | 130 +- .../HTMLPurifier/HTMLPurifier/Generator.php | 572 +- .../HTMLPurifier/HTMLDefinition.php | 986 +- .../HTMLPurifier/HTMLPurifier/HTMLModule.php | 568 +- .../HTMLPurifier/HTMLModule/Bdo.php | 88 +- .../HTMLModule/CommonAttributes.php | 62 +- .../HTMLPurifier/HTMLModule/Edit.php | 110 +- .../HTMLPurifier/HTMLModule/Forms.php | 380 +- .../HTMLPurifier/HTMLModule/Hypertext.php | 80 +- .../HTMLPurifier/HTMLModule/Iframe.php | 102 +- .../HTMLPurifier/HTMLModule/Image.php | 98 +- .../HTMLPurifier/HTMLModule/Legacy.php | 372 +- .../HTMLPurifier/HTMLModule/List.php | 102 +- .../HTMLPurifier/HTMLModule/Name.php | 52 +- .../HTMLPurifier/HTMLModule/Nofollow.php | 50 +- .../HTMLModule/NonXMLCommonAttributes.php | 40 +- .../HTMLPurifier/HTMLModule/Object.php | 124 +- .../HTMLPurifier/HTMLModule/Presentation.php | 84 +- .../HTMLPurifier/HTMLModule/Proprietary.php | 80 +- .../HTMLPurifier/HTMLModule/Ruby.php | 72 +- .../HTMLPurifier/HTMLModule/SafeEmbed.php | 80 +- .../HTMLPurifier/HTMLModule/SafeObject.php | 124 +- .../HTMLPurifier/HTMLModule/SafeScripting.php | 80 +- .../HTMLPurifier/HTMLModule/Scripting.php | 146 +- .../HTMLModule/StyleAttribute.php | 66 +- .../HTMLPurifier/HTMLModule/Tables.php | 150 +- .../HTMLPurifier/HTMLModule/Target.php | 56 +- .../HTMLPurifier/HTMLModule/TargetBlank.php | 48 +- .../HTMLPurifier/HTMLModule/Text.php | 174 +- .../HTMLPurifier/HTMLModule/Tidy.php | 460 +- .../HTMLPurifier/HTMLModule/Tidy/Name.php | 66 +- .../HTMLModule/Tidy/Proprietary.php | 68 +- .../HTMLPurifier/HTMLModule/Tidy/Strict.php | 86 +- .../HTMLModule/Tidy/Transitional.php | 32 +- .../HTMLPurifier/HTMLModule/Tidy/XHTML.php | 52 +- .../HTMLModule/Tidy/XHTMLAndHTML4.php | 358 +- .../HTMLModule/XMLCommonAttributes.php | 40 +- .../HTMLPurifier/HTMLModuleManager.php | 918 +- .../HTMLPurifier/IDAccumulator.php | 114 +- .../HTMLPurifier/HTMLPurifier/Injector.php | 562 +- .../HTMLPurifier/Injector/AutoParagraph.php | 712 +- .../HTMLPurifier/Injector/DisplayLinkURI.php | 80 +- .../HTMLPurifier/Injector/Linkify.php | 118 +- .../HTMLPurifier/Injector/PurifierLinkify.php | 142 +- .../HTMLPurifier/Injector/RemoveEmpty.php | 202 +- .../Injector/RemoveSpansWithoutAttributes.php | 168 +- .../HTMLPurifier/Injector/SafeObject.php | 242 +- .../HTMLPurifier/HTMLPurifier/Language.php | 408 +- .../Language/classes/en-x-test.php | 18 +- .../Language/messages/en-x-test.php | 22 +- .../Language/messages/en-x-testmini.php | 24 +- .../HTMLPurifier/Language/messages/en.php | 110 +- .../HTMLPurifier/LanguageFactory.php | 418 +- .../HTMLPurifier/HTMLPurifier/Length.php | 320 +- .../HTMLPurifier/HTMLPurifier/Lexer.php | 714 +- .../HTMLPurifier/Lexer/DOMLex.php | 560 +- .../HTMLPurifier/Lexer/DirectLex.php | 1078 +- .../HTMLPurifier/HTMLPurifier/Lexer/PH5P.php | 9576 ++++++++--------- .../HTMLPurifier/HTMLPurifier/Node.php | 98 +- .../HTMLPurifier/Node/Comment.php | 72 +- .../HTMLPurifier/Node/Element.php | 118 +- .../HTMLPurifier/HTMLPurifier/Node/Text.php | 108 +- .../HTMLPurifier/PercentEncoder.php | 222 +- .../HTMLPurifier/HTMLPurifier/Printer.php | 436 +- .../HTMLPurifier/Printer/CSSDefinition.php | 88 +- .../HTMLPurifier/Printer/ConfigForm.css | 20 +- .../HTMLPurifier/Printer/ConfigForm.js | 10 +- .../HTMLPurifier/Printer/ConfigForm.php | 894 +- .../HTMLPurifier/Printer/HTMLDefinition.php | 648 +- .../HTMLPurifier/PropertyList.php | 244 +- .../HTMLPurifier/PropertyListIterator.php | 84 +- .../HTMLPurifier/HTMLPurifier/Queue.php | 112 +- .../HTMLPurifier/HTMLPurifier/Strategy.php | 52 +- .../HTMLPurifier/Strategy/Composite.php | 60 +- .../HTMLPurifier/Strategy/Core.php | 34 +- .../HTMLPurifier/Strategy/FixNesting.php | 362 +- .../HTMLPurifier/Strategy/MakeWellFormed.php | 1200 +-- .../Strategy/RemoveForeignElements.php | 414 +- .../Strategy/ValidateAttributes.php | 90 +- .../HTMLPurifier/HTMLPurifier/StringHash.php | 94 +- .../HTMLPurifier/StringHashParser.php | 272 +- .../HTMLPurifier/TagTransform.php | 74 +- .../HTMLPurifier/TagTransform/Font.php | 228 +- .../HTMLPurifier/TagTransform/Simple.php | 88 +- .../HTMLPurifier/HTMLPurifier/Token.php | 200 +- .../HTMLPurifier/Token/Comment.php | 76 +- .../HTMLPurifier/HTMLPurifier/Token/Empty.php | 30 +- .../HTMLPurifier/HTMLPurifier/Token/End.php | 48 +- .../HTMLPurifier/HTMLPurifier/Token/Start.php | 20 +- .../HTMLPurifier/HTMLPurifier/Token/Tag.php | 136 +- .../HTMLPurifier/HTMLPurifier/Token/Text.php | 106 +- .../HTMLPurifier/TokenFactory.php | 236 +- .../HTMLPurifier/HTMLPurifier/URI.php | 628 +- .../HTMLPurifier/URIDefinition.php | 224 +- .../HTMLPurifier/HTMLPurifier/URIFilter.php | 148 +- .../URIFilter/DisableExternal.php | 108 +- .../URIFilter/DisableExternalResources.php | 50 +- .../URIFilter/DisableResources.php | 44 +- .../HTMLPurifier/URIFilter/HostBlacklist.php | 92 +- .../HTMLPurifier/URIFilter/MakeAbsolute.php | 316 +- .../HTMLPurifier/URIFilter/Munge.php | 230 +- .../HTMLPurifier/URIFilter/SafeIframe.php | 136 +- .../HTMLPurifier/HTMLPurifier/URIParser.php | 142 +- .../HTMLPurifier/HTMLPurifier/URIScheme.php | 204 +- .../HTMLPurifier/URIScheme/data.php | 254 +- .../HTMLPurifier/URIScheme/file.php | 88 +- .../HTMLPurifier/URIScheme/ftp.php | 116 +- .../HTMLPurifier/URIScheme/http.php | 72 +- .../HTMLPurifier/URIScheme/https.php | 36 +- .../HTMLPurifier/URIScheme/mailto.php | 80 +- .../HTMLPurifier/URIScheme/news.php | 70 +- .../HTMLPurifier/URIScheme/nntp.php | 64 +- .../HTMLPurifier/URISchemeRegistry.php | 162 +- .../HTMLPurifier/UnitConverter.php | 614 +- .../HTMLPurifier/HTMLPurifier/VarParser.php | 396 +- .../HTMLPurifier/VarParser/Flexible.php | 260 +- .../HTMLPurifier/VarParser/Native.php | 76 +- .../HTMLPurifier/VarParserException.php | 22 +- .../HTMLPurifier/HTMLPurifier/Zipper.php | 314 +- .../creole/CallableStatement.php | 0 .../creole/Connection.php | 0 .../creole/Creole.php | 6 +- .../creole/CreoleTypes.php | 0 .../creole/IdGenerator.php | 0 .../creole/PreparedStatement.php | 0 .../creole/ResultSet.php | 0 .../creole/ResultSetIterator.php | 0 .../creole/SQLException.php | 0 .../creole/Statement.php | 0 .../creole/common/ConnectionCommon.php | 0 .../creole/common/PreparedStatementCommon.php | 0 .../creole/common/ResultSetCommon.php | 0 .../creole/common/StatementCommon.php | 0 .../creole/contrib/DBArrayConnection.php | 0 .../creole/contrib/DebugConnection.php | 0 .../drivers/mssql/MSSQLCallableStatement.php | 0 .../creole/drivers/mssql/MSSQLConnection.php | 0 .../creole/drivers/mssql/MSSQLIdGenerator.php | 0 .../drivers/mssql/MSSQLPreparedStatement.php | 0 .../creole/drivers/mssql/MSSQLResultSet.php | 0 .../creole/drivers/mssql/MSSQLStatement.php | 0 .../creole/drivers/mssql/MSSQLTypes.php | 0 .../mssql/metadata/MSSQLDatabaseInfo.php | 0 .../drivers/mssql/metadata/MSSQLTableInfo.php | 0 .../creole/drivers/mysql/MySQLConnection.php | 0 .../creole/drivers/mysql/MySQLIdGenerator.php | 0 .../drivers/mysql/MySQLPreparedStatement.php | 0 .../creole/drivers/mysql/MySQLResultSet.php | 0 .../creole/drivers/mysql/MySQLStatement.php | 0 .../creole/drivers/mysql/MySQLTypes.php | 0 .../mysql/metadata/MySQLDatabaseInfo.php | 0 .../drivers/mysql/metadata/MySQLTableInfo.php | 0 .../drivers/mysqli/MySQLiConnection.php | 0 .../drivers/mysqli/MySQLiIdGenerator.php | 0 .../mysqli/MySQLiPreparedStatement.php | 0 .../creole/drivers/mysqli/MySQLiResultSet.php | 0 .../creole/drivers/mysqli/MySQLiStatement.php | 0 .../mysqli/metadata/MySQLiDatabaseInfo.php | 0 .../mysqli/metadata/MySQLiTableInfo.php | 0 .../drivers/odbc/ODBCCachedResultSet.php | 0 .../creole/drivers/odbc/ODBCConnection.php | 0 .../creole/drivers/odbc/ODBCIdGenerator.php | 0 .../drivers/odbc/ODBCPreparedStatement.php | 0 .../creole/drivers/odbc/ODBCResultSet.php | 0 .../drivers/odbc/ODBCResultSetCommon.php | 0 .../creole/drivers/odbc/ODBCStatement.php | 0 .../creole/drivers/odbc/ODBCTypes.php | 0 .../creole/drivers/odbc/README | 0 .../drivers/odbc/adapters/CodeBaseAdapter.php | 0 .../drivers/odbc/adapters/MySQLAdapter.php | 0 .../drivers/odbc/adapters/ODBCAdapter.php | 0 .../odbc/metadata/ODBCDatabaseInfo.php | 0 .../drivers/odbc/metadata/ODBCTableInfo.php | 0 .../creole/drivers/oracle/OCI8Connection.php | 31 +- .../creole/drivers/oracle/OCI8IdGenerator.php | 0 .../drivers/oracle/OCI8PreparedStatement.php | 0 .../creole/drivers/oracle/OCI8ResultSet.php | 0 .../creole/drivers/oracle/OCI8Statement.php | 0 .../creole/drivers/oracle/OCI8Types.php | 0 .../oracle/metadata/OCI8DatabaseInfo.php | 0 .../drivers/oracle/metadata/OCI8TableInfo.php | 0 .../creole/drivers/pgsql/PgSQLConnection.php | 0 .../creole/drivers/pgsql/PgSQLIdGenerator.php | 0 .../drivers/pgsql/PgSQLPreparedStatement.php | 0 .../creole/drivers/pgsql/PgSQLResultSet.php | 0 .../drivers/pgsql/PgSQLResultSetIterator.php | 0 .../creole/drivers/pgsql/PgSQLStatement.php | 0 .../creole/drivers/pgsql/PgSQLTypes.php | 0 .../pgsql/metadata/PgSQLDatabaseInfo.php | 0 .../drivers/pgsql/metadata/PgSQLTableInfo.php | 0 .../creole/metadata/ColumnInfo.php | 0 .../creole/metadata/DatabaseInfo.php | 0 .../creole/metadata/ForeignKeyInfo.php | 0 .../creole/metadata/IndexInfo.php | 0 .../creole/metadata/PrimaryKeyInfo.php | 0 .../creole/metadata/TableInfo.php | 0 .../creole/util/Blob.php | 140 +- .../creole/util/Clob.php | 10 +- .../creole/util/Lob.php | 486 +- .../creole/util/sql/SQLStatementExtractor.php | 326 +- .../geshi/contrib/aliased.php | 0 .../geshi/contrib/cssgen.php | 0 .../geshi/contrib/cssgen2.php | 0 .../geshi/contrib/langcheck.php | 0 .../thirdparty => thirdparty}/geshi/geshi.php | 16 +- .../geshi/geshi/bash.php | 0 .../geshi/geshi/javascript.php | 0 .../geshi/geshi/jquery.php | 0 .../geshi/geshi/php.php | 0 .../geshi/geshi/xml.php | 0 .../html2ps_pdf/.htaccess | 2 +- .../html2ps_pdf/autofix.url.php | 0 .../html2ps_pdf/background.image.php | 0 .../html2ps_pdf/background.position.php | 0 .../html2ps_pdf/box.block.inline.php | 0 .../html2ps_pdf/box.block.php | 0 .../html2ps_pdf/box.body.php | 0 .../html2ps_pdf/box.br.php | 0 .../html2ps_pdf/box.button.php | 0 .../html2ps_pdf/box.button.reset.php | 0 .../html2ps_pdf/box.button.submit.php | 0 .../html2ps_pdf/box.checkbutton.php | 16 +- .../html2ps_pdf/box.container.php | 0 .../html2ps_pdf/box.field.pageno.php | 0 .../html2ps_pdf/box.field.pages.php | 0 .../html2ps_pdf/box.form.php | 0 .../html2ps_pdf/box.frame.php | 0 .../html2ps_pdf/box.generic.formatted.php | 0 .../html2ps_pdf/box.generic.inline.php | 0 .../html2ps_pdf/box.generic.php | 0 .../html2ps_pdf/box.iframe.php | 0 .../html2ps_pdf/box.img.php | 0 .../html2ps_pdf/box.inline.control.php | 0 .../html2ps_pdf/box.inline.php | 0 .../html2ps_pdf/box.inline.simple.php | 0 .../html2ps_pdf/box.input.img.php | 0 .../html2ps_pdf/box.input.password.php | 0 .../html2ps_pdf/box.input.text.php | 0 .../html2ps_pdf/box.input.textarea.php | 0 .../html2ps_pdf/box.legend.php | 0 .../html2ps_pdf/box.list-item.php | 0 .../html2ps_pdf/box.note-call.class.php | 0 .../html2ps_pdf/box.null.php | 0 .../html2ps_pdf/box.page.margin.class.php | 0 .../html2ps_pdf/box.page.php | 0 .../html2ps_pdf/box.php | 0 .../html2ps_pdf/box.radiobutton.php | 16 +- .../html2ps_pdf/box.select.php | 0 .../html2ps_pdf/box.table.cell.fake.php | 0 .../html2ps_pdf/box.table.cell.php | 0 .../html2ps_pdf/box.table.php | 0 .../html2ps_pdf/box.table.row.php | 0 .../html2ps_pdf/box.table.section.php | 0 .../html2ps_pdf/box.text.php | 0 .../html2ps_pdf/box.text.string.php | 0 .../html2ps_pdf/box.utils.text-align.inc.php | 0 .../html2ps_pdf/box.whitespace.php | 0 thirdparty/html2ps_pdf/cache/.gitignore | 0 .../html2ps_pdf/classes/include.php | 0 .../classes/org/active-link/doc/DocHTML.php | 0 .../classes/org/active-link/doc/Method.php | 0 .../classes/org/active-link/doc/PHPClass.php | 0 .../org/active-link/net/HTTPClient.php | 0 .../org/active-link/net/HTTPServer.php | 0 .../classes/org/active-link/net/Socket.php | 0 .../classes/org/active-link/sys/File.php | 0 .../classes/org/active-link/xml/Branch.php | 0 .../classes/org/active-link/xml/Leaf.php | 0 .../classes/org/active-link/xml/RSS.php | 0 .../classes/org/active-link/xml/Tag.php | 0 .../classes/org/active-link/xml/Tree.php | 0 .../classes/org/active-link/xml/XML.php | 0 .../classes/org/active-link/xml/XMLBranch.php | 0 .../org/active-link/xml/XMLDocument.php | 0 .../classes/org/active-link/xml/XMLLeaf.php | 0 .../org/active-link/xml/XMLRPCClient.php | 0 .../classes/org/active-link/xml/XPath.php | 0 .../html2ps_pdf/config.inc.php | 0 .../html2ps_pdf/config.parse.php | 0 .../html2ps_pdf/content_type.class.php | 0 .../html2ps_pdf/converter.class.php | 0 .../css.background.attachment.inc.php | 0 .../html2ps_pdf/css.background.color.inc.php | 0 .../html2ps_pdf/css.background.image.inc.php | 0 .../html2ps_pdf/css.background.inc.php | 0 .../css.background.position.inc.php | 0 .../html2ps_pdf/css.background.repeat.inc.php | 0 .../css.border.bottom.color.inc.php | 0 .../html2ps_pdf/css.border.bottom.inc.php | 0 .../css.border.bottom.style.inc.php | 0 .../css.border.bottom.width.inc.php | 0 .../html2ps_pdf/css.border.collapse.inc.php | 0 .../html2ps_pdf/css.border.color.inc.php | 0 .../html2ps_pdf/css.border.inc.php | 0 .../html2ps_pdf/css.border.left.color.inc.php | 0 .../html2ps_pdf/css.border.left.inc.php | 0 .../html2ps_pdf/css.border.left.style.inc.php | 0 .../html2ps_pdf/css.border.left.width.inc.php | 0 .../css.border.right.color.inc.php | 0 .../html2ps_pdf/css.border.right.inc.php | 0 .../css.border.right.style.inc.php | 0 .../css.border.right.width.inc.php | 0 .../html2ps_pdf/css.border.style.inc.php | 0 .../html2ps_pdf/css.border.top.color.inc.php | 0 .../html2ps_pdf/css.border.top.inc.php | 0 .../html2ps_pdf/css.border.top.style.inc.php | 0 .../html2ps_pdf/css.border.top.width.inc.php | 0 .../html2ps_pdf/css.border.width.inc.php | 0 .../html2ps_pdf/css.bottom.inc.php | 0 .../html2ps_pdf/css.cache.class.php | 16 +- .../html2ps_pdf/css.clear.inc.php | 0 .../html2ps_pdf/css.color.inc.php | 0 .../html2ps_pdf/css.colors.inc.php | 0 .../html2ps_pdf/css.constants.inc.php | 0 .../html2ps_pdf/css.content.inc.php | 0 .../html2ps_pdf/css.counter.collection.php | 0 .../html2ps_pdf/css.counter.php | 0 .../html2ps_pdf/css.direction.inc.php | 0 .../html2ps_pdf/css.display.inc.php | 0 .../html2ps_pdf/css.float.inc.php | 0 .../html2ps_pdf/css.font-family.inc.php | 0 .../html2ps_pdf/css.font-size.inc.php | 0 .../html2ps_pdf/css.font-style.inc.php | 0 .../html2ps_pdf/css.font-weight.inc.php | 0 .../html2ps_pdf/css.font.inc.php | 0 .../html2ps_pdf/css.frame.inc.php | 0 .../html2ps_pdf/css.height.inc.php | 0 .../css.html2ps.html.content.inc.php | 0 .../css.html2ps.pseudoelements.inc.php | 0 .../html2ps_pdf/css.inc.php | 0 .../html2ps_pdf/css.left.inc.php | 0 .../html2ps_pdf/css.letter-spacing.inc.php | 0 .../html2ps_pdf/css.line-height.inc.php | 0 .../html2ps_pdf/css.list-style-image.inc.php | 0 .../css.list-style-position.inc.php | 0 .../html2ps_pdf/css.list-style-type.inc.php | 0 .../html2ps_pdf/css.list-style.inc.php | 0 .../html2ps_pdf/css.margin.inc.php | 0 .../html2ps_pdf/css.max-height.inc.php | 0 .../html2ps_pdf/css.min-height.inc.php | 0 .../html2ps_pdf/css.min-width.inc.php | 0 .../html2ps_pdf/css.orphans.inc.php | 0 .../html2ps_pdf/css.overflow.inc.php | 0 .../html2ps_pdf/css.padding.inc.php | 0 .../html2ps_pdf/css.page-break-after.inc.php | 0 .../html2ps_pdf/css.page-break-before.inc.php | 0 .../html2ps_pdf/css.page-break-inside.inc.php | 0 .../html2ps_pdf/css.page-break.inc.php | 0 .../html2ps_pdf/css.page.inc.php | 0 .../html2ps_pdf/css.parse.inc.php | 0 .../html2ps_pdf/css.parse.media.inc.php | 0 .../html2ps_pdf/css.parse.properties.php | 0 .../html2ps_pdf/css.position.inc.php | 0 .../html2ps_pdf/css.property.collection.php | 0 .../html2ps_pdf/css.property.declaration.php | 0 .../css.property.handler.class.php | 0 .../css.property.stringset.class.php | 0 .../html2ps_pdf/css.property.sub.class.php | 0 .../css.property.sub.field.class.php | 0 .../html2ps_pdf/css.pseudo.add.margin.inc.php | 0 .../html2ps_pdf/css.pseudo.align.inc.php | 0 .../css.pseudo.cellpadding.inc.php | 0 .../css.pseudo.cellspacing.inc.php | 0 .../css.pseudo.form.action.inc.php | 0 .../css.pseudo.form.radiogroup.inc.php | 0 .../css.pseudo.link.destination.inc.php | 0 .../css.pseudo.link.target.inc.php | 0 .../css.pseudo.listcounter.inc.php | 0 .../html2ps_pdf/css.pseudo.localalign.inc.php | 0 .../html2ps_pdf/css.pseudo.nowrap.inc.php | 0 .../css.pseudo.table.border.inc.php | 0 .../html2ps_pdf/css.right.inc.php | 0 .../html2ps_pdf/css.rules.inc.php | 0 .../html2ps_pdf/css.rules.page.inc.php | 0 .../html2ps_pdf/css.ruleset.class.php | 0 .../html2ps_pdf/css.selectors.inc.php | 0 .../html2ps_pdf/css.state.class.php | 0 .../html2ps_pdf/css.table-layout.inc.php | 0 .../html2ps_pdf/css.text-align.inc.php | 0 .../html2ps_pdf/css.text-decoration.inc.php | 0 .../html2ps_pdf/css.text-indent.inc.php | 0 .../html2ps_pdf/css.text-transform.inc.php | 0 .../html2ps_pdf/css.top.inc.php | 0 .../html2ps_pdf/css.utils.inc.php | 0 .../html2ps_pdf/css.vertical-align.inc.php | 0 .../html2ps_pdf/css.visibility.inc.php | 0 .../html2ps_pdf/css.white-space.inc.php | 0 .../html2ps_pdf/css.widows.inc.php | 0 .../html2ps_pdf/css.width.inc.php | 0 .../html2ps_pdf/css.word-spacing.inc.php | 0 .../html2ps_pdf/css.z-index.inc.php | 0 .../html2ps_pdf/default.css | 0 .../html2ps_pdf/demo/.htaccess | 0 .../html2ps_pdf/demo/generic.param.php | 90 +- .../html2ps_pdf/demo/html2ps.php | 458 +- .../html2ps_pdf/demo/htmltopdf.php | 458 +- .../html2ps_pdf/demo/index.php | 998 +- .../html2ps_pdf/demo/phpinfo.php | 0 .../html2ps_pdf/demo/systemcheck.footer.tpl | 0 .../html2ps_pdf/demo/systemcheck.header.tpl | 0 .../html2ps_pdf/demo/systemcheck.php | 1356 +-- .../html2ps_pdf/demo/test.php | 0 .../html2ps_pdf/destination._http.class.php | 0 .../destination._interface.class.php | 0 .../html2ps_pdf/destination.browser.class.php | 0 .../destination.download.class.php | 0 .../html2ps_pdf/destination.file.class.php | 0 .../html2ps_pdf/dispatcher.class.php | 0 .../html2ps_pdf/doc.anchor.class.php | 0 .../html2ps_pdf/dom.activelink.inc.php | 0 .../html2ps_pdf/dom.php5.inc.php | 0 .../html2ps_pdf/encoding.cp1251.inc.php | 0 .../html2ps_pdf/encoding.cp866.inc.php | 0 .../html2ps_pdf/encoding.dingbats.inc.php | 0 .../html2ps_pdf/encoding.entities.inc.php | 0 .../html2ps_pdf/encoding.glyphs.inc.php | 0 .../html2ps_pdf/encoding.inc.php | 0 .../html2ps_pdf/encoding.iso-8859-1.inc.php | 0 .../html2ps_pdf/encoding.iso-8859-10.inc.php | 0 .../html2ps_pdf/encoding.iso-8859-11.inc.php | 0 .../html2ps_pdf/encoding.iso-8859-13.inc.php | 0 .../html2ps_pdf/encoding.iso-8859-14.inc.php | 0 .../html2ps_pdf/encoding.iso-8859-15.inc.php | 0 .../html2ps_pdf/encoding.iso-8859-2.inc.php | 0 .../html2ps_pdf/encoding.iso-8859-3.inc.php | 0 .../html2ps_pdf/encoding.iso-8859-4.inc.php | 0 .../html2ps_pdf/encoding.iso-8859-5.inc.php | 0 .../html2ps_pdf/encoding.iso-8859-6.inc.php | 0 .../html2ps_pdf/encoding.iso-8859-7.inc.php | 0 .../html2ps_pdf/encoding.iso-8859-8.inc.php | 0 .../html2ps_pdf/encoding.iso-8859-9.inc.php | 0 .../html2ps_pdf/encoding.koi8-r.inc.php | 0 .../html2ps_pdf/encoding.symbol.inc.php | 0 .../html2ps_pdf/encoding.windows-1250.inc.php | 0 .../html2ps_pdf/encoding.windows-1251.inc.php | 0 .../html2ps_pdf/encoding.windows-1252.inc.php | 0 .../html2ps_pdf/error.php | 0 .../html2ps_pdf/favicon.ico | 0 .../html2ps_pdf/fetched_data._html.class.php | 0 .../fetched_data._interface.class.php | 0 .../html2ps_pdf/fetched_data.file.class.php | 0 .../html2ps_pdf/fetched_data.url.class.php | 0 .../html2ps_pdf/fetcher._interface.class.php | 0 .../html2ps_pdf/fetcher.local.class.php | 0 .../html2ps_pdf/fetcher.memory.class.php | 0 .../html2ps_pdf/fetcher.url.class.php | 0 .../html2ps_pdf/fetcher.url.curl.class.php | 0 .../filter.data._interface.class.php | 0 .../html2ps_pdf/filter.data.doctype.class.php | 0 .../filter.data.encoding.class.php | 0 .../filter.data.html2xhtml.class.php | 0 .../html2ps_pdf/filter.data.ucs2.class.php | 0 .../html2ps_pdf/filter.data.utf8.class.php | 0 .../filter.data.xhtml2xhtml.class.php | 0 .../filter.output._interface.class.php | 0 .../html2ps_pdf/filter.output.gzip.class.php | 0 .../filter.output.ps2pdf.class.php | 0 .../filter.post._interface.class.php | 0 .../filter.post.positioned.class.php | 0 .../filter.post.postponed.class.php | 0 .../filter.pre._interface.class.php | 0 .../html2ps_pdf/filter.pre.fields.class.php | 0 .../filter.pre.footnotes.class.php | 0 .../html2ps_pdf/filter.pre.headfoot.class.php | 0 .../filter.pre.height-constraint.class.php | 0 .../html2ps_pdf/flow_context.class.inc.php | 0 .../html2ps_pdf/flow_viewport.class.inc.php | 0 .../html2ps_pdf/font.class.php | 0 .../html2ps_pdf/font.constants.inc.php | 0 .../html2ps_pdf/font.resolver.class.php | 0 .../html2ps_pdf/font_factory.class.php | 0 .../html2ps_pdf/fonts/arial.afm | 5280 ++++----- .../html2ps_pdf/fonts/arial.ttf | Bin .../html2ps_pdf/fonts/arialbd.afm | 5280 ++++----- .../html2ps_pdf/fonts/arialbd.ttf | Bin .../html2ps_pdf/fonts/arialbi.afm | 3668 +++---- .../html2ps_pdf/fonts/arialbi.ttf | Bin .../html2ps_pdf/fonts/ariali.afm | 3742 +++---- .../html2ps_pdf/fonts/ariali.ttf | Bin .../html2ps_pdf/fonts/cour.afm | 2744 ++--- .../html2ps_pdf/fonts/cour.ttf | Bin .../html2ps_pdf/fonts/courbd.afm | 2744 ++--- .../html2ps_pdf/fonts/courbd.ttf | Bin .../html2ps_pdf/fonts/courbi.afm | 1988 ++-- .../html2ps_pdf/fonts/courbi.ttf | Bin .../html2ps_pdf/fonts/couri.afm | 1994 ++-- .../html2ps_pdf/fonts/couri.ttf | Bin .../html2ps_pdf/fonts/georgia.ttf | Bin .../html2ps_pdf/fonts/georgiab.ttf | Bin .../html2ps_pdf/fonts/georgiai.ttf | Bin .../html2ps_pdf/fonts/georgiaz.ttf | Bin .../html2ps_pdf/fonts/print_glyphs.ps | 258 +- .../html2ps_pdf/fonts/symbol.afm | 556 +- .../html2ps_pdf/fonts/symbol.ttf | Bin .../html2ps_pdf/fonts/times.afm | 5198 ++++----- .../html2ps_pdf/fonts/times.ttf | Bin .../html2ps_pdf/fonts/timesbd.afm | 5194 ++++----- .../html2ps_pdf/fonts/timesbd.ttf | Bin .../html2ps_pdf/fonts/timesbi.afm | 3686 +++---- .../html2ps_pdf/fonts/timesbi.ttf | Bin .../html2ps_pdf/fonts/timesi.afm | 3638 +++---- .../html2ps_pdf/fonts/timesi.ttf | Bin .../html2ps_pdf/fonts/verdana.ttf | Bin .../html2ps_pdf/fonts/verdanab.ttf | Bin .../html2ps_pdf/fonts/verdanai.ttf | Bin .../html2ps_pdf/fonts/verdanaz.ttf | Bin .../html2ps_pdf/globals.inc.php | 0 .../html2ps_pdf/globals.php | 0 .../html2ps_pdf/height.php | 0 .../help/UML/Custom_fetcher_session.png | Bin .../html2ps_pdf/help/UML/Data_filters.PNG | Bin .../html2ps_pdf/help/UML/Destinations.PNG | Bin .../html2ps_pdf/help/UML/Fetchers.PNG | Bin .../html2ps_pdf/help/UML/Layout_engines.PNG | Bin .../help/UML/Multiple_fetcher_session.PNG | Bin .../html2ps_pdf/help/UML/Output_drivers.PNG | Bin .../html2ps_pdf/help/UML/Output_filters.PNG | Bin .../html2ps_pdf/help/UML/Parsers.PNG | Bin .../html2ps_pdf/help/UML/Post_filters.PNG | Bin .../html2ps_pdf/help/UML/Pre_filters.PNG | Bin .../UML/Simple_custom_fetcher_session.png | Bin .../help/UML/Simple_fetcher_session.PNG | Bin .../html2ps_pdf/help/api.html | 816 +- .../html2ps_pdf/help/api_events.html | 188 +- .../html2ps_pdf/help/api_fetchers.html | 138 +- .../html2ps_pdf/help/api_samples.html | 276 +- .../html2ps_pdf/help/calling.html | 560 +- .../help/compatibility.css.2.1.html | 1308 +-- .../html2ps_pdf/help/compatibility.css.3.html | 172 +- .../html2ps_pdf/help/configuration.html | 510 +- .../html2ps_pdf/help/css/help.css | 252 +- .../html2ps_pdf/help/directives.html | 136 +- .../html2ps_pdf/help/faq.html | 794 +- .../html2ps_pdf/help/forms.html | 430 +- .../html2ps_pdf/help/howto_afm.html | 36 +- .../html2ps_pdf/help/howto_fonts.html | 280 +- .../html2ps_pdf/help/index.html | 66 +- .../html2ps_pdf/help/install.html | 62 +- .../html2ps_pdf/help/misc.html | 0 .../html2ps_pdf/help/requirements.html | 180 +- .../html2ps_pdf/help/samples/headfoot.html | 10 +- .../html2ps_pdf/html.attrs.inc.php | 0 .../html2ps_pdf/html2ps.config | 0 .../html2ps_pdf/html2ps.config.recommended | 0 .../html2ps_pdf/image.class.php | 16 +- .../html2ps_pdf/index.php | 0 .../inline.content.builder.factory.php | 0 .../inline.content.builder.normal.php | 0 .../inline.content.builder.nowrap.php | 0 .../html2ps_pdf/inline.content.builder.php | 0 .../inline.content.builder.pre.line.php | 0 .../inline.content.builder.pre.php | 0 .../inline.content.builder.pre.wrap.php | 0 .../html2ps_pdf/layout._interface.class.php | 0 .../html2ps_pdf/layout.default.class.php | 0 .../html2ps_pdf/layout.page.breaks.php | 0 .../html2ps_pdf/layout.vertical.php | 0 .../html2ps_pdf/list-style.image.php | 0 .../html2ps_pdf/manager.encoding.php | 0 .../html2ps_pdf/media.layout.inc.php | 0 .../html2ps_pdf/observer.class.php | 0 .../html2ps_pdf/ot.class.php | 0 .../html2ps_pdf/out/readme.txt | 0 .../html2ps_pdf/output._generic.class.php | 0 .../html2ps_pdf/output._generic.pdf.class.php | 0 .../html2ps_pdf/output._generic.ps.class.php | 0 .../html2ps_pdf/output._interface.class.php | 0 .../html2ps_pdf/output.fastps.class.php | 0 .../html2ps_pdf/output.fastps.l2.class.php | 0 .../html2ps_pdf/output.fpdf.class.php | 0 .../html2ps_pdf/output.pcl.class.php | 0 .../html2ps_pdf/output.pdflib.1.6.class.php | 0 .../html2ps_pdf/output.pdflib.class.php | 0 .../html2ps_pdf/output.pdflib.old.class.php | 0 .../html2ps_pdf/output.png.class.php | 0 .../html2ps_pdf/parser._interface.class.php | 0 .../html2ps_pdf/parser.xhtml.class.php | 0 .../html2ps_pdf/path.php | 0 .../html2ps_pdf/path.point.php | 0 .../html2ps_pdf/path.rectangle.php | 0 .../html2ps_pdf/pdf.fpdf.encryption.php | 0 .../html2ps_pdf/pdf.fpdf.makefont.php | 0 .../html2ps_pdf/pdf.fpdf.php | 0 .../html2ps_pdf/pipeline.class.php | 0 .../html2ps_pdf/pipeline.factory.class.php | 0 .../html2ps_pdf/postscript/array.ps | 568 +- .../postscript/background.image.ps | 0 .../html2ps_pdf/postscript/background.ps | 0 .../html2ps_pdf/postscript/border.ps | 0 .../postscript/box.block.inline.ps | 112 +- .../html2ps_pdf/postscript/box.block.ps | 508 +- .../html2ps_pdf/postscript/box.break.ps | 184 +- .../html2ps_pdf/postscript/box.button.ps | 0 .../html2ps_pdf/postscript/box.checkbutton.ps | 0 .../html2ps_pdf/postscript/box.container.ps | 2044 ++-- .../html2ps_pdf/postscript/box.frame.ps | 0 .../postscript/box.generic.inline.ps | 0 .../html2ps_pdf/postscript/box.generic.ps | 0 .../html2ps_pdf/postscript/box.iframe.ps | 0 .../html2ps_pdf/postscript/box.image.ps | 0 .../html2ps_pdf/postscript/box.inline.ps | 0 .../postscript/box.inline.whitespace.ps | 152 +- .../html2ps_pdf/postscript/box.input.check.ps | 126 +- .../html2ps_pdf/postscript/box.input.radio.ps | 100 +- .../html2ps_pdf/postscript/box.input.text.ps | 0 .../html2ps_pdf/postscript/box.list-item.ps | 490 +- .../html2ps_pdf/postscript/box.ps | 4 +- .../html2ps_pdf/postscript/box.radiobutton.ps | 0 .../html2ps_pdf/postscript/box.select.ps | 202 +- .../html2ps_pdf/postscript/box.span.ps | 4 +- .../postscript/box.table.cell.fake.ps | 0 .../html2ps_pdf/postscript/box.table.cell.ps | 332 +- .../html2ps_pdf/postscript/box.table.ps | 0 .../html2ps_pdf/postscript/box.table.row.ps | 0 .../html2ps_pdf/postscript/box.text.ps | 758 +- .../html2ps_pdf/postscript/box.whitespace.ps | 146 +- .../html2ps_pdf/postscript/cellspan.ps | 0 .../html2ps_pdf/postscript/class.ps | 0 .../html2ps_pdf/postscript/color.ps | 0 .../postscript/containing_block.ps | 0 .../html2ps_pdf/postscript/context.ps | 942 +- .../postscript/encoding.dingbats.ps | 206 +- .../postscript/encoding.iso-8859-10.ps | 516 +- .../postscript/encoding.iso-8859-11.ps | 516 +- .../postscript/encoding.iso-8859-13.ps | 516 +- .../postscript/encoding.iso-8859-14.ps | 516 +- .../postscript/encoding.iso-8859-15.ps | 516 +- .../postscript/encoding.iso-8859-2.ps | 4 +- .../postscript/encoding.iso-8859-3.ps | 516 +- .../postscript/encoding.iso-8859-4.ps | 516 +- .../postscript/encoding.iso-8859-5.ps | 516 +- .../postscript/encoding.iso-8859-7.ps | 516 +- .../postscript/encoding.iso-8859-9.ps | 516 +- .../html2ps_pdf/postscript/encoding.koi8-r.ps | 516 +- .../html2ps_pdf/postscript/encoding.symbol.ps | 242 +- .../postscript/encoding.windows-1250.ps | 516 +- .../postscript/encoding.windows-1251.ps | 514 +- .../postscript/encoding.windows-1252.ps | 516 +- .../html2ps_pdf/postscript/fastps.footer.ps | 0 .../html2ps_pdf/postscript/fastps.header.ps | 760 +- .../html2ps_pdf/postscript/flow.block.ps | 192 +- .../html2ps_pdf/postscript/flow.box.ps | 104 +- .../html2ps_pdf/postscript/flow.float.ps | 72 +- .../postscript/flow.inline.block.ps | 114 +- .../html2ps_pdf/postscript/flow.inline.ps | 232 +- .../html2ps_pdf/postscript/flow.legend.ps | 98 +- .../html2ps_pdf/postscript/flow.table.ps | 0 .../html2ps_pdf/postscript/flow_viewport.ps | 0 .../html2ps_pdf/postscript/font.ps | 140 +- .../html2ps_pdf/postscript/footer.ps | 306 +- .../html2ps_pdf/postscript/geometry.ps | 52 +- .../html2ps_pdf/postscript/header.ps | 1328 +-- .../html2ps_pdf/postscript/height.ps | 460 +- .../html2ps_pdf/postscript/image.ps | 676 +- .../html2ps_pdf/postscript/init.ps | 20 +- .../html2ps_pdf/postscript/position.ps | 6 +- .../html2ps_pdf/postscript/predicates.ps | 54 +- .../html2ps_pdf/postscript/table.ps | 2512 ++--- .../html2ps_pdf/postscript/table.row.ps | 40 +- .../html2ps_pdf/postscript/text-align.ps | 190 +- .../html2ps_pdf/postscript/vertical-align.ps | 186 +- .../html2ps_pdf/postscript/viewport.ps | 0 .../html2ps_pdf/postscript/width.ps | 122 +- .../html2ps_pdf/ps.image.encoder.inc.php | 0 .../ps.image.encoder.simple.inc.php | 0 .../ps.image.encoder.stream.inc.php | 0 .../ps.l2.image.encoder.stream.inc.php | 0 .../ps.l3.image.encoder.stream.inc.php | 0 .../html2ps_pdf/ps.unicode.inc.php | 0 .../html2ps_pdf/ps.utils.inc.php | 0 .../html2ps_pdf/ps.whitespace.inc.php | 0 .../html2ps_pdf/render.queue.class.php | 0 .../render.stacking.context.class.php | 0 .../render.stacking.level.class.php | 0 .../html2ps_pdf/samples/out/readme.txt | 0 .../html2ps_pdf/samples/sample.batch.php | 318 +- .../samples/sample.form.handler.php | 14 +- .../samples/sample.pipeline.custom.php | 0 .../samples/sample.pipeline.default.php | 0 .../samples/sample.simplest.from.file.php | 0 .../samples/sample.simplest.from.memory.php | 0 .../html2ps_pdf/samples/sample.simplest.php | 0 .../strategy.link.rendering.normal.php | 0 .../strategy.position.absolute.php | 0 .../strategy.table.layout.auto.php | 0 .../strategy.table.layout.fixed.php | 0 .../strategy.width.absolute.positioned.php | 0 .../strategy.width.max.natural.php | 0 .../html2ps_pdf/strategy.width.max.php | 0 .../html2ps_pdf/strategy.width.min.nowrap.php | 0 .../html2ps_pdf/strategy.width.min.php | 0 .../html2ps_pdf/stubs._.inc.php | 0 .../html2ps_pdf/stubs.common.inc.php | 0 .../stubs.file_get_contents.inc.php | 0 .../stubs.file_put_contents.inc.php | 0 .../html2ps_pdf/stubs.is_executable.inc.php | 0 .../stubs.memory_get_usage.inc.php | 0 .../html2ps_pdf/tag.body.inc.php | 0 .../html2ps_pdf/tag.font.inc.php | 0 .../html2ps_pdf/tag.frame.inc.php | 0 .../html2ps_pdf/tag.img.inc.php | 0 .../html2ps_pdf/tag.input.inc.php | 0 .../html2ps_pdf/tag.select.inc.php | 0 .../html2ps_pdf/tag.span.inc.php | 0 .../html2ps_pdf/tag.table.inc.php | 0 .../html2ps_pdf/tag.td.inc.php | 0 .../html2ps_pdf/tag.utils.inc.php | 0 .../html2ps_pdf/temp/readme.txt | 0 .../html2ps_pdf/templates/cannot_parse.html | 0 .../templates/error._connection.tpl | 0 .../html2ps_pdf/templates/error._footer.tpl | 0 .../html2ps_pdf/templates/error._header.tpl | 0 .../html2ps_pdf/templates/error._http.tpl | 0 .../templates/error._missing_afm.tpl | 0 .../templates/error._no_fetchers.tpl | 0 .../templates/error._redirects.tpl | 0 .../html2ps_pdf/templates/error_exec.tpl | 0 .../html2ps_pdf/templates/missing_exec.html | 0 .../html2ps_pdf/templates/missing_gs.html | 0 .../html2ps_pdf/templates/missing_pdflib.html | 0 .../templates/missing_url_fopen.html | 0 .../html2ps_pdf/tree.navigation.inc.php | 0 .../html2ps_pdf/treebuilder.class.php | 0 .../html2ps_pdf/utils_array.php | 0 .../html2ps_pdf/utils_graphic.php | 0 .../html2ps_pdf/utils_number.php | 0 .../html2ps_pdf/utils_text.php | 0 .../html2ps_pdf/utils_units.php | 0 .../html2ps_pdf/utils_url.php | 0 .../html2ps_pdf/value.background.php | 0 .../html2ps_pdf/value.border.class.php | 0 .../html2ps_pdf/value.border.color.class.php | 0 .../html2ps_pdf/value.border.edge.class.php | 0 .../html2ps_pdf/value.border.style.class.php | 0 .../html2ps_pdf/value.border.width.class.php | 0 .../html2ps_pdf/value.bottom.php | 0 .../html2ps_pdf/value.color.php | 0 .../html2ps_pdf/value.content.item.php | 0 .../html2ps_pdf/value.content.php | 0 .../html2ps_pdf/value.font.class.php | 0 .../html2ps_pdf/value.generic.length.php | 0 .../html2ps_pdf/value.generic.percentage.php | 0 .../html2ps_pdf/value.generic.php | 0 .../html2ps_pdf/value.height.php | 0 .../html2ps_pdf/value.left.php | 0 .../html2ps_pdf/value.line-height.class.php | 0 .../html2ps_pdf/value.list-style.class.php | 0 .../html2ps_pdf/value.margin.class.php | 0 .../html2ps_pdf/value.max-height.php | 0 .../html2ps_pdf/value.min-height.php | 0 .../html2ps_pdf/value.padding.class.php | 0 .../html2ps_pdf/value.right.php | 0 .../html2ps_pdf/value.text-indent.class.php | 0 .../html2ps_pdf/value.top.php | 0 .../html2ps_pdf/width.constraint.php | 0 .../html2ps_pdf/width.php | 0 .../html2ps_pdf/xhtml.autoclose.inc.php | 0 .../html2ps_pdf/xhtml.comments.inc.php | 0 .../html2ps_pdf/xhtml.deflist.inc.php | 0 .../html2ps_pdf/xhtml.entities.inc.php | 0 .../html2ps_pdf/xhtml.lists.inc.php | 0 .../html2ps_pdf/xhtml.p.inc.php | 0 .../html2ps_pdf/xhtml.script.inc.php | 0 .../html2ps_pdf/xhtml.selects.inc.php | 0 .../html2ps_pdf/xhtml.style.inc.php | 0 .../html2ps_pdf/xhtml.tables.inc.php | 0 .../html2ps_pdf/xhtml.utils.inc.php | 0 .../html2ps_pdf/xml.validation.inc.php | 0 .../htmlarea/editor.js | 2246 ++-- .../htmlarea/example.html | 318 +- .../htmlarea/images/Thumbs.db | Bin .../htmlarea/images/ed_about.gif | Bin .../htmlarea/images/ed_align_center.gif | Bin .../htmlarea/images/ed_align_left.gif | Bin .../htmlarea/images/ed_align_right.gif | Bin .../htmlarea/images/ed_blank.gif | Bin .../htmlarea/images/ed_charmap.gif | Bin .../htmlarea/images/ed_color_bg.gif | Bin .../htmlarea/images/ed_color_fg.gif | Bin .../htmlarea/images/ed_copy.gif | Bin .../htmlarea/images/ed_custom.gif | Bin .../htmlarea/images/ed_cut.gif | Bin .../htmlarea/images/ed_delete.gif | Bin .../htmlarea/images/ed_format_bold.gif | Bin .../htmlarea/images/ed_format_italic.gif | Bin .../htmlarea/images/ed_format_strike.gif | Bin .../htmlarea/images/ed_format_sub.gif | Bin .../htmlarea/images/ed_format_sup.gif | Bin .../htmlarea/images/ed_format_underline.gif | Bin .../htmlarea/images/ed_help.gif | Bin .../htmlarea/images/ed_hr.gif | Bin .../htmlarea/images/ed_html.gif | Bin .../htmlarea/images/ed_image.gif | Bin .../htmlarea/images/ed_indent_less.gif | Bin .../htmlarea/images/ed_indent_more.gif | Bin .../htmlarea/images/ed_link.gif | Bin .../htmlarea/images/ed_list_bullet.gif | Bin .../htmlarea/images/ed_list_num.gif | Bin .../htmlarea/images/ed_redo.gif | Bin .../htmlarea/images/ed_undo.gif | Bin .../htmlarea/images/fullscreen_maximize.gif | Bin .../htmlarea/images/fullscreen_minimize.gif | Bin .../htmlarea/images/insert_table.gif | Bin .../htmlarea/license.txt | 26 +- .../htmlarea/popups/about.html | 28 +- .../htmlarea/popups/blank.html | 2 +- .../htmlarea/popups/custom2.html | 68 +- .../htmlarea/popups/editor_help.html | 30 +- .../htmlarea/popups/fullscreen.html | 260 +- .../htmlarea/popups/insert_image.html | 410 +- .../htmlarea/popups/insert_table.html | 338 +- .../htmlarea/popups/select_color.html | 684 +- .../htmlarea/readme.html | 1518 +-- .../thirdparty => thirdparty}/jsmin/jsmin.php | 770 +- .../libchart/COPYING | 0 .../libchart/ChangeLog | 0 .../thirdparty => thirdparty}/libchart/README | 0 .../libchart/classes/libchart.php | 0 .../libchart/classes/model/DataSet.php | 54 +- .../libchart/classes/model/Point.php | 0 .../libchart/classes/model/XYDataSet.php | 110 +- .../classes/model/XYSeriesDataSet.php | 150 +- .../libchart/classes/view/axis/Axis.php | 0 .../libchart/classes/view/axis/Bound.php | 290 +- .../libchart/classes/view/caption/Caption.php | 0 .../libchart/classes/view/chart/BarChart.php | 0 .../libchart/classes/view/chart/Chart.php | 0 .../classes/view/chart/HorizontalBarChart.php | 0 .../libchart/classes/view/chart/LineChart.php | 0 .../libchart/classes/view/chart/PieChart.php | 0 .../classes/view/chart/VerticalBarChart.php | 0 .../libchart/classes/view/color/Color.php | 0 .../libchart/classes/view/color/ColorSet.php | 0 .../libchart/classes/view/color/Palette.php | 0 .../libchart/classes/view/plot/Plot.php | 0 .../classes/view/primitive/Padding.php | 0 .../classes/view/primitive/Primitive.php | 0 .../classes/view/primitive/Rectangle.php | 0 .../libchart/classes/view/text/Text.php | 0 .../fonts/DejaVuSansCondensed-Bold.ttf | Bin .../libchart/fonts/DejaVuSansCondensed.ttf | Bin .../libchart/images/PoweredBy.png | Bin .../lime/Spyc.class.php | 0 .../thirdparty => thirdparty}/lime/lime.php | 0 .../lime/yaml.class.php | 0 .../pake/pakeApp.class.php | 0 .../pake/pakeColor.class.php | 0 .../pake/pakeException.class.php | 0 .../pake/pakeFileTask.class.php | 0 .../pake/pakeFinder.class.php | 0 .../pake/pakeFunction.php | 0 .../pake/pakeGetopt.class.php | 0 .../pake/pakeGlobToRegex.class.php | 0 .../pake/pakeNumberCompare.class.php | 0 .../pake/pakeTask.class.php | 0 .../pake/pakeYaml.class.php | 0 .../pake/tasks/pakePearTask.class.php | 0 .../pake/tasks/pakePhingTask.class.php | 0 .../pake/tasks/pakeSimpletestTask.class.php | 0 thirdparty/pear/Archive/Tar.php | 1993 ++++ thirdparty/pear/Archive/Zip.php | 3620 +++++++ thirdparty/pear/Benchmark/Iterate.php | 167 + thirdparty/pear/Benchmark/Profiler.php | 447 + thirdparty/pear/Benchmark/Timer.php | 321 + thirdparty/pear/CMD.php | 285 + thirdparty/pear/CODING_STANDARDS | 8 + thirdparty/pear/Console/Getopt.php | 251 + thirdparty/pear/DB.php | 1114 ++ thirdparty/pear/DB/common.php | 2042 ++++ thirdparty/pear/DB/dbase.php | 225 + thirdparty/pear/DB/fbsql.php | 655 ++ thirdparty/pear/DB/ibase.php | 784 ++ thirdparty/pear/DB/ifx.php | 579 + thirdparty/pear/DB/msql.php | 242 + thirdparty/pear/DB/mssql.php | 738 ++ thirdparty/pear/DB/mysql.php | 916 ++ thirdparty/pear/DB/mysqli.php | 960 ++ thirdparty/pear/DB/oci8.php | 899 ++ thirdparty/pear/DB/odbc.php | 585 + thirdparty/pear/DB/pgsql.php | 847 ++ thirdparty/pear/DB/sqlite.php | 695 ++ thirdparty/pear/DB/storage.php | 495 + thirdparty/pear/DB/sybase.php | 835 ++ thirdparty/pear/HTTP/HTTP.php | 343 + thirdparty/pear/HTTP/Request.php | 1205 +++ thirdparty/pear/HTTP/WebDAV/Server.php | 2089 ++++ .../pear/HTTP/WebDAV/Server/Filesystem.php | 721 ++ .../HTTP/WebDAV/Tools/_parse_lockinfo.php | 237 + .../HTTP/WebDAV/Tools/_parse_propfind.php | 178 + .../HTTP/WebDAV/Tools/_parse_proppatch.php | 214 + thirdparty/pear/Log.php | 832 ++ thirdparty/pear/Log/composite.php | 231 + thirdparty/pear/Log/console.php | 217 + thirdparty/pear/Log/daemon.php | 239 + thirdparty/pear/Log/display.php | 159 + thirdparty/pear/Log/error_log.php | 136 + thirdparty/pear/Log/file.php | 352 + thirdparty/pear/Log/firebug.php | 223 + thirdparty/pear/Log/mail.php | 266 + thirdparty/pear/Log/mcal.php | 179 + thirdparty/pear/Log/mdb2.php | 367 + thirdparty/pear/Log/null.php | 100 + thirdparty/pear/Log/observer.php | 143 + thirdparty/pear/Log/sql.php | 308 + thirdparty/pear/Log/sqlite.php | 239 + thirdparty/pear/Log/syslog.php | 193 + thirdparty/pear/Log/win.php | 283 + thirdparty/pear/Net/CheckIP.php | 80 + thirdparty/pear/Net/Curl.php | 876 ++ thirdparty/pear/Net/DIME.php | 647 ++ thirdparty/pear/Net/FTP.php | 2346 ++++ thirdparty/pear/Net/FTP/Observer.php | 116 + thirdparty/pear/Net/FTP/Socket.php | 800 ++ thirdparty/pear/Net/IDNA.php | 101 + thirdparty/pear/Net/IDNA/php4.php | 3011 ++++++ thirdparty/pear/Net/IDNA/php5.php | 3233 ++++++ thirdparty/pear/Net/IPv4.php | 458 + thirdparty/pear/Net/IPv6.php | 218 + thirdparty/pear/Net/JSON.php | 806 ++ thirdparty/pear/Net/LDAP.php | 1065 ++ thirdparty/pear/Net/LDAP/Entry.php | 524 + thirdparty/pear/Net/LDAP/RootDSE.php | 192 + thirdparty/pear/Net/LDAP/Schema.php | 355 + thirdparty/pear/Net/LDAP/Search.php | 245 + thirdparty/pear/Net/LDAP/Util.php | 132 + thirdparty/pear/Net/LDAP/fg.php | 38 + thirdparty/pear/Net/POP3.php | 1240 +++ thirdparty/pear/Net/SMTP.php | 1082 ++ thirdparty/pear/Net/Socket.php | 576 + thirdparty/pear/Net/URL.php | 485 + thirdparty/pear/Net/URL2.php | 813 ++ thirdparty/pear/Net/UserAgent/Detect.php | 967 ++ thirdparty/pear/Net/UserAgent/Detect/APC.php | 123 + thirdparty/pear/Numbers/Words.php | 145 + thirdparty/pear/Numbers/Words/lang.bg.php | 505 + thirdparty/pear/Numbers/Words/lang.de.php | 318 + thirdparty/pear/Numbers/Words/lang.ee.php | 349 + thirdparty/pear/Numbers/Words/lang.en_100.php | 307 + thirdparty/pear/Numbers/Words/lang.en_GB.php | 308 + thirdparty/pear/Numbers/Words/lang.en_US.php | 509 + thirdparty/pear/Numbers/Words/lang.es.php | 343 + thirdparty/pear/Numbers/Words/lang.es_AR.php | 470 + thirdparty/pear/Numbers/Words/lang.fr.php | 439 + thirdparty/pear/Numbers/Words/lang.id.php | 277 + thirdparty/pear/Numbers/Words/lang.it_IT.php | 348 + thirdparty/pear/Numbers/Words/lang.lt.php | 310 + thirdparty/pear/Numbers/Words/lang.pl.php | 513 + thirdparty/pear/Numbers/Words/lang.pt_BR.php | 241 + thirdparty/pear/Numbers/Words/lang.ru.php | 616 ++ thirdparty/pear/Numbers/Words/lang.sv.php | 310 + thirdparty/pear/OLE/OLE.php | 410 + thirdparty/pear/OLE/PPS.php | 219 + thirdparty/pear/OLE/PPS/File.php | 114 + thirdparty/pear/OLE/PPS/Root.php | 519 + thirdparty/pear/OS/Guess.php | 265 + thirdparty/pear/PEAR.php | 1056 ++ thirdparty/pear/PEAR/Autoloader.php | 186 + thirdparty/pear/PEAR/Builder.php | 410 + thirdparty/pear/PEAR/Command.php | 322 + thirdparty/pear/PEAR/Command/Auth.php | 155 + thirdparty/pear/PEAR/Command/Build.php | 89 + thirdparty/pear/PEAR/Command/Common.php | 249 + thirdparty/pear/PEAR/Command/Config.php | 225 + thirdparty/pear/PEAR/Command/Install.php | 302 + thirdparty/pear/PEAR/Command/Mirror.php | 99 + thirdparty/pear/PEAR/Command/Package.php | 658 ++ thirdparty/pear/PEAR/Command/Registry.php | 319 + thirdparty/pear/PEAR/Command/Remote.php | 407 + thirdparty/pear/PEAR/Common.php | 1702 +++ thirdparty/pear/PEAR/Config.php | 1139 ++ thirdparty/pear/PEAR/Dependency.php | 356 + thirdparty/pear/PEAR/Frontend/CLI.php | 506 + thirdparty/pear/PEAR/Installer.php | 897 ++ thirdparty/pear/PEAR/Packager.php | 181 + thirdparty/pear/PEAR/Registry.php | 717 ++ thirdparty/pear/PEAR/Remote.php | 381 + thirdparty/pear/README | 18 + thirdparty/pear/SOAP/Base.php | 1116 ++ thirdparty/pear/SOAP/Client.php | 855 ++ thirdparty/pear/SOAP/Disco.php | 383 + thirdparty/pear/SOAP/Fault.php | 127 + thirdparty/pear/SOAP/Interop/config.php.dist | 4 + thirdparty/pear/SOAP/Interop/index.php | 94 + .../pear/SOAP/Interop/interop_Round2Base.php | 155 + .../SOAP/Interop/interop_Round2GroupB.php | 99 + .../SOAP/Interop/interop_Round2GroupC.php | 35 + .../SOAP/Interop/interop_Round3GroupD.php | 82 + .../pear/SOAP/Interop/interop_client.php | 805 ++ .../SOAP/Interop/interop_client_results.php | 75 + .../pear/SOAP/Interop/interop_client_run.php | 205 + .../pear/SOAP/Interop/interop_database.sql | 76 + thirdparty/pear/SOAP/Interop/interop_test.php | 137 + .../SOAP/Interop/interop_test_functions.php | 90 + .../pear/SOAP/Interop/params_Round2Base.php | 230 + .../pear/SOAP/Interop/params_Round2GroupB.php | 72 + .../pear/SOAP/Interop/params_Round2GroupC.php | 235 + .../pear/SOAP/Interop/params_Round3GroupD.php | 121 + .../pear/SOAP/Interop/params_classes.php | 162 + .../pear/SOAP/Interop/params_values.php | 173 + thirdparty/pear/SOAP/Interop/readme.txt | 23 + .../Interop/registrationAndNotification.php | 473 + .../pear/SOAP/Interop/server_Round2Base.php | 51 + .../pear/SOAP/Interop/server_Round2GroupB.php | 55 + .../pear/SOAP/Interop/server_Round2GroupC.php | 33 + .../pear/SOAP/Interop/server_Round3GroupD.php | 49 + .../Interop/server_Round3GroupDCompound1.php | 72 + .../Interop/server_Round3GroupDCompound2.php | 70 + .../Interop/server_Round3GroupDDocLit.php | 98 + .../server_Round3GroupDDocLitParams.php | 96 + .../Interop/server_Round3GroupDEmptySA.php | 38 + .../Interop/server_Round3GroupDImport1.php | 64 + .../Interop/server_Round3GroupDImport2.php | 81 + .../Interop/server_Round3GroupDImport3.php | 101 + .../Interop/server_Round3GroupDRpcEnc.php | 79 + .../Interop/wsdl/InteropTestDocLit.wsdl.php | 136 + .../wsdl/InteropTestDocLitParameters.wsdl.php | 176 + .../wsdl/InteropTestExtensibility.wsdl.php | 74 + .../InteropTestExtensibilityRequired.wsdl.php | 75 + .../Interop/wsdl/InteropTestList.wsdl.php | 62 + .../Interop/wsdl/InteropTestRpcEnc.wsdl.php | 127 + .../Interop/wsdl/InteropTestheaders.wsdl.php | 72 + .../pear/SOAP/Interop/wsdl/compound1.wsdl.php | 86 + .../pear/SOAP/Interop/wsdl/compound2.wsdl.php | 67 + .../SOAP/Interop/wsdl/echoheadersvc.wsdl.php | 18 + .../pear/SOAP/Interop/wsdl/emptysa.wsdl.php | 39 + .../pear/SOAP/Interop/wsdl/import1.wsdl.php | 28 + .../pear/SOAP/Interop/wsdl/import2.wsdl.php | 28 + .../pear/SOAP/Interop/wsdl/import3.wsdl.php | 77 + .../SOAP/Interop/wsdl/imported/import1B.wsdl | 20 + .../SOAP/Interop/wsdl/imported/import2B.wsdl | 22 + .../SOAP/Interop/wsdl/imported/import2B.xsd | 12 + .../pear/SOAP/Interop/wsdl/interop.wsdl.php | 19 + .../pear/SOAP/Interop/wsdl/interopB.wsdl.php | 15 + thirdparty/pear/SOAP/Parser.php | 504 + thirdparty/pear/SOAP/Server.php | 816 ++ thirdparty/pear/SOAP/Server/Email.php | 198 + thirdparty/pear/SOAP/Server/Email_Gateway.php | 138 + thirdparty/pear/SOAP/Server/TCP.php | 106 + thirdparty/pear/SOAP/Transport.php | 151 + thirdparty/pear/SOAP/Transport/HTTP.php | 620 ++ thirdparty/pear/SOAP/Transport/SMTP.php | 220 + thirdparty/pear/SOAP/Transport/TCP.php | 153 + thirdparty/pear/SOAP/Type/dateTime.php | 243 + thirdparty/pear/SOAP/Type/duration.php | 165 + thirdparty/pear/SOAP/Type/hexBinary.php | 45 + thirdparty/pear/SOAP/Value.php | 252 + thirdparty/pear/SOAP/WSDL.php | 2294 ++++ thirdparty/pear/SOAP/tools/genproxy.php | 21 + thirdparty/pear/Spreadsheet/Excel/Writer.php | 104 + .../pear/Spreadsheet/Excel/Writer.php.bk | 104 + .../Spreadsheet/Excel/Writer/BIFFwriter.php | 241 + .../pear/Spreadsheet/Excel/Writer/Format.php | 1035 ++ .../pear/Spreadsheet/Excel/Writer/Parser.php | 1761 +++ .../Spreadsheet/Excel/Writer/Validator.php | 225 + .../Spreadsheet/Excel/Writer/Workbook.php | 1545 +++ .../Spreadsheet/Excel/Writer/Worksheet.php | 3495 ++++++ thirdparty/pear/Spreadsheet/package.xml | 61 + thirdparty/pear/System.php | 540 + thirdparty/pear/UDDI.php | 720 ++ thirdparty/pear/XML/Parser.php | 684 ++ thirdparty/pear/catalog | 1 + thirdparty/pear/class.nusoap_base.php | 905 ++ thirdparty/pear/class.soap_fault.php | 86 + thirdparty/pear/class.soap_parser.php | 599 ++ thirdparty/pear/class.soap_server.php | 1038 ++ thirdparty/pear/class.soap_transport_http.php | 1038 ++ thirdparty/pear/class.soap_val.php | 107 + thirdparty/pear/class.soapclient.php | 859 ++ thirdparty/pear/class.wsdl.php | 1727 +++ thirdparty/pear/class.wsdlcache.php | 211 + thirdparty/pear/class.xmlschema.php | 906 ++ thirdparty/pear/install-pear.php | 109 + thirdparty/pear/install-pear.txt | 11 + thirdparty/pear/json/class.json.php | 817 ++ thirdparty/pear/nusoap.colosa.php | 7305 +++++++++++++ thirdparty/pear/nusoap.php | 7302 +++++++++++++ thirdparty/pear/nusoapmime.php | 506 + thirdparty/pear/package-Archive_Tar.xml | 60 + thirdparty/pear/package-Console_Getopt.xml | 63 + thirdparty/pear/package-PEAR.xml | 342 + thirdparty/pear/package.dtd | 109 + thirdparty/pear/template.spec | 44 + .../phing/BuildEvent.php | 0 .../phing/BuildException.php | 0 .../phing/BuildListener.php | 0 .../phing/IntrospectionHelper.php | 0 .../thirdparty => thirdparty}/phing/Phing.php | 0 .../phing/Project.php | 0 .../phing/ProjectComponent.php | 0 .../phing/RuntimeConfigurable.php | 0 .../phing/Target.php | 0 .../thirdparty => thirdparty}/phing/Task.php | 0 .../phing/TaskAdapter.php | 0 .../phing/TaskContainer.php | 0 .../phing/TaskPhing.php | 0 .../phing/UnknownElement.php | 0 .../phing/filters/BaseFilterReader.php | 0 .../phing/filters/BaseParamFilterReader.php | 0 .../phing/filters/ChainableReader.php | 0 .../phing/filters/ExpandProperties.php | 0 .../phing/filters/HeadFilter.php | 0 .../phing/filters/LineContains.php | 0 .../phing/filters/LineContainsRegexp.php | 0 .../phing/filters/PrefixLines.php | 0 .../phing/filters/ReplaceRegexp.php | 0 .../phing/filters/ReplaceTokens.php | 0 .../phing/filters/StripLineBreaks.php | 0 .../phing/filters/StripLineComments.php | 0 .../phing/filters/StripPhpComments.php | 0 .../phing/filters/TabToSpaces.php | 0 .../phing/filters/TailFilter.php | 0 .../phing/filters/TidyFilter.php | 0 .../phing/filters/TranslateGettext.php | 0 .../phing/filters/XsltFilter.php | 0 .../phing/filters/util/ChainReaderHelper.php | 0 .../phing/filters/util/IniFileTokenReader.php | 0 .../phing/input/DefaultInputHandler.php | 0 .../phing/input/InputHandler.php | 0 .../phing/input/InputRequest.php | 0 .../input/MultipleChoiceInputRequest.php | 0 .../phing/input/PropertyFileInputHandler.php | 0 .../phing/input/YesNoInputRequest.php | 0 .../phing/lib/Capsule.php | 0 .../phing/lib/Zip.php | 0 .../phing/listener/AnsiColorLogger.php | 0 .../phing/listener/BuildLogger.php | 0 .../phing/listener/DefaultLogger.php | 0 .../phing/listener/NoBannerLogger.php | 0 .../phing/listener/PearLogger.php | 0 .../phing/listener/XmlLogger.php | 0 .../phing/listener/defaults.properties | 0 .../phing/mappers/FileNameMapper.php | 0 .../phing/mappers/FlattenMapper.php | 0 .../phing/mappers/GlobMapper.php | 0 .../phing/mappers/IdentityMapper.php | 0 .../phing/mappers/MergeMapper.php | 0 .../phing/mappers/RegexpMapper.php | 0 .../phing/parser/AbstractHandler.php | 0 .../phing/parser/AbstractSAXParser.php | 0 .../phing/parser/DataTypeHandler.php | 0 .../phing/parser/ExpatParseException.php | 0 .../phing/parser/ExpatParser.php | 0 .../phing/parser/Location.php | 0 .../phing/parser/NestedElementHandler.php | 0 .../phing/parser/ProjectConfigurator.php | 0 .../phing/parser/ProjectHandler.php | 0 .../phing/parser/RootHandler.php | 0 .../phing/parser/TargetHandler.php | 0 .../phing/parser/TaskHandler.php | 0 .../phing/system/io/BufferedReader.php | 0 .../phing/system/io/BufferedWriter.php | 0 .../phing/system/io/ConsoleReader.php | 0 .../phing/system/io/FileReader.php | 0 .../phing/system/io/FileSystem.php | 0 .../phing/system/io/FileWriter.php | 0 .../phing/system/io/FilterReader.php | 0 .../phing/system/io/IOException.php | 0 .../phing/system/io/PhingFile.php | 0 .../phing/system/io/Reader.php | 0 .../phing/system/io/StringReader.php | 0 .../phing/system/io/TokenReader.php | 0 .../phing/system/io/UnixFileSystem.php | 0 .../phing/system/io/Win32FileSystem.php | 0 .../phing/system/io/WinNTFileSystem.php | 0 .../phing/system/io/Writer.php | 0 .../phing/system/lang/Character.php | 0 .../phing/system/lang/EventObject.php | 0 .../system/lang/FileNotFoundException.php | 0 .../system/lang/NullPointerException.php | 0 .../phing/system/lang/SecurityException.php | 0 .../phing/system/util/Message.php | 0 .../phing/system/util/Properties.php | 0 .../phing/system/util/Register.php | 0 .../phing/system/util/Timer.php | 0 .../phing/tasks/defaults.properties | 0 .../phing/tasks/ext/CapsuleTask.php | 0 .../phing/tasks/ext/CreoleSQLExecTask.php | 0 .../phing/tasks/ext/CreoleTask.php | 0 .../phing/tasks/ext/ExtractBaseTask.php | 0 .../phing/tasks/ext/MailTask.php | 0 .../phing/tasks/ext/PackageAsPathTask.php | 0 .../phing/tasks/ext/PearPackageTask.php | 0 .../phing/tasks/ext/PhpLintTask.php | 0 .../phing/tasks/ext/SmartyTask.php | 0 .../phing/tasks/ext/TarTask.php | 0 .../phing/tasks/ext/UntarTask.php | 0 .../phing/tasks/ext/UnzipTask.php | 0 .../phing/tasks/ext/XmlLintTask.php | 0 .../phing/tasks/ext/ZendCodeAnalyzerTask.php | 0 .../phing/tasks/ext/ZipTask.php | 0 .../tasks/ext/coverage/CoverageMerger.php | 0 .../tasks/ext/coverage/CoverageMergerTask.php | 0 .../tasks/ext/coverage/CoverageReportTask.php | 0 .../coverage/CoverageReportTransformer.php | 0 .../tasks/ext/coverage/CoverageSetupTask.php | 0 .../tasks/ext/ioncube/IoncubeComment.php | 0 .../tasks/ext/ioncube/IoncubeEncoderTask.php | 0 .../tasks/ext/ioncube/IoncubeLicenseTask.php | 0 .../phing/tasks/ext/pearpackage/Fileset.php | 0 .../tasks/ext/phpdoc/PHPDocumentorTask.php | 0 .../phing/tasks/ext/phpunit2/BatchTest.php | 0 .../tasks/ext/phpunit2/FormatterElement.php | 0 .../tasks/ext/phpunit2/PHPUnit2ReportTask.php | 0 .../ext/phpunit2/PHPUnit2ResultFormatter.php | 0 .../phing/tasks/ext/phpunit2/PHPUnit2Task.php | 0 .../tasks/ext/phpunit2/PHPUnit2TestRunner.php | 0 .../phing/tasks/ext/phpunit2/PHPUnit2Util.php | 0 .../phpunit2/PlainPHPUnit2ResultFormatter.php | 0 .../SummaryPHPUnit2ResultFormatter.php | 0 .../phpunit2/XMLPHPUnit2ResultFormatter.php | 0 .../SimpleTestCountResultFormatter.php | 0 .../simpletest/SimpleTestFormatterElement.php | 0 .../SimpleTestPlainResultFormatter.php | 0 .../simpletest/SimpleTestResultFormatter.php | 0 .../SimpleTestSummaryResultFormatter.php | 0 .../tasks/ext/simpletest/SimpleTestTask.php | 0 .../phing/tasks/ext/svn/SvnBaseTask.php | 0 .../phing/tasks/ext/svn/SvnExportTask.php | 0 .../tasks/ext/svn/SvnLastRevisionTask.php | 0 .../phing/tasks/system/AdhocTask.php | 0 .../phing/tasks/system/AdhocTaskdefTask.php | 0 .../phing/tasks/system/AdhocTypedefTask.php | 0 .../phing/tasks/system/AppendTask.php | 0 .../phing/tasks/system/AvailableTask.php | 0 .../phing/tasks/system/ChmodTask.php | 0 .../phing/tasks/system/ConditionTask.php | 0 .../phing/tasks/system/CopyTask.php | 0 .../phing/tasks/system/CvsPassTask.php | 0 .../phing/tasks/system/CvsTask.php | 0 .../phing/tasks/system/DeleteTask.php | 0 .../phing/tasks/system/EchoTask.php | 0 .../phing/tasks/system/ExecTask.php | 0 .../phing/tasks/system/ExitTask.php | 0 .../phing/tasks/system/ForeachTask.php | 0 .../phing/tasks/system/IfTask.php | 0 .../phing/tasks/system/IncludePathTask.php | 0 .../phing/tasks/system/InputTask.php | 0 .../phing/tasks/system/MatchingTask.php | 0 .../phing/tasks/system/MkdirTask.php | 0 .../phing/tasks/system/MoveTask.php | 0 .../phing/tasks/system/PhingCallTask.php | 0 .../phing/tasks/system/PhingTask.php | 0 .../phing/tasks/system/PhpEvalTask.php | 0 .../phing/tasks/system/PropertyPromptTask.php | 0 .../phing/tasks/system/PropertyTask.php | 0 .../phing/tasks/system/ReflexiveTask.php | 0 .../phing/tasks/system/ResolvePathTask.php | 0 .../phing/tasks/system/SequentialTask.php | 0 .../phing/tasks/system/TaskdefTask.php | 0 .../phing/tasks/system/TouchTask.php | 0 .../phing/tasks/system/TstampTask.php | 0 .../phing/tasks/system/TypedefTask.php | 0 .../phing/tasks/system/UpToDateTask.php | 0 .../phing/tasks/system/WarnTask.php | 0 .../phing/tasks/system/XsltTask.php | 0 .../tasks/system/condition/AndCondition.php | 0 .../tasks/system/condition/Condition.php | 0 .../tasks/system/condition/ConditionBase.php | 0 .../system/condition/ContainsCondition.php | 0 .../system/condition/EqualsCondition.php | 0 .../system/condition/IsFalseCondition.php | 0 .../tasks/system/condition/IsSetCondition.php | 0 .../system/condition/IsTrueCondition.php | 0 .../tasks/system/condition/NotCondition.php | 0 .../tasks/system/condition/OrCondition.php | 0 .../tasks/system/condition/OsCondition.php | 0 .../condition/ReferenceExistsCondition.php | 0 .../phing/types/AbstractFileSet.php | 0 .../phing/types/Commandline.php | 0 .../phing/types/DataType.php | 0 .../phing/types/Description.php | 0 .../phing/types/DirSet.php | 0 .../phing/types/FileList.php | 0 .../phing/types/FileSet.php | 0 .../phing/types/FilterChain.php | 0 .../phing/types/Mapper.php | 0 .../phing/types/Parameter.php | 0 .../phing/types/Parameterizable.php | 0 .../phing/types/Path.php | 0 .../phing/types/PatternSet.php | 0 .../phing/types/PhingFilterReader.php | 0 .../phing/types/Reference.php | 0 .../phing/types/RegularExpression.php | 0 .../phing/types/TokenReader.php | 0 .../phing/types/TokenSource.php | 0 .../phing/types/defaults.properties | 0 .../phing/types/selectors/AndSelector.php | 0 .../types/selectors/BaseExtendSelector.php | 0 .../phing/types/selectors/BaseSelector.php | 0 .../types/selectors/BaseSelectorContainer.php | 0 .../selectors/ContainsRegexpSelector.php | 0 .../types/selectors/ContainsSelector.php | 0 .../phing/types/selectors/DateSelector.php | 0 .../phing/types/selectors/DependSelector.php | 0 .../phing/types/selectors/DepthSelector.php | 0 .../types/selectors/ExtendFileSelector.php | 0 .../phing/types/selectors/ExtendSelector.php | 0 .../phing/types/selectors/FileSelector.php | 0 .../types/selectors/FilenameSelector.php | 0 .../types/selectors/MajoritySelector.php | 0 .../phing/types/selectors/NoneSelector.php | 0 .../phing/types/selectors/NotSelector.php | 0 .../phing/types/selectors/OrSelector.php | 0 .../phing/types/selectors/PresentSelector.php | 0 .../phing/types/selectors/SelectSelector.php | 0 .../types/selectors/SelectorContainer.php | 0 .../phing/types/selectors/SelectorScanner.php | 0 .../phing/types/selectors/SelectorUtils.php | 0 .../phing/types/selectors/SizeSelector.php | 0 .../phing/types/selectors/TypeSelector.php | 0 .../phing/util/DirectoryScanner.php | 0 .../phing/util/ExtendedFileStream.php | 0 .../phing/util/FileUtils.php | 0 .../phing/util/LogWriter.php | 0 .../phing/util/PathTokenizer.php | 0 .../phing/util/SourceFileScanner.php | 0 .../phing/util/StringHelper.php | 0 .../phing/util/regexp/PregEngine.php | 0 .../phing/util/regexp/Regexp.php | 0 .../phing/util/regexp/RegexpEngine.php | 0 .../phpmailer/class.phpmailer.php | 0 .../phpmailer/class.pop3.php | 0 .../phpmailer/class.smtp.php | 0 .../phpmailer/extras/class.html2text.inc | 0 .../phpmailer/extras/htmlfilter.php | 0 .../phpmailer/extras/ntlm_sasl_client.php | 0 .../phpmailer/language/phpmailer.lang-ar.php | 0 .../phpmailer/language/phpmailer.lang-br.php | 0 .../phpmailer/language/phpmailer.lang-ca.php | 0 .../phpmailer/language/phpmailer.lang-ch.php | 0 .../phpmailer/language/phpmailer.lang-cz.php | 0 .../phpmailer/language/phpmailer.lang-de.php | 0 .../phpmailer/language/phpmailer.lang-dk.php | 0 .../phpmailer/language/phpmailer.lang-en.php | 0 .../phpmailer/language/phpmailer.lang-es.php | 0 .../phpmailer/language/phpmailer.lang-et.php | 0 .../phpmailer/language/phpmailer.lang-fi.php | 0 .../phpmailer/language/phpmailer.lang-fo.php | 0 .../phpmailer/language/phpmailer.lang-fr.php | 0 .../phpmailer/language/phpmailer.lang-hu.php | 0 .../phpmailer/language/phpmailer.lang-it.php | 0 .../phpmailer/language/phpmailer.lang-ja.php | 0 .../phpmailer/language/phpmailer.lang-nl.php | 0 .../phpmailer/language/phpmailer.lang-no.php | 0 .../phpmailer/language/phpmailer.lang-pl.php | 0 .../phpmailer/language/phpmailer.lang-ro.php | 0 .../phpmailer/language/phpmailer.lang-ru.php | 0 .../phpmailer/language/phpmailer.lang-se.php | 0 .../phpmailer/language/phpmailer.lang-sk.php | 0 .../phpmailer/language/phpmailer.lang-tr.php | 0 .../phpmailer/language/phpmailer.lang-zh.php | 0 .../language/phpmailer.lang-zh_cn.php | 0 .../propel-generator/CHANGELOG | 0 .../propel-generator/INSTALL | 0 .../propel-generator/LICENSE | 0 .../propel-generator/bin/propel-gen | 0 .../propel-generator/bin/propel-gen.bat | 0 .../propel-generator/build-propel.xml | 0 .../propel-generator/build.properties-sample | 0 .../propel-generator/build.xml | 0 .../propel-generator/build.xml-local | 248 +- .../classes/propel/engine/EngineException.php | 0 .../engine/builder/DataModelBuilder.php | 0 .../propel/engine/builder/om/ClassTools.php | 0 .../propel/engine/builder/om/OMBuilder.php | 0 .../engine/builder/om/ObjectBuilder.php | 0 .../propel/engine/builder/om/PeerBuilder.php | 0 .../om/php5/PHP5BasicObjectBuilder.php | 0 .../builder/om/php5/PHP5BasicPeerBuilder.php | 0 .../om/php5/PHP5ComplexObjectBuilder.php | 0 .../om/php5/PHP5ComplexPeerBuilder.php | 0 .../om/php5/PHP5ExtensionNodeBuilder.php | 0 .../om/php5/PHP5ExtensionNodePeerBuilder.php | 0 .../om/php5/PHP5ExtensionObjectBuilder.php | 0 .../om/php5/PHP5ExtensionPeerBuilder.php | 0 .../builder/om/php5/PHP5InterfaceBuilder.php | 0 .../builder/om/php5/PHP5MapBuilderBuilder.php | 0 .../om/php5/PHP5MultiExtendObjectBuilder.php | 0 .../builder/om/php5/PHP5NodeBuilder.php | 0 .../builder/om/php5/PHP5NodePeerBuilder.php | 0 .../propel/engine/builder/sql/DDLBuilder.php | 0 .../engine/builder/sql/DataSQLBuilder.php | 0 .../builder/sql/mssql/MssqlDDLBuilder.php | 0 .../builder/sql/mssql/MssqlDataSQLBuilder.php | 0 .../builder/sql/mysql/MysqlDDLBuilder.php | 0 .../builder/sql/mysql/MysqlDataSQLBuilder.php | 0 .../builder/sql/mysqli/MysqliDDLBuilder.php | 0 .../sql/mysqli/MysqliDataSQLBuilder.php | 0 .../builder/sql/oracle/OracleDDLBuilder.php | 0 .../sql/oracle/OracleDataSQLBuilder.php | 0 .../builder/sql/pgsql/PgsqlDDLBuilder.php | 0 .../builder/sql/pgsql/PgsqlDataSQLBuilder.php | 0 .../builder/sql/sqlite/SqliteDDLBuilder.php | 0 .../sql/sqlite/SqliteDataSQLBuilder.php | 0 .../propel/engine/database/model/AppData.php | 0 .../propel/engine/database/model/Column.php | 0 .../model/ConstraintNameGenerator.php | 0 .../propel/engine/database/model/Database.php | 6 +- .../engine/database/model/DatabasePropel.php | 0 .../propel/engine/database/model/Domain.php | 0 .../engine/database/model/ForeignKey.php | 0 .../propel/engine/database/model/IDMethod.php | 0 .../database/model/IdMethodParameter.php | 0 .../propel/engine/database/model/Index.php | 0 .../engine/database/model/Inheritance.php | 0 .../engine/database/model/NameFactory.php | 0 .../engine/database/model/NameGenerator.php | 0 .../database/model/PhpNameGenerator.php | 0 .../engine/database/model/PropelTypes.php | 0 .../propel/engine/database/model/Rule.php | 0 .../propel/engine/database/model/Table.php | 0 .../propel/engine/database/model/Unique.php | 0 .../engine/database/model/Validator.php | 0 .../engine/database/model/XMLElement.php | 0 .../database/transform/XmlToAppData.php | 0 .../engine/database/transform/XmlToData.php | 0 .../engine/platform/DefaultPlatform.php | 0 .../propel/engine/platform/MssqlPlatform.php | 0 .../propel/engine/platform/MysqlPlatform.php | 0 .../propel/engine/platform/MysqliPlatform.php | 0 .../propel/engine/platform/OraclePlatform.php | 0 .../propel/engine/platform/PgsqlPlatform.php | 0 .../propel/engine/platform/Platform.php | 0 .../propel/engine/platform/SqlitePlatform.php | 0 .../phing/AbstractPropelDataModelTask.php | 0 .../phing/PropelCreoleTransformTask.php | 0 .../propel/phing/PropelDataDTDTask.php | 0 .../propel/phing/PropelDataDumpTask.php | 0 .../propel/phing/PropelDataModelTask.php | 0 .../propel/phing/PropelDataSQLTask.php | 0 .../propel/phing/PropelGraphvizTask.php | 0 .../classes/propel/phing/PropelOMTask.php | 0 .../classes/propel/phing/PropelOldOMTask.php | 0 .../classes/propel/phing/PropelOldSQLTask.php | 0 .../classes/propel/phing/PropelSQLExec.php | 0 .../classes/propel/phing/PropelSQLTask.php | 0 .../propel-generator/default.properties | 0 .../pear/BuildPropelGenPEARPackageTask.php | 0 .../pear/build-pear-package.xml | 0 .../propel-generator/pear/build.properties | 0 .../propel-generator/pear/pear-build.xml | 0 .../propel-generator/pear/pear-propel-gen | 42 +- .../propel-generator/pear/pear-propel-gen.bat | 46 +- .../resources/dtd/database.dtd | 328 +- .../resources/xsd/custom_datatypes.xsd | 0 .../resources/xsd/database.xsd | 0 .../resources/xsl/database.xsl | 0 .../propel-generator/templates/README | 8 +- .../templates/conf/Control.tpl | 0 .../propel-generator/templates/conf/xml.tpl | 0 .../templates/data/dtd/dataset.tpl | 26 +- .../templates/data/dtd/table.tpl | 12 +- .../templates/data/dump/bottom.tpl | 0 .../templates/data/dump/row.tpl | 0 .../templates/data/dump/top.tpl | 0 .../templates/om/php4/ExtensionNode.tpl | 0 .../templates/om/php4/ExtensionNodePeer.tpl | 0 .../templates/om/php4/ExtensionObject.tpl | 0 .../templates/om/php4/ExtensionPeer.tpl | 0 .../templates/om/php4/Interface.tpl | 0 .../templates/om/php4/MapBuilder.tpl | 0 .../templates/om/php4/MultiExtendObject.tpl | 0 .../templates/om/php4/Node.tpl | 6 +- .../templates/om/php4/NodePeer.tpl | 10 +- .../templates/om/php4/Object.tpl | 3876 +++---- .../templates/om/php4/Peer.tpl | 0 .../templates/om/php5/ExtensionNode.tpl | 0 .../templates/om/php5/ExtensionNodePeer.tpl | 0 .../templates/om/php5/ExtensionObject.tpl | 0 .../templates/om/php5/ExtensionPeer.tpl | 0 .../templates/om/php5/Interface.tpl | 0 .../templates/om/php5/MapBuilder.tpl | 0 .../templates/om/php5/MultiExtendObject.tpl | 0 .../templates/om/php5/Node.tpl | 0 .../templates/om/php5/NodePeer.tpl | 0 .../templates/om/php5/Object.tpl | 3682 +++---- .../templates/om/php5/Peer.tpl | 0 .../templates/sql/base/mssql/columns.tpl | 0 .../templates/sql/base/mssql/drop.tpl | 0 .../templates/sql/base/mssql/foreignkey.tpl | 0 .../templates/sql/base/mssql/index.tpl | 0 .../templates/sql/base/mssql/primarykey.tpl | 0 .../templates/sql/base/mssql/table.tpl | 0 .../templates/sql/base/mssql/tablefk.tpl | 0 .../templates/sql/base/mssql/unique.tpl | 0 .../templates/sql/base/mysql/columns.tpl | 0 .../templates/sql/base/mysql/database-end.tpl | 0 .../sql/base/mysql/database-start.tpl | 0 .../templates/sql/base/mysql/drop.tpl | 0 .../templates/sql/base/mysql/foreignkey.tpl | 0 .../templates/sql/base/mysql/index.tpl | 0 .../templates/sql/base/mysql/primarykey.tpl | 0 .../templates/sql/base/mysql/table.tpl | 0 .../templates/sql/base/mysql/tablefk.tpl | 0 .../templates/sql/base/mysql/unique.tpl | 0 .../templates/sql/base/oracle/columns.tpl | 0 .../templates/sql/base/oracle/drop.tpl | 0 .../templates/sql/base/oracle/foreignkey.tpl | 0 .../templates/sql/base/oracle/index.tpl | 0 .../templates/sql/base/oracle/primarykey.tpl | 0 .../templates/sql/base/oracle/sequence.tpl | 0 .../templates/sql/base/oracle/table.tpl | 0 .../templates/sql/base/oracle/tablefk.tpl | 0 .../templates/sql/base/oracle/unique.tpl | 0 .../templates/sql/base/pgsql/columns.tpl | 24 +- .../templates/sql/base/pgsql/drop.tpl | 8 +- .../templates/sql/base/pgsql/foreignkey.tpl | 40 +- .../templates/sql/base/pgsql/index.tpl | 4 +- .../templates/sql/base/pgsql/primarykey.tpl | 6 +- .../templates/sql/base/pgsql/sequence.tpl | 6 +- .../templates/sql/base/pgsql/table.tpl | 110 +- .../templates/sql/base/pgsql/tablefk.tpl | 28 +- .../templates/sql/base/pgsql/unique.tpl | 4 +- .../templates/sql/base/sqlite/columns.tpl | 0 .../templates/sql/base/sqlite/drop.tpl | 2 +- .../templates/sql/base/sqlite/foreignkey.tpl | 8 +- .../templates/sql/base/sqlite/index.tpl | 4 +- .../templates/sql/base/sqlite/table.tpl | 66 +- .../templates/sql/base/sqlite/tablefk.tpl | 2 +- .../templates/sql/base/sqlite/unique.tpl | 4 +- .../templates/sql/db-init/Control.tpl | 24 +- .../templates/sql/db-init/mssql/unix.tpl | 12 +- .../templates/sql/db-init/mssql/windows.tpl | 2 +- .../templates/sql/db-init/mysql/createdb.tpl | 8 +- .../templates/sql/db-init/oracle/createdb.tpl | 0 .../templates/sql/db-init/pgsql/createdb.tpl | 8 +- .../templates/sql/load/mssql/row.tpl | 28 +- .../templates/sql/load/mssql/val.tpl | 18 +- .../templates/sql/load/mysql/row.tpl | 0 .../templates/sql/load/mysql/val.tpl | 0 .../templates/sql/load/oracle/row.tpl | 28 +- .../templates/sql/load/oracle/val.tpl | 18 +- .../templates/sql/load/pgsql/row.tpl | 28 +- .../templates/sql/load/pgsql/val.tpl | 22 +- .../templates/sql/load/sqlite/row.tpl | 28 +- .../templates/sql/load/sqlite/val.tpl | 6 +- .../propel/Propel.php | 0 .../propel/PropelException.php | 0 .../propel/adapter/DBAdapter.php | 0 .../propel/adapter/DBArray.php | 0 .../propel/adapter/DBMSSQL.php | 0 .../propel/adapter/DBMySQL.php | 0 .../propel/adapter/DBMySQLi.php | 0 .../propel/adapter/DBNone.php | 0 .../propel/adapter/DBOracle.php | 0 .../propel/adapter/DBPostgres.php | 0 .../propel/adapter/DBSQLite.php | 0 .../propel/adapter/DBSybase.php | 0 .../propel/logger/BasicLogger.php | 0 .../propel/logger/MojaviLogAdapter.php | 0 .../propel/map/ColumnMap.php | 0 .../propel/map/DatabaseMap.php | 0 .../propel/map/MapBuilder.php | 0 .../propel/map/TableMap.php | 0 .../propel/map/ValidatorMap.php | 0 .../propel/om/BaseObject.php | 16 +- .../propel/om/Persistent.php | 0 .../propel/om/PreOrderNodeIterator.php | 0 .../propel/util/BasePeer.php | 0 .../propel/util/Criteria.php | 16 +- .../propel/util/PeerInfo.php | 0 .../propel/util/PropelPager.php | 0 .../propel/util/Transaction.php | 0 .../propel/validator/BasicValidator.php | 0 .../propel/validator/MatchValidator.php | 0 .../propel/validator/MaxLengthValidator.php | 0 .../propel/validator/MaxValueValidator.php | 0 .../propel/validator/MinLengthValidator.php | 0 .../propel/validator/MinValueValidator.php | 0 .../propel/validator/NotMatchValidator.php | 0 .../propel/validator/RequiredValidator.php | 0 .../propel/validator/UniqueValidator.php | 0 .../propel/validator/ValidValuesValidator.php | 0 .../propel/validator/ValidationFailed.php | 0 .../thirdparty => thirdparty}/smarty/BUGS | 0 .../smarty/COPYING.lib | 0 .../smarty/ChangeLog | 0 .../thirdparty => thirdparty}/smarty/FAQ | 0 .../thirdparty => thirdparty}/smarty/INSTALL | 0 .../thirdparty => thirdparty}/smarty/NEWS | 0 .../smarty/QUICK_START | 0 .../thirdparty => thirdparty}/smarty/README | 0 .../smarty/RELEASE_NOTES | 0 .../thirdparty => thirdparty}/smarty/TODO | 0 .../smarty/demo/configs/test.conf | 0 .../smarty/demo/index.php | 0 .../smarty/demo/templates/footer.tpl | 0 .../smarty/demo/templates/header.tpl | 0 .../smarty/demo/templates/index.tpl | 0 .../smarty/libs/Config_File.class.php | 0 .../smarty/libs/Smarty.class.php | 0 .../smarty/libs/Smarty_Compiler.class.php | 0 .../smarty/libs/debug.tpl | 0 .../core.assemble_plugin_filepath.php | 0 .../core.assign_smarty_interface.php | 0 .../internals/core.create_dir_structure.php | 0 .../internals/core.display_debug_console.php | 0 .../libs/internals/core.get_include_path.php | 0 .../libs/internals/core.get_microtime.php | 0 .../libs/internals/core.get_php_resource.php | 0 .../smarty/libs/internals/core.is_secure.php | 0 .../smarty/libs/internals/core.is_trusted.php | 0 .../libs/internals/core.load_plugins.php | 0 .../internals/core.load_resource_plugin.php | 0 .../internals/core.process_cached_inserts.php | 0 .../core.process_compiled_include.php | 0 .../libs/internals/core.read_cache_file.php | 0 .../smarty/libs/internals/core.rm_auto.php | 0 .../smarty/libs/internals/core.rmdir.php | 0 .../internals/core.run_insert_handler.php | 0 .../internals/core.smarty_include_php.php | 0 .../libs/internals/core.write_cache_file.php | 0 .../internals/core.write_compiled_include.php | 0 .../core.write_compiled_resource.php | 0 .../smarty/libs/internals/core.write_file.php | 0 .../smarty/libs/plugins/block.textformat.php | 0 .../smarty/libs/plugins/compiler.assign.php | 0 .../plugins/function.assign_debug_info.php | 0 .../libs/plugins/function.config_load.php | 0 .../smarty/libs/plugins/function.counter.php | 0 .../smarty/libs/plugins/function.cycle.php | 0 .../smarty/libs/plugins/function.debug.php | 0 .../smarty/libs/plugins/function.eval.php | 0 .../smarty/libs/plugins/function.fetch.php | 0 .../libs/plugins/function.html_checkboxes.php | 0 .../libs/plugins/function.html_image.php | 0 .../libs/plugins/function.html_options.php | 0 .../libs/plugins/function.html_radios.php | 0 .../plugins/function.html_select_date.php | 0 .../plugins/function.html_select_time.php | 0 .../libs/plugins/function.html_table.php | 0 .../smarty/libs/plugins/function.mailto.php | 0 .../smarty/libs/plugins/function.math.php | 0 .../smarty/libs/plugins/function.popup.php | 0 .../libs/plugins/function.popup_init.php | 0 .../libs/plugins/modifier.capitalize.php | 0 .../smarty/libs/plugins/modifier.cat.php | 0 .../plugins/modifier.count_characters.php | 0 .../plugins/modifier.count_paragraphs.php | 0 .../libs/plugins/modifier.count_sentences.php | 0 .../libs/plugins/modifier.count_words.php | 0 .../libs/plugins/modifier.date_format.php | 0 .../libs/plugins/modifier.debug_print_var.php | 0 .../smarty/libs/plugins/modifier.default.php | 0 .../smarty/libs/plugins/modifier.escape.php | 0 .../smarty/libs/plugins/modifier.indent.php | 0 .../smarty/libs/plugins/modifier.lower.php | 0 .../smarty/libs/plugins/modifier.nl2br.php | 0 .../libs/plugins/modifier.regex_replace.php | 0 .../smarty/libs/plugins/modifier.replace.php | 0 .../smarty/libs/plugins/modifier.spacify.php | 0 .../libs/plugins/modifier.string_format.php | 0 .../smarty/libs/plugins/modifier.strip.php | 0 .../libs/plugins/modifier.strip_tags.php | 0 .../smarty/libs/plugins/modifier.truncate.php | 0 .../smarty/libs/plugins/modifier.upper.php | 0 .../smarty/libs/plugins/modifier.wordwrap.php | 0 .../plugins/outputfilter.trimwhitespace.php | 0 .../plugins/shared.escape_special_chars.php | 0 .../libs/plugins/shared.make_timestamp.php | 0 .../smarty/misc/smarty_icon.README | 0 .../smarty/misc/smarty_icon.gif | Bin .../smarty/unit_test/README | 0 .../smarty/unit_test/config.php | 0 .../configs/globals_double_quotes.conf | 0 .../configs/globals_single_quotes.conf | 0 .../smarty/unit_test/smarty_unit_test.php | 0 .../smarty/unit_test/smarty_unit_test_gui.php | 0 .../smarty/unit_test/templates/assign_var.tpl | 0 .../smarty/unit_test/templates/constant.tpl | 0 .../smarty/unit_test/templates/index.tpl | 0 .../smarty/unit_test/templates/parse_math.tpl | 0 .../unit_test/templates/parse_obj_meth.tpl | 0 .../smarty/unit_test/test_cases.php | 0 .../tcpdf/2dbarcodes.php | 16 +- .../tcpdf/CHANGELOG.TXT | 0 .../tcpdf/LICENSE.TXT | 0 .../tcpdf/README.TXT | 0 .../tcpdf/barcodes.php | 0 .../tcpdf/composer.json | 0 .../tcpdf/config/lang/afr.php | 0 .../tcpdf/config/lang/ara.php | 0 .../tcpdf/config/lang/aze.php | 0 .../tcpdf/config/lang/bel.php | 0 .../tcpdf/config/lang/bra.php | 0 .../tcpdf/config/lang/bul.php | 94 +- .../tcpdf/config/lang/cat.php | 0 .../tcpdf/config/lang/ces.php | 0 .../tcpdf/config/lang/chi.php | 0 .../tcpdf/config/lang/cym.php | 0 .../tcpdf/config/lang/dan.php | 0 .../tcpdf/config/lang/eng.php | 0 .../tcpdf/config/lang/est.php | 0 .../tcpdf/config/lang/eus.php | 0 .../tcpdf/config/lang/far.php | 0 .../tcpdf/config/lang/fra.php | 0 .../tcpdf/config/lang/ger.php | 0 .../tcpdf/config/lang/gle.php | 0 .../tcpdf/config/lang/glg.php | 0 .../tcpdf/config/lang/hat.php | 0 .../tcpdf/config/lang/heb.php | 0 .../tcpdf/config/lang/hrv.php | 0 .../tcpdf/config/lang/hun.php | 0 .../tcpdf/config/lang/hye.php | 0 .../tcpdf/config/lang/ind.php | 0 .../tcpdf/config/lang/ita.php | 0 .../tcpdf/config/lang/jpn.php | 0 .../tcpdf/config/lang/kat.php | 0 .../tcpdf/config/lang/kor.php | 0 .../tcpdf/config/lang/mkd.php | 0 .../tcpdf/config/lang/mlt.php | 0 .../tcpdf/config/lang/msa.php | 0 .../tcpdf/config/lang/nld.php | 0 .../tcpdf/config/lang/nob.php | 0 .../tcpdf/config/lang/pol.php | 0 .../tcpdf/config/lang/por.php | 0 .../tcpdf/config/lang/ron.php | 0 .../tcpdf/config/lang/rus.php | 0 .../tcpdf/config/lang/slv.php | 0 .../tcpdf/config/lang/spa.php | 0 .../tcpdf/config/lang/sqi.php | 0 .../tcpdf/config/lang/srp.php | 0 .../tcpdf/config/lang/swa.php | 0 .../tcpdf/config/lang/swe.php | 0 .../tcpdf/config/lang/ukr.php | 0 .../tcpdf/config/lang/urd.php | 0 .../tcpdf/config/lang/yid.php | 0 .../tcpdf/config/lang/zho.php | 0 .../tcpdf/config/tcpdf_config.php | 0 .../tcpdf/config/tcpdf_config_alt.php | 0 .../tcpdf/datamatrix.php | 0 .../tcpdf/encodings_maps.php | 0 .../tcpdf/fonts/aealarabiya.ctg.z | Bin .../tcpdf/fonts/aealarabiya.php | 0 .../tcpdf/fonts/aealarabiya.z | Bin .../tcpdf/fonts/aefurat.ctg.z | Bin .../tcpdf/fonts/aefurat.php | 0 .../tcpdf/fonts/aefurat.z | Bin .../tcpdf/fonts/arial.ctg.z | Bin .../tcpdf/fonts/arial.php | 0 .../tcpdf/fonts/arial.z | Bin .../tcpdf/fonts/arialb.ctg.z | Bin .../tcpdf/fonts/arialb.php | 0 .../tcpdf/fonts/arialb.z | Bin .../tcpdf/fonts/arialbi.ctg.z | Bin .../tcpdf/fonts/arialbi.php | 0 .../tcpdf/fonts/arialbi.z | Bin .../tcpdf/fonts/arialblack.ctg.z | Bin .../tcpdf/fonts/arialblack.php | 0 .../tcpdf/fonts/arialblack.z | Bin .../tcpdf/fonts/ariali.ctg.z | Bin .../tcpdf/fonts/ariali.php | 0 .../tcpdf/fonts/ariali.z | Bin .../tcpdf/fonts/cid0cs.php | 0 .../tcpdf/fonts/cid0ct.php | 0 .../tcpdf/fonts/cid0jp.php | 0 .../tcpdf/fonts/cid0kr.php | 0 .../tcpdf/fonts/courier.php | 0 .../tcpdf/fonts/courierb.php | 0 .../tcpdf/fonts/courierbi.php | 0 .../tcpdf/fonts/courieri.php | 0 .../tcpdf/fonts/dejavu-fonts-ttf-2.33/AUTHORS | 0 .../tcpdf/fonts/dejavu-fonts-ttf-2.33/BUGS | 0 .../tcpdf/fonts/dejavu-fonts-ttf-2.33/LICENSE | 0 .../tcpdf/fonts/dejavu-fonts-ttf-2.33/NEWS | 0 .../tcpdf/fonts/dejavu-fonts-ttf-2.33/README | 0 .../fonts/dejavu-fonts-ttf-2.33/langcover.txt | 0 .../fonts/dejavu-fonts-ttf-2.33/status.txt | 0 .../fonts/dejavu-fonts-ttf-2.33/unicover.txt | 0 .../tcpdf/fonts/dejavusans.ctg.z | Bin .../tcpdf/fonts/dejavusans.php | 0 .../tcpdf/fonts/dejavusans.z | Bin .../tcpdf/fonts/dejavusansb.ctg.z | Bin .../tcpdf/fonts/dejavusansb.php | 0 .../tcpdf/fonts/dejavusansb.z | Bin .../tcpdf/fonts/dejavusansbi.ctg.z | Bin .../tcpdf/fonts/dejavusansbi.php | 0 .../tcpdf/fonts/dejavusansbi.z | Bin .../tcpdf/fonts/dejavusanscondensed.ctg.z | Bin .../tcpdf/fonts/dejavusanscondensed.php | 0 .../tcpdf/fonts/dejavusanscondensed.z | Bin .../tcpdf/fonts/dejavusanscondensedb.ctg.z | Bin .../tcpdf/fonts/dejavusanscondensedb.php | 0 .../tcpdf/fonts/dejavusanscondensedb.z | Bin .../tcpdf/fonts/dejavusanscondensedbi.ctg.z | Bin .../tcpdf/fonts/dejavusanscondensedbi.php | 0 .../tcpdf/fonts/dejavusanscondensedbi.z | Bin .../tcpdf/fonts/dejavusanscondensedi.ctg.z | Bin .../tcpdf/fonts/dejavusanscondensedi.php | 0 .../tcpdf/fonts/dejavusanscondensedi.z | Bin .../tcpdf/fonts/dejavusansextralight.ctg.z | Bin .../tcpdf/fonts/dejavusansextralight.php | 0 .../tcpdf/fonts/dejavusansextralight.z | Bin .../tcpdf/fonts/dejavusansi.ctg.z | Bin .../tcpdf/fonts/dejavusansi.php | 0 .../tcpdf/fonts/dejavusansi.z | Bin .../tcpdf/fonts/dejavusansmono.ctg.z | Bin .../tcpdf/fonts/dejavusansmono.php | 0 .../tcpdf/fonts/dejavusansmono.z | Bin .../tcpdf/fonts/dejavusansmonob.ctg.z | Bin .../tcpdf/fonts/dejavusansmonob.php | 0 .../tcpdf/fonts/dejavusansmonob.z | Bin .../tcpdf/fonts/dejavusansmonobi.ctg.z | Bin .../tcpdf/fonts/dejavusansmonobi.php | 0 .../tcpdf/fonts/dejavusansmonobi.z | Bin .../tcpdf/fonts/dejavusansmonoi.ctg.z | Bin .../tcpdf/fonts/dejavusansmonoi.php | 0 .../tcpdf/fonts/dejavusansmonoi.z | Bin .../tcpdf/fonts/dejavuserif.ctg.z | Bin .../tcpdf/fonts/dejavuserif.php | 0 .../tcpdf/fonts/dejavuserif.z | Bin .../tcpdf/fonts/dejavuserifb.ctg.z | Bin .../tcpdf/fonts/dejavuserifb.php | 0 .../tcpdf/fonts/dejavuserifb.z | Bin .../tcpdf/fonts/dejavuserifbi.ctg.z | Bin .../tcpdf/fonts/dejavuserifbi.php | 0 .../tcpdf/fonts/dejavuserifbi.z | Bin .../tcpdf/fonts/dejavuserifcondensed.ctg.z | Bin .../tcpdf/fonts/dejavuserifcondensed.php | 0 .../tcpdf/fonts/dejavuserifcondensed.z | Bin .../tcpdf/fonts/dejavuserifcondensedb.ctg.z | Bin .../tcpdf/fonts/dejavuserifcondensedb.php | 0 .../tcpdf/fonts/dejavuserifcondensedb.z | Bin .../tcpdf/fonts/dejavuserifcondensedbi.ctg.z | Bin .../tcpdf/fonts/dejavuserifcondensedbi.php | 0 .../tcpdf/fonts/dejavuserifcondensedbi.z | Bin .../tcpdf/fonts/dejavuserifcondensedi.ctg.z | Bin .../tcpdf/fonts/dejavuserifcondensedi.php | 0 .../tcpdf/fonts/dejavuserifcondensedi.z | Bin .../tcpdf/fonts/dejavuserifi.ctg.z | Bin .../tcpdf/fonts/dejavuserifi.php | 0 .../tcpdf/fonts/dejavuserifi.z | Bin .../tcpdf/fonts/freefont-20100919/AUTHORS | 0 .../tcpdf/fonts/freefont-20100919/COPYING | 0 .../tcpdf/fonts/freefont-20100919/CREDITS | 0 .../tcpdf/fonts/freefont-20100919/ChangeLog | 0 .../tcpdf/fonts/freefont-20100919/INSTALL | 0 .../tcpdf/fonts/freefont-20100919/README | 0 .../tcpdf/fonts/freemono.ctg.z | Bin .../tcpdf/fonts/freemono.php | 0 .../tcpdf/fonts/freemono.z | Bin .../tcpdf/fonts/freemonob.ctg.z | Bin .../tcpdf/fonts/freemonob.php | 0 .../tcpdf/fonts/freemonob.z | Bin .../tcpdf/fonts/freemonobi.ctg.z | Bin .../tcpdf/fonts/freemonobi.php | 0 .../tcpdf/fonts/freemonobi.z | Bin .../tcpdf/fonts/freemonoi.ctg.z | Bin .../tcpdf/fonts/freemonoi.php | 0 .../tcpdf/fonts/freemonoi.z | Bin .../tcpdf/fonts/freesans.ctg.z | Bin .../tcpdf/fonts/freesans.php | 0 .../tcpdf/fonts/freesans.z | Bin .../tcpdf/fonts/freesansb.ctg.z | Bin .../tcpdf/fonts/freesansb.php | 0 .../tcpdf/fonts/freesansb.z | Bin .../tcpdf/fonts/freesansbi.ctg.z | Bin .../tcpdf/fonts/freesansbi.php | 0 .../tcpdf/fonts/freesansbi.z | Bin .../tcpdf/fonts/freesansi.ctg.z | Bin .../tcpdf/fonts/freesansi.php | 0 .../tcpdf/fonts/freesansi.z | Bin .../tcpdf/fonts/freeserif.ctg.z | Bin .../tcpdf/fonts/freeserif.php | 0 .../tcpdf/fonts/freeserif.z | Bin .../tcpdf/fonts/freeserifb.ctg.z | Bin .../tcpdf/fonts/freeserifb.php | 0 .../tcpdf/fonts/freeserifb.z | Bin .../tcpdf/fonts/freeserifbi.ctg.z | Bin .../tcpdf/fonts/freeserifbi.php | 0 .../tcpdf/fonts/freeserifbi.z | Bin .../tcpdf/fonts/freeserifi.ctg.z | Bin .../tcpdf/fonts/freeserifi.php | 0 .../tcpdf/fonts/freeserifi.z | Bin .../tcpdf/fonts/helvetica.php | 0 .../tcpdf/fonts/helveticab.php | 0 .../tcpdf/fonts/helveticabi.php | 0 .../tcpdf/fonts/helveticai.php | 0 .../tcpdf/fonts/hysmyeongjostdmedium.php | 0 .../tcpdf/fonts/kozgopromedium.php | 0 .../tcpdf/fonts/kozminproregular.php | 0 .../tcpdf/fonts/msungstdlight.php | 0 .../tcpdf/fonts/pdfacourier.php | 0 .../tcpdf/fonts/pdfacourier.z | Bin .../tcpdf/fonts/pdfacourierb.php | 0 .../tcpdf/fonts/pdfacourierb.z | Bin .../tcpdf/fonts/pdfacourierbi.php | 0 .../tcpdf/fonts/pdfacourierbi.z | Bin .../tcpdf/fonts/pdfacourieri.php | 0 .../tcpdf/fonts/pdfacourieri.z | Bin .../tcpdf/fonts/pdfahelvetica.php | 0 .../tcpdf/fonts/pdfahelvetica.z | Bin .../tcpdf/fonts/pdfahelveticab.php | 0 .../tcpdf/fonts/pdfahelveticab.z | Bin .../tcpdf/fonts/pdfahelveticabi.php | 0 .../tcpdf/fonts/pdfahelveticabi.z | Bin .../tcpdf/fonts/pdfahelveticai.php | 0 .../tcpdf/fonts/pdfahelveticai.z | Bin .../tcpdf/fonts/pdfasymbol.php | 0 .../tcpdf/fonts/pdfasymbol.z | Bin .../tcpdf/fonts/pdfatimes.php | 0 .../tcpdf/fonts/pdfatimes.z | Bin .../tcpdf/fonts/pdfatimesb.php | 0 .../tcpdf/fonts/pdfatimesb.z | Bin .../tcpdf/fonts/pdfatimesbi.php | 0 .../tcpdf/fonts/pdfatimesbi.z | Bin .../tcpdf/fonts/pdfatimesi.php | 0 .../tcpdf/fonts/pdfatimesi.z | Bin .../tcpdf/fonts/pdfazapfdingbats.php | 0 .../tcpdf/fonts/pdfazapfdingbats.z | Bin .../tcpdf/fonts/stsongstdlight.php | 0 .../tcpdf/fonts/symbol.php | 0 .../tcpdf/fonts/times.php | 0 .../tcpdf/fonts/timesb.php | 0 .../tcpdf/fonts/timesbi.php | 0 .../tcpdf/fonts/timesi.php | 0 .../tcpdf/fonts/timesnewroman.ctg.z | Bin .../tcpdf/fonts/timesnewroman.php | 0 .../tcpdf/fonts/timesnewroman.z | Bin .../tcpdf/fonts/timesnewromanb.ctg.z | Bin .../tcpdf/fonts/timesnewromanb.php | 0 .../tcpdf/fonts/timesnewromanb.z | Bin .../tcpdf/fonts/timesnewromanbi.ctg.z | Bin .../tcpdf/fonts/timesnewromanbi.php | 0 .../tcpdf/fonts/timesnewromanbi.z | Bin .../tcpdf/fonts/timesnewromani.ctg.z | Bin .../tcpdf/fonts/timesnewromani.php | 0 .../tcpdf/fonts/timesnewromani.z | Bin .../tcpdf/fonts/uni2cid_ac15.php | 0 .../tcpdf/fonts/uni2cid_ag15.php | 0 .../tcpdf/fonts/uni2cid_aj16.php | 0 .../tcpdf/fonts/uni2cid_ak12.php | 0 .../tcpdf/fonts/zapfdingbats.php | 0 .../tcpdf/htmlcolors.php | 0 .../tcpdf/pdf417.php | 0 .../tcpdf/qrcode.php | 0 .../thirdparty => thirdparty}/tcpdf/sRGB.icc | Bin .../tcpdf/spotcolors.php | 0 .../thirdparty => thirdparty}/tcpdf/tcpdf.crt | 0 .../thirdparty => thirdparty}/tcpdf/tcpdf.fdf | Bin .../thirdparty => thirdparty}/tcpdf/tcpdf.p12 | Bin .../thirdparty => thirdparty}/tcpdf/tcpdf.php | 0 .../tcpdf/tcpdf_filters.php | 0 .../tcpdf/tcpdf_parser.php | 0 .../tcpdf/unicode_data.php | 0 workflow/public_html/sysGeneric.php | 6 - 2289 files changed, 204853 insertions(+), 80064 deletions(-) create mode 100644 bootstrap/autoload.php create mode 100644 gulliver/thirdparty/pear/archive_tar/.gitignore create mode 100644 gulliver/thirdparty/pear/archive_tar/.travis.sh create mode 100644 gulliver/thirdparty/pear/archive_tar/.travis.yml create mode 100644 gulliver/thirdparty/pear/archive_tar/Archive/Tar.php create mode 100644 gulliver/thirdparty/pear/archive_tar/README.md create mode 100644 gulliver/thirdparty/pear/archive_tar/composer.json create mode 100644 gulliver/thirdparty/pear/archive_tar/docs/Archive_Tar.txt create mode 100644 gulliver/thirdparty/pear/archive_tar/package.xml create mode 100644 gulliver/thirdparty/pear/archive_tar/scripts/phptar.in create mode 100644 gulliver/thirdparty/pear/archive_tar/sync-php4 create mode 100644 gulliver/thirdparty/pear/archive_tar/tests/deadlinks.phpt create mode 100644 gulliver/thirdparty/pear/archive_tar/tests/dirtraversal.phpt create mode 100644 gulliver/thirdparty/pear/archive_tar/tests/hamidTARtester2.tar create mode 100644 gulliver/thirdparty/pear/archive_tar/tests/invalidblock.phpt create mode 100644 gulliver/thirdparty/pear/archive_tar/tests/longfilename.phpt create mode 100644 gulliver/thirdparty/pear/archive_tar/tests/pax.phpt create mode 100644 gulliver/thirdparty/pear/archive_tar/tests/permissions.phpt create mode 100644 gulliver/thirdparty/pear/archive_tar/tests/phpt_test.php.inc create mode 100644 gulliver/thirdparty/pear/archive_tar/tests/setup.php.inc create mode 100644 gulliver/thirdparty/pear/archive_tar/tests/symlink.phpt create mode 100644 gulliver/thirdparty/pear/archive_tar/tests/testblock1/a.txt create mode 100644 gulliver/thirdparty/pear/archive_tar/tests/testblock1/bugTriggeringPng.png rename gulliver/thirdparty/{html2ps_pdf/cache => pear/archive_tar/tests/testblock2}/.gitignore (100%) create mode 100644 gulliver/thirdparty/pear/archive_tar/tests/testpax.tar create mode 100644 gulliver/thirdparty/pear/archive_tar/tests/testperms.tar create mode 100644 gulliver/thirdparty/pear/archive_tar/tests/testsymlink.tar create mode 100644 gulliver/thirdparty/pear/console_getopt/.gitignore create mode 100644 gulliver/thirdparty/pear/console_getopt/.travis.yml create mode 100644 gulliver/thirdparty/pear/console_getopt/Console/Getopt.php create mode 100644 gulliver/thirdparty/pear/console_getopt/LICENSE create mode 100644 gulliver/thirdparty/pear/console_getopt/README.rst create mode 100644 gulliver/thirdparty/pear/console_getopt/composer.json create mode 100644 gulliver/thirdparty/pear/console_getopt/package.xml create mode 100644 gulliver/thirdparty/pear/console_getopt/tests/001-getopt.phpt create mode 100644 gulliver/thirdparty/pear/console_getopt/tests/bug10557.phpt create mode 100644 gulliver/thirdparty/pear/console_getopt/tests/bug11068.phpt create mode 100644 gulliver/thirdparty/pear/console_getopt/tests/bug13140.phpt create mode 100644 gulliver/thirdparty/pear/pear-core-minimal/README.rst create mode 100644 gulliver/thirdparty/pear/pear-core-minimal/composer.json create mode 100644 gulliver/thirdparty/pear/pear-core-minimal/src/OS/Guess.php create mode 100644 gulliver/thirdparty/pear/pear-core-minimal/src/PEAR.php create mode 100644 gulliver/thirdparty/pear/pear-core-minimal/src/PEAR/Error.php create mode 100644 gulliver/thirdparty/pear/pear-core-minimal/src/PEAR/ErrorStack.php create mode 100644 gulliver/thirdparty/pear/pear-core-minimal/src/System.php create mode 100644 gulliver/thirdparty/pear/pear_exception/.gitignore create mode 100644 gulliver/thirdparty/pear/pear_exception/.travis.yml create mode 100644 gulliver/thirdparty/pear/pear_exception/LICENSE create mode 100644 gulliver/thirdparty/pear/pear_exception/PEAR/Exception.php create mode 100644 gulliver/thirdparty/pear/pear_exception/composer.json create mode 100644 gulliver/thirdparty/pear/pear_exception/package.xml create mode 100644 gulliver/thirdparty/pear/pear_exception/tests/PEAR/ExceptionTest.php rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier.auto.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier.autoload.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier.composer.php (95%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier.func.php (95%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier.includes.php (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier.kses.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier.path.php (95%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier.php (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier.safe-includes.php (98%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/Arborize.php (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/AttrCollections.php (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/AttrDef.php (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/AttrDef/CSS.php (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/AttrDef/CSS/AlphaValue.php (95%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Background.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/AttrDef/CSS/BackgroundPosition.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Border.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Color.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Composite.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/AttrDef/CSS/DenyElementDecorator.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Filter.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Font.php (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/AttrDef/CSS/FontFamily.php (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Ident.php (95%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/AttrDef/CSS/ImportantDecorator.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Length.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/AttrDef/CSS/ListStyle.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Multiple.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Number.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Percentage.php (95%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/AttrDef/CSS/TextDecoration.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/AttrDef/CSS/URI.php (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/AttrDef/Clone.php (95%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/AttrDef/Enum.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/AttrDef/HTML/Bool.php (94%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/AttrDef/HTML/Class.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/AttrDef/HTML/Color.php (95%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/AttrDef/HTML/FrameTarget.php (95%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/AttrDef/HTML/ID.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/AttrDef/HTML/Length.php (95%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/AttrDef/HTML/LinkTypes.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/AttrDef/HTML/MultiLength.php (95%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/AttrDef/HTML/Nmtokens.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/AttrDef/HTML/Pixels.php (95%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/AttrDef/Integer.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/AttrDef/Lang.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/AttrDef/Switch.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/AttrDef/Text.php (95%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/AttrDef/URI.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/AttrDef/URI/Email.php (94%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/AttrDef/URI/Email/SimpleCheck.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/AttrDef/URI/Host.php (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/AttrDef/URI/IPv4.php (95%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/AttrDef/URI/IPv6.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/AttrTransform.php (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/AttrTransform/Background.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/AttrTransform/BdoDir.php (95%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/AttrTransform/BgColor.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/AttrTransform/BoolToCSS.php (95%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/AttrTransform/Border.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/AttrTransform/EnumToCSS.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/AttrTransform/ImgRequired.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/AttrTransform/ImgSpace.php (95%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/AttrTransform/Input.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/AttrTransform/Lang.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/AttrTransform/Length.php (95%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/AttrTransform/Name.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/AttrTransform/NameSync.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/AttrTransform/Nofollow.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/AttrTransform/SafeEmbed.php (95%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/AttrTransform/SafeObject.php (95%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/AttrTransform/SafeParam.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/AttrTransform/ScriptRequired.php (95%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/AttrTransform/TargetBlank.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/AttrTransform/Textarea.php (95%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/AttrTypes.php (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/AttrValidator.php (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/Bootstrap.php (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/CSSDefinition.php (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ChildDef.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ChildDef/Chameleon.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ChildDef/Custom.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ChildDef/Empty.php (95%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ChildDef/List.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ChildDef/Optional.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ChildDef/Required.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ChildDef/StrictBlockquote.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ChildDef/Table.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/Config.php (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema.php (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/Builder/ConfigSchema.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/Builder/Xml.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/Exception.php (93%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/Interchange.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/Interchange/Directive.php (95%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/Interchange/Id.php (94%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/InterchangeBuilder.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/Validator.php (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/ValidatorAtom.php (95%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema.ser (100%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.AllowedClasses.txt (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.AllowedFrameTargets.txt (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRel.txt (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRev.txt (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.ClassUseCDATA.txt (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.DefaultImageAlt.txt (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImage.txt (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImageAlt.txt (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.DefaultTextDir.txt (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.EnableID.txt (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.ForbiddenClasses.txt (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklist.txt (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklistRegexp.txt (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefix.txt (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefixLocal.txt (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.AutoParagraph.txt (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.Custom.txt (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.DisplayLinkURI.txt (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.Linkify.txt (95%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.DocURL.txt (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.txt (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions.txt (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.txt (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.txt (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveSpansWithoutAttributes.txt (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.AllowImportant.txt (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.AllowTricky.txt (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.AllowedFonts.txt (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.AllowedProperties.txt (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.DefinitionRev.txt (94%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.ForbiddenProperties.txt (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.MaxImgLength.txt (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.Proprietary.txt (94%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.Trusted.txt (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Cache.DefinitionImpl.txt (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPath.txt (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPermissions.txt (95%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.AggressivelyFixLt.txt (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.AllowHostnameUnderscore.txt (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.CollectErrors.txt (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.ColorKeywords.txt (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.ConvertDocumentToFragment.txt (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.DirectLexLineNumberSyncInterval.txt (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.DisableExcludes.txt (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.EnableIDNA.txt (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.Encoding.txt (98%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidChildren.txt (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidTags.txt (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.EscapeNonASCIICharacters.txt (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.HiddenElements.txt (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.Language.txt (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.LexerImpl.txt (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.MaintainLineNumbers.txt (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.NormalizeNewlines.txt (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.RemoveInvalidImg.txt (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.RemoveProcessingInstructions.txt (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.RemoveScriptContents.txt (95%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Filter.Custom.txt (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Escaping.txt (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Scope.txt (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.TidyImpl.txt (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.txt (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Filter.YouTube.txt (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Allowed.txt (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.AllowedAttributes.txt (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.AllowedComments.txt (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.AllowedCommentsRegexp.txt (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.AllowedElements.txt (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.AllowedModules.txt (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Attr.Name.UseCDATA.txt (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.BlockWrapper.txt (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.CoreModules.txt (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.CustomDoctype.txt (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionID.txt (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionRev.txt (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Doctype.txt (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.FlashAllowFullScreen.txt (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenAttributes.txt (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenElements.txt (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.MaxImgLength.txt (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Nofollow.txt (95%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Parent.txt (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Proprietary.txt (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.SafeEmbed.txt (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.SafeIframe.txt (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.SafeObject.txt (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.SafeScripting.txt (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Strict.txt (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.TargetBlank.txt (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.TidyAdd.txt (95%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.TidyLevel.txt (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.TidyRemove.txt (95%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Trusted.txt (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.XHTML.txt (95%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Output.CommentScriptContents.txt (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Output.FixInnerHTML.txt (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Output.FlashCompat.txt (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Output.Newline.txt (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Output.SortAttr.txt (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Output.TidyFormat.txt (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Test.ForceNoIconv.txt (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.AllowedSchemes.txt (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.Base.txt (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.DefaultScheme.txt (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.DefinitionID.txt (95%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.DefinitionRev.txt (94%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.Disable.txt (95%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.DisableExternal.txt (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.DisableExternalResources.txt (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.DisableResources.txt (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.Host.txt (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.HostBlacklist.txt (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.MakeAbsolute.txt (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.Munge.txt (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.MungeResources.txt (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.MungeSecretKey.txt (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.OverrideAllowedSchemes.txt (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.SafeIframeRegexp.txt (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/info.ini (93%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ContentSets.php (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/Context.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/Definition.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/DefinitionCache.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/DefinitionCache/Decorator.php (95%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/DefinitionCache/Decorator/Cleanup.php (95%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/DefinitionCache/Decorator/Memory.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/DefinitionCache/Decorator/Template.php.in (95%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/DefinitionCache/Null.php (94%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/DefinitionCache/Serializer.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/DefinitionCache/Serializer/CSS/4.6.0,24166bfe16a0cc6bd18d813b83121ef2eaf16545,1.ser (100%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/DefinitionCache/Serializer/HTML/4.6.0,bd08c5afbc77123dbd4e9e026a723c450e9f844b,1.ser (100%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/DefinitionCache/Serializer/README (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/DefinitionCacheFactory.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/Doctype.php (95%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/DoctypeRegistry.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ElementDef.php (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/Encoder.php (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/EntityLookup.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/EntityLookup/entities.ser (100%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/EntityParser.php (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ErrorCollector.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/ErrorStruct.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/Exception.php (93%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/Filter.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/Filter/ExtractStyleBlocks.php (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/Filter/YouTube.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/Generator.php (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/HTMLDefinition.php (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/HTMLModule.php (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/HTMLModule/Bdo.php (95%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/HTMLModule/CommonAttributes.php (95%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/HTMLModule/Edit.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/HTMLModule/Forms.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/HTMLModule/Hypertext.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/HTMLModule/Iframe.php (95%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/HTMLModule/Image.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/HTMLModule/Legacy.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/HTMLModule/List.php (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/HTMLModule/Name.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/HTMLModule/Nofollow.php (95%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/HTMLModule/NonXMLCommonAttributes.php (94%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/HTMLModule/Object.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/HTMLModule/Presentation.php (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/HTMLModule/Proprietary.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/HTMLModule/Ruby.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/HTMLModule/SafeEmbed.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/HTMLModule/SafeObject.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/HTMLModule/SafeScripting.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/HTMLModule/Scripting.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/HTMLModule/StyleAttribute.php (95%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/HTMLModule/Tables.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/HTMLModule/Target.php (95%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/HTMLModule/TargetBlank.php (95%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/HTMLModule/Text.php (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/HTMLModule/Tidy.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/HTMLModule/Tidy/Name.php (95%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/HTMLModule/Tidy/Proprietary.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/HTMLModule/Tidy/Strict.php (95%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/HTMLModule/Tidy/Transitional.php (94%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/HTMLModule/Tidy/XHTML.php (94%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/HTMLModule/Tidy/XHTMLAndHTML4.php (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/HTMLModule/XMLCommonAttributes.php (94%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/HTMLModuleManager.php (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/IDAccumulator.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/Injector.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/Injector/AutoParagraph.php (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/Injector/DisplayLinkURI.php (95%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/Injector/Linkify.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/Injector/PurifierLinkify.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/Injector/RemoveEmpty.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/Injector/RemoveSpansWithoutAttributes.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/Injector/SafeObject.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/Language.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/Language/classes/en-x-test.php (93%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/Language/messages/en-x-test.php (93%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/Language/messages/en-x-testmini.php (95%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/Language/messages/en.php (98%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/LanguageFactory.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/Length.php (95%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/Lexer.php (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/Lexer/DOMLex.php (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/Lexer/DirectLex.php (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/Lexer/PH5P.php (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/Node.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/Node/Comment.php (95%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/Node/Element.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/Node/Text.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/PercentEncoder.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/Printer.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/Printer/CSSDefinition.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/Printer/ConfigForm.css (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/Printer/ConfigForm.js (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/Printer/ConfigForm.php (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/Printer/HTMLDefinition.php (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/PropertyList.php (95%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/PropertyListIterator.php (95%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/Queue.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/Strategy.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/Strategy/Composite.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/Strategy/Core.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/Strategy/FixNesting.php (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/Strategy/MakeWellFormed.php (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/Strategy/RemoveForeignElements.php (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/Strategy/ValidateAttributes.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/StringHash.php (95%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/StringHashParser.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/TagTransform.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/TagTransform/Font.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/TagTransform/Simple.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/Token.php (95%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/Token/Comment.php (95%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/Token/Empty.php (94%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/Token/End.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/Token/Start.php (93%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/Token/Tag.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/Token/Text.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/TokenFactory.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/URI.php (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/URIDefinition.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/URIFilter.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/URIFilter/DisableExternal.php (95%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/URIFilter/DisableExternalResources.php (95%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/URIFilter/DisableResources.php (95%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/URIFilter/HostBlacklist.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/URIFilter/MakeAbsolute.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/URIFilter/Munge.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/URIFilter/SafeIframe.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/URIParser.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/URIScheme.php (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/URIScheme/data.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/URIScheme/file.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/URIScheme/ftp.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/URIScheme/http.php (94%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/URIScheme/https.php (94%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/URIScheme/mailto.php (95%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/URIScheme/news.php (95%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/URIScheme/nntp.php (95%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/URISchemeRegistry.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/UnitConverter.php (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/VarParser.php (96%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/VarParser/Flexible.php (97%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/VarParser/Native.php (95%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/VarParserException.php (93%) rename {gulliver/thirdparty => thirdparty}/HTMLPurifier/HTMLPurifier/Zipper.php (96%) rename {gulliver/thirdparty => thirdparty}/creole/CallableStatement.php (100%) rename {gulliver/thirdparty => thirdparty}/creole/Connection.php (100%) rename {gulliver/thirdparty => thirdparty}/creole/Creole.php (99%) rename {gulliver/thirdparty => thirdparty}/creole/CreoleTypes.php (100%) rename {gulliver/thirdparty => thirdparty}/creole/IdGenerator.php (100%) rename {gulliver/thirdparty => thirdparty}/creole/PreparedStatement.php (100%) rename {gulliver/thirdparty => thirdparty}/creole/ResultSet.php (100%) rename {gulliver/thirdparty => thirdparty}/creole/ResultSetIterator.php (100%) rename {gulliver/thirdparty => thirdparty}/creole/SQLException.php (100%) rename {gulliver/thirdparty => thirdparty}/creole/Statement.php (100%) rename {gulliver/thirdparty => thirdparty}/creole/common/ConnectionCommon.php (100%) rename {gulliver/thirdparty => thirdparty}/creole/common/PreparedStatementCommon.php (100%) rename {gulliver/thirdparty => thirdparty}/creole/common/ResultSetCommon.php (100%) rename {gulliver/thirdparty => thirdparty}/creole/common/StatementCommon.php (100%) rename {gulliver/thirdparty => thirdparty}/creole/contrib/DBArrayConnection.php (100%) rename {gulliver/thirdparty => thirdparty}/creole/contrib/DebugConnection.php (100%) rename {gulliver/thirdparty => thirdparty}/creole/drivers/mssql/MSSQLCallableStatement.php (100%) rename {gulliver/thirdparty => thirdparty}/creole/drivers/mssql/MSSQLConnection.php (100%) rename {gulliver/thirdparty => thirdparty}/creole/drivers/mssql/MSSQLIdGenerator.php (100%) rename {gulliver/thirdparty => thirdparty}/creole/drivers/mssql/MSSQLPreparedStatement.php (100%) rename {gulliver/thirdparty => thirdparty}/creole/drivers/mssql/MSSQLResultSet.php (100%) rename {gulliver/thirdparty => thirdparty}/creole/drivers/mssql/MSSQLStatement.php (100%) rename {gulliver/thirdparty => thirdparty}/creole/drivers/mssql/MSSQLTypes.php (100%) rename {gulliver/thirdparty => thirdparty}/creole/drivers/mssql/metadata/MSSQLDatabaseInfo.php (100%) rename {gulliver/thirdparty => thirdparty}/creole/drivers/mssql/metadata/MSSQLTableInfo.php (100%) rename {gulliver/thirdparty => thirdparty}/creole/drivers/mysql/MySQLConnection.php (100%) rename {gulliver/thirdparty => thirdparty}/creole/drivers/mysql/MySQLIdGenerator.php (100%) rename {gulliver/thirdparty => thirdparty}/creole/drivers/mysql/MySQLPreparedStatement.php (100%) rename {gulliver/thirdparty => thirdparty}/creole/drivers/mysql/MySQLResultSet.php (100%) rename {gulliver/thirdparty => thirdparty}/creole/drivers/mysql/MySQLStatement.php (100%) rename {gulliver/thirdparty => thirdparty}/creole/drivers/mysql/MySQLTypes.php (100%) rename {gulliver/thirdparty => thirdparty}/creole/drivers/mysql/metadata/MySQLDatabaseInfo.php (100%) rename {gulliver/thirdparty => thirdparty}/creole/drivers/mysql/metadata/MySQLTableInfo.php (100%) rename {gulliver/thirdparty => thirdparty}/creole/drivers/mysqli/MySQLiConnection.php (100%) rename {gulliver/thirdparty => thirdparty}/creole/drivers/mysqli/MySQLiIdGenerator.php (100%) rename {gulliver/thirdparty => thirdparty}/creole/drivers/mysqli/MySQLiPreparedStatement.php (100%) rename {gulliver/thirdparty => thirdparty}/creole/drivers/mysqli/MySQLiResultSet.php (100%) rename {gulliver/thirdparty => thirdparty}/creole/drivers/mysqli/MySQLiStatement.php (100%) rename {gulliver/thirdparty => thirdparty}/creole/drivers/mysqli/metadata/MySQLiDatabaseInfo.php (100%) rename {gulliver/thirdparty => thirdparty}/creole/drivers/mysqli/metadata/MySQLiTableInfo.php (100%) rename {gulliver/thirdparty => thirdparty}/creole/drivers/odbc/ODBCCachedResultSet.php (100%) rename {gulliver/thirdparty => thirdparty}/creole/drivers/odbc/ODBCConnection.php (100%) rename {gulliver/thirdparty => thirdparty}/creole/drivers/odbc/ODBCIdGenerator.php (100%) rename {gulliver/thirdparty => thirdparty}/creole/drivers/odbc/ODBCPreparedStatement.php (100%) rename {gulliver/thirdparty => thirdparty}/creole/drivers/odbc/ODBCResultSet.php (100%) rename {gulliver/thirdparty => thirdparty}/creole/drivers/odbc/ODBCResultSetCommon.php (100%) rename {gulliver/thirdparty => thirdparty}/creole/drivers/odbc/ODBCStatement.php (100%) rename {gulliver/thirdparty => thirdparty}/creole/drivers/odbc/ODBCTypes.php (100%) rename {gulliver/thirdparty => thirdparty}/creole/drivers/odbc/README (100%) rename {gulliver/thirdparty => thirdparty}/creole/drivers/odbc/adapters/CodeBaseAdapter.php (100%) rename {gulliver/thirdparty => thirdparty}/creole/drivers/odbc/adapters/MySQLAdapter.php (100%) rename {gulliver/thirdparty => thirdparty}/creole/drivers/odbc/adapters/ODBCAdapter.php (100%) rename {gulliver/thirdparty => thirdparty}/creole/drivers/odbc/metadata/ODBCDatabaseInfo.php (100%) rename {gulliver/thirdparty => thirdparty}/creole/drivers/odbc/metadata/ODBCTableInfo.php (100%) rename {gulliver/thirdparty => thirdparty}/creole/drivers/oracle/OCI8Connection.php (95%) rename {gulliver/thirdparty => thirdparty}/creole/drivers/oracle/OCI8IdGenerator.php (100%) rename {gulliver/thirdparty => thirdparty}/creole/drivers/oracle/OCI8PreparedStatement.php (100%) rename {gulliver/thirdparty => thirdparty}/creole/drivers/oracle/OCI8ResultSet.php (100%) rename {gulliver/thirdparty => thirdparty}/creole/drivers/oracle/OCI8Statement.php (100%) rename {gulliver/thirdparty => thirdparty}/creole/drivers/oracle/OCI8Types.php (100%) rename {gulliver/thirdparty => thirdparty}/creole/drivers/oracle/metadata/OCI8DatabaseInfo.php (100%) rename {gulliver/thirdparty => thirdparty}/creole/drivers/oracle/metadata/OCI8TableInfo.php (100%) rename {gulliver/thirdparty => thirdparty}/creole/drivers/pgsql/PgSQLConnection.php (100%) rename {gulliver/thirdparty => thirdparty}/creole/drivers/pgsql/PgSQLIdGenerator.php (100%) rename {gulliver/thirdparty => thirdparty}/creole/drivers/pgsql/PgSQLPreparedStatement.php (100%) rename {gulliver/thirdparty => thirdparty}/creole/drivers/pgsql/PgSQLResultSet.php (100%) rename {gulliver/thirdparty => thirdparty}/creole/drivers/pgsql/PgSQLResultSetIterator.php (100%) rename {gulliver/thirdparty => thirdparty}/creole/drivers/pgsql/PgSQLStatement.php (100%) rename {gulliver/thirdparty => thirdparty}/creole/drivers/pgsql/PgSQLTypes.php (100%) rename {gulliver/thirdparty => thirdparty}/creole/drivers/pgsql/metadata/PgSQLDatabaseInfo.php (100%) rename {gulliver/thirdparty => thirdparty}/creole/drivers/pgsql/metadata/PgSQLTableInfo.php (100%) rename {gulliver/thirdparty => thirdparty}/creole/metadata/ColumnInfo.php (100%) rename {gulliver/thirdparty => thirdparty}/creole/metadata/DatabaseInfo.php (100%) rename {gulliver/thirdparty => thirdparty}/creole/metadata/ForeignKeyInfo.php (100%) rename {gulliver/thirdparty => thirdparty}/creole/metadata/IndexInfo.php (100%) rename {gulliver/thirdparty => thirdparty}/creole/metadata/PrimaryKeyInfo.php (100%) rename {gulliver/thirdparty => thirdparty}/creole/metadata/TableInfo.php (100%) rename {gulliver/thirdparty => thirdparty}/creole/util/Blob.php (97%) rename {gulliver/thirdparty => thirdparty}/creole/util/Clob.php (99%) rename {gulliver/thirdparty => thirdparty}/creole/util/Lob.php (96%) rename {gulliver/thirdparty => thirdparty}/creole/util/sql/SQLStatementExtractor.php (97%) rename {gulliver/thirdparty => thirdparty}/geshi/contrib/aliased.php (100%) rename {gulliver/thirdparty => thirdparty}/geshi/contrib/cssgen.php (100%) rename {gulliver/thirdparty => thirdparty}/geshi/contrib/cssgen2.php (100%) rename {gulliver/thirdparty => thirdparty}/geshi/contrib/langcheck.php (100%) rename {gulliver/thirdparty => thirdparty}/geshi/geshi.php (99%) rename {gulliver/thirdparty => thirdparty}/geshi/geshi/bash.php (100%) rename {gulliver/thirdparty => thirdparty}/geshi/geshi/javascript.php (100%) rename {gulliver/thirdparty => thirdparty}/geshi/geshi/jquery.php (100%) rename {gulliver/thirdparty => thirdparty}/geshi/geshi/php.php (100%) rename {gulliver/thirdparty => thirdparty}/geshi/geshi/xml.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/.htaccess (96%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/autofix.url.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/background.image.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/background.position.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/box.block.inline.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/box.block.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/box.body.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/box.br.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/box.button.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/box.button.reset.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/box.button.submit.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/box.checkbutton.php (99%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/box.container.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/box.field.pageno.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/box.field.pages.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/box.form.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/box.frame.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/box.generic.formatted.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/box.generic.inline.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/box.generic.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/box.iframe.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/box.img.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/box.inline.control.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/box.inline.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/box.inline.simple.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/box.input.img.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/box.input.password.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/box.input.text.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/box.input.textarea.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/box.legend.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/box.list-item.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/box.note-call.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/box.null.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/box.page.margin.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/box.page.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/box.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/box.radiobutton.php (99%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/box.select.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/box.table.cell.fake.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/box.table.cell.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/box.table.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/box.table.row.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/box.table.section.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/box.text.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/box.text.string.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/box.utils.text-align.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/box.whitespace.php (100%) create mode 100644 thirdparty/html2ps_pdf/cache/.gitignore rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/classes/include.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/classes/org/active-link/doc/DocHTML.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/classes/org/active-link/doc/Method.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/classes/org/active-link/doc/PHPClass.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/classes/org/active-link/net/HTTPClient.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/classes/org/active-link/net/HTTPServer.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/classes/org/active-link/net/Socket.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/classes/org/active-link/sys/File.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/classes/org/active-link/xml/Branch.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/classes/org/active-link/xml/Leaf.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/classes/org/active-link/xml/RSS.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/classes/org/active-link/xml/Tag.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/classes/org/active-link/xml/Tree.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/classes/org/active-link/xml/XML.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/classes/org/active-link/xml/XMLBranch.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/classes/org/active-link/xml/XMLDocument.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/classes/org/active-link/xml/XMLLeaf.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/classes/org/active-link/xml/XMLRPCClient.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/classes/org/active-link/xml/XPath.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/config.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/config.parse.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/content_type.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/converter.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.background.attachment.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.background.color.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.background.image.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.background.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.background.position.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.background.repeat.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.border.bottom.color.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.border.bottom.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.border.bottom.style.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.border.bottom.width.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.border.collapse.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.border.color.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.border.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.border.left.color.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.border.left.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.border.left.style.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.border.left.width.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.border.right.color.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.border.right.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.border.right.style.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.border.right.width.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.border.style.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.border.top.color.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.border.top.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.border.top.style.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.border.top.width.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.border.width.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.bottom.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.cache.class.php (99%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.clear.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.color.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.colors.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.constants.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.content.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.counter.collection.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.counter.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.direction.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.display.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.float.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.font-family.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.font-size.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.font-style.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.font-weight.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.font.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.frame.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.height.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.html2ps.html.content.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.html2ps.pseudoelements.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.left.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.letter-spacing.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.line-height.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.list-style-image.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.list-style-position.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.list-style-type.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.list-style.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.margin.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.max-height.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.min-height.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.min-width.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.orphans.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.overflow.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.padding.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.page-break-after.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.page-break-before.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.page-break-inside.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.page-break.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.page.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.parse.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.parse.media.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.parse.properties.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.position.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.property.collection.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.property.declaration.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.property.handler.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.property.stringset.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.property.sub.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.property.sub.field.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.pseudo.add.margin.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.pseudo.align.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.pseudo.cellpadding.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.pseudo.cellspacing.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.pseudo.form.action.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.pseudo.form.radiogroup.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.pseudo.link.destination.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.pseudo.link.target.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.pseudo.listcounter.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.pseudo.localalign.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.pseudo.nowrap.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.pseudo.table.border.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.right.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.rules.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.rules.page.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.ruleset.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.selectors.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.state.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.table-layout.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.text-align.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.text-decoration.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.text-indent.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.text-transform.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.top.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.utils.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.vertical-align.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.visibility.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.white-space.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.widows.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.width.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.word-spacing.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/css.z-index.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/default.css (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/demo/.htaccess (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/demo/generic.param.php (95%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/demo/html2ps.php (97%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/demo/htmltopdf.php (97%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/demo/index.php (97%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/demo/phpinfo.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/demo/systemcheck.footer.tpl (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/demo/systemcheck.header.tpl (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/demo/systemcheck.php (95%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/demo/test.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/destination._http.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/destination._interface.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/destination.browser.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/destination.download.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/destination.file.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/dispatcher.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/doc.anchor.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/dom.activelink.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/dom.php5.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/encoding.cp1251.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/encoding.cp866.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/encoding.dingbats.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/encoding.entities.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/encoding.glyphs.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/encoding.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/encoding.iso-8859-1.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/encoding.iso-8859-10.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/encoding.iso-8859-11.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/encoding.iso-8859-13.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/encoding.iso-8859-14.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/encoding.iso-8859-15.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/encoding.iso-8859-2.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/encoding.iso-8859-3.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/encoding.iso-8859-4.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/encoding.iso-8859-5.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/encoding.iso-8859-6.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/encoding.iso-8859-7.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/encoding.iso-8859-8.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/encoding.iso-8859-9.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/encoding.koi8-r.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/encoding.symbol.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/encoding.windows-1250.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/encoding.windows-1251.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/encoding.windows-1252.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/error.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/favicon.ico (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/fetched_data._html.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/fetched_data._interface.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/fetched_data.file.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/fetched_data.url.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/fetcher._interface.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/fetcher.local.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/fetcher.memory.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/fetcher.url.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/fetcher.url.curl.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/filter.data._interface.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/filter.data.doctype.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/filter.data.encoding.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/filter.data.html2xhtml.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/filter.data.ucs2.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/filter.data.utf8.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/filter.data.xhtml2xhtml.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/filter.output._interface.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/filter.output.gzip.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/filter.output.ps2pdf.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/filter.post._interface.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/filter.post.positioned.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/filter.post.postponed.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/filter.pre._interface.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/filter.pre.fields.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/filter.pre.footnotes.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/filter.pre.headfoot.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/filter.pre.height-constraint.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/flow_context.class.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/flow_viewport.class.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/font.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/font.constants.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/font.resolver.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/font_factory.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/fonts/arial.afm (97%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/fonts/arial.ttf (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/fonts/arialbd.afm (97%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/fonts/arialbd.ttf (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/fonts/arialbi.afm (97%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/fonts/arialbi.ttf (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/fonts/ariali.afm (97%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/fonts/ariali.ttf (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/fonts/cour.afm (97%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/fonts/cour.ttf (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/fonts/courbd.afm (97%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/fonts/courbd.ttf (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/fonts/courbi.afm (97%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/fonts/courbi.ttf (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/fonts/couri.afm (97%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/fonts/couri.ttf (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/fonts/georgia.ttf (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/fonts/georgiab.ttf (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/fonts/georgiai.ttf (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/fonts/georgiaz.ttf (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/fonts/print_glyphs.ps (96%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/fonts/symbol.afm (97%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/fonts/symbol.ttf (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/fonts/times.afm (97%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/fonts/times.ttf (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/fonts/timesbd.afm (97%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/fonts/timesbd.ttf (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/fonts/timesbi.afm (97%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/fonts/timesbi.ttf (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/fonts/timesi.afm (97%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/fonts/timesi.ttf (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/fonts/verdana.ttf (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/fonts/verdanab.ttf (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/fonts/verdanai.ttf (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/fonts/verdanaz.ttf (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/globals.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/globals.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/height.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/help/UML/Custom_fetcher_session.png (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/help/UML/Data_filters.PNG (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/help/UML/Destinations.PNG (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/help/UML/Fetchers.PNG (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/help/UML/Layout_engines.PNG (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/help/UML/Multiple_fetcher_session.PNG (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/help/UML/Output_drivers.PNG (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/help/UML/Output_filters.PNG (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/help/UML/Parsers.PNG (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/help/UML/Post_filters.PNG (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/help/UML/Pre_filters.PNG (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/help/UML/Simple_custom_fetcher_session.png (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/help/UML/Simple_fetcher_session.PNG (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/help/api.html (96%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/help/api_events.html (96%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/help/api_fetchers.html (97%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/help/api_samples.html (96%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/help/calling.html (97%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/help/compatibility.css.2.1.html (92%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/help/compatibility.css.3.html (95%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/help/configuration.html (97%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/help/css/help.css (92%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/help/directives.html (95%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/help/faq.html (98%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/help/forms.html (97%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/help/howto_afm.html (96%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/help/howto_fonts.html (98%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/help/index.html (97%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/help/install.html (98%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/help/misc.html (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/help/requirements.html (98%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/help/samples/headfoot.html (98%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/html.attrs.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/html2ps.config (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/html2ps.config.recommended (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/image.class.php (99%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/index.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/inline.content.builder.factory.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/inline.content.builder.normal.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/inline.content.builder.nowrap.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/inline.content.builder.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/inline.content.builder.pre.line.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/inline.content.builder.pre.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/inline.content.builder.pre.wrap.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/layout._interface.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/layout.default.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/layout.page.breaks.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/layout.vertical.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/list-style.image.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/manager.encoding.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/media.layout.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/observer.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/ot.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/out/readme.txt (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/output._generic.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/output._generic.pdf.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/output._generic.ps.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/output._interface.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/output.fastps.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/output.fastps.l2.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/output.fpdf.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/output.pcl.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/output.pdflib.1.6.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/output.pdflib.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/output.pdflib.old.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/output.png.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/parser._interface.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/parser.xhtml.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/path.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/path.point.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/path.rectangle.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/pdf.fpdf.encryption.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/pdf.fpdf.makefont.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/pdf.fpdf.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/pipeline.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/pipeline.factory.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/array.ps (97%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/background.image.ps (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/background.ps (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/border.ps (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/box.block.inline.ps (96%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/box.block.ps (97%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/box.break.ps (96%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/box.button.ps (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/box.checkbutton.ps (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/box.container.ps (97%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/box.frame.ps (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/box.generic.inline.ps (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/box.generic.ps (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/box.iframe.ps (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/box.image.ps (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/box.inline.ps (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/box.inline.whitespace.ps (96%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/box.input.check.ps (95%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/box.input.radio.ps (94%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/box.input.text.ps (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/box.list-item.ps (96%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/box.ps (97%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/box.radiobutton.ps (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/box.select.ps (96%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/box.span.ps (97%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/box.table.cell.fake.ps (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/box.table.cell.ps (96%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/box.table.ps (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/box.table.row.ps (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/box.text.ps (96%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/box.whitespace.ps (97%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/cellspan.ps (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/class.ps (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/color.ps (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/containing_block.ps (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/context.ps (97%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/encoding.dingbats.ps (95%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/encoding.iso-8859-10.ps (91%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/encoding.iso-8859-11.ps (91%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/encoding.iso-8859-13.ps (91%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/encoding.iso-8859-14.ps (91%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/encoding.iso-8859-15.ps (91%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/encoding.iso-8859-2.ps (98%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/encoding.iso-8859-3.ps (91%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/encoding.iso-8859-4.ps (91%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/encoding.iso-8859-5.ps (91%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/encoding.iso-8859-7.ps (91%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/encoding.iso-8859-9.ps (91%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/encoding.koi8-r.ps (91%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/encoding.symbol.ps (96%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/encoding.windows-1250.ps (95%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/encoding.windows-1251.ps (97%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/encoding.windows-1252.ps (97%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/fastps.footer.ps (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/fastps.header.ps (96%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/flow.block.ps (96%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/flow.box.ps (96%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/flow.float.ps (97%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/flow.inline.block.ps (96%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/flow.inline.ps (96%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/flow.legend.ps (97%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/flow.table.ps (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/flow_viewport.ps (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/font.ps (95%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/footer.ps (96%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/geometry.ps (98%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/header.ps (97%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/height.ps (96%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/image.ps (96%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/init.ps (95%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/position.ps (98%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/predicates.ps (95%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/table.ps (97%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/table.row.ps (95%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/text-align.ps (97%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/vertical-align.ps (95%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/viewport.ps (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/postscript/width.ps (94%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/ps.image.encoder.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/ps.image.encoder.simple.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/ps.image.encoder.stream.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/ps.l2.image.encoder.stream.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/ps.l3.image.encoder.stream.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/ps.unicode.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/ps.utils.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/ps.whitespace.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/render.queue.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/render.stacking.context.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/render.stacking.level.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/samples/out/readme.txt (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/samples/sample.batch.php (97%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/samples/sample.form.handler.php (92%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/samples/sample.pipeline.custom.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/samples/sample.pipeline.default.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/samples/sample.simplest.from.file.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/samples/sample.simplest.from.memory.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/samples/sample.simplest.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/strategy.link.rendering.normal.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/strategy.position.absolute.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/strategy.table.layout.auto.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/strategy.table.layout.fixed.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/strategy.width.absolute.positioned.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/strategy.width.max.natural.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/strategy.width.max.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/strategy.width.min.nowrap.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/strategy.width.min.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/stubs._.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/stubs.common.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/stubs.file_get_contents.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/stubs.file_put_contents.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/stubs.is_executable.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/stubs.memory_get_usage.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/tag.body.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/tag.font.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/tag.frame.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/tag.img.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/tag.input.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/tag.select.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/tag.span.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/tag.table.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/tag.td.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/tag.utils.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/temp/readme.txt (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/templates/cannot_parse.html (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/templates/error._connection.tpl (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/templates/error._footer.tpl (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/templates/error._header.tpl (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/templates/error._http.tpl (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/templates/error._missing_afm.tpl (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/templates/error._no_fetchers.tpl (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/templates/error._redirects.tpl (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/templates/error_exec.tpl (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/templates/missing_exec.html (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/templates/missing_gs.html (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/templates/missing_pdflib.html (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/templates/missing_url_fopen.html (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/tree.navigation.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/treebuilder.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/utils_array.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/utils_graphic.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/utils_number.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/utils_text.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/utils_units.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/utils_url.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/value.background.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/value.border.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/value.border.color.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/value.border.edge.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/value.border.style.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/value.border.width.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/value.bottom.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/value.color.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/value.content.item.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/value.content.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/value.font.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/value.generic.length.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/value.generic.percentage.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/value.generic.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/value.height.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/value.left.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/value.line-height.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/value.list-style.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/value.margin.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/value.max-height.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/value.min-height.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/value.padding.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/value.right.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/value.text-indent.class.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/value.top.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/width.constraint.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/width.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/xhtml.autoclose.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/xhtml.comments.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/xhtml.deflist.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/xhtml.entities.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/xhtml.lists.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/xhtml.p.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/xhtml.script.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/xhtml.selects.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/xhtml.style.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/xhtml.tables.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/xhtml.utils.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/html2ps_pdf/xml.validation.inc.php (100%) rename {gulliver/thirdparty => thirdparty}/htmlarea/editor.js (97%) rename {gulliver/thirdparty => thirdparty}/htmlarea/example.html (97%) rename {gulliver/thirdparty => thirdparty}/htmlarea/images/Thumbs.db (100%) rename {gulliver/thirdparty => thirdparty}/htmlarea/images/ed_about.gif (100%) rename {gulliver/thirdparty => thirdparty}/htmlarea/images/ed_align_center.gif (100%) rename {gulliver/thirdparty => thirdparty}/htmlarea/images/ed_align_left.gif (100%) rename {gulliver/thirdparty => thirdparty}/htmlarea/images/ed_align_right.gif (100%) rename {gulliver/thirdparty => thirdparty}/htmlarea/images/ed_blank.gif (100%) rename {gulliver/thirdparty => thirdparty}/htmlarea/images/ed_charmap.gif (100%) rename {gulliver/thirdparty => thirdparty}/htmlarea/images/ed_color_bg.gif (100%) rename {gulliver/thirdparty => thirdparty}/htmlarea/images/ed_color_fg.gif (100%) rename {gulliver/thirdparty => thirdparty}/htmlarea/images/ed_copy.gif (100%) rename {gulliver/thirdparty => thirdparty}/htmlarea/images/ed_custom.gif (100%) rename {gulliver/thirdparty => thirdparty}/htmlarea/images/ed_cut.gif (100%) rename {gulliver/thirdparty => thirdparty}/htmlarea/images/ed_delete.gif (100%) rename {gulliver/thirdparty => thirdparty}/htmlarea/images/ed_format_bold.gif (100%) rename {gulliver/thirdparty => thirdparty}/htmlarea/images/ed_format_italic.gif (100%) rename {gulliver/thirdparty => thirdparty}/htmlarea/images/ed_format_strike.gif (100%) rename {gulliver/thirdparty => thirdparty}/htmlarea/images/ed_format_sub.gif (100%) rename {gulliver/thirdparty => thirdparty}/htmlarea/images/ed_format_sup.gif (100%) rename {gulliver/thirdparty => thirdparty}/htmlarea/images/ed_format_underline.gif (100%) rename {gulliver/thirdparty => thirdparty}/htmlarea/images/ed_help.gif (100%) rename {gulliver/thirdparty => thirdparty}/htmlarea/images/ed_hr.gif (100%) rename {gulliver/thirdparty => thirdparty}/htmlarea/images/ed_html.gif (100%) rename {gulliver/thirdparty => thirdparty}/htmlarea/images/ed_image.gif (100%) rename {gulliver/thirdparty => thirdparty}/htmlarea/images/ed_indent_less.gif (100%) rename {gulliver/thirdparty => thirdparty}/htmlarea/images/ed_indent_more.gif (100%) rename {gulliver/thirdparty => thirdparty}/htmlarea/images/ed_link.gif (100%) rename {gulliver/thirdparty => thirdparty}/htmlarea/images/ed_list_bullet.gif (100%) rename {gulliver/thirdparty => thirdparty}/htmlarea/images/ed_list_num.gif (100%) rename {gulliver/thirdparty => thirdparty}/htmlarea/images/ed_redo.gif (100%) rename {gulliver/thirdparty => thirdparty}/htmlarea/images/ed_undo.gif (100%) rename {gulliver/thirdparty => thirdparty}/htmlarea/images/fullscreen_maximize.gif (100%) rename {gulliver/thirdparty => thirdparty}/htmlarea/images/fullscreen_minimize.gif (100%) rename {gulliver/thirdparty => thirdparty}/htmlarea/images/insert_table.gif (100%) rename {gulliver/thirdparty => thirdparty}/htmlarea/license.txt (99%) rename {gulliver/thirdparty => thirdparty}/htmlarea/popups/about.html (98%) rename {gulliver/thirdparty => thirdparty}/htmlarea/popups/blank.html (93%) rename {gulliver/thirdparty => thirdparty}/htmlarea/popups/custom2.html (96%) rename {gulliver/thirdparty => thirdparty}/htmlarea/popups/editor_help.html (92%) rename {gulliver/thirdparty => thirdparty}/htmlarea/popups/fullscreen.html (97%) rename {gulliver/thirdparty => thirdparty}/htmlarea/popups/insert_image.html (97%) rename {gulliver/thirdparty => thirdparty}/htmlarea/popups/insert_table.html (96%) rename {gulliver/thirdparty => thirdparty}/htmlarea/popups/select_color.html (98%) rename {gulliver/thirdparty => thirdparty}/htmlarea/readme.html (98%) rename {gulliver/thirdparty => thirdparty}/jsmin/jsmin.php (96%) rename {gulliver/thirdparty => thirdparty}/libchart/COPYING (100%) rename {gulliver/thirdparty => thirdparty}/libchart/ChangeLog (100%) rename {gulliver/thirdparty => thirdparty}/libchart/README (100%) rename {gulliver/thirdparty => thirdparty}/libchart/classes/libchart.php (100%) rename {gulliver/thirdparty => thirdparty}/libchart/classes/model/DataSet.php (97%) rename {gulliver/thirdparty => thirdparty}/libchart/classes/model/Point.php (100%) rename {gulliver/thirdparty => thirdparty}/libchart/classes/model/XYDataSet.php (96%) rename {gulliver/thirdparty => thirdparty}/libchart/classes/model/XYSeriesDataSet.php (96%) rename {gulliver/thirdparty => thirdparty}/libchart/classes/view/axis/Axis.php (100%) rename {gulliver/thirdparty => thirdparty}/libchart/classes/view/axis/Bound.php (96%) rename {gulliver/thirdparty => thirdparty}/libchart/classes/view/caption/Caption.php (100%) rename {gulliver/thirdparty => thirdparty}/libchart/classes/view/chart/BarChart.php (100%) rename {gulliver/thirdparty => thirdparty}/libchart/classes/view/chart/Chart.php (100%) rename {gulliver/thirdparty => thirdparty}/libchart/classes/view/chart/HorizontalBarChart.php (100%) rename {gulliver/thirdparty => thirdparty}/libchart/classes/view/chart/LineChart.php (100%) rename {gulliver/thirdparty => thirdparty}/libchart/classes/view/chart/PieChart.php (100%) rename {gulliver/thirdparty => thirdparty}/libchart/classes/view/chart/VerticalBarChart.php (100%) rename {gulliver/thirdparty => thirdparty}/libchart/classes/view/color/Color.php (100%) rename {gulliver/thirdparty => thirdparty}/libchart/classes/view/color/ColorSet.php (100%) rename {gulliver/thirdparty => thirdparty}/libchart/classes/view/color/Palette.php (100%) rename {gulliver/thirdparty => thirdparty}/libchart/classes/view/plot/Plot.php (100%) rename {gulliver/thirdparty => thirdparty}/libchart/classes/view/primitive/Padding.php (100%) rename {gulliver/thirdparty => thirdparty}/libchart/classes/view/primitive/Primitive.php (100%) rename {gulliver/thirdparty => thirdparty}/libchart/classes/view/primitive/Rectangle.php (100%) rename {gulliver/thirdparty => thirdparty}/libchart/classes/view/text/Text.php (100%) rename {gulliver/thirdparty => thirdparty}/libchart/fonts/DejaVuSansCondensed-Bold.ttf (100%) rename {gulliver/thirdparty => thirdparty}/libchart/fonts/DejaVuSansCondensed.ttf (100%) rename {gulliver/thirdparty => thirdparty}/libchart/images/PoweredBy.png (100%) rename {gulliver/thirdparty => thirdparty}/lime/Spyc.class.php (100%) rename {gulliver/thirdparty => thirdparty}/lime/lime.php (100%) rename {gulliver/thirdparty => thirdparty}/lime/yaml.class.php (100%) rename {gulliver/thirdparty => thirdparty}/pake/pakeApp.class.php (100%) rename {gulliver/thirdparty => thirdparty}/pake/pakeColor.class.php (100%) rename {gulliver/thirdparty => thirdparty}/pake/pakeException.class.php (100%) rename {gulliver/thirdparty => thirdparty}/pake/pakeFileTask.class.php (100%) rename {gulliver/thirdparty => thirdparty}/pake/pakeFinder.class.php (100%) rename {gulliver/thirdparty => thirdparty}/pake/pakeFunction.php (100%) rename {gulliver/thirdparty => thirdparty}/pake/pakeGetopt.class.php (100%) rename {gulliver/thirdparty => thirdparty}/pake/pakeGlobToRegex.class.php (100%) rename {gulliver/thirdparty => thirdparty}/pake/pakeNumberCompare.class.php (100%) rename {gulliver/thirdparty => thirdparty}/pake/pakeTask.class.php (100%) rename {gulliver/thirdparty => thirdparty}/pake/pakeYaml.class.php (100%) rename {gulliver/thirdparty => thirdparty}/pake/tasks/pakePearTask.class.php (100%) rename {gulliver/thirdparty => thirdparty}/pake/tasks/pakePhingTask.class.php (100%) rename {gulliver/thirdparty => thirdparty}/pake/tasks/pakeSimpletestTask.class.php (100%) create mode 100644 thirdparty/pear/Archive/Tar.php create mode 100644 thirdparty/pear/Archive/Zip.php create mode 100644 thirdparty/pear/Benchmark/Iterate.php create mode 100644 thirdparty/pear/Benchmark/Profiler.php create mode 100644 thirdparty/pear/Benchmark/Timer.php create mode 100644 thirdparty/pear/CMD.php create mode 100644 thirdparty/pear/CODING_STANDARDS create mode 100644 thirdparty/pear/Console/Getopt.php create mode 100644 thirdparty/pear/DB.php create mode 100644 thirdparty/pear/DB/common.php create mode 100644 thirdparty/pear/DB/dbase.php create mode 100644 thirdparty/pear/DB/fbsql.php create mode 100644 thirdparty/pear/DB/ibase.php create mode 100644 thirdparty/pear/DB/ifx.php create mode 100644 thirdparty/pear/DB/msql.php create mode 100644 thirdparty/pear/DB/mssql.php create mode 100644 thirdparty/pear/DB/mysql.php create mode 100644 thirdparty/pear/DB/mysqli.php create mode 100644 thirdparty/pear/DB/oci8.php create mode 100644 thirdparty/pear/DB/odbc.php create mode 100644 thirdparty/pear/DB/pgsql.php create mode 100644 thirdparty/pear/DB/sqlite.php create mode 100644 thirdparty/pear/DB/storage.php create mode 100644 thirdparty/pear/DB/sybase.php create mode 100644 thirdparty/pear/HTTP/HTTP.php create mode 100644 thirdparty/pear/HTTP/Request.php create mode 100644 thirdparty/pear/HTTP/WebDAV/Server.php create mode 100644 thirdparty/pear/HTTP/WebDAV/Server/Filesystem.php create mode 100644 thirdparty/pear/HTTP/WebDAV/Tools/_parse_lockinfo.php create mode 100644 thirdparty/pear/HTTP/WebDAV/Tools/_parse_propfind.php create mode 100644 thirdparty/pear/HTTP/WebDAV/Tools/_parse_proppatch.php create mode 100644 thirdparty/pear/Log.php create mode 100644 thirdparty/pear/Log/composite.php create mode 100644 thirdparty/pear/Log/console.php create mode 100644 thirdparty/pear/Log/daemon.php create mode 100644 thirdparty/pear/Log/display.php create mode 100644 thirdparty/pear/Log/error_log.php create mode 100644 thirdparty/pear/Log/file.php create mode 100644 thirdparty/pear/Log/firebug.php create mode 100644 thirdparty/pear/Log/mail.php create mode 100644 thirdparty/pear/Log/mcal.php create mode 100644 thirdparty/pear/Log/mdb2.php create mode 100644 thirdparty/pear/Log/null.php create mode 100644 thirdparty/pear/Log/observer.php create mode 100644 thirdparty/pear/Log/sql.php create mode 100644 thirdparty/pear/Log/sqlite.php create mode 100644 thirdparty/pear/Log/syslog.php create mode 100644 thirdparty/pear/Log/win.php create mode 100644 thirdparty/pear/Net/CheckIP.php create mode 100644 thirdparty/pear/Net/Curl.php create mode 100644 thirdparty/pear/Net/DIME.php create mode 100644 thirdparty/pear/Net/FTP.php create mode 100644 thirdparty/pear/Net/FTP/Observer.php create mode 100644 thirdparty/pear/Net/FTP/Socket.php create mode 100644 thirdparty/pear/Net/IDNA.php create mode 100644 thirdparty/pear/Net/IDNA/php4.php create mode 100644 thirdparty/pear/Net/IDNA/php5.php create mode 100644 thirdparty/pear/Net/IPv4.php create mode 100644 thirdparty/pear/Net/IPv6.php create mode 100644 thirdparty/pear/Net/JSON.php create mode 100644 thirdparty/pear/Net/LDAP.php create mode 100644 thirdparty/pear/Net/LDAP/Entry.php create mode 100644 thirdparty/pear/Net/LDAP/RootDSE.php create mode 100644 thirdparty/pear/Net/LDAP/Schema.php create mode 100644 thirdparty/pear/Net/LDAP/Search.php create mode 100644 thirdparty/pear/Net/LDAP/Util.php create mode 100644 thirdparty/pear/Net/LDAP/fg.php create mode 100644 thirdparty/pear/Net/POP3.php create mode 100644 thirdparty/pear/Net/SMTP.php create mode 100644 thirdparty/pear/Net/Socket.php create mode 100644 thirdparty/pear/Net/URL.php create mode 100644 thirdparty/pear/Net/URL2.php create mode 100644 thirdparty/pear/Net/UserAgent/Detect.php create mode 100644 thirdparty/pear/Net/UserAgent/Detect/APC.php create mode 100644 thirdparty/pear/Numbers/Words.php create mode 100644 thirdparty/pear/Numbers/Words/lang.bg.php create mode 100644 thirdparty/pear/Numbers/Words/lang.de.php create mode 100644 thirdparty/pear/Numbers/Words/lang.ee.php create mode 100644 thirdparty/pear/Numbers/Words/lang.en_100.php create mode 100644 thirdparty/pear/Numbers/Words/lang.en_GB.php create mode 100644 thirdparty/pear/Numbers/Words/lang.en_US.php create mode 100644 thirdparty/pear/Numbers/Words/lang.es.php create mode 100644 thirdparty/pear/Numbers/Words/lang.es_AR.php create mode 100644 thirdparty/pear/Numbers/Words/lang.fr.php create mode 100644 thirdparty/pear/Numbers/Words/lang.id.php create mode 100644 thirdparty/pear/Numbers/Words/lang.it_IT.php create mode 100644 thirdparty/pear/Numbers/Words/lang.lt.php create mode 100644 thirdparty/pear/Numbers/Words/lang.pl.php create mode 100644 thirdparty/pear/Numbers/Words/lang.pt_BR.php create mode 100644 thirdparty/pear/Numbers/Words/lang.ru.php create mode 100644 thirdparty/pear/Numbers/Words/lang.sv.php create mode 100644 thirdparty/pear/OLE/OLE.php create mode 100644 thirdparty/pear/OLE/PPS.php create mode 100644 thirdparty/pear/OLE/PPS/File.php create mode 100644 thirdparty/pear/OLE/PPS/Root.php create mode 100644 thirdparty/pear/OS/Guess.php create mode 100644 thirdparty/pear/PEAR.php create mode 100644 thirdparty/pear/PEAR/Autoloader.php create mode 100644 thirdparty/pear/PEAR/Builder.php create mode 100644 thirdparty/pear/PEAR/Command.php create mode 100644 thirdparty/pear/PEAR/Command/Auth.php create mode 100644 thirdparty/pear/PEAR/Command/Build.php create mode 100644 thirdparty/pear/PEAR/Command/Common.php create mode 100644 thirdparty/pear/PEAR/Command/Config.php create mode 100644 thirdparty/pear/PEAR/Command/Install.php create mode 100644 thirdparty/pear/PEAR/Command/Mirror.php create mode 100644 thirdparty/pear/PEAR/Command/Package.php create mode 100644 thirdparty/pear/PEAR/Command/Registry.php create mode 100644 thirdparty/pear/PEAR/Command/Remote.php create mode 100644 thirdparty/pear/PEAR/Common.php create mode 100644 thirdparty/pear/PEAR/Config.php create mode 100644 thirdparty/pear/PEAR/Dependency.php create mode 100644 thirdparty/pear/PEAR/Frontend/CLI.php create mode 100644 thirdparty/pear/PEAR/Installer.php create mode 100644 thirdparty/pear/PEAR/Packager.php create mode 100644 thirdparty/pear/PEAR/Registry.php create mode 100644 thirdparty/pear/PEAR/Remote.php create mode 100644 thirdparty/pear/README create mode 100644 thirdparty/pear/SOAP/Base.php create mode 100644 thirdparty/pear/SOAP/Client.php create mode 100644 thirdparty/pear/SOAP/Disco.php create mode 100644 thirdparty/pear/SOAP/Fault.php create mode 100644 thirdparty/pear/SOAP/Interop/config.php.dist create mode 100644 thirdparty/pear/SOAP/Interop/index.php create mode 100644 thirdparty/pear/SOAP/Interop/interop_Round2Base.php create mode 100644 thirdparty/pear/SOAP/Interop/interop_Round2GroupB.php create mode 100644 thirdparty/pear/SOAP/Interop/interop_Round2GroupC.php create mode 100644 thirdparty/pear/SOAP/Interop/interop_Round3GroupD.php create mode 100644 thirdparty/pear/SOAP/Interop/interop_client.php create mode 100644 thirdparty/pear/SOAP/Interop/interop_client_results.php create mode 100644 thirdparty/pear/SOAP/Interop/interop_client_run.php create mode 100644 thirdparty/pear/SOAP/Interop/interop_database.sql create mode 100644 thirdparty/pear/SOAP/Interop/interop_test.php create mode 100644 thirdparty/pear/SOAP/Interop/interop_test_functions.php create mode 100644 thirdparty/pear/SOAP/Interop/params_Round2Base.php create mode 100644 thirdparty/pear/SOAP/Interop/params_Round2GroupB.php create mode 100644 thirdparty/pear/SOAP/Interop/params_Round2GroupC.php create mode 100644 thirdparty/pear/SOAP/Interop/params_Round3GroupD.php create mode 100644 thirdparty/pear/SOAP/Interop/params_classes.php create mode 100644 thirdparty/pear/SOAP/Interop/params_values.php create mode 100644 thirdparty/pear/SOAP/Interop/readme.txt create mode 100644 thirdparty/pear/SOAP/Interop/registrationAndNotification.php create mode 100644 thirdparty/pear/SOAP/Interop/server_Round2Base.php create mode 100644 thirdparty/pear/SOAP/Interop/server_Round2GroupB.php create mode 100644 thirdparty/pear/SOAP/Interop/server_Round2GroupC.php create mode 100644 thirdparty/pear/SOAP/Interop/server_Round3GroupD.php create mode 100644 thirdparty/pear/SOAP/Interop/server_Round3GroupDCompound1.php create mode 100644 thirdparty/pear/SOAP/Interop/server_Round3GroupDCompound2.php create mode 100644 thirdparty/pear/SOAP/Interop/server_Round3GroupDDocLit.php create mode 100644 thirdparty/pear/SOAP/Interop/server_Round3GroupDDocLitParams.php create mode 100644 thirdparty/pear/SOAP/Interop/server_Round3GroupDEmptySA.php create mode 100644 thirdparty/pear/SOAP/Interop/server_Round3GroupDImport1.php create mode 100644 thirdparty/pear/SOAP/Interop/server_Round3GroupDImport2.php create mode 100644 thirdparty/pear/SOAP/Interop/server_Round3GroupDImport3.php create mode 100644 thirdparty/pear/SOAP/Interop/server_Round3GroupDRpcEnc.php create mode 100644 thirdparty/pear/SOAP/Interop/wsdl/InteropTestDocLit.wsdl.php create mode 100644 thirdparty/pear/SOAP/Interop/wsdl/InteropTestDocLitParameters.wsdl.php create mode 100644 thirdparty/pear/SOAP/Interop/wsdl/InteropTestExtensibility.wsdl.php create mode 100644 thirdparty/pear/SOAP/Interop/wsdl/InteropTestExtensibilityRequired.wsdl.php create mode 100644 thirdparty/pear/SOAP/Interop/wsdl/InteropTestList.wsdl.php create mode 100644 thirdparty/pear/SOAP/Interop/wsdl/InteropTestRpcEnc.wsdl.php create mode 100644 thirdparty/pear/SOAP/Interop/wsdl/InteropTestheaders.wsdl.php create mode 100644 thirdparty/pear/SOAP/Interop/wsdl/compound1.wsdl.php create mode 100644 thirdparty/pear/SOAP/Interop/wsdl/compound2.wsdl.php create mode 100644 thirdparty/pear/SOAP/Interop/wsdl/echoheadersvc.wsdl.php create mode 100644 thirdparty/pear/SOAP/Interop/wsdl/emptysa.wsdl.php create mode 100644 thirdparty/pear/SOAP/Interop/wsdl/import1.wsdl.php create mode 100644 thirdparty/pear/SOAP/Interop/wsdl/import2.wsdl.php create mode 100644 thirdparty/pear/SOAP/Interop/wsdl/import3.wsdl.php create mode 100644 thirdparty/pear/SOAP/Interop/wsdl/imported/import1B.wsdl create mode 100644 thirdparty/pear/SOAP/Interop/wsdl/imported/import2B.wsdl create mode 100644 thirdparty/pear/SOAP/Interop/wsdl/imported/import2B.xsd create mode 100644 thirdparty/pear/SOAP/Interop/wsdl/interop.wsdl.php create mode 100644 thirdparty/pear/SOAP/Interop/wsdl/interopB.wsdl.php create mode 100644 thirdparty/pear/SOAP/Parser.php create mode 100644 thirdparty/pear/SOAP/Server.php create mode 100644 thirdparty/pear/SOAP/Server/Email.php create mode 100644 thirdparty/pear/SOAP/Server/Email_Gateway.php create mode 100644 thirdparty/pear/SOAP/Server/TCP.php create mode 100644 thirdparty/pear/SOAP/Transport.php create mode 100644 thirdparty/pear/SOAP/Transport/HTTP.php create mode 100644 thirdparty/pear/SOAP/Transport/SMTP.php create mode 100644 thirdparty/pear/SOAP/Transport/TCP.php create mode 100644 thirdparty/pear/SOAP/Type/dateTime.php create mode 100644 thirdparty/pear/SOAP/Type/duration.php create mode 100644 thirdparty/pear/SOAP/Type/hexBinary.php create mode 100644 thirdparty/pear/SOAP/Value.php create mode 100644 thirdparty/pear/SOAP/WSDL.php create mode 100644 thirdparty/pear/SOAP/tools/genproxy.php create mode 100644 thirdparty/pear/Spreadsheet/Excel/Writer.php create mode 100644 thirdparty/pear/Spreadsheet/Excel/Writer.php.bk create mode 100644 thirdparty/pear/Spreadsheet/Excel/Writer/BIFFwriter.php create mode 100644 thirdparty/pear/Spreadsheet/Excel/Writer/Format.php create mode 100644 thirdparty/pear/Spreadsheet/Excel/Writer/Parser.php create mode 100644 thirdparty/pear/Spreadsheet/Excel/Writer/Validator.php create mode 100644 thirdparty/pear/Spreadsheet/Excel/Writer/Workbook.php create mode 100644 thirdparty/pear/Spreadsheet/Excel/Writer/Worksheet.php create mode 100644 thirdparty/pear/Spreadsheet/package.xml create mode 100644 thirdparty/pear/System.php create mode 100644 thirdparty/pear/UDDI.php create mode 100644 thirdparty/pear/XML/Parser.php create mode 100644 thirdparty/pear/catalog create mode 100644 thirdparty/pear/class.nusoap_base.php create mode 100644 thirdparty/pear/class.soap_fault.php create mode 100644 thirdparty/pear/class.soap_parser.php create mode 100644 thirdparty/pear/class.soap_server.php create mode 100644 thirdparty/pear/class.soap_transport_http.php create mode 100644 thirdparty/pear/class.soap_val.php create mode 100644 thirdparty/pear/class.soapclient.php create mode 100644 thirdparty/pear/class.wsdl.php create mode 100644 thirdparty/pear/class.wsdlcache.php create mode 100644 thirdparty/pear/class.xmlschema.php create mode 100644 thirdparty/pear/install-pear.php create mode 100644 thirdparty/pear/install-pear.txt create mode 100644 thirdparty/pear/json/class.json.php create mode 100644 thirdparty/pear/nusoap.colosa.php create mode 100644 thirdparty/pear/nusoap.php create mode 100644 thirdparty/pear/nusoapmime.php create mode 100644 thirdparty/pear/package-Archive_Tar.xml create mode 100644 thirdparty/pear/package-Console_Getopt.xml create mode 100644 thirdparty/pear/package-PEAR.xml create mode 100644 thirdparty/pear/package.dtd create mode 100644 thirdparty/pear/template.spec rename {gulliver/thirdparty => thirdparty}/phing/BuildEvent.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/BuildException.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/BuildListener.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/IntrospectionHelper.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/Phing.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/Project.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/ProjectComponent.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/RuntimeConfigurable.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/Target.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/Task.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/TaskAdapter.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/TaskContainer.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/TaskPhing.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/UnknownElement.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/filters/BaseFilterReader.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/filters/BaseParamFilterReader.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/filters/ChainableReader.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/filters/ExpandProperties.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/filters/HeadFilter.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/filters/LineContains.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/filters/LineContainsRegexp.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/filters/PrefixLines.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/filters/ReplaceRegexp.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/filters/ReplaceTokens.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/filters/StripLineBreaks.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/filters/StripLineComments.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/filters/StripPhpComments.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/filters/TabToSpaces.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/filters/TailFilter.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/filters/TidyFilter.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/filters/TranslateGettext.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/filters/XsltFilter.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/filters/util/ChainReaderHelper.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/filters/util/IniFileTokenReader.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/input/DefaultInputHandler.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/input/InputHandler.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/input/InputRequest.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/input/MultipleChoiceInputRequest.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/input/PropertyFileInputHandler.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/input/YesNoInputRequest.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/lib/Capsule.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/lib/Zip.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/listener/AnsiColorLogger.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/listener/BuildLogger.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/listener/DefaultLogger.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/listener/NoBannerLogger.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/listener/PearLogger.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/listener/XmlLogger.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/listener/defaults.properties (100%) rename {gulliver/thirdparty => thirdparty}/phing/mappers/FileNameMapper.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/mappers/FlattenMapper.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/mappers/GlobMapper.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/mappers/IdentityMapper.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/mappers/MergeMapper.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/mappers/RegexpMapper.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/parser/AbstractHandler.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/parser/AbstractSAXParser.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/parser/DataTypeHandler.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/parser/ExpatParseException.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/parser/ExpatParser.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/parser/Location.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/parser/NestedElementHandler.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/parser/ProjectConfigurator.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/parser/ProjectHandler.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/parser/RootHandler.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/parser/TargetHandler.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/parser/TaskHandler.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/system/io/BufferedReader.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/system/io/BufferedWriter.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/system/io/ConsoleReader.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/system/io/FileReader.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/system/io/FileSystem.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/system/io/FileWriter.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/system/io/FilterReader.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/system/io/IOException.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/system/io/PhingFile.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/system/io/Reader.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/system/io/StringReader.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/system/io/TokenReader.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/system/io/UnixFileSystem.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/system/io/Win32FileSystem.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/system/io/WinNTFileSystem.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/system/io/Writer.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/system/lang/Character.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/system/lang/EventObject.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/system/lang/FileNotFoundException.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/system/lang/NullPointerException.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/system/lang/SecurityException.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/system/util/Message.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/system/util/Properties.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/system/util/Register.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/system/util/Timer.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/defaults.properties (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/ext/CapsuleTask.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/ext/CreoleSQLExecTask.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/ext/CreoleTask.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/ext/ExtractBaseTask.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/ext/MailTask.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/ext/PackageAsPathTask.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/ext/PearPackageTask.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/ext/PhpLintTask.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/ext/SmartyTask.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/ext/TarTask.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/ext/UntarTask.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/ext/UnzipTask.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/ext/XmlLintTask.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/ext/ZendCodeAnalyzerTask.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/ext/ZipTask.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/ext/coverage/CoverageMerger.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/ext/coverage/CoverageMergerTask.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/ext/coverage/CoverageReportTask.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/ext/coverage/CoverageReportTransformer.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/ext/coverage/CoverageSetupTask.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/ext/ioncube/IoncubeComment.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/ext/ioncube/IoncubeEncoderTask.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/ext/ioncube/IoncubeLicenseTask.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/ext/pearpackage/Fileset.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/ext/phpdoc/PHPDocumentorTask.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/ext/phpunit2/BatchTest.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/ext/phpunit2/FormatterElement.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/ext/phpunit2/PHPUnit2ReportTask.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/ext/phpunit2/PHPUnit2ResultFormatter.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/ext/phpunit2/PHPUnit2Task.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/ext/phpunit2/PHPUnit2TestRunner.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/ext/phpunit2/PHPUnit2Util.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/ext/phpunit2/PlainPHPUnit2ResultFormatter.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/ext/phpunit2/SummaryPHPUnit2ResultFormatter.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/ext/phpunit2/XMLPHPUnit2ResultFormatter.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/ext/simpletest/SimpleTestCountResultFormatter.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/ext/simpletest/SimpleTestFormatterElement.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/ext/simpletest/SimpleTestPlainResultFormatter.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/ext/simpletest/SimpleTestResultFormatter.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/ext/simpletest/SimpleTestSummaryResultFormatter.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/ext/simpletest/SimpleTestTask.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/ext/svn/SvnBaseTask.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/ext/svn/SvnExportTask.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/ext/svn/SvnLastRevisionTask.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/system/AdhocTask.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/system/AdhocTaskdefTask.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/system/AdhocTypedefTask.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/system/AppendTask.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/system/AvailableTask.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/system/ChmodTask.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/system/ConditionTask.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/system/CopyTask.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/system/CvsPassTask.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/system/CvsTask.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/system/DeleteTask.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/system/EchoTask.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/system/ExecTask.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/system/ExitTask.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/system/ForeachTask.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/system/IfTask.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/system/IncludePathTask.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/system/InputTask.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/system/MatchingTask.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/system/MkdirTask.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/system/MoveTask.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/system/PhingCallTask.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/system/PhingTask.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/system/PhpEvalTask.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/system/PropertyPromptTask.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/system/PropertyTask.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/system/ReflexiveTask.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/system/ResolvePathTask.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/system/SequentialTask.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/system/TaskdefTask.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/system/TouchTask.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/system/TstampTask.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/system/TypedefTask.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/system/UpToDateTask.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/system/WarnTask.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/system/XsltTask.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/system/condition/AndCondition.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/system/condition/Condition.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/system/condition/ConditionBase.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/system/condition/ContainsCondition.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/system/condition/EqualsCondition.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/system/condition/IsFalseCondition.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/system/condition/IsSetCondition.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/system/condition/IsTrueCondition.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/system/condition/NotCondition.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/system/condition/OrCondition.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/system/condition/OsCondition.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/tasks/system/condition/ReferenceExistsCondition.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/types/AbstractFileSet.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/types/Commandline.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/types/DataType.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/types/Description.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/types/DirSet.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/types/FileList.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/types/FileSet.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/types/FilterChain.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/types/Mapper.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/types/Parameter.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/types/Parameterizable.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/types/Path.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/types/PatternSet.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/types/PhingFilterReader.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/types/Reference.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/types/RegularExpression.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/types/TokenReader.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/types/TokenSource.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/types/defaults.properties (100%) rename {gulliver/thirdparty => thirdparty}/phing/types/selectors/AndSelector.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/types/selectors/BaseExtendSelector.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/types/selectors/BaseSelector.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/types/selectors/BaseSelectorContainer.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/types/selectors/ContainsRegexpSelector.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/types/selectors/ContainsSelector.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/types/selectors/DateSelector.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/types/selectors/DependSelector.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/types/selectors/DepthSelector.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/types/selectors/ExtendFileSelector.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/types/selectors/ExtendSelector.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/types/selectors/FileSelector.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/types/selectors/FilenameSelector.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/types/selectors/MajoritySelector.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/types/selectors/NoneSelector.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/types/selectors/NotSelector.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/types/selectors/OrSelector.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/types/selectors/PresentSelector.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/types/selectors/SelectSelector.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/types/selectors/SelectorContainer.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/types/selectors/SelectorScanner.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/types/selectors/SelectorUtils.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/types/selectors/SizeSelector.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/types/selectors/TypeSelector.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/util/DirectoryScanner.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/util/ExtendedFileStream.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/util/FileUtils.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/util/LogWriter.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/util/PathTokenizer.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/util/SourceFileScanner.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/util/StringHelper.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/util/regexp/PregEngine.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/util/regexp/Regexp.php (100%) rename {gulliver/thirdparty => thirdparty}/phing/util/regexp/RegexpEngine.php (100%) rename {gulliver/thirdparty => thirdparty}/phpmailer/class.phpmailer.php (100%) rename {gulliver/thirdparty => thirdparty}/phpmailer/class.pop3.php (100%) rename {gulliver/thirdparty => thirdparty}/phpmailer/class.smtp.php (100%) rename {gulliver/thirdparty => thirdparty}/phpmailer/extras/class.html2text.inc (100%) rename {gulliver/thirdparty => thirdparty}/phpmailer/extras/htmlfilter.php (100%) rename {gulliver/thirdparty => thirdparty}/phpmailer/extras/ntlm_sasl_client.php (100%) rename {gulliver/thirdparty => thirdparty}/phpmailer/language/phpmailer.lang-ar.php (100%) rename {gulliver/thirdparty => thirdparty}/phpmailer/language/phpmailer.lang-br.php (100%) rename {gulliver/thirdparty => thirdparty}/phpmailer/language/phpmailer.lang-ca.php (100%) rename {gulliver/thirdparty => thirdparty}/phpmailer/language/phpmailer.lang-ch.php (100%) rename {gulliver/thirdparty => thirdparty}/phpmailer/language/phpmailer.lang-cz.php (100%) rename {gulliver/thirdparty => thirdparty}/phpmailer/language/phpmailer.lang-de.php (100%) rename {gulliver/thirdparty => thirdparty}/phpmailer/language/phpmailer.lang-dk.php (100%) rename {gulliver/thirdparty => thirdparty}/phpmailer/language/phpmailer.lang-en.php (100%) rename {gulliver/thirdparty => thirdparty}/phpmailer/language/phpmailer.lang-es.php (100%) rename {gulliver/thirdparty => thirdparty}/phpmailer/language/phpmailer.lang-et.php (100%) rename {gulliver/thirdparty => thirdparty}/phpmailer/language/phpmailer.lang-fi.php (100%) rename {gulliver/thirdparty => thirdparty}/phpmailer/language/phpmailer.lang-fo.php (100%) rename {gulliver/thirdparty => thirdparty}/phpmailer/language/phpmailer.lang-fr.php (100%) rename {gulliver/thirdparty => thirdparty}/phpmailer/language/phpmailer.lang-hu.php (100%) rename {gulliver/thirdparty => thirdparty}/phpmailer/language/phpmailer.lang-it.php (100%) rename {gulliver/thirdparty => thirdparty}/phpmailer/language/phpmailer.lang-ja.php (100%) rename {gulliver/thirdparty => thirdparty}/phpmailer/language/phpmailer.lang-nl.php (100%) rename {gulliver/thirdparty => thirdparty}/phpmailer/language/phpmailer.lang-no.php (100%) rename {gulliver/thirdparty => thirdparty}/phpmailer/language/phpmailer.lang-pl.php (100%) rename {gulliver/thirdparty => thirdparty}/phpmailer/language/phpmailer.lang-ro.php (100%) rename {gulliver/thirdparty => thirdparty}/phpmailer/language/phpmailer.lang-ru.php (100%) rename {gulliver/thirdparty => thirdparty}/phpmailer/language/phpmailer.lang-se.php (100%) rename {gulliver/thirdparty => thirdparty}/phpmailer/language/phpmailer.lang-sk.php (100%) rename {gulliver/thirdparty => thirdparty}/phpmailer/language/phpmailer.lang-tr.php (100%) rename {gulliver/thirdparty => thirdparty}/phpmailer/language/phpmailer.lang-zh.php (100%) rename {gulliver/thirdparty => thirdparty}/phpmailer/language/phpmailer.lang-zh_cn.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/CHANGELOG (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/INSTALL (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/LICENSE (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/bin/propel-gen (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/bin/propel-gen.bat (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/build-propel.xml (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/build.properties-sample (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/build.xml (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/build.xml-local (97%) rename {gulliver/thirdparty => thirdparty}/propel-generator/classes/propel/engine/EngineException.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/classes/propel/engine/builder/DataModelBuilder.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/classes/propel/engine/builder/om/ClassTools.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/classes/propel/engine/builder/om/OMBuilder.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/classes/propel/engine/builder/om/ObjectBuilder.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/classes/propel/engine/builder/om/PeerBuilder.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/classes/propel/engine/builder/om/php5/PHP5BasicObjectBuilder.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/classes/propel/engine/builder/om/php5/PHP5BasicPeerBuilder.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/classes/propel/engine/builder/om/php5/PHP5ComplexObjectBuilder.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/classes/propel/engine/builder/om/php5/PHP5ComplexPeerBuilder.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/classes/propel/engine/builder/om/php5/PHP5ExtensionNodeBuilder.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/classes/propel/engine/builder/om/php5/PHP5ExtensionNodePeerBuilder.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/classes/propel/engine/builder/om/php5/PHP5ExtensionObjectBuilder.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/classes/propel/engine/builder/om/php5/PHP5ExtensionPeerBuilder.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/classes/propel/engine/builder/om/php5/PHP5InterfaceBuilder.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/classes/propel/engine/builder/om/php5/PHP5MapBuilderBuilder.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/classes/propel/engine/builder/om/php5/PHP5MultiExtendObjectBuilder.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/classes/propel/engine/builder/om/php5/PHP5NodeBuilder.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/classes/propel/engine/builder/om/php5/PHP5NodePeerBuilder.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/classes/propel/engine/builder/sql/DDLBuilder.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/classes/propel/engine/builder/sql/DataSQLBuilder.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/classes/propel/engine/builder/sql/mssql/MssqlDDLBuilder.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/classes/propel/engine/builder/sql/mssql/MssqlDataSQLBuilder.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/classes/propel/engine/builder/sql/mysql/MysqlDDLBuilder.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/classes/propel/engine/builder/sql/mysql/MysqlDataSQLBuilder.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/classes/propel/engine/builder/sql/mysqli/MysqliDDLBuilder.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/classes/propel/engine/builder/sql/mysqli/MysqliDataSQLBuilder.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/classes/propel/engine/builder/sql/oracle/OracleDDLBuilder.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/classes/propel/engine/builder/sql/oracle/OracleDataSQLBuilder.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/classes/propel/engine/builder/sql/pgsql/PgsqlDDLBuilder.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/classes/propel/engine/builder/sql/pgsql/PgsqlDataSQLBuilder.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/classes/propel/engine/builder/sql/sqlite/SqliteDDLBuilder.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/classes/propel/engine/builder/sql/sqlite/SqliteDataSQLBuilder.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/classes/propel/engine/database/model/AppData.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/classes/propel/engine/database/model/Column.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/classes/propel/engine/database/model/ConstraintNameGenerator.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/classes/propel/engine/database/model/Database.php (99%) rename {gulliver/thirdparty => thirdparty}/propel-generator/classes/propel/engine/database/model/DatabasePropel.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/classes/propel/engine/database/model/Domain.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/classes/propel/engine/database/model/ForeignKey.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/classes/propel/engine/database/model/IDMethod.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/classes/propel/engine/database/model/IdMethodParameter.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/classes/propel/engine/database/model/Index.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/classes/propel/engine/database/model/Inheritance.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/classes/propel/engine/database/model/NameFactory.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/classes/propel/engine/database/model/NameGenerator.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/classes/propel/engine/database/model/PhpNameGenerator.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/classes/propel/engine/database/model/PropelTypes.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/classes/propel/engine/database/model/Rule.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/classes/propel/engine/database/model/Table.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/classes/propel/engine/database/model/Unique.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/classes/propel/engine/database/model/Validator.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/classes/propel/engine/database/model/XMLElement.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/classes/propel/engine/database/transform/XmlToAppData.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/classes/propel/engine/database/transform/XmlToData.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/classes/propel/engine/platform/DefaultPlatform.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/classes/propel/engine/platform/MssqlPlatform.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/classes/propel/engine/platform/MysqlPlatform.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/classes/propel/engine/platform/MysqliPlatform.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/classes/propel/engine/platform/OraclePlatform.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/classes/propel/engine/platform/PgsqlPlatform.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/classes/propel/engine/platform/Platform.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/classes/propel/engine/platform/SqlitePlatform.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/classes/propel/phing/AbstractPropelDataModelTask.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/classes/propel/phing/PropelCreoleTransformTask.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/classes/propel/phing/PropelDataDTDTask.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/classes/propel/phing/PropelDataDumpTask.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/classes/propel/phing/PropelDataModelTask.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/classes/propel/phing/PropelDataSQLTask.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/classes/propel/phing/PropelGraphvizTask.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/classes/propel/phing/PropelOMTask.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/classes/propel/phing/PropelOldOMTask.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/classes/propel/phing/PropelOldSQLTask.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/classes/propel/phing/PropelSQLExec.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/classes/propel/phing/PropelSQLTask.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/default.properties (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/pear/BuildPropelGenPEARPackageTask.php (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/pear/build-pear-package.xml (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/pear/build.properties (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/pear/pear-build.xml (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/pear/pear-propel-gen (97%) rename {gulliver/thirdparty => thirdparty}/propel-generator/pear/pear-propel-gen.bat (97%) rename {gulliver/thirdparty => thirdparty}/propel-generator/resources/dtd/database.dtd (96%) rename {gulliver/thirdparty => thirdparty}/propel-generator/resources/xsd/custom_datatypes.xsd (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/resources/xsd/database.xsd (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/resources/xsl/database.xsl (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/README (98%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/conf/Control.tpl (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/conf/xml.tpl (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/data/dtd/dataset.tpl (93%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/data/dtd/table.tpl (97%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/data/dump/bottom.tpl (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/data/dump/row.tpl (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/data/dump/top.tpl (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/om/php4/ExtensionNode.tpl (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/om/php4/ExtensionNodePeer.tpl (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/om/php4/ExtensionObject.tpl (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/om/php4/ExtensionPeer.tpl (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/om/php4/Interface.tpl (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/om/php4/MapBuilder.tpl (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/om/php4/MultiExtendObject.tpl (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/om/php4/Node.tpl (99%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/om/php4/NodePeer.tpl (99%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/om/php4/Object.tpl (96%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/om/php4/Peer.tpl (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/om/php5/ExtensionNode.tpl (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/om/php5/ExtensionNodePeer.tpl (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/om/php5/ExtensionObject.tpl (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/om/php5/ExtensionPeer.tpl (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/om/php5/Interface.tpl (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/om/php5/MapBuilder.tpl (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/om/php5/MultiExtendObject.tpl (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/om/php5/Node.tpl (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/om/php5/NodePeer.tpl (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/om/php5/Object.tpl (96%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/om/php5/Peer.tpl (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/sql/base/mssql/columns.tpl (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/sql/base/mssql/drop.tpl (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/sql/base/mssql/foreignkey.tpl (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/sql/base/mssql/index.tpl (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/sql/base/mssql/primarykey.tpl (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/sql/base/mssql/table.tpl (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/sql/base/mssql/tablefk.tpl (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/sql/base/mssql/unique.tpl (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/sql/base/mysql/columns.tpl (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/sql/base/mysql/database-end.tpl (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/sql/base/mysql/database-start.tpl (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/sql/base/mysql/drop.tpl (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/sql/base/mysql/foreignkey.tpl (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/sql/base/mysql/index.tpl (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/sql/base/mysql/primarykey.tpl (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/sql/base/mysql/table.tpl (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/sql/base/mysql/tablefk.tpl (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/sql/base/mysql/unique.tpl (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/sql/base/oracle/columns.tpl (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/sql/base/oracle/drop.tpl (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/sql/base/oracle/foreignkey.tpl (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/sql/base/oracle/index.tpl (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/sql/base/oracle/primarykey.tpl (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/sql/base/oracle/sequence.tpl (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/sql/base/oracle/table.tpl (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/sql/base/oracle/tablefk.tpl (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/sql/base/oracle/unique.tpl (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/sql/base/pgsql/columns.tpl (95%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/sql/base/pgsql/drop.tpl (97%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/sql/base/pgsql/foreignkey.tpl (97%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/sql/base/pgsql/index.tpl (99%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/sql/base/pgsql/primarykey.tpl (97%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/sql/base/pgsql/sequence.tpl (97%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/sql/base/pgsql/table.tpl (96%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/sql/base/pgsql/tablefk.tpl (96%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/sql/base/pgsql/unique.tpl (98%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/sql/base/sqlite/columns.tpl (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/sql/base/sqlite/drop.tpl (97%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/sql/base/sqlite/foreignkey.tpl (98%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/sql/base/sqlite/index.tpl (98%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/sql/base/sqlite/table.tpl (95%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/sql/base/sqlite/tablefk.tpl (75%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/sql/base/sqlite/unique.tpl (98%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/sql/db-init/Control.tpl (97%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/sql/db-init/mssql/unix.tpl (95%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/sql/db-init/mssql/windows.tpl (95%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/sql/db-init/mysql/createdb.tpl (97%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/sql/db-init/oracle/createdb.tpl (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/sql/db-init/pgsql/createdb.tpl (97%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/sql/load/mssql/row.tpl (96%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/sql/load/mssql/val.tpl (96%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/sql/load/mysql/row.tpl (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/sql/load/mysql/val.tpl (100%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/sql/load/oracle/row.tpl (96%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/sql/load/oracle/val.tpl (96%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/sql/load/pgsql/row.tpl (96%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/sql/load/pgsql/val.tpl (97%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/sql/load/sqlite/row.tpl (96%) rename {gulliver/thirdparty => thirdparty}/propel-generator/templates/sql/load/sqlite/val.tpl (97%) rename {gulliver/thirdparty => thirdparty}/propel/Propel.php (100%) rename {gulliver/thirdparty => thirdparty}/propel/PropelException.php (100%) rename {gulliver/thirdparty => thirdparty}/propel/adapter/DBAdapter.php (100%) rename {gulliver/thirdparty => thirdparty}/propel/adapter/DBArray.php (100%) rename {gulliver/thirdparty => thirdparty}/propel/adapter/DBMSSQL.php (100%) rename {gulliver/thirdparty => thirdparty}/propel/adapter/DBMySQL.php (100%) rename {gulliver/thirdparty => thirdparty}/propel/adapter/DBMySQLi.php (100%) rename {gulliver/thirdparty => thirdparty}/propel/adapter/DBNone.php (100%) rename {gulliver/thirdparty => thirdparty}/propel/adapter/DBOracle.php (100%) rename {gulliver/thirdparty => thirdparty}/propel/adapter/DBPostgres.php (100%) rename {gulliver/thirdparty => thirdparty}/propel/adapter/DBSQLite.php (100%) rename {gulliver/thirdparty => thirdparty}/propel/adapter/DBSybase.php (100%) rename {gulliver/thirdparty => thirdparty}/propel/logger/BasicLogger.php (100%) rename {gulliver/thirdparty => thirdparty}/propel/logger/MojaviLogAdapter.php (100%) rename {gulliver/thirdparty => thirdparty}/propel/map/ColumnMap.php (100%) rename {gulliver/thirdparty => thirdparty}/propel/map/DatabaseMap.php (100%) rename {gulliver/thirdparty => thirdparty}/propel/map/MapBuilder.php (100%) rename {gulliver/thirdparty => thirdparty}/propel/map/TableMap.php (100%) rename {gulliver/thirdparty => thirdparty}/propel/map/ValidatorMap.php (100%) rename {gulliver/thirdparty => thirdparty}/propel/om/BaseObject.php (99%) rename {gulliver/thirdparty => thirdparty}/propel/om/Persistent.php (100%) rename {gulliver/thirdparty => thirdparty}/propel/om/PreOrderNodeIterator.php (100%) rename {gulliver/thirdparty => thirdparty}/propel/util/BasePeer.php (100%) rename {gulliver/thirdparty => thirdparty}/propel/util/Criteria.php (99%) rename {gulliver/thirdparty => thirdparty}/propel/util/PeerInfo.php (100%) rename {gulliver/thirdparty => thirdparty}/propel/util/PropelPager.php (100%) rename {gulliver/thirdparty => thirdparty}/propel/util/Transaction.php (100%) rename {gulliver/thirdparty => thirdparty}/propel/validator/BasicValidator.php (100%) rename {gulliver/thirdparty => thirdparty}/propel/validator/MatchValidator.php (100%) rename {gulliver/thirdparty => thirdparty}/propel/validator/MaxLengthValidator.php (100%) rename {gulliver/thirdparty => thirdparty}/propel/validator/MaxValueValidator.php (100%) rename {gulliver/thirdparty => thirdparty}/propel/validator/MinLengthValidator.php (100%) rename {gulliver/thirdparty => thirdparty}/propel/validator/MinValueValidator.php (100%) rename {gulliver/thirdparty => thirdparty}/propel/validator/NotMatchValidator.php (100%) rename {gulliver/thirdparty => thirdparty}/propel/validator/RequiredValidator.php (100%) rename {gulliver/thirdparty => thirdparty}/propel/validator/UniqueValidator.php (100%) rename {gulliver/thirdparty => thirdparty}/propel/validator/ValidValuesValidator.php (100%) rename {gulliver/thirdparty => thirdparty}/propel/validator/ValidationFailed.php (100%) rename {gulliver/thirdparty => thirdparty}/smarty/BUGS (100%) rename {gulliver/thirdparty => thirdparty}/smarty/COPYING.lib (100%) rename {gulliver/thirdparty => thirdparty}/smarty/ChangeLog (100%) rename {gulliver/thirdparty => thirdparty}/smarty/FAQ (100%) rename {gulliver/thirdparty => thirdparty}/smarty/INSTALL (100%) rename {gulliver/thirdparty => thirdparty}/smarty/NEWS (100%) rename {gulliver/thirdparty => thirdparty}/smarty/QUICK_START (100%) rename {gulliver/thirdparty => thirdparty}/smarty/README (100%) rename {gulliver/thirdparty => thirdparty}/smarty/RELEASE_NOTES (100%) rename {gulliver/thirdparty => thirdparty}/smarty/TODO (100%) rename {gulliver/thirdparty => thirdparty}/smarty/demo/configs/test.conf (100%) rename {gulliver/thirdparty => thirdparty}/smarty/demo/index.php (100%) rename {gulliver/thirdparty => thirdparty}/smarty/demo/templates/footer.tpl (100%) rename {gulliver/thirdparty => thirdparty}/smarty/demo/templates/header.tpl (100%) rename {gulliver/thirdparty => thirdparty}/smarty/demo/templates/index.tpl (100%) rename {gulliver/thirdparty => thirdparty}/smarty/libs/Config_File.class.php (100%) rename {gulliver/thirdparty => thirdparty}/smarty/libs/Smarty.class.php (100%) rename {gulliver/thirdparty => thirdparty}/smarty/libs/Smarty_Compiler.class.php (100%) rename {gulliver/thirdparty => thirdparty}/smarty/libs/debug.tpl (100%) rename {gulliver/thirdparty => thirdparty}/smarty/libs/internals/core.assemble_plugin_filepath.php (100%) rename {gulliver/thirdparty => thirdparty}/smarty/libs/internals/core.assign_smarty_interface.php (100%) rename {gulliver/thirdparty => thirdparty}/smarty/libs/internals/core.create_dir_structure.php (100%) rename {gulliver/thirdparty => thirdparty}/smarty/libs/internals/core.display_debug_console.php (100%) rename {gulliver/thirdparty => thirdparty}/smarty/libs/internals/core.get_include_path.php (100%) rename {gulliver/thirdparty => thirdparty}/smarty/libs/internals/core.get_microtime.php (100%) rename {gulliver/thirdparty => thirdparty}/smarty/libs/internals/core.get_php_resource.php (100%) rename {gulliver/thirdparty => thirdparty}/smarty/libs/internals/core.is_secure.php (100%) rename {gulliver/thirdparty => thirdparty}/smarty/libs/internals/core.is_trusted.php (100%) rename {gulliver/thirdparty => thirdparty}/smarty/libs/internals/core.load_plugins.php (100%) rename {gulliver/thirdparty => thirdparty}/smarty/libs/internals/core.load_resource_plugin.php (100%) rename {gulliver/thirdparty => thirdparty}/smarty/libs/internals/core.process_cached_inserts.php (100%) rename {gulliver/thirdparty => thirdparty}/smarty/libs/internals/core.process_compiled_include.php (100%) rename {gulliver/thirdparty => thirdparty}/smarty/libs/internals/core.read_cache_file.php (100%) rename {gulliver/thirdparty => thirdparty}/smarty/libs/internals/core.rm_auto.php (100%) rename {gulliver/thirdparty => thirdparty}/smarty/libs/internals/core.rmdir.php (100%) rename {gulliver/thirdparty => thirdparty}/smarty/libs/internals/core.run_insert_handler.php (100%) rename {gulliver/thirdparty => thirdparty}/smarty/libs/internals/core.smarty_include_php.php (100%) rename {gulliver/thirdparty => thirdparty}/smarty/libs/internals/core.write_cache_file.php (100%) rename {gulliver/thirdparty => thirdparty}/smarty/libs/internals/core.write_compiled_include.php (100%) rename {gulliver/thirdparty => thirdparty}/smarty/libs/internals/core.write_compiled_resource.php (100%) rename {gulliver/thirdparty => thirdparty}/smarty/libs/internals/core.write_file.php (100%) rename {gulliver/thirdparty => thirdparty}/smarty/libs/plugins/block.textformat.php (100%) rename {gulliver/thirdparty => thirdparty}/smarty/libs/plugins/compiler.assign.php (100%) rename {gulliver/thirdparty => thirdparty}/smarty/libs/plugins/function.assign_debug_info.php (100%) rename {gulliver/thirdparty => thirdparty}/smarty/libs/plugins/function.config_load.php (100%) rename {gulliver/thirdparty => thirdparty}/smarty/libs/plugins/function.counter.php (100%) rename {gulliver/thirdparty => thirdparty}/smarty/libs/plugins/function.cycle.php (100%) rename {gulliver/thirdparty => thirdparty}/smarty/libs/plugins/function.debug.php (100%) rename {gulliver/thirdparty => thirdparty}/smarty/libs/plugins/function.eval.php (100%) rename {gulliver/thirdparty => thirdparty}/smarty/libs/plugins/function.fetch.php (100%) rename {gulliver/thirdparty => thirdparty}/smarty/libs/plugins/function.html_checkboxes.php (100%) rename {gulliver/thirdparty => thirdparty}/smarty/libs/plugins/function.html_image.php (100%) rename {gulliver/thirdparty => thirdparty}/smarty/libs/plugins/function.html_options.php (100%) rename {gulliver/thirdparty => thirdparty}/smarty/libs/plugins/function.html_radios.php (100%) rename {gulliver/thirdparty => thirdparty}/smarty/libs/plugins/function.html_select_date.php (100%) rename {gulliver/thirdparty => thirdparty}/smarty/libs/plugins/function.html_select_time.php (100%) rename {gulliver/thirdparty => thirdparty}/smarty/libs/plugins/function.html_table.php (100%) rename {gulliver/thirdparty => thirdparty}/smarty/libs/plugins/function.mailto.php (100%) rename {gulliver/thirdparty => thirdparty}/smarty/libs/plugins/function.math.php (100%) rename {gulliver/thirdparty => thirdparty}/smarty/libs/plugins/function.popup.php (100%) rename {gulliver/thirdparty => thirdparty}/smarty/libs/plugins/function.popup_init.php (100%) rename {gulliver/thirdparty => thirdparty}/smarty/libs/plugins/modifier.capitalize.php (100%) rename {gulliver/thirdparty => thirdparty}/smarty/libs/plugins/modifier.cat.php (100%) rename {gulliver/thirdparty => thirdparty}/smarty/libs/plugins/modifier.count_characters.php (100%) rename {gulliver/thirdparty => thirdparty}/smarty/libs/plugins/modifier.count_paragraphs.php (100%) rename {gulliver/thirdparty => thirdparty}/smarty/libs/plugins/modifier.count_sentences.php (100%) rename {gulliver/thirdparty => thirdparty}/smarty/libs/plugins/modifier.count_words.php (100%) rename {gulliver/thirdparty => thirdparty}/smarty/libs/plugins/modifier.date_format.php (100%) rename {gulliver/thirdparty => thirdparty}/smarty/libs/plugins/modifier.debug_print_var.php (100%) rename {gulliver/thirdparty => thirdparty}/smarty/libs/plugins/modifier.default.php (100%) rename {gulliver/thirdparty => thirdparty}/smarty/libs/plugins/modifier.escape.php (100%) rename {gulliver/thirdparty => thirdparty}/smarty/libs/plugins/modifier.indent.php (100%) rename {gulliver/thirdparty => thirdparty}/smarty/libs/plugins/modifier.lower.php (100%) rename {gulliver/thirdparty => thirdparty}/smarty/libs/plugins/modifier.nl2br.php (100%) rename {gulliver/thirdparty => thirdparty}/smarty/libs/plugins/modifier.regex_replace.php (100%) rename {gulliver/thirdparty => thirdparty}/smarty/libs/plugins/modifier.replace.php (100%) rename {gulliver/thirdparty => thirdparty}/smarty/libs/plugins/modifier.spacify.php (100%) rename {gulliver/thirdparty => thirdparty}/smarty/libs/plugins/modifier.string_format.php (100%) rename {gulliver/thirdparty => thirdparty}/smarty/libs/plugins/modifier.strip.php (100%) rename {gulliver/thirdparty => thirdparty}/smarty/libs/plugins/modifier.strip_tags.php (100%) rename {gulliver/thirdparty => thirdparty}/smarty/libs/plugins/modifier.truncate.php (100%) rename {gulliver/thirdparty => thirdparty}/smarty/libs/plugins/modifier.upper.php (100%) rename {gulliver/thirdparty => thirdparty}/smarty/libs/plugins/modifier.wordwrap.php (100%) rename {gulliver/thirdparty => thirdparty}/smarty/libs/plugins/outputfilter.trimwhitespace.php (100%) rename {gulliver/thirdparty => thirdparty}/smarty/libs/plugins/shared.escape_special_chars.php (100%) rename {gulliver/thirdparty => thirdparty}/smarty/libs/plugins/shared.make_timestamp.php (100%) rename {gulliver/thirdparty => thirdparty}/smarty/misc/smarty_icon.README (100%) rename {gulliver/thirdparty => thirdparty}/smarty/misc/smarty_icon.gif (100%) rename {gulliver/thirdparty => thirdparty}/smarty/unit_test/README (100%) rename {gulliver/thirdparty => thirdparty}/smarty/unit_test/config.php (100%) rename {gulliver/thirdparty => thirdparty}/smarty/unit_test/configs/globals_double_quotes.conf (100%) rename {gulliver/thirdparty => thirdparty}/smarty/unit_test/configs/globals_single_quotes.conf (100%) rename {gulliver/thirdparty => thirdparty}/smarty/unit_test/smarty_unit_test.php (100%) rename {gulliver/thirdparty => thirdparty}/smarty/unit_test/smarty_unit_test_gui.php (100%) rename {gulliver/thirdparty => thirdparty}/smarty/unit_test/templates/assign_var.tpl (100%) rename {gulliver/thirdparty => thirdparty}/smarty/unit_test/templates/constant.tpl (100%) rename {gulliver/thirdparty => thirdparty}/smarty/unit_test/templates/index.tpl (100%) rename {gulliver/thirdparty => thirdparty}/smarty/unit_test/templates/parse_math.tpl (100%) rename {gulliver/thirdparty => thirdparty}/smarty/unit_test/templates/parse_obj_meth.tpl (100%) rename {gulliver/thirdparty => thirdparty}/smarty/unit_test/test_cases.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/2dbarcodes.php (99%) rename {gulliver/thirdparty => thirdparty}/tcpdf/CHANGELOG.TXT (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/LICENSE.TXT (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/README.TXT (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/barcodes.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/composer.json (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/config/lang/afr.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/config/lang/ara.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/config/lang/aze.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/config/lang/bel.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/config/lang/bra.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/config/lang/bul.php (96%) rename {gulliver/thirdparty => thirdparty}/tcpdf/config/lang/cat.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/config/lang/ces.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/config/lang/chi.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/config/lang/cym.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/config/lang/dan.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/config/lang/eng.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/config/lang/est.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/config/lang/eus.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/config/lang/far.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/config/lang/fra.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/config/lang/ger.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/config/lang/gle.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/config/lang/glg.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/config/lang/hat.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/config/lang/heb.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/config/lang/hrv.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/config/lang/hun.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/config/lang/hye.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/config/lang/ind.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/config/lang/ita.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/config/lang/jpn.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/config/lang/kat.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/config/lang/kor.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/config/lang/mkd.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/config/lang/mlt.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/config/lang/msa.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/config/lang/nld.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/config/lang/nob.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/config/lang/pol.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/config/lang/por.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/config/lang/ron.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/config/lang/rus.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/config/lang/slv.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/config/lang/spa.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/config/lang/sqi.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/config/lang/srp.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/config/lang/swa.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/config/lang/swe.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/config/lang/ukr.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/config/lang/urd.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/config/lang/yid.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/config/lang/zho.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/config/tcpdf_config.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/config/tcpdf_config_alt.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/datamatrix.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/encodings_maps.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/aealarabiya.ctg.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/aealarabiya.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/aealarabiya.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/aefurat.ctg.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/aefurat.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/aefurat.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/arial.ctg.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/arial.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/arial.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/arialb.ctg.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/arialb.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/arialb.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/arialbi.ctg.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/arialbi.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/arialbi.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/arialblack.ctg.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/arialblack.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/arialblack.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/ariali.ctg.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/ariali.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/ariali.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/cid0cs.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/cid0ct.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/cid0jp.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/cid0kr.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/courier.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/courierb.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/courierbi.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/courieri.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/dejavu-fonts-ttf-2.33/AUTHORS (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/dejavu-fonts-ttf-2.33/BUGS (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/dejavu-fonts-ttf-2.33/LICENSE (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/dejavu-fonts-ttf-2.33/NEWS (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/dejavu-fonts-ttf-2.33/README (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/dejavu-fonts-ttf-2.33/langcover.txt (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/dejavu-fonts-ttf-2.33/status.txt (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/dejavu-fonts-ttf-2.33/unicover.txt (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/dejavusans.ctg.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/dejavusans.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/dejavusans.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/dejavusansb.ctg.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/dejavusansb.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/dejavusansb.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/dejavusansbi.ctg.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/dejavusansbi.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/dejavusansbi.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/dejavusanscondensed.ctg.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/dejavusanscondensed.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/dejavusanscondensed.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/dejavusanscondensedb.ctg.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/dejavusanscondensedb.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/dejavusanscondensedb.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/dejavusanscondensedbi.ctg.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/dejavusanscondensedbi.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/dejavusanscondensedbi.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/dejavusanscondensedi.ctg.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/dejavusanscondensedi.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/dejavusanscondensedi.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/dejavusansextralight.ctg.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/dejavusansextralight.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/dejavusansextralight.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/dejavusansi.ctg.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/dejavusansi.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/dejavusansi.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/dejavusansmono.ctg.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/dejavusansmono.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/dejavusansmono.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/dejavusansmonob.ctg.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/dejavusansmonob.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/dejavusansmonob.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/dejavusansmonobi.ctg.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/dejavusansmonobi.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/dejavusansmonobi.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/dejavusansmonoi.ctg.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/dejavusansmonoi.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/dejavusansmonoi.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/dejavuserif.ctg.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/dejavuserif.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/dejavuserif.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/dejavuserifb.ctg.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/dejavuserifb.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/dejavuserifb.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/dejavuserifbi.ctg.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/dejavuserifbi.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/dejavuserifbi.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/dejavuserifcondensed.ctg.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/dejavuserifcondensed.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/dejavuserifcondensed.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/dejavuserifcondensedb.ctg.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/dejavuserifcondensedb.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/dejavuserifcondensedb.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/dejavuserifcondensedbi.ctg.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/dejavuserifcondensedbi.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/dejavuserifcondensedbi.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/dejavuserifcondensedi.ctg.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/dejavuserifcondensedi.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/dejavuserifcondensedi.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/dejavuserifi.ctg.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/dejavuserifi.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/dejavuserifi.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/freefont-20100919/AUTHORS (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/freefont-20100919/COPYING (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/freefont-20100919/CREDITS (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/freefont-20100919/ChangeLog (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/freefont-20100919/INSTALL (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/freefont-20100919/README (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/freemono.ctg.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/freemono.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/freemono.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/freemonob.ctg.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/freemonob.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/freemonob.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/freemonobi.ctg.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/freemonobi.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/freemonobi.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/freemonoi.ctg.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/freemonoi.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/freemonoi.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/freesans.ctg.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/freesans.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/freesans.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/freesansb.ctg.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/freesansb.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/freesansb.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/freesansbi.ctg.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/freesansbi.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/freesansbi.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/freesansi.ctg.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/freesansi.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/freesansi.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/freeserif.ctg.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/freeserif.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/freeserif.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/freeserifb.ctg.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/freeserifb.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/freeserifb.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/freeserifbi.ctg.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/freeserifbi.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/freeserifbi.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/freeserifi.ctg.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/freeserifi.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/freeserifi.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/helvetica.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/helveticab.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/helveticabi.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/helveticai.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/hysmyeongjostdmedium.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/kozgopromedium.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/kozminproregular.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/msungstdlight.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/pdfacourier.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/pdfacourier.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/pdfacourierb.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/pdfacourierb.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/pdfacourierbi.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/pdfacourierbi.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/pdfacourieri.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/pdfacourieri.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/pdfahelvetica.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/pdfahelvetica.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/pdfahelveticab.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/pdfahelveticab.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/pdfahelveticabi.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/pdfahelveticabi.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/pdfahelveticai.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/pdfahelveticai.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/pdfasymbol.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/pdfasymbol.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/pdfatimes.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/pdfatimes.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/pdfatimesb.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/pdfatimesb.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/pdfatimesbi.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/pdfatimesbi.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/pdfatimesi.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/pdfatimesi.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/pdfazapfdingbats.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/pdfazapfdingbats.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/stsongstdlight.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/symbol.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/times.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/timesb.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/timesbi.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/timesi.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/timesnewroman.ctg.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/timesnewroman.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/timesnewroman.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/timesnewromanb.ctg.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/timesnewromanb.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/timesnewromanb.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/timesnewromanbi.ctg.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/timesnewromanbi.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/timesnewromanbi.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/timesnewromani.ctg.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/timesnewromani.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/timesnewromani.z (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/uni2cid_ac15.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/uni2cid_ag15.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/uni2cid_aj16.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/uni2cid_ak12.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/fonts/zapfdingbats.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/htmlcolors.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/pdf417.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/qrcode.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/sRGB.icc (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/spotcolors.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/tcpdf.crt (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/tcpdf.fdf (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/tcpdf.p12 (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/tcpdf.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/tcpdf_filters.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/tcpdf_parser.php (100%) rename {gulliver/thirdparty => thirdparty}/tcpdf/unicode_data.php (100%) diff --git a/bootstrap/autoload.php b/bootstrap/autoload.php new file mode 100644 index 000000000..08d81773d --- /dev/null +++ b/bootstrap/autoload.php @@ -0,0 +1,14 @@ +getPluginDetails($pluginName . '.php'); $fileTar = $pluginHome . PATH_SEP . $pluginName . '-' . $pluginDetail->iVersion . '.tar'; - G::LoadThirdParty('pear/Archive', 'Tar'); + $tar = new Archive_Tar($fileTar); $tar->_compress = false; @@ -563,9 +553,6 @@ function run_new_plugin($task, $args) { } $pluginName = $args[0]; - require_once ("propel/Propel.php"); - G::LoadSystem('templatePower'); - Propel::init(PATH_CORE . "config/databases.php"); $configuration = Propel::getConfiguration(); $connectionDSN = $configuration['datasources']['workflow']['connection']; @@ -762,10 +749,10 @@ function run_create_poedit_file($task, $args) { $countryOutId = isset($args[1]) ? strtoupper($args[1]) : 'US'; $verboseFlag = isset($args[2]) ? $args[2] == true : false; - require_once ("propel/Propel.php"); - require_once ("classes/model/Translation.php"); - require_once ("classes/model/Language.php"); - require_once ("classes/model/IsoCountry.php"); + + + + Propel::init(PATH_CORE . "config/databases.php"); $configuration = Propel::getConfiguration(); @@ -901,13 +888,6 @@ function run_create_poedit_file($task, $args) { printf("checking xmlform\n"); printf("using directory %s \n", pakeColor::colorize(PATH_XMLFORM, 'INFO')); - G::LoadThirdParty('pear/json', 'class.json'); - G::LoadThirdParty('smarty/libs', 'Smarty.class'); - G::LoadSystem('xmlDocument'); - G::LoadSystem('xmlform'); - G::LoadSystem('xmlformExtension'); - G::LoadSystem('form'); - G::LoadSystem('inputfilter'); $filter = new InputFilter(); $langIdOut = $langId; //the output language, later we'll include the country too. @@ -1168,9 +1148,7 @@ function run_propel_build_crud($task, $args) { } printf("TableName : %s \n", pakeColor::colorize($tableName, 'INFO')); - require_once ("propel/Propel.php"); require_once ($classFilename); - G::LoadSystem('templatePower'); global $G_ENVIRONMENTS; $aux = explode(PATH_SEP, PATH_HOME); @@ -1521,8 +1499,7 @@ function get_infoOnPM($workspace) { $Fields['WORKSPACE_NAME'] = $workspace; if( defined("DB_HOST") ) { - G::LoadClass('net'); - G::LoadClass('dbConnections'); + $dbNetView = new NET(DB_HOST); $dbNetView->loginDbServer(DB_USER, DB_PASS); @@ -1747,7 +1724,6 @@ function run_workspace_backup($task, $args) { } $dbOpt = @explode(SYSTEM_HASH, G::decrypt(HASH_INSTALLATION, SYSTEM_HASH)); - G::LoadSystem('dbMaintenance'); $oDbMaintainer = new DataBaseMaintenance($dbOpt[0], $dbOpt[1], $dbOpt[2]); try{ $oDbMaintainer->connect("mysql"); @@ -1757,8 +1733,6 @@ function run_workspace_backup($task, $args) { } require_once ($dbFile); - require_once ("propel/Propel.php"); - G::LoadSystem('templatePower'); Propel::init(PATH_CORE . "config/databases.php"); $configuration = Propel::getConfiguration(); @@ -1799,7 +1773,7 @@ function run_workspace_backup($task, $args) { throw new Exception("Metadata file could not be written"); } - G::LoadThirdParty('pear/Archive', 'Tar'); + $tar = new Archive_Tar($fileTar); if (!isset($gzipPath)) @@ -1964,7 +1938,7 @@ function workspaceRestore($backupFilename, $targetWorkspace, $overwrite) { G::rm_dir($tempDirectory); G::mk_dir($tempDirectory); - G::LoadThirdParty('pear/Archive', 'Tar'); + $tar = new Archive_Tar($backupFilename); $res = $tar->extract($tempDirectory); @@ -2027,7 +2001,6 @@ function workspaceRestore($backupFilename, $targetWorkspace, $overwrite) { /* TODO: Check if database exists after updateDBfile */ $config = updateDBfile($targetWorkspaceDir, $targetWorkspace, $dbHostname, $changeWorkspace); - G::LoadSystem('dbMaintenance'); $oDbMaintainer = new DataBaseMaintenance($dbOpt[0], $dbOpt[1], $dbOpt[2]); $dbName = $config['DB_NAME']; @@ -2064,8 +2037,7 @@ function get_DirDB($workspace) { } require_once ($dbFile); - require_once ("propel/Propel.php"); - G::LoadSystem('templatePower'); + Propel::init(PATH_CORE . "config/databases.php"); $configuration = Propel::getConfiguration(); @@ -2246,7 +2218,6 @@ function run_check_standard_code ( $task, $options) { function run_update_plugin_attributes($task, $args) { try { - G::LoadClass("plugin"); //Verify data if (!isset($args[0])) { @@ -2338,7 +2309,6 @@ function run_check_plugin_disabled_code($task, $args) //Check disabled code if (count($arrayData) > 0) { - G::LoadClass("codeScanner"); $cs = new CodeScanner(true); diff --git a/gulliver/bin/tasks/templates/permissionsList.php.tpl b/gulliver/bin/tasks/templates/permissionsList.php.tpl index 8fab7519a..2c61f67cc 100644 --- a/gulliver/bin/tasks/templates/permissionsList.php.tpl +++ b/gulliver/bin/tasks/templates/permissionsList.php.tpl @@ -4,7 +4,7 @@ * */ - require_once ( PATH_RBAC . "model/PermissionsPeer.php"); + $oCriteria = $RBAC->listAllPermissions( '{rbacProjectName}'); $G_MAIN_MENU = '{projectName}'; $G_SUB_MENU = 'users'; diff --git a/gulliver/bin/tasks/templates/pluginClass.tpl b/gulliver/bin/tasks/templates/pluginClass.tpl index 9ae4c015e..1cc103337 100644 --- a/gulliver/bin/tasks/templates/pluginClass.tpl +++ b/gulliver/bin/tasks/templates/pluginClass.tpl @@ -52,7 +52,7 @@ function {className}Report_1() { global $G_PUBLISH; - require_once 'classes/model/Users.php'; + $sDelimiter = DBAdapter::getStringDelimiter(); $aUsers = array(); $aUsers[] = array('USR_UID' => 'char', @@ -83,7 +83,7 @@ $_DBArray['users'] = $aUsers; $_SESSION['_DBArray'] = $_DBArray; - G::LoadClass('ArrayPeer'); +; $oCriteria = new Criteria('dbarray'); $oCriteria->setDBArrayTable('users'); $oCriteria->addDescendingOrderByColumn('USR_USERNAME'); diff --git a/gulliver/bin/tasks/templates/pluginMainFile.tpl b/gulliver/bin/tasks/templates/pluginMainFile.tpl index 533931c1b..0128ee1dc 100644 --- a/gulliver/bin/tasks/templates/pluginMainFile.tpl +++ b/gulliver/bin/tasks/templates/pluginMainFile.tpl @@ -1,5 +1,5 @@ public function dashletInsert() { - require_once ("classes/model/Dashlet.php"); + $connection = Propel::getConnection(DashletPeer::DATABASE_NAME); @@ -101,7 +101,7 @@ class {className}Plugin extends PMPlugin public function dashletDelete() { - require_once ("classes/model/Dashlet.php"); + foreach ($this->dashletsUids as $dashletData) { $criteria = new Criteria("workflow"); diff --git a/gulliver/bin/tasks/templates/pluginOnTransitList.php.tpl b/gulliver/bin/tasks/templates/pluginOnTransitList.php.tpl index f093acfd5..3f93b65e3 100644 --- a/gulliver/bin/tasks/templates/pluginOnTransitList.php.tpl +++ b/gulliver/bin/tasks/templates/pluginOnTransitList.php.tpl @@ -8,8 +8,8 @@ //if (($RBAC_Response = $RBAC->userCanAccess("PM_CASES"))!=1) return $RBAC_Response; /* Includes */ - G::LoadClass('case'); - G::LoadClass('configuration'); +; +; /* GET , POST & $_SESSION Vars */ $conf = new Configurations(); diff --git a/gulliver/bin/tasks/templates/pluginStep.tpl b/gulliver/bin/tasks/templates/pluginStep.tpl index 6da1aef1d..9626e1149 100644 --- a/gulliver/bin/tasks/templates/pluginStep.tpl +++ b/gulliver/bin/tasks/templates/pluginStep.tpl @@ -1,5 +1,5 @@ setDBArrayTable('user'); //$c->add ( 'user.age', 122 , Criteria::GREATER_EQUAL ); diff --git a/gulliver/bin/tasks/templates/rolesList.php.tpl b/gulliver/bin/tasks/templates/rolesList.php.tpl index d9dd1bba3..45858ec63 100644 --- a/gulliver/bin/tasks/templates/rolesList.php.tpl +++ b/gulliver/bin/tasks/templates/rolesList.php.tpl @@ -4,7 +4,7 @@ * */ - require_once ( PATH_RBAC . "model/RolesPeer.php"); + $oCriteria = $RBAC->listAllRoles( '{rbacProjectName}'); $G_MAIN_MENU = '{projectName}'; $G_SUB_MENU = 'users'; diff --git a/gulliver/bin/tasks/templates/skinPluginMainClass.tpl b/gulliver/bin/tasks/templates/skinPluginMainClass.tpl index e5836c624..5f16a8bb0 100644 --- a/gulliver/bin/tasks/templates/skinPluginMainClass.tpl +++ b/gulliver/bin/tasks/templates/skinPluginMainClass.tpl @@ -4,7 +4,7 @@ * */ - G::LoadClass('plugin'); +; class {className}Plugin extends PMPlugin { diff --git a/gulliver/bin/tasks/templates/sysGeneric.php.tpl b/gulliver/bin/tasks/templates/sysGeneric.php.tpl index bd94fe686..f004d854c 100644 --- a/gulliver/bin/tasks/templates/sysGeneric.php.tpl +++ b/gulliver/bin/tasks/templates/sysGeneric.php.tpl @@ -124,28 +124,6 @@ $docuroot = explode ( PATH_SEP , $_SERVER['DOCUMENT_ROOT'] ); //***************** Call Gulliver Classes ************************** - G::LoadThirdParty('pear/json','class.json'); - G::LoadThirdParty('smarty/libs','Smarty.class'); - - G::LoadSystem('error'); - G::LoadSystem('dbconnection'); - G::LoadSystem('dbsession'); - G::LoadSystem('dbrecordset'); - G::LoadSystem('dbtable'); - G::LoadSystem('rbac' ); - G::LoadSystem('publisher'); - G::LoadSystem('templatePower'); - G::LoadSystem('headPublisher'); - G::LoadSystem('xmlDocument'); - G::LoadSystem('xmlform'); - G::LoadSystem('xmlformExtension'); - G::LoadSystem('form'); - G::LoadSystem('menu'); - G::LoadSystem("xmlMenu"); - G::LoadSystem('table'); - G::LoadSystem('pagedTable'); - G::LoadSystem('tree'); - $oHeadPublisher =& headPublisher::getSingleton(); //***************** database and workspace definition ************************ @@ -220,7 +198,7 @@ $docuroot = explode ( PATH_SEP , $_SERVER['DOCUMENT_ROOT'] ); //***************** Plugins ************************** - G::LoadClass('plugin'); +; // //here we are loading all plugins registered // //the singleton has a list of enabled plugins diff --git a/gulliver/bin/tasks/templates/unitTest.tpl b/gulliver/bin/tasks/templates/unitTest.tpl index 6d781d0a9..61e6db65e 100644 --- a/gulliver/bin/tasks/templates/unitTest.tpl +++ b/gulliver/bin/tasks/templates/unitTest.tpl @@ -5,7 +5,7 @@ require_once( PATH_THIRDPARTY . '/lime/lime.php'); require_once( PATH_THIRDPARTY.'lime/yaml.class.php'); - G::LoadThirdParty('smarty/libs','Smarty.class'); + G::LoadSystem ( 'xmlform'); G::LoadSystem ( 'xmlDocument'); G::LoadSystem ( 'form'); diff --git a/gulliver/bin/tasks/templates/usersList.php.tpl b/gulliver/bin/tasks/templates/usersList.php.tpl index 9fd49ff56..38bd54af5 100644 --- a/gulliver/bin/tasks/templates/usersList.php.tpl +++ b/gulliver/bin/tasks/templates/usersList.php.tpl @@ -21,7 +21,7 @@ $G_ID_SUB_MENU_SELECTED = 'USERS'; $_DBArray['user'] = $rows; $_SESSION['_DBArray'] = $_DBArray; - G::LoadClass( 'ArrayPeer'); +; $c = new Criteria ('dbarray'); $c->setDBArrayTable('user'); diff --git a/gulliver/bin/tasks/templates/welcome.php.tpl b/gulliver/bin/tasks/templates/welcome.php.tpl index 7fdaa51f4..bf7a94c94 100644 --- a/gulliver/bin/tasks/templates/welcome.php.tpl +++ b/gulliver/bin/tasks/templates/welcome.php.tpl @@ -23,7 +23,7 @@ $_DBArray['user'] = $rows; $_SESSION['_DBArray'] = $_DBArray; //krumo ( $_DBArray ); - G::LoadClass( 'ArrayPeer'); +; $c = new Criteria ('dbarray'); $c->setDBArrayTable('user'); //$c->add ( 'user.age', 122 , Criteria::GREATER_EQUAL ); diff --git a/gulliver/core/Bootstrap.php b/gulliver/core/Bootstrap.php index 356540e08..d1fd90eff 100644 --- a/gulliver/core/Bootstrap.php +++ b/gulliver/core/Bootstrap.php @@ -36,7 +36,7 @@ class Bootstrap define('PATH_TRUNK', $config['path_trunk']); // Including these files we get the PM paths and definitions (that should be just one file. - require_once PATH_TRUNK . 'gulliver/core/Autoloader.php'; + $this->autoloader = Autoloader::getInstance(); } diff --git a/gulliver/js/grid/core/grid.js b/gulliver/js/grid/core/grid.js index f1e4eebd7..b386a0120 100644 --- a/gulliver/js/grid/core/grid.js +++ b/gulliver/js/grid/core/grid.js @@ -563,7 +563,6 @@ var G_Grid = function(oForm, sGridName){ case 'textarea': //TEXTAREA aObjects = oNewRow.getElementsByTagName('td')[i].getElementsByTagName('textarea'); if (aObjects){ - aObjects[0].value = ''; aObjects[0].className = "module_app_input___gray"; newID = aObjects[0].id.replace(/\[1\]/g, '\[' + currentRow + '\]'); diff --git a/gulliver/js/maborak/core/maborak.js b/gulliver/js/maborak/core/maborak.js index ed51edd17..a4c74b37b 100644 --- a/gulliver/js/maborak/core/maborak.js +++ b/gulliver/js/maborak/core/maborak.js @@ -1345,7 +1345,7 @@ break;case'hidden':if((attributes.gridtype!="yesno"&&attributes.gridtype!="dropd newID=aObjects[n].id.replace(/\[1\]/g,'\['+currentRow+'\]');aObjects[n].id=newID;aObjects[n].name=newID;} break;case'button':if(aObjects[n].onclick){var onclickevn=new String(aObjects[n].onclick);eval('aObjects[n].onclick = '+onclickevn.replace(/\[1\]/g,'\['+currentRow+'\]')+';');} break;case"file":aObjects[n].value="";break;}}} -aObjects=null;break;case'textarea':aObjects=oNewRow.getElementsByTagName('td')[i].getElementsByTagName('textarea');if(aObjects){aObjects[0].value='';aObjects[0].className="module_app_input___gray";newID=aObjects[0].id.replace(/\[1\]/g,'\['+currentRow+'\]');aObjects[0].id=newID;aObjects[0].name=newID;attributes=elementAttributesNS(aObjects[0],'pm');if(attributes.defaultvalue!=''&&typeof attributes.defaultvalue!='undefined'){defaultValue=attributes.defaultvalue;}else{defaultValue='';} +aObjects=null;break;case'textarea':aObjects=oNewRow.getElementsByTagName('td')[i].getElementsByTagName('textarea');if(aObjects){aObjects[0].className="module_app_input___gray";newID=aObjects[0].id.replace(/\[1\]/g,'\['+currentRow+'\]');aObjects[0].id=newID;aObjects[0].name=newID;attributes=elementAttributesNS(aObjects[0],'pm');if(attributes.defaultvalue!=''&&typeof attributes.defaultvalue!='undefined'){defaultValue=attributes.defaultvalue;}else{defaultValue='';} aObjects[0].innerHTML=defaultValue;} aObjects=null;break;case'select':aObjects=oNewRow.getElementsByTagName('td')[i].getElementsByTagName('select');if(aObjects){newID=aObjects[0].id.replace(/\[1\]/g,'\['+currentRow+'\]');aObjects[0].id=newID;aObjects[0].name=newID;var oNewSelect=this.cloneElement(aObjects[0]);oNewSelect.id=newID;oNewSelect.name=newID;attributes=elementAttributesNS(aObjects[0],'pm');if(attributes.defaultvalue!=''&&typeof attributes.defaultvalue!='undefined'){defaultValue=attributes.defaultvalue;}else{defaultValue='';} var aDependents=this.allDependentFields.split(',');sObject=this.getObjectName(newID);var sw=false;for(x=0;x xssFilterHard($_GET["q"]); @@ -58,7 +57,6 @@ // displays the upload form function displayUploadForm() { - G::LoadSystem('inputfilter'); $filter = new InputFilter(); if(isset($_SERVER["QUERY_STRING"])) { $_SERVER["QUERY_STRING"] = $filter->xssFilterHard($_SERVER["QUERY_STRING"],'url'); @@ -86,7 +84,6 @@ function displayUploadForm() // uploads the file to the destination path, and returns a link with link path substituted for destination path function uploadContentFile() { - G::LoadSystem('inputfilter'); $filter = new InputFilter(); $_FILES["upload_file"] = $filter->xssFilterHard($_FILES["upload_file"]); @@ -105,7 +102,7 @@ function uploadContentFile() function showPopUp($PopupText) { - G::LoadSystem('inputfilter'); + $filter = new InputFilter(); $PopupText = $filter->xssFilterHard($PopupText); echo ""; diff --git a/gulliver/methods/defaultAjax.php b/gulliver/methods/defaultAjax.php index 980813627..c0ad336a0 100644 --- a/gulliver/methods/defaultAjax.php +++ b/gulliver/methods/defaultAjax.php @@ -26,7 +26,7 @@ if (isset( $_SESSION['CURRENT_PAGE_INITILIZATION'] )) eval( $_SESSION['CURRENT_PAGE_INITILIZATION'] ); - // G::LoadThirdParty('pear/json','class.json'); + // $json=new Services_JSON(); if (! defined( 'XMLFORM_AJAX_PATH' )) define( 'XMLFORM_AJAX_PATH', PATH_XMLFORM ); diff --git a/gulliver/methods/errors/block.php b/gulliver/methods/errors/block.php index 05dd1aebe..19b4a3106 100644 --- a/gulliver/methods/errors/block.php +++ b/gulliver/methods/errors/block.php @@ -3,7 +3,7 @@ if (function_exists("http_response_code")) { http_response_code(200); } -$http = G::is_https() ? "https" : "http"; +$http = (isset($_SERVER["HTTPS"]) && $_SERVER["HTTPS"] == "on") ? "https" : "http"; $host = $_SERVER["SERVER_NAME"] . (($_SERVER["SERVER_PORT"] != "80") ? ":" . $_SERVER["SERVER_PORT"] : ""); $urlLogin = $http . "://" . $host . "/sys/en/neoclassic/login/login"; diff --git a/gulliver/methods/errors/error403.php b/gulliver/methods/errors/error403.php index bc91e6f9d..c47080475 100644 --- a/gulliver/methods/errors/error403.php +++ b/gulliver/methods/errors/error403.php @@ -1,6 +1,6 @@ xssFilterHard($_GET,"url"); +$_POST = $filter->xssFilterHard($_POST,"url"); +$_REQUEST = $filter->xssFilterHard($_REQUEST,"url"); +$_SESSION = $filter->xssFilterHard($_SESSION,"url"); $request = isset($_POST['request'])? $_POST['request']: null; if( !isset($request) ){ @@ -32,6 +37,7 @@ if( isset($request) ){ $_SESSION[$_POST["formID"]][$_POST["gridname"]] = $oFields; } + break; /** widgets **/ case 'suggest': @@ -55,7 +61,6 @@ if( isset($request) ){ } // Parsed SQL Structure - G::LoadClass('phpSqlParser'); $parser = new PHPSQLParser($SQL); $searchType = $_GET["searchType"]; diff --git a/gulliver/methods/loader.php b/gulliver/methods/loader.php index f56a5dde1..1cecf31ea 100644 --- a/gulliver/methods/loader.php +++ b/gulliver/methods/loader.php @@ -1,7 +1,5 @@ renderTable( 'content' ); - G::LoadClass('configuration'); $conf = new Configurations(); $conf->setConfig($ntable->__Configuration,$ntable,$conf->aConfig); $conf->saveConfig('pagedTable',$ntable->__OBJ_UID,'',$_SESSION['USER_LOGGED'],''); diff --git a/gulliver/methods/propelTableAjax.php b/gulliver/methods/propelTableAjax.php index 5d6813dbb..19bc99a91 100644 --- a/gulliver/methods/propelTableAjax.php +++ b/gulliver/methods/propelTableAjax.php @@ -23,12 +23,7 @@ * */ /* Includes */ - G::LoadSystem('pagedTable'); - G::LoadClass('propelTable'); - G::LoadInclude('ajax'); - G::LoadAllModelClasses(); - G::LoadAllPluginModelClasses(); - require_once ( 'classes/class.xmlfield_InputPM.php' ); + $id = get_ajax_value('ptID'); $ntable = unserialize(base64_decode($_SESSION['pagedTable[' . $id . ']'])); $page = get_ajax_value('page'); @@ -128,8 +123,6 @@ $ntable->renderTable("content"); -G::LoadClass("configuration"); - $conf = new Configurations(); $conf->setConfig($ntable->__Configuration, $ntable, $conf->aConfig); diff --git a/gulliver/system/class.bootstrap.php b/gulliver/system/class.bootstrap.php index 485af62d3..2ef7e1ac6 100644 --- a/gulliver/system/class.bootstrap.php +++ b/gulliver/system/class.bootstrap.php @@ -14,35 +14,6 @@ class Bootstrap //below here only approved methods - /* the autoloader functions */ - - public static function autoloadClass($class) - { - $className = strtolower($class); - - if (isset(BootStrap::$includeClassPaths[$className])) { - require_once BootStrap::$includeClassPaths[$className]; - - return true; - } - return false; - } - - public static function registerClass($className, $includePath) - { - if (! class_exists('\Maveriks\Util\ClassLoader')) { - self::displayMaveriksNotLoadedError(); - } - - $loader = Maveriks\Util\ClassLoader::getInstance(); - $loader->addClass($className, $includePath); - } - - public static function registerDir($name, $dir) - { - BootStrap::$includePaths[$name] = $dir; - } - /* * these functions still under revision */ @@ -51,220 +22,12 @@ class Bootstrap { // (!) Backward compatibility, the original function is in System class if (! class_exists("System")) { - require_once PATH_CORE . "classes" . PATH_SEP . "class.system.php"; + } return System::getSystemConfiguration($globalIniFile, $wsIniFile, $wsName); } - public static function registerSystemClasses() - { - // Propel - self::registerClass("Propel", PATH_THIRDPARTY . "propel" . PATH_SEP . "Propel.php"); - self::registerClass("Creole", PATH_THIRDPARTY . "creole" . PATH_SEP . "Creole.php"); - self::registerClass("Criteria", PATH_THIRDPARTY . "propel" . PATH_SEP . "util" . PATH_SEP . "Criteria.php"); - self::registerClass("BasePeer", PATH_THIRDPARTY . "propel" . PATH_SEP . "util" . PATH_SEP . "BasePeer.php"); - - // Gulliver - self::registerClass("PmSessionHandler", PATH_GULLIVER_HOME . "core/Session/PmSessionHandler.php"); - - self::registerClass("Bootstrap", PATH_GULLIVER . "class.bootstrap.php"); - self::registerClass("Controller", PATH_GULLIVER . "class.controller.php"); - self::registerClass("database_base", PATH_GULLIVER . "class.database_base.php"); - self::registerClass("database", PATH_GULLIVER . "class.database_mssql.php"); - self::registerClass("database", PATH_GULLIVER . "class.database_mysql.php"); - self::registerClass("DataBaseMaintenance", PATH_GULLIVER . "class.dbMaintenance.php"); - self::registerClass("DBConnection", PATH_GULLIVER . "class.dbconnection.php"); - self::registerClass("DBRecordSet", PATH_GULLIVER . "class.dbrecordset.php"); - self::registerClass("DBSession", PATH_GULLIVER . "class.dbsession.php"); - self::registerClass("DBTable", PATH_GULLIVER . "class.dbtable.php"); - self::registerClass("dynaFormHandler", PATH_GULLIVER . "class.dynaformhandler.php"); - self::registerClass("G_Error", PATH_GULLIVER . "class.error.php"); - self::registerClass("filterForm", PATH_GULLIVER . "class.filterForm.php"); - self::registerClass("Form", PATH_GULLIVER . "class.form.php"); - self::registerClass("G", PATH_GULLIVER . "class.g.php"); - self::registerClass("headPublisher", PATH_GULLIVER . "class.headPublisher.php"); - self::registerClass("Helper", PATH_GULLIVER . "class.helper.php"); - self::registerClass("XmlForm_Field_HTML", PATH_GULLIVER . "class.htmlArea.php"); - self::registerClass("HttpProxyController", PATH_GULLIVER . "class.httpProxyController.php"); - self::registerClass("i18n_PO", PATH_GULLIVER . "class.i18n_po.php"); - self::registerClass("InputFilter", PATH_GULLIVER . "class.inputfilter.php"); - self::registerClass("Logger", PATH_GULLIVER . "class.logger.php"); - self::registerClass("mailer", PATH_GULLIVER . "class.mailer.php"); - self::registerClass("Menu", PATH_GULLIVER . "class.menu.php"); - self::registerClass("objectTemplate", PATH_GULLIVER . "class.objectTemplate.php"); - self::registerClass("pagedTable", PATH_GULLIVER . "class.pagedTable.php"); - self::registerClass("PHPSQLParser", PATH_GULLIVER . "class.phpSqlParser.php"); - self::registerClass("PMException", PATH_GULLIVER . "class.pmException.php"); - self::registerClass("Publisher", PATH_GULLIVER . "class.publisher.php"); - self::registerClass("RBAC", PATH_GULLIVER . "class.rbac.php"); - self::registerClass("MonologProvider", PATH_GULLIVER . "class.monologProvider.php"); - self::registerClass("RestClient", PATH_GULLIVER . "class.restClient.php"); - self::registerClass("soapNtlm", PATH_GULLIVER . "class.soapNtlm.php"); - self::registerClass("NTLMSoapClient", PATH_GULLIVER . "class.soapNtlm.php"); - self::registerClass("PMServiceNTLMSoapClient", PATH_GULLIVER . "class.soapNtlm.php"); - self::registerClass("PMServiceProviderNTLMStream", PATH_GULLIVER . "class.soapNtlm.php"); - self::registerClass("Table", PATH_GULLIVER . "class.table.php"); - self::registerClass("TemplatePowerParser", PATH_GULLIVER . "class.templatePower.php"); - self::registerClass("TemplatePower", PATH_GULLIVER . "class.templatePower.php"); - self::registerClass("Tree", PATH_GULLIVER . "class.tree.php"); - self::registerClass("WebResource", PATH_GULLIVER . "class.webResource.php"); - self::registerClass("XmlForm_Field_WYSIWYG_EDITOR", PATH_GULLIVER . "class.wysiwygEditor.php"); - self::registerClass("Xml_Node", PATH_GULLIVER . "class.xmlDocument.php"); - self::registerClass("Xml_document", PATH_GULLIVER . "class.xmlDocument.php"); - self::registerClass("xmlMenu", PATH_GULLIVER . "class.xmlMenu.php"); - self::registerClass("XmlForm_Field_XmlMenu", PATH_GULLIVER . "class.xmlMenu.php"); - self::registerClass("XmlForm_Field", PATH_GULLIVER . "class.xmlform.php"); - self::registerClass("XmlForm_Field_Title", PATH_GULLIVER . "class.xmlform.php"); - self::registerClass("XmlForm_Field_Subtitle", PATH_GULLIVER . "class.xmlform.php"); - self::registerClass("XmlForm_Field_SimpleText", PATH_GULLIVER . "class.xmlform.php"); - self::registerClass("XmlForm_Field_Text", PATH_GULLIVER . "class.xmlform.php"); - self::registerClass("XmlForm_Field_Suggest", PATH_GULLIVER . "class.xmlform.php"); - self::registerClass("XmlForm_Field_Print", PATH_GULLIVER . "class.xmlform.php"); - self::registerClass("XmlForm_Field_Caption", PATH_GULLIVER . "class.xmlform.php"); - self::registerClass("XmlForm_Field_Password", PATH_GULLIVER . "class.xmlform.php"); - self::registerClass("XmlForm_Field_Textarea", PATH_GULLIVER . "class.xmlform.php"); - self::registerClass("XmlForm_Field_Currency", PATH_GULLIVER . "class.xmlform.php"); - self::registerClass("XmlForm_Field_CaptionCurrency", PATH_GULLIVER . "class.xmlform.php"); - self::registerClass("XmlForm_Field_Percentage", PATH_GULLIVER . "class.xmlform.php"); - self::registerClass("XmlForm_Field_CaptionPercentage", PATH_GULLIVER . "class.xmlform.php"); - self::registerClass("XmlForm_Field_Date2", PATH_GULLIVER . "class.xmlform.php"); - self::registerClass("XmlForm_Field_DateView", PATH_GULLIVER . "class.xmlform.php"); - self::registerClass("XmlForm_Field_YesNo", PATH_GULLIVER . "class.xmlform.php"); - self::registerClass("XmlForm_Field_Link", PATH_GULLIVER . "class.xmlform.php"); - self::registerClass("XmlForm_Field_File", PATH_GULLIVER . "class.xmlform.php"); - self::registerClass("XmlForm_Field_Dropdownpt", PATH_GULLIVER . "class.xmlform.php"); - self::registerClass("XmlForm_Field_Checkboxpt", PATH_GULLIVER . "class.xmlform.php"); - self::registerClass("XmlForm_Field_Checkbox", PATH_GULLIVER . "class.xmlform.php"); - self::registerClass("XmlForm_Field_Checkbox2", PATH_GULLIVER . "class.xmlform.php"); - self::registerClass("XmlForm_Field_Button", PATH_GULLIVER . "class.xmlform.php"); - self::registerClass("XmlForm_Field_Reset", PATH_GULLIVER . "class.xmlform.php"); - self::registerClass("XmlForm_Field_Submit", PATH_GULLIVER . "class.xmlform.php"); - self::registerClass("XmlForm_Field_Hidden", PATH_GULLIVER . "class.xmlform.php"); - self::registerClass("XmlForm_Field_Dropdown", PATH_GULLIVER . "class.xmlform.php"); - self::registerClass("XmlForm_Field_Listbox", PATH_GULLIVER . "class.xmlform.php"); - self::registerClass("XmlForm_Field_RadioGroup", PATH_GULLIVER . "class.xmlform.php"); - self::registerClass("XmlForm_Field_RadioGroupView", PATH_GULLIVER . "class.xmlform.php"); - self::registerClass("XmlForm_Field_CheckGroup", PATH_GULLIVER . "class.xmlform.php"); - self::registerClass("XmlForm_Field_CheckGroupView", PATH_GULLIVER . "class.xmlform.php"); - self::registerClass("XmlForm_Field_Grid", PATH_GULLIVER . "class.xmlform.php"); - self::registerClass("XmlForm_Field_JavaScript", PATH_GULLIVER . "class.xmlform.php"); - self::registerClass("XmlForm_Field_Date", PATH_GULLIVER . "class.xmlform.php"); - self::registerClass("XmlForm_Field_Date5", PATH_GULLIVER . "class.xmlform.php"); - self::registerClass("XmlForm_Field_Xmlform", PATH_GULLIVER . "class.xmlform.php"); - self::registerClass("XmlForm", PATH_GULLIVER . "class.xmlform.php"); - self::registerClass("xmlformTemplate", PATH_GULLIVER . "class.xmlform.php"); - self::registerClass("XmlForm_Field_Image", PATH_GULLIVER . "class.xmlform.php"); - self::registerClass("XmlForm_Field_Label", PATH_GULLIVER . "class.xmlformExtension.php"); - self::registerClass("XmlForm_Field_cellMark", PATH_GULLIVER . "class.xmlformExtension.php"); - self::registerClass("XmlForm_Field_DVEditor", PATH_GULLIVER . "class.xmlformExtension.php"); - self::registerClass("XmlForm_Field_FastSearch", PATH_GULLIVER . "class.xmlformExtension.php"); - self::registerClass("xmlformTemplate", PATH_GULLIVER . "class.xmlformTemplate.php"); - - // ProcessMaker classes - self::registerClass("InvalidIndexSearchTextException", PATH_CLASSES . "class.AppSolr.php"); - self::registerClass("ApplicationWithoutDelegationRecordsException", PATH_CLASSES . "class.AppSolr.php"); - self::registerClass("ApplicationWithCorruptDynaformException", PATH_CLASSES . "class.AppSolr.php"); - self::registerClass("ApplicationAPP_DATAUnserializeException", PATH_CLASSES . "class.AppSolr.php"); - self::registerClass("AppSolr", PATH_CLASSES . "class.AppSolr.php"); - self::registerClass("ArrayBasePeer", PATH_CLASSES . "class.ArrayPeer.php"); - self::registerClass("GulliverBasePeer", PATH_CLASSES . "class.BasePeer.php"); - self::registerClass("Installer", PATH_CLASSES . "class.Installer.php"); - self::registerClass("Applications", PATH_CLASSES . "class.applications.php"); - self::registerClass("archive", PATH_CLASSES . "class.archive.php"); - self::registerClass("tar_file", PATH_CLASSES . "class.archive.php"); - self::registerClass("gzip_file", PATH_CLASSES . "class.archive.php"); - self::registerClass("bzip_file", PATH_CLASSES . "class.archive.php"); - self::registerClass("zip_file", PATH_CLASSES . "class.archive.php"); - self::registerClass("calendar", PATH_CLASSES . "class.calendar.php"); - self::registerClass("Cases", PATH_CLASSES . "class.case.php"); - self::registerClass("CLI", PATH_CLASSES . "class.cli.php"); - self::registerClass("Configurations", PATH_CLASSES . "class.configuration.php"); - self::registerClass("dashletOpenVSCompleted", PATH_CLASSES . "class.dashletOpenVSCompleted.php"); - self::registerClass("dashletProcessMakerCommunity", PATH_CLASSES . "class.dashletProcessMakerCommunity.php"); - self::registerClass("dashletProcessMakerEnterprise", PATH_CLASSES . "class.dashletProcessMakerEnterprise.php"); - self::registerClass("dashletRssReader", PATH_CLASSES . "class.dashletRssReader.php"); - self::registerClass("dates", PATH_CLASSES . "class.dates.php"); - self::registerClass("dbConnections", PATH_CLASSES . "class.dbConnections.php"); - self::registerClass("Derivation", PATH_CLASSES . "class.derivation.php"); - self::registerClass("DynaFormField", PATH_CLASSES . "class.dynaFormField.php"); - self::registerClass("dynaformEditor", PATH_CLASSES . "class.dynaformEditor.php"); - self::registerClass("dynaformEditorAjax", PATH_CLASSES . "class.dynaformEditor.php"); - self::registerClass("FieldValidator", PATH_CLASSES . "class.fieldValidator.php"); - self::registerClass("FileCache", PATH_CLASSES . "class.fileCache.php"); - //self::registerClass("GroupUser", PATH_CLASSES . "class.groupUser.php"); -> this have conflicts with model/GroupUser.php - self::registerClass("Groups", PATH_CLASSES . "class.groups.php"); - self::registerClass("JavaBridgePM", PATH_CLASSES . "class.javaBridgePM.php"); - self::registerClass("PMmemcached", PATH_CLASSES . "class.memcached.php"); - self::registerClass("multipleFilesBackup", PATH_CLASSES . "class.multipleFilesBackup.php"); - self::registerClass("NET", PATH_CLASSES . "class.net.php"); - self::registerClass("Stat", PATH_CLASSES . "class.net.php"); - self::registerClass("patch", PATH_CLASSES . "class.patch.php"); - self::registerClass("p11835", PATH_CLASSES . "class.patch.php"); - self::registerClass("PMPlugin", PATH_CLASSES . "class.plugin.php"); - self::registerClass("menuDetail", PATH_CLASSES . "class.plugin.php"); - self::registerClass("toolbarDetail", PATH_CLASSES . "class.plugin.php"); - self::registerClass("cssFile", PATH_CLASSES . "class.plugin.php"); - self::registerClass("triggerDetail", PATH_CLASSES . "class.plugin.php"); - self::registerClass("folderDetail", PATH_CLASSES . "class.plugin.php"); - self::registerClass("stepDetail", PATH_CLASSES . "class.plugin.php"); - self::registerClass("redirectDetail", PATH_CLASSES . "class.plugin.php"); - self::registerClass("folderData", PATH_CLASSES . "class.plugin.php"); - self::registerClass("uploadDocumentData", PATH_CLASSES . "class.plugin.php"); - self::registerClass("loginInfo", PATH_CLASSES . "class.plugin.php"); - self::registerClass("caseSchedulerPlugin", PATH_CLASSES . "class.plugin.php"); - self::registerClass("taskExtendedProperty", PATH_CLASSES . "class.plugin.php"); - self::registerClass("dashboardPage", PATH_CLASSES . "class.plugin.php"); - self::registerClass("cronFile", PATH_CLASSES . "class.plugin.php"); - self::registerClass("pluginDetail", PATH_CLASSES . "class.pluginRegistry.php"); - self::registerClass("PMPluginRegistry", PATH_CLASSES . "class.pluginRegistry.php"); - self::registerClass("featuresDetail", PATH_CLASSES . "class.licensedFeatures.php"); - self::registerClass("PMLicensedFeatures", PATH_CLASSES . "class.licensedFeatures.php"); - self::registerClass("PMDashlet", PATH_CLASSES . "class.pmDashlet.php"); - self::registerClass("pmGauge", PATH_CLASSES . "class.pmGauge.php"); - self::registerClass("pmPhing", PATH_CLASSES . "class.pmPhing.php"); - self::registerClass("PMScript", PATH_CLASSES . "class.pmScript.php"); - self::registerClass("PmTable", PATH_CLASSES . "class.pmTable.php"); - self::registerClass("popupMenu", PATH_CLASSES . "class.popupMenu.php"); - self::registerClass("XmlForm_Field_popupOption", PATH_CLASSES . "class.popupMenu.php"); - self::registerClass("processMap", PATH_CLASSES . "class.processMap.php"); - self::registerClass("Processes", PATH_CLASSES . "class.processes.php"); - self::registerClass("ObjectDocument", PATH_CLASSES . "class.processes.php"); - self::registerClass("ObjectCellection", PATH_CLASSES . "class.processes.php"); - self::registerClass("propelTable", PATH_CLASSES . "class.propelTable.php"); - self::registerClass("replacementLogo", PATH_CLASSES . "class.replacementLogo.php"); - self::registerClass("Report", PATH_CLASSES . "class.report.php"); - self::registerClass("ReportTables", PATH_CLASSES . "class.reportTables.php"); - self::registerClass("BpmnEngine_Services_SearchIndex", PATH_CLASSES . "class.searchIndex.php"); - self::registerClass("serverConf", PATH_CLASSES . "class.serverConfiguration.php"); - self::registerClass("Sessions", PATH_CLASSES . "class.sessions.php"); - self::registerClass("BpmnEngine_SearchIndexAccess_Solr", PATH_CLASSES . "class.solr.php"); - self::registerClass("spoolRun", PATH_CLASSES . "class.spool.php"); - self::registerClass("System", PATH_CLASSES . "class.system.php"); - self::registerClass("Tasks", PATH_CLASSES . "class.tasks.php"); - self::registerClass("ToolBar", PATH_CLASSES . "class.toolBar.php"); - self::registerClass("XmlForm_Field_ToolBar", PATH_CLASSES . "class.toolBar.php"); - self::registerClass("XmlForm_Field_toolButton", PATH_CLASSES . "class.toolBar.php"); - self::registerClass("triggerLibrary", PATH_CLASSES . "class.triggerLibrary.php"); - self::registerClass("ProcessMakerWebDav", PATH_CLASSES . "class.webdav.php"); - self::registerClass("wsBase", PATH_CLASSES . "class.wsBase.php"); - self::registerClass("wsResponse", PATH_CLASSES . "class.wsResponse.php"); - self::registerClass("wsCreateUserResponse", PATH_CLASSES . "class.wsResponse.php"); - self::registerClass("wsCreateGroupResponse", PATH_CLASSES . "class.wsResponse.php"); - self::registerClass("wsCreateDepartmentResponse", PATH_CLASSES . "class.wsResponse.php"); - self::registerClass("wsGetVariableResponse", PATH_CLASSES . "class.wsResponse.php"); - self::registerClass("wsGetCaseNotesResponse", PATH_CLASSES . "class.wsResponse.php"); - self::registerClass("workspaceTools", PATH_CLASSES . "class.wsTools.php"); - self::registerClass("XMLDB", PATH_CLASSES . "class.xmlDb.php"); - self::registerClass("XMLConnection", PATH_CLASSES . "class.xmlDb.php"); - self::registerClass("XMLResult", PATH_CLASSES . "class.xmlDb.php"); - self::registerClass("XmlForm_Field_Image", PATH_CLASSES . "class.xmlfield_Image.php"); - self::registerClass("XmlForm_Field_TextPM", PATH_CLASSES . "class.xmlfield_InputPM.php"); - self::registerClass("XmlForm_Field_TextareaPM", PATH_CLASSES . "class.xmlfield_InputPM.php"); - self::registerClass("XmlForm_Field_hours", PATH_CLASSES . "class.xmlfield_InputPM.php"); - self::registerClass("XmlForm_Field_CheckBoxTable", PATH_CLASSES . "class.xmlfield_InputPM.php"); - } - //below this line, still not approved methods /** @@ -333,7 +96,7 @@ class Bootstrap throw new Exception('System constant (PATH_THIRDPARTY) is not defined!'); } - require_once PATH_THIRDPARTY . 'smarty/libs/Smarty.class.php'; + // file has absolute path if (substr($template, 0, 1) != PATH_SEP) { @@ -344,7 +107,6 @@ class Bootstrap throw new Exception("Template: $template, doesn't exist!"); } - self::LoadSystem('inputfilter'); $filter = new InputFilter(); $smarty = new Smarty (); @@ -365,19 +127,6 @@ class Bootstrap $smarty->display($template); } - /** - * Load Gulliver Classes - * - * @author Fernando Ontiveros Lira - * @access public - * @param string $strClass - * @return void - */ - public static function LoadSystem($strClass) - { - require_once (PATH_GULLIVER . 'class.' . $strClass . '.php'); - } - /** * Get the temporal directory path on differents O.S. * i.e. /temp -> linux, C:/Temp -> win @@ -460,7 +209,6 @@ class Bootstrap */ public function streamFile($file, $download = false, $downloadFileName = '', $forceLoad = false) { - G::LoadSystem('inputfilter'); $filter = new InputFilter(); $file = $filter->xssFilterHard($file); $downloadFileName = $filter->xssFilterHard($downloadFileName); @@ -669,53 +417,6 @@ class Bootstrap return $content; } - /** - * If the class is not defined by the aplication, it - * attempt to load the class from gulliver.system - * - * @author Fernando Ontiveros Lira , David S. Callizaya - * @access public - * @param string $strClass - * @return void - */ - public static function LoadClass($strClass) - { - self::LoadSystem('inputfilter'); - $filter = new InputFilter(); - - $path = PATH_GULLIVER . 'class.' . $strClass . '.php'; - $path = $filter->validateInput($path, "path"); - - $classfile = Bootstrap::ExpandPath("classes") . 'class.' . $strClass . '.php'; - $classfile = $filter->validateInput($classfile, "path"); - - if (!file_exists($classfile)) { - if (file_exists($path)) { - return require_once ($path); - } else { - return false; - } - } else { - return require_once ($classfile); - } - } - - /** - * Loads a Class. - * If the class is not defined by the aplication, it - * attempt to load the class from gulliver.system - * - * @author Fernando Ontiveros Lira , David S. Callizaya - * @access public - * @param string $strClass - * @return void - */ - public static function LoadThirdParty($sPath, $sFile) - { - $classfile = PATH_THIRDPARTY . $sPath . '/' . $sFile . ((substr($sFile, 0, - 4) !== '.php') ? '.php' : ''); - return require_once ($classfile); - } - /** * Function LoadTranslationObject * It generates a global Translation variable that will be used in all the @@ -948,7 +649,7 @@ class Bootstrap // Include also the extendGulliverClass that could have some // new definitions for fields if (file_exists($possiblePath . 'classes' . PATH_SEP . 'class.extendGulliver.php')) { - include_once $possiblePath . 'classes' . PATH_SEP . 'class.extendGulliver.php'; + } } } @@ -1175,7 +876,7 @@ class Bootstrap if (((in_array($browserName, $enabledBrowsers)) || (in_array('ALL', $enabledBrowsers))) && (!(in_array($browserName, $disabledBrowsers)))) { if ($cssFileInfo['__ATTRIBUTES__']['file'] == 'rtl.css') { - Bootstrap::LoadClass('serverConfiguration'); + $oServerConf = & serverConf::getSingleton(); if (!(defined('SYS_LANG'))) { if (isset($_SERVER['HTTP_REFERER'])) { @@ -1287,7 +988,6 @@ class Bootstrap */ public function getCheckSum($files) { - Bootstrap::LoadClass('system'); $key = System::getVersion(); if (!is_array($files)) { @@ -1458,7 +1158,7 @@ class Bootstrap if (function_exists('json_encode')) { return json_encode($Json); } else { - Bootstrap::LoadThirdParty('pear/json', 'class.json'); + $oJSON = new Services_JSON(); return $oJSON->encode($Json); } @@ -1474,7 +1174,7 @@ class Bootstrap if (function_exists('json_decode')) { return json_decode($Json); } else { - Bootstrap::LoadThirdParty('pear/json', 'class.json'); + $oJSON = new Services_JSON(); return $oJSON->decode($Json); } @@ -2253,17 +1953,6 @@ class Bootstrap return $result; } - /** - * - * @param unknown_type $model - * @return unknown - */ - public function getModel($model) - { - require_once "classes/model/$model.php"; - return new $model(); - } - /** * Create an encrypted unique identifier based on $id and the selected scope id. * @@ -2400,8 +2089,6 @@ class Bootstrap switch ($params->option) { case "STORED SESSION": if (isset($params->SID)) { - Bootstrap::LoadClass("sessions"); - $oSessions = new Sessions($params->SID); $sysCon = array_merge($sysCon, $oSessions->getGlobals()); } @@ -2745,39 +2432,6 @@ class Bootstrap return strtoupper(PHP_OS) == "LINUX"; } - public static function initVendors() - { - if (! is_dir(PATH_TRUNK . 'vendor')) { - if (file_exists(PATH_TRUNK . 'composer.phar')) { - throw new Exception( - "ERROR: Verdors are missing!" . PHP_EOL . - "Please execute the following command to install vendors:" .PHP_EOL.PHP_EOL. - "$>php composer.phar install" - ); - } else { - throw new Exception( - "ERROR: Verdors are missing!" . PHP_EOL . - "Please execute the following commands to prepare/install vendors:" .PHP_EOL.PHP_EOL. - "$>curl -sS https://getcomposer.org/installer | php" . PHP_EOL . - "$>php composer.phar install" - ); - } - } - - if (! file_exists(PATH_TRUNK . 'vendor' . PATH_SEP . "autoload.php")) { - throw new Exception( - "ERROR: Problems with Verdors!" . PHP_EOL . - "Please execute the following command to repare vendors:" .PHP_EOL.PHP_EOL. - "$>php composer.phar update" - ); - } - - //require_once PATH_TRUNK . 'vendor' . PATH_SEP . "autoload.php"; - - $loader = require PATH_TRUNK . 'vendor' . PATH_SEP . "autoload.php"; - $loader->add('', PATH_HOME . 'engine/src/'); - } - public static function parseIniFile($filename) { $data = @parse_ini_file($filename, true); @@ -2824,7 +2478,6 @@ class Bootstrap public static function getPasswordHashConfig() { - G::LoadClass('configuration'); $config= new Configurations(); $passwordHashConfig = $config->getConfiguration('ENTERPRISE_SETTING_ENCRYPT', ''); if (!is_null($passwordHashConfig)) { @@ -2855,7 +2508,6 @@ class Bootstrap $hashType = Bootstrap::getPasswordHashType(); } - G::LoadSystem('inputfilter'); $filter = new InputFilter(); $hashType = $filter->validateInput($hashType); $pass = $filter->validateInput($pass); diff --git a/gulliver/system/class.database_mysql.php b/gulliver/system/class.database_mysql.php index 7be77f7d3..022333547 100644 --- a/gulliver/system/class.database_mysql.php +++ b/gulliver/system/class.database_mysql.php @@ -31,7 +31,7 @@ * */ -G::LoadSystem( 'database_base' ); + class database extends database_base { @@ -207,16 +207,12 @@ class database extends database_base } } if (isset( $aParameters['AutoIncrement'] ) && $aParameters['AutoIncrement']) { - $sSQL .= ' AUTO_INCREMENT'; + $sSQL .= ' AUTO_INCREMENT PRIMARY KEY'; } - if (isset( $aParameters['PrimaryKey'] ) && $aParameters['PrimaryKey']) { - $sSQL .= ' PRIMARY KEY'; - } - if (isset( $aParameters['Unique'] ) && $aParameters['Unique']) { - $sSQL .= ' UNIQUE'; - } - - //we need to check the property AI + /*if ($aParameters['Key'] == 'PRI') { + $sKeys .= 'ALTER TABLE ' . $this->sQuoteCharacter . $sTable . $this->sQuoteCharacter . + ' ADD PRIMARY KEY (' . $this->sQuoteCharacter . $sColumn . $this->sQuoteCharacter . ')' . $this->sEndLine; + }*/ if (isset( $aParameters['AI'] )) { if ($aParameters['AI'] == 1) { $sSQL .= ' AUTO_INCREMENT'; @@ -909,7 +905,6 @@ class database extends database_base */ public function reportTableExist () { - G::LoadSystem('inputfilter'); $filter = new InputFilter(); $DB_NAME = $filter->validateInput(DB_NAME); $bExists = true; diff --git a/gulliver/system/class.dbMaintenance.php b/gulliver/system/class.dbMaintenance.php index b9b1c8664..496fd6e1c 100644 --- a/gulliver/system/class.dbMaintenance.php +++ b/gulliver/system/class.dbMaintenance.php @@ -49,7 +49,6 @@ class DataBaseMaintenance protected $tmpDir; protected $outfile; protected $infile; - protected $isWindows; /** * __construct @@ -65,7 +64,7 @@ class DataBaseMaintenance $this->tmpDir = './'; $this->link = null; $this->dbName = null; - $this->isWindows = strtoupper(substr(PHP_OS, 0, 3)) === 'WIN'; + if (isset( $host ) && isset( $user ) && isset( $passwd )) { $this->host = $host; $this->user = $user; @@ -400,88 +399,32 @@ class DataBaseMaintenance */ function backupDataBase ($outfile) { - $password = escapeshellarg($this->passwd); - - //On Windows, escapeshellarg() instead replaces percent signs, exclamation - //marks (delayed variable substitution) and double quotes with spaces and - //adds double quotes around the string. - //See: http://php.net/manual/en/function.escapeshellarg.php - if ($this->isWindows) { - $password = $this->escapeshellargCustom($this->passwd); - } $aHost = explode(':', $this->host); $dbHost = $aHost[0]; if (isset($aHost[1])) { $dbPort = $aHost[1]; $command = 'mysqldump' - . ' --user=' . $this->user - . ' --password=' . $password - . ' --host=' . $dbHost - . ' --port=' . $dbPort - . ' --opt' - . ' --skip-comments' - . ' ' . $this->dbName - . ' > ' . $outfile; + . ' --user=' . $this->user + . ' --password=' . escapeshellarg($this->passwd) + . ' --host=' . $dbHost + . ' --port=' . $dbPort + . ' --opt' + . ' --skip-comments' + . ' ' . $this->dbName + . ' > ' . $outfile; } else { $command = 'mysqldump' - . ' --host=' . $dbHost - . ' --user=' . $this->user - . ' --opt' - . ' --skip-comments' - . ' --password=' . $password - . ' ' . $this->dbName - . ' > ' . $outfile; + . ' --host=' . $dbHost + . ' --user=' . $this->user + . ' --opt' + . ' --skip-comments' + . ' --password=' . escapeshellarg($this->passwd) + . ' ' . $this->dbName + . ' > ' . $outfile; } shell_exec($command); } - /** - * string escapeshellargCustom ( string $arg , character $quotes) - * - * escapeshellarg() adds single quotes around a string and quotes/escapes any - * existing single quotes allowing you to pass a string directly to a shell - * function and having it be treated as a single safe argument. This function - * should be used to escape individual arguments to shell functions coming - * from user input. The shell functions include exec(), system() and the - * backtick operator. - * - * On Windows, escapeshellarg() instead replaces percent signs, exclamation - * marks (delayed variable substitution) and double quotes with spaces and - * adds double quotes around the string. - */ - private function escapeshellargCustom($string, $quotes = "") - { - if ($quotes === "") { - $quotes = $this->isWindows ? "\"" : "'"; - } - $n = strlen($string); - $special = ["!", "%", "\""]; - $substring = ""; - $result1 = []; - $result2 = []; - for ($i = 0; $i < $n; $i++) { - if (in_array($string[$i], $special, true)) { - $result2[] = $string[$i]; - $result1[] = $substring; - $substring = ""; - } else { - $substring = $substring . $string[$i]; - } - } - $result1[] = $substring; - //Rebuild the password string - $n = count($result1); - for ($i = 0; $i < $n; $i++) { - $result1[$i] = trim(escapeshellarg($result1[$i]), $quotes); - if (isset($result2[$i])) { - $result1[$i] = $result1[$i] . $result2[$i]; - } - } - //add simple quotes, see escapeshellarg function - $newString = $quotes . implode("", $result1) . $quotes; - return $newString; - } - /** * restoreFromSql * diff --git a/gulliver/system/class.dbconnection.php b/gulliver/system/class.dbconnection.php index 8204350af..0f4b2968c 100644 --- a/gulliver/system/class.dbconnection.php +++ b/gulliver/system/class.dbconnection.php @@ -186,7 +186,7 @@ class DBConnection { global $_SESSION; global $_SERVER; - G::LoadSystem('inputfilter'); + $filter = new InputFilter(); $_SERVER = $filter->xssFilterHard($_SERVER); $_SESSION = $filter->xssFilterHard($_SESSION); diff --git a/gulliver/system/class.g.php b/gulliver/system/class.g.php index 8b6f7545d..ccdc5dbc1 100644 --- a/gulliver/system/class.g.php +++ b/gulliver/system/class.g.php @@ -96,7 +96,7 @@ class G * @param string $symbol * @return string */ - public function generate_password($length = 15, $availableSets = "luns", $symbol = "_-$!") + public function generate_password($length = 15, $availableSets = "luns", $symbol = "_-+=!@#$%*&,.") { $chars = ""; if (strpos($availableSets, "l") !== false) { @@ -536,37 +536,6 @@ class G return $res; } - /** - * Load Gulliver Classes - * - * @author Fernando Ontiveros Lira - * @access public - * @param string $strClass - * @return void - */ - public static function LoadSystem ($strClass) - { - $path = PATH_GULLIVER . 'class.' . $strClass . '.php'; - if(file_exists(PATH_GULLIVER . 'class.inputfilter.php')) { - require_once (PATH_GULLIVER . 'class.inputfilter.php'); - $filter = new InputFilter(); - $path = $filter->validateInput($path, 'path'); - } else { - if(!file_exists($path)) { - $path = ''; - } - } - require_once ($path); - } - - public function LoadSystemExist ($strClass) - { - if (file_exists( PATH_GULLIVER . 'class.' . $strClass . '.php' )) { - return true; - } else { - return false; - } - } /** * Render Page @@ -648,48 +617,6 @@ class G } - /** - * Include javascript files - * - * @author Fernando Ontiveros Lira - * @access public - * @param string $strInclude - * @return void - */ - public function LoadInclude ($strInclude) - { - $incfile = G::ExpandPath( "includes" ) . 'inc.' . $strInclude . '.php'; - if (! file_exists( $incfile )) { - $incfile = PATH_GULLIVER_HOME . 'includes' . PATH_SEP . 'inc.' . $strInclude . '.php'; - } - - if (file_exists( $incfile )) { - require_once ($incfile); - return true; - } else { - return false; - } - } - - /** - * Include all model files - * - * @author Fernando Ontiveros Lira - * @access public - * @param string $strInclude - * @return void - */ - public function LoadAllModelClasses () - { - $baseDir = PATH_CORE . 'classes' . PATH_SEP . 'model'; - if ($handle = opendir( $baseDir )) { - while (false !== ($file = readdir( $handle ))) { - if (strpos( $file, '.php', 1 ) && ! strpos( $file, 'Peer.php', 1 )) { - require_once ($baseDir . PATH_SEP . $file); - } - } - } - } /** * Include all model plugin files @@ -719,10 +646,7 @@ class G } } } - //Include also the extendGulliverClass that could have some new definitions for fields - if (file_exists( $possiblePath . 'classes' . PATH_SEP . 'class.extendGulliver.php' )) { - include_once $possiblePath . 'classes' . PATH_SEP . 'class.extendGulliver.php'; - } + } } } @@ -758,59 +682,6 @@ class G } } - /** - * public function LoadClassRBAC - * - * @author David S. Callizaya S. - * @access public - * @param eter string strClass - * @return string - */ - public function LoadClassRBAC ($strClass) - { - $classfile = PATH_RBAC . "class.$strClass" . '.php'; - require_once ($classfile); - } - - /** - * If the class is not defined by the aplication, it - * attempt to load the class from gulliver.system - * - * @author Fernando Ontiveros Lira , David S. Callizaya - * @access public - * @param string $strClass - * @return void - */ - public static function LoadClass ($strClass) - { - $classfile = G::ExpandPath( "classes" ) . 'class.' . $strClass . '.php'; - if (! file_exists( $classfile )) { - if (file_exists( PATH_GULLIVER . 'class.' . $strClass . '.php' )) { - return require_once (PATH_GULLIVER . 'class.' . $strClass . '.php'); - } else { - return false; - } - } else { - return require_once ($classfile); - } - } - - /** - * Loads a Class. - * If the class is not defined by the aplication, it - * attempt to load the class from gulliver.system - * - * @author Fernando Ontiveros Lira , David S. Callizaya - * @access public - * @param string $strClass - * @return void - */ - public static function LoadThirdParty($sPath, $sFile) - { - $classfile = PATH_THIRDPARTY . $sPath . '/' . $sFile . ((substr( $sFile, 0, - 4 ) !== '.php') ? '.php' : ''); - return require_once ($classfile); - } - /** * Encrypt URL * @@ -1073,7 +944,6 @@ class G if (((in_array($browserName, $enabledBrowsers)) || (in_array('ALL', $enabledBrowsers)))&&(!(in_array($browserName, $disabledBrowsers)))) { if ($cssFileInfo['__ATTRIBUTES__']['file'] == 'rtl.css') { - G::LoadClass('serverConfiguration'); $oServerConf =& serverConf::getSingleton(); if (!(defined('SYS_LANG'))) { if (isset($_SERVER['HTTP_REFERER'])) { @@ -1161,7 +1031,7 @@ class G */ public static function streamFile ($file, $download = false, $downloadFileName = '') { - G::LoadSystem('inputfilter'); + $filter = new InputFilter(); $file = $filter->xssFilterHard($file); if(isset($_SERVER['REQUEST_URI'])) { @@ -1864,14 +1734,6 @@ class G $arrayGrid = array_unique($arrayGrid); - //Given the set: 'valueOne', 'valueOneTwo', where the second string - //contains the first string, this causes the larger string to take - //the second, resulting in a delimitation error, to avoid this problem - //we first search the string larger size. - usort($arrayGrid, function($a, $b) { - return strlen($b) - strlen($a); - }); - foreach ($arrayGrid as $index => $value) { if($value !== "") { $grdName = $value; @@ -2603,7 +2465,7 @@ class G */ public function gotDirectoryStructureVer2() { - G::LoadClass( "configuration" ); + $configuration = new Configurations(); if (defined('SYS_SYS') && $configuration->exists("ENVIRONMENT_SETTINGS")) { return ($configuration->getDirectoryStructureVer() > 1); @@ -2763,7 +2625,7 @@ class G } } - G::LoadSystem('inputfilter'); + $filter = new InputFilter(); $file = $filter->validateInput($file, "path"); $path = $filter->validateInput($path, "path"); @@ -2834,7 +2696,7 @@ class G $outputFn( $image_p, $saveTo ); if(!is_null($saveTo)) { - G::LoadSystem('inputfilter'); + $filter = new InputFilter(); $saveTo = $filter->validateInput($saveTo, "path"); } @@ -2958,16 +2820,6 @@ class G { return (bool) preg_match( '/^[0-9A-Za-z]{14,}/', $uid ); } - - /** - * Verify if the input string is a valid UID of size 32 - * @param string $uid - * @return boolean - */ - public static function verifyUniqueID32($uid) - { - return (bool) preg_match('/^[0-9A-Za-z]{32,32}$/', $uid); - } /** * is_utf8 @@ -2978,10 +2830,11 @@ class G */ public function is_utf8 ($string) { - if (preg_match('//u', $string)) { - return true; + if (is_array( $string )) { + $enc = implode( '', $string ); + return @! ((ord( $enc[0] ) != 239) && (ord( $enc[1] ) != 187) && (ord( $enc[2] ) != 191)); } else { - return false; + return (utf8_encode( utf8_decode( $string ) ) == $string); } } @@ -3038,8 +2891,6 @@ class G switch ($params->option) { case "STORED SESSION": if (isset($params->SID)) { - G::LoadClass("sessions"); - $oSessions = new Sessions($params->SID); $sysCon = array_merge($sysCon, $oSessions->getGlobals()); } @@ -3263,7 +3114,8 @@ class G */ public function evalJScript ($c) { - /*G::LoadSystem('inputfilter'); + /* + $filter = new InputFilter(); $c = $filter->xssFilterHard($c);*/ print ('') ; @@ -3469,7 +3321,7 @@ class G if ( function_exists('json_encode') ) { return json_encode($Json); } else { - G::LoadThirdParty('pear/json', 'class.json'); + $oJSON = new Services_JSON(); return $oJSON->encode($Json); } @@ -3485,7 +3337,7 @@ class G if (function_exists('json_decode')) { return json_decode($Json, $assoc); } else { - G::LoadThirdParty('pear/json', 'class.json'); + $oJSON = new Services_JSON(); return $oJSON->decode($Json); } @@ -3523,8 +3375,7 @@ class G public function sendMail ($from, $fromName, $address, $subject, $body) { // require_once "classes/class.pmFunctions.php"; - G::LoadClass("pmFunctions"); - G::LoadThirdParty('phpmailer', 'class.phpmailer'); + $setup = getEmailConfiguration(); if ($setup['MESS_RAUTH'] == false || (is_string($setup['MESS_RAUTH']) && $setup['MESS_RAUTH'] == 'false')) { $setup['MESS_RAUTH'] = 0; @@ -3754,7 +3605,7 @@ class G //public function getModel($model) //{ - // require_once "classes/model/$model.php"; + // return new $model(); //} @@ -4700,7 +4551,6 @@ class G */ public function getCheckSum ($files) { - G::LoadClass( 'system' ); $key = System::getVersion(); if (! is_array( $files )) { @@ -4868,7 +4718,6 @@ class G throw new Exception( 'System constant (PATH_THIRDPARTY) is not defined!' ); } - require_once PATH_THIRDPARTY . 'smarty/libs/Smarty.class.php'; $fInfo = pathinfo( $template ); $tplExists = true; @@ -5443,7 +5292,7 @@ class G */ public function sanitizeInput($data, $tagsArray = array(), $attrArray = array(), $tagsMethod = 0, $attrMethod = 0, $xssAuto = 1) { - G::LoadSystem('inputfilter'); + $filtro = new InputFilter($tagsArray , $attrArray, $tagsMethod, $attrMethod, $xssAuto); return $filtro->process($data); } @@ -5459,7 +5308,7 @@ class G public static function log($message, $pathData = PATH_DATA, $file = 'cron.log') { $config = System::getSystemConfiguration(); - G::LoadSystem('logger'); + $oLogger = Logger::getSingleton($pathData, PATH_SEP, $file); $oLogger->limitFile = $config['number_log_file']; @@ -5468,39 +5317,21 @@ class G } /** - * This function save history about some actions in the file audit.log - * The data is used in the Audit Log functionality - * - * @param string $actionToLog - * @param string $valueToLog - * @return void - */ + */ public static function auditLog($actionToLog, $valueToLog = "") { - $workspace = defined('SYS_SYS') ? SYS_SYS : 'Wokspace Undefined'; + $workspace = defined('SYS_SYS') ? SYS_SYS : 'Wokspace Undefined'; $conf = new Configurations(); $sflag = $conf->getConfiguration('AUDIT_LOG', 'log'); $sflagAudit = $sflag == 'true' ? true : false; $ipClient = G::getIpAddress(); - $userUid = 'Unknow User'; - $fullName = '-'; /*----------------------------------********---------------------------------*/ $licensedFeatures = PMLicensedFeatures::getSingleton(); if ($sflagAudit && $licensedFeatures->verifyfeature('vtSeHNhT0JnSmo1bTluUVlTYUxUbUFSVStEeXVqc1pEUG5EeXc0MGd2Q3ErYz0=')) { - if (isset($_SESSION['USER_LOGGED']) && $_SESSION['USER_LOGGED'] != '') { - $userUid = $_SESSION['USER_LOGGED']; - } else { - //Get the usrUid related to the accessToken - $userUid = \ProcessMaker\Services\OAuth2\Server::getUserId(); - if (!empty($userUid)) { - $oUserLogged = new \Users(); - $user = $oUserLogged->loadDetails($userUid); - $fullName = $user['USR_FULLNAME']; - } - } - $fullName = isset($_SESSION['USR_FULLNAME']) && $_SESSION['USR_FULLNAME'] != '' ? $_SESSION['USR_FULLNAME'] : $fullName; - G::log("|". $workspace ."|". $ipClient ."|". $userUid . "|" . $fullName ."|" . $actionToLog . "|" . $valueToLog, PATH_DATA, "audit.log"); + $username = isset($_SESSION['USER_LOGGED']) && $_SESSION['USER_LOGGED'] != '' ? $_SESSION['USER_LOGGED'] : 'Unknow User'; + $fullname = isset($_SESSION['USR_FULLNAME']) && $_SESSION['USR_FULLNAME'] != '' ? $_SESSION['USR_FULLNAME'] : '-'; + G::log("|". $workspace ."|". $ipClient ."|". $username . "|" . $fullname ."|" . $actionToLog . "|" . $valueToLog, PATH_DATA, "audit.log"); } /*----------------------------------********---------------------------------*/ } @@ -5845,36 +5676,36 @@ class G } /** - * Add log of execution of triggers - * @param $data - * @param string $stringError - * @param string $typeTriggerError - * @param int $executionTime + * Direct case link mobile + * @access public + * + * @param string + * @param int + * + * @return string */ - public static function logTriggerExecution($data, $sError = 'NO-ERROR', $typeError = '', $executionTime = 0) + public static function caseLinkMobile($applicationUid, $delIndex = 0) { - if ((!empty($data['_CODE_']) || $typeError == 'FATAL_ERROR') && isset($data['_DATA_TRIGGER_']) && - !isset($data['_DATA_TRIGGER_']['_TRI_LOG_']) - ) { - $lg = Bootstrap::getDefaultContextLog(); - $lg['TRI_TITLE'] = isset($data['_DATA_TRIGGER_']['TRI_TITLE']) ? $data['_DATA_TRIGGER_']['TRI_TITLE'] : ''; - $lg['TRI_UID'] = isset($data['_DATA_TRIGGER_']['TRI_UID']) ? $data['_DATA_TRIGGER_']['TRI_UID'] : ''; - $lg['TRI_CODE'] = isset($data['_DATA_TRIGGER_']['TRI_WEBBOT']) ? $data['_DATA_TRIGGER_']['TRI_WEBBOT'] : ''; - $lg['TRI_EXECUTION_TIME'] = $executionTime; - $lg['TRI_MSG_ERROR'] = $sError; - $lg['APP_UID'] = isset($data['APPLICATION']) ? $data['APPLICATION'] : ''; - $lg['PRO_UID'] = isset($data['PROCESS']) ? $data['PROCESS'] : ''; - $lg['TAS_UID'] = isset($data['TASK']) ? $data['TASK'] : ''; - $lg['USR_UID'] = isset($data['USER_LOGGED']) ? $data['USER_LOGGED'] : ''; + $application = ApplicationPeer::retrieveByPK($applicationUid); - Bootstrap::registerMonolog( - (empty($sError)) ? 'TriggerExecution' : 'TriggerExecutionError', - (empty($sError)) ? 200 : 400, - (empty($sError)) ? 'Trigger Execution' : 'Trigger Execution Error', - $lg, $lg['workspace'], 'processmaker.log'); - - $_SESSION['_DATA_TRIGGER_']['_TRI_LOG_'] = true; + if (is_null($application) || !is_numeric($delIndex) || $delIndex < 0) { + return false; } + + if ($delIndex != 0) { + $appDelegation = AppDelegationPeer::retrieveByPK($applicationUid, $delIndex); + + if (is_null($appDelegation)) { + return false; + } + + $uri = 'processmakerMobile://' . $applicationUid . '/' . $delIndex; + } else { + $uri = 'processmakerMobile://' . $applicationUid; + } + + //Return + return $uri; } } diff --git a/gulliver/system/class.headPublisher.php b/gulliver/system/class.headPublisher.php index 49f8909a0..84f2be7fb 100644 --- a/gulliver/system/class.headPublisher.php +++ b/gulliver/system/class.headPublisher.php @@ -542,7 +542,6 @@ class headPublisher $cacheFilename = PATH_C . 'ExtJs' . PATH_SEP . $cacheName . '.js'; if (!file_exists($cacheFilename)) { - require_once (PATH_THIRDPARTY . 'jsmin/jsmin.php'); $content = JSMin::minify(file_get_contents($jsFilename)); file_put_contents($cacheFilename, $content); } @@ -587,7 +586,6 @@ class headPublisher $cacheFilename = PATH_C . 'ExtJs' . PATH_SEP . $jsPluginCacheName . '.js'; if (!file_exists($cacheFilename)) { - require_once (PATH_THIRDPARTY . 'jsmin/jsmin.php'); $content = JSMin::minify(file_get_contents(PATH_PLUGINS . $pluginJsFile)); file_put_contents($cacheFilename, $content); } diff --git a/gulliver/system/class.helper.php b/gulliver/system/class.helper.php index 93f2f6ae4..2995b771c 100644 --- a/gulliver/system/class.helper.php +++ b/gulliver/system/class.helper.php @@ -83,7 +83,7 @@ class Helper public function minify() { if ($this->contentType != 'text/css') { - G::LoadThirdParty('jsmin', 'jsmin'); + $this->content = JSMin::minify($this->content); } } diff --git a/gulliver/system/class.inputfilter.php b/gulliver/system/class.inputfilter.php index 285c6d080..60cbfe689 100644 --- a/gulliver/system/class.inputfilter.php +++ b/gulliver/system/class.inputfilter.php @@ -418,7 +418,6 @@ class InputFilter */ function xssFilterHard($input, $type = "") { - require_once (PATH_THIRDPARTY . 'HTMLPurifier/HTMLPurifier.auto.php'); $config = HTMLPurifier_Config::createDefault(); $purifier = new HTMLPurifier($config); if(is_array($input)) { diff --git a/gulliver/system/class.mailer.php b/gulliver/system/class.mailer.php index c2685a5ae..1cf760acf 100644 --- a/gulliver/system/class.mailer.php +++ b/gulliver/system/class.mailer.php @@ -24,7 +24,7 @@ * Coral Gables, FL, 33134, USA, or email info@colosa.com. * */ -G::LoadThirdParty( 'phpmailer', 'class.phpmailer' ); + /* Send emails using the class "PHPMailer" * Email server configuration constants: * MAIL_MAILER mail/smtp diff --git a/gulliver/system/class.menu.php b/gulliver/system/class.menu.php index e539f2417..82ce5fa03 100644 --- a/gulliver/system/class.menu.php +++ b/gulliver/system/class.menu.php @@ -283,7 +283,7 @@ class Menu */ public function DisableOptionId($id) { - if (array_search($id, $this->Id) !== FALSE) { + if (array_search($id, $this->Id)) { $this->Enabled[array_search($id, $this->Id)] = 0; } } diff --git a/gulliver/system/class.monologProvider.php b/gulliver/system/class.monologProvider.php index 9840834cb..f0b519211 100644 --- a/gulliver/system/class.monologProvider.php +++ b/gulliver/system/class.monologProvider.php @@ -106,13 +106,11 @@ class MonologProvider break; case 400://ERROR $this->registerLogger->addError($message, $context); - break; case 500://CRITICAL $this->registerLogger->addCritical($message, $context); break; case 550://ALERT $this->registerLogger->addAlert($message, $context); - break; case 600://EMERGENCY $this->registerLogger->addEmergency($message, $context); break; diff --git a/gulliver/system/class.pagedTable.php b/gulliver/system/class.pagedTable.php index 20de73aef..670659643 100644 --- a/gulliver/system/class.pagedTable.php +++ b/gulliver/system/class.pagedTable.php @@ -25,8 +25,6 @@ * */ -G::LoadClass( 'filterForm' ); -G::LoadClass( 'xmlMenu' ); /** * Class pagedTable @@ -778,7 +776,7 @@ class pagedTable */ public function renderTable ($block = '') { - G::LoadSystem('inputfilter'); + $filter = new InputFilter(); $this->orderBy = $filter->xssFilterHard($this->orderBy); $this->currentPage = $filter->xssFilterHard($this->currentPage); diff --git a/gulliver/system/class.publisher.php b/gulliver/system/class.publisher.php index e398cba52..275a976d7 100644 --- a/gulliver/system/class.publisher.php +++ b/gulliver/system/class.publisher.php @@ -289,7 +289,7 @@ class Publisher */ if ($this->publishType == 'dynaform') { if (isset($_SESSION['CURRENT_DYN_UID']) || isset($_SESSION['CONDITION_DYN_UID'])) { - require_once "classes/model/FieldCondition.php"; + $oFieldCondition = new FieldCondition(); //This dynaform has show/hide field conditions @@ -333,7 +333,7 @@ class Publisher $_SESSION[$G_FORM->id] = $G_FORM->values; } - G::LoadSystem( 'pagedTable' ); + $oTable = new pagedTable(); $oTable->template = 'templates/' . $Part['Template'] . '.html'; $G_FORM->xmlform = ''; @@ -348,7 +348,6 @@ class Publisher $oTable->ajaxServer = $Part['ajaxServer']; } /* Start Block: Load user configuration for the pagedTable */ - G::LoadClass( 'configuration' ); $objUID = $Part['File']; $conf = new Configurations(); $conf->loadConfig( $oTable, 'pagedTable', $objUID, '', (isset( $_SESSION['USER_LOGGED'] ) ? $_SESSION['USER_LOGGED'] : ''), '' ); @@ -356,7 +355,6 @@ class Publisher /* End Block */ /* Start Block: PagedTable Right Click */ - G::LoadClass( 'popupMenu' ); $pm = new popupMenu( 'gulliver/pagedTable_PopupMenu' ); $pm->name = $oTable->id; $fields = array_keys( $oTable->fields ); @@ -432,8 +430,6 @@ class Publisher $_SESSION[$G_FORM->id] = $G_FORM->values; } - G::LoadClass( 'propelTable' ); - $oTable = new propelTable(); $oTable->template = $Part['Template']; $oTable->criteria = $Part['Content']; @@ -455,7 +451,7 @@ class Publisher $oTable->setupFromXmlform( $G_FORM ); /* Start Block: Load user configuration for the pagedTable */ - G::LoadClass( 'configuration' ); + $objUID = $Part['File']; $conf = new Configurations( $oTable ); $conf->loadConfig( $oTable, 'pagedTable', $objUID, '', (isset( $_SESSION['USER_LOGGED'] ) ? $_SESSION['USER_LOGGED'] : ''), '' ); @@ -465,7 +461,6 @@ class Publisher /* End Block */ /* Start Block: PagedTable Right Click */ - G::LoadClass( 'popupMenu' ); $pm = new popupMenu( 'gulliver/pagedTable_PopupMenu' ); $sc = $pm->renderPopup( $oTable->id, $oTable->fields ); /* End Block */ @@ -491,7 +486,7 @@ class Publisher global $mainPanelScript; global $panelName; global $tabCount; - //G::LoadThirdParty( 'pear/json', 'class.json' ); + //$json = new Services_JSON(); $tabCount = 0; $panelName = $Part['Template']; @@ -551,7 +546,7 @@ class Publisher case 'varform': global $G_FORM; $G_FORM = new Form(); - G::LoadSystem( "varform" ); + $xml = new varForm(); //$xml->parseFile ( ); $xml->renderForm( $G_FORM, $Part['File'] ); @@ -595,7 +590,7 @@ class Publisher break; case 'template': //To do: Please check it 26/06/07 if (gettype( $Part['Data'] ) == 'array') { - G::LoadSystem( 'template' ); //template phpBB + //template phpBB $template = new Template(); $template->set_filenames( array ('body' => $Part['Template'] . '.html' ) ); $dataArray = $Part['Data']; diff --git a/gulliver/system/class.rbac.php b/gulliver/system/class.rbac.php index 2b0b6a5fc..30ecd002b 100644 --- a/gulliver/system/class.rbac.php +++ b/gulliver/system/class.rbac.php @@ -70,84 +70,9 @@ class RBAC public $singleSignOn = false; private static $instance = null; - public $authorizedActions = array(); public function __construct () { - $this->authorizedActions = array( - 'users_Ajax.php' => array( - 'availableUsers' => array('PM_FACTORY'), - 'assign' => array('PM_FACTORY'), - 'changeView' => array(), - 'ofToAssign' => array('PM_FACTORY'), - 'usersGroup' => array('PM_FACTORY'), - 'canDeleteUser' => array('PM_USERS'), - 'deleteUser' => array('PM_USERS'), - 'changeUserStatus' => array('PM_USERS'), - 'availableGroups' => array('PM_USERS'), - 'assignedGroups' => array('PM_USERS'), - 'assignGroupsToUserMultiple' => array('PM_USERS'), - 'deleteGroupsToUserMultiple' => array('PM_USERS'), - 'authSources' => array('PM_USERS'), - 'loadAuthSourceByUID' => array('PM_USERS'), - 'updateAuthServices' => array('PM_USERS'), - 'usersList' => array('PM_USERS'), - 'updatePageSize' => array(), - 'summaryUserData' => array('PM_USERS'), - 'verifyIfUserAssignedAsSupervisor' => array('PM_USERS') - ), - 'skin_Ajax.php' => array( - 'updatePageSize' => array(), - 'skinList' => array('PM_SETUP_SKIN'), - 'newSkin' => array('PM_SETUP_SKIN'), - 'importSkin' => array('PM_SETUP_SKIN'), - 'exportSkin' => array('PM_SETUP_SKIN'), - 'deleteSkin' => array('PM_SETUP_SKIN'), - 'streamSkin' => array('PM_SETUP_SKIN'), - 'addTarFolder' => array('PM_SETUP_SKIN'), - 'copy_skin_folder' => array('PM_SETUP_SKIN') - ), - 'processes_DownloadFile.php' => array( - 'downloadFileHash' => array('PM_FACTORY') - ), - 'processProxy.php' => array( - 'categoriesList' => array(), - 'getCategoriesList' => array(), - 'saveProcess' => array('PM_FACTORY'), - 'changeStatus' => array(), - 'changeDebugMode' => array(), - 'getUsers' => array(), - 'getGroups' => array(), - 'assignActorsTask' => array(), - 'removeActorsTask' => array(), - 'getActorsTask' => array(), - 'getProcessDetail' => array(), - 'getProperties' => array(), - 'saveProperties' => array(), - 'getCaledarList' => array(), - 'getPMVariables' => array(), - 'generateBpmn' => array() - ), - 'home.php' => array( - 'login' => array('PM_LOGIN'), - 'index' => array('PM_CASES'), - 'indexSingle' => array('PM_CASES'), - 'appList' => array('PM_CASES'), - 'appAdvancedSearch' => array('PM_ALLCASES'), - 'getApps' => array('PM_ALLCASES'), - 'getAppsData' => array('PM_ALLCASES'), - 'startCase' => array('PM_CASES'), - 'error' => array(), - 'getUserArray' => array('PM_ALLCASES'), - 'getCategoryArray' => array('PM_ALLCASES'), - 'getAllUsersArray' => array('PM_ALLCASES'), - 'getStatusArray' => array('PM_ALLCASES'), - 'getProcessArray' => array('PM_ALLCASES'), - 'getProcesses' => array('PM_ALLCASES'), - 'getUsers' => array('PM_ALLCASES') - ) - - ); } /** @@ -173,37 +98,37 @@ class RBAC public function initRBAC () { if (is_null( $this->userObj )) { - require_once ("classes/model/RbacUsers.php"); + $this->userObj = new RbacUsers(); } if (is_null( $this->systemObj )) { - require_once ("classes/model/Systems.php"); + $this->systemObj = new Systems(); } if (is_null( $this->usersRolesObj )) { - require_once ("classes/model/UsersRoles.php"); + $this->usersRolesObj = new UsersRoles(); } if (is_null( $this->rolesObj )) { - require_once ("classes/model/Roles.php"); + $this->rolesObj = new Roles(); } if (is_null( $this->permissionsObj )) { - require_once ("classes/model/Permissions.php"); + $this->permissionsObj = new Permissions(); } if (is_null( $this->rolesPermissionsObj )) { - require_once ("classes/model/RolesPermissions.php"); + $this->rolesPermissionsObj = new RolesPermissions(); } if (is_null( $this->authSourcesObj )) { - require_once 'classes/model/AuthenticationSource.php'; + $this->authSourcesObj = new AuthenticationSource(); } //hook for RBAC plugins @@ -222,7 +147,6 @@ class RBAC } } if (!in_array('ldapAdvanced', $this->aRbacPlugins)) { - G::LoadClass('ldapAdvanced'); if (class_exists('ldapAdvanced')) { $this->aRbacPlugins[] = 'ldapAdvanced'; } @@ -358,8 +282,6 @@ class RBAC "PER_NAME" => "Edit User profile Default Cases Menu Options" ), array("PER_UID" => "00000000000000000000000000000064", "PER_CODE" => "PM_REASSIGNCASE_SUPERVISOR", "PER_NAME" => "Reassign case supervisor" - ), array("PER_UID" => "00000000000000000000000000000065", "PER_CODE" => "PM_SETUP_CUSTOM_CASES_LIST", - "PER_NAME" => "Setup Custom Cases List" ) ); return $permissionsAdmin; @@ -502,9 +424,7 @@ class RBAC public function VerifyLogin ($strUser, $strPass) { /*----------------------------------********---------------------------------*/ - if (!class_exists('pmLicenseManager')) { - G::LoadClass('pmLicenseManager'); - } + $licenseManager =& pmLicenseManager::getSingleton(); if (in_array(G::encryptOld($licenseManager->result), array('38afd7ae34bd5e3e6fc170d8b09178a3', 'ba2b45bdc11e2a4a6e86aab2ac693cbb'))) { return -7; @@ -1520,36 +1440,5 @@ class RBAC } } } - /** - * This function verify if the user allows to the file with a specific action - * If the action is not defined in the authorizedActions we give the allow - * @param string $file - * @param string $action - * - * @return void - */ - public function allows($file, $action) - { - $access = false; - if (isset($this->authorizedActions[$file][$action])) { - $permissions = $this->authorizedActions[$file][$action]; - $totalPermissions = count($permissions); - $countAccess = 0; - foreach ($permissions as $key => $value) { - if ($this->userCanAccess($value) == 1) { - $countAccess++; - } - } - //Check if the user has all permissions that needed - if ($countAccess == $totalPermissions) { - $access = true; - } - } - - if (!$access) { - G::header('Location: /errors/error403.php'); - die(); - } - } } diff --git a/gulliver/system/class.soapNtlm.php b/gulliver/system/class.soapNtlm.php index 913848ff1..988568c75 100644 --- a/gulliver/system/class.soapNtlm.php +++ b/gulliver/system/class.soapNtlm.php @@ -184,7 +184,7 @@ class soapNtlm */ private function createBuffer ($path) { - G::LoadSystem('inputfilter'); + $filter = new InputFilter(); $path = $filter->xssFilterHard($path, "url"); if ($this->buffer) { diff --git a/gulliver/system/class.tree.php b/gulliver/system/class.tree.php index 81be8ff5c..14a1ced8d 100644 --- a/gulliver/system/class.tree.php +++ b/gulliver/system/class.tree.php @@ -30,7 +30,7 @@ * * @package gulliver.system */ -G::LoadSystem('objectTemplate'); + class Tree extends Xml_Node { diff --git a/gulliver/system/class.webResource.php b/gulliver/system/class.webResource.php index 973fc4afb..f8bcae563 100644 --- a/gulliver/system/class.webResource.php +++ b/gulliver/system/class.webResource.php @@ -68,7 +68,7 @@ class WebResource } $paramsRef = implode( ',', $paramsRef ); - G::LoadSystem('inputfilter'); + $filter = new InputFilter(); $post['function'] = $filter->validateInput($post['function']); $paramsRef = $filter->validateInput($paramsRef); @@ -89,7 +89,7 @@ class WebResource */ function _encode () { - G::LoadSystem('inputfilter'); + $filter = new InputFilter(); header( 'Content-Type: text/json' ); $methods = get_class_methods( get_class( $this ) ); @@ -122,7 +122,7 @@ class WebResource /* end class WebResource */ /*if (! function_exists( 'json_encode' )) { - G::LoadThirdParty( 'pear/json', 'class.json' ); + function json_encode (&$value) { @@ -132,7 +132,7 @@ class WebResource } if (! function_exists( 'json_decode' )) { - G::LoadThirdParty( 'pear/json', 'class.json' ); + function json_decode (&$value) { diff --git a/gulliver/system/class.xmlDocument.php b/gulliver/system/class.xmlDocument.php index 6c8ac1704..40e57bde3 100644 --- a/gulliver/system/class.xmlDocument.php +++ b/gulliver/system/class.xmlDocument.php @@ -255,7 +255,7 @@ class Xml_Node * @package gulliver.system * @access public */ -class Xml_document extends Xml_Node +class Xml_Document extends Xml_Node { public $currentNode; @@ -266,7 +266,7 @@ class Xml_document extends Xml_Node * @access public * @return string */ - public function Xml_document () + public function Xml_Document () { $this->currentNode = &$this; } diff --git a/gulliver/system/class.xmlform.php b/gulliver/system/class.xmlform.php index 4d7cc0805..76577cb11 100644 --- a/gulliver/system/class.xmlform.php +++ b/gulliver/system/class.xmlform.php @@ -733,7 +733,7 @@ class XmlForm_Field if (isset( $oOwner->fields[$this->pmconnection] )) { if (defined( 'PATH_CORE' )) { if (file_exists( PATH_CORE . 'classes' . PATH_SEP . 'model' . PATH_SEP . 'AdditionalTables.php' )) { - require_once PATH_CORE . 'classes' . PATH_SEP . 'model' . PATH_SEP . 'AdditionalTables.php'; + $oAdditionalTables = new AdditionalTables(); try { $aData = $oAdditionalTables->load( $oOwner->fields[$this->pmconnection]->pmtable, true ); @@ -758,7 +758,6 @@ class XmlForm_Field // check if a case are running in order to prevent that preview is // erroneous rendered. if (isset( $_SESSION['APPLICATION'] )) { - G::LoadClass( 'case' ); $oApp = new Cases(); if ($oApp->loadCase( $_SESSION['APPLICATION'] ) != null) { $aFields = $oApp->loadCase( $_SESSION['APPLICATION'] ); @@ -1367,7 +1366,7 @@ class XmlForm_Field_Suggest extends XmlForm_Field_SimpleText //by neyek $formVariableValue = ''; $formVariableKeyValue = ''; - G::LoadClass( 'case' ); + $oApp = new Cases(); if (isset( $_SESSION['APPLICATION'] ) && ($_SESSION['APPLICATION'] != null && $oApp->loadCase( $_SESSION['APPLICATION'] ) != null)) { $aFields = $oApp->loadCase( $_SESSION['APPLICATION'] ); @@ -1571,7 +1570,7 @@ class XmlForm_Field_Suggest extends XmlForm_Field_SimpleText //by neyek $formVariableValue = ''; $formVariableKeyValue = ''; - G::LoadClass( 'case' ); + $oApp = new Cases(); if (isset( $_SESSION['APPLICATION'] ) && ($_SESSION['APPLICATION'] != null && $oApp->loadCase( $_SESSION['APPLICATION'] ) != null)) { $aFields = $oApp->loadCase( $_SESSION['APPLICATION'] ); @@ -2986,8 +2985,8 @@ class XmlForm_Field_File extends XmlForm_Field } if (isset( $_SESSION["APPLICATION"] ) && isset( $_SESSION["USER_LOGGED"] ) && isset( $_SESSION["TASK"] ) && isset( $this->input ) && $this->input != null && $this->mode == "view") { - require_once ("classes/model/AppDocument.php"); - G::LoadClass( "case" ); + + $case = new Cases(); $arrayField = $case->loadCase( $_SESSION["APPLICATION"] ); @@ -3039,7 +3038,7 @@ class XmlForm_Field_File extends XmlForm_Field $inpDocMaxFilesize = ""; if (isset($this->input) && $this->input != null) { - require_once ("classes" . PATH_SEP . "model" . PATH_SEP . "InputDocument.php"); + try { $inputDocument = new InputDocument(); diff --git a/gulliver/thirdparty/pear/archive_tar/.gitignore b/gulliver/thirdparty/pear/archive_tar/.gitignore new file mode 100644 index 000000000..12262da27 --- /dev/null +++ b/gulliver/thirdparty/pear/archive_tar/.gitignore @@ -0,0 +1,6 @@ +# composer related +composer.lock +composer.phar +vendor +# IDE +.idea diff --git a/gulliver/thirdparty/pear/archive_tar/.travis.sh b/gulliver/thirdparty/pear/archive_tar/.travis.sh new file mode 100644 index 000000000..02c2010c5 --- /dev/null +++ b/gulliver/thirdparty/pear/archive_tar/.travis.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +composer validate +cd tests +pear run-tests diff --git a/gulliver/thirdparty/pear/archive_tar/.travis.yml b/gulliver/thirdparty/pear/archive_tar/.travis.yml new file mode 100644 index 000000000..44b7111b9 --- /dev/null +++ b/gulliver/thirdparty/pear/archive_tar/.travis.yml @@ -0,0 +1,15 @@ +sudo: false +language: php +php: + - 5.2 + - 5.3 + - 5.4 + - 5.5 + - 5.6 + - 7 + - hhvm +matrix: + fast_finish: true + allow_failures: + - php: hhvm +script: ./.travis.sh diff --git a/gulliver/thirdparty/pear/archive_tar/Archive/Tar.php b/gulliver/thirdparty/pear/archive_tar/Archive/Tar.php new file mode 100644 index 000000000..0bd1c6caa --- /dev/null +++ b/gulliver/thirdparty/pear/archive_tar/Archive/Tar.php @@ -0,0 +1,2421 @@ + + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * @category File_Formats + * @package Archive_Tar + * @author Vincent Blavet + * @copyright 1997-2010 The Authors + * @license http://www.opensource.org/licenses/bsd-license.php New BSD License + * @version CVS: $Id$ + * @link http://pear.php.net/package/Archive_Tar + */ + +// If the PEAR class cannot be loaded via the autoloader, +// then try to require_once it from the PHP include path. +if (!class_exists('PEAR')) { + require_once 'PEAR.php'; +} + +define('ARCHIVE_TAR_ATT_SEPARATOR', 90001); +define('ARCHIVE_TAR_END_BLOCK', pack("a512", '')); + +if (!function_exists('gzopen') && function_exists('gzopen64')) { + function gzopen($filename, $mode, $use_include_path = 0) + { + return gzopen64($filename, $mode, $use_include_path); + } +} + +if (!function_exists('gztell') && function_exists('gztell64')) { + function gztell($zp) + { + return gztell64($zp); + } +} + +if (!function_exists('gzseek') && function_exists('gzseek64')) { + function gzseek($zp, $offset, $whence = SEEK_SET) + { + return gzseek64($zp, $offset, $whence); + } +} + +/** + * Creates a (compressed) Tar archive + * + * @package Archive_Tar + * @author Vincent Blavet + * @license http://www.opensource.org/licenses/bsd-license.php New BSD License + * @version $Revision$ + */ +class Archive_Tar extends PEAR +{ + /** + * @var string Name of the Tar + */ + public $_tarname = ''; + + /** + * @var boolean if true, the Tar file will be gzipped + */ + public $_compress = false; + + /** + * @var string Type of compression : 'none', 'gz', 'bz2' or 'lzma2' + */ + public $_compress_type = 'none'; + + /** + * @var string Explode separator + */ + public $_separator = ' '; + + /** + * @var file descriptor + */ + public $_file = 0; + + /** + * @var string Local Tar name of a remote Tar (http:// or ftp://) + */ + public $_temp_tarname = ''; + + /** + * @var string regular expression for ignoring files or directories + */ + public $_ignore_regexp = ''; + + /** + * @var object PEAR_Error object + */ + public $error_object = null; + + /** + * Format for data extraction + * + * @var string + */ + public $_fmt =''; + /** + * Archive_Tar Class constructor. This flavour of the constructor only + * declare a new Archive_Tar object, identifying it by the name of the + * tar file. + * If the compress argument is set the tar will be read or created as a + * gzip or bz2 compressed TAR file. + * + * @param string $p_tarname The name of the tar archive to create + * @param string $p_compress can be null, 'gz', 'bz2' or 'lzma2'. This + * parameter indicates if gzip, bz2 or lzma2 compression + * is required. For compatibility reason the + * boolean value 'true' means 'gz'. + * + * @return bool + */ + public function __construct($p_tarname, $p_compress = null) + { + parent::__construct(); + + $this->_compress = false; + $this->_compress_type = 'none'; + if (($p_compress === null) || ($p_compress == '')) { + if (@file_exists($p_tarname)) { + if ($fp = @fopen($p_tarname, "rb")) { + // look for gzip magic cookie + $data = fread($fp, 2); + fclose($fp); + if ($data == "\37\213") { + $this->_compress = true; + $this->_compress_type = 'gz'; + // No sure it's enought for a magic code .... + } elseif ($data == "BZ") { + $this->_compress = true; + $this->_compress_type = 'bz2'; + } elseif (file_get_contents($p_tarname, false, null, 1, 4) == '7zXZ') { + $this->_compress = true; + $this->_compress_type = 'lzma2'; + } + } + } else { + // probably a remote file or some file accessible + // through a stream interface + if (substr($p_tarname, -2) == 'gz') { + $this->_compress = true; + $this->_compress_type = 'gz'; + } elseif ((substr($p_tarname, -3) == 'bz2') || + (substr($p_tarname, -2) == 'bz') + ) { + $this->_compress = true; + $this->_compress_type = 'bz2'; + } else { + if (substr($p_tarname, -2) == 'xz') { + $this->_compress = true; + $this->_compress_type = 'lzma2'; + } + } + } + } else { + if (($p_compress === true) || ($p_compress == 'gz')) { + $this->_compress = true; + $this->_compress_type = 'gz'; + } else { + if ($p_compress == 'bz2') { + $this->_compress = true; + $this->_compress_type = 'bz2'; + } else { + if ($p_compress == 'lzma2') { + $this->_compress = true; + $this->_compress_type = 'lzma2'; + } else { + $this->_error( + "Unsupported compression type '$p_compress'\n" . + "Supported types are 'gz', 'bz2' and 'lzma2'.\n" + ); + return false; + } + } + } + } + $this->_tarname = $p_tarname; + if ($this->_compress) { // assert zlib or bz2 or xz extension support + if ($this->_compress_type == 'gz') { + $extname = 'zlib'; + } else { + if ($this->_compress_type == 'bz2') { + $extname = 'bz2'; + } else { + if ($this->_compress_type == 'lzma2') { + $extname = 'xz'; + } + } + } + + if (!extension_loaded($extname)) { + PEAR::loadExtension($extname); + } + if (!extension_loaded($extname)) { + $this->_error( + "The extension '$extname' couldn't be found.\n" . + "Please make sure your version of PHP was built " . + "with '$extname' support.\n" + ); + return false; + } + } + + + if (version_compare(PHP_VERSION, "5.5.0-dev") < 0) { + $this->_fmt = "a100filename/a8mode/a8uid/a8gid/a12size/a12mtime/" . + "a8checksum/a1typeflag/a100link/a6magic/a2version/" . + "a32uname/a32gname/a8devmajor/a8devminor/a131prefix"; + } else { + $this->_fmt = "Z100filename/Z8mode/Z8uid/Z8gid/Z12size/Z12mtime/" . + "Z8checksum/Z1typeflag/Z100link/Z6magic/Z2version/" . + "Z32uname/Z32gname/Z8devmajor/Z8devminor/Z131prefix"; + } + + + } + + public function __destruct() + { + $this->_close(); + // ----- Look for a local copy to delete + if ($this->_temp_tarname != '') { + @unlink($this->_temp_tarname); + } + } + + /** + * This method creates the archive file and add the files / directories + * that are listed in $p_filelist. + * If a file with the same name exist and is writable, it is replaced + * by the new tar. + * The method return false and a PEAR error text. + * The $p_filelist parameter can be an array of string, each string + * representing a filename or a directory name with their path if + * needed. It can also be a single string with names separated by a + * single blank. + * For each directory added in the archive, the files and + * sub-directories are also added. + * See also createModify() method for more details. + * + * @param array $p_filelist An array of filenames and directory names, or a + * single string with names separated by a single + * blank space. + * + * @return true on success, false on error. + * @see createModify() + */ + public function create($p_filelist) + { + return $this->createModify($p_filelist, '', ''); + } + + /** + * This method add the files / directories that are listed in $p_filelist in + * the archive. If the archive does not exist it is created. + * The method return false and a PEAR error text. + * The files and directories listed are only added at the end of the archive, + * even if a file with the same name is already archived. + * See also createModify() method for more details. + * + * @param array $p_filelist An array of filenames and directory names, or a + * single string with names separated by a single + * blank space. + * + * @return true on success, false on error. + * @see createModify() + * @access public + */ + public function add($p_filelist) + { + return $this->addModify($p_filelist, '', ''); + } + + /** + * @param string $p_path + * @param bool $p_preserve + * @return bool + */ + public function extract($p_path = '', $p_preserve = false) + { + return $this->extractModify($p_path, '', $p_preserve); + } + + /** + * @return array|int + */ + public function listContent() + { + $v_list_detail = array(); + + if ($this->_openRead()) { + if (!$this->_extractList('', $v_list_detail, "list", '', '')) { + unset($v_list_detail); + $v_list_detail = 0; + } + $this->_close(); + } + + return $v_list_detail; + } + + /** + * This method creates the archive file and add the files / directories + * that are listed in $p_filelist. + * If the file already exists and is writable, it is replaced by the + * new tar. It is a create and not an add. If the file exists and is + * read-only or is a directory it is not replaced. The method return + * false and a PEAR error text. + * The $p_filelist parameter can be an array of string, each string + * representing a filename or a directory name with their path if + * needed. It can also be a single string with names separated by a + * single blank. + * The path indicated in $p_remove_dir will be removed from the + * memorized path of each file / directory listed when this path + * exists. By default nothing is removed (empty path '') + * The path indicated in $p_add_dir will be added at the beginning of + * the memorized path of each file / directory listed. However it can + * be set to empty ''. The adding of a path is done after the removing + * of path. + * The path add/remove ability enables the user to prepare an archive + * for extraction in a different path than the origin files are. + * See also addModify() method for file adding properties. + * + * @param array $p_filelist An array of filenames and directory names, + * or a single string with names separated by + * a single blank space. + * @param string $p_add_dir A string which contains a path to be added + * to the memorized path of each element in + * the list. + * @param string $p_remove_dir A string which contains a path to be + * removed from the memorized path of each + * element in the list, when relevant. + * + * @return boolean true on success, false on error. + * @see addModify() + */ + public function createModify($p_filelist, $p_add_dir, $p_remove_dir = '') + { + $v_result = true; + + if (!$this->_openWrite()) { + return false; + } + + if ($p_filelist != '') { + if (is_array($p_filelist)) { + $v_list = $p_filelist; + } elseif (is_string($p_filelist)) { + $v_list = explode($this->_separator, $p_filelist); + } else { + $this->_cleanFile(); + $this->_error('Invalid file list'); + return false; + } + + $v_result = $this->_addList($v_list, $p_add_dir, $p_remove_dir); + } + + if ($v_result) { + $this->_writeFooter(); + $this->_close(); + } else { + $this->_cleanFile(); + } + + return $v_result; + } + + /** + * This method add the files / directories listed in $p_filelist at the + * end of the existing archive. If the archive does not yet exists it + * is created. + * The $p_filelist parameter can be an array of string, each string + * representing a filename or a directory name with their path if + * needed. It can also be a single string with names separated by a + * single blank. + * The path indicated in $p_remove_dir will be removed from the + * memorized path of each file / directory listed when this path + * exists. By default nothing is removed (empty path '') + * The path indicated in $p_add_dir will be added at the beginning of + * the memorized path of each file / directory listed. However it can + * be set to empty ''. The adding of a path is done after the removing + * of path. + * The path add/remove ability enables the user to prepare an archive + * for extraction in a different path than the origin files are. + * If a file/dir is already in the archive it will only be added at the + * end of the archive. There is no update of the existing archived + * file/dir. However while extracting the archive, the last file will + * replace the first one. This results in a none optimization of the + * archive size. + * If a file/dir does not exist the file/dir is ignored. However an + * error text is send to PEAR error. + * If a file/dir is not readable the file/dir is ignored. However an + * error text is send to PEAR error. + * + * @param array $p_filelist An array of filenames and directory + * names, or a single string with names + * separated by a single blank space. + * @param string $p_add_dir A string which contains a path to be + * added to the memorized path of each + * element in the list. + * @param string $p_remove_dir A string which contains a path to be + * removed from the memorized path of + * each element in the list, when + * relevant. + * + * @return true on success, false on error. + */ + public function addModify($p_filelist, $p_add_dir, $p_remove_dir = '') + { + $v_result = true; + + if (!$this->_isArchive()) { + $v_result = $this->createModify( + $p_filelist, + $p_add_dir, + $p_remove_dir + ); + } else { + if (is_array($p_filelist)) { + $v_list = $p_filelist; + } elseif (is_string($p_filelist)) { + $v_list = explode($this->_separator, $p_filelist); + } else { + $this->_error('Invalid file list'); + return false; + } + + $v_result = $this->_append($v_list, $p_add_dir, $p_remove_dir); + } + + return $v_result; + } + + /** + * This method add a single string as a file at the + * end of the existing archive. If the archive does not yet exists it + * is created. + * + * @param string $p_filename A string which contains the full + * filename path that will be associated + * with the string. + * @param string $p_string The content of the file added in + * the archive. + * @param bool|int $p_datetime A custom date/time (unix timestamp) + * for the file (optional). + * @param array $p_params An array of optional params: + * stamp => the datetime (replaces + * datetime above if it exists) + * mode => the permissions on the + * file (600 by default) + * type => is this a link? See the + * tar specification for details. + * (default = regular file) + * uid => the user ID of the file + * (default = 0 = root) + * gid => the group ID of the file + * (default = 0 = root) + * + * @return true on success, false on error. + */ + public function addString($p_filename, $p_string, $p_datetime = false, $p_params = array()) + { + $p_stamp = @$p_params["stamp"] ? $p_params["stamp"] : ($p_datetime ? $p_datetime : time()); + $p_mode = @$p_params["mode"] ? $p_params["mode"] : 0600; + $p_type = @$p_params["type"] ? $p_params["type"] : ""; + $p_uid = @$p_params["uid"] ? $p_params["uid"] : ""; + $p_gid = @$p_params["gid"] ? $p_params["gid"] : ""; + $v_result = true; + + if (!$this->_isArchive()) { + if (!$this->_openWrite()) { + return false; + } + $this->_close(); + } + + if (!$this->_openAppend()) { + return false; + } + + // Need to check the get back to the temporary file ? .... + $v_result = $this->_addString($p_filename, $p_string, $p_datetime, $p_params); + + $this->_writeFooter(); + + $this->_close(); + + return $v_result; + } + + /** + * This method extract all the content of the archive in the directory + * indicated by $p_path. When relevant the memorized path of the + * files/dir can be modified by removing the $p_remove_path path at the + * beginning of the file/dir path. + * While extracting a file, if the directory path does not exists it is + * created. + * While extracting a file, if the file already exists it is replaced + * without looking for last modification date. + * While extracting a file, if the file already exists and is write + * protected, the extraction is aborted. + * While extracting a file, if a directory with the same name already + * exists, the extraction is aborted. + * While extracting a directory, if a file with the same name already + * exists, the extraction is aborted. + * While extracting a file/directory if the destination directory exist + * and is write protected, or does not exist but can not be created, + * the extraction is aborted. + * If after extraction an extracted file does not show the correct + * stored file size, the extraction is aborted. + * When the extraction is aborted, a PEAR error text is set and false + * is returned. However the result can be a partial extraction that may + * need to be manually cleaned. + * + * @param string $p_path The path of the directory where the + * files/dir need to by extracted. + * @param string $p_remove_path Part of the memorized path that can be + * removed if present at the beginning of + * the file/dir path. + * @param boolean $p_preserve Preserve user/group ownership of files + * + * @return boolean true on success, false on error. + * @see extractList() + */ + public function extractModify($p_path, $p_remove_path, $p_preserve = false) + { + $v_result = true; + $v_list_detail = array(); + + if ($v_result = $this->_openRead()) { + $v_result = $this->_extractList( + $p_path, + $v_list_detail, + "complete", + 0, + $p_remove_path, + $p_preserve + ); + $this->_close(); + } + + return $v_result; + } + + /** + * This method extract from the archive one file identified by $p_filename. + * The return value is a string with the file content, or NULL on error. + * + * @param string $p_filename The path of the file to extract in a string. + * + * @return a string with the file content or NULL. + */ + public function extractInString($p_filename) + { + if ($this->_openRead()) { + $v_result = $this->_extractInString($p_filename); + $this->_close(); + } else { + $v_result = null; + } + + return $v_result; + } + + /** + * This method extract from the archive only the files indicated in the + * $p_filelist. These files are extracted in the current directory or + * in the directory indicated by the optional $p_path parameter. + * If indicated the $p_remove_path can be used in the same way as it is + * used in extractModify() method. + * + * @param array $p_filelist An array of filenames and directory names, + * or a single string with names separated + * by a single blank space. + * @param string $p_path The path of the directory where the + * files/dir need to by extracted. + * @param string $p_remove_path Part of the memorized path that can be + * removed if present at the beginning of + * the file/dir path. + * @param boolean $p_preserve Preserve user/group ownership of files + * + * @return true on success, false on error. + * @see extractModify() + */ + public function extractList($p_filelist, $p_path = '', $p_remove_path = '', $p_preserve = false) + { + $v_result = true; + $v_list_detail = array(); + + if (is_array($p_filelist)) { + $v_list = $p_filelist; + } elseif (is_string($p_filelist)) { + $v_list = explode($this->_separator, $p_filelist); + } else { + $this->_error('Invalid string list'); + return false; + } + + if ($v_result = $this->_openRead()) { + $v_result = $this->_extractList( + $p_path, + $v_list_detail, + "partial", + $v_list, + $p_remove_path, + $p_preserve + ); + $this->_close(); + } + + return $v_result; + } + + /** + * This method set specific attributes of the archive. It uses a variable + * list of parameters, in the format attribute code + attribute values : + * $arch->setAttribute(ARCHIVE_TAR_ATT_SEPARATOR, ','); + * + * @return true on success, false on error. + */ + public function setAttribute() + { + $v_result = true; + + // ----- Get the number of variable list of arguments + if (($v_size = func_num_args()) == 0) { + return true; + } + + // ----- Get the arguments + $v_att_list = func_get_args(); + + // ----- Read the attributes + $i = 0; + while ($i < $v_size) { + + // ----- Look for next option + switch ($v_att_list[$i]) { + // ----- Look for options that request a string value + case ARCHIVE_TAR_ATT_SEPARATOR : + // ----- Check the number of parameters + if (($i + 1) >= $v_size) { + $this->_error( + 'Invalid number of parameters for ' + . 'attribute ARCHIVE_TAR_ATT_SEPARATOR' + ); + return false; + } + + // ----- Get the value + $this->_separator = $v_att_list[$i + 1]; + $i++; + break; + + default : + $this->_error('Unknown attribute code ' . $v_att_list[$i] . ''); + return false; + } + + // ----- Next attribute + $i++; + } + + return $v_result; + } + + /** + * This method sets the regular expression for ignoring files and directories + * at import, for example: + * $arch->setIgnoreRegexp("#CVS|\.svn#"); + * + * @param string $regexp regular expression defining which files or directories to ignore + */ + public function setIgnoreRegexp($regexp) + { + $this->_ignore_regexp = $regexp; + } + + /** + * This method sets the regular expression for ignoring all files and directories + * matching the filenames in the array list at import, for example: + * $arch->setIgnoreList(array('CVS', '.svn', 'bin/tool')); + * + * @param array $list a list of file or directory names to ignore + * + * @access public + */ + public function setIgnoreList($list) + { + $regexp = str_replace(array('#', '.', '^', '$'), array('\#', '\.', '\^', '\$'), $list); + $regexp = '#/' . join('$|/', $list) . '#'; + $this->setIgnoreRegexp($regexp); + } + + /** + * @param string $p_message + */ + public function _error($p_message) + { + $this->error_object = $this->raiseError($p_message); + } + + /** + * @param string $p_message + */ + public function _warning($p_message) + { + $this->error_object = $this->raiseError($p_message); + } + + /** + * @param string $p_filename + * @return bool + */ + public function _isArchive($p_filename = null) + { + if ($p_filename == null) { + $p_filename = $this->_tarname; + } + clearstatcache(); + return @is_file($p_filename) && !@is_link($p_filename); + } + + /** + * @return bool + */ + public function _openWrite() + { + if ($this->_compress_type == 'gz' && function_exists('gzopen')) { + $this->_file = @gzopen($this->_tarname, "wb9"); + } else { + if ($this->_compress_type == 'bz2' && function_exists('bzopen')) { + $this->_file = @bzopen($this->_tarname, "w"); + } else { + if ($this->_compress_type == 'lzma2' && function_exists('xzopen')) { + $this->_file = @xzopen($this->_tarname, 'w'); + } else { + if ($this->_compress_type == 'none') { + $this->_file = @fopen($this->_tarname, "wb"); + } else { + $this->_error( + 'Unknown or missing compression type (' + . $this->_compress_type . ')' + ); + return false; + } + } + } + } + + if ($this->_file == 0) { + $this->_error( + 'Unable to open in write mode \'' + . $this->_tarname . '\'' + ); + return false; + } + + return true; + } + + /** + * @return bool + */ + public function _openRead() + { + if (strtolower(substr($this->_tarname, 0, 7)) == 'http://') { + + // ----- Look if a local copy need to be done + if ($this->_temp_tarname == '') { + $this->_temp_tarname = uniqid('tar') . '.tmp'; + if (!$v_file_from = @fopen($this->_tarname, 'rb')) { + $this->_error( + 'Unable to open in read mode \'' + . $this->_tarname . '\'' + ); + $this->_temp_tarname = ''; + return false; + } + if (!$v_file_to = @fopen($this->_temp_tarname, 'wb')) { + $this->_error( + 'Unable to open in write mode \'' + . $this->_temp_tarname . '\'' + ); + $this->_temp_tarname = ''; + return false; + } + while ($v_data = @fread($v_file_from, 1024)) { + @fwrite($v_file_to, $v_data); + } + @fclose($v_file_from); + @fclose($v_file_to); + } + + // ----- File to open if the local copy + $v_filename = $this->_temp_tarname; + } else { + // ----- File to open if the normal Tar file + + $v_filename = $this->_tarname; + } + + if ($this->_compress_type == 'gz' && function_exists('gzopen')) { + $this->_file = @gzopen($v_filename, "rb"); + } else { + if ($this->_compress_type == 'bz2' && function_exists('bzopen')) { + $this->_file = @bzopen($v_filename, "r"); + } else { + if ($this->_compress_type == 'lzma2' && function_exists('xzopen')) { + $this->_file = @xzopen($v_filename, "r"); + } else { + if ($this->_compress_type == 'none') { + $this->_file = @fopen($v_filename, "rb"); + } else { + $this->_error( + 'Unknown or missing compression type (' + . $this->_compress_type . ')' + ); + return false; + } + } + } + } + + if ($this->_file == 0) { + $this->_error('Unable to open in read mode \'' . $v_filename . '\''); + return false; + } + + return true; + } + + /** + * @return bool + */ + public function _openReadWrite() + { + if ($this->_compress_type == 'gz') { + $this->_file = @gzopen($this->_tarname, "r+b"); + } else { + if ($this->_compress_type == 'bz2') { + $this->_error( + 'Unable to open bz2 in read/write mode \'' + . $this->_tarname . '\' (limitation of bz2 extension)' + ); + return false; + } else { + if ($this->_compress_type == 'lzma2') { + $this->_error( + 'Unable to open lzma2 in read/write mode \'' + . $this->_tarname . '\' (limitation of lzma2 extension)' + ); + return false; + } else { + if ($this->_compress_type == 'none') { + $this->_file = @fopen($this->_tarname, "r+b"); + } else { + $this->_error( + 'Unknown or missing compression type (' + . $this->_compress_type . ')' + ); + return false; + } + } + } + } + + if ($this->_file == 0) { + $this->_error( + 'Unable to open in read/write mode \'' + . $this->_tarname . '\'' + ); + return false; + } + + return true; + } + + /** + * @return bool + */ + public function _close() + { + //if (isset($this->_file)) { + if (is_resource($this->_file)) { + if ($this->_compress_type == 'gz') { + @gzclose($this->_file); + } else { + if ($this->_compress_type == 'bz2') { + @bzclose($this->_file); + } else { + if ($this->_compress_type == 'lzma2') { + @xzclose($this->_file); + } else { + if ($this->_compress_type == 'none') { + @fclose($this->_file); + } else { + $this->_error( + 'Unknown or missing compression type (' + . $this->_compress_type . ')' + ); + } + } + } + } + + $this->_file = 0; + } + + // ----- Look if a local copy need to be erase + // Note that it might be interesting to keep the url for a time : ToDo + if ($this->_temp_tarname != '') { + @unlink($this->_temp_tarname); + $this->_temp_tarname = ''; + } + + return true; + } + + /** + * @return bool + */ + public function _cleanFile() + { + $this->_close(); + + // ----- Look for a local copy + if ($this->_temp_tarname != '') { + // ----- Remove the local copy but not the remote tarname + @unlink($this->_temp_tarname); + $this->_temp_tarname = ''; + } else { + // ----- Remove the local tarname file + @unlink($this->_tarname); + } + $this->_tarname = ''; + + return true; + } + + /** + * @param mixed $p_binary_data + * @param integer $p_len + * @return bool + */ + public function _writeBlock($p_binary_data, $p_len = null) + { + if (is_resource($this->_file)) { + if ($p_len === null) { + if ($this->_compress_type == 'gz') { + @gzputs($this->_file, $p_binary_data); + } else { + if ($this->_compress_type == 'bz2') { + @bzwrite($this->_file, $p_binary_data); + } else { + if ($this->_compress_type == 'lzma2') { + @xzwrite($this->_file, $p_binary_data); + } else { + if ($this->_compress_type == 'none') { + @fputs($this->_file, $p_binary_data); + } else { + $this->_error( + 'Unknown or missing compression type (' + . $this->_compress_type . ')' + ); + } + } + } + } + } else { + if ($this->_compress_type == 'gz') { + @gzputs($this->_file, $p_binary_data, $p_len); + } else { + if ($this->_compress_type == 'bz2') { + @bzwrite($this->_file, $p_binary_data, $p_len); + } else { + if ($this->_compress_type == 'lzma2') { + @xzwrite($this->_file, $p_binary_data, $p_len); + } else { + if ($this->_compress_type == 'none') { + @fputs($this->_file, $p_binary_data, $p_len); + } else { + $this->_error( + 'Unknown or missing compression type (' + . $this->_compress_type . ')' + ); + } + } + } + } + } + } + return true; + } + + /** + * @return null|string + */ + public function _readBlock() + { + $v_block = null; + if (is_resource($this->_file)) { + if ($this->_compress_type == 'gz') { + $v_block = @gzread($this->_file, 512); + } else { + if ($this->_compress_type == 'bz2') { + $v_block = @bzread($this->_file, 512); + } else { + if ($this->_compress_type == 'lzma2') { + $v_block = @xzread($this->_file, 512); + } else { + if ($this->_compress_type == 'none') { + $v_block = @fread($this->_file, 512); + } else { + $this->_error( + 'Unknown or missing compression type (' + . $this->_compress_type . ')' + ); + } + } + } + } + } + return $v_block; + } + + /** + * @param null $p_len + * @return bool + */ + public function _jumpBlock($p_len = null) + { + if (is_resource($this->_file)) { + if ($p_len === null) { + $p_len = 1; + } + + if ($this->_compress_type == 'gz') { + @gzseek($this->_file, gztell($this->_file) + ($p_len * 512)); + } else { + if ($this->_compress_type == 'bz2') { + // ----- Replace missing bztell() and bzseek() + for ($i = 0; $i < $p_len; $i++) { + $this->_readBlock(); + } + } else { + if ($this->_compress_type == 'lzma2') { + // ----- Replace missing xztell() and xzseek() + for ($i = 0; $i < $p_len; $i++) { + $this->_readBlock(); + } + } else { + if ($this->_compress_type == 'none') { + @fseek($this->_file, $p_len * 512, SEEK_CUR); + } else { + $this->_error( + 'Unknown or missing compression type (' + . $this->_compress_type . ')' + ); + } + } + } + } + } + return true; + } + + /** + * @return bool + */ + public function _writeFooter() + { + if (is_resource($this->_file)) { + // ----- Write the last 0 filled block for end of archive + $v_binary_data = pack('a1024', ''); + $this->_writeBlock($v_binary_data); + } + return true; + } + + /** + * @param array $p_list + * @param string $p_add_dir + * @param string $p_remove_dir + * @return bool + */ + public function _addList($p_list, $p_add_dir, $p_remove_dir) + { + $v_result = true; + $v_header = array(); + + // ----- Remove potential windows directory separator + $p_add_dir = $this->_translateWinPath($p_add_dir); + $p_remove_dir = $this->_translateWinPath($p_remove_dir, false); + + if (!$this->_file) { + $this->_error('Invalid file descriptor'); + return false; + } + + if (sizeof($p_list) == 0) { + return true; + } + + foreach ($p_list as $v_filename) { + if (!$v_result) { + break; + } + + // ----- Skip the current tar name + if ($v_filename == $this->_tarname) { + continue; + } + + if ($v_filename == '') { + continue; + } + + // ----- ignore files and directories matching the ignore regular expression + if ($this->_ignore_regexp && preg_match($this->_ignore_regexp, '/' . $v_filename)) { + $this->_warning("File '$v_filename' ignored"); + continue; + } + + if (!file_exists($v_filename) && !is_link($v_filename)) { + $this->_warning("File '$v_filename' does not exist"); + continue; + } + + // ----- Add the file or directory header + if (!$this->_addFile($v_filename, $v_header, $p_add_dir, $p_remove_dir)) { + return false; + } + + if (@is_dir($v_filename) && !@is_link($v_filename)) { + if (!($p_hdir = opendir($v_filename))) { + $this->_warning("Directory '$v_filename' can not be read"); + continue; + } + while (false !== ($p_hitem = readdir($p_hdir))) { + if (($p_hitem != '.') && ($p_hitem != '..')) { + if ($v_filename != ".") { + $p_temp_list[0] = $v_filename . '/' . $p_hitem; + } else { + $p_temp_list[0] = $p_hitem; + } + + $v_result = $this->_addList( + $p_temp_list, + $p_add_dir, + $p_remove_dir + ); + } + } + + unset($p_temp_list); + unset($p_hdir); + unset($p_hitem); + } + } + + return $v_result; + } + + /** + * @param string $p_filename + * @param mixed $p_header + * @param string $p_add_dir + * @param string $p_remove_dir + * @param null $v_stored_filename + * @return bool + */ + public function _addFile($p_filename, &$p_header, $p_add_dir, $p_remove_dir, $v_stored_filename = null) + { + if (!$this->_file) { + $this->_error('Invalid file descriptor'); + return false; + } + + if ($p_filename == '') { + $this->_error('Invalid file name'); + return false; + } + + if (is_null($v_stored_filename)) { + // ----- Calculate the stored filename + $p_filename = $this->_translateWinPath($p_filename, false); + $v_stored_filename = $p_filename; + + if (strcmp($p_filename, $p_remove_dir) == 0) { + return true; + } + + if ($p_remove_dir != '') { + if (substr($p_remove_dir, -1) != '/') { + $p_remove_dir .= '/'; + } + + if (substr($p_filename, 0, strlen($p_remove_dir)) == $p_remove_dir) { + $v_stored_filename = substr($p_filename, strlen($p_remove_dir)); + } + } + + $v_stored_filename = $this->_translateWinPath($v_stored_filename); + 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; + } + } + + $v_stored_filename = $this->_pathReduction($v_stored_filename); + } + + if ($this->_isArchive($p_filename)) { + if (($v_file = @fopen($p_filename, "rb")) == 0) { + $this->_warning( + "Unable to open file '" . $p_filename + . "' in binary read mode" + ); + return true; + } + + if (!$this->_writeHeader($p_filename, $v_stored_filename)) { + return false; + } + + while (($v_buffer = fread($v_file, 512)) != '') { + $v_binary_data = pack("a512", "$v_buffer"); + $this->_writeBlock($v_binary_data); + } + + fclose($v_file); + } else { + // ----- Only header for dir + if (!$this->_writeHeader($p_filename, $v_stored_filename)) { + return false; + } + } + + return true; + } + + /** + * @param string $p_filename + * @param string $p_string + * @param bool $p_datetime + * @param array $p_params + * @return bool + */ + public function _addString($p_filename, $p_string, $p_datetime = false, $p_params = array()) + { + $p_stamp = @$p_params["stamp"] ? $p_params["stamp"] : ($p_datetime ? $p_datetime : time()); + $p_mode = @$p_params["mode"] ? $p_params["mode"] : 0600; + $p_type = @$p_params["type"] ? $p_params["type"] : ""; + $p_uid = @$p_params["uid"] ? $p_params["uid"] : 0; + $p_gid = @$p_params["gid"] ? $p_params["gid"] : 0; + if (!$this->_file) { + $this->_error('Invalid file descriptor'); + return false; + } + + if ($p_filename == '') { + $this->_error('Invalid file name'); + return false; + } + + // ----- Calculate the stored filename + $p_filename = $this->_translateWinPath($p_filename, false); + + // ----- If datetime is not specified, set current time + if ($p_datetime === false) { + $p_datetime = time(); + } + + if (!$this->_writeHeaderBlock( + $p_filename, + strlen($p_string), + $p_stamp, + $p_mode, + $p_type, + $p_uid, + $p_gid + ) + ) { + return false; + } + + $i = 0; + while (($v_buffer = substr($p_string, (($i++) * 512), 512)) != '') { + $v_binary_data = pack("a512", $v_buffer); + $this->_writeBlock($v_binary_data); + } + + return true; + } + + /** + * @param string $p_filename + * @param string $p_stored_filename + * @return bool + */ + public function _writeHeader($p_filename, $p_stored_filename) + { + if ($p_stored_filename == '') { + $p_stored_filename = $p_filename; + } + $v_reduce_filename = $this->_pathReduction($p_stored_filename); + + if (strlen($v_reduce_filename) > 99) { + if (!$this->_writeLongHeader($v_reduce_filename)) { + return false; + } + } + + $v_info = lstat($p_filename); + $v_uid = sprintf("%07s", DecOct($v_info[4])); + $v_gid = sprintf("%07s", DecOct($v_info[5])); + $v_perms = sprintf("%07s", DecOct($v_info['mode'] & 000777)); + + $v_mtime = sprintf("%011s", DecOct($v_info['mtime'])); + + $v_linkname = ''; + + if (@is_link($p_filename)) { + $v_typeflag = '2'; + $v_linkname = readlink($p_filename); + $v_size = sprintf("%011s", DecOct(0)); + } elseif (@is_dir($p_filename)) { + $v_typeflag = "5"; + $v_size = sprintf("%011s", DecOct(0)); + } else { + $v_typeflag = '0'; + clearstatcache(); + $v_size = sprintf("%011s", DecOct($v_info['size'])); + } + + $v_magic = 'ustar '; + + $v_version = ' '; + + if (function_exists('posix_getpwuid')) { + $userinfo = posix_getpwuid($v_info[4]); + $groupinfo = posix_getgrgid($v_info[5]); + + $v_uname = $userinfo['name']; + $v_gname = $groupinfo['name']; + } else { + $v_uname = ''; + $v_gname = ''; + } + + $v_devmajor = ''; + + $v_devminor = ''; + + $v_prefix = ''; + + $v_binary_data_first = pack( + "a100a8a8a8a12a12", + $v_reduce_filename, + $v_perms, + $v_uid, + $v_gid, + $v_size, + $v_mtime + ); + $v_binary_data_last = pack( + "a1a100a6a2a32a32a8a8a155a12", + $v_typeflag, + $v_linkname, + $v_magic, + $v_version, + $v_uname, + $v_gname, + $v_devmajor, + $v_devminor, + $v_prefix, + '' + ); + + // ----- Calculate the checksum + $v_checksum = 0; + // ..... First part of the header + for ($i = 0; $i < 148; $i++) { + $v_checksum += ord(substr($v_binary_data_first, $i, 1)); + } + // ..... Ignore the checksum value and replace it by ' ' (space) + for ($i = 148; $i < 156; $i++) { + $v_checksum += ord(' '); + } + // ..... Last part of the header + for ($i = 156, $j = 0; $i < 512; $i++, $j++) { + $v_checksum += ord(substr($v_binary_data_last, $j, 1)); + } + + // ----- Write the first 148 bytes of the header in the archive + $this->_writeBlock($v_binary_data_first, 148); + + // ----- Write the calculated checksum + $v_checksum = sprintf("%06s ", DecOct($v_checksum)); + $v_binary_data = pack("a8", $v_checksum); + $this->_writeBlock($v_binary_data, 8); + + // ----- Write the last 356 bytes of the header in the archive + $this->_writeBlock($v_binary_data_last, 356); + + return true; + } + + /** + * @param string $p_filename + * @param int $p_size + * @param int $p_mtime + * @param int $p_perms + * @param string $p_type + * @param int $p_uid + * @param int $p_gid + * @return bool + */ + public function _writeHeaderBlock( + $p_filename, + $p_size, + $p_mtime = 0, + $p_perms = 0, + $p_type = '', + $p_uid = 0, + $p_gid = 0 + ) { + $p_filename = $this->_pathReduction($p_filename); + + if (strlen($p_filename) > 99) { + if (!$this->_writeLongHeader($p_filename)) { + return false; + } + } + + if ($p_type == "5") { + $v_size = sprintf("%011s", DecOct(0)); + } else { + $v_size = sprintf("%011s", DecOct($p_size)); + } + + $v_uid = sprintf("%07s", DecOct($p_uid)); + $v_gid = sprintf("%07s", DecOct($p_gid)); + $v_perms = sprintf("%07s", DecOct($p_perms & 000777)); + + $v_mtime = sprintf("%11s", DecOct($p_mtime)); + + $v_linkname = ''; + + $v_magic = 'ustar '; + + $v_version = ' '; + + if (function_exists('posix_getpwuid')) { + $userinfo = posix_getpwuid($p_uid); + $groupinfo = posix_getgrgid($p_gid); + + $v_uname = $userinfo['name']; + $v_gname = $groupinfo['name']; + } else { + $v_uname = ''; + $v_gname = ''; + } + + $v_devmajor = ''; + + $v_devminor = ''; + + $v_prefix = ''; + + $v_binary_data_first = pack( + "a100a8a8a8a12A12", + $p_filename, + $v_perms, + $v_uid, + $v_gid, + $v_size, + $v_mtime + ); + $v_binary_data_last = pack( + "a1a100a6a2a32a32a8a8a155a12", + $p_type, + $v_linkname, + $v_magic, + $v_version, + $v_uname, + $v_gname, + $v_devmajor, + $v_devminor, + $v_prefix, + '' + ); + + // ----- Calculate the checksum + $v_checksum = 0; + // ..... First part of the header + for ($i = 0; $i < 148; $i++) { + $v_checksum += ord(substr($v_binary_data_first, $i, 1)); + } + // ..... Ignore the checksum value and replace it by ' ' (space) + for ($i = 148; $i < 156; $i++) { + $v_checksum += ord(' '); + } + // ..... Last part of the header + for ($i = 156, $j = 0; $i < 512; $i++, $j++) { + $v_checksum += ord(substr($v_binary_data_last, $j, 1)); + } + + // ----- Write the first 148 bytes of the header in the archive + $this->_writeBlock($v_binary_data_first, 148); + + // ----- Write the calculated checksum + $v_checksum = sprintf("%06s ", DecOct($v_checksum)); + $v_binary_data = pack("a8", $v_checksum); + $this->_writeBlock($v_binary_data, 8); + + // ----- Write the last 356 bytes of the header in the archive + $this->_writeBlock($v_binary_data_last, 356); + + return true; + } + + /** + * @param string $p_filename + * @return bool + */ + public function _writeLongHeader($p_filename) + { + $v_size = sprintf("%11s ", DecOct(strlen($p_filename))); + + $v_typeflag = 'L'; + + $v_linkname = ''; + + $v_magic = ''; + + $v_version = ''; + + $v_uname = ''; + + $v_gname = ''; + + $v_devmajor = ''; + + $v_devminor = ''; + + $v_prefix = ''; + + $v_binary_data_first = pack( + "a100a8a8a8a12a12", + '././@LongLink', + 0, + 0, + 0, + $v_size, + 0 + ); + $v_binary_data_last = pack( + "a1a100a6a2a32a32a8a8a155a12", + $v_typeflag, + $v_linkname, + $v_magic, + $v_version, + $v_uname, + $v_gname, + $v_devmajor, + $v_devminor, + $v_prefix, + '' + ); + + // ----- Calculate the checksum + $v_checksum = 0; + // ..... First part of the header + for ($i = 0; $i < 148; $i++) { + $v_checksum += ord(substr($v_binary_data_first, $i, 1)); + } + // ..... Ignore the checksum value and replace it by ' ' (space) + for ($i = 148; $i < 156; $i++) { + $v_checksum += ord(' '); + } + // ..... Last part of the header + for ($i = 156, $j = 0; $i < 512; $i++, $j++) { + $v_checksum += ord(substr($v_binary_data_last, $j, 1)); + } + + // ----- Write the first 148 bytes of the header in the archive + $this->_writeBlock($v_binary_data_first, 148); + + // ----- Write the calculated checksum + $v_checksum = sprintf("%06s ", DecOct($v_checksum)); + $v_binary_data = pack("a8", $v_checksum); + $this->_writeBlock($v_binary_data, 8); + + // ----- Write the last 356 bytes of the header in the archive + $this->_writeBlock($v_binary_data_last, 356); + + // ----- Write the filename as content of the block + $i = 0; + while (($v_buffer = substr($p_filename, (($i++) * 512), 512)) != '') { + $v_binary_data = pack("a512", "$v_buffer"); + $this->_writeBlock($v_binary_data); + } + + return true; + } + + /** + * @param mixed $v_binary_data + * @param mixed $v_header + * @return bool + */ + public function _readHeader($v_binary_data, &$v_header) + { + if (strlen($v_binary_data) == 0) { + $v_header['filename'] = ''; + return true; + } + + if (strlen($v_binary_data) != 512) { + $v_header['filename'] = ''; + $this->_error('Invalid block size : ' . strlen($v_binary_data)); + return false; + } + + if (!is_array($v_header)) { + $v_header = array(); + } + // ----- Calculate the checksum + $v_checksum = 0; + // ..... First part of the header + $v_binary_split = str_split($v_binary_data); + $v_checksum += array_sum(array_map('ord', array_slice($v_binary_split, 0, 148))); + $v_checksum += array_sum(array_map('ord', array(' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',))); + $v_checksum += array_sum(array_map('ord', array_slice($v_binary_split, 156, 512))); + + + $v_data = unpack($this->_fmt, $v_binary_data); + + if (strlen($v_data["prefix"]) > 0) { + $v_data["filename"] = "$v_data[prefix]/$v_data[filename]"; + } + + // ----- Extract the checksum + $v_header['checksum'] = OctDec(trim($v_data['checksum'])); + if ($v_header['checksum'] != $v_checksum) { + $v_header['filename'] = ''; + + // ----- Look for last block (empty block) + if (($v_checksum == 256) && ($v_header['checksum'] == 0)) { + return true; + } + + $this->_error( + 'Invalid checksum for file "' . $v_data['filename'] + . '" : ' . $v_checksum . ' calculated, ' + . $v_header['checksum'] . ' expected' + ); + return false; + } + + // ----- Extract the properties + $v_header['filename'] = rtrim($v_data['filename'], "\0"); + if ($this->_maliciousFilename($v_header['filename'])) { + $this->_error( + 'Malicious .tar detected, file "' . $v_header['filename'] . + '" will not install in desired directory tree' + ); + return false; + } + $v_header['mode'] = OctDec(trim($v_data['mode'])); + $v_header['uid'] = OctDec(trim($v_data['uid'])); + $v_header['gid'] = OctDec(trim($v_data['gid'])); + $v_header['size'] = $this->_tarRecToSize($v_data['size']); + $v_header['mtime'] = OctDec(trim($v_data['mtime'])); + if (($v_header['typeflag'] = $v_data['typeflag']) == "5") { + $v_header['size'] = 0; + } + $v_header['link'] = trim($v_data['link']); + /* ----- All these fields are removed form the header because + they do not carry interesting info + $v_header[magic] = trim($v_data[magic]); + $v_header[version] = trim($v_data[version]); + $v_header[uname] = trim($v_data[uname]); + $v_header[gname] = trim($v_data[gname]); + $v_header[devmajor] = trim($v_data[devmajor]); + $v_header[devminor] = trim($v_data[devminor]); + */ + + return true; + } + + /** + * Convert Tar record size to actual size + * + * @param string $tar_size + * @return size of tar record in bytes + */ + private function _tarRecToSize($tar_size) + { + /* + * First byte of size has a special meaning if bit 7 is set. + * + * Bit 7 indicates base-256 encoding if set. + * Bit 6 is the sign bit. + * Bits 5:0 are most significant value bits. + */ + $ch = ord($tar_size[0]); + if ($ch & 0x80) { + // Full 12-bytes record is required. + $rec_str = $tar_size . "\x00"; + + $size = ($ch & 0x40) ? -1 : 0; + $size = ($size << 6) | ($ch & 0x3f); + + for ($num_ch = 1; $num_ch < 12; ++$num_ch) { + $size = ($size * 256) + ord($rec_str[$num_ch]); + } + + return $size; + + } else { + return OctDec(trim($tar_size)); + } + } + + /** + * Detect and report a malicious file name + * + * @param string $file + * + * @return bool + */ + private function _maliciousFilename($file) + { + if (strpos($file, '/../') !== false) { + return true; + } + if (strpos($file, '../') === 0) { + return true; + } + return false; + } + + /** + * @param $v_header + * @return bool + */ + public function _readLongHeader(&$v_header) + { + $v_filename = ''; + $v_filesize = $v_header['size']; + $n = floor($v_header['size'] / 512); + for ($i = 0; $i < $n; $i++) { + $v_content = $this->_readBlock(); + $v_filename .= $v_content; + } + if (($v_header['size'] % 512) != 0) { + $v_content = $this->_readBlock(); + $v_filename .= $v_content; + } + + // ----- Read the next header + $v_binary_data = $this->_readBlock(); + + if (!$this->_readHeader($v_binary_data, $v_header)) { + return false; + } + + $v_filename = rtrim(substr($v_filename, 0, $v_filesize), "\0"); + $v_header['filename'] = $v_filename; + if ($this->_maliciousFilename($v_filename)) { + $this->_error( + 'Malicious .tar detected, file "' . $v_filename . + '" will not install in desired directory tree' + ); + return false; + } + + return true; + } + + /** + * This method extract from the archive one file identified by $p_filename. + * The return value is a string with the file content, or null on error. + * + * @param string $p_filename The path of the file to extract in a string. + * + * @return a string with the file content or null. + */ + private function _extractInString($p_filename) + { + $v_result_str = ""; + + while (strlen($v_binary_data = $this->_readBlock()) != 0) { + if (!$this->_readHeader($v_binary_data, $v_header)) { + return null; + } + + if ($v_header['filename'] == '') { + continue; + } + + // ----- Look for long filename + if ($v_header['typeflag'] == 'L') { + if (!$this->_readLongHeader($v_header)) { + return null; + } + } + + if ($v_header['filename'] == $p_filename) { + if ($v_header['typeflag'] == "5") { + $this->_error( + 'Unable to extract in string a directory ' + . 'entry {' . $v_header['filename'] . '}' + ); + return null; + } else { + $n = floor($v_header['size'] / 512); + for ($i = 0; $i < $n; $i++) { + $v_result_str .= $this->_readBlock(); + } + if (($v_header['size'] % 512) != 0) { + $v_content = $this->_readBlock(); + $v_result_str .= substr( + $v_content, + 0, + ($v_header['size'] % 512) + ); + } + return $v_result_str; + } + } else { + $this->_jumpBlock(ceil(($v_header['size'] / 512))); + } + } + + return null; + } + + /** + * @param string $p_path + * @param string $p_list_detail + * @param string $p_mode + * @param string $p_file_list + * @param string $p_remove_path + * @param bool $p_preserve + * @return bool + */ + public function _extractList( + $p_path, + &$p_list_detail, + $p_mode, + $p_file_list, + $p_remove_path, + $p_preserve = false + ) { + $v_result = true; + $v_nb = 0; + $v_extract_all = true; + $v_listing = false; + + $p_path = $this->_translateWinPath($p_path, false); + if ($p_path == '' || (substr($p_path, 0, 1) != '/' + && substr($p_path, 0, 3) != "../" && !strpos($p_path, ':')) + ) { + $p_path = "./" . $p_path; + } + $p_remove_path = $this->_translateWinPath($p_remove_path); + + // ----- 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); + + switch ($p_mode) { + case "complete" : + $v_extract_all = true; + $v_listing = false; + break; + case "partial" : + $v_extract_all = false; + $v_listing = false; + break; + case "list" : + $v_extract_all = false; + $v_listing = true; + break; + default : + $this->_error('Invalid extract mode (' . $p_mode . ')'); + return false; + } + + clearstatcache(); + + while (strlen($v_binary_data = $this->_readBlock()) != 0) { + $v_extract_file = false; + $v_extraction_stopped = 0; + + if (!$this->_readHeader($v_binary_data, $v_header)) { + return false; + } + + if ($v_header['filename'] == '') { + continue; + } + + // ----- Look for long filename + if ($v_header['typeflag'] == 'L') { + if (!$this->_readLongHeader($v_header)) { + return false; + } + } + + // ignore extended / pax headers + if ($v_header['typeflag'] == 'x' || $v_header['typeflag'] == 'g') { + $this->_jumpBlock(ceil(($v_header['size'] / 512))); + continue; + } + + if ((!$v_extract_all) && (is_array($p_file_list))) { + // ----- By default no unzip if the file is not found + $v_extract_file = false; + + for ($i = 0; $i < sizeof($p_file_list); $i++) { + // ----- Look if it is a directory + if (substr($p_file_list[$i], -1) == '/') { + // ----- Look if the directory is in the filename path + if ((strlen($v_header['filename']) > strlen($p_file_list[$i])) + && (substr($v_header['filename'], 0, strlen($p_file_list[$i])) + == $p_file_list[$i]) + ) { + $v_extract_file = true; + break; + } + } // ----- It is a file, so compare the file names + elseif ($p_file_list[$i] == $v_header['filename']) { + $v_extract_file = true; + break; + } + } + } else { + $v_extract_file = true; + } + + // ----- Look if this file need to be extracted + if (($v_extract_file) && (!$v_listing)) { + if (($p_remove_path != '') + && (substr($v_header['filename'] . '/', 0, $p_remove_path_size) + == $p_remove_path) + ) { + $v_header['filename'] = substr( + $v_header['filename'], + $p_remove_path_size + ); + if ($v_header['filename'] == '') { + continue; + } + } + if (($p_path != './') && ($p_path != '/')) { + while (substr($p_path, -1) == '/') { + $p_path = substr($p_path, 0, strlen($p_path) - 1); + } + + if (substr($v_header['filename'], 0, 1) == '/') { + $v_header['filename'] = $p_path . $v_header['filename']; + } else { + $v_header['filename'] = $p_path . '/' . $v_header['filename']; + } + } + if (file_exists($v_header['filename'])) { + if ((@is_dir($v_header['filename'])) + && ($v_header['typeflag'] == '') + ) { + $this->_error( + 'File ' . $v_header['filename'] + . ' already exists as a directory' + ); + return false; + } + if (($this->_isArchive($v_header['filename'])) + && ($v_header['typeflag'] == "5") + ) { + $this->_error( + 'Directory ' . $v_header['filename'] + . ' already exists as a file' + ); + return false; + } + if (!is_writeable($v_header['filename'])) { + $this->_error( + 'File ' . $v_header['filename'] + . ' already exists and is write protected' + ); + return false; + } + if (filemtime($v_header['filename']) > $v_header['mtime']) { + // To be completed : An error or silent no replace ? + } + } // ----- Check the directory availability and create it if necessary + elseif (($v_result + = $this->_dirCheck( + ($v_header['typeflag'] == "5" + ? $v_header['filename'] + : dirname($v_header['filename'])) + )) != 1 + ) { + $this->_error('Unable to create path for ' . $v_header['filename']); + return false; + } + + if ($v_extract_file) { + if ($v_header['typeflag'] == "5") { + if (!@file_exists($v_header['filename'])) { + if (!@mkdir($v_header['filename'], 0777)) { + $this->_error( + 'Unable to create directory {' + . $v_header['filename'] . '}' + ); + return false; + } + } + } elseif ($v_header['typeflag'] == "2") { + if (@file_exists($v_header['filename'])) { + @unlink($v_header['filename']); + } + if (!@symlink($v_header['link'], $v_header['filename'])) { + $this->_error( + 'Unable to extract symbolic link {' + . $v_header['filename'] . '}' + ); + return false; + } + } else { + if (($v_dest_file = @fopen($v_header['filename'], "wb")) == 0) { + $this->_error( + 'Error while opening {' . $v_header['filename'] + . '} in write binary mode' + ); + return false; + } else { + $n = floor($v_header['size'] / 512); + for ($i = 0; $i < $n; $i++) { + $v_content = $this->_readBlock(); + fwrite($v_dest_file, $v_content, 512); + } + if (($v_header['size'] % 512) != 0) { + $v_content = $this->_readBlock(); + fwrite($v_dest_file, $v_content, ($v_header['size'] % 512)); + } + + @fclose($v_dest_file); + + if ($p_preserve) { + @chown($v_header['filename'], $v_header['uid']); + @chgrp($v_header['filename'], $v_header['gid']); + } + + // ----- Change the file mode, mtime + @touch($v_header['filename'], $v_header['mtime']); + if ($v_header['mode'] & 0111) { + // make file executable, obey umask + $mode = fileperms($v_header['filename']) | (~umask() & 0111); + @chmod($v_header['filename'], $mode); + } + } + + // ----- Check the file size + clearstatcache(); + if (!is_file($v_header['filename'])) { + $this->_error( + 'Extracted file ' . $v_header['filename'] + . 'does not exist. Archive may be corrupted.' + ); + return false; + } + + $filesize = filesize($v_header['filename']); + if ($filesize != $v_header['size']) { + $this->_error( + 'Extracted file ' . $v_header['filename'] + . ' does not have the correct file size \'' + . $filesize + . '\' (' . $v_header['size'] + . ' expected). Archive may be corrupted.' + ); + return false; + } + } + } else { + $this->_jumpBlock(ceil(($v_header['size'] / 512))); + } + } else { + $this->_jumpBlock(ceil(($v_header['size'] / 512))); + } + + /* TBC : Seems to be unused ... + if ($this->_compress) + $v_end_of_file = @gzeof($this->_file); + else + $v_end_of_file = @feof($this->_file); + */ + + if ($v_listing || $v_extract_file || $v_extraction_stopped) { + // ----- Log extracted files + if (($v_file_dir = dirname($v_header['filename'])) + == $v_header['filename'] + ) { + $v_file_dir = ''; + } + if ((substr($v_header['filename'], 0, 1) == '/') && ($v_file_dir == '')) { + $v_file_dir = '/'; + } + + $p_list_detail[$v_nb++] = $v_header; + if (is_array($p_file_list) && (count($p_list_detail) == count($p_file_list))) { + return true; + } + } + } + + return true; + } + + /** + * @return bool + */ + public function _openAppend() + { + if (filesize($this->_tarname) == 0) { + return $this->_openWrite(); + } + + if ($this->_compress) { + $this->_close(); + + if (!@rename($this->_tarname, $this->_tarname . ".tmp")) { + $this->_error( + 'Error while renaming \'' . $this->_tarname + . '\' to temporary file \'' . $this->_tarname + . '.tmp\'' + ); + return false; + } + + if ($this->_compress_type == 'gz') { + $v_temp_tar = @gzopen($this->_tarname . ".tmp", "rb"); + } elseif ($this->_compress_type == 'bz2') { + $v_temp_tar = @bzopen($this->_tarname . ".tmp", "r"); + } elseif ($this->_compress_type == 'lzma2') { + $v_temp_tar = @xzopen($this->_tarname . ".tmp", "r"); + } + + + if ($v_temp_tar == 0) { + $this->_error( + 'Unable to open file \'' . $this->_tarname + . '.tmp\' in binary read mode' + ); + @rename($this->_tarname . ".tmp", $this->_tarname); + return false; + } + + if (!$this->_openWrite()) { + @rename($this->_tarname . ".tmp", $this->_tarname); + return false; + } + + if ($this->_compress_type == 'gz') { + $end_blocks = 0; + + while (!@gzeof($v_temp_tar)) { + $v_buffer = @gzread($v_temp_tar, 512); + if ($v_buffer == ARCHIVE_TAR_END_BLOCK || strlen($v_buffer) == 0) { + $end_blocks++; + // do not copy end blocks, we will re-make them + // after appending + continue; + } elseif ($end_blocks > 0) { + for ($i = 0; $i < $end_blocks; $i++) { + $this->_writeBlock(ARCHIVE_TAR_END_BLOCK); + } + $end_blocks = 0; + } + $v_binary_data = pack("a512", $v_buffer); + $this->_writeBlock($v_binary_data); + } + + @gzclose($v_temp_tar); + } elseif ($this->_compress_type == 'bz2') { + $end_blocks = 0; + + while (strlen($v_buffer = @bzread($v_temp_tar, 512)) > 0) { + if ($v_buffer == ARCHIVE_TAR_END_BLOCK || strlen($v_buffer) == 0) { + $end_blocks++; + // do not copy end blocks, we will re-make them + // after appending + continue; + } elseif ($end_blocks > 0) { + for ($i = 0; $i < $end_blocks; $i++) { + $this->_writeBlock(ARCHIVE_TAR_END_BLOCK); + } + $end_blocks = 0; + } + $v_binary_data = pack("a512", $v_buffer); + $this->_writeBlock($v_binary_data); + } + + @bzclose($v_temp_tar); + } elseif ($this->_compress_type == 'lzma2') { + $end_blocks = 0; + + while (strlen($v_buffer = @xzread($v_temp_tar, 512)) > 0) { + if ($v_buffer == ARCHIVE_TAR_END_BLOCK || strlen($v_buffer) == 0) { + $end_blocks++; + // do not copy end blocks, we will re-make them + // after appending + continue; + } elseif ($end_blocks > 0) { + for ($i = 0; $i < $end_blocks; $i++) { + $this->_writeBlock(ARCHIVE_TAR_END_BLOCK); + } + $end_blocks = 0; + } + $v_binary_data = pack("a512", $v_buffer); + $this->_writeBlock($v_binary_data); + } + + @xzclose($v_temp_tar); + } + + if (!@unlink($this->_tarname . ".tmp")) { + $this->_error( + 'Error while deleting temporary file \'' + . $this->_tarname . '.tmp\'' + ); + } + } else { + // ----- For not compressed tar, just add files before the last + // one or two 512 bytes block + if (!$this->_openReadWrite()) { + return false; + } + + clearstatcache(); + $v_size = filesize($this->_tarname); + + // We might have zero, one or two end blocks. + // The standard is two, but we should try to handle + // other cases. + fseek($this->_file, $v_size - 1024); + if (fread($this->_file, 512) == ARCHIVE_TAR_END_BLOCK) { + fseek($this->_file, $v_size - 1024); + } elseif (fread($this->_file, 512) == ARCHIVE_TAR_END_BLOCK) { + fseek($this->_file, $v_size - 512); + } + } + + return true; + } + + /** + * @param $p_filelist + * @param string $p_add_dir + * @param string $p_remove_dir + * @return bool + */ + public function _append($p_filelist, $p_add_dir = '', $p_remove_dir = '') + { + if (!$this->_openAppend()) { + return false; + } + + if ($this->_addList($p_filelist, $p_add_dir, $p_remove_dir)) { + $this->_writeFooter(); + } + + $this->_close(); + + return true; + } + + /** + * Check if a directory exists and create it (including parent + * dirs) if not. + * + * @param string $p_dir directory to check + * + * @return bool true if the directory exists or was created + */ + public function _dirCheck($p_dir) + { + clearstatcache(); + if ((@is_dir($p_dir)) || ($p_dir == '')) { + return true; + } + + $p_parent_dir = dirname($p_dir); + + if (($p_parent_dir != $p_dir) && + ($p_parent_dir != '') && + (!$this->_dirCheck($p_parent_dir)) + ) { + return false; + } + + if (!@mkdir($p_dir, 0777)) { + $this->_error("Unable to create directory '$p_dir'"); + return false; + } + + return true; + } + + /** + * Compress path by changing for example "/dir/foo/../bar" to "/dir/bar", + * rand emove double slashes. + * + * @param string $p_dir path to reduce + * + * @return string reduced path + */ + private function _pathReduction($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 + 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] == "..") { + // ----- Ignore it and ignore the $i-1 + $i--; + } else { + if (($v_list[$i] == '') + && ($i != (sizeof($v_list) - 1)) + && ($i != 0) + ) { + // ----- Ignore only the double '//' in path, + // but not the first and last / + } else { + $v_result = $v_list[$i] . ($i != (sizeof($v_list) - 1) ? '/' + . $v_result : ''); + } + } + } + } + } + + if (defined('OS_WINDOWS') && OS_WINDOWS) { + $v_result = strtr($v_result, '\\', '/'); + } + + return $v_result; + } + + /** + * @param $p_path + * @param bool $p_remove_disk_letter + * @return string + */ + public function _translateWinPath($p_path, $p_remove_disk_letter = true) + { + if (defined('OS_WINDOWS') && OS_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/gulliver/thirdparty/pear/archive_tar/README.md b/gulliver/thirdparty/pear/archive_tar/README.md new file mode 100644 index 000000000..fcf246cdc --- /dev/null +++ b/gulliver/thirdparty/pear/archive_tar/README.md @@ -0,0 +1,33 @@ +Archive_Tar +========== + +[![Build Status](https://secure.travis-ci.org/pear/Archive_Tar.png?branch=master)](https://travis-ci.org/pear/Archive_Tar) + +This package provides handling of tar files in PHP. +It supports creating, listing, extracting and adding to tar files. +Gzip support is available if PHP has the zlib extension built-in or +loaded. Bz2 compression is also supported with the bz2 extension loaded. + +This package is hosted at http://pear.php.net/package/Archive_Tar + +Please report all new issues via the PEAR bug tracker. + +Pull requests are welcome! + + +Testing, building +----------------- + +To test, run either +$ phpunit tests/ + or +$ pear run-tests -r + +To build, simply +$ pear package + +To install from scratch +$ pear install package.xml + +To upgrade +$ pear upgrade -f package.xml diff --git a/gulliver/thirdparty/pear/archive_tar/composer.json b/gulliver/thirdparty/pear/archive_tar/composer.json new file mode 100644 index 000000000..c50b0a9a9 --- /dev/null +++ b/gulliver/thirdparty/pear/archive_tar/composer.json @@ -0,0 +1,54 @@ +{ + "name": "pear/archive_tar", + "description": "Tar file management class", + "type": "library", + "keywords": [ + "archive", + "tar" + ], + "homepage": "https://github.com/pear/Archive_Tar", + "license": "BSD-3-Clause", + "authors": [ + { + "name": "Vincent Blavet", + "email": "vincent@phpconcept.net" + }, + { + "name": "Greg Beaver", + "email": "greg@chiaraquartet.net" + }, + { + "name": "Michiel Rook", + "email": "mrook@php.net" + } + ], + "require": { + "php": ">=5.2.0", + "pear/pear-core-minimal": "^1.10.0alpha2" + }, + "suggest": { + "ext-zlib": "Gzip compression support.", + "ext-bz2": "bz2 compression support.", + "ext-xz": "lzma2 compression support." + }, + "autoload": { + "psr-0": { + "Archive_Tar": "" + } + }, + "include-path": [ + "./" + ], + "support": { + "issues": "http://pear.php.net/bugs/search.php?cmd=display&package_name[]=Archive_Tar", + "source": "https://github.com/pear/Archive_Tar" + }, + "require-dev": { + "phpunit/phpunit": "*" + }, + "extra": { + "branch-alias": { + "dev-master": "1.4.x-dev" + } + } +} diff --git a/gulliver/thirdparty/pear/archive_tar/docs/Archive_Tar.txt b/gulliver/thirdparty/pear/archive_tar/docs/Archive_Tar.txt new file mode 100644 index 000000000..2e8ec47c1 --- /dev/null +++ b/gulliver/thirdparty/pear/archive_tar/docs/Archive_Tar.txt @@ -0,0 +1,475 @@ +Documentation for class Archive_Tar +=================================== +Last update : 2001-08-15 + + + +Overview : +---------- + + The Archive_Tar class helps in creating and managing GNU TAR format + files compressed by GNU ZIP or not. + The class offers basic functions like creating an archive, adding + files in the archive, extracting files from the archive and listing + the archive content. + It also provide advanced functions that allow the adding and + extraction of files with path manipulation. + + +Sample : +-------- + + // ----- Creating the object (uncompressed archive) + $tar_object = new Archive_Tar("tarname.tar"); + $tar_object->setErrorHandling(PEAR_ERROR_PRINT); + + // ----- Creating the archive + $v_list[0]="file.txt"; + $v_list[1]="data/"; + $v_list[2]="file.log"; + $tar_object->create($v_list); + + // ----- Adding files + $v_list[0]="dev/file.txt"; + $v_list[1]="dev/data/"; + $v_list[2]="log/file.log"; + $tar_object->add($v_list); + + // ----- Adding more files + $tar_object->add("release/newfile.log release/readme.txt"); + + // ----- Listing the content + if (($v_list = $tar_object->listContent()) != 0) + for ($i=0; $i"; + echo " .size :'".$v_list[$i][size]."'
"; + echo " .mtime :'".$v_list[$i][mtime]."' (".date("l dS of F Y h:i:s A", $v_list[$i][mtime]).")
"; + echo " .mode :'".$v_list[$i][mode]."'
"; + echo " .uid :'".$v_list[$i][uid]."'
"; + echo " .gid :'".$v_list[$i][gid]."'
"; + echo " .typeflag :'".$v_list[$i][typeflag]."'
"; + } + + // ----- Extracting the archive in directory "install" + $tar_object->extract("install"); + + +Public arguments : +------------------ + +None + + +Public Methods : +---------------- + +Method : Archive_Tar($p_tarname, $compress = null) +Description : + Archive_Tar Class constructor. This flavour of the constructor only + declare a new Archive_Tar object, identifying it by the name of the + tar file. + If the compress argument is set the tar will be read or created as a + gzip or bz2 compressed TAR file. +Arguments : + $p_tarname : A valid filename for the tar archive file. + $p_compress : can be null, 'gz' or 'bz2'. For + compatibility reason it can also be true. This + parameter indicates if gzip or bz2 compression + is required. +Return value : + The Archive_Tar object. +Sample : + $tar_object = new Archive_Tar("tarname.tar"); + $tar_object_compressed = new Archive_Tar("tarname.tgz", true); +How it works : + Initialize the object. + +Method : create($p_filelist) +Description : + This method creates the archive file and add the files / directories + that are listed in $p_filelist. + If the file already exists and is writable, it is replaced by the + new tar. It is a create and not an add. If the file exists and is + read-only or is a directory it is not replaced. The method return + false and a PEAR error text. + The $p_filelist parameter can be an array of string, each string + representing a filename or a directory name with their path if + needed. It can also be a single string with names separated by a + single blank. + See also createModify() method for more details. +Arguments : + $p_filelist : An array of filenames and directory names, or a single + string with names separated by a single blank space. +Return value : + true on success, false on error. +Sample 1 : + $tar_object = new Archive_Tar("tarname.tar"); + $tar_object->setErrorHandling(PEAR_ERROR_PRINT); // Optional error handling + $v_list[0]="file.txt"; + $v_list[1]="data/"; (Optional '/' at the end) + $v_list[2]="file.log"; + $tar_object->create($v_list); +Sample 2 : + $tar_object = new Archive_Tar("tarname.tar"); + $tar_object->setErrorHandling(PEAR_ERROR_PRINT); // Optional error handling + $tar_object->create("file.txt data/ file.log"); +How it works : + Just calling the createModify() method with the right parameters. + +Method : createModify($p_filelist, $p_add_dir, $p_remove_dir = "") +Description : + This method creates the archive file and add the files / directories + that are listed in $p_filelist. + If the file already exists and is writable, it is replaced by the + new tar. It is a create and not an add. If the file exists and is + read-only or is a directory it is not replaced. The method return + false and a PEAR error text. + The $p_filelist parameter can be an array of string, each string + representing a filename or a directory name with their path if + needed. It can also be a single string with names separated by a + single blank. + The path indicated in $p_remove_dir will be removed from the + memorized path of each file / directory listed when this path + exists. By default nothing is removed (empty path "") + The path indicated in $p_add_dir will be added at the beginning of + the memorized path of each file / directory listed. However it can + be set to empty "". The adding of a path is done after the removing + of path. + The path add/remove ability enables the user to prepare an archive + for extraction in a different path than the origin files are. + See also addModify() method for file adding properties. +Arguments : + $p_filelist : An array of filenames and directory names, or a single + string with names separated by a single blank space. + $p_add_dir : A string which contains a path to be added to the + memorized path of each element in the list. + $p_remove_dir : A string which contains a path to be removed from + the memorized path of each element in the list, when + relevant. +Return value : + true on success, false on error. +Sample 1 : + $tar_object = new Archive_Tar("tarname.tar"); + $tar_object->setErrorHandling(PEAR_ERROR_PRINT); // Optional error handling + $v_list[0]="file.txt"; + $v_list[1]="data/"; (Optional '/' at the end) + $v_list[2]="file.log"; + $tar_object->createModify($v_list, "install"); + // files are stored in the archive as : + // install/file.txt + // install/data + // install/data/file1.txt + // install/data/... all the files and sub-dirs of data/ + // install/file.log +Sample 2 : + $tar_object = new Archive_Tar("tarname.tar"); + $tar_object->setErrorHandling(PEAR_ERROR_PRINT); // Optional error handling + $v_list[0]="dev/file.txt"; + $v_list[1]="dev/data/"; (Optional '/' at the end) + $v_list[2]="log/file.log"; + $tar_object->createModify($v_list, "install", "dev"); + // files are stored in the archive as : + // install/file.txt + // install/data + // install/data/file1.txt + // install/data/... all the files and sub-dirs of data/ + // install/log/file.log +How it works : + Open the file in write mode (erasing the existing one if one), + call the _addList() method for adding the files in an empty archive, + add the tar footer (512 bytes block), close the tar file. + + +Method : addModify($p_filelist, $p_add_dir, $p_remove_dir="") +Description : + This method add the files / directories listed in $p_filelist at the + end of the existing archive. If the archive does not yet exists it + is created. + The $p_filelist parameter can be an array of string, each string + representing a filename or a directory name with their path if + needed. It can also be a single string with names separated by a + single blank. + The path indicated in $p_remove_dir will be removed from the + memorized path of each file / directory listed when this path + exists. By default nothing is removed (empty path "") + The path indicated in $p_add_dir will be added at the beginning of + the memorized path of each file / directory listed. However it can + be set to empty "". The adding of a path is done after the removing + of path. + The path add/remove ability enables the user to prepare an archive + for extraction in a different path than the origin files are. + If a file/dir is already in the archive it will only be added at the + end of the archive. There is no update of the existing archived + file/dir. However while extracting the archive, the last file will + replace the first one. This results in a none optimization of the + archive size. + If a file/dir does not exist the file/dir is ignored. However an + error text is send to PEAR error. + If a file/dir is not readable the file/dir is ignored. However an + error text is send to PEAR error. + If the resulting filename/dirname (after the add/remove option or + not) string is greater than 99 char, the file/dir is + ignored. However an error text is send to PEAR error. +Arguments : + $p_filelist : An array of filenames and directory names, or a single + string with names separated by a single blank space. + $p_add_dir : A string which contains a path to be added to the + memorized path of each element in the list. + $p_remove_dir : A string which contains a path to be removed from + the memorized path of each element in the list, when + relevant. +Return value : + true on success, false on error. +Sample 1 : + $tar_object = new Archive_Tar("tarname.tar"); + [...] + $v_list[0]="dev/file.txt"; + $v_list[1]="dev/data/"; (Optional '/' at the end) + $v_list[2]="log/file.log"; + $tar_object->addModify($v_list, "install"); + // files are stored in the archive as : + // install/file.txt + // install/data + // install/data/file1.txt + // install/data/... all the files and sub-dirs of data/ + // install/file.log +Sample 2 : + $tar_object = new Archive_Tar("tarname.tar"); + [...] + $v_list[0]="dev/file.txt"; + $v_list[1]="dev/data/"; (Optional '/' at the end) + $v_list[2]="log/file.log"; + $tar_object->addModify($v_list, "install", "dev"); + // files are stored in the archive as : + // install/file.txt + // install/data + // install/data/file1.txt + // install/data/... all the files and sub-dirs of data/ + // install/log/file.log +How it works : + If the archive does not exists it create it and add the files. + If the archive does exists and is not compressed, it open it, jump + before the last empty 512 bytes block (tar footer) and add the files + at this point. + If the archive does exists and is compressed, a temporary copy file + is created. This temporary file is then 'gzip' read block by block + until the last empty block. The new files are then added in the + compressed file. + The adding of files is done by going through the file/dir list, + adding files per files, in a recursive way through the + directory. Each time a path need to be added/removed it is done + before writing the file header in the archive. + +Method : add($p_filelist) +Description : + This method add the files / directories listed in $p_filelist at the + end of the existing archive. If the archive does not yet exists it + is created. + The $p_filelist parameter can be an array of string, each string + representing a filename or a directory name with their path if + needed. It can also be a single string with names separated by a + single blank. + See addModify() method for details and limitations. +Arguments : + $p_filelist : An array of filenames and directory names, or a single + string with names separated by a single blank space. +Return value : + true on success, false on error. +Sample 1 : + $tar_object = new Archive_Tar("tarname.tar"); + [...] + $v_list[0]="dev/file.txt"; + $v_list[1]="dev/data/"; (Optional '/' at the end) + $v_list[2]="log/file.log"; + $tar_object->add($v_list); +Sample 2 : + $tar_object = new Archive_Tar("tarname.tgz", true); + [...] + $v_list[0]="dev/file.txt"; + $v_list[1]="dev/data/"; (Optional '/' at the end) + $v_list[2]="log/file.log"; + $tar_object->add($v_list); +How it works : + Simply call the addModify() method with the right parameters. + +Method : addString($p_filename, $p_string, $p_datetime, $p_params) +Description : + This method add a single string as a file at the + end of the existing archive. If the archive does not yet exists it + is created. +Arguments : + $p_filename : A string which contains the full filename path + that will be associated with the string. + $p_string : The content of the file added in the archive. + $p_datetime : (Optional) Timestamp of the file (default = now) + $p_params : (Optional) Various file metadata: + stamp - As above, timestamp of the file + mode - UNIX-style permissions (default 0600) + type - Is this a regular file or link (see TAR + format spec for how to create a hard/symlink) + uid - UNIX-style user ID (default 0 = root) + gid - UNIX-style group ID (default 0 = root) +Return value : + true on success, false on error. +Sample 1 : + $v_archive = & new Archive_Tar($p_filename); + $v_archive->setErrorHandling(PEAR_ERROR_PRINT); + $v_result = $v_archive->addString('data/test.txt', 'This is the text of the string'); + $v_result = $v_archive->addString( + 'data/test.sh', + "#!/bin/sh\necho 'Hello'", + time(), + array( "mode" => 0755, "uid" => 34 ) + ); + + +Method : extract($p_path = "") +Description : + This method extract all the content of the archive in the directory + indicated by $p_path.If $p_path is optional, if not set the archive + is extracted in the current directory. + While extracting a file, if the directory path does not exists it is + created. + See extractModify() for details and limitations. +Arguments : + $p_path : Optional path where the files/dir need to by extracted. +Return value : + true on success, false on error. +Sample : + $tar_object = new Archive_Tar("tarname.tar"); + $tar_object->extract(); +How it works : + Simply call the extractModify() method with appropriate parameters. + +Method : extractModify($p_path, $p_remove_path) +Description : + This method extract all the content of the archive in the directory + indicated by $p_path. When relevant the memorized path of the + files/dir can be modified by removing the $p_remove_path path at the + beginning of the file/dir path. + While extracting a file, if the directory path does not exists it is + created. + While extracting a file, if the file already exists it is replaced + without looking for last modification date. + While extracting a file, if the file already exists and is write + protected, the extraction is aborted. + While extracting a file, if a directory with the same name already + exists, the extraction is aborted. + While extracting a directory, if a file with the same name already + exists, the extraction is aborted. + While extracting a file/directory if the destination directory exist + and is write protected, or does not exist but can not be created, + the extraction is aborted. + If after extraction an extracted file does not show the correct + stored file size, the extraction is aborted. + When the extraction is aborted, a PEAR error text is set and false + is returned. However the result can be a partial extraction that may + need to be manually cleaned. +Arguments : + $p_path : The path of the directory where the files/dir need to by + extracted. + $p_remove_path : Part of the memorized path that can be removed if + present at the beginning of the file/dir path. +Return value : + true on success, false on error. +Sample : + // Imagine tarname.tar with files : + // dev/data/file.txt + // dev/data/log.txt + // readme.txt + $tar_object = new Archive_Tar("tarname.tar"); + $tar_object->extractModify("install", "dev"); + // Files will be extracted there : + // install/data/file.txt + // install/data/log.txt + // install/readme.txt +How it works : + Open the archive and call a more generic function that can extract + only a part of the archive or all the archive. + See extractList() method for more details. + +Method : extractInString($p_filename) +Description : + This method extract from the archive one file identified by $p_filename. + The return value is a string with the file content, or NULL on error. +Arguments : + $p_filename : The path of the file to extract in a string. +Return value : + a string with the file content or NULL. +Sample : + // Imagine tarname.tar with files : + // dev/data/file.txt + // dev/data/log.txt + // dev/readme.txt + $v_archive = & new Archive_Tar('tarname.tar'); + $v_archive->setErrorHandling(PEAR_ERROR_PRINT); + $v_string = $v_archive->extractInString('dev/readme.txt'); + echo $v_string; + +Method : listContent() +Description : + This method returns an array of arrays that describe each + file/directory present in the archive. + The array is not sorted, so it show the position of the file in the + archive. + The file informations are : + $file[filename] : Name and path of the file/dir. + $file[mode] : File permissions (result of fileperms()) + $file[uid] : user id + $file[gid] : group id + $file[size] : filesize + $file[mtime] : Last modification time (result of filemtime()) + $file[typeflag] : "" for file, "5" for directory +Arguments : +Return value : + An array of arrays or 0 on error. +Sample : + $tar_object = new Archive_Tar("tarname.tar"); + if (($v_list = $tar_object->listContent()) != 0) + for ($i=0; $i"; + echo " .size :'".$v_list[$i][size]."'
"; + echo " .mtime :'".$v_list[$i][mtime]."' (". + date("l dS of F Y h:i:s A", $v_list[$i][mtime]).")
"; + echo " .mode :'".$v_list[$i][mode]."'
"; + echo " .uid :'".$v_list[$i][uid]."'
"; + echo " .gid :'".$v_list[$i][gid]."'
"; + echo " .typeflag :'".$v_list[$i][typeflag]."'
"; + } +How it works : + Call the same function as an extract however with a flag to only go + through the archive without extracting the files. + +Method : extractList($p_filelist, $p_path = "", $p_remove_path = "") +Description : + This method extract from the archive only the files indicated in the + $p_filelist. These files are extracted in the current directory or + in the directory indicated by the optional $p_path parameter. + If indicated the $p_remove_path can be used in the same way as it is + used in extractModify() method. +Arguments : + $p_filelist : An array of filenames and directory names, or a single + string with names separated by a single blank space. + $p_path : The path of the directory where the files/dir need to by + extracted. + $p_remove_path : Part of the memorized path that can be removed if + present at the beginning of the file/dir path. +Return value : + true on success, false on error. +Sample : + // Imagine tarname.tar with files : + // dev/data/file.txt + // dev/data/log.txt + // readme.txt + $tar_object = new Archive_Tar("tarname.tar"); + $tar_object->extractList("dev/data/file.txt readme.txt", "install", + "dev"); + // Files will be extracted there : + // install/data/file.txt + // install/readme.txt +How it works : + Go through the archive and extract only the files present in the + list. + diff --git a/gulliver/thirdparty/pear/archive_tar/package.xml b/gulliver/thirdparty/pear/archive_tar/package.xml new file mode 100644 index 000000000..993618099 --- /dev/null +++ b/gulliver/thirdparty/pear/archive_tar/package.xml @@ -0,0 +1,544 @@ + + + Archive_Tar + pear.php.net + Tar file management class + This class provides handling of tar files in PHP. +It supports creating, listing, extracting and adding to tar files. +Gzip support is available if PHP has the zlib extension built-in or +loaded. Bz2 compression is also supported with the bz2 extension loaded. + + Vincent Blavet + vblavet + vincent@phpconcept.net + no + + + Greg Beaver + cellog + greg@chiaraquartet.net + no + + + Michiel Rook + mrook + mrook@php.net + yes + + + Stig Bakken + ssb + stig@php.net + no + + 2017-06-11 + + + 1.4.3 + 1.4.0 + + + stable + stable + + New BSD License + +* Fix Bug #21218: Cannot use result of built-in function in write context in PHP + 7.2.0alpha1 [mrook] + + + + + + + + + + + + + PEAR + pear.php.net + 1.8.0 + 1.10.10 + + + + + 5.2.0 + + + 1.9.0 + + + + + + + + 1.4.2 + 1.4.0 + + + stable + stable + + 2016-02-25 + New BSD License + +* Fix reading of archives with files > 8GB +* Performance optimizations +* Do not try to call require_once on PEAR.php if it has already been loaded by the autoloader + + + + + 1.4.1 + 1.4.0 + + + stable + stable + + 2015-08-05 + New BSD License + +* Update composer.json to use pear-core-minimal 1.10.0alpha2 + + + + + 1.4.0 + 1.4.0 + + + stable + stable + + 2015-07-20 + New BSD License + +* Add support for PHP 7 +* Drop support for PHP 4 +* Add visibility declarations to methods and properties + + + + + 1.3.16 + 1.3.1 + + + stable + stable + + 2015-04-14 + New BSD License + +* Fix Bug #20514: invalid package.xml; not installable with pyrus [mrook] + + + + + 1.3.15 + 1.3.1 + + + stable + stable + + 2015-03-05 + New BSD License + +* Fixes composer.json parse error + + + + + 1.3.14 + 1.3.1 + + + stable + stable + + 2015-02-26 + New BSD License + +* Fix Bug #18505: Possible incorrect handling of file names in TAR [mrook] + + + + + 1.3.13 + 1.3.1 + + + stable + stable + + 2014-09-02 + New BSD + License + +* Fix Bug #20382: gzopen fix [mrook] + + + + + 1.3.12 + 1.3.1 + + + stable + stable + + 2014-08-04 + New BSD + License + +* Fix Bug #19964: Memory leaking in Archive_Tar [mrook] + * Fix Bug #20246: Broken with php 5.5.9 [mrook] + * Fix Bug #20275: "pax_global_header" looks like a regular file + * [mrook] + * Implement Feature #19827: pass filename to _addFile function - downstream + * patch [mrook] + * Implement Feature #20132: Add custom mode/uid/gid to addString() [mrook] + + + + + 1.3.11 + 1.3.1 + + + stable + stable + + 2013-02-09 + New BSD + License + +* Fix Bug #19746: Broken with PHP 5.5 [mrook] + * Implement Feature #11258: Custom date/time in files added on-the-fly + * [mrook] + + + + + 1.3.10 + 1.3.1 + + + stable + stable + + 2012-04-10 + New BSD + License + +* Fix Bug #13361: Unable to add() some files (ex. mp3) [mrook] + * Fix Bug #19330: Class creates incorrect (non-readable) tar.gz file + * [mrook] + + + + + 1.3.9 + 1.3.1 + + + stable + stable + + 2012-02-27 + New BSD License + +* Fix Bug #16759: No error thrown from missing PHP zlib functions [mrook] + * Fix Bug #18877: Incorrect handling of backslashes in filenames on Linux [mrook] + * Fix Bug #19085: Error while packaging [mrook] + * Fix Bug #19289: Invalid tar file generated [mrook] + + + + + 1.3.8 + 1.3.1 + + + stable + stable + + 2011-10-14 + New BSD License + +* Fix Bug #17853: Test failure: dirtraversal.phpt [mrook] + * Fix Bug #18512: dead links are not saved in tar file [mrook] + * Fix Bug #18702: Unpacks incorrectly on long file names using header prefix [mrook] + * Implement Feature #10145: Patch to return a Pear Error Object on failure [mrook] + * Implement Feature #17491: Option to preserve permissions [mrook] + * Implement Feature #17813: Prevent PHP notice when extracting corrupted archive [mrook] + + + + + 1.3.7 + 1.3.1 + + + stable + stable + + 2010-04-26 + New BSD License + +PEAR compatibility update + + + + + 1.3.6 + 1.3.1 + + + stable + stable + + 2010-03-09 + New BSD License + +* Fix Bug #16963: extractList can't extract zipped files from big tar [mrook] + * Implement Feature #4013: Ignoring files and directories on creating an archive. [mrook] + + + + + 1.3.5 + 1.3.1 + + + stable + stable + + 2009-12-31 + New BSD License + +* Fix Bug #16958: Update 'compatible' tag in package.xml [mrook] + + + + + 1.3.4 + 1.3.1 + + + stable + stable + + 2009-12-30 + New BSD License + +* Fix Bug #11871: wrong result of ::listContent() if filename begins or ends with space [mrook] + * Fix Bug #12462: invalid tar magic [mrook] + * Fix Bug #13918: Long filenames may get up to 511 0x00 bytes appended on read [mrook] + * Fix Bug #16202: Bogus modification times [mrook] + * Implement Feature #16212: Die is not exception [mrook] + + + + + 1.3.3 + 1.3.1 + + + stable + stable + + 2009-03-27 + New BSD License + +Change the license to New BSD license + + minor bugfix release + * fix Bug #9921 compression with bzip2 fails [cellog] + * fix Bug #11594 _readLongHeader leaves 0 bytes in filename [jamessas] + * fix Bug #11769 Incorrect symlink handing [fajar99] + + + + + 1.3.2 + 1.3.1 + + + stable + stable + + 2007-01-03 + PHP License + +Correct Bug #4016 +Remove duplicate remove error display with '@' +Correct Bug #3909 : Check existence of OS_WINDOWS constant +Correct Bug #5452 fix for "lone zero block" when untarring packages +Change filemode (from pear-core/Archive/Tar.php v.1.21) +Correct Bug #6486 Can not extract symlinks +Correct Bug #6933 Archive_Tar (Tar file management class) Directory traversal +Correct Bug #8114 Files added on-the-fly not storing date +Correct Bug #9352 Bug on _dirCheck function over nfs path + + + + + 1.3.1 + 1.3.1 + + + stable + stable + + 2005-03-17 + PHP License + +Correct Bug #3855 + + + + + 1.3.0 + 1.3.0 + + + stable + stable + + 2005-03-06 + PHP License + +Bugs correction (2475, 2488, 2135, 2176) + + + + + 1.2 + 1.2 + + + stable + stable + + 2004-05-08 + PHP License + +Add support for other separator than the space char and bug + correction + + + + + 1.1 + 1.1 + + + stable + stable + + 2003-05-28 + PHP License + +* Add support for BZ2 compression +* Add support for add and extract without using temporary files : methods addString() and extractInString() + + + + + 1.0 + 1.0 + + + stable + stable + + 2003-01-24 + PHP License + +Change status to stable + + + + + 0.10-b1 + 0.10-b1 + + + beta + beta + + 2003-01-08 + PHP License + +Add support for long filenames (greater than 99 characters) + + + + + 0.9 + 0.9 + + + stable + stable + + 2002-05-27 + PHP License + +Auto-detect gzip'ed files + + + + + 0.4 + 0.4 + + + stable + stable + + 2002-05-20 + PHP License + +Windows bugfix: use forward slashes inside archives + + + + + 0.2 + 0.2 + + + stable + stable + + 2002-02-18 + PHP License + +From initial commit to stable + + + + + 0.3 + 0.3 + + + stable + stable + + 2002-04-13 + PHP License + +Windows bugfix: used wrong directory separators + + + + diff --git a/gulliver/thirdparty/pear/archive_tar/scripts/phptar.in b/gulliver/thirdparty/pear/archive_tar/scripts/phptar.in new file mode 100644 index 000000000..08361c1d0 --- /dev/null +++ b/gulliver/thirdparty/pear/archive_tar/scripts/phptar.in @@ -0,0 +1,236 @@ +#!@prefix@/bin/php -Cq + 1) { + usage("Only one of -c, -t and -x can be specified at once!"); +} + +if ($op_create + $op_list + $op_extract == 0) { + usage("Please specify either -c, -t or -x!"); +} + +if (empty($file)) { + if ($op_create) { + $file = "php://stdout"; + } else { + $file = "php://stdin"; + } +} + +// }}} + +$tar = new Archive_Tar($file, $use_gzip); +$tar->setErrorHandling(PEAR_ERROR_DIE, "$progname error: %s\n"); + +if ($op_create) { + do_create($tar, $options[1]); + $tar->create($options[1]); +} elseif ($op_list) { + do_list($tar, $verbose); +} elseif ($op_extract) { + do_extract($tar); +} + +// {{{ getrwx() + +function getrwx($bits) { + $str = ''; + $str .= ($bits & 4) ? 'r' : '-'; + $str .= ($bits & 2) ? 'w' : '-'; + $str .= ($bits & 1) ? 'x' : '-'; + return $str; +} + +// }}} +// {{{ getfiletype() + +function getfiletype($bits) { + static $map = array( + '-' => S_IFREG, + 'd' => S_IFDIR, + 'l' => S_IFLNK, + 'c' => S_IFCHR, + 'b' => S_IFBLK, + 'p' => S_IFIFO, + 's' => S_IFSOCK, + ); + foreach ($map as $char => $mask) { + if ($bits & $mask) { + return $char; + } + } +} + +// }}} +// {{{ getuser() + +function getuser($uid) { + static $cache = array(); + if (isset($cache[$uid])) { + return $cache[$uid]; + } + if (function_exists("posix_getpwuid")) { + if (is_array($user = @posix_getpwuid($uid))) { + $cache[$uid] = $user['name']; + return $user['name']; + } + } + $cache[$uid] = $uid; + return $uid; +} + +// }}} +// {{{ getgroup() + +function getgroup($gid) { + static $cache = array(); + if (isset($cache[$gid])) { + return $cache[$gid]; + } + if (function_exists("posix_getgrgid")) { + if (is_array($group = @posix_getgrgid($gid))) { + $cache[$gid] = $group['name']; + return $group['name']; + } + } + $cache[$gid] = $gid; + return $gid; +} + +// }}} +// {{{ do_create() + +function do_create(&$tar, &$files) +{ + $tar->create($files); +} + +// }}} +// {{{ do_list() + +function do_list(&$tar, $verbose) +{ + static $rwx = array(4 => 'r', 2 => 'w', 1 => 'x'); + $files = $tar->listContent(); + if (is_array($files) && sizeof($files) > 0) { + foreach ($files as $file) { + if ($verbose) { + $fm = (int)$file['mode']; + $mode = sprintf('%s%s%s%s', getfiletype($fm), + getrwx(($fm >> 6) & 7), getrwx(($fm >> 3) & 7), + getrwx($fm & 7)); + $owner = getuser($file['uid']) . '/' . getgroup($file['gid']); + printf("%10s %-11s %7d %s %s\n", $mode, $owner, $file['size'], + date('Y-m-d H:i:s', $file['mtime']), $file['filename']); + } else { + printf("%s\n", $file['filename']); + } + } + } +} + +// }}} +// {{{ do_extract() + +function do_extract(&$tar, $destdir = ".") +{ + $tar->extract($destdir); +} + +// }}} +// {{{ usage() + +function usage($errormsg = '') +{ + global $progname; + $fp = fopen("php://stderr", "w"); + if ($errormsg) { + if (PEAR::isError($errormsg)) { + fwrite($fp, $errormsg->getMessage() . "\n"); + } else { + fwrite($fp, "$errormsg\n"); + } + } + fwrite($fp, "$progname [-h|-?] {-c|-t|-x} [-z] [-v] [-f file] [file(s)...] +Options: + -h, -? Show this screen + -c Create archive + -t List archive + -x Extract archive + -z Run input/output through gzip + -f file Use as input or output (default is stdin/stdout) + +"); + fclose($fp); + exit; +} + +// }}} + +?> diff --git a/gulliver/thirdparty/pear/archive_tar/sync-php4 b/gulliver/thirdparty/pear/archive_tar/sync-php4 new file mode 100644 index 000000000..9fb57ff84 --- /dev/null +++ b/gulliver/thirdparty/pear/archive_tar/sync-php4 @@ -0,0 +1,6 @@ +#!/bin/sh + +rsync -av Archive/Tar.php ../../php4/pear/Archive/. +rsync -av package.xml ../../php4/pear/package-Archive_Tar.xml +rsync -av docs/Archive_Tar.txt ../../php4/pear/docs/. + diff --git a/gulliver/thirdparty/pear/archive_tar/tests/deadlinks.phpt b/gulliver/thirdparty/pear/archive_tar/tests/deadlinks.phpt new file mode 100644 index 000000000..ef8705af0 --- /dev/null +++ b/gulliver/thirdparty/pear/archive_tar/tests/deadlinks.phpt @@ -0,0 +1,46 @@ +--TEST-- +test saving of dead symbolic links +--SKIPIF-- +--FILE-- + '.$item['link']; +} + +//prepare filesystem +@mkdir('test'); +@mkdir('test/a'); +@touch('test/b'); +@symlink('a', 'test/dir_link'); +@symlink('b', 'test/file_link'); +@symlink('dead', 'test/dead_link'); + +//prepare reference tar +system('tar -cf test1.tar test'); +$tar1=new Archive_Tar('test1.tar'); +$tar1List=array_map('fileName',$tar1->listContent()); +//create tar +$tar2=new Archive_Tar('test2.tar'); +$tar2->create(array('test','nonExisting'));// to make sure we are still report nonExisting +$tar2List=array_map('fileName',$tar2->listContent()); + +$phpunit->assertErrors(array( + array('package' => 'PEAR_Error', 'message' => "File 'nonExisting' does not exist")), 'after 1'); +$phpunit->assertEquals($tar1List, $tar2List, 'bla'); +echo 'tests done'; +?> +--CLEAN-- + +--EXPECT-- +tests done diff --git a/gulliver/thirdparty/pear/archive_tar/tests/dirtraversal.phpt b/gulliver/thirdparty/pear/archive_tar/tests/dirtraversal.phpt new file mode 100644 index 000000000..7e5d11f48 --- /dev/null +++ b/gulliver/thirdparty/pear/archive_tar/tests/dirtraversal.phpt @@ -0,0 +1,24 @@ +--TEST-- +test directory traversal security vulnerability +--SKIPIF-- +--FILE-- +listContent(); +$phpunit->assertErrors(array( + array('package' => 'PEAR_Error', 'message' => 'Malicious .tar detected, file "/../../../../../../../../../../../../../../AAAAAAAAAAAAAAAAA/BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB.txt" will not install in desired directory tree') +), 'after 1'); +$tar->extract(); +$phpunit->assertErrors(array( + array('package' => 'PEAR_Error', 'message' => 'Malicious .tar detected, file "/../../../../../../../../../../../../../../AAAAAAAAAAAAAAAAA/BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB.txt" will not install in desired directory tree') +), 'after 2'); +echo 'tests done'; +?> +--CLEAN-- + +--EXPECT-- +tests done diff --git a/gulliver/thirdparty/pear/archive_tar/tests/hamidTARtester2.tar b/gulliver/thirdparty/pear/archive_tar/tests/hamidTARtester2.tar new file mode 100644 index 0000000000000000000000000000000000000000..0aefdbf62c633f1440911c085e8898bf3b33523e GIT binary patch literal 3072 zcmeHIF$%*l4D?g(1-2E}(%N+PCo+{1NR|wJepM)iHsG2%ql7^qTL-$6add(dirname(__FILE__) . '/testblock1'); +$tar->add(dirname(__FILE__) . '/testblock2'); +$tar = new Archive_Tar(dirname(__FILE__) . '/testblock.tar.gz'); +$tar->listContent(); +$phpunit->assertNoErrors('after'); +echo 'tests done'; +?> +--CLEAN-- + +--EXPECT-- +tests done diff --git a/gulliver/thirdparty/pear/archive_tar/tests/longfilename.phpt b/gulliver/thirdparty/pear/archive_tar/tests/longfilename.phpt new file mode 100644 index 000000000..efbf17bed --- /dev/null +++ b/gulliver/thirdparty/pear/archive_tar/tests/longfilename.phpt @@ -0,0 +1,29 @@ +--TEST-- +test trimming of characters in long filenames +--SKIPIF-- +--FILE-- +addModify(array($longfilename), '', dirname(__FILE__)); +$tar = new Archive_Tar(dirname(__FILE__) . '/testlongfilename.tar'); +$files = $tar->listContent(); +$file = reset($files); +$lastChar = $file['filename'][strlen($file['filename']) - 1]; +$phpunit->assertEquals(' ', $lastChar, 'should contain space as last character'); +echo 'tests done'; +?> +--CLEAN-- + +--EXPECT-- +tests done diff --git a/gulliver/thirdparty/pear/archive_tar/tests/pax.phpt b/gulliver/thirdparty/pear/archive_tar/tests/pax.phpt new file mode 100644 index 000000000..b4ab6ad46 --- /dev/null +++ b/gulliver/thirdparty/pear/archive_tar/tests/pax.phpt @@ -0,0 +1,13 @@ +--TEST-- +tests if pax global / extended headers are ignored +--SKIPIF-- +--FILE-- +assertEquals(1, count($tar->listContent()), "count should be 1"); +echo 'tests done'; +?> +--CLEAN-- +--EXPECT-- +tests done diff --git a/gulliver/thirdparty/pear/archive_tar/tests/permissions.phpt b/gulliver/thirdparty/pear/archive_tar/tests/permissions.phpt new file mode 100644 index 000000000..d27075080 --- /dev/null +++ b/gulliver/thirdparty/pear/archive_tar/tests/permissions.phpt @@ -0,0 +1,18 @@ +--TEST-- +test preserving of permissions +--SKIPIF-- +--FILE-- +extract('', true); +$phpunit->assertNoErrors('after'); +echo 'tests done'; +?> +--CLEAN-- + +--EXPECT-- +tests done diff --git a/gulliver/thirdparty/pear/archive_tar/tests/phpt_test.php.inc b/gulliver/thirdparty/pear/archive_tar/tests/phpt_test.php.inc new file mode 100644 index 000000000..67222e8df --- /dev/null +++ b/gulliver/thirdparty/pear/archive_tar/tests/phpt_test.php.inc @@ -0,0 +1,414 @@ +_diffonly = $diffonly; + $this->_errors = array(); + PEAR::setErrorHandling(PEAR_ERROR_CALLBACK, array($this, 'pearerrorCallback')); + if (!$noStackCatch) { + PEAR_ErrorStack::setDefaultCallback(array($this, 'pearerrorstackCallback')); + } + } + + function pearerrorCallback($err) + { + PEAR_ErrorStack::staticPush('PEAR_Error', -1, 'error', array('obj' => $err), + $err->getMessage()); + } + + function pearerrorstackCallback($err) + { + $this->_errors[] = $err; + } + + function assertPEARError($err, $message) + { + if (is_a($err, 'PEAR_Error')) { + return true; + } + $this->_failTest(debug_backtrace(), $message); + echo "Not a PEAR_Error\n"; + return false; + } + + function assertNoErrors($message, $trace = null) + { + if (count($this->_errors) == 0) { + return true; + } + if ($trace === null) { + $trace = debug_backtrace(); + } + $this->_failTest($trace, $message); + foreach ($this->_errors as $err) { + if ($err['package'] == 'PEAR_Error') { + echo "Unexpected PEAR_Error:\n"; + echo 'message "' . $err['message'] . "\"\n"; + } else { + echo "Unexpected PEAR_ErrorStack error:\n"; + echo 'package "' . $err['package'] . "\"\n"; + echo 'message "' . $err['message'] . "\"\n"; + } + } + $this->_errors = array(); + return false; + } + + function assertErrors($errors, $message, $trace = null) + { + if (!count($this->_errors)) { + if ($trace === null) { + $trace = debug_backtrace(); + } + $this->_failTest($trace, $message); + echo "No errors caught, but errors were expected\n"; + return false; + } + if (!isset($errors[0])) { + $errors = array($errors); + } + $failed = false; + foreach ($errors as $err) { + $found = false; + foreach ($this->_errors as $i => $caughterror) { + if ($caughterror['package'] == $err['package']) { + if ($caughterror['message'] == $err['message']) { + $found = true; + break; + } + } + } + if ($found) { + unset($this->_errors[$i]); + continue; + } + if (!$failed) { + if ($trace === null) { + $trace = debug_backtrace(); + } + $failed = true; + $this->_failTest($trace, $message); + } + echo "Unthrown error:\n"; + if ($err['package'] == 'PEAR_Error') { + echo "PEAR_Error:\n"; + } else { + echo "error package: \"$err[package]\"\n"; + } + echo "message: \"$err[message]\"\n"; + } + if (count($this->_errors)) { + if (!$failed) { + if ($trace === null) { + $trace = debug_backtrace(); + } + $failed = true; + $this->_failTest($trace, $message); + } + foreach ($this->_errors as $err) { + echo "Unexpected error:\n"; + if ($err['package'] == 'PEAR_Error') { + echo "PEAR_Error:\n"; + } else { + echo "error package: \"$err[package]\"\n"; + } + echo "message: \"$err[message]\"\n"; + } + } + $this->_errors = array(); + return !$failed; + } + + function assertTrue($test, $message) + { + $this->assertNoErrors($message, debug_backtrace()); + if ($test === true) { + return true; + } + $this->_failTest(debug_backtrace(), $message); + echo "Unexpected non-true value: \n"; + var_export($test); + echo "\n'$message'\n"; + return false; + } + + function assertIsa($control, $test, $message) + { + $this->assertNoErrors($message, debug_backtrace()); + if (is_a($test, $control)) { + return true; + } + $this->_failTest(debug_backtrace(), $message); + echo "Unexpected non-$control object: \n"; + var_export($test); + echo "\n'$message'\n"; + return false; + } + + function assertNull($test, $message) + { + $this->assertNoErrors($message, debug_backtrace()); + if ($test === null) { + return true; + } + $this->_failTest(debug_backtrace(), $message); + echo "Unexpected non-null value: \n"; + var_export($test); + echo "\n'$message'\n"; + return false; + } + + function assertNotNull($test, $message) + { + $this->assertNoErrors($message, debug_backtrace()); + if ($test !== null) { + return true; + } + $this->_failTest(debug_backtrace(), $message); + echo "Unexpected null: \n"; + var_export($test); + echo "\n'$message'\n"; + return false; + } + + function assertSame($test, $test1, $message) + { + $this->assertNoErrors($message, debug_backtrace()); + if ($test === $test1) { + return true; + } + $this->_failTest(debug_backtrace(), $message); + echo "Unexpectedly two vars are not the same thing: \n"; + echo "\n'$message'\n"; + return false; + } + + function assertNotSame($test, $test1, $message) + { + $this->assertNoErrors($message, debug_backtrace()); + if ($test !== $test1) { + return true; + } + $this->_failTest(debug_backtrace(), $message); + echo "Unexpectedly two vars are the same thing: \n"; + echo "\n'$message'\n"; + return false; + } + + function assertFalse($test, $message) + { + $this->assertNoErrors($message, debug_backtrace()); + if ($test === false) { + return true; + } + $this->_failTest(debug_backtrace(), $message); + echo "Unexpected non-false value: \n"; + var_export($test); + echo "\n'$message'\n"; + return false; + } + + function assertNotTrue($test, $message) + { + $this->assertNoErrors($message, debug_backtrace()); + if (!$test) { + return true; + } + $this->_failTest(debug_backtrace(), $message); + echo "Unexpected loose true value: \n"; + var_export($test); + echo "\n'$message'\n"; + return false; + } + + function assertNotFalse($test, $message) + { + $this->assertNoErrors($message, debug_backtrace()); + if ($test) { + return true; + } + $this->_failTest(debug_backtrace(), $message); + echo "Unexpected loose false value: \n"; + var_export($test); + echo "\n'$message'\n"; + return false; + } + + function assertEquals($control, $test, $message) + { + $this->assertNoErrors($message, debug_backtrace()); + if (str_replace(array("\r", "\n"), array('', ''), + var_export($control, true)) != str_replace(array("\r", "\n"), array('', ''), + var_export($test, true))) { + $this->_failTest(debug_backtrace(), $message); + if (class_exists('Text_Diff')) { + echo "Diff of expecting/received:\n"; + $diff = new Text_Diff( + explode("\n", var_export($control, true)), + explode("\n", var_export($test, true))); + + // Output the diff in unified format. + $renderer = new Text_Diff_Renderer_unified(); + echo $renderer->render($diff); + if ($this->_diffonly) { + return false; + } + } + echo "Expecting:\n"; + var_export($control); + echo "\nReceived:\n"; + var_export($test); + echo "\n"; + return false; + } + return true; + } + + function assertFileExists($fname, $message) + { + $this->assertNoErrors($message, debug_backtrace()); + if (!@file_exists($fname)) { + $this->_failTest(debug_backtrace(), $message); + echo "File '$fname' does not exist, and should\n"; + return false; + } + return true; + } + + function assertFileNotExists($fname, $message) + { + $this->assertNoErrors($message, debug_backtrace()); + if (@file_exists($fname)) { + $this->_failTest(debug_backtrace(), $message); + echo "File '$fname' exists, and should not\n"; + return false; + } + return true; + } + + function assertRegEquals($dump, &$reg, $message) + { + $actualdump = var_export(trim($this->dumpReg($reg)), true); + $testdump = var_export(trim($dump), true); + return $this->assertEquals($testdump, $actualdump, $message); + } + + function assertPackageInfoEquals($control, $test, $message) + { + $this->assertNoErrors($message, debug_backtrace()); + if (isset($control[0])) { + if (!isset($test[0]) || (count($control) != count($test))) { + echo "Invalid packageInfo\n"; + $ret = $this->assertEquals($control, $test, $message); + } + $ret = true; + foreach ($control as $i => $packageinfo) { + $ret = $ret && + $this->assertPackageInfoEquals($packageinfo, $test[$i], $message . $i); + } + return $ret; + } + if (isset($control['_lastmodified'])) { + if (!isset($test['_lastmodified'])) { + echo "_lastmodified is not set in packageInfo() output\n"; + $this->_failTest(debug_backtrace(), $message); + return false; + } + } + $savecontrol = sort($control); + $savetest = sort($test); + unset($control['_lastmodified']); + unset($test['_lastmodified']); + if (var_export($control, true) != var_export($test, true)) { + $this->_failTest(debug_backtrace(), $message); + if (class_exists('Text_Diff')) { + echo "Diff of expecting/received:\n"; + $diff = new Text_Diff( + explode("\n", var_export($control, true)), + explode("\n", var_export($test, true))); + + // Output the diff in unified format. + $renderer = new Text_Diff_Renderer_unified(); + echo $renderer->render($diff); + if ($this->_diffonly) { + return false; + } + } + echo "Expecting:\n"; + var_export($savecontrol); + echo "\nReceived:\n"; + var_export($savetest); + return false; + } + return true; + } + + function _sortRegEntries($a, $b) + { + return strnatcasecmp($a['name'], $b['name']); + } + + function dumpReg(&$reg) + { + ob_start(); + print "dumping registry...\n"; + $infos = $reg->packageInfo(null, null, null); + ksort($infos); + foreach ($infos as $channel => $info) { + echo "channel $channel:\n"; + usort($info, array($this, '_sortRegEntries')); + foreach ($info as $pkg) { + print $pkg["name"] . ":"; + unset($pkg["name"]); + foreach ($pkg as $k => $v) { + if ($k == '_lastmodified') { + print " _lastmodified is set"; + continue; + } + if (is_array($v) && $k == 'filelist') { + print " $k=array("; + $i = 0; + foreach ($v as $k2 => $v2) { + if ($i++ > 0) print ","; + print "{$k2}["; + $j = 0; + foreach ($v2 as $k3 => $v3) { + if ($j++ > 0) print ","; + print "$k3=$v3"; + } + print "]"; + } + print ")"; + } else { + print " $k=\"$v\""; + } + } + print "\n"; + } + } + print "dump done\n"; + $ret = ob_get_contents(); + ob_end_clean(); + return $ret; + } + + function _failTest($trace, $message) + { + echo 'Test Failure: "' . $message . "\"\n in " . $trace[0]['file'] . ' line ' . + $trace[0]['line'] . "\n"; + } + + function showAll() + { + $this->_diffonly = false; + } +} +?> \ No newline at end of file diff --git a/gulliver/thirdparty/pear/archive_tar/tests/setup.php.inc b/gulliver/thirdparty/pear/archive_tar/tests/setup.php.inc new file mode 100644 index 000000000..b2415a906 --- /dev/null +++ b/gulliver/thirdparty/pear/archive_tar/tests/setup.php.inc @@ -0,0 +1,4 @@ +extract(); +$phpunit->assertNoErrors('after'); +$phpunit->assertFileExists('testme', 'dir'); +$phpunit->assertFileExists('testme/file1.txt', 'file1.txt'); +$phpunit->assertFileExists('testme/symlink.txt', 'symlink.txt'); +$phpunit->assertTrue(is_link('testme/symlink.txt'), 'is link'); +echo 'tests done'; +?> +--CLEAN-- + +--EXPECT-- +tests done diff --git a/gulliver/thirdparty/pear/archive_tar/tests/testblock1/a.txt b/gulliver/thirdparty/pear/archive_tar/tests/testblock1/a.txt new file mode 100644 index 000000000..8baef1b4a --- /dev/null +++ b/gulliver/thirdparty/pear/archive_tar/tests/testblock1/a.txt @@ -0,0 +1 @@ +abc diff --git a/gulliver/thirdparty/pear/archive_tar/tests/testblock1/bugTriggeringPng.png b/gulliver/thirdparty/pear/archive_tar/tests/testblock1/bugTriggeringPng.png new file mode 100644 index 0000000000000000000000000000000000000000..f68f74e6e443b27fb44d648f1c7b9ffe799d45bc GIT binary patch literal 17218 zcmeIaXH-+&+c$U+EU18V1OW{qO+lo0ZfObzM0y9MNS78m!9o#*h*G2r2uNrG0z!Zw zNbk~1=skqc0|Ambct6iOGi&CZH6P}~yJr2*%HrhYoPGA**S^Z{Dx0^DwKZrivR?!M zfac)?)h7Tz1%9OjE}Q{R5~Ht70pL3DQ1u^uztnY%uOHJ8v0=;CzA}gYL1-V<8{py! zb6@YZsg*V20k*z2!6tDs)x2*CXMyTsxSvLUtpHSkvo z8;KL)H+$rStYG4bwPM^k}L_VCPnrw5-4 zoQ76bzI~gcqDze)m^H5Tj=$4q0}jAky2kCm@)r)qw}HXJ0)I2bXkh zbuJ3_7&57q2Cx<4B~xzA-GvU+TnV(aD}q$Z_@Afa($>^;8~ySU<0hhgxnZo25`5vS z```$Z^0bdEmw&(gbVT6(G3FAU88PPi%-z*zFTQ(Cs(x~CuTHL#^uulmn1{G+Vp0R*(_AF(&Kd#CovOm)WGFw6{yAMEabVXtrHeUG0X* zd-zFRGR1J+;ymezOc?_;*yDwZCv$dC|B+5u(3VLJ@q^0NXXvnd->%;zplXpuz%&pE3DIEyb?H< zj2g_wv(}hE`5G0`X_RnQ$VttBl#yJ`;&-GE!!y|t3j-Ye0dc0u#JGhv#WjdeKND)Vk zV-zMgEFyxb{7d9Dxe!fNq&}?(i72G>nFmrwMC>P&3DVQ6>FOI$d&sQAHdJZeuMHtR zS117G?|0vq$Dj!-H3O?p;%cWv?bGfW?ASU)Xuzv+D>-{u3;O(bpUrf}_i;L|W)?cp03O=8nMl?14mMv|kliIak zxx^!srZH|^O8c{lf!+h9@UUG#%kZWPrV`V`p9|ce0LlETv6V>~`CJm^n7qUs%VnUa z?=ew!&r>HEt9XpArLB7VIfHamuAVqt74|kaIT-`9`+AhE2gCDUZxX)-bJ($mLI)n` z^p5VH&~+zUSfVX0+)v=^O5gVgxT2D}Te7l9|MFbzJS||@Qyqo8ke0FWiqakpQ+oHq`mzXE7 z=yZU29ij9QZiYlkuP5i`pIuX0rp==I%Vgg-MJW-O4JHeEUEz0q%mxNb9-L#t6;tv4 z{t{DgJg1tjX~pyYieiO@85R{i1E@1Y=GZz6s#h27m)F$KFF7oJ8P%N-ms%z#S{jU! z>`t*1hL}~klIIG@>TfhgT_p$ZvNyNLrqSwlHQK4&RN$GP*HO~a)UK|^Kq1@H?)9Br z@Z+=WcfaWjbUstF zJ&I9qzipbF`f;O9TLhA)?Qq8|>8{ITZfsE%_jR%?$gaiodPT|#dF6kCuf1rxt9Dat zC$38Sln2h!a)lhd9-8o77kCVheAj{`dprUe;kR3rvn14jd7z7BfJsmFkO=fSmdHqfCP;pJ53)wNhRlC=7F+!z$ zP2XVgPe5Yr!EttW1l><^=EFm5-kz1ZbRj4US%OiRSti~6rEj7&ZhrC%CV1@RT1F6Q z5sDj6$vxb1uo`u9hU?j;`+Ju-vb~j&Ozg}-A|X+cdu?~^2pbA_%*+KK@sRtnzAjZ; zSg2L-Nl~P@+u#=*bR;Y++)ut5QWi+yf(}I8PWkl7pw4u6QOd&iVVY@8Iv)heZpF^N zHd+77S6kcgd1RB>aGF`62D?zy$B)UnJh@JLP6h~0EhDC(dC|*FE~8(HBSA6lOz!#d zD<{$KT@bmcci1NYUw1y?O5z>4)_IH8#lbQ!d2sfHM&y1Urx8D&aXkXJ1)F@fHQ38JUW zI&R{J+abcfsMu+$9_pOfv~lvhcSAw4+tPNdE%LkBxP?`Lx&*$Xrq!ZAy#l=CzDl2f zF3e9o%4~!@Ef>H_1>J(EoZIyddo#va{EIR`01`;xWQxsAY?egTmPW20&3~wh93m3R z!naga-vpYGr+oC)wsaA6vo@KzZ4Ds`PmxAxn+xv{I?2NDp11n8mp4TMz-a=%(-N1x zWt;Wu`z!XxBAig~1^MWvg69n~X?Yh$Z_t-Je_}VG$>O1NZQo;SmszS(_laoA{06Tu zfi@j)W62o5CZz&(4HGSWwPMr~_i#i_tLvRdTD=G0J(;v+ezUK~b_hGBg7Xcz`5D27 z(G$4U@ztfXCD8p9Vtw#=W`iUdhkgYWqIS@MBK=sIPwT5NtscWBB8`=IO;LB2zldh$ zOJ&*!)8hbD+r{%uW0*?|l}_jVbbsV__(kz6N<(v-5skFP*V<`w2o@2kAY?T*SXk$cl(P7T1s2hxpCK^`!2Jd)b6Cbf)pQ4 zb@)|WUv}|x6vnN5><7AZ%%yU7_n90F=k^#K)46yT%0o6X4IrA~Z!7rm3y6#Vwl7co zS?DMjLC5)>i`(!K5;-b9Q>m0y#i0f8)tvr*0|hQbF*e+WEj$wm z9>Zb8IhRfx%)!oXacQX<<3?XPfz!_85f>kHt4hpu2?!YHKH5L@OQv|C?IV)kbRY=6 z5xr8A{?kE6)6;YBGka`otc{J01Iilzx@qbd zCHdFK0%5V>cmO8w>Y+0StI$U2>E){jzqmp{{7%VmKGf5B>yN=pS_75;tNxyZ&6hSlSEyXo|^y& zGy}XXRGD5=0S(i}dQieU{6kvc%YC_t-)YK^b(xxPLBL0rmYA`Qe^#$vb#z=E%k%PX z`o0l4;$txa(x-J^hVWkhf94bLThVo&n_;af{zM6U>$~`a{ES0tq8v;37);m41%!Oz zhwlR`HM4;RRTF7HeM=^A^m^VZQkR>u165TGm{Pizyk*~gGDyjF?9NMB9@erl{N2^l zA>+6C;>i=wrgJn=Vx__$TsA$N;Fy91wbxTJCuZ?if&>!NNt?Iv<4^Q zM)tma6TFdmL)a)Xa$&*N!NJbK_S%4WxBWnn{@m7zoxY*yUXfYVNP+J|Ticu+#dAQ^ zot;5PSqebk79^vCYb!QA)g9e_a_G=oUk7=L`th<{?a~O1R1|C}IUm6lnua3#`H;#Y z)TbnNq8I5fz9WTF2}*Y%A^T=REi{OX@)ykue65aAd=e+N70=NUM#p9xufm@)(ogq( z+VS%)*vnY%@v1hLa2ocJ<($&N?MH$~TSxq-7_RR2b`R-mYK9*Zjauw*F(*fKl8%4c zd?BEOyfP$FoL8%yk7jJu=}BQM)>>RyD|U8gicS5*rxUz`+rrluc~3u=C@VWyr!cOV zE%04}2E)h3jnd(^-5MEaN!(jC?!x5#uBJ;$#uC_OzG**)hY_%mD)@^Hcf9s(?H_tp zfrR>h>Xz%u=T1*()YIP$VkM`SzmCq;@BQkS!pJhAB^$6^SFTS}D{E>ZI~RBTdrkSduVCtKJqqw&`+D9gg#aV;NS)4tRZN{(Y&=SDb0g>c(yFOPHO|byP&6u4V=gsrgT)qF13?PXg)p4y`F-v_{cihm6Zo@S z#{kd;&aw(ElT7KpyPKMt`gH2@i}eEm881=ge(|Bj9}_r=5MfWZbU7g*Bh|+H7PPHN z)`ijqpf|HQ91xq~%LxFFjbjOb-(t`a)GwXOKtf&Ho|T`?KtNroOk{b&-Q0B?oSt#n zzEVbUu-uIsHjO`LX#yS{JZ<@=5V&7Rn%R5vhRPj_KH!1bqbqiCBY8UT<90;?4IL_^ z51eXu`tf}Ng>P^Aaic`llxKa#p|xNP!C{JCY6bVk_uRCCThY@cX3HnUqA$nNp8&QN z6Gi}0ESFY1IXQ_m$X2;;4tbhv-<@26;8sfb^yv;n*yzDxM?B)1Ocqk}L8M`YleeK^ zLeuP~2C2)#`GSow(|4pKkU6-=JJLid3OL&EQt%+1tz7wjdYgWS(!#15fS8_=J&dW94FmX z)9ATvb>8PC2)0qN8#iY6Z@eC^Bh*(_`rzyE)5GY{R&qm}JDLRtoii{H!s~Iapw0V`GuO5>)T93Yxg)970^xpm!WvTeCpHoRaN% zhiq(SWn`+SV&%gf{lG|wZnk>S;GnIu_Ldkuzvd8f=+h?z61kRLSWy-qDDL=2RTZ`| z>A$;T<1R@4*XPm=aj&nFmzOW>rWu(WCWS{^!O`S~%vAHL$Ttx(Y72v_=Gcn8Mvn3< zLV(P#Q7`cFnWSI69bFO)1Pm6AS{gzw`mkF6c*O1;|~lMLxX<0%(Pa2Pu* zH`fsQpyII4XC~{-n;{F-{(}d`81Mp;829IUd$weKxhOePsFsSgMwsSf67JX{>7rk5U&I|UdK*$?YRSpPQpx90wU=L2 z2#K0VGy9#M8s?bnUoA6zjBl;4tFhceWdC#dIFLLr-GhUEVwn|6)p&5GCD{sE*PG`7{VZOOQZots)`)A0k z7X1>_YR??KJQ9pPs{tYK+pe=`YXOcuvZMvo^rXxN#bYL3F+vynp|D}P$@N@@{I|U( zq3SdndvoureF@dU{pW==F0WPv4b=?ksZSk_Vhi%#ANyc?Ui$7`kwK6LdCq67QWz_` zzl^8!bJl`FIbnpf=8}%8y?5u76tE+E&aBNC#e=a@GTZJx7QQ23R^of>$h^zy}A0ke>aOnyy_tOSVi-?oXM-O3j^kPH3Mog(kLd)iNS%S)7w z*5F_?(&STkjiomm0DPgk*mXvKW}pM-COK|ZRN;R5!Fbl02;3waX}`%GLf%mf1nj%4 zj#pl1hma1Jr>cC3ODXQ*bR6HX#5DmP9}8|p7wcYl^kgMZ=|O+JEZoD~d@|zQRHg+lVIi%bse|kLYOeg{uBT@ho zmBk)D>sg(uoj3GK!{(<2@qY}p=>q`l`Bk_xs1$#o`E5MnKP^bYJcO)s9x0An_zHeNjXi`km=J%Y1_nsIG2nAP($`M?Wp5__g2*hvwSJxm z_~Bxr75HZ*wh5UD4c1&M-uOi!>M_;G9pU92rhmb=!&VOGTu zYZZdY1*wlSWXgG>dH@C-ndI3I1I|UQ^KO>Dg6hF1YRa{X*oO+#$lDVzcdV7Fchh^< z$0Kf4+)z!E?=MzC&l7PgXB4*|PO~Nu^)W8>7NnF0yI38qUb?4tQ$Pl4&@0zV0bCzF zIpG56MWJ4*)3CGkj|Rkr!an!YPnCF|*xK_NwLx8fJJ2-=T6d!#T@H!1-yW}!OAD= zW{(V2+h3oa2h!++XuW$`S9M@ei8Pv$o{;q|>)XfJ^cpzX5~>GA|L=Mu_#hB@vcd7O z9kZIMD6<;q_rT^BMDY`IiOiyEqIDt{6MdG`rnwvHREYa){q6SUC(G~L840+mi9x8+ zadO%xj%m4#;S_iN=FB?}2I3R~336$)1_q3Tjb0^^#t0Op4I8>tGT z3p2CY63HiS`1;o)Rui5p4O2zrF^I?XOA#`v-A0M;+s0j-w;M=(I#@EsM?-(94>7FJXUTl6q#3Kz#=&xS&AbJ~unSg;+acI-s%L8}o zRP;bzHZaf~1d-c^4BDk~WC>`$cz0`uTK#_AE63!_OdF{mZa$lR z{b?u$T;;0~eBA)W$<^2F+YYQRvm%>{+f6oHb64pAWl`q(^9|x%119Oa^DO4CZQOhJt4~;BT%mnQRr+Tkoz!R4!k@jSDX&AqZLY}# zJvJBut%INe5>#iyE8GK21H1J_PjWOLJ$mm8=!9tJl^1p*kpT;vzdQqd3$yrTWb#;V zn-f3H>e{|!0*YH_vNaIf3^OHrPOMyyC`&&OFZWa64 zJSaGr>P2w=5v=cB@CbGnZ0}}bL?nWm#5^K`^EERx+=#qM``B92au9SY?j@Q#&0XnLZ zl|jq3PW-5G)tiGk(f*SEs21YYgny|u2V61s_&)|>;sw>z)ePDRp_T&To_Wt{BY1A! z6eoA^3Olo@!(csc8Tp=k{B%$3U5Jwu7{f{2CYXfouM;uiT}hXe6iYNUC0$NZOz@Z& zWK79rcB@xqb`~73qMsa7HGKRVuK@sk)k6^(Q`|u{<3y@EFYgM)_aM2WlSYI1FI*)g z@`hFFP&h5OQF0MgZAjdE#Pk!jC@HE7AdJZpnxuSOh7Y+c@QfUwGg*$-Qy~`0^(1J^_eZmwTKkupD#+#6S&dS$*6BqAX;N*kqC&QVhdm?5hi#bNWHHNT;ue#$c-sF^+(5o$?WkToX-&1^< z6Rb+Sdpu-(yDVM4YB@H~vSeDmK4j-$OQ$}4c|WztPt^SZzo(F)Q1x04ro>U|X%iYP z64KS22uC%eeIXwBS;@4PNxqIw}Es={B}d+$sfKW!bz#6@L=kgN7Ne| z{7a(pX5G!?J5QLxxBy`JrP#U9C?RPbYmpw~pc(59I*w)X=1{E??aeyrXC7Bw`Ja)A zUop< zd0l2!(?9o{LYg~O6wo(bRHTeVj^J`kw6IbLL>+SakAYQW+q)8B$H6SLFH=Xc!g;xU zzni%>2xqr?{1JDRnc6LF(<=ktBP#CCZV7f8!Veq21{SDk7#5fwHp6MGDv4TnjowGW zdHZ&C#g0;Qc^SSP8Hpb*xj*fE`%@?EziR>TffGJgjf#HZraFS(NA>?eZ;0%*+=8Hw zE0=S%pCP4c=fP9uas3GKhceJSjVcc_oq1ux#WsX(HcB+6^MeJ-mvmd5G<>sEtX#x= za7-S)R8V=``U~}1cdteQ1>5Aya23AS2qDxoAVvwIx68sC_fmJ3x1}zsgaWB_J#2tr z@kI|h<;Av5PNjM|@=!!ZdhKIX`);$n-R##f>*jVe$83jv?|+@hagNppb$ktMmA^M2 z=s6T$ssT$g$=vjdUx<58^l>&W!44J0ehlb3(oHiR+CM)2Rrh+n1)7SpF!p22=1!-d z#wMu983qW6c8%_T(NEXQe=l?g zgKEUGN}D@4{e)B+cCQ#HrcXMY z`+WA@u+rXfBfUzE!u|{LbjY+Ean?vf=@_{ncY{z<=Sp&JIjdh{Xh;6FaBj~zs*ObX zaHzmwD`XJeTO^$LOnI7CN0E@=YcmU7pA3G{XTh09i^8|P1B1WMCMuR^8V+KF6X!P+ ztNf*muK$mDO-XRG4IRz$Elo}BwHPfI`}uEwV{j?h^!Qx$0+T8=d=088b$Q2yeC^#N z_Kecg>DKRU>^&w3_lxBKg|x^i-)XzFUer>eF)W`yoGU7nfyZ z{NEV`O-b)F;2RrLeirItd=r9_Qv{9OunVR5>Yw1bE9_N7;&hdKBEi)YxsjI9p-`nbh zH+lAp+SsEC^A40))pUFKsDOVEr@~%v|0ZzOIJ*YFP99Vt5LjZ*mbZvlo!GsG?+SVT zAk2``OeekFUoIjPCeg4Wq*2w?5TBIUJ>j?hyT3xF5VY4c9sLZ@{+ETVyTYz3UD1Cm6|^JX1P<37d|97i$n|k@62|nAdMt|Qo|)xwmjC6 z9>_`xxz>X5U7m^66F~*cl$bI0vVa^GY#C*xvIQ3gaf8Y^%wET?k>-^vq1Si&4kB3U z%5V1R0?H5Nj~jw{G@_}!nc#0-Ckv@QsU^hL!LPZF*iF84?Gzbh$zJmjQbNIF-y%o4 zTlEU8GLF~@z;!=P8P6YkP@Jjx9vv1JmBT%XTV|UvHg+-{&xNL-ntir>y%(7rE(6T0 z4tKfT*8Rvoj{?rgUNpZDl{I=`rhFH5Tz1RZD1OaJ!_;Y4><0YOd8!*&^Ysa8#xd_KyD4j}iw6iW{xT5-d-^T9~?!sOtFVbk4Pilo7`x_J}~ zUphOlqqTko(J~XUEB<(J9T6Zo^qaJ_A-EL-+}#aS@z~S&g29b@xgaY<+U9pw|MzU?CAe znjG5-4%C4k4)vtT-U|AW>6J$dj>^5NwJxCf4+v|`z%szDF!ZKfUPepHx?FGIp3nNI8h2!@5UWS%!P|T2JghPz1d|&T1Y77i}w&F0$ zcl>zdxe(o_OLt<@ zg9}I8>qJFl1(CibawWBEYXTzjA`lCdH!);qDLr_Or;#TsE8Eh4wYgDZu)s)!SHfrJ zgALt#&hp^am^TPT*eIAXEHEk0t(UU+$Kw>BG1tGLXJ(c-tahlG?sx8MKp7ZVlpSCU z@0j@=x$l$<6Bm4O6(b8JRQh`xHg0~-f z&r~;VIXx+kJRp=TRUUryu5H9B_!fjVLSeQ^48h?tHisnnGS_l>#m@c(h}#V6MWzz? zI)|0=-nz}n@=sh`6(jI<=ap$HaXe)=>{|R>gu*f*+wODM^h3FH7joZUb7R!pEDrSF;~Tq8oi2R zV=_}(2U9qf(Xd7dLhVirhnrJIVxrN{Li~wZSZ-w2q*PE}T)Q46C-vj-{q={t3dNk3 z%kqW@1yPTwSH8lw4}cjFgpw?5pWti=b}0{ zBYz6+`%P%B)31)9tgLw`gxQ4fd!+4&132x!H@Ey#{!#wGzbWVbOjYDBxSz@ThduO5 zj;9RWe|Iu}%la?!1_0)?X!vsI;%>g)OWMq?u&{{4vUA`h0e$aE2gXvc zV^tLbmF$OmQU~d??&xak&F_I)=9Hjq0|aHk`GA3Eo8)l%mFpemtAtpwbEgA>ejehu zA_|5(c9k`BmyTl>z$pV?o`QtA4tW~om~8(go8K#ETI1i2E>oOQ1tSb}(evBA+|;2~ zXTa+&3MJSfMV0S zefV@RVdj8(_~HnruSL8&P0p8wOL9`Yo4_hER_njBd8AH0?kurm)Xo2N?e7F%Oj2Er z%l!IvVZ6fGe|i{{VeGK0;xK+%L{UJ-pM)*%RQ$m(_a026s%e}7A|pSO*tqnJqd$Mf z$-(@b6$8Zc?Yr3_Q41U%w#mbN$4VuAiHo?loRXw}iQS>(rTn!p9Prr~+?v-R2QRGX z4u~T-cMlH!c-E@3;7)K(UV@=IZ?QNF<)A^TfsW}e06^^a zuZ4o8z+++#m+KtfG|i4yI}=h(#MTD$??AHJRz&Gk)eSGwT{-X13>H!JpMKId6?rvSrDx<7F&Gs9K%lU|NJ;xiL?uss&W>Bxc9&@ z#N9&&vR$%$_ULGsdzTb+z^#fm=qIuF!!b94du`#A5@%b%_18+;1@!X`%Nstn>siVt z1PtOi1atr3dH&_SbV?vHwfbzsW?;otfrxkG31lh#M>*5t|K8o806?Z{>QhKRWkGKX z5jz@Cx`A&iF6KRypeDI&fj(davj1z*FUD{I%BsJ`y_LjcIu)Auaf+UQMOp7^|0VCY zST|^+SHBrrI8)1<@aLM)ziiuehU&rI=g-0(m_!jXt`+4D^TeMUL(iUS>iw5+gaZ^1 z2>8P}I@HKj26pg?$8IpgRUuFpgG+5B%0&eOb2rKnk1gMXg&iL3f)dPn`=c`TB{~sQ z$H^bn`Zj|%r%Sx~%aBA)%1{grm|xB~CmXe$g}cMqn?U*XCZC8|&B2*guh~=4?)c|6 zfAlsS95+xOPq?9Mh$SPj<7Z_*Y(E9tu_T>7@BYA;u<+G^l3^%Jd}q-yhr2C?L1_7u zVlT886)3)&lA$S*G~U-2)dq5*tRkrsIY(({6TnuW8u)Gfxy^G^p=mnA>(`78;hgM; z>jpi&prV;cb!it^eHlX$^7M1A4V7%y8HkT=E^k*2h~9K`~6s%II!O71Hb>77Yl9unS_{w zg=`;Qq4ea0O2>gEHxCQVYrw@VI9&r+lD#|l)d4JOMPbrFQ^7LgvmKX@7Y^t|o5_ge z9w<>*|9!punPJKg3CWeDY{UcLxDBrWtgfy$ZE$YQCdcn#hZtk=lEEUm0?TM-ixCOv zj*-4yKV`!;O)v`J_bsPn?*9U-O|`}`e`ZVh((4_5f2(4tzXM6BpFVE;-CDHg?&Mn# zdE2D&ID$KbUBZ5{#4Lm{R>;g!kNDtK+N#5;Udeyf8sLL9buU5fXBe`+c1#8fz2Up1 zZoa$geKKw*8XS)XKv72F5gMZpKTVwM>l!- zdV^ha_h2XE1|e^$LgM1$%nJ;=AxfH~n_z8}WtF|1w)RGM6>Md^TF=k#0CaJlC+{yB zaag5E1ok+WL`B-Ll{<9*{H~jL#fzT;2)#a=0Xi-=l=S`LVCF;qCcmWQaDXn_vX1gR zUHZ=KKcLFk)4KVqYnQP3nO#&AtfXzT%JaA9S=z_Rg^+_MB4Y{f9vB-NgEa~hxDaB} zvbJ5iXW%3VA%=5^og%0%JnMSrxAUR@vc=|(0x&h)>~2=Y9&VGoRLLo~X6gCR)YMeH zMU?)bmX1=$+|NibzK=L6xiQk--Yz=%*;tdr#Wj%Qm1pG8%_ZTfnl@gcw$PeEDtVG~ zp&)1StH=D;g@siS?NZ4C{*JkvPL9@=7Y+VX zH|@#lqW7<;8A8zEoXiGxQ?_lF1a`|wnVYqQvCUgeBaE)?nAF4)?TF}5qb~lb!zV7 z{SZwodbeYa9R_+x!$l@Z@b*TjB{MVsjiiT%lCEI3{-@{I+_6@&l)I$we%D1Ys{R9T_fWK6hJBe0`?m3sUti+bnk{PrPK>-r)N!f{HO}Ni zY{GQQ`@qeprS24QNAb-KlFG)_Oh+g6mQsH&OXop;7+4)l7n5=2>eW>bRN@`~Y4Jsb z(msJ(dST|*YtVs$_xAlFUA)Z}q5_(JcU~PJ=*Q6xfqLeZD0Dzvgd}4r_*;=h=H*9U z?VA=Om%2XhX7noIC-a+DVhR36JzZVL(z7a66JF0I_Cp?l0|w6QU%z{h=EzpFJO_`9 zFHUT?O(UhLV?jR1?) zj@j5wryfc*GY6I)a#8h`-6>e!Bl=u;JWCySjW)tp`zv$7Fw&Z=&!c;gX`r46U&^{7q&_PB1JW#7OIs-ob!*M|Q{1eODmeN(A&A23j zXBY{d<=8pe#d*!D)HDp2Xss}eVDLl4VA`BUMt=WgRYCb@PspgbqiJTm#Ygy=9QS%+ z>J4QuM2+YOJafh3PA>Q!&@ga-*6dwnmG}E%mQSC2kPX{wqM{aaH6m7(^4E1O9)Mqs zL_RsR#N)1MPMMV7{KDvPS``_(oenJ6rbQLAcsU$5fFp}xayv0Yw*J1%1uGG|xeJ=I z8;kZ1@w(l13K37#J7$9>E{>|IGe14m;E!{`5nOk0$7emT8&R$QDH;Lp@wvdje4PRi z29_R!mgS#URKOLRzuI1W5X8Pz=@JniuTph9|J(c}xDV;>-!>2s+Ftl88(;o81009l zx(5J1S3JOdRG=ABJ>B8}>a+W&rV5~mkyUi}cyW4N*jL0TM z0+5F=n$;EDK74f#ZTDR$~xnai&0rj)%RDMgm7GEz?XqbcZD8KOF^9QUF^c%issJ!~*Q4t0_D zjn{P1?vR-ykblmc&OpZNQYif>+r1~W%WyN6Evg`piIf}uWe=MbE}c_Htfu(9EI9Nl z)_-}+hOH)Kiw{u0vd#lS&*;A-rBPsGZw>d@!k_*GrSS%oXMEmb>o=nh?XMXB3yYPx z-N9Ep071wTgWpL+?IiT%m6{L&0x76x9s5kL3nJ-@Se^Qx|^@2xWzW`x*ap{D%Vnp}>DA z@c$1AkkAU!*H5Q%Wt;4y@)uFKchf{W#Lf= V_srl~@6%U4RMS>1zHj~Ne*uvr}ZJvGg82n47-Mw}hi8-5!tzZ_Zk8Rv5MNW`5td%3uu};L!3i&$cBBtir zH?7~rB~8_De4MO&40-vh3~(;zg|bv(@!<^@4AJ zTmMX8_OPGWNuU3sKmWD51OSHW{DK&xLvjUA-4M zOU3fuiE*@xF|EZCTDih1W34qpY2ykdq|4dVboOlsRWGGDoSLeyuD5A@J$~9>zyBli zFy=ozy0*ETci|qs-*^hxd%wut`|&?Wd$Csem(Exr&9P}~ou{YyE6G3I|E$s};Ib^< z=dWM#H!9x$!jw)(HHVb(;m`9=!ON}QWEAFT1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ W0R#|0009ILKmY**5I_Kdi~>(Nmriy7 literal 0 HcmV?d00001 diff --git a/gulliver/thirdparty/pear/console_getopt/.gitignore b/gulliver/thirdparty/pear/console_getopt/.gitignore new file mode 100644 index 000000000..783582816 --- /dev/null +++ b/gulliver/thirdparty/pear/console_getopt/.gitignore @@ -0,0 +1,6 @@ +# composer related +composer.lock +composer.phar +vendor +README.html +dist/ diff --git a/gulliver/thirdparty/pear/console_getopt/.travis.yml b/gulliver/thirdparty/pear/console_getopt/.travis.yml new file mode 100644 index 000000000..2711415f5 --- /dev/null +++ b/gulliver/thirdparty/pear/console_getopt/.travis.yml @@ -0,0 +1,9 @@ +language: php +php: + - 7 + - 5.6 + - 5.5 + - 5.4 +sudo: false +script: + - pear run-tests -r tests/ diff --git a/gulliver/thirdparty/pear/console_getopt/Console/Getopt.php b/gulliver/thirdparty/pear/console_getopt/Console/Getopt.php new file mode 100644 index 000000000..0da88585d --- /dev/null +++ b/gulliver/thirdparty/pear/console_getopt/Console/Getopt.php @@ -0,0 +1,360 @@ + + * @license http://www.php.net/license/3_0.txt PHP 3.0 + * @version CVS: $Id$ + * @link http://pear.php.net/package/Console_Getopt + */ + +require_once 'PEAR.php'; + +/** + * Command-line options parsing class. + * + * @category Console + * @package Console_Getopt + * @author Andrei Zmievski + * @license http://www.php.net/license/3_0.txt PHP 3.0 + * @link http://pear.php.net/package/Console_Getopt + */ +class Console_Getopt +{ + + /** + * Parses the command-line options. + * + * The first parameter to this function should be the list of command-line + * arguments without the leading reference to the running program. + * + * The second parameter is a string of allowed short options. Each of the + * option letters can be followed by a colon ':' to specify that the option + * requires an argument, or a double colon '::' to specify that the option + * takes an optional argument. + * + * The third argument is an optional array of allowed long options. The + * leading '--' should not be included in the option name. Options that + * require an argument should be followed by '=', and options that take an + * option argument should be followed by '=='. + * + * The return value is an array of two elements: the list of parsed + * options and the list of non-option command-line arguments. Each entry in + * the list of parsed options is a pair of elements - the first one + * specifies the option, and the second one specifies the option argument, + * if there was one. + * + * Long and short options can be mixed. + * + * Most of the semantics of this function are based on GNU getopt_long(). + * + * @param array $args an array of command-line arguments + * @param string $short_options specifies the list of allowed short options + * @param array $long_options specifies the list of allowed long options + * @param boolean $skip_unknown suppresses Console_Getopt: unrecognized option + * + * @return array two-element array containing the list of parsed options and + * the non-option arguments + */ + public static function getopt2($args, $short_options, $long_options = null, $skip_unknown = false) + { + return Console_Getopt::doGetopt(2, $args, $short_options, $long_options, $skip_unknown); + } + + /** + * This function expects $args to start with the script name (POSIX-style). + * Preserved for backwards compatibility. + * + * @param array $args an array of command-line arguments + * @param string $short_options specifies the list of allowed short options + * @param array $long_options specifies the list of allowed long options + * + * @see getopt2() + * @return array two-element array containing the list of parsed options and + * the non-option arguments + */ + public static function getopt($args, $short_options, $long_options = null, $skip_unknown = false) + { + return Console_Getopt::doGetopt(1, $args, $short_options, $long_options, $skip_unknown); + } + + /** + * The actual implementation of the argument parsing code. + * + * @param int $version Version to use + * @param array $args an array of command-line arguments + * @param string $short_options specifies the list of allowed short options + * @param array $long_options specifies the list of allowed long options + * @param boolean $skip_unknown suppresses Console_Getopt: unrecognized option + * + * @return array + */ + public static function doGetopt($version, $args, $short_options, $long_options = null, $skip_unknown = false) + { + // in case you pass directly readPHPArgv() as the first arg + if (PEAR::isError($args)) { + return $args; + } + + if (empty($args)) { + return array(array(), array()); + } + + $non_opts = $opts = array(); + + settype($args, 'array'); + + if ($long_options) { + sort($long_options); + } + + /* + * Preserve backwards compatibility with callers that relied on + * erroneous POSIX fix. + */ + if ($version < 2) { + if (isset($args[0]{0}) && $args[0]{0} != '-') { + array_shift($args); + } + } + + reset($args); + while (list($i, $arg) = each($args)) { + /* The special element '--' means explicit end of + options. Treat the rest of the arguments as non-options + and end the loop. */ + if ($arg == '--') { + $non_opts = array_merge($non_opts, array_slice($args, $i + 1)); + break; + } + + if ($arg{0} != '-' || (strlen($arg) > 1 && $arg{1} == '-' && !$long_options)) { + $non_opts = array_merge($non_opts, array_slice($args, $i)); + break; + } elseif (strlen($arg) > 1 && $arg{1} == '-') { + $error = Console_Getopt::_parseLongOption(substr($arg, 2), + $long_options, + $opts, + $args, + $skip_unknown); + if (PEAR::isError($error)) { + return $error; + } + } elseif ($arg == '-') { + // - is stdin + $non_opts = array_merge($non_opts, array_slice($args, $i)); + break; + } else { + $error = Console_Getopt::_parseShortOption(substr($arg, 1), + $short_options, + $opts, + $args, + $skip_unknown); + if (PEAR::isError($error)) { + return $error; + } + } + } + + return array($opts, $non_opts); + } + + /** + * Parse short option + * + * @param string $arg Argument + * @param string[] $short_options Available short options + * @param string[][] &$opts + * @param string[] &$args + * @param boolean $skip_unknown suppresses Console_Getopt: unrecognized option + * + * @return void + */ + protected static function _parseShortOption($arg, $short_options, &$opts, &$args, $skip_unknown) + { + for ($i = 0; $i < strlen($arg); $i++) { + $opt = $arg{$i}; + $opt_arg = null; + + /* Try to find the short option in the specifier string. */ + if (($spec = strstr($short_options, $opt)) === false || $arg{$i} == ':') { + if ($skip_unknown === true) { + break; + } + + $msg = "Console_Getopt: unrecognized option -- $opt"; + return PEAR::raiseError($msg); + } + + if (strlen($spec) > 1 && $spec{1} == ':') { + if (strlen($spec) > 2 && $spec{2} == ':') { + if ($i + 1 < strlen($arg)) { + /* Option takes an optional argument. Use the remainder of + the arg string if there is anything left. */ + $opts[] = array($opt, substr($arg, $i + 1)); + break; + } + } else { + /* Option requires an argument. Use the remainder of the arg + string if there is anything left. */ + if ($i + 1 < strlen($arg)) { + $opts[] = array($opt, substr($arg, $i + 1)); + break; + } else if (list(, $opt_arg) = each($args)) { + /* Else use the next argument. */; + if (Console_Getopt::_isShortOpt($opt_arg) + || Console_Getopt::_isLongOpt($opt_arg)) { + $msg = "option requires an argument --$opt"; + return PEAR::raiseError("Console_Getopt: " . $msg); + } + } else { + $msg = "option requires an argument --$opt"; + return PEAR::raiseError("Console_Getopt: " . $msg); + } + } + } + + $opts[] = array($opt, $opt_arg); + } + } + + /** + * Checks if an argument is a short option + * + * @param string $arg Argument to check + * + * @return bool + */ + protected static function _isShortOpt($arg) + { + return strlen($arg) == 2 && $arg[0] == '-' + && preg_match('/[a-zA-Z]/', $arg[1]); + } + + /** + * Checks if an argument is a long option + * + * @param string $arg Argument to check + * + * @return bool + */ + protected static function _isLongOpt($arg) + { + return strlen($arg) > 2 && $arg[0] == '-' && $arg[1] == '-' && + preg_match('/[a-zA-Z]+$/', substr($arg, 2)); + } + + /** + * Parse long option + * + * @param string $arg Argument + * @param string[] $long_options Available long options + * @param string[][] &$opts + * @param string[] &$args + * + * @return void|PEAR_Error + */ + protected static function _parseLongOption($arg, $long_options, &$opts, &$args, $skip_unknown) + { + @list($opt, $opt_arg) = explode('=', $arg, 2); + + $opt_len = strlen($opt); + + for ($i = 0; $i < count($long_options); $i++) { + $long_opt = $long_options[$i]; + $opt_start = substr($long_opt, 0, $opt_len); + + $long_opt_name = str_replace('=', '', $long_opt); + + /* Option doesn't match. Go on to the next one. */ + if ($long_opt_name != $opt) { + continue; + } + + $opt_rest = substr($long_opt, $opt_len); + + /* Check that the options uniquely matches one of the allowed + options. */ + if ($i + 1 < count($long_options)) { + $next_option_rest = substr($long_options[$i + 1], $opt_len); + } else { + $next_option_rest = ''; + } + + if ($opt_rest != '' && $opt{0} != '=' && + $i + 1 < count($long_options) && + $opt == substr($long_options[$i+1], 0, $opt_len) && + $next_option_rest != '' && + $next_option_rest{0} != '=') { + + $msg = "Console_Getopt: option --$opt is ambiguous"; + return PEAR::raiseError($msg); + } + + if (substr($long_opt, -1) == '=') { + if (substr($long_opt, -2) != '==') { + /* Long option requires an argument. + Take the next argument if one wasn't specified. */; + if (!strlen($opt_arg) && !(list(, $opt_arg) = each($args))) { + $msg = "Console_Getopt: option requires an argument --$opt"; + return PEAR::raiseError($msg); + } + + if (Console_Getopt::_isShortOpt($opt_arg) + || Console_Getopt::_isLongOpt($opt_arg)) { + $msg = "Console_Getopt: option requires an argument --$opt"; + return PEAR::raiseError($msg); + } + } + } else if ($opt_arg) { + $msg = "Console_Getopt: option --$opt doesn't allow an argument"; + return PEAR::raiseError($msg); + } + + $opts[] = array('--' . $opt, $opt_arg); + return; + } + + if ($skip_unknown === true) { + return; + } + + return PEAR::raiseError("Console_Getopt: unrecognized option --$opt"); + } + + /** + * Safely read the $argv PHP array across different PHP configurations. + * Will take care on register_globals and register_argc_argv ini directives + * + * @return mixed the $argv PHP array or PEAR error if not registered + */ + public static function readPHPArgv() + { + global $argv; + if (!is_array($argv)) { + if (!@is_array($_SERVER['argv'])) { + if (!@is_array($GLOBALS['HTTP_SERVER_VARS']['argv'])) { + $msg = "Could not read cmd args (register_argc_argv=Off?)"; + return PEAR::raiseError("Console_Getopt: " . $msg); + } + return $GLOBALS['HTTP_SERVER_VARS']['argv']; + } + return $_SERVER['argv']; + } + return $argv; + } + +} \ No newline at end of file diff --git a/gulliver/thirdparty/pear/console_getopt/LICENSE b/gulliver/thirdparty/pear/console_getopt/LICENSE new file mode 100644 index 000000000..452b08839 --- /dev/null +++ b/gulliver/thirdparty/pear/console_getopt/LICENSE @@ -0,0 +1,25 @@ +Copyright (c) 2001-2015, The PEAR developers +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/gulliver/thirdparty/pear/console_getopt/README.rst b/gulliver/thirdparty/pear/console_getopt/README.rst new file mode 100644 index 000000000..64e5b41be --- /dev/null +++ b/gulliver/thirdparty/pear/console_getopt/README.rst @@ -0,0 +1,26 @@ +******************************************* +Console_Getopt - Command-line option parser +******************************************* + +This is a PHP implementation of "getopt" supporting both short and long options. +It helps parsing command line options in your PHP script. + +Homepage: http://pear.php.net/package/Console_Getopt + +.. image:: https://travis-ci.org/pear/Console_Getopt.svg?branch=master + :target: https://travis-ci.org/pear/Console_Getopt + + +Alternatives +============ + +* Console_CommandLine__ (recommended) +* Console_GetoptPlus__ + +__ http://pear.php.net/package/Console_CommandLine +__ http://pear.php.net/package/Console_GetoptPlus + + +License +======= +BSD-2-Clause diff --git a/gulliver/thirdparty/pear/console_getopt/composer.json b/gulliver/thirdparty/pear/console_getopt/composer.json new file mode 100644 index 000000000..4dc7e7cca --- /dev/null +++ b/gulliver/thirdparty/pear/console_getopt/composer.json @@ -0,0 +1,35 @@ +{ + "authors": [ + { + "email": "andrei@php.net", + "name": "Andrei Zmievski", + "role": "Lead" + }, + { + "email": "stig@php.net", + "name": "Stig Bakken", + "role": "Developer" + }, + { + "email": "cellog@php.net", + "name": "Greg Beaver", + "role": "Helper" + } + ], + "autoload": { + "psr-0": { + "Console": "./" + } + }, + "description": "More info available on: http://pear.php.net/package/Console_Getopt", + "include-path": [ + "./" + ], + "license": "BSD-2-Clause", + "name": "pear/console_getopt", + "support": { + "issues": "http://pear.php.net/bugs/search.php?cmd=display&package_name[]=Console_Getopt", + "source": "https://github.com/pear/Console_Getopt" + }, + "type": "library" +} diff --git a/gulliver/thirdparty/pear/console_getopt/package.xml b/gulliver/thirdparty/pear/console_getopt/package.xml new file mode 100644 index 000000000..7e8deb0e8 --- /dev/null +++ b/gulliver/thirdparty/pear/console_getopt/package.xml @@ -0,0 +1,269 @@ + + + Console_Getopt + pear.php.net + Command-line option parser + This is a PHP implementation of "getopt" supporting both +short and long options. + + Andrei Zmievski + andrei + andrei@php.net + no + + + Stig Bakken + ssb + stig@php.net + no + + + Greg Beaver + cellog + cellog@php.net + yes + + + 2015-07-20 + + + 1.4.1 + 1.4.0 + + + stable + stable + + BSD-2-Clause + + +* Fix unit test on PHP 7 [cweiske] + + + + + + + + + + + + + + + + + + PEAR + pear.php.net + 1.4.0 + 1.999.999 + + + + + + 5.4.0 + + + 1.8.0 + + + + + + + + + + 2015-07-20 + + 1.4.1 + 1.4.0 + + + stable + stable + + BSD-2-Clause + + * Fix unit test on PHP 7 [cweiske] + + + + + 2015-02-22 + + 1.4.0 + 1.4.0 + + + stable + stable + + BSD-2-Clause + + * Change license to BSD-2-Clause + * Set minimum PHP version to 5.4.0 + * Mark static methods with "static" keyword + + + + + 2011-03-07 + + 1.3.1 + 1.3.0 + + + stable + stable + + PHP License + + * Change the minimum PEAR installer dep to be lower + + + + + 2010-12-11 + + + 1.3.0 + 1.3.0 + + + stable + stable + + PHP License + + * Implement Request #13140: [PATCH] to skip unknown parameters. [patch by rquadling, improved on by dufuz] + + + + + 2007-06-12 + + 1.2.3 + 1.2.1 + + + stable + stable + + PHP License + +* fix Bug #11068: No way to read plain "-" option [cardoe] + + + + + 1.2.2 + 1.2.1 + + + stable + stable + + 2007-02-17 + PHP License + +* fix Bug #4475: An ambiguous error occurred when specifying similar longoption name. +* fix Bug #10055: Not failing properly on short options missing required values + + + + + 1.2.1 + 1.2.1 + + + stable + stable + + 2006-12-08 + PHP License + +Fixed bugs #4448 (Long parameter values truncated with longoption parameter) and #7444 (Trailing spaces after php closing tag) + + + + + 1.2 + 1.2 + + + stable + stable + + 2003-12-11 + PHP License + +Fix to preserve BC with 1.0 and allow correct behaviour for new users + + + + + 1.0 + 1.0 + + + stable + stable + + 2002-09-13 + PHP License + +Stable release + + + + + 0.11 + 0.11 + + + beta + beta + + 2002-05-26 + PHP License + +POSIX getopt compatibility fix: treat first element of args + array as command name + + + + + 0.10 + 0.10 + + + beta + beta + + 2002-05-12 + PHP License + +Packaging fix + + + + + 0.9 + 0.9 + + + beta + beta + + 2002-05-12 + PHP License + +Initial release + + + + diff --git a/gulliver/thirdparty/pear/console_getopt/tests/001-getopt.phpt b/gulliver/thirdparty/pear/console_getopt/tests/001-getopt.phpt new file mode 100644 index 000000000..75ae8481b --- /dev/null +++ b/gulliver/thirdparty/pear/console_getopt/tests/001-getopt.phpt @@ -0,0 +1,63 @@ +--TEST-- +Console_Getopt +--FILE-- + $d) { + if ($i++ > 0) { + print ", "; + } + print $d[0] . '=' . $d[1]; + } + print "\n"; + print "params: " . implode(", ", $non_opts) . "\n"; + print "\n"; +} + +test("-abc", "abc"); +test("-abc foo", "abc"); +test("-abc foo", "abc:"); +test("-abc foo bar gazonk", "abc"); +test("-abc foo bar gazonk", "abc:"); +test("-a -b -c", "abc"); +test("-a -b -c", "abc:"); +test("-abc", "ab:c"); +test("-abc foo -bar gazonk", "abc"); +?> +--EXPECT-- +options: a=, b=, c= +params: + +options: a=, b=, c= +params: foo + +options: a=, b=, c=foo +params: + +options: a=, b=, c= +params: foo, bar, gazonk + +options: a=, b=, c=foo +params: bar, gazonk + +options: a=, b=, c= +params: + +Console_Getopt: option requires an argument --c + +options: a=, b=c +params: + +options: a=, b=, c= +params: foo, -bar, gazonk diff --git a/gulliver/thirdparty/pear/console_getopt/tests/bug10557.phpt b/gulliver/thirdparty/pear/console_getopt/tests/bug10557.phpt new file mode 100644 index 000000000..08b72ac8f --- /dev/null +++ b/gulliver/thirdparty/pear/console_getopt/tests/bug10557.phpt @@ -0,0 +1,22 @@ +--TEST-- +Console_Getopt [bug 10557] +--SKIPIF-- +--FILE-- +getMessage()."\n"; + echo 'FATAL'; + exit; +} + +print_r($ret); +?> +--EXPECT-- +Console_Getopt: option requires an argument --to +FATAL \ No newline at end of file diff --git a/gulliver/thirdparty/pear/console_getopt/tests/bug11068.phpt b/gulliver/thirdparty/pear/console_getopt/tests/bug11068.phpt new file mode 100644 index 000000000..8bbe4bfce --- /dev/null +++ b/gulliver/thirdparty/pear/console_getopt/tests/bug11068.phpt @@ -0,0 +1,44 @@ +--TEST-- +Console_Getopt [bug 11068] +--SKIPIF-- +--FILE-- +getMessage()."\n"; + echo 'FATAL'; + exit; +} + +print_r($ret); +?> +--EXPECT-- +Array +( + [0] => Array + ( + [0] => Array + ( + [0] => f + [1] => jjohnston@mail.com + ) + + [1] => Array + ( + [0] => --to + [1] => hi + ) + + ) + + [1] => Array + ( + [0] => - + ) + +) \ No newline at end of file diff --git a/gulliver/thirdparty/pear/console_getopt/tests/bug13140.phpt b/gulliver/thirdparty/pear/console_getopt/tests/bug13140.phpt new file mode 100644 index 000000000..4ce13bbf9 --- /dev/null +++ b/gulliver/thirdparty/pear/console_getopt/tests/bug13140.phpt @@ -0,0 +1,75 @@ +--TEST-- +Console_Getopt [bug 13140] +--SKIPIF-- +--FILE-- +getopt2($cg->readPHPArgv(), 't', array('test'), true)); +print_r($cg->getopt2($cg->readPHPArgv(), 'bar', array('foo'), true)); +?> +--EXPECT-- +Array +( + [0] => Array + ( + [0] => Array + ( + [0] => --test + [1] => + ) + + ) + + [1] => Array + ( + [0] => thisshouldbehere + ) + +) +Array +( + [0] => Array + ( + [0] => Array + ( + [0] => --foo + [1] => + ) + + [1] => Array + ( + [0] => b + [1] => + ) + + [2] => Array + ( + [0] => a + [1] => + ) + + [3] => Array + ( + [0] => r + [1] => + ) + + [4] => Array + ( + [0] => r + [1] => + ) + + ) + + [1] => Array + ( + [0] => thisshouldbehere + ) + +) diff --git a/gulliver/thirdparty/pear/pear-core-minimal/README.rst b/gulliver/thirdparty/pear/pear-core-minimal/README.rst new file mode 100644 index 000000000..9e412fbd1 --- /dev/null +++ b/gulliver/thirdparty/pear/pear-core-minimal/README.rst @@ -0,0 +1,26 @@ +****************************** +Minimal set of PEAR core files +****************************** + +This repository provides a set of files from ``pear-core`` +that are often used in PEAR packages. + +It follows the `pear-core`__ repository and gets updated whenever a new +PEAR version is released. + +It's meant to be used as dependency for composer packages. + +__ https://github.com/pear/pear-core + +============== +Included files +============== +- ``OS/Guess.php`` +- ``PEAR.php`` +- ``PEAR/Error.php`` +- ``PEAR/ErrorStack.php`` +- ``System.php`` + + +``PEAR/Error.php`` is a dummy file that only includes ``PEAR.php``, +to make autoloaders work without problems. diff --git a/gulliver/thirdparty/pear/pear-core-minimal/composer.json b/gulliver/thirdparty/pear/pear-core-minimal/composer.json new file mode 100644 index 000000000..d805f56ae --- /dev/null +++ b/gulliver/thirdparty/pear/pear-core-minimal/composer.json @@ -0,0 +1,32 @@ +{ + "name": "pear/pear-core-minimal", + "description": "Minimal set of PEAR core files to be used as composer dependency", + "license": "BSD-3-Clause", + "authors": [ + { + "email": "cweiske@php.net", + "name": "Christian Weiske", + "role": "Lead" + } + ], + "autoload": { + "psr-0": { + "": "src/" + } + }, + "include-path": [ + "src/" + ], + "support": { + "issues": "http://pear.php.net/bugs/search.php?cmd=display&package_name[]=PEAR", + "source": "https://github.com/pear/pear-core-minimal" + }, + "type": "library", + "require": { + "pear/console_getopt": "~1.4", + "pear/pear_exception": "~1.0" + }, + "replace": { + "rsky/pear-core-min": "self.version" + } +} diff --git a/gulliver/thirdparty/pear/pear-core-minimal/src/OS/Guess.php b/gulliver/thirdparty/pear/pear-core-minimal/src/OS/Guess.php new file mode 100644 index 000000000..c45e84f15 --- /dev/null +++ b/gulliver/thirdparty/pear/pear-core-minimal/src/OS/Guess.php @@ -0,0 +1,337 @@ + + * @author Gregory Beaver + * @copyright 1997-2009 The Authors + * @license http://opensource.org/licenses/bsd-license.php New BSD License + * @link http://pear.php.net/package/PEAR + * @since File available since PEAR 0.1 + */ + +// {{{ uname examples + +// php_uname() without args returns the same as 'uname -a', or a PHP-custom +// string for Windows. +// PHP versions prior to 4.3 return the uname of the host where PHP was built, +// as of 4.3 it returns the uname of the host running the PHP code. +// +// PC RedHat Linux 7.1: +// Linux host.example.com 2.4.2-2 #1 Sun Apr 8 20:41:30 EDT 2001 i686 unknown +// +// PC Debian Potato: +// Linux host 2.4.17 #2 SMP Tue Feb 12 15:10:04 CET 2002 i686 unknown +// +// PC FreeBSD 3.3: +// FreeBSD host.example.com 3.3-STABLE FreeBSD 3.3-STABLE #0: Mon Feb 21 00:42:31 CET 2000 root@example.com:/usr/src/sys/compile/CONFIG i386 +// +// PC FreeBSD 4.3: +// FreeBSD host.example.com 4.3-RELEASE FreeBSD 4.3-RELEASE #1: Mon Jun 25 11:19:43 EDT 2001 root@example.com:/usr/src/sys/compile/CONFIG i386 +// +// PC FreeBSD 4.5: +// FreeBSD host.example.com 4.5-STABLE FreeBSD 4.5-STABLE #0: Wed Feb 6 23:59:23 CET 2002 root@example.com:/usr/src/sys/compile/CONFIG i386 +// +// PC FreeBSD 4.5 w/uname from GNU shellutils: +// FreeBSD host.example.com 4.5-STABLE FreeBSD 4.5-STABLE #0: Wed Feb i386 unknown +// +// HP 9000/712 HP-UX 10: +// HP-UX iq B.10.10 A 9000/712 2008429113 two-user license +// +// HP 9000/712 HP-UX 10 w/uname from GNU shellutils: +// HP-UX host B.10.10 A 9000/712 unknown +// +// IBM RS6000/550 AIX 4.3: +// AIX host 3 4 000003531C00 +// +// AIX 4.3 w/uname from GNU shellutils: +// AIX host 3 4 000003531C00 unknown +// +// SGI Onyx IRIX 6.5 w/uname from GNU shellutils: +// IRIX64 host 6.5 01091820 IP19 mips +// +// SGI Onyx IRIX 6.5: +// IRIX64 host 6.5 01091820 IP19 +// +// SparcStation 20 Solaris 8 w/uname from GNU shellutils: +// SunOS host.example.com 5.8 Generic_108528-12 sun4m sparc +// +// SparcStation 20 Solaris 8: +// SunOS host.example.com 5.8 Generic_108528-12 sun4m sparc SUNW,SPARCstation-20 +// +// Mac OS X (Darwin) +// Darwin home-eden.local 7.5.0 Darwin Kernel Version 7.5.0: Thu Aug 5 19:26:16 PDT 2004; root:xnu/xnu-517.7.21.obj~3/RELEASE_PPC Power Macintosh +// +// Mac OS X early versions +// + +// }}} + +/* TODO: + * - define endianness, to allow matchSignature("bigend") etc. + */ + +/** + * Retrieves information about the current operating system + * + * This class uses php_uname() to grok information about the current OS + * + * @category pear + * @package PEAR + * @author Stig Bakken + * @author Gregory Beaver + * @copyright 1997-2009 The Authors + * @license http://opensource.org/licenses/bsd-license.php New BSD License + * @version Release: @package_version@ + * @link http://pear.php.net/package/PEAR + * @since Class available since Release 0.1 + */ +class OS_Guess +{ + var $sysname; + var $nodename; + var $cpu; + var $release; + var $extra; + + function __construct($uname = null) + { + list($this->sysname, + $this->release, + $this->cpu, + $this->extra, + $this->nodename) = $this->parseSignature($uname); + } + + function parseSignature($uname = null) + { + static $sysmap = array( + 'HP-UX' => 'hpux', + 'IRIX64' => 'irix', + ); + static $cpumap = array( + 'i586' => 'i386', + 'i686' => 'i386', + 'ppc' => 'powerpc', + ); + if ($uname === null) { + $uname = php_uname(); + } + $parts = preg_split('/\s+/', trim($uname)); + $n = count($parts); + + $release = $machine = $cpu = ''; + $sysname = $parts[0]; + $nodename = $parts[1]; + $cpu = $parts[$n-1]; + $extra = ''; + if ($cpu == 'unknown') { + $cpu = $parts[$n - 2]; + } + + switch ($sysname) { + case 'AIX' : + $release = "$parts[3].$parts[2]"; + break; + case 'Windows' : + switch ($parts[1]) { + case '95/98': + $release = '9x'; + break; + default: + $release = $parts[1]; + break; + } + $cpu = 'i386'; + break; + case 'Linux' : + $extra = $this->_detectGlibcVersion(); + // use only the first two digits from the kernel version + $release = preg_replace('/^([0-9]+\.[0-9]+).*/', '\1', $parts[2]); + break; + case 'Mac' : + $sysname = 'darwin'; + $nodename = $parts[2]; + $release = $parts[3]; + if ($cpu == 'Macintosh') { + if ($parts[$n - 2] == 'Power') { + $cpu = 'powerpc'; + } + } + break; + case 'Darwin' : + if ($cpu == 'Macintosh') { + if ($parts[$n - 2] == 'Power') { + $cpu = 'powerpc'; + } + } + $release = preg_replace('/^([0-9]+\.[0-9]+).*/', '\1', $parts[2]); + break; + default: + $release = preg_replace('/-.*/', '', $parts[2]); + break; + } + + if (isset($sysmap[$sysname])) { + $sysname = $sysmap[$sysname]; + } else { + $sysname = strtolower($sysname); + } + if (isset($cpumap[$cpu])) { + $cpu = $cpumap[$cpu]; + } + return array($sysname, $release, $cpu, $extra, $nodename); + } + + function _detectGlibcVersion() + { + static $glibc = false; + if ($glibc !== false) { + return $glibc; // no need to run this multiple times + } + $major = $minor = 0; + include_once "System.php"; + // Use glibc's header file to + // get major and minor version number: + if (@file_exists('/usr/include/features.h') && + @is_readable('/usr/include/features.h')) { + if (!@file_exists('/usr/bin/cpp') || !@is_executable('/usr/bin/cpp')) { + $features_file = fopen('/usr/include/features.h', 'rb'); + while (!feof($features_file)) { + $line = fgets($features_file, 8192); + if (!$line || (strpos($line, '#define') === false)) { + continue; + } + if (strpos($line, '__GLIBC__')) { + // major version number #define __GLIBC__ version + $line = preg_split('/\s+/', $line); + $glibc_major = trim($line[2]); + if (isset($glibc_minor)) { + break; + } + continue; + } + + if (strpos($line, '__GLIBC_MINOR__')) { + // got the minor version number + // #define __GLIBC_MINOR__ version + $line = preg_split('/\s+/', $line); + $glibc_minor = trim($line[2]); + if (isset($glibc_major)) { + break; + } + continue; + } + } + fclose($features_file); + if (!isset($glibc_major) || !isset($glibc_minor)) { + return $glibc = ''; + } + return $glibc = 'glibc' . trim($glibc_major) . "." . trim($glibc_minor) ; + } // no cpp + + $tmpfile = System::mktemp("glibctest"); + $fp = fopen($tmpfile, "w"); + fwrite($fp, "#include \n__GLIBC__ __GLIBC_MINOR__\n"); + fclose($fp); + $cpp = popen("/usr/bin/cpp $tmpfile", "r"); + while ($line = fgets($cpp, 1024)) { + if ($line{0} == '#' || trim($line) == '') { + continue; + } + + if (list($major, $minor) = explode(' ', trim($line))) { + break; + } + } + pclose($cpp); + unlink($tmpfile); + } // features.h + + if (!($major && $minor) && @is_link('/lib/libc.so.6')) { + // Let's try reading the libc.so.6 symlink + if (preg_match('/^libc-(.*)\.so$/', basename(readlink('/lib/libc.so.6')), $matches)) { + list($major, $minor) = explode('.', $matches[1]); + } + } + + if (!($major && $minor)) { + return $glibc = ''; + } + + return $glibc = "glibc{$major}.{$minor}"; + } + + function getSignature() + { + if (empty($this->extra)) { + return "{$this->sysname}-{$this->release}-{$this->cpu}"; + } + return "{$this->sysname}-{$this->release}-{$this->cpu}-{$this->extra}"; + } + + function getSysname() + { + return $this->sysname; + } + + function getNodename() + { + return $this->nodename; + } + + function getCpu() + { + return $this->cpu; + } + + function getRelease() + { + return $this->release; + } + + function getExtra() + { + return $this->extra; + } + + function matchSignature($match) + { + $fragments = is_array($match) ? $match : explode('-', $match); + $n = count($fragments); + $matches = 0; + if ($n > 0) { + $matches += $this->_matchFragment($fragments[0], $this->sysname); + } + if ($n > 1) { + $matches += $this->_matchFragment($fragments[1], $this->release); + } + if ($n > 2) { + $matches += $this->_matchFragment($fragments[2], $this->cpu); + } + if ($n > 3) { + $matches += $this->_matchFragment($fragments[3], $this->extra); + } + return ($matches == $n); + } + + function _matchFragment($fragment, $value) + { + if (strcspn($fragment, '*?') < strlen($fragment)) { + $reg = '/^' . str_replace(array('*', '?', '/'), array('.*', '.', '\\/'), $fragment) . '\\z/'; + return preg_match($reg, $value); + } + return ($fragment == '*' || !strcasecmp($fragment, $value)); + } + +} +/* + * Local Variables: + * indent-tabs-mode: nil + * c-basic-offset: 4 + * End: + */ diff --git a/gulliver/thirdparty/pear/pear-core-minimal/src/PEAR.php b/gulliver/thirdparty/pear/pear-core-minimal/src/PEAR.php new file mode 100644 index 000000000..b6bb191e7 --- /dev/null +++ b/gulliver/thirdparty/pear/pear-core-minimal/src/PEAR.php @@ -0,0 +1,1113 @@ + + * @author Stig Bakken + * @author Tomas V.V.Cox + * @author Greg Beaver + * @copyright 1997-2010 The Authors + * @license http://opensource.org/licenses/bsd-license.php New BSD License + * @link http://pear.php.net/package/PEAR + * @since File available since Release 0.1 + */ + +/**#@+ + * ERROR constants + */ +define('PEAR_ERROR_RETURN', 1); +define('PEAR_ERROR_PRINT', 2); +define('PEAR_ERROR_TRIGGER', 4); +define('PEAR_ERROR_DIE', 8); +define('PEAR_ERROR_CALLBACK', 16); +/** + * WARNING: obsolete + * @deprecated + */ +define('PEAR_ERROR_EXCEPTION', 32); +/**#@-*/ + +if (substr(PHP_OS, 0, 3) == 'WIN') { + define('OS_WINDOWS', true); + define('OS_UNIX', false); + define('PEAR_OS', 'Windows'); +} else { + define('OS_WINDOWS', false); + define('OS_UNIX', true); + define('PEAR_OS', 'Unix'); // blatant assumption +} + +$GLOBALS['_PEAR_default_error_mode'] = PEAR_ERROR_RETURN; +$GLOBALS['_PEAR_default_error_options'] = E_USER_NOTICE; +$GLOBALS['_PEAR_destructor_object_list'] = array(); +$GLOBALS['_PEAR_shutdown_funcs'] = array(); +$GLOBALS['_PEAR_error_handler_stack'] = array(); + +@ini_set('track_errors', true); + +/** + * Base class for other PEAR classes. Provides rudimentary + * emulation of destructors. + * + * If you want a destructor in your class, inherit PEAR and make a + * destructor method called _yourclassname (same name as the + * constructor, but with a "_" prefix). Also, in your constructor you + * have to call the PEAR constructor: $this->PEAR();. + * The destructor method will be called without parameters. Note that + * at in some SAPI implementations (such as Apache), any output during + * the request shutdown (in which destructors are called) seems to be + * discarded. If you need to get any debug information from your + * destructor, use error_log(), syslog() or something similar. + * + * IMPORTANT! To use the emulated destructors you need to create the + * objects by reference: $obj =& new PEAR_child; + * + * @category pear + * @package PEAR + * @author Stig Bakken + * @author Tomas V.V. Cox + * @author Greg Beaver + * @copyright 1997-2006 The PHP Group + * @license http://opensource.org/licenses/bsd-license.php New BSD License + * @version Release: @package_version@ + * @link http://pear.php.net/package/PEAR + * @see PEAR_Error + * @since Class available since PHP 4.0.2 + * @link http://pear.php.net/manual/en/core.pear.php#core.pear.pear + */ +class PEAR +{ + /** + * Whether to enable internal debug messages. + * + * @var bool + * @access private + */ + var $_debug = false; + + /** + * Default error mode for this object. + * + * @var int + * @access private + */ + var $_default_error_mode = null; + + /** + * Default error options used for this object when error mode + * is PEAR_ERROR_TRIGGER. + * + * @var int + * @access private + */ + var $_default_error_options = null; + + /** + * Default error handler (callback) for this object, if error mode is + * PEAR_ERROR_CALLBACK. + * + * @var string + * @access private + */ + var $_default_error_handler = ''; + + /** + * Which class to use for error objects. + * + * @var string + * @access private + */ + var $_error_class = 'PEAR_Error'; + + /** + * An array of expected errors. + * + * @var array + * @access private + */ + var $_expected_errors = array(); + + /** + * List of methods that can be called both statically and non-statically. + * @var array + */ + protected static $bivalentMethods = array( + 'setErrorHandling' => true, + 'raiseError' => true, + 'throwError' => true, + 'pushErrorHandling' => true, + 'popErrorHandling' => true, + ); + + /** + * Constructor. Registers this object in + * $_PEAR_destructor_object_list for destructor emulation if a + * destructor object exists. + * + * @param string $error_class (optional) which class to use for + * error objects, defaults to PEAR_Error. + * @access public + * @return void + */ + function __construct($error_class = null) + { + $classname = strtolower(get_class($this)); + if ($this->_debug) { + print "PEAR constructor called, class=$classname\n"; + } + + if ($error_class !== null) { + $this->_error_class = $error_class; + } + + while ($classname && strcasecmp($classname, "pear")) { + $destructor = "_$classname"; + if (method_exists($this, $destructor)) { + global $_PEAR_destructor_object_list; + $_PEAR_destructor_object_list[] = &$this; + if (!isset($GLOBALS['_PEAR_SHUTDOWN_REGISTERED'])) { + register_shutdown_function("_PEAR_call_destructors"); + $GLOBALS['_PEAR_SHUTDOWN_REGISTERED'] = true; + } + break; + } else { + $classname = get_parent_class($classname); + } + } + } + + /** + * Only here for backwards compatibility. + * E.g. Archive_Tar calls $this->PEAR() in its constructor. + * + * @param string $error_class Which class to use for error objects, + * defaults to PEAR_Error. + */ + public function PEAR($error_class = null) + { + self::__construct($error_class); + } + + /** + * Destructor (the emulated type of...). Does nothing right now, + * but is included for forward compatibility, so subclass + * destructors should always call it. + * + * See the note in the class desciption about output from + * destructors. + * + * @access public + * @return void + */ + function _PEAR() { + if ($this->_debug) { + printf("PEAR destructor called, class=%s\n", strtolower(get_class($this))); + } + } + + public function __call($method, $arguments) + { + if (!isset(self::$bivalentMethods[$method])) { + trigger_error( + 'Call to undefined method PEAR::' . $method . '()', E_USER_ERROR + ); + } + return call_user_func_array( + array(get_class(), '_' . $method), + array_merge(array($this), $arguments) + ); + } + + public static function __callStatic($method, $arguments) + { + if (!isset(self::$bivalentMethods[$method])) { + trigger_error( + 'Call to undefined method PEAR::' . $method . '()', E_USER_ERROR + ); + } + return call_user_func_array( + array(get_class(), '_' . $method), + array_merge(array(null), $arguments) + ); + } + + /** + * If you have a class that's mostly/entirely static, and you need static + * properties, you can use this method to simulate them. Eg. in your method(s) + * do this: $myVar = &PEAR::getStaticProperty('myclass', 'myVar'); + * You MUST use a reference, or they will not persist! + * + * @param string $class The calling classname, to prevent clashes + * @param string $var The variable to retrieve. + * @return mixed A reference to the variable. If not set it will be + * auto initialised to NULL. + */ + public static function &getStaticProperty($class, $var) + { + static $properties; + if (!isset($properties[$class])) { + $properties[$class] = array(); + } + + if (!array_key_exists($var, $properties[$class])) { + $properties[$class][$var] = null; + } + + return $properties[$class][$var]; + } + + /** + * Use this function to register a shutdown method for static + * classes. + * + * @param mixed $func The function name (or array of class/method) to call + * @param mixed $args The arguments to pass to the function + * + * @return void + */ + public static function registerShutdownFunc($func, $args = array()) + { + // if we are called statically, there is a potential + // that no shutdown func is registered. Bug #6445 + if (!isset($GLOBALS['_PEAR_SHUTDOWN_REGISTERED'])) { + register_shutdown_function("_PEAR_call_destructors"); + $GLOBALS['_PEAR_SHUTDOWN_REGISTERED'] = true; + } + $GLOBALS['_PEAR_shutdown_funcs'][] = array($func, $args); + } + + /** + * Tell whether a value is a PEAR error. + * + * @param mixed $data the value to test + * @param int $code if $data is an error object, return true + * only if $code is a string and + * $obj->getMessage() == $code or + * $code is an integer and $obj->getCode() == $code + * + * @return bool true if parameter is an error + */ + public static function isError($data, $code = null) + { + if (!is_a($data, 'PEAR_Error')) { + return false; + } + + if (is_null($code)) { + return true; + } elseif (is_string($code)) { + return $data->getMessage() == $code; + } + + return $data->getCode() == $code; + } + + /** + * Sets how errors generated by this object should be handled. + * Can be invoked both in objects and statically. If called + * statically, setErrorHandling sets the default behaviour for all + * PEAR objects. If called in an object, setErrorHandling sets + * the default behaviour for that object. + * + * @param object $object + * Object the method was called on (non-static mode) + * + * @param int $mode + * One of PEAR_ERROR_RETURN, PEAR_ERROR_PRINT, + * PEAR_ERROR_TRIGGER, PEAR_ERROR_DIE, + * PEAR_ERROR_CALLBACK or PEAR_ERROR_EXCEPTION. + * + * @param mixed $options + * When $mode is PEAR_ERROR_TRIGGER, this is the error level (one + * of E_USER_NOTICE, E_USER_WARNING or E_USER_ERROR). + * + * When $mode is PEAR_ERROR_CALLBACK, this parameter is expected + * to be the callback function or method. A callback + * function is a string with the name of the function, a + * callback method is an array of two elements: the element + * at index 0 is the object, and the element at index 1 is + * the name of the method to call in the object. + * + * When $mode is PEAR_ERROR_PRINT or PEAR_ERROR_DIE, this is + * a printf format string used when printing the error + * message. + * + * @access public + * @return void + * @see PEAR_ERROR_RETURN + * @see PEAR_ERROR_PRINT + * @see PEAR_ERROR_TRIGGER + * @see PEAR_ERROR_DIE + * @see PEAR_ERROR_CALLBACK + * @see PEAR_ERROR_EXCEPTION + * + * @since PHP 4.0.5 + */ + protected static function _setErrorHandling( + $object, $mode = null, $options = null + ) { + if ($object !== null) { + $setmode = &$object->_default_error_mode; + $setoptions = &$object->_default_error_options; + } else { + $setmode = &$GLOBALS['_PEAR_default_error_mode']; + $setoptions = &$GLOBALS['_PEAR_default_error_options']; + } + + switch ($mode) { + case PEAR_ERROR_EXCEPTION: + case PEAR_ERROR_RETURN: + case PEAR_ERROR_PRINT: + case PEAR_ERROR_TRIGGER: + case PEAR_ERROR_DIE: + case null: + $setmode = $mode; + $setoptions = $options; + break; + + case PEAR_ERROR_CALLBACK: + $setmode = $mode; + // class/object method callback + if (is_callable($options)) { + $setoptions = $options; + } else { + trigger_error("invalid error callback", E_USER_WARNING); + } + break; + + default: + trigger_error("invalid error mode", E_USER_WARNING); + break; + } + } + + /** + * This method is used to tell which errors you expect to get. + * Expected errors are always returned with error mode + * PEAR_ERROR_RETURN. Expected error codes are stored in a stack, + * and this method pushes a new element onto it. The list of + * expected errors are in effect until they are popped off the + * stack with the popExpect() method. + * + * Note that this method can not be called statically + * + * @param mixed $code a single error code or an array of error codes to expect + * + * @return int the new depth of the "expected errors" stack + * @access public + */ + function expectError($code = '*') + { + if (is_array($code)) { + array_push($this->_expected_errors, $code); + } else { + array_push($this->_expected_errors, array($code)); + } + return count($this->_expected_errors); + } + + /** + * This method pops one element off the expected error codes + * stack. + * + * @return array the list of error codes that were popped + */ + function popExpect() + { + return array_pop($this->_expected_errors); + } + + /** + * This method checks unsets an error code if available + * + * @param mixed error code + * @return bool true if the error code was unset, false otherwise + * @access private + * @since PHP 4.3.0 + */ + function _checkDelExpect($error_code) + { + $deleted = false; + foreach ($this->_expected_errors as $key => $error_array) { + if (in_array($error_code, $error_array)) { + unset($this->_expected_errors[$key][array_search($error_code, $error_array)]); + $deleted = true; + } + + // clean up empty arrays + if (0 == count($this->_expected_errors[$key])) { + unset($this->_expected_errors[$key]); + } + } + + return $deleted; + } + + /** + * This method deletes all occurrences of the specified element from + * the expected error codes stack. + * + * @param mixed $error_code error code that should be deleted + * @return mixed list of error codes that were deleted or error + * @access public + * @since PHP 4.3.0 + */ + function delExpect($error_code) + { + $deleted = false; + if ((is_array($error_code) && (0 != count($error_code)))) { + // $error_code is a non-empty array here; we walk through it trying + // to unset all values + foreach ($error_code as $key => $error) { + $deleted = $this->_checkDelExpect($error) ? true : false; + } + + return $deleted ? true : PEAR::raiseError("The expected error you submitted does not exist"); // IMPROVE ME + } elseif (!empty($error_code)) { + // $error_code comes alone, trying to unset it + if ($this->_checkDelExpect($error_code)) { + return true; + } + + return PEAR::raiseError("The expected error you submitted does not exist"); // IMPROVE ME + } + + // $error_code is empty + return PEAR::raiseError("The expected error you submitted is empty"); // IMPROVE ME + } + + /** + * This method is a wrapper that returns an instance of the + * configured error class with this object's default error + * handling applied. If the $mode and $options parameters are not + * specified, the object's defaults are used. + * + * @param mixed $message a text error message or a PEAR error object + * + * @param int $code a numeric error code (it is up to your class + * to define these if you want to use codes) + * + * @param int $mode One of PEAR_ERROR_RETURN, PEAR_ERROR_PRINT, + * PEAR_ERROR_TRIGGER, PEAR_ERROR_DIE, + * PEAR_ERROR_CALLBACK, PEAR_ERROR_EXCEPTION. + * + * @param mixed $options If $mode is PEAR_ERROR_TRIGGER, this parameter + * specifies the PHP-internal error level (one of + * E_USER_NOTICE, E_USER_WARNING or E_USER_ERROR). + * If $mode is PEAR_ERROR_CALLBACK, this + * parameter specifies the callback function or + * method. In other error modes this parameter + * is ignored. + * + * @param string $userinfo If you need to pass along for example debug + * information, this parameter is meant for that. + * + * @param string $error_class The returned error object will be + * instantiated from this class, if specified. + * + * @param bool $skipmsg If true, raiseError will only pass error codes, + * the error message parameter will be dropped. + * + * @return object a PEAR error object + * @see PEAR::setErrorHandling + * @since PHP 4.0.5 + */ + protected static function _raiseError($object, + $message = null, + $code = null, + $mode = null, + $options = null, + $userinfo = null, + $error_class = null, + $skipmsg = false) + { + // The error is yet a PEAR error object + if (is_object($message)) { + $code = $message->getCode(); + $userinfo = $message->getUserInfo(); + $error_class = $message->getType(); + $message->error_message_prefix = ''; + $message = $message->getMessage(); + } + + if ( + $object !== null && + isset($object->_expected_errors) && + count($object->_expected_errors) > 0 && + count($exp = end($object->_expected_errors)) + ) { + if ($exp[0] == "*" || + (is_int(reset($exp)) && in_array($code, $exp)) || + (is_string(reset($exp)) && in_array($message, $exp)) + ) { + $mode = PEAR_ERROR_RETURN; + } + } + + // No mode given, try global ones + if ($mode === null) { + // Class error handler + if ($object !== null && isset($object->_default_error_mode)) { + $mode = $object->_default_error_mode; + $options = $object->_default_error_options; + // Global error handler + } elseif (isset($GLOBALS['_PEAR_default_error_mode'])) { + $mode = $GLOBALS['_PEAR_default_error_mode']; + $options = $GLOBALS['_PEAR_default_error_options']; + } + } + + if ($error_class !== null) { + $ec = $error_class; + } elseif ($object !== null && isset($object->_error_class)) { + $ec = $object->_error_class; + } else { + $ec = 'PEAR_Error'; + } + + if ($skipmsg) { + $a = new $ec($code, $mode, $options, $userinfo); + } else { + $a = new $ec($message, $code, $mode, $options, $userinfo); + } + + return $a; + } + + /** + * Simpler form of raiseError with fewer options. In most cases + * message, code and userinfo are enough. + * + * @param mixed $message a text error message or a PEAR error object + * + * @param int $code a numeric error code (it is up to your class + * to define these if you want to use codes) + * + * @param string $userinfo If you need to pass along for example debug + * information, this parameter is meant for that. + * + * @return object a PEAR error object + * @see PEAR::raiseError + */ + protected static function _throwError($object, $message = null, $code = null, $userinfo = null) + { + if ($object !== null) { + $a = &$object->raiseError($message, $code, null, null, $userinfo); + return $a; + } + + $a = &PEAR::raiseError($message, $code, null, null, $userinfo); + return $a; + } + + public static function staticPushErrorHandling($mode, $options = null) + { + $stack = &$GLOBALS['_PEAR_error_handler_stack']; + $def_mode = &$GLOBALS['_PEAR_default_error_mode']; + $def_options = &$GLOBALS['_PEAR_default_error_options']; + $stack[] = array($def_mode, $def_options); + switch ($mode) { + case PEAR_ERROR_EXCEPTION: + case PEAR_ERROR_RETURN: + case PEAR_ERROR_PRINT: + case PEAR_ERROR_TRIGGER: + case PEAR_ERROR_DIE: + case null: + $def_mode = $mode; + $def_options = $options; + break; + + case PEAR_ERROR_CALLBACK: + $def_mode = $mode; + // class/object method callback + if (is_callable($options)) { + $def_options = $options; + } else { + trigger_error("invalid error callback", E_USER_WARNING); + } + break; + + default: + trigger_error("invalid error mode", E_USER_WARNING); + break; + } + $stack[] = array($mode, $options); + return true; + } + + public static function staticPopErrorHandling() + { + $stack = &$GLOBALS['_PEAR_error_handler_stack']; + $setmode = &$GLOBALS['_PEAR_default_error_mode']; + $setoptions = &$GLOBALS['_PEAR_default_error_options']; + array_pop($stack); + list($mode, $options) = $stack[sizeof($stack) - 1]; + array_pop($stack); + switch ($mode) { + case PEAR_ERROR_EXCEPTION: + case PEAR_ERROR_RETURN: + case PEAR_ERROR_PRINT: + case PEAR_ERROR_TRIGGER: + case PEAR_ERROR_DIE: + case null: + $setmode = $mode; + $setoptions = $options; + break; + + case PEAR_ERROR_CALLBACK: + $setmode = $mode; + // class/object method callback + if (is_callable($options)) { + $setoptions = $options; + } else { + trigger_error("invalid error callback", E_USER_WARNING); + } + break; + + default: + trigger_error("invalid error mode", E_USER_WARNING); + break; + } + return true; + } + + /** + * Push a new error handler on top of the error handler options stack. With this + * you can easily override the actual error handler for some code and restore + * it later with popErrorHandling. + * + * @param mixed $mode (same as setErrorHandling) + * @param mixed $options (same as setErrorHandling) + * + * @return bool Always true + * + * @see PEAR::setErrorHandling + */ + protected static function _pushErrorHandling($object, $mode, $options = null) + { + $stack = &$GLOBALS['_PEAR_error_handler_stack']; + if ($object !== null) { + $def_mode = &$object->_default_error_mode; + $def_options = &$object->_default_error_options; + } else { + $def_mode = &$GLOBALS['_PEAR_default_error_mode']; + $def_options = &$GLOBALS['_PEAR_default_error_options']; + } + $stack[] = array($def_mode, $def_options); + + if ($object !== null) { + $object->setErrorHandling($mode, $options); + } else { + PEAR::setErrorHandling($mode, $options); + } + $stack[] = array($mode, $options); + return true; + } + + /** + * Pop the last error handler used + * + * @return bool Always true + * + * @see PEAR::pushErrorHandling + */ + protected static function _popErrorHandling($object) + { + $stack = &$GLOBALS['_PEAR_error_handler_stack']; + array_pop($stack); + list($mode, $options) = $stack[sizeof($stack) - 1]; + array_pop($stack); + if ($object !== null) { + $object->setErrorHandling($mode, $options); + } else { + PEAR::setErrorHandling($mode, $options); + } + return true; + } + + /** + * OS independent PHP extension load. Remember to take care + * on the correct extension name for case sensitive OSes. + * + * @param string $ext The extension name + * @return bool Success or not on the dl() call + */ + public static function loadExtension($ext) + { + if (extension_loaded($ext)) { + return true; + } + + // if either returns true dl() will produce a FATAL error, stop that + if ( + function_exists('dl') === false || + ini_get('enable_dl') != 1 + ) { + return false; + } + + if (OS_WINDOWS) { + $suffix = '.dll'; + } elseif (PHP_OS == 'HP-UX') { + $suffix = '.sl'; + } elseif (PHP_OS == 'AIX') { + $suffix = '.a'; + } elseif (PHP_OS == 'OSX') { + $suffix = '.bundle'; + } else { + $suffix = '.so'; + } + + return @dl('php_'.$ext.$suffix) || @dl($ext.$suffix); + } +} + +function _PEAR_call_destructors() +{ + global $_PEAR_destructor_object_list; + if (is_array($_PEAR_destructor_object_list) && + sizeof($_PEAR_destructor_object_list)) + { + reset($_PEAR_destructor_object_list); + + $destructLifoExists = PEAR::getStaticProperty('PEAR', 'destructlifo'); + + if ($destructLifoExists) { + $_PEAR_destructor_object_list = array_reverse($_PEAR_destructor_object_list); + } + + while (list($k, $objref) = each($_PEAR_destructor_object_list)) { + $classname = get_class($objref); + while ($classname) { + $destructor = "_$classname"; + if (method_exists($objref, $destructor)) { + $objref->$destructor(); + break; + } else { + $classname = get_parent_class($classname); + } + } + } + // Empty the object list to ensure that destructors are + // not called more than once. + $_PEAR_destructor_object_list = array(); + } + + // Now call the shutdown functions + if ( + isset($GLOBALS['_PEAR_shutdown_funcs']) && + is_array($GLOBALS['_PEAR_shutdown_funcs']) && + !empty($GLOBALS['_PEAR_shutdown_funcs']) + ) { + foreach ($GLOBALS['_PEAR_shutdown_funcs'] as $value) { + call_user_func_array($value[0], $value[1]); + } + } +} + +/** + * Standard PEAR error class for PHP 4 + * + * This class is supserseded by {@link PEAR_Exception} in PHP 5 + * + * @category pear + * @package PEAR + * @author Stig Bakken + * @author Tomas V.V. Cox + * @author Gregory Beaver + * @copyright 1997-2006 The PHP Group + * @license http://opensource.org/licenses/bsd-license.php New BSD License + * @version Release: @package_version@ + * @link http://pear.php.net/manual/en/core.pear.pear-error.php + * @see PEAR::raiseError(), PEAR::throwError() + * @since Class available since PHP 4.0.2 + */ +class PEAR_Error +{ + var $error_message_prefix = ''; + var $mode = PEAR_ERROR_RETURN; + var $level = E_USER_NOTICE; + var $code = -1; + var $message = ''; + var $userinfo = ''; + var $backtrace = null; + + /** + * PEAR_Error constructor + * + * @param string $message message + * + * @param int $code (optional) error code + * + * @param int $mode (optional) error mode, one of: PEAR_ERROR_RETURN, + * PEAR_ERROR_PRINT, PEAR_ERROR_DIE, PEAR_ERROR_TRIGGER, + * PEAR_ERROR_CALLBACK or PEAR_ERROR_EXCEPTION + * + * @param mixed $options (optional) error level, _OR_ in the case of + * PEAR_ERROR_CALLBACK, the callback function or object/method + * tuple. + * + * @param string $userinfo (optional) additional user/debug info + * + * @access public + * + */ + function __construct($message = 'unknown error', $code = null, + $mode = null, $options = null, $userinfo = null) + { + if ($mode === null) { + $mode = PEAR_ERROR_RETURN; + } + $this->message = $message; + $this->code = $code; + $this->mode = $mode; + $this->userinfo = $userinfo; + + $skiptrace = PEAR::getStaticProperty('PEAR_Error', 'skiptrace'); + + if (!$skiptrace) { + $this->backtrace = debug_backtrace(); + if (isset($this->backtrace[0]) && isset($this->backtrace[0]['object'])) { + unset($this->backtrace[0]['object']); + } + } + + if ($mode & PEAR_ERROR_CALLBACK) { + $this->level = E_USER_NOTICE; + $this->callback = $options; + } else { + if ($options === null) { + $options = E_USER_NOTICE; + } + + $this->level = $options; + $this->callback = null; + } + + if ($this->mode & PEAR_ERROR_PRINT) { + if (is_null($options) || is_int($options)) { + $format = "%s"; + } else { + $format = $options; + } + + printf($format, $this->getMessage()); + } + + if ($this->mode & PEAR_ERROR_TRIGGER) { + trigger_error($this->getMessage(), $this->level); + } + + if ($this->mode & PEAR_ERROR_DIE) { + $msg = $this->getMessage(); + if (is_null($options) || is_int($options)) { + $format = "%s"; + if (substr($msg, -1) != "\n") { + $msg .= "\n"; + } + } else { + $format = $options; + } + printf($format, $msg); + exit($code); + } + + if ($this->mode & PEAR_ERROR_CALLBACK && is_callable($this->callback)) { + call_user_func($this->callback, $this); + } + + if ($this->mode & PEAR_ERROR_EXCEPTION) { + trigger_error("PEAR_ERROR_EXCEPTION is obsolete, use class PEAR_Exception for exceptions", E_USER_WARNING); + eval('$e = new Exception($this->message, $this->code);throw($e);'); + } + } + + /** + * Only here for backwards compatibility. + * + * Class "Cache_Error" still uses it, among others. + * + * @param string $message Message + * @param int $code Error code + * @param int $mode Error mode + * @param mixed $options See __construct() + * @param string $userinfo Additional user/debug info + */ + public function PEAR_Error( + $message = 'unknown error', $code = null, $mode = null, + $options = null, $userinfo = null + ) { + self::__construct($message, $code, $mode, $options, $userinfo); + } + + /** + * Get the error mode from an error object. + * + * @return int error mode + * @access public + */ + function getMode() + { + return $this->mode; + } + + /** + * Get the callback function/method from an error object. + * + * @return mixed callback function or object/method array + * @access public + */ + function getCallback() + { + return $this->callback; + } + + /** + * Get the error message from an error object. + * + * @return string full error message + * @access public + */ + function getMessage() + { + return ($this->error_message_prefix . $this->message); + } + + /** + * Get error code from an error object + * + * @return int error code + * @access public + */ + function getCode() + { + return $this->code; + } + + /** + * Get the name of this error/exception. + * + * @return string error/exception name (type) + * @access public + */ + function getType() + { + return get_class($this); + } + + /** + * Get additional user-supplied information. + * + * @return string user-supplied information + * @access public + */ + function getUserInfo() + { + return $this->userinfo; + } + + /** + * Get additional debug information supplied by the application. + * + * @return string debug information + * @access public + */ + function getDebugInfo() + { + return $this->getUserInfo(); + } + + /** + * Get the call backtrace from where the error was generated. + * Supported with PHP 4.3.0 or newer. + * + * @param int $frame (optional) what frame to fetch + * @return array Backtrace, or NULL if not available. + * @access public + */ + function getBacktrace($frame = null) + { + if (defined('PEAR_IGNORE_BACKTRACE')) { + return null; + } + if ($frame === null) { + return $this->backtrace; + } + return $this->backtrace[$frame]; + } + + function addUserInfo($info) + { + if (empty($this->userinfo)) { + $this->userinfo = $info; + } else { + $this->userinfo .= " ** $info"; + } + } + + function __toString() + { + return $this->getMessage(); + } + + /** + * Make a string representation of this object. + * + * @return string a string with an object summary + * @access public + */ + function toString() + { + $modes = array(); + $levels = array(E_USER_NOTICE => 'notice', + E_USER_WARNING => 'warning', + E_USER_ERROR => 'error'); + if ($this->mode & PEAR_ERROR_CALLBACK) { + if (is_array($this->callback)) { + $callback = (is_object($this->callback[0]) ? + strtolower(get_class($this->callback[0])) : + $this->callback[0]) . '::' . + $this->callback[1]; + } else { + $callback = $this->callback; + } + return sprintf('[%s: message="%s" code=%d mode=callback '. + 'callback=%s prefix="%s" info="%s"]', + strtolower(get_class($this)), $this->message, $this->code, + $callback, $this->error_message_prefix, + $this->userinfo); + } + if ($this->mode & PEAR_ERROR_PRINT) { + $modes[] = 'print'; + } + if ($this->mode & PEAR_ERROR_TRIGGER) { + $modes[] = 'trigger'; + } + if ($this->mode & PEAR_ERROR_DIE) { + $modes[] = 'die'; + } + if ($this->mode & PEAR_ERROR_RETURN) { + $modes[] = 'return'; + } + return sprintf('[%s: message="%s" code=%d mode=%s level=%s '. + 'prefix="%s" info="%s"]', + strtolower(get_class($this)), $this->message, $this->code, + implode("|", $modes), $levels[$this->level], + $this->error_message_prefix, + $this->userinfo); + } +} + +/* + * Local Variables: + * mode: php + * tab-width: 4 + * c-basic-offset: 4 + * End: + */ diff --git a/gulliver/thirdparty/pear/pear-core-minimal/src/PEAR/Error.php b/gulliver/thirdparty/pear/pear-core-minimal/src/PEAR/Error.php new file mode 100644 index 000000000..96efff75d --- /dev/null +++ b/gulliver/thirdparty/pear/pear-core-minimal/src/PEAR/Error.php @@ -0,0 +1,14 @@ + + * @license http://opensource.org/licenses/bsd-license.php New BSD License + * @link http://pear.php.net/package/PEAR + */ +require_once __DIR__ . '/../PEAR.php'; +?> \ No newline at end of file diff --git a/gulliver/thirdparty/pear/pear-core-minimal/src/PEAR/ErrorStack.php b/gulliver/thirdparty/pear/pear-core-minimal/src/PEAR/ErrorStack.php new file mode 100644 index 000000000..7af45bfae --- /dev/null +++ b/gulliver/thirdparty/pear/pear-core-minimal/src/PEAR/ErrorStack.php @@ -0,0 +1,979 @@ + + * @copyright 2004-2008 Greg Beaver + * @license http://opensource.org/licenses/bsd-license.php New BSD License + * @link http://pear.php.net/package/PEAR_ErrorStack + */ + +/** + * Singleton storage + * + * Format: + *
+ * array(
+ *  'package1' => PEAR_ErrorStack object,
+ *  'package2' => PEAR_ErrorStack object,
+ *  ...
+ * )
+ * 
+ * @access private + * @global array $GLOBALS['_PEAR_ERRORSTACK_SINGLETON'] + */ +$GLOBALS['_PEAR_ERRORSTACK_SINGLETON'] = array(); + +/** + * Global error callback (default) + * + * This is only used if set to non-false. * is the default callback for + * all packages, whereas specific packages may set a default callback + * for all instances, regardless of whether they are a singleton or not. + * + * To exclude non-singletons, only set the local callback for the singleton + * @see PEAR_ErrorStack::setDefaultCallback() + * @access private + * @global array $GLOBALS['_PEAR_ERRORSTACK_DEFAULT_CALLBACK'] + */ +$GLOBALS['_PEAR_ERRORSTACK_DEFAULT_CALLBACK'] = array( + '*' => false, +); + +/** + * Global Log object (default) + * + * This is only used if set to non-false. Use to set a default log object for + * all stacks, regardless of instantiation order or location + * @see PEAR_ErrorStack::setDefaultLogger() + * @access private + * @global array $GLOBALS['_PEAR_ERRORSTACK_DEFAULT_LOGGER'] + */ +$GLOBALS['_PEAR_ERRORSTACK_DEFAULT_LOGGER'] = false; + +/** + * Global Overriding Callback + * + * This callback will override any error callbacks that specific loggers have set. + * Use with EXTREME caution + * @see PEAR_ErrorStack::staticPushCallback() + * @access private + * @global array $GLOBALS['_PEAR_ERRORSTACK_DEFAULT_LOGGER'] + */ +$GLOBALS['_PEAR_ERRORSTACK_OVERRIDE_CALLBACK'] = array(); + +/**#@+ + * One of four possible return values from the error Callback + * @see PEAR_ErrorStack::_errorCallback() + */ +/** + * If this is returned, then the error will be both pushed onto the stack + * and logged. + */ +define('PEAR_ERRORSTACK_PUSHANDLOG', 1); +/** + * If this is returned, then the error will only be pushed onto the stack, + * and not logged. + */ +define('PEAR_ERRORSTACK_PUSH', 2); +/** + * If this is returned, then the error will only be logged, but not pushed + * onto the error stack. + */ +define('PEAR_ERRORSTACK_LOG', 3); +/** + * If this is returned, then the error is completely ignored. + */ +define('PEAR_ERRORSTACK_IGNORE', 4); +/** + * If this is returned, then the error is logged and die() is called. + */ +define('PEAR_ERRORSTACK_DIE', 5); +/**#@-*/ + +/** + * Error code for an attempt to instantiate a non-class as a PEAR_ErrorStack in + * the singleton method. + */ +define('PEAR_ERRORSTACK_ERR_NONCLASS', 1); + +/** + * Error code for an attempt to pass an object into {@link PEAR_ErrorStack::getMessage()} + * that has no __toString() method + */ +define('PEAR_ERRORSTACK_ERR_OBJTOSTRING', 2); +/** + * Error Stack Implementation + * + * Usage: + * + * // global error stack + * $global_stack = &PEAR_ErrorStack::singleton('MyPackage'); + * // local error stack + * $local_stack = new PEAR_ErrorStack('MyPackage'); + * + * @author Greg Beaver + * @version @package_version@ + * @package PEAR_ErrorStack + * @category Debugging + * @copyright 2004-2008 Greg Beaver + * @license http://opensource.org/licenses/bsd-license.php New BSD License + * @link http://pear.php.net/package/PEAR_ErrorStack + */ +class PEAR_ErrorStack { + /** + * Errors are stored in the order that they are pushed on the stack. + * @since 0.4alpha Errors are no longer organized by error level. + * This renders pop() nearly unusable, and levels could be more easily + * handled in a callback anyway + * @var array + * @access private + */ + var $_errors = array(); + + /** + * Storage of errors by level. + * + * Allows easy retrieval and deletion of only errors from a particular level + * @since PEAR 1.4.0dev + * @var array + * @access private + */ + var $_errorsByLevel = array(); + + /** + * Package name this error stack represents + * @var string + * @access protected + */ + var $_package; + + /** + * Determines whether a PEAR_Error is thrown upon every error addition + * @var boolean + * @access private + */ + var $_compat = false; + + /** + * If set to a valid callback, this will be used to generate the error + * message from the error code, otherwise the message passed in will be + * used + * @var false|string|array + * @access private + */ + var $_msgCallback = false; + + /** + * If set to a valid callback, this will be used to generate the error + * context for an error. For PHP-related errors, this will be a file + * and line number as retrieved from debug_backtrace(), but can be + * customized for other purposes. The error might actually be in a separate + * configuration file, or in a database query. + * @var false|string|array + * @access protected + */ + var $_contextCallback = false; + + /** + * If set to a valid callback, this will be called every time an error + * is pushed onto the stack. The return value will be used to determine + * whether to allow an error to be pushed or logged. + * + * The return value must be one an PEAR_ERRORSTACK_* constant + * @see PEAR_ERRORSTACK_PUSHANDLOG, PEAR_ERRORSTACK_PUSH, PEAR_ERRORSTACK_LOG + * @var false|string|array + * @access protected + */ + var $_errorCallback = array(); + + /** + * PEAR::Log object for logging errors + * @var false|Log + * @access protected + */ + var $_logger = false; + + /** + * Error messages - designed to be overridden + * @var array + * @abstract + */ + var $_errorMsgs = array(); + + /** + * Set up a new error stack + * + * @param string $package name of the package this error stack represents + * @param callback $msgCallback callback used for error message generation + * @param callback $contextCallback callback used for context generation, + * defaults to {@link getFileLine()} + * @param boolean $throwPEAR_Error + */ + function __construct($package, $msgCallback = false, $contextCallback = false, + $throwPEAR_Error = false) + { + $this->_package = $package; + $this->setMessageCallback($msgCallback); + $this->setContextCallback($contextCallback); + $this->_compat = $throwPEAR_Error; + } + + /** + * Return a single error stack for this package. + * + * Note that all parameters are ignored if the stack for package $package + * has already been instantiated + * @param string $package name of the package this error stack represents + * @param callback $msgCallback callback used for error message generation + * @param callback $contextCallback callback used for context generation, + * defaults to {@link getFileLine()} + * @param boolean $throwPEAR_Error + * @param string $stackClass class to instantiate + * + * @return PEAR_ErrorStack + */ + public static function &singleton( + $package, $msgCallback = false, $contextCallback = false, + $throwPEAR_Error = false, $stackClass = 'PEAR_ErrorStack' + ) { + if (isset($GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package])) { + return $GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package]; + } + if (!class_exists($stackClass)) { + if (function_exists('debug_backtrace')) { + $trace = debug_backtrace(); + } + PEAR_ErrorStack::staticPush('PEAR_ErrorStack', PEAR_ERRORSTACK_ERR_NONCLASS, + 'exception', array('stackclass' => $stackClass), + 'stack class "%stackclass%" is not a valid class name (should be like PEAR_ErrorStack)', + false, $trace); + } + $GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package] = + new $stackClass($package, $msgCallback, $contextCallback, $throwPEAR_Error); + + return $GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package]; + } + + /** + * Internal error handler for PEAR_ErrorStack class + * + * Dies if the error is an exception (and would have died anyway) + * @access private + */ + function _handleError($err) + { + if ($err['level'] == 'exception') { + $message = $err['message']; + if (isset($_SERVER['REQUEST_URI'])) { + echo '
'; + } else { + echo "\n"; + } + var_dump($err['context']); + die($message); + } + } + + /** + * Set up a PEAR::Log object for all error stacks that don't have one + * @param Log $log + */ + public static function setDefaultLogger(&$log) + { + if (is_object($log) && method_exists($log, 'log') ) { + $GLOBALS['_PEAR_ERRORSTACK_DEFAULT_LOGGER'] = &$log; + } elseif (is_callable($log)) { + $GLOBALS['_PEAR_ERRORSTACK_DEFAULT_LOGGER'] = &$log; + } + } + + /** + * Set up a PEAR::Log object for this error stack + * @param Log $log + */ + function setLogger(&$log) + { + if (is_object($log) && method_exists($log, 'log') ) { + $this->_logger = &$log; + } elseif (is_callable($log)) { + $this->_logger = &$log; + } + } + + /** + * Set an error code => error message mapping callback + * + * This method sets the callback that can be used to generate error + * messages for any instance + * @param array|string Callback function/method + */ + function setMessageCallback($msgCallback) + { + if (!$msgCallback) { + $this->_msgCallback = array(&$this, 'getErrorMessage'); + } else { + if (is_callable($msgCallback)) { + $this->_msgCallback = $msgCallback; + } + } + } + + /** + * Get an error code => error message mapping callback + * + * This method returns the current callback that can be used to generate error + * messages + * @return array|string|false Callback function/method or false if none + */ + function getMessageCallback() + { + return $this->_msgCallback; + } + + /** + * Sets a default callback to be used by all error stacks + * + * This method sets the callback that can be used to generate error + * messages for a singleton + * @param array|string Callback function/method + * @param string Package name, or false for all packages + */ + public static function setDefaultCallback($callback = false, $package = false) + { + if (!is_callable($callback)) { + $callback = false; + } + $package = $package ? $package : '*'; + $GLOBALS['_PEAR_ERRORSTACK_DEFAULT_CALLBACK'][$package] = $callback; + } + + /** + * Set a callback that generates context information (location of error) for an error stack + * + * This method sets the callback that can be used to generate context + * information for an error. Passing in NULL will disable context generation + * and remove the expensive call to debug_backtrace() + * @param array|string|null Callback function/method + */ + function setContextCallback($contextCallback) + { + if ($contextCallback === null) { + return $this->_contextCallback = false; + } + if (!$contextCallback) { + $this->_contextCallback = array(&$this, 'getFileLine'); + } else { + if (is_callable($contextCallback)) { + $this->_contextCallback = $contextCallback; + } + } + } + + /** + * Set an error Callback + * If set to a valid callback, this will be called every time an error + * is pushed onto the stack. The return value will be used to determine + * whether to allow an error to be pushed or logged. + * + * The return value must be one of the ERRORSTACK_* constants. + * + * This functionality can be used to emulate PEAR's pushErrorHandling, and + * the PEAR_ERROR_CALLBACK mode, without affecting the integrity of + * the error stack or logging + * @see PEAR_ERRORSTACK_PUSHANDLOG, PEAR_ERRORSTACK_PUSH, PEAR_ERRORSTACK_LOG + * @see popCallback() + * @param string|array $cb + */ + function pushCallback($cb) + { + array_push($this->_errorCallback, $cb); + } + + /** + * Remove a callback from the error callback stack + * @see pushCallback() + * @return array|string|false + */ + function popCallback() + { + if (!count($this->_errorCallback)) { + return false; + } + return array_pop($this->_errorCallback); + } + + /** + * Set a temporary overriding error callback for every package error stack + * + * Use this to temporarily disable all existing callbacks (can be used + * to emulate the @ operator, for instance) + * @see PEAR_ERRORSTACK_PUSHANDLOG, PEAR_ERRORSTACK_PUSH, PEAR_ERRORSTACK_LOG + * @see staticPopCallback(), pushCallback() + * @param string|array $cb + */ + public static function staticPushCallback($cb) + { + array_push($GLOBALS['_PEAR_ERRORSTACK_OVERRIDE_CALLBACK'], $cb); + } + + /** + * Remove a temporary overriding error callback + * @see staticPushCallback() + * @return array|string|false + */ + public static function staticPopCallback() + { + $ret = array_pop($GLOBALS['_PEAR_ERRORSTACK_OVERRIDE_CALLBACK']); + if (!is_array($GLOBALS['_PEAR_ERRORSTACK_OVERRIDE_CALLBACK'])) { + $GLOBALS['_PEAR_ERRORSTACK_OVERRIDE_CALLBACK'] = array(); + } + return $ret; + } + + /** + * Add an error to the stack + * + * If the message generator exists, it is called with 2 parameters. + * - the current Error Stack object + * - an array that is in the same format as an error. Available indices + * are 'code', 'package', 'time', 'params', 'level', and 'context' + * + * Next, if the error should contain context information, this is + * handled by the context grabbing method. + * Finally, the error is pushed onto the proper error stack + * @param int $code Package-specific error code + * @param string $level Error level. This is NOT spell-checked + * @param array $params associative array of error parameters + * @param string $msg Error message, or a portion of it if the message + * is to be generated + * @param array $repackage If this error re-packages an error pushed by + * another package, place the array returned from + * {@link pop()} in this parameter + * @param array $backtrace Protected parameter: use this to pass in the + * {@link debug_backtrace()} that should be used + * to find error context + * @return PEAR_Error|array if compatibility mode is on, a PEAR_Error is also + * thrown. If a PEAR_Error is returned, the userinfo + * property is set to the following array: + * + * + * array( + * 'code' => $code, + * 'params' => $params, + * 'package' => $this->_package, + * 'level' => $level, + * 'time' => time(), + * 'context' => $context, + * 'message' => $msg, + * //['repackage' => $err] repackaged error array/Exception class + * ); + * + * + * Normally, the previous array is returned. + */ + function push($code, $level = 'error', $params = array(), $msg = false, + $repackage = false, $backtrace = false) + { + $context = false; + // grab error context + if ($this->_contextCallback) { + if (!$backtrace) { + $backtrace = debug_backtrace(); + } + $context = call_user_func($this->_contextCallback, $code, $params, $backtrace); + } + + // save error + $time = explode(' ', microtime()); + $time = $time[1] + $time[0]; + $err = array( + 'code' => $code, + 'params' => $params, + 'package' => $this->_package, + 'level' => $level, + 'time' => $time, + 'context' => $context, + 'message' => $msg, + ); + + if ($repackage) { + $err['repackage'] = $repackage; + } + + // set up the error message, if necessary + if ($this->_msgCallback) { + $msg = call_user_func_array($this->_msgCallback, + array(&$this, $err)); + $err['message'] = $msg; + } + $push = $log = true; + $die = false; + // try the overriding callback first + $callback = $this->staticPopCallback(); + if ($callback) { + $this->staticPushCallback($callback); + } + if (!is_callable($callback)) { + // try the local callback next + $callback = $this->popCallback(); + if (is_callable($callback)) { + $this->pushCallback($callback); + } else { + // try the default callback + $callback = isset($GLOBALS['_PEAR_ERRORSTACK_DEFAULT_CALLBACK'][$this->_package]) ? + $GLOBALS['_PEAR_ERRORSTACK_DEFAULT_CALLBACK'][$this->_package] : + $GLOBALS['_PEAR_ERRORSTACK_DEFAULT_CALLBACK']['*']; + } + } + if (is_callable($callback)) { + switch(call_user_func($callback, $err)){ + case PEAR_ERRORSTACK_IGNORE: + return $err; + break; + case PEAR_ERRORSTACK_PUSH: + $log = false; + break; + case PEAR_ERRORSTACK_LOG: + $push = false; + break; + case PEAR_ERRORSTACK_DIE: + $die = true; + break; + // anything else returned has the same effect as pushandlog + } + } + if ($push) { + array_unshift($this->_errors, $err); + if (!isset($this->_errorsByLevel[$err['level']])) { + $this->_errorsByLevel[$err['level']] = array(); + } + $this->_errorsByLevel[$err['level']][] = &$this->_errors[0]; + } + if ($log) { + if ($this->_logger || $GLOBALS['_PEAR_ERRORSTACK_DEFAULT_LOGGER']) { + $this->_log($err); + } + } + if ($die) { + die(); + } + if ($this->_compat && $push) { + return $this->raiseError($msg, $code, null, null, $err); + } + return $err; + } + + /** + * Static version of {@link push()} + * + * @param string $package Package name this error belongs to + * @param int $code Package-specific error code + * @param string $level Error level. This is NOT spell-checked + * @param array $params associative array of error parameters + * @param string $msg Error message, or a portion of it if the message + * is to be generated + * @param array $repackage If this error re-packages an error pushed by + * another package, place the array returned from + * {@link pop()} in this parameter + * @param array $backtrace Protected parameter: use this to pass in the + * {@link debug_backtrace()} that should be used + * to find error context + * @return PEAR_Error|array if compatibility mode is on, a PEAR_Error is also + * thrown. see docs for {@link push()} + */ + public static function staticPush( + $package, $code, $level = 'error', $params = array(), + $msg = false, $repackage = false, $backtrace = false + ) { + $s = &PEAR_ErrorStack::singleton($package); + if ($s->_contextCallback) { + if (!$backtrace) { + if (function_exists('debug_backtrace')) { + $backtrace = debug_backtrace(); + } + } + } + return $s->push($code, $level, $params, $msg, $repackage, $backtrace); + } + + /** + * Log an error using PEAR::Log + * @param array $err Error array + * @param array $levels Error level => Log constant map + * @access protected + */ + function _log($err) + { + if ($this->_logger) { + $logger = &$this->_logger; + } else { + $logger = &$GLOBALS['_PEAR_ERRORSTACK_DEFAULT_LOGGER']; + } + if (is_a($logger, 'Log')) { + $levels = array( + 'exception' => PEAR_LOG_CRIT, + 'alert' => PEAR_LOG_ALERT, + 'critical' => PEAR_LOG_CRIT, + 'error' => PEAR_LOG_ERR, + 'warning' => PEAR_LOG_WARNING, + 'notice' => PEAR_LOG_NOTICE, + 'info' => PEAR_LOG_INFO, + 'debug' => PEAR_LOG_DEBUG); + if (isset($levels[$err['level']])) { + $level = $levels[$err['level']]; + } else { + $level = PEAR_LOG_INFO; + } + $logger->log($err['message'], $level, $err); + } else { // support non-standard logs + call_user_func($logger, $err); + } + } + + + /** + * Pop an error off of the error stack + * + * @return false|array + * @since 0.4alpha it is no longer possible to specify a specific error + * level to return - the last error pushed will be returned, instead + */ + function pop() + { + $err = @array_shift($this->_errors); + if (!is_null($err)) { + @array_pop($this->_errorsByLevel[$err['level']]); + if (!count($this->_errorsByLevel[$err['level']])) { + unset($this->_errorsByLevel[$err['level']]); + } + } + return $err; + } + + /** + * Pop an error off of the error stack, static method + * + * @param string package name + * @return boolean + * @since PEAR1.5.0a1 + */ + function staticPop($package) + { + if ($package) { + if (!isset($GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package])) { + return false; + } + return $GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package]->pop(); + } + } + + /** + * Determine whether there are any errors on the stack + * @param string|array Level name. Use to determine if any errors + * of level (string), or levels (array) have been pushed + * @return boolean + */ + function hasErrors($level = false) + { + if ($level) { + return isset($this->_errorsByLevel[$level]); + } + return count($this->_errors); + } + + /** + * Retrieve all errors since last purge + * + * @param boolean set in order to empty the error stack + * @param string level name, to return only errors of a particular severity + * @return array + */ + function getErrors($purge = false, $level = false) + { + if (!$purge) { + if ($level) { + if (!isset($this->_errorsByLevel[$level])) { + return array(); + } else { + return $this->_errorsByLevel[$level]; + } + } else { + return $this->_errors; + } + } + if ($level) { + $ret = $this->_errorsByLevel[$level]; + foreach ($this->_errorsByLevel[$level] as $i => $unused) { + // entries are references to the $_errors array + $this->_errorsByLevel[$level][$i] = false; + } + // array_filter removes all entries === false + $this->_errors = array_filter($this->_errors); + unset($this->_errorsByLevel[$level]); + return $ret; + } + $ret = $this->_errors; + $this->_errors = array(); + $this->_errorsByLevel = array(); + return $ret; + } + + /** + * Determine whether there are any errors on a single error stack, or on any error stack + * + * The optional parameter can be used to test the existence of any errors without the need of + * singleton instantiation + * @param string|false Package name to check for errors + * @param string Level name to check for a particular severity + * @return boolean + */ + public static function staticHasErrors($package = false, $level = false) + { + if ($package) { + if (!isset($GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package])) { + return false; + } + return $GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package]->hasErrors($level); + } + foreach ($GLOBALS['_PEAR_ERRORSTACK_SINGLETON'] as $package => $obj) { + if ($obj->hasErrors($level)) { + return true; + } + } + return false; + } + + /** + * Get a list of all errors since last purge, organized by package + * @since PEAR 1.4.0dev BC break! $level is now in the place $merge used to be + * @param boolean $purge Set to purge the error stack of existing errors + * @param string $level Set to a level name in order to retrieve only errors of a particular level + * @param boolean $merge Set to return a flat array, not organized by package + * @param array $sortfunc Function used to sort a merged array - default + * sorts by time, and should be good for most cases + * + * @return array + */ + public static function staticGetErrors( + $purge = false, $level = false, $merge = false, + $sortfunc = array('PEAR_ErrorStack', '_sortErrors') + ) { + $ret = array(); + if (!is_callable($sortfunc)) { + $sortfunc = array('PEAR_ErrorStack', '_sortErrors'); + } + foreach ($GLOBALS['_PEAR_ERRORSTACK_SINGLETON'] as $package => $obj) { + $test = $GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package]->getErrors($purge, $level); + if ($test) { + if ($merge) { + $ret = array_merge($ret, $test); + } else { + $ret[$package] = $test; + } + } + } + if ($merge) { + usort($ret, $sortfunc); + } + return $ret; + } + + /** + * Error sorting function, sorts by time + * @access private + */ + public static function _sortErrors($a, $b) + { + if ($a['time'] == $b['time']) { + return 0; + } + if ($a['time'] < $b['time']) { + return 1; + } + return -1; + } + + /** + * Standard file/line number/function/class context callback + * + * This function uses a backtrace generated from {@link debug_backtrace()} + * and so will not work at all in PHP < 4.3.0. The frame should + * reference the frame that contains the source of the error. + * @return array|false either array('file' => file, 'line' => line, + * 'function' => function name, 'class' => class name) or + * if this doesn't work, then false + * @param unused + * @param integer backtrace frame. + * @param array Results of debug_backtrace() + */ + public static function getFileLine($code, $params, $backtrace = null) + { + if ($backtrace === null) { + return false; + } + $frame = 0; + $functionframe = 1; + if (!isset($backtrace[1])) { + $functionframe = 0; + } else { + while (isset($backtrace[$functionframe]['function']) && + $backtrace[$functionframe]['function'] == 'eval' && + isset($backtrace[$functionframe + 1])) { + $functionframe++; + } + } + if (isset($backtrace[$frame])) { + if (!isset($backtrace[$frame]['file'])) { + $frame++; + } + $funcbacktrace = $backtrace[$functionframe]; + $filebacktrace = $backtrace[$frame]; + $ret = array('file' => $filebacktrace['file'], + 'line' => $filebacktrace['line']); + // rearrange for eval'd code or create function errors + if (strpos($filebacktrace['file'], '(') && + preg_match(';^(.*?)\((\d+)\) : (.*?)\\z;', $filebacktrace['file'], + $matches)) { + $ret['file'] = $matches[1]; + $ret['line'] = $matches[2] + 0; + } + if (isset($funcbacktrace['function']) && isset($backtrace[1])) { + if ($funcbacktrace['function'] != 'eval') { + if ($funcbacktrace['function'] == '__lambda_func') { + $ret['function'] = 'create_function() code'; + } else { + $ret['function'] = $funcbacktrace['function']; + } + } + } + if (isset($funcbacktrace['class']) && isset($backtrace[1])) { + $ret['class'] = $funcbacktrace['class']; + } + return $ret; + } + return false; + } + + /** + * Standard error message generation callback + * + * This method may also be called by a custom error message generator + * to fill in template values from the params array, simply + * set the third parameter to the error message template string to use + * + * The special variable %__msg% is reserved: use it only to specify + * where a message passed in by the user should be placed in the template, + * like so: + * + * Error message: %msg% - internal error + * + * If the message passed like so: + * + * + * $stack->push(ERROR_CODE, 'error', array(), 'server error 500'); + * + * + * The returned error message will be "Error message: server error 500 - + * internal error" + * @param PEAR_ErrorStack + * @param array + * @param string|false Pre-generated error message template + * + * @return string + */ + public static function getErrorMessage(&$stack, $err, $template = false) + { + if ($template) { + $mainmsg = $template; + } else { + $mainmsg = $stack->getErrorMessageTemplate($err['code']); + } + $mainmsg = str_replace('%__msg%', $err['message'], $mainmsg); + if (is_array($err['params']) && count($err['params'])) { + foreach ($err['params'] as $name => $val) { + if (is_array($val)) { + // @ is needed in case $val is a multi-dimensional array + $val = @implode(', ', $val); + } + if (is_object($val)) { + if (method_exists($val, '__toString')) { + $val = $val->__toString(); + } else { + PEAR_ErrorStack::staticPush('PEAR_ErrorStack', PEAR_ERRORSTACK_ERR_OBJTOSTRING, + 'warning', array('obj' => get_class($val)), + 'object %obj% passed into getErrorMessage, but has no __toString() method'); + $val = 'Object'; + } + } + $mainmsg = str_replace('%' . $name . '%', $val, $mainmsg); + } + } + return $mainmsg; + } + + /** + * Standard Error Message Template generator from code + * @return string + */ + function getErrorMessageTemplate($code) + { + if (!isset($this->_errorMsgs[$code])) { + return '%__msg%'; + } + return $this->_errorMsgs[$code]; + } + + /** + * Set the Error Message Template array + * + * The array format must be: + *
+     * array(error code => 'message template',...)
+     * 
+ * + * Error message parameters passed into {@link push()} will be used as input + * for the error message. If the template is 'message %foo% was %bar%', and the + * parameters are array('foo' => 'one', 'bar' => 'six'), the error message returned will + * be 'message one was six' + * @return string + */ + function setErrorMessageTemplate($template) + { + $this->_errorMsgs = $template; + } + + + /** + * emulate PEAR::raiseError() + * + * @return PEAR_Error + */ + function raiseError() + { + require_once 'PEAR.php'; + $args = func_get_args(); + return call_user_func_array(array('PEAR', 'raiseError'), $args); + } +} +$stack = &PEAR_ErrorStack::singleton('PEAR_ErrorStack'); +$stack->pushCallback(array('PEAR_ErrorStack', '_handleError')); +?> diff --git a/gulliver/thirdparty/pear/pear-core-minimal/src/System.php b/gulliver/thirdparty/pear/pear-core-minimal/src/System.php new file mode 100644 index 000000000..89c53e3c1 --- /dev/null +++ b/gulliver/thirdparty/pear/pear-core-minimal/src/System.php @@ -0,0 +1,622 @@ + + * @copyright 1997-2009 The Authors + * @license http://opensource.org/licenses/bsd-license.php New BSD License + * @link http://pear.php.net/package/PEAR + * @since File available since Release 0.1 + */ + +/** + * base class + */ +require_once 'PEAR.php'; +require_once 'Console/Getopt.php'; + +$GLOBALS['_System_temp_files'] = array(); + +/** +* System offers cross platform compatible system functions +* +* Static functions for different operations. Should work under +* Unix and Windows. The names and usage has been taken from its respectively +* GNU commands. The functions will return (bool) false on error and will +* trigger the error with the PHP trigger_error() function (you can silence +* the error by prefixing a '@' sign after the function call, but this +* is not recommended practice. Instead use an error handler with +* {@link set_error_handler()}). +* +* Documentation on this class you can find in: +* http://pear.php.net/manual/ +* +* Example usage: +* if (!@System::rm('-r file1 dir1')) { +* print "could not delete file1 or dir1"; +* } +* +* In case you need to to pass file names with spaces, +* pass the params as an array: +* +* System::rm(array('-r', $file1, $dir1)); +* +* @category pear +* @package System +* @author Tomas V.V. Cox +* @copyright 1997-2006 The PHP Group +* @license http://opensource.org/licenses/bsd-license.php New BSD License +* @version Release: @package_version@ +* @link http://pear.php.net/package/PEAR +* @since Class available since Release 0.1 +* @static +*/ +class System +{ + /** + * returns the commandline arguments of a function + * + * @param string $argv the commandline + * @param string $short_options the allowed option short-tags + * @param string $long_options the allowed option long-tags + * @return array the given options and there values + */ + public static function _parseArgs($argv, $short_options, $long_options = null) + { + if (!is_array($argv) && $argv !== null) { + /* + // Quote all items that are a short option + $av = preg_split('/(\A| )--?[a-z0-9]+[ =]?((? $a) { + if (empty($a)) { + continue; + } + $argv[$k] = trim($a) ; + } + } + + return Console_Getopt::getopt2($argv, $short_options, $long_options); + } + + /** + * Output errors with PHP trigger_error(). You can silence the errors + * with prefixing a "@" sign to the function call: @System::mkdir(..); + * + * @param mixed $error a PEAR error or a string with the error message + * @return bool false + */ + protected static function raiseError($error) + { + if (PEAR::isError($error)) { + $error = $error->getMessage(); + } + trigger_error($error, E_USER_WARNING); + return false; + } + + /** + * Creates a nested array representing the structure of a directory + * + * System::_dirToStruct('dir1', 0) => + * Array + * ( + * [dirs] => Array + * ( + * [0] => dir1 + * ) + * + * [files] => Array + * ( + * [0] => dir1/file2 + * [1] => dir1/file3 + * ) + * ) + * @param string $sPath Name of the directory + * @param integer $maxinst max. deep of the lookup + * @param integer $aktinst starting deep of the lookup + * @param bool $silent if true, do not emit errors. + * @return array the structure of the dir + */ + protected static function _dirToStruct($sPath, $maxinst, $aktinst = 0, $silent = false) + { + $struct = array('dirs' => array(), 'files' => array()); + if (($dir = @opendir($sPath)) === false) { + if (!$silent) { + System::raiseError("Could not open dir $sPath"); + } + return $struct; // XXX could not open error + } + + $struct['dirs'][] = $sPath = realpath($sPath); // XXX don't add if '.' or '..' ? + $list = array(); + while (false !== ($file = readdir($dir))) { + if ($file != '.' && $file != '..') { + $list[] = $file; + } + } + + closedir($dir); + natsort($list); + if ($aktinst < $maxinst || $maxinst == 0) { + foreach ($list as $val) { + $path = $sPath . DIRECTORY_SEPARATOR . $val; + if (is_dir($path) && !is_link($path)) { + $tmp = System::_dirToStruct($path, $maxinst, $aktinst+1, $silent); + $struct = array_merge_recursive($struct, $tmp); + } else { + $struct['files'][] = $path; + } + } + } + + return $struct; + } + + /** + * Creates a nested array representing the structure of a directory and files + * + * @param array $files Array listing files and dirs + * @return array + * @static + * @see System::_dirToStruct() + */ + protected static function _multipleToStruct($files) + { + $struct = array('dirs' => array(), 'files' => array()); + settype($files, 'array'); + foreach ($files as $file) { + if (is_dir($file) && !is_link($file)) { + $tmp = System::_dirToStruct($file, 0); + $struct = array_merge_recursive($tmp, $struct); + } else { + if (!in_array($file, $struct['files'])) { + $struct['files'][] = $file; + } + } + } + return $struct; + } + + /** + * The rm command for removing files. + * Supports multiple files and dirs and also recursive deletes + * + * @param string $args the arguments for rm + * @return mixed PEAR_Error or true for success + * @static + * @access public + */ + public static function rm($args) + { + $opts = System::_parseArgs($args, 'rf'); // "f" does nothing but I like it :-) + if (PEAR::isError($opts)) { + return System::raiseError($opts); + } + foreach ($opts[0] as $opt) { + if ($opt[0] == 'r') { + $do_recursive = true; + } + } + $ret = true; + if (isset($do_recursive)) { + $struct = System::_multipleToStruct($opts[1]); + foreach ($struct['files'] as $file) { + if (!@unlink($file)) { + $ret = false; + } + } + + rsort($struct['dirs']); + foreach ($struct['dirs'] as $dir) { + if (!@rmdir($dir)) { + $ret = false; + } + } + } else { + foreach ($opts[1] as $file) { + $delete = (is_dir($file)) ? 'rmdir' : 'unlink'; + if (!@$delete($file)) { + $ret = false; + } + } + } + return $ret; + } + + /** + * Make directories. + * + * The -p option will create parent directories + * @param string $args the name of the director(y|ies) to create + * @return bool True for success + */ + public static function mkDir($args) + { + $opts = System::_parseArgs($args, 'pm:'); + if (PEAR::isError($opts)) { + return System::raiseError($opts); + } + + $mode = 0777; // default mode + foreach ($opts[0] as $opt) { + if ($opt[0] == 'p') { + $create_parents = true; + } elseif ($opt[0] == 'm') { + // if the mode is clearly an octal number (starts with 0) + // convert it to decimal + if (strlen($opt[1]) && $opt[1]{0} == '0') { + $opt[1] = octdec($opt[1]); + } else { + // convert to int + $opt[1] += 0; + } + $mode = $opt[1]; + } + } + + $ret = true; + if (isset($create_parents)) { + foreach ($opts[1] as $dir) { + $dirstack = array(); + while ((!file_exists($dir) || !is_dir($dir)) && + $dir != DIRECTORY_SEPARATOR) { + array_unshift($dirstack, $dir); + $dir = dirname($dir); + } + + while ($newdir = array_shift($dirstack)) { + if (!is_writeable(dirname($newdir))) { + $ret = false; + break; + } + + if (!mkdir($newdir, $mode)) { + $ret = false; + } + } + } + } else { + foreach($opts[1] as $dir) { + if ((@file_exists($dir) || !is_dir($dir)) && !mkdir($dir, $mode)) { + $ret = false; + } + } + } + + return $ret; + } + + /** + * Concatenate files + * + * Usage: + * 1) $var = System::cat('sample.txt test.txt'); + * 2) System::cat('sample.txt test.txt > final.txt'); + * 3) System::cat('sample.txt test.txt >> final.txt'); + * + * Note: as the class use fopen, urls should work also (test that) + * + * @param string $args the arguments + * @return boolean true on success + */ + public static function &cat($args) + { + $ret = null; + $files = array(); + if (!is_array($args)) { + $args = preg_split('/\s+/', $args, -1, PREG_SPLIT_NO_EMPTY); + } + + $count_args = count($args); + for ($i = 0; $i < $count_args; $i++) { + if ($args[$i] == '>') { + $mode = 'wb'; + $outputfile = $args[$i+1]; + break; + } elseif ($args[$i] == '>>') { + $mode = 'ab+'; + $outputfile = $args[$i+1]; + break; + } else { + $files[] = $args[$i]; + } + } + $outputfd = false; + if (isset($mode)) { + if (!$outputfd = fopen($outputfile, $mode)) { + $err = System::raiseError("Could not open $outputfile"); + return $err; + } + $ret = true; + } + foreach ($files as $file) { + if (!$fd = fopen($file, 'r')) { + System::raiseError("Could not open $file"); + continue; + } + while ($cont = fread($fd, 2048)) { + if (is_resource($outputfd)) { + fwrite($outputfd, $cont); + } else { + $ret .= $cont; + } + } + fclose($fd); + } + if (is_resource($outputfd)) { + fclose($outputfd); + } + return $ret; + } + + /** + * Creates temporary files or directories. This function will remove + * the created files when the scripts finish its execution. + * + * Usage: + * 1) $tempfile = System::mktemp("prefix"); + * 2) $tempdir = System::mktemp("-d prefix"); + * 3) $tempfile = System::mktemp(); + * 4) $tempfile = System::mktemp("-t /var/tmp prefix"); + * + * prefix -> The string that will be prepended to the temp name + * (defaults to "tmp"). + * -d -> A temporary dir will be created instead of a file. + * -t -> The target dir where the temporary (file|dir) will be created. If + * this param is missing by default the env vars TMP on Windows or + * TMPDIR in Unix will be used. If these vars are also missing + * c:\windows\temp or /tmp will be used. + * + * @param string $args The arguments + * @return mixed the full path of the created (file|dir) or false + * @see System::tmpdir() + */ + public static function mktemp($args = null) + { + static $first_time = true; + $opts = System::_parseArgs($args, 't:d'); + if (PEAR::isError($opts)) { + return System::raiseError($opts); + } + + foreach ($opts[0] as $opt) { + if ($opt[0] == 'd') { + $tmp_is_dir = true; + } elseif ($opt[0] == 't') { + $tmpdir = $opt[1]; + } + } + + $prefix = (isset($opts[1][0])) ? $opts[1][0] : 'tmp'; + if (!isset($tmpdir)) { + $tmpdir = System::tmpdir(); + } + + if (!System::mkDir(array('-p', $tmpdir))) { + return false; + } + + $tmp = tempnam($tmpdir, $prefix); + if (isset($tmp_is_dir)) { + unlink($tmp); // be careful possible race condition here + if (!mkdir($tmp, 0700)) { + return System::raiseError("Unable to create temporary directory $tmpdir"); + } + } + + $GLOBALS['_System_temp_files'][] = $tmp; + if (isset($tmp_is_dir)) { + //$GLOBALS['_System_temp_files'][] = dirname($tmp); + } + + if ($first_time) { + PEAR::registerShutdownFunc(array('System', '_removeTmpFiles')); + $first_time = false; + } + + return $tmp; + } + + /** + * Remove temporary files created my mkTemp. This function is executed + * at script shutdown time + */ + public static function _removeTmpFiles() + { + if (count($GLOBALS['_System_temp_files'])) { + $delete = $GLOBALS['_System_temp_files']; + array_unshift($delete, '-r'); + System::rm($delete); + $GLOBALS['_System_temp_files'] = array(); + } + } + + /** + * Get the path of the temporal directory set in the system + * by looking in its environments variables. + * Note: php.ini-recommended removes the "E" from the variables_order setting, + * making unavaible the $_ENV array, that s why we do tests with _ENV + * + * @return string The temporary directory on the system + */ + public static function tmpdir() + { + if (OS_WINDOWS) { + if ($var = isset($_ENV['TMP']) ? $_ENV['TMP'] : getenv('TMP')) { + return $var; + } + if ($var = isset($_ENV['TEMP']) ? $_ENV['TEMP'] : getenv('TEMP')) { + return $var; + } + if ($var = isset($_ENV['USERPROFILE']) ? $_ENV['USERPROFILE'] : getenv('USERPROFILE')) { + return $var; + } + if ($var = isset($_ENV['windir']) ? $_ENV['windir'] : getenv('windir')) { + return $var; + } + return getenv('SystemRoot') . '\temp'; + } + if ($var = isset($_ENV['TMPDIR']) ? $_ENV['TMPDIR'] : getenv('TMPDIR')) { + return $var; + } + return realpath('/tmp'); + } + + /** + * The "which" command (show the full path of a command) + * + * @param string $program The command to search for + * @param mixed $fallback Value to return if $program is not found + * + * @return mixed A string with the full path or false if not found + * @author Stig Bakken + */ + public static function which($program, $fallback = false) + { + // enforce API + if (!is_string($program) || '' == $program) { + return $fallback; + } + + // full path given + if (basename($program) != $program) { + $path_elements[] = dirname($program); + $program = basename($program); + } else { + $path = getenv('PATH'); + if (!$path) { + $path = getenv('Path'); // some OSes are just stupid enough to do this + } + + $path_elements = explode(PATH_SEPARATOR, $path); + } + + if (OS_WINDOWS) { + $exe_suffixes = getenv('PATHEXT') + ? explode(PATH_SEPARATOR, getenv('PATHEXT')) + : array('.exe','.bat','.cmd','.com'); + // allow passing a command.exe param + if (strpos($program, '.') !== false) { + array_unshift($exe_suffixes, ''); + } + } else { + $exe_suffixes = array(''); + } + + foreach ($exe_suffixes as $suff) { + foreach ($path_elements as $dir) { + $file = $dir . DIRECTORY_SEPARATOR . $program . $suff; + if (is_executable($file)) { + return $file; + } + } + } + return $fallback; + } + + /** + * The "find" command + * + * Usage: + * + * System::find($dir); + * System::find("$dir -type d"); + * System::find("$dir -type f"); + * System::find("$dir -name *.php"); + * System::find("$dir -name *.php -name *.htm*"); + * System::find("$dir -maxdepth 1"); + * + * Params implemented: + * $dir -> Start the search at this directory + * -type d -> return only directories + * -type f -> return only files + * -maxdepth -> max depth of recursion + * -name -> search pattern (bash style). Multiple -name param allowed + * + * @param mixed Either array or string with the command line + * @return array Array of found files + */ + public static function find($args) + { + if (!is_array($args)) { + $args = preg_split('/\s+/', $args, -1, PREG_SPLIT_NO_EMPTY); + } + $dir = realpath(array_shift($args)); + if (!$dir) { + return array(); + } + $patterns = array(); + $depth = 0; + $do_files = $do_dirs = true; + $args_count = count($args); + for ($i = 0; $i < $args_count; $i++) { + switch ($args[$i]) { + case '-type': + if (in_array($args[$i+1], array('d', 'f'))) { + if ($args[$i+1] == 'd') { + $do_files = false; + } else { + $do_dirs = false; + } + } + $i++; + break; + case '-name': + $name = preg_quote($args[$i+1], '#'); + // our magic characters ? and * have just been escaped, + // so now we change the escaped versions to PCRE operators + $name = strtr($name, array('\?' => '.', '\*' => '.*')); + $patterns[] = '('.$name.')'; + $i++; + break; + case '-maxdepth': + $depth = $args[$i+1]; + break; + } + } + $path = System::_dirToStruct($dir, $depth, 0, true); + if ($do_files && $do_dirs) { + $files = array_merge($path['files'], $path['dirs']); + } elseif ($do_dirs) { + $files = $path['dirs']; + } else { + $files = $path['files']; + } + if (count($patterns)) { + $dsq = preg_quote(DIRECTORY_SEPARATOR, '#'); + $pattern = '#(^|'.$dsq.')'.implode('|', $patterns).'($|'.$dsq.')#'; + $ret = array(); + $files_count = count($files); + for ($i = 0; $i < $files_count; $i++) { + // only search in the part of the file below the current directory + $filepart = basename($files[$i]); + if (preg_match($pattern, $filepart)) { + $ret[] = $files[$i]; + } + } + return $ret; + } + return $files; + } +} \ No newline at end of file diff --git a/gulliver/thirdparty/pear/pear_exception/.gitignore b/gulliver/thirdparty/pear/pear_exception/.gitignore new file mode 100644 index 000000000..479265b07 --- /dev/null +++ b/gulliver/thirdparty/pear/pear_exception/.gitignore @@ -0,0 +1,6 @@ +PEAR_Exception*.tgz + +# composer related +composer.lock +composer.phar +vendor diff --git a/gulliver/thirdparty/pear/pear_exception/.travis.yml b/gulliver/thirdparty/pear/pear_exception/.travis.yml new file mode 100644 index 000000000..18875d993 --- /dev/null +++ b/gulliver/thirdparty/pear/pear_exception/.travis.yml @@ -0,0 +1,7 @@ +language: php +php: + - 5.6 + - 5.5 + - 5.4 +script: + - cd tests && phpunit --coverage-text . diff --git a/gulliver/thirdparty/pear/pear_exception/LICENSE b/gulliver/thirdparty/pear/pear_exception/LICENSE new file mode 100644 index 000000000..a00a2421f --- /dev/null +++ b/gulliver/thirdparty/pear/pear_exception/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) 1997-2009, + Stig Bakken , + Gregory Beaver , + Helgi Þormar Þorbjörnsson , + Tomas V.V.Cox , + Martin Jansen . +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/gulliver/thirdparty/pear/pear_exception/PEAR/Exception.php b/gulliver/thirdparty/pear/pear_exception/PEAR/Exception.php new file mode 100644 index 000000000..5abf4f84a --- /dev/null +++ b/gulliver/thirdparty/pear/pear_exception/PEAR/Exception.php @@ -0,0 +1,456 @@ + + * @author Hans Lellelid + * @author Bertrand Mansion + * @author Greg Beaver + * @copyright 1997-2009 The Authors + * @license http://opensource.org/licenses/bsd-license.php New BSD License + * @link http://pear.php.net/package/PEAR_Exception + * @since File available since Release 1.0.0 + */ + + +/** + * Base PEAR_Exception Class + * + * 1) Features: + * + * - Nestable exceptions (throw new PEAR_Exception($msg, $prev_exception)) + * - Definable triggers, shot when exceptions occur + * - Pretty and informative error messages + * - Added more context info available (like class, method or cause) + * - cause can be a PEAR_Exception or an array of mixed + * PEAR_Exceptions/PEAR_ErrorStack warnings + * - callbacks for specific exception classes and their children + * + * 2) Ideas: + * + * - Maybe a way to define a 'template' for the output + * + * 3) Inherited properties from PHP Exception Class: + * + * protected $message + * protected $code + * protected $line + * protected $file + * private $trace + * + * 4) Inherited methods from PHP Exception Class: + * + * __clone + * __construct + * getMessage + * getCode + * getFile + * getLine + * getTraceSafe + * getTraceSafeAsString + * __toString + * + * 5) Usage example + * + * + * require_once 'PEAR/Exception.php'; + * + * class Test { + * function foo() { + * throw new PEAR_Exception('Error Message', ERROR_CODE); + * } + * } + * + * function myLogger($pear_exception) { + * echo $pear_exception->getMessage(); + * } + * // each time a exception is thrown the 'myLogger' will be called + * // (its use is completely optional) + * PEAR_Exception::addObserver('myLogger'); + * $test = new Test; + * try { + * $test->foo(); + * } catch (PEAR_Exception $e) { + * print $e; + * } + * + * + * @category PEAR + * @package PEAR_Exception + * @author Tomas V.V.Cox + * @author Hans Lellelid + * @author Bertrand Mansion + * @author Greg Beaver + * @copyright 1997-2009 The Authors + * @license http://opensource.org/licenses/bsd-license.php New BSD License + * @version Release: @package_version@ + * @link http://pear.php.net/package/PEAR_Exception + * @since Class available since Release 1.0.0 + */ +class PEAR_Exception extends Exception +{ + const OBSERVER_PRINT = -2; + const OBSERVER_TRIGGER = -4; + const OBSERVER_DIE = -8; + protected $cause; + private static $_observers = array(); + private static $_uniqueid = 0; + private $_trace; + + /** + * Supported signatures: + * - PEAR_Exception(string $message); + * - PEAR_Exception(string $message, int $code); + * - PEAR_Exception(string $message, Exception $cause); + * - PEAR_Exception(string $message, Exception $cause, int $code); + * - PEAR_Exception(string $message, PEAR_Error $cause); + * - PEAR_Exception(string $message, PEAR_Error $cause, int $code); + * - PEAR_Exception(string $message, array $causes); + * - PEAR_Exception(string $message, array $causes, int $code); + * + * @param string $message exception message + * @param int|Exception|PEAR_Error|array|null $p2 exception cause + * @param int|null $p3 exception code or null + */ + public function __construct($message, $p2 = null, $p3 = null) + { + if (is_int($p2)) { + $code = $p2; + $this->cause = null; + } elseif (is_object($p2) || is_array($p2)) { + // using is_object allows both Exception and PEAR_Error + if (is_object($p2) && !($p2 instanceof Exception)) { + if (!class_exists('PEAR_Error') || !($p2 instanceof PEAR_Error)) { + throw new PEAR_Exception( + 'exception cause must be Exception, ' . + 'array, or PEAR_Error' + ); + } + } + $code = $p3; + if (is_array($p2) && isset($p2['message'])) { + // fix potential problem of passing in a single warning + $p2 = array($p2); + } + $this->cause = $p2; + } else { + $code = null; + $this->cause = null; + } + parent::__construct($message, $code); + $this->signal(); + } + + /** + * Add an exception observer + * + * @param mixed $callback - A valid php callback, see php func is_callable() + * - A PEAR_Exception::OBSERVER_* constant + * - An array(const PEAR_Exception::OBSERVER_*, + * mixed $options) + * @param string $label The name of the observer. Use this if you want + * to remove it later with removeObserver() + * + * @return void + */ + public static function addObserver($callback, $label = 'default') + { + self::$_observers[$label] = $callback; + } + + /** + * Remove an exception observer + * + * @param string $label Name of the observer + * + * @return void + */ + public static function removeObserver($label = 'default') + { + unset(self::$_observers[$label]); + } + + /** + * Generate a unique ID for an observer + * + * @return int unique identifier for an observer + */ + public static function getUniqueId() + { + return self::$_uniqueid++; + } + + /** + * Send a signal to all observers + * + * @return void + */ + protected function signal() + { + foreach (self::$_observers as $func) { + if (is_callable($func)) { + call_user_func($func, $this); + continue; + } + settype($func, 'array'); + switch ($func[0]) { + case self::OBSERVER_PRINT : + $f = (isset($func[1])) ? $func[1] : '%s'; + printf($f, $this->getMessage()); + break; + case self::OBSERVER_TRIGGER : + $f = (isset($func[1])) ? $func[1] : E_USER_NOTICE; + trigger_error($this->getMessage(), $f); + break; + case self::OBSERVER_DIE : + $f = (isset($func[1])) ? $func[1] : '%s'; + die(printf($f, $this->getMessage())); + break; + default: + trigger_error('invalid observer type', E_USER_WARNING); + } + } + } + + /** + * Return specific error information that can be used for more detailed + * error messages or translation. + * + * This method may be overridden in child exception classes in order + * to add functionality not present in PEAR_Exception and is a placeholder + * to define API + * + * The returned array must be an associative array of parameter => value like so: + *
+     * array('name' => $name, 'context' => array(...))
+     * 
+ * + * @return array + */ + public function getErrorData() + { + return array(); + } + + /** + * Returns the exception that caused this exception to be thrown + * + * @return Exception|array The context of the exception + */ + public function getCause() + { + return $this->cause; + } + + /** + * Function must be public to call on caused exceptions + * + * @param array $causes Array that gets filled. + * + * @return void + */ + public function getCauseMessage(&$causes) + { + $trace = $this->getTraceSafe(); + $cause = array('class' => get_class($this), + 'message' => $this->message, + 'file' => 'unknown', + 'line' => 'unknown'); + if (isset($trace[0])) { + if (isset($trace[0]['file'])) { + $cause['file'] = $trace[0]['file']; + $cause['line'] = $trace[0]['line']; + } + } + $causes[] = $cause; + if ($this->cause instanceof PEAR_Exception) { + $this->cause->getCauseMessage($causes); + } elseif ($this->cause instanceof Exception) { + $causes[] = array('class' => get_class($this->cause), + 'message' => $this->cause->getMessage(), + 'file' => $this->cause->getFile(), + 'line' => $this->cause->getLine()); + } elseif (class_exists('PEAR_Error') && $this->cause instanceof PEAR_Error) { + $causes[] = array('class' => get_class($this->cause), + 'message' => $this->cause->getMessage(), + 'file' => 'unknown', + 'line' => 'unknown'); + } elseif (is_array($this->cause)) { + foreach ($this->cause as $cause) { + if ($cause instanceof PEAR_Exception) { + $cause->getCauseMessage($causes); + } elseif ($cause instanceof Exception) { + $causes[] = array('class' => get_class($cause), + 'message' => $cause->getMessage(), + 'file' => $cause->getFile(), + 'line' => $cause->getLine()); + } elseif (class_exists('PEAR_Error') + && $cause instanceof PEAR_Error + ) { + $causes[] = array('class' => get_class($cause), + 'message' => $cause->getMessage(), + 'file' => 'unknown', + 'line' => 'unknown'); + } elseif (is_array($cause) && isset($cause['message'])) { + // PEAR_ErrorStack warning + $causes[] = array( + 'class' => $cause['package'], + 'message' => $cause['message'], + 'file' => isset($cause['context']['file']) ? + $cause['context']['file'] : + 'unknown', + 'line' => isset($cause['context']['line']) ? + $cause['context']['line'] : + 'unknown', + ); + } + } + } + } + + /** + * Build a backtrace and return it + * + * @return array Backtrace + */ + public function getTraceSafe() + { + if (!isset($this->_trace)) { + $this->_trace = $this->getTrace(); + if (empty($this->_trace)) { + $backtrace = debug_backtrace(); + $this->_trace = array($backtrace[count($backtrace)-1]); + } + } + return $this->_trace; + } + + /** + * Gets the first class of the backtrace + * + * @return string Class name + */ + public function getErrorClass() + { + $trace = $this->getTraceSafe(); + return $trace[0]['class']; + } + + /** + * Gets the first method of the backtrace + * + * @return string Method/function name + */ + public function getErrorMethod() + { + $trace = $this->getTraceSafe(); + return $trace[0]['function']; + } + + /** + * Converts the exception to a string (HTML or plain text) + * + * @return string String representation + * + * @see toHtml() + * @see toText() + */ + public function __toString() + { + if (isset($_SERVER['REQUEST_URI'])) { + return $this->toHtml(); + } + return $this->toText(); + } + + /** + * Generates a HTML representation of the exception + * + * @return string HTML code + */ + public function toHtml() + { + $trace = $this->getTraceSafe(); + $causes = array(); + $this->getCauseMessage($causes); + $html = '' . "\n"; + foreach ($causes as $i => $cause) { + $html .= '\n"; + } + $html .= '' . "\n" + . '' + . '' + . '' . "\n"; + + foreach ($trace as $k => $v) { + $html .= '' + . '' + . '' . "\n"; + } + $html .= '' + . '' + . '' . "\n" + . '
' + . str_repeat('-', $i) . ' ' . $cause['class'] . ': ' + . htmlspecialchars($cause['message']) + . ' in ' . $cause['file'] . ' ' + . 'on line ' . $cause['line'] . '' + . "
Exception trace
#FunctionLocation
' . $k . ''; + if (!empty($v['class'])) { + $html .= $v['class'] . $v['type']; + } + $html .= $v['function']; + $args = array(); + if (!empty($v['args'])) { + foreach ($v['args'] as $arg) { + if (is_null($arg)) { + $args[] = 'null'; + } else if (is_array($arg)) { + $args[] = 'Array'; + } else if (is_object($arg)) { + $args[] = 'Object('.get_class($arg).')'; + } else if (is_bool($arg)) { + $args[] = $arg ? 'true' : 'false'; + } else if (is_int($arg) || is_double($arg)) { + $args[] = $arg; + } else { + $arg = (string)$arg; + $str = htmlspecialchars(substr($arg, 0, 16)); + if (strlen($arg) > 16) { + $str .= '…'; + } + $args[] = "'" . $str . "'"; + } + } + } + $html .= '(' . implode(', ', $args) . ')' + . '' . (isset($v['file']) ? $v['file'] : 'unknown') + . ':' . (isset($v['line']) ? $v['line'] : 'unknown') + . '
' . ($k+1) . '{main} 
'; + return $html; + } + + /** + * Generates text representation of the exception and stack trace + * + * @return string + */ + public function toText() + { + $causes = array(); + $this->getCauseMessage($causes); + $causeMsg = ''; + foreach ($causes as $i => $cause) { + $causeMsg .= str_repeat(' ', $i) . $cause['class'] . ': ' + . $cause['message'] . ' in ' . $cause['file'] + . ' on line ' . $cause['line'] . "\n"; + } + return $causeMsg . $this->getTraceAsString(); + } +} +?> diff --git a/gulliver/thirdparty/pear/pear_exception/composer.json b/gulliver/thirdparty/pear/pear_exception/composer.json new file mode 100644 index 000000000..ce33ed1c8 --- /dev/null +++ b/gulliver/thirdparty/pear/pear_exception/composer.json @@ -0,0 +1,43 @@ +{ + "name": "pear/pear_exception", + "description": "The PEAR Exception base class.", + "type": "class", + "keywords": [ + "exception" + ], + "homepage": "https://github.com/pear/PEAR_Exception", + "license": "BSD-2-Clause", + "authors": [ + { + "name": "Helgi Thormar", + "email": "dufuz@php.net" + }, + { + "name": "Greg Beaver", + "email": "cellog@php.net" + } + ], + "require": { + "php": ">=4.4.0" + }, + "autoload": { + "psr-0": { + "PEAR": "" + } + }, + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "include-path": [ + "." + ], + "support": { + "issues": "http://pear.php.net/bugs/search.php?cmd=display&package_name[]=PEAR_Exception", + "source": "https://github.com/pear/PEAR_Exception" + }, + "require-dev": { + "phpunit/phpunit": "*" + } +} diff --git a/gulliver/thirdparty/pear/pear_exception/package.xml b/gulliver/thirdparty/pear/pear_exception/package.xml new file mode 100644 index 000000000..98290c6a8 --- /dev/null +++ b/gulliver/thirdparty/pear/pear_exception/package.xml @@ -0,0 +1,120 @@ + + + PEAR_Exception + pear.php.net + The PEAR Exception base class + PEAR_Exception PHP5 error handling mechanism + + + Christian Weiske + cweiske + cweiske@php.net + yes + + + Helgi Thormar + dufuz + dufuz@php.net + no + + + Greg Beaver + cellog + cellog@php.net + no + + + 2015-02-10 + + + 1.0.0 + 1.0.0 + + + stable + stable + + New BSD License + + This package was split out from the PEAR package. + If you use PEAR_Exception in your package and use nothing from the PEAR package + then it's better to depend on just PEAR_Exception. + + + + + + + + + + + + + + + + + + 5.4.0 + + + 1.9.5 + + + + + + + + + + 1.0.0 + 1.0.0 + + + stable + stable + + 2015-02-10 + New BSD License + Release stable version + + + + + 1.0.0beta2 + 1.0.0 + + + beta + stable + + 2014-02-21 + New BSD License + Bump up PEAR dependency. + + + + + 1.0.0beta1 + 1.0.0 + + + beta + stable + + 2012-05-10 + New BSD License + +This packge was split out from the PEAR package. If you use PEAR_Exception in your package +and use nothing from the PEAR package then it's better to depend on just PEAR_Exception. + + + + diff --git a/gulliver/thirdparty/pear/pear_exception/tests/PEAR/ExceptionTest.php b/gulliver/thirdparty/pear/pear_exception/tests/PEAR/ExceptionTest.php new file mode 100644 index 000000000..61d2df4f1 --- /dev/null +++ b/gulliver/thirdparty/pear/pear_exception/tests/PEAR/ExceptionTest.php @@ -0,0 +1,78 @@ +assertNull($e->getCause()); + } + + public function testGetCauseException() + { + $cause = new Exception('foo bar'); + $e = new PEAR_Exception('I caught an exception', $cause); + $this->assertNotNull($e->getCause()); + $this->assertInstanceOf('Exception', $e->getCause()); + $this->assertEquals($cause, $e->getCause()); + } + + public function testGetCauseMessage() + { + $cause = new Exception('foo bar'); + $e = new PEAR_Exception('I caught an exception', $cause); + + $e->getCauseMessage($causes); + $this->assertEquals('I caught an exception', $causes[0]['message']); + $this->assertEquals('foo bar', $causes[1]['message']); + } + + public function testGetTraceSafe() + { + $e = new PEAR_Exception('oops'); + $this->assertInternalType('array', $e->getTraceSafe()); + } + + public function testGetErrorClass() + { + $e = new PEAR_Exception('oops'); + $this->assertEquals('PEAR_ExceptionTest', $e->getErrorClass()); + } + + public function testGetErrorMethod() + { + $e = new PEAR_Exception('oops'); + $this->assertEquals('testGetErrorMethod', $e->getErrorMethod()); + } + + public function test__toString() + { + $e = new PEAR_Exception('oops'); + $this->assertInternalType('string', (string) $e); + $this->assertContains('oops', (string) $e); + } + + public function testToHtml() + { + $e = new PEAR_Exception('oops'); + $html = $e->toHtml(); + $this->assertInternalType('string', $html); + $this->assertContains('oops', $html); + } +} +?> diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier.auto.php b/thirdparty/HTMLPurifier/HTMLPurifier.auto.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier.auto.php rename to thirdparty/HTMLPurifier/HTMLPurifier.auto.php index c810e87b6..1960c399f 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier.auto.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier.auto.php @@ -1,11 +1,11 @@ -purify($html, $config); -} - -// vim: et sw=4 sts=4 +purify($html, $config); +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier.includes.php b/thirdparty/HTMLPurifier/HTMLPurifier.includes.php similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier.includes.php rename to thirdparty/HTMLPurifier/HTMLPurifier.includes.php index faac17a51..9b7b88a87 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier.includes.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier.includes.php @@ -1,229 +1,229 @@ - $attributes) { - $allowed_elements[$element] = true; - foreach ($attributes as $attribute => $x) { - $allowed_attributes["$element.$attribute"] = true; - } - } - $config->set('HTML.AllowedElements', $allowed_elements); - $config->set('HTML.AllowedAttributes', $allowed_attributes); - if ($allowed_protocols !== null) { - $config->set('URI.AllowedSchemes', $allowed_protocols); - } - $purifier = new HTMLPurifier($config); - return $purifier->purify($string); -} - -// vim: et sw=4 sts=4 + $attributes) { + $allowed_elements[$element] = true; + foreach ($attributes as $attribute => $x) { + $allowed_attributes["$element.$attribute"] = true; + } + } + $config->set('HTML.AllowedElements', $allowed_elements); + $config->set('HTML.AllowedAttributes', $allowed_attributes); + if ($allowed_protocols !== null) { + $config->set('URI.AllowedSchemes', $allowed_protocols); + } + $purifier = new HTMLPurifier($config); + return $purifier->purify($string); +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier.path.php b/thirdparty/HTMLPurifier/HTMLPurifier.path.php similarity index 95% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier.path.php rename to thirdparty/HTMLPurifier/HTMLPurifier.path.php index 353492a1c..39b1b6531 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier.path.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier.path.php @@ -1,11 +1,11 @@ -config = HTMLPurifier_Config::create($config); - $this->strategy = new HTMLPurifier_Strategy_Core(); - } - - /** - * Adds a filter to process the output. First come first serve - * - * @param HTMLPurifier_Filter $filter HTMLPurifier_Filter object - */ - public function addFilter($filter) - { - trigger_error( - 'HTMLPurifier->addFilter() is deprecated, use configuration directives' . - ' in the Filter namespace or Filter.Custom', - E_USER_WARNING - ); - $this->filters[] = $filter; - } - - /** - * Filters an HTML snippet/document to be XSS-free and standards-compliant. - * - * @param string $html String of HTML to purify - * @param HTMLPurifier_Config $config Config object for this operation, - * if omitted, defaults to the config object specified during this - * object's construction. The parameter can also be any type - * that HTMLPurifier_Config::create() supports. - * - * @return string Purified HTML - */ - public function purify($html, $config = null) - { - // :TODO: make the config merge in, instead of replace - $config = $config ? HTMLPurifier_Config::create($config) : $this->config; - - // implementation is partially environment dependant, partially - // configuration dependant - $lexer = HTMLPurifier_Lexer::create($config); - - $context = new HTMLPurifier_Context(); - - // setup HTML generator - $this->generator = new HTMLPurifier_Generator($config, $context); - $context->register('Generator', $this->generator); - - // set up global context variables - if ($config->get('Core.CollectErrors')) { - // may get moved out if other facilities use it - $language_factory = HTMLPurifier_LanguageFactory::instance(); - $language = $language_factory->create($config, $context); - $context->register('Locale', $language); - - $error_collector = new HTMLPurifier_ErrorCollector($context); - $context->register('ErrorCollector', $error_collector); - } - - // setup id_accumulator context, necessary due to the fact that - // AttrValidator can be called from many places - $id_accumulator = HTMLPurifier_IDAccumulator::build($config, $context); - $context->register('IDAccumulator', $id_accumulator); - - $html = HTMLPurifier_Encoder::convertToUTF8($html, $config, $context); - - // setup filters - $filter_flags = $config->getBatch('Filter'); - $custom_filters = $filter_flags['Custom']; - unset($filter_flags['Custom']); - $filters = array(); - foreach ($filter_flags as $filter => $flag) { - if (!$flag) { - continue; - } - if (strpos($filter, '.') !== false) { - continue; - } - $class = "HTMLPurifier_Filter_$filter"; - $filters[] = new $class; - } - foreach ($custom_filters as $filter) { - // maybe "HTMLPurifier_Filter_$filter", but be consistent with AutoFormat - $filters[] = $filter; - } - $filters = array_merge($filters, $this->filters); - // maybe prepare(), but later - - for ($i = 0, $filter_size = count($filters); $i < $filter_size; $i++) { - $html = $filters[$i]->preFilter($html, $config, $context); - } - - // purified HTML - $html = - $this->generator->generateFromTokens( - // list of tokens - $this->strategy->execute( - // list of un-purified tokens - $lexer->tokenizeHTML( - // un-purified HTML - $html, - $config, - $context - ), - $config, - $context - ) - ); - - for ($i = $filter_size - 1; $i >= 0; $i--) { - $html = $filters[$i]->postFilter($html, $config, $context); - } - - $html = HTMLPurifier_Encoder::convertFromUTF8($html, $config, $context); - $this->context =& $context; - return $html; - } - - /** - * Filters an array of HTML snippets - * - * @param string[] $array_of_html Array of html snippets - * @param HTMLPurifier_Config $config Optional config object for this operation. - * See HTMLPurifier::purify() for more details. - * - * @return string[] Array of purified HTML - */ - public function purifyArray($array_of_html, $config = null) - { - $context_array = array(); - foreach ($array_of_html as $key => $html) { - $array_of_html[$key] = $this->purify($html, $config); - $context_array[$key] = $this->context; - } - $this->context = $context_array; - return $array_of_html; - } - - /** - * Singleton for enforcing just one HTML Purifier in your system - * - * @param HTMLPurifier|HTMLPurifier_Config $prototype Optional prototype - * HTMLPurifier instance to overload singleton with, - * or HTMLPurifier_Config instance to configure the - * generated version with. - * - * @return HTMLPurifier - */ - public static function instance($prototype = null) - { - if (!self::$instance || $prototype) { - if ($prototype instanceof HTMLPurifier) { - self::$instance = $prototype; - } elseif ($prototype) { - self::$instance = new HTMLPurifier($prototype); - } else { - self::$instance = new HTMLPurifier(); - } - } - return self::$instance; - } - - /** - * Singleton for enforcing just one HTML Purifier in your system - * - * @param HTMLPurifier|HTMLPurifier_Config $prototype Optional prototype - * HTMLPurifier instance to overload singleton with, - * or HTMLPurifier_Config instance to configure the - * generated version with. - * - * @return HTMLPurifier - * @note Backwards compatibility, see instance() - */ - public static function getInstance($prototype = null) - { - return HTMLPurifier::instance($prototype); - } -} - -// vim: et sw=4 sts=4 +config = HTMLPurifier_Config::create($config); + $this->strategy = new HTMLPurifier_Strategy_Core(); + } + + /** + * Adds a filter to process the output. First come first serve + * + * @param HTMLPurifier_Filter $filter HTMLPurifier_Filter object + */ + public function addFilter($filter) + { + trigger_error( + 'HTMLPurifier->addFilter() is deprecated, use configuration directives' . + ' in the Filter namespace or Filter.Custom', + E_USER_WARNING + ); + $this->filters[] = $filter; + } + + /** + * Filters an HTML snippet/document to be XSS-free and standards-compliant. + * + * @param string $html String of HTML to purify + * @param HTMLPurifier_Config $config Config object for this operation, + * if omitted, defaults to the config object specified during this + * object's construction. The parameter can also be any type + * that HTMLPurifier_Config::create() supports. + * + * @return string Purified HTML + */ + public function purify($html, $config = null) + { + // :TODO: make the config merge in, instead of replace + $config = $config ? HTMLPurifier_Config::create($config) : $this->config; + + // implementation is partially environment dependant, partially + // configuration dependant + $lexer = HTMLPurifier_Lexer::create($config); + + $context = new HTMLPurifier_Context(); + + // setup HTML generator + $this->generator = new HTMLPurifier_Generator($config, $context); + $context->register('Generator', $this->generator); + + // set up global context variables + if ($config->get('Core.CollectErrors')) { + // may get moved out if other facilities use it + $language_factory = HTMLPurifier_LanguageFactory::instance(); + $language = $language_factory->create($config, $context); + $context->register('Locale', $language); + + $error_collector = new HTMLPurifier_ErrorCollector($context); + $context->register('ErrorCollector', $error_collector); + } + + // setup id_accumulator context, necessary due to the fact that + // AttrValidator can be called from many places + $id_accumulator = HTMLPurifier_IDAccumulator::build($config, $context); + $context->register('IDAccumulator', $id_accumulator); + + $html = HTMLPurifier_Encoder::convertToUTF8($html, $config, $context); + + // setup filters + $filter_flags = $config->getBatch('Filter'); + $custom_filters = $filter_flags['Custom']; + unset($filter_flags['Custom']); + $filters = array(); + foreach ($filter_flags as $filter => $flag) { + if (!$flag) { + continue; + } + if (strpos($filter, '.') !== false) { + continue; + } + $class = "HTMLPurifier_Filter_$filter"; + $filters[] = new $class; + } + foreach ($custom_filters as $filter) { + // maybe "HTMLPurifier_Filter_$filter", but be consistent with AutoFormat + $filters[] = $filter; + } + $filters = array_merge($filters, $this->filters); + // maybe prepare(), but later + + for ($i = 0, $filter_size = count($filters); $i < $filter_size; $i++) { + $html = $filters[$i]->preFilter($html, $config, $context); + } + + // purified HTML + $html = + $this->generator->generateFromTokens( + // list of tokens + $this->strategy->execute( + // list of un-purified tokens + $lexer->tokenizeHTML( + // un-purified HTML + $html, + $config, + $context + ), + $config, + $context + ) + ); + + for ($i = $filter_size - 1; $i >= 0; $i--) { + $html = $filters[$i]->postFilter($html, $config, $context); + } + + $html = HTMLPurifier_Encoder::convertFromUTF8($html, $config, $context); + $this->context =& $context; + return $html; + } + + /** + * Filters an array of HTML snippets + * + * @param string[] $array_of_html Array of html snippets + * @param HTMLPurifier_Config $config Optional config object for this operation. + * See HTMLPurifier::purify() for more details. + * + * @return string[] Array of purified HTML + */ + public function purifyArray($array_of_html, $config = null) + { + $context_array = array(); + foreach ($array_of_html as $key => $html) { + $array_of_html[$key] = $this->purify($html, $config); + $context_array[$key] = $this->context; + } + $this->context = $context_array; + return $array_of_html; + } + + /** + * Singleton for enforcing just one HTML Purifier in your system + * + * @param HTMLPurifier|HTMLPurifier_Config $prototype Optional prototype + * HTMLPurifier instance to overload singleton with, + * or HTMLPurifier_Config instance to configure the + * generated version with. + * + * @return HTMLPurifier + */ + public static function instance($prototype = null) + { + if (!self::$instance || $prototype) { + if ($prototype instanceof HTMLPurifier) { + self::$instance = $prototype; + } elseif ($prototype) { + self::$instance = new HTMLPurifier($prototype); + } else { + self::$instance = new HTMLPurifier(); + } + } + return self::$instance; + } + + /** + * Singleton for enforcing just one HTML Purifier in your system + * + * @param HTMLPurifier|HTMLPurifier_Config $prototype Optional prototype + * HTMLPurifier instance to overload singleton with, + * or HTMLPurifier_Config instance to configure the + * generated version with. + * + * @return HTMLPurifier + * @note Backwards compatibility, see instance() + */ + public static function getInstance($prototype = null) + { + return HTMLPurifier::instance($prototype); + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier.safe-includes.php b/thirdparty/HTMLPurifier/HTMLPurifier.safe-includes.php similarity index 98% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier.safe-includes.php rename to thirdparty/HTMLPurifier/HTMLPurifier.safe-includes.php index 48707360b..9dea6d1ed 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier.safe-includes.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier.safe-includes.php @@ -1,223 +1,223 @@ -getHTMLDefinition(); - $parent = new HTMLPurifier_Token_Start($definition->info_parent); - $stack = array($parent->toNode()); - foreach ($tokens as $token) { - $token->skip = null; // [MUT] - $token->carryover = null; // [MUT] - if ($token instanceof HTMLPurifier_Token_End) { - $token->start = null; // [MUT] - $r = array_pop($stack); - assert($r->name === $token->name); - assert(empty($token->attr)); - $r->endCol = $token->col; - $r->endLine = $token->line; - $r->endArmor = $token->armor; - continue; - } - $node = $token->toNode(); - $stack[count($stack)-1]->children[] = $node; - if ($token instanceof HTMLPurifier_Token_Start) { - $stack[] = $node; - } - } - assert(count($stack) == 1); - return $stack[0]; - } - - public static function flatten($node, $config, $context) { - $level = 0; - $nodes = array($level => new HTMLPurifier_Queue(array($node))); - $closingTokens = array(); - $tokens = array(); - do { - while (!$nodes[$level]->isEmpty()) { - $node = $nodes[$level]->shift(); // FIFO - list($start, $end) = $node->toTokenPair(); - if ($level > 0) { - $tokens[] = $start; - } - if ($end !== NULL) { - $closingTokens[$level][] = $end; - } - if ($node instanceof HTMLPurifier_Node_Element) { - $level++; - $nodes[$level] = new HTMLPurifier_Queue(); - foreach ($node->children as $childNode) { - $nodes[$level]->push($childNode); - } - } - } - $level--; - if ($level && isset($closingTokens[$level])) { - while ($token = array_pop($closingTokens[$level])) { - $tokens[] = $token; - } - } - } while ($level > 0); - return $tokens; - } -} +getHTMLDefinition(); + $parent = new HTMLPurifier_Token_Start($definition->info_parent); + $stack = array($parent->toNode()); + foreach ($tokens as $token) { + $token->skip = null; // [MUT] + $token->carryover = null; // [MUT] + if ($token instanceof HTMLPurifier_Token_End) { + $token->start = null; // [MUT] + $r = array_pop($stack); + assert($r->name === $token->name); + assert(empty($token->attr)); + $r->endCol = $token->col; + $r->endLine = $token->line; + $r->endArmor = $token->armor; + continue; + } + $node = $token->toNode(); + $stack[count($stack)-1]->children[] = $node; + if ($token instanceof HTMLPurifier_Token_Start) { + $stack[] = $node; + } + } + assert(count($stack) == 1); + return $stack[0]; + } + + public static function flatten($node, $config, $context) { + $level = 0; + $nodes = array($level => new HTMLPurifier_Queue(array($node))); + $closingTokens = array(); + $tokens = array(); + do { + while (!$nodes[$level]->isEmpty()) { + $node = $nodes[$level]->shift(); // FIFO + list($start, $end) = $node->toTokenPair(); + if ($level > 0) { + $tokens[] = $start; + } + if ($end !== NULL) { + $closingTokens[$level][] = $end; + } + if ($node instanceof HTMLPurifier_Node_Element) { + $level++; + $nodes[$level] = new HTMLPurifier_Queue(); + foreach ($node->children as $childNode) { + $nodes[$level]->push($childNode); + } + } + } + $level--; + if ($level && isset($closingTokens[$level])) { + while ($token = array_pop($closingTokens[$level])) { + $tokens[] = $token; + } + } + } while ($level > 0); + return $tokens; + } +} diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrCollections.php b/thirdparty/HTMLPurifier/HTMLPurifier/AttrCollections.php similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrCollections.php rename to thirdparty/HTMLPurifier/HTMLPurifier/AttrCollections.php index 2d2c7d288..4f6c2e39a 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrCollections.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/AttrCollections.php @@ -1,143 +1,143 @@ -attr_collections as $coll_i => $coll) { - if (!isset($this->info[$coll_i])) { - $this->info[$coll_i] = array(); - } - foreach ($coll as $attr_i => $attr) { - if ($attr_i === 0 && isset($this->info[$coll_i][$attr_i])) { - // merge in includes - $this->info[$coll_i][$attr_i] = array_merge( - $this->info[$coll_i][$attr_i], - $attr - ); - continue; - } - $this->info[$coll_i][$attr_i] = $attr; - } - } - } - // perform internal expansions and inclusions - foreach ($this->info as $name => $attr) { - // merge attribute collections that include others - $this->performInclusions($this->info[$name]); - // replace string identifiers with actual attribute objects - $this->expandIdentifiers($this->info[$name], $attr_types); - } - } - - /** - * Takes a reference to an attribute associative array and performs - * all inclusions specified by the zero index. - * @param array &$attr Reference to attribute array - */ - public function performInclusions(&$attr) - { - if (!isset($attr[0])) { - return; - } - $merge = $attr[0]; - $seen = array(); // recursion guard - // loop through all the inclusions - for ($i = 0; isset($merge[$i]); $i++) { - if (isset($seen[$merge[$i]])) { - continue; - } - $seen[$merge[$i]] = true; - // foreach attribute of the inclusion, copy it over - if (!isset($this->info[$merge[$i]])) { - continue; - } - foreach ($this->info[$merge[$i]] as $key => $value) { - if (isset($attr[$key])) { - continue; - } // also catches more inclusions - $attr[$key] = $value; - } - if (isset($this->info[$merge[$i]][0])) { - // recursion - $merge = array_merge($merge, $this->info[$merge[$i]][0]); - } - } - unset($attr[0]); - } - - /** - * Expands all string identifiers in an attribute array by replacing - * them with the appropriate values inside HTMLPurifier_AttrTypes - * @param array &$attr Reference to attribute array - * @param HTMLPurifier_AttrTypes $attr_types HTMLPurifier_AttrTypes instance - */ - public function expandIdentifiers(&$attr, $attr_types) - { - // because foreach will process new elements we add, make sure we - // skip duplicates - $processed = array(); - - foreach ($attr as $def_i => $def) { - // skip inclusions - if ($def_i === 0) { - continue; - } - - if (isset($processed[$def_i])) { - continue; - } - - // determine whether or not attribute is required - if ($required = (strpos($def_i, '*') !== false)) { - // rename the definition - unset($attr[$def_i]); - $def_i = trim($def_i, '*'); - $attr[$def_i] = $def; - } - - $processed[$def_i] = true; - - // if we've already got a literal object, move on - if (is_object($def)) { - // preserve previous required - $attr[$def_i]->required = ($required || $attr[$def_i]->required); - continue; - } - - if ($def === false) { - unset($attr[$def_i]); - continue; - } - - if ($t = $attr_types->get($def)) { - $attr[$def_i] = $t; - $attr[$def_i]->required = $required; - } else { - unset($attr[$def_i]); - } - } - } -} - -// vim: et sw=4 sts=4 +attr_collections as $coll_i => $coll) { + if (!isset($this->info[$coll_i])) { + $this->info[$coll_i] = array(); + } + foreach ($coll as $attr_i => $attr) { + if ($attr_i === 0 && isset($this->info[$coll_i][$attr_i])) { + // merge in includes + $this->info[$coll_i][$attr_i] = array_merge( + $this->info[$coll_i][$attr_i], + $attr + ); + continue; + } + $this->info[$coll_i][$attr_i] = $attr; + } + } + } + // perform internal expansions and inclusions + foreach ($this->info as $name => $attr) { + // merge attribute collections that include others + $this->performInclusions($this->info[$name]); + // replace string identifiers with actual attribute objects + $this->expandIdentifiers($this->info[$name], $attr_types); + } + } + + /** + * Takes a reference to an attribute associative array and performs + * all inclusions specified by the zero index. + * @param array &$attr Reference to attribute array + */ + public function performInclusions(&$attr) + { + if (!isset($attr[0])) { + return; + } + $merge = $attr[0]; + $seen = array(); // recursion guard + // loop through all the inclusions + for ($i = 0; isset($merge[$i]); $i++) { + if (isset($seen[$merge[$i]])) { + continue; + } + $seen[$merge[$i]] = true; + // foreach attribute of the inclusion, copy it over + if (!isset($this->info[$merge[$i]])) { + continue; + } + foreach ($this->info[$merge[$i]] as $key => $value) { + if (isset($attr[$key])) { + continue; + } // also catches more inclusions + $attr[$key] = $value; + } + if (isset($this->info[$merge[$i]][0])) { + // recursion + $merge = array_merge($merge, $this->info[$merge[$i]][0]); + } + } + unset($attr[0]); + } + + /** + * Expands all string identifiers in an attribute array by replacing + * them with the appropriate values inside HTMLPurifier_AttrTypes + * @param array &$attr Reference to attribute array + * @param HTMLPurifier_AttrTypes $attr_types HTMLPurifier_AttrTypes instance + */ + public function expandIdentifiers(&$attr, $attr_types) + { + // because foreach will process new elements we add, make sure we + // skip duplicates + $processed = array(); + + foreach ($attr as $def_i => $def) { + // skip inclusions + if ($def_i === 0) { + continue; + } + + if (isset($processed[$def_i])) { + continue; + } + + // determine whether or not attribute is required + if ($required = (strpos($def_i, '*') !== false)) { + // rename the definition + unset($attr[$def_i]); + $def_i = trim($def_i, '*'); + $attr[$def_i] = $def; + } + + $processed[$def_i] = true; + + // if we've already got a literal object, move on + if (is_object($def)) { + // preserve previous required + $attr[$def_i]->required = ($required || $attr[$def_i]->required); + continue; + } + + if ($def === false) { + unset($attr[$def_i]); + continue; + } + + if ($t = $attr_types->get($def)) { + $attr[$def_i] = $t; + $attr[$def_i]->required = $required; + } else { + unset($attr[$def_i]); + } + } + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef.php b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef.php similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef.php rename to thirdparty/HTMLPurifier/HTMLPurifier/AttrDef.php index 880d8f6d0..5ac06522b 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef.php @@ -1,138 +1,138 @@ - by removing - * leading and trailing whitespace, ignoring line feeds, and replacing - * carriage returns and tabs with spaces. While most useful for HTML - * attributes specified as CDATA, it can also be applied to most CSS - * values. - * - * @note This method is not entirely standards compliant, as trim() removes - * more types of whitespace than specified in the spec. In practice, - * this is rarely a problem, as those extra characters usually have - * already been removed by HTMLPurifier_Encoder. - * - * @warning This processing is inconsistent with XML's whitespace handling - * as specified by section 3.3.3 and referenced XHTML 1.0 section - * 4.7. However, note that we are NOT necessarily - * parsing XML, thus, this behavior may still be correct. We - * assume that newlines have been normalized. - */ - public function parseCDATA($string) - { - $string = trim($string); - $string = str_replace(array("\n", "\t", "\r"), ' ', $string); - return $string; - } - - /** - * Factory method for creating this class from a string. - * @param string $string String construction info - * @return HTMLPurifier_AttrDef Created AttrDef object corresponding to $string - */ - public function make($string) - { - // default implementation, return a flyweight of this object. - // If $string has an effect on the returned object (i.e. you - // need to overload this method), it is best - // to clone or instantiate new copies. (Instantiation is safer.) - return $this; - } - - /** - * Removes spaces from rgb(0, 0, 0) so that shorthand CSS properties work - * properly. THIS IS A HACK! - * @param string $string a CSS colour definition - * @return string - */ - protected function mungeRgb($string) - { - return preg_replace('/rgb\((\d+)\s*,\s*(\d+)\s*,\s*(\d+)\)/', 'rgb(\1,\2,\3)', $string); - } - - /** - * Parses a possibly escaped CSS string and returns the "pure" - * version of it. - */ - protected function expandCSSEscape($string) - { - // flexibly parse it - $ret = ''; - for ($i = 0, $c = strlen($string); $i < $c; $i++) { - if ($string[$i] === '\\') { - $i++; - if ($i >= $c) { - $ret .= '\\'; - break; - } - if (ctype_xdigit($string[$i])) { - $code = $string[$i]; - for ($a = 1, $i++; $i < $c && $a < 6; $i++, $a++) { - if (!ctype_xdigit($string[$i])) { - break; - } - $code .= $string[$i]; - } - // We have to be extremely careful when adding - // new characters, to make sure we're not breaking - // the encoding. - $char = HTMLPurifier_Encoder::unichr(hexdec($code)); - if (HTMLPurifier_Encoder::cleanUTF8($char) === '') { - continue; - } - $ret .= $char; - if ($i < $c && trim($string[$i]) !== '') { - $i--; - } - continue; - } - if ($string[$i] === "\n") { - continue; - } - } - $ret .= $string[$i]; - } - return $ret; - } -} - -// vim: et sw=4 sts=4 + by removing + * leading and trailing whitespace, ignoring line feeds, and replacing + * carriage returns and tabs with spaces. While most useful for HTML + * attributes specified as CDATA, it can also be applied to most CSS + * values. + * + * @note This method is not entirely standards compliant, as trim() removes + * more types of whitespace than specified in the spec. In practice, + * this is rarely a problem, as those extra characters usually have + * already been removed by HTMLPurifier_Encoder. + * + * @warning This processing is inconsistent with XML's whitespace handling + * as specified by section 3.3.3 and referenced XHTML 1.0 section + * 4.7. However, note that we are NOT necessarily + * parsing XML, thus, this behavior may still be correct. We + * assume that newlines have been normalized. + */ + public function parseCDATA($string) + { + $string = trim($string); + $string = str_replace(array("\n", "\t", "\r"), ' ', $string); + return $string; + } + + /** + * Factory method for creating this class from a string. + * @param string $string String construction info + * @return HTMLPurifier_AttrDef Created AttrDef object corresponding to $string + */ + public function make($string) + { + // default implementation, return a flyweight of this object. + // If $string has an effect on the returned object (i.e. you + // need to overload this method), it is best + // to clone or instantiate new copies. (Instantiation is safer.) + return $this; + } + + /** + * Removes spaces from rgb(0, 0, 0) so that shorthand CSS properties work + * properly. THIS IS A HACK! + * @param string $string a CSS colour definition + * @return string + */ + protected function mungeRgb($string) + { + return preg_replace('/rgb\((\d+)\s*,\s*(\d+)\s*,\s*(\d+)\)/', 'rgb(\1,\2,\3)', $string); + } + + /** + * Parses a possibly escaped CSS string and returns the "pure" + * version of it. + */ + protected function expandCSSEscape($string) + { + // flexibly parse it + $ret = ''; + for ($i = 0, $c = strlen($string); $i < $c; $i++) { + if ($string[$i] === '\\') { + $i++; + if ($i >= $c) { + $ret .= '\\'; + break; + } + if (ctype_xdigit($string[$i])) { + $code = $string[$i]; + for ($a = 1, $i++; $i < $c && $a < 6; $i++, $a++) { + if (!ctype_xdigit($string[$i])) { + break; + } + $code .= $string[$i]; + } + // We have to be extremely careful when adding + // new characters, to make sure we're not breaking + // the encoding. + $char = HTMLPurifier_Encoder::unichr(hexdec($code)); + if (HTMLPurifier_Encoder::cleanUTF8($char) === '') { + continue; + } + $ret .= $char; + if ($i < $c && trim($string[$i]) !== '') { + $i--; + } + continue; + } + if ($string[$i] === "\n") { + continue; + } + } + $ret .= $string[$i]; + } + return $ret; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS.php b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS.php similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS.php rename to thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS.php index 81afcf967..02c1641fb 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS.php @@ -1,106 +1,106 @@ -parseCDATA($css); - - $definition = $config->getCSSDefinition(); - - // we're going to break the spec and explode by semicolons. - // This is because semicolon rarely appears in escaped form - // Doing this is generally flaky but fast - // IT MIGHT APPEAR IN URIs, see HTMLPurifier_AttrDef_CSSURI - // for details - - $declarations = explode(';', $css); - $propvalues = array(); - - /** - * Name of the current CSS property being validated. - */ - $property = false; - $context->register('CurrentCSSProperty', $property); - - foreach ($declarations as $declaration) { - if (!$declaration) { - continue; - } - if (!strpos($declaration, ':')) { - continue; - } - list($property, $value) = explode(':', $declaration, 2); - $property = trim($property); - $value = trim($value); - $ok = false; - do { - if (isset($definition->info[$property])) { - $ok = true; - break; - } - if (ctype_lower($property)) { - break; - } - $property = strtolower($property); - if (isset($definition->info[$property])) { - $ok = true; - break; - } - } while (0); - if (!$ok) { - continue; - } - // inefficient call, since the validator will do this again - if (strtolower(trim($value)) !== 'inherit') { - // inherit works for everything (but only on the base property) - $result = $definition->info[$property]->validate( - $value, - $config, - $context - ); - } else { - $result = 'inherit'; - } - if ($result === false) { - continue; - } - $propvalues[$property] = $result; - } - - $context->destroy('CurrentCSSProperty'); - - // procedure does not write the new CSS simultaneously, so it's - // slightly inefficient, but it's the only way of getting rid of - // duplicates. Perhaps config to optimize it, but not now. - - $new_declarations = ''; - foreach ($propvalues as $prop => $value) { - $new_declarations .= "$prop:$value;"; - } - - return $new_declarations ? $new_declarations : false; - - } - -} - -// vim: et sw=4 sts=4 +parseCDATA($css); + + $definition = $config->getCSSDefinition(); + + // we're going to break the spec and explode by semicolons. + // This is because semicolon rarely appears in escaped form + // Doing this is generally flaky but fast + // IT MIGHT APPEAR IN URIs, see HTMLPurifier_AttrDef_CSSURI + // for details + + $declarations = explode(';', $css); + $propvalues = array(); + + /** + * Name of the current CSS property being validated. + */ + $property = false; + $context->register('CurrentCSSProperty', $property); + + foreach ($declarations as $declaration) { + if (!$declaration) { + continue; + } + if (!strpos($declaration, ':')) { + continue; + } + list($property, $value) = explode(':', $declaration, 2); + $property = trim($property); + $value = trim($value); + $ok = false; + do { + if (isset($definition->info[$property])) { + $ok = true; + break; + } + if (ctype_lower($property)) { + break; + } + $property = strtolower($property); + if (isset($definition->info[$property])) { + $ok = true; + break; + } + } while (0); + if (!$ok) { + continue; + } + // inefficient call, since the validator will do this again + if (strtolower(trim($value)) !== 'inherit') { + // inherit works for everything (but only on the base property) + $result = $definition->info[$property]->validate( + $value, + $config, + $context + ); + } else { + $result = 'inherit'; + } + if ($result === false) { + continue; + } + $propvalues[$property] = $result; + } + + $context->destroy('CurrentCSSProperty'); + + // procedure does not write the new CSS simultaneously, so it's + // slightly inefficient, but it's the only way of getting rid of + // duplicates. Perhaps config to optimize it, but not now. + + $new_declarations = ''; + foreach ($propvalues as $prop => $value) { + $new_declarations .= "$prop:$value;"; + } + + return $new_declarations ? $new_declarations : false; + + } + +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/AlphaValue.php b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/AlphaValue.php similarity index 95% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/AlphaValue.php rename to thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/AlphaValue.php index 1a30e8fe0..af2b83dff 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/AlphaValue.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/AlphaValue.php @@ -1,34 +1,34 @@ - 1.0) { - $result = '1'; - } - return $result; - } -} - -// vim: et sw=4 sts=4 + 1.0) { + $result = '1'; + } + return $result; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Background.php b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Background.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Background.php rename to thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Background.php index ecd6e276e..7f1ea3b0f 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Background.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Background.php @@ -1,111 +1,111 @@ -getCSSDefinition(); - $this->info['background-color'] = $def->info['background-color']; - $this->info['background-image'] = $def->info['background-image']; - $this->info['background-repeat'] = $def->info['background-repeat']; - $this->info['background-attachment'] = $def->info['background-attachment']; - $this->info['background-position'] = $def->info['background-position']; - } - - /** - * @param string $string - * @param HTMLPurifier_Config $config - * @param HTMLPurifier_Context $context - * @return bool|string - */ - public function validate($string, $config, $context) - { - // regular pre-processing - $string = $this->parseCDATA($string); - if ($string === '') { - return false; - } - - // munge rgb() decl if necessary - $string = $this->mungeRgb($string); - - // assumes URI doesn't have spaces in it - $bits = explode(' ', $string); // bits to process - - $caught = array(); - $caught['color'] = false; - $caught['image'] = false; - $caught['repeat'] = false; - $caught['attachment'] = false; - $caught['position'] = false; - - $i = 0; // number of catches - - foreach ($bits as $bit) { - if ($bit === '') { - continue; - } - foreach ($caught as $key => $status) { - if ($key != 'position') { - if ($status !== false) { - continue; - } - $r = $this->info['background-' . $key]->validate($bit, $config, $context); - } else { - $r = $bit; - } - if ($r === false) { - continue; - } - if ($key == 'position') { - if ($caught[$key] === false) { - $caught[$key] = ''; - } - $caught[$key] .= $r . ' '; - } else { - $caught[$key] = $r; - } - $i++; - break; - } - } - - if (!$i) { - return false; - } - if ($caught['position'] !== false) { - $caught['position'] = $this->info['background-position']-> - validate($caught['position'], $config, $context); - } - - $ret = array(); - foreach ($caught as $value) { - if ($value === false) { - continue; - } - $ret[] = $value; - } - - if (empty($ret)) { - return false; - } - return implode(' ', $ret); - } -} - -// vim: et sw=4 sts=4 +getCSSDefinition(); + $this->info['background-color'] = $def->info['background-color']; + $this->info['background-image'] = $def->info['background-image']; + $this->info['background-repeat'] = $def->info['background-repeat']; + $this->info['background-attachment'] = $def->info['background-attachment']; + $this->info['background-position'] = $def->info['background-position']; + } + + /** + * @param string $string + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($string, $config, $context) + { + // regular pre-processing + $string = $this->parseCDATA($string); + if ($string === '') { + return false; + } + + // munge rgb() decl if necessary + $string = $this->mungeRgb($string); + + // assumes URI doesn't have spaces in it + $bits = explode(' ', $string); // bits to process + + $caught = array(); + $caught['color'] = false; + $caught['image'] = false; + $caught['repeat'] = false; + $caught['attachment'] = false; + $caught['position'] = false; + + $i = 0; // number of catches + + foreach ($bits as $bit) { + if ($bit === '') { + continue; + } + foreach ($caught as $key => $status) { + if ($key != 'position') { + if ($status !== false) { + continue; + } + $r = $this->info['background-' . $key]->validate($bit, $config, $context); + } else { + $r = $bit; + } + if ($r === false) { + continue; + } + if ($key == 'position') { + if ($caught[$key] === false) { + $caught[$key] = ''; + } + $caught[$key] .= $r . ' '; + } else { + $caught[$key] = $r; + } + $i++; + break; + } + } + + if (!$i) { + return false; + } + if ($caught['position'] !== false) { + $caught['position'] = $this->info['background-position']-> + validate($caught['position'], $config, $context); + } + + $ret = array(); + foreach ($caught as $value) { + if ($value === false) { + continue; + } + $ret[] = $value; + } + + if (empty($ret)) { + return false; + } + return implode(' ', $ret); + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/BackgroundPosition.php b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/BackgroundPosition.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/BackgroundPosition.php rename to thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/BackgroundPosition.php index f95de5bbf..4580ef5a9 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/BackgroundPosition.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/BackgroundPosition.php @@ -1,157 +1,157 @@ - | | left | center | right - ] - [ - | | top | center | bottom - ]? - ] | - [ // this signifies that the vertical and horizontal adjectives - // can be arbitrarily ordered, however, there can only be two, - // one of each, or none at all - [ - left | center | right - ] || - [ - top | center | bottom - ] - ] - top, left = 0% - center, (none) = 50% - bottom, right = 100% -*/ - -/* QuirksMode says: - keyword + length/percentage must be ordered correctly, as per W3C - - Internet Explorer and Opera, however, support arbitrary ordering. We - should fix it up. - - Minor issue though, not strictly necessary. -*/ - -// control freaks may appreciate the ability to convert these to -// percentages or something, but it's not necessary - -/** - * Validates the value of background-position. - */ -class HTMLPurifier_AttrDef_CSS_BackgroundPosition extends HTMLPurifier_AttrDef -{ - - /** - * @type HTMLPurifier_AttrDef_CSS_Length - */ - protected $length; - - /** - * @type HTMLPurifier_AttrDef_CSS_Percentage - */ - protected $percentage; - - public function __construct() - { - $this->length = new HTMLPurifier_AttrDef_CSS_Length(); - $this->percentage = new HTMLPurifier_AttrDef_CSS_Percentage(); - } - - /** - * @param string $string - * @param HTMLPurifier_Config $config - * @param HTMLPurifier_Context $context - * @return bool|string - */ - public function validate($string, $config, $context) - { - $string = $this->parseCDATA($string); - $bits = explode(' ', $string); - - $keywords = array(); - $keywords['h'] = false; // left, right - $keywords['v'] = false; // top, bottom - $keywords['ch'] = false; // center (first word) - $keywords['cv'] = false; // center (second word) - $measures = array(); - - $i = 0; - - $lookup = array( - 'top' => 'v', - 'bottom' => 'v', - 'left' => 'h', - 'right' => 'h', - 'center' => 'c' - ); - - foreach ($bits as $bit) { - if ($bit === '') { - continue; - } - - // test for keyword - $lbit = ctype_lower($bit) ? $bit : strtolower($bit); - if (isset($lookup[$lbit])) { - $status = $lookup[$lbit]; - if ($status == 'c') { - if ($i == 0) { - $status = 'ch'; - } else { - $status = 'cv'; - } - } - $keywords[$status] = $lbit; - $i++; - } - - // test for length - $r = $this->length->validate($bit, $config, $context); - if ($r !== false) { - $measures[] = $r; - $i++; - } - - // test for percentage - $r = $this->percentage->validate($bit, $config, $context); - if ($r !== false) { - $measures[] = $r; - $i++; - } - } - - if (!$i) { - return false; - } // no valid values were caught - - $ret = array(); - - // first keyword - if ($keywords['h']) { - $ret[] = $keywords['h']; - } elseif ($keywords['ch']) { - $ret[] = $keywords['ch']; - $keywords['cv'] = false; // prevent re-use: center = center center - } elseif (count($measures)) { - $ret[] = array_shift($measures); - } - - if ($keywords['v']) { - $ret[] = $keywords['v']; - } elseif ($keywords['cv']) { - $ret[] = $keywords['cv']; - } elseif (count($measures)) { - $ret[] = array_shift($measures); - } - - if (empty($ret)) { - return false; - } - return implode(' ', $ret); - } -} - -// vim: et sw=4 sts=4 + | | left | center | right + ] + [ + | | top | center | bottom + ]? + ] | + [ // this signifies that the vertical and horizontal adjectives + // can be arbitrarily ordered, however, there can only be two, + // one of each, or none at all + [ + left | center | right + ] || + [ + top | center | bottom + ] + ] + top, left = 0% + center, (none) = 50% + bottom, right = 100% +*/ + +/* QuirksMode says: + keyword + length/percentage must be ordered correctly, as per W3C + + Internet Explorer and Opera, however, support arbitrary ordering. We + should fix it up. + + Minor issue though, not strictly necessary. +*/ + +// control freaks may appreciate the ability to convert these to +// percentages or something, but it's not necessary + +/** + * Validates the value of background-position. + */ +class HTMLPurifier_AttrDef_CSS_BackgroundPosition extends HTMLPurifier_AttrDef +{ + + /** + * @type HTMLPurifier_AttrDef_CSS_Length + */ + protected $length; + + /** + * @type HTMLPurifier_AttrDef_CSS_Percentage + */ + protected $percentage; + + public function __construct() + { + $this->length = new HTMLPurifier_AttrDef_CSS_Length(); + $this->percentage = new HTMLPurifier_AttrDef_CSS_Percentage(); + } + + /** + * @param string $string + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($string, $config, $context) + { + $string = $this->parseCDATA($string); + $bits = explode(' ', $string); + + $keywords = array(); + $keywords['h'] = false; // left, right + $keywords['v'] = false; // top, bottom + $keywords['ch'] = false; // center (first word) + $keywords['cv'] = false; // center (second word) + $measures = array(); + + $i = 0; + + $lookup = array( + 'top' => 'v', + 'bottom' => 'v', + 'left' => 'h', + 'right' => 'h', + 'center' => 'c' + ); + + foreach ($bits as $bit) { + if ($bit === '') { + continue; + } + + // test for keyword + $lbit = ctype_lower($bit) ? $bit : strtolower($bit); + if (isset($lookup[$lbit])) { + $status = $lookup[$lbit]; + if ($status == 'c') { + if ($i == 0) { + $status = 'ch'; + } else { + $status = 'cv'; + } + } + $keywords[$status] = $lbit; + $i++; + } + + // test for length + $r = $this->length->validate($bit, $config, $context); + if ($r !== false) { + $measures[] = $r; + $i++; + } + + // test for percentage + $r = $this->percentage->validate($bit, $config, $context); + if ($r !== false) { + $measures[] = $r; + $i++; + } + } + + if (!$i) { + return false; + } // no valid values were caught + + $ret = array(); + + // first keyword + if ($keywords['h']) { + $ret[] = $keywords['h']; + } elseif ($keywords['ch']) { + $ret[] = $keywords['ch']; + $keywords['cv'] = false; // prevent re-use: center = center center + } elseif (count($measures)) { + $ret[] = array_shift($measures); + } + + if ($keywords['v']) { + $ret[] = $keywords['v']; + } elseif ($keywords['cv']) { + $ret[] = $keywords['cv']; + } elseif (count($measures)) { + $ret[] = array_shift($measures); + } + + if (empty($ret)) { + return false; + } + return implode(' ', $ret); + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Border.php b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Border.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Border.php rename to thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Border.php index bd310ff23..16243ba1e 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Border.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Border.php @@ -1,56 +1,56 @@ -getCSSDefinition(); - $this->info['border-width'] = $def->info['border-width']; - $this->info['border-style'] = $def->info['border-style']; - $this->info['border-top-color'] = $def->info['border-top-color']; - } - - /** - * @param string $string - * @param HTMLPurifier_Config $config - * @param HTMLPurifier_Context $context - * @return bool|string - */ - public function validate($string, $config, $context) - { - $string = $this->parseCDATA($string); - $string = $this->mungeRgb($string); - $bits = explode(' ', $string); - $done = array(); // segments we've finished - $ret = ''; // return value - foreach ($bits as $bit) { - foreach ($this->info as $propname => $validator) { - if (isset($done[$propname])) { - continue; - } - $r = $validator->validate($bit, $config, $context); - if ($r !== false) { - $ret .= $r . ' '; - $done[$propname] = true; - break; - } - } - } - return rtrim($ret); - } -} - -// vim: et sw=4 sts=4 +getCSSDefinition(); + $this->info['border-width'] = $def->info['border-width']; + $this->info['border-style'] = $def->info['border-style']; + $this->info['border-top-color'] = $def->info['border-top-color']; + } + + /** + * @param string $string + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($string, $config, $context) + { + $string = $this->parseCDATA($string); + $string = $this->mungeRgb($string); + $bits = explode(' ', $string); + $done = array(); // segments we've finished + $ret = ''; // return value + foreach ($bits as $bit) { + foreach ($this->info as $propname => $validator) { + if (isset($done[$propname])) { + continue; + } + $r = $validator->validate($bit, $config, $context); + if ($r !== false) { + $ret .= $r . ' '; + $done[$propname] = true; + break; + } + } + } + return rtrim($ret); + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Color.php b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Color.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Color.php rename to thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Color.php index e553c65e8..16d2a6b98 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Color.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Color.php @@ -1,105 +1,105 @@ -get('Core.ColorKeywords'); - } - - $color = trim($color); - if ($color === '') { - return false; - } - - $lower = strtolower($color); - if (isset($colors[$lower])) { - return $colors[$lower]; - } - - if (strpos($color, 'rgb(') !== false) { - // rgb literal handling - $length = strlen($color); - if (strpos($color, ')') !== $length - 1) { - return false; - } - $triad = substr($color, 4, $length - 4 - 1); - $parts = explode(',', $triad); - if (count($parts) !== 3) { - return false; - } - $type = false; // to ensure that they're all the same type - $new_parts = array(); - foreach ($parts as $part) { - $part = trim($part); - if ($part === '') { - return false; - } - $length = strlen($part); - if ($part[$length - 1] === '%') { - // handle percents - if (!$type) { - $type = 'percentage'; - } elseif ($type !== 'percentage') { - return false; - } - $num = (float)substr($part, 0, $length - 1); - if ($num < 0) { - $num = 0; - } - if ($num > 100) { - $num = 100; - } - $new_parts[] = "$num%"; - } else { - // handle integers - if (!$type) { - $type = 'integer'; - } elseif ($type !== 'integer') { - return false; - } - $num = (int)$part; - if ($num < 0) { - $num = 0; - } - if ($num > 255) { - $num = 255; - } - $new_parts[] = (string)$num; - } - } - $new_triad = implode(',', $new_parts); - $color = "rgb($new_triad)"; - } else { - // hexadecimal handling - if ($color[0] === '#') { - $hex = substr($color, 1); - } else { - $hex = $color; - $color = '#' . $color; - } - $length = strlen($hex); - if ($length !== 3 && $length !== 6) { - return false; - } - if (!ctype_xdigit($hex)) { - return false; - } - } - return $color; - } -} - -// vim: et sw=4 sts=4 +get('Core.ColorKeywords'); + } + + $color = trim($color); + if ($color === '') { + return false; + } + + $lower = strtolower($color); + if (isset($colors[$lower])) { + return $colors[$lower]; + } + + if (strpos($color, 'rgb(') !== false) { + // rgb literal handling + $length = strlen($color); + if (strpos($color, ')') !== $length - 1) { + return false; + } + $triad = substr($color, 4, $length - 4 - 1); + $parts = explode(',', $triad); + if (count($parts) !== 3) { + return false; + } + $type = false; // to ensure that they're all the same type + $new_parts = array(); + foreach ($parts as $part) { + $part = trim($part); + if ($part === '') { + return false; + } + $length = strlen($part); + if ($part[$length - 1] === '%') { + // handle percents + if (!$type) { + $type = 'percentage'; + } elseif ($type !== 'percentage') { + return false; + } + $num = (float)substr($part, 0, $length - 1); + if ($num < 0) { + $num = 0; + } + if ($num > 100) { + $num = 100; + } + $new_parts[] = "$num%"; + } else { + // handle integers + if (!$type) { + $type = 'integer'; + } elseif ($type !== 'integer') { + return false; + } + $num = (int)$part; + if ($num < 0) { + $num = 0; + } + if ($num > 255) { + $num = 255; + } + $new_parts[] = (string)$num; + } + } + $new_triad = implode(',', $new_parts); + $color = "rgb($new_triad)"; + } else { + // hexadecimal handling + if ($color[0] === '#') { + $hex = substr($color, 1); + } else { + $hex = $color; + $color = '#' . $color; + } + $length = strlen($hex); + if ($length !== 3 && $length !== 6) { + return false; + } + if (!ctype_xdigit($hex)) { + return false; + } + } + return $color; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Composite.php b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Composite.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Composite.php rename to thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Composite.php index 389002322..9c1750554 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Composite.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Composite.php @@ -1,48 +1,48 @@ -defs = $defs; - } - - /** - * @param string $string - * @param HTMLPurifier_Config $config - * @param HTMLPurifier_Context $context - * @return bool|string - */ - public function validate($string, $config, $context) - { - foreach ($this->defs as $i => $def) { - $result = $this->defs[$i]->validate($string, $config, $context); - if ($result !== false) { - return $result; - } - } - return false; - } -} - -// vim: et sw=4 sts=4 +defs = $defs; + } + + /** + * @param string $string + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($string, $config, $context) + { + foreach ($this->defs as $i => $def) { + $result = $this->defs[$i]->validate($string, $config, $context); + if ($result !== false) { + return $result; + } + } + return false; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/DenyElementDecorator.php b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/DenyElementDecorator.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/DenyElementDecorator.php rename to thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/DenyElementDecorator.php index ff0d897ed..9d77cc9aa 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/DenyElementDecorator.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/DenyElementDecorator.php @@ -1,44 +1,44 @@ -def = $def; - $this->element = $element; - } - - /** - * Checks if CurrentToken is set and equal to $this->element - * @param string $string - * @param HTMLPurifier_Config $config - * @param HTMLPurifier_Context $context - * @return bool|string - */ - public function validate($string, $config, $context) - { - $token = $context->get('CurrentToken', true); - if ($token && $token->name == $this->element) { - return false; - } - return $this->def->validate($string, $config, $context); - } -} - -// vim: et sw=4 sts=4 +def = $def; + $this->element = $element; + } + + /** + * Checks if CurrentToken is set and equal to $this->element + * @param string $string + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($string, $config, $context) + { + $token = $context->get('CurrentToken', true); + if ($token && $token->name == $this->element) { + return false; + } + return $this->def->validate($string, $config, $context); + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Filter.php b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Filter.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Filter.php rename to thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Filter.php index 019722a48..bde4c3301 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Filter.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Filter.php @@ -1,77 +1,77 @@ -intValidator = new HTMLPurifier_AttrDef_Integer(); - } - - /** - * @param string $value - * @param HTMLPurifier_Config $config - * @param HTMLPurifier_Context $context - * @return bool|string - */ - public function validate($value, $config, $context) - { - $value = $this->parseCDATA($value); - if ($value === 'none') { - return $value; - } - // if we looped this we could support multiple filters - $function_length = strcspn($value, '('); - $function = trim(substr($value, 0, $function_length)); - if ($function !== 'alpha' && - $function !== 'Alpha' && - $function !== 'progid:DXImageTransform.Microsoft.Alpha' - ) { - return false; - } - $cursor = $function_length + 1; - $parameters_length = strcspn($value, ')', $cursor); - $parameters = substr($value, $cursor, $parameters_length); - $params = explode(',', $parameters); - $ret_params = array(); - $lookup = array(); - foreach ($params as $param) { - list($key, $value) = explode('=', $param); - $key = trim($key); - $value = trim($value); - if (isset($lookup[$key])) { - continue; - } - if ($key !== 'opacity') { - continue; - } - $value = $this->intValidator->validate($value, $config, $context); - if ($value === false) { - continue; - } - $int = (int)$value; - if ($int > 100) { - $value = '100'; - } - if ($int < 0) { - $value = '0'; - } - $ret_params[] = "$key=$value"; - $lookup[$key] = true; - } - $ret_parameters = implode(',', $ret_params); - $ret_function = "$function($ret_parameters)"; - return $ret_function; - } -} - -// vim: et sw=4 sts=4 +intValidator = new HTMLPurifier_AttrDef_Integer(); + } + + /** + * @param string $value + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($value, $config, $context) + { + $value = $this->parseCDATA($value); + if ($value === 'none') { + return $value; + } + // if we looped this we could support multiple filters + $function_length = strcspn($value, '('); + $function = trim(substr($value, 0, $function_length)); + if ($function !== 'alpha' && + $function !== 'Alpha' && + $function !== 'progid:DXImageTransform.Microsoft.Alpha' + ) { + return false; + } + $cursor = $function_length + 1; + $parameters_length = strcspn($value, ')', $cursor); + $parameters = substr($value, $cursor, $parameters_length); + $params = explode(',', $parameters); + $ret_params = array(); + $lookup = array(); + foreach ($params as $param) { + list($key, $value) = explode('=', $param); + $key = trim($key); + $value = trim($value); + if (isset($lookup[$key])) { + continue; + } + if ($key !== 'opacity') { + continue; + } + $value = $this->intValidator->validate($value, $config, $context); + if ($value === false) { + continue; + } + $int = (int)$value; + if ($int > 100) { + $value = '100'; + } + if ($int < 0) { + $value = '0'; + } + $ret_params[] = "$key=$value"; + $lookup[$key] = true; + } + $ret_parameters = implode(',', $ret_params); + $ret_function = "$function($ret_parameters)"; + return $ret_function; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Font.php b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Font.php similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Font.php rename to thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Font.php index b9b63f8ef..579b97ef1 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Font.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Font.php @@ -1,176 +1,176 @@ -getCSSDefinition(); - $this->info['font-style'] = $def->info['font-style']; - $this->info['font-variant'] = $def->info['font-variant']; - $this->info['font-weight'] = $def->info['font-weight']; - $this->info['font-size'] = $def->info['font-size']; - $this->info['line-height'] = $def->info['line-height']; - $this->info['font-family'] = $def->info['font-family']; - } - - /** - * @param string $string - * @param HTMLPurifier_Config $config - * @param HTMLPurifier_Context $context - * @return bool|string - */ - public function validate($string, $config, $context) - { - static $system_fonts = array( - 'caption' => true, - 'icon' => true, - 'menu' => true, - 'message-box' => true, - 'small-caption' => true, - 'status-bar' => true - ); - - // regular pre-processing - $string = $this->parseCDATA($string); - if ($string === '') { - return false; - } - - // check if it's one of the keywords - $lowercase_string = strtolower($string); - if (isset($system_fonts[$lowercase_string])) { - return $lowercase_string; - } - - $bits = explode(' ', $string); // bits to process - $stage = 0; // this indicates what we're looking for - $caught = array(); // which stage 0 properties have we caught? - $stage_1 = array('font-style', 'font-variant', 'font-weight'); - $final = ''; // output - - for ($i = 0, $size = count($bits); $i < $size; $i++) { - if ($bits[$i] === '') { - continue; - } - switch ($stage) { - case 0: // attempting to catch font-style, font-variant or font-weight - foreach ($stage_1 as $validator_name) { - if (isset($caught[$validator_name])) { - continue; - } - $r = $this->info[$validator_name]->validate( - $bits[$i], - $config, - $context - ); - if ($r !== false) { - $final .= $r . ' '; - $caught[$validator_name] = true; - break; - } - } - // all three caught, continue on - if (count($caught) >= 3) { - $stage = 1; - } - if ($r !== false) { - break; - } - case 1: // attempting to catch font-size and perhaps line-height - $found_slash = false; - if (strpos($bits[$i], '/') !== false) { - list($font_size, $line_height) = - explode('/', $bits[$i]); - if ($line_height === '') { - // ooh, there's a space after the slash! - $line_height = false; - $found_slash = true; - } - } else { - $font_size = $bits[$i]; - $line_height = false; - } - $r = $this->info['font-size']->validate( - $font_size, - $config, - $context - ); - if ($r !== false) { - $final .= $r; - // attempt to catch line-height - if ($line_height === false) { - // we need to scroll forward - for ($j = $i + 1; $j < $size; $j++) { - if ($bits[$j] === '') { - continue; - } - if ($bits[$j] === '/') { - if ($found_slash) { - return false; - } else { - $found_slash = true; - continue; - } - } - $line_height = $bits[$j]; - break; - } - } else { - // slash already found - $found_slash = true; - $j = $i; - } - if ($found_slash) { - $i = $j; - $r = $this->info['line-height']->validate( - $line_height, - $config, - $context - ); - if ($r !== false) { - $final .= '/' . $r; - } - } - $final .= ' '; - $stage = 2; - break; - } - return false; - case 2: // attempting to catch font-family - $font_family = - implode(' ', array_slice($bits, $i, $size - $i)); - $r = $this->info['font-family']->validate( - $font_family, - $config, - $context - ); - if ($r !== false) { - $final .= $r . ' '; - // processing completed successfully - return rtrim($final); - } - return false; - } - } - return false; - } -} - -// vim: et sw=4 sts=4 +getCSSDefinition(); + $this->info['font-style'] = $def->info['font-style']; + $this->info['font-variant'] = $def->info['font-variant']; + $this->info['font-weight'] = $def->info['font-weight']; + $this->info['font-size'] = $def->info['font-size']; + $this->info['line-height'] = $def->info['line-height']; + $this->info['font-family'] = $def->info['font-family']; + } + + /** + * @param string $string + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($string, $config, $context) + { + static $system_fonts = array( + 'caption' => true, + 'icon' => true, + 'menu' => true, + 'message-box' => true, + 'small-caption' => true, + 'status-bar' => true + ); + + // regular pre-processing + $string = $this->parseCDATA($string); + if ($string === '') { + return false; + } + + // check if it's one of the keywords + $lowercase_string = strtolower($string); + if (isset($system_fonts[$lowercase_string])) { + return $lowercase_string; + } + + $bits = explode(' ', $string); // bits to process + $stage = 0; // this indicates what we're looking for + $caught = array(); // which stage 0 properties have we caught? + $stage_1 = array('font-style', 'font-variant', 'font-weight'); + $final = ''; // output + + for ($i = 0, $size = count($bits); $i < $size; $i++) { + if ($bits[$i] === '') { + continue; + } + switch ($stage) { + case 0: // attempting to catch font-style, font-variant or font-weight + foreach ($stage_1 as $validator_name) { + if (isset($caught[$validator_name])) { + continue; + } + $r = $this->info[$validator_name]->validate( + $bits[$i], + $config, + $context + ); + if ($r !== false) { + $final .= $r . ' '; + $caught[$validator_name] = true; + break; + } + } + // all three caught, continue on + if (count($caught) >= 3) { + $stage = 1; + } + if ($r !== false) { + break; + } + case 1: // attempting to catch font-size and perhaps line-height + $found_slash = false; + if (strpos($bits[$i], '/') !== false) { + list($font_size, $line_height) = + explode('/', $bits[$i]); + if ($line_height === '') { + // ooh, there's a space after the slash! + $line_height = false; + $found_slash = true; + } + } else { + $font_size = $bits[$i]; + $line_height = false; + } + $r = $this->info['font-size']->validate( + $font_size, + $config, + $context + ); + if ($r !== false) { + $final .= $r; + // attempt to catch line-height + if ($line_height === false) { + // we need to scroll forward + for ($j = $i + 1; $j < $size; $j++) { + if ($bits[$j] === '') { + continue; + } + if ($bits[$j] === '/') { + if ($found_slash) { + return false; + } else { + $found_slash = true; + continue; + } + } + $line_height = $bits[$j]; + break; + } + } else { + // slash already found + $found_slash = true; + $j = $i; + } + if ($found_slash) { + $i = $j; + $r = $this->info['line-height']->validate( + $line_height, + $config, + $context + ); + if ($r !== false) { + $final .= '/' . $r; + } + } + $final .= ' '; + $stage = 2; + break; + } + return false; + case 2: // attempting to catch font-family + $font_family = + implode(' ', array_slice($bits, $i, $size - $i)); + $r = $this->info['font-family']->validate( + $font_family, + $config, + $context + ); + if ($r !== false) { + $final .= $r . ' '; + // processing completed successfully + return rtrim($final); + } + return false; + } + } + return false; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/FontFamily.php b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/FontFamily.php similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/FontFamily.php rename to thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/FontFamily.php index f9af36d79..74e24c881 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/FontFamily.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/FontFamily.php @@ -1,219 +1,219 @@ -mask = '_- '; - for ($c = 'a'; $c <= 'z'; $c++) { - $this->mask .= $c; - } - for ($c = 'A'; $c <= 'Z'; $c++) { - $this->mask .= $c; - } - for ($c = '0'; $c <= '9'; $c++) { - $this->mask .= $c; - } // cast-y, but should be fine - // special bytes used by UTF-8 - for ($i = 0x80; $i <= 0xFF; $i++) { - // We don't bother excluding invalid bytes in this range, - // because the our restriction of well-formed UTF-8 will - // prevent these from ever occurring. - $this->mask .= chr($i); - } - - /* - PHP's internal strcspn implementation is - O(length of string * length of mask), making it inefficient - for large masks. However, it's still faster than - preg_match 8) - for (p = s1;;) { - spanp = s2; - do { - if (*spanp == c || p == s1_end) { - return p - s1; - } - } while (spanp++ < (s2_end - 1)); - c = *++p; - } - */ - // possible optimization: invert the mask. - } - - /** - * @param string $string - * @param HTMLPurifier_Config $config - * @param HTMLPurifier_Context $context - * @return bool|string - */ - public function validate($string, $config, $context) - { - static $generic_names = array( - 'serif' => true, - 'sans-serif' => true, - 'monospace' => true, - 'fantasy' => true, - 'cursive' => true - ); - $allowed_fonts = $config->get('CSS.AllowedFonts'); - - // assume that no font names contain commas in them - $fonts = explode(',', $string); - $final = ''; - foreach ($fonts as $font) { - $font = trim($font); - if ($font === '') { - continue; - } - // match a generic name - if (isset($generic_names[$font])) { - if ($allowed_fonts === null || isset($allowed_fonts[$font])) { - $final .= $font . ', '; - } - continue; - } - // match a quoted name - if ($font[0] === '"' || $font[0] === "'") { - $length = strlen($font); - if ($length <= 2) { - continue; - } - $quote = $font[0]; - if ($font[$length - 1] !== $quote) { - continue; - } - $font = substr($font, 1, $length - 2); - } - - $font = $this->expandCSSEscape($font); - - // $font is a pure representation of the font name - - if ($allowed_fonts !== null && !isset($allowed_fonts[$font])) { - continue; - } - - if (ctype_alnum($font) && $font !== '') { - // very simple font, allow it in unharmed - $final .= $font . ', '; - continue; - } - - // bugger out on whitespace. form feed (0C) really - // shouldn't show up regardless - $font = str_replace(array("\n", "\t", "\r", "\x0C"), ' ', $font); - - // Here, there are various classes of characters which need - // to be treated differently: - // - Alphanumeric characters are essentially safe. We - // handled these above. - // - Spaces require quoting, though most parsers will do - // the right thing if there aren't any characters that - // can be misinterpreted - // - Dashes rarely occur, but they fairly unproblematic - // for parsing/rendering purposes. - // The above characters cover the majority of Western font - // names. - // - Arbitrary Unicode characters not in ASCII. Because - // most parsers give little thought to Unicode, treatment - // of these codepoints is basically uniform, even for - // punctuation-like codepoints. These characters can - // show up in non-Western pages and are supported by most - // major browsers, for example: "MS 明朝" is a - // legitimate font-name - // . See - // the CSS3 spec for more examples: - // - // You can see live samples of these on the Internet: - // - // However, most of these fonts have ASCII equivalents: - // for example, 'MS Mincho', and it's considered - // professional to use ASCII font names instead of - // Unicode font names. Thanks Takeshi Terada for - // providing this information. - // The following characters, to my knowledge, have not been - // used to name font names. - // - Single quote. While theoretically you might find a - // font name that has a single quote in its name (serving - // as an apostrophe, e.g. Dave's Scribble), I haven't - // been able to find any actual examples of this. - // Internet Explorer's cssText translation (which I - // believe is invoked by innerHTML) normalizes any - // quoting to single quotes, and fails to escape single - // quotes. (Note that this is not IE's behavior for all - // CSS properties, just some sort of special casing for - // font-family). So a single quote *cannot* be used - // safely in the font-family context if there will be an - // innerHTML/cssText translation. Note that Firefox 3.x - // does this too. - // - Double quote. In IE, these get normalized to - // single-quotes, no matter what the encoding. (Fun - // fact, in IE8, the 'content' CSS property gained - // support, where they special cased to preserve encoded - // double quotes, but still translate unadorned double - // quotes into single quotes.) So, because their - // fixpoint behavior is identical to single quotes, they - // cannot be allowed either. Firefox 3.x displays - // single-quote style behavior. - // - Backslashes are reduced by one (so \\ -> \) every - // iteration, so they cannot be used safely. This shows - // up in IE7, IE8 and FF3 - // - Semicolons, commas and backticks are handled properly. - // - The rest of the ASCII punctuation is handled properly. - // We haven't checked what browsers do to unadorned - // versions, but this is not important as long as the - // browser doesn't /remove/ surrounding quotes (as IE does - // for HTML). - // - // With these results in hand, we conclude that there are - // various levels of safety: - // - Paranoid: alphanumeric, spaces and dashes(?) - // - International: Paranoid + non-ASCII Unicode - // - Edgy: Everything except quotes, backslashes - // - NoJS: Standards compliance, e.g. sod IE. Note that - // with some judicious character escaping (since certain - // types of escaping doesn't work) this is theoretically - // OK as long as innerHTML/cssText is not called. - // We believe that international is a reasonable default - // (that we will implement now), and once we do more - // extensive research, we may feel comfortable with dropping - // it down to edgy. - - // Edgy: alphanumeric, spaces, dashes, underscores and Unicode. Use of - // str(c)spn assumes that the string was already well formed - // Unicode (which of course it is). - if (strspn($font, $this->mask) !== strlen($font)) { - continue; - } - - // Historical: - // In the absence of innerHTML/cssText, these ugly - // transforms don't pose a security risk (as \\ and \" - // might--these escapes are not supported by most browsers). - // We could try to be clever and use single-quote wrapping - // when there is a double quote present, but I have choosen - // not to implement that. (NOTE: you can reduce the amount - // of escapes by one depending on what quoting style you use) - // $font = str_replace('\\', '\\5C ', $font); - // $font = str_replace('"', '\\22 ', $font); - // $font = str_replace("'", '\\27 ', $font); - - // font possibly with spaces, requires quoting - $final .= "'$font', "; - } - $final = rtrim($final, ', '); - if ($final === '') { - return false; - } - return $final; - } - -} - -// vim: et sw=4 sts=4 +mask = '_- '; + for ($c = 'a'; $c <= 'z'; $c++) { + $this->mask .= $c; + } + for ($c = 'A'; $c <= 'Z'; $c++) { + $this->mask .= $c; + } + for ($c = '0'; $c <= '9'; $c++) { + $this->mask .= $c; + } // cast-y, but should be fine + // special bytes used by UTF-8 + for ($i = 0x80; $i <= 0xFF; $i++) { + // We don't bother excluding invalid bytes in this range, + // because the our restriction of well-formed UTF-8 will + // prevent these from ever occurring. + $this->mask .= chr($i); + } + + /* + PHP's internal strcspn implementation is + O(length of string * length of mask), making it inefficient + for large masks. However, it's still faster than + preg_match 8) + for (p = s1;;) { + spanp = s2; + do { + if (*spanp == c || p == s1_end) { + return p - s1; + } + } while (spanp++ < (s2_end - 1)); + c = *++p; + } + */ + // possible optimization: invert the mask. + } + + /** + * @param string $string + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($string, $config, $context) + { + static $generic_names = array( + 'serif' => true, + 'sans-serif' => true, + 'monospace' => true, + 'fantasy' => true, + 'cursive' => true + ); + $allowed_fonts = $config->get('CSS.AllowedFonts'); + + // assume that no font names contain commas in them + $fonts = explode(',', $string); + $final = ''; + foreach ($fonts as $font) { + $font = trim($font); + if ($font === '') { + continue; + } + // match a generic name + if (isset($generic_names[$font])) { + if ($allowed_fonts === null || isset($allowed_fonts[$font])) { + $final .= $font . ', '; + } + continue; + } + // match a quoted name + if ($font[0] === '"' || $font[0] === "'") { + $length = strlen($font); + if ($length <= 2) { + continue; + } + $quote = $font[0]; + if ($font[$length - 1] !== $quote) { + continue; + } + $font = substr($font, 1, $length - 2); + } + + $font = $this->expandCSSEscape($font); + + // $font is a pure representation of the font name + + if ($allowed_fonts !== null && !isset($allowed_fonts[$font])) { + continue; + } + + if (ctype_alnum($font) && $font !== '') { + // very simple font, allow it in unharmed + $final .= $font . ', '; + continue; + } + + // bugger out on whitespace. form feed (0C) really + // shouldn't show up regardless + $font = str_replace(array("\n", "\t", "\r", "\x0C"), ' ', $font); + + // Here, there are various classes of characters which need + // to be treated differently: + // - Alphanumeric characters are essentially safe. We + // handled these above. + // - Spaces require quoting, though most parsers will do + // the right thing if there aren't any characters that + // can be misinterpreted + // - Dashes rarely occur, but they fairly unproblematic + // for parsing/rendering purposes. + // The above characters cover the majority of Western font + // names. + // - Arbitrary Unicode characters not in ASCII. Because + // most parsers give little thought to Unicode, treatment + // of these codepoints is basically uniform, even for + // punctuation-like codepoints. These characters can + // show up in non-Western pages and are supported by most + // major browsers, for example: "MS 明朝" is a + // legitimate font-name + // . See + // the CSS3 spec for more examples: + // + // You can see live samples of these on the Internet: + // + // However, most of these fonts have ASCII equivalents: + // for example, 'MS Mincho', and it's considered + // professional to use ASCII font names instead of + // Unicode font names. Thanks Takeshi Terada for + // providing this information. + // The following characters, to my knowledge, have not been + // used to name font names. + // - Single quote. While theoretically you might find a + // font name that has a single quote in its name (serving + // as an apostrophe, e.g. Dave's Scribble), I haven't + // been able to find any actual examples of this. + // Internet Explorer's cssText translation (which I + // believe is invoked by innerHTML) normalizes any + // quoting to single quotes, and fails to escape single + // quotes. (Note that this is not IE's behavior for all + // CSS properties, just some sort of special casing for + // font-family). So a single quote *cannot* be used + // safely in the font-family context if there will be an + // innerHTML/cssText translation. Note that Firefox 3.x + // does this too. + // - Double quote. In IE, these get normalized to + // single-quotes, no matter what the encoding. (Fun + // fact, in IE8, the 'content' CSS property gained + // support, where they special cased to preserve encoded + // double quotes, but still translate unadorned double + // quotes into single quotes.) So, because their + // fixpoint behavior is identical to single quotes, they + // cannot be allowed either. Firefox 3.x displays + // single-quote style behavior. + // - Backslashes are reduced by one (so \\ -> \) every + // iteration, so they cannot be used safely. This shows + // up in IE7, IE8 and FF3 + // - Semicolons, commas and backticks are handled properly. + // - The rest of the ASCII punctuation is handled properly. + // We haven't checked what browsers do to unadorned + // versions, but this is not important as long as the + // browser doesn't /remove/ surrounding quotes (as IE does + // for HTML). + // + // With these results in hand, we conclude that there are + // various levels of safety: + // - Paranoid: alphanumeric, spaces and dashes(?) + // - International: Paranoid + non-ASCII Unicode + // - Edgy: Everything except quotes, backslashes + // - NoJS: Standards compliance, e.g. sod IE. Note that + // with some judicious character escaping (since certain + // types of escaping doesn't work) this is theoretically + // OK as long as innerHTML/cssText is not called. + // We believe that international is a reasonable default + // (that we will implement now), and once we do more + // extensive research, we may feel comfortable with dropping + // it down to edgy. + + // Edgy: alphanumeric, spaces, dashes, underscores and Unicode. Use of + // str(c)spn assumes that the string was already well formed + // Unicode (which of course it is). + if (strspn($font, $this->mask) !== strlen($font)) { + continue; + } + + // Historical: + // In the absence of innerHTML/cssText, these ugly + // transforms don't pose a security risk (as \\ and \" + // might--these escapes are not supported by most browsers). + // We could try to be clever and use single-quote wrapping + // when there is a double quote present, but I have choosen + // not to implement that. (NOTE: you can reduce the amount + // of escapes by one depending on what quoting style you use) + // $font = str_replace('\\', '\\5C ', $font); + // $font = str_replace('"', '\\22 ', $font); + // $font = str_replace("'", '\\27 ', $font); + + // font possibly with spaces, requires quoting + $final .= "'$font', "; + } + $final = rtrim($final, ', '); + if ($final === '') { + return false; + } + return $final; + } + +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Ident.php b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Ident.php similarity index 95% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Ident.php rename to thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Ident.php index 5f13edfd1..973002c17 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Ident.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Ident.php @@ -1,32 +1,32 @@ -def = $def; - $this->allow = $allow; - } - - /** - * Intercepts and removes !important if necessary - * @param string $string - * @param HTMLPurifier_Config $config - * @param HTMLPurifier_Context $context - * @return bool|string - */ - public function validate($string, $config, $context) - { - // test for ! and important tokens - $string = trim($string); - $is_important = false; - // :TODO: optimization: test directly for !important and ! important - if (strlen($string) >= 9 && substr($string, -9) === 'important') { - $temp = rtrim(substr($string, 0, -9)); - // use a temp, because we might want to restore important - if (strlen($temp) >= 1 && substr($temp, -1) === '!') { - $string = rtrim(substr($temp, 0, -1)); - $is_important = true; - } - } - $string = $this->def->validate($string, $config, $context); - if ($this->allow && $is_important) { - $string .= ' !important'; - } - return $string; - } -} - -// vim: et sw=4 sts=4 +def = $def; + $this->allow = $allow; + } + + /** + * Intercepts and removes !important if necessary + * @param string $string + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($string, $config, $context) + { + // test for ! and important tokens + $string = trim($string); + $is_important = false; + // :TODO: optimization: test directly for !important and ! important + if (strlen($string) >= 9 && substr($string, -9) === 'important') { + $temp = rtrim(substr($string, 0, -9)); + // use a temp, because we might want to restore important + if (strlen($temp) >= 1 && substr($temp, -1) === '!') { + $string = rtrim(substr($temp, 0, -1)); + $is_important = true; + } + } + $string = $this->def->validate($string, $config, $context); + if ($this->allow && $is_important) { + $string .= ' !important'; + } + return $string; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Length.php b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Length.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Length.php rename to thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Length.php index 88da41d93..f12453a04 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Length.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Length.php @@ -1,77 +1,77 @@ -min = $min !== null ? HTMLPurifier_Length::make($min) : null; - $this->max = $max !== null ? HTMLPurifier_Length::make($max) : null; - } - - /** - * @param string $string - * @param HTMLPurifier_Config $config - * @param HTMLPurifier_Context $context - * @return bool|string - */ - public function validate($string, $config, $context) - { - $string = $this->parseCDATA($string); - - // Optimizations - if ($string === '') { - return false; - } - if ($string === '0') { - return '0'; - } - if (strlen($string) === 1) { - return false; - } - - $length = HTMLPurifier_Length::make($string); - if (!$length->isValid()) { - return false; - } - - if ($this->min) { - $c = $length->compareTo($this->min); - if ($c === false) { - return false; - } - if ($c < 0) { - return false; - } - } - if ($this->max) { - $c = $length->compareTo($this->max); - if ($c === false) { - return false; - } - if ($c > 0) { - return false; - } - } - return $length->toString(); - } -} - -// vim: et sw=4 sts=4 +min = $min !== null ? HTMLPurifier_Length::make($min) : null; + $this->max = $max !== null ? HTMLPurifier_Length::make($max) : null; + } + + /** + * @param string $string + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($string, $config, $context) + { + $string = $this->parseCDATA($string); + + // Optimizations + if ($string === '') { + return false; + } + if ($string === '0') { + return '0'; + } + if (strlen($string) === 1) { + return false; + } + + $length = HTMLPurifier_Length::make($string); + if (!$length->isValid()) { + return false; + } + + if ($this->min) { + $c = $length->compareTo($this->min); + if ($c === false) { + return false; + } + if ($c < 0) { + return false; + } + } + if ($this->max) { + $c = $length->compareTo($this->max); + if ($c === false) { + return false; + } + if ($c > 0) { + return false; + } + } + return $length->toString(); + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/ListStyle.php b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/ListStyle.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/ListStyle.php rename to thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/ListStyle.php index b4cce9a9d..e74d42654 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/ListStyle.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/ListStyle.php @@ -1,112 +1,112 @@ -getCSSDefinition(); - $this->info['list-style-type'] = $def->info['list-style-type']; - $this->info['list-style-position'] = $def->info['list-style-position']; - $this->info['list-style-image'] = $def->info['list-style-image']; - } - - /** - * @param string $string - * @param HTMLPurifier_Config $config - * @param HTMLPurifier_Context $context - * @return bool|string - */ - public function validate($string, $config, $context) - { - // regular pre-processing - $string = $this->parseCDATA($string); - if ($string === '') { - return false; - } - - // assumes URI doesn't have spaces in it - $bits = explode(' ', strtolower($string)); // bits to process - - $caught = array(); - $caught['type'] = false; - $caught['position'] = false; - $caught['image'] = false; - - $i = 0; // number of catches - $none = false; - - foreach ($bits as $bit) { - if ($i >= 3) { - return; - } // optimization bit - if ($bit === '') { - continue; - } - foreach ($caught as $key => $status) { - if ($status !== false) { - continue; - } - $r = $this->info['list-style-' . $key]->validate($bit, $config, $context); - if ($r === false) { - continue; - } - if ($r === 'none') { - if ($none) { - continue; - } else { - $none = true; - } - if ($key == 'image') { - continue; - } - } - $caught[$key] = $r; - $i++; - break; - } - } - - if (!$i) { - return false; - } - - $ret = array(); - - // construct type - if ($caught['type']) { - $ret[] = $caught['type']; - } - - // construct image - if ($caught['image']) { - $ret[] = $caught['image']; - } - - // construct position - if ($caught['position']) { - $ret[] = $caught['position']; - } - - if (empty($ret)) { - return false; - } - return implode(' ', $ret); - } -} - -// vim: et sw=4 sts=4 +getCSSDefinition(); + $this->info['list-style-type'] = $def->info['list-style-type']; + $this->info['list-style-position'] = $def->info['list-style-position']; + $this->info['list-style-image'] = $def->info['list-style-image']; + } + + /** + * @param string $string + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($string, $config, $context) + { + // regular pre-processing + $string = $this->parseCDATA($string); + if ($string === '') { + return false; + } + + // assumes URI doesn't have spaces in it + $bits = explode(' ', strtolower($string)); // bits to process + + $caught = array(); + $caught['type'] = false; + $caught['position'] = false; + $caught['image'] = false; + + $i = 0; // number of catches + $none = false; + + foreach ($bits as $bit) { + if ($i >= 3) { + return; + } // optimization bit + if ($bit === '') { + continue; + } + foreach ($caught as $key => $status) { + if ($status !== false) { + continue; + } + $r = $this->info['list-style-' . $key]->validate($bit, $config, $context); + if ($r === false) { + continue; + } + if ($r === 'none') { + if ($none) { + continue; + } else { + $none = true; + } + if ($key == 'image') { + continue; + } + } + $caught[$key] = $r; + $i++; + break; + } + } + + if (!$i) { + return false; + } + + $ret = array(); + + // construct type + if ($caught['type']) { + $ret[] = $caught['type']; + } + + // construct image + if ($caught['image']) { + $ret[] = $caught['image']; + } + + // construct position + if ($caught['position']) { + $ret[] = $caught['position']; + } + + if (empty($ret)) { + return false; + } + return implode(' ', $ret); + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Multiple.php b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Multiple.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Multiple.php rename to thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Multiple.php index 73d586f2c..9f266cdd1 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Multiple.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Multiple.php @@ -1,71 +1,71 @@ -single = $single; - $this->max = $max; - } - - /** - * @param string $string - * @param HTMLPurifier_Config $config - * @param HTMLPurifier_Context $context - * @return bool|string - */ - public function validate($string, $config, $context) - { - $string = $this->parseCDATA($string); - if ($string === '') { - return false; - } - $parts = explode(' ', $string); // parseCDATA replaced \r, \t and \n - $length = count($parts); - $final = ''; - for ($i = 0, $num = 0; $i < $length && $num < $this->max; $i++) { - if (ctype_space($parts[$i])) { - continue; - } - $result = $this->single->validate($parts[$i], $config, $context); - if ($result !== false) { - $final .= $result . ' '; - $num++; - } - } - if ($final === '') { - return false; - } - return rtrim($final); - } -} - -// vim: et sw=4 sts=4 +single = $single; + $this->max = $max; + } + + /** + * @param string $string + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($string, $config, $context) + { + $string = $this->parseCDATA($string); + if ($string === '') { + return false; + } + $parts = explode(' ', $string); // parseCDATA replaced \r, \t and \n + $length = count($parts); + $final = ''; + for ($i = 0, $num = 0; $i < $length && $num < $this->max; $i++) { + if (ctype_space($parts[$i])) { + continue; + } + $result = $this->single->validate($parts[$i], $config, $context); + if ($result !== false) { + $final .= $result . ' '; + $num++; + } + } + if ($final === '') { + return false; + } + return rtrim($final); + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Number.php b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Number.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Number.php rename to thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Number.php index c78f6c9df..8edc159e7 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Number.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Number.php @@ -1,84 +1,84 @@ -non_negative = $non_negative; - } - - /** - * @param string $number - * @param HTMLPurifier_Config $config - * @param HTMLPurifier_Context $context - * @return string|bool - * @warning Some contexts do not pass $config, $context. These - * variables should not be used without checking HTMLPurifier_Length - */ - public function validate($number, $config, $context) - { - $number = $this->parseCDATA($number); - - if ($number === '') { - return false; - } - if ($number === '0') { - return '0'; - } - - $sign = ''; - switch ($number[0]) { - case '-': - if ($this->non_negative) { - return false; - } - $sign = '-'; - case '+': - $number = substr($number, 1); - } - - if (ctype_digit($number)) { - $number = ltrim($number, '0'); - return $number ? $sign . $number : '0'; - } - - // Period is the only non-numeric character allowed - if (strpos($number, '.') === false) { - return false; - } - - list($left, $right) = explode('.', $number, 2); - - if ($left === '' && $right === '') { - return false; - } - if ($left !== '' && !ctype_digit($left)) { - return false; - } - - $left = ltrim($left, '0'); - $right = rtrim($right, '0'); - - if ($right === '') { - return $left ? $sign . $left : '0'; - } elseif (!ctype_digit($right)) { - return false; - } - return $sign . $left . '.' . $right; - } -} - -// vim: et sw=4 sts=4 +non_negative = $non_negative; + } + + /** + * @param string $number + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return string|bool + * @warning Some contexts do not pass $config, $context. These + * variables should not be used without checking HTMLPurifier_Length + */ + public function validate($number, $config, $context) + { + $number = $this->parseCDATA($number); + + if ($number === '') { + return false; + } + if ($number === '0') { + return '0'; + } + + $sign = ''; + switch ($number[0]) { + case '-': + if ($this->non_negative) { + return false; + } + $sign = '-'; + case '+': + $number = substr($number, 1); + } + + if (ctype_digit($number)) { + $number = ltrim($number, '0'); + return $number ? $sign . $number : '0'; + } + + // Period is the only non-numeric character allowed + if (strpos($number, '.') === false) { + return false; + } + + list($left, $right) = explode('.', $number, 2); + + if ($left === '' && $right === '') { + return false; + } + if ($left !== '' && !ctype_digit($left)) { + return false; + } + + $left = ltrim($left, '0'); + $right = rtrim($right, '0'); + + if ($right === '') { + return $left ? $sign . $left : '0'; + } elseif (!ctype_digit($right)) { + return false; + } + return $sign . $left . '.' . $right; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Percentage.php b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Percentage.php similarity index 95% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Percentage.php rename to thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Percentage.php index aac1a6f5f..f0f25c50a 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Percentage.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Percentage.php @@ -1,54 +1,54 @@ -number_def = new HTMLPurifier_AttrDef_CSS_Number($non_negative); - } - - /** - * @param string $string - * @param HTMLPurifier_Config $config - * @param HTMLPurifier_Context $context - * @return bool|string - */ - public function validate($string, $config, $context) - { - $string = $this->parseCDATA($string); - - if ($string === '') { - return false; - } - $length = strlen($string); - if ($length === 1) { - return false; - } - if ($string[$length - 1] !== '%') { - return false; - } - - $number = substr($string, 0, $length - 1); - $number = $this->number_def->validate($number, $config, $context); - - if ($number === false) { - return false; - } - return "$number%"; - } -} - -// vim: et sw=4 sts=4 +number_def = new HTMLPurifier_AttrDef_CSS_Number($non_negative); + } + + /** + * @param string $string + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($string, $config, $context) + { + $string = $this->parseCDATA($string); + + if ($string === '') { + return false; + } + $length = strlen($string); + if ($length === 1) { + return false; + } + if ($string[$length - 1] !== '%') { + return false; + } + + $number = substr($string, 0, $length - 1); + $number = $this->number_def->validate($number, $config, $context); + + if ($number === false) { + return false; + } + return "$number%"; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/TextDecoration.php b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/TextDecoration.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/TextDecoration.php rename to thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/TextDecoration.php index 3992de0e6..5fd4b7f7b 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/TextDecoration.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/TextDecoration.php @@ -1,46 +1,46 @@ - true, - 'overline' => true, - 'underline' => true, - ); - - $string = strtolower($this->parseCDATA($string)); - - if ($string === 'none') { - return $string; - } - - $parts = explode(' ', $string); - $final = ''; - foreach ($parts as $part) { - if (isset($allowed_values[$part])) { - $final .= $part . ' '; - } - } - $final = rtrim($final); - if ($final === '') { - return false; - } - return $final; - } -} - -// vim: et sw=4 sts=4 + true, + 'overline' => true, + 'underline' => true, + ); + + $string = strtolower($this->parseCDATA($string)); + + if ($string === 'none') { + return $string; + } + + $parts = explode(' ', $string); + $final = ''; + foreach ($parts as $part) { + if (isset($allowed_values[$part])) { + $final .= $part . ' '; + } + } + $final = rtrim($final); + if ($final === '') { + return false; + } + return $final; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/URI.php b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/URI.php similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/URI.php rename to thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/URI.php index 482b0997b..f9434230e 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/URI.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/CSS/URI.php @@ -1,74 +1,74 @@ -parseCDATA($uri_string); - if (strpos($uri_string, 'url(') !== 0) { - return false; - } - $uri_string = substr($uri_string, 4); - $new_length = strlen($uri_string) - 1; - if ($uri_string[$new_length] != ')') { - return false; - } - $uri = trim(substr($uri_string, 0, $new_length)); - - if (!empty($uri) && ($uri[0] == "'" || $uri[0] == '"')) { - $quote = $uri[0]; - $new_length = strlen($uri) - 1; - if ($uri[$new_length] !== $quote) { - return false; - } - $uri = substr($uri, 1, $new_length - 1); - } - - $uri = $this->expandCSSEscape($uri); - - $result = parent::validate($uri, $config, $context); - - if ($result === false) { - return false; - } - - // extra sanity check; should have been done by URI - $result = str_replace(array('"', "\\", "\n", "\x0c", "\r"), "", $result); - - // suspicious characters are ()'; we're going to percent encode - // them for safety. - $result = str_replace(array('(', ')', "'"), array('%28', '%29', '%27'), $result); - - // there's an extra bug where ampersands lose their escaping on - // an innerHTML cycle, so a very unlucky query parameter could - // then change the meaning of the URL. Unfortunately, there's - // not much we can do about that... - return "url(\"$result\")"; - } -} - -// vim: et sw=4 sts=4 +parseCDATA($uri_string); + if (strpos($uri_string, 'url(') !== 0) { + return false; + } + $uri_string = substr($uri_string, 4); + $new_length = strlen($uri_string) - 1; + if ($uri_string[$new_length] != ')') { + return false; + } + $uri = trim(substr($uri_string, 0, $new_length)); + + if (!empty($uri) && ($uri[0] == "'" || $uri[0] == '"')) { + $quote = $uri[0]; + $new_length = strlen($uri) - 1; + if ($uri[$new_length] !== $quote) { + return false; + } + $uri = substr($uri, 1, $new_length - 1); + } + + $uri = $this->expandCSSEscape($uri); + + $result = parent::validate($uri, $config, $context); + + if ($result === false) { + return false; + } + + // extra sanity check; should have been done by URI + $result = str_replace(array('"', "\\", "\n", "\x0c", "\r"), "", $result); + + // suspicious characters are ()'; we're going to percent encode + // them for safety. + $result = str_replace(array('(', ')', "'"), array('%28', '%29', '%27'), $result); + + // there's an extra bug where ampersands lose their escaping on + // an innerHTML cycle, so a very unlucky query parameter could + // then change the meaning of the URL. Unfortunately, there's + // not much we can do about that... + return "url(\"$result\")"; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/Clone.php b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/Clone.php similarity index 95% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/Clone.php rename to thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/Clone.php index b181d1bcd..6698a00c0 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/Clone.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/Clone.php @@ -1,44 +1,44 @@ -clone = $clone; - } - - /** - * @param string $v - * @param HTMLPurifier_Config $config - * @param HTMLPurifier_Context $context - * @return bool|string - */ - public function validate($v, $config, $context) - { - return $this->clone->validate($v, $config, $context); - } - - /** - * @param string $string - * @return HTMLPurifier_AttrDef - */ - public function make($string) - { - return clone $this->clone; - } -} - -// vim: et sw=4 sts=4 +clone = $clone; + } + + /** + * @param string $v + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($v, $config, $context) + { + return $this->clone->validate($v, $config, $context); + } + + /** + * @param string $string + * @return HTMLPurifier_AttrDef + */ + public function make($string) + { + return clone $this->clone; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/Enum.php b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/Enum.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/Enum.php rename to thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/Enum.php index b40122b6c..8abda7f6e 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/Enum.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/Enum.php @@ -1,73 +1,73 @@ -valid_values = array_flip($valid_values); - $this->case_sensitive = $case_sensitive; - } - - /** - * @param string $string - * @param HTMLPurifier_Config $config - * @param HTMLPurifier_Context $context - * @return bool|string - */ - public function validate($string, $config, $context) - { - $string = trim($string); - if (!$this->case_sensitive) { - // we may want to do full case-insensitive libraries - $string = ctype_lower($string) ? $string : strtolower($string); - } - $result = isset($this->valid_values[$string]); - - return $result ? $string : false; - } - - /** - * @param string $string In form of comma-delimited list of case-insensitive - * valid values. Example: "foo,bar,baz". Prepend "s:" to make - * case sensitive - * @return HTMLPurifier_AttrDef_Enum - */ - public function make($string) - { - if (strlen($string) > 2 && $string[0] == 's' && $string[1] == ':') { - $string = substr($string, 2); - $sensitive = true; - } else { - $sensitive = false; - } - $values = explode(',', $string); - return new HTMLPurifier_AttrDef_Enum($values, $sensitive); - } -} - -// vim: et sw=4 sts=4 +valid_values = array_flip($valid_values); + $this->case_sensitive = $case_sensitive; + } + + /** + * @param string $string + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($string, $config, $context) + { + $string = trim($string); + if (!$this->case_sensitive) { + // we may want to do full case-insensitive libraries + $string = ctype_lower($string) ? $string : strtolower($string); + } + $result = isset($this->valid_values[$string]); + + return $result ? $string : false; + } + + /** + * @param string $string In form of comma-delimited list of case-insensitive + * valid values. Example: "foo,bar,baz". Prepend "s:" to make + * case sensitive + * @return HTMLPurifier_AttrDef_Enum + */ + public function make($string) + { + if (strlen($string) > 2 && $string[0] == 's' && $string[1] == ':') { + $string = substr($string, 2); + $sensitive = true; + } else { + $sensitive = false; + } + $values = explode(',', $string); + return new HTMLPurifier_AttrDef_Enum($values, $sensitive); + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/HTML/Bool.php b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/HTML/Bool.php similarity index 94% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/HTML/Bool.php rename to thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/HTML/Bool.php index 1463c6471..036a240e1 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/HTML/Bool.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/HTML/Bool.php @@ -1,51 +1,51 @@ -name = $name; - } - - /** - * @param string $string - * @param HTMLPurifier_Config $config - * @param HTMLPurifier_Context $context - * @return bool|string - */ - public function validate($string, $config, $context) - { - if (empty($string)) { - return false; - } - return $this->name; - } - - /** - * @param string $string Name of attribute - * @return HTMLPurifier_AttrDef_HTML_Bool - */ - public function make($string) - { - return new HTMLPurifier_AttrDef_HTML_Bool($string); - } -} - -// vim: et sw=4 sts=4 +name = $name; + } + + /** + * @param string $string + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($string, $config, $context) + { + if (empty($string)) { + return false; + } + return $this->name; + } + + /** + * @param string $string Name of attribute + * @return HTMLPurifier_AttrDef_HTML_Bool + */ + public function make($string) + { + return new HTMLPurifier_AttrDef_HTML_Bool($string); + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/HTML/Class.php b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/HTML/Class.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/HTML/Class.php rename to thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/HTML/Class.php index b874c7e1a..d5013488f 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/HTML/Class.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/HTML/Class.php @@ -1,48 +1,48 @@ -getDefinition('HTML')->doctype->name; - if ($name == "XHTML 1.1" || $name == "XHTML 2.0") { - return parent::split($string, $config, $context); - } else { - return preg_split('/\s+/', $string); - } - } - - /** - * @param array $tokens - * @param HTMLPurifier_Config $config - * @param HTMLPurifier_Context $context - * @return array - */ - protected function filter($tokens, $config, $context) - { - $allowed = $config->get('Attr.AllowedClasses'); - $forbidden = $config->get('Attr.ForbiddenClasses'); - $ret = array(); - foreach ($tokens as $token) { - if (($allowed === null || isset($allowed[$token])) && - !isset($forbidden[$token]) && - // We need this O(n) check because of PHP's array - // implementation that casts -0 to 0. - !in_array($token, $ret, true) - ) { - $ret[] = $token; - } - } - return $ret; - } -} +getDefinition('HTML')->doctype->name; + if ($name == "XHTML 1.1" || $name == "XHTML 2.0") { + return parent::split($string, $config, $context); + } else { + return preg_split('/\s+/', $string); + } + } + + /** + * @param array $tokens + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return array + */ + protected function filter($tokens, $config, $context) + { + $allowed = $config->get('Attr.AllowedClasses'); + $forbidden = $config->get('Attr.ForbiddenClasses'); + $ret = array(); + foreach ($tokens as $token) { + if (($allowed === null || isset($allowed[$token])) && + !isset($forbidden[$token]) && + // We need this O(n) check because of PHP's array + // implementation that casts -0 to 0. + !in_array($token, $ret, true) + ) { + $ret[] = $token; + } + } + return $ret; + } +} diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/HTML/Color.php b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/HTML/Color.php similarity index 95% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/HTML/Color.php rename to thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/HTML/Color.php index 25c93fc6e..946ebb782 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/HTML/Color.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/HTML/Color.php @@ -1,51 +1,51 @@ -get('Core.ColorKeywords'); - } - - $string = trim($string); - - if (empty($string)) { - return false; - } - $lower = strtolower($string); - if (isset($colors[$lower])) { - return $colors[$lower]; - } - if ($string[0] === '#') { - $hex = substr($string, 1); - } else { - $hex = $string; - } - - $length = strlen($hex); - if ($length !== 3 && $length !== 6) { - return false; - } - if (!ctype_xdigit($hex)) { - return false; - } - if ($length === 3) { - $hex = $hex[0] . $hex[0] . $hex[1] . $hex[1] . $hex[2] . $hex[2]; - } - return "#$hex"; - } -} - -// vim: et sw=4 sts=4 +get('Core.ColorKeywords'); + } + + $string = trim($string); + + if (empty($string)) { + return false; + } + $lower = strtolower($string); + if (isset($colors[$lower])) { + return $colors[$lower]; + } + if ($string[0] === '#') { + $hex = substr($string, 1); + } else { + $hex = $string; + } + + $length = strlen($hex); + if ($length !== 3 && $length !== 6) { + return false; + } + if (!ctype_xdigit($hex)) { + return false; + } + if ($length === 3) { + $hex = $hex[0] . $hex[0] . $hex[1] . $hex[1] . $hex[2] . $hex[2]; + } + return "#$hex"; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/HTML/FrameTarget.php b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/HTML/FrameTarget.php similarity index 95% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/HTML/FrameTarget.php rename to thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/HTML/FrameTarget.php index 7446b6da9..d79ba12b3 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/HTML/FrameTarget.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/HTML/FrameTarget.php @@ -1,38 +1,38 @@ -valid_values === false) { - $this->valid_values = $config->get('Attr.AllowedFrameTargets'); - } - return parent::validate($string, $config, $context); - } -} - -// vim: et sw=4 sts=4 +valid_values === false) { + $this->valid_values = $config->get('Attr.AllowedFrameTargets'); + } + return parent::validate($string, $config, $context); + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/HTML/ID.php b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/HTML/ID.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/HTML/ID.php rename to thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/HTML/ID.php index ccd4a24a8..3d86efb44 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/HTML/ID.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/HTML/ID.php @@ -1,105 +1,105 @@ -selector = $selector; - } - - /** - * @param string $id - * @param HTMLPurifier_Config $config - * @param HTMLPurifier_Context $context - * @return bool|string - */ - public function validate($id, $config, $context) - { - if (!$this->selector && !$config->get('Attr.EnableID')) { - return false; - } - - $id = trim($id); // trim it first - - if ($id === '') { - return false; - } - - $prefix = $config->get('Attr.IDPrefix'); - if ($prefix !== '') { - $prefix .= $config->get('Attr.IDPrefixLocal'); - // prevent re-appending the prefix - if (strpos($id, $prefix) !== 0) { - $id = $prefix . $id; - } - } elseif ($config->get('Attr.IDPrefixLocal') !== '') { - trigger_error( - '%Attr.IDPrefixLocal cannot be used unless ' . - '%Attr.IDPrefix is set', - E_USER_WARNING - ); - } - - if (!$this->selector) { - $id_accumulator =& $context->get('IDAccumulator'); - if (isset($id_accumulator->ids[$id])) { - return false; - } - } - - // we purposely avoid using regex, hopefully this is faster - - if (ctype_alpha($id)) { - $result = true; - } else { - if (!ctype_alpha(@$id[0])) { - return false; - } - // primitive style of regexps, I suppose - $trim = trim( - $id, - 'A..Za..z0..9:-._' - ); - $result = ($trim === ''); - } - - $regexp = $config->get('Attr.IDBlacklistRegexp'); - if ($regexp && preg_match($regexp, $id)) { - return false; - } - - if (!$this->selector && $result) { - $id_accumulator->add($id); - } - - // if no change was made to the ID, return the result - // else, return the new id if stripping whitespace made it - // valid, or return false. - return $result ? $id : false; - } -} - -// vim: et sw=4 sts=4 +selector = $selector; + } + + /** + * @param string $id + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($id, $config, $context) + { + if (!$this->selector && !$config->get('Attr.EnableID')) { + return false; + } + + $id = trim($id); // trim it first + + if ($id === '') { + return false; + } + + $prefix = $config->get('Attr.IDPrefix'); + if ($prefix !== '') { + $prefix .= $config->get('Attr.IDPrefixLocal'); + // prevent re-appending the prefix + if (strpos($id, $prefix) !== 0) { + $id = $prefix . $id; + } + } elseif ($config->get('Attr.IDPrefixLocal') !== '') { + trigger_error( + '%Attr.IDPrefixLocal cannot be used unless ' . + '%Attr.IDPrefix is set', + E_USER_WARNING + ); + } + + if (!$this->selector) { + $id_accumulator =& $context->get('IDAccumulator'); + if (isset($id_accumulator->ids[$id])) { + return false; + } + } + + // we purposely avoid using regex, hopefully this is faster + + if (ctype_alpha($id)) { + $result = true; + } else { + if (!ctype_alpha(@$id[0])) { + return false; + } + // primitive style of regexps, I suppose + $trim = trim( + $id, + 'A..Za..z0..9:-._' + ); + $result = ($trim === ''); + } + + $regexp = $config->get('Attr.IDBlacklistRegexp'); + if ($regexp && preg_match($regexp, $id)) { + return false; + } + + if (!$this->selector && $result) { + $id_accumulator->add($id); + } + + // if no change was made to the ID, return the result + // else, return the new id if stripping whitespace made it + // valid, or return false. + return $result ? $id : false; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/HTML/Length.php b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/HTML/Length.php similarity index 95% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/HTML/Length.php rename to thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/HTML/Length.php index c8f518865..1c4006fbb 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/HTML/Length.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/HTML/Length.php @@ -1,56 +1,56 @@ - 100) { - return '100%'; - } - return ((string)$points) . '%'; - } -} - -// vim: et sw=4 sts=4 + 100) { + return '100%'; + } + return ((string)$points) . '%'; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/HTML/LinkTypes.php b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/HTML/LinkTypes.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/HTML/LinkTypes.php rename to thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/HTML/LinkTypes.php index 3f56934ff..63fa04c15 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/HTML/LinkTypes.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/HTML/LinkTypes.php @@ -1,72 +1,72 @@ - 'AllowedRel', - 'rev' => 'AllowedRev' - ); - if (!isset($configLookup[$name])) { - trigger_error( - 'Unrecognized attribute name for link ' . - 'relationship.', - E_USER_ERROR - ); - return; - } - $this->name = $configLookup[$name]; - } - - /** - * @param string $string - * @param HTMLPurifier_Config $config - * @param HTMLPurifier_Context $context - * @return bool|string - */ - public function validate($string, $config, $context) - { - $allowed = $config->get('Attr.' . $this->name); - if (empty($allowed)) { - return false; - } - - $string = $this->parseCDATA($string); - $parts = explode(' ', $string); - - // lookup to prevent duplicates - $ret_lookup = array(); - foreach ($parts as $part) { - $part = strtolower(trim($part)); - if (!isset($allowed[$part])) { - continue; - } - $ret_lookup[$part] = true; - } - - if (empty($ret_lookup)) { - return false; - } - $string = implode(' ', array_keys($ret_lookup)); - return $string; - } -} - -// vim: et sw=4 sts=4 + 'AllowedRel', + 'rev' => 'AllowedRev' + ); + if (!isset($configLookup[$name])) { + trigger_error( + 'Unrecognized attribute name for link ' . + 'relationship.', + E_USER_ERROR + ); + return; + } + $this->name = $configLookup[$name]; + } + + /** + * @param string $string + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($string, $config, $context) + { + $allowed = $config->get('Attr.' . $this->name); + if (empty($allowed)) { + return false; + } + + $string = $this->parseCDATA($string); + $parts = explode(' ', $string); + + // lookup to prevent duplicates + $ret_lookup = array(); + foreach ($parts as $part) { + $part = strtolower(trim($part)); + if (!isset($allowed[$part])) { + continue; + } + $ret_lookup[$part] = true; + } + + if (empty($ret_lookup)) { + return false; + } + $string = implode(' ', array_keys($ret_lookup)); + return $string; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/HTML/MultiLength.php b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/HTML/MultiLength.php similarity index 95% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/HTML/MultiLength.php rename to thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/HTML/MultiLength.php index eb713e15b..bbb20f2f8 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/HTML/MultiLength.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/HTML/MultiLength.php @@ -1,60 +1,60 @@ -split($string, $config, $context); - $tokens = $this->filter($tokens, $config, $context); - if (empty($tokens)) { - return false; - } - return implode(' ', $tokens); - } - - /** - * Splits a space separated list of tokens into its constituent parts. - * @param string $string - * @param HTMLPurifier_Config $config - * @param HTMLPurifier_Context $context - * @return array - */ - protected function split($string, $config, $context) - { - // OPTIMIZABLE! - // do the preg_match, capture all subpatterns for reformulation - - // we don't support U+00A1 and up codepoints or - // escaping because I don't know how to do that with regexps - // and plus it would complicate optimization efforts (you never - // see that anyway). - $pattern = '/(?:(?<=\s)|\A)' . // look behind for space or string start - '((?:--|-?[A-Za-z_])[A-Za-z_\-0-9]*)' . - '(?:(?=\s)|\z)/'; // look ahead for space or string end - preg_match_all($pattern, $string, $matches); - return $matches[1]; - } - - /** - * Template method for removing certain tokens based on arbitrary criteria. - * @note If we wanted to be really functional, we'd do an array_filter - * with a callback. But... we're not. - * @param array $tokens - * @param HTMLPurifier_Config $config - * @param HTMLPurifier_Context $context - * @return array - */ - protected function filter($tokens, $config, $context) - { - return $tokens; - } -} - -// vim: et sw=4 sts=4 +split($string, $config, $context); + $tokens = $this->filter($tokens, $config, $context); + if (empty($tokens)) { + return false; + } + return implode(' ', $tokens); + } + + /** + * Splits a space separated list of tokens into its constituent parts. + * @param string $string + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return array + */ + protected function split($string, $config, $context) + { + // OPTIMIZABLE! + // do the preg_match, capture all subpatterns for reformulation + + // we don't support U+00A1 and up codepoints or + // escaping because I don't know how to do that with regexps + // and plus it would complicate optimization efforts (you never + // see that anyway). + $pattern = '/(?:(?<=\s)|\A)' . // look behind for space or string start + '((?:--|-?[A-Za-z_])[A-Za-z_\-0-9]*)' . + '(?:(?=\s)|\z)/'; // look ahead for space or string end + preg_match_all($pattern, $string, $matches); + return $matches[1]; + } + + /** + * Template method for removing certain tokens based on arbitrary criteria. + * @note If we wanted to be really functional, we'd do an array_filter + * with a callback. But... we're not. + * @param array $tokens + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return array + */ + protected function filter($tokens, $config, $context) + { + return $tokens; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/HTML/Pixels.php b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/HTML/Pixels.php similarity index 95% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/HTML/Pixels.php rename to thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/HTML/Pixels.php index 1a68f2385..a1d019e09 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/HTML/Pixels.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/HTML/Pixels.php @@ -1,76 +1,76 @@ -max = $max; - } - - /** - * @param string $string - * @param HTMLPurifier_Config $config - * @param HTMLPurifier_Context $context - * @return bool|string - */ - public function validate($string, $config, $context) - { - $string = trim($string); - if ($string === '0') { - return $string; - } - if ($string === '') { - return false; - } - $length = strlen($string); - if (substr($string, $length - 2) == 'px') { - $string = substr($string, 0, $length - 2); - } - if (!is_numeric($string)) { - return false; - } - $int = (int)$string; - - if ($int < 0) { - return '0'; - } - - // upper-bound value, extremely high values can - // crash operating systems, see - // WARNING, above link WILL crash you if you're using Windows - - if ($this->max !== null && $int > $this->max) { - return (string)$this->max; - } - return (string)$int; - } - - /** - * @param string $string - * @return HTMLPurifier_AttrDef - */ - public function make($string) - { - if ($string === '') { - $max = null; - } else { - $max = (int)$string; - } - $class = get_class($this); - return new $class($max); - } -} - -// vim: et sw=4 sts=4 +max = $max; + } + + /** + * @param string $string + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($string, $config, $context) + { + $string = trim($string); + if ($string === '0') { + return $string; + } + if ($string === '') { + return false; + } + $length = strlen($string); + if (substr($string, $length - 2) == 'px') { + $string = substr($string, 0, $length - 2); + } + if (!is_numeric($string)) { + return false; + } + $int = (int)$string; + + if ($int < 0) { + return '0'; + } + + // upper-bound value, extremely high values can + // crash operating systems, see + // WARNING, above link WILL crash you if you're using Windows + + if ($this->max !== null && $int > $this->max) { + return (string)$this->max; + } + return (string)$int; + } + + /** + * @param string $string + * @return HTMLPurifier_AttrDef + */ + public function make($string) + { + if ($string === '') { + $max = null; + } else { + $max = (int)$string; + } + $class = get_class($this); + return new $class($max); + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/Integer.php b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/Integer.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/Integer.php rename to thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/Integer.php index c98376d75..400e707d2 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/Integer.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/Integer.php @@ -1,91 +1,91 @@ -negative = $negative; - $this->zero = $zero; - $this->positive = $positive; - } - - /** - * @param string $integer - * @param HTMLPurifier_Config $config - * @param HTMLPurifier_Context $context - * @return bool|string - */ - public function validate($integer, $config, $context) - { - $integer = $this->parseCDATA($integer); - if ($integer === '') { - return false; - } - - // we could possibly simply typecast it to integer, but there are - // certain fringe cases that must not return an integer. - - // clip leading sign - if ($this->negative && $integer[0] === '-') { - $digits = substr($integer, 1); - if ($digits === '0') { - $integer = '0'; - } // rm minus sign for zero - } elseif ($this->positive && $integer[0] === '+') { - $digits = $integer = substr($integer, 1); // rm unnecessary plus - } else { - $digits = $integer; - } - - // test if it's numeric - if (!ctype_digit($digits)) { - return false; - } - - // perform scope tests - if (!$this->zero && $integer == 0) { - return false; - } - if (!$this->positive && $integer > 0) { - return false; - } - if (!$this->negative && $integer < 0) { - return false; - } - - return $integer; - } -} - -// vim: et sw=4 sts=4 +negative = $negative; + $this->zero = $zero; + $this->positive = $positive; + } + + /** + * @param string $integer + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($integer, $config, $context) + { + $integer = $this->parseCDATA($integer); + if ($integer === '') { + return false; + } + + // we could possibly simply typecast it to integer, but there are + // certain fringe cases that must not return an integer. + + // clip leading sign + if ($this->negative && $integer[0] === '-') { + $digits = substr($integer, 1); + if ($digits === '0') { + $integer = '0'; + } // rm minus sign for zero + } elseif ($this->positive && $integer[0] === '+') { + $digits = $integer = substr($integer, 1); // rm unnecessary plus + } else { + $digits = $integer; + } + + // test if it's numeric + if (!ctype_digit($digits)) { + return false; + } + + // perform scope tests + if (!$this->zero && $integer == 0) { + return false; + } + if (!$this->positive && $integer > 0) { + return false; + } + if (!$this->negative && $integer < 0) { + return false; + } + + return $integer; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/Lang.php b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/Lang.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/Lang.php rename to thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/Lang.php index 6ad0f799d..2a55cea64 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/Lang.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/Lang.php @@ -1,86 +1,86 @@ - 8 || !ctype_alnum($subtags[1])) { - return $new_string; - } - if (!ctype_lower($subtags[1])) { - $subtags[1] = strtolower($subtags[1]); - } - - $new_string .= '-' . $subtags[1]; - if ($num_subtags == 2) { - return $new_string; - } - - // process all other subtags, index 2 and up - for ($i = 2; $i < $num_subtags; $i++) { - $length = strlen($subtags[$i]); - if ($length == 0 || $length > 8 || !ctype_alnum($subtags[$i])) { - return $new_string; - } - if (!ctype_lower($subtags[$i])) { - $subtags[$i] = strtolower($subtags[$i]); - } - $new_string .= '-' . $subtags[$i]; - } - return $new_string; - } -} - -// vim: et sw=4 sts=4 + 8 || !ctype_alnum($subtags[1])) { + return $new_string; + } + if (!ctype_lower($subtags[1])) { + $subtags[1] = strtolower($subtags[1]); + } + + $new_string .= '-' . $subtags[1]; + if ($num_subtags == 2) { + return $new_string; + } + + // process all other subtags, index 2 and up + for ($i = 2; $i < $num_subtags; $i++) { + $length = strlen($subtags[$i]); + if ($length == 0 || $length > 8 || !ctype_alnum($subtags[$i])) { + return $new_string; + } + if (!ctype_lower($subtags[$i])) { + $subtags[$i] = strtolower($subtags[$i]); + } + $new_string .= '-' . $subtags[$i]; + } + return $new_string; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/Switch.php b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/Switch.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/Switch.php rename to thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/Switch.php index 078291f58..c7eb3199a 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/Switch.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/Switch.php @@ -1,53 +1,53 @@ -tag = $tag; - $this->withTag = $with_tag; - $this->withoutTag = $without_tag; - } - - /** - * @param string $string - * @param HTMLPurifier_Config $config - * @param HTMLPurifier_Context $context - * @return bool|string - */ - public function validate($string, $config, $context) - { - $token = $context->get('CurrentToken', true); - if (!$token || $token->name !== $this->tag) { - return $this->withoutTag->validate($string, $config, $context); - } else { - return $this->withTag->validate($string, $config, $context); - } - } -} - -// vim: et sw=4 sts=4 +tag = $tag; + $this->withTag = $with_tag; + $this->withoutTag = $without_tag; + } + + /** + * @param string $string + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($string, $config, $context) + { + $token = $context->get('CurrentToken', true); + if (!$token || $token->name !== $this->tag) { + return $this->withoutTag->validate($string, $config, $context); + } else { + return $this->withTag->validate($string, $config, $context); + } + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/Text.php b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/Text.php similarity index 95% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/Text.php rename to thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/Text.php index 9f23bac4a..4553a4ea9 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/Text.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/Text.php @@ -1,21 +1,21 @@ -parseCDATA($string); - } -} - -// vim: et sw=4 sts=4 +parseCDATA($string); + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/URI.php b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/URI.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/URI.php rename to thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/URI.php index a1097cd91..c1cd89772 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/URI.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/URI.php @@ -1,111 +1,111 @@ -parser = new HTMLPurifier_URIParser(); - $this->embedsResource = (bool)$embeds_resource; - } - - /** - * @param string $string - * @return HTMLPurifier_AttrDef_URI - */ - public function make($string) - { - $embeds = ($string === 'embedded'); - return new HTMLPurifier_AttrDef_URI($embeds); - } - - /** - * @param string $uri - * @param HTMLPurifier_Config $config - * @param HTMLPurifier_Context $context - * @return bool|string - */ - public function validate($uri, $config, $context) - { - if ($config->get('URI.Disable')) { - return false; - } - - $uri = $this->parseCDATA($uri); - - // parse the URI - $uri = $this->parser->parse($uri); - if ($uri === false) { - return false; - } - - // add embedded flag to context for validators - $context->register('EmbeddedURI', $this->embedsResource); - - $ok = false; - do { - - // generic validation - $result = $uri->validate($config, $context); - if (!$result) { - break; - } - - // chained filtering - $uri_def = $config->getDefinition('URI'); - $result = $uri_def->filter($uri, $config, $context); - if (!$result) { - break; - } - - // scheme-specific validation - $scheme_obj = $uri->getSchemeObj($config, $context); - if (!$scheme_obj) { - break; - } - if ($this->embedsResource && !$scheme_obj->browsable) { - break; - } - $result = $scheme_obj->validate($uri, $config, $context); - if (!$result) { - break; - } - - // Post chained filtering - $result = $uri_def->postFilter($uri, $config, $context); - if (!$result) { - break; - } - - // survived gauntlet - $ok = true; - - } while (false); - - $context->destroy('EmbeddedURI'); - if (!$ok) { - return false; - } - // back to string - return $uri->toString(); - } -} - -// vim: et sw=4 sts=4 +parser = new HTMLPurifier_URIParser(); + $this->embedsResource = (bool)$embeds_resource; + } + + /** + * @param string $string + * @return HTMLPurifier_AttrDef_URI + */ + public function make($string) + { + $embeds = ($string === 'embedded'); + return new HTMLPurifier_AttrDef_URI($embeds); + } + + /** + * @param string $uri + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($uri, $config, $context) + { + if ($config->get('URI.Disable')) { + return false; + } + + $uri = $this->parseCDATA($uri); + + // parse the URI + $uri = $this->parser->parse($uri); + if ($uri === false) { + return false; + } + + // add embedded flag to context for validators + $context->register('EmbeddedURI', $this->embedsResource); + + $ok = false; + do { + + // generic validation + $result = $uri->validate($config, $context); + if (!$result) { + break; + } + + // chained filtering + $uri_def = $config->getDefinition('URI'); + $result = $uri_def->filter($uri, $config, $context); + if (!$result) { + break; + } + + // scheme-specific validation + $scheme_obj = $uri->getSchemeObj($config, $context); + if (!$scheme_obj) { + break; + } + if ($this->embedsResource && !$scheme_obj->browsable) { + break; + } + $result = $scheme_obj->validate($uri, $config, $context); + if (!$result) { + break; + } + + // Post chained filtering + $result = $uri_def->postFilter($uri, $config, $context); + if (!$result) { + break; + } + + // survived gauntlet + $ok = true; + + } while (false); + + $context->destroy('EmbeddedURI'); + if (!$ok) { + return false; + } + // back to string + return $uri->toString(); + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/URI/Email.php b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/URI/Email.php similarity index 94% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/URI/Email.php rename to thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/URI/Email.php index 846d38814..daf32b764 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/URI/Email.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/URI/Email.php @@ -1,20 +1,20 @@ -" - // that needs more percent encoding to be done - if ($string == '') { - return false; - } - $string = trim($string); - $result = preg_match('/^[A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i', $string); - return $result ? $string : false; - } -} - -// vim: et sw=4 sts=4 +" + // that needs more percent encoding to be done + if ($string == '') { + return false; + } + $string = trim($string); + $result = preg_match('/^[A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i', $string); + return $result ? $string : false; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/URI/Host.php b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/URI/Host.php similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/URI/Host.php rename to thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/URI/Host.php index 014577850..e7df800b1 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/URI/Host.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/URI/Host.php @@ -1,128 +1,128 @@ -ipv4 = new HTMLPurifier_AttrDef_URI_IPv4(); - $this->ipv6 = new HTMLPurifier_AttrDef_URI_IPv6(); - } - - /** - * @param string $string - * @param HTMLPurifier_Config $config - * @param HTMLPurifier_Context $context - * @return bool|string - */ - public function validate($string, $config, $context) - { - $length = strlen($string); - // empty hostname is OK; it's usually semantically equivalent: - // the default host as defined by a URI scheme is used: - // - // If the URI scheme defines a default for host, then that - // default applies when the host subcomponent is undefined - // or when the registered name is empty (zero length). - if ($string === '') { - return ''; - } - if ($length > 1 && $string[0] === '[' && $string[$length - 1] === ']') { - //IPv6 - $ip = substr($string, 1, $length - 2); - $valid = $this->ipv6->validate($ip, $config, $context); - if ($valid === false) { - return false; - } - return '[' . $valid . ']'; - } - - // need to do checks on unusual encodings too - $ipv4 = $this->ipv4->validate($string, $config, $context); - if ($ipv4 !== false) { - return $ipv4; - } - - // A regular domain name. - - // This doesn't match I18N domain names, but we don't have proper IRI support, - // so force users to insert Punycode. - - // There is not a good sense in which underscores should be - // allowed, since it's technically not! (And if you go as - // far to allow everything as specified by the DNS spec... - // well, that's literally everything, modulo some space limits - // for the components and the overall name (which, by the way, - // we are NOT checking!). So we (arbitrarily) decide this: - // let's allow underscores wherever we would have allowed - // hyphens, if they are enabled. This is a pretty good match - // for browser behavior, for example, a large number of browsers - // cannot handle foo_.example.com, but foo_bar.example.com is - // fairly well supported. - $underscore = $config->get('Core.AllowHostnameUnderscore') ? '_' : ''; - - // The productions describing this are: - $a = '[a-z]'; // alpha - $an = '[a-z0-9]'; // alphanum - $and = "[a-z0-9-$underscore]"; // alphanum | "-" - // domainlabel = alphanum | alphanum *( alphanum | "-" ) alphanum - $domainlabel = "$an($and*$an)?"; - // toplabel = alpha | alpha *( alphanum | "-" ) alphanum - $toplabel = "$a($and*$an)?"; - // hostname = *( domainlabel "." ) toplabel [ "." ] - if (preg_match("/^($domainlabel\.)*$toplabel\.?$/i", $string)) { - return $string; - } - - // If we have Net_IDNA2 support, we can support IRIs by - // punycoding them. (This is the most portable thing to do, - // since otherwise we have to assume browsers support - - if ($config->get('Core.EnableIDNA')) { - $idna = new Net_IDNA2(array('encoding' => 'utf8', 'overlong' => false, 'strict' => true)); - // we need to encode each period separately - $parts = explode('.', $string); - try { - $new_parts = array(); - foreach ($parts as $part) { - $encodable = false; - for ($i = 0, $c = strlen($part); $i < $c; $i++) { - if (ord($part[$i]) > 0x7a) { - $encodable = true; - break; - } - } - if (!$encodable) { - $new_parts[] = $part; - } else { - $new_parts[] = $idna->encode($part); - } - } - $string = implode('.', $new_parts); - if (preg_match("/^($domainlabel\.)*$toplabel\.?$/i", $string)) { - return $string; - } - } catch (Exception $e) { - // XXX error reporting - } - } - return false; - } -} - -// vim: et sw=4 sts=4 +ipv4 = new HTMLPurifier_AttrDef_URI_IPv4(); + $this->ipv6 = new HTMLPurifier_AttrDef_URI_IPv6(); + } + + /** + * @param string $string + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string + */ + public function validate($string, $config, $context) + { + $length = strlen($string); + // empty hostname is OK; it's usually semantically equivalent: + // the default host as defined by a URI scheme is used: + // + // If the URI scheme defines a default for host, then that + // default applies when the host subcomponent is undefined + // or when the registered name is empty (zero length). + if ($string === '') { + return ''; + } + if ($length > 1 && $string[0] === '[' && $string[$length - 1] === ']') { + //IPv6 + $ip = substr($string, 1, $length - 2); + $valid = $this->ipv6->validate($ip, $config, $context); + if ($valid === false) { + return false; + } + return '[' . $valid . ']'; + } + + // need to do checks on unusual encodings too + $ipv4 = $this->ipv4->validate($string, $config, $context); + if ($ipv4 !== false) { + return $ipv4; + } + + // A regular domain name. + + // This doesn't match I18N domain names, but we don't have proper IRI support, + // so force users to insert Punycode. + + // There is not a good sense in which underscores should be + // allowed, since it's technically not! (And if you go as + // far to allow everything as specified by the DNS spec... + // well, that's literally everything, modulo some space limits + // for the components and the overall name (which, by the way, + // we are NOT checking!). So we (arbitrarily) decide this: + // let's allow underscores wherever we would have allowed + // hyphens, if they are enabled. This is a pretty good match + // for browser behavior, for example, a large number of browsers + // cannot handle foo_.example.com, but foo_bar.example.com is + // fairly well supported. + $underscore = $config->get('Core.AllowHostnameUnderscore') ? '_' : ''; + + // The productions describing this are: + $a = '[a-z]'; // alpha + $an = '[a-z0-9]'; // alphanum + $and = "[a-z0-9-$underscore]"; // alphanum | "-" + // domainlabel = alphanum | alphanum *( alphanum | "-" ) alphanum + $domainlabel = "$an($and*$an)?"; + // toplabel = alpha | alpha *( alphanum | "-" ) alphanum + $toplabel = "$a($and*$an)?"; + // hostname = *( domainlabel "." ) toplabel [ "." ] + if (preg_match("/^($domainlabel\.)*$toplabel\.?$/i", $string)) { + return $string; + } + + // If we have Net_IDNA2 support, we can support IRIs by + // punycoding them. (This is the most portable thing to do, + // since otherwise we have to assume browsers support + + if ($config->get('Core.EnableIDNA')) { + $idna = new Net_IDNA2(array('encoding' => 'utf8', 'overlong' => false, 'strict' => true)); + // we need to encode each period separately + $parts = explode('.', $string); + try { + $new_parts = array(); + foreach ($parts as $part) { + $encodable = false; + for ($i = 0, $c = strlen($part); $i < $c; $i++) { + if (ord($part[$i]) > 0x7a) { + $encodable = true; + break; + } + } + if (!$encodable) { + $new_parts[] = $part; + } else { + $new_parts[] = $idna->encode($part); + } + } + $string = implode('.', $new_parts); + if (preg_match("/^($domainlabel\.)*$toplabel\.?$/i", $string)) { + return $string; + } + } catch (Exception $e) { + // XXX error reporting + } + } + return false; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/URI/IPv4.php b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/URI/IPv4.php similarity index 95% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/URI/IPv4.php rename to thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/URI/IPv4.php index bbc8a77e3..30ac16c9e 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/URI/IPv4.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/URI/IPv4.php @@ -1,45 +1,45 @@ -ip4) { - $this->_loadRegex(); - } - - if (preg_match('#^' . $this->ip4 . '$#s', $aIP)) { - return $aIP; - } - return false; - } - - /** - * Lazy load function to prevent regex from being stuffed in - * cache. - */ - protected function _loadRegex() - { - $oct = '(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])'; // 0-255 - $this->ip4 = "(?:{$oct}\\.{$oct}\\.{$oct}\\.{$oct})"; - } -} - -// vim: et sw=4 sts=4 +ip4) { + $this->_loadRegex(); + } + + if (preg_match('#^' . $this->ip4 . '$#s', $aIP)) { + return $aIP; + } + return false; + } + + /** + * Lazy load function to prevent regex from being stuffed in + * cache. + */ + protected function _loadRegex() + { + $oct = '(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])'; // 0-255 + $this->ip4 = "(?:{$oct}\\.{$oct}\\.{$oct}\\.{$oct})"; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/URI/IPv6.php b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/URI/IPv6.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/URI/IPv6.php rename to thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/URI/IPv6.php index 67f148bd8..f243793ee 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/URI/IPv6.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/AttrDef/URI/IPv6.php @@ -1,89 +1,89 @@ -ip4) { - $this->_loadRegex(); - } - - $original = $aIP; - - $hex = '[0-9a-fA-F]'; - $blk = '(?:' . $hex . '{1,4})'; - $pre = '(?:/(?:12[0-8]|1[0-1][0-9]|[1-9][0-9]|[0-9]))'; // /0 - /128 - - // prefix check - if (strpos($aIP, '/') !== false) { - if (preg_match('#' . $pre . '$#s', $aIP, $find)) { - $aIP = substr($aIP, 0, 0 - strlen($find[0])); - unset($find); - } else { - return false; - } - } - - // IPv4-compatiblity check - if (preg_match('#(?<=:' . ')' . $this->ip4 . '$#s', $aIP, $find)) { - $aIP = substr($aIP, 0, 0 - strlen($find[0])); - $ip = explode('.', $find[0]); - $ip = array_map('dechex', $ip); - $aIP .= $ip[0] . $ip[1] . ':' . $ip[2] . $ip[3]; - unset($find, $ip); - } - - // compression check - $aIP = explode('::', $aIP); - $c = count($aIP); - if ($c > 2) { - return false; - } elseif ($c == 2) { - list($first, $second) = $aIP; - $first = explode(':', $first); - $second = explode(':', $second); - - if (count($first) + count($second) > 8) { - return false; - } - - while (count($first) < 8) { - array_push($first, '0'); - } - - array_splice($first, 8 - count($second), 8, $second); - $aIP = $first; - unset($first, $second); - } else { - $aIP = explode(':', $aIP[0]); - } - $c = count($aIP); - - if ($c != 8) { - return false; - } - - // All the pieces should be 16-bit hex strings. Are they? - foreach ($aIP as $piece) { - if (!preg_match('#^[0-9a-fA-F]{4}$#s', sprintf('%04s', $piece))) { - return false; - } - } - return $original; - } -} - -// vim: et sw=4 sts=4 +ip4) { + $this->_loadRegex(); + } + + $original = $aIP; + + $hex = '[0-9a-fA-F]'; + $blk = '(?:' . $hex . '{1,4})'; + $pre = '(?:/(?:12[0-8]|1[0-1][0-9]|[1-9][0-9]|[0-9]))'; // /0 - /128 + + // prefix check + if (strpos($aIP, '/') !== false) { + if (preg_match('#' . $pre . '$#s', $aIP, $find)) { + $aIP = substr($aIP, 0, 0 - strlen($find[0])); + unset($find); + } else { + return false; + } + } + + // IPv4-compatiblity check + if (preg_match('#(?<=:' . ')' . $this->ip4 . '$#s', $aIP, $find)) { + $aIP = substr($aIP, 0, 0 - strlen($find[0])); + $ip = explode('.', $find[0]); + $ip = array_map('dechex', $ip); + $aIP .= $ip[0] . $ip[1] . ':' . $ip[2] . $ip[3]; + unset($find, $ip); + } + + // compression check + $aIP = explode('::', $aIP); + $c = count($aIP); + if ($c > 2) { + return false; + } elseif ($c == 2) { + list($first, $second) = $aIP; + $first = explode(':', $first); + $second = explode(':', $second); + + if (count($first) + count($second) > 8) { + return false; + } + + while (count($first) < 8) { + array_push($first, '0'); + } + + array_splice($first, 8 - count($second), 8, $second); + $aIP = $first; + unset($first, $second); + } else { + $aIP = explode(':', $aIP[0]); + } + $c = count($aIP); + + if ($c != 8) { + return false; + } + + // All the pieces should be 16-bit hex strings. Are they? + foreach ($aIP as $piece) { + if (!preg_match('#^[0-9a-fA-F]{4}$#s', sprintf('%04s', $piece))) { + return false; + } + } + return $original; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform.php b/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform.php similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform.php rename to thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform.php index d9baaf394..b428331f1 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform.php @@ -1,60 +1,60 @@ -confiscateAttr($attr, 'background'); - // some validation should happen here - - $this->prependCSS($attr, "background-image:url($background);"); - return $attr; - } -} - -// vim: et sw=4 sts=4 +confiscateAttr($attr, 'background'); + // some validation should happen here + + $this->prependCSS($attr, "background-image:url($background);"); + return $attr; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/BdoDir.php b/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/BdoDir.php similarity index 95% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/BdoDir.php rename to thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/BdoDir.php index 86dcb17e4..d66c04a5b 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/BdoDir.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/BdoDir.php @@ -1,27 +1,27 @@ -get('Attr.DefaultTextDir'); - return $attr; - } -} - -// vim: et sw=4 sts=4 +get('Attr.DefaultTextDir'); + return $attr; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/BgColor.php b/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/BgColor.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/BgColor.php rename to thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/BgColor.php index e45e9ba37..0f51fd2ce 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/BgColor.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/BgColor.php @@ -1,28 +1,28 @@ -confiscateAttr($attr, 'bgcolor'); - // some validation should happen here - - $this->prependCSS($attr, "background-color:$bgcolor;"); - return $attr; - } -} - -// vim: et sw=4 sts=4 +confiscateAttr($attr, 'bgcolor'); + // some validation should happen here + + $this->prependCSS($attr, "background-color:$bgcolor;"); + return $attr; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/BoolToCSS.php b/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/BoolToCSS.php similarity index 95% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/BoolToCSS.php rename to thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/BoolToCSS.php index 29d7ff269..f25cd0195 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/BoolToCSS.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/BoolToCSS.php @@ -1,47 +1,47 @@ -attr = $attr; - $this->css = $css; - } - - /** - * @param array $attr - * @param HTMLPurifier_Config $config - * @param HTMLPurifier_Context $context - * @return array - */ - public function transform($attr, $config, $context) - { - if (!isset($attr[$this->attr])) { - return $attr; - } - unset($attr[$this->attr]); - $this->prependCSS($attr, $this->css); - return $attr; - } -} - -// vim: et sw=4 sts=4 +attr = $attr; + $this->css = $css; + } + + /** + * @param array $attr + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return array + */ + public function transform($attr, $config, $context) + { + if (!isset($attr[$this->attr])) { + return $attr; + } + unset($attr[$this->attr]); + $this->prependCSS($attr, $this->css); + return $attr; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/Border.php b/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/Border.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/Border.php rename to thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/Border.php index 90a8dea87..057dc017f 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/Border.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/Border.php @@ -1,26 +1,26 @@ -confiscateAttr($attr, 'border'); - // some validation should happen here - $this->prependCSS($attr, "border:{$border_width}px solid;"); - return $attr; - } -} - -// vim: et sw=4 sts=4 +confiscateAttr($attr, 'border'); + // some validation should happen here + $this->prependCSS($attr, "border:{$border_width}px solid;"); + return $attr; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/EnumToCSS.php b/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/EnumToCSS.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/EnumToCSS.php rename to thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/EnumToCSS.php index e2bfbf007..7ccd0e3fb 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/EnumToCSS.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/EnumToCSS.php @@ -1,68 +1,68 @@ -attr = $attr; - $this->enumToCSS = $enum_to_css; - $this->caseSensitive = (bool)$case_sensitive; - } - - /** - * @param array $attr - * @param HTMLPurifier_Config $config - * @param HTMLPurifier_Context $context - * @return array - */ - public function transform($attr, $config, $context) - { - if (!isset($attr[$this->attr])) { - return $attr; - } - - $value = trim($attr[$this->attr]); - unset($attr[$this->attr]); - - if (!$this->caseSensitive) { - $value = strtolower($value); - } - - if (!isset($this->enumToCSS[$value])) { - return $attr; - } - $this->prependCSS($attr, $this->enumToCSS[$value]); - return $attr; - } -} - -// vim: et sw=4 sts=4 +attr = $attr; + $this->enumToCSS = $enum_to_css; + $this->caseSensitive = (bool)$case_sensitive; + } + + /** + * @param array $attr + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return array + */ + public function transform($attr, $config, $context) + { + if (!isset($attr[$this->attr])) { + return $attr; + } + + $value = trim($attr[$this->attr]); + unset($attr[$this->attr]); + + if (!$this->caseSensitive) { + $value = strtolower($value); + } + + if (!isset($this->enumToCSS[$value])) { + return $attr; + } + $this->prependCSS($attr, $this->enumToCSS[$value]); + return $attr; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/ImgRequired.php b/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/ImgRequired.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/ImgRequired.php rename to thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/ImgRequired.php index 561b4d9df..7df6cb3e1 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/ImgRequired.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/ImgRequired.php @@ -1,48 +1,48 @@ -get('Core.RemoveInvalidImg')) { - return $attr; - } - $attr['src'] = $config->get('Attr.DefaultInvalidImage'); - $src = false; - } - - if (!isset($attr['alt'])) { - if ($src) { - $alt = $config->get('Attr.DefaultImageAlt'); - if ($alt === null) { - // truncate if the alt is too long - $attr['alt'] = substr(basename($attr['src']), 0, 40); - } else { - $attr['alt'] = $alt; - } - } else { - $attr['alt'] = $config->get('Attr.DefaultInvalidImageAlt'); - } - } - return $attr; - } -} - -// vim: et sw=4 sts=4 +get('Core.RemoveInvalidImg')) { + return $attr; + } + $attr['src'] = $config->get('Attr.DefaultInvalidImage'); + $src = false; + } + + if (!isset($attr['alt'])) { + if ($src) { + $alt = $config->get('Attr.DefaultImageAlt'); + if ($alt === null) { + // truncate if the alt is too long + $attr['alt'] = substr(basename($attr['src']), 0, 40); + } else { + $attr['alt'] = $alt; + } + } else { + $attr['alt'] = $config->get('Attr.DefaultInvalidImageAlt'); + } + } + return $attr; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/ImgSpace.php b/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/ImgSpace.php similarity index 95% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/ImgSpace.php rename to thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/ImgSpace.php index aec42aea8..350b3358f 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/ImgSpace.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/ImgSpace.php @@ -1,61 +1,61 @@ - array('left', 'right'), - 'vspace' => array('top', 'bottom') - ); - - /** - * @param string $attr - */ - public function __construct($attr) - { - $this->attr = $attr; - if (!isset($this->css[$attr])) { - trigger_error(htmlspecialchars($attr) . ' is not valid space attribute'); - } - } - - /** - * @param array $attr - * @param HTMLPurifier_Config $config - * @param HTMLPurifier_Context $context - * @return array - */ - public function transform($attr, $config, $context) - { - if (!isset($attr[$this->attr])) { - return $attr; - } - - $width = $this->confiscateAttr($attr, $this->attr); - // some validation could happen here - - if (!isset($this->css[$this->attr])) { - return $attr; - } - - $style = ''; - foreach ($this->css[$this->attr] as $suffix) { - $property = "margin-$suffix"; - $style .= "$property:{$width}px;"; - } - $this->prependCSS($attr, $style); - return $attr; - } -} - -// vim: et sw=4 sts=4 + array('left', 'right'), + 'vspace' => array('top', 'bottom') + ); + + /** + * @param string $attr + */ + public function __construct($attr) + { + $this->attr = $attr; + if (!isset($this->css[$attr])) { + trigger_error(htmlspecialchars($attr) . ' is not valid space attribute'); + } + } + + /** + * @param array $attr + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return array + */ + public function transform($attr, $config, $context) + { + if (!isset($attr[$this->attr])) { + return $attr; + } + + $width = $this->confiscateAttr($attr, $this->attr); + // some validation could happen here + + if (!isset($this->css[$this->attr])) { + return $attr; + } + + $style = ''; + foreach ($this->css[$this->attr] as $suffix) { + $property = "margin-$suffix"; + $style .= "$property:{$width}px;"; + } + $this->prependCSS($attr, $style); + return $attr; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/Input.php b/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/Input.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/Input.php rename to thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/Input.php index 17a2ce4ce..3ab47ed8c 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/Input.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/Input.php @@ -1,56 +1,56 @@ -pixels = new HTMLPurifier_AttrDef_HTML_Pixels(); - } - - /** - * @param array $attr - * @param HTMLPurifier_Config $config - * @param HTMLPurifier_Context $context - * @return array - */ - public function transform($attr, $config, $context) - { - if (!isset($attr['type'])) { - $t = 'text'; - } else { - $t = strtolower($attr['type']); - } - if (isset($attr['checked']) && $t !== 'radio' && $t !== 'checkbox') { - unset($attr['checked']); - } - if (isset($attr['maxlength']) && $t !== 'text' && $t !== 'password') { - unset($attr['maxlength']); - } - if (isset($attr['size']) && $t !== 'text' && $t !== 'password') { - $result = $this->pixels->validate($attr['size'], $config, $context); - if ($result === false) { - unset($attr['size']); - } else { - $attr['size'] = $result; - } - } - if (isset($attr['src']) && $t !== 'image') { - unset($attr['src']); - } - if (!isset($attr['value']) && ($t === 'radio' || $t === 'checkbox')) { - $attr['value'] = ''; - } - return $attr; - } -} - -// vim: et sw=4 sts=4 +pixels = new HTMLPurifier_AttrDef_HTML_Pixels(); + } + + /** + * @param array $attr + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return array + */ + public function transform($attr, $config, $context) + { + if (!isset($attr['type'])) { + $t = 'text'; + } else { + $t = strtolower($attr['type']); + } + if (isset($attr['checked']) && $t !== 'radio' && $t !== 'checkbox') { + unset($attr['checked']); + } + if (isset($attr['maxlength']) && $t !== 'text' && $t !== 'password') { + unset($attr['maxlength']); + } + if (isset($attr['size']) && $t !== 'text' && $t !== 'password') { + $result = $this->pixels->validate($attr['size'], $config, $context); + if ($result === false) { + unset($attr['size']); + } else { + $attr['size'] = $result; + } + } + if (isset($attr['src']) && $t !== 'image') { + unset($attr['src']); + } + if (!isset($attr['value']) && ($t === 'radio' || $t === 'checkbox')) { + $attr['value'] = ''; + } + return $attr; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/Lang.php b/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/Lang.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/Lang.php rename to thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/Lang.php index 591b8ca73..5b0aff0e4 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/Lang.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/Lang.php @@ -1,31 +1,31 @@ -name = $name; - $this->cssName = $css_name ? $css_name : $name; - } - - /** - * @param array $attr - * @param HTMLPurifier_Config $config - * @param HTMLPurifier_Context $context - * @return array - */ - public function transform($attr, $config, $context) - { - if (!isset($attr[$this->name])) { - return $attr; - } - $length = $this->confiscateAttr($attr, $this->name); - if (ctype_digit($length)) { - $length .= 'px'; - } - $this->prependCSS($attr, $this->cssName . ":$length;"); - return $attr; - } -} - -// vim: et sw=4 sts=4 +name = $name; + $this->cssName = $css_name ? $css_name : $name; + } + + /** + * @param array $attr + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return array + */ + public function transform($attr, $config, $context) + { + if (!isset($attr[$this->name])) { + return $attr; + } + $length = $this->confiscateAttr($attr, $this->name); + if (ctype_digit($length)) { + $length .= 'px'; + } + $this->prependCSS($attr, $this->cssName . ":$length;"); + return $attr; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/Name.php b/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/Name.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/Name.php rename to thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/Name.php index a874d0f7a..63cce6837 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/Name.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/Name.php @@ -1,33 +1,33 @@ -get('HTML.Attr.Name.UseCDATA')) { - return $attr; - } - if (!isset($attr['name'])) { - return $attr; - } - $id = $this->confiscateAttr($attr, 'name'); - if (isset($attr['id'])) { - return $attr; - } - $attr['id'] = $id; - return $attr; - } -} - -// vim: et sw=4 sts=4 +get('HTML.Attr.Name.UseCDATA')) { + return $attr; + } + if (!isset($attr['name'])) { + return $attr; + } + $id = $this->confiscateAttr($attr, 'name'); + if (isset($attr['id'])) { + return $attr; + } + $attr['id'] = $id; + return $attr; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/NameSync.php b/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/NameSync.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/NameSync.php rename to thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/NameSync.php index 457f8110f..36079b786 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/NameSync.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/NameSync.php @@ -1,41 +1,41 @@ -idDef = new HTMLPurifier_AttrDef_HTML_ID(); - } - - /** - * @param array $attr - * @param HTMLPurifier_Config $config - * @param HTMLPurifier_Context $context - * @return array - */ - public function transform($attr, $config, $context) - { - if (!isset($attr['name'])) { - return $attr; - } - $name = $attr['name']; - if (isset($attr['id']) && $attr['id'] === $name) { - return $attr; - } - $result = $this->idDef->validate($name, $config, $context); - if ($result === false) { - unset($attr['name']); - } else { - $attr['name'] = $result; - } - return $attr; - } -} - -// vim: et sw=4 sts=4 +idDef = new HTMLPurifier_AttrDef_HTML_ID(); + } + + /** + * @param array $attr + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return array + */ + public function transform($attr, $config, $context) + { + if (!isset($attr['name'])) { + return $attr; + } + $name = $attr['name']; + if (isset($attr['id']) && $attr['id'] === $name) { + return $attr; + } + $result = $this->idDef->validate($name, $config, $context); + if ($result === false) { + unset($attr['name']); + } else { + $attr['name'] = $result; + } + return $attr; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/Nofollow.php b/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/Nofollow.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/Nofollow.php rename to thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/Nofollow.php index 25173c219..1057ebee1 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/Nofollow.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/Nofollow.php @@ -1,52 +1,52 @@ -parser = new HTMLPurifier_URIParser(); - } - - /** - * @param array $attr - * @param HTMLPurifier_Config $config - * @param HTMLPurifier_Context $context - * @return array - */ - public function transform($attr, $config, $context) - { - if (!isset($attr['href'])) { - return $attr; - } - - // XXX Kind of inefficient - $url = $this->parser->parse($attr['href']); - $scheme = $url->getSchemeObj($config, $context); - - if ($scheme->browsable && !$url->isLocal($config, $context)) { - if (isset($attr['rel'])) { - $rels = explode(' ', $attr['rel']); - if (!in_array('nofollow', $rels)) { - $rels[] = 'nofollow'; - } - $attr['rel'] = implode(' ', $rels); - } else { - $attr['rel'] = 'nofollow'; - } - } - return $attr; - } -} - -// vim: et sw=4 sts=4 +parser = new HTMLPurifier_URIParser(); + } + + /** + * @param array $attr + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return array + */ + public function transform($attr, $config, $context) + { + if (!isset($attr['href'])) { + return $attr; + } + + // XXX Kind of inefficient + $url = $this->parser->parse($attr['href']); + $scheme = $url->getSchemeObj($config, $context); + + if ($scheme->browsable && !$url->isLocal($config, $context)) { + if (isset($attr['rel'])) { + $rels = explode(' ', $attr['rel']); + if (!in_array('nofollow', $rels)) { + $rels[] = 'nofollow'; + } + $attr['rel'] = implode(' ', $rels); + } else { + $attr['rel'] = 'nofollow'; + } + } + return $attr; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/SafeEmbed.php b/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/SafeEmbed.php similarity index 95% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/SafeEmbed.php rename to thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/SafeEmbed.php index 98ebf49bf..231c81a3f 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/SafeEmbed.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/SafeEmbed.php @@ -1,25 +1,25 @@ -uri = new HTMLPurifier_AttrDef_URI(true); // embedded - $this->wmode = new HTMLPurifier_AttrDef_Enum(array('window', 'opaque', 'transparent')); - } - - /** - * @param array $attr - * @param HTMLPurifier_Config $config - * @param HTMLPurifier_Context $context - * @return array - */ - public function transform($attr, $config, $context) - { - // If we add support for other objects, we'll need to alter the - // transforms. - switch ($attr['name']) { - // application/x-shockwave-flash - // Keep this synchronized with Injector/SafeObject.php - case 'allowScriptAccess': - $attr['value'] = 'never'; - break; - case 'allowNetworking': - $attr['value'] = 'internal'; - break; - case 'allowFullScreen': - if ($config->get('HTML.FlashAllowFullScreen')) { - $attr['value'] = ($attr['value'] == 'true') ? 'true' : 'false'; - } else { - $attr['value'] = 'false'; - } - break; - case 'wmode': - $attr['value'] = $this->wmode->validate($attr['value'], $config, $context); - break; - case 'movie': - case 'src': - $attr['name'] = "movie"; - $attr['value'] = $this->uri->validate($attr['value'], $config, $context); - break; - case 'flashvars': - // we're going to allow arbitrary inputs to the SWF, on - // the reasoning that it could only hack the SWF, not us. - break; - // add other cases to support other param name/value pairs - default: - $attr['name'] = $attr['value'] = null; - } - return $attr; - } -} - -// vim: et sw=4 sts=4 +uri = new HTMLPurifier_AttrDef_URI(true); // embedded + $this->wmode = new HTMLPurifier_AttrDef_Enum(array('window', 'opaque', 'transparent')); + } + + /** + * @param array $attr + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return array + */ + public function transform($attr, $config, $context) + { + // If we add support for other objects, we'll need to alter the + // transforms. + switch ($attr['name']) { + // application/x-shockwave-flash + // Keep this synchronized with Injector/SafeObject.php + case 'allowScriptAccess': + $attr['value'] = 'never'; + break; + case 'allowNetworking': + $attr['value'] = 'internal'; + break; + case 'allowFullScreen': + if ($config->get('HTML.FlashAllowFullScreen')) { + $attr['value'] = ($attr['value'] == 'true') ? 'true' : 'false'; + } else { + $attr['value'] = 'false'; + } + break; + case 'wmode': + $attr['value'] = $this->wmode->validate($attr['value'], $config, $context); + break; + case 'movie': + case 'src': + $attr['name'] = "movie"; + $attr['value'] = $this->uri->validate($attr['value'], $config, $context); + break; + case 'flashvars': + // we're going to allow arbitrary inputs to the SWF, on + // the reasoning that it could only hack the SWF, not us. + break; + // add other cases to support other param name/value pairs + default: + $attr['name'] = $attr['value'] = null; + } + return $attr; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/ScriptRequired.php b/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/ScriptRequired.php similarity index 95% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/ScriptRequired.php rename to thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/ScriptRequired.php index 49445b43f..b7057bbf8 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/ScriptRequired.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/ScriptRequired.php @@ -1,23 +1,23 @@ - - */ -class HTMLPurifier_AttrTransform_ScriptRequired extends HTMLPurifier_AttrTransform -{ - /** - * @param array $attr - * @param HTMLPurifier_Config $config - * @param HTMLPurifier_Context $context - * @return array - */ - public function transform($attr, $config, $context) - { - if (!isset($attr['type'])) { - $attr['type'] = 'text/javascript'; - } - return $attr; - } -} - -// vim: et sw=4 sts=4 + + */ +class HTMLPurifier_AttrTransform_ScriptRequired extends HTMLPurifier_AttrTransform +{ + /** + * @param array $attr + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return array + */ + public function transform($attr, $config, $context) + { + if (!isset($attr['type'])) { + $attr['type'] = 'text/javascript'; + } + return $attr; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/TargetBlank.php b/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/TargetBlank.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/TargetBlank.php rename to thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/TargetBlank.php index f66dcf8c4..dd63ea89c 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/TargetBlank.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/TargetBlank.php @@ -1,45 +1,45 @@ -parser = new HTMLPurifier_URIParser(); - } - - /** - * @param array $attr - * @param HTMLPurifier_Config $config - * @param HTMLPurifier_Context $context - * @return array - */ - public function transform($attr, $config, $context) - { - if (!isset($attr['href'])) { - return $attr; - } - - // XXX Kind of inefficient - $url = $this->parser->parse($attr['href']); - $scheme = $url->getSchemeObj($config, $context); - - if ($scheme->browsable && !$url->isBenign($config, $context)) { - $attr['target'] = '_blank'; - } - return $attr; - } -} - -// vim: et sw=4 sts=4 +parser = new HTMLPurifier_URIParser(); + } + + /** + * @param array $attr + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return array + */ + public function transform($attr, $config, $context) + { + if (!isset($attr['href'])) { + return $attr; + } + + // XXX Kind of inefficient + $url = $this->parser->parse($attr['href']); + $scheme = $url->getSchemeObj($config, $context); + + if ($scheme->browsable && !$url->isBenign($config, $context)) { + $attr['target'] = '_blank'; + } + return $attr; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/Textarea.php b/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/Textarea.php similarity index 95% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/Textarea.php rename to thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/Textarea.php index 182fdda74..6a9f33a0c 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/Textarea.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/AttrTransform/Textarea.php @@ -1,27 +1,27 @@ - - */ -class HTMLPurifier_AttrTransform_Textarea extends HTMLPurifier_AttrTransform -{ - /** - * @param array $attr - * @param HTMLPurifier_Config $config - * @param HTMLPurifier_Context $context - * @return array - */ - public function transform($attr, $config, $context) - { - // Calculated from Firefox - if (!isset($attr['cols'])) { - $attr['cols'] = '22'; - } - if (!isset($attr['rows'])) { - $attr['rows'] = '3'; - } - return $attr; - } -} - -// vim: et sw=4 sts=4 + + */ +class HTMLPurifier_AttrTransform_Textarea extends HTMLPurifier_AttrTransform +{ + /** + * @param array $attr + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return array + */ + public function transform($attr, $config, $context) + { + // Calculated from Firefox + if (!isset($attr['cols'])) { + $attr['cols'] = '22'; + } + if (!isset($attr['rows'])) { + $attr['rows'] = '3'; + } + return $attr; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrTypes.php b/thirdparty/HTMLPurifier/HTMLPurifier/AttrTypes.php similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrTypes.php rename to thirdparty/HTMLPurifier/HTMLPurifier/AttrTypes.php index 7e8019bd0..3b70520b6 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrTypes.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/AttrTypes.php @@ -1,96 +1,96 @@ -info['Enum'] = new HTMLPurifier_AttrDef_Enum(); - $this->info['Bool'] = new HTMLPurifier_AttrDef_HTML_Bool(); - - $this->info['CDATA'] = new HTMLPurifier_AttrDef_Text(); - $this->info['ID'] = new HTMLPurifier_AttrDef_HTML_ID(); - $this->info['Length'] = new HTMLPurifier_AttrDef_HTML_Length(); - $this->info['MultiLength'] = new HTMLPurifier_AttrDef_HTML_MultiLength(); - $this->info['NMTOKENS'] = new HTMLPurifier_AttrDef_HTML_Nmtokens(); - $this->info['Pixels'] = new HTMLPurifier_AttrDef_HTML_Pixels(); - $this->info['Text'] = new HTMLPurifier_AttrDef_Text(); - $this->info['URI'] = new HTMLPurifier_AttrDef_URI(); - $this->info['LanguageCode'] = new HTMLPurifier_AttrDef_Lang(); - $this->info['Color'] = new HTMLPurifier_AttrDef_HTML_Color(); - $this->info['IAlign'] = self::makeEnum('top,middle,bottom,left,right'); - $this->info['LAlign'] = self::makeEnum('top,bottom,left,right'); - $this->info['FrameTarget'] = new HTMLPurifier_AttrDef_HTML_FrameTarget(); - - // unimplemented aliases - $this->info['ContentType'] = new HTMLPurifier_AttrDef_Text(); - $this->info['ContentTypes'] = new HTMLPurifier_AttrDef_Text(); - $this->info['Charsets'] = new HTMLPurifier_AttrDef_Text(); - $this->info['Character'] = new HTMLPurifier_AttrDef_Text(); - - // "proprietary" types - $this->info['Class'] = new HTMLPurifier_AttrDef_HTML_Class(); - - // number is really a positive integer (one or more digits) - // FIXME: ^^ not always, see start and value of list items - $this->info['Number'] = new HTMLPurifier_AttrDef_Integer(false, false, true); - } - - private static function makeEnum($in) - { - return new HTMLPurifier_AttrDef_Clone(new HTMLPurifier_AttrDef_Enum(explode(',', $in))); - } - - /** - * Retrieves a type - * @param string $type String type name - * @return HTMLPurifier_AttrDef Object AttrDef for type - */ - public function get($type) - { - // determine if there is any extra info tacked on - if (strpos($type, '#') !== false) { - list($type, $string) = explode('#', $type, 2); - } else { - $string = ''; - } - - if (!isset($this->info[$type])) { - trigger_error('Cannot retrieve undefined attribute type ' . $type, E_USER_ERROR); - return; - } - return $this->info[$type]->make($string); - } - - /** - * Sets a new implementation for a type - * @param string $type String type name - * @param HTMLPurifier_AttrDef $impl Object AttrDef for type - */ - public function set($type, $impl) - { - $this->info[$type] = $impl; - } -} - -// vim: et sw=4 sts=4 +info['Enum'] = new HTMLPurifier_AttrDef_Enum(); + $this->info['Bool'] = new HTMLPurifier_AttrDef_HTML_Bool(); + + $this->info['CDATA'] = new HTMLPurifier_AttrDef_Text(); + $this->info['ID'] = new HTMLPurifier_AttrDef_HTML_ID(); + $this->info['Length'] = new HTMLPurifier_AttrDef_HTML_Length(); + $this->info['MultiLength'] = new HTMLPurifier_AttrDef_HTML_MultiLength(); + $this->info['NMTOKENS'] = new HTMLPurifier_AttrDef_HTML_Nmtokens(); + $this->info['Pixels'] = new HTMLPurifier_AttrDef_HTML_Pixels(); + $this->info['Text'] = new HTMLPurifier_AttrDef_Text(); + $this->info['URI'] = new HTMLPurifier_AttrDef_URI(); + $this->info['LanguageCode'] = new HTMLPurifier_AttrDef_Lang(); + $this->info['Color'] = new HTMLPurifier_AttrDef_HTML_Color(); + $this->info['IAlign'] = self::makeEnum('top,middle,bottom,left,right'); + $this->info['LAlign'] = self::makeEnum('top,bottom,left,right'); + $this->info['FrameTarget'] = new HTMLPurifier_AttrDef_HTML_FrameTarget(); + + // unimplemented aliases + $this->info['ContentType'] = new HTMLPurifier_AttrDef_Text(); + $this->info['ContentTypes'] = new HTMLPurifier_AttrDef_Text(); + $this->info['Charsets'] = new HTMLPurifier_AttrDef_Text(); + $this->info['Character'] = new HTMLPurifier_AttrDef_Text(); + + // "proprietary" types + $this->info['Class'] = new HTMLPurifier_AttrDef_HTML_Class(); + + // number is really a positive integer (one or more digits) + // FIXME: ^^ not always, see start and value of list items + $this->info['Number'] = new HTMLPurifier_AttrDef_Integer(false, false, true); + } + + private static function makeEnum($in) + { + return new HTMLPurifier_AttrDef_Clone(new HTMLPurifier_AttrDef_Enum(explode(',', $in))); + } + + /** + * Retrieves a type + * @param string $type String type name + * @return HTMLPurifier_AttrDef Object AttrDef for type + */ + public function get($type) + { + // determine if there is any extra info tacked on + if (strpos($type, '#') !== false) { + list($type, $string) = explode('#', $type, 2); + } else { + $string = ''; + } + + if (!isset($this->info[$type])) { + trigger_error('Cannot retrieve undefined attribute type ' . $type, E_USER_ERROR); + return; + } + return $this->info[$type]->make($string); + } + + /** + * Sets a new implementation for a type + * @param string $type String type name + * @param HTMLPurifier_AttrDef $impl Object AttrDef for type + */ + public function set($type, $impl) + { + $this->info[$type] = $impl; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrValidator.php b/thirdparty/HTMLPurifier/HTMLPurifier/AttrValidator.php similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrValidator.php rename to thirdparty/HTMLPurifier/HTMLPurifier/AttrValidator.php index 1a2b0b673..f97dc93ed 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/AttrValidator.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/AttrValidator.php @@ -1,178 +1,178 @@ -getHTMLDefinition(); - $e =& $context->get('ErrorCollector', true); - - // initialize IDAccumulator if necessary - $ok =& $context->get('IDAccumulator', true); - if (!$ok) { - $id_accumulator = HTMLPurifier_IDAccumulator::build($config, $context); - $context->register('IDAccumulator', $id_accumulator); - } - - // initialize CurrentToken if necessary - $current_token =& $context->get('CurrentToken', true); - if (!$current_token) { - $context->register('CurrentToken', $token); - } - - if (!$token instanceof HTMLPurifier_Token_Start && - !$token instanceof HTMLPurifier_Token_Empty - ) { - return; - } - - // create alias to global definition array, see also $defs - // DEFINITION CALL - $d_defs = $definition->info_global_attr; - - // don't update token until the very end, to ensure an atomic update - $attr = $token->attr; - - // do global transformations (pre) - // nothing currently utilizes this - foreach ($definition->info_attr_transform_pre as $transform) { - $attr = $transform->transform($o = $attr, $config, $context); - if ($e) { - if ($attr != $o) { - $e->send(E_NOTICE, 'AttrValidator: Attributes transformed', $o, $attr); - } - } - } - - // do local transformations only applicable to this element (pre) - // ex.

to

- foreach ($definition->info[$token->name]->attr_transform_pre as $transform) { - $attr = $transform->transform($o = $attr, $config, $context); - if ($e) { - if ($attr != $o) { - $e->send(E_NOTICE, 'AttrValidator: Attributes transformed', $o, $attr); - } - } - } - - // create alias to this element's attribute definition array, see - // also $d_defs (global attribute definition array) - // DEFINITION CALL - $defs = $definition->info[$token->name]->attr; - - $attr_key = false; - $context->register('CurrentAttr', $attr_key); - - // iterate through all the attribute keypairs - // Watch out for name collisions: $key has previously been used - foreach ($attr as $attr_key => $value) { - - // call the definition - if (isset($defs[$attr_key])) { - // there is a local definition defined - if ($defs[$attr_key] === false) { - // We've explicitly been told not to allow this element. - // This is usually when there's a global definition - // that must be overridden. - // Theoretically speaking, we could have a - // AttrDef_DenyAll, but this is faster! - $result = false; - } else { - // validate according to the element's definition - $result = $defs[$attr_key]->validate( - $value, - $config, - $context - ); - } - } elseif (isset($d_defs[$attr_key])) { - // there is a global definition defined, validate according - // to the global definition - $result = $d_defs[$attr_key]->validate( - $value, - $config, - $context - ); - } else { - // system never heard of the attribute? DELETE! - $result = false; - } - - // put the results into effect - if ($result === false || $result === null) { - // this is a generic error message that should replaced - // with more specific ones when possible - if ($e) { - $e->send(E_ERROR, 'AttrValidator: Attribute removed'); - } - - // remove the attribute - unset($attr[$attr_key]); - } elseif (is_string($result)) { - // generally, if a substitution is happening, there - // was some sort of implicit correction going on. We'll - // delegate it to the attribute classes to say exactly what. - - // simple substitution - $attr[$attr_key] = $result; - } else { - // nothing happens - } - - // we'd also want slightly more complicated substitution - // involving an array as the return value, - // although we're not sure how colliding attributes would - // resolve (certain ones would be completely overriden, - // others would prepend themselves). - } - - $context->destroy('CurrentAttr'); - - // post transforms - - // global (error reporting untested) - foreach ($definition->info_attr_transform_post as $transform) { - $attr = $transform->transform($o = $attr, $config, $context); - if ($e) { - if ($attr != $o) { - $e->send(E_NOTICE, 'AttrValidator: Attributes transformed', $o, $attr); - } - } - } - - // local (error reporting untested) - foreach ($definition->info[$token->name]->attr_transform_post as $transform) { - $attr = $transform->transform($o = $attr, $config, $context); - if ($e) { - if ($attr != $o) { - $e->send(E_NOTICE, 'AttrValidator: Attributes transformed', $o, $attr); - } - } - } - - $token->attr = $attr; - - // destroy CurrentToken if we made it ourselves - if (!$current_token) { - $context->destroy('CurrentToken'); - } - - } - - -} - -// vim: et sw=4 sts=4 +getHTMLDefinition(); + $e =& $context->get('ErrorCollector', true); + + // initialize IDAccumulator if necessary + $ok =& $context->get('IDAccumulator', true); + if (!$ok) { + $id_accumulator = HTMLPurifier_IDAccumulator::build($config, $context); + $context->register('IDAccumulator', $id_accumulator); + } + + // initialize CurrentToken if necessary + $current_token =& $context->get('CurrentToken', true); + if (!$current_token) { + $context->register('CurrentToken', $token); + } + + if (!$token instanceof HTMLPurifier_Token_Start && + !$token instanceof HTMLPurifier_Token_Empty + ) { + return; + } + + // create alias to global definition array, see also $defs + // DEFINITION CALL + $d_defs = $definition->info_global_attr; + + // don't update token until the very end, to ensure an atomic update + $attr = $token->attr; + + // do global transformations (pre) + // nothing currently utilizes this + foreach ($definition->info_attr_transform_pre as $transform) { + $attr = $transform->transform($o = $attr, $config, $context); + if ($e) { + if ($attr != $o) { + $e->send(E_NOTICE, 'AttrValidator: Attributes transformed', $o, $attr); + } + } + } + + // do local transformations only applicable to this element (pre) + // ex.

to

+ foreach ($definition->info[$token->name]->attr_transform_pre as $transform) { + $attr = $transform->transform($o = $attr, $config, $context); + if ($e) { + if ($attr != $o) { + $e->send(E_NOTICE, 'AttrValidator: Attributes transformed', $o, $attr); + } + } + } + + // create alias to this element's attribute definition array, see + // also $d_defs (global attribute definition array) + // DEFINITION CALL + $defs = $definition->info[$token->name]->attr; + + $attr_key = false; + $context->register('CurrentAttr', $attr_key); + + // iterate through all the attribute keypairs + // Watch out for name collisions: $key has previously been used + foreach ($attr as $attr_key => $value) { + + // call the definition + if (isset($defs[$attr_key])) { + // there is a local definition defined + if ($defs[$attr_key] === false) { + // We've explicitly been told not to allow this element. + // This is usually when there's a global definition + // that must be overridden. + // Theoretically speaking, we could have a + // AttrDef_DenyAll, but this is faster! + $result = false; + } else { + // validate according to the element's definition + $result = $defs[$attr_key]->validate( + $value, + $config, + $context + ); + } + } elseif (isset($d_defs[$attr_key])) { + // there is a global definition defined, validate according + // to the global definition + $result = $d_defs[$attr_key]->validate( + $value, + $config, + $context + ); + } else { + // system never heard of the attribute? DELETE! + $result = false; + } + + // put the results into effect + if ($result === false || $result === null) { + // this is a generic error message that should replaced + // with more specific ones when possible + if ($e) { + $e->send(E_ERROR, 'AttrValidator: Attribute removed'); + } + + // remove the attribute + unset($attr[$attr_key]); + } elseif (is_string($result)) { + // generally, if a substitution is happening, there + // was some sort of implicit correction going on. We'll + // delegate it to the attribute classes to say exactly what. + + // simple substitution + $attr[$attr_key] = $result; + } else { + // nothing happens + } + + // we'd also want slightly more complicated substitution + // involving an array as the return value, + // although we're not sure how colliding attributes would + // resolve (certain ones would be completely overriden, + // others would prepend themselves). + } + + $context->destroy('CurrentAttr'); + + // post transforms + + // global (error reporting untested) + foreach ($definition->info_attr_transform_post as $transform) { + $attr = $transform->transform($o = $attr, $config, $context); + if ($e) { + if ($attr != $o) { + $e->send(E_NOTICE, 'AttrValidator: Attributes transformed', $o, $attr); + } + } + } + + // local (error reporting untested) + foreach ($definition->info[$token->name]->attr_transform_post as $transform) { + $attr = $transform->transform($o = $attr, $config, $context); + if ($e) { + if ($attr != $o) { + $e->send(E_NOTICE, 'AttrValidator: Attributes transformed', $o, $attr); + } + } + } + + $token->attr = $attr; + + // destroy CurrentToken if we made it ourselves + if (!$current_token) { + $context->destroy('CurrentToken'); + } + + } + + +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Bootstrap.php b/thirdparty/HTMLPurifier/HTMLPurifier/Bootstrap.php similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Bootstrap.php rename to thirdparty/HTMLPurifier/HTMLPurifier/Bootstrap.php index 0ab0e341e..707122bb2 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Bootstrap.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/Bootstrap.php @@ -1,124 +1,124 @@ - -if (!defined('PHP_EOL')) { - switch (strtoupper(substr(PHP_OS, 0, 3))) { - case 'WIN': - define('PHP_EOL', "\r\n"); - break; - case 'DAR': - define('PHP_EOL', "\r"); - break; - default: - define('PHP_EOL', "\n"); - } -} - -/** - * Bootstrap class that contains meta-functionality for HTML Purifier such as - * the autoload function. - * - * @note - * This class may be used without any other files from HTML Purifier. - */ -class HTMLPurifier_Bootstrap -{ - - /** - * Autoload function for HTML Purifier - * @param string $class Class to load - * @return bool - */ - public static function autoload($class) - { - $file = HTMLPurifier_Bootstrap::getPath($class); - if (!$file) { - return false; - } - // Technically speaking, it should be ok and more efficient to - // just do 'require', but Antonio Parraga reports that with - // Zend extensions such as Zend debugger and APC, this invariant - // may be broken. Since we have efficient alternatives, pay - // the cost here and avoid the bug. - require_once HTMLPURIFIER_PREFIX . '/' . $file; - return true; - } - - /** - * Returns the path for a specific class. - * @param string $class Class path to get - * @return string - */ - public static function getPath($class) - { - if (strncmp('HTMLPurifier', $class, 12) !== 0) { - return false; - } - // Custom implementations - if (strncmp('HTMLPurifier_Language_', $class, 22) === 0) { - $code = str_replace('_', '-', substr($class, 22)); - $file = 'HTMLPurifier/Language/classes/' . $code . '.php'; - } else { - $file = str_replace('_', '/', $class) . '.php'; - } - if (!file_exists(HTMLPURIFIER_PREFIX . '/' . $file)) { - return false; - } - return $file; - } - - /** - * "Pre-registers" our autoloader on the SPL stack. - */ - public static function registerAutoload() - { - $autoload = array('HTMLPurifier_Bootstrap', 'autoload'); - if (($funcs = spl_autoload_functions()) === false) { - spl_autoload_register($autoload); - } elseif (function_exists('spl_autoload_unregister')) { - if (version_compare(PHP_VERSION, '5.3.0', '>=')) { - // prepend flag exists, no need for shenanigans - spl_autoload_register($autoload, true, true); - } else { - $buggy = version_compare(PHP_VERSION, '5.2.11', '<'); - $compat = version_compare(PHP_VERSION, '5.1.2', '<=') && - version_compare(PHP_VERSION, '5.1.0', '>='); - foreach ($funcs as $func) { - if ($buggy && is_array($func)) { - // :TRICKY: There are some compatibility issues and some - // places where we need to error out - $reflector = new ReflectionMethod($func[0], $func[1]); - if (!$reflector->isStatic()) { - throw new Exception( - 'HTML Purifier autoloader registrar is not compatible - with non-static object methods due to PHP Bug #44144; - Please do not use HTMLPurifier.autoload.php (or any - file that includes this file); instead, place the code: - spl_autoload_register(array(\'HTMLPurifier_Bootstrap\', \'autoload\')) - after your own autoloaders.' - ); - } - // Suprisingly, spl_autoload_register supports the - // Class::staticMethod callback format, although call_user_func doesn't - if ($compat) { - $func = implode('::', $func); - } - } - spl_autoload_unregister($func); - } - spl_autoload_register($autoload); - foreach ($funcs as $func) { - spl_autoload_register($func); - } - } - } - } -} - -// vim: et sw=4 sts=4 + +if (!defined('PHP_EOL')) { + switch (strtoupper(substr(PHP_OS, 0, 3))) { + case 'WIN': + define('PHP_EOL', "\r\n"); + break; + case 'DAR': + define('PHP_EOL', "\r"); + break; + default: + define('PHP_EOL', "\n"); + } +} + +/** + * Bootstrap class that contains meta-functionality for HTML Purifier such as + * the autoload function. + * + * @note + * This class may be used without any other files from HTML Purifier. + */ +class HTMLPurifier_Bootstrap +{ + + /** + * Autoload function for HTML Purifier + * @param string $class Class to load + * @return bool + */ + public static function autoload($class) + { + $file = HTMLPurifier_Bootstrap::getPath($class); + if (!$file) { + return false; + } + // Technically speaking, it should be ok and more efficient to + // just do 'require', but Antonio Parraga reports that with + // Zend extensions such as Zend debugger and APC, this invariant + // may be broken. Since we have efficient alternatives, pay + // the cost here and avoid the bug. + require_once HTMLPURIFIER_PREFIX . '/' . $file; + return true; + } + + /** + * Returns the path for a specific class. + * @param string $class Class path to get + * @return string + */ + public static function getPath($class) + { + if (strncmp('HTMLPurifier', $class, 12) !== 0) { + return false; + } + // Custom implementations + if (strncmp('HTMLPurifier_Language_', $class, 22) === 0) { + $code = str_replace('_', '-', substr($class, 22)); + $file = 'HTMLPurifier/Language/classes/' . $code . '.php'; + } else { + $file = str_replace('_', '/', $class) . '.php'; + } + if (!file_exists(HTMLPURIFIER_PREFIX . '/' . $file)) { + return false; + } + return $file; + } + + /** + * "Pre-registers" our autoloader on the SPL stack. + */ + public static function registerAutoload() + { + $autoload = array('HTMLPurifier_Bootstrap', 'autoload'); + if (($funcs = spl_autoload_functions()) === false) { + spl_autoload_register($autoload); + } elseif (function_exists('spl_autoload_unregister')) { + if (version_compare(PHP_VERSION, '5.3.0', '>=')) { + // prepend flag exists, no need for shenanigans + spl_autoload_register($autoload, true, true); + } else { + $buggy = version_compare(PHP_VERSION, '5.2.11', '<'); + $compat = version_compare(PHP_VERSION, '5.1.2', '<=') && + version_compare(PHP_VERSION, '5.1.0', '>='); + foreach ($funcs as $func) { + if ($buggy && is_array($func)) { + // :TRICKY: There are some compatibility issues and some + // places where we need to error out + $reflector = new ReflectionMethod($func[0], $func[1]); + if (!$reflector->isStatic()) { + throw new Exception( + 'HTML Purifier autoloader registrar is not compatible + with non-static object methods due to PHP Bug #44144; + Please do not use HTMLPurifier.autoload.php (or any + file that includes this file); instead, place the code: + spl_autoload_register(array(\'HTMLPurifier_Bootstrap\', \'autoload\')) + after your own autoloaders.' + ); + } + // Suprisingly, spl_autoload_register supports the + // Class::staticMethod callback format, although call_user_func doesn't + if ($compat) { + $func = implode('::', $func); + } + } + spl_autoload_unregister($func); + } + spl_autoload_register($autoload); + foreach ($funcs as $func) { + spl_autoload_register($func); + } + } + } + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/CSSDefinition.php b/thirdparty/HTMLPurifier/HTMLPurifier/CSSDefinition.php similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/CSSDefinition.php rename to thirdparty/HTMLPurifier/HTMLPurifier/CSSDefinition.php index 18b05f3ea..0acdee2d9 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/CSSDefinition.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/CSSDefinition.php @@ -1,474 +1,474 @@ -info['text-align'] = new HTMLPurifier_AttrDef_Enum( - array('left', 'right', 'center', 'justify'), - false - ); - - $border_style = - $this->info['border-bottom-style'] = - $this->info['border-right-style'] = - $this->info['border-left-style'] = - $this->info['border-top-style'] = new HTMLPurifier_AttrDef_Enum( - array( - 'none', - 'hidden', - 'dotted', - 'dashed', - 'solid', - 'double', - 'groove', - 'ridge', - 'inset', - 'outset' - ), - false - ); - - $this->info['border-style'] = new HTMLPurifier_AttrDef_CSS_Multiple($border_style); - - $this->info['clear'] = new HTMLPurifier_AttrDef_Enum( - array('none', 'left', 'right', 'both'), - false - ); - $this->info['float'] = new HTMLPurifier_AttrDef_Enum( - array('none', 'left', 'right'), - false - ); - $this->info['font-style'] = new HTMLPurifier_AttrDef_Enum( - array('normal', 'italic', 'oblique'), - false - ); - $this->info['font-variant'] = new HTMLPurifier_AttrDef_Enum( - array('normal', 'small-caps'), - false - ); - - $uri_or_none = new HTMLPurifier_AttrDef_CSS_Composite( - array( - new HTMLPurifier_AttrDef_Enum(array('none')), - new HTMLPurifier_AttrDef_CSS_URI() - ) - ); - - $this->info['list-style-position'] = new HTMLPurifier_AttrDef_Enum( - array('inside', 'outside'), - false - ); - $this->info['list-style-type'] = new HTMLPurifier_AttrDef_Enum( - array( - 'disc', - 'circle', - 'square', - 'decimal', - 'lower-roman', - 'upper-roman', - 'lower-alpha', - 'upper-alpha', - 'none' - ), - false - ); - $this->info['list-style-image'] = $uri_or_none; - - $this->info['list-style'] = new HTMLPurifier_AttrDef_CSS_ListStyle($config); - - $this->info['text-transform'] = new HTMLPurifier_AttrDef_Enum( - array('capitalize', 'uppercase', 'lowercase', 'none'), - false - ); - $this->info['color'] = new HTMLPurifier_AttrDef_CSS_Color(); - - $this->info['background-image'] = $uri_or_none; - $this->info['background-repeat'] = new HTMLPurifier_AttrDef_Enum( - array('repeat', 'repeat-x', 'repeat-y', 'no-repeat') - ); - $this->info['background-attachment'] = new HTMLPurifier_AttrDef_Enum( - array('scroll', 'fixed') - ); - $this->info['background-position'] = new HTMLPurifier_AttrDef_CSS_BackgroundPosition(); - - $border_color = - $this->info['border-top-color'] = - $this->info['border-bottom-color'] = - $this->info['border-left-color'] = - $this->info['border-right-color'] = - $this->info['background-color'] = new HTMLPurifier_AttrDef_CSS_Composite( - array( - new HTMLPurifier_AttrDef_Enum(array('transparent')), - new HTMLPurifier_AttrDef_CSS_Color() - ) - ); - - $this->info['background'] = new HTMLPurifier_AttrDef_CSS_Background($config); - - $this->info['border-color'] = new HTMLPurifier_AttrDef_CSS_Multiple($border_color); - - $border_width = - $this->info['border-top-width'] = - $this->info['border-bottom-width'] = - $this->info['border-left-width'] = - $this->info['border-right-width'] = new HTMLPurifier_AttrDef_CSS_Composite( - array( - new HTMLPurifier_AttrDef_Enum(array('thin', 'medium', 'thick')), - new HTMLPurifier_AttrDef_CSS_Length('0') //disallow negative - ) - ); - - $this->info['border-width'] = new HTMLPurifier_AttrDef_CSS_Multiple($border_width); - - $this->info['letter-spacing'] = new HTMLPurifier_AttrDef_CSS_Composite( - array( - new HTMLPurifier_AttrDef_Enum(array('normal')), - new HTMLPurifier_AttrDef_CSS_Length() - ) - ); - - $this->info['word-spacing'] = new HTMLPurifier_AttrDef_CSS_Composite( - array( - new HTMLPurifier_AttrDef_Enum(array('normal')), - new HTMLPurifier_AttrDef_CSS_Length() - ) - ); - - $this->info['font-size'] = new HTMLPurifier_AttrDef_CSS_Composite( - array( - new HTMLPurifier_AttrDef_Enum( - array( - 'xx-small', - 'x-small', - 'small', - 'medium', - 'large', - 'x-large', - 'xx-large', - 'larger', - 'smaller' - ) - ), - new HTMLPurifier_AttrDef_CSS_Percentage(), - new HTMLPurifier_AttrDef_CSS_Length() - ) - ); - - $this->info['line-height'] = new HTMLPurifier_AttrDef_CSS_Composite( - array( - new HTMLPurifier_AttrDef_Enum(array('normal')), - new HTMLPurifier_AttrDef_CSS_Number(true), // no negatives - new HTMLPurifier_AttrDef_CSS_Length('0'), - new HTMLPurifier_AttrDef_CSS_Percentage(true) - ) - ); - - $margin = - $this->info['margin-top'] = - $this->info['margin-bottom'] = - $this->info['margin-left'] = - $this->info['margin-right'] = new HTMLPurifier_AttrDef_CSS_Composite( - array( - new HTMLPurifier_AttrDef_CSS_Length(), - new HTMLPurifier_AttrDef_CSS_Percentage(), - new HTMLPurifier_AttrDef_Enum(array('auto')) - ) - ); - - $this->info['margin'] = new HTMLPurifier_AttrDef_CSS_Multiple($margin); - - // non-negative - $padding = - $this->info['padding-top'] = - $this->info['padding-bottom'] = - $this->info['padding-left'] = - $this->info['padding-right'] = new HTMLPurifier_AttrDef_CSS_Composite( - array( - new HTMLPurifier_AttrDef_CSS_Length('0'), - new HTMLPurifier_AttrDef_CSS_Percentage(true) - ) - ); - - $this->info['padding'] = new HTMLPurifier_AttrDef_CSS_Multiple($padding); - - $this->info['text-indent'] = new HTMLPurifier_AttrDef_CSS_Composite( - array( - new HTMLPurifier_AttrDef_CSS_Length(), - new HTMLPurifier_AttrDef_CSS_Percentage() - ) - ); - - $trusted_wh = new HTMLPurifier_AttrDef_CSS_Composite( - array( - new HTMLPurifier_AttrDef_CSS_Length('0'), - new HTMLPurifier_AttrDef_CSS_Percentage(true), - new HTMLPurifier_AttrDef_Enum(array('auto')) - ) - ); - $max = $config->get('CSS.MaxImgLength'); - - $this->info['width'] = - $this->info['height'] = - $max === null ? - $trusted_wh : - new HTMLPurifier_AttrDef_Switch( - 'img', - // For img tags: - new HTMLPurifier_AttrDef_CSS_Composite( - array( - new HTMLPurifier_AttrDef_CSS_Length('0', $max), - new HTMLPurifier_AttrDef_Enum(array('auto')) - ) - ), - // For everyone else: - $trusted_wh - ); - - $this->info['text-decoration'] = new HTMLPurifier_AttrDef_CSS_TextDecoration(); - - $this->info['font-family'] = new HTMLPurifier_AttrDef_CSS_FontFamily(); - - // this could use specialized code - $this->info['font-weight'] = new HTMLPurifier_AttrDef_Enum( - array( - 'normal', - 'bold', - 'bolder', - 'lighter', - '100', - '200', - '300', - '400', - '500', - '600', - '700', - '800', - '900' - ), - false - ); - - // MUST be called after other font properties, as it references - // a CSSDefinition object - $this->info['font'] = new HTMLPurifier_AttrDef_CSS_Font($config); - - // same here - $this->info['border'] = - $this->info['border-bottom'] = - $this->info['border-top'] = - $this->info['border-left'] = - $this->info['border-right'] = new HTMLPurifier_AttrDef_CSS_Border($config); - - $this->info['border-collapse'] = new HTMLPurifier_AttrDef_Enum( - array('collapse', 'separate') - ); - - $this->info['caption-side'] = new HTMLPurifier_AttrDef_Enum( - array('top', 'bottom') - ); - - $this->info['table-layout'] = new HTMLPurifier_AttrDef_Enum( - array('auto', 'fixed') - ); - - $this->info['vertical-align'] = new HTMLPurifier_AttrDef_CSS_Composite( - array( - new HTMLPurifier_AttrDef_Enum( - array( - 'baseline', - 'sub', - 'super', - 'top', - 'text-top', - 'middle', - 'bottom', - 'text-bottom' - ) - ), - new HTMLPurifier_AttrDef_CSS_Length(), - new HTMLPurifier_AttrDef_CSS_Percentage() - ) - ); - - $this->info['border-spacing'] = new HTMLPurifier_AttrDef_CSS_Multiple(new HTMLPurifier_AttrDef_CSS_Length(), 2); - - // These CSS properties don't work on many browsers, but we live - // in THE FUTURE! - $this->info['white-space'] = new HTMLPurifier_AttrDef_Enum( - array('nowrap', 'normal', 'pre', 'pre-wrap', 'pre-line') - ); - - if ($config->get('CSS.Proprietary')) { - $this->doSetupProprietary($config); - } - - if ($config->get('CSS.AllowTricky')) { - $this->doSetupTricky($config); - } - - if ($config->get('CSS.Trusted')) { - $this->doSetupTrusted($config); - } - - $allow_important = $config->get('CSS.AllowImportant'); - // wrap all attr-defs with decorator that handles !important - foreach ($this->info as $k => $v) { - $this->info[$k] = new HTMLPurifier_AttrDef_CSS_ImportantDecorator($v, $allow_important); - } - - $this->setupConfigStuff($config); - } - - /** - * @param HTMLPurifier_Config $config - */ - protected function doSetupProprietary($config) - { - // Internet Explorer only scrollbar colors - $this->info['scrollbar-arrow-color'] = new HTMLPurifier_AttrDef_CSS_Color(); - $this->info['scrollbar-base-color'] = new HTMLPurifier_AttrDef_CSS_Color(); - $this->info['scrollbar-darkshadow-color'] = new HTMLPurifier_AttrDef_CSS_Color(); - $this->info['scrollbar-face-color'] = new HTMLPurifier_AttrDef_CSS_Color(); - $this->info['scrollbar-highlight-color'] = new HTMLPurifier_AttrDef_CSS_Color(); - $this->info['scrollbar-shadow-color'] = new HTMLPurifier_AttrDef_CSS_Color(); - - // technically not proprietary, but CSS3, and no one supports it - $this->info['opacity'] = new HTMLPurifier_AttrDef_CSS_AlphaValue(); - $this->info['-moz-opacity'] = new HTMLPurifier_AttrDef_CSS_AlphaValue(); - $this->info['-khtml-opacity'] = new HTMLPurifier_AttrDef_CSS_AlphaValue(); - - // only opacity, for now - $this->info['filter'] = new HTMLPurifier_AttrDef_CSS_Filter(); - - // more CSS3 - $this->info['page-break-after'] = - $this->info['page-break-before'] = new HTMLPurifier_AttrDef_Enum( - array( - 'auto', - 'always', - 'avoid', - 'left', - 'right' - ) - ); - $this->info['page-break-inside'] = new HTMLPurifier_AttrDef_Enum(array('auto', 'avoid')); - - } - - /** - * @param HTMLPurifier_Config $config - */ - protected function doSetupTricky($config) - { - $this->info['display'] = new HTMLPurifier_AttrDef_Enum( - array( - 'inline', - 'block', - 'list-item', - 'run-in', - 'compact', - 'marker', - 'table', - 'inline-block', - 'inline-table', - 'table-row-group', - 'table-header-group', - 'table-footer-group', - 'table-row', - 'table-column-group', - 'table-column', - 'table-cell', - 'table-caption', - 'none' - ) - ); - $this->info['visibility'] = new HTMLPurifier_AttrDef_Enum( - array('visible', 'hidden', 'collapse') - ); - $this->info['overflow'] = new HTMLPurifier_AttrDef_Enum(array('visible', 'hidden', 'auto', 'scroll')); - } - - /** - * @param HTMLPurifier_Config $config - */ - protected function doSetupTrusted($config) - { - $this->info['position'] = new HTMLPurifier_AttrDef_Enum( - array('static', 'relative', 'absolute', 'fixed') - ); - $this->info['top'] = - $this->info['left'] = - $this->info['right'] = - $this->info['bottom'] = new HTMLPurifier_AttrDef_CSS_Composite( - array( - new HTMLPurifier_AttrDef_CSS_Length(), - new HTMLPurifier_AttrDef_CSS_Percentage(), - new HTMLPurifier_AttrDef_Enum(array('auto')), - ) - ); - $this->info['z-index'] = new HTMLPurifier_AttrDef_CSS_Composite( - array( - new HTMLPurifier_AttrDef_Integer(), - new HTMLPurifier_AttrDef_Enum(array('auto')), - ) - ); - } - - /** - * Performs extra config-based processing. Based off of - * HTMLPurifier_HTMLDefinition. - * @param HTMLPurifier_Config $config - * @todo Refactor duplicate elements into common class (probably using - * composition, not inheritance). - */ - protected function setupConfigStuff($config) - { - // setup allowed elements - $support = "(for information on implementing this, see the " . - "support forums) "; - $allowed_properties = $config->get('CSS.AllowedProperties'); - if ($allowed_properties !== null) { - foreach ($this->info as $name => $d) { - if (!isset($allowed_properties[$name])) { - unset($this->info[$name]); - } - unset($allowed_properties[$name]); - } - // emit errors - foreach ($allowed_properties as $name => $d) { - // :TODO: Is this htmlspecialchars() call really necessary? - $name = htmlspecialchars($name); - trigger_error("Style attribute '$name' is not supported $support", E_USER_WARNING); - } - } - - $forbidden_properties = $config->get('CSS.ForbiddenProperties'); - if ($forbidden_properties !== null) { - foreach ($this->info as $name => $d) { - if (isset($forbidden_properties[$name])) { - unset($this->info[$name]); - } - } - } - } -} - -// vim: et sw=4 sts=4 +info['text-align'] = new HTMLPurifier_AttrDef_Enum( + array('left', 'right', 'center', 'justify'), + false + ); + + $border_style = + $this->info['border-bottom-style'] = + $this->info['border-right-style'] = + $this->info['border-left-style'] = + $this->info['border-top-style'] = new HTMLPurifier_AttrDef_Enum( + array( + 'none', + 'hidden', + 'dotted', + 'dashed', + 'solid', + 'double', + 'groove', + 'ridge', + 'inset', + 'outset' + ), + false + ); + + $this->info['border-style'] = new HTMLPurifier_AttrDef_CSS_Multiple($border_style); + + $this->info['clear'] = new HTMLPurifier_AttrDef_Enum( + array('none', 'left', 'right', 'both'), + false + ); + $this->info['float'] = new HTMLPurifier_AttrDef_Enum( + array('none', 'left', 'right'), + false + ); + $this->info['font-style'] = new HTMLPurifier_AttrDef_Enum( + array('normal', 'italic', 'oblique'), + false + ); + $this->info['font-variant'] = new HTMLPurifier_AttrDef_Enum( + array('normal', 'small-caps'), + false + ); + + $uri_or_none = new HTMLPurifier_AttrDef_CSS_Composite( + array( + new HTMLPurifier_AttrDef_Enum(array('none')), + new HTMLPurifier_AttrDef_CSS_URI() + ) + ); + + $this->info['list-style-position'] = new HTMLPurifier_AttrDef_Enum( + array('inside', 'outside'), + false + ); + $this->info['list-style-type'] = new HTMLPurifier_AttrDef_Enum( + array( + 'disc', + 'circle', + 'square', + 'decimal', + 'lower-roman', + 'upper-roman', + 'lower-alpha', + 'upper-alpha', + 'none' + ), + false + ); + $this->info['list-style-image'] = $uri_or_none; + + $this->info['list-style'] = new HTMLPurifier_AttrDef_CSS_ListStyle($config); + + $this->info['text-transform'] = new HTMLPurifier_AttrDef_Enum( + array('capitalize', 'uppercase', 'lowercase', 'none'), + false + ); + $this->info['color'] = new HTMLPurifier_AttrDef_CSS_Color(); + + $this->info['background-image'] = $uri_or_none; + $this->info['background-repeat'] = new HTMLPurifier_AttrDef_Enum( + array('repeat', 'repeat-x', 'repeat-y', 'no-repeat') + ); + $this->info['background-attachment'] = new HTMLPurifier_AttrDef_Enum( + array('scroll', 'fixed') + ); + $this->info['background-position'] = new HTMLPurifier_AttrDef_CSS_BackgroundPosition(); + + $border_color = + $this->info['border-top-color'] = + $this->info['border-bottom-color'] = + $this->info['border-left-color'] = + $this->info['border-right-color'] = + $this->info['background-color'] = new HTMLPurifier_AttrDef_CSS_Composite( + array( + new HTMLPurifier_AttrDef_Enum(array('transparent')), + new HTMLPurifier_AttrDef_CSS_Color() + ) + ); + + $this->info['background'] = new HTMLPurifier_AttrDef_CSS_Background($config); + + $this->info['border-color'] = new HTMLPurifier_AttrDef_CSS_Multiple($border_color); + + $border_width = + $this->info['border-top-width'] = + $this->info['border-bottom-width'] = + $this->info['border-left-width'] = + $this->info['border-right-width'] = new HTMLPurifier_AttrDef_CSS_Composite( + array( + new HTMLPurifier_AttrDef_Enum(array('thin', 'medium', 'thick')), + new HTMLPurifier_AttrDef_CSS_Length('0') //disallow negative + ) + ); + + $this->info['border-width'] = new HTMLPurifier_AttrDef_CSS_Multiple($border_width); + + $this->info['letter-spacing'] = new HTMLPurifier_AttrDef_CSS_Composite( + array( + new HTMLPurifier_AttrDef_Enum(array('normal')), + new HTMLPurifier_AttrDef_CSS_Length() + ) + ); + + $this->info['word-spacing'] = new HTMLPurifier_AttrDef_CSS_Composite( + array( + new HTMLPurifier_AttrDef_Enum(array('normal')), + new HTMLPurifier_AttrDef_CSS_Length() + ) + ); + + $this->info['font-size'] = new HTMLPurifier_AttrDef_CSS_Composite( + array( + new HTMLPurifier_AttrDef_Enum( + array( + 'xx-small', + 'x-small', + 'small', + 'medium', + 'large', + 'x-large', + 'xx-large', + 'larger', + 'smaller' + ) + ), + new HTMLPurifier_AttrDef_CSS_Percentage(), + new HTMLPurifier_AttrDef_CSS_Length() + ) + ); + + $this->info['line-height'] = new HTMLPurifier_AttrDef_CSS_Composite( + array( + new HTMLPurifier_AttrDef_Enum(array('normal')), + new HTMLPurifier_AttrDef_CSS_Number(true), // no negatives + new HTMLPurifier_AttrDef_CSS_Length('0'), + new HTMLPurifier_AttrDef_CSS_Percentage(true) + ) + ); + + $margin = + $this->info['margin-top'] = + $this->info['margin-bottom'] = + $this->info['margin-left'] = + $this->info['margin-right'] = new HTMLPurifier_AttrDef_CSS_Composite( + array( + new HTMLPurifier_AttrDef_CSS_Length(), + new HTMLPurifier_AttrDef_CSS_Percentage(), + new HTMLPurifier_AttrDef_Enum(array('auto')) + ) + ); + + $this->info['margin'] = new HTMLPurifier_AttrDef_CSS_Multiple($margin); + + // non-negative + $padding = + $this->info['padding-top'] = + $this->info['padding-bottom'] = + $this->info['padding-left'] = + $this->info['padding-right'] = new HTMLPurifier_AttrDef_CSS_Composite( + array( + new HTMLPurifier_AttrDef_CSS_Length('0'), + new HTMLPurifier_AttrDef_CSS_Percentage(true) + ) + ); + + $this->info['padding'] = new HTMLPurifier_AttrDef_CSS_Multiple($padding); + + $this->info['text-indent'] = new HTMLPurifier_AttrDef_CSS_Composite( + array( + new HTMLPurifier_AttrDef_CSS_Length(), + new HTMLPurifier_AttrDef_CSS_Percentage() + ) + ); + + $trusted_wh = new HTMLPurifier_AttrDef_CSS_Composite( + array( + new HTMLPurifier_AttrDef_CSS_Length('0'), + new HTMLPurifier_AttrDef_CSS_Percentage(true), + new HTMLPurifier_AttrDef_Enum(array('auto')) + ) + ); + $max = $config->get('CSS.MaxImgLength'); + + $this->info['width'] = + $this->info['height'] = + $max === null ? + $trusted_wh : + new HTMLPurifier_AttrDef_Switch( + 'img', + // For img tags: + new HTMLPurifier_AttrDef_CSS_Composite( + array( + new HTMLPurifier_AttrDef_CSS_Length('0', $max), + new HTMLPurifier_AttrDef_Enum(array('auto')) + ) + ), + // For everyone else: + $trusted_wh + ); + + $this->info['text-decoration'] = new HTMLPurifier_AttrDef_CSS_TextDecoration(); + + $this->info['font-family'] = new HTMLPurifier_AttrDef_CSS_FontFamily(); + + // this could use specialized code + $this->info['font-weight'] = new HTMLPurifier_AttrDef_Enum( + array( + 'normal', + 'bold', + 'bolder', + 'lighter', + '100', + '200', + '300', + '400', + '500', + '600', + '700', + '800', + '900' + ), + false + ); + + // MUST be called after other font properties, as it references + // a CSSDefinition object + $this->info['font'] = new HTMLPurifier_AttrDef_CSS_Font($config); + + // same here + $this->info['border'] = + $this->info['border-bottom'] = + $this->info['border-top'] = + $this->info['border-left'] = + $this->info['border-right'] = new HTMLPurifier_AttrDef_CSS_Border($config); + + $this->info['border-collapse'] = new HTMLPurifier_AttrDef_Enum( + array('collapse', 'separate') + ); + + $this->info['caption-side'] = new HTMLPurifier_AttrDef_Enum( + array('top', 'bottom') + ); + + $this->info['table-layout'] = new HTMLPurifier_AttrDef_Enum( + array('auto', 'fixed') + ); + + $this->info['vertical-align'] = new HTMLPurifier_AttrDef_CSS_Composite( + array( + new HTMLPurifier_AttrDef_Enum( + array( + 'baseline', + 'sub', + 'super', + 'top', + 'text-top', + 'middle', + 'bottom', + 'text-bottom' + ) + ), + new HTMLPurifier_AttrDef_CSS_Length(), + new HTMLPurifier_AttrDef_CSS_Percentage() + ) + ); + + $this->info['border-spacing'] = new HTMLPurifier_AttrDef_CSS_Multiple(new HTMLPurifier_AttrDef_CSS_Length(), 2); + + // These CSS properties don't work on many browsers, but we live + // in THE FUTURE! + $this->info['white-space'] = new HTMLPurifier_AttrDef_Enum( + array('nowrap', 'normal', 'pre', 'pre-wrap', 'pre-line') + ); + + if ($config->get('CSS.Proprietary')) { + $this->doSetupProprietary($config); + } + + if ($config->get('CSS.AllowTricky')) { + $this->doSetupTricky($config); + } + + if ($config->get('CSS.Trusted')) { + $this->doSetupTrusted($config); + } + + $allow_important = $config->get('CSS.AllowImportant'); + // wrap all attr-defs with decorator that handles !important + foreach ($this->info as $k => $v) { + $this->info[$k] = new HTMLPurifier_AttrDef_CSS_ImportantDecorator($v, $allow_important); + } + + $this->setupConfigStuff($config); + } + + /** + * @param HTMLPurifier_Config $config + */ + protected function doSetupProprietary($config) + { + // Internet Explorer only scrollbar colors + $this->info['scrollbar-arrow-color'] = new HTMLPurifier_AttrDef_CSS_Color(); + $this->info['scrollbar-base-color'] = new HTMLPurifier_AttrDef_CSS_Color(); + $this->info['scrollbar-darkshadow-color'] = new HTMLPurifier_AttrDef_CSS_Color(); + $this->info['scrollbar-face-color'] = new HTMLPurifier_AttrDef_CSS_Color(); + $this->info['scrollbar-highlight-color'] = new HTMLPurifier_AttrDef_CSS_Color(); + $this->info['scrollbar-shadow-color'] = new HTMLPurifier_AttrDef_CSS_Color(); + + // technically not proprietary, but CSS3, and no one supports it + $this->info['opacity'] = new HTMLPurifier_AttrDef_CSS_AlphaValue(); + $this->info['-moz-opacity'] = new HTMLPurifier_AttrDef_CSS_AlphaValue(); + $this->info['-khtml-opacity'] = new HTMLPurifier_AttrDef_CSS_AlphaValue(); + + // only opacity, for now + $this->info['filter'] = new HTMLPurifier_AttrDef_CSS_Filter(); + + // more CSS3 + $this->info['page-break-after'] = + $this->info['page-break-before'] = new HTMLPurifier_AttrDef_Enum( + array( + 'auto', + 'always', + 'avoid', + 'left', + 'right' + ) + ); + $this->info['page-break-inside'] = new HTMLPurifier_AttrDef_Enum(array('auto', 'avoid')); + + } + + /** + * @param HTMLPurifier_Config $config + */ + protected function doSetupTricky($config) + { + $this->info['display'] = new HTMLPurifier_AttrDef_Enum( + array( + 'inline', + 'block', + 'list-item', + 'run-in', + 'compact', + 'marker', + 'table', + 'inline-block', + 'inline-table', + 'table-row-group', + 'table-header-group', + 'table-footer-group', + 'table-row', + 'table-column-group', + 'table-column', + 'table-cell', + 'table-caption', + 'none' + ) + ); + $this->info['visibility'] = new HTMLPurifier_AttrDef_Enum( + array('visible', 'hidden', 'collapse') + ); + $this->info['overflow'] = new HTMLPurifier_AttrDef_Enum(array('visible', 'hidden', 'auto', 'scroll')); + } + + /** + * @param HTMLPurifier_Config $config + */ + protected function doSetupTrusted($config) + { + $this->info['position'] = new HTMLPurifier_AttrDef_Enum( + array('static', 'relative', 'absolute', 'fixed') + ); + $this->info['top'] = + $this->info['left'] = + $this->info['right'] = + $this->info['bottom'] = new HTMLPurifier_AttrDef_CSS_Composite( + array( + new HTMLPurifier_AttrDef_CSS_Length(), + new HTMLPurifier_AttrDef_CSS_Percentage(), + new HTMLPurifier_AttrDef_Enum(array('auto')), + ) + ); + $this->info['z-index'] = new HTMLPurifier_AttrDef_CSS_Composite( + array( + new HTMLPurifier_AttrDef_Integer(), + new HTMLPurifier_AttrDef_Enum(array('auto')), + ) + ); + } + + /** + * Performs extra config-based processing. Based off of + * HTMLPurifier_HTMLDefinition. + * @param HTMLPurifier_Config $config + * @todo Refactor duplicate elements into common class (probably using + * composition, not inheritance). + */ + protected function setupConfigStuff($config) + { + // setup allowed elements + $support = "(for information on implementing this, see the " . + "support forums) "; + $allowed_properties = $config->get('CSS.AllowedProperties'); + if ($allowed_properties !== null) { + foreach ($this->info as $name => $d) { + if (!isset($allowed_properties[$name])) { + unset($this->info[$name]); + } + unset($allowed_properties[$name]); + } + // emit errors + foreach ($allowed_properties as $name => $d) { + // :TODO: Is this htmlspecialchars() call really necessary? + $name = htmlspecialchars($name); + trigger_error("Style attribute '$name' is not supported $support", E_USER_WARNING); + } + } + + $forbidden_properties = $config->get('CSS.ForbiddenProperties'); + if ($forbidden_properties !== null) { + foreach ($this->info as $name => $d) { + if (isset($forbidden_properties[$name])) { + unset($this->info[$name]); + } + } + } + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ChildDef.php b/thirdparty/HTMLPurifier/HTMLPurifier/ChildDef.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ChildDef.php rename to thirdparty/HTMLPurifier/HTMLPurifier/ChildDef.php index 5d64cd41a..8eb17b82e 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ChildDef.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ChildDef.php @@ -1,52 +1,52 @@ -elements; - } - - /** - * Validates nodes according to definition and returns modification. - * - * @param HTMLPurifier_Node[] $children Array of HTMLPurifier_Node - * @param HTMLPurifier_Config $config HTMLPurifier_Config object - * @param HTMLPurifier_Context $context HTMLPurifier_Context object - * @return bool|array true to leave nodes as is, false to remove parent node, array of replacement children - */ - abstract public function validateChildren($children, $config, $context); -} - -// vim: et sw=4 sts=4 +elements; + } + + /** + * Validates nodes according to definition and returns modification. + * + * @param HTMLPurifier_Node[] $children Array of HTMLPurifier_Node + * @param HTMLPurifier_Config $config HTMLPurifier_Config object + * @param HTMLPurifier_Context $context HTMLPurifier_Context object + * @return bool|array true to leave nodes as is, false to remove parent node, array of replacement children + */ + abstract public function validateChildren($children, $config, $context); +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ChildDef/Chameleon.php b/thirdparty/HTMLPurifier/HTMLPurifier/ChildDef/Chameleon.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ChildDef/Chameleon.php rename to thirdparty/HTMLPurifier/HTMLPurifier/ChildDef/Chameleon.php index f6b2f22e5..7439be26b 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ChildDef/Chameleon.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ChildDef/Chameleon.php @@ -1,67 +1,67 @@ -inline = new HTMLPurifier_ChildDef_Optional($inline); - $this->block = new HTMLPurifier_ChildDef_Optional($block); - $this->elements = $this->block->elements; - } - - /** - * @param HTMLPurifier_Node[] $children - * @param HTMLPurifier_Config $config - * @param HTMLPurifier_Context $context - * @return bool - */ - public function validateChildren($children, $config, $context) - { - if ($context->get('IsInline') === false) { - return $this->block->validateChildren( - $children, - $config, - $context - ); - } else { - return $this->inline->validateChildren( - $children, - $config, - $context - ); - } - } -} - -// vim: et sw=4 sts=4 +inline = new HTMLPurifier_ChildDef_Optional($inline); + $this->block = new HTMLPurifier_ChildDef_Optional($block); + $this->elements = $this->block->elements; + } + + /** + * @param HTMLPurifier_Node[] $children + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool + */ + public function validateChildren($children, $config, $context) + { + if ($context->get('IsInline') === false) { + return $this->block->validateChildren( + $children, + $config, + $context + ); + } else { + return $this->inline->validateChildren( + $children, + $config, + $context + ); + } + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ChildDef/Custom.php b/thirdparty/HTMLPurifier/HTMLPurifier/ChildDef/Custom.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ChildDef/Custom.php rename to thirdparty/HTMLPurifier/HTMLPurifier/ChildDef/Custom.php index 1047cd8e8..128132e96 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ChildDef/Custom.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ChildDef/Custom.php @@ -1,102 +1,102 @@ -dtd_regex = $dtd_regex; - $this->_compileRegex(); - } - - /** - * Compiles the PCRE regex from a DTD regex ($dtd_regex to $_pcre_regex) - */ - protected function _compileRegex() - { - $raw = str_replace(' ', '', $this->dtd_regex); - if ($raw{0} != '(') { - $raw = "($raw)"; - } - $el = '[#a-zA-Z0-9_.-]+'; - $reg = $raw; - - // COMPLICATED! AND MIGHT BE BUGGY! I HAVE NO CLUE WHAT I'M - // DOING! Seriously: if there's problems, please report them. - - // collect all elements into the $elements array - preg_match_all("/$el/", $reg, $matches); - foreach ($matches[0] as $match) { - $this->elements[$match] = true; - } - - // setup all elements as parentheticals with leading commas - $reg = preg_replace("/$el/", '(,\\0)', $reg); - - // remove commas when they were not solicited - $reg = preg_replace("/([^,(|]\(+),/", '\\1', $reg); - - // remove all non-paranthetical commas: they are handled by first regex - $reg = preg_replace("/,\(/", '(', $reg); - - $this->_pcre_regex = $reg; - } - - /** - * @param HTMLPurifier_Node[] $children - * @param HTMLPurifier_Config $config - * @param HTMLPurifier_Context $context - * @return bool - */ - public function validateChildren($children, $config, $context) - { - $list_of_children = ''; - $nesting = 0; // depth into the nest - foreach ($children as $node) { - if (!empty($node->is_whitespace)) { - continue; - } - $list_of_children .= $node->name . ','; - } - // add leading comma to deal with stray comma declarations - $list_of_children = ',' . rtrim($list_of_children, ','); - $okay = - preg_match( - '/^,?' . $this->_pcre_regex . '$/', - $list_of_children - ); - return (bool)$okay; - } -} - -// vim: et sw=4 sts=4 +dtd_regex = $dtd_regex; + $this->_compileRegex(); + } + + /** + * Compiles the PCRE regex from a DTD regex ($dtd_regex to $_pcre_regex) + */ + protected function _compileRegex() + { + $raw = str_replace(' ', '', $this->dtd_regex); + if ($raw{0} != '(') { + $raw = "($raw)"; + } + $el = '[#a-zA-Z0-9_.-]+'; + $reg = $raw; + + // COMPLICATED! AND MIGHT BE BUGGY! I HAVE NO CLUE WHAT I'M + // DOING! Seriously: if there's problems, please report them. + + // collect all elements into the $elements array + preg_match_all("/$el/", $reg, $matches); + foreach ($matches[0] as $match) { + $this->elements[$match] = true; + } + + // setup all elements as parentheticals with leading commas + $reg = preg_replace("/$el/", '(,\\0)', $reg); + + // remove commas when they were not solicited + $reg = preg_replace("/([^,(|]\(+),/", '\\1', $reg); + + // remove all non-paranthetical commas: they are handled by first regex + $reg = preg_replace("/,\(/", '(', $reg); + + $this->_pcre_regex = $reg; + } + + /** + * @param HTMLPurifier_Node[] $children + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool + */ + public function validateChildren($children, $config, $context) + { + $list_of_children = ''; + $nesting = 0; // depth into the nest + foreach ($children as $node) { + if (!empty($node->is_whitespace)) { + continue; + } + $list_of_children .= $node->name . ','; + } + // add leading comma to deal with stray comma declarations + $list_of_children = ',' . rtrim($list_of_children, ','); + $okay = + preg_match( + '/^,?' . $this->_pcre_regex . '$/', + $list_of_children + ); + return (bool)$okay; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ChildDef/Empty.php b/thirdparty/HTMLPurifier/HTMLPurifier/ChildDef/Empty.php similarity index 95% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ChildDef/Empty.php rename to thirdparty/HTMLPurifier/HTMLPurifier/ChildDef/Empty.php index bbcde56e8..a8a6cbdd2 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ChildDef/Empty.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ChildDef/Empty.php @@ -1,38 +1,38 @@ - true, 'ul' => true, 'ol' => true); - - /** - * @param array $children - * @param HTMLPurifier_Config $config - * @param HTMLPurifier_Context $context - * @return array - */ - public function validateChildren($children, $config, $context) - { - // Flag for subclasses - $this->whitespace = false; - - // if there are no tokens, delete parent node - if (empty($children)) { - return false; - } - - // the new set of children - $result = array(); - - // a little sanity check to make sure it's not ALL whitespace - $all_whitespace = true; - - $current_li = false; - - foreach ($children as $node) { - if (!empty($node->is_whitespace)) { - $result[] = $node; - continue; - } - $all_whitespace = false; // phew, we're not talking about whitespace - - if ($node->name === 'li') { - // good - $current_li = $node; - $result[] = $node; - } else { - // we want to tuck this into the previous li - // Invariant: we expect the node to be ol/ul - // ToDo: Make this more robust in the case of not ol/ul - // by distinguishing between existing li and li created - // to handle non-list elements; non-list elements should - // not be appended to an existing li; only li created - // for non-list. This distinction is not currently made. - if ($current_li === false) { - $current_li = new HTMLPurifier_Node_Element('li'); - $result[] = $current_li; - } - $current_li->children[] = $node; - $current_li->empty = false; // XXX fascinating! Check for this error elsewhere ToDo - } - } - if (empty($result)) { - return false; - } - if ($all_whitespace) { - return false; - } - return $result; - } -} - -// vim: et sw=4 sts=4 + true, 'ul' => true, 'ol' => true); + + /** + * @param array $children + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return array + */ + public function validateChildren($children, $config, $context) + { + // Flag for subclasses + $this->whitespace = false; + + // if there are no tokens, delete parent node + if (empty($children)) { + return false; + } + + // the new set of children + $result = array(); + + // a little sanity check to make sure it's not ALL whitespace + $all_whitespace = true; + + $current_li = false; + + foreach ($children as $node) { + if (!empty($node->is_whitespace)) { + $result[] = $node; + continue; + } + $all_whitespace = false; // phew, we're not talking about whitespace + + if ($node->name === 'li') { + // good + $current_li = $node; + $result[] = $node; + } else { + // we want to tuck this into the previous li + // Invariant: we expect the node to be ol/ul + // ToDo: Make this more robust in the case of not ol/ul + // by distinguishing between existing li and li created + // to handle non-list elements; non-list elements should + // not be appended to an existing li; only li created + // for non-list. This distinction is not currently made. + if ($current_li === false) { + $current_li = new HTMLPurifier_Node_Element('li'); + $result[] = $current_li; + } + $current_li->children[] = $node; + $current_li->empty = false; // XXX fascinating! Check for this error elsewhere ToDo + } + } + if (empty($result)) { + return false; + } + if ($all_whitespace) { + return false; + } + return $result; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ChildDef/Optional.php b/thirdparty/HTMLPurifier/HTMLPurifier/ChildDef/Optional.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ChildDef/Optional.php rename to thirdparty/HTMLPurifier/HTMLPurifier/ChildDef/Optional.php index 1db864d90..b9468063b 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ChildDef/Optional.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ChildDef/Optional.php @@ -1,45 +1,45 @@ -whitespace) { - return $children; - } else { - return array(); - } - } - return $result; - } -} - -// vim: et sw=4 sts=4 +whitespace) { + return $children; + } else { + return array(); + } + } + return $result; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ChildDef/Required.php b/thirdparty/HTMLPurifier/HTMLPurifier/ChildDef/Required.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ChildDef/Required.php rename to thirdparty/HTMLPurifier/HTMLPurifier/ChildDef/Required.php index f6b8e8a2f..0d1c8f5f3 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ChildDef/Required.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ChildDef/Required.php @@ -1,118 +1,118 @@ - $x) { - $elements[$i] = true; - if (empty($i)) { - unset($elements[$i]); - } // remove blank - } - } - $this->elements = $elements; - } - - /** - * @type bool - */ - public $allow_empty = false; - - /** - * @type string - */ - public $type = 'required'; - - /** - * @param array $children - * @param HTMLPurifier_Config $config - * @param HTMLPurifier_Context $context - * @return array - */ - public function validateChildren($children, $config, $context) - { - // Flag for subclasses - $this->whitespace = false; - - // if there are no tokens, delete parent node - if (empty($children)) { - return false; - } - - // the new set of children - $result = array(); - - // whether or not parsed character data is allowed - // this controls whether or not we silently drop a tag - // or generate escaped HTML from it - $pcdata_allowed = isset($this->elements['#PCDATA']); - - // a little sanity check to make sure it's not ALL whitespace - $all_whitespace = true; - - $stack = array_reverse($children); - while (!empty($stack)) { - $node = array_pop($stack); - if (!empty($node->is_whitespace)) { - $result[] = $node; - continue; - } - $all_whitespace = false; // phew, we're not talking about whitespace - - if (!isset($this->elements[$node->name])) { - // special case text - // XXX One of these ought to be redundant or something - if ($pcdata_allowed && $node instanceof HTMLPurifier_Node_Text) { - $result[] = $node; - continue; - } - // spill the child contents in - // ToDo: Make configurable - if ($node instanceof HTMLPurifier_Node_Element) { - for ($i = count($node->children) - 1; $i >= 0; $i--) { - $stack[] = $node->children[$i]; - } - continue; - } - continue; - } - $result[] = $node; - } - if (empty($result)) { - return false; - } - if ($all_whitespace) { - $this->whitespace = true; - return false; - } - return $result; - } -} - -// vim: et sw=4 sts=4 + $x) { + $elements[$i] = true; + if (empty($i)) { + unset($elements[$i]); + } // remove blank + } + } + $this->elements = $elements; + } + + /** + * @type bool + */ + public $allow_empty = false; + + /** + * @type string + */ + public $type = 'required'; + + /** + * @param array $children + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return array + */ + public function validateChildren($children, $config, $context) + { + // Flag for subclasses + $this->whitespace = false; + + // if there are no tokens, delete parent node + if (empty($children)) { + return false; + } + + // the new set of children + $result = array(); + + // whether or not parsed character data is allowed + // this controls whether or not we silently drop a tag + // or generate escaped HTML from it + $pcdata_allowed = isset($this->elements['#PCDATA']); + + // a little sanity check to make sure it's not ALL whitespace + $all_whitespace = true; + + $stack = array_reverse($children); + while (!empty($stack)) { + $node = array_pop($stack); + if (!empty($node->is_whitespace)) { + $result[] = $node; + continue; + } + $all_whitespace = false; // phew, we're not talking about whitespace + + if (!isset($this->elements[$node->name])) { + // special case text + // XXX One of these ought to be redundant or something + if ($pcdata_allowed && $node instanceof HTMLPurifier_Node_Text) { + $result[] = $node; + continue; + } + // spill the child contents in + // ToDo: Make configurable + if ($node instanceof HTMLPurifier_Node_Element) { + for ($i = count($node->children) - 1; $i >= 0; $i--) { + $stack[] = $node->children[$i]; + } + continue; + } + continue; + } + $result[] = $node; + } + if (empty($result)) { + return false; + } + if ($all_whitespace) { + $this->whitespace = true; + return false; + } + return $result; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ChildDef/StrictBlockquote.php b/thirdparty/HTMLPurifier/HTMLPurifier/ChildDef/StrictBlockquote.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ChildDef/StrictBlockquote.php rename to thirdparty/HTMLPurifier/HTMLPurifier/ChildDef/StrictBlockquote.php index 38bf9533e..3270a46e1 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ChildDef/StrictBlockquote.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ChildDef/StrictBlockquote.php @@ -1,110 +1,110 @@ -init($config); - return $this->fake_elements; - } - - /** - * @param array $children - * @param HTMLPurifier_Config $config - * @param HTMLPurifier_Context $context - * @return array - */ - public function validateChildren($children, $config, $context) - { - $this->init($config); - - // trick the parent class into thinking it allows more - $this->elements = $this->fake_elements; - $result = parent::validateChildren($children, $config, $context); - $this->elements = $this->real_elements; - - if ($result === false) { - return array(); - } - if ($result === true) { - $result = $children; - } - - $def = $config->getHTMLDefinition(); - $block_wrap_name = $def->info_block_wrapper; - $block_wrap = false; - $ret = array(); - - foreach ($result as $node) { - if ($block_wrap === false) { - if (($node instanceof HTMLPurifier_Node_Text && !$node->is_whitespace) || - ($node instanceof HTMLPurifier_Node_Element && !isset($this->elements[$node->name]))) { - $block_wrap = new HTMLPurifier_Node_Element($def->info_block_wrapper); - $ret[] = $block_wrap; - } - } else { - if ($node instanceof HTMLPurifier_Node_Element && isset($this->elements[$node->name])) { - $block_wrap = false; - - } - } - if ($block_wrap) { - $block_wrap->children[] = $node; - } else { - $ret[] = $node; - } - } - return $ret; - } - - /** - * @param HTMLPurifier_Config $config - */ - private function init($config) - { - if (!$this->init) { - $def = $config->getHTMLDefinition(); - // allow all inline elements - $this->real_elements = $this->elements; - $this->fake_elements = $def->info_content_sets['Flow']; - $this->fake_elements['#PCDATA'] = true; - $this->init = true; - } - } -} - -// vim: et sw=4 sts=4 +init($config); + return $this->fake_elements; + } + + /** + * @param array $children + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return array + */ + public function validateChildren($children, $config, $context) + { + $this->init($config); + + // trick the parent class into thinking it allows more + $this->elements = $this->fake_elements; + $result = parent::validateChildren($children, $config, $context); + $this->elements = $this->real_elements; + + if ($result === false) { + return array(); + } + if ($result === true) { + $result = $children; + } + + $def = $config->getHTMLDefinition(); + $block_wrap_name = $def->info_block_wrapper; + $block_wrap = false; + $ret = array(); + + foreach ($result as $node) { + if ($block_wrap === false) { + if (($node instanceof HTMLPurifier_Node_Text && !$node->is_whitespace) || + ($node instanceof HTMLPurifier_Node_Element && !isset($this->elements[$node->name]))) { + $block_wrap = new HTMLPurifier_Node_Element($def->info_block_wrapper); + $ret[] = $block_wrap; + } + } else { + if ($node instanceof HTMLPurifier_Node_Element && isset($this->elements[$node->name])) { + $block_wrap = false; + + } + } + if ($block_wrap) { + $block_wrap->children[] = $node; + } else { + $ret[] = $node; + } + } + return $ret; + } + + /** + * @param HTMLPurifier_Config $config + */ + private function init($config) + { + if (!$this->init) { + $def = $config->getHTMLDefinition(); + // allow all inline elements + $this->real_elements = $this->elements; + $this->fake_elements = $def->info_content_sets['Flow']; + $this->fake_elements['#PCDATA'] = true; + $this->init = true; + } + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ChildDef/Table.php b/thirdparty/HTMLPurifier/HTMLPurifier/ChildDef/Table.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ChildDef/Table.php rename to thirdparty/HTMLPurifier/HTMLPurifier/ChildDef/Table.php index 0570c8b8d..3e4a0f218 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ChildDef/Table.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ChildDef/Table.php @@ -1,224 +1,224 @@ - true, - 'tbody' => true, - 'thead' => true, - 'tfoot' => true, - 'caption' => true, - 'colgroup' => true, - 'col' => true - ); - - public function __construct() - { - } - - /** - * @param array $children - * @param HTMLPurifier_Config $config - * @param HTMLPurifier_Context $context - * @return array - */ - public function validateChildren($children, $config, $context) - { - if (empty($children)) { - return false; - } - - // only one of these elements is allowed in a table - $caption = false; - $thead = false; - $tfoot = false; - - // whitespace - $initial_ws = array(); - $after_caption_ws = array(); - $after_thead_ws = array(); - $after_tfoot_ws = array(); - - // as many of these as you want - $cols = array(); - $content = array(); - - $tbody_mode = false; // if true, then we need to wrap any stray - // s with a . - - $ws_accum =& $initial_ws; - - foreach ($children as $node) { - if ($node instanceof HTMLPurifier_Node_Comment) { - $ws_accum[] = $node; - continue; - } - switch ($node->name) { - case 'tbody': - $tbody_mode = true; - // fall through - case 'tr': - $content[] = $node; - $ws_accum =& $content; - break; - case 'caption': - // there can only be one caption! - if ($caption !== false) break; - $caption = $node; - $ws_accum =& $after_caption_ws; - break; - case 'thead': - $tbody_mode = true; - // XXX This breaks rendering properties with - // Firefox, which never floats a to - // the top. Ever. (Our scheme will float the - // first to the top.) So maybe - // s that are not first should be - // turned into ? Very tricky, indeed. - if ($thead === false) { - $thead = $node; - $ws_accum =& $after_thead_ws; - } else { - // Oops, there's a second one! What - // should we do? Current behavior is to - // transmutate the first and last entries into - // tbody tags, and then put into content. - // Maybe a better idea is to *attach - // it* to the existing thead or tfoot? - // We don't do this, because Firefox - // doesn't float an extra tfoot to the - // bottom like it does for the first one. - $node->name = 'tbody'; - $content[] = $node; - $ws_accum =& $content; - } - break; - case 'tfoot': - // see above for some aveats - $tbody_mode = true; - if ($tfoot === false) { - $tfoot = $node; - $ws_accum =& $after_tfoot_ws; - } else { - $node->name = 'tbody'; - $content[] = $node; - $ws_accum =& $content; - } - break; - case 'colgroup': - case 'col': - $cols[] = $node; - $ws_accum =& $cols; - break; - case '#PCDATA': - // How is whitespace handled? We treat is as sticky to - // the *end* of the previous element. So all of the - // nonsense we have worked on is to keep things - // together. - if (!empty($node->is_whitespace)) { - $ws_accum[] = $node; - } - break; - } - } - - if (empty($content)) { - return false; - } - - $ret = $initial_ws; - if ($caption !== false) { - $ret[] = $caption; - $ret = array_merge($ret, $after_caption_ws); - } - if ($cols !== false) { - $ret = array_merge($ret, $cols); - } - if ($thead !== false) { - $ret[] = $thead; - $ret = array_merge($ret, $after_thead_ws); - } - if ($tfoot !== false) { - $ret[] = $tfoot; - $ret = array_merge($ret, $after_tfoot_ws); - } - - if ($tbody_mode) { - // we have to shuffle tr into tbody - $current_tr_tbody = null; - - foreach($content as $node) { - switch ($node->name) { - case 'tbody': - $current_tr_tbody = null; - $ret[] = $node; - break; - case 'tr': - if ($current_tr_tbody === null) { - $current_tr_tbody = new HTMLPurifier_Node_Element('tbody'); - $ret[] = $current_tr_tbody; - } - $current_tr_tbody->children[] = $node; - break; - case '#PCDATA': - assert($node->is_whitespace); - if ($current_tr_tbody === null) { - $ret[] = $node; - } else { - $current_tr_tbody->children[] = $node; - } - break; - } - } - } else { - $ret = array_merge($ret, $content); - } - - return $ret; - - } -} - -// vim: et sw=4 sts=4 + true, + 'tbody' => true, + 'thead' => true, + 'tfoot' => true, + 'caption' => true, + 'colgroup' => true, + 'col' => true + ); + + public function __construct() + { + } + + /** + * @param array $children + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return array + */ + public function validateChildren($children, $config, $context) + { + if (empty($children)) { + return false; + } + + // only one of these elements is allowed in a table + $caption = false; + $thead = false; + $tfoot = false; + + // whitespace + $initial_ws = array(); + $after_caption_ws = array(); + $after_thead_ws = array(); + $after_tfoot_ws = array(); + + // as many of these as you want + $cols = array(); + $content = array(); + + $tbody_mode = false; // if true, then we need to wrap any stray + // s with a . + + $ws_accum =& $initial_ws; + + foreach ($children as $node) { + if ($node instanceof HTMLPurifier_Node_Comment) { + $ws_accum[] = $node; + continue; + } + switch ($node->name) { + case 'tbody': + $tbody_mode = true; + // fall through + case 'tr': + $content[] = $node; + $ws_accum =& $content; + break; + case 'caption': + // there can only be one caption! + if ($caption !== false) break; + $caption = $node; + $ws_accum =& $after_caption_ws; + break; + case 'thead': + $tbody_mode = true; + // XXX This breaks rendering properties with + // Firefox, which never floats a to + // the top. Ever. (Our scheme will float the + // first to the top.) So maybe + // s that are not first should be + // turned into ? Very tricky, indeed. + if ($thead === false) { + $thead = $node; + $ws_accum =& $after_thead_ws; + } else { + // Oops, there's a second one! What + // should we do? Current behavior is to + // transmutate the first and last entries into + // tbody tags, and then put into content. + // Maybe a better idea is to *attach + // it* to the existing thead or tfoot? + // We don't do this, because Firefox + // doesn't float an extra tfoot to the + // bottom like it does for the first one. + $node->name = 'tbody'; + $content[] = $node; + $ws_accum =& $content; + } + break; + case 'tfoot': + // see above for some aveats + $tbody_mode = true; + if ($tfoot === false) { + $tfoot = $node; + $ws_accum =& $after_tfoot_ws; + } else { + $node->name = 'tbody'; + $content[] = $node; + $ws_accum =& $content; + } + break; + case 'colgroup': + case 'col': + $cols[] = $node; + $ws_accum =& $cols; + break; + case '#PCDATA': + // How is whitespace handled? We treat is as sticky to + // the *end* of the previous element. So all of the + // nonsense we have worked on is to keep things + // together. + if (!empty($node->is_whitespace)) { + $ws_accum[] = $node; + } + break; + } + } + + if (empty($content)) { + return false; + } + + $ret = $initial_ws; + if ($caption !== false) { + $ret[] = $caption; + $ret = array_merge($ret, $after_caption_ws); + } + if ($cols !== false) { + $ret = array_merge($ret, $cols); + } + if ($thead !== false) { + $ret[] = $thead; + $ret = array_merge($ret, $after_thead_ws); + } + if ($tfoot !== false) { + $ret[] = $tfoot; + $ret = array_merge($ret, $after_tfoot_ws); + } + + if ($tbody_mode) { + // we have to shuffle tr into tbody + $current_tr_tbody = null; + + foreach($content as $node) { + switch ($node->name) { + case 'tbody': + $current_tr_tbody = null; + $ret[] = $node; + break; + case 'tr': + if ($current_tr_tbody === null) { + $current_tr_tbody = new HTMLPurifier_Node_Element('tbody'); + $ret[] = $current_tr_tbody; + } + $current_tr_tbody->children[] = $node; + break; + case '#PCDATA': + assert($node->is_whitespace); + if ($current_tr_tbody === null) { + $ret[] = $node; + } else { + $current_tr_tbody->children[] = $node; + } + break; + } + } + } else { + $ret = array_merge($ret, $content); + } + + return $ret; + + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Config.php b/thirdparty/HTMLPurifier/HTMLPurifier/Config.php similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Config.php rename to thirdparty/HTMLPurifier/HTMLPurifier/Config.php index a0ef546ca..7ada59b94 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Config.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/Config.php @@ -1,911 +1,911 @@ -defaultPlist; - $this->plist = new HTMLPurifier_PropertyList($parent); - $this->def = $definition; // keep a copy around for checking - $this->parser = new HTMLPurifier_VarParser_Flexible(); - } - - /** - * Convenience constructor that creates a config object based on a mixed var - * @param mixed $config Variable that defines the state of the config - * object. Can be: a HTMLPurifier_Config() object, - * an array of directives based on loadArray(), - * or a string filename of an ini file. - * @param HTMLPurifier_ConfigSchema $schema Schema object - * @return HTMLPurifier_Config Configured object - */ - public static function create($config, $schema = null) - { - if ($config instanceof HTMLPurifier_Config) { - // pass-through - return $config; - } - if (!$schema) { - $ret = HTMLPurifier_Config::createDefault(); - } else { - $ret = new HTMLPurifier_Config($schema); - } - if (is_string($config)) { - $ret->loadIni($config); - } elseif (is_array($config)) $ret->loadArray($config); - return $ret; - } - - /** - * Creates a new config object that inherits from a previous one. - * @param HTMLPurifier_Config $config Configuration object to inherit from. - * @return HTMLPurifier_Config object with $config as its parent. - */ - public static function inherit(HTMLPurifier_Config $config) - { - return new HTMLPurifier_Config($config->def, $config->plist); - } - - /** - * Convenience constructor that creates a default configuration object. - * @return HTMLPurifier_Config default object. - */ - public static function createDefault() - { - $definition = HTMLPurifier_ConfigSchema::instance(); - $config = new HTMLPurifier_Config($definition); - return $config; - } - - /** - * Retrieves a value from the configuration. - * - * @param string $key String key - * @param mixed $a - * - * @return mixed - */ - public function get($key, $a = null) - { - if ($a !== null) { - $this->triggerError( - "Using deprecated API: use \$config->get('$key.$a') instead", - E_USER_WARNING - ); - $key = "$key.$a"; - } - if (!$this->finalized) { - $this->autoFinalize(); - } - if (!isset($this->def->info[$key])) { - // can't add % due to SimpleTest bug - $this->triggerError( - 'Cannot retrieve value of undefined directive ' . htmlspecialchars($key), - E_USER_WARNING - ); - return; - } - if (isset($this->def->info[$key]->isAlias)) { - $d = $this->def->info[$key]; - $this->triggerError( - 'Cannot get value from aliased directive, use real name ' . $d->key, - E_USER_ERROR - ); - return; - } - if ($this->lock) { - list($ns) = explode('.', $key); - if ($ns !== $this->lock) { - $this->triggerError( - 'Cannot get value of namespace ' . $ns . ' when lock for ' . - $this->lock . - ' is active, this probably indicates a Definition setup method ' . - 'is accessing directives that are not within its namespace', - E_USER_ERROR - ); - return; - } - } - return $this->plist->get($key); - } - - /** - * Retrieves an array of directives to values from a given namespace - * - * @param string $namespace String namespace - * - * @return array - */ - public function getBatch($namespace) - { - if (!$this->finalized) { - $this->autoFinalize(); - } - $full = $this->getAll(); - if (!isset($full[$namespace])) { - $this->triggerError( - 'Cannot retrieve undefined namespace ' . - htmlspecialchars($namespace), - E_USER_WARNING - ); - return; - } - return $full[$namespace]; - } - - /** - * Returns a SHA-1 signature of a segment of the configuration object - * that uniquely identifies that particular configuration - * - * @param string $namespace Namespace to get serial for - * - * @return string - * @note Revision is handled specially and is removed from the batch - * before processing! - */ - public function getBatchSerial($namespace) - { - if (empty($this->serials[$namespace])) { - $batch = $this->getBatch($namespace); - unset($batch['DefinitionRev']); - $this->serials[$namespace] = sha1(serialize($batch)); - } - return $this->serials[$namespace]; - } - - /** - * Returns a SHA-1 signature for the entire configuration object - * that uniquely identifies that particular configuration - * - * @return string - */ - public function getSerial() - { - if (empty($this->serial)) { - $this->serial = sha1(serialize($this->getAll())); - } - return $this->serial; - } - - /** - * Retrieves all directives, organized by namespace - * - * @warning This is a pretty inefficient function, avoid if you can - */ - public function getAll() - { - if (!$this->finalized) { - $this->autoFinalize(); - } - $ret = array(); - foreach ($this->plist->squash() as $name => $value) { - list($ns, $key) = explode('.', $name, 2); - $ret[$ns][$key] = $value; - } - return $ret; - } - - /** - * Sets a value to configuration. - * - * @param string $key key - * @param mixed $value value - * @param mixed $a - */ - public function set($key, $value, $a = null) - { - if (strpos($key, '.') === false) { - $namespace = $key; - $directive = $value; - $value = $a; - $key = "$key.$directive"; - $this->triggerError("Using deprecated API: use \$config->set('$key', ...) instead", E_USER_NOTICE); - } else { - list($namespace) = explode('.', $key); - } - if ($this->isFinalized('Cannot set directive after finalization')) { - return; - } - if (!isset($this->def->info[$key])) { - $this->triggerError( - 'Cannot set undefined directive ' . htmlspecialchars($key) . ' to value', - E_USER_WARNING - ); - return; - } - $def = $this->def->info[$key]; - - if (isset($def->isAlias)) { - if ($this->aliasMode) { - $this->triggerError( - 'Double-aliases not allowed, please fix '. - 'ConfigSchema bug with' . $key, - E_USER_ERROR - ); - return; - } - $this->aliasMode = true; - $this->set($def->key, $value); - $this->aliasMode = false; - $this->triggerError("$key is an alias, preferred directive name is {$def->key}", E_USER_NOTICE); - return; - } - - // Raw type might be negative when using the fully optimized form - // of stdclass, which indicates allow_null == true - $rtype = is_int($def) ? $def : $def->type; - if ($rtype < 0) { - $type = -$rtype; - $allow_null = true; - } else { - $type = $rtype; - $allow_null = isset($def->allow_null); - } - - try { - $value = $this->parser->parse($value, $type, $allow_null); - } catch (HTMLPurifier_VarParserException $e) { - $this->triggerError( - 'Value for ' . $key . ' is of invalid type, should be ' . - HTMLPurifier_VarParser::getTypeName($type), - E_USER_WARNING - ); - return; - } - if (is_string($value) && is_object($def)) { - // resolve value alias if defined - if (isset($def->aliases[$value])) { - $value = $def->aliases[$value]; - } - // check to see if the value is allowed - if (isset($def->allowed) && !isset($def->allowed[$value])) { - $this->triggerError( - 'Value not supported, valid values are: ' . - $this->_listify($def->allowed), - E_USER_WARNING - ); - return; - } - } - $this->plist->set($key, $value); - - // reset definitions if the directives they depend on changed - // this is a very costly process, so it's discouraged - // with finalization - if ($namespace == 'HTML' || $namespace == 'CSS' || $namespace == 'URI') { - $this->definitions[$namespace] = null; - } - - $this->serials[$namespace] = false; - } - - /** - * Convenience function for error reporting - * - * @param array $lookup - * - * @return string - */ - private function _listify($lookup) - { - $list = array(); - foreach ($lookup as $name => $b) { - $list[] = $name; - } - return implode(', ', $list); - } - - /** - * Retrieves object reference to the HTML definition. - * - * @param bool $raw Return a copy that has not been setup yet. Must be - * called before it's been setup, otherwise won't work. - * @param bool $optimized If true, this method may return null, to - * indicate that a cached version of the modified - * definition object is available and no further edits - * are necessary. Consider using - * maybeGetRawHTMLDefinition, which is more explicitly - * named, instead. - * - * @return HTMLPurifier_HTMLDefinition - */ - public function getHTMLDefinition($raw = false, $optimized = false) - { - return $this->getDefinition('HTML', $raw, $optimized); - } - - /** - * Retrieves object reference to the CSS definition - * - * @param bool $raw Return a copy that has not been setup yet. Must be - * called before it's been setup, otherwise won't work. - * @param bool $optimized If true, this method may return null, to - * indicate that a cached version of the modified - * definition object is available and no further edits - * are necessary. Consider using - * maybeGetRawCSSDefinition, which is more explicitly - * named, instead. - * - * @return HTMLPurifier_CSSDefinition - */ - public function getCSSDefinition($raw = false, $optimized = false) - { - return $this->getDefinition('CSS', $raw, $optimized); - } - - /** - * Retrieves object reference to the URI definition - * - * @param bool $raw Return a copy that has not been setup yet. Must be - * called before it's been setup, otherwise won't work. - * @param bool $optimized If true, this method may return null, to - * indicate that a cached version of the modified - * definition object is available and no further edits - * are necessary. Consider using - * maybeGetRawURIDefinition, which is more explicitly - * named, instead. - * - * @return HTMLPurifier_URIDefinition - */ - public function getURIDefinition($raw = false, $optimized = false) - { - return $this->getDefinition('URI', $raw, $optimized); - } - - /** - * Retrieves a definition - * - * @param string $type Type of definition: HTML, CSS, etc - * @param bool $raw Whether or not definition should be returned raw - * @param bool $optimized Only has an effect when $raw is true. Whether - * or not to return null if the result is already present in - * the cache. This is off by default for backwards - * compatibility reasons, but you need to do things this - * way in order to ensure that caching is done properly. - * Check out enduser-customize.html for more details. - * We probably won't ever change this default, as much as the - * maybe semantics is the "right thing to do." - * - * @throws HTMLPurifier_Exception - * @return HTMLPurifier_Definition - */ - public function getDefinition($type, $raw = false, $optimized = false) - { - if ($optimized && !$raw) { - throw new HTMLPurifier_Exception("Cannot set optimized = true when raw = false"); - } - if (!$this->finalized) { - $this->autoFinalize(); - } - // temporarily suspend locks, so we can handle recursive definition calls - $lock = $this->lock; - $this->lock = null; - $factory = HTMLPurifier_DefinitionCacheFactory::instance(); - $cache = $factory->create($type, $this); - $this->lock = $lock; - if (!$raw) { - // full definition - // --------------- - // check if definition is in memory - if (!empty($this->definitions[$type])) { - $def = $this->definitions[$type]; - // check if the definition is setup - if ($def->setup) { - return $def; - } else { - $def->setup($this); - if ($def->optimized) { - $cache->add($def, $this); - } - return $def; - } - } - // check if definition is in cache - $def = $cache->get($this); - if ($def) { - // definition in cache, save to memory and return it - $this->definitions[$type] = $def; - return $def; - } - // initialize it - $def = $this->initDefinition($type); - // set it up - $this->lock = $type; - $def->setup($this); - $this->lock = null; - // save in cache - $cache->add($def, $this); - // return it - return $def; - } else { - // raw definition - // -------------- - // check preconditions - $def = null; - if ($optimized) { - if (is_null($this->get($type . '.DefinitionID'))) { - // fatally error out if definition ID not set - throw new HTMLPurifier_Exception( - "Cannot retrieve raw version without specifying %$type.DefinitionID" - ); - } - } - if (!empty($this->definitions[$type])) { - $def = $this->definitions[$type]; - if ($def->setup && !$optimized) { - $extra = $this->chatty ? - " (try moving this code block earlier in your initialization)" : - ""; - throw new HTMLPurifier_Exception( - "Cannot retrieve raw definition after it has already been setup" . - $extra - ); - } - if ($def->optimized === null) { - $extra = $this->chatty ? " (try flushing your cache)" : ""; - throw new HTMLPurifier_Exception( - "Optimization status of definition is unknown" . $extra - ); - } - if ($def->optimized !== $optimized) { - $msg = $optimized ? "optimized" : "unoptimized"; - $extra = $this->chatty ? - " (this backtrace is for the first inconsistent call, which was for a $msg raw definition)" - : ""; - throw new HTMLPurifier_Exception( - "Inconsistent use of optimized and unoptimized raw definition retrievals" . $extra - ); - } - } - // check if definition was in memory - if ($def) { - if ($def->setup) { - // invariant: $optimized === true (checked above) - return null; - } else { - return $def; - } - } - // if optimized, check if definition was in cache - // (because we do the memory check first, this formulation - // is prone to cache slamming, but I think - // guaranteeing that either /all/ of the raw - // setup code or /none/ of it is run is more important.) - if ($optimized) { - // This code path only gets run once; once we put - // something in $definitions (which is guaranteed by the - // trailing code), we always short-circuit above. - $def = $cache->get($this); - if ($def) { - // save the full definition for later, but don't - // return it yet - $this->definitions[$type] = $def; - return null; - } - } - // check invariants for creation - if (!$optimized) { - if (!is_null($this->get($type . '.DefinitionID'))) { - if ($this->chatty) { - $this->triggerError( - 'Due to a documentation error in previous version of HTML Purifier, your ' . - 'definitions are not being cached. If this is OK, you can remove the ' . - '%$type.DefinitionRev and %$type.DefinitionID declaration. Otherwise, ' . - 'modify your code to use maybeGetRawDefinition, and test if the returned ' . - 'value is null before making any edits (if it is null, that means that a ' . - 'cached version is available, and no raw operations are necessary). See ' . - '' . - 'Customize for more details', - E_USER_WARNING - ); - } else { - $this->triggerError( - "Useless DefinitionID declaration", - E_USER_WARNING - ); - } - } - } - // initialize it - $def = $this->initDefinition($type); - $def->optimized = $optimized; - return $def; - } - throw new HTMLPurifier_Exception("The impossible happened!"); - } - - /** - * Initialise definition - * - * @param string $type What type of definition to create - * - * @return HTMLPurifier_CSSDefinition|HTMLPurifier_HTMLDefinition|HTMLPurifier_URIDefinition - * @throws HTMLPurifier_Exception - */ - private function initDefinition($type) - { - // quick checks failed, let's create the object - if ($type == 'HTML') { - $def = new HTMLPurifier_HTMLDefinition(); - } elseif ($type == 'CSS') { - $def = new HTMLPurifier_CSSDefinition(); - } elseif ($type == 'URI') { - $def = new HTMLPurifier_URIDefinition(); - } else { - throw new HTMLPurifier_Exception( - "Definition of $type type not supported" - ); - } - $this->definitions[$type] = $def; - return $def; - } - - public function maybeGetRawDefinition($name) - { - return $this->getDefinition($name, true, true); - } - - public function maybeGetRawHTMLDefinition() - { - return $this->getDefinition('HTML', true, true); - } - - public function maybeGetRawCSSDefinition() - { - return $this->getDefinition('CSS', true, true); - } - - public function maybeGetRawURIDefinition() - { - return $this->getDefinition('URI', true, true); - } - - /** - * Loads configuration values from an array with the following structure: - * Namespace.Directive => Value - * - * @param array $config_array Configuration associative array - */ - public function loadArray($config_array) - { - if ($this->isFinalized('Cannot load directives after finalization')) { - return; - } - foreach ($config_array as $key => $value) { - $key = str_replace('_', '.', $key); - if (strpos($key, '.') !== false) { - $this->set($key, $value); - } else { - $namespace = $key; - $namespace_values = $value; - foreach ($namespace_values as $directive => $value2) { - $this->set($namespace .'.'. $directive, $value2); - } - } - } - } - - /** - * Returns a list of array(namespace, directive) for all directives - * that are allowed in a web-form context as per an allowed - * namespaces/directives list. - * - * @param array $allowed List of allowed namespaces/directives - * @param HTMLPurifier_ConfigSchema $schema Schema to use, if not global copy - * - * @return array - */ - public static function getAllowedDirectivesForForm($allowed, $schema = null) - { - if (!$schema) { - $schema = HTMLPurifier_ConfigSchema::instance(); - } - if ($allowed !== true) { - if (is_string($allowed)) { - $allowed = array($allowed); - } - $allowed_ns = array(); - $allowed_directives = array(); - $blacklisted_directives = array(); - foreach ($allowed as $ns_or_directive) { - if (strpos($ns_or_directive, '.') !== false) { - // directive - if ($ns_or_directive[0] == '-') { - $blacklisted_directives[substr($ns_or_directive, 1)] = true; - } else { - $allowed_directives[$ns_or_directive] = true; - } - } else { - // namespace - $allowed_ns[$ns_or_directive] = true; - } - } - } - $ret = array(); - foreach ($schema->info as $key => $def) { - list($ns, $directive) = explode('.', $key, 2); - if ($allowed !== true) { - if (isset($blacklisted_directives["$ns.$directive"])) { - continue; - } - if (!isset($allowed_directives["$ns.$directive"]) && !isset($allowed_ns[$ns])) { - continue; - } - } - if (isset($def->isAlias)) { - continue; - } - if ($directive == 'DefinitionID' || $directive == 'DefinitionRev') { - continue; - } - $ret[] = array($ns, $directive); - } - return $ret; - } - - /** - * Loads configuration values from $_GET/$_POST that were posted - * via ConfigForm - * - * @param array $array $_GET or $_POST array to import - * @param string|bool $index Index/name that the config variables are in - * @param array|bool $allowed List of allowed namespaces/directives - * @param bool $mq_fix Boolean whether or not to enable magic quotes fix - * @param HTMLPurifier_ConfigSchema $schema Schema to use, if not global copy - * - * @return mixed - */ - public static function loadArrayFromForm($array, $index = false, $allowed = true, $mq_fix = true, $schema = null) - { - $ret = HTMLPurifier_Config::prepareArrayFromForm($array, $index, $allowed, $mq_fix, $schema); - $config = HTMLPurifier_Config::create($ret, $schema); - return $config; - } - - /** - * Merges in configuration values from $_GET/$_POST to object. NOT STATIC. - * - * @param array $array $_GET or $_POST array to import - * @param string|bool $index Index/name that the config variables are in - * @param array|bool $allowed List of allowed namespaces/directives - * @param bool $mq_fix Boolean whether or not to enable magic quotes fix - */ - public function mergeArrayFromForm($array, $index = false, $allowed = true, $mq_fix = true) - { - $ret = HTMLPurifier_Config::prepareArrayFromForm($array, $index, $allowed, $mq_fix, $this->def); - $this->loadArray($ret); - } - - /** - * Prepares an array from a form into something usable for the more - * strict parts of HTMLPurifier_Config - * - * @param array $array $_GET or $_POST array to import - * @param string|bool $index Index/name that the config variables are in - * @param array|bool $allowed List of allowed namespaces/directives - * @param bool $mq_fix Boolean whether or not to enable magic quotes fix - * @param HTMLPurifier_ConfigSchema $schema Schema to use, if not global copy - * - * @return array - */ - public static function prepareArrayFromForm($array, $index = false, $allowed = true, $mq_fix = true, $schema = null) - { - if ($index !== false) { - $array = (isset($array[$index]) && is_array($array[$index])) ? $array[$index] : array(); - } - $mq = $mq_fix && function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc(); - - $allowed = HTMLPurifier_Config::getAllowedDirectivesForForm($allowed, $schema); - $ret = array(); - foreach ($allowed as $key) { - list($ns, $directive) = $key; - $skey = "$ns.$directive"; - if (!empty($array["Null_$skey"])) { - $ret[$ns][$directive] = null; - continue; - } - if (!isset($array[$skey])) { - continue; - } - $value = $mq ? stripslashes($array[$skey]) : $array[$skey]; - $ret[$ns][$directive] = $value; - } - return $ret; - } - - /** - * Loads configuration values from an ini file - * - * @param string $filename Name of ini file - */ - public function loadIni($filename) - { - if ($this->isFinalized('Cannot load directives after finalization')) { - return; - } - $array = parse_ini_file($filename, true); - $this->loadArray($array); - } - - /** - * Checks whether or not the configuration object is finalized. - * - * @param string|bool $error String error message, or false for no error - * - * @return bool - */ - public function isFinalized($error = false) - { - if ($this->finalized && $error) { - $this->triggerError($error, E_USER_ERROR); - } - return $this->finalized; - } - - /** - * Finalizes configuration only if auto finalize is on and not - * already finalized - */ - public function autoFinalize() - { - if ($this->autoFinalize) { - $this->finalize(); - } else { - $this->plist->squash(true); - } - } - - /** - * Finalizes a configuration object, prohibiting further change - */ - public function finalize() - { - $this->finalized = true; - $this->parser = null; - } - - /** - * Produces a nicely formatted error message by supplying the - * stack frame information OUTSIDE of HTMLPurifier_Config. - * - * @param string $msg An error message - * @param int $no An error number - */ - protected function triggerError($msg, $no) - { - // determine previous stack frame - $extra = ''; - if ($this->chatty) { - $trace = debug_backtrace(); - // zip(tail(trace), trace) -- but PHP is not Haskell har har - for ($i = 0, $c = count($trace); $i < $c - 1; $i++) { - // XXX this is not correct on some versions of HTML Purifier - if ($trace[$i + 1]['class'] === 'HTMLPurifier_Config') { - continue; - } - $frame = $trace[$i]; - $extra = " invoked on line {$frame['line']} in file {$frame['file']}"; - break; - } - } - trigger_error($msg . $extra, $no); - } - - /** - * Returns a serialized form of the configuration object that can - * be reconstituted. - * - * @return string - */ - public function serialize() - { - $this->getDefinition('HTML'); - $this->getDefinition('CSS'); - $this->getDefinition('URI'); - return serialize($this); - } - -} - -// vim: et sw=4 sts=4 +defaultPlist; + $this->plist = new HTMLPurifier_PropertyList($parent); + $this->def = $definition; // keep a copy around for checking + $this->parser = new HTMLPurifier_VarParser_Flexible(); + } + + /** + * Convenience constructor that creates a config object based on a mixed var + * @param mixed $config Variable that defines the state of the config + * object. Can be: a HTMLPurifier_Config() object, + * an array of directives based on loadArray(), + * or a string filename of an ini file. + * @param HTMLPurifier_ConfigSchema $schema Schema object + * @return HTMLPurifier_Config Configured object + */ + public static function create($config, $schema = null) + { + if ($config instanceof HTMLPurifier_Config) { + // pass-through + return $config; + } + if (!$schema) { + $ret = HTMLPurifier_Config::createDefault(); + } else { + $ret = new HTMLPurifier_Config($schema); + } + if (is_string($config)) { + $ret->loadIni($config); + } elseif (is_array($config)) $ret->loadArray($config); + return $ret; + } + + /** + * Creates a new config object that inherits from a previous one. + * @param HTMLPurifier_Config $config Configuration object to inherit from. + * @return HTMLPurifier_Config object with $config as its parent. + */ + public static function inherit(HTMLPurifier_Config $config) + { + return new HTMLPurifier_Config($config->def, $config->plist); + } + + /** + * Convenience constructor that creates a default configuration object. + * @return HTMLPurifier_Config default object. + */ + public static function createDefault() + { + $definition = HTMLPurifier_ConfigSchema::instance(); + $config = new HTMLPurifier_Config($definition); + return $config; + } + + /** + * Retrieves a value from the configuration. + * + * @param string $key String key + * @param mixed $a + * + * @return mixed + */ + public function get($key, $a = null) + { + if ($a !== null) { + $this->triggerError( + "Using deprecated API: use \$config->get('$key.$a') instead", + E_USER_WARNING + ); + $key = "$key.$a"; + } + if (!$this->finalized) { + $this->autoFinalize(); + } + if (!isset($this->def->info[$key])) { + // can't add % due to SimpleTest bug + $this->triggerError( + 'Cannot retrieve value of undefined directive ' . htmlspecialchars($key), + E_USER_WARNING + ); + return; + } + if (isset($this->def->info[$key]->isAlias)) { + $d = $this->def->info[$key]; + $this->triggerError( + 'Cannot get value from aliased directive, use real name ' . $d->key, + E_USER_ERROR + ); + return; + } + if ($this->lock) { + list($ns) = explode('.', $key); + if ($ns !== $this->lock) { + $this->triggerError( + 'Cannot get value of namespace ' . $ns . ' when lock for ' . + $this->lock . + ' is active, this probably indicates a Definition setup method ' . + 'is accessing directives that are not within its namespace', + E_USER_ERROR + ); + return; + } + } + return $this->plist->get($key); + } + + /** + * Retrieves an array of directives to values from a given namespace + * + * @param string $namespace String namespace + * + * @return array + */ + public function getBatch($namespace) + { + if (!$this->finalized) { + $this->autoFinalize(); + } + $full = $this->getAll(); + if (!isset($full[$namespace])) { + $this->triggerError( + 'Cannot retrieve undefined namespace ' . + htmlspecialchars($namespace), + E_USER_WARNING + ); + return; + } + return $full[$namespace]; + } + + /** + * Returns a SHA-1 signature of a segment of the configuration object + * that uniquely identifies that particular configuration + * + * @param string $namespace Namespace to get serial for + * + * @return string + * @note Revision is handled specially and is removed from the batch + * before processing! + */ + public function getBatchSerial($namespace) + { + if (empty($this->serials[$namespace])) { + $batch = $this->getBatch($namespace); + unset($batch['DefinitionRev']); + $this->serials[$namespace] = sha1(serialize($batch)); + } + return $this->serials[$namespace]; + } + + /** + * Returns a SHA-1 signature for the entire configuration object + * that uniquely identifies that particular configuration + * + * @return string + */ + public function getSerial() + { + if (empty($this->serial)) { + $this->serial = sha1(serialize($this->getAll())); + } + return $this->serial; + } + + /** + * Retrieves all directives, organized by namespace + * + * @warning This is a pretty inefficient function, avoid if you can + */ + public function getAll() + { + if (!$this->finalized) { + $this->autoFinalize(); + } + $ret = array(); + foreach ($this->plist->squash() as $name => $value) { + list($ns, $key) = explode('.', $name, 2); + $ret[$ns][$key] = $value; + } + return $ret; + } + + /** + * Sets a value to configuration. + * + * @param string $key key + * @param mixed $value value + * @param mixed $a + */ + public function set($key, $value, $a = null) + { + if (strpos($key, '.') === false) { + $namespace = $key; + $directive = $value; + $value = $a; + $key = "$key.$directive"; + $this->triggerError("Using deprecated API: use \$config->set('$key', ...) instead", E_USER_NOTICE); + } else { + list($namespace) = explode('.', $key); + } + if ($this->isFinalized('Cannot set directive after finalization')) { + return; + } + if (!isset($this->def->info[$key])) { + $this->triggerError( + 'Cannot set undefined directive ' . htmlspecialchars($key) . ' to value', + E_USER_WARNING + ); + return; + } + $def = $this->def->info[$key]; + + if (isset($def->isAlias)) { + if ($this->aliasMode) { + $this->triggerError( + 'Double-aliases not allowed, please fix '. + 'ConfigSchema bug with' . $key, + E_USER_ERROR + ); + return; + } + $this->aliasMode = true; + $this->set($def->key, $value); + $this->aliasMode = false; + $this->triggerError("$key is an alias, preferred directive name is {$def->key}", E_USER_NOTICE); + return; + } + + // Raw type might be negative when using the fully optimized form + // of stdclass, which indicates allow_null == true + $rtype = is_int($def) ? $def : $def->type; + if ($rtype < 0) { + $type = -$rtype; + $allow_null = true; + } else { + $type = $rtype; + $allow_null = isset($def->allow_null); + } + + try { + $value = $this->parser->parse($value, $type, $allow_null); + } catch (HTMLPurifier_VarParserException $e) { + $this->triggerError( + 'Value for ' . $key . ' is of invalid type, should be ' . + HTMLPurifier_VarParser::getTypeName($type), + E_USER_WARNING + ); + return; + } + if (is_string($value) && is_object($def)) { + // resolve value alias if defined + if (isset($def->aliases[$value])) { + $value = $def->aliases[$value]; + } + // check to see if the value is allowed + if (isset($def->allowed) && !isset($def->allowed[$value])) { + $this->triggerError( + 'Value not supported, valid values are: ' . + $this->_listify($def->allowed), + E_USER_WARNING + ); + return; + } + } + $this->plist->set($key, $value); + + // reset definitions if the directives they depend on changed + // this is a very costly process, so it's discouraged + // with finalization + if ($namespace == 'HTML' || $namespace == 'CSS' || $namespace == 'URI') { + $this->definitions[$namespace] = null; + } + + $this->serials[$namespace] = false; + } + + /** + * Convenience function for error reporting + * + * @param array $lookup + * + * @return string + */ + private function _listify($lookup) + { + $list = array(); + foreach ($lookup as $name => $b) { + $list[] = $name; + } + return implode(', ', $list); + } + + /** + * Retrieves object reference to the HTML definition. + * + * @param bool $raw Return a copy that has not been setup yet. Must be + * called before it's been setup, otherwise won't work. + * @param bool $optimized If true, this method may return null, to + * indicate that a cached version of the modified + * definition object is available and no further edits + * are necessary. Consider using + * maybeGetRawHTMLDefinition, which is more explicitly + * named, instead. + * + * @return HTMLPurifier_HTMLDefinition + */ + public function getHTMLDefinition($raw = false, $optimized = false) + { + return $this->getDefinition('HTML', $raw, $optimized); + } + + /** + * Retrieves object reference to the CSS definition + * + * @param bool $raw Return a copy that has not been setup yet. Must be + * called before it's been setup, otherwise won't work. + * @param bool $optimized If true, this method may return null, to + * indicate that a cached version of the modified + * definition object is available and no further edits + * are necessary. Consider using + * maybeGetRawCSSDefinition, which is more explicitly + * named, instead. + * + * @return HTMLPurifier_CSSDefinition + */ + public function getCSSDefinition($raw = false, $optimized = false) + { + return $this->getDefinition('CSS', $raw, $optimized); + } + + /** + * Retrieves object reference to the URI definition + * + * @param bool $raw Return a copy that has not been setup yet. Must be + * called before it's been setup, otherwise won't work. + * @param bool $optimized If true, this method may return null, to + * indicate that a cached version of the modified + * definition object is available and no further edits + * are necessary. Consider using + * maybeGetRawURIDefinition, which is more explicitly + * named, instead. + * + * @return HTMLPurifier_URIDefinition + */ + public function getURIDefinition($raw = false, $optimized = false) + { + return $this->getDefinition('URI', $raw, $optimized); + } + + /** + * Retrieves a definition + * + * @param string $type Type of definition: HTML, CSS, etc + * @param bool $raw Whether or not definition should be returned raw + * @param bool $optimized Only has an effect when $raw is true. Whether + * or not to return null if the result is already present in + * the cache. This is off by default for backwards + * compatibility reasons, but you need to do things this + * way in order to ensure that caching is done properly. + * Check out enduser-customize.html for more details. + * We probably won't ever change this default, as much as the + * maybe semantics is the "right thing to do." + * + * @throws HTMLPurifier_Exception + * @return HTMLPurifier_Definition + */ + public function getDefinition($type, $raw = false, $optimized = false) + { + if ($optimized && !$raw) { + throw new HTMLPurifier_Exception("Cannot set optimized = true when raw = false"); + } + if (!$this->finalized) { + $this->autoFinalize(); + } + // temporarily suspend locks, so we can handle recursive definition calls + $lock = $this->lock; + $this->lock = null; + $factory = HTMLPurifier_DefinitionCacheFactory::instance(); + $cache = $factory->create($type, $this); + $this->lock = $lock; + if (!$raw) { + // full definition + // --------------- + // check if definition is in memory + if (!empty($this->definitions[$type])) { + $def = $this->definitions[$type]; + // check if the definition is setup + if ($def->setup) { + return $def; + } else { + $def->setup($this); + if ($def->optimized) { + $cache->add($def, $this); + } + return $def; + } + } + // check if definition is in cache + $def = $cache->get($this); + if ($def) { + // definition in cache, save to memory and return it + $this->definitions[$type] = $def; + return $def; + } + // initialize it + $def = $this->initDefinition($type); + // set it up + $this->lock = $type; + $def->setup($this); + $this->lock = null; + // save in cache + $cache->add($def, $this); + // return it + return $def; + } else { + // raw definition + // -------------- + // check preconditions + $def = null; + if ($optimized) { + if (is_null($this->get($type . '.DefinitionID'))) { + // fatally error out if definition ID not set + throw new HTMLPurifier_Exception( + "Cannot retrieve raw version without specifying %$type.DefinitionID" + ); + } + } + if (!empty($this->definitions[$type])) { + $def = $this->definitions[$type]; + if ($def->setup && !$optimized) { + $extra = $this->chatty ? + " (try moving this code block earlier in your initialization)" : + ""; + throw new HTMLPurifier_Exception( + "Cannot retrieve raw definition after it has already been setup" . + $extra + ); + } + if ($def->optimized === null) { + $extra = $this->chatty ? " (try flushing your cache)" : ""; + throw new HTMLPurifier_Exception( + "Optimization status of definition is unknown" . $extra + ); + } + if ($def->optimized !== $optimized) { + $msg = $optimized ? "optimized" : "unoptimized"; + $extra = $this->chatty ? + " (this backtrace is for the first inconsistent call, which was for a $msg raw definition)" + : ""; + throw new HTMLPurifier_Exception( + "Inconsistent use of optimized and unoptimized raw definition retrievals" . $extra + ); + } + } + // check if definition was in memory + if ($def) { + if ($def->setup) { + // invariant: $optimized === true (checked above) + return null; + } else { + return $def; + } + } + // if optimized, check if definition was in cache + // (because we do the memory check first, this formulation + // is prone to cache slamming, but I think + // guaranteeing that either /all/ of the raw + // setup code or /none/ of it is run is more important.) + if ($optimized) { + // This code path only gets run once; once we put + // something in $definitions (which is guaranteed by the + // trailing code), we always short-circuit above. + $def = $cache->get($this); + if ($def) { + // save the full definition for later, but don't + // return it yet + $this->definitions[$type] = $def; + return null; + } + } + // check invariants for creation + if (!$optimized) { + if (!is_null($this->get($type . '.DefinitionID'))) { + if ($this->chatty) { + $this->triggerError( + 'Due to a documentation error in previous version of HTML Purifier, your ' . + 'definitions are not being cached. If this is OK, you can remove the ' . + '%$type.DefinitionRev and %$type.DefinitionID declaration. Otherwise, ' . + 'modify your code to use maybeGetRawDefinition, and test if the returned ' . + 'value is null before making any edits (if it is null, that means that a ' . + 'cached version is available, and no raw operations are necessary). See ' . + '' . + 'Customize for more details', + E_USER_WARNING + ); + } else { + $this->triggerError( + "Useless DefinitionID declaration", + E_USER_WARNING + ); + } + } + } + // initialize it + $def = $this->initDefinition($type); + $def->optimized = $optimized; + return $def; + } + throw new HTMLPurifier_Exception("The impossible happened!"); + } + + /** + * Initialise definition + * + * @param string $type What type of definition to create + * + * @return HTMLPurifier_CSSDefinition|HTMLPurifier_HTMLDefinition|HTMLPurifier_URIDefinition + * @throws HTMLPurifier_Exception + */ + private function initDefinition($type) + { + // quick checks failed, let's create the object + if ($type == 'HTML') { + $def = new HTMLPurifier_HTMLDefinition(); + } elseif ($type == 'CSS') { + $def = new HTMLPurifier_CSSDefinition(); + } elseif ($type == 'URI') { + $def = new HTMLPurifier_URIDefinition(); + } else { + throw new HTMLPurifier_Exception( + "Definition of $type type not supported" + ); + } + $this->definitions[$type] = $def; + return $def; + } + + public function maybeGetRawDefinition($name) + { + return $this->getDefinition($name, true, true); + } + + public function maybeGetRawHTMLDefinition() + { + return $this->getDefinition('HTML', true, true); + } + + public function maybeGetRawCSSDefinition() + { + return $this->getDefinition('CSS', true, true); + } + + public function maybeGetRawURIDefinition() + { + return $this->getDefinition('URI', true, true); + } + + /** + * Loads configuration values from an array with the following structure: + * Namespace.Directive => Value + * + * @param array $config_array Configuration associative array + */ + public function loadArray($config_array) + { + if ($this->isFinalized('Cannot load directives after finalization')) { + return; + } + foreach ($config_array as $key => $value) { + $key = str_replace('_', '.', $key); + if (strpos($key, '.') !== false) { + $this->set($key, $value); + } else { + $namespace = $key; + $namespace_values = $value; + foreach ($namespace_values as $directive => $value2) { + $this->set($namespace .'.'. $directive, $value2); + } + } + } + } + + /** + * Returns a list of array(namespace, directive) for all directives + * that are allowed in a web-form context as per an allowed + * namespaces/directives list. + * + * @param array $allowed List of allowed namespaces/directives + * @param HTMLPurifier_ConfigSchema $schema Schema to use, if not global copy + * + * @return array + */ + public static function getAllowedDirectivesForForm($allowed, $schema = null) + { + if (!$schema) { + $schema = HTMLPurifier_ConfigSchema::instance(); + } + if ($allowed !== true) { + if (is_string($allowed)) { + $allowed = array($allowed); + } + $allowed_ns = array(); + $allowed_directives = array(); + $blacklisted_directives = array(); + foreach ($allowed as $ns_or_directive) { + if (strpos($ns_or_directive, '.') !== false) { + // directive + if ($ns_or_directive[0] == '-') { + $blacklisted_directives[substr($ns_or_directive, 1)] = true; + } else { + $allowed_directives[$ns_or_directive] = true; + } + } else { + // namespace + $allowed_ns[$ns_or_directive] = true; + } + } + } + $ret = array(); + foreach ($schema->info as $key => $def) { + list($ns, $directive) = explode('.', $key, 2); + if ($allowed !== true) { + if (isset($blacklisted_directives["$ns.$directive"])) { + continue; + } + if (!isset($allowed_directives["$ns.$directive"]) && !isset($allowed_ns[$ns])) { + continue; + } + } + if (isset($def->isAlias)) { + continue; + } + if ($directive == 'DefinitionID' || $directive == 'DefinitionRev') { + continue; + } + $ret[] = array($ns, $directive); + } + return $ret; + } + + /** + * Loads configuration values from $_GET/$_POST that were posted + * via ConfigForm + * + * @param array $array $_GET or $_POST array to import + * @param string|bool $index Index/name that the config variables are in + * @param array|bool $allowed List of allowed namespaces/directives + * @param bool $mq_fix Boolean whether or not to enable magic quotes fix + * @param HTMLPurifier_ConfigSchema $schema Schema to use, if not global copy + * + * @return mixed + */ + public static function loadArrayFromForm($array, $index = false, $allowed = true, $mq_fix = true, $schema = null) + { + $ret = HTMLPurifier_Config::prepareArrayFromForm($array, $index, $allowed, $mq_fix, $schema); + $config = HTMLPurifier_Config::create($ret, $schema); + return $config; + } + + /** + * Merges in configuration values from $_GET/$_POST to object. NOT STATIC. + * + * @param array $array $_GET or $_POST array to import + * @param string|bool $index Index/name that the config variables are in + * @param array|bool $allowed List of allowed namespaces/directives + * @param bool $mq_fix Boolean whether or not to enable magic quotes fix + */ + public function mergeArrayFromForm($array, $index = false, $allowed = true, $mq_fix = true) + { + $ret = HTMLPurifier_Config::prepareArrayFromForm($array, $index, $allowed, $mq_fix, $this->def); + $this->loadArray($ret); + } + + /** + * Prepares an array from a form into something usable for the more + * strict parts of HTMLPurifier_Config + * + * @param array $array $_GET or $_POST array to import + * @param string|bool $index Index/name that the config variables are in + * @param array|bool $allowed List of allowed namespaces/directives + * @param bool $mq_fix Boolean whether or not to enable magic quotes fix + * @param HTMLPurifier_ConfigSchema $schema Schema to use, if not global copy + * + * @return array + */ + public static function prepareArrayFromForm($array, $index = false, $allowed = true, $mq_fix = true, $schema = null) + { + if ($index !== false) { + $array = (isset($array[$index]) && is_array($array[$index])) ? $array[$index] : array(); + } + $mq = $mq_fix && function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc(); + + $allowed = HTMLPurifier_Config::getAllowedDirectivesForForm($allowed, $schema); + $ret = array(); + foreach ($allowed as $key) { + list($ns, $directive) = $key; + $skey = "$ns.$directive"; + if (!empty($array["Null_$skey"])) { + $ret[$ns][$directive] = null; + continue; + } + if (!isset($array[$skey])) { + continue; + } + $value = $mq ? stripslashes($array[$skey]) : $array[$skey]; + $ret[$ns][$directive] = $value; + } + return $ret; + } + + /** + * Loads configuration values from an ini file + * + * @param string $filename Name of ini file + */ + public function loadIni($filename) + { + if ($this->isFinalized('Cannot load directives after finalization')) { + return; + } + $array = parse_ini_file($filename, true); + $this->loadArray($array); + } + + /** + * Checks whether or not the configuration object is finalized. + * + * @param string|bool $error String error message, or false for no error + * + * @return bool + */ + public function isFinalized($error = false) + { + if ($this->finalized && $error) { + $this->triggerError($error, E_USER_ERROR); + } + return $this->finalized; + } + + /** + * Finalizes configuration only if auto finalize is on and not + * already finalized + */ + public function autoFinalize() + { + if ($this->autoFinalize) { + $this->finalize(); + } else { + $this->plist->squash(true); + } + } + + /** + * Finalizes a configuration object, prohibiting further change + */ + public function finalize() + { + $this->finalized = true; + $this->parser = null; + } + + /** + * Produces a nicely formatted error message by supplying the + * stack frame information OUTSIDE of HTMLPurifier_Config. + * + * @param string $msg An error message + * @param int $no An error number + */ + protected function triggerError($msg, $no) + { + // determine previous stack frame + $extra = ''; + if ($this->chatty) { + $trace = debug_backtrace(); + // zip(tail(trace), trace) -- but PHP is not Haskell har har + for ($i = 0, $c = count($trace); $i < $c - 1; $i++) { + // XXX this is not correct on some versions of HTML Purifier + if ($trace[$i + 1]['class'] === 'HTMLPurifier_Config') { + continue; + } + $frame = $trace[$i]; + $extra = " invoked on line {$frame['line']} in file {$frame['file']}"; + break; + } + } + trigger_error($msg . $extra, $no); + } + + /** + * Returns a serialized form of the configuration object that can + * be reconstituted. + * + * @return string + */ + public function serialize() + { + $this->getDefinition('HTML'); + $this->getDefinition('CSS'); + $this->getDefinition('URI'); + return serialize($this); + } + +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema.php b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema.php similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema.php rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema.php index ab7e7c0b6..bfbb0f92f 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema.php @@ -1,176 +1,176 @@ - array( - * 'Directive' => new stdclass(), - * ) - * ) - * - * The stdclass may have the following properties: - * - * - If isAlias isn't set: - * - type: Integer type of directive, see HTMLPurifier_VarParser for definitions - * - allow_null: If set, this directive allows null values - * - aliases: If set, an associative array of value aliases to real values - * - allowed: If set, a lookup array of allowed (string) values - * - If isAlias is set: - * - namespace: Namespace this directive aliases to - * - name: Directive name this directive aliases to - * - * In certain degenerate cases, stdclass will actually be an integer. In - * that case, the value is equivalent to an stdclass with the type - * property set to the integer. If the integer is negative, type is - * equal to the absolute value of integer, and allow_null is true. - * - * This class is friendly with HTMLPurifier_Config. If you need introspection - * about the schema, you're better of using the ConfigSchema_Interchange, - * which uses more memory but has much richer information. - * @type array - */ - public $info = array(); - - /** - * Application-wide singleton - * @type HTMLPurifier_ConfigSchema - */ - protected static $singleton; - - public function __construct() - { - $this->defaultPlist = new HTMLPurifier_PropertyList(); - } - - /** - * Unserializes the default ConfigSchema. - * @return HTMLPurifier_ConfigSchema - */ - public static function makeFromSerial() - { - $contents = file_get_contents(HTMLPURIFIER_PREFIX . '/HTMLPurifier/ConfigSchema/schema.ser'); - $r = unserialize($contents); - if (!$r) { - $hash = sha1($contents); - trigger_error("Unserialization of configuration schema failed, sha1 of file was $hash", E_USER_ERROR); - } - return $r; - } - - /** - * Retrieves an instance of the application-wide configuration definition. - * @param HTMLPurifier_ConfigSchema $prototype - * @return HTMLPurifier_ConfigSchema - */ - public static function instance($prototype = null) - { - if ($prototype !== null) { - HTMLPurifier_ConfigSchema::$singleton = $prototype; - } elseif (HTMLPurifier_ConfigSchema::$singleton === null || $prototype === true) { - HTMLPurifier_ConfigSchema::$singleton = HTMLPurifier_ConfigSchema::makeFromSerial(); - } - return HTMLPurifier_ConfigSchema::$singleton; - } - - /** - * Defines a directive for configuration - * @warning Will fail of directive's namespace is defined. - * @warning This method's signature is slightly different from the legacy - * define() static method! Beware! - * @param string $key Name of directive - * @param mixed $default Default value of directive - * @param string $type Allowed type of the directive. See - * HTMLPurifier_DirectiveDef::$type for allowed values - * @param bool $allow_null Whether or not to allow null values - */ - public function add($key, $default, $type, $allow_null) - { - $obj = new stdclass(); - $obj->type = is_int($type) ? $type : HTMLPurifier_VarParser::$types[$type]; - if ($allow_null) { - $obj->allow_null = true; - } - $this->info[$key] = $obj; - $this->defaults[$key] = $default; - $this->defaultPlist->set($key, $default); - } - - /** - * Defines a directive value alias. - * - * Directive value aliases are convenient for developers because it lets - * them set a directive to several values and get the same result. - * @param string $key Name of Directive - * @param array $aliases Hash of aliased values to the real alias - */ - public function addValueAliases($key, $aliases) - { - if (!isset($this->info[$key]->aliases)) { - $this->info[$key]->aliases = array(); - } - foreach ($aliases as $alias => $real) { - $this->info[$key]->aliases[$alias] = $real; - } - } - - /** - * Defines a set of allowed values for a directive. - * @warning This is slightly different from the corresponding static - * method definition. - * @param string $key Name of directive - * @param array $allowed Lookup array of allowed values - */ - public function addAllowedValues($key, $allowed) - { - $this->info[$key]->allowed = $allowed; - } - - /** - * Defines a directive alias for backwards compatibility - * @param string $key Directive that will be aliased - * @param string $new_key Directive that the alias will be to - */ - public function addAlias($key, $new_key) - { - $obj = new stdclass; - $obj->key = $new_key; - $obj->isAlias = true; - $this->info[$key] = $obj; - } - - /** - * Replaces any stdclass that only has the type property with type integer. - */ - public function postProcess() - { - foreach ($this->info as $key => $v) { - if (count((array) $v) == 1) { - $this->info[$key] = $v->type; - } elseif (count((array) $v) == 2 && isset($v->allow_null)) { - $this->info[$key] = -$v->type; - } - } - } -} - -// vim: et sw=4 sts=4 + array( + * 'Directive' => new stdclass(), + * ) + * ) + * + * The stdclass may have the following properties: + * + * - If isAlias isn't set: + * - type: Integer type of directive, see HTMLPurifier_VarParser for definitions + * - allow_null: If set, this directive allows null values + * - aliases: If set, an associative array of value aliases to real values + * - allowed: If set, a lookup array of allowed (string) values + * - If isAlias is set: + * - namespace: Namespace this directive aliases to + * - name: Directive name this directive aliases to + * + * In certain degenerate cases, stdclass will actually be an integer. In + * that case, the value is equivalent to an stdclass with the type + * property set to the integer. If the integer is negative, type is + * equal to the absolute value of integer, and allow_null is true. + * + * This class is friendly with HTMLPurifier_Config. If you need introspection + * about the schema, you're better of using the ConfigSchema_Interchange, + * which uses more memory but has much richer information. + * @type array + */ + public $info = array(); + + /** + * Application-wide singleton + * @type HTMLPurifier_ConfigSchema + */ + protected static $singleton; + + public function __construct() + { + $this->defaultPlist = new HTMLPurifier_PropertyList(); + } + + /** + * Unserializes the default ConfigSchema. + * @return HTMLPurifier_ConfigSchema + */ + public static function makeFromSerial() + { + $contents = file_get_contents(HTMLPURIFIER_PREFIX . '/HTMLPurifier/ConfigSchema/schema.ser'); + $r = unserialize($contents); + if (!$r) { + $hash = sha1($contents); + trigger_error("Unserialization of configuration schema failed, sha1 of file was $hash", E_USER_ERROR); + } + return $r; + } + + /** + * Retrieves an instance of the application-wide configuration definition. + * @param HTMLPurifier_ConfigSchema $prototype + * @return HTMLPurifier_ConfigSchema + */ + public static function instance($prototype = null) + { + if ($prototype !== null) { + HTMLPurifier_ConfigSchema::$singleton = $prototype; + } elseif (HTMLPurifier_ConfigSchema::$singleton === null || $prototype === true) { + HTMLPurifier_ConfigSchema::$singleton = HTMLPurifier_ConfigSchema::makeFromSerial(); + } + return HTMLPurifier_ConfigSchema::$singleton; + } + + /** + * Defines a directive for configuration + * @warning Will fail of directive's namespace is defined. + * @warning This method's signature is slightly different from the legacy + * define() static method! Beware! + * @param string $key Name of directive + * @param mixed $default Default value of directive + * @param string $type Allowed type of the directive. See + * HTMLPurifier_DirectiveDef::$type for allowed values + * @param bool $allow_null Whether or not to allow null values + */ + public function add($key, $default, $type, $allow_null) + { + $obj = new stdclass(); + $obj->type = is_int($type) ? $type : HTMLPurifier_VarParser::$types[$type]; + if ($allow_null) { + $obj->allow_null = true; + } + $this->info[$key] = $obj; + $this->defaults[$key] = $default; + $this->defaultPlist->set($key, $default); + } + + /** + * Defines a directive value alias. + * + * Directive value aliases are convenient for developers because it lets + * them set a directive to several values and get the same result. + * @param string $key Name of Directive + * @param array $aliases Hash of aliased values to the real alias + */ + public function addValueAliases($key, $aliases) + { + if (!isset($this->info[$key]->aliases)) { + $this->info[$key]->aliases = array(); + } + foreach ($aliases as $alias => $real) { + $this->info[$key]->aliases[$alias] = $real; + } + } + + /** + * Defines a set of allowed values for a directive. + * @warning This is slightly different from the corresponding static + * method definition. + * @param string $key Name of directive + * @param array $allowed Lookup array of allowed values + */ + public function addAllowedValues($key, $allowed) + { + $this->info[$key]->allowed = $allowed; + } + + /** + * Defines a directive alias for backwards compatibility + * @param string $key Directive that will be aliased + * @param string $new_key Directive that the alias will be to + */ + public function addAlias($key, $new_key) + { + $obj = new stdclass; + $obj->key = $new_key; + $obj->isAlias = true; + $this->info[$key] = $obj; + } + + /** + * Replaces any stdclass that only has the type property with type integer. + */ + public function postProcess() + { + foreach ($this->info as $key => $v) { + if (count((array) $v) == 1) { + $this->info[$key] = $v->type; + } elseif (count((array) $v) == 2 && isset($v->allow_null)) { + $this->info[$key] = -$v->type; + } + } + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/Builder/ConfigSchema.php b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/Builder/ConfigSchema.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/Builder/ConfigSchema.php rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/Builder/ConfigSchema.php index 1174575ea..d5906cd46 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/Builder/ConfigSchema.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/Builder/ConfigSchema.php @@ -1,48 +1,48 @@ -directives as $d) { - $schema->add( - $d->id->key, - $d->default, - $d->type, - $d->typeAllowsNull - ); - if ($d->allowed !== null) { - $schema->addAllowedValues( - $d->id->key, - $d->allowed - ); - } - foreach ($d->aliases as $alias) { - $schema->addAlias( - $alias->key, - $d->id->key - ); - } - if ($d->valueAliases !== null) { - $schema->addValueAliases( - $d->id->key, - $d->valueAliases - ); - } - } - $schema->postProcess(); - return $schema; - } -} - -// vim: et sw=4 sts=4 +directives as $d) { + $schema->add( + $d->id->key, + $d->default, + $d->type, + $d->typeAllowsNull + ); + if ($d->allowed !== null) { + $schema->addAllowedValues( + $d->id->key, + $d->allowed + ); + } + foreach ($d->aliases as $alias) { + $schema->addAlias( + $alias->key, + $d->id->key + ); + } + if ($d->valueAliases !== null) { + $schema->addValueAliases( + $d->id->key, + $d->valueAliases + ); + } + } + $schema->postProcess(); + return $schema; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/Builder/Xml.php b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/Builder/Xml.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/Builder/Xml.php rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/Builder/Xml.php index 0d00bf1d1..5fa56f7dd 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/Builder/Xml.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/Builder/Xml.php @@ -1,144 +1,144 @@ -startElement('div'); - - $purifier = HTMLPurifier::getInstance(); - $html = $purifier->purify($html); - $this->writeAttribute('xmlns', 'http://www.w3.org/1999/xhtml'); - $this->writeRaw($html); - - $this->endElement(); // div - } - - /** - * @param mixed $var - * @return string - */ - protected function export($var) - { - if ($var === array()) { - return 'array()'; - } - return var_export($var, true); - } - - /** - * @param HTMLPurifier_ConfigSchema_Interchange $interchange - */ - public function build($interchange) - { - // global access, only use as last resort - $this->interchange = $interchange; - - $this->setIndent(true); - $this->startDocument('1.0', 'UTF-8'); - $this->startElement('configdoc'); - $this->writeElement('title', $interchange->name); - - foreach ($interchange->directives as $directive) { - $this->buildDirective($directive); - } - - if ($this->namespace) { - $this->endElement(); - } // namespace - - $this->endElement(); // configdoc - $this->flush(); - } - - /** - * @param HTMLPurifier_ConfigSchema_Interchange_Directive $directive - */ - public function buildDirective($directive) - { - // Kludge, although I suppose having a notion of a "root namespace" - // certainly makes things look nicer when documentation is built. - // Depends on things being sorted. - if (!$this->namespace || $this->namespace !== $directive->id->getRootNamespace()) { - if ($this->namespace) { - $this->endElement(); - } // namespace - $this->namespace = $directive->id->getRootNamespace(); - $this->startElement('namespace'); - $this->writeAttribute('id', $this->namespace); - $this->writeElement('name', $this->namespace); - } - - $this->startElement('directive'); - $this->writeAttribute('id', $directive->id->toString()); - - $this->writeElement('name', $directive->id->getDirective()); - - $this->startElement('aliases'); - foreach ($directive->aliases as $alias) { - $this->writeElement('alias', $alias->toString()); - } - $this->endElement(); // aliases - - $this->startElement('constraints'); - if ($directive->version) { - $this->writeElement('version', $directive->version); - } - $this->startElement('type'); - if ($directive->typeAllowsNull) { - $this->writeAttribute('allow-null', 'yes'); - } - $this->text($directive->type); - $this->endElement(); // type - if ($directive->allowed) { - $this->startElement('allowed'); - foreach ($directive->allowed as $value => $x) { - $this->writeElement('value', $value); - } - $this->endElement(); // allowed - } - $this->writeElement('default', $this->export($directive->default)); - $this->writeAttribute('xml:space', 'preserve'); - if ($directive->external) { - $this->startElement('external'); - foreach ($directive->external as $project) { - $this->writeElement('project', $project); - } - $this->endElement(); - } - $this->endElement(); // constraints - - if ($directive->deprecatedVersion) { - $this->startElement('deprecated'); - $this->writeElement('version', $directive->deprecatedVersion); - $this->writeElement('use', $directive->deprecatedUse->toString()); - $this->endElement(); // deprecated - } - - $this->startElement('description'); - $this->writeHTMLDiv($directive->description); - $this->endElement(); // description - - $this->endElement(); // directive - } -} - -// vim: et sw=4 sts=4 +startElement('div'); + + $purifier = HTMLPurifier::getInstance(); + $html = $purifier->purify($html); + $this->writeAttribute('xmlns', 'http://www.w3.org/1999/xhtml'); + $this->writeRaw($html); + + $this->endElement(); // div + } + + /** + * @param mixed $var + * @return string + */ + protected function export($var) + { + if ($var === array()) { + return 'array()'; + } + return var_export($var, true); + } + + /** + * @param HTMLPurifier_ConfigSchema_Interchange $interchange + */ + public function build($interchange) + { + // global access, only use as last resort + $this->interchange = $interchange; + + $this->setIndent(true); + $this->startDocument('1.0', 'UTF-8'); + $this->startElement('configdoc'); + $this->writeElement('title', $interchange->name); + + foreach ($interchange->directives as $directive) { + $this->buildDirective($directive); + } + + if ($this->namespace) { + $this->endElement(); + } // namespace + + $this->endElement(); // configdoc + $this->flush(); + } + + /** + * @param HTMLPurifier_ConfigSchema_Interchange_Directive $directive + */ + public function buildDirective($directive) + { + // Kludge, although I suppose having a notion of a "root namespace" + // certainly makes things look nicer when documentation is built. + // Depends on things being sorted. + if (!$this->namespace || $this->namespace !== $directive->id->getRootNamespace()) { + if ($this->namespace) { + $this->endElement(); + } // namespace + $this->namespace = $directive->id->getRootNamespace(); + $this->startElement('namespace'); + $this->writeAttribute('id', $this->namespace); + $this->writeElement('name', $this->namespace); + } + + $this->startElement('directive'); + $this->writeAttribute('id', $directive->id->toString()); + + $this->writeElement('name', $directive->id->getDirective()); + + $this->startElement('aliases'); + foreach ($directive->aliases as $alias) { + $this->writeElement('alias', $alias->toString()); + } + $this->endElement(); // aliases + + $this->startElement('constraints'); + if ($directive->version) { + $this->writeElement('version', $directive->version); + } + $this->startElement('type'); + if ($directive->typeAllowsNull) { + $this->writeAttribute('allow-null', 'yes'); + } + $this->text($directive->type); + $this->endElement(); // type + if ($directive->allowed) { + $this->startElement('allowed'); + foreach ($directive->allowed as $value => $x) { + $this->writeElement('value', $value); + } + $this->endElement(); // allowed + } + $this->writeElement('default', $this->export($directive->default)); + $this->writeAttribute('xml:space', 'preserve'); + if ($directive->external) { + $this->startElement('external'); + foreach ($directive->external as $project) { + $this->writeElement('project', $project); + } + $this->endElement(); + } + $this->endElement(); // constraints + + if ($directive->deprecatedVersion) { + $this->startElement('deprecated'); + $this->writeElement('version', $directive->deprecatedVersion); + $this->writeElement('use', $directive->deprecatedUse->toString()); + $this->endElement(); // deprecated + } + + $this->startElement('description'); + $this->writeHTMLDiv($directive->description); + $this->endElement(); // description + + $this->endElement(); // directive + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/Exception.php b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/Exception.php similarity index 93% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/Exception.php rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/Exception.php index 1abdcfc06..2671516c5 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/Exception.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/Exception.php @@ -1,11 +1,11 @@ - array(directive info) - * @type HTMLPurifier_ConfigSchema_Interchange_Directive[] - */ - public $directives = array(); - - /** - * Adds a directive array to $directives - * @param HTMLPurifier_ConfigSchema_Interchange_Directive $directive - * @throws HTMLPurifier_ConfigSchema_Exception - */ - public function addDirective($directive) - { - if (isset($this->directives[$i = $directive->id->toString()])) { - throw new HTMLPurifier_ConfigSchema_Exception("Cannot redefine directive '$i'"); - } - $this->directives[$i] = $directive; - } - - /** - * Convenience function to perform standard validation. Throws exception - * on failed validation. - */ - public function validate() - { - $validator = new HTMLPurifier_ConfigSchema_Validator(); - return $validator->validate($this); - } -} - -// vim: et sw=4 sts=4 + array(directive info) + * @type HTMLPurifier_ConfigSchema_Interchange_Directive[] + */ + public $directives = array(); + + /** + * Adds a directive array to $directives + * @param HTMLPurifier_ConfigSchema_Interchange_Directive $directive + * @throws HTMLPurifier_ConfigSchema_Exception + */ + public function addDirective($directive) + { + if (isset($this->directives[$i = $directive->id->toString()])) { + throw new HTMLPurifier_ConfigSchema_Exception("Cannot redefine directive '$i'"); + } + $this->directives[$i] = $directive; + } + + /** + * Convenience function to perform standard validation. Throws exception + * on failed validation. + */ + public function validate() + { + $validator = new HTMLPurifier_ConfigSchema_Validator(); + return $validator->validate($this); + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/Interchange/Directive.php b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/Interchange/Directive.php similarity index 95% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/Interchange/Directive.php rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/Interchange/Directive.php index 4c39c5c68..127a39a67 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/Interchange/Directive.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/Interchange/Directive.php @@ -1,89 +1,89 @@ - true). - * Null if all values are allowed. - * @type array - */ - public $allowed; - - /** - * List of aliases for the directive. - * e.g. array(new HTMLPurifier_ConfigSchema_Interchange_Id('Ns', 'Dir'))). - * @type HTMLPurifier_ConfigSchema_Interchange_Id[] - */ - public $aliases = array(); - - /** - * Hash of value aliases, e.g. array('alt' => 'real'). Null if value - * aliasing is disabled (necessary for non-scalar types). - * @type array - */ - public $valueAliases; - - /** - * Version of HTML Purifier the directive was introduced, e.g. '1.3.1'. - * Null if the directive has always existed. - * @type string - */ - public $version; - - /** - * ID of directive that supercedes this old directive. - * Null if not deprecated. - * @type HTMLPurifier_ConfigSchema_Interchange_Id - */ - public $deprecatedUse; - - /** - * Version of HTML Purifier this directive was deprecated. Null if not - * deprecated. - * @type string - */ - public $deprecatedVersion; - - /** - * List of external projects this directive depends on, e.g. array('CSSTidy'). - * @type array - */ - public $external = array(); -} - -// vim: et sw=4 sts=4 + true). + * Null if all values are allowed. + * @type array + */ + public $allowed; + + /** + * List of aliases for the directive. + * e.g. array(new HTMLPurifier_ConfigSchema_Interchange_Id('Ns', 'Dir'))). + * @type HTMLPurifier_ConfigSchema_Interchange_Id[] + */ + public $aliases = array(); + + /** + * Hash of value aliases, e.g. array('alt' => 'real'). Null if value + * aliasing is disabled (necessary for non-scalar types). + * @type array + */ + public $valueAliases; + + /** + * Version of HTML Purifier the directive was introduced, e.g. '1.3.1'. + * Null if the directive has always existed. + * @type string + */ + public $version; + + /** + * ID of directive that supercedes this old directive. + * Null if not deprecated. + * @type HTMLPurifier_ConfigSchema_Interchange_Id + */ + public $deprecatedUse; + + /** + * Version of HTML Purifier this directive was deprecated. Null if not + * deprecated. + * @type string + */ + public $deprecatedVersion; + + /** + * List of external projects this directive depends on, e.g. array('CSSTidy'). + * @type array + */ + public $external = array(); +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/Interchange/Id.php b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/Interchange/Id.php similarity index 94% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/Interchange/Id.php rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/Interchange/Id.php index 3ee817114..126f09d95 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/Interchange/Id.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/Interchange/Id.php @@ -1,58 +1,58 @@ -key = $key; - } - - /** - * @return string - * @warning This is NOT magic, to ensure that people don't abuse SPL and - * cause problems for PHP 5.0 support. - */ - public function toString() - { - return $this->key; - } - - /** - * @return string - */ - public function getRootNamespace() - { - return substr($this->key, 0, strpos($this->key, ".")); - } - - /** - * @return string - */ - public function getDirective() - { - return substr($this->key, strpos($this->key, ".") + 1); - } - - /** - * @param string $id - * @return HTMLPurifier_ConfigSchema_Interchange_Id - */ - public static function make($id) - { - return new HTMLPurifier_ConfigSchema_Interchange_Id($id); - } -} - -// vim: et sw=4 sts=4 +key = $key; + } + + /** + * @return string + * @warning This is NOT magic, to ensure that people don't abuse SPL and + * cause problems for PHP 5.0 support. + */ + public function toString() + { + return $this->key; + } + + /** + * @return string + */ + public function getRootNamespace() + { + return substr($this->key, 0, strpos($this->key, ".")); + } + + /** + * @return string + */ + public function getDirective() + { + return substr($this->key, strpos($this->key, ".") + 1); + } + + /** + * @param string $id + * @return HTMLPurifier_ConfigSchema_Interchange_Id + */ + public static function make($id) + { + return new HTMLPurifier_ConfigSchema_Interchange_Id($id); + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/InterchangeBuilder.php b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/InterchangeBuilder.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/InterchangeBuilder.php rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/InterchangeBuilder.php index fe9b3268f..655e6dd1b 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/InterchangeBuilder.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/InterchangeBuilder.php @@ -1,226 +1,226 @@ -varParser = $varParser ? $varParser : new HTMLPurifier_VarParser_Native(); - } - - /** - * @param string $dir - * @return HTMLPurifier_ConfigSchema_Interchange - */ - public static function buildFromDirectory($dir = null) - { - $builder = new HTMLPurifier_ConfigSchema_InterchangeBuilder(); - $interchange = new HTMLPurifier_ConfigSchema_Interchange(); - return $builder->buildDir($interchange, $dir); - } - - /** - * @param HTMLPurifier_ConfigSchema_Interchange $interchange - * @param string $dir - * @return HTMLPurifier_ConfigSchema_Interchange - */ - public function buildDir($interchange, $dir = null) - { - if (!$dir) { - $dir = HTMLPURIFIER_PREFIX . '/HTMLPurifier/ConfigSchema/schema'; - } - if (file_exists($dir . '/info.ini')) { - $info = parse_ini_file($dir . '/info.ini'); - $interchange->name = $info['name']; - } - - $files = array(); - $dh = opendir($dir); - while (false !== ($file = readdir($dh))) { - if (!$file || $file[0] == '.' || strrchr($file, '.') !== '.txt') { - continue; - } - $files[] = $file; - } - closedir($dh); - - sort($files); - foreach ($files as $file) { - $this->buildFile($interchange, $dir . '/' . $file); - } - return $interchange; - } - - /** - * @param HTMLPurifier_ConfigSchema_Interchange $interchange - * @param string $file - */ - public function buildFile($interchange, $file) - { - $parser = new HTMLPurifier_StringHashParser(); - $this->build( - $interchange, - new HTMLPurifier_StringHash($parser->parseFile($file)) - ); - } - - /** - * Builds an interchange object based on a hash. - * @param HTMLPurifier_ConfigSchema_Interchange $interchange HTMLPurifier_ConfigSchema_Interchange object to build - * @param HTMLPurifier_StringHash $hash source data - * @throws HTMLPurifier_ConfigSchema_Exception - */ - public function build($interchange, $hash) - { - if (!$hash instanceof HTMLPurifier_StringHash) { - $hash = new HTMLPurifier_StringHash($hash); - } - if (!isset($hash['ID'])) { - throw new HTMLPurifier_ConfigSchema_Exception('Hash does not have any ID'); - } - if (strpos($hash['ID'], '.') === false) { - if (count($hash) == 2 && isset($hash['DESCRIPTION'])) { - $hash->offsetGet('DESCRIPTION'); // prevent complaining - } else { - throw new HTMLPurifier_ConfigSchema_Exception('All directives must have a namespace'); - } - } else { - $this->buildDirective($interchange, $hash); - } - $this->_findUnused($hash); - } - - /** - * @param HTMLPurifier_ConfigSchema_Interchange $interchange - * @param HTMLPurifier_StringHash $hash - * @throws HTMLPurifier_ConfigSchema_Exception - */ - public function buildDirective($interchange, $hash) - { - $directive = new HTMLPurifier_ConfigSchema_Interchange_Directive(); - - // These are required elements: - $directive->id = $this->id($hash->offsetGet('ID')); - $id = $directive->id->toString(); // convenience - - if (isset($hash['TYPE'])) { - $type = explode('/', $hash->offsetGet('TYPE')); - if (isset($type[1])) { - $directive->typeAllowsNull = true; - } - $directive->type = $type[0]; - } else { - throw new HTMLPurifier_ConfigSchema_Exception("TYPE in directive hash '$id' not defined"); - } - - if (isset($hash['DEFAULT'])) { - try { - $directive->default = $this->varParser->parse( - $hash->offsetGet('DEFAULT'), - $directive->type, - $directive->typeAllowsNull - ); - } catch (HTMLPurifier_VarParserException $e) { - throw new HTMLPurifier_ConfigSchema_Exception($e->getMessage() . " in DEFAULT in directive hash '$id'"); - } - } - - if (isset($hash['DESCRIPTION'])) { - $directive->description = $hash->offsetGet('DESCRIPTION'); - } - - if (isset($hash['ALLOWED'])) { - $directive->allowed = $this->lookup($this->evalArray($hash->offsetGet('ALLOWED'))); - } - - if (isset($hash['VALUE-ALIASES'])) { - $directive->valueAliases = $this->evalArray($hash->offsetGet('VALUE-ALIASES')); - } - - if (isset($hash['ALIASES'])) { - $raw_aliases = trim($hash->offsetGet('ALIASES')); - $aliases = preg_split('/\s*,\s*/', $raw_aliases); - foreach ($aliases as $alias) { - $directive->aliases[] = $this->id($alias); - } - } - - if (isset($hash['VERSION'])) { - $directive->version = $hash->offsetGet('VERSION'); - } - - if (isset($hash['DEPRECATED-USE'])) { - $directive->deprecatedUse = $this->id($hash->offsetGet('DEPRECATED-USE')); - } - - if (isset($hash['DEPRECATED-VERSION'])) { - $directive->deprecatedVersion = $hash->offsetGet('DEPRECATED-VERSION'); - } - - if (isset($hash['EXTERNAL'])) { - $directive->external = preg_split('/\s*,\s*/', trim($hash->offsetGet('EXTERNAL'))); - } - - $interchange->addDirective($directive); - } - - /** - * Evaluates an array PHP code string without array() wrapper - * @param string $contents - */ - protected function evalArray($contents) - { - return eval('return array(' . $contents . ');'); - } - - /** - * Converts an array list into a lookup array. - * @param array $array - * @return array - */ - protected function lookup($array) - { - $ret = array(); - foreach ($array as $val) { - $ret[$val] = true; - } - return $ret; - } - - /** - * Convenience function that creates an HTMLPurifier_ConfigSchema_Interchange_Id - * object based on a string Id. - * @param string $id - * @return HTMLPurifier_ConfigSchema_Interchange_Id - */ - protected function id($id) - { - return HTMLPurifier_ConfigSchema_Interchange_Id::make($id); - } - - /** - * Triggers errors for any unused keys passed in the hash; such keys - * may indicate typos, missing values, etc. - * @param HTMLPurifier_StringHash $hash Hash to check. - */ - protected function _findUnused($hash) - { - $accessed = $hash->getAccessed(); - foreach ($hash as $k => $v) { - if (!isset($accessed[$k])) { - trigger_error("String hash key '$k' not used by builder", E_USER_NOTICE); - } - } - } -} - -// vim: et sw=4 sts=4 +varParser = $varParser ? $varParser : new HTMLPurifier_VarParser_Native(); + } + + /** + * @param string $dir + * @return HTMLPurifier_ConfigSchema_Interchange + */ + public static function buildFromDirectory($dir = null) + { + $builder = new HTMLPurifier_ConfigSchema_InterchangeBuilder(); + $interchange = new HTMLPurifier_ConfigSchema_Interchange(); + return $builder->buildDir($interchange, $dir); + } + + /** + * @param HTMLPurifier_ConfigSchema_Interchange $interchange + * @param string $dir + * @return HTMLPurifier_ConfigSchema_Interchange + */ + public function buildDir($interchange, $dir = null) + { + if (!$dir) { + $dir = HTMLPURIFIER_PREFIX . '/HTMLPurifier/ConfigSchema/schema'; + } + if (file_exists($dir . '/info.ini')) { + $info = parse_ini_file($dir . '/info.ini'); + $interchange->name = $info['name']; + } + + $files = array(); + $dh = opendir($dir); + while (false !== ($file = readdir($dh))) { + if (!$file || $file[0] == '.' || strrchr($file, '.') !== '.txt') { + continue; + } + $files[] = $file; + } + closedir($dh); + + sort($files); + foreach ($files as $file) { + $this->buildFile($interchange, $dir . '/' . $file); + } + return $interchange; + } + + /** + * @param HTMLPurifier_ConfigSchema_Interchange $interchange + * @param string $file + */ + public function buildFile($interchange, $file) + { + $parser = new HTMLPurifier_StringHashParser(); + $this->build( + $interchange, + new HTMLPurifier_StringHash($parser->parseFile($file)) + ); + } + + /** + * Builds an interchange object based on a hash. + * @param HTMLPurifier_ConfigSchema_Interchange $interchange HTMLPurifier_ConfigSchema_Interchange object to build + * @param HTMLPurifier_StringHash $hash source data + * @throws HTMLPurifier_ConfigSchema_Exception + */ + public function build($interchange, $hash) + { + if (!$hash instanceof HTMLPurifier_StringHash) { + $hash = new HTMLPurifier_StringHash($hash); + } + if (!isset($hash['ID'])) { + throw new HTMLPurifier_ConfigSchema_Exception('Hash does not have any ID'); + } + if (strpos($hash['ID'], '.') === false) { + if (count($hash) == 2 && isset($hash['DESCRIPTION'])) { + $hash->offsetGet('DESCRIPTION'); // prevent complaining + } else { + throw new HTMLPurifier_ConfigSchema_Exception('All directives must have a namespace'); + } + } else { + $this->buildDirective($interchange, $hash); + } + $this->_findUnused($hash); + } + + /** + * @param HTMLPurifier_ConfigSchema_Interchange $interchange + * @param HTMLPurifier_StringHash $hash + * @throws HTMLPurifier_ConfigSchema_Exception + */ + public function buildDirective($interchange, $hash) + { + $directive = new HTMLPurifier_ConfigSchema_Interchange_Directive(); + + // These are required elements: + $directive->id = $this->id($hash->offsetGet('ID')); + $id = $directive->id->toString(); // convenience + + if (isset($hash['TYPE'])) { + $type = explode('/', $hash->offsetGet('TYPE')); + if (isset($type[1])) { + $directive->typeAllowsNull = true; + } + $directive->type = $type[0]; + } else { + throw new HTMLPurifier_ConfigSchema_Exception("TYPE in directive hash '$id' not defined"); + } + + if (isset($hash['DEFAULT'])) { + try { + $directive->default = $this->varParser->parse( + $hash->offsetGet('DEFAULT'), + $directive->type, + $directive->typeAllowsNull + ); + } catch (HTMLPurifier_VarParserException $e) { + throw new HTMLPurifier_ConfigSchema_Exception($e->getMessage() . " in DEFAULT in directive hash '$id'"); + } + } + + if (isset($hash['DESCRIPTION'])) { + $directive->description = $hash->offsetGet('DESCRIPTION'); + } + + if (isset($hash['ALLOWED'])) { + $directive->allowed = $this->lookup($this->evalArray($hash->offsetGet('ALLOWED'))); + } + + if (isset($hash['VALUE-ALIASES'])) { + $directive->valueAliases = $this->evalArray($hash->offsetGet('VALUE-ALIASES')); + } + + if (isset($hash['ALIASES'])) { + $raw_aliases = trim($hash->offsetGet('ALIASES')); + $aliases = preg_split('/\s*,\s*/', $raw_aliases); + foreach ($aliases as $alias) { + $directive->aliases[] = $this->id($alias); + } + } + + if (isset($hash['VERSION'])) { + $directive->version = $hash->offsetGet('VERSION'); + } + + if (isset($hash['DEPRECATED-USE'])) { + $directive->deprecatedUse = $this->id($hash->offsetGet('DEPRECATED-USE')); + } + + if (isset($hash['DEPRECATED-VERSION'])) { + $directive->deprecatedVersion = $hash->offsetGet('DEPRECATED-VERSION'); + } + + if (isset($hash['EXTERNAL'])) { + $directive->external = preg_split('/\s*,\s*/', trim($hash->offsetGet('EXTERNAL'))); + } + + $interchange->addDirective($directive); + } + + /** + * Evaluates an array PHP code string without array() wrapper + * @param string $contents + */ + protected function evalArray($contents) + { + return eval('return array(' . $contents . ');'); + } + + /** + * Converts an array list into a lookup array. + * @param array $array + * @return array + */ + protected function lookup($array) + { + $ret = array(); + foreach ($array as $val) { + $ret[$val] = true; + } + return $ret; + } + + /** + * Convenience function that creates an HTMLPurifier_ConfigSchema_Interchange_Id + * object based on a string Id. + * @param string $id + * @return HTMLPurifier_ConfigSchema_Interchange_Id + */ + protected function id($id) + { + return HTMLPurifier_ConfigSchema_Interchange_Id::make($id); + } + + /** + * Triggers errors for any unused keys passed in the hash; such keys + * may indicate typos, missing values, etc. + * @param HTMLPurifier_StringHash $hash Hash to check. + */ + protected function _findUnused($hash) + { + $accessed = $hash->getAccessed(); + foreach ($hash as $k => $v) { + if (!isset($accessed[$k])) { + trigger_error("String hash key '$k' not used by builder", E_USER_NOTICE); + } + } + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/Validator.php b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/Validator.php similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/Validator.php rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/Validator.php index 9f14444f3..fb3127788 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/Validator.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/Validator.php @@ -1,248 +1,248 @@ -parser = new HTMLPurifier_VarParser(); - } - - /** - * Validates a fully-formed interchange object. - * @param HTMLPurifier_ConfigSchema_Interchange $interchange - * @return bool - */ - public function validate($interchange) - { - $this->interchange = $interchange; - $this->aliases = array(); - // PHP is a bit lax with integer <=> string conversions in - // arrays, so we don't use the identical !== comparison - foreach ($interchange->directives as $i => $directive) { - $id = $directive->id->toString(); - if ($i != $id) { - $this->error(false, "Integrity violation: key '$i' does not match internal id '$id'"); - } - $this->validateDirective($directive); - } - return true; - } - - /** - * Validates a HTMLPurifier_ConfigSchema_Interchange_Id object. - * @param HTMLPurifier_ConfigSchema_Interchange_Id $id - */ - public function validateId($id) - { - $id_string = $id->toString(); - $this->context[] = "id '$id_string'"; - if (!$id instanceof HTMLPurifier_ConfigSchema_Interchange_Id) { - // handled by InterchangeBuilder - $this->error(false, 'is not an instance of HTMLPurifier_ConfigSchema_Interchange_Id'); - } - // keys are now unconstrained (we might want to narrow down to A-Za-z0-9.) - // we probably should check that it has at least one namespace - $this->with($id, 'key') - ->assertNotEmpty() - ->assertIsString(); // implicit assertIsString handled by InterchangeBuilder - array_pop($this->context); - } - - /** - * Validates a HTMLPurifier_ConfigSchema_Interchange_Directive object. - * @param HTMLPurifier_ConfigSchema_Interchange_Directive $d - */ - public function validateDirective($d) - { - $id = $d->id->toString(); - $this->context[] = "directive '$id'"; - $this->validateId($d->id); - - $this->with($d, 'description') - ->assertNotEmpty(); - - // BEGIN - handled by InterchangeBuilder - $this->with($d, 'type') - ->assertNotEmpty(); - $this->with($d, 'typeAllowsNull') - ->assertIsBool(); - try { - // This also tests validity of $d->type - $this->parser->parse($d->default, $d->type, $d->typeAllowsNull); - } catch (HTMLPurifier_VarParserException $e) { - $this->error('default', 'had error: ' . $e->getMessage()); - } - // END - handled by InterchangeBuilder - - if (!is_null($d->allowed) || !empty($d->valueAliases)) { - // allowed and valueAliases require that we be dealing with - // strings, so check for that early. - $d_int = HTMLPurifier_VarParser::$types[$d->type]; - if (!isset(HTMLPurifier_VarParser::$stringTypes[$d_int])) { - $this->error('type', 'must be a string type when used with allowed or value aliases'); - } - } - - $this->validateDirectiveAllowed($d); - $this->validateDirectiveValueAliases($d); - $this->validateDirectiveAliases($d); - - array_pop($this->context); - } - - /** - * Extra validation if $allowed member variable of - * HTMLPurifier_ConfigSchema_Interchange_Directive is defined. - * @param HTMLPurifier_ConfigSchema_Interchange_Directive $d - */ - public function validateDirectiveAllowed($d) - { - if (is_null($d->allowed)) { - return; - } - $this->with($d, 'allowed') - ->assertNotEmpty() - ->assertIsLookup(); // handled by InterchangeBuilder - if (is_string($d->default) && !isset($d->allowed[$d->default])) { - $this->error('default', 'must be an allowed value'); - } - $this->context[] = 'allowed'; - foreach ($d->allowed as $val => $x) { - if (!is_string($val)) { - $this->error("value $val", 'must be a string'); - } - } - array_pop($this->context); - } - - /** - * Extra validation if $valueAliases member variable of - * HTMLPurifier_ConfigSchema_Interchange_Directive is defined. - * @param HTMLPurifier_ConfigSchema_Interchange_Directive $d - */ - public function validateDirectiveValueAliases($d) - { - if (is_null($d->valueAliases)) { - return; - } - $this->with($d, 'valueAliases') - ->assertIsArray(); // handled by InterchangeBuilder - $this->context[] = 'valueAliases'; - foreach ($d->valueAliases as $alias => $real) { - if (!is_string($alias)) { - $this->error("alias $alias", 'must be a string'); - } - if (!is_string($real)) { - $this->error("alias target $real from alias '$alias'", 'must be a string'); - } - if ($alias === $real) { - $this->error("alias '$alias'", "must not be an alias to itself"); - } - } - if (!is_null($d->allowed)) { - foreach ($d->valueAliases as $alias => $real) { - if (isset($d->allowed[$alias])) { - $this->error("alias '$alias'", 'must not be an allowed value'); - } elseif (!isset($d->allowed[$real])) { - $this->error("alias '$alias'", 'must be an alias to an allowed value'); - } - } - } - array_pop($this->context); - } - - /** - * Extra validation if $aliases member variable of - * HTMLPurifier_ConfigSchema_Interchange_Directive is defined. - * @param HTMLPurifier_ConfigSchema_Interchange_Directive $d - */ - public function validateDirectiveAliases($d) - { - $this->with($d, 'aliases') - ->assertIsArray(); // handled by InterchangeBuilder - $this->context[] = 'aliases'; - foreach ($d->aliases as $alias) { - $this->validateId($alias); - $s = $alias->toString(); - if (isset($this->interchange->directives[$s])) { - $this->error("alias '$s'", 'collides with another directive'); - } - if (isset($this->aliases[$s])) { - $other_directive = $this->aliases[$s]; - $this->error("alias '$s'", "collides with alias for directive '$other_directive'"); - } - $this->aliases[$s] = $d->id->toString(); - } - array_pop($this->context); - } - - // protected helper functions - - /** - * Convenience function for generating HTMLPurifier_ConfigSchema_ValidatorAtom - * for validating simple member variables of objects. - * @param $obj - * @param $member - * @return HTMLPurifier_ConfigSchema_ValidatorAtom - */ - protected function with($obj, $member) - { - return new HTMLPurifier_ConfigSchema_ValidatorAtom($this->getFormattedContext(), $obj, $member); - } - - /** - * Emits an error, providing helpful context. - * @throws HTMLPurifier_ConfigSchema_Exception - */ - protected function error($target, $msg) - { - if ($target !== false) { - $prefix = ucfirst($target) . ' in ' . $this->getFormattedContext(); - } else { - $prefix = ucfirst($this->getFormattedContext()); - } - throw new HTMLPurifier_ConfigSchema_Exception(trim($prefix . ' ' . $msg)); - } - - /** - * Returns a formatted context string. - * @return string - */ - protected function getFormattedContext() - { - return implode(' in ', array_reverse($this->context)); - } -} - -// vim: et sw=4 sts=4 +parser = new HTMLPurifier_VarParser(); + } + + /** + * Validates a fully-formed interchange object. + * @param HTMLPurifier_ConfigSchema_Interchange $interchange + * @return bool + */ + public function validate($interchange) + { + $this->interchange = $interchange; + $this->aliases = array(); + // PHP is a bit lax with integer <=> string conversions in + // arrays, so we don't use the identical !== comparison + foreach ($interchange->directives as $i => $directive) { + $id = $directive->id->toString(); + if ($i != $id) { + $this->error(false, "Integrity violation: key '$i' does not match internal id '$id'"); + } + $this->validateDirective($directive); + } + return true; + } + + /** + * Validates a HTMLPurifier_ConfigSchema_Interchange_Id object. + * @param HTMLPurifier_ConfigSchema_Interchange_Id $id + */ + public function validateId($id) + { + $id_string = $id->toString(); + $this->context[] = "id '$id_string'"; + if (!$id instanceof HTMLPurifier_ConfigSchema_Interchange_Id) { + // handled by InterchangeBuilder + $this->error(false, 'is not an instance of HTMLPurifier_ConfigSchema_Interchange_Id'); + } + // keys are now unconstrained (we might want to narrow down to A-Za-z0-9.) + // we probably should check that it has at least one namespace + $this->with($id, 'key') + ->assertNotEmpty() + ->assertIsString(); // implicit assertIsString handled by InterchangeBuilder + array_pop($this->context); + } + + /** + * Validates a HTMLPurifier_ConfigSchema_Interchange_Directive object. + * @param HTMLPurifier_ConfigSchema_Interchange_Directive $d + */ + public function validateDirective($d) + { + $id = $d->id->toString(); + $this->context[] = "directive '$id'"; + $this->validateId($d->id); + + $this->with($d, 'description') + ->assertNotEmpty(); + + // BEGIN - handled by InterchangeBuilder + $this->with($d, 'type') + ->assertNotEmpty(); + $this->with($d, 'typeAllowsNull') + ->assertIsBool(); + try { + // This also tests validity of $d->type + $this->parser->parse($d->default, $d->type, $d->typeAllowsNull); + } catch (HTMLPurifier_VarParserException $e) { + $this->error('default', 'had error: ' . $e->getMessage()); + } + // END - handled by InterchangeBuilder + + if (!is_null($d->allowed) || !empty($d->valueAliases)) { + // allowed and valueAliases require that we be dealing with + // strings, so check for that early. + $d_int = HTMLPurifier_VarParser::$types[$d->type]; + if (!isset(HTMLPurifier_VarParser::$stringTypes[$d_int])) { + $this->error('type', 'must be a string type when used with allowed or value aliases'); + } + } + + $this->validateDirectiveAllowed($d); + $this->validateDirectiveValueAliases($d); + $this->validateDirectiveAliases($d); + + array_pop($this->context); + } + + /** + * Extra validation if $allowed member variable of + * HTMLPurifier_ConfigSchema_Interchange_Directive is defined. + * @param HTMLPurifier_ConfigSchema_Interchange_Directive $d + */ + public function validateDirectiveAllowed($d) + { + if (is_null($d->allowed)) { + return; + } + $this->with($d, 'allowed') + ->assertNotEmpty() + ->assertIsLookup(); // handled by InterchangeBuilder + if (is_string($d->default) && !isset($d->allowed[$d->default])) { + $this->error('default', 'must be an allowed value'); + } + $this->context[] = 'allowed'; + foreach ($d->allowed as $val => $x) { + if (!is_string($val)) { + $this->error("value $val", 'must be a string'); + } + } + array_pop($this->context); + } + + /** + * Extra validation if $valueAliases member variable of + * HTMLPurifier_ConfigSchema_Interchange_Directive is defined. + * @param HTMLPurifier_ConfigSchema_Interchange_Directive $d + */ + public function validateDirectiveValueAliases($d) + { + if (is_null($d->valueAliases)) { + return; + } + $this->with($d, 'valueAliases') + ->assertIsArray(); // handled by InterchangeBuilder + $this->context[] = 'valueAliases'; + foreach ($d->valueAliases as $alias => $real) { + if (!is_string($alias)) { + $this->error("alias $alias", 'must be a string'); + } + if (!is_string($real)) { + $this->error("alias target $real from alias '$alias'", 'must be a string'); + } + if ($alias === $real) { + $this->error("alias '$alias'", "must not be an alias to itself"); + } + } + if (!is_null($d->allowed)) { + foreach ($d->valueAliases as $alias => $real) { + if (isset($d->allowed[$alias])) { + $this->error("alias '$alias'", 'must not be an allowed value'); + } elseif (!isset($d->allowed[$real])) { + $this->error("alias '$alias'", 'must be an alias to an allowed value'); + } + } + } + array_pop($this->context); + } + + /** + * Extra validation if $aliases member variable of + * HTMLPurifier_ConfigSchema_Interchange_Directive is defined. + * @param HTMLPurifier_ConfigSchema_Interchange_Directive $d + */ + public function validateDirectiveAliases($d) + { + $this->with($d, 'aliases') + ->assertIsArray(); // handled by InterchangeBuilder + $this->context[] = 'aliases'; + foreach ($d->aliases as $alias) { + $this->validateId($alias); + $s = $alias->toString(); + if (isset($this->interchange->directives[$s])) { + $this->error("alias '$s'", 'collides with another directive'); + } + if (isset($this->aliases[$s])) { + $other_directive = $this->aliases[$s]; + $this->error("alias '$s'", "collides with alias for directive '$other_directive'"); + } + $this->aliases[$s] = $d->id->toString(); + } + array_pop($this->context); + } + + // protected helper functions + + /** + * Convenience function for generating HTMLPurifier_ConfigSchema_ValidatorAtom + * for validating simple member variables of objects. + * @param $obj + * @param $member + * @return HTMLPurifier_ConfigSchema_ValidatorAtom + */ + protected function with($obj, $member) + { + return new HTMLPurifier_ConfigSchema_ValidatorAtom($this->getFormattedContext(), $obj, $member); + } + + /** + * Emits an error, providing helpful context. + * @throws HTMLPurifier_ConfigSchema_Exception + */ + protected function error($target, $msg) + { + if ($target !== false) { + $prefix = ucfirst($target) . ' in ' . $this->getFormattedContext(); + } else { + $prefix = ucfirst($this->getFormattedContext()); + } + throw new HTMLPurifier_ConfigSchema_Exception(trim($prefix . ' ' . $msg)); + } + + /** + * Returns a formatted context string. + * @return string + */ + protected function getFormattedContext() + { + return implode(' in ', array_reverse($this->context)); + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/ValidatorAtom.php b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/ValidatorAtom.php similarity index 95% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/ValidatorAtom.php rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/ValidatorAtom.php index a2e0b4a1b..c9aa3644a 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/ValidatorAtom.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/ValidatorAtom.php @@ -1,130 +1,130 @@ -context = $context; - $this->obj = $obj; - $this->member = $member; - $this->contents =& $obj->$member; - } - - /** - * @return HTMLPurifier_ConfigSchema_ValidatorAtom - */ - public function assertIsString() - { - if (!is_string($this->contents)) { - $this->error('must be a string'); - } - return $this; - } - - /** - * @return HTMLPurifier_ConfigSchema_ValidatorAtom - */ - public function assertIsBool() - { - if (!is_bool($this->contents)) { - $this->error('must be a boolean'); - } - return $this; - } - - /** - * @return HTMLPurifier_ConfigSchema_ValidatorAtom - */ - public function assertIsArray() - { - if (!is_array($this->contents)) { - $this->error('must be an array'); - } - return $this; - } - - /** - * @return HTMLPurifier_ConfigSchema_ValidatorAtom - */ - public function assertNotNull() - { - if ($this->contents === null) { - $this->error('must not be null'); - } - return $this; - } - - /** - * @return HTMLPurifier_ConfigSchema_ValidatorAtom - */ - public function assertAlnum() - { - $this->assertIsString(); - if (!ctype_alnum($this->contents)) { - $this->error('must be alphanumeric'); - } - return $this; - } - - /** - * @return HTMLPurifier_ConfigSchema_ValidatorAtom - */ - public function assertNotEmpty() - { - if (empty($this->contents)) { - $this->error('must not be empty'); - } - return $this; - } - - /** - * @return HTMLPurifier_ConfigSchema_ValidatorAtom - */ - public function assertIsLookup() - { - $this->assertIsArray(); - foreach ($this->contents as $v) { - if ($v !== true) { - $this->error('must be a lookup array'); - } - } - return $this; - } - - /** - * @param string $msg - * @throws HTMLPurifier_ConfigSchema_Exception - */ - protected function error($msg) - { - throw new HTMLPurifier_ConfigSchema_Exception(ucfirst($this->member) . ' in ' . $this->context . ' ' . $msg); - } -} - -// vim: et sw=4 sts=4 +context = $context; + $this->obj = $obj; + $this->member = $member; + $this->contents =& $obj->$member; + } + + /** + * @return HTMLPurifier_ConfigSchema_ValidatorAtom + */ + public function assertIsString() + { + if (!is_string($this->contents)) { + $this->error('must be a string'); + } + return $this; + } + + /** + * @return HTMLPurifier_ConfigSchema_ValidatorAtom + */ + public function assertIsBool() + { + if (!is_bool($this->contents)) { + $this->error('must be a boolean'); + } + return $this; + } + + /** + * @return HTMLPurifier_ConfigSchema_ValidatorAtom + */ + public function assertIsArray() + { + if (!is_array($this->contents)) { + $this->error('must be an array'); + } + return $this; + } + + /** + * @return HTMLPurifier_ConfigSchema_ValidatorAtom + */ + public function assertNotNull() + { + if ($this->contents === null) { + $this->error('must not be null'); + } + return $this; + } + + /** + * @return HTMLPurifier_ConfigSchema_ValidatorAtom + */ + public function assertAlnum() + { + $this->assertIsString(); + if (!ctype_alnum($this->contents)) { + $this->error('must be alphanumeric'); + } + return $this; + } + + /** + * @return HTMLPurifier_ConfigSchema_ValidatorAtom + */ + public function assertNotEmpty() + { + if (empty($this->contents)) { + $this->error('must not be empty'); + } + return $this; + } + + /** + * @return HTMLPurifier_ConfigSchema_ValidatorAtom + */ + public function assertIsLookup() + { + $this->assertIsArray(); + foreach ($this->contents as $v) { + if ($v !== true) { + $this->error('must be a lookup array'); + } + } + return $this; + } + + /** + * @param string $msg + * @throws HTMLPurifier_ConfigSchema_Exception + */ + protected function error($msg) + { + throw new HTMLPurifier_ConfigSchema_Exception(ucfirst($this->member) . ' in ' . $this->context . ' ' . $msg); + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema.ser b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema.ser similarity index 100% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema.ser rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema.ser diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.AllowedClasses.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.AllowedClasses.txt similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.AllowedClasses.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.AllowedClasses.txt index 4a42382ec..0517fed0a 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.AllowedClasses.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.AllowedClasses.txt @@ -1,8 +1,8 @@ -Attr.AllowedClasses -TYPE: lookup/null -VERSION: 4.0.0 -DEFAULT: null ---DESCRIPTION-- -List of allowed class values in the class attribute. By default, this is null, -which means all classes are allowed. ---# vim: et sw=4 sts=4 +Attr.AllowedClasses +TYPE: lookup/null +VERSION: 4.0.0 +DEFAULT: null +--DESCRIPTION-- +List of allowed class values in the class attribute. By default, this is null, +which means all classes are allowed. +--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.AllowedFrameTargets.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.AllowedFrameTargets.txt similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.AllowedFrameTargets.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.AllowedFrameTargets.txt index b033eb516..249edd647 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.AllowedFrameTargets.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.AllowedFrameTargets.txt @@ -1,12 +1,12 @@ -Attr.AllowedFrameTargets -TYPE: lookup -DEFAULT: array() ---DESCRIPTION-- -Lookup table of all allowed link frame targets. Some commonly used link -targets include _blank, _self, _parent and _top. Values should be -lowercase, as validation will be done in a case-sensitive manner despite -W3C's recommendation. XHTML 1.0 Strict does not permit the target attribute -so this directive will have no effect in that doctype. XHTML 1.1 does not -enable the Target module by default, you will have to manually enable it -(see the module documentation for more details.) ---# vim: et sw=4 sts=4 +Attr.AllowedFrameTargets +TYPE: lookup +DEFAULT: array() +--DESCRIPTION-- +Lookup table of all allowed link frame targets. Some commonly used link +targets include _blank, _self, _parent and _top. Values should be +lowercase, as validation will be done in a case-sensitive manner despite +W3C's recommendation. XHTML 1.0 Strict does not permit the target attribute +so this directive will have no effect in that doctype. XHTML 1.1 does not +enable the Target module by default, you will have to manually enable it +(see the module documentation for more details.) +--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRel.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRel.txt similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRel.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRel.txt index ed72a9d56..9a8fa6a2e 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRel.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRel.txt @@ -1,9 +1,9 @@ -Attr.AllowedRel -TYPE: lookup -VERSION: 1.6.0 -DEFAULT: array() ---DESCRIPTION-- -List of allowed forward document relationships in the rel attribute. Common -values may be nofollow or print. By default, this is empty, meaning that no -document relationships are allowed. ---# vim: et sw=4 sts=4 +Attr.AllowedRel +TYPE: lookup +VERSION: 1.6.0 +DEFAULT: array() +--DESCRIPTION-- +List of allowed forward document relationships in the rel attribute. Common +values may be nofollow or print. By default, this is empty, meaning that no +document relationships are allowed. +--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRev.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRev.txt similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRev.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRev.txt index 1ae672d01..b01788348 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRev.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRev.txt @@ -1,9 +1,9 @@ -Attr.AllowedRev -TYPE: lookup -VERSION: 1.6.0 -DEFAULT: array() ---DESCRIPTION-- -List of allowed reverse document relationships in the rev attribute. This -attribute is a bit of an edge-case; if you don't know what it is for, stay -away. ---# vim: et sw=4 sts=4 +Attr.AllowedRev +TYPE: lookup +VERSION: 1.6.0 +DEFAULT: array() +--DESCRIPTION-- +List of allowed reverse document relationships in the rev attribute. This +attribute is a bit of an edge-case; if you don't know what it is for, stay +away. +--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.ClassUseCDATA.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.ClassUseCDATA.txt similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.ClassUseCDATA.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.ClassUseCDATA.txt index 119a9d2c6..e774b823b 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.ClassUseCDATA.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.ClassUseCDATA.txt @@ -1,19 +1,19 @@ -Attr.ClassUseCDATA -TYPE: bool/null -DEFAULT: null -VERSION: 4.0.0 ---DESCRIPTION-- -If null, class will auto-detect the doctype and, if matching XHTML 1.1 or -XHTML 2.0, will use the restrictive NMTOKENS specification of class. Otherwise, -it will use a relaxed CDATA definition. If true, the relaxed CDATA definition -is forced; if false, the NMTOKENS definition is forced. To get behavior -of HTML Purifier prior to 4.0.0, set this directive to false. - -Some rational behind the auto-detection: -in previous versions of HTML Purifier, it was assumed that the form of -class was NMTOKENS, as specified by the XHTML Modularization (representing -XHTML 1.1 and XHTML 2.0). The DTDs for HTML 4.01 and XHTML 1.0, however -specify class as CDATA. HTML 5 effectively defines it as CDATA, but -with the additional constraint that each name should be unique (this is not -explicitly outlined in previous specifications). ---# vim: et sw=4 sts=4 +Attr.ClassUseCDATA +TYPE: bool/null +DEFAULT: null +VERSION: 4.0.0 +--DESCRIPTION-- +If null, class will auto-detect the doctype and, if matching XHTML 1.1 or +XHTML 2.0, will use the restrictive NMTOKENS specification of class. Otherwise, +it will use a relaxed CDATA definition. If true, the relaxed CDATA definition +is forced; if false, the NMTOKENS definition is forced. To get behavior +of HTML Purifier prior to 4.0.0, set this directive to false. + +Some rational behind the auto-detection: +in previous versions of HTML Purifier, it was assumed that the form of +class was NMTOKENS, as specified by the XHTML Modularization (representing +XHTML 1.1 and XHTML 2.0). The DTDs for HTML 4.01 and XHTML 1.0, however +specify class as CDATA. HTML 5 effectively defines it as CDATA, but +with the additional constraint that each name should be unique (this is not +explicitly outlined in previous specifications). +--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.DefaultImageAlt.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.DefaultImageAlt.txt similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.DefaultImageAlt.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.DefaultImageAlt.txt index 80b1431c3..533165e17 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.DefaultImageAlt.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.DefaultImageAlt.txt @@ -1,11 +1,11 @@ -Attr.DefaultImageAlt -TYPE: string/null -DEFAULT: null -VERSION: 3.2.0 ---DESCRIPTION-- -This is the content of the alt tag of an image if the user had not -previously specified an alt attribute. This applies to all images without -a valid alt attribute, as opposed to %Attr.DefaultInvalidImageAlt, which -only applies to invalid images, and overrides in the case of an invalid image. -Default behavior with null is to use the basename of the src tag for the alt. ---# vim: et sw=4 sts=4 +Attr.DefaultImageAlt +TYPE: string/null +DEFAULT: null +VERSION: 3.2.0 +--DESCRIPTION-- +This is the content of the alt tag of an image if the user had not +previously specified an alt attribute. This applies to all images without +a valid alt attribute, as opposed to %Attr.DefaultInvalidImageAlt, which +only applies to invalid images, and overrides in the case of an invalid image. +Default behavior with null is to use the basename of the src tag for the alt. +--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImage.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImage.txt similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImage.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImage.txt index c51000d1d..9eb7e3846 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImage.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImage.txt @@ -1,9 +1,9 @@ -Attr.DefaultInvalidImage -TYPE: string -DEFAULT: '' ---DESCRIPTION-- -This is the default image an img tag will be pointed to if it does not have -a valid src attribute. In future versions, we may allow the image tag to -be removed completely, but due to design issues, this is not possible right -now. ---# vim: et sw=4 sts=4 +Attr.DefaultInvalidImage +TYPE: string +DEFAULT: '' +--DESCRIPTION-- +This is the default image an img tag will be pointed to if it does not have +a valid src attribute. In future versions, we may allow the image tag to +be removed completely, but due to design issues, this is not possible right +now. +--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImageAlt.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImageAlt.txt similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImageAlt.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImageAlt.txt index c1ec4b038..2f17bf477 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImageAlt.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImageAlt.txt @@ -1,8 +1,8 @@ -Attr.DefaultInvalidImageAlt -TYPE: string -DEFAULT: 'Invalid image' ---DESCRIPTION-- -This is the content of the alt tag of an invalid image if the user had not -previously specified an alt attribute. It has no effect when the image is -valid but there was no alt attribute present. ---# vim: et sw=4 sts=4 +Attr.DefaultInvalidImageAlt +TYPE: string +DEFAULT: 'Invalid image' +--DESCRIPTION-- +This is the content of the alt tag of an invalid image if the user had not +previously specified an alt attribute. It has no effect when the image is +valid but there was no alt attribute present. +--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.DefaultTextDir.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.DefaultTextDir.txt similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.DefaultTextDir.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.DefaultTextDir.txt index f57dcc40f..52654b53a 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.DefaultTextDir.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.DefaultTextDir.txt @@ -1,10 +1,10 @@ -Attr.DefaultTextDir -TYPE: string -DEFAULT: 'ltr' ---DESCRIPTION-- -Defines the default text direction (ltr or rtl) of the document being -parsed. This generally is the same as the value of the dir attribute in -HTML, or ltr if that is not specified. ---ALLOWED-- -'ltr', 'rtl' ---# vim: et sw=4 sts=4 +Attr.DefaultTextDir +TYPE: string +DEFAULT: 'ltr' +--DESCRIPTION-- +Defines the default text direction (ltr or rtl) of the document being +parsed. This generally is the same as the value of the dir attribute in +HTML, or ltr if that is not specified. +--ALLOWED-- +'ltr', 'rtl' +--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.EnableID.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.EnableID.txt similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.EnableID.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.EnableID.txt index 9b93a5575..6440d2103 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.EnableID.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.EnableID.txt @@ -1,16 +1,16 @@ -Attr.EnableID -TYPE: bool -DEFAULT: false -VERSION: 1.2.0 ---DESCRIPTION-- -Allows the ID attribute in HTML. This is disabled by default due to the -fact that without proper configuration user input can easily break the -validation of a webpage by specifying an ID that is already on the -surrounding HTML. If you don't mind throwing caution to the wind, enable -this directive, but I strongly recommend you also consider blacklisting IDs -you use (%Attr.IDBlacklist) or prefixing all user supplied IDs -(%Attr.IDPrefix). When set to true HTML Purifier reverts to the behavior of -pre-1.2.0 versions. ---ALIASES-- -HTML.EnableAttrID ---# vim: et sw=4 sts=4 +Attr.EnableID +TYPE: bool +DEFAULT: false +VERSION: 1.2.0 +--DESCRIPTION-- +Allows the ID attribute in HTML. This is disabled by default due to the +fact that without proper configuration user input can easily break the +validation of a webpage by specifying an ID that is already on the +surrounding HTML. If you don't mind throwing caution to the wind, enable +this directive, but I strongly recommend you also consider blacklisting IDs +you use (%Attr.IDBlacklist) or prefixing all user supplied IDs +(%Attr.IDPrefix). When set to true HTML Purifier reverts to the behavior of +pre-1.2.0 versions. +--ALIASES-- +HTML.EnableAttrID +--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.ForbiddenClasses.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.ForbiddenClasses.txt similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.ForbiddenClasses.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.ForbiddenClasses.txt index fed8954cf..f31d226f5 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.ForbiddenClasses.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.ForbiddenClasses.txt @@ -1,8 +1,8 @@ -Attr.ForbiddenClasses -TYPE: lookup -VERSION: 4.0.0 -DEFAULT: array() ---DESCRIPTION-- -List of forbidden class values in the class attribute. By default, this is -empty, which means that no classes are forbidden. See also %Attr.AllowedClasses. ---# vim: et sw=4 sts=4 +Attr.ForbiddenClasses +TYPE: lookup +VERSION: 4.0.0 +DEFAULT: array() +--DESCRIPTION-- +List of forbidden class values in the class attribute. By default, this is +empty, which means that no classes are forbidden. See also %Attr.AllowedClasses. +--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklist.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklist.txt similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklist.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklist.txt index 52168bb5e..5f2b5e3d2 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklist.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklist.txt @@ -1,5 +1,5 @@ -Attr.IDBlacklist -TYPE: list -DEFAULT: array() -DESCRIPTION: Array of IDs not allowed in the document. ---# vim: et sw=4 sts=4 +Attr.IDBlacklist +TYPE: list +DEFAULT: array() +DESCRIPTION: Array of IDs not allowed in the document. +--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklistRegexp.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklistRegexp.txt similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklistRegexp.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklistRegexp.txt index 7b8504307..6f5824586 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklistRegexp.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklistRegexp.txt @@ -1,9 +1,9 @@ -Attr.IDBlacklistRegexp -TYPE: string/null -VERSION: 1.6.0 -DEFAULT: NULL ---DESCRIPTION-- -PCRE regular expression to be matched against all IDs. If the expression is -matches, the ID is rejected. Use this with care: may cause significant -degradation. ID matching is done after all other validation. ---# vim: et sw=4 sts=4 +Attr.IDBlacklistRegexp +TYPE: string/null +VERSION: 1.6.0 +DEFAULT: NULL +--DESCRIPTION-- +PCRE regular expression to be matched against all IDs. If the expression is +matches, the ID is rejected. Use this with care: may cause significant +degradation. ID matching is done after all other validation. +--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefix.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefix.txt similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefix.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefix.txt index 578138277..cc49d43fd 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefix.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefix.txt @@ -1,12 +1,12 @@ -Attr.IDPrefix -TYPE: string -VERSION: 1.2.0 -DEFAULT: '' ---DESCRIPTION-- -String to prefix to IDs. If you have no idea what IDs your pages may use, -you may opt to simply add a prefix to all user-submitted ID attributes so -that they are still usable, but will not conflict with core page IDs. -Example: setting the directive to 'user_' will result in a user submitted -'foo' to become 'user_foo' Be sure to set %HTML.EnableAttrID to true -before using this. ---# vim: et sw=4 sts=4 +Attr.IDPrefix +TYPE: string +VERSION: 1.2.0 +DEFAULT: '' +--DESCRIPTION-- +String to prefix to IDs. If you have no idea what IDs your pages may use, +you may opt to simply add a prefix to all user-submitted ID attributes so +that they are still usable, but will not conflict with core page IDs. +Example: setting the directive to 'user_' will result in a user submitted +'foo' to become 'user_foo' Be sure to set %HTML.EnableAttrID to true +before using this. +--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefixLocal.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefixLocal.txt similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefixLocal.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefixLocal.txt index f91fcd602..2c5924a7a 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefixLocal.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefixLocal.txt @@ -1,14 +1,14 @@ -Attr.IDPrefixLocal -TYPE: string -VERSION: 1.2.0 -DEFAULT: '' ---DESCRIPTION-- -Temporary prefix for IDs used in conjunction with %Attr.IDPrefix. If you -need to allow multiple sets of user content on web page, you may need to -have a seperate prefix that changes with each iteration. This way, -seperately submitted user content displayed on the same page doesn't -clobber each other. Ideal values are unique identifiers for the content it -represents (i.e. the id of the row in the database). Be sure to add a -seperator (like an underscore) at the end. Warning: this directive will -not work unless %Attr.IDPrefix is set to a non-empty value! ---# vim: et sw=4 sts=4 +Attr.IDPrefixLocal +TYPE: string +VERSION: 1.2.0 +DEFAULT: '' +--DESCRIPTION-- +Temporary prefix for IDs used in conjunction with %Attr.IDPrefix. If you +need to allow multiple sets of user content on web page, you may need to +have a seperate prefix that changes with each iteration. This way, +seperately submitted user content displayed on the same page doesn't +clobber each other. Ideal values are unique identifiers for the content it +represents (i.e. the id of the row in the database). Be sure to add a +seperator (like an underscore) at the end. Warning: this directive will +not work unless %Attr.IDPrefix is set to a non-empty value! +--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.AutoParagraph.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.AutoParagraph.txt similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.AutoParagraph.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.AutoParagraph.txt index 2d7f94e02..d5caa1bb9 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.AutoParagraph.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.AutoParagraph.txt @@ -1,31 +1,31 @@ -AutoFormat.AutoParagraph -TYPE: bool -VERSION: 2.0.1 -DEFAULT: false ---DESCRIPTION-- - -

- This directive turns on auto-paragraphing, where double newlines are - converted in to paragraphs whenever possible. Auto-paragraphing: -

-
    -
  • Always applies to inline elements or text in the root node,
  • -
  • Applies to inline elements or text with double newlines in nodes - that allow paragraph tags,
  • -
  • Applies to double newlines in paragraph tags
  • -
-

- p tags must be allowed for this directive to take effect. - We do not use br tags for paragraphing, as that is - semantically incorrect. -

-

- To prevent auto-paragraphing as a content-producer, refrain from using - double-newlines except to specify a new paragraph or in contexts where - it has special meaning (whitespace usually has no meaning except in - tags like pre, so this should not be difficult.) To prevent - the paragraphing of inline text adjacent to block elements, wrap them - in div tags (the behavior is slightly different outside of - the root node.) -

---# vim: et sw=4 sts=4 +AutoFormat.AutoParagraph +TYPE: bool +VERSION: 2.0.1 +DEFAULT: false +--DESCRIPTION-- + +

+ This directive turns on auto-paragraphing, where double newlines are + converted in to paragraphs whenever possible. Auto-paragraphing: +

+
    +
  • Always applies to inline elements or text in the root node,
  • +
  • Applies to inline elements or text with double newlines in nodes + that allow paragraph tags,
  • +
  • Applies to double newlines in paragraph tags
  • +
+

+ p tags must be allowed for this directive to take effect. + We do not use br tags for paragraphing, as that is + semantically incorrect. +

+

+ To prevent auto-paragraphing as a content-producer, refrain from using + double-newlines except to specify a new paragraph or in contexts where + it has special meaning (whitespace usually has no meaning except in + tags like pre, so this should not be difficult.) To prevent + the paragraphing of inline text adjacent to block elements, wrap them + in div tags (the behavior is slightly different outside of + the root node.) +

+--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.Custom.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.Custom.txt similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.Custom.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.Custom.txt index 2eb1974fd..2a476481a 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.Custom.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.Custom.txt @@ -1,12 +1,12 @@ -AutoFormat.Custom -TYPE: list -VERSION: 2.0.1 -DEFAULT: array() ---DESCRIPTION-- - -

- This directive can be used to add custom auto-format injectors. - Specify an array of injector names (class name minus the prefix) - or concrete implementations. Injector class must exist. -

---# vim: et sw=4 sts=4 +AutoFormat.Custom +TYPE: list +VERSION: 2.0.1 +DEFAULT: array() +--DESCRIPTION-- + +

+ This directive can be used to add custom auto-format injectors. + Specify an array of injector names (class name minus the prefix) + or concrete implementations. Injector class must exist. +

+--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.DisplayLinkURI.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.DisplayLinkURI.txt similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.DisplayLinkURI.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.DisplayLinkURI.txt index c955de7f6..663064a34 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.DisplayLinkURI.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.DisplayLinkURI.txt @@ -1,11 +1,11 @@ -AutoFormat.DisplayLinkURI -TYPE: bool -VERSION: 3.2.0 -DEFAULT: false ---DESCRIPTION-- -

- This directive turns on the in-text display of URIs in <a> tags, and disables - those links. For example, example becomes - example (http://example.com). -

---# vim: et sw=4 sts=4 +AutoFormat.DisplayLinkURI +TYPE: bool +VERSION: 3.2.0 +DEFAULT: false +--DESCRIPTION-- +

+ This directive turns on the in-text display of URIs in <a> tags, and disables + those links. For example, example becomes + example (http://example.com). +

+--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.Linkify.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.Linkify.txt similarity index 95% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.Linkify.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.Linkify.txt index 328b2b2bf..3a48ba960 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.Linkify.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.Linkify.txt @@ -1,12 +1,12 @@ -AutoFormat.Linkify -TYPE: bool -VERSION: 2.0.1 -DEFAULT: false ---DESCRIPTION-- - -

- This directive turns on linkification, auto-linking http, ftp and - https URLs. a tags with the href attribute - must be allowed. -

---# vim: et sw=4 sts=4 +AutoFormat.Linkify +TYPE: bool +VERSION: 2.0.1 +DEFAULT: false +--DESCRIPTION-- + +

+ This directive turns on linkification, auto-linking http, ftp and + https URLs. a tags with the href attribute + must be allowed. +

+--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.DocURL.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.DocURL.txt similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.DocURL.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.DocURL.txt index d0532b6ba..db58b1346 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.DocURL.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.DocURL.txt @@ -1,12 +1,12 @@ -AutoFormat.PurifierLinkify.DocURL -TYPE: string -VERSION: 2.0.1 -DEFAULT: '#%s' -ALIASES: AutoFormatParam.PurifierLinkifyDocURL ---DESCRIPTION-- -

- Location of configuration documentation to link to, let %s substitute - into the configuration's namespace and directive names sans the percent - sign. -

---# vim: et sw=4 sts=4 +AutoFormat.PurifierLinkify.DocURL +TYPE: string +VERSION: 2.0.1 +DEFAULT: '#%s' +ALIASES: AutoFormatParam.PurifierLinkifyDocURL +--DESCRIPTION-- +

+ Location of configuration documentation to link to, let %s substitute + into the configuration's namespace and directive names sans the percent + sign. +

+--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.txt similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.txt index f3ab259a1..7996488be 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.txt @@ -1,12 +1,12 @@ -AutoFormat.PurifierLinkify -TYPE: bool -VERSION: 2.0.1 -DEFAULT: false ---DESCRIPTION-- - -

- Internal auto-formatter that converts configuration directives in - syntax %Namespace.Directive to links. a tags - with the href attribute must be allowed. -

---# vim: et sw=4 sts=4 +AutoFormat.PurifierLinkify +TYPE: bool +VERSION: 2.0.1 +DEFAULT: false +--DESCRIPTION-- + +

+ Internal auto-formatter that converts configuration directives in + syntax %Namespace.Directive to links. a tags + with the href attribute must be allowed. +

+--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions.txt similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions.txt index 219d04ac4..35c393b4e 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions.txt @@ -1,11 +1,11 @@ -AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions -TYPE: lookup -VERSION: 4.0.0 -DEFAULT: array('td' => true, 'th' => true) ---DESCRIPTION-- -

- When %AutoFormat.RemoveEmpty and %AutoFormat.RemoveEmpty.RemoveNbsp - are enabled, this directive defines what HTML elements should not be - removede if they have only a non-breaking space in them. -

---# vim: et sw=4 sts=4 +AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions +TYPE: lookup +VERSION: 4.0.0 +DEFAULT: array('td' => true, 'th' => true) +--DESCRIPTION-- +

+ When %AutoFormat.RemoveEmpty and %AutoFormat.RemoveEmpty.RemoveNbsp + are enabled, this directive defines what HTML elements should not be + removede if they have only a non-breaking space in them. +

+--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.txt similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.txt index 5f355d662..ca17eb1dc 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.txt @@ -1,15 +1,15 @@ -AutoFormat.RemoveEmpty.RemoveNbsp -TYPE: bool -VERSION: 4.0.0 -DEFAULT: false ---DESCRIPTION-- -

- When enabled, HTML Purifier will treat any elements that contain only - non-breaking spaces as well as regular whitespace as empty, and remove - them when %AutoForamt.RemoveEmpty is enabled. -

-

- See %AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions for a list of elements - that don't have this behavior applied to them. -

---# vim: et sw=4 sts=4 +AutoFormat.RemoveEmpty.RemoveNbsp +TYPE: bool +VERSION: 4.0.0 +DEFAULT: false +--DESCRIPTION-- +

+ When enabled, HTML Purifier will treat any elements that contain only + non-breaking spaces as well as regular whitespace as empty, and remove + them when %AutoForamt.RemoveEmpty is enabled. +

+

+ See %AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions for a list of elements + that don't have this behavior applied to them. +

+--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.txt similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.txt index 6b5a7a5c9..34657ba47 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.txt @@ -1,46 +1,46 @@ -AutoFormat.RemoveEmpty -TYPE: bool -VERSION: 3.2.0 -DEFAULT: false ---DESCRIPTION-- -

- When enabled, HTML Purifier will attempt to remove empty elements that - contribute no semantic information to the document. The following types - of nodes will be removed: -

-
  • - Tags with no attributes and no content, and that are not empty - elements (remove <a></a> but not - <br />), and -
  • -
  • - Tags with no content, except for:
      -
    • The colgroup element, or
    • -
    • - Elements with the id or name attribute, - when those attributes are permitted on those elements. -
    • -
  • -
-

- Please be very careful when using this functionality; while it may not - seem that empty elements contain useful information, they can alter the - layout of a document given appropriate styling. This directive is most - useful when you are processing machine-generated HTML, please avoid using - it on regular user HTML. -

-

- Elements that contain only whitespace will be treated as empty. Non-breaking - spaces, however, do not count as whitespace. See - %AutoFormat.RemoveEmpty.RemoveNbsp for alternate behavior. -

-

- This algorithm is not perfect; you may still notice some empty tags, - particularly if a node had elements, but those elements were later removed - because they were not permitted in that context, or tags that, after - being auto-closed by another tag, where empty. This is for safety reasons - to prevent clever code from breaking validation. The general rule of thumb: - if a tag looked empty on the way in, it will get removed; if HTML Purifier - made it empty, it will stay. -

---# vim: et sw=4 sts=4 +AutoFormat.RemoveEmpty +TYPE: bool +VERSION: 3.2.0 +DEFAULT: false +--DESCRIPTION-- +

+ When enabled, HTML Purifier will attempt to remove empty elements that + contribute no semantic information to the document. The following types + of nodes will be removed: +

+
  • + Tags with no attributes and no content, and that are not empty + elements (remove <a></a> but not + <br />), and +
  • +
  • + Tags with no content, except for:
      +
    • The colgroup element, or
    • +
    • + Elements with the id or name attribute, + when those attributes are permitted on those elements. +
    • +
  • +
+

+ Please be very careful when using this functionality; while it may not + seem that empty elements contain useful information, they can alter the + layout of a document given appropriate styling. This directive is most + useful when you are processing machine-generated HTML, please avoid using + it on regular user HTML. +

+

+ Elements that contain only whitespace will be treated as empty. Non-breaking + spaces, however, do not count as whitespace. See + %AutoFormat.RemoveEmpty.RemoveNbsp for alternate behavior. +

+

+ This algorithm is not perfect; you may still notice some empty tags, + particularly if a node had elements, but those elements were later removed + because they were not permitted in that context, or tags that, after + being auto-closed by another tag, where empty. This is for safety reasons + to prevent clever code from breaking validation. The general rule of thumb: + if a tag looked empty on the way in, it will get removed; if HTML Purifier + made it empty, it will stay. +

+--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveSpansWithoutAttributes.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveSpansWithoutAttributes.txt similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveSpansWithoutAttributes.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveSpansWithoutAttributes.txt index a448770e5..dde990ab2 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveSpansWithoutAttributes.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveSpansWithoutAttributes.txt @@ -1,11 +1,11 @@ -AutoFormat.RemoveSpansWithoutAttributes -TYPE: bool -VERSION: 4.0.1 -DEFAULT: false ---DESCRIPTION-- -

- This directive causes span tags without any attributes - to be removed. It will also remove spans that had all attributes - removed during processing. -

---# vim: et sw=4 sts=4 +AutoFormat.RemoveSpansWithoutAttributes +TYPE: bool +VERSION: 4.0.1 +DEFAULT: false +--DESCRIPTION-- +

+ This directive causes span tags without any attributes + to be removed. It will also remove spans that had all attributes + removed during processing. +

+--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.AllowImportant.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.AllowImportant.txt similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.AllowImportant.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.AllowImportant.txt index 8096eb01a..b324608f7 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.AllowImportant.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.AllowImportant.txt @@ -1,8 +1,8 @@ -CSS.AllowImportant -TYPE: bool -DEFAULT: false -VERSION: 3.1.0 ---DESCRIPTION-- -This parameter determines whether or not !important cascade modifiers should -be allowed in user CSS. If false, !important will stripped. ---# vim: et sw=4 sts=4 +CSS.AllowImportant +TYPE: bool +DEFAULT: false +VERSION: 3.1.0 +--DESCRIPTION-- +This parameter determines whether or not !important cascade modifiers should +be allowed in user CSS. If false, !important will stripped. +--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.AllowTricky.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.AllowTricky.txt similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.AllowTricky.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.AllowTricky.txt index 9d34debc4..748be0eec 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.AllowTricky.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.AllowTricky.txt @@ -1,11 +1,11 @@ -CSS.AllowTricky -TYPE: bool -DEFAULT: false -VERSION: 3.1.0 ---DESCRIPTION-- -This parameter determines whether or not to allow "tricky" CSS properties and -values. Tricky CSS properties/values can drastically modify page layout or -be used for deceptive practices but do not directly constitute a security risk. -For example, display:none; is considered a tricky property that -will only be allowed if this directive is set to true. ---# vim: et sw=4 sts=4 +CSS.AllowTricky +TYPE: bool +DEFAULT: false +VERSION: 3.1.0 +--DESCRIPTION-- +This parameter determines whether or not to allow "tricky" CSS properties and +values. Tricky CSS properties/values can drastically modify page layout or +be used for deceptive practices but do not directly constitute a security risk. +For example, display:none; is considered a tricky property that +will only be allowed if this directive is set to true. +--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.AllowedFonts.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.AllowedFonts.txt similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.AllowedFonts.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.AllowedFonts.txt index 7c2b54763..3fd465406 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.AllowedFonts.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.AllowedFonts.txt @@ -1,12 +1,12 @@ -CSS.AllowedFonts -TYPE: lookup/null -VERSION: 4.3.0 -DEFAULT: NULL ---DESCRIPTION-- -

- Allows you to manually specify a set of allowed fonts. If - NULL, all fonts are allowed. This directive - affects generic names (serif, sans-serif, monospace, cursive, - fantasy) as well as specific font families. -

---# vim: et sw=4 sts=4 +CSS.AllowedFonts +TYPE: lookup/null +VERSION: 4.3.0 +DEFAULT: NULL +--DESCRIPTION-- +

+ Allows you to manually specify a set of allowed fonts. If + NULL, all fonts are allowed. This directive + affects generic names (serif, sans-serif, monospace, cursive, + fantasy) as well as specific font families. +

+--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.AllowedProperties.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.AllowedProperties.txt similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.AllowedProperties.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.AllowedProperties.txt index f1ba513c3..460112ebe 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.AllowedProperties.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.AllowedProperties.txt @@ -1,18 +1,18 @@ -CSS.AllowedProperties -TYPE: lookup/null -VERSION: 3.1.0 -DEFAULT: NULL ---DESCRIPTION-- - -

- If HTML Purifier's style attributes set is unsatisfactory for your needs, - you can overload it with your own list of tags to allow. Note that this - method is subtractive: it does its job by taking away from HTML Purifier - usual feature set, so you cannot add an attribute that HTML Purifier never - supported in the first place. -

-

- Warning: If another directive conflicts with the - elements here, that directive will win and override. -

---# vim: et sw=4 sts=4 +CSS.AllowedProperties +TYPE: lookup/null +VERSION: 3.1.0 +DEFAULT: NULL +--DESCRIPTION-- + +

+ If HTML Purifier's style attributes set is unsatisfactory for your needs, + you can overload it with your own list of tags to allow. Note that this + method is subtractive: it does its job by taking away from HTML Purifier + usual feature set, so you cannot add an attribute that HTML Purifier never + supported in the first place. +

+

+ Warning: If another directive conflicts with the + elements here, that directive will win and override. +

+--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.DefinitionRev.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.DefinitionRev.txt similarity index 94% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.DefinitionRev.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.DefinitionRev.txt index 96b410829..5cb7dda3b 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.DefinitionRev.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.DefinitionRev.txt @@ -1,11 +1,11 @@ -CSS.DefinitionRev -TYPE: int -VERSION: 2.0.0 -DEFAULT: 1 ---DESCRIPTION-- - -

- Revision identifier for your custom definition. See - %HTML.DefinitionRev for details. -

---# vim: et sw=4 sts=4 +CSS.DefinitionRev +TYPE: int +VERSION: 2.0.0 +DEFAULT: 1 +--DESCRIPTION-- + +

+ Revision identifier for your custom definition. See + %HTML.DefinitionRev for details. +

+--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.ForbiddenProperties.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.ForbiddenProperties.txt similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.ForbiddenProperties.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.ForbiddenProperties.txt index 923e8e995..f1f5c5f12 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.ForbiddenProperties.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.ForbiddenProperties.txt @@ -1,13 +1,13 @@ -CSS.ForbiddenProperties -TYPE: lookup -VERSION: 4.2.0 -DEFAULT: array() ---DESCRIPTION-- -

- This is the logical inverse of %CSS.AllowedProperties, and it will - override that directive or any other directive. If possible, - %CSS.AllowedProperties is recommended over this directive, - because it can sometimes be difficult to tell whether or not you've - forbidden all of the CSS properties you truly would like to disallow. -

---# vim: et sw=4 sts=4 +CSS.ForbiddenProperties +TYPE: lookup +VERSION: 4.2.0 +DEFAULT: array() +--DESCRIPTION-- +

+ This is the logical inverse of %CSS.AllowedProperties, and it will + override that directive or any other directive. If possible, + %CSS.AllowedProperties is recommended over this directive, + because it can sometimes be difficult to tell whether or not you've + forbidden all of the CSS properties you truly would like to disallow. +

+--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.MaxImgLength.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.MaxImgLength.txt similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.MaxImgLength.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.MaxImgLength.txt index 3808581e2..7a3291470 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.MaxImgLength.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.MaxImgLength.txt @@ -1,16 +1,16 @@ -CSS.MaxImgLength -TYPE: string/null -DEFAULT: '1200px' -VERSION: 3.1.1 ---DESCRIPTION-- -

- This parameter sets the maximum allowed length on img tags, - effectively the width and height properties. - Only absolute units of measurement (in, pt, pc, mm, cm) and pixels (px) are allowed. This is - in place to prevent imagecrash attacks, disable with null at your own risk. - This directive is similar to %HTML.MaxImgLength, and both should be - concurrently edited, although there are - subtle differences in the input format (the CSS max is a number with - a unit). -

---# vim: et sw=4 sts=4 +CSS.MaxImgLength +TYPE: string/null +DEFAULT: '1200px' +VERSION: 3.1.1 +--DESCRIPTION-- +

+ This parameter sets the maximum allowed length on img tags, + effectively the width and height properties. + Only absolute units of measurement (in, pt, pc, mm, cm) and pixels (px) are allowed. This is + in place to prevent imagecrash attacks, disable with null at your own risk. + This directive is similar to %HTML.MaxImgLength, and both should be + concurrently edited, although there are + subtle differences in the input format (the CSS max is a number with + a unit). +

+--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.Proprietary.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.Proprietary.txt similarity index 94% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.Proprietary.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.Proprietary.txt index 8a26f228d..148eedb8b 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.Proprietary.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.Proprietary.txt @@ -1,10 +1,10 @@ -CSS.Proprietary -TYPE: bool -VERSION: 3.0.0 -DEFAULT: false ---DESCRIPTION-- - -

- Whether or not to allow safe, proprietary CSS values. -

---# vim: et sw=4 sts=4 +CSS.Proprietary +TYPE: bool +VERSION: 3.0.0 +DEFAULT: false +--DESCRIPTION-- + +

+ Whether or not to allow safe, proprietary CSS values. +

+--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.Trusted.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.Trusted.txt similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.Trusted.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.Trusted.txt index 917ec42ba..e733a61e8 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.Trusted.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.Trusted.txt @@ -1,9 +1,9 @@ -CSS.Trusted -TYPE: bool -VERSION: 4.2.1 -DEFAULT: false ---DESCRIPTION-- -Indicates whether or not the user's CSS input is trusted or not. If the -input is trusted, a more expansive set of allowed properties. See -also %HTML.Trusted. ---# vim: et sw=4 sts=4 +CSS.Trusted +TYPE: bool +VERSION: 4.2.1 +DEFAULT: false +--DESCRIPTION-- +Indicates whether or not the user's CSS input is trusted or not. If the +input is trusted, a more expansive set of allowed properties. See +also %HTML.Trusted. +--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Cache.DefinitionImpl.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Cache.DefinitionImpl.txt similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Cache.DefinitionImpl.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Cache.DefinitionImpl.txt index afc6a87a6..c486724c8 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Cache.DefinitionImpl.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Cache.DefinitionImpl.txt @@ -1,14 +1,14 @@ -Cache.DefinitionImpl -TYPE: string/null -VERSION: 2.0.0 -DEFAULT: 'Serializer' ---DESCRIPTION-- - -This directive defines which method to use when caching definitions, -the complex data-type that makes HTML Purifier tick. Set to null -to disable caching (not recommended, as you will see a definite -performance degradation). - ---ALIASES-- -Core.DefinitionCache ---# vim: et sw=4 sts=4 +Cache.DefinitionImpl +TYPE: string/null +VERSION: 2.0.0 +DEFAULT: 'Serializer' +--DESCRIPTION-- + +This directive defines which method to use when caching definitions, +the complex data-type that makes HTML Purifier tick. Set to null +to disable caching (not recommended, as you will see a definite +performance degradation). + +--ALIASES-- +Core.DefinitionCache +--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPath.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPath.txt similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPath.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPath.txt index 668f248af..54036507d 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPath.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPath.txt @@ -1,13 +1,13 @@ -Cache.SerializerPath -TYPE: string/null -VERSION: 2.0.0 -DEFAULT: NULL ---DESCRIPTION-- - -

- Absolute path with no trailing slash to store serialized definitions in. - Default is within the - HTML Purifier library inside DefinitionCache/Serializer. This - path must be writable by the webserver. -

---# vim: et sw=4 sts=4 +Cache.SerializerPath +TYPE: string/null +VERSION: 2.0.0 +DEFAULT: NULL +--DESCRIPTION-- + +

+ Absolute path with no trailing slash to store serialized definitions in. + Default is within the + HTML Purifier library inside DefinitionCache/Serializer. This + path must be writable by the webserver. +

+--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPermissions.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPermissions.txt similarity index 95% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPermissions.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPermissions.txt index 9c27b0ac6..b2b83d9ab 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPermissions.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPermissions.txt @@ -1,11 +1,11 @@ -Cache.SerializerPermissions -TYPE: int -VERSION: 4.3.0 -DEFAULT: 0755 ---DESCRIPTION-- - -

- Directory permissions of the files and directories created inside - the DefinitionCache/Serializer or other custom serializer path. -

---# vim: et sw=4 sts=4 +Cache.SerializerPermissions +TYPE: int +VERSION: 4.3.0 +DEFAULT: 0755 +--DESCRIPTION-- + +

+ Directory permissions of the files and directories created inside + the DefinitionCache/Serializer or other custom serializer path. +

+--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.AggressivelyFixLt.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.AggressivelyFixLt.txt similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.AggressivelyFixLt.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.AggressivelyFixLt.txt index e0fa378ea..568cbf3b3 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.AggressivelyFixLt.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.AggressivelyFixLt.txt @@ -1,18 +1,18 @@ -Core.AggressivelyFixLt -TYPE: bool -VERSION: 2.1.0 -DEFAULT: true ---DESCRIPTION-- -

- This directive enables aggressive pre-filter fixes HTML Purifier can - perform in order to ensure that open angled-brackets do not get killed - during parsing stage. Enabling this will result in two preg_replace_callback - calls and at least two preg_replace calls for every HTML document parsed; - if your users make very well-formed HTML, you can set this directive false. - This has no effect when DirectLex is used. -

-

- Notice: This directive's default turned from false to true - in HTML Purifier 3.2.0. -

---# vim: et sw=4 sts=4 +Core.AggressivelyFixLt +TYPE: bool +VERSION: 2.1.0 +DEFAULT: true +--DESCRIPTION-- +

+ This directive enables aggressive pre-filter fixes HTML Purifier can + perform in order to ensure that open angled-brackets do not get killed + during parsing stage. Enabling this will result in two preg_replace_callback + calls and at least two preg_replace calls for every HTML document parsed; + if your users make very well-formed HTML, you can set this directive false. + This has no effect when DirectLex is used. +

+

+ Notice: This directive's default turned from false to true + in HTML Purifier 3.2.0. +

+--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.AllowHostnameUnderscore.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.AllowHostnameUnderscore.txt similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.AllowHostnameUnderscore.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.AllowHostnameUnderscore.txt index 405d36f17..2c910cc7d 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.AllowHostnameUnderscore.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.AllowHostnameUnderscore.txt @@ -1,16 +1,16 @@ -Core.AllowHostnameUnderscore -TYPE: bool -VERSION: 4.6.0 -DEFAULT: false ---DESCRIPTION-- -

- By RFC 1123, underscores are not permitted in host names. - (This is in contrast to the specification for DNS, RFC - 2181, which allows underscores.) - However, most browsers do the right thing when faced with - an underscore in the host name, and so some poorly written - websites are written with the expectation this should work. - Setting this parameter to true relaxes our allowed character - check so that underscores are permitted. -

---# vim: et sw=4 sts=4 +Core.AllowHostnameUnderscore +TYPE: bool +VERSION: 4.6.0 +DEFAULT: false +--DESCRIPTION-- +

+ By RFC 1123, underscores are not permitted in host names. + (This is in contrast to the specification for DNS, RFC + 2181, which allows underscores.) + However, most browsers do the right thing when faced with + an underscore in the host name, and so some poorly written + websites are written with the expectation this should work. + Setting this parameter to true relaxes our allowed character + check so that underscores are permitted. +

+--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.CollectErrors.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.CollectErrors.txt similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.CollectErrors.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.CollectErrors.txt index c6ea06990..d7317911f 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.CollectErrors.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.CollectErrors.txt @@ -1,12 +1,12 @@ -Core.CollectErrors -TYPE: bool -VERSION: 2.0.0 -DEFAULT: false ---DESCRIPTION-- - -Whether or not to collect errors found while filtering the document. This -is a useful way to give feedback to your users. Warning: -Currently this feature is very patchy and experimental, with lots of -possible error messages not yet implemented. It will not cause any -problems, but it may not help your users either. ---# vim: et sw=4 sts=4 +Core.CollectErrors +TYPE: bool +VERSION: 2.0.0 +DEFAULT: false +--DESCRIPTION-- + +Whether or not to collect errors found while filtering the document. This +is a useful way to give feedback to your users. Warning: +Currently this feature is very patchy and experimental, with lots of +possible error messages not yet implemented. It will not cause any +problems, but it may not help your users either. +--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.ColorKeywords.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.ColorKeywords.txt similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.ColorKeywords.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.ColorKeywords.txt index f78239825..c572c14ec 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.ColorKeywords.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.ColorKeywords.txt @@ -1,29 +1,29 @@ -Core.ColorKeywords -TYPE: hash -VERSION: 2.0.0 ---DEFAULT-- -array ( - 'maroon' => '#800000', - 'red' => '#FF0000', - 'orange' => '#FFA500', - 'yellow' => '#FFFF00', - 'olive' => '#808000', - 'purple' => '#800080', - 'fuchsia' => '#FF00FF', - 'white' => '#FFFFFF', - 'lime' => '#00FF00', - 'green' => '#008000', - 'navy' => '#000080', - 'blue' => '#0000FF', - 'aqua' => '#00FFFF', - 'teal' => '#008080', - 'black' => '#000000', - 'silver' => '#C0C0C0', - 'gray' => '#808080', -) ---DESCRIPTION-- - -Lookup array of color names to six digit hexadecimal number corresponding -to color, with preceding hash mark. Used when parsing colors. The lookup -is done in a case-insensitive manner. ---# vim: et sw=4 sts=4 +Core.ColorKeywords +TYPE: hash +VERSION: 2.0.0 +--DEFAULT-- +array ( + 'maroon' => '#800000', + 'red' => '#FF0000', + 'orange' => '#FFA500', + 'yellow' => '#FFFF00', + 'olive' => '#808000', + 'purple' => '#800080', + 'fuchsia' => '#FF00FF', + 'white' => '#FFFFFF', + 'lime' => '#00FF00', + 'green' => '#008000', + 'navy' => '#000080', + 'blue' => '#0000FF', + 'aqua' => '#00FFFF', + 'teal' => '#008080', + 'black' => '#000000', + 'silver' => '#C0C0C0', + 'gray' => '#808080', +) +--DESCRIPTION-- + +Lookup array of color names to six digit hexadecimal number corresponding +to color, with preceding hash mark. Used when parsing colors. The lookup +is done in a case-insensitive manner. +--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.ConvertDocumentToFragment.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.ConvertDocumentToFragment.txt similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.ConvertDocumentToFragment.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.ConvertDocumentToFragment.txt index 656d3783a..64b114fce 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.ConvertDocumentToFragment.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.ConvertDocumentToFragment.txt @@ -1,14 +1,14 @@ -Core.ConvertDocumentToFragment -TYPE: bool -DEFAULT: true ---DESCRIPTION-- - -This parameter determines whether or not the filter should convert -input that is a full document with html and body tags to a fragment -of just the contents of a body tag. This parameter is simply something -HTML Purifier can do during an edge-case: for most inputs, this -processing is not necessary. - ---ALIASES-- -Core.AcceptFullDocuments ---# vim: et sw=4 sts=4 +Core.ConvertDocumentToFragment +TYPE: bool +DEFAULT: true +--DESCRIPTION-- + +This parameter determines whether or not the filter should convert +input that is a full document with html and body tags to a fragment +of just the contents of a body tag. This parameter is simply something +HTML Purifier can do during an edge-case: for most inputs, this +processing is not necessary. + +--ALIASES-- +Core.AcceptFullDocuments +--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.DirectLexLineNumberSyncInterval.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.DirectLexLineNumberSyncInterval.txt similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.DirectLexLineNumberSyncInterval.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.DirectLexLineNumberSyncInterval.txt index 2f54e462a..36f16e07e 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.DirectLexLineNumberSyncInterval.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.DirectLexLineNumberSyncInterval.txt @@ -1,17 +1,17 @@ -Core.DirectLexLineNumberSyncInterval -TYPE: int -VERSION: 2.0.0 -DEFAULT: 0 ---DESCRIPTION-- - -

- Specifies the number of tokens the DirectLex line number tracking - implementations should process before attempting to resyncronize the - current line count by manually counting all previous new-lines. When - at 0, this functionality is disabled. Lower values will decrease - performance, and this is only strictly necessary if the counting - algorithm is buggy (in which case you should report it as a bug). - This has no effect when %Core.MaintainLineNumbers is disabled or DirectLex is - not being used. -

---# vim: et sw=4 sts=4 +Core.DirectLexLineNumberSyncInterval +TYPE: int +VERSION: 2.0.0 +DEFAULT: 0 +--DESCRIPTION-- + +

+ Specifies the number of tokens the DirectLex line number tracking + implementations should process before attempting to resyncronize the + current line count by manually counting all previous new-lines. When + at 0, this functionality is disabled. Lower values will decrease + performance, and this is only strictly necessary if the counting + algorithm is buggy (in which case you should report it as a bug). + This has no effect when %Core.MaintainLineNumbers is disabled or DirectLex is + not being used. +

+--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.DisableExcludes.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.DisableExcludes.txt similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.DisableExcludes.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.DisableExcludes.txt index 3c63c923c..1cd4c2c96 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.DisableExcludes.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.DisableExcludes.txt @@ -1,14 +1,14 @@ -Core.DisableExcludes -TYPE: bool -DEFAULT: false -VERSION: 4.5.0 ---DESCRIPTION-- -

- This directive disables SGML-style exclusions, e.g. the exclusion of - <object> in any descendant of a - <pre> tag. Disabling excludes will allow some - invalid documents to pass through HTML Purifier, but HTML Purifier - will also be less likely to accidentally remove large documents during - processing. -

---# vim: et sw=4 sts=4 +Core.DisableExcludes +TYPE: bool +DEFAULT: false +VERSION: 4.5.0 +--DESCRIPTION-- +

+ This directive disables SGML-style exclusions, e.g. the exclusion of + <object> in any descendant of a + <pre> tag. Disabling excludes will allow some + invalid documents to pass through HTML Purifier, but HTML Purifier + will also be less likely to accidentally remove large documents during + processing. +

+--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.EnableIDNA.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.EnableIDNA.txt similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.EnableIDNA.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.EnableIDNA.txt index 7f498e7e7..ce243c35d 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.EnableIDNA.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.EnableIDNA.txt @@ -1,9 +1,9 @@ -Core.EnableIDNA -TYPE: bool -DEFAULT: false -VERSION: 4.4.0 ---DESCRIPTION-- -Allows international domain names in URLs. This configuration option -requires the PEAR Net_IDNA2 module to be installed. It operates by -punycoding any internationalized host names for maximum portability. ---# vim: et sw=4 sts=4 +Core.EnableIDNA +TYPE: bool +DEFAULT: false +VERSION: 4.4.0 +--DESCRIPTION-- +Allows international domain names in URLs. This configuration option +requires the PEAR Net_IDNA2 module to be installed. It operates by +punycoding any internationalized host names for maximum portability. +--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.Encoding.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.Encoding.txt similarity index 98% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.Encoding.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.Encoding.txt index 89e2ae34b..8bfb47c3a 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.Encoding.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.Encoding.txt @@ -1,15 +1,15 @@ -Core.Encoding -TYPE: istring -DEFAULT: 'utf-8' ---DESCRIPTION-- -If for some reason you are unable to convert all webpages to UTF-8, you can -use this directive as a stop-gap compatibility change to let HTML Purifier -deal with non UTF-8 input. This technique has notable deficiencies: -absolutely no characters outside of the selected character encoding will be -preserved, not even the ones that have been ampersand escaped (this is due -to a UTF-8 specific feature that automatically resolves all -entities), making it pretty useless for anything except the most I18N-blind -applications, although %Core.EscapeNonASCIICharacters offers fixes this -trouble with another tradeoff. This directive only accepts ISO-8859-1 if -iconv is not enabled. ---# vim: et sw=4 sts=4 +Core.Encoding +TYPE: istring +DEFAULT: 'utf-8' +--DESCRIPTION-- +If for some reason you are unable to convert all webpages to UTF-8, you can +use this directive as a stop-gap compatibility change to let HTML Purifier +deal with non UTF-8 input. This technique has notable deficiencies: +absolutely no characters outside of the selected character encoding will be +preserved, not even the ones that have been ampersand escaped (this is due +to a UTF-8 specific feature that automatically resolves all +entities), making it pretty useless for anything except the most I18N-blind +applications, although %Core.EscapeNonASCIICharacters offers fixes this +trouble with another tradeoff. This directive only accepts ISO-8859-1 if +iconv is not enabled. +--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidChildren.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidChildren.txt similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidChildren.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidChildren.txt index 1cc3fcda2..a3881be75 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidChildren.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidChildren.txt @@ -1,12 +1,12 @@ -Core.EscapeInvalidChildren -TYPE: bool -DEFAULT: false ---DESCRIPTION-- -

Warning: this configuration option is no longer does anything as of 4.6.0.

- -

When true, a child is found that is not allowed in the context of the -parent element will be transformed into text as if it were ASCII. When -false, that element and all internal tags will be dropped, though text will -be preserved. There is no option for dropping the element but preserving -child nodes.

---# vim: et sw=4 sts=4 +Core.EscapeInvalidChildren +TYPE: bool +DEFAULT: false +--DESCRIPTION-- +

Warning: this configuration option is no longer does anything as of 4.6.0.

+ +

When true, a child is found that is not allowed in the context of the +parent element will be transformed into text as if it were ASCII. When +false, that element and all internal tags will be dropped, though text will +be preserved. There is no option for dropping the element but preserving +child nodes.

+--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidTags.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidTags.txt similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidTags.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidTags.txt index 299775fab..a7a5b249b 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidTags.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidTags.txt @@ -1,7 +1,7 @@ -Core.EscapeInvalidTags -TYPE: bool -DEFAULT: false ---DESCRIPTION-- -When true, invalid tags will be written back to the document as plain text. -Otherwise, they are silently dropped. ---# vim: et sw=4 sts=4 +Core.EscapeInvalidTags +TYPE: bool +DEFAULT: false +--DESCRIPTION-- +When true, invalid tags will be written back to the document as plain text. +Otherwise, they are silently dropped. +--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.EscapeNonASCIICharacters.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.EscapeNonASCIICharacters.txt similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.EscapeNonASCIICharacters.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.EscapeNonASCIICharacters.txt index f50db2f92..abb499948 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.EscapeNonASCIICharacters.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.EscapeNonASCIICharacters.txt @@ -1,13 +1,13 @@ -Core.EscapeNonASCIICharacters -TYPE: bool -VERSION: 1.4.0 -DEFAULT: false ---DESCRIPTION-- -This directive overcomes a deficiency in %Core.Encoding by blindly -converting all non-ASCII characters into decimal numeric entities before -converting it to its native encoding. This means that even characters that -can be expressed in the non-UTF-8 encoding will be entity-ized, which can -be a real downer for encodings like Big5. It also assumes that the ASCII -repetoire is available, although this is the case for almost all encodings. -Anyway, use UTF-8! ---# vim: et sw=4 sts=4 +Core.EscapeNonASCIICharacters +TYPE: bool +VERSION: 1.4.0 +DEFAULT: false +--DESCRIPTION-- +This directive overcomes a deficiency in %Core.Encoding by blindly +converting all non-ASCII characters into decimal numeric entities before +converting it to its native encoding. This means that even characters that +can be expressed in the non-UTF-8 encoding will be entity-ized, which can +be a real downer for encodings like Big5. It also assumes that the ASCII +repetoire is available, although this is the case for almost all encodings. +Anyway, use UTF-8! +--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.HiddenElements.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.HiddenElements.txt similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.HiddenElements.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.HiddenElements.txt index c337e47fc..915391edb 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.HiddenElements.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.HiddenElements.txt @@ -1,19 +1,19 @@ -Core.HiddenElements -TYPE: lookup ---DEFAULT-- -array ( - 'script' => true, - 'style' => true, -) ---DESCRIPTION-- - -

- This directive is a lookup array of elements which should have their - contents removed when they are not allowed by the HTML definition. - For example, the contents of a script tag are not - normally shown in a document, so if script tags are to be removed, - their contents should be removed to. This is opposed to a b - tag, which defines some presentational changes but does not hide its - contents. -

---# vim: et sw=4 sts=4 +Core.HiddenElements +TYPE: lookup +--DEFAULT-- +array ( + 'script' => true, + 'style' => true, +) +--DESCRIPTION-- + +

+ This directive is a lookup array of elements which should have their + contents removed when they are not allowed by the HTML definition. + For example, the contents of a script tag are not + normally shown in a document, so if script tags are to be removed, + their contents should be removed to. This is opposed to a b + tag, which defines some presentational changes but does not hide its + contents. +

+--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.Language.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.Language.txt similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.Language.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.Language.txt index ed1f39b5f..233fca14f 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.Language.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.Language.txt @@ -1,10 +1,10 @@ -Core.Language -TYPE: string -VERSION: 2.0.0 -DEFAULT: 'en' ---DESCRIPTION-- - -ISO 639 language code for localizable things in HTML Purifier to use, -which is mainly error reporting. There is currently only an English (en) -translation, so this directive is currently useless. ---# vim: et sw=4 sts=4 +Core.Language +TYPE: string +VERSION: 2.0.0 +DEFAULT: 'en' +--DESCRIPTION-- + +ISO 639 language code for localizable things in HTML Purifier to use, +which is mainly error reporting. There is currently only an English (en) +translation, so this directive is currently useless. +--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.LexerImpl.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.LexerImpl.txt similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.LexerImpl.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.LexerImpl.txt index e11c0152c..8983e2cca 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.LexerImpl.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.LexerImpl.txt @@ -1,34 +1,34 @@ -Core.LexerImpl -TYPE: mixed/null -VERSION: 2.0.0 -DEFAULT: NULL ---DESCRIPTION-- - -

- This parameter determines what lexer implementation can be used. The - valid values are: -

-
-
null
-
- Recommended, the lexer implementation will be auto-detected based on - your PHP-version and configuration. -
-
string lexer identifier
-
- This is a slim way of manually overridding the implementation. - Currently recognized values are: DOMLex (the default PHP5 -implementation) - and DirectLex (the default PHP4 implementation). Only use this if - you know what you are doing: usually, the auto-detection will - manage things for cases you aren't even aware of. -
-
object lexer instance
-
- Super-advanced: you can specify your own, custom, implementation that - implements the interface defined by HTMLPurifier_Lexer. - I may remove this option simply because I don't expect anyone - to use it. -
-
---# vim: et sw=4 sts=4 +Core.LexerImpl +TYPE: mixed/null +VERSION: 2.0.0 +DEFAULT: NULL +--DESCRIPTION-- + +

+ This parameter determines what lexer implementation can be used. The + valid values are: +

+
+
null
+
+ Recommended, the lexer implementation will be auto-detected based on + your PHP-version and configuration. +
+
string lexer identifier
+
+ This is a slim way of manually overridding the implementation. + Currently recognized values are: DOMLex (the default PHP5 +implementation) + and DirectLex (the default PHP4 implementation). Only use this if + you know what you are doing: usually, the auto-detection will + manage things for cases you aren't even aware of. +
+
object lexer instance
+
+ Super-advanced: you can specify your own, custom, implementation that + implements the interface defined by HTMLPurifier_Lexer. + I may remove this option simply because I don't expect anyone + to use it. +
+
+--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.MaintainLineNumbers.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.MaintainLineNumbers.txt similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.MaintainLineNumbers.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.MaintainLineNumbers.txt index 838f10f61..eb841a759 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.MaintainLineNumbers.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.MaintainLineNumbers.txt @@ -1,16 +1,16 @@ -Core.MaintainLineNumbers -TYPE: bool/null -VERSION: 2.0.0 -DEFAULT: NULL ---DESCRIPTION-- - -

- If true, HTML Purifier will add line number information to all tokens. - This is useful when error reporting is turned on, but can result in - significant performance degradation and should not be used when - unnecessary. This directive must be used with the DirectLex lexer, - as the DOMLex lexer does not (yet) support this functionality. - If the value is null, an appropriate value will be selected based - on other configuration. -

---# vim: et sw=4 sts=4 +Core.MaintainLineNumbers +TYPE: bool/null +VERSION: 2.0.0 +DEFAULT: NULL +--DESCRIPTION-- + +

+ If true, HTML Purifier will add line number information to all tokens. + This is useful when error reporting is turned on, but can result in + significant performance degradation and should not be used when + unnecessary. This directive must be used with the DirectLex lexer, + as the DOMLex lexer does not (yet) support this functionality. + If the value is null, an appropriate value will be selected based + on other configuration. +

+--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.NormalizeNewlines.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.NormalizeNewlines.txt similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.NormalizeNewlines.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.NormalizeNewlines.txt index 94a88600d..d77f5360d 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.NormalizeNewlines.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.NormalizeNewlines.txt @@ -1,11 +1,11 @@ -Core.NormalizeNewlines -TYPE: bool -VERSION: 4.2.0 -DEFAULT: true ---DESCRIPTION-- -

- Whether or not to normalize newlines to the operating - system default. When false, HTML Purifier - will attempt to preserve mixed newline files. -

---# vim: et sw=4 sts=4 +Core.NormalizeNewlines +TYPE: bool +VERSION: 4.2.0 +DEFAULT: true +--DESCRIPTION-- +

+ Whether or not to normalize newlines to the operating + system default. When false, HTML Purifier + will attempt to preserve mixed newline files. +

+--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.RemoveInvalidImg.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.RemoveInvalidImg.txt similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.RemoveInvalidImg.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.RemoveInvalidImg.txt index 704ac56c8..4070c2a0d 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.RemoveInvalidImg.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.RemoveInvalidImg.txt @@ -1,12 +1,12 @@ -Core.RemoveInvalidImg -TYPE: bool -DEFAULT: true -VERSION: 1.3.0 ---DESCRIPTION-- - -

- This directive enables pre-emptive URI checking in img - tags, as the attribute validation strategy is not authorized to - remove elements from the document. Revert to pre-1.3.0 behavior by setting to false. -

---# vim: et sw=4 sts=4 +Core.RemoveInvalidImg +TYPE: bool +DEFAULT: true +VERSION: 1.3.0 +--DESCRIPTION-- + +

+ This directive enables pre-emptive URI checking in img + tags, as the attribute validation strategy is not authorized to + remove elements from the document. Revert to pre-1.3.0 behavior by setting to false. +

+--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.RemoveProcessingInstructions.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.RemoveProcessingInstructions.txt similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.RemoveProcessingInstructions.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.RemoveProcessingInstructions.txt index ed6f13425..3397d9f71 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.RemoveProcessingInstructions.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.RemoveProcessingInstructions.txt @@ -1,11 +1,11 @@ -Core.RemoveProcessingInstructions -TYPE: bool -VERSION: 4.2.0 -DEFAULT: false ---DESCRIPTION-- -Instead of escaping processing instructions in the form <? ... -?>, remove it out-right. This may be useful if the HTML -you are validating contains XML processing instruction gunk, however, -it can also be user-unfriendly for people attempting to post PHP -snippets. ---# vim: et sw=4 sts=4 +Core.RemoveProcessingInstructions +TYPE: bool +VERSION: 4.2.0 +DEFAULT: false +--DESCRIPTION-- +Instead of escaping processing instructions in the form <? ... +?>, remove it out-right. This may be useful if the HTML +you are validating contains XML processing instruction gunk, however, +it can also be user-unfriendly for people attempting to post PHP +snippets. +--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.RemoveScriptContents.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.RemoveScriptContents.txt similarity index 95% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.RemoveScriptContents.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.RemoveScriptContents.txt index efbe994c2..a4cd966df 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.RemoveScriptContents.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.RemoveScriptContents.txt @@ -1,12 +1,12 @@ -Core.RemoveScriptContents -TYPE: bool/null -DEFAULT: NULL -VERSION: 2.0.0 -DEPRECATED-VERSION: 2.1.0 -DEPRECATED-USE: Core.HiddenElements ---DESCRIPTION-- -

- This directive enables HTML Purifier to remove not only script tags - but all of their contents. -

---# vim: et sw=4 sts=4 +Core.RemoveScriptContents +TYPE: bool/null +DEFAULT: NULL +VERSION: 2.0.0 +DEPRECATED-VERSION: 2.1.0 +DEPRECATED-USE: Core.HiddenElements +--DESCRIPTION-- +

+ This directive enables HTML Purifier to remove not only script tags + but all of their contents. +

+--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Filter.Custom.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Filter.Custom.txt similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Filter.Custom.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Filter.Custom.txt index 861ae66c3..3db50ef20 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Filter.Custom.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Filter.Custom.txt @@ -1,11 +1,11 @@ -Filter.Custom -TYPE: list -VERSION: 3.1.0 -DEFAULT: array() ---DESCRIPTION-- -

- This directive can be used to add custom filters; it is nearly the - equivalent of the now deprecated HTMLPurifier->addFilter() - method. Specify an array of concrete implementations. -

---# vim: et sw=4 sts=4 +Filter.Custom +TYPE: list +VERSION: 3.1.0 +DEFAULT: array() +--DESCRIPTION-- +

+ This directive can be used to add custom filters; it is nearly the + equivalent of the now deprecated HTMLPurifier->addFilter() + method. Specify an array of concrete implementations. +

+--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Escaping.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Escaping.txt similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Escaping.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Escaping.txt index 69602635e..16829bcda 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Escaping.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Escaping.txt @@ -1,14 +1,14 @@ -Filter.ExtractStyleBlocks.Escaping -TYPE: bool -VERSION: 3.0.0 -DEFAULT: true -ALIASES: Filter.ExtractStyleBlocksEscaping, FilterParam.ExtractStyleBlocksEscaping ---DESCRIPTION-- - -

- Whether or not to escape the dangerous characters <, > and & - as \3C, \3E and \26, respectively. This is can be safely set to false - if the contents of StyleBlocks will be placed in an external stylesheet, - where there is no risk of it being interpreted as HTML. -

---# vim: et sw=4 sts=4 +Filter.ExtractStyleBlocks.Escaping +TYPE: bool +VERSION: 3.0.0 +DEFAULT: true +ALIASES: Filter.ExtractStyleBlocksEscaping, FilterParam.ExtractStyleBlocksEscaping +--DESCRIPTION-- + +

+ Whether or not to escape the dangerous characters <, > and & + as \3C, \3E and \26, respectively. This is can be safely set to false + if the contents of StyleBlocks will be placed in an external stylesheet, + where there is no risk of it being interpreted as HTML. +

+--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Scope.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Scope.txt similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Scope.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Scope.txt index baa81ae06..7f95f54d1 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Scope.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Scope.txt @@ -1,29 +1,29 @@ -Filter.ExtractStyleBlocks.Scope -TYPE: string/null -VERSION: 3.0.0 -DEFAULT: NULL -ALIASES: Filter.ExtractStyleBlocksScope, FilterParam.ExtractStyleBlocksScope ---DESCRIPTION-- - -

- If you would like users to be able to define external stylesheets, but - only allow them to specify CSS declarations for a specific node and - prevent them from fiddling with other elements, use this directive. - It accepts any valid CSS selector, and will prepend this to any - CSS declaration extracted from the document. For example, if this - directive is set to #user-content and a user uses the - selector a:hover, the final selector will be - #user-content a:hover. -

-

- The comma shorthand may be used; consider the above example, with - #user-content, #user-content2, the final selector will - be #user-content a:hover, #user-content2 a:hover. -

-

- Warning: It is possible for users to bypass this measure - using a naughty + selector. This is a bug in CSS Tidy 1.3, not HTML - Purifier, and I am working to get it fixed. Until then, HTML Purifier - performs a basic check to prevent this. -

---# vim: et sw=4 sts=4 +Filter.ExtractStyleBlocks.Scope +TYPE: string/null +VERSION: 3.0.0 +DEFAULT: NULL +ALIASES: Filter.ExtractStyleBlocksScope, FilterParam.ExtractStyleBlocksScope +--DESCRIPTION-- + +

+ If you would like users to be able to define external stylesheets, but + only allow them to specify CSS declarations for a specific node and + prevent them from fiddling with other elements, use this directive. + It accepts any valid CSS selector, and will prepend this to any + CSS declaration extracted from the document. For example, if this + directive is set to #user-content and a user uses the + selector a:hover, the final selector will be + #user-content a:hover. +

+

+ The comma shorthand may be used; consider the above example, with + #user-content, #user-content2, the final selector will + be #user-content a:hover, #user-content2 a:hover. +

+

+ Warning: It is possible for users to bypass this measure + using a naughty + selector. This is a bug in CSS Tidy 1.3, not HTML + Purifier, and I am working to get it fixed. Until then, HTML Purifier + performs a basic check to prevent this. +

+--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.TidyImpl.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.TidyImpl.txt similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.TidyImpl.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.TidyImpl.txt index 3b7018917..6c231b2d7 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.TidyImpl.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.TidyImpl.txt @@ -1,16 +1,16 @@ -Filter.ExtractStyleBlocks.TidyImpl -TYPE: mixed/null -VERSION: 3.1.0 -DEFAULT: NULL -ALIASES: FilterParam.ExtractStyleBlocksTidyImpl ---DESCRIPTION-- -

- If left NULL, HTML Purifier will attempt to instantiate a csstidy - class to use for internal cleaning. This will usually be good enough. -

-

- However, for trusted user input, you can set this to false to - disable cleaning. In addition, you can supply your own concrete implementation - of Tidy's interface to use, although I don't know why you'd want to do that. -

---# vim: et sw=4 sts=4 +Filter.ExtractStyleBlocks.TidyImpl +TYPE: mixed/null +VERSION: 3.1.0 +DEFAULT: NULL +ALIASES: FilterParam.ExtractStyleBlocksTidyImpl +--DESCRIPTION-- +

+ If left NULL, HTML Purifier will attempt to instantiate a csstidy + class to use for internal cleaning. This will usually be good enough. +

+

+ However, for trusted user input, you can set this to false to + disable cleaning. In addition, you can supply your own concrete implementation + of Tidy's interface to use, although I don't know why you'd want to do that. +

+--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.txt similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.txt index be0177d4e..078d08741 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.txt @@ -1,74 +1,74 @@ -Filter.ExtractStyleBlocks -TYPE: bool -VERSION: 3.1.0 -DEFAULT: false -EXTERNAL: CSSTidy ---DESCRIPTION-- -

- This directive turns on the style block extraction filter, which removes - style blocks from input HTML, cleans them up with CSSTidy, - and places them in the StyleBlocks context variable, for further - use by you, usually to be placed in an external stylesheet, or a - style block in the head of your document. -

-

- Sample usage: -

-
';
-?>
-
-
-
-  Filter.ExtractStyleBlocks
-body {color:#F00;} Some text';
-
-    $config = HTMLPurifier_Config::createDefault();
-    $config->set('Filter', 'ExtractStyleBlocks', true);
-    $purifier = new HTMLPurifier($config);
-
-    $html = $purifier->purify($dirty);
-
-    // This implementation writes the stylesheets to the styles/ directory.
-    // You can also echo the styles inside the document, but it's a bit
-    // more difficult to make sure they get interpreted properly by
-    // browsers; try the usual CSS armoring techniques.
-    $styles = $purifier->context->get('StyleBlocks');
-    $dir = 'styles/';
-    if (!is_dir($dir)) mkdir($dir);
-    $hash = sha1($_GET['html']);
-    foreach ($styles as $i => $style) {
-        file_put_contents($name = $dir . $hash . "_$i");
-        echo '';
-    }
-?>
-
-
-  
- -
- - -]]>
-

- Warning: It is possible for a user to mount an - imagecrash attack using this CSS. Counter-measures are difficult; - it is not simply enough to limit the range of CSS lengths (using - relative lengths with many nesting levels allows for large values - to be attained without actually specifying them in the stylesheet), - and the flexible nature of selectors makes it difficult to selectively - disable lengths on image tags (HTML Purifier, however, does disable - CSS width and height in inline styling). There are probably two effective - counter measures: an explicit width and height set to auto in all - images in your document (unlikely) or the disabling of width and - height (somewhat reasonable). Whether or not these measures should be - used is left to the reader. -

---# vim: et sw=4 sts=4 +Filter.ExtractStyleBlocks +TYPE: bool +VERSION: 3.1.0 +DEFAULT: false +EXTERNAL: CSSTidy +--DESCRIPTION-- +

+ This directive turns on the style block extraction filter, which removes + style blocks from input HTML, cleans them up with CSSTidy, + and places them in the StyleBlocks context variable, for further + use by you, usually to be placed in an external stylesheet, or a + style block in the head of your document. +

+

+ Sample usage: +

+
';
+?>
+
+
+
+  Filter.ExtractStyleBlocks
+body {color:#F00;} Some text';
+
+    $config = HTMLPurifier_Config::createDefault();
+    $config->set('Filter', 'ExtractStyleBlocks', true);
+    $purifier = new HTMLPurifier($config);
+
+    $html = $purifier->purify($dirty);
+
+    // This implementation writes the stylesheets to the styles/ directory.
+    // You can also echo the styles inside the document, but it's a bit
+    // more difficult to make sure they get interpreted properly by
+    // browsers; try the usual CSS armoring techniques.
+    $styles = $purifier->context->get('StyleBlocks');
+    $dir = 'styles/';
+    if (!is_dir($dir)) mkdir($dir);
+    $hash = sha1($_GET['html']);
+    foreach ($styles as $i => $style) {
+        file_put_contents($name = $dir . $hash . "_$i");
+        echo '';
+    }
+?>
+
+
+  
+ +
+ + +]]>
+

+ Warning: It is possible for a user to mount an + imagecrash attack using this CSS. Counter-measures are difficult; + it is not simply enough to limit the range of CSS lengths (using + relative lengths with many nesting levels allows for large values + to be attained without actually specifying them in the stylesheet), + and the flexible nature of selectors makes it difficult to selectively + disable lengths on image tags (HTML Purifier, however, does disable + CSS width and height in inline styling). There are probably two effective + counter measures: an explicit width and height set to auto in all + images in your document (unlikely) or the disabling of width and + height (somewhat reasonable). Whether or not these measures should be + used is left to the reader. +

+--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Filter.YouTube.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Filter.YouTube.txt similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Filter.YouTube.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Filter.YouTube.txt index 882218668..321eaa2d8 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Filter.YouTube.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Filter.YouTube.txt @@ -1,16 +1,16 @@ -Filter.YouTube -TYPE: bool -VERSION: 3.1.0 -DEFAULT: false ---DESCRIPTION-- -

- Warning: Deprecated in favor of %HTML.SafeObject and - %Output.FlashCompat (turn both on to allow YouTube videos and other - Flash content). -

-

- This directive enables YouTube video embedding in HTML Purifier. Check - this document - on embedding videos for more information on what this filter does. -

---# vim: et sw=4 sts=4 +Filter.YouTube +TYPE: bool +VERSION: 3.1.0 +DEFAULT: false +--DESCRIPTION-- +

+ Warning: Deprecated in favor of %HTML.SafeObject and + %Output.FlashCompat (turn both on to allow YouTube videos and other + Flash content). +

+

+ This directive enables YouTube video embedding in HTML Purifier. Check + this document + on embedding videos for more information on what this filter does. +

+--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Allowed.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Allowed.txt similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Allowed.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Allowed.txt index afd48a0d4..0b2c106da 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Allowed.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Allowed.txt @@ -1,25 +1,25 @@ -HTML.Allowed -TYPE: itext/null -VERSION: 2.0.0 -DEFAULT: NULL ---DESCRIPTION-- - -

- This is a preferred convenience directive that combines - %HTML.AllowedElements and %HTML.AllowedAttributes. - Specify elements and attributes that are allowed using: - element1[attr1|attr2],element2.... For example, - if you would like to only allow paragraphs and links, specify - a[href],p. You can specify attributes that apply - to all elements using an asterisk, e.g. *[lang]. - You can also use newlines instead of commas to separate elements. -

-

- Warning: - All of the constraints on the component directives are still enforced. - The syntax is a subset of TinyMCE's valid_elements - whitelist: directly copy-pasting it here will probably result in - broken whitelists. If %HTML.AllowedElements or %HTML.AllowedAttributes - are set, this directive has no effect. -

---# vim: et sw=4 sts=4 +HTML.Allowed +TYPE: itext/null +VERSION: 2.0.0 +DEFAULT: NULL +--DESCRIPTION-- + +

+ This is a preferred convenience directive that combines + %HTML.AllowedElements and %HTML.AllowedAttributes. + Specify elements and attributes that are allowed using: + element1[attr1|attr2],element2.... For example, + if you would like to only allow paragraphs and links, specify + a[href],p. You can specify attributes that apply + to all elements using an asterisk, e.g. *[lang]. + You can also use newlines instead of commas to separate elements. +

+

+ Warning: + All of the constraints on the component directives are still enforced. + The syntax is a subset of TinyMCE's valid_elements + whitelist: directly copy-pasting it here will probably result in + broken whitelists. If %HTML.AllowedElements or %HTML.AllowedAttributes + are set, this directive has no effect. +

+--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.AllowedAttributes.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.AllowedAttributes.txt similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.AllowedAttributes.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.AllowedAttributes.txt index 0e6ec54f3..fcf093f17 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.AllowedAttributes.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.AllowedAttributes.txt @@ -1,19 +1,19 @@ -HTML.AllowedAttributes -TYPE: lookup/null -VERSION: 1.3.0 -DEFAULT: NULL ---DESCRIPTION-- - -

- If HTML Purifier's attribute set is unsatisfactory, overload it! - The syntax is "tag.attr" or "*.attr" for the global attributes - (style, id, class, dir, lang, xml:lang). -

-

- Warning: If another directive conflicts with the - elements here, that directive will win and override. For - example, %HTML.EnableAttrID will take precedence over *.id in this - directive. You must set that directive to true before you can use - IDs at all. -

---# vim: et sw=4 sts=4 +HTML.AllowedAttributes +TYPE: lookup/null +VERSION: 1.3.0 +DEFAULT: NULL +--DESCRIPTION-- + +

+ If HTML Purifier's attribute set is unsatisfactory, overload it! + The syntax is "tag.attr" or "*.attr" for the global attributes + (style, id, class, dir, lang, xml:lang). +

+

+ Warning: If another directive conflicts with the + elements here, that directive will win and override. For + example, %HTML.EnableAttrID will take precedence over *.id in this + directive. You must set that directive to true before you can use + IDs at all. +

+--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.AllowedComments.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.AllowedComments.txt similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.AllowedComments.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.AllowedComments.txt index 8440bc39d..140e21423 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.AllowedComments.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.AllowedComments.txt @@ -1,10 +1,10 @@ -HTML.AllowedComments -TYPE: lookup -VERSION: 4.4.0 -DEFAULT: array() ---DESCRIPTION-- -A whitelist which indicates what explicit comment bodies should be -allowed, modulo leading and trailing whitespace. See also %HTML.AllowedCommentsRegexp -(these directives are union'ed together, so a comment is considered -valid if any directive deems it valid.) ---# vim: et sw=4 sts=4 +HTML.AllowedComments +TYPE: lookup +VERSION: 4.4.0 +DEFAULT: array() +--DESCRIPTION-- +A whitelist which indicates what explicit comment bodies should be +allowed, modulo leading and trailing whitespace. See also %HTML.AllowedCommentsRegexp +(these directives are union'ed together, so a comment is considered +valid if any directive deems it valid.) +--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.AllowedCommentsRegexp.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.AllowedCommentsRegexp.txt similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.AllowedCommentsRegexp.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.AllowedCommentsRegexp.txt index b1e65beb1..f22e977d4 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.AllowedCommentsRegexp.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.AllowedCommentsRegexp.txt @@ -1,15 +1,15 @@ -HTML.AllowedCommentsRegexp -TYPE: string/null -VERSION: 4.4.0 -DEFAULT: NULL ---DESCRIPTION-- -A regexp, which if it matches the body of a comment, indicates that -it should be allowed. Trailing and leading spaces are removed prior -to running this regular expression. -Warning: Make sure you specify -correct anchor metacharacters ^regex$, otherwise you may accept -comments that you did not mean to! In particular, the regex /foo|bar/ -is probably not sufficiently strict, since it also allows foobar. -See also %HTML.AllowedComments (these directives are union'ed together, -so a comment is considered valid if any directive deems it valid.) ---# vim: et sw=4 sts=4 +HTML.AllowedCommentsRegexp +TYPE: string/null +VERSION: 4.4.0 +DEFAULT: NULL +--DESCRIPTION-- +A regexp, which if it matches the body of a comment, indicates that +it should be allowed. Trailing and leading spaces are removed prior +to running this regular expression. +Warning: Make sure you specify +correct anchor metacharacters ^regex$, otherwise you may accept +comments that you did not mean to! In particular, the regex /foo|bar/ +is probably not sufficiently strict, since it also allows foobar. +See also %HTML.AllowedComments (these directives are union'ed together, +so a comment is considered valid if any directive deems it valid.) +--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.AllowedElements.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.AllowedElements.txt similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.AllowedElements.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.AllowedElements.txt index ca3c13ddb..1d3fa7907 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.AllowedElements.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.AllowedElements.txt @@ -1,23 +1,23 @@ -HTML.AllowedElements -TYPE: lookup/null -VERSION: 1.3.0 -DEFAULT: NULL ---DESCRIPTION-- -

- If HTML Purifier's tag set is unsatisfactory for your needs, you can - overload it with your own list of tags to allow. If you change - this, you probably also want to change %HTML.AllowedAttributes; see - also %HTML.Allowed which lets you set allowed elements and - attributes at the same time. -

-

- If you attempt to allow an element that HTML Purifier does not know - about, HTML Purifier will raise an error. You will need to manually - tell HTML Purifier about this element by using the - advanced customization features. -

-

- Warning: If another directive conflicts with the - elements here, that directive will win and override. -

---# vim: et sw=4 sts=4 +HTML.AllowedElements +TYPE: lookup/null +VERSION: 1.3.0 +DEFAULT: NULL +--DESCRIPTION-- +

+ If HTML Purifier's tag set is unsatisfactory for your needs, you can + overload it with your own list of tags to allow. If you change + this, you probably also want to change %HTML.AllowedAttributes; see + also %HTML.Allowed which lets you set allowed elements and + attributes at the same time. +

+

+ If you attempt to allow an element that HTML Purifier does not know + about, HTML Purifier will raise an error. You will need to manually + tell HTML Purifier about this element by using the + advanced customization features. +

+

+ Warning: If another directive conflicts with the + elements here, that directive will win and override. +

+--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.AllowedModules.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.AllowedModules.txt similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.AllowedModules.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.AllowedModules.txt index e373791a5..5a59a55c0 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.AllowedModules.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.AllowedModules.txt @@ -1,20 +1,20 @@ -HTML.AllowedModules -TYPE: lookup/null -VERSION: 2.0.0 -DEFAULT: NULL ---DESCRIPTION-- - -

- A doctype comes with a set of usual modules to use. Without having - to mucking about with the doctypes, you can quickly activate or - disable these modules by specifying which modules you wish to allow - with this directive. This is most useful for unit testing specific - modules, although end users may find it useful for their own ends. -

-

- If you specify a module that does not exist, the manager will silently - fail to use it, so be careful! User-defined modules are not affected - by this directive. Modules defined in %HTML.CoreModules are not - affected by this directive. -

---# vim: et sw=4 sts=4 +HTML.AllowedModules +TYPE: lookup/null +VERSION: 2.0.0 +DEFAULT: NULL +--DESCRIPTION-- + +

+ A doctype comes with a set of usual modules to use. Without having + to mucking about with the doctypes, you can quickly activate or + disable these modules by specifying which modules you wish to allow + with this directive. This is most useful for unit testing specific + modules, although end users may find it useful for their own ends. +

+

+ If you specify a module that does not exist, the manager will silently + fail to use it, so be careful! User-defined modules are not affected + by this directive. Modules defined in %HTML.CoreModules are not + affected by this directive. +

+--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Attr.Name.UseCDATA.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Attr.Name.UseCDATA.txt similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Attr.Name.UseCDATA.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Attr.Name.UseCDATA.txt index 75d680ee1..151fb7b82 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Attr.Name.UseCDATA.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Attr.Name.UseCDATA.txt @@ -1,11 +1,11 @@ -HTML.Attr.Name.UseCDATA -TYPE: bool -DEFAULT: false -VERSION: 4.0.0 ---DESCRIPTION-- -The W3C specification DTD defines the name attribute to be CDATA, not ID, due -to limitations of DTD. In certain documents, this relaxed behavior is desired, -whether it is to specify duplicate names, or to specify names that would be -illegal IDs (for example, names that begin with a digit.) Set this configuration -directive to true to use the relaxed parsing rules. ---# vim: et sw=4 sts=4 +HTML.Attr.Name.UseCDATA +TYPE: bool +DEFAULT: false +VERSION: 4.0.0 +--DESCRIPTION-- +The W3C specification DTD defines the name attribute to be CDATA, not ID, due +to limitations of DTD. In certain documents, this relaxed behavior is desired, +whether it is to specify duplicate names, or to specify names that would be +illegal IDs (for example, names that begin with a digit.) Set this configuration +directive to true to use the relaxed parsing rules. +--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.BlockWrapper.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.BlockWrapper.txt similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.BlockWrapper.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.BlockWrapper.txt index f32b802c6..45ae469ec 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.BlockWrapper.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.BlockWrapper.txt @@ -1,18 +1,18 @@ -HTML.BlockWrapper -TYPE: string -VERSION: 1.3.0 -DEFAULT: 'p' ---DESCRIPTION-- - -

- String name of element to wrap inline elements that are inside a block - context. This only occurs in the children of blockquote in strict mode. -

-

- Example: by default value, - <blockquote>Foo</blockquote> would become - <blockquote><p>Foo</p></blockquote>. - The <p> tags can be replaced with whatever you desire, - as long as it is a block level element. -

---# vim: et sw=4 sts=4 +HTML.BlockWrapper +TYPE: string +VERSION: 1.3.0 +DEFAULT: 'p' +--DESCRIPTION-- + +

+ String name of element to wrap inline elements that are inside a block + context. This only occurs in the children of blockquote in strict mode. +

+

+ Example: by default value, + <blockquote>Foo</blockquote> would become + <blockquote><p>Foo</p></blockquote>. + The <p> tags can be replaced with whatever you desire, + as long as it is a block level element. +

+--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.CoreModules.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.CoreModules.txt similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.CoreModules.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.CoreModules.txt index fc8e40205..524618879 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.CoreModules.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.CoreModules.txt @@ -1,23 +1,23 @@ -HTML.CoreModules -TYPE: lookup -VERSION: 2.0.0 ---DEFAULT-- -array ( - 'Structure' => true, - 'Text' => true, - 'Hypertext' => true, - 'List' => true, - 'NonXMLCommonAttributes' => true, - 'XMLCommonAttributes' => true, - 'CommonAttributes' => true, -) ---DESCRIPTION-- - -

- Certain modularized doctypes (XHTML, namely), have certain modules - that must be included for the doctype to be an conforming document - type: put those modules here. By default, XHTML's core modules - are used. You can set this to a blank array to disable core module - protection, but this is not recommended. -

---# vim: et sw=4 sts=4 +HTML.CoreModules +TYPE: lookup +VERSION: 2.0.0 +--DEFAULT-- +array ( + 'Structure' => true, + 'Text' => true, + 'Hypertext' => true, + 'List' => true, + 'NonXMLCommonAttributes' => true, + 'XMLCommonAttributes' => true, + 'CommonAttributes' => true, +) +--DESCRIPTION-- + +

+ Certain modularized doctypes (XHTML, namely), have certain modules + that must be included for the doctype to be an conforming document + type: put those modules here. By default, XHTML's core modules + are used. You can set this to a blank array to disable core module + protection, but this is not recommended. +

+--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.CustomDoctype.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.CustomDoctype.txt similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.CustomDoctype.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.CustomDoctype.txt index a2bde5dc1..a64e3d7c3 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.CustomDoctype.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.CustomDoctype.txt @@ -1,9 +1,9 @@ -HTML.CustomDoctype -TYPE: string/null -VERSION: 2.0.1 -DEFAULT: NULL ---DESCRIPTION-- - -A custom doctype for power-users who defined there own document -type. This directive only applies when %HTML.Doctype is blank. ---# vim: et sw=4 sts=4 +HTML.CustomDoctype +TYPE: string/null +VERSION: 2.0.1 +DEFAULT: NULL +--DESCRIPTION-- + +A custom doctype for power-users who defined there own document +type. This directive only applies when %HTML.Doctype is blank. +--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionID.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionID.txt similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionID.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionID.txt index f5433e3f1..103db754a 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionID.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionID.txt @@ -1,33 +1,33 @@ -HTML.DefinitionID -TYPE: string/null -DEFAULT: NULL -VERSION: 2.0.0 ---DESCRIPTION-- - -

- Unique identifier for a custom-built HTML definition. If you edit - the raw version of the HTMLDefinition, introducing changes that the - configuration object does not reflect, you must specify this variable. - If you change your custom edits, you should change this directive, or - clear your cache. Example: -

-
-$config = HTMLPurifier_Config::createDefault();
-$config->set('HTML', 'DefinitionID', '1');
-$def = $config->getHTMLDefinition();
-$def->addAttribute('a', 'tabindex', 'Number');
-
-

- In the above example, the configuration is still at the defaults, but - using the advanced API, an extra attribute has been added. The - configuration object normally has no way of knowing that this change - has taken place, so it needs an extra directive: %HTML.DefinitionID. - If someone else attempts to use the default configuration, these two - pieces of code will not clobber each other in the cache, since one has - an extra directive attached to it. -

-

- You must specify a value to this directive to use the - advanced API features. -

---# vim: et sw=4 sts=4 +HTML.DefinitionID +TYPE: string/null +DEFAULT: NULL +VERSION: 2.0.0 +--DESCRIPTION-- + +

+ Unique identifier for a custom-built HTML definition. If you edit + the raw version of the HTMLDefinition, introducing changes that the + configuration object does not reflect, you must specify this variable. + If you change your custom edits, you should change this directive, or + clear your cache. Example: +

+
+$config = HTMLPurifier_Config::createDefault();
+$config->set('HTML', 'DefinitionID', '1');
+$def = $config->getHTMLDefinition();
+$def->addAttribute('a', 'tabindex', 'Number');
+
+

+ In the above example, the configuration is still at the defaults, but + using the advanced API, an extra attribute has been added. The + configuration object normally has no way of knowing that this change + has taken place, so it needs an extra directive: %HTML.DefinitionID. + If someone else attempts to use the default configuration, these two + pieces of code will not clobber each other in the cache, since one has + an extra directive attached to it. +

+

+ You must specify a value to this directive to use the + advanced API features. +

+--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionRev.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionRev.txt similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionRev.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionRev.txt index 0bb5a718d..229ae0267 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionRev.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionRev.txt @@ -1,16 +1,16 @@ -HTML.DefinitionRev -TYPE: int -VERSION: 2.0.0 -DEFAULT: 1 ---DESCRIPTION-- - -

- Revision identifier for your custom definition specified in - %HTML.DefinitionID. This serves the same purpose: uniquely identifying - your custom definition, but this one does so in a chronological - context: revision 3 is more up-to-date then revision 2. Thus, when - this gets incremented, the cache handling is smart enough to clean - up any older revisions of your definition as well as flush the - cache. -

---# vim: et sw=4 sts=4 +HTML.DefinitionRev +TYPE: int +VERSION: 2.0.0 +DEFAULT: 1 +--DESCRIPTION-- + +

+ Revision identifier for your custom definition specified in + %HTML.DefinitionID. This serves the same purpose: uniquely identifying + your custom definition, but this one does so in a chronological + context: revision 3 is more up-to-date then revision 2. Thus, when + this gets incremented, the cache handling is smart enough to clean + up any older revisions of your definition as well as flush the + cache. +

+--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Doctype.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Doctype.txt similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Doctype.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Doctype.txt index a6969b995..9dab497f2 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Doctype.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Doctype.txt @@ -1,11 +1,11 @@ -HTML.Doctype -TYPE: string/null -DEFAULT: NULL ---DESCRIPTION-- -Doctype to use during filtering. Technically speaking this is not actually -a doctype (as it does not identify a corresponding DTD), but we are using -this name for sake of simplicity. When non-blank, this will override any -older directives like %HTML.XHTML or %HTML.Strict. ---ALLOWED-- -'HTML 4.01 Transitional', 'HTML 4.01 Strict', 'XHTML 1.0 Transitional', 'XHTML 1.0 Strict', 'XHTML 1.1' ---# vim: et sw=4 sts=4 +HTML.Doctype +TYPE: string/null +DEFAULT: NULL +--DESCRIPTION-- +Doctype to use during filtering. Technically speaking this is not actually +a doctype (as it does not identify a corresponding DTD), but we are using +this name for sake of simplicity. When non-blank, this will override any +older directives like %HTML.XHTML or %HTML.Strict. +--ALLOWED-- +'HTML 4.01 Transitional', 'HTML 4.01 Strict', 'XHTML 1.0 Transitional', 'XHTML 1.0 Strict', 'XHTML 1.1' +--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.FlashAllowFullScreen.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.FlashAllowFullScreen.txt similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.FlashAllowFullScreen.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.FlashAllowFullScreen.txt index 08d641f95..7878dc0bf 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.FlashAllowFullScreen.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.FlashAllowFullScreen.txt @@ -1,11 +1,11 @@ -HTML.FlashAllowFullScreen -TYPE: bool -VERSION: 4.2.0 -DEFAULT: false ---DESCRIPTION-- -

- Whether or not to permit embedded Flash content from - %HTML.SafeObject to expand to the full screen. Corresponds to - the allowFullScreen parameter. -

---# vim: et sw=4 sts=4 +HTML.FlashAllowFullScreen +TYPE: bool +VERSION: 4.2.0 +DEFAULT: false +--DESCRIPTION-- +

+ Whether or not to permit embedded Flash content from + %HTML.SafeObject to expand to the full screen. Corresponds to + the allowFullScreen parameter. +

+--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenAttributes.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenAttributes.txt similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenAttributes.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenAttributes.txt index 2b8df97cb..57358f9ba 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenAttributes.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenAttributes.txt @@ -1,21 +1,21 @@ -HTML.ForbiddenAttributes -TYPE: lookup -VERSION: 3.1.0 -DEFAULT: array() ---DESCRIPTION-- -

- While this directive is similar to %HTML.AllowedAttributes, for - forwards-compatibility with XML, this attribute has a different syntax. Instead of - tag.attr, use tag@attr. To disallow href - attributes in a tags, set this directive to - a@href. You can also disallow an attribute globally with - attr or *@attr (either syntax is fine; the latter - is provided for consistency with %HTML.AllowedAttributes). -

-

- Warning: This directive complements %HTML.ForbiddenElements, - accordingly, check - out that directive for a discussion of why you - should think twice before using this directive. -

---# vim: et sw=4 sts=4 +HTML.ForbiddenAttributes +TYPE: lookup +VERSION: 3.1.0 +DEFAULT: array() +--DESCRIPTION-- +

+ While this directive is similar to %HTML.AllowedAttributes, for + forwards-compatibility with XML, this attribute has a different syntax. Instead of + tag.attr, use tag@attr. To disallow href + attributes in a tags, set this directive to + a@href. You can also disallow an attribute globally with + attr or *@attr (either syntax is fine; the latter + is provided for consistency with %HTML.AllowedAttributes). +

+

+ Warning: This directive complements %HTML.ForbiddenElements, + accordingly, check + out that directive for a discussion of why you + should think twice before using this directive. +

+--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenElements.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenElements.txt similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenElements.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenElements.txt index 40466c463..93a53e14f 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenElements.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenElements.txt @@ -1,20 +1,20 @@ -HTML.ForbiddenElements -TYPE: lookup -VERSION: 3.1.0 -DEFAULT: array() ---DESCRIPTION-- -

- This was, perhaps, the most requested feature ever in HTML - Purifier. Please don't abuse it! This is the logical inverse of - %HTML.AllowedElements, and it will override that directive, or any - other directive. -

-

- If possible, %HTML.Allowed is recommended over this directive, because it - can sometimes be difficult to tell whether or not you've forbidden all of - the behavior you would like to disallow. If you forbid img - with the expectation of preventing images on your site, you'll be in for - a nasty surprise when people start using the background-image - CSS property. -

---# vim: et sw=4 sts=4 +HTML.ForbiddenElements +TYPE: lookup +VERSION: 3.1.0 +DEFAULT: array() +--DESCRIPTION-- +

+ This was, perhaps, the most requested feature ever in HTML + Purifier. Please don't abuse it! This is the logical inverse of + %HTML.AllowedElements, and it will override that directive, or any + other directive. +

+

+ If possible, %HTML.Allowed is recommended over this directive, because it + can sometimes be difficult to tell whether or not you've forbidden all of + the behavior you would like to disallow. If you forbid img + with the expectation of preventing images on your site, you'll be in for + a nasty surprise when people start using the background-image + CSS property. +

+--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.MaxImgLength.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.MaxImgLength.txt similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.MaxImgLength.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.MaxImgLength.txt index 319747954..e424c386e 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.MaxImgLength.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.MaxImgLength.txt @@ -1,14 +1,14 @@ -HTML.MaxImgLength -TYPE: int/null -DEFAULT: 1200 -VERSION: 3.1.1 ---DESCRIPTION-- -

- This directive controls the maximum number of pixels in the width and - height attributes in img tags. This is - in place to prevent imagecrash attacks, disable with null at your own risk. - This directive is similar to %CSS.MaxImgLength, and both should be - concurrently edited, although there are - subtle differences in the input format (the HTML max is an integer). -

---# vim: et sw=4 sts=4 +HTML.MaxImgLength +TYPE: int/null +DEFAULT: 1200 +VERSION: 3.1.1 +--DESCRIPTION-- +

+ This directive controls the maximum number of pixels in the width and + height attributes in img tags. This is + in place to prevent imagecrash attacks, disable with null at your own risk. + This directive is similar to %CSS.MaxImgLength, and both should be + concurrently edited, although there are + subtle differences in the input format (the HTML max is an integer). +

+--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Nofollow.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Nofollow.txt similarity index 95% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Nofollow.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Nofollow.txt index 7aa356353..700b30924 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Nofollow.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Nofollow.txt @@ -1,7 +1,7 @@ -HTML.Nofollow -TYPE: bool -VERSION: 4.3.0 -DEFAULT: FALSE ---DESCRIPTION-- -If enabled, nofollow rel attributes are added to all outgoing links. ---# vim: et sw=4 sts=4 +HTML.Nofollow +TYPE: bool +VERSION: 4.3.0 +DEFAULT: FALSE +--DESCRIPTION-- +If enabled, nofollow rel attributes are added to all outgoing links. +--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Parent.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Parent.txt similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Parent.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Parent.txt index 2d2fbd117..62e8e160c 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Parent.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Parent.txt @@ -1,12 +1,12 @@ -HTML.Parent -TYPE: string -VERSION: 1.3.0 -DEFAULT: 'div' ---DESCRIPTION-- - -

- String name of element that HTML fragment passed to library will be - inserted in. An interesting variation would be using span as the - parent element, meaning that only inline tags would be allowed. -

---# vim: et sw=4 sts=4 +HTML.Parent +TYPE: string +VERSION: 1.3.0 +DEFAULT: 'div' +--DESCRIPTION-- + +

+ String name of element that HTML fragment passed to library will be + inserted in. An interesting variation would be using span as the + parent element, meaning that only inline tags would be allowed. +

+--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Proprietary.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Proprietary.txt similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Proprietary.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Proprietary.txt index b3c45e190..dfb720496 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Proprietary.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Proprietary.txt @@ -1,12 +1,12 @@ -HTML.Proprietary -TYPE: bool -VERSION: 3.1.0 -DEFAULT: false ---DESCRIPTION-- -

- Whether or not to allow proprietary elements and attributes in your - documents, as per HTMLPurifier_HTMLModule_Proprietary. - Warning: This can cause your documents to stop - validating! -

---# vim: et sw=4 sts=4 +HTML.Proprietary +TYPE: bool +VERSION: 3.1.0 +DEFAULT: false +--DESCRIPTION-- +

+ Whether or not to allow proprietary elements and attributes in your + documents, as per HTMLPurifier_HTMLModule_Proprietary. + Warning: This can cause your documents to stop + validating! +

+--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.SafeEmbed.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.SafeEmbed.txt similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.SafeEmbed.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.SafeEmbed.txt index 556fa674f..cdda09a4c 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.SafeEmbed.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.SafeEmbed.txt @@ -1,13 +1,13 @@ -HTML.SafeEmbed -TYPE: bool -VERSION: 3.1.1 -DEFAULT: false ---DESCRIPTION-- -

- Whether or not to permit embed tags in documents, with a number of extra - security features added to prevent script execution. This is similar to - what websites like MySpace do to embed tags. Embed is a proprietary - element and will cause your website to stop validating; you should - see if you can use %Output.FlashCompat with %HTML.SafeObject instead - first.

---# vim: et sw=4 sts=4 +HTML.SafeEmbed +TYPE: bool +VERSION: 3.1.1 +DEFAULT: false +--DESCRIPTION-- +

+ Whether or not to permit embed tags in documents, with a number of extra + security features added to prevent script execution. This is similar to + what websites like MySpace do to embed tags. Embed is a proprietary + element and will cause your website to stop validating; you should + see if you can use %Output.FlashCompat with %HTML.SafeObject instead + first.

+--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.SafeIframe.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.SafeIframe.txt similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.SafeIframe.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.SafeIframe.txt index 295a8cf66..5eb6ec2b5 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.SafeIframe.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.SafeIframe.txt @@ -1,13 +1,13 @@ -HTML.SafeIframe -TYPE: bool -VERSION: 4.4.0 -DEFAULT: false ---DESCRIPTION-- -

- Whether or not to permit iframe tags in untrusted documents. This - directive must be accompanied by a whitelist of permitted iframes, - such as %URI.SafeIframeRegexp, otherwise it will fatally error. - This directive has no effect on strict doctypes, as iframes are not - valid. -

---# vim: et sw=4 sts=4 +HTML.SafeIframe +TYPE: bool +VERSION: 4.4.0 +DEFAULT: false +--DESCRIPTION-- +

+ Whether or not to permit iframe tags in untrusted documents. This + directive must be accompanied by a whitelist of permitted iframes, + such as %URI.SafeIframeRegexp, otherwise it will fatally error. + This directive has no effect on strict doctypes, as iframes are not + valid. +

+--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.SafeObject.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.SafeObject.txt similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.SafeObject.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.SafeObject.txt index 07f6e536e..ceb342e22 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.SafeObject.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.SafeObject.txt @@ -1,13 +1,13 @@ -HTML.SafeObject -TYPE: bool -VERSION: 3.1.1 -DEFAULT: false ---DESCRIPTION-- -

- Whether or not to permit object tags in documents, with a number of extra - security features added to prevent script execution. This is similar to - what websites like MySpace do to object tags. You should also enable - %Output.FlashCompat in order to generate Internet Explorer - compatibility code for your object tags. -

---# vim: et sw=4 sts=4 +HTML.SafeObject +TYPE: bool +VERSION: 3.1.1 +DEFAULT: false +--DESCRIPTION-- +

+ Whether or not to permit object tags in documents, with a number of extra + security features added to prevent script execution. This is similar to + what websites like MySpace do to object tags. You should also enable + %Output.FlashCompat in order to generate Internet Explorer + compatibility code for your object tags. +

+--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.SafeScripting.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.SafeScripting.txt similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.SafeScripting.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.SafeScripting.txt index 641b4a8d6..5ebc7a19d 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.SafeScripting.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.SafeScripting.txt @@ -1,10 +1,10 @@ -HTML.SafeScripting -TYPE: lookup -VERSION: 4.5.0 -DEFAULT: array() ---DESCRIPTION-- -

- Whether or not to permit script tags to external scripts in documents. - Inline scripting is not allowed, and the script must match an explicit whitelist. -

---# vim: et sw=4 sts=4 +HTML.SafeScripting +TYPE: lookup +VERSION: 4.5.0 +DEFAULT: array() +--DESCRIPTION-- +

+ Whether or not to permit script tags to external scripts in documents. + Inline scripting is not allowed, and the script must match an explicit whitelist. +

+--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Strict.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Strict.txt similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Strict.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Strict.txt index d99663a5e..a8b1de56b 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Strict.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Strict.txt @@ -1,9 +1,9 @@ -HTML.Strict -TYPE: bool -VERSION: 1.3.0 -DEFAULT: false -DEPRECATED-VERSION: 1.7.0 -DEPRECATED-USE: HTML.Doctype ---DESCRIPTION-- -Determines whether or not to use Transitional (loose) or Strict rulesets. ---# vim: et sw=4 sts=4 +HTML.Strict +TYPE: bool +VERSION: 1.3.0 +DEFAULT: false +DEPRECATED-VERSION: 1.7.0 +DEPRECATED-USE: HTML.Doctype +--DESCRIPTION-- +Determines whether or not to use Transitional (loose) or Strict rulesets. +--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.TargetBlank.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.TargetBlank.txt similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.TargetBlank.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.TargetBlank.txt index d65f0d041..587a16778 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.TargetBlank.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.TargetBlank.txt @@ -1,8 +1,8 @@ -HTML.TargetBlank -TYPE: bool -VERSION: 4.4.0 -DEFAULT: FALSE ---DESCRIPTION-- -If enabled, target=blank attributes are added to all outgoing links. -(This includes links from an HTTPS version of a page to an HTTP version.) ---# vim: et sw=4 sts=4 +HTML.TargetBlank +TYPE: bool +VERSION: 4.4.0 +DEFAULT: FALSE +--DESCRIPTION-- +If enabled, target=blank attributes are added to all outgoing links. +(This includes links from an HTTPS version of a page to an HTTP version.) +--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.TidyAdd.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.TidyAdd.txt similarity index 95% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.TidyAdd.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.TidyAdd.txt index 602453f6e..b4c271b7f 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.TidyAdd.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.TidyAdd.txt @@ -1,8 +1,8 @@ -HTML.TidyAdd -TYPE: lookup -VERSION: 2.0.0 -DEFAULT: array() ---DESCRIPTION-- - -Fixes to add to the default set of Tidy fixes as per your level. ---# vim: et sw=4 sts=4 +HTML.TidyAdd +TYPE: lookup +VERSION: 2.0.0 +DEFAULT: array() +--DESCRIPTION-- + +Fixes to add to the default set of Tidy fixes as per your level. +--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.TidyLevel.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.TidyLevel.txt similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.TidyLevel.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.TidyLevel.txt index bf943e8f0..4186ccd0d 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.TidyLevel.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.TidyLevel.txt @@ -1,24 +1,24 @@ -HTML.TidyLevel -TYPE: string -VERSION: 2.0.0 -DEFAULT: 'medium' ---DESCRIPTION-- - -

General level of cleanliness the Tidy module should enforce. -There are four allowed values:

-
-
none
-
No extra tidying should be done
-
light
-
Only fix elements that would be discarded otherwise due to - lack of support in doctype
-
medium
-
Enforce best practices
-
heavy
-
Transform all deprecated elements and attributes to standards - compliant equivalents
-
- ---ALLOWED-- -'none', 'light', 'medium', 'heavy' ---# vim: et sw=4 sts=4 +HTML.TidyLevel +TYPE: string +VERSION: 2.0.0 +DEFAULT: 'medium' +--DESCRIPTION-- + +

General level of cleanliness the Tidy module should enforce. +There are four allowed values:

+
+
none
+
No extra tidying should be done
+
light
+
Only fix elements that would be discarded otherwise due to + lack of support in doctype
+
medium
+
Enforce best practices
+
heavy
+
Transform all deprecated elements and attributes to standards + compliant equivalents
+
+ +--ALLOWED-- +'none', 'light', 'medium', 'heavy' +--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.TidyRemove.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.TidyRemove.txt similarity index 95% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.TidyRemove.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.TidyRemove.txt index 92cca2a43..996762bd1 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.TidyRemove.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.TidyRemove.txt @@ -1,8 +1,8 @@ -HTML.TidyRemove -TYPE: lookup -VERSION: 2.0.0 -DEFAULT: array() ---DESCRIPTION-- - -Fixes to remove from the default set of Tidy fixes as per your level. ---# vim: et sw=4 sts=4 +HTML.TidyRemove +TYPE: lookup +VERSION: 2.0.0 +DEFAULT: array() +--DESCRIPTION-- + +Fixes to remove from the default set of Tidy fixes as per your level. +--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Trusted.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Trusted.txt similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Trusted.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Trusted.txt index bc8e65499..1db9237e9 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Trusted.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Trusted.txt @@ -1,9 +1,9 @@ -HTML.Trusted -TYPE: bool -VERSION: 2.0.0 -DEFAULT: false ---DESCRIPTION-- -Indicates whether or not the user input is trusted or not. If the input is -trusted, a more expansive set of allowed tags and attributes will be used. -See also %CSS.Trusted. ---# vim: et sw=4 sts=4 +HTML.Trusted +TYPE: bool +VERSION: 2.0.0 +DEFAULT: false +--DESCRIPTION-- +Indicates whether or not the user input is trusted or not. If the input is +trusted, a more expansive set of allowed tags and attributes will be used. +See also %CSS.Trusted. +--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.XHTML.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.XHTML.txt similarity index 95% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.XHTML.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.XHTML.txt index a3c2f42c3..2a47e384f 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.XHTML.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.XHTML.txt @@ -1,11 +1,11 @@ -HTML.XHTML -TYPE: bool -DEFAULT: true -VERSION: 1.1.0 -DEPRECATED-VERSION: 1.7.0 -DEPRECATED-USE: HTML.Doctype ---DESCRIPTION-- -Determines whether or not output is XHTML 1.0 or HTML 4.01 flavor. ---ALIASES-- -Core.XHTML ---# vim: et sw=4 sts=4 +HTML.XHTML +TYPE: bool +DEFAULT: true +VERSION: 1.1.0 +DEPRECATED-VERSION: 1.7.0 +DEPRECATED-USE: HTML.Doctype +--DESCRIPTION-- +Determines whether or not output is XHTML 1.0 or HTML 4.01 flavor. +--ALIASES-- +Core.XHTML +--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Output.CommentScriptContents.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Output.CommentScriptContents.txt similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Output.CommentScriptContents.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Output.CommentScriptContents.txt index 2a1370470..08921fde7 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Output.CommentScriptContents.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Output.CommentScriptContents.txt @@ -1,10 +1,10 @@ -Output.CommentScriptContents -TYPE: bool -VERSION: 2.0.0 -DEFAULT: true ---DESCRIPTION-- -Determines whether or not HTML Purifier should attempt to fix up the -contents of script tags for legacy browsers with comments. ---ALIASES-- -Core.CommentScriptContents ---# vim: et sw=4 sts=4 +Output.CommentScriptContents +TYPE: bool +VERSION: 2.0.0 +DEFAULT: true +--DESCRIPTION-- +Determines whether or not HTML Purifier should attempt to fix up the +contents of script tags for legacy browsers with comments. +--ALIASES-- +Core.CommentScriptContents +--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Output.FixInnerHTML.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Output.FixInnerHTML.txt similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Output.FixInnerHTML.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Output.FixInnerHTML.txt index d215ba2d3..d6f0d9f29 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Output.FixInnerHTML.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Output.FixInnerHTML.txt @@ -1,15 +1,15 @@ -Output.FixInnerHTML -TYPE: bool -VERSION: 4.3.0 -DEFAULT: true ---DESCRIPTION-- -

- If true, HTML Purifier will protect against Internet Explorer's - mishandling of the innerHTML attribute by appending - a space to any attribute that does not contain angled brackets, spaces - or quotes, but contains a backtick. This slightly changes the - semantics of any given attribute, so if this is unacceptable and - you do not use innerHTML on any of your pages, you can - turn this directive off. -

---# vim: et sw=4 sts=4 +Output.FixInnerHTML +TYPE: bool +VERSION: 4.3.0 +DEFAULT: true +--DESCRIPTION-- +

+ If true, HTML Purifier will protect against Internet Explorer's + mishandling of the innerHTML attribute by appending + a space to any attribute that does not contain angled brackets, spaces + or quotes, but contains a backtick. This slightly changes the + semantics of any given attribute, so if this is unacceptable and + you do not use innerHTML on any of your pages, you can + turn this directive off. +

+--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Output.FlashCompat.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Output.FlashCompat.txt similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Output.FlashCompat.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Output.FlashCompat.txt index e58f91aa8..93398e859 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Output.FlashCompat.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Output.FlashCompat.txt @@ -1,11 +1,11 @@ -Output.FlashCompat -TYPE: bool -VERSION: 4.1.0 -DEFAULT: false ---DESCRIPTION-- -

- If true, HTML Purifier will generate Internet Explorer compatibility - code for all object code. This is highly recommended if you enable - %HTML.SafeObject. -

---# vim: et sw=4 sts=4 +Output.FlashCompat +TYPE: bool +VERSION: 4.1.0 +DEFAULT: false +--DESCRIPTION-- +

+ If true, HTML Purifier will generate Internet Explorer compatibility + code for all object code. This is highly recommended if you enable + %HTML.SafeObject. +

+--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Output.Newline.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Output.Newline.txt similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Output.Newline.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Output.Newline.txt index 4bb902523..79f8ad82c 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Output.Newline.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Output.Newline.txt @@ -1,13 +1,13 @@ -Output.Newline -TYPE: string/null -VERSION: 2.0.1 -DEFAULT: NULL ---DESCRIPTION-- - -

- Newline string to format final output with. If left null, HTML Purifier - will auto-detect the default newline type of the system and use that; - you can manually override it here. Remember, \r\n is Windows, \r - is Mac, and \n is Unix. -

---# vim: et sw=4 sts=4 +Output.Newline +TYPE: string/null +VERSION: 2.0.1 +DEFAULT: NULL +--DESCRIPTION-- + +

+ Newline string to format final output with. If left null, HTML Purifier + will auto-detect the default newline type of the system and use that; + you can manually override it here. Remember, \r\n is Windows, \r + is Mac, and \n is Unix. +

+--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Output.SortAttr.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Output.SortAttr.txt similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Output.SortAttr.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Output.SortAttr.txt index 322310651..232b02362 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Output.SortAttr.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Output.SortAttr.txt @@ -1,14 +1,14 @@ -Output.SortAttr -TYPE: bool -VERSION: 3.2.0 -DEFAULT: false ---DESCRIPTION-- -

- If true, HTML Purifier will sort attributes by name before writing them back - to the document, converting a tag like: <el b="" a="" c="" /> - to <el a="" b="" c="" />. This is a workaround for - a bug in FCKeditor which causes it to swap attributes order, adding noise - to text diffs. If you're not seeing this bug, chances are, you don't need - this directive. -

---# vim: et sw=4 sts=4 +Output.SortAttr +TYPE: bool +VERSION: 3.2.0 +DEFAULT: false +--DESCRIPTION-- +

+ If true, HTML Purifier will sort attributes by name before writing them back + to the document, converting a tag like: <el b="" a="" c="" /> + to <el a="" b="" c="" />. This is a workaround for + a bug in FCKeditor which causes it to swap attributes order, adding noise + to text diffs. If you're not seeing this bug, chances are, you don't need + this directive. +

+--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Output.TidyFormat.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Output.TidyFormat.txt similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Output.TidyFormat.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Output.TidyFormat.txt index 23dd4d3d5..06bab00a0 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Output.TidyFormat.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Output.TidyFormat.txt @@ -1,25 +1,25 @@ -Output.TidyFormat -TYPE: bool -VERSION: 1.1.1 -DEFAULT: false ---DESCRIPTION-- -

- Determines whether or not to run Tidy on the final output for pretty - formatting reasons, such as indentation and wrap. -

-

- This can greatly improve readability for editors who are hand-editing - the HTML, but is by no means necessary as HTML Purifier has already - fixed all major errors the HTML may have had. Tidy is a non-default - extension, and this directive will silently fail if Tidy is not - available. -

-

- If you are looking to make the overall look of your page's source - better, I recommend running Tidy on the entire page rather than just - user-content (after all, the indentation relative to the containing - blocks will be incorrect). -

---ALIASES-- -Core.TidyFormat ---# vim: et sw=4 sts=4 +Output.TidyFormat +TYPE: bool +VERSION: 1.1.1 +DEFAULT: false +--DESCRIPTION-- +

+ Determines whether or not to run Tidy on the final output for pretty + formatting reasons, such as indentation and wrap. +

+

+ This can greatly improve readability for editors who are hand-editing + the HTML, but is by no means necessary as HTML Purifier has already + fixed all major errors the HTML may have had. Tidy is a non-default + extension, and this directive will silently fail if Tidy is not + available. +

+

+ If you are looking to make the overall look of your page's source + better, I recommend running Tidy on the entire page rather than just + user-content (after all, the indentation relative to the containing + blocks will be incorrect). +

+--ALIASES-- +Core.TidyFormat +--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Test.ForceNoIconv.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Test.ForceNoIconv.txt similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Test.ForceNoIconv.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Test.ForceNoIconv.txt index d1820cdbd..071bc0295 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Test.ForceNoIconv.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Test.ForceNoIconv.txt @@ -1,7 +1,7 @@ -Test.ForceNoIconv -TYPE: bool -DEFAULT: false ---DESCRIPTION-- -When set to true, HTMLPurifier_Encoder will act as if iconv does not exist -and use only pure PHP implementations. ---# vim: et sw=4 sts=4 +Test.ForceNoIconv +TYPE: bool +DEFAULT: false +--DESCRIPTION-- +When set to true, HTMLPurifier_Encoder will act as if iconv does not exist +and use only pure PHP implementations. +--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.AllowedSchemes.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.AllowedSchemes.txt similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.AllowedSchemes.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.AllowedSchemes.txt index 47714f5d2..666635a5f 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.AllowedSchemes.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.AllowedSchemes.txt @@ -1,17 +1,17 @@ -URI.AllowedSchemes -TYPE: lookup ---DEFAULT-- -array ( - 'http' => true, - 'https' => true, - 'mailto' => true, - 'ftp' => true, - 'nntp' => true, - 'news' => true, -) ---DESCRIPTION-- -Whitelist that defines the schemes that a URI is allowed to have. This -prevents XSS attacks from using pseudo-schemes like javascript or mocha. -There is also support for the data and file -URI schemes, but they are not enabled by default. ---# vim: et sw=4 sts=4 +URI.AllowedSchemes +TYPE: lookup +--DEFAULT-- +array ( + 'http' => true, + 'https' => true, + 'mailto' => true, + 'ftp' => true, + 'nntp' => true, + 'news' => true, +) +--DESCRIPTION-- +Whitelist that defines the schemes that a URI is allowed to have. This +prevents XSS attacks from using pseudo-schemes like javascript or mocha. +There is also support for the data and file +URI schemes, but they are not enabled by default. +--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.Base.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.Base.txt similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.Base.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.Base.txt index ba4730808..876f0680c 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.Base.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.Base.txt @@ -1,17 +1,17 @@ -URI.Base -TYPE: string/null -VERSION: 2.1.0 -DEFAULT: NULL ---DESCRIPTION-- - -

- The base URI is the URI of the document this purified HTML will be - inserted into. This information is important if HTML Purifier needs - to calculate absolute URIs from relative URIs, such as when %URI.MakeAbsolute - is on. You may use a non-absolute URI for this value, but behavior - may vary (%URI.MakeAbsolute deals nicely with both absolute and - relative paths, but forwards-compatibility is not guaranteed). - Warning: If set, the scheme on this URI - overrides the one specified by %URI.DefaultScheme. -

---# vim: et sw=4 sts=4 +URI.Base +TYPE: string/null +VERSION: 2.1.0 +DEFAULT: NULL +--DESCRIPTION-- + +

+ The base URI is the URI of the document this purified HTML will be + inserted into. This information is important if HTML Purifier needs + to calculate absolute URIs from relative URIs, such as when %URI.MakeAbsolute + is on. You may use a non-absolute URI for this value, but behavior + may vary (%URI.MakeAbsolute deals nicely with both absolute and + relative paths, but forwards-compatibility is not guaranteed). + Warning: If set, the scheme on this URI + overrides the one specified by %URI.DefaultScheme. +

+--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.DefaultScheme.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.DefaultScheme.txt similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.DefaultScheme.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.DefaultScheme.txt index 0700e0b1b..728e378cb 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.DefaultScheme.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.DefaultScheme.txt @@ -1,10 +1,10 @@ -URI.DefaultScheme -TYPE: string -DEFAULT: 'http' ---DESCRIPTION-- - -

- Defines through what scheme the output will be served, in order to - select the proper object validator when no scheme information is present. -

---# vim: et sw=4 sts=4 +URI.DefaultScheme +TYPE: string +DEFAULT: 'http' +--DESCRIPTION-- + +

+ Defines through what scheme the output will be served, in order to + select the proper object validator when no scheme information is present. +

+--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.DefinitionID.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.DefinitionID.txt similarity index 95% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.DefinitionID.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.DefinitionID.txt index 523204c08..f05312ba8 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.DefinitionID.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.DefinitionID.txt @@ -1,11 +1,11 @@ -URI.DefinitionID -TYPE: string/null -VERSION: 2.1.0 -DEFAULT: NULL ---DESCRIPTION-- - -

- Unique identifier for a custom-built URI definition. If you want - to add custom URIFilters, you must specify this value. -

---# vim: et sw=4 sts=4 +URI.DefinitionID +TYPE: string/null +VERSION: 2.1.0 +DEFAULT: NULL +--DESCRIPTION-- + +

+ Unique identifier for a custom-built URI definition. If you want + to add custom URIFilters, you must specify this value. +

+--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.DefinitionRev.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.DefinitionRev.txt similarity index 94% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.DefinitionRev.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.DefinitionRev.txt index a9c07b1a3..80cfea93f 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.DefinitionRev.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.DefinitionRev.txt @@ -1,11 +1,11 @@ -URI.DefinitionRev -TYPE: int -VERSION: 2.1.0 -DEFAULT: 1 ---DESCRIPTION-- - -

- Revision identifier for your custom definition. See - %HTML.DefinitionRev for details. -

---# vim: et sw=4 sts=4 +URI.DefinitionRev +TYPE: int +VERSION: 2.1.0 +DEFAULT: 1 +--DESCRIPTION-- + +

+ Revision identifier for your custom definition. See + %HTML.DefinitionRev for details. +

+--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.Disable.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.Disable.txt similarity index 95% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.Disable.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.Disable.txt index b19ca1d5b..71ce025a2 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.Disable.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.Disable.txt @@ -1,14 +1,14 @@ -URI.Disable -TYPE: bool -VERSION: 1.3.0 -DEFAULT: false ---DESCRIPTION-- - -

- Disables all URIs in all forms. Not sure why you'd want to do that - (after all, the Internet's founded on the notion of a hyperlink). -

- ---ALIASES-- -Attr.DisableURI ---# vim: et sw=4 sts=4 +URI.Disable +TYPE: bool +VERSION: 1.3.0 +DEFAULT: false +--DESCRIPTION-- + +

+ Disables all URIs in all forms. Not sure why you'd want to do that + (after all, the Internet's founded on the notion of a hyperlink). +

+ +--ALIASES-- +Attr.DisableURI +--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.DisableExternal.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.DisableExternal.txt similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.DisableExternal.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.DisableExternal.txt index 9132ea4f5..13c122c8c 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.DisableExternal.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.DisableExternal.txt @@ -1,11 +1,11 @@ -URI.DisableExternal -TYPE: bool -VERSION: 1.2.0 -DEFAULT: false ---DESCRIPTION-- -Disables links to external websites. This is a highly effective anti-spam -and anti-pagerank-leech measure, but comes at a hefty price: nolinks or -images outside of your domain will be allowed. Non-linkified URIs will -still be preserved. If you want to be able to link to subdomains or use -absolute URIs, specify %URI.Host for your website. ---# vim: et sw=4 sts=4 +URI.DisableExternal +TYPE: bool +VERSION: 1.2.0 +DEFAULT: false +--DESCRIPTION-- +Disables links to external websites. This is a highly effective anti-spam +and anti-pagerank-leech measure, but comes at a hefty price: nolinks or +images outside of your domain will be allowed. Non-linkified URIs will +still be preserved. If you want to be able to link to subdomains or use +absolute URIs, specify %URI.Host for your website. +--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.DisableExternalResources.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.DisableExternalResources.txt similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.DisableExternalResources.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.DisableExternalResources.txt index d74bc1e3d..abcc1efd6 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.DisableExternalResources.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.DisableExternalResources.txt @@ -1,13 +1,13 @@ -URI.DisableExternalResources -TYPE: bool -VERSION: 1.3.0 -DEFAULT: false ---DESCRIPTION-- -Disables the embedding of external resources, preventing users from -embedding things like images from other hosts. This prevents access -tracking (good for email viewers), bandwidth leeching, cross-site request -forging, goatse.cx posting, and other nasties, but also results in a loss -of end-user functionality (they can't directly post a pic they posted from -Flickr anymore). Use it if you don't have a robust user-content moderation -team. ---# vim: et sw=4 sts=4 +URI.DisableExternalResources +TYPE: bool +VERSION: 1.3.0 +DEFAULT: false +--DESCRIPTION-- +Disables the embedding of external resources, preventing users from +embedding things like images from other hosts. This prevents access +tracking (good for email viewers), bandwidth leeching, cross-site request +forging, goatse.cx posting, and other nasties, but also results in a loss +of end-user functionality (they can't directly post a pic they posted from +Flickr anymore). Use it if you don't have a robust user-content moderation +team. +--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.DisableResources.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.DisableResources.txt similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.DisableResources.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.DisableResources.txt index 6c106144a..f891de499 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.DisableResources.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.DisableResources.txt @@ -1,15 +1,15 @@ -URI.DisableResources -TYPE: bool -VERSION: 4.2.0 -DEFAULT: false ---DESCRIPTION-- -

- Disables embedding resources, essentially meaning no pictures. You can - still link to them though. See %URI.DisableExternalResources for why - this might be a good idea. -

-

- Note: While this directive has been available since 1.3.0, - it didn't actually start doing anything until 4.2.0. -

---# vim: et sw=4 sts=4 +URI.DisableResources +TYPE: bool +VERSION: 4.2.0 +DEFAULT: false +--DESCRIPTION-- +

+ Disables embedding resources, essentially meaning no pictures. You can + still link to them though. See %URI.DisableExternalResources for why + this might be a good idea. +

+

+ Note: While this directive has been available since 1.3.0, + it didn't actually start doing anything until 4.2.0. +

+--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.Host.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.Host.txt similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.Host.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.Host.txt index ba0e6bce1..ee83b121d 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.Host.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.Host.txt @@ -1,19 +1,19 @@ -URI.Host -TYPE: string/null -VERSION: 1.2.0 -DEFAULT: NULL ---DESCRIPTION-- - -

- Defines the domain name of the server, so we can determine whether or - an absolute URI is from your website or not. Not strictly necessary, - as users should be using relative URIs to reference resources on your - website. It will, however, let you use absolute URIs to link to - subdomains of the domain you post here: i.e. example.com will allow - sub.example.com. However, higher up domains will still be excluded: - if you set %URI.Host to sub.example.com, example.com will be blocked. - Note: This directive overrides %URI.Base because - a given page may be on a sub-domain, but you wish HTML Purifier to be - more relaxed and allow some of the parent domains too. -

---# vim: et sw=4 sts=4 +URI.Host +TYPE: string/null +VERSION: 1.2.0 +DEFAULT: NULL +--DESCRIPTION-- + +

+ Defines the domain name of the server, so we can determine whether or + an absolute URI is from your website or not. Not strictly necessary, + as users should be using relative URIs to reference resources on your + website. It will, however, let you use absolute URIs to link to + subdomains of the domain you post here: i.e. example.com will allow + sub.example.com. However, higher up domains will still be excluded: + if you set %URI.Host to sub.example.com, example.com will be blocked. + Note: This directive overrides %URI.Base because + a given page may be on a sub-domain, but you wish HTML Purifier to be + more relaxed and allow some of the parent domains too. +

+--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.HostBlacklist.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.HostBlacklist.txt similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.HostBlacklist.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.HostBlacklist.txt index 825fef276..0b6df7625 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.HostBlacklist.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.HostBlacklist.txt @@ -1,9 +1,9 @@ -URI.HostBlacklist -TYPE: list -VERSION: 1.3.0 -DEFAULT: array() ---DESCRIPTION-- -List of strings that are forbidden in the host of any URI. Use it to kill -domain names of spam, etc. Note that it will catch anything in the domain, -so moo.com will catch moo.com.example.com. ---# vim: et sw=4 sts=4 +URI.HostBlacklist +TYPE: list +VERSION: 1.3.0 +DEFAULT: array() +--DESCRIPTION-- +List of strings that are forbidden in the host of any URI. Use it to kill +domain names of spam, etc. Note that it will catch anything in the domain, +so moo.com will catch moo.com.example.com. +--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.MakeAbsolute.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.MakeAbsolute.txt similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.MakeAbsolute.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.MakeAbsolute.txt index eb58c7f1a..4214900a5 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.MakeAbsolute.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.MakeAbsolute.txt @@ -1,13 +1,13 @@ -URI.MakeAbsolute -TYPE: bool -VERSION: 2.1.0 -DEFAULT: false ---DESCRIPTION-- - -

- Converts all URIs into absolute forms. This is useful when the HTML - being filtered assumes a specific base path, but will actually be - viewed in a different context (and setting an alternate base URI is - not possible). %URI.Base must be set for this directive to work. -

---# vim: et sw=4 sts=4 +URI.MakeAbsolute +TYPE: bool +VERSION: 2.1.0 +DEFAULT: false +--DESCRIPTION-- + +

+ Converts all URIs into absolute forms. This is useful when the HTML + being filtered assumes a specific base path, but will actually be + viewed in a different context (and setting an alternate base URI is + not possible). %URI.Base must be set for this directive to work. +

+--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.Munge.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.Munge.txt similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.Munge.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.Munge.txt index bedd610d6..58c81dcc4 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.Munge.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.Munge.txt @@ -1,83 +1,83 @@ -URI.Munge -TYPE: string/null -VERSION: 1.3.0 -DEFAULT: NULL ---DESCRIPTION-- - -

- Munges all browsable (usually http, https and ftp) - absolute URIs into another URI, usually a URI redirection service. - This directive accepts a URI, formatted with a %s where - the url-encoded original URI should be inserted (sample: - http://www.google.com/url?q=%s). -

-

- Uses for this directive: -

-
    -
  • - Prevent PageRank leaks, while being fairly transparent - to users (you may also want to add some client side JavaScript to - override the text in the statusbar). Notice: - Many security experts believe that this form of protection does not deter spam-bots. -
  • -
  • - Redirect users to a splash page telling them they are leaving your - website. While this is poor usability practice, it is often mandated - in corporate environments. -
  • -
-

- Prior to HTML Purifier 3.1.1, this directive also enabled the munging - of browsable external resources, which could break things if your redirection - script was a splash page or used meta tags. To revert to - previous behavior, please use %URI.MungeResources. -

-

- You may want to also use %URI.MungeSecretKey along with this directive - in order to enforce what URIs your redirector script allows. Open - redirector scripts can be a security risk and negatively affect the - reputation of your domain name. -

-

- Starting with HTML Purifier 3.1.1, there is also these substitutions: -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
KeyDescriptionExample <a href="">
%r1 - The URI embeds a resource
(blank) - The URI is merely a link
%nThe name of the tag this URI came froma
%mThe name of the attribute this URI came fromhref
%pThe name of the CSS property this URI came from, or blank if irrelevant
-

- Admittedly, these letters are somewhat arbitrary; the only stipulation - was that they couldn't be a through f. r is for resource (I would have preferred - e, but you take what you can get), n is for name, m - was picked because it came after n (and I couldn't use a), p is for - property. -

---# vim: et sw=4 sts=4 +URI.Munge +TYPE: string/null +VERSION: 1.3.0 +DEFAULT: NULL +--DESCRIPTION-- + +

+ Munges all browsable (usually http, https and ftp) + absolute URIs into another URI, usually a URI redirection service. + This directive accepts a URI, formatted with a %s where + the url-encoded original URI should be inserted (sample: + http://www.google.com/url?q=%s). +

+

+ Uses for this directive: +

+
    +
  • + Prevent PageRank leaks, while being fairly transparent + to users (you may also want to add some client side JavaScript to + override the text in the statusbar). Notice: + Many security experts believe that this form of protection does not deter spam-bots. +
  • +
  • + Redirect users to a splash page telling them they are leaving your + website. While this is poor usability practice, it is often mandated + in corporate environments. +
  • +
+

+ Prior to HTML Purifier 3.1.1, this directive also enabled the munging + of browsable external resources, which could break things if your redirection + script was a splash page or used meta tags. To revert to + previous behavior, please use %URI.MungeResources. +

+

+ You may want to also use %URI.MungeSecretKey along with this directive + in order to enforce what URIs your redirector script allows. Open + redirector scripts can be a security risk and negatively affect the + reputation of your domain name. +

+

+ Starting with HTML Purifier 3.1.1, there is also these substitutions: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
KeyDescriptionExample <a href="">
%r1 - The URI embeds a resource
(blank) - The URI is merely a link
%nThe name of the tag this URI came froma
%mThe name of the attribute this URI came fromhref
%pThe name of the CSS property this URI came from, or blank if irrelevant
+

+ Admittedly, these letters are somewhat arbitrary; the only stipulation + was that they couldn't be a through f. r is for resource (I would have preferred + e, but you take what you can get), n is for name, m + was picked because it came after n (and I couldn't use a), p is for + property. +

+--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.MungeResources.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.MungeResources.txt similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.MungeResources.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.MungeResources.txt index ed4b5b0d0..6fce0fdc3 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.MungeResources.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.MungeResources.txt @@ -1,17 +1,17 @@ -URI.MungeResources -TYPE: bool -VERSION: 3.1.1 -DEFAULT: false ---DESCRIPTION-- -

- If true, any URI munging directives like %URI.Munge - will also apply to embedded resources, such as <img src="">. - Be careful enabling this directive if you have a redirector script - that does not use the Location HTTP header; all of your images - and other embedded resources will break. -

-

- Warning: It is strongly advised you use this in conjunction - %URI.MungeSecretKey to mitigate the security risk of an open redirector. -

---# vim: et sw=4 sts=4 +URI.MungeResources +TYPE: bool +VERSION: 3.1.1 +DEFAULT: false +--DESCRIPTION-- +

+ If true, any URI munging directives like %URI.Munge + will also apply to embedded resources, such as <img src="">. + Be careful enabling this directive if you have a redirector script + that does not use the Location HTTP header; all of your images + and other embedded resources will break. +

+

+ Warning: It is strongly advised you use this in conjunction + %URI.MungeSecretKey to mitigate the security risk of an open redirector. +

+--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.MungeSecretKey.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.MungeSecretKey.txt similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.MungeSecretKey.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.MungeSecretKey.txt index 123b6e26b..1e17c1d46 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.MungeSecretKey.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.MungeSecretKey.txt @@ -1,30 +1,30 @@ -URI.MungeSecretKey -TYPE: string/null -VERSION: 3.1.1 -DEFAULT: NULL ---DESCRIPTION-- -

- This directive enables secure checksum generation along with %URI.Munge. - It should be set to a secure key that is not shared with anyone else. - The checksum can be placed in the URI using %t. Use of this checksum - affords an additional level of protection by allowing a redirector - to check if a URI has passed through HTML Purifier with this line: -

- -
$checksum === hash_hmac("sha256", $url, $secret_key)
- -

- If the output is TRUE, the redirector script should accept the URI. -

- -

- Please note that it would still be possible for an attacker to procure - secure hashes en-mass by abusing your website's Preview feature or the - like, but this service affords an additional level of protection - that should be combined with website blacklisting. -

- -

- Remember this has no effect if %URI.Munge is not on. -

---# vim: et sw=4 sts=4 +URI.MungeSecretKey +TYPE: string/null +VERSION: 3.1.1 +DEFAULT: NULL +--DESCRIPTION-- +

+ This directive enables secure checksum generation along with %URI.Munge. + It should be set to a secure key that is not shared with anyone else. + The checksum can be placed in the URI using %t. Use of this checksum + affords an additional level of protection by allowing a redirector + to check if a URI has passed through HTML Purifier with this line: +

+ +
$checksum === hash_hmac("sha256", $url, $secret_key)
+ +

+ If the output is TRUE, the redirector script should accept the URI. +

+ +

+ Please note that it would still be possible for an attacker to procure + secure hashes en-mass by abusing your website's Preview feature or the + like, but this service affords an additional level of protection + that should be combined with website blacklisting. +

+ +

+ Remember this has no effect if %URI.Munge is not on. +

+--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.OverrideAllowedSchemes.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.OverrideAllowedSchemes.txt similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.OverrideAllowedSchemes.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.OverrideAllowedSchemes.txt index 8b387dea3..23331a4e7 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.OverrideAllowedSchemes.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.OverrideAllowedSchemes.txt @@ -1,9 +1,9 @@ -URI.OverrideAllowedSchemes -TYPE: bool -DEFAULT: true ---DESCRIPTION-- -If this is set to true (which it is by default), you can override -%URI.AllowedSchemes by simply registering a HTMLPurifier_URIScheme to the -registry. If false, you will also have to update that directive in order -to add more schemes. ---# vim: et sw=4 sts=4 +URI.OverrideAllowedSchemes +TYPE: bool +DEFAULT: true +--DESCRIPTION-- +If this is set to true (which it is by default), you can override +%URI.AllowedSchemes by simply registering a HTMLPurifier_URIScheme to the +registry. If false, you will also have to update that directive in order +to add more schemes. +--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.SafeIframeRegexp.txt b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.SafeIframeRegexp.txt similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.SafeIframeRegexp.txt rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.SafeIframeRegexp.txt index 7e1f227f7..79084832b 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.SafeIframeRegexp.txt +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.SafeIframeRegexp.txt @@ -1,22 +1,22 @@ -URI.SafeIframeRegexp -TYPE: string/null -VERSION: 4.4.0 -DEFAULT: NULL ---DESCRIPTION-- -

- A PCRE regular expression that will be matched against an iframe URI. This is - a relatively inflexible scheme, but works well enough for the most common - use-case of iframes: embedded video. This directive only has an effect if - %HTML.SafeIframe is enabled. Here are some example values: -

-
    -
  • %^http://www.youtube.com/embed/% - Allow YouTube videos
  • -
  • %^http://player.vimeo.com/video/% - Allow Vimeo videos
  • -
  • %^http://(www.youtube.com/embed/|player.vimeo.com/video/)% - Allow both
  • -
-

- Note that this directive does not give you enough granularity to, say, disable - all autoplay videos. Pipe up on the HTML Purifier forums if this - is a capability you want. -

---# vim: et sw=4 sts=4 +URI.SafeIframeRegexp +TYPE: string/null +VERSION: 4.4.0 +DEFAULT: NULL +--DESCRIPTION-- +

+ A PCRE regular expression that will be matched against an iframe URI. This is + a relatively inflexible scheme, but works well enough for the most common + use-case of iframes: embedded video. This directive only has an effect if + %HTML.SafeIframe is enabled. Here are some example values: +

+
    +
  • %^http://www.youtube.com/embed/% - Allow YouTube videos
  • +
  • %^http://player.vimeo.com/video/% - Allow Vimeo videos
  • +
  • %^http://(www.youtube.com/embed/|player.vimeo.com/video/)% - Allow both
  • +
+

+ Note that this directive does not give you enough granularity to, say, disable + all autoplay videos. Pipe up on the HTML Purifier forums if this + is a capability you want. +

+--# vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/info.ini b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/info.ini similarity index 93% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/info.ini rename to thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/info.ini index 58e0ce4a1..5de4505e1 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/info.ini +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/info.ini @@ -1,3 +1,3 @@ -name = "HTML Purifier" - -; vim: et sw=4 sts=4 +name = "HTML Purifier" + +; vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ContentSets.php b/thirdparty/HTMLPurifier/HTMLPurifier/ContentSets.php similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ContentSets.php rename to thirdparty/HTMLPurifier/HTMLPurifier/ContentSets.php index f68b19631..543e3f8f1 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ContentSets.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ContentSets.php @@ -1,170 +1,170 @@ - true) indexed by name. - * @type array - * @note This is in HTMLPurifier_HTMLDefinition->info_content_sets - */ - public $lookup = array(); - - /** - * Synchronized list of defined content sets (keys of info). - * @type array - */ - protected $keys = array(); - /** - * Synchronized list of defined content values (values of info). - * @type array - */ - protected $values = array(); - - /** - * Merges in module's content sets, expands identifiers in the content - * sets and populates the keys, values and lookup member variables. - * @param HTMLPurifier_HTMLModule[] $modules List of HTMLPurifier_HTMLModule - */ - public function __construct($modules) - { - if (!is_array($modules)) { - $modules = array($modules); - } - // populate content_sets based on module hints - // sorry, no way of overloading - foreach ($modules as $module) { - foreach ($module->content_sets as $key => $value) { - $temp = $this->convertToLookup($value); - if (isset($this->lookup[$key])) { - // add it into the existing content set - $this->lookup[$key] = array_merge($this->lookup[$key], $temp); - } else { - $this->lookup[$key] = $temp; - } - } - } - $old_lookup = false; - while ($old_lookup !== $this->lookup) { - $old_lookup = $this->lookup; - foreach ($this->lookup as $i => $set) { - $add = array(); - foreach ($set as $element => $x) { - if (isset($this->lookup[$element])) { - $add += $this->lookup[$element]; - unset($this->lookup[$i][$element]); - } - } - $this->lookup[$i] += $add; - } - } - - foreach ($this->lookup as $key => $lookup) { - $this->info[$key] = implode(' | ', array_keys($lookup)); - } - $this->keys = array_keys($this->info); - $this->values = array_values($this->info); - } - - /** - * Accepts a definition; generates and assigns a ChildDef for it - * @param HTMLPurifier_ElementDef $def HTMLPurifier_ElementDef reference - * @param HTMLPurifier_HTMLModule $module Module that defined the ElementDef - */ - public function generateChildDef(&$def, $module) - { - if (!empty($def->child)) { // already done! - return; - } - $content_model = $def->content_model; - if (is_string($content_model)) { - // Assume that $this->keys is alphanumeric - $def->content_model = preg_replace_callback( - '/\b(' . implode('|', $this->keys) . ')\b/', - array($this, 'generateChildDefCallback'), - $content_model - ); - //$def->content_model = str_replace( - // $this->keys, $this->values, $content_model); - } - $def->child = $this->getChildDef($def, $module); - } - - public function generateChildDefCallback($matches) - { - return $this->info[$matches[0]]; - } - - /** - * Instantiates a ChildDef based on content_model and content_model_type - * member variables in HTMLPurifier_ElementDef - * @note This will also defer to modules for custom HTMLPurifier_ChildDef - * subclasses that need content set expansion - * @param HTMLPurifier_ElementDef $def HTMLPurifier_ElementDef to have ChildDef extracted - * @param HTMLPurifier_HTMLModule $module Module that defined the ElementDef - * @return HTMLPurifier_ChildDef corresponding to ElementDef - */ - public function getChildDef($def, $module) - { - $value = $def->content_model; - if (is_object($value)) { - trigger_error( - 'Literal object child definitions should be stored in '. - 'ElementDef->child not ElementDef->content_model', - E_USER_NOTICE - ); - return $value; - } - switch ($def->content_model_type) { - case 'required': - return new HTMLPurifier_ChildDef_Required($value); - case 'optional': - return new HTMLPurifier_ChildDef_Optional($value); - case 'empty': - return new HTMLPurifier_ChildDef_Empty(); - case 'custom': - return new HTMLPurifier_ChildDef_Custom($value); - } - // defer to its module - $return = false; - if ($module->defines_child_def) { // save a func call - $return = $module->getChildDef($def); - } - if ($return !== false) { - return $return; - } - // error-out - trigger_error( - 'Could not determine which ChildDef class to instantiate', - E_USER_ERROR - ); - return false; - } - - /** - * Converts a string list of elements separated by pipes into - * a lookup array. - * @param string $string List of elements - * @return array Lookup array of elements - */ - protected function convertToLookup($string) - { - $array = explode('|', str_replace(' ', '', $string)); - $ret = array(); - foreach ($array as $k) { - $ret[$k] = true; - } - return $ret; - } -} - -// vim: et sw=4 sts=4 + true) indexed by name. + * @type array + * @note This is in HTMLPurifier_HTMLDefinition->info_content_sets + */ + public $lookup = array(); + + /** + * Synchronized list of defined content sets (keys of info). + * @type array + */ + protected $keys = array(); + /** + * Synchronized list of defined content values (values of info). + * @type array + */ + protected $values = array(); + + /** + * Merges in module's content sets, expands identifiers in the content + * sets and populates the keys, values and lookup member variables. + * @param HTMLPurifier_HTMLModule[] $modules List of HTMLPurifier_HTMLModule + */ + public function __construct($modules) + { + if (!is_array($modules)) { + $modules = array($modules); + } + // populate content_sets based on module hints + // sorry, no way of overloading + foreach ($modules as $module) { + foreach ($module->content_sets as $key => $value) { + $temp = $this->convertToLookup($value); + if (isset($this->lookup[$key])) { + // add it into the existing content set + $this->lookup[$key] = array_merge($this->lookup[$key], $temp); + } else { + $this->lookup[$key] = $temp; + } + } + } + $old_lookup = false; + while ($old_lookup !== $this->lookup) { + $old_lookup = $this->lookup; + foreach ($this->lookup as $i => $set) { + $add = array(); + foreach ($set as $element => $x) { + if (isset($this->lookup[$element])) { + $add += $this->lookup[$element]; + unset($this->lookup[$i][$element]); + } + } + $this->lookup[$i] += $add; + } + } + + foreach ($this->lookup as $key => $lookup) { + $this->info[$key] = implode(' | ', array_keys($lookup)); + } + $this->keys = array_keys($this->info); + $this->values = array_values($this->info); + } + + /** + * Accepts a definition; generates and assigns a ChildDef for it + * @param HTMLPurifier_ElementDef $def HTMLPurifier_ElementDef reference + * @param HTMLPurifier_HTMLModule $module Module that defined the ElementDef + */ + public function generateChildDef(&$def, $module) + { + if (!empty($def->child)) { // already done! + return; + } + $content_model = $def->content_model; + if (is_string($content_model)) { + // Assume that $this->keys is alphanumeric + $def->content_model = preg_replace_callback( + '/\b(' . implode('|', $this->keys) . ')\b/', + array($this, 'generateChildDefCallback'), + $content_model + ); + //$def->content_model = str_replace( + // $this->keys, $this->values, $content_model); + } + $def->child = $this->getChildDef($def, $module); + } + + public function generateChildDefCallback($matches) + { + return $this->info[$matches[0]]; + } + + /** + * Instantiates a ChildDef based on content_model and content_model_type + * member variables in HTMLPurifier_ElementDef + * @note This will also defer to modules for custom HTMLPurifier_ChildDef + * subclasses that need content set expansion + * @param HTMLPurifier_ElementDef $def HTMLPurifier_ElementDef to have ChildDef extracted + * @param HTMLPurifier_HTMLModule $module Module that defined the ElementDef + * @return HTMLPurifier_ChildDef corresponding to ElementDef + */ + public function getChildDef($def, $module) + { + $value = $def->content_model; + if (is_object($value)) { + trigger_error( + 'Literal object child definitions should be stored in '. + 'ElementDef->child not ElementDef->content_model', + E_USER_NOTICE + ); + return $value; + } + switch ($def->content_model_type) { + case 'required': + return new HTMLPurifier_ChildDef_Required($value); + case 'optional': + return new HTMLPurifier_ChildDef_Optional($value); + case 'empty': + return new HTMLPurifier_ChildDef_Empty(); + case 'custom': + return new HTMLPurifier_ChildDef_Custom($value); + } + // defer to its module + $return = false; + if ($module->defines_child_def) { // save a func call + $return = $module->getChildDef($def); + } + if ($return !== false) { + return $return; + } + // error-out + trigger_error( + 'Could not determine which ChildDef class to instantiate', + E_USER_ERROR + ); + return false; + } + + /** + * Converts a string list of elements separated by pipes into + * a lookup array. + * @param string $string List of elements + * @return array Lookup array of elements + */ + protected function convertToLookup($string) + { + $array = explode('|', str_replace(' ', '', $string)); + $ret = array(); + foreach ($array as $k) { + $ret[$k] = true; + } + return $ret; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Context.php b/thirdparty/HTMLPurifier/HTMLPurifier/Context.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Context.php rename to thirdparty/HTMLPurifier/HTMLPurifier/Context.php index 5ad536d51..00e509c85 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Context.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/Context.php @@ -1,95 +1,95 @@ -_storage)) { - trigger_error( - "Name $name produces collision, cannot re-register", - E_USER_ERROR - ); - return; - } - $this->_storage[$name] =& $ref; - } - - /** - * Retrieves a variable reference from the context. - * @param string $name String name - * @param bool $ignore_error Boolean whether or not to ignore error - * @return mixed - */ - public function &get($name, $ignore_error = false) - { - if (!array_key_exists($name, $this->_storage)) { - if (!$ignore_error) { - trigger_error( - "Attempted to retrieve non-existent variable $name", - E_USER_ERROR - ); - } - $var = null; // so we can return by reference - return $var; - } - return $this->_storage[$name]; - } - - /** - * Destroys a variable in the context. - * @param string $name String name - */ - public function destroy($name) - { - if (!array_key_exists($name, $this->_storage)) { - trigger_error( - "Attempted to destroy non-existent variable $name", - E_USER_ERROR - ); - return; - } - unset($this->_storage[$name]); - } - - /** - * Checks whether or not the variable exists. - * @param string $name String name - * @return bool - */ - public function exists($name) - { - return array_key_exists($name, $this->_storage); - } - - /** - * Loads a series of variables from an associative array - * @param array $context_array Assoc array of variables to load - */ - public function loadArray($context_array) - { - foreach ($context_array as $key => $discard) { - $this->register($key, $context_array[$key]); - } - } -} - -// vim: et sw=4 sts=4 +_storage)) { + trigger_error( + "Name $name produces collision, cannot re-register", + E_USER_ERROR + ); + return; + } + $this->_storage[$name] =& $ref; + } + + /** + * Retrieves a variable reference from the context. + * @param string $name String name + * @param bool $ignore_error Boolean whether or not to ignore error + * @return mixed + */ + public function &get($name, $ignore_error = false) + { + if (!array_key_exists($name, $this->_storage)) { + if (!$ignore_error) { + trigger_error( + "Attempted to retrieve non-existent variable $name", + E_USER_ERROR + ); + } + $var = null; // so we can return by reference + return $var; + } + return $this->_storage[$name]; + } + + /** + * Destroys a variable in the context. + * @param string $name String name + */ + public function destroy($name) + { + if (!array_key_exists($name, $this->_storage)) { + trigger_error( + "Attempted to destroy non-existent variable $name", + E_USER_ERROR + ); + return; + } + unset($this->_storage[$name]); + } + + /** + * Checks whether or not the variable exists. + * @param string $name String name + * @return bool + */ + public function exists($name) + { + return array_key_exists($name, $this->_storage); + } + + /** + * Loads a series of variables from an associative array + * @param array $context_array Assoc array of variables to load + */ + public function loadArray($context_array) + { + foreach ($context_array as $key => $discard) { + $this->register($key, $context_array[$key]); + } + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Definition.php b/thirdparty/HTMLPurifier/HTMLPurifier/Definition.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Definition.php rename to thirdparty/HTMLPurifier/HTMLPurifier/Definition.php index f987e6035..bc6d43364 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Definition.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/Definition.php @@ -1,55 +1,55 @@ -setup) { - return; - } - $this->setup = true; - $this->doSetup($config); - } -} - -// vim: et sw=4 sts=4 +setup) { + return; + } + $this->setup = true; + $this->doSetup($config); + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/DefinitionCache.php b/thirdparty/HTMLPurifier/HTMLPurifier/DefinitionCache.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/DefinitionCache.php rename to thirdparty/HTMLPurifier/HTMLPurifier/DefinitionCache.php index d7f0bb1c4..67bb5b1e6 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/DefinitionCache.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/DefinitionCache.php @@ -1,129 +1,129 @@ -type = $type; - } - - /** - * Generates a unique identifier for a particular configuration - * @param HTMLPurifier_Config $config Instance of HTMLPurifier_Config - * @return string - */ - public function generateKey($config) - { - return $config->version . ',' . // possibly replace with function calls - $config->getBatchSerial($this->type) . ',' . - $config->get($this->type . '.DefinitionRev'); - } - - /** - * Tests whether or not a key is old with respect to the configuration's - * version and revision number. - * @param string $key Key to test - * @param HTMLPurifier_Config $config Instance of HTMLPurifier_Config to test against - * @return bool - */ - public function isOld($key, $config) - { - if (substr_count($key, ',') < 2) { - return true; - } - list($version, $hash, $revision) = explode(',', $key, 3); - $compare = version_compare($version, $config->version); - // version mismatch, is always old - if ($compare != 0) { - return true; - } - // versions match, ids match, check revision number - if ($hash == $config->getBatchSerial($this->type) && - $revision < $config->get($this->type . '.DefinitionRev')) { - return true; - } - return false; - } - - /** - * Checks if a definition's type jives with the cache's type - * @note Throws an error on failure - * @param HTMLPurifier_Definition $def Definition object to check - * @return bool true if good, false if not - */ - public function checkDefType($def) - { - if ($def->type !== $this->type) { - trigger_error("Cannot use definition of type {$def->type} in cache for {$this->type}"); - return false; - } - return true; - } - - /** - * Adds a definition object to the cache - * @param HTMLPurifier_Definition $def - * @param HTMLPurifier_Config $config - */ - abstract public function add($def, $config); - - /** - * Unconditionally saves a definition object to the cache - * @param HTMLPurifier_Definition $def - * @param HTMLPurifier_Config $config - */ - abstract public function set($def, $config); - - /** - * Replace an object in the cache - * @param HTMLPurifier_Definition $def - * @param HTMLPurifier_Config $config - */ - abstract public function replace($def, $config); - - /** - * Retrieves a definition object from the cache - * @param HTMLPurifier_Config $config - */ - abstract public function get($config); - - /** - * Removes a definition object to the cache - * @param HTMLPurifier_Config $config - */ - abstract public function remove($config); - - /** - * Clears all objects from cache - * @param HTMLPurifier_Config $config - */ - abstract public function flush($config); - - /** - * Clears all expired (older version or revision) objects from cache - * @note Be carefuly implementing this method as flush. Flush must - * not interfere with other Definition types, and cleanup() - * should not be repeatedly called by userland code. - * @param HTMLPurifier_Config $config - */ - abstract public function cleanup($config); -} - -// vim: et sw=4 sts=4 +type = $type; + } + + /** + * Generates a unique identifier for a particular configuration + * @param HTMLPurifier_Config $config Instance of HTMLPurifier_Config + * @return string + */ + public function generateKey($config) + { + return $config->version . ',' . // possibly replace with function calls + $config->getBatchSerial($this->type) . ',' . + $config->get($this->type . '.DefinitionRev'); + } + + /** + * Tests whether or not a key is old with respect to the configuration's + * version and revision number. + * @param string $key Key to test + * @param HTMLPurifier_Config $config Instance of HTMLPurifier_Config to test against + * @return bool + */ + public function isOld($key, $config) + { + if (substr_count($key, ',') < 2) { + return true; + } + list($version, $hash, $revision) = explode(',', $key, 3); + $compare = version_compare($version, $config->version); + // version mismatch, is always old + if ($compare != 0) { + return true; + } + // versions match, ids match, check revision number + if ($hash == $config->getBatchSerial($this->type) && + $revision < $config->get($this->type . '.DefinitionRev')) { + return true; + } + return false; + } + + /** + * Checks if a definition's type jives with the cache's type + * @note Throws an error on failure + * @param HTMLPurifier_Definition $def Definition object to check + * @return bool true if good, false if not + */ + public function checkDefType($def) + { + if ($def->type !== $this->type) { + trigger_error("Cannot use definition of type {$def->type} in cache for {$this->type}"); + return false; + } + return true; + } + + /** + * Adds a definition object to the cache + * @param HTMLPurifier_Definition $def + * @param HTMLPurifier_Config $config + */ + abstract public function add($def, $config); + + /** + * Unconditionally saves a definition object to the cache + * @param HTMLPurifier_Definition $def + * @param HTMLPurifier_Config $config + */ + abstract public function set($def, $config); + + /** + * Replace an object in the cache + * @param HTMLPurifier_Definition $def + * @param HTMLPurifier_Config $config + */ + abstract public function replace($def, $config); + + /** + * Retrieves a definition object from the cache + * @param HTMLPurifier_Config $config + */ + abstract public function get($config); + + /** + * Removes a definition object to the cache + * @param HTMLPurifier_Config $config + */ + abstract public function remove($config); + + /** + * Clears all objects from cache + * @param HTMLPurifier_Config $config + */ + abstract public function flush($config); + + /** + * Clears all expired (older version or revision) objects from cache + * @note Be carefuly implementing this method as flush. Flush must + * not interfere with other Definition types, and cleanup() + * should not be repeatedly called by userland code. + * @param HTMLPurifier_Config $config + */ + abstract public function cleanup($config); +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/DefinitionCache/Decorator.php b/thirdparty/HTMLPurifier/HTMLPurifier/DefinitionCache/Decorator.php similarity index 95% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/DefinitionCache/Decorator.php rename to thirdparty/HTMLPurifier/HTMLPurifier/DefinitionCache/Decorator.php index 09cdc1c82..b57a51b6c 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/DefinitionCache/Decorator.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/DefinitionCache/Decorator.php @@ -1,112 +1,112 @@ -copy(); - // reference is necessary for mocks in PHP 4 - $decorator->cache =& $cache; - $decorator->type = $cache->type; - return $decorator; - } - - /** - * Cross-compatible clone substitute - * @return HTMLPurifier_DefinitionCache_Decorator - */ - public function copy() - { - return new HTMLPurifier_DefinitionCache_Decorator(); - } - - /** - * @param HTMLPurifier_Definition $def - * @param HTMLPurifier_Config $config - * @return mixed - */ - public function add($def, $config) - { - return $this->cache->add($def, $config); - } - - /** - * @param HTMLPurifier_Definition $def - * @param HTMLPurifier_Config $config - * @return mixed - */ - public function set($def, $config) - { - return $this->cache->set($def, $config); - } - - /** - * @param HTMLPurifier_Definition $def - * @param HTMLPurifier_Config $config - * @return mixed - */ - public function replace($def, $config) - { - return $this->cache->replace($def, $config); - } - - /** - * @param HTMLPurifier_Config $config - * @return mixed - */ - public function get($config) - { - return $this->cache->get($config); - } - - /** - * @param HTMLPurifier_Config $config - * @return mixed - */ - public function remove($config) - { - return $this->cache->remove($config); - } - - /** - * @param HTMLPurifier_Config $config - * @return mixed - */ - public function flush($config) - { - return $this->cache->flush($config); - } - - /** - * @param HTMLPurifier_Config $config - * @return mixed - */ - public function cleanup($config) - { - return $this->cache->cleanup($config); - } -} - -// vim: et sw=4 sts=4 +copy(); + // reference is necessary for mocks in PHP 4 + $decorator->cache =& $cache; + $decorator->type = $cache->type; + return $decorator; + } + + /** + * Cross-compatible clone substitute + * @return HTMLPurifier_DefinitionCache_Decorator + */ + public function copy() + { + return new HTMLPurifier_DefinitionCache_Decorator(); + } + + /** + * @param HTMLPurifier_Definition $def + * @param HTMLPurifier_Config $config + * @return mixed + */ + public function add($def, $config) + { + return $this->cache->add($def, $config); + } + + /** + * @param HTMLPurifier_Definition $def + * @param HTMLPurifier_Config $config + * @return mixed + */ + public function set($def, $config) + { + return $this->cache->set($def, $config); + } + + /** + * @param HTMLPurifier_Definition $def + * @param HTMLPurifier_Config $config + * @return mixed + */ + public function replace($def, $config) + { + return $this->cache->replace($def, $config); + } + + /** + * @param HTMLPurifier_Config $config + * @return mixed + */ + public function get($config) + { + return $this->cache->get($config); + } + + /** + * @param HTMLPurifier_Config $config + * @return mixed + */ + public function remove($config) + { + return $this->cache->remove($config); + } + + /** + * @param HTMLPurifier_Config $config + * @return mixed + */ + public function flush($config) + { + return $this->cache->flush($config); + } + + /** + * @param HTMLPurifier_Config $config + * @return mixed + */ + public function cleanup($config) + { + return $this->cache->cleanup($config); + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/DefinitionCache/Decorator/Cleanup.php b/thirdparty/HTMLPurifier/HTMLPurifier/DefinitionCache/Decorator/Cleanup.php similarity index 95% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/DefinitionCache/Decorator/Cleanup.php rename to thirdparty/HTMLPurifier/HTMLPurifier/DefinitionCache/Decorator/Cleanup.php index 53dca67dc..4991777ce 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/DefinitionCache/Decorator/Cleanup.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/DefinitionCache/Decorator/Cleanup.php @@ -1,78 +1,78 @@ -definitions[$this->generateKey($config)] = $def; - } - return $status; - } - - /** - * @param HTMLPurifier_Definition $def - * @param HTMLPurifier_Config $config - * @return mixed - */ - public function set($def, $config) - { - $status = parent::set($def, $config); - if ($status) { - $this->definitions[$this->generateKey($config)] = $def; - } - return $status; - } - - /** - * @param HTMLPurifier_Definition $def - * @param HTMLPurifier_Config $config - * @return mixed - */ - public function replace($def, $config) - { - $status = parent::replace($def, $config); - if ($status) { - $this->definitions[$this->generateKey($config)] = $def; - } - return $status; - } - - /** - * @param HTMLPurifier_Config $config - * @return mixed - */ - public function get($config) - { - $key = $this->generateKey($config); - if (isset($this->definitions[$key])) { - return $this->definitions[$key]; - } - $this->definitions[$key] = parent::get($config); - return $this->definitions[$key]; - } -} - -// vim: et sw=4 sts=4 +definitions[$this->generateKey($config)] = $def; + } + return $status; + } + + /** + * @param HTMLPurifier_Definition $def + * @param HTMLPurifier_Config $config + * @return mixed + */ + public function set($def, $config) + { + $status = parent::set($def, $config); + if ($status) { + $this->definitions[$this->generateKey($config)] = $def; + } + return $status; + } + + /** + * @param HTMLPurifier_Definition $def + * @param HTMLPurifier_Config $config + * @return mixed + */ + public function replace($def, $config) + { + $status = parent::replace($def, $config); + if ($status) { + $this->definitions[$this->generateKey($config)] = $def; + } + return $status; + } + + /** + * @param HTMLPurifier_Config $config + * @return mixed + */ + public function get($config) + { + $key = $this->generateKey($config); + if (isset($this->definitions[$key])) { + return $this->definitions[$key]; + } + $this->definitions[$key] = parent::get($config); + return $this->definitions[$key]; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/DefinitionCache/Decorator/Template.php.in b/thirdparty/HTMLPurifier/HTMLPurifier/DefinitionCache/Decorator/Template.php.in similarity index 95% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/DefinitionCache/Decorator/Template.php.in rename to thirdparty/HTMLPurifier/HTMLPurifier/DefinitionCache/Decorator/Template.php.in index c586890fb..b1fec8d36 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/DefinitionCache/Decorator/Template.php.in +++ b/thirdparty/HTMLPurifier/HTMLPurifier/DefinitionCache/Decorator/Template.php.in @@ -1,82 +1,82 @@ -checkDefType($def)) { - return; - } - $file = $this->generateFilePath($config); - if (file_exists($file)) { - return false; - } - if (!$this->_prepareDir($config)) { - return false; - } - return $this->_write($file, serialize($def), $config); - } - - /** - * @param HTMLPurifier_Definition $def - * @param HTMLPurifier_Config $config - * @return int|bool - */ - public function set($def, $config) - { - if (!$this->checkDefType($def)) { - return; - } - $file = $this->generateFilePath($config); - if (!$this->_prepareDir($config)) { - return false; - } - return $this->_write($file, serialize($def), $config); - } - - /** - * @param HTMLPurifier_Definition $def - * @param HTMLPurifier_Config $config - * @return int|bool - */ - public function replace($def, $config) - { - if (!$this->checkDefType($def)) { - return; - } - $file = $this->generateFilePath($config); - if (!file_exists($file)) { - return false; - } - if (!$this->_prepareDir($config)) { - return false; - } - return $this->_write($file, serialize($def), $config); - } - - /** - * @param HTMLPurifier_Config $config - * @return bool|HTMLPurifier_Config - */ - public function get($config) - { - $file = $this->generateFilePath($config); - if (!file_exists($file)) { - return false; - } - return unserialize(file_get_contents($file)); - } - - /** - * @param HTMLPurifier_Config $config - * @return bool - */ - public function remove($config) - { - $file = $this->generateFilePath($config); - if (!file_exists($file)) { - return false; - } - - if (!class_exists('G')) { - $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); - $docuroot = explode( '/', $realdocuroot ); - array_pop( $docuroot ); - $pathhome = implode( '/', $docuroot ) . '/'; - array_pop( $docuroot ); - $pathTrunk = implode( '/', $docuroot ) . '/'; - require_once($pathTrunk.'gulliver/system/class.g.php'); - } - - G::LoadSystem('inputfilter'); - $filter = new InputFilter(); - - $sFile=$filter->validateInput($file,'path'); - $cunlink = self::unlink; - return $cunlink($sFile); - } - - /** - * @param HTMLPurifier_Config $config - * @return bool - */ - public function flush($config) - { - if (!$this->_prepareDir($config)) { - return false; - } - $dir = $this->generateDirectoryPath($config); - $dh = opendir($dir); - while (false !== ($filename = readdir($dh))) { - if (empty($filename)) { - continue; - } - if ($filename[0] === '.') { - continue; - } - unlink($dir . '/' . $filename); - } - } - - /** - * @param HTMLPurifier_Config $config - * @return bool - */ - public function cleanup($config) - { - if (!$this->_prepareDir($config)) { - return false; - } - $dir = $this->generateDirectoryPath($config); - $dh = opendir($dir); - while (false !== ($filename = readdir($dh))) { - if (empty($filename)) { - continue; - } - if ($filename[0] === '.') { - continue; - } - $key = substr($filename, 0, strlen($filename) - 4); - if ($this->isOld($key, $config)) { - unlink($dir . '/' . $filename); - } - } - } - - /** - * Generates the file path to the serial file corresponding to - * the configuration and definition name - * @param HTMLPurifier_Config $config - * @return string - * @todo Make protected - */ - public function generateFilePath($config) - { - $key = $this->generateKey($config); - return $this->generateDirectoryPath($config) . '/' . $key . '.ser'; - } - - /** - * Generates the path to the directory contain this cache's serial files - * @param HTMLPurifier_Config $config - * @return string - * @note No trailing slash - * @todo Make protected - */ - public function generateDirectoryPath($config) - { - $base = $this->generateBaseDirectoryPath($config); - return $base . '/' . $this->type; - } - - /** - * Generates path to base directory that contains all definition type - * serials - * @param HTMLPurifier_Config $config - * @return mixed|string - * @todo Make protected - */ - public function generateBaseDirectoryPath($config) - { - $base = $config->get('Cache.SerializerPath'); - $base = is_null($base) ? HTMLPURIFIER_PREFIX . '/HTMLPurifier/DefinitionCache/Serializer' : $base; - return $base; - } - - /** - * Convenience wrapper function for file_put_contents - * @param string $file File name to write to - * @param string $data Data to write into file - * @param HTMLPurifier_Config $config - * @return int|bool Number of bytes written if success, or false if failure. - */ - private function _write($file, $data, $config) - { - if (!class_exists('G')) { - $realdocuroot = str_replace('\\', '/', $_SERVER['DOCUMENT_ROOT']); - $docuroot = explode('/', $realdocuroot); - array_pop($docuroot); - $pathhome = implode('/', $docuroot) . '/'; - array_pop($docuroot); - $pathTrunk = implode('/', $docuroot) . '/'; - require_once($pathTrunk . 'gulliver/system/class.g.php'); - } - G::LoadSystem('inputfilter'); - $filter = new InputFilter(); - - if(is_file($file)) { - $result = file_put_contents($file, $data); - } else { - $result = false; - } - if ($result !== false) { - // set permissions of the new file (no execute) - $chmod = $config->get('Cache.SerializerPermissions'); - if (!$chmod) { - $chmod = 0644; // invalid config or simpletest - } - $chmod = $chmod & 0666; - $sFile = $filter->validateInput($file, 'path'); - $chmod = self::chmod; - $chmod($sFile, $chmod); - } - return $result; - } - - /** - * Prepares the directory that this type stores the serials in - * @param HTMLPurifier_Config $config - * @return bool True if successful - */ - private function _prepareDir($config) - { - $directory = $this->generateDirectoryPath($config); - $chmod = $config->get('Cache.SerializerPermissions'); - if (!$chmod) { - $chmod = 0755; // invalid config or simpletest - } - if (!is_dir($directory)) { - $base = $this->generateBaseDirectoryPath($config); - if (!is_dir($base)) { - trigger_error( - 'Base directory ' . $base . ' does not exist, - please create or change using %Cache.SerializerPath', - E_USER_WARNING - ); - return false; - } elseif (!$this->_testPermissions($base, $chmod)) { - return false; - } - $old = umask(0000); - mkdir($directory, $chmod); - umask($old); - } elseif (!$this->_testPermissions($directory, $chmod)) { - return false; - } - return true; - } - - /** - * Tests permissions on a directory and throws out friendly - * error messages and attempts to chmod it itself if possible - * @param string $dir Directory path - * @param int $chmod Permissions - * @return bool True if directory is writable - */ - private function _testPermissions($dir, $chmod) - { - // early abort, if it is writable, everything is hunky-dory - if (is_writable($dir)) { - return true; - } - if (!is_dir($dir)) { - // generally, you'll want to handle this beforehand - // so a more specific error message can be given - trigger_error( - 'Directory ' . $dir . ' does not exist', - E_USER_WARNING - ); - return false; - } - if (function_exists('posix_getuid')) { - // POSIX system, we can give more specific advice - if (fileowner($dir) === posix_getuid()) { - // we can chmod it ourselves - $chmod = $chmod | 0700; - if (chmod($dir, $chmod)) { - return true; - } - } elseif (filegroup($dir) === posix_getgid()) { - $chmod = $chmod | 0070; - } else { - // PHP's probably running as nobody, so we'll - // need to give global permissions - $chmod = $chmod | 0777; - } - trigger_error( - 'Directory ' . $dir . ' not writable, ' . - 'please chmod to ' . decoct($chmod), - E_USER_WARNING - ); - } else { - // generic error message - trigger_error( - 'Directory ' . $dir . ' not writable, ' . - 'please alter file permissions', - E_USER_WARNING - ); - } - return false; - } -} - -// vim: et sw=4 sts=4 +checkDefType($def)) { + return; + } + $file = $this->generateFilePath($config); + if (file_exists($file)) { + return false; + } + if (!$this->_prepareDir($config)) { + return false; + } + return $this->_write($file, serialize($def), $config); + } + + /** + * @param HTMLPurifier_Definition $def + * @param HTMLPurifier_Config $config + * @return int|bool + */ + public function set($def, $config) + { + if (!$this->checkDefType($def)) { + return; + } + $file = $this->generateFilePath($config); + if (!$this->_prepareDir($config)) { + return false; + } + return $this->_write($file, serialize($def), $config); + } + + /** + * @param HTMLPurifier_Definition $def + * @param HTMLPurifier_Config $config + * @return int|bool + */ + public function replace($def, $config) + { + if (!$this->checkDefType($def)) { + return; + } + $file = $this->generateFilePath($config); + if (!file_exists($file)) { + return false; + } + if (!$this->_prepareDir($config)) { + return false; + } + return $this->_write($file, serialize($def), $config); + } + + /** + * @param HTMLPurifier_Config $config + * @return bool|HTMLPurifier_Config + */ + public function get($config) + { + $file = $this->generateFilePath($config); + if (!file_exists($file)) { + return false; + } + return unserialize(file_get_contents($file)); + } + + /** + * @param HTMLPurifier_Config $config + * @return bool + */ + public function remove($config) + { + $file = $this->generateFilePath($config); + if (!file_exists($file)) { + return false; + } + + if (!class_exists('G')) { + $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); + $docuroot = explode( '/', $realdocuroot ); + array_pop( $docuroot ); + $pathhome = implode( '/', $docuroot ) . '/'; + array_pop( $docuroot ); + $pathTrunk = implode( '/', $docuroot ) . '/'; + require_once($pathTrunk.'gulliver/system/class.g.php'); + } + + G::LoadSystem('inputfilter'); + $filter = new InputFilter(); + + $sFile=$filter->validateInput($file,'path'); + $cunlink = self::unlink; + return $cunlink($sFile); + } + + /** + * @param HTMLPurifier_Config $config + * @return bool + */ + public function flush($config) + { + if (!$this->_prepareDir($config)) { + return false; + } + $dir = $this->generateDirectoryPath($config); + $dh = opendir($dir); + while (false !== ($filename = readdir($dh))) { + if (empty($filename)) { + continue; + } + if ($filename[0] === '.') { + continue; + } + unlink($dir . '/' . $filename); + } + } + + /** + * @param HTMLPurifier_Config $config + * @return bool + */ + public function cleanup($config) + { + if (!$this->_prepareDir($config)) { + return false; + } + $dir = $this->generateDirectoryPath($config); + $dh = opendir($dir); + while (false !== ($filename = readdir($dh))) { + if (empty($filename)) { + continue; + } + if ($filename[0] === '.') { + continue; + } + $key = substr($filename, 0, strlen($filename) - 4); + if ($this->isOld($key, $config)) { + unlink($dir . '/' . $filename); + } + } + } + + /** + * Generates the file path to the serial file corresponding to + * the configuration and definition name + * @param HTMLPurifier_Config $config + * @return string + * @todo Make protected + */ + public function generateFilePath($config) + { + $key = $this->generateKey($config); + return $this->generateDirectoryPath($config) . '/' . $key . '.ser'; + } + + /** + * Generates the path to the directory contain this cache's serial files + * @param HTMLPurifier_Config $config + * @return string + * @note No trailing slash + * @todo Make protected + */ + public function generateDirectoryPath($config) + { + $base = $this->generateBaseDirectoryPath($config); + return $base . '/' . $this->type; + } + + /** + * Generates path to base directory that contains all definition type + * serials + * @param HTMLPurifier_Config $config + * @return mixed|string + * @todo Make protected + */ + public function generateBaseDirectoryPath($config) + { + $base = $config->get('Cache.SerializerPath'); + $base = is_null($base) ? HTMLPURIFIER_PREFIX . '/HTMLPurifier/DefinitionCache/Serializer' : $base; + return $base; + } + + /** + * Convenience wrapper function for file_put_contents + * @param string $file File name to write to + * @param string $data Data to write into file + * @param HTMLPurifier_Config $config + * @return int|bool Number of bytes written if success, or false if failure. + */ + private function _write($file, $data, $config) + { + if (!class_exists('G')) { + $realdocuroot = str_replace('\\', '/', $_SERVER['DOCUMENT_ROOT']); + $docuroot = explode('/', $realdocuroot); + array_pop($docuroot); + $pathhome = implode('/', $docuroot) . '/'; + array_pop($docuroot); + $pathTrunk = implode('/', $docuroot) . '/'; + require_once($pathTrunk . 'gulliver/system/class.g.php'); + } + G::LoadSystem('inputfilter'); + $filter = new InputFilter(); + + if(is_file($file)) { + $result = file_put_contents($file, $data); + } else { + $result = false; + } + if ($result !== false) { + // set permissions of the new file (no execute) + $chmod = $config->get('Cache.SerializerPermissions'); + if (!$chmod) { + $chmod = 0644; // invalid config or simpletest + } + $chmod = $chmod & 0666; + $sFile = $filter->validateInput($file, 'path'); + $chmod = self::chmod; + $chmod($sFile, $chmod); + } + return $result; + } + + /** + * Prepares the directory that this type stores the serials in + * @param HTMLPurifier_Config $config + * @return bool True if successful + */ + private function _prepareDir($config) + { + $directory = $this->generateDirectoryPath($config); + $chmod = $config->get('Cache.SerializerPermissions'); + if (!$chmod) { + $chmod = 0755; // invalid config or simpletest + } + if (!is_dir($directory)) { + $base = $this->generateBaseDirectoryPath($config); + if (!is_dir($base)) { + trigger_error( + 'Base directory ' . $base . ' does not exist, + please create or change using %Cache.SerializerPath', + E_USER_WARNING + ); + return false; + } elseif (!$this->_testPermissions($base, $chmod)) { + return false; + } + $old = umask(0000); + mkdir($directory, $chmod); + umask($old); + } elseif (!$this->_testPermissions($directory, $chmod)) { + return false; + } + return true; + } + + /** + * Tests permissions on a directory and throws out friendly + * error messages and attempts to chmod it itself if possible + * @param string $dir Directory path + * @param int $chmod Permissions + * @return bool True if directory is writable + */ + private function _testPermissions($dir, $chmod) + { + // early abort, if it is writable, everything is hunky-dory + if (is_writable($dir)) { + return true; + } + if (!is_dir($dir)) { + // generally, you'll want to handle this beforehand + // so a more specific error message can be given + trigger_error( + 'Directory ' . $dir . ' does not exist', + E_USER_WARNING + ); + return false; + } + if (function_exists('posix_getuid')) { + // POSIX system, we can give more specific advice + if (fileowner($dir) === posix_getuid()) { + // we can chmod it ourselves + $chmod = $chmod | 0700; + if (chmod($dir, $chmod)) { + return true; + } + } elseif (filegroup($dir) === posix_getgid()) { + $chmod = $chmod | 0070; + } else { + // PHP's probably running as nobody, so we'll + // need to give global permissions + $chmod = $chmod | 0777; + } + trigger_error( + 'Directory ' . $dir . ' not writable, ' . + 'please chmod to ' . decoct($chmod), + E_USER_WARNING + ); + } else { + // generic error message + trigger_error( + 'Directory ' . $dir . ' not writable, ' . + 'please alter file permissions', + E_USER_WARNING + ); + } + return false; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/DefinitionCache/Serializer/CSS/4.6.0,24166bfe16a0cc6bd18d813b83121ef2eaf16545,1.ser b/thirdparty/HTMLPurifier/HTMLPurifier/DefinitionCache/Serializer/CSS/4.6.0,24166bfe16a0cc6bd18d813b83121ef2eaf16545,1.ser similarity index 100% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/DefinitionCache/Serializer/CSS/4.6.0,24166bfe16a0cc6bd18d813b83121ef2eaf16545,1.ser rename to thirdparty/HTMLPurifier/HTMLPurifier/DefinitionCache/Serializer/CSS/4.6.0,24166bfe16a0cc6bd18d813b83121ef2eaf16545,1.ser diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/DefinitionCache/Serializer/HTML/4.6.0,bd08c5afbc77123dbd4e9e026a723c450e9f844b,1.ser b/thirdparty/HTMLPurifier/HTMLPurifier/DefinitionCache/Serializer/HTML/4.6.0,bd08c5afbc77123dbd4e9e026a723c450e9f844b,1.ser similarity index 100% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/DefinitionCache/Serializer/HTML/4.6.0,bd08c5afbc77123dbd4e9e026a723c450e9f844b,1.ser rename to thirdparty/HTMLPurifier/HTMLPurifier/DefinitionCache/Serializer/HTML/4.6.0,bd08c5afbc77123dbd4e9e026a723c450e9f844b,1.ser diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/DefinitionCache/Serializer/README b/thirdparty/HTMLPurifier/HTMLPurifier/DefinitionCache/Serializer/README similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/DefinitionCache/Serializer/README rename to thirdparty/HTMLPurifier/HTMLPurifier/DefinitionCache/Serializer/README index ba005de73..2e35c1c3d 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/DefinitionCache/Serializer/README +++ b/thirdparty/HTMLPurifier/HTMLPurifier/DefinitionCache/Serializer/README @@ -1,3 +1,3 @@ -This is a dummy file to prevent Git from ignoring this empty directory. - - vim: et sw=4 sts=4 +This is a dummy file to prevent Git from ignoring this empty directory. + + vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/DefinitionCacheFactory.php b/thirdparty/HTMLPurifier/HTMLPurifier/DefinitionCacheFactory.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/DefinitionCacheFactory.php rename to thirdparty/HTMLPurifier/HTMLPurifier/DefinitionCacheFactory.php index 737b8bb3b..fd1cc9be4 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/DefinitionCacheFactory.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/DefinitionCacheFactory.php @@ -1,106 +1,106 @@ - array()); - - /** - * @type array - */ - protected $implementations = array(); - - /** - * @type HTMLPurifier_DefinitionCache_Decorator[] - */ - protected $decorators = array(); - - /** - * Initialize default decorators - */ - public function setup() - { - $this->addDecorator('Cleanup'); - } - - /** - * Retrieves an instance of global definition cache factory. - * @param HTMLPurifier_DefinitionCacheFactory $prototype - * @return HTMLPurifier_DefinitionCacheFactory - */ - public static function instance($prototype = null) - { - static $instance; - if ($prototype !== null) { - $instance = $prototype; - } elseif ($instance === null || $prototype === true) { - $instance = new HTMLPurifier_DefinitionCacheFactory(); - $instance->setup(); - } - return $instance; - } - - /** - * Registers a new definition cache object - * @param string $short Short name of cache object, for reference - * @param string $long Full class name of cache object, for construction - */ - public function register($short, $long) - { - $this->implementations[$short] = $long; - } - - /** - * Factory method that creates a cache object based on configuration - * @param string $type Name of definitions handled by cache - * @param HTMLPurifier_Config $config Config instance - * @return mixed - */ - public function create($type, $config) - { - $method = $config->get('Cache.DefinitionImpl'); - if ($method === null) { - return new HTMLPurifier_DefinitionCache_Null($type); - } - if (!empty($this->caches[$method][$type])) { - return $this->caches[$method][$type]; - } - if (isset($this->implementations[$method]) && - class_exists($class = $this->implementations[$method], false)) { - $cache = new $class($type); - } else { - if ($method != 'Serializer') { - trigger_error("Unrecognized DefinitionCache $method, using Serializer instead", E_USER_WARNING); - } - $cache = new HTMLPurifier_DefinitionCache_Serializer($type); - } - foreach ($this->decorators as $decorator) { - $new_cache = $decorator->decorate($cache); - // prevent infinite recursion in PHP 4 - unset($cache); - $cache = $new_cache; - } - $this->caches[$method][$type] = $cache; - return $this->caches[$method][$type]; - } - - /** - * Registers a decorator to add to all new cache objects - * @param HTMLPurifier_DefinitionCache_Decorator|string $decorator An instance or the name of a decorator - */ - public function addDecorator($decorator) - { - if (is_string($decorator)) { - $class = "HTMLPurifier_DefinitionCache_Decorator_$decorator"; - $decorator = new $class; - } - $this->decorators[$decorator->name] = $decorator; - } -} - -// vim: et sw=4 sts=4 + array()); + + /** + * @type array + */ + protected $implementations = array(); + + /** + * @type HTMLPurifier_DefinitionCache_Decorator[] + */ + protected $decorators = array(); + + /** + * Initialize default decorators + */ + public function setup() + { + $this->addDecorator('Cleanup'); + } + + /** + * Retrieves an instance of global definition cache factory. + * @param HTMLPurifier_DefinitionCacheFactory $prototype + * @return HTMLPurifier_DefinitionCacheFactory + */ + public static function instance($prototype = null) + { + static $instance; + if ($prototype !== null) { + $instance = $prototype; + } elseif ($instance === null || $prototype === true) { + $instance = new HTMLPurifier_DefinitionCacheFactory(); + $instance->setup(); + } + return $instance; + } + + /** + * Registers a new definition cache object + * @param string $short Short name of cache object, for reference + * @param string $long Full class name of cache object, for construction + */ + public function register($short, $long) + { + $this->implementations[$short] = $long; + } + + /** + * Factory method that creates a cache object based on configuration + * @param string $type Name of definitions handled by cache + * @param HTMLPurifier_Config $config Config instance + * @return mixed + */ + public function create($type, $config) + { + $method = $config->get('Cache.DefinitionImpl'); + if ($method === null) { + return new HTMLPurifier_DefinitionCache_Null($type); + } + if (!empty($this->caches[$method][$type])) { + return $this->caches[$method][$type]; + } + if (isset($this->implementations[$method]) && + class_exists($class = $this->implementations[$method], false)) { + $cache = new $class($type); + } else { + if ($method != 'Serializer') { + trigger_error("Unrecognized DefinitionCache $method, using Serializer instead", E_USER_WARNING); + } + $cache = new HTMLPurifier_DefinitionCache_Serializer($type); + } + foreach ($this->decorators as $decorator) { + $new_cache = $decorator->decorate($cache); + // prevent infinite recursion in PHP 4 + unset($cache); + $cache = $new_cache; + } + $this->caches[$method][$type] = $cache; + return $this->caches[$method][$type]; + } + + /** + * Registers a decorator to add to all new cache objects + * @param HTMLPurifier_DefinitionCache_Decorator|string $decorator An instance or the name of a decorator + */ + public function addDecorator($decorator) + { + if (is_string($decorator)) { + $class = "HTMLPurifier_DefinitionCache_Decorator_$decorator"; + $decorator = new $class; + } + $this->decorators[$decorator->name] = $decorator; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Doctype.php b/thirdparty/HTMLPurifier/HTMLPurifier/Doctype.php similarity index 95% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Doctype.php rename to thirdparty/HTMLPurifier/HTMLPurifier/Doctype.php index 4d723129e..4acd06e5b 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Doctype.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/Doctype.php @@ -1,73 +1,73 @@ -renderDoctype. - * If structure changes, please update that function. - */ -class HTMLPurifier_Doctype -{ - /** - * Full name of doctype - * @type string - */ - public $name; - - /** - * List of standard modules (string identifiers or literal objects) - * that this doctype uses - * @type array - */ - public $modules = array(); - - /** - * List of modules to use for tidying up code - * @type array - */ - public $tidyModules = array(); - - /** - * Is the language derived from XML (i.e. XHTML)? - * @type bool - */ - public $xml = true; - - /** - * List of aliases for this doctype - * @type array - */ - public $aliases = array(); - - /** - * Public DTD identifier - * @type string - */ - public $dtdPublic; - - /** - * System DTD identifier - * @type string - */ - public $dtdSystem; - - public function __construct( - $name = null, - $xml = true, - $modules = array(), - $tidyModules = array(), - $aliases = array(), - $dtd_public = null, - $dtd_system = null - ) { - $this->name = $name; - $this->xml = $xml; - $this->modules = $modules; - $this->tidyModules = $tidyModules; - $this->aliases = $aliases; - $this->dtdPublic = $dtd_public; - $this->dtdSystem = $dtd_system; - } -} - -// vim: et sw=4 sts=4 +renderDoctype. + * If structure changes, please update that function. + */ +class HTMLPurifier_Doctype +{ + /** + * Full name of doctype + * @type string + */ + public $name; + + /** + * List of standard modules (string identifiers or literal objects) + * that this doctype uses + * @type array + */ + public $modules = array(); + + /** + * List of modules to use for tidying up code + * @type array + */ + public $tidyModules = array(); + + /** + * Is the language derived from XML (i.e. XHTML)? + * @type bool + */ + public $xml = true; + + /** + * List of aliases for this doctype + * @type array + */ + public $aliases = array(); + + /** + * Public DTD identifier + * @type string + */ + public $dtdPublic; + + /** + * System DTD identifier + * @type string + */ + public $dtdSystem; + + public function __construct( + $name = null, + $xml = true, + $modules = array(), + $tidyModules = array(), + $aliases = array(), + $dtd_public = null, + $dtd_system = null + ) { + $this->name = $name; + $this->xml = $xml; + $this->modules = $modules; + $this->tidyModules = $tidyModules; + $this->aliases = $aliases; + $this->dtdPublic = $dtd_public; + $this->dtdSystem = $dtd_system; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/DoctypeRegistry.php b/thirdparty/HTMLPurifier/HTMLPurifier/DoctypeRegistry.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/DoctypeRegistry.php rename to thirdparty/HTMLPurifier/HTMLPurifier/DoctypeRegistry.php index cab9dc536..acc1d64a6 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/DoctypeRegistry.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/DoctypeRegistry.php @@ -1,142 +1,142 @@ -doctypes[$doctype->name] = $doctype; - $name = $doctype->name; - // hookup aliases - foreach ($doctype->aliases as $alias) { - if (isset($this->doctypes[$alias])) { - continue; - } - $this->aliases[$alias] = $name; - } - // remove old aliases - if (isset($this->aliases[$name])) { - unset($this->aliases[$name]); - } - return $doctype; - } - - /** - * Retrieves reference to a doctype of a certain name - * @note This function resolves aliases - * @note When possible, use the more fully-featured make() - * @param string $doctype Name of doctype - * @return HTMLPurifier_Doctype Editable doctype object - */ - public function get($doctype) - { - if (isset($this->aliases[$doctype])) { - $doctype = $this->aliases[$doctype]; - } - if (!isset($this->doctypes[$doctype])) { - trigger_error('Doctype ' . htmlspecialchars($doctype) . ' does not exist', E_USER_ERROR); - $anon = new HTMLPurifier_Doctype($doctype); - return $anon; - } - return $this->doctypes[$doctype]; - } - - /** - * Creates a doctype based on a configuration object, - * will perform initialization on the doctype - * @note Use this function to get a copy of doctype that config - * can hold on to (this is necessary in order to tell - * Generator whether or not the current document is XML - * based or not). - * @param HTMLPurifier_Config $config - * @return HTMLPurifier_Doctype - */ - public function make($config) - { - return clone $this->get($this->getDoctypeFromConfig($config)); - } - - /** - * Retrieves the doctype from the configuration object - * @param HTMLPurifier_Config $config - * @return string - */ - public function getDoctypeFromConfig($config) - { - // recommended test - $doctype = $config->get('HTML.Doctype'); - if (!empty($doctype)) { - return $doctype; - } - $doctype = $config->get('HTML.CustomDoctype'); - if (!empty($doctype)) { - return $doctype; - } - // backwards-compatibility - if ($config->get('HTML.XHTML')) { - $doctype = 'XHTML 1.0'; - } else { - $doctype = 'HTML 4.01'; - } - if ($config->get('HTML.Strict')) { - $doctype .= ' Strict'; - } else { - $doctype .= ' Transitional'; - } - return $doctype; - } -} - -// vim: et sw=4 sts=4 +doctypes[$doctype->name] = $doctype; + $name = $doctype->name; + // hookup aliases + foreach ($doctype->aliases as $alias) { + if (isset($this->doctypes[$alias])) { + continue; + } + $this->aliases[$alias] = $name; + } + // remove old aliases + if (isset($this->aliases[$name])) { + unset($this->aliases[$name]); + } + return $doctype; + } + + /** + * Retrieves reference to a doctype of a certain name + * @note This function resolves aliases + * @note When possible, use the more fully-featured make() + * @param string $doctype Name of doctype + * @return HTMLPurifier_Doctype Editable doctype object + */ + public function get($doctype) + { + if (isset($this->aliases[$doctype])) { + $doctype = $this->aliases[$doctype]; + } + if (!isset($this->doctypes[$doctype])) { + trigger_error('Doctype ' . htmlspecialchars($doctype) . ' does not exist', E_USER_ERROR); + $anon = new HTMLPurifier_Doctype($doctype); + return $anon; + } + return $this->doctypes[$doctype]; + } + + /** + * Creates a doctype based on a configuration object, + * will perform initialization on the doctype + * @note Use this function to get a copy of doctype that config + * can hold on to (this is necessary in order to tell + * Generator whether or not the current document is XML + * based or not). + * @param HTMLPurifier_Config $config + * @return HTMLPurifier_Doctype + */ + public function make($config) + { + return clone $this->get($this->getDoctypeFromConfig($config)); + } + + /** + * Retrieves the doctype from the configuration object + * @param HTMLPurifier_Config $config + * @return string + */ + public function getDoctypeFromConfig($config) + { + // recommended test + $doctype = $config->get('HTML.Doctype'); + if (!empty($doctype)) { + return $doctype; + } + $doctype = $config->get('HTML.CustomDoctype'); + if (!empty($doctype)) { + return $doctype; + } + // backwards-compatibility + if ($config->get('HTML.XHTML')) { + $doctype = 'XHTML 1.0'; + } else { + $doctype = 'HTML 4.01'; + } + if ($config->get('HTML.Strict')) { + $doctype .= ' Strict'; + } else { + $doctype .= ' Transitional'; + } + return $doctype; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ElementDef.php b/thirdparty/HTMLPurifier/HTMLPurifier/ElementDef.php similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ElementDef.php rename to thirdparty/HTMLPurifier/HTMLPurifier/ElementDef.php index 089f7efe8..d5311cedc 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ElementDef.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ElementDef.php @@ -1,216 +1,216 @@ -setup(), this array may also - * contain an array at index 0 that indicates which attribute - * collections to load into the full array. It may also - * contain string indentifiers in lieu of HTMLPurifier_AttrDef, - * see HTMLPurifier_AttrTypes on how they are expanded during - * HTMLPurifier_HTMLDefinition->setup() processing. - */ - public $attr = array(); - - // XXX: Design note: currently, it's not possible to override - // previously defined AttrTransforms without messing around with - // the final generated config. This is by design; a previous version - // used an associated list of attr_transform, but it was extremely - // easy to accidentally override other attribute transforms by - // forgetting to specify an index (and just using 0.) While we - // could check this by checking the index number and complaining, - // there is a second problem which is that it is not at all easy to - // tell when something is getting overridden. Combine this with a - // codebase where this isn't really being used, and it's perfect for - // nuking. - - /** - * List of tags HTMLPurifier_AttrTransform to be done before validation. - * @type array - */ - public $attr_transform_pre = array(); - - /** - * List of tags HTMLPurifier_AttrTransform to be done after validation. - * @type array - */ - public $attr_transform_post = array(); - - /** - * HTMLPurifier_ChildDef of this tag. - * @type HTMLPurifier_ChildDef - */ - public $child; - - /** - * Abstract string representation of internal ChildDef rules. - * @see HTMLPurifier_ContentSets for how this is parsed and then transformed - * into an HTMLPurifier_ChildDef. - * @warning This is a temporary variable that is not available after - * being processed by HTMLDefinition - * @type string - */ - public $content_model; - - /** - * Value of $child->type, used to determine which ChildDef to use, - * used in combination with $content_model. - * @warning This must be lowercase - * @warning This is a temporary variable that is not available after - * being processed by HTMLDefinition - * @type string - */ - public $content_model_type; - - /** - * Does the element have a content model (#PCDATA | Inline)*? This - * is important for chameleon ins and del processing in - * HTMLPurifier_ChildDef_Chameleon. Dynamically set: modules don't - * have to worry about this one. - * @type bool - */ - public $descendants_are_inline = false; - - /** - * List of the names of required attributes this element has. - * Dynamically populated by HTMLPurifier_HTMLDefinition::getElement() - * @type array - */ - public $required_attr = array(); - - /** - * Lookup table of tags excluded from all descendants of this tag. - * @type array - * @note SGML permits exclusions for all descendants, but this is - * not possible with DTDs or XML Schemas. W3C has elected to - * use complicated compositions of content_models to simulate - * exclusion for children, but we go the simpler, SGML-style - * route of flat-out exclusions, which correctly apply to - * all descendants and not just children. Note that the XHTML - * Modularization Abstract Modules are blithely unaware of such - * distinctions. - */ - public $excludes = array(); - - /** - * This tag is explicitly auto-closed by the following tags. - * @type array - */ - public $autoclose = array(); - - /** - * If a foreign element is found in this element, test if it is - * allowed by this sub-element; if it is, instead of closing the - * current element, place it inside this element. - * @type string - */ - public $wrap; - - /** - * Whether or not this is a formatting element affected by the - * "Active Formatting Elements" algorithm. - * @type bool - */ - public $formatting; - - /** - * Low-level factory constructor for creating new standalone element defs - */ - public static function create($content_model, $content_model_type, $attr) - { - $def = new HTMLPurifier_ElementDef(); - $def->content_model = $content_model; - $def->content_model_type = $content_model_type; - $def->attr = $attr; - return $def; - } - - /** - * Merges the values of another element definition into this one. - * Values from the new element def take precedence if a value is - * not mergeable. - * @param HTMLPurifier_ElementDef $def - */ - public function mergeIn($def) - { - // later keys takes precedence - foreach ($def->attr as $k => $v) { - if ($k === 0) { - // merge in the includes - // sorry, no way to override an include - foreach ($v as $v2) { - $this->attr[0][] = $v2; - } - continue; - } - if ($v === false) { - if (isset($this->attr[$k])) { - unset($this->attr[$k]); - } - continue; - } - $this->attr[$k] = $v; - } - $this->_mergeAssocArray($this->excludes, $def->excludes); - $this->attr_transform_pre = array_merge($this->attr_transform_pre, $def->attr_transform_pre); - $this->attr_transform_post = array_merge($this->attr_transform_post, $def->attr_transform_post); - - if (!empty($def->content_model)) { - $this->content_model = - str_replace("#SUPER", $this->content_model, $def->content_model); - $this->child = false; - } - if (!empty($def->content_model_type)) { - $this->content_model_type = $def->content_model_type; - $this->child = false; - } - if (!is_null($def->child)) { - $this->child = $def->child; - } - if (!is_null($def->formatting)) { - $this->formatting = $def->formatting; - } - if ($def->descendants_are_inline) { - $this->descendants_are_inline = $def->descendants_are_inline; - } - } - - /** - * Merges one array into another, removes values which equal false - * @param $a1 Array by reference that is merged into - * @param $a2 Array that merges into $a1 - */ - private function _mergeAssocArray(&$a1, $a2) - { - foreach ($a2 as $k => $v) { - if ($v === false) { - if (isset($a1[$k])) { - unset($a1[$k]); - } - continue; - } - $a1[$k] = $v; - } - } -} - -// vim: et sw=4 sts=4 +setup(), this array may also + * contain an array at index 0 that indicates which attribute + * collections to load into the full array. It may also + * contain string indentifiers in lieu of HTMLPurifier_AttrDef, + * see HTMLPurifier_AttrTypes on how they are expanded during + * HTMLPurifier_HTMLDefinition->setup() processing. + */ + public $attr = array(); + + // XXX: Design note: currently, it's not possible to override + // previously defined AttrTransforms without messing around with + // the final generated config. This is by design; a previous version + // used an associated list of attr_transform, but it was extremely + // easy to accidentally override other attribute transforms by + // forgetting to specify an index (and just using 0.) While we + // could check this by checking the index number and complaining, + // there is a second problem which is that it is not at all easy to + // tell when something is getting overridden. Combine this with a + // codebase where this isn't really being used, and it's perfect for + // nuking. + + /** + * List of tags HTMLPurifier_AttrTransform to be done before validation. + * @type array + */ + public $attr_transform_pre = array(); + + /** + * List of tags HTMLPurifier_AttrTransform to be done after validation. + * @type array + */ + public $attr_transform_post = array(); + + /** + * HTMLPurifier_ChildDef of this tag. + * @type HTMLPurifier_ChildDef + */ + public $child; + + /** + * Abstract string representation of internal ChildDef rules. + * @see HTMLPurifier_ContentSets for how this is parsed and then transformed + * into an HTMLPurifier_ChildDef. + * @warning This is a temporary variable that is not available after + * being processed by HTMLDefinition + * @type string + */ + public $content_model; + + /** + * Value of $child->type, used to determine which ChildDef to use, + * used in combination with $content_model. + * @warning This must be lowercase + * @warning This is a temporary variable that is not available after + * being processed by HTMLDefinition + * @type string + */ + public $content_model_type; + + /** + * Does the element have a content model (#PCDATA | Inline)*? This + * is important for chameleon ins and del processing in + * HTMLPurifier_ChildDef_Chameleon. Dynamically set: modules don't + * have to worry about this one. + * @type bool + */ + public $descendants_are_inline = false; + + /** + * List of the names of required attributes this element has. + * Dynamically populated by HTMLPurifier_HTMLDefinition::getElement() + * @type array + */ + public $required_attr = array(); + + /** + * Lookup table of tags excluded from all descendants of this tag. + * @type array + * @note SGML permits exclusions for all descendants, but this is + * not possible with DTDs or XML Schemas. W3C has elected to + * use complicated compositions of content_models to simulate + * exclusion for children, but we go the simpler, SGML-style + * route of flat-out exclusions, which correctly apply to + * all descendants and not just children. Note that the XHTML + * Modularization Abstract Modules are blithely unaware of such + * distinctions. + */ + public $excludes = array(); + + /** + * This tag is explicitly auto-closed by the following tags. + * @type array + */ + public $autoclose = array(); + + /** + * If a foreign element is found in this element, test if it is + * allowed by this sub-element; if it is, instead of closing the + * current element, place it inside this element. + * @type string + */ + public $wrap; + + /** + * Whether or not this is a formatting element affected by the + * "Active Formatting Elements" algorithm. + * @type bool + */ + public $formatting; + + /** + * Low-level factory constructor for creating new standalone element defs + */ + public static function create($content_model, $content_model_type, $attr) + { + $def = new HTMLPurifier_ElementDef(); + $def->content_model = $content_model; + $def->content_model_type = $content_model_type; + $def->attr = $attr; + return $def; + } + + /** + * Merges the values of another element definition into this one. + * Values from the new element def take precedence if a value is + * not mergeable. + * @param HTMLPurifier_ElementDef $def + */ + public function mergeIn($def) + { + // later keys takes precedence + foreach ($def->attr as $k => $v) { + if ($k === 0) { + // merge in the includes + // sorry, no way to override an include + foreach ($v as $v2) { + $this->attr[0][] = $v2; + } + continue; + } + if ($v === false) { + if (isset($this->attr[$k])) { + unset($this->attr[$k]); + } + continue; + } + $this->attr[$k] = $v; + } + $this->_mergeAssocArray($this->excludes, $def->excludes); + $this->attr_transform_pre = array_merge($this->attr_transform_pre, $def->attr_transform_pre); + $this->attr_transform_post = array_merge($this->attr_transform_post, $def->attr_transform_post); + + if (!empty($def->content_model)) { + $this->content_model = + str_replace("#SUPER", $this->content_model, $def->content_model); + $this->child = false; + } + if (!empty($def->content_model_type)) { + $this->content_model_type = $def->content_model_type; + $this->child = false; + } + if (!is_null($def->child)) { + $this->child = $def->child; + } + if (!is_null($def->formatting)) { + $this->formatting = $def->formatting; + } + if ($def->descendants_are_inline) { + $this->descendants_are_inline = $def->descendants_are_inline; + } + } + + /** + * Merges one array into another, removes values which equal false + * @param $a1 Array by reference that is merged into + * @param $a2 Array that merges into $a1 + */ + private function _mergeAssocArray(&$a1, $a2) + { + foreach ($a2 as $k => $v) { + if ($v === false) { + if (isset($a1[$k])) { + unset($a1[$k]); + } + continue; + } + $a1[$k] = $v; + } + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Encoder.php b/thirdparty/HTMLPurifier/HTMLPurifier/Encoder.php similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Encoder.php rename to thirdparty/HTMLPurifier/HTMLPurifier/Encoder.php index 3aa00ca51..fef9b5890 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Encoder.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/Encoder.php @@ -1,611 +1,611 @@ -= $c) { - $r .= self::unsafeIconv($in, $out, substr($text, $i)); - break; - } - // wibble the boundary - if (0x80 != (0xC0 & ord($text[$i + $max_chunk_size]))) { - $chunk_size = $max_chunk_size; - } elseif (0x80 != (0xC0 & ord($text[$i + $max_chunk_size - 1]))) { - $chunk_size = $max_chunk_size - 1; - } elseif (0x80 != (0xC0 & ord($text[$i + $max_chunk_size - 2]))) { - $chunk_size = $max_chunk_size - 2; - } elseif (0x80 != (0xC0 & ord($text[$i + $max_chunk_size - 3]))) { - $chunk_size = $max_chunk_size - 3; - } else { - return false; // rather confusing UTF-8... - } - $chunk = substr($text, $i, $chunk_size); // substr doesn't mind overlong lengths - $r .= self::unsafeIconv($in, $out, $chunk); - $i += $chunk_size; - } - return $r; - } else { - return false; - } - } else { - return false; - } - } - - /** - * Cleans a UTF-8 string for well-formedness and SGML validity - * - * It will parse according to UTF-8 and return a valid UTF8 string, with - * non-SGML codepoints excluded. - * - * @param string $str The string to clean - * @param bool $force_php - * @return string - * - * @note Just for reference, the non-SGML code points are 0 to 31 and - * 127 to 159, inclusive. However, we allow code points 9, 10 - * and 13, which are the tab, line feed and carriage return - * respectively. 128 and above the code points map to multibyte - * UTF-8 representations. - * - * @note Fallback code adapted from utf8ToUnicode by Henri Sivonen and - * hsivonen@iki.fi at under the - * LGPL license. Notes on what changed are inside, but in general, - * the original code transformed UTF-8 text into an array of integer - * Unicode codepoints. Understandably, transforming that back to - * a string would be somewhat expensive, so the function was modded to - * directly operate on the string. However, this discourages code - * reuse, and the logic enumerated here would be useful for any - * function that needs to be able to understand UTF-8 characters. - * As of right now, only smart lossless character encoding converters - * would need that, and I'm probably not going to implement them. - * Once again, PHP 6 should solve all our problems. - */ - public static function cleanUTF8($str, $force_php = false) - { - // UTF-8 validity is checked since PHP 4.3.5 - // This is an optimization: if the string is already valid UTF-8, no - // need to do PHP stuff. 99% of the time, this will be the case. - // The regexp matches the XML char production, as well as well as excluding - // non-SGML codepoints U+007F to U+009F - if (preg_match( - '/^[\x{9}\x{A}\x{D}\x{20}-\x{7E}\x{A0}-\x{D7FF}\x{E000}-\x{FFFD}\x{10000}-\x{10FFFF}]*$/Du', - $str - )) { - return $str; - } - - $mState = 0; // cached expected number of octets after the current octet - // until the beginning of the next UTF8 character sequence - $mUcs4 = 0; // cached Unicode character - $mBytes = 1; // cached expected number of octets in the current sequence - - // original code involved an $out that was an array of Unicode - // codepoints. Instead of having to convert back into UTF-8, we've - // decided to directly append valid UTF-8 characters onto a string - // $out once they're done. $char accumulates raw bytes, while $mUcs4 - // turns into the Unicode code point, so there's some redundancy. - - $out = ''; - $char = ''; - - $len = strlen($str); - for ($i = 0; $i < $len; $i++) { - $in = ord($str{$i}); - $char .= $str[$i]; // append byte to char - if (0 == $mState) { - // When mState is zero we expect either a US-ASCII character - // or a multi-octet sequence. - if (0 == (0x80 & ($in))) { - // US-ASCII, pass straight through. - if (($in <= 31 || $in == 127) && - !($in == 9 || $in == 13 || $in == 10) // save \r\t\n - ) { - // control characters, remove - } else { - $out .= $char; - } - // reset - $char = ''; - $mBytes = 1; - } elseif (0xC0 == (0xE0 & ($in))) { - // First octet of 2 octet sequence - $mUcs4 = ($in); - $mUcs4 = ($mUcs4 & 0x1F) << 6; - $mState = 1; - $mBytes = 2; - } elseif (0xE0 == (0xF0 & ($in))) { - // First octet of 3 octet sequence - $mUcs4 = ($in); - $mUcs4 = ($mUcs4 & 0x0F) << 12; - $mState = 2; - $mBytes = 3; - } elseif (0xF0 == (0xF8 & ($in))) { - // First octet of 4 octet sequence - $mUcs4 = ($in); - $mUcs4 = ($mUcs4 & 0x07) << 18; - $mState = 3; - $mBytes = 4; - } elseif (0xF8 == (0xFC & ($in))) { - // First octet of 5 octet sequence. - // - // This is illegal because the encoded codepoint must be - // either: - // (a) not the shortest form or - // (b) outside the Unicode range of 0-0x10FFFF. - // Rather than trying to resynchronize, we will carry on - // until the end of the sequence and let the later error - // handling code catch it. - $mUcs4 = ($in); - $mUcs4 = ($mUcs4 & 0x03) << 24; - $mState = 4; - $mBytes = 5; - } elseif (0xFC == (0xFE & ($in))) { - // First octet of 6 octet sequence, see comments for 5 - // octet sequence. - $mUcs4 = ($in); - $mUcs4 = ($mUcs4 & 1) << 30; - $mState = 5; - $mBytes = 6; - } else { - // Current octet is neither in the US-ASCII range nor a - // legal first octet of a multi-octet sequence. - $mState = 0; - $mUcs4 = 0; - $mBytes = 1; - $char = ''; - } - } else { - // When mState is non-zero, we expect a continuation of the - // multi-octet sequence - if (0x80 == (0xC0 & ($in))) { - // Legal continuation. - $shift = ($mState - 1) * 6; - $tmp = $in; - $tmp = ($tmp & 0x0000003F) << $shift; - $mUcs4 |= $tmp; - - if (0 == --$mState) { - // End of the multi-octet sequence. mUcs4 now contains - // the final Unicode codepoint to be output - - // Check for illegal sequences and codepoints. - - // From Unicode 3.1, non-shortest form is illegal - if (((2 == $mBytes) && ($mUcs4 < 0x0080)) || - ((3 == $mBytes) && ($mUcs4 < 0x0800)) || - ((4 == $mBytes) && ($mUcs4 < 0x10000)) || - (4 < $mBytes) || - // From Unicode 3.2, surrogate characters = illegal - (($mUcs4 & 0xFFFFF800) == 0xD800) || - // Codepoints outside the Unicode range are illegal - ($mUcs4 > 0x10FFFF) - ) { - - } elseif (0xFEFF != $mUcs4 && // omit BOM - // check for valid Char unicode codepoints - ( - 0x9 == $mUcs4 || - 0xA == $mUcs4 || - 0xD == $mUcs4 || - (0x20 <= $mUcs4 && 0x7E >= $mUcs4) || - // 7F-9F is not strictly prohibited by XML, - // but it is non-SGML, and thus we don't allow it - (0xA0 <= $mUcs4 && 0xD7FF >= $mUcs4) || - (0x10000 <= $mUcs4 && 0x10FFFF >= $mUcs4) - ) - ) { - $out .= $char; - } - // initialize UTF8 cache (reset) - $mState = 0; - $mUcs4 = 0; - $mBytes = 1; - $char = ''; - } - } else { - // ((0xC0 & (*in) != 0x80) && (mState != 0)) - // Incomplete multi-octet sequence. - // used to result in complete fail, but we'll reset - $mState = 0; - $mUcs4 = 0; - $mBytes = 1; - $char =''; - } - } - } - return $out; - } - - /** - * Translates a Unicode codepoint into its corresponding UTF-8 character. - * @note Based on Feyd's function at - * , - * which is in public domain. - * @note While we're going to do code point parsing anyway, a good - * optimization would be to refuse to translate code points that - * are non-SGML characters. However, this could lead to duplication. - * @note This is very similar to the unichr function in - * maintenance/generate-entity-file.php (although this is superior, - * due to its sanity checks). - */ - - // +----------+----------+----------+----------+ - // | 33222222 | 22221111 | 111111 | | - // | 10987654 | 32109876 | 54321098 | 76543210 | bit - // +----------+----------+----------+----------+ - // | | | | 0xxxxxxx | 1 byte 0x00000000..0x0000007F - // | | | 110yyyyy | 10xxxxxx | 2 byte 0x00000080..0x000007FF - // | | 1110zzzz | 10yyyyyy | 10xxxxxx | 3 byte 0x00000800..0x0000FFFF - // | 11110www | 10wwzzzz | 10yyyyyy | 10xxxxxx | 4 byte 0x00010000..0x0010FFFF - // +----------+----------+----------+----------+ - // | 00000000 | 00011111 | 11111111 | 11111111 | Theoretical upper limit of legal scalars: 2097151 (0x001FFFFF) - // | 00000000 | 00010000 | 11111111 | 11111111 | Defined upper limit of legal scalar codes - // +----------+----------+----------+----------+ - - public static function unichr($code) - { - if ($code > 1114111 or $code < 0 or - ($code >= 55296 and $code <= 57343) ) { - // bits are set outside the "valid" range as defined - // by UNICODE 4.1.0 - return ''; - } - - $x = $y = $z = $w = 0; - if ($code < 128) { - // regular ASCII character - $x = $code; - } else { - // set up bits for UTF-8 - $x = ($code & 63) | 128; - if ($code < 2048) { - $y = (($code & 2047) >> 6) | 192; - } else { - $y = (($code & 4032) >> 6) | 128; - if ($code < 65536) { - $z = (($code >> 12) & 15) | 224; - } else { - $z = (($code >> 12) & 63) | 128; - $w = (($code >> 18) & 7) | 240; - } - } - } - // set up the actual character - $ret = ''; - if ($w) { - $ret .= chr($w); - } - if ($z) { - $ret .= chr($z); - } - if ($y) { - $ret .= chr($y); - } - $ret .= chr($x); - - return $ret; - } - - /** - * @return bool - */ - public static function iconvAvailable() - { - static $iconv = null; - if ($iconv === null) { - $iconv = function_exists('iconv') && self::testIconvTruncateBug() != self::ICONV_UNUSABLE; - } - return $iconv; - } - - /** - * Convert a string to UTF-8 based on configuration. - * @param string $str The string to convert - * @param HTMLPurifier_Config $config - * @param HTMLPurifier_Context $context - * @return string - */ - public static function convertToUTF8($str, $config, $context) - { - $encoding = $config->get('Core.Encoding'); - if ($encoding === 'utf-8') { - return $str; - } - static $iconv = null; - if ($iconv === null) { - $iconv = self::iconvAvailable(); - } - if ($iconv && !$config->get('Test.ForceNoIconv')) { - // unaffected by bugs, since UTF-8 support all characters - $str = self::unsafeIconv($encoding, 'utf-8//IGNORE', $str); - if ($str === false) { - // $encoding is not a valid encoding - trigger_error('Invalid encoding ' . $encoding, E_USER_ERROR); - return ''; - } - // If the string is bjorked by Shift_JIS or a similar encoding - // that doesn't support all of ASCII, convert the naughty - // characters to their true byte-wise ASCII/UTF-8 equivalents. - $str = strtr($str, self::testEncodingSupportsASCII($encoding)); - return $str; - } elseif ($encoding === 'iso-8859-1') { - $str = utf8_encode($str); - return $str; - } - $bug = HTMLPurifier_Encoder::testIconvTruncateBug(); - if ($bug == self::ICONV_OK) { - trigger_error('Encoding not supported, please install iconv', E_USER_ERROR); - } else { - trigger_error( - 'You have a buggy version of iconv, see https://bugs.php.net/bug.php?id=48147 ' . - 'and http://sourceware.org/bugzilla/show_bug.cgi?id=13541', - E_USER_ERROR - ); - } - } - - /** - * Converts a string from UTF-8 based on configuration. - * @param string $str The string to convert - * @param HTMLPurifier_Config $config - * @param HTMLPurifier_Context $context - * @return string - * @note Currently, this is a lossy conversion, with unexpressable - * characters being omitted. - */ - public static function convertFromUTF8($str, $config, $context) - { - $encoding = $config->get('Core.Encoding'); - if ($escape = $config->get('Core.EscapeNonASCIICharacters')) { - $str = self::convertToASCIIDumbLossless($str); - } - if ($encoding === 'utf-8') { - return $str; - } - static $iconv = null; - if ($iconv === null) { - $iconv = self::iconvAvailable(); - } - if ($iconv && !$config->get('Test.ForceNoIconv')) { - // Undo our previous fix in convertToUTF8, otherwise iconv will barf - $ascii_fix = self::testEncodingSupportsASCII($encoding); - if (!$escape && !empty($ascii_fix)) { - $clear_fix = array(); - foreach ($ascii_fix as $utf8 => $native) { - $clear_fix[$utf8] = ''; - } - $str = strtr($str, $clear_fix); - } - $str = strtr($str, array_flip($ascii_fix)); - // Normal stuff - $str = self::iconv('utf-8', $encoding . '//IGNORE', $str); - return $str; - } elseif ($encoding === 'iso-8859-1') { - $str = utf8_decode($str); - return $str; - } - trigger_error('Encoding not supported', E_USER_ERROR); - // You might be tempted to assume that the ASCII representation - // might be OK, however, this is *not* universally true over all - // encodings. So we take the conservative route here, rather - // than forcibly turn on %Core.EscapeNonASCIICharacters - } - - /** - * Lossless (character-wise) conversion of HTML to ASCII - * @param string $str UTF-8 string to be converted to ASCII - * @return string ASCII encoded string with non-ASCII character entity-ized - * @warning Adapted from MediaWiki, claiming fair use: this is a common - * algorithm. If you disagree with this license fudgery, - * implement it yourself. - * @note Uses decimal numeric entities since they are best supported. - * @note This is a DUMB function: it has no concept of keeping - * character entities that the projected character encoding - * can allow. We could possibly implement a smart version - * but that would require it to also know which Unicode - * codepoints the charset supported (not an easy task). - * @note Sort of with cleanUTF8() but it assumes that $str is - * well-formed UTF-8 - */ - public static function convertToASCIIDumbLossless($str) - { - $bytesleft = 0; - $result = ''; - $working = 0; - $len = strlen($str); - for ($i = 0; $i < $len; $i++) { - $bytevalue = ord($str[$i]); - if ($bytevalue <= 0x7F) { //0xxx xxxx - $result .= chr($bytevalue); - $bytesleft = 0; - } elseif ($bytevalue <= 0xBF) { //10xx xxxx - $working = $working << 6; - $working += ($bytevalue & 0x3F); - $bytesleft--; - if ($bytesleft <= 0) { - $result .= "&#" . $working . ";"; - } - } elseif ($bytevalue <= 0xDF) { //110x xxxx - $working = $bytevalue & 0x1F; - $bytesleft = 1; - } elseif ($bytevalue <= 0xEF) { //1110 xxxx - $working = $bytevalue & 0x0F; - $bytesleft = 2; - } else { //1111 0xxx - $working = $bytevalue & 0x07; - $bytesleft = 3; - } - } - return $result; - } - - /** No bugs detected in iconv. */ - const ICONV_OK = 0; - - /** Iconv truncates output if converting from UTF-8 to another - * character set with //IGNORE, and a non-encodable character is found */ - const ICONV_TRUNCATES = 1; - - /** Iconv does not support //IGNORE, making it unusable for - * transcoding purposes */ - const ICONV_UNUSABLE = 2; - - /** - * glibc iconv has a known bug where it doesn't handle the magic - * //IGNORE stanza correctly. In particular, rather than ignore - * characters, it will return an EILSEQ after consuming some number - * of characters, and expect you to restart iconv as if it were - * an E2BIG. Old versions of PHP did not respect the errno, and - * returned the fragment, so as a result you would see iconv - * mysteriously truncating output. We can work around this by - * manually chopping our input into segments of about 8000 - * characters, as long as PHP ignores the error code. If PHP starts - * paying attention to the error code, iconv becomes unusable. - * - * @return int Error code indicating severity of bug. - */ - public static function testIconvTruncateBug() - { - static $code = null; - if ($code === null) { - // better not use iconv, otherwise infinite loop! - $r = self::unsafeIconv('utf-8', 'ascii//IGNORE', "\xCE\xB1" . str_repeat('a', 9000)); - if ($r === false) { - $code = self::ICONV_UNUSABLE; - } elseif (($c = strlen($r)) < 9000) { - $code = self::ICONV_TRUNCATES; - } elseif ($c > 9000) { - trigger_error( - 'Your copy of iconv is extremely buggy. Please notify HTML Purifier maintainers: ' . - 'include your iconv version as per phpversion()', - E_USER_ERROR - ); - } else { - $code = self::ICONV_OK; - } - } - return $code; - } - - /** - * This expensive function tests whether or not a given character - * encoding supports ASCII. 7/8-bit encodings like Shift_JIS will - * fail this test, and require special processing. Variable width - * encodings shouldn't ever fail. - * - * @param string $encoding Encoding name to test, as per iconv format - * @param bool $bypass Whether or not to bypass the precompiled arrays. - * @return Array of UTF-8 characters to their corresponding ASCII, - * which can be used to "undo" any overzealous iconv action. - */ - public static function testEncodingSupportsASCII($encoding, $bypass = false) - { - // All calls to iconv here are unsafe, proof by case analysis: - // If ICONV_OK, no difference. - // If ICONV_TRUNCATE, all calls involve one character inputs, - // so bug is not triggered. - // If ICONV_UNUSABLE, this call is irrelevant - static $encodings = array(); - if (!$bypass) { - if (isset($encodings[$encoding])) { - return $encodings[$encoding]; - } - $lenc = strtolower($encoding); - switch ($lenc) { - case 'shift_jis': - return array("\xC2\xA5" => '\\', "\xE2\x80\xBE" => '~'); - case 'johab': - return array("\xE2\x82\xA9" => '\\'); - } - if (strpos($lenc, 'iso-8859-') === 0) { - return array(); - } - } - $ret = array(); - if (self::unsafeIconv('UTF-8', $encoding, 'a') === false) { - return false; - } - for ($i = 0x20; $i <= 0x7E; $i++) { // all printable ASCII chars - $c = chr($i); // UTF-8 char - $r = self::unsafeIconv('UTF-8', "$encoding//IGNORE", $c); // initial conversion - if ($r === '' || - // This line is needed for iconv implementations that do not - // omit characters that do not exist in the target character set - ($r === $c && self::unsafeIconv($encoding, 'UTF-8//IGNORE', $r) !== $c) - ) { - // Reverse engineer: what's the UTF-8 equiv of this byte - // sequence? This assumes that there's no variable width - // encoding that doesn't support ASCII. - $ret[self::unsafeIconv($encoding, 'UTF-8//IGNORE', $c)] = $c; - } - } - $encodings[$encoding] = $ret; - return $ret; - } -} - -// vim: et sw=4 sts=4 += $c) { + $r .= self::unsafeIconv($in, $out, substr($text, $i)); + break; + } + // wibble the boundary + if (0x80 != (0xC0 & ord($text[$i + $max_chunk_size]))) { + $chunk_size = $max_chunk_size; + } elseif (0x80 != (0xC0 & ord($text[$i + $max_chunk_size - 1]))) { + $chunk_size = $max_chunk_size - 1; + } elseif (0x80 != (0xC0 & ord($text[$i + $max_chunk_size - 2]))) { + $chunk_size = $max_chunk_size - 2; + } elseif (0x80 != (0xC0 & ord($text[$i + $max_chunk_size - 3]))) { + $chunk_size = $max_chunk_size - 3; + } else { + return false; // rather confusing UTF-8... + } + $chunk = substr($text, $i, $chunk_size); // substr doesn't mind overlong lengths + $r .= self::unsafeIconv($in, $out, $chunk); + $i += $chunk_size; + } + return $r; + } else { + return false; + } + } else { + return false; + } + } + + /** + * Cleans a UTF-8 string for well-formedness and SGML validity + * + * It will parse according to UTF-8 and return a valid UTF8 string, with + * non-SGML codepoints excluded. + * + * @param string $str The string to clean + * @param bool $force_php + * @return string + * + * @note Just for reference, the non-SGML code points are 0 to 31 and + * 127 to 159, inclusive. However, we allow code points 9, 10 + * and 13, which are the tab, line feed and carriage return + * respectively. 128 and above the code points map to multibyte + * UTF-8 representations. + * + * @note Fallback code adapted from utf8ToUnicode by Henri Sivonen and + * hsivonen@iki.fi at under the + * LGPL license. Notes on what changed are inside, but in general, + * the original code transformed UTF-8 text into an array of integer + * Unicode codepoints. Understandably, transforming that back to + * a string would be somewhat expensive, so the function was modded to + * directly operate on the string. However, this discourages code + * reuse, and the logic enumerated here would be useful for any + * function that needs to be able to understand UTF-8 characters. + * As of right now, only smart lossless character encoding converters + * would need that, and I'm probably not going to implement them. + * Once again, PHP 6 should solve all our problems. + */ + public static function cleanUTF8($str, $force_php = false) + { + // UTF-8 validity is checked since PHP 4.3.5 + // This is an optimization: if the string is already valid UTF-8, no + // need to do PHP stuff. 99% of the time, this will be the case. + // The regexp matches the XML char production, as well as well as excluding + // non-SGML codepoints U+007F to U+009F + if (preg_match( + '/^[\x{9}\x{A}\x{D}\x{20}-\x{7E}\x{A0}-\x{D7FF}\x{E000}-\x{FFFD}\x{10000}-\x{10FFFF}]*$/Du', + $str + )) { + return $str; + } + + $mState = 0; // cached expected number of octets after the current octet + // until the beginning of the next UTF8 character sequence + $mUcs4 = 0; // cached Unicode character + $mBytes = 1; // cached expected number of octets in the current sequence + + // original code involved an $out that was an array of Unicode + // codepoints. Instead of having to convert back into UTF-8, we've + // decided to directly append valid UTF-8 characters onto a string + // $out once they're done. $char accumulates raw bytes, while $mUcs4 + // turns into the Unicode code point, so there's some redundancy. + + $out = ''; + $char = ''; + + $len = strlen($str); + for ($i = 0; $i < $len; $i++) { + $in = ord($str{$i}); + $char .= $str[$i]; // append byte to char + if (0 == $mState) { + // When mState is zero we expect either a US-ASCII character + // or a multi-octet sequence. + if (0 == (0x80 & ($in))) { + // US-ASCII, pass straight through. + if (($in <= 31 || $in == 127) && + !($in == 9 || $in == 13 || $in == 10) // save \r\t\n + ) { + // control characters, remove + } else { + $out .= $char; + } + // reset + $char = ''; + $mBytes = 1; + } elseif (0xC0 == (0xE0 & ($in))) { + // First octet of 2 octet sequence + $mUcs4 = ($in); + $mUcs4 = ($mUcs4 & 0x1F) << 6; + $mState = 1; + $mBytes = 2; + } elseif (0xE0 == (0xF0 & ($in))) { + // First octet of 3 octet sequence + $mUcs4 = ($in); + $mUcs4 = ($mUcs4 & 0x0F) << 12; + $mState = 2; + $mBytes = 3; + } elseif (0xF0 == (0xF8 & ($in))) { + // First octet of 4 octet sequence + $mUcs4 = ($in); + $mUcs4 = ($mUcs4 & 0x07) << 18; + $mState = 3; + $mBytes = 4; + } elseif (0xF8 == (0xFC & ($in))) { + // First octet of 5 octet sequence. + // + // This is illegal because the encoded codepoint must be + // either: + // (a) not the shortest form or + // (b) outside the Unicode range of 0-0x10FFFF. + // Rather than trying to resynchronize, we will carry on + // until the end of the sequence and let the later error + // handling code catch it. + $mUcs4 = ($in); + $mUcs4 = ($mUcs4 & 0x03) << 24; + $mState = 4; + $mBytes = 5; + } elseif (0xFC == (0xFE & ($in))) { + // First octet of 6 octet sequence, see comments for 5 + // octet sequence. + $mUcs4 = ($in); + $mUcs4 = ($mUcs4 & 1) << 30; + $mState = 5; + $mBytes = 6; + } else { + // Current octet is neither in the US-ASCII range nor a + // legal first octet of a multi-octet sequence. + $mState = 0; + $mUcs4 = 0; + $mBytes = 1; + $char = ''; + } + } else { + // When mState is non-zero, we expect a continuation of the + // multi-octet sequence + if (0x80 == (0xC0 & ($in))) { + // Legal continuation. + $shift = ($mState - 1) * 6; + $tmp = $in; + $tmp = ($tmp & 0x0000003F) << $shift; + $mUcs4 |= $tmp; + + if (0 == --$mState) { + // End of the multi-octet sequence. mUcs4 now contains + // the final Unicode codepoint to be output + + // Check for illegal sequences and codepoints. + + // From Unicode 3.1, non-shortest form is illegal + if (((2 == $mBytes) && ($mUcs4 < 0x0080)) || + ((3 == $mBytes) && ($mUcs4 < 0x0800)) || + ((4 == $mBytes) && ($mUcs4 < 0x10000)) || + (4 < $mBytes) || + // From Unicode 3.2, surrogate characters = illegal + (($mUcs4 & 0xFFFFF800) == 0xD800) || + // Codepoints outside the Unicode range are illegal + ($mUcs4 > 0x10FFFF) + ) { + + } elseif (0xFEFF != $mUcs4 && // omit BOM + // check for valid Char unicode codepoints + ( + 0x9 == $mUcs4 || + 0xA == $mUcs4 || + 0xD == $mUcs4 || + (0x20 <= $mUcs4 && 0x7E >= $mUcs4) || + // 7F-9F is not strictly prohibited by XML, + // but it is non-SGML, and thus we don't allow it + (0xA0 <= $mUcs4 && 0xD7FF >= $mUcs4) || + (0x10000 <= $mUcs4 && 0x10FFFF >= $mUcs4) + ) + ) { + $out .= $char; + } + // initialize UTF8 cache (reset) + $mState = 0; + $mUcs4 = 0; + $mBytes = 1; + $char = ''; + } + } else { + // ((0xC0 & (*in) != 0x80) && (mState != 0)) + // Incomplete multi-octet sequence. + // used to result in complete fail, but we'll reset + $mState = 0; + $mUcs4 = 0; + $mBytes = 1; + $char =''; + } + } + } + return $out; + } + + /** + * Translates a Unicode codepoint into its corresponding UTF-8 character. + * @note Based on Feyd's function at + * , + * which is in public domain. + * @note While we're going to do code point parsing anyway, a good + * optimization would be to refuse to translate code points that + * are non-SGML characters. However, this could lead to duplication. + * @note This is very similar to the unichr function in + * maintenance/generate-entity-file.php (although this is superior, + * due to its sanity checks). + */ + + // +----------+----------+----------+----------+ + // | 33222222 | 22221111 | 111111 | | + // | 10987654 | 32109876 | 54321098 | 76543210 | bit + // +----------+----------+----------+----------+ + // | | | | 0xxxxxxx | 1 byte 0x00000000..0x0000007F + // | | | 110yyyyy | 10xxxxxx | 2 byte 0x00000080..0x000007FF + // | | 1110zzzz | 10yyyyyy | 10xxxxxx | 3 byte 0x00000800..0x0000FFFF + // | 11110www | 10wwzzzz | 10yyyyyy | 10xxxxxx | 4 byte 0x00010000..0x0010FFFF + // +----------+----------+----------+----------+ + // | 00000000 | 00011111 | 11111111 | 11111111 | Theoretical upper limit of legal scalars: 2097151 (0x001FFFFF) + // | 00000000 | 00010000 | 11111111 | 11111111 | Defined upper limit of legal scalar codes + // +----------+----------+----------+----------+ + + public static function unichr($code) + { + if ($code > 1114111 or $code < 0 or + ($code >= 55296 and $code <= 57343) ) { + // bits are set outside the "valid" range as defined + // by UNICODE 4.1.0 + return ''; + } + + $x = $y = $z = $w = 0; + if ($code < 128) { + // regular ASCII character + $x = $code; + } else { + // set up bits for UTF-8 + $x = ($code & 63) | 128; + if ($code < 2048) { + $y = (($code & 2047) >> 6) | 192; + } else { + $y = (($code & 4032) >> 6) | 128; + if ($code < 65536) { + $z = (($code >> 12) & 15) | 224; + } else { + $z = (($code >> 12) & 63) | 128; + $w = (($code >> 18) & 7) | 240; + } + } + } + // set up the actual character + $ret = ''; + if ($w) { + $ret .= chr($w); + } + if ($z) { + $ret .= chr($z); + } + if ($y) { + $ret .= chr($y); + } + $ret .= chr($x); + + return $ret; + } + + /** + * @return bool + */ + public static function iconvAvailable() + { + static $iconv = null; + if ($iconv === null) { + $iconv = function_exists('iconv') && self::testIconvTruncateBug() != self::ICONV_UNUSABLE; + } + return $iconv; + } + + /** + * Convert a string to UTF-8 based on configuration. + * @param string $str The string to convert + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return string + */ + public static function convertToUTF8($str, $config, $context) + { + $encoding = $config->get('Core.Encoding'); + if ($encoding === 'utf-8') { + return $str; + } + static $iconv = null; + if ($iconv === null) { + $iconv = self::iconvAvailable(); + } + if ($iconv && !$config->get('Test.ForceNoIconv')) { + // unaffected by bugs, since UTF-8 support all characters + $str = self::unsafeIconv($encoding, 'utf-8//IGNORE', $str); + if ($str === false) { + // $encoding is not a valid encoding + trigger_error('Invalid encoding ' . $encoding, E_USER_ERROR); + return ''; + } + // If the string is bjorked by Shift_JIS or a similar encoding + // that doesn't support all of ASCII, convert the naughty + // characters to their true byte-wise ASCII/UTF-8 equivalents. + $str = strtr($str, self::testEncodingSupportsASCII($encoding)); + return $str; + } elseif ($encoding === 'iso-8859-1') { + $str = utf8_encode($str); + return $str; + } + $bug = HTMLPurifier_Encoder::testIconvTruncateBug(); + if ($bug == self::ICONV_OK) { + trigger_error('Encoding not supported, please install iconv', E_USER_ERROR); + } else { + trigger_error( + 'You have a buggy version of iconv, see https://bugs.php.net/bug.php?id=48147 ' . + 'and http://sourceware.org/bugzilla/show_bug.cgi?id=13541', + E_USER_ERROR + ); + } + } + + /** + * Converts a string from UTF-8 based on configuration. + * @param string $str The string to convert + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return string + * @note Currently, this is a lossy conversion, with unexpressable + * characters being omitted. + */ + public static function convertFromUTF8($str, $config, $context) + { + $encoding = $config->get('Core.Encoding'); + if ($escape = $config->get('Core.EscapeNonASCIICharacters')) { + $str = self::convertToASCIIDumbLossless($str); + } + if ($encoding === 'utf-8') { + return $str; + } + static $iconv = null; + if ($iconv === null) { + $iconv = self::iconvAvailable(); + } + if ($iconv && !$config->get('Test.ForceNoIconv')) { + // Undo our previous fix in convertToUTF8, otherwise iconv will barf + $ascii_fix = self::testEncodingSupportsASCII($encoding); + if (!$escape && !empty($ascii_fix)) { + $clear_fix = array(); + foreach ($ascii_fix as $utf8 => $native) { + $clear_fix[$utf8] = ''; + } + $str = strtr($str, $clear_fix); + } + $str = strtr($str, array_flip($ascii_fix)); + // Normal stuff + $str = self::iconv('utf-8', $encoding . '//IGNORE', $str); + return $str; + } elseif ($encoding === 'iso-8859-1') { + $str = utf8_decode($str); + return $str; + } + trigger_error('Encoding not supported', E_USER_ERROR); + // You might be tempted to assume that the ASCII representation + // might be OK, however, this is *not* universally true over all + // encodings. So we take the conservative route here, rather + // than forcibly turn on %Core.EscapeNonASCIICharacters + } + + /** + * Lossless (character-wise) conversion of HTML to ASCII + * @param string $str UTF-8 string to be converted to ASCII + * @return string ASCII encoded string with non-ASCII character entity-ized + * @warning Adapted from MediaWiki, claiming fair use: this is a common + * algorithm. If you disagree with this license fudgery, + * implement it yourself. + * @note Uses decimal numeric entities since they are best supported. + * @note This is a DUMB function: it has no concept of keeping + * character entities that the projected character encoding + * can allow. We could possibly implement a smart version + * but that would require it to also know which Unicode + * codepoints the charset supported (not an easy task). + * @note Sort of with cleanUTF8() but it assumes that $str is + * well-formed UTF-8 + */ + public static function convertToASCIIDumbLossless($str) + { + $bytesleft = 0; + $result = ''; + $working = 0; + $len = strlen($str); + for ($i = 0; $i < $len; $i++) { + $bytevalue = ord($str[$i]); + if ($bytevalue <= 0x7F) { //0xxx xxxx + $result .= chr($bytevalue); + $bytesleft = 0; + } elseif ($bytevalue <= 0xBF) { //10xx xxxx + $working = $working << 6; + $working += ($bytevalue & 0x3F); + $bytesleft--; + if ($bytesleft <= 0) { + $result .= "&#" . $working . ";"; + } + } elseif ($bytevalue <= 0xDF) { //110x xxxx + $working = $bytevalue & 0x1F; + $bytesleft = 1; + } elseif ($bytevalue <= 0xEF) { //1110 xxxx + $working = $bytevalue & 0x0F; + $bytesleft = 2; + } else { //1111 0xxx + $working = $bytevalue & 0x07; + $bytesleft = 3; + } + } + return $result; + } + + /** No bugs detected in iconv. */ + const ICONV_OK = 0; + + /** Iconv truncates output if converting from UTF-8 to another + * character set with //IGNORE, and a non-encodable character is found */ + const ICONV_TRUNCATES = 1; + + /** Iconv does not support //IGNORE, making it unusable for + * transcoding purposes */ + const ICONV_UNUSABLE = 2; + + /** + * glibc iconv has a known bug where it doesn't handle the magic + * //IGNORE stanza correctly. In particular, rather than ignore + * characters, it will return an EILSEQ after consuming some number + * of characters, and expect you to restart iconv as if it were + * an E2BIG. Old versions of PHP did not respect the errno, and + * returned the fragment, so as a result you would see iconv + * mysteriously truncating output. We can work around this by + * manually chopping our input into segments of about 8000 + * characters, as long as PHP ignores the error code. If PHP starts + * paying attention to the error code, iconv becomes unusable. + * + * @return int Error code indicating severity of bug. + */ + public static function testIconvTruncateBug() + { + static $code = null; + if ($code === null) { + // better not use iconv, otherwise infinite loop! + $r = self::unsafeIconv('utf-8', 'ascii//IGNORE', "\xCE\xB1" . str_repeat('a', 9000)); + if ($r === false) { + $code = self::ICONV_UNUSABLE; + } elseif (($c = strlen($r)) < 9000) { + $code = self::ICONV_TRUNCATES; + } elseif ($c > 9000) { + trigger_error( + 'Your copy of iconv is extremely buggy. Please notify HTML Purifier maintainers: ' . + 'include your iconv version as per phpversion()', + E_USER_ERROR + ); + } else { + $code = self::ICONV_OK; + } + } + return $code; + } + + /** + * This expensive function tests whether or not a given character + * encoding supports ASCII. 7/8-bit encodings like Shift_JIS will + * fail this test, and require special processing. Variable width + * encodings shouldn't ever fail. + * + * @param string $encoding Encoding name to test, as per iconv format + * @param bool $bypass Whether or not to bypass the precompiled arrays. + * @return Array of UTF-8 characters to their corresponding ASCII, + * which can be used to "undo" any overzealous iconv action. + */ + public static function testEncodingSupportsASCII($encoding, $bypass = false) + { + // All calls to iconv here are unsafe, proof by case analysis: + // If ICONV_OK, no difference. + // If ICONV_TRUNCATE, all calls involve one character inputs, + // so bug is not triggered. + // If ICONV_UNUSABLE, this call is irrelevant + static $encodings = array(); + if (!$bypass) { + if (isset($encodings[$encoding])) { + return $encodings[$encoding]; + } + $lenc = strtolower($encoding); + switch ($lenc) { + case 'shift_jis': + return array("\xC2\xA5" => '\\', "\xE2\x80\xBE" => '~'); + case 'johab': + return array("\xE2\x82\xA9" => '\\'); + } + if (strpos($lenc, 'iso-8859-') === 0) { + return array(); + } + } + $ret = array(); + if (self::unsafeIconv('UTF-8', $encoding, 'a') === false) { + return false; + } + for ($i = 0x20; $i <= 0x7E; $i++) { // all printable ASCII chars + $c = chr($i); // UTF-8 char + $r = self::unsafeIconv('UTF-8', "$encoding//IGNORE", $c); // initial conversion + if ($r === '' || + // This line is needed for iconv implementations that do not + // omit characters that do not exist in the target character set + ($r === $c && self::unsafeIconv($encoding, 'UTF-8//IGNORE', $r) !== $c) + ) { + // Reverse engineer: what's the UTF-8 equiv of this byte + // sequence? This assumes that there's no variable width + // encoding that doesn't support ASCII. + $ret[self::unsafeIconv($encoding, 'UTF-8//IGNORE', $c)] = $c; + } + } + $encodings[$encoding] = $ret; + return $ret; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/EntityLookup.php b/thirdparty/HTMLPurifier/HTMLPurifier/EntityLookup.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/EntityLookup.php rename to thirdparty/HTMLPurifier/HTMLPurifier/EntityLookup.php index cb3474e3b..f12ff13a3 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/EntityLookup.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/EntityLookup.php @@ -1,48 +1,48 @@ -table = unserialize(file_get_contents($file)); - } - - /** - * Retrieves sole instance of the object. - * @param bool|HTMLPurifier_EntityLookup $prototype Optional prototype of custom lookup table to overload with. - * @return HTMLPurifier_EntityLookup - */ - public static function instance($prototype = false) - { - // no references, since PHP doesn't copy unless modified - static $instance = null; - if ($prototype) { - $instance = $prototype; - } elseif (!$instance) { - $instance = new HTMLPurifier_EntityLookup(); - $instance->setup(); - } - return $instance; - } -} - -// vim: et sw=4 sts=4 +table = unserialize(file_get_contents($file)); + } + + /** + * Retrieves sole instance of the object. + * @param bool|HTMLPurifier_EntityLookup $prototype Optional prototype of custom lookup table to overload with. + * @return HTMLPurifier_EntityLookup + */ + public static function instance($prototype = false) + { + // no references, since PHP doesn't copy unless modified + static $instance = null; + if ($prototype) { + $instance = $prototype; + } elseif (!$instance) { + $instance = new HTMLPurifier_EntityLookup(); + $instance->setup(); + } + return $instance; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/EntityLookup/entities.ser b/thirdparty/HTMLPurifier/HTMLPurifier/EntityLookup/entities.ser similarity index 100% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/EntityLookup/entities.ser rename to thirdparty/HTMLPurifier/HTMLPurifier/EntityLookup/entities.ser diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/EntityParser.php b/thirdparty/HTMLPurifier/HTMLPurifier/EntityParser.php similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/EntityParser.php rename to thirdparty/HTMLPurifier/HTMLPurifier/EntityParser.php index 432a4f9ca..61529dcd9 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/EntityParser.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/EntityParser.php @@ -1,153 +1,153 @@ - '"', - 38 => '&', - 39 => "'", - 60 => '<', - 62 => '>' - ); - - /** - * Stripped entity names to decimal conversion table for special entities. - * @type array - */ - protected $_special_ent2dec = - array( - 'quot' => 34, - 'amp' => 38, - 'lt' => 60, - 'gt' => 62 - ); - - /** - * Substitutes non-special entities with their parsed equivalents. Since - * running this whenever you have parsed character is t3h 5uck, we run - * it before everything else. - * - * @param string $string String to have non-special entities parsed. - * @return string Parsed string. - */ - public function substituteNonSpecialEntities($string) - { - // it will try to detect missing semicolons, but don't rely on it - return preg_replace_callback( - $this->_substituteEntitiesRegex, - array($this, 'nonSpecialEntityCallback'), - $string - ); - } - - /** - * Callback function for substituteNonSpecialEntities() that does the work. - * - * @param array $matches PCRE matches array, with 0 the entire match, and - * either index 1, 2 or 3 set with a hex value, dec value, - * or string (respectively). - * @return string Replacement string. - */ - - protected function nonSpecialEntityCallback($matches) - { - // replaces all but big five - $entity = $matches[0]; - $is_num = (@$matches[0][1] === '#'); - if ($is_num) { - $is_hex = (@$entity[2] === 'x'); - $code = $is_hex ? hexdec($matches[1]) : (int) $matches[2]; - // abort for special characters - if (isset($this->_special_dec2str[$code])) { - return $entity; - } - return HTMLPurifier_Encoder::unichr($code); - } else { - if (isset($this->_special_ent2dec[$matches[3]])) { - return $entity; - } - if (!$this->_entity_lookup) { - $this->_entity_lookup = HTMLPurifier_EntityLookup::instance(); - } - if (isset($this->_entity_lookup->table[$matches[3]])) { - return $this->_entity_lookup->table[$matches[3]]; - } else { - return $entity; - } - } - } - - /** - * Substitutes only special entities with their parsed equivalents. - * - * @notice We try to avoid calling this function because otherwise, it - * would have to be called a lot (for every parsed section). - * - * @param string $string String to have non-special entities parsed. - * @return string Parsed string. - */ - public function substituteSpecialEntities($string) - { - return preg_replace_callback( - $this->_substituteEntitiesRegex, - array($this, 'specialEntityCallback'), - $string - ); - } - - /** - * Callback function for substituteSpecialEntities() that does the work. - * - * This callback has same syntax as nonSpecialEntityCallback(). - * - * @param array $matches PCRE-style matches array, with 0 the entire match, and - * either index 1, 2 or 3 set with a hex value, dec value, - * or string (respectively). - * @return string Replacement string. - */ - protected function specialEntityCallback($matches) - { - $entity = $matches[0]; - $is_num = (@$matches[0][1] === '#'); - if ($is_num) { - $is_hex = (@$entity[2] === 'x'); - $int = $is_hex ? hexdec($matches[1]) : (int) $matches[2]; - return isset($this->_special_dec2str[$int]) ? - $this->_special_dec2str[$int] : - $entity; - } else { - return isset($this->_special_ent2dec[$matches[3]]) ? - $this->_special_ent2dec[$matches[3]] : - $entity; - } - } -} - -// vim: et sw=4 sts=4 + '"', + 38 => '&', + 39 => "'", + 60 => '<', + 62 => '>' + ); + + /** + * Stripped entity names to decimal conversion table for special entities. + * @type array + */ + protected $_special_ent2dec = + array( + 'quot' => 34, + 'amp' => 38, + 'lt' => 60, + 'gt' => 62 + ); + + /** + * Substitutes non-special entities with their parsed equivalents. Since + * running this whenever you have parsed character is t3h 5uck, we run + * it before everything else. + * + * @param string $string String to have non-special entities parsed. + * @return string Parsed string. + */ + public function substituteNonSpecialEntities($string) + { + // it will try to detect missing semicolons, but don't rely on it + return preg_replace_callback( + $this->_substituteEntitiesRegex, + array($this, 'nonSpecialEntityCallback'), + $string + ); + } + + /** + * Callback function for substituteNonSpecialEntities() that does the work. + * + * @param array $matches PCRE matches array, with 0 the entire match, and + * either index 1, 2 or 3 set with a hex value, dec value, + * or string (respectively). + * @return string Replacement string. + */ + + protected function nonSpecialEntityCallback($matches) + { + // replaces all but big five + $entity = $matches[0]; + $is_num = (@$matches[0][1] === '#'); + if ($is_num) { + $is_hex = (@$entity[2] === 'x'); + $code = $is_hex ? hexdec($matches[1]) : (int) $matches[2]; + // abort for special characters + if (isset($this->_special_dec2str[$code])) { + return $entity; + } + return HTMLPurifier_Encoder::unichr($code); + } else { + if (isset($this->_special_ent2dec[$matches[3]])) { + return $entity; + } + if (!$this->_entity_lookup) { + $this->_entity_lookup = HTMLPurifier_EntityLookup::instance(); + } + if (isset($this->_entity_lookup->table[$matches[3]])) { + return $this->_entity_lookup->table[$matches[3]]; + } else { + return $entity; + } + } + } + + /** + * Substitutes only special entities with their parsed equivalents. + * + * @notice We try to avoid calling this function because otherwise, it + * would have to be called a lot (for every parsed section). + * + * @param string $string String to have non-special entities parsed. + * @return string Parsed string. + */ + public function substituteSpecialEntities($string) + { + return preg_replace_callback( + $this->_substituteEntitiesRegex, + array($this, 'specialEntityCallback'), + $string + ); + } + + /** + * Callback function for substituteSpecialEntities() that does the work. + * + * This callback has same syntax as nonSpecialEntityCallback(). + * + * @param array $matches PCRE-style matches array, with 0 the entire match, and + * either index 1, 2 or 3 set with a hex value, dec value, + * or string (respectively). + * @return string Replacement string. + */ + protected function specialEntityCallback($matches) + { + $entity = $matches[0]; + $is_num = (@$matches[0][1] === '#'); + if ($is_num) { + $is_hex = (@$entity[2] === 'x'); + $int = $is_hex ? hexdec($matches[1]) : (int) $matches[2]; + return isset($this->_special_dec2str[$int]) ? + $this->_special_dec2str[$int] : + $entity; + } else { + return isset($this->_special_ent2dec[$matches[3]]) ? + $this->_special_ent2dec[$matches[3]] : + $entity; + } + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ErrorCollector.php b/thirdparty/HTMLPurifier/HTMLPurifier/ErrorCollector.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ErrorCollector.php rename to thirdparty/HTMLPurifier/HTMLPurifier/ErrorCollector.php index a6cbcaa0e..d47e3f2e2 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ErrorCollector.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ErrorCollector.php @@ -1,244 +1,244 @@ -locale =& $context->get('Locale'); - $this->context = $context; - $this->_current =& $this->_stacks[0]; - $this->errors =& $this->_stacks[0]; - } - - /** - * Sends an error message to the collector for later use - * @param int $severity Error severity, PHP error style (don't use E_USER_) - * @param string $msg Error message text - */ - public function send($severity, $msg) - { - $args = array(); - if (func_num_args() > 2) { - $args = func_get_args(); - array_shift($args); - unset($args[0]); - } - - $token = $this->context->get('CurrentToken', true); - $line = $token ? $token->line : $this->context->get('CurrentLine', true); - $col = $token ? $token->col : $this->context->get('CurrentCol', true); - $attr = $this->context->get('CurrentAttr', true); - - // perform special substitutions, also add custom parameters - $subst = array(); - if (!is_null($token)) { - $args['CurrentToken'] = $token; - } - if (!is_null($attr)) { - $subst['$CurrentAttr.Name'] = $attr; - if (isset($token->attr[$attr])) { - $subst['$CurrentAttr.Value'] = $token->attr[$attr]; - } - } - - if (empty($args)) { - $msg = $this->locale->getMessage($msg); - } else { - $msg = $this->locale->formatMessage($msg, $args); - } - - if (!empty($subst)) { - $msg = strtr($msg, $subst); - } - - // (numerically indexed) - $error = array( - self::LINENO => $line, - self::SEVERITY => $severity, - self::MESSAGE => $msg, - self::CHILDREN => array() - ); - $this->_current[] = $error; - - // NEW CODE BELOW ... - // Top-level errors are either: - // TOKEN type, if $value is set appropriately, or - // "syntax" type, if $value is null - $new_struct = new HTMLPurifier_ErrorStruct(); - $new_struct->type = HTMLPurifier_ErrorStruct::TOKEN; - if ($token) { - $new_struct->value = clone $token; - } - if (is_int($line) && is_int($col)) { - if (isset($this->lines[$line][$col])) { - $struct = $this->lines[$line][$col]; - } else { - $struct = $this->lines[$line][$col] = $new_struct; - } - // These ksorts may present a performance problem - ksort($this->lines[$line], SORT_NUMERIC); - } else { - if (isset($this->lines[-1])) { - $struct = $this->lines[-1]; - } else { - $struct = $this->lines[-1] = $new_struct; - } - } - ksort($this->lines, SORT_NUMERIC); - - // Now, check if we need to operate on a lower structure - if (!empty($attr)) { - $struct = $struct->getChild(HTMLPurifier_ErrorStruct::ATTR, $attr); - if (!$struct->value) { - $struct->value = array($attr, 'PUT VALUE HERE'); - } - } - if (!empty($cssprop)) { - $struct = $struct->getChild(HTMLPurifier_ErrorStruct::CSSPROP, $cssprop); - if (!$struct->value) { - // if we tokenize CSS this might be a little more difficult to do - $struct->value = array($cssprop, 'PUT VALUE HERE'); - } - } - - // Ok, structs are all setup, now time to register the error - $struct->addError($severity, $msg); - } - - /** - * Retrieves raw error data for custom formatter to use - */ - public function getRaw() - { - return $this->errors; - } - - /** - * Default HTML formatting implementation for error messages - * @param HTMLPurifier_Config $config Configuration, vital for HTML output nature - * @param array $errors Errors array to display; used for recursion. - * @return string - */ - public function getHTMLFormatted($config, $errors = null) - { - $ret = array(); - - $this->generator = new HTMLPurifier_Generator($config, $this->context); - if ($errors === null) { - $errors = $this->errors; - } - - // 'At line' message needs to be removed - - // generation code for new structure goes here. It needs to be recursive. - foreach ($this->lines as $line => $col_array) { - if ($line == -1) { - continue; - } - foreach ($col_array as $col => $struct) { - $this->_renderStruct($ret, $struct, $line, $col); - } - } - if (isset($this->lines[-1])) { - $this->_renderStruct($ret, $this->lines[-1]); - } - - if (empty($errors)) { - return '

' . $this->locale->getMessage('ErrorCollector: No errors') . '

'; - } else { - return '
  • ' . implode('
  • ', $ret) . '
'; - } - - } - - private function _renderStruct(&$ret, $struct, $line = null, $col = null) - { - $stack = array($struct); - $context_stack = array(array()); - while ($current = array_pop($stack)) { - $context = array_pop($context_stack); - foreach ($current->errors as $error) { - list($severity, $msg) = $error; - $string = ''; - $string .= '
'; - // W3C uses an icon to indicate the severity of the error. - $error = $this->locale->getErrorName($severity); - $string .= "$error "; - if (!is_null($line) && !is_null($col)) { - $string .= "Line $line, Column $col: "; - } else { - $string .= 'End of Document: '; - } - $string .= '' . $this->generator->escape($msg) . ' '; - $string .= '
'; - // Here, have a marker for the character on the column appropriate. - // Be sure to clip extremely long lines. - //$string .= '
';
-                //$string .= '';
-                //$string .= '
'; - $ret[] = $string; - } - foreach ($current->children as $array) { - $context[] = $current; - $stack = array_merge($stack, array_reverse($array, true)); - for ($i = count($array); $i > 0; $i--) { - $context_stack[] = $context; - } - } - } - } -} - -// vim: et sw=4 sts=4 +locale =& $context->get('Locale'); + $this->context = $context; + $this->_current =& $this->_stacks[0]; + $this->errors =& $this->_stacks[0]; + } + + /** + * Sends an error message to the collector for later use + * @param int $severity Error severity, PHP error style (don't use E_USER_) + * @param string $msg Error message text + */ + public function send($severity, $msg) + { + $args = array(); + if (func_num_args() > 2) { + $args = func_get_args(); + array_shift($args); + unset($args[0]); + } + + $token = $this->context->get('CurrentToken', true); + $line = $token ? $token->line : $this->context->get('CurrentLine', true); + $col = $token ? $token->col : $this->context->get('CurrentCol', true); + $attr = $this->context->get('CurrentAttr', true); + + // perform special substitutions, also add custom parameters + $subst = array(); + if (!is_null($token)) { + $args['CurrentToken'] = $token; + } + if (!is_null($attr)) { + $subst['$CurrentAttr.Name'] = $attr; + if (isset($token->attr[$attr])) { + $subst['$CurrentAttr.Value'] = $token->attr[$attr]; + } + } + + if (empty($args)) { + $msg = $this->locale->getMessage($msg); + } else { + $msg = $this->locale->formatMessage($msg, $args); + } + + if (!empty($subst)) { + $msg = strtr($msg, $subst); + } + + // (numerically indexed) + $error = array( + self::LINENO => $line, + self::SEVERITY => $severity, + self::MESSAGE => $msg, + self::CHILDREN => array() + ); + $this->_current[] = $error; + + // NEW CODE BELOW ... + // Top-level errors are either: + // TOKEN type, if $value is set appropriately, or + // "syntax" type, if $value is null + $new_struct = new HTMLPurifier_ErrorStruct(); + $new_struct->type = HTMLPurifier_ErrorStruct::TOKEN; + if ($token) { + $new_struct->value = clone $token; + } + if (is_int($line) && is_int($col)) { + if (isset($this->lines[$line][$col])) { + $struct = $this->lines[$line][$col]; + } else { + $struct = $this->lines[$line][$col] = $new_struct; + } + // These ksorts may present a performance problem + ksort($this->lines[$line], SORT_NUMERIC); + } else { + if (isset($this->lines[-1])) { + $struct = $this->lines[-1]; + } else { + $struct = $this->lines[-1] = $new_struct; + } + } + ksort($this->lines, SORT_NUMERIC); + + // Now, check if we need to operate on a lower structure + if (!empty($attr)) { + $struct = $struct->getChild(HTMLPurifier_ErrorStruct::ATTR, $attr); + if (!$struct->value) { + $struct->value = array($attr, 'PUT VALUE HERE'); + } + } + if (!empty($cssprop)) { + $struct = $struct->getChild(HTMLPurifier_ErrorStruct::CSSPROP, $cssprop); + if (!$struct->value) { + // if we tokenize CSS this might be a little more difficult to do + $struct->value = array($cssprop, 'PUT VALUE HERE'); + } + } + + // Ok, structs are all setup, now time to register the error + $struct->addError($severity, $msg); + } + + /** + * Retrieves raw error data for custom formatter to use + */ + public function getRaw() + { + return $this->errors; + } + + /** + * Default HTML formatting implementation for error messages + * @param HTMLPurifier_Config $config Configuration, vital for HTML output nature + * @param array $errors Errors array to display; used for recursion. + * @return string + */ + public function getHTMLFormatted($config, $errors = null) + { + $ret = array(); + + $this->generator = new HTMLPurifier_Generator($config, $this->context); + if ($errors === null) { + $errors = $this->errors; + } + + // 'At line' message needs to be removed + + // generation code for new structure goes here. It needs to be recursive. + foreach ($this->lines as $line => $col_array) { + if ($line == -1) { + continue; + } + foreach ($col_array as $col => $struct) { + $this->_renderStruct($ret, $struct, $line, $col); + } + } + if (isset($this->lines[-1])) { + $this->_renderStruct($ret, $this->lines[-1]); + } + + if (empty($errors)) { + return '

' . $this->locale->getMessage('ErrorCollector: No errors') . '

'; + } else { + return '
  • ' . implode('
  • ', $ret) . '
'; + } + + } + + private function _renderStruct(&$ret, $struct, $line = null, $col = null) + { + $stack = array($struct); + $context_stack = array(array()); + while ($current = array_pop($stack)) { + $context = array_pop($context_stack); + foreach ($current->errors as $error) { + list($severity, $msg) = $error; + $string = ''; + $string .= '
'; + // W3C uses an icon to indicate the severity of the error. + $error = $this->locale->getErrorName($severity); + $string .= "$error "; + if (!is_null($line) && !is_null($col)) { + $string .= "Line $line, Column $col: "; + } else { + $string .= 'End of Document: '; + } + $string .= '' . $this->generator->escape($msg) . ' '; + $string .= '
'; + // Here, have a marker for the character on the column appropriate. + // Be sure to clip extremely long lines. + //$string .= '
';
+                //$string .= '';
+                //$string .= '
'; + $ret[] = $string; + } + foreach ($current->children as $array) { + $context[] = $current; + $stack = array_merge($stack, array_reverse($array, true)); + for ($i = count($array); $i > 0; $i--) { + $context_stack[] = $context; + } + } + } + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ErrorStruct.php b/thirdparty/HTMLPurifier/HTMLPurifier/ErrorStruct.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ErrorStruct.php rename to thirdparty/HTMLPurifier/HTMLPurifier/ErrorStruct.php index a6c0da29e..cf869d321 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/ErrorStruct.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/ErrorStruct.php @@ -1,74 +1,74 @@ -children[$type][$id])) { - $this->children[$type][$id] = new HTMLPurifier_ErrorStruct(); - $this->children[$type][$id]->type = $type; - } - return $this->children[$type][$id]; - } - - /** - * @param int $severity - * @param string $message - */ - public function addError($severity, $message) - { - $this->errors[] = array($severity, $message); - } -} - -// vim: et sw=4 sts=4 +children[$type][$id])) { + $this->children[$type][$id] = new HTMLPurifier_ErrorStruct(); + $this->children[$type][$id]->type = $type; + } + return $this->children[$type][$id]; + } + + /** + * @param int $severity + * @param string $message + */ + public function addError($severity, $message) + { + $this->errors[] = array($severity, $message); + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Exception.php b/thirdparty/HTMLPurifier/HTMLPurifier/Exception.php similarity index 93% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Exception.php rename to thirdparty/HTMLPurifier/HTMLPurifier/Exception.php index defe157e7..be85b4c56 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Exception.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/Exception.php @@ -1,12 +1,12 @@ -preFilter, - * 2->preFilter, 3->preFilter, purify, 3->postFilter, 2->postFilter, - * 1->postFilter. - * - * @note Methods are not declared abstract as it is perfectly legitimate - * for an implementation not to want anything to happen on a step - */ - -class HTMLPurifier_Filter -{ - - /** - * Name of the filter for identification purposes. - * @type string - */ - public $name; - - /** - * Pre-processor function, handles HTML before HTML Purifier - * @param string $html - * @param HTMLPurifier_Config $config - * @param HTMLPurifier_Context $context - * @return string - */ - public function preFilter($html, $config, $context) - { - return $html; - } - - /** - * Post-processor function, handles HTML after HTML Purifier - * @param string $html - * @param HTMLPurifier_Config $config - * @param HTMLPurifier_Context $context - * @return string - */ - public function postFilter($html, $config, $context) - { - return $html; - } -} - -// vim: et sw=4 sts=4 +preFilter, + * 2->preFilter, 3->preFilter, purify, 3->postFilter, 2->postFilter, + * 1->postFilter. + * + * @note Methods are not declared abstract as it is perfectly legitimate + * for an implementation not to want anything to happen on a step + */ + +class HTMLPurifier_Filter +{ + + /** + * Name of the filter for identification purposes. + * @type string + */ + public $name; + + /** + * Pre-processor function, handles HTML before HTML Purifier + * @param string $html + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return string + */ + public function preFilter($html, $config, $context) + { + return $html; + } + + /** + * Post-processor function, handles HTML after HTML Purifier + * @param string $html + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return string + */ + public function postFilter($html, $config, $context) + { + return $html; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Filter/ExtractStyleBlocks.php b/thirdparty/HTMLPurifier/HTMLPurifier/Filter/ExtractStyleBlocks.php similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Filter/ExtractStyleBlocks.php rename to thirdparty/HTMLPurifier/HTMLPurifier/Filter/ExtractStyleBlocks.php index 9a115d862..08e62c16b 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Filter/ExtractStyleBlocks.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/Filter/ExtractStyleBlocks.php @@ -1,338 +1,338 @@ - blocks from input HTML, cleans them up - * using CSSTidy, and then places them in $purifier->context->get('StyleBlocks') - * so they can be used elsewhere in the document. - * - * @note - * See tests/HTMLPurifier/Filter/ExtractStyleBlocksTest.php for - * sample usage. - * - * @note - * This filter can also be used on stylesheets not included in the - * document--something purists would probably prefer. Just directly - * call HTMLPurifier_Filter_ExtractStyleBlocks->cleanCSS() - */ -class HTMLPurifier_Filter_ExtractStyleBlocks extends HTMLPurifier_Filter -{ - /** - * @type string - */ - public $name = 'ExtractStyleBlocks'; - - /** - * @type array - */ - private $_styleMatches = array(); - - /** - * @type csstidy - */ - private $_tidy; - - /** - * @type HTMLPurifier_AttrDef_HTML_ID - */ - private $_id_attrdef; - - /** - * @type HTMLPurifier_AttrDef_CSS_Ident - */ - private $_class_attrdef; - - /** - * @type HTMLPurifier_AttrDef_Enum - */ - private $_enum_attrdef; - - public function __construct() - { - $this->_tidy = new csstidy(); - $this->_tidy->set_cfg('lowercase_s', false); - $this->_id_attrdef = new HTMLPurifier_AttrDef_HTML_ID(true); - $this->_class_attrdef = new HTMLPurifier_AttrDef_CSS_Ident(); - $this->_enum_attrdef = new HTMLPurifier_AttrDef_Enum( - array( - 'first-child', - 'link', - 'visited', - 'active', - 'hover', - 'focus' - ) - ); - } - - /** - * Save the contents of CSS blocks to style matches - * @param array $matches preg_replace style $matches array - */ - protected function styleCallback($matches) - { - $this->_styleMatches[] = $matches[1]; - } - - /** - * Removes inline #isU', array($this, 'styleCallback'), $html); - $style_blocks = $this->_styleMatches; - $this->_styleMatches = array(); // reset - $context->register('StyleBlocks', $style_blocks); // $context must not be reused - if ($this->_tidy) { - foreach ($style_blocks as &$style) { - $style = $this->cleanCSS($style, $config, $context); - } - } - return $html; - } - - /** - * Takes CSS (the stuff found in in a font-family prop). - if ($config->get('Filter.ExtractStyleBlocks.Escaping')) { - $css = str_replace( - array('<', '>', '&'), - array('\3C ', '\3E ', '\26 '), - $css - ); - } - return $css; - } -} - -// vim: et sw=4 sts=4 + blocks from input HTML, cleans them up + * using CSSTidy, and then places them in $purifier->context->get('StyleBlocks') + * so they can be used elsewhere in the document. + * + * @note + * See tests/HTMLPurifier/Filter/ExtractStyleBlocksTest.php for + * sample usage. + * + * @note + * This filter can also be used on stylesheets not included in the + * document--something purists would probably prefer. Just directly + * call HTMLPurifier_Filter_ExtractStyleBlocks->cleanCSS() + */ +class HTMLPurifier_Filter_ExtractStyleBlocks extends HTMLPurifier_Filter +{ + /** + * @type string + */ + public $name = 'ExtractStyleBlocks'; + + /** + * @type array + */ + private $_styleMatches = array(); + + /** + * @type csstidy + */ + private $_tidy; + + /** + * @type HTMLPurifier_AttrDef_HTML_ID + */ + private $_id_attrdef; + + /** + * @type HTMLPurifier_AttrDef_CSS_Ident + */ + private $_class_attrdef; + + /** + * @type HTMLPurifier_AttrDef_Enum + */ + private $_enum_attrdef; + + public function __construct() + { + $this->_tidy = new csstidy(); + $this->_tidy->set_cfg('lowercase_s', false); + $this->_id_attrdef = new HTMLPurifier_AttrDef_HTML_ID(true); + $this->_class_attrdef = new HTMLPurifier_AttrDef_CSS_Ident(); + $this->_enum_attrdef = new HTMLPurifier_AttrDef_Enum( + array( + 'first-child', + 'link', + 'visited', + 'active', + 'hover', + 'focus' + ) + ); + } + + /** + * Save the contents of CSS blocks to style matches + * @param array $matches preg_replace style $matches array + */ + protected function styleCallback($matches) + { + $this->_styleMatches[] = $matches[1]; + } + + /** + * Removes inline #isU', array($this, 'styleCallback'), $html); + $style_blocks = $this->_styleMatches; + $this->_styleMatches = array(); // reset + $context->register('StyleBlocks', $style_blocks); // $context must not be reused + if ($this->_tidy) { + foreach ($style_blocks as &$style) { + $style = $this->cleanCSS($style, $config, $context); + } + } + return $html; + } + + /** + * Takes CSS (the stuff found in in a font-family prop). + if ($config->get('Filter.ExtractStyleBlocks.Escaping')) { + $css = str_replace( + array('<', '>', '&'), + array('\3C ', '\3E ', '\26 '), + $css + ); + } + return $css; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Filter/YouTube.php b/thirdparty/HTMLPurifier/HTMLPurifier/Filter/YouTube.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Filter/YouTube.php rename to thirdparty/HTMLPurifier/HTMLPurifier/Filter/YouTube.php index 9200802a8..411519ad6 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Filter/YouTube.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/Filter/YouTube.php @@ -1,65 +1,65 @@ -]+>.+?' . - 'http://www.youtube.com/((?:v|cp)/[A-Za-z0-9\-_=]+).+?#s'; - $pre_replace = '\1'; - return preg_replace($pre_regex, $pre_replace, $html); - } - - /** - * @param string $html - * @param HTMLPurifier_Config $config - * @param HTMLPurifier_Context $context - * @return string - */ - public function postFilter($html, $config, $context) - { - $post_regex = '#((?:v|cp)/[A-Za-z0-9\-_=]+)#'; - return preg_replace_callback($post_regex, array($this, 'postFilterCallback'), $html); - } - - /** - * @param $url - * @return string - */ - protected function armorUrl($url) - { - return str_replace('--', '--', $url); - } - - /** - * @param array $matches - * @return string - */ - protected function postFilterCallback($matches) - { - $url = $this->armorUrl($matches[1]); - return '' . - '' . - '' . - ''; - } -} - -// vim: et sw=4 sts=4 +]+>.+?' . + 'http://www.youtube.com/((?:v|cp)/[A-Za-z0-9\-_=]+).+?#s'; + $pre_replace = '\1'; + return preg_replace($pre_regex, $pre_replace, $html); + } + + /** + * @param string $html + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return string + */ + public function postFilter($html, $config, $context) + { + $post_regex = '#((?:v|cp)/[A-Za-z0-9\-_=]+)#'; + return preg_replace_callback($post_regex, array($this, 'postFilterCallback'), $html); + } + + /** + * @param $url + * @return string + */ + protected function armorUrl($url) + { + return str_replace('--', '--', $url); + } + + /** + * @param array $matches + * @return string + */ + protected function postFilterCallback($matches) + { + $url = $this->armorUrl($matches[1]); + return '' . + '' . + '' . + ''; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Generator.php b/thirdparty/HTMLPurifier/HTMLPurifier/Generator.php similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Generator.php rename to thirdparty/HTMLPurifier/HTMLPurifier/Generator.php index ca76ba6c1..6fb568714 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Generator.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/Generator.php @@ -1,286 +1,286 @@ - tags. - * @type bool - */ - private $_scriptFix = false; - - /** - * Cache of HTMLDefinition during HTML output to determine whether or - * not attributes should be minimized. - * @type HTMLPurifier_HTMLDefinition - */ - private $_def; - - /** - * Cache of %Output.SortAttr. - * @type bool - */ - private $_sortAttr; - - /** - * Cache of %Output.FlashCompat. - * @type bool - */ - private $_flashCompat; - - /** - * Cache of %Output.FixInnerHTML. - * @type bool - */ - private $_innerHTMLFix; - - /** - * Stack for keeping track of object information when outputting IE - * compatibility code. - * @type array - */ - private $_flashStack = array(); - - /** - * Configuration for the generator - * @type HTMLPurifier_Config - */ - protected $config; - - /** - * @param HTMLPurifier_Config $config - * @param HTMLPurifier_Context $context - */ - public function __construct($config, $context) - { - $this->config = $config; - $this->_scriptFix = $config->get('Output.CommentScriptContents'); - $this->_innerHTMLFix = $config->get('Output.FixInnerHTML'); - $this->_sortAttr = $config->get('Output.SortAttr'); - $this->_flashCompat = $config->get('Output.FlashCompat'); - $this->_def = $config->getHTMLDefinition(); - $this->_xhtml = $this->_def->doctype->xml; - } - - /** - * Generates HTML from an array of tokens. - * @param HTMLPurifier_Token[] $tokens Array of HTMLPurifier_Token - * @return string Generated HTML - */ - public function generateFromTokens($tokens) - { - if (!$tokens) { - return ''; - } - - // Basic algorithm - $html = ''; - for ($i = 0, $size = count($tokens); $i < $size; $i++) { - if ($this->_scriptFix && $tokens[$i]->name === 'script' - && $i + 2 < $size && $tokens[$i+2] instanceof HTMLPurifier_Token_End) { - // script special case - // the contents of the script block must be ONE token - // for this to work. - $html .= $this->generateFromToken($tokens[$i++]); - $html .= $this->generateScriptFromToken($tokens[$i++]); - } - $html .= $this->generateFromToken($tokens[$i]); - } - - // Tidy cleanup - if (extension_loaded('tidy') && $this->config->get('Output.TidyFormat')) { - $tidy = new Tidy; - $tidy->parseString( - $html, - array( - 'indent'=> true, - 'output-xhtml' => $this->_xhtml, - 'show-body-only' => true, - 'indent-spaces' => 2, - 'wrap' => 68, - ), - 'utf8' - ); - $tidy->cleanRepair(); - $html = (string) $tidy; // explicit cast necessary - } - - // Normalize newlines to system defined value - if ($this->config->get('Core.NormalizeNewlines')) { - $nl = $this->config->get('Output.Newline'); - if ($nl === null) { - $nl = PHP_EOL; - } - if ($nl !== "\n") { - $html = str_replace("\n", $nl, $html); - } - } - return $html; - } - - /** - * Generates HTML from a single token. - * @param HTMLPurifier_Token $token HTMLPurifier_Token object. - * @return string Generated HTML - */ - public function generateFromToken($token) - { - if (!$token instanceof HTMLPurifier_Token) { - trigger_error('Cannot generate HTML from non-HTMLPurifier_Token object', E_USER_WARNING); - return ''; - - } elseif ($token instanceof HTMLPurifier_Token_Start) { - $attr = $this->generateAttributes($token->attr, $token->name); - if ($this->_flashCompat) { - if ($token->name == "object") { - $flash = new stdclass(); - $flash->attr = $token->attr; - $flash->param = array(); - $this->_flashStack[] = $flash; - } - } - return '<' . $token->name . ($attr ? ' ' : '') . $attr . '>'; - - } elseif ($token instanceof HTMLPurifier_Token_End) { - $_extra = ''; - if ($this->_flashCompat) { - if ($token->name == "object" && !empty($this->_flashStack)) { - // doesn't do anything for now - } - } - return $_extra . 'name . '>'; - - } elseif ($token instanceof HTMLPurifier_Token_Empty) { - if ($this->_flashCompat && $token->name == "param" && !empty($this->_flashStack)) { - $this->_flashStack[count($this->_flashStack)-1]->param[$token->attr['name']] = $token->attr['value']; - } - $attr = $this->generateAttributes($token->attr, $token->name); - return '<' . $token->name . ($attr ? ' ' : '') . $attr . - ( $this->_xhtml ? ' /': '' ) //
v.
- . '>'; - - } elseif ($token instanceof HTMLPurifier_Token_Text) { - return $this->escape($token->data, ENT_NOQUOTES); - - } elseif ($token instanceof HTMLPurifier_Token_Comment) { - return ''; - } else { - return ''; - - } - } - - /** - * Special case processor for the contents of script tags - * @param HTMLPurifier_Token $token HTMLPurifier_Token object. - * @return string - * @warning This runs into problems if there's already a literal - * --> somewhere inside the script contents. - */ - public function generateScriptFromToken($token) - { - if (!$token instanceof HTMLPurifier_Token_Text) { - return $this->generateFromToken($token); - } - // Thanks - $data = preg_replace('#//\s*$#', '', $token->data); - return ''; - } - - /** - * Generates attribute declarations from attribute array. - * @note This does not include the leading or trailing space. - * @param array $assoc_array_of_attributes Attribute array - * @param string $element Name of element attributes are for, used to check - * attribute minimization. - * @return string Generated HTML fragment for insertion. - */ - public function generateAttributes($assoc_array_of_attributes, $element = '') - { - $html = ''; - if ($this->_sortAttr) { - ksort($assoc_array_of_attributes); - } - foreach ($assoc_array_of_attributes as $key => $value) { - if (!$this->_xhtml) { - // Remove namespaced attributes - if (strpos($key, ':') !== false) { - continue; - } - // Check if we should minimize the attribute: val="val" -> val - if ($element && !empty($this->_def->info[$element]->attr[$key]->minimized)) { - $html .= $key . ' '; - continue; - } - } - // Workaround for Internet Explorer innerHTML bug. - // Essentially, Internet Explorer, when calculating - // innerHTML, omits quotes if there are no instances of - // angled brackets, quotes or spaces. However, when parsing - // HTML (for example, when you assign to innerHTML), it - // treats backticks as quotes. Thus, - // `` - // becomes - // `` - // becomes - // - // Fortunately, all we need to do is trigger an appropriate - // quoting style, which we do by adding an extra space. - // This also is consistent with the W3C spec, which states - // that user agents may ignore leading or trailing - // whitespace (in fact, most don't, at least for attributes - // like alt, but an extra space at the end is barely - // noticeable). Still, we have a configuration knob for - // this, since this transformation is not necesary if you - // don't process user input with innerHTML or you don't plan - // on supporting Internet Explorer. - if ($this->_innerHTMLFix) { - if (strpos($value, '`') !== false) { - // check if correct quoting style would not already be - // triggered - if (strcspn($value, '"\' <>') === strlen($value)) { - // protect! - $value .= ' '; - } - } - } - $html .= $key.'="'.$this->escape($value).'" '; - } - return rtrim($html); - } - - /** - * Escapes raw text data. - * @todo This really ought to be protected, but until we have a facility - * for properly generating HTML here w/o using tokens, it stays - * public. - * @param string $string String data to escape for HTML. - * @param int $quote Quoting style, like htmlspecialchars. ENT_NOQUOTES is - * permissible for non-attribute output. - * @return string escaped data. - */ - public function escape($string, $quote = null) - { - // Workaround for APC bug on Mac Leopard reported by sidepodcast - // http://htmlpurifier.org/phorum/read.php?3,4823,4846 - if ($quote === null) { - $quote = ENT_COMPAT; - } - return htmlspecialchars($string, $quote, 'UTF-8'); - } -} - -// vim: et sw=4 sts=4 + tags. + * @type bool + */ + private $_scriptFix = false; + + /** + * Cache of HTMLDefinition during HTML output to determine whether or + * not attributes should be minimized. + * @type HTMLPurifier_HTMLDefinition + */ + private $_def; + + /** + * Cache of %Output.SortAttr. + * @type bool + */ + private $_sortAttr; + + /** + * Cache of %Output.FlashCompat. + * @type bool + */ + private $_flashCompat; + + /** + * Cache of %Output.FixInnerHTML. + * @type bool + */ + private $_innerHTMLFix; + + /** + * Stack for keeping track of object information when outputting IE + * compatibility code. + * @type array + */ + private $_flashStack = array(); + + /** + * Configuration for the generator + * @type HTMLPurifier_Config + */ + protected $config; + + /** + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + */ + public function __construct($config, $context) + { + $this->config = $config; + $this->_scriptFix = $config->get('Output.CommentScriptContents'); + $this->_innerHTMLFix = $config->get('Output.FixInnerHTML'); + $this->_sortAttr = $config->get('Output.SortAttr'); + $this->_flashCompat = $config->get('Output.FlashCompat'); + $this->_def = $config->getHTMLDefinition(); + $this->_xhtml = $this->_def->doctype->xml; + } + + /** + * Generates HTML from an array of tokens. + * @param HTMLPurifier_Token[] $tokens Array of HTMLPurifier_Token + * @return string Generated HTML + */ + public function generateFromTokens($tokens) + { + if (!$tokens) { + return ''; + } + + // Basic algorithm + $html = ''; + for ($i = 0, $size = count($tokens); $i < $size; $i++) { + if ($this->_scriptFix && $tokens[$i]->name === 'script' + && $i + 2 < $size && $tokens[$i+2] instanceof HTMLPurifier_Token_End) { + // script special case + // the contents of the script block must be ONE token + // for this to work. + $html .= $this->generateFromToken($tokens[$i++]); + $html .= $this->generateScriptFromToken($tokens[$i++]); + } + $html .= $this->generateFromToken($tokens[$i]); + } + + // Tidy cleanup + if (extension_loaded('tidy') && $this->config->get('Output.TidyFormat')) { + $tidy = new Tidy; + $tidy->parseString( + $html, + array( + 'indent'=> true, + 'output-xhtml' => $this->_xhtml, + 'show-body-only' => true, + 'indent-spaces' => 2, + 'wrap' => 68, + ), + 'utf8' + ); + $tidy->cleanRepair(); + $html = (string) $tidy; // explicit cast necessary + } + + // Normalize newlines to system defined value + if ($this->config->get('Core.NormalizeNewlines')) { + $nl = $this->config->get('Output.Newline'); + if ($nl === null) { + $nl = PHP_EOL; + } + if ($nl !== "\n") { + $html = str_replace("\n", $nl, $html); + } + } + return $html; + } + + /** + * Generates HTML from a single token. + * @param HTMLPurifier_Token $token HTMLPurifier_Token object. + * @return string Generated HTML + */ + public function generateFromToken($token) + { + if (!$token instanceof HTMLPurifier_Token) { + trigger_error('Cannot generate HTML from non-HTMLPurifier_Token object', E_USER_WARNING); + return ''; + + } elseif ($token instanceof HTMLPurifier_Token_Start) { + $attr = $this->generateAttributes($token->attr, $token->name); + if ($this->_flashCompat) { + if ($token->name == "object") { + $flash = new stdclass(); + $flash->attr = $token->attr; + $flash->param = array(); + $this->_flashStack[] = $flash; + } + } + return '<' . $token->name . ($attr ? ' ' : '') . $attr . '>'; + + } elseif ($token instanceof HTMLPurifier_Token_End) { + $_extra = ''; + if ($this->_flashCompat) { + if ($token->name == "object" && !empty($this->_flashStack)) { + // doesn't do anything for now + } + } + return $_extra . 'name . '>'; + + } elseif ($token instanceof HTMLPurifier_Token_Empty) { + if ($this->_flashCompat && $token->name == "param" && !empty($this->_flashStack)) { + $this->_flashStack[count($this->_flashStack)-1]->param[$token->attr['name']] = $token->attr['value']; + } + $attr = $this->generateAttributes($token->attr, $token->name); + return '<' . $token->name . ($attr ? ' ' : '') . $attr . + ( $this->_xhtml ? ' /': '' ) //
v.
+ . '>'; + + } elseif ($token instanceof HTMLPurifier_Token_Text) { + return $this->escape($token->data, ENT_NOQUOTES); + + } elseif ($token instanceof HTMLPurifier_Token_Comment) { + return ''; + } else { + return ''; + + } + } + + /** + * Special case processor for the contents of script tags + * @param HTMLPurifier_Token $token HTMLPurifier_Token object. + * @return string + * @warning This runs into problems if there's already a literal + * --> somewhere inside the script contents. + */ + public function generateScriptFromToken($token) + { + if (!$token instanceof HTMLPurifier_Token_Text) { + return $this->generateFromToken($token); + } + // Thanks + $data = preg_replace('#//\s*$#', '', $token->data); + return ''; + } + + /** + * Generates attribute declarations from attribute array. + * @note This does not include the leading or trailing space. + * @param array $assoc_array_of_attributes Attribute array + * @param string $element Name of element attributes are for, used to check + * attribute minimization. + * @return string Generated HTML fragment for insertion. + */ + public function generateAttributes($assoc_array_of_attributes, $element = '') + { + $html = ''; + if ($this->_sortAttr) { + ksort($assoc_array_of_attributes); + } + foreach ($assoc_array_of_attributes as $key => $value) { + if (!$this->_xhtml) { + // Remove namespaced attributes + if (strpos($key, ':') !== false) { + continue; + } + // Check if we should minimize the attribute: val="val" -> val + if ($element && !empty($this->_def->info[$element]->attr[$key]->minimized)) { + $html .= $key . ' '; + continue; + } + } + // Workaround for Internet Explorer innerHTML bug. + // Essentially, Internet Explorer, when calculating + // innerHTML, omits quotes if there are no instances of + // angled brackets, quotes or spaces. However, when parsing + // HTML (for example, when you assign to innerHTML), it + // treats backticks as quotes. Thus, + // `` + // becomes + // `` + // becomes + // + // Fortunately, all we need to do is trigger an appropriate + // quoting style, which we do by adding an extra space. + // This also is consistent with the W3C spec, which states + // that user agents may ignore leading or trailing + // whitespace (in fact, most don't, at least for attributes + // like alt, but an extra space at the end is barely + // noticeable). Still, we have a configuration knob for + // this, since this transformation is not necesary if you + // don't process user input with innerHTML or you don't plan + // on supporting Internet Explorer. + if ($this->_innerHTMLFix) { + if (strpos($value, '`') !== false) { + // check if correct quoting style would not already be + // triggered + if (strcspn($value, '"\' <>') === strlen($value)) { + // protect! + $value .= ' '; + } + } + } + $html .= $key.'="'.$this->escape($value).'" '; + } + return rtrim($html); + } + + /** + * Escapes raw text data. + * @todo This really ought to be protected, but until we have a facility + * for properly generating HTML here w/o using tokens, it stays + * public. + * @param string $string String data to escape for HTML. + * @param int $quote Quoting style, like htmlspecialchars. ENT_NOQUOTES is + * permissible for non-attribute output. + * @return string escaped data. + */ + public function escape($string, $quote = null) + { + // Workaround for APC bug on Mac Leopard reported by sidepodcast + // http://htmlpurifier.org/phorum/read.php?3,4823,4846 + if ($quote === null) { + $quote = ENT_COMPAT; + } + return htmlspecialchars($string, $quote, 'UTF-8'); + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLDefinition.php b/thirdparty/HTMLPurifier/HTMLPurifier/HTMLDefinition.php similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLDefinition.php rename to thirdparty/HTMLPurifier/HTMLPurifier/HTMLDefinition.php index 027c85d56..9b7b334dd 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLDefinition.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/HTMLDefinition.php @@ -1,493 +1,493 @@ -getAnonymousModule(); - if (!isset($module->info[$element_name])) { - $element = $module->addBlankElement($element_name); - } else { - $element = $module->info[$element_name]; - } - $element->attr[$attr_name] = $def; - } - - /** - * Adds a custom element to your HTML definition - * @see HTMLPurifier_HTMLModule::addElement() for detailed - * parameter and return value descriptions. - */ - public function addElement($element_name, $type, $contents, $attr_collections, $attributes = array()) - { - $module = $this->getAnonymousModule(); - // assume that if the user is calling this, the element - // is safe. This may not be a good idea - $element = $module->addElement($element_name, $type, $contents, $attr_collections, $attributes); - return $element; - } - - /** - * Adds a blank element to your HTML definition, for overriding - * existing behavior - * @param string $element_name - * @return HTMLPurifier_ElementDef - * @see HTMLPurifier_HTMLModule::addBlankElement() for detailed - * parameter and return value descriptions. - */ - public function addBlankElement($element_name) - { - $module = $this->getAnonymousModule(); - $element = $module->addBlankElement($element_name); - return $element; - } - - /** - * Retrieves a reference to the anonymous module, so you can - * bust out advanced features without having to make your own - * module. - * @return HTMLPurifier_HTMLModule - */ - public function getAnonymousModule() - { - if (!$this->_anonModule) { - $this->_anonModule = new HTMLPurifier_HTMLModule(); - $this->_anonModule->name = 'Anonymous'; - } - return $this->_anonModule; - } - - private $_anonModule = null; - - // PUBLIC BUT INTERNAL VARIABLES -------------------------------------- - - /** - * @type string - */ - public $type = 'HTML'; - - /** - * @type HTMLPurifier_HTMLModuleManager - */ - public $manager; - - /** - * Performs low-cost, preliminary initialization. - */ - public function __construct() - { - $this->manager = new HTMLPurifier_HTMLModuleManager(); - } - - /** - * @param HTMLPurifier_Config $config - */ - protected function doSetup($config) - { - $this->processModules($config); - $this->setupConfigStuff($config); - unset($this->manager); - - // cleanup some of the element definitions - foreach ($this->info as $k => $v) { - unset($this->info[$k]->content_model); - unset($this->info[$k]->content_model_type); - } - } - - /** - * Extract out the information from the manager - * @param HTMLPurifier_Config $config - */ - protected function processModules($config) - { - if ($this->_anonModule) { - // for user specific changes - // this is late-loaded so we don't have to deal with PHP4 - // reference wonky-ness - $this->manager->addModule($this->_anonModule); - unset($this->_anonModule); - } - - $this->manager->setup($config); - $this->doctype = $this->manager->doctype; - - foreach ($this->manager->modules as $module) { - foreach ($module->info_tag_transform as $k => $v) { - if ($v === false) { - unset($this->info_tag_transform[$k]); - } else { - $this->info_tag_transform[$k] = $v; - } - } - foreach ($module->info_attr_transform_pre as $k => $v) { - if ($v === false) { - unset($this->info_attr_transform_pre[$k]); - } else { - $this->info_attr_transform_pre[$k] = $v; - } - } - foreach ($module->info_attr_transform_post as $k => $v) { - if ($v === false) { - unset($this->info_attr_transform_post[$k]); - } else { - $this->info_attr_transform_post[$k] = $v; - } - } - foreach ($module->info_injector as $k => $v) { - if ($v === false) { - unset($this->info_injector[$k]); - } else { - $this->info_injector[$k] = $v; - } - } - } - $this->info = $this->manager->getElements(); - $this->info_content_sets = $this->manager->contentSets->lookup; - } - - /** - * Sets up stuff based on config. We need a better way of doing this. - * @param HTMLPurifier_Config $config - */ - protected function setupConfigStuff($config) - { - $block_wrapper = $config->get('HTML.BlockWrapper'); - if (isset($this->info_content_sets['Block'][$block_wrapper])) { - $this->info_block_wrapper = $block_wrapper; - } else { - trigger_error( - 'Cannot use non-block element as block wrapper', - E_USER_ERROR - ); - } - - $parent = $config->get('HTML.Parent'); - $def = $this->manager->getElement($parent, true); - if ($def) { - $this->info_parent = $parent; - $this->info_parent_def = $def; - } else { - trigger_error( - 'Cannot use unrecognized element as parent', - E_USER_ERROR - ); - $this->info_parent_def = $this->manager->getElement($this->info_parent, true); - } - - // support template text - $support = "(for information on implementing this, see the support forums) "; - - // setup allowed elements ----------------------------------------- - - $allowed_elements = $config->get('HTML.AllowedElements'); - $allowed_attributes = $config->get('HTML.AllowedAttributes'); // retrieve early - - if (!is_array($allowed_elements) && !is_array($allowed_attributes)) { - $allowed = $config->get('HTML.Allowed'); - if (is_string($allowed)) { - list($allowed_elements, $allowed_attributes) = $this->parseTinyMCEAllowedList($allowed); - } - } - - if (is_array($allowed_elements)) { - foreach ($this->info as $name => $d) { - if (!isset($allowed_elements[$name])) { - unset($this->info[$name]); - } - unset($allowed_elements[$name]); - } - // emit errors - foreach ($allowed_elements as $element => $d) { - $element = htmlspecialchars($element); // PHP doesn't escape errors, be careful! - trigger_error("Element '$element' is not supported $support", E_USER_WARNING); - } - } - - // setup allowed attributes --------------------------------------- - - $allowed_attributes_mutable = $allowed_attributes; // by copy! - if (is_array($allowed_attributes)) { - // This actually doesn't do anything, since we went away from - // global attributes. It's possible that userland code uses - // it, but HTMLModuleManager doesn't! - foreach ($this->info_global_attr as $attr => $x) { - $keys = array($attr, "*@$attr", "*.$attr"); - $delete = true; - foreach ($keys as $key) { - if ($delete && isset($allowed_attributes[$key])) { - $delete = false; - } - if (isset($allowed_attributes_mutable[$key])) { - unset($allowed_attributes_mutable[$key]); - } - } - if ($delete) { - unset($this->info_global_attr[$attr]); - } - } - - foreach ($this->info as $tag => $info) { - foreach ($info->attr as $attr => $x) { - $keys = array("$tag@$attr", $attr, "*@$attr", "$tag.$attr", "*.$attr"); - $delete = true; - foreach ($keys as $key) { - if ($delete && isset($allowed_attributes[$key])) { - $delete = false; - } - if (isset($allowed_attributes_mutable[$key])) { - unset($allowed_attributes_mutable[$key]); - } - } - if ($delete) { - if ($this->info[$tag]->attr[$attr]->required) { - trigger_error( - "Required attribute '$attr' in element '$tag' " . - "was not allowed, which means '$tag' will not be allowed either", - E_USER_WARNING - ); - } - unset($this->info[$tag]->attr[$attr]); - } - } - } - // emit errors - foreach ($allowed_attributes_mutable as $elattr => $d) { - $bits = preg_split('/[.@]/', $elattr, 2); - $c = count($bits); - switch ($c) { - case 2: - if ($bits[0] !== '*') { - $element = htmlspecialchars($bits[0]); - $attribute = htmlspecialchars($bits[1]); - if (!isset($this->info[$element])) { - trigger_error( - "Cannot allow attribute '$attribute' if element " . - "'$element' is not allowed/supported $support" - ); - } else { - trigger_error( - "Attribute '$attribute' in element '$element' not supported $support", - E_USER_WARNING - ); - } - break; - } - // otherwise fall through - case 1: - $attribute = htmlspecialchars($bits[0]); - trigger_error( - "Global attribute '$attribute' is not ". - "supported in any elements $support", - E_USER_WARNING - ); - break; - } - } - } - - // setup forbidden elements --------------------------------------- - - $forbidden_elements = $config->get('HTML.ForbiddenElements'); - $forbidden_attributes = $config->get('HTML.ForbiddenAttributes'); - - foreach ($this->info as $tag => $info) { - if (isset($forbidden_elements[$tag])) { - unset($this->info[$tag]); - continue; - } - foreach ($info->attr as $attr => $x) { - if (isset($forbidden_attributes["$tag@$attr"]) || - isset($forbidden_attributes["*@$attr"]) || - isset($forbidden_attributes[$attr]) - ) { - unset($this->info[$tag]->attr[$attr]); - continue; - } elseif (isset($forbidden_attributes["$tag.$attr"])) { // this segment might get removed eventually - // $tag.$attr are not user supplied, so no worries! - trigger_error( - "Error with $tag.$attr: tag.attr syntax not supported for " . - "HTML.ForbiddenAttributes; use tag@attr instead", - E_USER_WARNING - ); - } - } - } - foreach ($forbidden_attributes as $key => $v) { - if (strlen($key) < 2) { - continue; - } - if ($key[0] != '*') { - continue; - } - if ($key[1] == '.') { - trigger_error( - "Error with $key: *.attr syntax not supported for HTML.ForbiddenAttributes; use attr instead", - E_USER_WARNING - ); - } - } - - // setup injectors ----------------------------------------------------- - foreach ($this->info_injector as $i => $injector) { - if ($injector->checkNeeded($config) !== false) { - // remove injector that does not have it's required - // elements/attributes present, and is thus not needed. - unset($this->info_injector[$i]); - } - } - } - - /** - * Parses a TinyMCE-flavored Allowed Elements and Attributes list into - * separate lists for processing. Format is element[attr1|attr2],element2... - * @warning Although it's largely drawn from TinyMCE's implementation, - * it is different, and you'll probably have to modify your lists - * @param array $list String list to parse - * @return array - * @todo Give this its own class, probably static interface - */ - public function parseTinyMCEAllowedList($list) - { - $list = str_replace(array(' ', "\t"), '', $list); - - $elements = array(); - $attributes = array(); - - $chunks = preg_split('/(,|[\n\r]+)/', $list); - foreach ($chunks as $chunk) { - if (empty($chunk)) { - continue; - } - // remove TinyMCE element control characters - if (!strpos($chunk, '[')) { - $element = $chunk; - $attr = false; - } else { - list($element, $attr) = explode('[', $chunk); - } - if ($element !== '*') { - $elements[$element] = true; - } - if (!$attr) { - continue; - } - $attr = substr($attr, 0, strlen($attr) - 1); // remove trailing ] - $attr = explode('|', $attr); - foreach ($attr as $key) { - $attributes["$element.$key"] = true; - } - } - return array($elements, $attributes); - } -} - -// vim: et sw=4 sts=4 +getAnonymousModule(); + if (!isset($module->info[$element_name])) { + $element = $module->addBlankElement($element_name); + } else { + $element = $module->info[$element_name]; + } + $element->attr[$attr_name] = $def; + } + + /** + * Adds a custom element to your HTML definition + * @see HTMLPurifier_HTMLModule::addElement() for detailed + * parameter and return value descriptions. + */ + public function addElement($element_name, $type, $contents, $attr_collections, $attributes = array()) + { + $module = $this->getAnonymousModule(); + // assume that if the user is calling this, the element + // is safe. This may not be a good idea + $element = $module->addElement($element_name, $type, $contents, $attr_collections, $attributes); + return $element; + } + + /** + * Adds a blank element to your HTML definition, for overriding + * existing behavior + * @param string $element_name + * @return HTMLPurifier_ElementDef + * @see HTMLPurifier_HTMLModule::addBlankElement() for detailed + * parameter and return value descriptions. + */ + public function addBlankElement($element_name) + { + $module = $this->getAnonymousModule(); + $element = $module->addBlankElement($element_name); + return $element; + } + + /** + * Retrieves a reference to the anonymous module, so you can + * bust out advanced features without having to make your own + * module. + * @return HTMLPurifier_HTMLModule + */ + public function getAnonymousModule() + { + if (!$this->_anonModule) { + $this->_anonModule = new HTMLPurifier_HTMLModule(); + $this->_anonModule->name = 'Anonymous'; + } + return $this->_anonModule; + } + + private $_anonModule = null; + + // PUBLIC BUT INTERNAL VARIABLES -------------------------------------- + + /** + * @type string + */ + public $type = 'HTML'; + + /** + * @type HTMLPurifier_HTMLModuleManager + */ + public $manager; + + /** + * Performs low-cost, preliminary initialization. + */ + public function __construct() + { + $this->manager = new HTMLPurifier_HTMLModuleManager(); + } + + /** + * @param HTMLPurifier_Config $config + */ + protected function doSetup($config) + { + $this->processModules($config); + $this->setupConfigStuff($config); + unset($this->manager); + + // cleanup some of the element definitions + foreach ($this->info as $k => $v) { + unset($this->info[$k]->content_model); + unset($this->info[$k]->content_model_type); + } + } + + /** + * Extract out the information from the manager + * @param HTMLPurifier_Config $config + */ + protected function processModules($config) + { + if ($this->_anonModule) { + // for user specific changes + // this is late-loaded so we don't have to deal with PHP4 + // reference wonky-ness + $this->manager->addModule($this->_anonModule); + unset($this->_anonModule); + } + + $this->manager->setup($config); + $this->doctype = $this->manager->doctype; + + foreach ($this->manager->modules as $module) { + foreach ($module->info_tag_transform as $k => $v) { + if ($v === false) { + unset($this->info_tag_transform[$k]); + } else { + $this->info_tag_transform[$k] = $v; + } + } + foreach ($module->info_attr_transform_pre as $k => $v) { + if ($v === false) { + unset($this->info_attr_transform_pre[$k]); + } else { + $this->info_attr_transform_pre[$k] = $v; + } + } + foreach ($module->info_attr_transform_post as $k => $v) { + if ($v === false) { + unset($this->info_attr_transform_post[$k]); + } else { + $this->info_attr_transform_post[$k] = $v; + } + } + foreach ($module->info_injector as $k => $v) { + if ($v === false) { + unset($this->info_injector[$k]); + } else { + $this->info_injector[$k] = $v; + } + } + } + $this->info = $this->manager->getElements(); + $this->info_content_sets = $this->manager->contentSets->lookup; + } + + /** + * Sets up stuff based on config. We need a better way of doing this. + * @param HTMLPurifier_Config $config + */ + protected function setupConfigStuff($config) + { + $block_wrapper = $config->get('HTML.BlockWrapper'); + if (isset($this->info_content_sets['Block'][$block_wrapper])) { + $this->info_block_wrapper = $block_wrapper; + } else { + trigger_error( + 'Cannot use non-block element as block wrapper', + E_USER_ERROR + ); + } + + $parent = $config->get('HTML.Parent'); + $def = $this->manager->getElement($parent, true); + if ($def) { + $this->info_parent = $parent; + $this->info_parent_def = $def; + } else { + trigger_error( + 'Cannot use unrecognized element as parent', + E_USER_ERROR + ); + $this->info_parent_def = $this->manager->getElement($this->info_parent, true); + } + + // support template text + $support = "(for information on implementing this, see the support forums) "; + + // setup allowed elements ----------------------------------------- + + $allowed_elements = $config->get('HTML.AllowedElements'); + $allowed_attributes = $config->get('HTML.AllowedAttributes'); // retrieve early + + if (!is_array($allowed_elements) && !is_array($allowed_attributes)) { + $allowed = $config->get('HTML.Allowed'); + if (is_string($allowed)) { + list($allowed_elements, $allowed_attributes) = $this->parseTinyMCEAllowedList($allowed); + } + } + + if (is_array($allowed_elements)) { + foreach ($this->info as $name => $d) { + if (!isset($allowed_elements[$name])) { + unset($this->info[$name]); + } + unset($allowed_elements[$name]); + } + // emit errors + foreach ($allowed_elements as $element => $d) { + $element = htmlspecialchars($element); // PHP doesn't escape errors, be careful! + trigger_error("Element '$element' is not supported $support", E_USER_WARNING); + } + } + + // setup allowed attributes --------------------------------------- + + $allowed_attributes_mutable = $allowed_attributes; // by copy! + if (is_array($allowed_attributes)) { + // This actually doesn't do anything, since we went away from + // global attributes. It's possible that userland code uses + // it, but HTMLModuleManager doesn't! + foreach ($this->info_global_attr as $attr => $x) { + $keys = array($attr, "*@$attr", "*.$attr"); + $delete = true; + foreach ($keys as $key) { + if ($delete && isset($allowed_attributes[$key])) { + $delete = false; + } + if (isset($allowed_attributes_mutable[$key])) { + unset($allowed_attributes_mutable[$key]); + } + } + if ($delete) { + unset($this->info_global_attr[$attr]); + } + } + + foreach ($this->info as $tag => $info) { + foreach ($info->attr as $attr => $x) { + $keys = array("$tag@$attr", $attr, "*@$attr", "$tag.$attr", "*.$attr"); + $delete = true; + foreach ($keys as $key) { + if ($delete && isset($allowed_attributes[$key])) { + $delete = false; + } + if (isset($allowed_attributes_mutable[$key])) { + unset($allowed_attributes_mutable[$key]); + } + } + if ($delete) { + if ($this->info[$tag]->attr[$attr]->required) { + trigger_error( + "Required attribute '$attr' in element '$tag' " . + "was not allowed, which means '$tag' will not be allowed either", + E_USER_WARNING + ); + } + unset($this->info[$tag]->attr[$attr]); + } + } + } + // emit errors + foreach ($allowed_attributes_mutable as $elattr => $d) { + $bits = preg_split('/[.@]/', $elattr, 2); + $c = count($bits); + switch ($c) { + case 2: + if ($bits[0] !== '*') { + $element = htmlspecialchars($bits[0]); + $attribute = htmlspecialchars($bits[1]); + if (!isset($this->info[$element])) { + trigger_error( + "Cannot allow attribute '$attribute' if element " . + "'$element' is not allowed/supported $support" + ); + } else { + trigger_error( + "Attribute '$attribute' in element '$element' not supported $support", + E_USER_WARNING + ); + } + break; + } + // otherwise fall through + case 1: + $attribute = htmlspecialchars($bits[0]); + trigger_error( + "Global attribute '$attribute' is not ". + "supported in any elements $support", + E_USER_WARNING + ); + break; + } + } + } + + // setup forbidden elements --------------------------------------- + + $forbidden_elements = $config->get('HTML.ForbiddenElements'); + $forbidden_attributes = $config->get('HTML.ForbiddenAttributes'); + + foreach ($this->info as $tag => $info) { + if (isset($forbidden_elements[$tag])) { + unset($this->info[$tag]); + continue; + } + foreach ($info->attr as $attr => $x) { + if (isset($forbidden_attributes["$tag@$attr"]) || + isset($forbidden_attributes["*@$attr"]) || + isset($forbidden_attributes[$attr]) + ) { + unset($this->info[$tag]->attr[$attr]); + continue; + } elseif (isset($forbidden_attributes["$tag.$attr"])) { // this segment might get removed eventually + // $tag.$attr are not user supplied, so no worries! + trigger_error( + "Error with $tag.$attr: tag.attr syntax not supported for " . + "HTML.ForbiddenAttributes; use tag@attr instead", + E_USER_WARNING + ); + } + } + } + foreach ($forbidden_attributes as $key => $v) { + if (strlen($key) < 2) { + continue; + } + if ($key[0] != '*') { + continue; + } + if ($key[1] == '.') { + trigger_error( + "Error with $key: *.attr syntax not supported for HTML.ForbiddenAttributes; use attr instead", + E_USER_WARNING + ); + } + } + + // setup injectors ----------------------------------------------------- + foreach ($this->info_injector as $i => $injector) { + if ($injector->checkNeeded($config) !== false) { + // remove injector that does not have it's required + // elements/attributes present, and is thus not needed. + unset($this->info_injector[$i]); + } + } + } + + /** + * Parses a TinyMCE-flavored Allowed Elements and Attributes list into + * separate lists for processing. Format is element[attr1|attr2],element2... + * @warning Although it's largely drawn from TinyMCE's implementation, + * it is different, and you'll probably have to modify your lists + * @param array $list String list to parse + * @return array + * @todo Give this its own class, probably static interface + */ + public function parseTinyMCEAllowedList($list) + { + $list = str_replace(array(' ', "\t"), '', $list); + + $elements = array(); + $attributes = array(); + + $chunks = preg_split('/(,|[\n\r]+)/', $list); + foreach ($chunks as $chunk) { + if (empty($chunk)) { + continue; + } + // remove TinyMCE element control characters + if (!strpos($chunk, '[')) { + $element = $chunk; + $attr = false; + } else { + list($element, $attr) = explode('[', $chunk); + } + if ($element !== '*') { + $elements[$element] = true; + } + if (!$attr) { + continue; + } + $attr = substr($attr, 0, strlen($attr) - 1); // remove trailing ] + $attr = explode('|', $attr); + foreach ($attr as $key) { + $attributes["$element.$key"] = true; + } + } + return array($elements, $attributes); + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule.php b/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule.php similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule.php rename to thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule.php index 9877f9efe..bb3a9230b 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule.php @@ -1,284 +1,284 @@ -info, since the object's data is only info, - * with extra behavior associated with it. - * @type array - */ - public $attr_collections = array(); - - /** - * Associative array of deprecated tag name to HTMLPurifier_TagTransform. - * @type array - */ - public $info_tag_transform = array(); - - /** - * List of HTMLPurifier_AttrTransform to be performed before validation. - * @type array - */ - public $info_attr_transform_pre = array(); - - /** - * List of HTMLPurifier_AttrTransform to be performed after validation. - * @type array - */ - public $info_attr_transform_post = array(); - - /** - * List of HTMLPurifier_Injector to be performed during well-formedness fixing. - * An injector will only be invoked if all of it's pre-requisites are met; - * if an injector fails setup, there will be no error; it will simply be - * silently disabled. - * @type array - */ - public $info_injector = array(); - - /** - * Boolean flag that indicates whether or not getChildDef is implemented. - * For optimization reasons: may save a call to a function. Be sure - * to set it if you do implement getChildDef(), otherwise it will have - * no effect! - * @type bool - */ - public $defines_child_def = false; - - /** - * Boolean flag whether or not this module is safe. If it is not safe, all - * of its members are unsafe. Modules are safe by default (this might be - * slightly dangerous, but it doesn't make much sense to force HTML Purifier, - * which is based off of safe HTML, to explicitly say, "This is safe," even - * though there are modules which are "unsafe") - * - * @type bool - * @note Previously, safety could be applied at an element level granularity. - * We've removed this ability, so in order to add "unsafe" elements - * or attributes, a dedicated module with this property set to false - * must be used. - */ - public $safe = true; - - /** - * Retrieves a proper HTMLPurifier_ChildDef subclass based on - * content_model and content_model_type member variables of - * the HTMLPurifier_ElementDef class. There is a similar function - * in HTMLPurifier_HTMLDefinition. - * @param HTMLPurifier_ElementDef $def - * @return HTMLPurifier_ChildDef subclass - */ - public function getChildDef($def) - { - return false; - } - - // -- Convenience ----------------------------------------------------- - - /** - * Convenience function that sets up a new element - * @param string $element Name of element to add - * @param string|bool $type What content set should element be registered to? - * Set as false to skip this step. - * @param string $contents Allowed children in form of: - * "$content_model_type: $content_model" - * @param array $attr_includes What attribute collections to register to - * element? - * @param array $attr What unique attributes does the element define? - * @see HTMLPurifier_ElementDef:: for in-depth descriptions of these parameters. - * @return HTMLPurifier_ElementDef Created element definition object, so you - * can set advanced parameters - */ - public function addElement($element, $type, $contents, $attr_includes = array(), $attr = array()) - { - $this->elements[] = $element; - // parse content_model - list($content_model_type, $content_model) = $this->parseContents($contents); - // merge in attribute inclusions - $this->mergeInAttrIncludes($attr, $attr_includes); - // add element to content sets - if ($type) { - $this->addElementToContentSet($element, $type); - } - // create element - $this->info[$element] = HTMLPurifier_ElementDef::create( - $content_model, - $content_model_type, - $attr - ); - // literal object $contents means direct child manipulation - if (!is_string($contents)) { - $this->info[$element]->child = $contents; - } - return $this->info[$element]; - } - - /** - * Convenience function that creates a totally blank, non-standalone - * element. - * @param string $element Name of element to create - * @return HTMLPurifier_ElementDef Created element - */ - public function addBlankElement($element) - { - if (!isset($this->info[$element])) { - $this->elements[] = $element; - $this->info[$element] = new HTMLPurifier_ElementDef(); - $this->info[$element]->standalone = false; - } else { - trigger_error("Definition for $element already exists in module, cannot redefine"); - } - return $this->info[$element]; - } - - /** - * Convenience function that registers an element to a content set - * @param string $element Element to register - * @param string $type Name content set (warning: case sensitive, usually upper-case - * first letter) - */ - public function addElementToContentSet($element, $type) - { - if (!isset($this->content_sets[$type])) { - $this->content_sets[$type] = ''; - } else { - $this->content_sets[$type] .= ' | '; - } - $this->content_sets[$type] .= $element; - } - - /** - * Convenience function that transforms single-string contents - * into separate content model and content model type - * @param string $contents Allowed children in form of: - * "$content_model_type: $content_model" - * @return array - * @note If contents is an object, an array of two nulls will be - * returned, and the callee needs to take the original $contents - * and use it directly. - */ - public function parseContents($contents) - { - if (!is_string($contents)) { - return array(null, null); - } // defer - switch ($contents) { - // check for shorthand content model forms - case 'Empty': - return array('empty', ''); - case 'Inline': - return array('optional', 'Inline | #PCDATA'); - case 'Flow': - return array('optional', 'Flow | #PCDATA'); - } - list($content_model_type, $content_model) = explode(':', $contents); - $content_model_type = strtolower(trim($content_model_type)); - $content_model = trim($content_model); - return array($content_model_type, $content_model); - } - - /** - * Convenience function that merges a list of attribute includes into - * an attribute array. - * @param array $attr Reference to attr array to modify - * @param array $attr_includes Array of includes / string include to merge in - */ - public function mergeInAttrIncludes(&$attr, $attr_includes) - { - if (!is_array($attr_includes)) { - if (empty($attr_includes)) { - $attr_includes = array(); - } else { - $attr_includes = array($attr_includes); - } - } - $attr[0] = $attr_includes; - } - - /** - * Convenience function that generates a lookup table with boolean - * true as value. - * @param string $list List of values to turn into a lookup - * @note You can also pass an arbitrary number of arguments in - * place of the regular argument - * @return array array equivalent of list - */ - public function makeLookup($list) - { - if (is_string($list)) { - $list = func_get_args(); - } - $ret = array(); - foreach ($list as $value) { - if (is_null($value)) { - continue; - } - $ret[$value] = true; - } - return $ret; - } - - /** - * Lazy load construction of the module after determining whether - * or not it's needed, and also when a finalized configuration object - * is available. - * @param HTMLPurifier_Config $config - */ - public function setup($config) - { - } -} - -// vim: et sw=4 sts=4 +info, since the object's data is only info, + * with extra behavior associated with it. + * @type array + */ + public $attr_collections = array(); + + /** + * Associative array of deprecated tag name to HTMLPurifier_TagTransform. + * @type array + */ + public $info_tag_transform = array(); + + /** + * List of HTMLPurifier_AttrTransform to be performed before validation. + * @type array + */ + public $info_attr_transform_pre = array(); + + /** + * List of HTMLPurifier_AttrTransform to be performed after validation. + * @type array + */ + public $info_attr_transform_post = array(); + + /** + * List of HTMLPurifier_Injector to be performed during well-formedness fixing. + * An injector will only be invoked if all of it's pre-requisites are met; + * if an injector fails setup, there will be no error; it will simply be + * silently disabled. + * @type array + */ + public $info_injector = array(); + + /** + * Boolean flag that indicates whether or not getChildDef is implemented. + * For optimization reasons: may save a call to a function. Be sure + * to set it if you do implement getChildDef(), otherwise it will have + * no effect! + * @type bool + */ + public $defines_child_def = false; + + /** + * Boolean flag whether or not this module is safe. If it is not safe, all + * of its members are unsafe. Modules are safe by default (this might be + * slightly dangerous, but it doesn't make much sense to force HTML Purifier, + * which is based off of safe HTML, to explicitly say, "This is safe," even + * though there are modules which are "unsafe") + * + * @type bool + * @note Previously, safety could be applied at an element level granularity. + * We've removed this ability, so in order to add "unsafe" elements + * or attributes, a dedicated module with this property set to false + * must be used. + */ + public $safe = true; + + /** + * Retrieves a proper HTMLPurifier_ChildDef subclass based on + * content_model and content_model_type member variables of + * the HTMLPurifier_ElementDef class. There is a similar function + * in HTMLPurifier_HTMLDefinition. + * @param HTMLPurifier_ElementDef $def + * @return HTMLPurifier_ChildDef subclass + */ + public function getChildDef($def) + { + return false; + } + + // -- Convenience ----------------------------------------------------- + + /** + * Convenience function that sets up a new element + * @param string $element Name of element to add + * @param string|bool $type What content set should element be registered to? + * Set as false to skip this step. + * @param string $contents Allowed children in form of: + * "$content_model_type: $content_model" + * @param array $attr_includes What attribute collections to register to + * element? + * @param array $attr What unique attributes does the element define? + * @see HTMLPurifier_ElementDef:: for in-depth descriptions of these parameters. + * @return HTMLPurifier_ElementDef Created element definition object, so you + * can set advanced parameters + */ + public function addElement($element, $type, $contents, $attr_includes = array(), $attr = array()) + { + $this->elements[] = $element; + // parse content_model + list($content_model_type, $content_model) = $this->parseContents($contents); + // merge in attribute inclusions + $this->mergeInAttrIncludes($attr, $attr_includes); + // add element to content sets + if ($type) { + $this->addElementToContentSet($element, $type); + } + // create element + $this->info[$element] = HTMLPurifier_ElementDef::create( + $content_model, + $content_model_type, + $attr + ); + // literal object $contents means direct child manipulation + if (!is_string($contents)) { + $this->info[$element]->child = $contents; + } + return $this->info[$element]; + } + + /** + * Convenience function that creates a totally blank, non-standalone + * element. + * @param string $element Name of element to create + * @return HTMLPurifier_ElementDef Created element + */ + public function addBlankElement($element) + { + if (!isset($this->info[$element])) { + $this->elements[] = $element; + $this->info[$element] = new HTMLPurifier_ElementDef(); + $this->info[$element]->standalone = false; + } else { + trigger_error("Definition for $element already exists in module, cannot redefine"); + } + return $this->info[$element]; + } + + /** + * Convenience function that registers an element to a content set + * @param string $element Element to register + * @param string $type Name content set (warning: case sensitive, usually upper-case + * first letter) + */ + public function addElementToContentSet($element, $type) + { + if (!isset($this->content_sets[$type])) { + $this->content_sets[$type] = ''; + } else { + $this->content_sets[$type] .= ' | '; + } + $this->content_sets[$type] .= $element; + } + + /** + * Convenience function that transforms single-string contents + * into separate content model and content model type + * @param string $contents Allowed children in form of: + * "$content_model_type: $content_model" + * @return array + * @note If contents is an object, an array of two nulls will be + * returned, and the callee needs to take the original $contents + * and use it directly. + */ + public function parseContents($contents) + { + if (!is_string($contents)) { + return array(null, null); + } // defer + switch ($contents) { + // check for shorthand content model forms + case 'Empty': + return array('empty', ''); + case 'Inline': + return array('optional', 'Inline | #PCDATA'); + case 'Flow': + return array('optional', 'Flow | #PCDATA'); + } + list($content_model_type, $content_model) = explode(':', $contents); + $content_model_type = strtolower(trim($content_model_type)); + $content_model = trim($content_model); + return array($content_model_type, $content_model); + } + + /** + * Convenience function that merges a list of attribute includes into + * an attribute array. + * @param array $attr Reference to attr array to modify + * @param array $attr_includes Array of includes / string include to merge in + */ + public function mergeInAttrIncludes(&$attr, $attr_includes) + { + if (!is_array($attr_includes)) { + if (empty($attr_includes)) { + $attr_includes = array(); + } else { + $attr_includes = array($attr_includes); + } + } + $attr[0] = $attr_includes; + } + + /** + * Convenience function that generates a lookup table with boolean + * true as value. + * @param string $list List of values to turn into a lookup + * @note You can also pass an arbitrary number of arguments in + * place of the regular argument + * @return array array equivalent of list + */ + public function makeLookup($list) + { + if (is_string($list)) { + $list = func_get_args(); + } + $ret = array(); + foreach ($list as $value) { + if (is_null($value)) { + continue; + } + $ret[$value] = true; + } + return $ret; + } + + /** + * Lazy load construction of the module after determining whether + * or not it's needed, and also when a finalized configuration object + * is available. + * @param HTMLPurifier_Config $config + */ + public function setup($config) + { + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Bdo.php b/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Bdo.php similarity index 95% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Bdo.php rename to thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Bdo.php index 191a78d1c..1e67c790d 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Bdo.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Bdo.php @@ -1,44 +1,44 @@ - array('dir' => false) - ); - - /** - * @param HTMLPurifier_Config $config - */ - public function setup($config) - { - $bdo = $this->addElement( - 'bdo', - 'Inline', - 'Inline', - array('Core', 'Lang'), - array( - 'dir' => 'Enum#ltr,rtl', // required - // The Abstract Module specification has the attribute - // inclusions wrong for bdo: bdo allows Lang - ) - ); - $bdo->attr_transform_post[] = new HTMLPurifier_AttrTransform_BdoDir(); - - $this->attr_collections['I18N']['dir'] = 'Enum#ltr,rtl'; - } -} - -// vim: et sw=4 sts=4 + array('dir' => false) + ); + + /** + * @param HTMLPurifier_Config $config + */ + public function setup($config) + { + $bdo = $this->addElement( + 'bdo', + 'Inline', + 'Inline', + array('Core', 'Lang'), + array( + 'dir' => 'Enum#ltr,rtl', // required + // The Abstract Module specification has the attribute + // inclusions wrong for bdo: bdo allows Lang + ) + ); + $bdo->attr_transform_post[] = new HTMLPurifier_AttrTransform_BdoDir(); + + $this->attr_collections['I18N']['dir'] = 'Enum#ltr,rtl'; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/CommonAttributes.php b/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/CommonAttributes.php similarity index 95% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/CommonAttributes.php rename to thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/CommonAttributes.php index e2fe53fc8..a96ab1bef 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/CommonAttributes.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/CommonAttributes.php @@ -1,31 +1,31 @@ - array( - 0 => array('Style'), - // 'xml:space' => false, - 'class' => 'Class', - 'id' => 'ID', - 'title' => 'CDATA', - ), - 'Lang' => array(), - 'I18N' => array( - 0 => array('Lang'), // proprietary, for xml:lang/lang - ), - 'Common' => array( - 0 => array('Core', 'I18N') - ) - ); -} - -// vim: et sw=4 sts=4 + array( + 0 => array('Style'), + // 'xml:space' => false, + 'class' => 'Class', + 'id' => 'ID', + 'title' => 'CDATA', + ), + 'Lang' => array(), + 'I18N' => array( + 0 => array('Lang'), // proprietary, for xml:lang/lang + ), + 'Common' => array( + 0 => array('Core', 'I18N') + ) + ); +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Edit.php b/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Edit.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Edit.php rename to thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Edit.php index b8288368c..a9042a357 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Edit.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Edit.php @@ -1,55 +1,55 @@ - 'URI', - // 'datetime' => 'Datetime', // not implemented - ); - $this->addElement('del', 'Inline', $contents, 'Common', $attr); - $this->addElement('ins', 'Inline', $contents, 'Common', $attr); - } - - // HTML 4.01 specifies that ins/del must not contain block - // elements when used in an inline context, chameleon is - // a complicated workaround to acheive this effect - - // Inline context ! Block context (exclamation mark is - // separator, see getChildDef for parsing) - - /** - * @type bool - */ - public $defines_child_def = true; - - /** - * @param HTMLPurifier_ElementDef $def - * @return HTMLPurifier_ChildDef_Chameleon - */ - public function getChildDef($def) - { - if ($def->content_model_type != 'chameleon') { - return false; - } - $value = explode('!', $def->content_model); - return new HTMLPurifier_ChildDef_Chameleon($value[0], $value[1]); - } -} - -// vim: et sw=4 sts=4 + 'URI', + // 'datetime' => 'Datetime', // not implemented + ); + $this->addElement('del', 'Inline', $contents, 'Common', $attr); + $this->addElement('ins', 'Inline', $contents, 'Common', $attr); + } + + // HTML 4.01 specifies that ins/del must not contain block + // elements when used in an inline context, chameleon is + // a complicated workaround to acheive this effect + + // Inline context ! Block context (exclamation mark is + // separator, see getChildDef for parsing) + + /** + * @type bool + */ + public $defines_child_def = true; + + /** + * @param HTMLPurifier_ElementDef $def + * @return HTMLPurifier_ChildDef_Chameleon + */ + public function getChildDef($def) + { + if ($def->content_model_type != 'chameleon') { + return false; + } + $value = explode('!', $def->content_model); + return new HTMLPurifier_ChildDef_Chameleon($value[0], $value[1]); + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Forms.php b/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Forms.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Forms.php rename to thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Forms.php index 13ce6ad5d..6f7ddbc05 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Forms.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Forms.php @@ -1,190 +1,190 @@ - 'Form', - 'Inline' => 'Formctrl', - ); - - /** - * @param HTMLPurifier_Config $config - */ - public function setup($config) - { - $form = $this->addElement( - 'form', - 'Form', - 'Required: Heading | List | Block | fieldset', - 'Common', - array( - 'accept' => 'ContentTypes', - 'accept-charset' => 'Charsets', - 'action*' => 'URI', - 'method' => 'Enum#get,post', - // really ContentType, but these two are the only ones used today - 'enctype' => 'Enum#application/x-www-form-urlencoded,multipart/form-data', - ) - ); - $form->excludes = array('form' => true); - - $input = $this->addElement( - 'input', - 'Formctrl', - 'Empty', - 'Common', - array( - 'accept' => 'ContentTypes', - 'accesskey' => 'Character', - 'alt' => 'Text', - 'checked' => 'Bool#checked', - 'disabled' => 'Bool#disabled', - 'maxlength' => 'Number', - 'name' => 'CDATA', - 'readonly' => 'Bool#readonly', - 'size' => 'Number', - 'src' => 'URI#embedded', - 'tabindex' => 'Number', - 'type' => 'Enum#text,password,checkbox,button,radio,submit,reset,file,hidden,image', - 'value' => 'CDATA', - ) - ); - $input->attr_transform_post[] = new HTMLPurifier_AttrTransform_Input(); - - $this->addElement( - 'select', - 'Formctrl', - 'Required: optgroup | option', - 'Common', - array( - 'disabled' => 'Bool#disabled', - 'multiple' => 'Bool#multiple', - 'name' => 'CDATA', - 'size' => 'Number', - 'tabindex' => 'Number', - ) - ); - - $this->addElement( - 'option', - false, - 'Optional: #PCDATA', - 'Common', - array( - 'disabled' => 'Bool#disabled', - 'label' => 'Text', - 'selected' => 'Bool#selected', - 'value' => 'CDATA', - ) - ); - // It's illegal for there to be more than one selected, but not - // be multiple. Also, no selected means undefined behavior. This might - // be difficult to implement; perhaps an injector, or a context variable. - - $textarea = $this->addElement( - 'textarea', - 'Formctrl', - 'Optional: #PCDATA', - 'Common', - array( - 'accesskey' => 'Character', - 'cols*' => 'Number', - 'disabled' => 'Bool#disabled', - 'name' => 'CDATA', - 'readonly' => 'Bool#readonly', - 'rows*' => 'Number', - 'tabindex' => 'Number', - ) - ); - $textarea->attr_transform_pre[] = new HTMLPurifier_AttrTransform_Textarea(); - - $button = $this->addElement( - 'button', - 'Formctrl', - 'Optional: #PCDATA | Heading | List | Block | Inline', - 'Common', - array( - 'accesskey' => 'Character', - 'disabled' => 'Bool#disabled', - 'name' => 'CDATA', - 'tabindex' => 'Number', - 'type' => 'Enum#button,submit,reset', - 'value' => 'CDATA', - ) - ); - - // For exclusions, ideally we'd specify content sets, not literal elements - $button->excludes = $this->makeLookup( - 'form', - 'fieldset', // Form - 'input', - 'select', - 'textarea', - 'label', - 'button', // Formctrl - 'a', // as per HTML 4.01 spec, this is omitted by modularization - 'isindex', - 'iframe' // legacy items - ); - - // Extra exclusion: img usemap="" is not permitted within this element. - // We'll omit this for now, since we don't have any good way of - // indicating it yet. - - // This is HIGHLY user-unfriendly; we need a custom child-def for this - $this->addElement('fieldset', 'Form', 'Custom: (#WS?,legend,(Flow|#PCDATA)*)', 'Common'); - - $label = $this->addElement( - 'label', - 'Formctrl', - 'Optional: #PCDATA | Inline', - 'Common', - array( - 'accesskey' => 'Character', - // 'for' => 'IDREF', // IDREF not implemented, cannot allow - ) - ); - $label->excludes = array('label' => true); - - $this->addElement( - 'legend', - false, - 'Optional: #PCDATA | Inline', - 'Common', - array( - 'accesskey' => 'Character', - ) - ); - - $this->addElement( - 'optgroup', - false, - 'Required: option', - 'Common', - array( - 'disabled' => 'Bool#disabled', - 'label*' => 'Text', - ) - ); - // Don't forget an injector for . This one's a little complex - // because it maps to multiple elements. - } -} - -// vim: et sw=4 sts=4 + 'Form', + 'Inline' => 'Formctrl', + ); + + /** + * @param HTMLPurifier_Config $config + */ + public function setup($config) + { + $form = $this->addElement( + 'form', + 'Form', + 'Required: Heading | List | Block | fieldset', + 'Common', + array( + 'accept' => 'ContentTypes', + 'accept-charset' => 'Charsets', + 'action*' => 'URI', + 'method' => 'Enum#get,post', + // really ContentType, but these two are the only ones used today + 'enctype' => 'Enum#application/x-www-form-urlencoded,multipart/form-data', + ) + ); + $form->excludes = array('form' => true); + + $input = $this->addElement( + 'input', + 'Formctrl', + 'Empty', + 'Common', + array( + 'accept' => 'ContentTypes', + 'accesskey' => 'Character', + 'alt' => 'Text', + 'checked' => 'Bool#checked', + 'disabled' => 'Bool#disabled', + 'maxlength' => 'Number', + 'name' => 'CDATA', + 'readonly' => 'Bool#readonly', + 'size' => 'Number', + 'src' => 'URI#embedded', + 'tabindex' => 'Number', + 'type' => 'Enum#text,password,checkbox,button,radio,submit,reset,file,hidden,image', + 'value' => 'CDATA', + ) + ); + $input->attr_transform_post[] = new HTMLPurifier_AttrTransform_Input(); + + $this->addElement( + 'select', + 'Formctrl', + 'Required: optgroup | option', + 'Common', + array( + 'disabled' => 'Bool#disabled', + 'multiple' => 'Bool#multiple', + 'name' => 'CDATA', + 'size' => 'Number', + 'tabindex' => 'Number', + ) + ); + + $this->addElement( + 'option', + false, + 'Optional: #PCDATA', + 'Common', + array( + 'disabled' => 'Bool#disabled', + 'label' => 'Text', + 'selected' => 'Bool#selected', + 'value' => 'CDATA', + ) + ); + // It's illegal for there to be more than one selected, but not + // be multiple. Also, no selected means undefined behavior. This might + // be difficult to implement; perhaps an injector, or a context variable. + + $textarea = $this->addElement( + 'textarea', + 'Formctrl', + 'Optional: #PCDATA', + 'Common', + array( + 'accesskey' => 'Character', + 'cols*' => 'Number', + 'disabled' => 'Bool#disabled', + 'name' => 'CDATA', + 'readonly' => 'Bool#readonly', + 'rows*' => 'Number', + 'tabindex' => 'Number', + ) + ); + $textarea->attr_transform_pre[] = new HTMLPurifier_AttrTransform_Textarea(); + + $button = $this->addElement( + 'button', + 'Formctrl', + 'Optional: #PCDATA | Heading | List | Block | Inline', + 'Common', + array( + 'accesskey' => 'Character', + 'disabled' => 'Bool#disabled', + 'name' => 'CDATA', + 'tabindex' => 'Number', + 'type' => 'Enum#button,submit,reset', + 'value' => 'CDATA', + ) + ); + + // For exclusions, ideally we'd specify content sets, not literal elements + $button->excludes = $this->makeLookup( + 'form', + 'fieldset', // Form + 'input', + 'select', + 'textarea', + 'label', + 'button', // Formctrl + 'a', // as per HTML 4.01 spec, this is omitted by modularization + 'isindex', + 'iframe' // legacy items + ); + + // Extra exclusion: img usemap="" is not permitted within this element. + // We'll omit this for now, since we don't have any good way of + // indicating it yet. + + // This is HIGHLY user-unfriendly; we need a custom child-def for this + $this->addElement('fieldset', 'Form', 'Custom: (#WS?,legend,(Flow|#PCDATA)*)', 'Common'); + + $label = $this->addElement( + 'label', + 'Formctrl', + 'Optional: #PCDATA | Inline', + 'Common', + array( + 'accesskey' => 'Character', + // 'for' => 'IDREF', // IDREF not implemented, cannot allow + ) + ); + $label->excludes = array('label' => true); + + $this->addElement( + 'legend', + false, + 'Optional: #PCDATA | Inline', + 'Common', + array( + 'accesskey' => 'Character', + ) + ); + + $this->addElement( + 'optgroup', + false, + 'Required: option', + 'Common', + array( + 'disabled' => 'Bool#disabled', + 'label*' => 'Text', + ) + ); + // Don't forget an injector for . This one's a little complex + // because it maps to multiple elements. + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Hypertext.php b/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Hypertext.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Hypertext.php rename to thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Hypertext.php index 968c07e98..72d7a31e6 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Hypertext.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Hypertext.php @@ -1,40 +1,40 @@ -addElement( - 'a', - 'Inline', - 'Inline', - 'Common', - array( - // 'accesskey' => 'Character', - // 'charset' => 'Charset', - 'href' => 'URI', - // 'hreflang' => 'LanguageCode', - 'rel' => new HTMLPurifier_AttrDef_HTML_LinkTypes('rel'), - 'rev' => new HTMLPurifier_AttrDef_HTML_LinkTypes('rev'), - // 'tabindex' => 'Number', - // 'type' => 'ContentType', - ) - ); - $a->formatting = true; - $a->excludes = array('a' => true); - } -} - -// vim: et sw=4 sts=4 +addElement( + 'a', + 'Inline', + 'Inline', + 'Common', + array( + // 'accesskey' => 'Character', + // 'charset' => 'Charset', + 'href' => 'URI', + // 'hreflang' => 'LanguageCode', + 'rel' => new HTMLPurifier_AttrDef_HTML_LinkTypes('rel'), + 'rev' => new HTMLPurifier_AttrDef_HTML_LinkTypes('rev'), + // 'tabindex' => 'Number', + // 'type' => 'ContentType', + ) + ); + $a->formatting = true; + $a->excludes = array('a' => true); + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Iframe.php b/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Iframe.php similarity index 95% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Iframe.php rename to thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Iframe.php index 2c9bdc580..f7e7c91c0 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Iframe.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Iframe.php @@ -1,51 +1,51 @@ -get('HTML.SafeIframe')) { - $this->safe = true; - } - $this->addElement( - 'iframe', - 'Inline', - 'Flow', - 'Common', - array( - 'src' => 'URI#embedded', - 'width' => 'Length', - 'height' => 'Length', - 'name' => 'ID', - 'scrolling' => 'Enum#yes,no,auto', - 'frameborder' => 'Enum#0,1', - 'longdesc' => 'URI', - 'marginheight' => 'Pixels', - 'marginwidth' => 'Pixels', - ) - ); - } -} - -// vim: et sw=4 sts=4 +get('HTML.SafeIframe')) { + $this->safe = true; + } + $this->addElement( + 'iframe', + 'Inline', + 'Flow', + 'Common', + array( + 'src' => 'URI#embedded', + 'width' => 'Length', + 'height' => 'Length', + 'name' => 'ID', + 'scrolling' => 'Enum#yes,no,auto', + 'frameborder' => 'Enum#0,1', + 'longdesc' => 'URI', + 'marginheight' => 'Pixels', + 'marginwidth' => 'Pixels', + ) + ); + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Image.php b/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Image.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Image.php rename to thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Image.php index 0ed7411e7..0f5fdb3ba 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Image.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Image.php @@ -1,49 +1,49 @@ -get('HTML.MaxImgLength'); - $img = $this->addElement( - 'img', - 'Inline', - 'Empty', - 'Common', - array( - 'alt*' => 'Text', - // According to the spec, it's Length, but percents can - // be abused, so we allow only Pixels. - 'height' => 'Pixels#' . $max, - 'width' => 'Pixels#' . $max, - 'longdesc' => 'URI', - 'src*' => new HTMLPurifier_AttrDef_URI(true), // embedded - ) - ); - if ($max === null || $config->get('HTML.Trusted')) { - $img->attr['height'] = - $img->attr['width'] = 'Length'; - } - - // kind of strange, but splitting things up would be inefficient - $img->attr_transform_pre[] = - $img->attr_transform_post[] = - new HTMLPurifier_AttrTransform_ImgRequired(); - } -} - -// vim: et sw=4 sts=4 +get('HTML.MaxImgLength'); + $img = $this->addElement( + 'img', + 'Inline', + 'Empty', + 'Common', + array( + 'alt*' => 'Text', + // According to the spec, it's Length, but percents can + // be abused, so we allow only Pixels. + 'height' => 'Pixels#' . $max, + 'width' => 'Pixels#' . $max, + 'longdesc' => 'URI', + 'src*' => new HTMLPurifier_AttrDef_URI(true), // embedded + ) + ); + if ($max === null || $config->get('HTML.Trusted')) { + $img->attr['height'] = + $img->attr['width'] = 'Length'; + } + + // kind of strange, but splitting things up would be inefficient + $img->attr_transform_pre[] = + $img->attr_transform_post[] = + new HTMLPurifier_AttrTransform_ImgRequired(); + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Legacy.php b/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Legacy.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Legacy.php rename to thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Legacy.php index 9ca1cb375..86b529957 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Legacy.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Legacy.php @@ -1,186 +1,186 @@ -addElement( - 'basefont', - 'Inline', - 'Empty', - null, - array( - 'color' => 'Color', - 'face' => 'Text', // extremely broad, we should - 'size' => 'Text', // tighten it - 'id' => 'ID' - ) - ); - $this->addElement('center', 'Block', 'Flow', 'Common'); - $this->addElement( - 'dir', - 'Block', - 'Required: li', - 'Common', - array( - 'compact' => 'Bool#compact' - ) - ); - $this->addElement( - 'font', - 'Inline', - 'Inline', - array('Core', 'I18N'), - array( - 'color' => 'Color', - 'face' => 'Text', // extremely broad, we should - 'size' => 'Text', // tighten it - ) - ); - $this->addElement( - 'menu', - 'Block', - 'Required: li', - 'Common', - array( - 'compact' => 'Bool#compact' - ) - ); - - $s = $this->addElement('s', 'Inline', 'Inline', 'Common'); - $s->formatting = true; - - $strike = $this->addElement('strike', 'Inline', 'Inline', 'Common'); - $strike->formatting = true; - - $u = $this->addElement('u', 'Inline', 'Inline', 'Common'); - $u->formatting = true; - - // setup modifications to old elements - - $align = 'Enum#left,right,center,justify'; - - $address = $this->addBlankElement('address'); - $address->content_model = 'Inline | #PCDATA | p'; - $address->content_model_type = 'optional'; - $address->child = false; - - $blockquote = $this->addBlankElement('blockquote'); - $blockquote->content_model = 'Flow | #PCDATA'; - $blockquote->content_model_type = 'optional'; - $blockquote->child = false; - - $br = $this->addBlankElement('br'); - $br->attr['clear'] = 'Enum#left,all,right,none'; - - $caption = $this->addBlankElement('caption'); - $caption->attr['align'] = 'Enum#top,bottom,left,right'; - - $div = $this->addBlankElement('div'); - $div->attr['align'] = $align; - - $dl = $this->addBlankElement('dl'); - $dl->attr['compact'] = 'Bool#compact'; - - for ($i = 1; $i <= 6; $i++) { - $h = $this->addBlankElement("h$i"); - $h->attr['align'] = $align; - } - - $hr = $this->addBlankElement('hr'); - $hr->attr['align'] = $align; - $hr->attr['noshade'] = 'Bool#noshade'; - $hr->attr['size'] = 'Pixels'; - $hr->attr['width'] = 'Length'; - - $img = $this->addBlankElement('img'); - $img->attr['align'] = 'IAlign'; - $img->attr['border'] = 'Pixels'; - $img->attr['hspace'] = 'Pixels'; - $img->attr['vspace'] = 'Pixels'; - - // figure out this integer business - - $li = $this->addBlankElement('li'); - $li->attr['value'] = new HTMLPurifier_AttrDef_Integer(); - $li->attr['type'] = 'Enum#s:1,i,I,a,A,disc,square,circle'; - - $ol = $this->addBlankElement('ol'); - $ol->attr['compact'] = 'Bool#compact'; - $ol->attr['start'] = new HTMLPurifier_AttrDef_Integer(); - $ol->attr['type'] = 'Enum#s:1,i,I,a,A'; - - $p = $this->addBlankElement('p'); - $p->attr['align'] = $align; - - $pre = $this->addBlankElement('pre'); - $pre->attr['width'] = 'Number'; - - // script omitted - - $table = $this->addBlankElement('table'); - $table->attr['align'] = 'Enum#left,center,right'; - $table->attr['bgcolor'] = 'Color'; - - $tr = $this->addBlankElement('tr'); - $tr->attr['bgcolor'] = 'Color'; - - $th = $this->addBlankElement('th'); - $th->attr['bgcolor'] = 'Color'; - $th->attr['height'] = 'Length'; - $th->attr['nowrap'] = 'Bool#nowrap'; - $th->attr['width'] = 'Length'; - - $td = $this->addBlankElement('td'); - $td->attr['bgcolor'] = 'Color'; - $td->attr['height'] = 'Length'; - $td->attr['nowrap'] = 'Bool#nowrap'; - $td->attr['width'] = 'Length'; - - $ul = $this->addBlankElement('ul'); - $ul->attr['compact'] = 'Bool#compact'; - $ul->attr['type'] = 'Enum#square,disc,circle'; - - // "safe" modifications to "unsafe" elements - // WARNING: If you want to add support for an unsafe, legacy - // attribute, make a new TrustedLegacy module with the trusted - // bit set appropriately - - $form = $this->addBlankElement('form'); - $form->content_model = 'Flow | #PCDATA'; - $form->content_model_type = 'optional'; - $form->attr['target'] = 'FrameTarget'; - - $input = $this->addBlankElement('input'); - $input->attr['align'] = 'IAlign'; - - $legend = $this->addBlankElement('legend'); - $legend->attr['align'] = 'LAlign'; - } -} - -// vim: et sw=4 sts=4 +addElement( + 'basefont', + 'Inline', + 'Empty', + null, + array( + 'color' => 'Color', + 'face' => 'Text', // extremely broad, we should + 'size' => 'Text', // tighten it + 'id' => 'ID' + ) + ); + $this->addElement('center', 'Block', 'Flow', 'Common'); + $this->addElement( + 'dir', + 'Block', + 'Required: li', + 'Common', + array( + 'compact' => 'Bool#compact' + ) + ); + $this->addElement( + 'font', + 'Inline', + 'Inline', + array('Core', 'I18N'), + array( + 'color' => 'Color', + 'face' => 'Text', // extremely broad, we should + 'size' => 'Text', // tighten it + ) + ); + $this->addElement( + 'menu', + 'Block', + 'Required: li', + 'Common', + array( + 'compact' => 'Bool#compact' + ) + ); + + $s = $this->addElement('s', 'Inline', 'Inline', 'Common'); + $s->formatting = true; + + $strike = $this->addElement('strike', 'Inline', 'Inline', 'Common'); + $strike->formatting = true; + + $u = $this->addElement('u', 'Inline', 'Inline', 'Common'); + $u->formatting = true; + + // setup modifications to old elements + + $align = 'Enum#left,right,center,justify'; + + $address = $this->addBlankElement('address'); + $address->content_model = 'Inline | #PCDATA | p'; + $address->content_model_type = 'optional'; + $address->child = false; + + $blockquote = $this->addBlankElement('blockquote'); + $blockquote->content_model = 'Flow | #PCDATA'; + $blockquote->content_model_type = 'optional'; + $blockquote->child = false; + + $br = $this->addBlankElement('br'); + $br->attr['clear'] = 'Enum#left,all,right,none'; + + $caption = $this->addBlankElement('caption'); + $caption->attr['align'] = 'Enum#top,bottom,left,right'; + + $div = $this->addBlankElement('div'); + $div->attr['align'] = $align; + + $dl = $this->addBlankElement('dl'); + $dl->attr['compact'] = 'Bool#compact'; + + for ($i = 1; $i <= 6; $i++) { + $h = $this->addBlankElement("h$i"); + $h->attr['align'] = $align; + } + + $hr = $this->addBlankElement('hr'); + $hr->attr['align'] = $align; + $hr->attr['noshade'] = 'Bool#noshade'; + $hr->attr['size'] = 'Pixels'; + $hr->attr['width'] = 'Length'; + + $img = $this->addBlankElement('img'); + $img->attr['align'] = 'IAlign'; + $img->attr['border'] = 'Pixels'; + $img->attr['hspace'] = 'Pixels'; + $img->attr['vspace'] = 'Pixels'; + + // figure out this integer business + + $li = $this->addBlankElement('li'); + $li->attr['value'] = new HTMLPurifier_AttrDef_Integer(); + $li->attr['type'] = 'Enum#s:1,i,I,a,A,disc,square,circle'; + + $ol = $this->addBlankElement('ol'); + $ol->attr['compact'] = 'Bool#compact'; + $ol->attr['start'] = new HTMLPurifier_AttrDef_Integer(); + $ol->attr['type'] = 'Enum#s:1,i,I,a,A'; + + $p = $this->addBlankElement('p'); + $p->attr['align'] = $align; + + $pre = $this->addBlankElement('pre'); + $pre->attr['width'] = 'Number'; + + // script omitted + + $table = $this->addBlankElement('table'); + $table->attr['align'] = 'Enum#left,center,right'; + $table->attr['bgcolor'] = 'Color'; + + $tr = $this->addBlankElement('tr'); + $tr->attr['bgcolor'] = 'Color'; + + $th = $this->addBlankElement('th'); + $th->attr['bgcolor'] = 'Color'; + $th->attr['height'] = 'Length'; + $th->attr['nowrap'] = 'Bool#nowrap'; + $th->attr['width'] = 'Length'; + + $td = $this->addBlankElement('td'); + $td->attr['bgcolor'] = 'Color'; + $td->attr['height'] = 'Length'; + $td->attr['nowrap'] = 'Bool#nowrap'; + $td->attr['width'] = 'Length'; + + $ul = $this->addBlankElement('ul'); + $ul->attr['compact'] = 'Bool#compact'; + $ul->attr['type'] = 'Enum#square,disc,circle'; + + // "safe" modifications to "unsafe" elements + // WARNING: If you want to add support for an unsafe, legacy + // attribute, make a new TrustedLegacy module with the trusted + // bit set appropriately + + $form = $this->addBlankElement('form'); + $form->content_model = 'Flow | #PCDATA'; + $form->content_model_type = 'optional'; + $form->attr['target'] = 'FrameTarget'; + + $input = $this->addBlankElement('input'); + $input->attr['align'] = 'IAlign'; + + $legend = $this->addBlankElement('legend'); + $legend->attr['align'] = 'LAlign'; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/List.php b/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/List.php similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/List.php rename to thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/List.php index 605e37c97..7a20ff701 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/List.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/List.php @@ -1,51 +1,51 @@ - 'List'); - - /** - * @param HTMLPurifier_Config $config - */ - public function setup($config) - { - $ol = $this->addElement('ol', 'List', new HTMLPurifier_ChildDef_List(), 'Common'); - $ul = $this->addElement('ul', 'List', new HTMLPurifier_ChildDef_List(), 'Common'); - // XXX The wrap attribute is handled by MakeWellFormed. This is all - // quite unsatisfactory, because we generated this - // *specifically* for lists, and now a big chunk of the handling - // is done properly by the List ChildDef. So actually, we just - // want enough information to make autoclosing work properly, - // and then hand off the tricky stuff to the ChildDef. - $ol->wrap = 'li'; - $ul->wrap = 'li'; - $this->addElement('dl', 'List', 'Required: dt | dd', 'Common'); - - $this->addElement('li', false, 'Flow', 'Common'); - - $this->addElement('dd', false, 'Flow', 'Common'); - $this->addElement('dt', false, 'Inline', 'Common'); - } -} - -// vim: et sw=4 sts=4 + 'List'); + + /** + * @param HTMLPurifier_Config $config + */ + public function setup($config) + { + $ol = $this->addElement('ol', 'List', new HTMLPurifier_ChildDef_List(), 'Common'); + $ul = $this->addElement('ul', 'List', new HTMLPurifier_ChildDef_List(), 'Common'); + // XXX The wrap attribute is handled by MakeWellFormed. This is all + // quite unsatisfactory, because we generated this + // *specifically* for lists, and now a big chunk of the handling + // is done properly by the List ChildDef. So actually, we just + // want enough information to make autoclosing work properly, + // and then hand off the tricky stuff to the ChildDef. + $ol->wrap = 'li'; + $ul->wrap = 'li'; + $this->addElement('dl', 'List', 'Required: dt | dd', 'Common'); + + $this->addElement('li', false, 'Flow', 'Common'); + + $this->addElement('dd', false, 'Flow', 'Common'); + $this->addElement('dt', false, 'Inline', 'Common'); + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Name.php b/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Name.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Name.php rename to thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Name.php index 315e22a80..60c054515 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Name.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Name.php @@ -1,26 +1,26 @@ -addBlankElement($name); - $element->attr['name'] = 'CDATA'; - if (!$config->get('HTML.Attr.Name.UseCDATA')) { - $element->attr_transform_post[] = new HTMLPurifier_AttrTransform_NameSync(); - } - } - } -} - -// vim: et sw=4 sts=4 +addBlankElement($name); + $element->attr['name'] = 'CDATA'; + if (!$config->get('HTML.Attr.Name.UseCDATA')) { + $element->attr_transform_post[] = new HTMLPurifier_AttrTransform_NameSync(); + } + } + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Nofollow.php b/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Nofollow.php similarity index 95% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Nofollow.php rename to thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Nofollow.php index c145e8e96..dc9410a89 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Nofollow.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Nofollow.php @@ -1,25 +1,25 @@ -addBlankElement('a'); - $a->attr_transform_post[] = new HTMLPurifier_AttrTransform_Nofollow(); - } -} - -// vim: et sw=4 sts=4 +addBlankElement('a'); + $a->attr_transform_post[] = new HTMLPurifier_AttrTransform_Nofollow(); + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/NonXMLCommonAttributes.php b/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/NonXMLCommonAttributes.php similarity index 94% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/NonXMLCommonAttributes.php rename to thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/NonXMLCommonAttributes.php index 7d66e114f..da722253a 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/NonXMLCommonAttributes.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/NonXMLCommonAttributes.php @@ -1,20 +1,20 @@ - array( - 'lang' => 'LanguageCode', - ) - ); -} - -// vim: et sw=4 sts=4 + array( + 'lang' => 'LanguageCode', + ) + ); +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Object.php b/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Object.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Object.php rename to thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Object.php index d388b24c7..2f9efc5c8 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Object.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Object.php @@ -1,62 +1,62 @@ - to cater to legacy browsers: this - * module does not allow this sort of behavior - */ -class HTMLPurifier_HTMLModule_Object extends HTMLPurifier_HTMLModule -{ - /** - * @type string - */ - public $name = 'Object'; - - /** - * @type bool - */ - public $safe = false; - - /** - * @param HTMLPurifier_Config $config - */ - public function setup($config) - { - $this->addElement( - 'object', - 'Inline', - 'Optional: #PCDATA | Flow | param', - 'Common', - array( - 'archive' => 'URI', - 'classid' => 'URI', - 'codebase' => 'URI', - 'codetype' => 'Text', - 'data' => 'URI', - 'declare' => 'Bool#declare', - 'height' => 'Length', - 'name' => 'CDATA', - 'standby' => 'Text', - 'tabindex' => 'Number', - 'type' => 'ContentType', - 'width' => 'Length' - ) - ); - - $this->addElement( - 'param', - false, - 'Empty', - null, - array( - 'id' => 'ID', - 'name*' => 'Text', - 'type' => 'Text', - 'value' => 'Text', - 'valuetype' => 'Enum#data,ref,object' - ) - ); - } -} - -// vim: et sw=4 sts=4 + to cater to legacy browsers: this + * module does not allow this sort of behavior + */ +class HTMLPurifier_HTMLModule_Object extends HTMLPurifier_HTMLModule +{ + /** + * @type string + */ + public $name = 'Object'; + + /** + * @type bool + */ + public $safe = false; + + /** + * @param HTMLPurifier_Config $config + */ + public function setup($config) + { + $this->addElement( + 'object', + 'Inline', + 'Optional: #PCDATA | Flow | param', + 'Common', + array( + 'archive' => 'URI', + 'classid' => 'URI', + 'codebase' => 'URI', + 'codetype' => 'Text', + 'data' => 'URI', + 'declare' => 'Bool#declare', + 'height' => 'Length', + 'name' => 'CDATA', + 'standby' => 'Text', + 'tabindex' => 'Number', + 'type' => 'ContentType', + 'width' => 'Length' + ) + ); + + $this->addElement( + 'param', + false, + 'Empty', + null, + array( + 'id' => 'ID', + 'name*' => 'Text', + 'type' => 'Text', + 'value' => 'Text', + 'valuetype' => 'Enum#data,ref,object' + ) + ); + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Presentation.php b/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Presentation.php similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Presentation.php rename to thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Presentation.php index 831db4cff..6458ce9d8 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Presentation.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Presentation.php @@ -1,42 +1,42 @@ -addElement('hr', 'Block', 'Empty', 'Common'); - $this->addElement('sub', 'Inline', 'Inline', 'Common'); - $this->addElement('sup', 'Inline', 'Inline', 'Common'); - $b = $this->addElement('b', 'Inline', 'Inline', 'Common'); - $b->formatting = true; - $big = $this->addElement('big', 'Inline', 'Inline', 'Common'); - $big->formatting = true; - $i = $this->addElement('i', 'Inline', 'Inline', 'Common'); - $i->formatting = true; - $small = $this->addElement('small', 'Inline', 'Inline', 'Common'); - $small->formatting = true; - $tt = $this->addElement('tt', 'Inline', 'Inline', 'Common'); - $tt->formatting = true; - } -} - -// vim: et sw=4 sts=4 +addElement('hr', 'Block', 'Empty', 'Common'); + $this->addElement('sub', 'Inline', 'Inline', 'Common'); + $this->addElement('sup', 'Inline', 'Inline', 'Common'); + $b = $this->addElement('b', 'Inline', 'Inline', 'Common'); + $b->formatting = true; + $big = $this->addElement('big', 'Inline', 'Inline', 'Common'); + $big->formatting = true; + $i = $this->addElement('i', 'Inline', 'Inline', 'Common'); + $i->formatting = true; + $small = $this->addElement('small', 'Inline', 'Inline', 'Common'); + $small->formatting = true; + $tt = $this->addElement('tt', 'Inline', 'Inline', 'Common'); + $tt->formatting = true; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Proprietary.php b/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Proprietary.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Proprietary.php rename to thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Proprietary.php index 4593fc40f..5ee3c8e67 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Proprietary.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Proprietary.php @@ -1,40 +1,40 @@ -addElement( - 'marquee', - 'Inline', - 'Flow', - 'Common', - array( - 'direction' => 'Enum#left,right,up,down', - 'behavior' => 'Enum#alternate', - 'width' => 'Length', - 'height' => 'Length', - 'scrolldelay' => 'Number', - 'scrollamount' => 'Number', - 'loop' => 'Number', - 'bgcolor' => 'Color', - 'hspace' => 'Pixels', - 'vspace' => 'Pixels', - ) - ); - } -} - -// vim: et sw=4 sts=4 +addElement( + 'marquee', + 'Inline', + 'Flow', + 'Common', + array( + 'direction' => 'Enum#left,right,up,down', + 'behavior' => 'Enum#alternate', + 'width' => 'Length', + 'height' => 'Length', + 'scrolldelay' => 'Number', + 'scrollamount' => 'Number', + 'loop' => 'Number', + 'bgcolor' => 'Color', + 'hspace' => 'Pixels', + 'vspace' => 'Pixels', + ) + ); + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Ruby.php b/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Ruby.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Ruby.php rename to thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Ruby.php index 9a2617296..a0d48924d 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Ruby.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Ruby.php @@ -1,36 +1,36 @@ -addElement( - 'ruby', - 'Inline', - 'Custom: ((rb, (rt | (rp, rt, rp))) | (rbc, rtc, rtc?))', - 'Common' - ); - $this->addElement('rbc', false, 'Required: rb', 'Common'); - $this->addElement('rtc', false, 'Required: rt', 'Common'); - $rb = $this->addElement('rb', false, 'Inline', 'Common'); - $rb->excludes = array('ruby' => true); - $rt = $this->addElement('rt', false, 'Inline', 'Common', array('rbspan' => 'Number')); - $rt->excludes = array('ruby' => true); - $this->addElement('rp', false, 'Optional: #PCDATA', 'Common'); - } -} - -// vim: et sw=4 sts=4 +addElement( + 'ruby', + 'Inline', + 'Custom: ((rb, (rt | (rp, rt, rp))) | (rbc, rtc, rtc?))', + 'Common' + ); + $this->addElement('rbc', false, 'Required: rb', 'Common'); + $this->addElement('rtc', false, 'Required: rt', 'Common'); + $rb = $this->addElement('rb', false, 'Inline', 'Common'); + $rb->excludes = array('ruby' => true); + $rt = $this->addElement('rt', false, 'Inline', 'Common', array('rbspan' => 'Number')); + $rt->excludes = array('ruby' => true); + $this->addElement('rp', false, 'Optional: #PCDATA', 'Common'); + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/SafeEmbed.php b/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/SafeEmbed.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/SafeEmbed.php rename to thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/SafeEmbed.php index 11572887d..04e6689ea 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/SafeEmbed.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/SafeEmbed.php @@ -1,40 +1,40 @@ -get('HTML.MaxImgLength'); - $embed = $this->addElement( - 'embed', - 'Inline', - 'Empty', - 'Common', - array( - 'src*' => 'URI#embedded', - 'type' => 'Enum#application/x-shockwave-flash', - 'width' => 'Pixels#' . $max, - 'height' => 'Pixels#' . $max, - 'allowscriptaccess' => 'Enum#never', - 'allownetworking' => 'Enum#internal', - 'flashvars' => 'Text', - 'wmode' => 'Enum#window,transparent,opaque', - 'name' => 'ID', - ) - ); - $embed->attr_transform_post[] = new HTMLPurifier_AttrTransform_SafeEmbed(); - } -} - -// vim: et sw=4 sts=4 +get('HTML.MaxImgLength'); + $embed = $this->addElement( + 'embed', + 'Inline', + 'Empty', + 'Common', + array( + 'src*' => 'URI#embedded', + 'type' => 'Enum#application/x-shockwave-flash', + 'width' => 'Pixels#' . $max, + 'height' => 'Pixels#' . $max, + 'allowscriptaccess' => 'Enum#never', + 'allownetworking' => 'Enum#internal', + 'flashvars' => 'Text', + 'wmode' => 'Enum#window,transparent,opaque', + 'name' => 'ID', + ) + ); + $embed->attr_transform_post[] = new HTMLPurifier_AttrTransform_SafeEmbed(); + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/SafeObject.php b/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/SafeObject.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/SafeObject.php rename to thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/SafeObject.php index a061cec15..1297f80a3 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/SafeObject.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/SafeObject.php @@ -1,62 +1,62 @@ -get('HTML.MaxImgLength'); - $object = $this->addElement( - 'object', - 'Inline', - 'Optional: param | Flow | #PCDATA', - 'Common', - array( - // While technically not required by the spec, we're forcing - // it to this value. - 'type' => 'Enum#application/x-shockwave-flash', - 'width' => 'Pixels#' . $max, - 'height' => 'Pixels#' . $max, - 'data' => 'URI#embedded', - 'codebase' => new HTMLPurifier_AttrDef_Enum( - array( - 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0' - ) - ), - ) - ); - $object->attr_transform_post[] = new HTMLPurifier_AttrTransform_SafeObject(); - - $param = $this->addElement( - 'param', - false, - 'Empty', - false, - array( - 'id' => 'ID', - 'name*' => 'Text', - 'value' => 'Text' - ) - ); - $param->attr_transform_post[] = new HTMLPurifier_AttrTransform_SafeParam(); - $this->info_injector[] = 'SafeObject'; - } -} - -// vim: et sw=4 sts=4 +get('HTML.MaxImgLength'); + $object = $this->addElement( + 'object', + 'Inline', + 'Optional: param | Flow | #PCDATA', + 'Common', + array( + // While technically not required by the spec, we're forcing + // it to this value. + 'type' => 'Enum#application/x-shockwave-flash', + 'width' => 'Pixels#' . $max, + 'height' => 'Pixels#' . $max, + 'data' => 'URI#embedded', + 'codebase' => new HTMLPurifier_AttrDef_Enum( + array( + 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0' + ) + ), + ) + ); + $object->attr_transform_post[] = new HTMLPurifier_AttrTransform_SafeObject(); + + $param = $this->addElement( + 'param', + false, + 'Empty', + false, + array( + 'id' => 'ID', + 'name*' => 'Text', + 'value' => 'Text' + ) + ); + $param->attr_transform_post[] = new HTMLPurifier_AttrTransform_SafeParam(); + $this->info_injector[] = 'SafeObject'; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/SafeScripting.php b/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/SafeScripting.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/SafeScripting.php rename to thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/SafeScripting.php index 6e9113cb5..0330cd97f 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/SafeScripting.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/SafeScripting.php @@ -1,40 +1,40 @@ -get('HTML.SafeScripting'); - $script = $this->addElement( - 'script', - 'Inline', - 'Empty', - null, - array( - // While technically not required by the spec, we're forcing - // it to this value. - 'type' => 'Enum#text/javascript', - 'src*' => new HTMLPurifier_AttrDef_Enum(array_keys($allowed)) - ) - ); - $script->attr_transform_pre[] = - $script->attr_transform_post[] = new HTMLPurifier_AttrTransform_ScriptRequired(); - } -} - -// vim: et sw=4 sts=4 +get('HTML.SafeScripting'); + $script = $this->addElement( + 'script', + 'Inline', + 'Empty', + null, + array( + // While technically not required by the spec, we're forcing + // it to this value. + 'type' => 'Enum#text/javascript', + 'src*' => new HTMLPurifier_AttrDef_Enum(array_keys($allowed)) + ) + ); + $script->attr_transform_pre[] = + $script->attr_transform_post[] = new HTMLPurifier_AttrTransform_ScriptRequired(); + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Scripting.php b/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Scripting.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Scripting.php rename to thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Scripting.php index 18785372a..8b28a7b7e 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Scripting.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Scripting.php @@ -1,73 +1,73 @@ - 'script | noscript', 'Inline' => 'script | noscript'); - - /** - * @type bool - */ - public $safe = false; - - /** - * @param HTMLPurifier_Config $config - */ - public function setup($config) - { - // TODO: create custom child-definition for noscript that - // auto-wraps stray #PCDATA in a similar manner to - // blockquote's custom definition (we would use it but - // blockquote's contents are optional while noscript's contents - // are required) - - // TODO: convert this to new syntax, main problem is getting - // both content sets working - - // In theory, this could be safe, but I don't see any reason to - // allow it. - $this->info['noscript'] = new HTMLPurifier_ElementDef(); - $this->info['noscript']->attr = array(0 => array('Common')); - $this->info['noscript']->content_model = 'Heading | List | Block'; - $this->info['noscript']->content_model_type = 'required'; - - $this->info['script'] = new HTMLPurifier_ElementDef(); - $this->info['script']->attr = array( - 'defer' => new HTMLPurifier_AttrDef_Enum(array('defer')), - 'src' => new HTMLPurifier_AttrDef_URI(true), - 'type' => new HTMLPurifier_AttrDef_Enum(array('text/javascript')) - ); - $this->info['script']->content_model = '#PCDATA'; - $this->info['script']->content_model_type = 'optional'; - $this->info['script']->attr_transform_pre[] = - $this->info['script']->attr_transform_post[] = - new HTMLPurifier_AttrTransform_ScriptRequired(); - } -} - -// vim: et sw=4 sts=4 + 'script | noscript', 'Inline' => 'script | noscript'); + + /** + * @type bool + */ + public $safe = false; + + /** + * @param HTMLPurifier_Config $config + */ + public function setup($config) + { + // TODO: create custom child-definition for noscript that + // auto-wraps stray #PCDATA in a similar manner to + // blockquote's custom definition (we would use it but + // blockquote's contents are optional while noscript's contents + // are required) + + // TODO: convert this to new syntax, main problem is getting + // both content sets working + + // In theory, this could be safe, but I don't see any reason to + // allow it. + $this->info['noscript'] = new HTMLPurifier_ElementDef(); + $this->info['noscript']->attr = array(0 => array('Common')); + $this->info['noscript']->content_model = 'Heading | List | Block'; + $this->info['noscript']->content_model_type = 'required'; + + $this->info['script'] = new HTMLPurifier_ElementDef(); + $this->info['script']->attr = array( + 'defer' => new HTMLPurifier_AttrDef_Enum(array('defer')), + 'src' => new HTMLPurifier_AttrDef_URI(true), + 'type' => new HTMLPurifier_AttrDef_Enum(array('text/javascript')) + ); + $this->info['script']->content_model = '#PCDATA'; + $this->info['script']->content_model_type = 'optional'; + $this->info['script']->attr_transform_pre[] = + $this->info['script']->attr_transform_post[] = + new HTMLPurifier_AttrTransform_ScriptRequired(); + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/StyleAttribute.php b/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/StyleAttribute.php similarity index 95% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/StyleAttribute.php rename to thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/StyleAttribute.php index f192780a0..497b832ae 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/StyleAttribute.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/StyleAttribute.php @@ -1,33 +1,33 @@ - array('style' => false), // see constructor - 'Core' => array(0 => array('Style')) - ); - - /** - * @param HTMLPurifier_Config $config - */ - public function setup($config) - { - $this->attr_collections['Style']['style'] = new HTMLPurifier_AttrDef_CSS(); - } -} - -// vim: et sw=4 sts=4 + array('style' => false), // see constructor + 'Core' => array(0 => array('Style')) + ); + + /** + * @param HTMLPurifier_Config $config + */ + public function setup($config) + { + $this->attr_collections['Style']['style'] = new HTMLPurifier_AttrDef_CSS(); + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Tables.php b/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Tables.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Tables.php rename to thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Tables.php index f993e3ca1..8a0b3b461 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Tables.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Tables.php @@ -1,75 +1,75 @@ -addElement('caption', false, 'Inline', 'Common'); - - $this->addElement( - 'table', - 'Block', - new HTMLPurifier_ChildDef_Table(), - 'Common', - array( - 'border' => 'Pixels', - 'cellpadding' => 'Length', - 'cellspacing' => 'Length', - 'frame' => 'Enum#void,above,below,hsides,lhs,rhs,vsides,box,border', - 'rules' => 'Enum#none,groups,rows,cols,all', - 'summary' => 'Text', - 'width' => 'Length' - ) - ); - - // common attributes - $cell_align = array( - 'align' => 'Enum#left,center,right,justify,char', - 'charoff' => 'Length', - 'valign' => 'Enum#top,middle,bottom,baseline', - ); - - $cell_t = array_merge( - array( - 'abbr' => 'Text', - 'colspan' => 'Number', - 'rowspan' => 'Number', - // Apparently, as of HTML5 this attribute only applies - // to 'th' elements. - 'scope' => 'Enum#row,col,rowgroup,colgroup', - ), - $cell_align - ); - $this->addElement('td', false, 'Flow', 'Common', $cell_t); - $this->addElement('th', false, 'Flow', 'Common', $cell_t); - - $this->addElement('tr', false, 'Required: td | th', 'Common', $cell_align); - - $cell_col = array_merge( - array( - 'span' => 'Number', - 'width' => 'MultiLength', - ), - $cell_align - ); - $this->addElement('col', false, 'Empty', 'Common', $cell_col); - $this->addElement('colgroup', false, 'Optional: col', 'Common', $cell_col); - - $this->addElement('tbody', false, 'Required: tr', 'Common', $cell_align); - $this->addElement('thead', false, 'Required: tr', 'Common', $cell_align); - $this->addElement('tfoot', false, 'Required: tr', 'Common', $cell_align); - } -} - -// vim: et sw=4 sts=4 +addElement('caption', false, 'Inline', 'Common'); + + $this->addElement( + 'table', + 'Block', + new HTMLPurifier_ChildDef_Table(), + 'Common', + array( + 'border' => 'Pixels', + 'cellpadding' => 'Length', + 'cellspacing' => 'Length', + 'frame' => 'Enum#void,above,below,hsides,lhs,rhs,vsides,box,border', + 'rules' => 'Enum#none,groups,rows,cols,all', + 'summary' => 'Text', + 'width' => 'Length' + ) + ); + + // common attributes + $cell_align = array( + 'align' => 'Enum#left,center,right,justify,char', + 'charoff' => 'Length', + 'valign' => 'Enum#top,middle,bottom,baseline', + ); + + $cell_t = array_merge( + array( + 'abbr' => 'Text', + 'colspan' => 'Number', + 'rowspan' => 'Number', + // Apparently, as of HTML5 this attribute only applies + // to 'th' elements. + 'scope' => 'Enum#row,col,rowgroup,colgroup', + ), + $cell_align + ); + $this->addElement('td', false, 'Flow', 'Common', $cell_t); + $this->addElement('th', false, 'Flow', 'Common', $cell_t); + + $this->addElement('tr', false, 'Required: td | th', 'Common', $cell_align); + + $cell_col = array_merge( + array( + 'span' => 'Number', + 'width' => 'MultiLength', + ), + $cell_align + ); + $this->addElement('col', false, 'Empty', 'Common', $cell_col); + $this->addElement('colgroup', false, 'Optional: col', 'Common', $cell_col); + + $this->addElement('tbody', false, 'Required: tr', 'Common', $cell_align); + $this->addElement('thead', false, 'Required: tr', 'Common', $cell_align); + $this->addElement('tfoot', false, 'Required: tr', 'Common', $cell_align); + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Target.php b/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Target.php similarity index 95% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Target.php rename to thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Target.php index f3af04863..b188ac936 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Target.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Target.php @@ -1,28 +1,28 @@ -addBlankElement($name); - $e->attr = array( - 'target' => new HTMLPurifier_AttrDef_HTML_FrameTarget() - ); - } - } -} - -// vim: et sw=4 sts=4 +addBlankElement($name); + $e->attr = array( + 'target' => new HTMLPurifier_AttrDef_HTML_FrameTarget() + ); + } + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/TargetBlank.php b/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/TargetBlank.php similarity index 95% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/TargetBlank.php rename to thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/TargetBlank.php index 757cddcda..58ccc6894 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/TargetBlank.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/TargetBlank.php @@ -1,24 +1,24 @@ -addBlankElement('a'); - $a->attr_transform_post[] = new HTMLPurifier_AttrTransform_TargetBlank(); - } -} - -// vim: et sw=4 sts=4 +addBlankElement('a'); + $a->attr_transform_post[] = new HTMLPurifier_AttrTransform_TargetBlank(); + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Text.php b/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Text.php similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Text.php rename to thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Text.php index 11fdd8bd5..7a65e0048 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Text.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Text.php @@ -1,87 +1,87 @@ - 'Heading | Block | Inline' - ); - - /** - * @param HTMLPurifier_Config $config - */ - public function setup($config) - { - // Inline Phrasal ------------------------------------------------- - $this->addElement('abbr', 'Inline', 'Inline', 'Common'); - $this->addElement('acronym', 'Inline', 'Inline', 'Common'); - $this->addElement('cite', 'Inline', 'Inline', 'Common'); - $this->addElement('dfn', 'Inline', 'Inline', 'Common'); - $this->addElement('kbd', 'Inline', 'Inline', 'Common'); - $this->addElement('q', 'Inline', 'Inline', 'Common', array('cite' => 'URI')); - $this->addElement('samp', 'Inline', 'Inline', 'Common'); - $this->addElement('var', 'Inline', 'Inline', 'Common'); - - $em = $this->addElement('em', 'Inline', 'Inline', 'Common'); - $em->formatting = true; - - $strong = $this->addElement('strong', 'Inline', 'Inline', 'Common'); - $strong->formatting = true; - - $code = $this->addElement('code', 'Inline', 'Inline', 'Common'); - $code->formatting = true; - - // Inline Structural ---------------------------------------------- - $this->addElement('span', 'Inline', 'Inline', 'Common'); - $this->addElement('br', 'Inline', 'Empty', 'Core'); - - // Block Phrasal -------------------------------------------------- - $this->addElement('address', 'Block', 'Inline', 'Common'); - $this->addElement('blockquote', 'Block', 'Optional: Heading | Block | List', 'Common', array('cite' => 'URI')); - $pre = $this->addElement('pre', 'Block', 'Inline', 'Common'); - $pre->excludes = $this->makeLookup( - 'img', - 'big', - 'small', - 'object', - 'applet', - 'font', - 'basefont' - ); - $this->addElement('h1', 'Heading', 'Inline', 'Common'); - $this->addElement('h2', 'Heading', 'Inline', 'Common'); - $this->addElement('h3', 'Heading', 'Inline', 'Common'); - $this->addElement('h4', 'Heading', 'Inline', 'Common'); - $this->addElement('h5', 'Heading', 'Inline', 'Common'); - $this->addElement('h6', 'Heading', 'Inline', 'Common'); - - // Block Structural ----------------------------------------------- - $p = $this->addElement('p', 'Block', 'Inline', 'Common'); - $p->autoclose = array_flip( - array("address", "blockquote", "center", "dir", "div", "dl", "fieldset", "ol", "p", "ul") - ); - - $this->addElement('div', 'Block', 'Flow', 'Common'); - } -} - -// vim: et sw=4 sts=4 + 'Heading | Block | Inline' + ); + + /** + * @param HTMLPurifier_Config $config + */ + public function setup($config) + { + // Inline Phrasal ------------------------------------------------- + $this->addElement('abbr', 'Inline', 'Inline', 'Common'); + $this->addElement('acronym', 'Inline', 'Inline', 'Common'); + $this->addElement('cite', 'Inline', 'Inline', 'Common'); + $this->addElement('dfn', 'Inline', 'Inline', 'Common'); + $this->addElement('kbd', 'Inline', 'Inline', 'Common'); + $this->addElement('q', 'Inline', 'Inline', 'Common', array('cite' => 'URI')); + $this->addElement('samp', 'Inline', 'Inline', 'Common'); + $this->addElement('var', 'Inline', 'Inline', 'Common'); + + $em = $this->addElement('em', 'Inline', 'Inline', 'Common'); + $em->formatting = true; + + $strong = $this->addElement('strong', 'Inline', 'Inline', 'Common'); + $strong->formatting = true; + + $code = $this->addElement('code', 'Inline', 'Inline', 'Common'); + $code->formatting = true; + + // Inline Structural ---------------------------------------------- + $this->addElement('span', 'Inline', 'Inline', 'Common'); + $this->addElement('br', 'Inline', 'Empty', 'Core'); + + // Block Phrasal -------------------------------------------------- + $this->addElement('address', 'Block', 'Inline', 'Common'); + $this->addElement('blockquote', 'Block', 'Optional: Heading | Block | List', 'Common', array('cite' => 'URI')); + $pre = $this->addElement('pre', 'Block', 'Inline', 'Common'); + $pre->excludes = $this->makeLookup( + 'img', + 'big', + 'small', + 'object', + 'applet', + 'font', + 'basefont' + ); + $this->addElement('h1', 'Heading', 'Inline', 'Common'); + $this->addElement('h2', 'Heading', 'Inline', 'Common'); + $this->addElement('h3', 'Heading', 'Inline', 'Common'); + $this->addElement('h4', 'Heading', 'Inline', 'Common'); + $this->addElement('h5', 'Heading', 'Inline', 'Common'); + $this->addElement('h6', 'Heading', 'Inline', 'Common'); + + // Block Structural ----------------------------------------------- + $p = $this->addElement('p', 'Block', 'Inline', 'Common'); + $p->autoclose = array_flip( + array("address", "blockquote", "center", "dir", "div", "dl", "fieldset", "ol", "p", "ul") + ); + + $this->addElement('div', 'Block', 'Flow', 'Common'); + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Tidy.php b/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Tidy.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Tidy.php rename to thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Tidy.php index f482a3741..08aa23247 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Tidy.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Tidy.php @@ -1,230 +1,230 @@ - 'none', 'light', 'medium', 'heavy'); - - /** - * Default level to place all fixes in. - * Disabled by default. - * @type string - */ - public $defaultLevel = null; - - /** - * Lists of fixes used by getFixesForLevel(). - * Format is: - * HTMLModule_Tidy->fixesForLevel[$level] = array('fix-1', 'fix-2'); - * @type array - */ - public $fixesForLevel = array( - 'light' => array(), - 'medium' => array(), - 'heavy' => array() - ); - - /** - * Lazy load constructs the module by determining the necessary - * fixes to create and then delegating to the populate() function. - * @param HTMLPurifier_Config $config - * @todo Wildcard matching and error reporting when an added or - * subtracted fix has no effect. - */ - public function setup($config) - { - // create fixes, initialize fixesForLevel - $fixes = $this->makeFixes(); - $this->makeFixesForLevel($fixes); - - // figure out which fixes to use - $level = $config->get('HTML.TidyLevel'); - $fixes_lookup = $this->getFixesForLevel($level); - - // get custom fix declarations: these need namespace processing - $add_fixes = $config->get('HTML.TidyAdd'); - $remove_fixes = $config->get('HTML.TidyRemove'); - - foreach ($fixes as $name => $fix) { - // needs to be refactored a little to implement globbing - if (isset($remove_fixes[$name]) || - (!isset($add_fixes[$name]) && !isset($fixes_lookup[$name]))) { - unset($fixes[$name]); - } - } - - // populate this module with necessary fixes - $this->populate($fixes); - } - - /** - * Retrieves all fixes per a level, returning fixes for that specific - * level as well as all levels below it. - * @param string $level level identifier, see $levels for valid values - * @return array Lookup up table of fixes - */ - public function getFixesForLevel($level) - { - if ($level == $this->levels[0]) { - return array(); - } - $activated_levels = array(); - for ($i = 1, $c = count($this->levels); $i < $c; $i++) { - $activated_levels[] = $this->levels[$i]; - if ($this->levels[$i] == $level) { - break; - } - } - if ($i == $c) { - trigger_error( - 'Tidy level ' . htmlspecialchars($level) . ' not recognized', - E_USER_WARNING - ); - return array(); - } - $ret = array(); - foreach ($activated_levels as $level) { - foreach ($this->fixesForLevel[$level] as $fix) { - $ret[$fix] = true; - } - } - return $ret; - } - - /** - * Dynamically populates the $fixesForLevel member variable using - * the fixes array. It may be custom overloaded, used in conjunction - * with $defaultLevel, or not used at all. - * @param array $fixes - */ - public function makeFixesForLevel($fixes) - { - if (!isset($this->defaultLevel)) { - return; - } - if (!isset($this->fixesForLevel[$this->defaultLevel])) { - trigger_error( - 'Default level ' . $this->defaultLevel . ' does not exist', - E_USER_ERROR - ); - return; - } - $this->fixesForLevel[$this->defaultLevel] = array_keys($fixes); - } - - /** - * Populates the module with transforms and other special-case code - * based on a list of fixes passed to it - * @param array $fixes Lookup table of fixes to activate - */ - public function populate($fixes) - { - foreach ($fixes as $name => $fix) { - // determine what the fix is for - list($type, $params) = $this->getFixType($name); - switch ($type) { - case 'attr_transform_pre': - case 'attr_transform_post': - $attr = $params['attr']; - if (isset($params['element'])) { - $element = $params['element']; - if (empty($this->info[$element])) { - $e = $this->addBlankElement($element); - } else { - $e = $this->info[$element]; - } - } else { - $type = "info_$type"; - $e = $this; - } - // PHP does some weird parsing when I do - // $e->$type[$attr], so I have to assign a ref. - $f =& $e->$type; - $f[$attr] = $fix; - break; - case 'tag_transform': - $this->info_tag_transform[$params['element']] = $fix; - break; - case 'child': - case 'content_model_type': - $element = $params['element']; - if (empty($this->info[$element])) { - $e = $this->addBlankElement($element); - } else { - $e = $this->info[$element]; - } - $e->$type = $fix; - break; - default: - trigger_error("Fix type $type not supported", E_USER_ERROR); - break; - } - } - } - - /** - * Parses a fix name and determines what kind of fix it is, as well - * as other information defined by the fix - * @param $name String name of fix - * @return array(string $fix_type, array $fix_parameters) - * @note $fix_parameters is type dependant, see populate() for usage - * of these parameters - */ - public function getFixType($name) - { - // parse it - $property = $attr = null; - if (strpos($name, '#') !== false) { - list($name, $property) = explode('#', $name); - } - if (strpos($name, '@') !== false) { - list($name, $attr) = explode('@', $name); - } - - // figure out the parameters - $params = array(); - if ($name !== '') { - $params['element'] = $name; - } - if (!is_null($attr)) { - $params['attr'] = $attr; - } - - // special case: attribute transform - if (!is_null($attr)) { - if (is_null($property)) { - $property = 'pre'; - } - $type = 'attr_transform_' . $property; - return array($type, $params); - } - - // special case: tag transform - if (is_null($property)) { - return array('tag_transform', $params); - } - - return array($property, $params); - - } - - /** - * Defines all fixes the module will perform in a compact - * associative array of fix name to fix implementation. - * @return array - */ - public function makeFixes() - { - } -} - -// vim: et sw=4 sts=4 + 'none', 'light', 'medium', 'heavy'); + + /** + * Default level to place all fixes in. + * Disabled by default. + * @type string + */ + public $defaultLevel = null; + + /** + * Lists of fixes used by getFixesForLevel(). + * Format is: + * HTMLModule_Tidy->fixesForLevel[$level] = array('fix-1', 'fix-2'); + * @type array + */ + public $fixesForLevel = array( + 'light' => array(), + 'medium' => array(), + 'heavy' => array() + ); + + /** + * Lazy load constructs the module by determining the necessary + * fixes to create and then delegating to the populate() function. + * @param HTMLPurifier_Config $config + * @todo Wildcard matching and error reporting when an added or + * subtracted fix has no effect. + */ + public function setup($config) + { + // create fixes, initialize fixesForLevel + $fixes = $this->makeFixes(); + $this->makeFixesForLevel($fixes); + + // figure out which fixes to use + $level = $config->get('HTML.TidyLevel'); + $fixes_lookup = $this->getFixesForLevel($level); + + // get custom fix declarations: these need namespace processing + $add_fixes = $config->get('HTML.TidyAdd'); + $remove_fixes = $config->get('HTML.TidyRemove'); + + foreach ($fixes as $name => $fix) { + // needs to be refactored a little to implement globbing + if (isset($remove_fixes[$name]) || + (!isset($add_fixes[$name]) && !isset($fixes_lookup[$name]))) { + unset($fixes[$name]); + } + } + + // populate this module with necessary fixes + $this->populate($fixes); + } + + /** + * Retrieves all fixes per a level, returning fixes for that specific + * level as well as all levels below it. + * @param string $level level identifier, see $levels for valid values + * @return array Lookup up table of fixes + */ + public function getFixesForLevel($level) + { + if ($level == $this->levels[0]) { + return array(); + } + $activated_levels = array(); + for ($i = 1, $c = count($this->levels); $i < $c; $i++) { + $activated_levels[] = $this->levels[$i]; + if ($this->levels[$i] == $level) { + break; + } + } + if ($i == $c) { + trigger_error( + 'Tidy level ' . htmlspecialchars($level) . ' not recognized', + E_USER_WARNING + ); + return array(); + } + $ret = array(); + foreach ($activated_levels as $level) { + foreach ($this->fixesForLevel[$level] as $fix) { + $ret[$fix] = true; + } + } + return $ret; + } + + /** + * Dynamically populates the $fixesForLevel member variable using + * the fixes array. It may be custom overloaded, used in conjunction + * with $defaultLevel, or not used at all. + * @param array $fixes + */ + public function makeFixesForLevel($fixes) + { + if (!isset($this->defaultLevel)) { + return; + } + if (!isset($this->fixesForLevel[$this->defaultLevel])) { + trigger_error( + 'Default level ' . $this->defaultLevel . ' does not exist', + E_USER_ERROR + ); + return; + } + $this->fixesForLevel[$this->defaultLevel] = array_keys($fixes); + } + + /** + * Populates the module with transforms and other special-case code + * based on a list of fixes passed to it + * @param array $fixes Lookup table of fixes to activate + */ + public function populate($fixes) + { + foreach ($fixes as $name => $fix) { + // determine what the fix is for + list($type, $params) = $this->getFixType($name); + switch ($type) { + case 'attr_transform_pre': + case 'attr_transform_post': + $attr = $params['attr']; + if (isset($params['element'])) { + $element = $params['element']; + if (empty($this->info[$element])) { + $e = $this->addBlankElement($element); + } else { + $e = $this->info[$element]; + } + } else { + $type = "info_$type"; + $e = $this; + } + // PHP does some weird parsing when I do + // $e->$type[$attr], so I have to assign a ref. + $f =& $e->$type; + $f[$attr] = $fix; + break; + case 'tag_transform': + $this->info_tag_transform[$params['element']] = $fix; + break; + case 'child': + case 'content_model_type': + $element = $params['element']; + if (empty($this->info[$element])) { + $e = $this->addBlankElement($element); + } else { + $e = $this->info[$element]; + } + $e->$type = $fix; + break; + default: + trigger_error("Fix type $type not supported", E_USER_ERROR); + break; + } + } + } + + /** + * Parses a fix name and determines what kind of fix it is, as well + * as other information defined by the fix + * @param $name String name of fix + * @return array(string $fix_type, array $fix_parameters) + * @note $fix_parameters is type dependant, see populate() for usage + * of these parameters + */ + public function getFixType($name) + { + // parse it + $property = $attr = null; + if (strpos($name, '#') !== false) { + list($name, $property) = explode('#', $name); + } + if (strpos($name, '@') !== false) { + list($name, $attr) = explode('@', $name); + } + + // figure out the parameters + $params = array(); + if ($name !== '') { + $params['element'] = $name; + } + if (!is_null($attr)) { + $params['attr'] = $attr; + } + + // special case: attribute transform + if (!is_null($attr)) { + if (is_null($property)) { + $property = 'pre'; + } + $type = 'attr_transform_' . $property; + return array($type, $params); + } + + // special case: tag transform + if (is_null($property)) { + return array('tag_transform', $params); + } + + return array($property, $params); + + } + + /** + * Defines all fixes the module will perform in a compact + * associative array of fix name to fix implementation. + * @return array + */ + public function makeFixes() + { + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Tidy/Name.php b/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Tidy/Name.php similarity index 95% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Tidy/Name.php rename to thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Tidy/Name.php index bb47bafd2..a995161b2 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Tidy/Name.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Tidy/Name.php @@ -1,33 +1,33 @@ -content_model_type != 'strictblockquote') { - return parent::getChildDef($def); - } - return new HTMLPurifier_ChildDef_StrictBlockquote($def->content_model); - } -} - -// vim: et sw=4 sts=4 +content_model_type != 'strictblockquote') { + return parent::getChildDef($def); + } + return new HTMLPurifier_ChildDef_StrictBlockquote($def->content_model); + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Tidy/Transitional.php b/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Tidy/Transitional.php similarity index 94% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Tidy/Transitional.php rename to thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Tidy/Transitional.php index 79411d257..c095ad974 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Tidy/Transitional.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/Tidy/Transitional.php @@ -1,16 +1,16 @@ - 'text-align:left;', - 'right' => 'text-align:right;', - 'top' => 'caption-side:top;', - 'bottom' => 'caption-side:bottom;' // not supported by IE - ) - ); - - // @align for img ------------------------------------------------- - $r['img@align'] = - new HTMLPurifier_AttrTransform_EnumToCSS( - 'align', - array( - 'left' => 'float:left;', - 'right' => 'float:right;', - 'top' => 'vertical-align:top;', - 'middle' => 'vertical-align:middle;', - 'bottom' => 'vertical-align:baseline;', - ) - ); - - // @align for table ----------------------------------------------- - $r['table@align'] = - new HTMLPurifier_AttrTransform_EnumToCSS( - 'align', - array( - 'left' => 'float:left;', - 'center' => 'margin-left:auto;margin-right:auto;', - 'right' => 'float:right;' - ) - ); - - // @align for hr ----------------------------------------------- - $r['hr@align'] = - new HTMLPurifier_AttrTransform_EnumToCSS( - 'align', - array( - // we use both text-align and margin because these work - // for different browsers (IE and Firefox, respectively) - // and the melange makes for a pretty cross-compatible - // solution - 'left' => 'margin-left:0;margin-right:auto;text-align:left;', - 'center' => 'margin-left:auto;margin-right:auto;text-align:center;', - 'right' => 'margin-left:auto;margin-right:0;text-align:right;' - ) - ); - - // @align for h1, h2, h3, h4, h5, h6, p, div ---------------------- - // {{{ - $align_lookup = array(); - $align_values = array('left', 'right', 'center', 'justify'); - foreach ($align_values as $v) { - $align_lookup[$v] = "text-align:$v;"; - } - // }}} - $r['h1@align'] = - $r['h2@align'] = - $r['h3@align'] = - $r['h4@align'] = - $r['h5@align'] = - $r['h6@align'] = - $r['p@align'] = - $r['div@align'] = - new HTMLPurifier_AttrTransform_EnumToCSS('align', $align_lookup); - - // @bgcolor for table, tr, td, th --------------------------------- - $r['table@bgcolor'] = - $r['td@bgcolor'] = - $r['th@bgcolor'] = - new HTMLPurifier_AttrTransform_BgColor(); - - // @border for img ------------------------------------------------ - $r['img@border'] = new HTMLPurifier_AttrTransform_Border(); - - // @clear for br -------------------------------------------------- - $r['br@clear'] = - new HTMLPurifier_AttrTransform_EnumToCSS( - 'clear', - array( - 'left' => 'clear:left;', - 'right' => 'clear:right;', - 'all' => 'clear:both;', - 'none' => 'clear:none;', - ) - ); - - // @height for td, th --------------------------------------------- - $r['td@height'] = - $r['th@height'] = - new HTMLPurifier_AttrTransform_Length('height'); - - // @hspace for img ------------------------------------------------ - $r['img@hspace'] = new HTMLPurifier_AttrTransform_ImgSpace('hspace'); - - // @noshade for hr ------------------------------------------------ - // this transformation is not precise but often good enough. - // different browsers use different styles to designate noshade - $r['hr@noshade'] = - new HTMLPurifier_AttrTransform_BoolToCSS( - 'noshade', - 'color:#808080;background-color:#808080;border:0;' - ); - - // @nowrap for td, th --------------------------------------------- - $r['td@nowrap'] = - $r['th@nowrap'] = - new HTMLPurifier_AttrTransform_BoolToCSS( - 'nowrap', - 'white-space:nowrap;' - ); - - // @size for hr -------------------------------------------------- - $r['hr@size'] = new HTMLPurifier_AttrTransform_Length('size', 'height'); - - // @type for li, ol, ul ------------------------------------------- - // {{{ - $ul_types = array( - 'disc' => 'list-style-type:disc;', - 'square' => 'list-style-type:square;', - 'circle' => 'list-style-type:circle;' - ); - $ol_types = array( - '1' => 'list-style-type:decimal;', - 'i' => 'list-style-type:lower-roman;', - 'I' => 'list-style-type:upper-roman;', - 'a' => 'list-style-type:lower-alpha;', - 'A' => 'list-style-type:upper-alpha;' - ); - $li_types = $ul_types + $ol_types; - // }}} - - $r['ul@type'] = new HTMLPurifier_AttrTransform_EnumToCSS('type', $ul_types); - $r['ol@type'] = new HTMLPurifier_AttrTransform_EnumToCSS('type', $ol_types, true); - $r['li@type'] = new HTMLPurifier_AttrTransform_EnumToCSS('type', $li_types, true); - - // @vspace for img ------------------------------------------------ - $r['img@vspace'] = new HTMLPurifier_AttrTransform_ImgSpace('vspace'); - - // @width for hr, td, th ------------------------------------------ - $r['td@width'] = - $r['th@width'] = - $r['hr@width'] = new HTMLPurifier_AttrTransform_Length('width'); - - return $r; - } -} - -// vim: et sw=4 sts=4 + 'text-align:left;', + 'right' => 'text-align:right;', + 'top' => 'caption-side:top;', + 'bottom' => 'caption-side:bottom;' // not supported by IE + ) + ); + + // @align for img ------------------------------------------------- + $r['img@align'] = + new HTMLPurifier_AttrTransform_EnumToCSS( + 'align', + array( + 'left' => 'float:left;', + 'right' => 'float:right;', + 'top' => 'vertical-align:top;', + 'middle' => 'vertical-align:middle;', + 'bottom' => 'vertical-align:baseline;', + ) + ); + + // @align for table ----------------------------------------------- + $r['table@align'] = + new HTMLPurifier_AttrTransform_EnumToCSS( + 'align', + array( + 'left' => 'float:left;', + 'center' => 'margin-left:auto;margin-right:auto;', + 'right' => 'float:right;' + ) + ); + + // @align for hr ----------------------------------------------- + $r['hr@align'] = + new HTMLPurifier_AttrTransform_EnumToCSS( + 'align', + array( + // we use both text-align and margin because these work + // for different browsers (IE and Firefox, respectively) + // and the melange makes for a pretty cross-compatible + // solution + 'left' => 'margin-left:0;margin-right:auto;text-align:left;', + 'center' => 'margin-left:auto;margin-right:auto;text-align:center;', + 'right' => 'margin-left:auto;margin-right:0;text-align:right;' + ) + ); + + // @align for h1, h2, h3, h4, h5, h6, p, div ---------------------- + // {{{ + $align_lookup = array(); + $align_values = array('left', 'right', 'center', 'justify'); + foreach ($align_values as $v) { + $align_lookup[$v] = "text-align:$v;"; + } + // }}} + $r['h1@align'] = + $r['h2@align'] = + $r['h3@align'] = + $r['h4@align'] = + $r['h5@align'] = + $r['h6@align'] = + $r['p@align'] = + $r['div@align'] = + new HTMLPurifier_AttrTransform_EnumToCSS('align', $align_lookup); + + // @bgcolor for table, tr, td, th --------------------------------- + $r['table@bgcolor'] = + $r['td@bgcolor'] = + $r['th@bgcolor'] = + new HTMLPurifier_AttrTransform_BgColor(); + + // @border for img ------------------------------------------------ + $r['img@border'] = new HTMLPurifier_AttrTransform_Border(); + + // @clear for br -------------------------------------------------- + $r['br@clear'] = + new HTMLPurifier_AttrTransform_EnumToCSS( + 'clear', + array( + 'left' => 'clear:left;', + 'right' => 'clear:right;', + 'all' => 'clear:both;', + 'none' => 'clear:none;', + ) + ); + + // @height for td, th --------------------------------------------- + $r['td@height'] = + $r['th@height'] = + new HTMLPurifier_AttrTransform_Length('height'); + + // @hspace for img ------------------------------------------------ + $r['img@hspace'] = new HTMLPurifier_AttrTransform_ImgSpace('hspace'); + + // @noshade for hr ------------------------------------------------ + // this transformation is not precise but often good enough. + // different browsers use different styles to designate noshade + $r['hr@noshade'] = + new HTMLPurifier_AttrTransform_BoolToCSS( + 'noshade', + 'color:#808080;background-color:#808080;border:0;' + ); + + // @nowrap for td, th --------------------------------------------- + $r['td@nowrap'] = + $r['th@nowrap'] = + new HTMLPurifier_AttrTransform_BoolToCSS( + 'nowrap', + 'white-space:nowrap;' + ); + + // @size for hr -------------------------------------------------- + $r['hr@size'] = new HTMLPurifier_AttrTransform_Length('size', 'height'); + + // @type for li, ol, ul ------------------------------------------- + // {{{ + $ul_types = array( + 'disc' => 'list-style-type:disc;', + 'square' => 'list-style-type:square;', + 'circle' => 'list-style-type:circle;' + ); + $ol_types = array( + '1' => 'list-style-type:decimal;', + 'i' => 'list-style-type:lower-roman;', + 'I' => 'list-style-type:upper-roman;', + 'a' => 'list-style-type:lower-alpha;', + 'A' => 'list-style-type:upper-alpha;' + ); + $li_types = $ul_types + $ol_types; + // }}} + + $r['ul@type'] = new HTMLPurifier_AttrTransform_EnumToCSS('type', $ul_types); + $r['ol@type'] = new HTMLPurifier_AttrTransform_EnumToCSS('type', $ol_types, true); + $r['li@type'] = new HTMLPurifier_AttrTransform_EnumToCSS('type', $li_types, true); + + // @vspace for img ------------------------------------------------ + $r['img@vspace'] = new HTMLPurifier_AttrTransform_ImgSpace('vspace'); + + // @width for hr, td, th ------------------------------------------ + $r['td@width'] = + $r['th@width'] = + $r['hr@width'] = new HTMLPurifier_AttrTransform_Length('width'); + + return $r; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/XMLCommonAttributes.php b/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/XMLCommonAttributes.php similarity index 94% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/XMLCommonAttributes.php rename to thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/XMLCommonAttributes.php index 27a353db3..01dbe9deb 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/XMLCommonAttributes.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModule/XMLCommonAttributes.php @@ -1,20 +1,20 @@ - array( - 'xml:lang' => 'LanguageCode', - ) - ); -} - -// vim: et sw=4 sts=4 + array( + 'xml:lang' => 'LanguageCode', + ) + ); +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModuleManager.php b/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModuleManager.php similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModuleManager.php rename to thirdparty/HTMLPurifier/HTMLPurifier/HTMLModuleManager.php index c684961ba..f3a17cb03 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModuleManager.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/HTMLModuleManager.php @@ -1,459 +1,459 @@ -attrTypes = new HTMLPurifier_AttrTypes(); - $this->doctypes = new HTMLPurifier_DoctypeRegistry(); - - // setup basic modules - $common = array( - 'CommonAttributes', 'Text', 'Hypertext', 'List', - 'Presentation', 'Edit', 'Bdo', 'Tables', 'Image', - 'StyleAttribute', - // Unsafe: - 'Scripting', 'Object', 'Forms', - // Sorta legacy, but present in strict: - 'Name', - ); - $transitional = array('Legacy', 'Target', 'Iframe'); - $xml = array('XMLCommonAttributes'); - $non_xml = array('NonXMLCommonAttributes'); - - // setup basic doctypes - $this->doctypes->register( - 'HTML 4.01 Transitional', - false, - array_merge($common, $transitional, $non_xml), - array('Tidy_Transitional', 'Tidy_Proprietary'), - array(), - '-//W3C//DTD HTML 4.01 Transitional//EN', - 'http://www.w3.org/TR/html4/loose.dtd' - ); - - $this->doctypes->register( - 'HTML 4.01 Strict', - false, - array_merge($common, $non_xml), - array('Tidy_Strict', 'Tidy_Proprietary', 'Tidy_Name'), - array(), - '-//W3C//DTD HTML 4.01//EN', - 'http://www.w3.org/TR/html4/strict.dtd' - ); - - $this->doctypes->register( - 'XHTML 1.0 Transitional', - true, - array_merge($common, $transitional, $xml, $non_xml), - array('Tidy_Transitional', 'Tidy_XHTML', 'Tidy_Proprietary', 'Tidy_Name'), - array(), - '-//W3C//DTD XHTML 1.0 Transitional//EN', - 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd' - ); - - $this->doctypes->register( - 'XHTML 1.0 Strict', - true, - array_merge($common, $xml, $non_xml), - array('Tidy_Strict', 'Tidy_XHTML', 'Tidy_Strict', 'Tidy_Proprietary', 'Tidy_Name'), - array(), - '-//W3C//DTD XHTML 1.0 Strict//EN', - 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd' - ); - - $this->doctypes->register( - 'XHTML 1.1', - true, - // Iframe is a real XHTML 1.1 module, despite being - // "transitional"! - array_merge($common, $xml, array('Ruby', 'Iframe')), - array('Tidy_Strict', 'Tidy_XHTML', 'Tidy_Proprietary', 'Tidy_Strict', 'Tidy_Name'), // Tidy_XHTML1_1 - array(), - '-//W3C//DTD XHTML 1.1//EN', - 'http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd' - ); - - } - - /** - * Registers a module to the recognized module list, useful for - * overloading pre-existing modules. - * @param $module Mixed: string module name, with or without - * HTMLPurifier_HTMLModule prefix, or instance of - * subclass of HTMLPurifier_HTMLModule. - * @param $overload Boolean whether or not to overload previous modules. - * If this is not set, and you do overload a module, - * HTML Purifier will complain with a warning. - * @note This function will not call autoload, you must instantiate - * (and thus invoke) autoload outside the method. - * @note If a string is passed as a module name, different variants - * will be tested in this order: - * - Check for HTMLPurifier_HTMLModule_$name - * - Check all prefixes with $name in order they were added - * - Check for literal object name - * - Throw fatal error - * If your object name collides with an internal class, specify - * your module manually. All modules must have been included - * externally: registerModule will not perform inclusions for you! - */ - public function registerModule($module, $overload = false) - { - if (is_string($module)) { - // attempt to load the module - $original_module = $module; - $ok = false; - foreach ($this->prefixes as $prefix) { - $module = $prefix . $original_module; - if (class_exists($module)) { - $ok = true; - break; - } - } - if (!$ok) { - $module = $original_module; - if (!class_exists($module)) { - trigger_error( - $original_module . ' module does not exist', - E_USER_ERROR - ); - return; - } - } - $module = new $module(); - } - if (empty($module->name)) { - trigger_error('Module instance of ' . get_class($module) . ' must have name'); - return; - } - if (!$overload && isset($this->registeredModules[$module->name])) { - trigger_error('Overloading ' . $module->name . ' without explicit overload parameter', E_USER_WARNING); - } - $this->registeredModules[$module->name] = $module; - } - - /** - * Adds a module to the current doctype by first registering it, - * and then tacking it on to the active doctype - */ - public function addModule($module) - { - $this->registerModule($module); - if (is_object($module)) { - $module = $module->name; - } - $this->userModules[] = $module; - } - - /** - * Adds a class prefix that registerModule() will use to resolve a - * string name to a concrete class - */ - public function addPrefix($prefix) - { - $this->prefixes[] = $prefix; - } - - /** - * Performs processing on modules, after being called you may - * use getElement() and getElements() - * @param HTMLPurifier_Config $config - */ - public function setup($config) - { - $this->trusted = $config->get('HTML.Trusted'); - - // generate - $this->doctype = $this->doctypes->make($config); - $modules = $this->doctype->modules; - - // take out the default modules that aren't allowed - $lookup = $config->get('HTML.AllowedModules'); - $special_cases = $config->get('HTML.CoreModules'); - - if (is_array($lookup)) { - foreach ($modules as $k => $m) { - if (isset($special_cases[$m])) { - continue; - } - if (!isset($lookup[$m])) { - unset($modules[$k]); - } - } - } - - // custom modules - if ($config->get('HTML.Proprietary')) { - $modules[] = 'Proprietary'; - } - if ($config->get('HTML.SafeObject')) { - $modules[] = 'SafeObject'; - } - if ($config->get('HTML.SafeEmbed')) { - $modules[] = 'SafeEmbed'; - } - if ($config->get('HTML.SafeScripting') !== array()) { - $modules[] = 'SafeScripting'; - } - if ($config->get('HTML.Nofollow')) { - $modules[] = 'Nofollow'; - } - if ($config->get('HTML.TargetBlank')) { - $modules[] = 'TargetBlank'; - } - - // merge in custom modules - $modules = array_merge($modules, $this->userModules); - - foreach ($modules as $module) { - $this->processModule($module); - $this->modules[$module]->setup($config); - } - - foreach ($this->doctype->tidyModules as $module) { - $this->processModule($module); - $this->modules[$module]->setup($config); - } - - // prepare any injectors - foreach ($this->modules as $module) { - $n = array(); - foreach ($module->info_injector as $injector) { - if (!is_object($injector)) { - $class = "HTMLPurifier_Injector_$injector"; - $injector = new $class; - } - $n[$injector->name] = $injector; - } - $module->info_injector = $n; - } - - // setup lookup table based on all valid modules - foreach ($this->modules as $module) { - foreach ($module->info as $name => $def) { - if (!isset($this->elementLookup[$name])) { - $this->elementLookup[$name] = array(); - } - $this->elementLookup[$name][] = $module->name; - } - } - - // note the different choice - $this->contentSets = new HTMLPurifier_ContentSets( - // content set assembly deals with all possible modules, - // not just ones deemed to be "safe" - $this->modules - ); - $this->attrCollections = new HTMLPurifier_AttrCollections( - $this->attrTypes, - // there is no way to directly disable a global attribute, - // but using AllowedAttributes or simply not including - // the module in your custom doctype should be sufficient - $this->modules - ); - } - - /** - * Takes a module and adds it to the active module collection, - * registering it if necessary. - */ - public function processModule($module) - { - if (!isset($this->registeredModules[$module]) || is_object($module)) { - $this->registerModule($module); - } - $this->modules[$module] = $this->registeredModules[$module]; - } - - /** - * Retrieves merged element definitions. - * @return Array of HTMLPurifier_ElementDef - */ - public function getElements() - { - $elements = array(); - foreach ($this->modules as $module) { - if (!$this->trusted && !$module->safe) { - continue; - } - foreach ($module->info as $name => $v) { - if (isset($elements[$name])) { - continue; - } - $elements[$name] = $this->getElement($name); - } - } - - // remove dud elements, this happens when an element that - // appeared to be safe actually wasn't - foreach ($elements as $n => $v) { - if ($v === false) { - unset($elements[$n]); - } - } - - return $elements; - - } - - /** - * Retrieves a single merged element definition - * @param string $name Name of element - * @param bool $trusted Boolean trusted overriding parameter: set to true - * if you want the full version of an element - * @return HTMLPurifier_ElementDef Merged HTMLPurifier_ElementDef - * @note You may notice that modules are getting iterated over twice (once - * in getElements() and once here). This - * is because - */ - public function getElement($name, $trusted = null) - { - if (!isset($this->elementLookup[$name])) { - return false; - } - - // setup global state variables - $def = false; - if ($trusted === null) { - $trusted = $this->trusted; - } - - // iterate through each module that has registered itself to this - // element - foreach ($this->elementLookup[$name] as $module_name) { - $module = $this->modules[$module_name]; - - // refuse to create/merge from a module that is deemed unsafe-- - // pretend the module doesn't exist--when trusted mode is not on. - if (!$trusted && !$module->safe) { - continue; - } - - // clone is used because, ideally speaking, the original - // definition should not be modified. Usually, this will - // make no difference, but for consistency's sake - $new_def = clone $module->info[$name]; - - if (!$def && $new_def->standalone) { - $def = $new_def; - } elseif ($def) { - // This will occur even if $new_def is standalone. In practice, - // this will usually result in a full replacement. - $def->mergeIn($new_def); - } else { - // :TODO: - // non-standalone definitions that don't have a standalone - // to merge into could be deferred to the end - // HOWEVER, it is perfectly valid for a non-standalone - // definition to lack a standalone definition, even - // after all processing: this allows us to safely - // specify extra attributes for elements that may not be - // enabled all in one place. In particular, this might - // be the case for trusted elements. WARNING: care must - // be taken that the /extra/ definitions are all safe. - continue; - } - - // attribute value expansions - $this->attrCollections->performInclusions($def->attr); - $this->attrCollections->expandIdentifiers($def->attr, $this->attrTypes); - - // descendants_are_inline, for ChildDef_Chameleon - if (is_string($def->content_model) && - strpos($def->content_model, 'Inline') !== false) { - if ($name != 'del' && $name != 'ins') { - // this is for you, ins/del - $def->descendants_are_inline = true; - } - } - - $this->contentSets->generateChildDef($def, $module); - } - - // This can occur if there is a blank definition, but no base to - // mix it in with - if (!$def) { - return false; - } - - // add information on required attributes - foreach ($def->attr as $attr_name => $attr_def) { - if ($attr_def->required) { - $def->required_attr[] = $attr_name; - } - } - return $def; - } -} - -// vim: et sw=4 sts=4 +attrTypes = new HTMLPurifier_AttrTypes(); + $this->doctypes = new HTMLPurifier_DoctypeRegistry(); + + // setup basic modules + $common = array( + 'CommonAttributes', 'Text', 'Hypertext', 'List', + 'Presentation', 'Edit', 'Bdo', 'Tables', 'Image', + 'StyleAttribute', + // Unsafe: + 'Scripting', 'Object', 'Forms', + // Sorta legacy, but present in strict: + 'Name', + ); + $transitional = array('Legacy', 'Target', 'Iframe'); + $xml = array('XMLCommonAttributes'); + $non_xml = array('NonXMLCommonAttributes'); + + // setup basic doctypes + $this->doctypes->register( + 'HTML 4.01 Transitional', + false, + array_merge($common, $transitional, $non_xml), + array('Tidy_Transitional', 'Tidy_Proprietary'), + array(), + '-//W3C//DTD HTML 4.01 Transitional//EN', + 'http://www.w3.org/TR/html4/loose.dtd' + ); + + $this->doctypes->register( + 'HTML 4.01 Strict', + false, + array_merge($common, $non_xml), + array('Tidy_Strict', 'Tidy_Proprietary', 'Tidy_Name'), + array(), + '-//W3C//DTD HTML 4.01//EN', + 'http://www.w3.org/TR/html4/strict.dtd' + ); + + $this->doctypes->register( + 'XHTML 1.0 Transitional', + true, + array_merge($common, $transitional, $xml, $non_xml), + array('Tidy_Transitional', 'Tidy_XHTML', 'Tidy_Proprietary', 'Tidy_Name'), + array(), + '-//W3C//DTD XHTML 1.0 Transitional//EN', + 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd' + ); + + $this->doctypes->register( + 'XHTML 1.0 Strict', + true, + array_merge($common, $xml, $non_xml), + array('Tidy_Strict', 'Tidy_XHTML', 'Tidy_Strict', 'Tidy_Proprietary', 'Tidy_Name'), + array(), + '-//W3C//DTD XHTML 1.0 Strict//EN', + 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd' + ); + + $this->doctypes->register( + 'XHTML 1.1', + true, + // Iframe is a real XHTML 1.1 module, despite being + // "transitional"! + array_merge($common, $xml, array('Ruby', 'Iframe')), + array('Tidy_Strict', 'Tidy_XHTML', 'Tidy_Proprietary', 'Tidy_Strict', 'Tidy_Name'), // Tidy_XHTML1_1 + array(), + '-//W3C//DTD XHTML 1.1//EN', + 'http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd' + ); + + } + + /** + * Registers a module to the recognized module list, useful for + * overloading pre-existing modules. + * @param $module Mixed: string module name, with or without + * HTMLPurifier_HTMLModule prefix, or instance of + * subclass of HTMLPurifier_HTMLModule. + * @param $overload Boolean whether or not to overload previous modules. + * If this is not set, and you do overload a module, + * HTML Purifier will complain with a warning. + * @note This function will not call autoload, you must instantiate + * (and thus invoke) autoload outside the method. + * @note If a string is passed as a module name, different variants + * will be tested in this order: + * - Check for HTMLPurifier_HTMLModule_$name + * - Check all prefixes with $name in order they were added + * - Check for literal object name + * - Throw fatal error + * If your object name collides with an internal class, specify + * your module manually. All modules must have been included + * externally: registerModule will not perform inclusions for you! + */ + public function registerModule($module, $overload = false) + { + if (is_string($module)) { + // attempt to load the module + $original_module = $module; + $ok = false; + foreach ($this->prefixes as $prefix) { + $module = $prefix . $original_module; + if (class_exists($module)) { + $ok = true; + break; + } + } + if (!$ok) { + $module = $original_module; + if (!class_exists($module)) { + trigger_error( + $original_module . ' module does not exist', + E_USER_ERROR + ); + return; + } + } + $module = new $module(); + } + if (empty($module->name)) { + trigger_error('Module instance of ' . get_class($module) . ' must have name'); + return; + } + if (!$overload && isset($this->registeredModules[$module->name])) { + trigger_error('Overloading ' . $module->name . ' without explicit overload parameter', E_USER_WARNING); + } + $this->registeredModules[$module->name] = $module; + } + + /** + * Adds a module to the current doctype by first registering it, + * and then tacking it on to the active doctype + */ + public function addModule($module) + { + $this->registerModule($module); + if (is_object($module)) { + $module = $module->name; + } + $this->userModules[] = $module; + } + + /** + * Adds a class prefix that registerModule() will use to resolve a + * string name to a concrete class + */ + public function addPrefix($prefix) + { + $this->prefixes[] = $prefix; + } + + /** + * Performs processing on modules, after being called you may + * use getElement() and getElements() + * @param HTMLPurifier_Config $config + */ + public function setup($config) + { + $this->trusted = $config->get('HTML.Trusted'); + + // generate + $this->doctype = $this->doctypes->make($config); + $modules = $this->doctype->modules; + + // take out the default modules that aren't allowed + $lookup = $config->get('HTML.AllowedModules'); + $special_cases = $config->get('HTML.CoreModules'); + + if (is_array($lookup)) { + foreach ($modules as $k => $m) { + if (isset($special_cases[$m])) { + continue; + } + if (!isset($lookup[$m])) { + unset($modules[$k]); + } + } + } + + // custom modules + if ($config->get('HTML.Proprietary')) { + $modules[] = 'Proprietary'; + } + if ($config->get('HTML.SafeObject')) { + $modules[] = 'SafeObject'; + } + if ($config->get('HTML.SafeEmbed')) { + $modules[] = 'SafeEmbed'; + } + if ($config->get('HTML.SafeScripting') !== array()) { + $modules[] = 'SafeScripting'; + } + if ($config->get('HTML.Nofollow')) { + $modules[] = 'Nofollow'; + } + if ($config->get('HTML.TargetBlank')) { + $modules[] = 'TargetBlank'; + } + + // merge in custom modules + $modules = array_merge($modules, $this->userModules); + + foreach ($modules as $module) { + $this->processModule($module); + $this->modules[$module]->setup($config); + } + + foreach ($this->doctype->tidyModules as $module) { + $this->processModule($module); + $this->modules[$module]->setup($config); + } + + // prepare any injectors + foreach ($this->modules as $module) { + $n = array(); + foreach ($module->info_injector as $injector) { + if (!is_object($injector)) { + $class = "HTMLPurifier_Injector_$injector"; + $injector = new $class; + } + $n[$injector->name] = $injector; + } + $module->info_injector = $n; + } + + // setup lookup table based on all valid modules + foreach ($this->modules as $module) { + foreach ($module->info as $name => $def) { + if (!isset($this->elementLookup[$name])) { + $this->elementLookup[$name] = array(); + } + $this->elementLookup[$name][] = $module->name; + } + } + + // note the different choice + $this->contentSets = new HTMLPurifier_ContentSets( + // content set assembly deals with all possible modules, + // not just ones deemed to be "safe" + $this->modules + ); + $this->attrCollections = new HTMLPurifier_AttrCollections( + $this->attrTypes, + // there is no way to directly disable a global attribute, + // but using AllowedAttributes or simply not including + // the module in your custom doctype should be sufficient + $this->modules + ); + } + + /** + * Takes a module and adds it to the active module collection, + * registering it if necessary. + */ + public function processModule($module) + { + if (!isset($this->registeredModules[$module]) || is_object($module)) { + $this->registerModule($module); + } + $this->modules[$module] = $this->registeredModules[$module]; + } + + /** + * Retrieves merged element definitions. + * @return Array of HTMLPurifier_ElementDef + */ + public function getElements() + { + $elements = array(); + foreach ($this->modules as $module) { + if (!$this->trusted && !$module->safe) { + continue; + } + foreach ($module->info as $name => $v) { + if (isset($elements[$name])) { + continue; + } + $elements[$name] = $this->getElement($name); + } + } + + // remove dud elements, this happens when an element that + // appeared to be safe actually wasn't + foreach ($elements as $n => $v) { + if ($v === false) { + unset($elements[$n]); + } + } + + return $elements; + + } + + /** + * Retrieves a single merged element definition + * @param string $name Name of element + * @param bool $trusted Boolean trusted overriding parameter: set to true + * if you want the full version of an element + * @return HTMLPurifier_ElementDef Merged HTMLPurifier_ElementDef + * @note You may notice that modules are getting iterated over twice (once + * in getElements() and once here). This + * is because + */ + public function getElement($name, $trusted = null) + { + if (!isset($this->elementLookup[$name])) { + return false; + } + + // setup global state variables + $def = false; + if ($trusted === null) { + $trusted = $this->trusted; + } + + // iterate through each module that has registered itself to this + // element + foreach ($this->elementLookup[$name] as $module_name) { + $module = $this->modules[$module_name]; + + // refuse to create/merge from a module that is deemed unsafe-- + // pretend the module doesn't exist--when trusted mode is not on. + if (!$trusted && !$module->safe) { + continue; + } + + // clone is used because, ideally speaking, the original + // definition should not be modified. Usually, this will + // make no difference, but for consistency's sake + $new_def = clone $module->info[$name]; + + if (!$def && $new_def->standalone) { + $def = $new_def; + } elseif ($def) { + // This will occur even if $new_def is standalone. In practice, + // this will usually result in a full replacement. + $def->mergeIn($new_def); + } else { + // :TODO: + // non-standalone definitions that don't have a standalone + // to merge into could be deferred to the end + // HOWEVER, it is perfectly valid for a non-standalone + // definition to lack a standalone definition, even + // after all processing: this allows us to safely + // specify extra attributes for elements that may not be + // enabled all in one place. In particular, this might + // be the case for trusted elements. WARNING: care must + // be taken that the /extra/ definitions are all safe. + continue; + } + + // attribute value expansions + $this->attrCollections->performInclusions($def->attr); + $this->attrCollections->expandIdentifiers($def->attr, $this->attrTypes); + + // descendants_are_inline, for ChildDef_Chameleon + if (is_string($def->content_model) && + strpos($def->content_model, 'Inline') !== false) { + if ($name != 'del' && $name != 'ins') { + // this is for you, ins/del + $def->descendants_are_inline = true; + } + } + + $this->contentSets->generateChildDef($def, $module); + } + + // This can occur if there is a blank definition, but no base to + // mix it in with + if (!$def) { + return false; + } + + // add information on required attributes + foreach ($def->attr as $attr_name => $attr_def) { + if ($attr_def->required) { + $def->required_attr[] = $attr_name; + } + } + return $def; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/IDAccumulator.php b/thirdparty/HTMLPurifier/HTMLPurifier/IDAccumulator.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/IDAccumulator.php rename to thirdparty/HTMLPurifier/HTMLPurifier/IDAccumulator.php index bf399af4a..65c902c07 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/IDAccumulator.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/IDAccumulator.php @@ -1,57 +1,57 @@ -load($config->get('Attr.IDBlacklist')); - return $id_accumulator; - } - - /** - * Add an ID to the lookup table. - * @param string $id ID to be added. - * @return bool status, true if success, false if there's a dupe - */ - public function add($id) - { - if (isset($this->ids[$id])) { - return false; - } - return $this->ids[$id] = true; - } - - /** - * Load a list of IDs into the lookup table - * @param $array_of_ids Array of IDs to load - * @note This function doesn't care about duplicates - */ - public function load($array_of_ids) - { - foreach ($array_of_ids as $id) { - $this->ids[$id] = true; - } - } -} - -// vim: et sw=4 sts=4 +load($config->get('Attr.IDBlacklist')); + return $id_accumulator; + } + + /** + * Add an ID to the lookup table. + * @param string $id ID to be added. + * @return bool status, true if success, false if there's a dupe + */ + public function add($id) + { + if (isset($this->ids[$id])) { + return false; + } + return $this->ids[$id] = true; + } + + /** + * Load a list of IDs into the lookup table + * @param $array_of_ids Array of IDs to load + * @note This function doesn't care about duplicates + */ + public function load($array_of_ids) + { + foreach ($array_of_ids as $id) { + $this->ids[$id] = true; + } + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Injector.php b/thirdparty/HTMLPurifier/HTMLPurifier/Injector.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Injector.php rename to thirdparty/HTMLPurifier/HTMLPurifier/Injector.php index f1a74a4a6..5060eef9e 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Injector.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/Injector.php @@ -1,281 +1,281 @@ -processToken() - * documentation. - * - * @todo Allow injectors to request a re-run on their output. This - * would help if an operation is recursive. - */ -abstract class HTMLPurifier_Injector -{ - - /** - * Advisory name of injector, this is for friendly error messages. - * @type string - */ - public $name; - - /** - * @type HTMLPurifier_HTMLDefinition - */ - protected $htmlDefinition; - - /** - * Reference to CurrentNesting variable in Context. This is an array - * list of tokens that we are currently "inside" - * @type array - */ - protected $currentNesting; - - /** - * Reference to current token. - * @type HTMLPurifier_Token - */ - protected $currentToken; - - /** - * Reference to InputZipper variable in Context. - * @type HTMLPurifier_Zipper - */ - protected $inputZipper; - - /** - * Array of elements and attributes this injector creates and therefore - * need to be allowed by the definition. Takes form of - * array('element' => array('attr', 'attr2'), 'element2') - * @type array - */ - public $needed = array(); - - /** - * Number of elements to rewind backwards (relative). - * @type bool|int - */ - protected $rewindOffset = false; - - /** - * Rewind to a spot to re-perform processing. This is useful if you - * deleted a node, and now need to see if this change affected any - * earlier nodes. Rewinding does not affect other injectors, and can - * result in infinite loops if not used carefully. - * @param bool|int $offset - * @warning HTML Purifier will prevent you from fast-forwarding with this - * function. - */ - public function rewindOffset($offset) - { - $this->rewindOffset = $offset; - } - - /** - * Retrieves rewind offset, and then unsets it. - * @return bool|int - */ - public function getRewindOffset() - { - $r = $this->rewindOffset; - $this->rewindOffset = false; - return $r; - } - - /** - * Prepares the injector by giving it the config and context objects: - * this allows references to important variables to be made within - * the injector. This function also checks if the HTML environment - * will work with the Injector (see checkNeeded()). - * @param HTMLPurifier_Config $config - * @param HTMLPurifier_Context $context - * @return bool|string Boolean false if success, string of missing needed element/attribute if failure - */ - public function prepare($config, $context) - { - $this->htmlDefinition = $config->getHTMLDefinition(); - // Even though this might fail, some unit tests ignore this and - // still test checkNeeded, so be careful. Maybe get rid of that - // dependency. - $result = $this->checkNeeded($config); - if ($result !== false) { - return $result; - } - $this->currentNesting =& $context->get('CurrentNesting'); - $this->currentToken =& $context->get('CurrentToken'); - $this->inputZipper =& $context->get('InputZipper'); - return false; - } - - /** - * This function checks if the HTML environment - * will work with the Injector: if p tags are not allowed, the - * Auto-Paragraphing injector should not be enabled. - * @param HTMLPurifier_Config $config - * @return bool|string Boolean false if success, string of missing needed element/attribute if failure - */ - public function checkNeeded($config) - { - $def = $config->getHTMLDefinition(); - foreach ($this->needed as $element => $attributes) { - if (is_int($element)) { - $element = $attributes; - } - if (!isset($def->info[$element])) { - return $element; - } - if (!is_array($attributes)) { - continue; - } - foreach ($attributes as $name) { - if (!isset($def->info[$element]->attr[$name])) { - return "$element.$name"; - } - } - } - return false; - } - - /** - * Tests if the context node allows a certain element - * @param string $name Name of element to test for - * @return bool True if element is allowed, false if it is not - */ - public function allowsElement($name) - { - if (!empty($this->currentNesting)) { - $parent_token = array_pop($this->currentNesting); - $this->currentNesting[] = $parent_token; - $parent = $this->htmlDefinition->info[$parent_token->name]; - } else { - $parent = $this->htmlDefinition->info_parent_def; - } - if (!isset($parent->child->elements[$name]) || isset($parent->excludes[$name])) { - return false; - } - // check for exclusion - for ($i = count($this->currentNesting) - 2; $i >= 0; $i--) { - $node = $this->currentNesting[$i]; - $def = $this->htmlDefinition->info[$node->name]; - if (isset($def->excludes[$name])) { - return false; - } - } - return true; - } - - /** - * Iterator function, which starts with the next token and continues until - * you reach the end of the input tokens. - * @warning Please prevent previous references from interfering with this - * functions by setting $i = null beforehand! - * @param int $i Current integer index variable for inputTokens - * @param HTMLPurifier_Token $current Current token variable. - * Do NOT use $token, as that variable is also a reference - * @return bool - */ - protected function forward(&$i, &$current) - { - if ($i === null) { - $i = count($this->inputZipper->back) - 1; - } else { - $i--; - } - if ($i < 0) { - return false; - } - $current = $this->inputZipper->back[$i]; - return true; - } - - /** - * Similar to _forward, but accepts a third parameter $nesting (which - * should be initialized at 0) and stops when we hit the end tag - * for the node $this->inputIndex starts in. - * @param int $i Current integer index variable for inputTokens - * @param HTMLPurifier_Token $current Current token variable. - * Do NOT use $token, as that variable is also a reference - * @param int $nesting - * @return bool - */ - protected function forwardUntilEndToken(&$i, &$current, &$nesting) - { - $result = $this->forward($i, $current); - if (!$result) { - return false; - } - if ($nesting === null) { - $nesting = 0; - } - if ($current instanceof HTMLPurifier_Token_Start) { - $nesting++; - } elseif ($current instanceof HTMLPurifier_Token_End) { - if ($nesting <= 0) { - return false; - } - $nesting--; - } - return true; - } - - /** - * Iterator function, starts with the previous token and continues until - * you reach the beginning of input tokens. - * @warning Please prevent previous references from interfering with this - * functions by setting $i = null beforehand! - * @param int $i Current integer index variable for inputTokens - * @param HTMLPurifier_Token $current Current token variable. - * Do NOT use $token, as that variable is also a reference - * @return bool - */ - protected function backward(&$i, &$current) - { - if ($i === null) { - $i = count($this->inputZipper->front) - 1; - } else { - $i--; - } - if ($i < 0) { - return false; - } - $current = $this->inputZipper->front[$i]; - return true; - } - - /** - * Handler that is called when a text token is processed - */ - public function handleText(&$token) - { - } - - /** - * Handler that is called when a start or empty token is processed - */ - public function handleElement(&$token) - { - } - - /** - * Handler that is called when an end token is processed - */ - public function handleEnd(&$token) - { - $this->notifyEnd($token); - } - - /** - * Notifier that is called when an end token is processed - * @param HTMLPurifier_Token $token Current token variable. - * @note This differs from handlers in that the token is read-only - * @deprecated - */ - public function notifyEnd($token) - { - } -} - -// vim: et sw=4 sts=4 +processToken() + * documentation. + * + * @todo Allow injectors to request a re-run on their output. This + * would help if an operation is recursive. + */ +abstract class HTMLPurifier_Injector +{ + + /** + * Advisory name of injector, this is for friendly error messages. + * @type string + */ + public $name; + + /** + * @type HTMLPurifier_HTMLDefinition + */ + protected $htmlDefinition; + + /** + * Reference to CurrentNesting variable in Context. This is an array + * list of tokens that we are currently "inside" + * @type array + */ + protected $currentNesting; + + /** + * Reference to current token. + * @type HTMLPurifier_Token + */ + protected $currentToken; + + /** + * Reference to InputZipper variable in Context. + * @type HTMLPurifier_Zipper + */ + protected $inputZipper; + + /** + * Array of elements and attributes this injector creates and therefore + * need to be allowed by the definition. Takes form of + * array('element' => array('attr', 'attr2'), 'element2') + * @type array + */ + public $needed = array(); + + /** + * Number of elements to rewind backwards (relative). + * @type bool|int + */ + protected $rewindOffset = false; + + /** + * Rewind to a spot to re-perform processing. This is useful if you + * deleted a node, and now need to see if this change affected any + * earlier nodes. Rewinding does not affect other injectors, and can + * result in infinite loops if not used carefully. + * @param bool|int $offset + * @warning HTML Purifier will prevent you from fast-forwarding with this + * function. + */ + public function rewindOffset($offset) + { + $this->rewindOffset = $offset; + } + + /** + * Retrieves rewind offset, and then unsets it. + * @return bool|int + */ + public function getRewindOffset() + { + $r = $this->rewindOffset; + $this->rewindOffset = false; + return $r; + } + + /** + * Prepares the injector by giving it the config and context objects: + * this allows references to important variables to be made within + * the injector. This function also checks if the HTML environment + * will work with the Injector (see checkNeeded()). + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool|string Boolean false if success, string of missing needed element/attribute if failure + */ + public function prepare($config, $context) + { + $this->htmlDefinition = $config->getHTMLDefinition(); + // Even though this might fail, some unit tests ignore this and + // still test checkNeeded, so be careful. Maybe get rid of that + // dependency. + $result = $this->checkNeeded($config); + if ($result !== false) { + return $result; + } + $this->currentNesting =& $context->get('CurrentNesting'); + $this->currentToken =& $context->get('CurrentToken'); + $this->inputZipper =& $context->get('InputZipper'); + return false; + } + + /** + * This function checks if the HTML environment + * will work with the Injector: if p tags are not allowed, the + * Auto-Paragraphing injector should not be enabled. + * @param HTMLPurifier_Config $config + * @return bool|string Boolean false if success, string of missing needed element/attribute if failure + */ + public function checkNeeded($config) + { + $def = $config->getHTMLDefinition(); + foreach ($this->needed as $element => $attributes) { + if (is_int($element)) { + $element = $attributes; + } + if (!isset($def->info[$element])) { + return $element; + } + if (!is_array($attributes)) { + continue; + } + foreach ($attributes as $name) { + if (!isset($def->info[$element]->attr[$name])) { + return "$element.$name"; + } + } + } + return false; + } + + /** + * Tests if the context node allows a certain element + * @param string $name Name of element to test for + * @return bool True if element is allowed, false if it is not + */ + public function allowsElement($name) + { + if (!empty($this->currentNesting)) { + $parent_token = array_pop($this->currentNesting); + $this->currentNesting[] = $parent_token; + $parent = $this->htmlDefinition->info[$parent_token->name]; + } else { + $parent = $this->htmlDefinition->info_parent_def; + } + if (!isset($parent->child->elements[$name]) || isset($parent->excludes[$name])) { + return false; + } + // check for exclusion + for ($i = count($this->currentNesting) - 2; $i >= 0; $i--) { + $node = $this->currentNesting[$i]; + $def = $this->htmlDefinition->info[$node->name]; + if (isset($def->excludes[$name])) { + return false; + } + } + return true; + } + + /** + * Iterator function, which starts with the next token and continues until + * you reach the end of the input tokens. + * @warning Please prevent previous references from interfering with this + * functions by setting $i = null beforehand! + * @param int $i Current integer index variable for inputTokens + * @param HTMLPurifier_Token $current Current token variable. + * Do NOT use $token, as that variable is also a reference + * @return bool + */ + protected function forward(&$i, &$current) + { + if ($i === null) { + $i = count($this->inputZipper->back) - 1; + } else { + $i--; + } + if ($i < 0) { + return false; + } + $current = $this->inputZipper->back[$i]; + return true; + } + + /** + * Similar to _forward, but accepts a third parameter $nesting (which + * should be initialized at 0) and stops when we hit the end tag + * for the node $this->inputIndex starts in. + * @param int $i Current integer index variable for inputTokens + * @param HTMLPurifier_Token $current Current token variable. + * Do NOT use $token, as that variable is also a reference + * @param int $nesting + * @return bool + */ + protected function forwardUntilEndToken(&$i, &$current, &$nesting) + { + $result = $this->forward($i, $current); + if (!$result) { + return false; + } + if ($nesting === null) { + $nesting = 0; + } + if ($current instanceof HTMLPurifier_Token_Start) { + $nesting++; + } elseif ($current instanceof HTMLPurifier_Token_End) { + if ($nesting <= 0) { + return false; + } + $nesting--; + } + return true; + } + + /** + * Iterator function, starts with the previous token and continues until + * you reach the beginning of input tokens. + * @warning Please prevent previous references from interfering with this + * functions by setting $i = null beforehand! + * @param int $i Current integer index variable for inputTokens + * @param HTMLPurifier_Token $current Current token variable. + * Do NOT use $token, as that variable is also a reference + * @return bool + */ + protected function backward(&$i, &$current) + { + if ($i === null) { + $i = count($this->inputZipper->front) - 1; + } else { + $i--; + } + if ($i < 0) { + return false; + } + $current = $this->inputZipper->front[$i]; + return true; + } + + /** + * Handler that is called when a text token is processed + */ + public function handleText(&$token) + { + } + + /** + * Handler that is called when a start or empty token is processed + */ + public function handleElement(&$token) + { + } + + /** + * Handler that is called when an end token is processed + */ + public function handleEnd(&$token) + { + $this->notifyEnd($token); + } + + /** + * Notifier that is called when an end token is processed + * @param HTMLPurifier_Token $token Current token variable. + * @note This differs from handlers in that the token is read-only + * @deprecated + */ + public function notifyEnd($token) + { + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Injector/AutoParagraph.php b/thirdparty/HTMLPurifier/HTMLPurifier/Injector/AutoParagraph.php similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Injector/AutoParagraph.php rename to thirdparty/HTMLPurifier/HTMLPurifier/Injector/AutoParagraph.php index d3ec44f1c..4afdd128d 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Injector/AutoParagraph.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/Injector/AutoParagraph.php @@ -1,356 +1,356 @@ -armor['MakeWellFormed_TagClosedError'] = true; - return $par; - } - - /** - * @param HTMLPurifier_Token_Text $token - */ - public function handleText(&$token) - { - $text = $token->data; - // Does the current parent allow

tags? - if ($this->allowsElement('p')) { - if (empty($this->currentNesting) || strpos($text, "\n\n") !== false) { - // Note that we have differing behavior when dealing with text - // in the anonymous root node, or a node inside the document. - // If the text as a double-newline, the treatment is the same; - // if it doesn't, see the next if-block if you're in the document. - - $i = $nesting = null; - if (!$this->forwardUntilEndToken($i, $current, $nesting) && $token->is_whitespace) { - // State 1.1: ... ^ (whitespace, then document end) - // ---- - // This is a degenerate case - } else { - if (!$token->is_whitespace || $this->_isInline($current)) { - // State 1.2: PAR1 - // ---- - - // State 1.3: PAR1\n\nPAR2 - // ------------ - - // State 1.4:

PAR1\n\nPAR2 (see State 2) - // ------------ - $token = array($this->_pStart()); - $this->_splitText($text, $token); - } else { - // State 1.5: \n
- // -- - } - } - } else { - // State 2:
PAR1... (similar to 1.4) - // ---- - - // We're in an element that allows paragraph tags, but we're not - // sure if we're going to need them. - if ($this->_pLookAhead()) { - // State 2.1:
PAR1PAR1\n\nPAR2 - // ---- - // Note: This will always be the first child, since any - // previous inline element would have triggered this very - // same routine, and found the double newline. One possible - // exception would be a comment. - $token = array($this->_pStart(), $token); - } else { - // State 2.2.1:
PAR1
- // ---- - - // State 2.2.2:
PAR1PAR1
- // ---- - } - } - // Is the current parent a

tag? - } elseif (!empty($this->currentNesting) && - $this->currentNesting[count($this->currentNesting) - 1]->name == 'p') { - // State 3.1: ...

PAR1 - // ---- - - // State 3.2: ...

PAR1\n\nPAR2 - // ------------ - $token = array(); - $this->_splitText($text, $token); - // Abort! - } else { - // State 4.1: ...PAR1 - // ---- - - // State 4.2: ...PAR1\n\nPAR2 - // ------------ - } - } - - /** - * @param HTMLPurifier_Token $token - */ - public function handleElement(&$token) - { - // We don't have to check if we're already in a

tag for block - // tokens, because the tag would have been autoclosed by MakeWellFormed. - if ($this->allowsElement('p')) { - if (!empty($this->currentNesting)) { - if ($this->_isInline($token)) { - // State 1:

... - // --- - // Check if this token is adjacent to the parent token - // (seek backwards until token isn't whitespace) - $i = null; - $this->backward($i, $prev); - - if (!$prev instanceof HTMLPurifier_Token_Start) { - // Token wasn't adjacent - if ($prev instanceof HTMLPurifier_Token_Text && - substr($prev->data, -2) === "\n\n" - ) { - // State 1.1.4:

PAR1

\n\n - // --- - // Quite frankly, this should be handled by splitText - $token = array($this->_pStart(), $token); - } else { - // State 1.1.1:

PAR1

- // --- - // State 1.1.2:

- // --- - // State 1.1.3:
PAR - // --- - } - } else { - // State 1.2.1:
- // --- - // Lookahead to see if

is needed. - if ($this->_pLookAhead()) { - // State 1.3.1:

PAR1\n\nPAR2 - // --- - $token = array($this->_pStart(), $token); - } else { - // State 1.3.2:
PAR1
- // --- - - // State 1.3.3:
PAR1
\n\n
- // --- - } - } - } else { - // State 2.3: ...
- // ----- - } - } else { - if ($this->_isInline($token)) { - // State 3.1: - // --- - // This is where the {p} tag is inserted, not reflected in - // inputTokens yet, however. - $token = array($this->_pStart(), $token); - } else { - // State 3.2:
- // ----- - } - - $i = null; - if ($this->backward($i, $prev)) { - if (!$prev instanceof HTMLPurifier_Token_Text) { - // State 3.1.1: ...

{p} - // --- - // State 3.2.1: ...

- // ----- - if (!is_array($token)) { - $token = array($token); - } - array_unshift($token, new HTMLPurifier_Token_Text("\n\n")); - } else { - // State 3.1.2: ...

\n\n{p} - // --- - // State 3.2.2: ...

\n\n
- // ----- - // Note: PAR cannot occur because PAR would have been - // wrapped in

tags. - } - } - } - } else { - // State 2.2:

  • - // ---- - // State 2.4:

    - // --- - } - } - - /** - * Splits up a text in paragraph tokens and appends them - * to the result stream that will replace the original - * @param string $data String text data that will be processed - * into paragraphs - * @param HTMLPurifier_Token[] $result Reference to array of tokens that the - * tags will be appended onto - */ - private function _splitText($data, &$result) - { - $raw_paragraphs = explode("\n\n", $data); - $paragraphs = array(); // without empty paragraphs - $needs_start = false; - $needs_end = false; - - $c = count($raw_paragraphs); - if ($c == 1) { - // There were no double-newlines, abort quickly. In theory this - // should never happen. - $result[] = new HTMLPurifier_Token_Text($data); - return; - } - for ($i = 0; $i < $c; $i++) { - $par = $raw_paragraphs[$i]; - if (trim($par) !== '') { - $paragraphs[] = $par; - } else { - if ($i == 0) { - // Double newline at the front - if (empty($result)) { - // The empty result indicates that the AutoParagraph - // injector did not add any start paragraph tokens. - // This means that we have been in a paragraph for - // a while, and the newline means we should start a new one. - $result[] = new HTMLPurifier_Token_End('p'); - $result[] = new HTMLPurifier_Token_Text("\n\n"); - // However, the start token should only be added if - // there is more processing to be done (i.e. there are - // real paragraphs in here). If there are none, the - // next start paragraph tag will be handled by the - // next call to the injector - $needs_start = true; - } else { - // We just started a new paragraph! - // Reinstate a double-newline for presentation's sake, since - // it was in the source code. - array_unshift($result, new HTMLPurifier_Token_Text("\n\n")); - } - } elseif ($i + 1 == $c) { - // Double newline at the end - // There should be a trailing

    when we're finally done. - $needs_end = true; - } - } - } - - // Check if this was just a giant blob of whitespace. Move this earlier, - // perhaps? - if (empty($paragraphs)) { - return; - } - - // Add the start tag indicated by \n\n at the beginning of $data - if ($needs_start) { - $result[] = $this->_pStart(); - } - - // Append the paragraphs onto the result - foreach ($paragraphs as $par) { - $result[] = new HTMLPurifier_Token_Text($par); - $result[] = new HTMLPurifier_Token_End('p'); - $result[] = new HTMLPurifier_Token_Text("\n\n"); - $result[] = $this->_pStart(); - } - - // Remove trailing start token; Injector will handle this later if - // it was indeed needed. This prevents from needing to do a lookahead, - // at the cost of a lookbehind later. - array_pop($result); - - // If there is no need for an end tag, remove all of it and let - // MakeWellFormed close it later. - if (!$needs_end) { - array_pop($result); // removes \n\n - array_pop($result); // removes

    - } - } - - /** - * Returns true if passed token is inline (and, ergo, allowed in - * paragraph tags) - * @param HTMLPurifier_Token $token - * @return bool - */ - private function _isInline($token) - { - return isset($this->htmlDefinition->info['p']->child->elements[$token->name]); - } - - /** - * Looks ahead in the token list and determines whether or not we need - * to insert a

    tag. - * @return bool - */ - private function _pLookAhead() - { - if ($this->currentToken instanceof HTMLPurifier_Token_Start) { - $nesting = 1; - } else { - $nesting = 0; - } - $ok = false; - $i = null; - while ($this->forwardUntilEndToken($i, $current, $nesting)) { - $result = $this->_checkNeedsP($current); - if ($result !== null) { - $ok = $result; - break; - } - } - return $ok; - } - - /** - * Determines if a particular token requires an earlier inline token - * to get a paragraph. This should be used with _forwardUntilEndToken - * @param HTMLPurifier_Token $current - * @return bool - */ - private function _checkNeedsP($current) - { - if ($current instanceof HTMLPurifier_Token_Start) { - if (!$this->_isInline($current)) { - //

    PAR1
    - // ---- - // Terminate early, since we hit a block element - return false; - } - } elseif ($current instanceof HTMLPurifier_Token_Text) { - if (strpos($current->data, "\n\n") !== false) { - //
    PAR1PAR1\n\nPAR2 - // ---- - return true; - } else { - //
    PAR1PAR1... - // ---- - } - } - return null; - } -} - -// vim: et sw=4 sts=4 +armor['MakeWellFormed_TagClosedError'] = true; + return $par; + } + + /** + * @param HTMLPurifier_Token_Text $token + */ + public function handleText(&$token) + { + $text = $token->data; + // Does the current parent allow

    tags? + if ($this->allowsElement('p')) { + if (empty($this->currentNesting) || strpos($text, "\n\n") !== false) { + // Note that we have differing behavior when dealing with text + // in the anonymous root node, or a node inside the document. + // If the text as a double-newline, the treatment is the same; + // if it doesn't, see the next if-block if you're in the document. + + $i = $nesting = null; + if (!$this->forwardUntilEndToken($i, $current, $nesting) && $token->is_whitespace) { + // State 1.1: ... ^ (whitespace, then document end) + // ---- + // This is a degenerate case + } else { + if (!$token->is_whitespace || $this->_isInline($current)) { + // State 1.2: PAR1 + // ---- + + // State 1.3: PAR1\n\nPAR2 + // ------------ + + // State 1.4:

    PAR1\n\nPAR2 (see State 2) + // ------------ + $token = array($this->_pStart()); + $this->_splitText($text, $token); + } else { + // State 1.5: \n
    + // -- + } + } + } else { + // State 2:
    PAR1... (similar to 1.4) + // ---- + + // We're in an element that allows paragraph tags, but we're not + // sure if we're going to need them. + if ($this->_pLookAhead()) { + // State 2.1:
    PAR1PAR1\n\nPAR2 + // ---- + // Note: This will always be the first child, since any + // previous inline element would have triggered this very + // same routine, and found the double newline. One possible + // exception would be a comment. + $token = array($this->_pStart(), $token); + } else { + // State 2.2.1:
    PAR1
    + // ---- + + // State 2.2.2:
    PAR1PAR1
    + // ---- + } + } + // Is the current parent a

    tag? + } elseif (!empty($this->currentNesting) && + $this->currentNesting[count($this->currentNesting) - 1]->name == 'p') { + // State 3.1: ...

    PAR1 + // ---- + + // State 3.2: ...

    PAR1\n\nPAR2 + // ------------ + $token = array(); + $this->_splitText($text, $token); + // Abort! + } else { + // State 4.1: ...PAR1 + // ---- + + // State 4.2: ...PAR1\n\nPAR2 + // ------------ + } + } + + /** + * @param HTMLPurifier_Token $token + */ + public function handleElement(&$token) + { + // We don't have to check if we're already in a

    tag for block + // tokens, because the tag would have been autoclosed by MakeWellFormed. + if ($this->allowsElement('p')) { + if (!empty($this->currentNesting)) { + if ($this->_isInline($token)) { + // State 1:

    ... + // --- + // Check if this token is adjacent to the parent token + // (seek backwards until token isn't whitespace) + $i = null; + $this->backward($i, $prev); + + if (!$prev instanceof HTMLPurifier_Token_Start) { + // Token wasn't adjacent + if ($prev instanceof HTMLPurifier_Token_Text && + substr($prev->data, -2) === "\n\n" + ) { + // State 1.1.4:

    PAR1

    \n\n + // --- + // Quite frankly, this should be handled by splitText + $token = array($this->_pStart(), $token); + } else { + // State 1.1.1:

    PAR1

    + // --- + // State 1.1.2:

    + // --- + // State 1.1.3:
    PAR + // --- + } + } else { + // State 1.2.1:
    + // --- + // Lookahead to see if

    is needed. + if ($this->_pLookAhead()) { + // State 1.3.1:

    PAR1\n\nPAR2 + // --- + $token = array($this->_pStart(), $token); + } else { + // State 1.3.2:
    PAR1
    + // --- + + // State 1.3.3:
    PAR1
    \n\n
    + // --- + } + } + } else { + // State 2.3: ...
    + // ----- + } + } else { + if ($this->_isInline($token)) { + // State 3.1: + // --- + // This is where the {p} tag is inserted, not reflected in + // inputTokens yet, however. + $token = array($this->_pStart(), $token); + } else { + // State 3.2:
    + // ----- + } + + $i = null; + if ($this->backward($i, $prev)) { + if (!$prev instanceof HTMLPurifier_Token_Text) { + // State 3.1.1: ...

    {p} + // --- + // State 3.2.1: ...

    + // ----- + if (!is_array($token)) { + $token = array($token); + } + array_unshift($token, new HTMLPurifier_Token_Text("\n\n")); + } else { + // State 3.1.2: ...

    \n\n{p} + // --- + // State 3.2.2: ...

    \n\n
    + // ----- + // Note: PAR cannot occur because PAR would have been + // wrapped in

    tags. + } + } + } + } else { + // State 2.2:

    • + // ---- + // State 2.4:

      + // --- + } + } + + /** + * Splits up a text in paragraph tokens and appends them + * to the result stream that will replace the original + * @param string $data String text data that will be processed + * into paragraphs + * @param HTMLPurifier_Token[] $result Reference to array of tokens that the + * tags will be appended onto + */ + private function _splitText($data, &$result) + { + $raw_paragraphs = explode("\n\n", $data); + $paragraphs = array(); // without empty paragraphs + $needs_start = false; + $needs_end = false; + + $c = count($raw_paragraphs); + if ($c == 1) { + // There were no double-newlines, abort quickly. In theory this + // should never happen. + $result[] = new HTMLPurifier_Token_Text($data); + return; + } + for ($i = 0; $i < $c; $i++) { + $par = $raw_paragraphs[$i]; + if (trim($par) !== '') { + $paragraphs[] = $par; + } else { + if ($i == 0) { + // Double newline at the front + if (empty($result)) { + // The empty result indicates that the AutoParagraph + // injector did not add any start paragraph tokens. + // This means that we have been in a paragraph for + // a while, and the newline means we should start a new one. + $result[] = new HTMLPurifier_Token_End('p'); + $result[] = new HTMLPurifier_Token_Text("\n\n"); + // However, the start token should only be added if + // there is more processing to be done (i.e. there are + // real paragraphs in here). If there are none, the + // next start paragraph tag will be handled by the + // next call to the injector + $needs_start = true; + } else { + // We just started a new paragraph! + // Reinstate a double-newline for presentation's sake, since + // it was in the source code. + array_unshift($result, new HTMLPurifier_Token_Text("\n\n")); + } + } elseif ($i + 1 == $c) { + // Double newline at the end + // There should be a trailing

      when we're finally done. + $needs_end = true; + } + } + } + + // Check if this was just a giant blob of whitespace. Move this earlier, + // perhaps? + if (empty($paragraphs)) { + return; + } + + // Add the start tag indicated by \n\n at the beginning of $data + if ($needs_start) { + $result[] = $this->_pStart(); + } + + // Append the paragraphs onto the result + foreach ($paragraphs as $par) { + $result[] = new HTMLPurifier_Token_Text($par); + $result[] = new HTMLPurifier_Token_End('p'); + $result[] = new HTMLPurifier_Token_Text("\n\n"); + $result[] = $this->_pStart(); + } + + // Remove trailing start token; Injector will handle this later if + // it was indeed needed. This prevents from needing to do a lookahead, + // at the cost of a lookbehind later. + array_pop($result); + + // If there is no need for an end tag, remove all of it and let + // MakeWellFormed close it later. + if (!$needs_end) { + array_pop($result); // removes \n\n + array_pop($result); // removes

      + } + } + + /** + * Returns true if passed token is inline (and, ergo, allowed in + * paragraph tags) + * @param HTMLPurifier_Token $token + * @return bool + */ + private function _isInline($token) + { + return isset($this->htmlDefinition->info['p']->child->elements[$token->name]); + } + + /** + * Looks ahead in the token list and determines whether or not we need + * to insert a

      tag. + * @return bool + */ + private function _pLookAhead() + { + if ($this->currentToken instanceof HTMLPurifier_Token_Start) { + $nesting = 1; + } else { + $nesting = 0; + } + $ok = false; + $i = null; + while ($this->forwardUntilEndToken($i, $current, $nesting)) { + $result = $this->_checkNeedsP($current); + if ($result !== null) { + $ok = $result; + break; + } + } + return $ok; + } + + /** + * Determines if a particular token requires an earlier inline token + * to get a paragraph. This should be used with _forwardUntilEndToken + * @param HTMLPurifier_Token $current + * @return bool + */ + private function _checkNeedsP($current) + { + if ($current instanceof HTMLPurifier_Token_Start) { + if (!$this->_isInline($current)) { + //

      PAR1
      + // ---- + // Terminate early, since we hit a block element + return false; + } + } elseif ($current instanceof HTMLPurifier_Token_Text) { + if (strpos($current->data, "\n\n") !== false) { + //
      PAR1PAR1\n\nPAR2 + // ---- + return true; + } else { + //
      PAR1PAR1... + // ---- + } + } + return null; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Injector/DisplayLinkURI.php b/thirdparty/HTMLPurifier/HTMLPurifier/Injector/DisplayLinkURI.php similarity index 95% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Injector/DisplayLinkURI.php rename to thirdparty/HTMLPurifier/HTMLPurifier/Injector/DisplayLinkURI.php index 9f9044829..c19b1bc27 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Injector/DisplayLinkURI.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/Injector/DisplayLinkURI.php @@ -1,40 +1,40 @@ -start->attr['href'])) { - $url = $token->start->attr['href']; - unset($token->start->attr['href']); - $token = array($token, new HTMLPurifier_Token_Text(" ($url)")); - } else { - // nothing to display - } - } -} - -// vim: et sw=4 sts=4 +start->attr['href'])) { + $url = $token->start->attr['href']; + unset($token->start->attr['href']); + $token = array($token, new HTMLPurifier_Token_Text(" ($url)")); + } else { + // nothing to display + } + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Injector/Linkify.php b/thirdparty/HTMLPurifier/HTMLPurifier/Injector/Linkify.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Injector/Linkify.php rename to thirdparty/HTMLPurifier/HTMLPurifier/Injector/Linkify.php index 5eed3c12d..069708c25 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Injector/Linkify.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/Injector/Linkify.php @@ -1,59 +1,59 @@ - array('href')); - - /** - * @param HTMLPurifier_Token $token - */ - public function handleText(&$token) - { - if (!$this->allowsElement('a')) { - return; - } - - if (strpos($token->data, '://') === false) { - // our really quick heuristic failed, abort - // this may not work so well if we want to match things like - // "google.com", but then again, most people don't - return; - } - - // there is/are URL(s). Let's split the string: - // Note: this regex is extremely permissive - $bits = preg_split('#((?:https?|ftp)://[^\s\'",<>()]+)#Su', $token->data, -1, PREG_SPLIT_DELIM_CAPTURE); - - - $token = array(); - - // $i = index - // $c = count - // $l = is link - for ($i = 0, $c = count($bits), $l = false; $i < $c; $i++, $l = !$l) { - if (!$l) { - if ($bits[$i] === '') { - continue; - } - $token[] = new HTMLPurifier_Token_Text($bits[$i]); - } else { - $token[] = new HTMLPurifier_Token_Start('a', array('href' => $bits[$i])); - $token[] = new HTMLPurifier_Token_Text($bits[$i]); - $token[] = new HTMLPurifier_Token_End('a'); - } - } - } -} - -// vim: et sw=4 sts=4 + array('href')); + + /** + * @param HTMLPurifier_Token $token + */ + public function handleText(&$token) + { + if (!$this->allowsElement('a')) { + return; + } + + if (strpos($token->data, '://') === false) { + // our really quick heuristic failed, abort + // this may not work so well if we want to match things like + // "google.com", but then again, most people don't + return; + } + + // there is/are URL(s). Let's split the string: + // Note: this regex is extremely permissive + $bits = preg_split('#((?:https?|ftp)://[^\s\'",<>()]+)#Su', $token->data, -1, PREG_SPLIT_DELIM_CAPTURE); + + + $token = array(); + + // $i = index + // $c = count + // $l = is link + for ($i = 0, $c = count($bits), $l = false; $i < $c; $i++, $l = !$l) { + if (!$l) { + if ($bits[$i] === '') { + continue; + } + $token[] = new HTMLPurifier_Token_Text($bits[$i]); + } else { + $token[] = new HTMLPurifier_Token_Start('a', array('href' => $bits[$i])); + $token[] = new HTMLPurifier_Token_Text($bits[$i]); + $token[] = new HTMLPurifier_Token_End('a'); + } + } + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Injector/PurifierLinkify.php b/thirdparty/HTMLPurifier/HTMLPurifier/Injector/PurifierLinkify.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Injector/PurifierLinkify.php rename to thirdparty/HTMLPurifier/HTMLPurifier/Injector/PurifierLinkify.php index d7dd7d972..cb9046f33 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Injector/PurifierLinkify.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/Injector/PurifierLinkify.php @@ -1,71 +1,71 @@ - array('href')); - - /** - * @param HTMLPurifier_Config $config - * @param HTMLPurifier_Context $context - * @return string - */ - public function prepare($config, $context) - { - $this->docURL = $config->get('AutoFormat.PurifierLinkify.DocURL'); - return parent::prepare($config, $context); - } - - /** - * @param HTMLPurifier_Token $token - */ - public function handleText(&$token) - { - if (!$this->allowsElement('a')) { - return; - } - if (strpos($token->data, '%') === false) { - return; - } - - $bits = preg_split('#%([a-z0-9]+\.[a-z0-9]+)#Si', $token->data, -1, PREG_SPLIT_DELIM_CAPTURE); - $token = array(); - - // $i = index - // $c = count - // $l = is link - for ($i = 0, $c = count($bits), $l = false; $i < $c; $i++, $l = !$l) { - if (!$l) { - if ($bits[$i] === '') { - continue; - } - $token[] = new HTMLPurifier_Token_Text($bits[$i]); - } else { - $token[] = new HTMLPurifier_Token_Start( - 'a', - array('href' => str_replace('%s', $bits[$i], $this->docURL)) - ); - $token[] = new HTMLPurifier_Token_Text('%' . $bits[$i]); - $token[] = new HTMLPurifier_Token_End('a'); - } - } - } -} - -// vim: et sw=4 sts=4 + array('href')); + + /** + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return string + */ + public function prepare($config, $context) + { + $this->docURL = $config->get('AutoFormat.PurifierLinkify.DocURL'); + return parent::prepare($config, $context); + } + + /** + * @param HTMLPurifier_Token $token + */ + public function handleText(&$token) + { + if (!$this->allowsElement('a')) { + return; + } + if (strpos($token->data, '%') === false) { + return; + } + + $bits = preg_split('#%([a-z0-9]+\.[a-z0-9]+)#Si', $token->data, -1, PREG_SPLIT_DELIM_CAPTURE); + $token = array(); + + // $i = index + // $c = count + // $l = is link + for ($i = 0, $c = count($bits), $l = false; $i < $c; $i++, $l = !$l) { + if (!$l) { + if ($bits[$i] === '') { + continue; + } + $token[] = new HTMLPurifier_Token_Text($bits[$i]); + } else { + $token[] = new HTMLPurifier_Token_Start( + 'a', + array('href' => str_replace('%s', $bits[$i], $this->docURL)) + ); + $token[] = new HTMLPurifier_Token_Text('%' . $bits[$i]); + $token[] = new HTMLPurifier_Token_End('a'); + } + } + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Injector/RemoveEmpty.php b/thirdparty/HTMLPurifier/HTMLPurifier/Injector/RemoveEmpty.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Injector/RemoveEmpty.php rename to thirdparty/HTMLPurifier/HTMLPurifier/Injector/RemoveEmpty.php index 55669d1c8..cd885722e 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Injector/RemoveEmpty.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/Injector/RemoveEmpty.php @@ -1,101 +1,101 @@ - 1, 'th' => 1, 'td' => 1, 'iframe' => 1); - - /** - * @param HTMLPurifier_Config $config - * @param HTMLPurifier_Context $context - * @return void - */ - public function prepare($config, $context) - { - parent::prepare($config, $context); - $this->config = $config; - $this->context = $context; - $this->removeNbsp = $config->get('AutoFormat.RemoveEmpty.RemoveNbsp'); - $this->removeNbspExceptions = $config->get('AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions'); - $this->attrValidator = new HTMLPurifier_AttrValidator(); - } - - /** - * @param HTMLPurifier_Token $token - */ - public function handleElement(&$token) - { - if (!$token instanceof HTMLPurifier_Token_Start) { - return; - } - $next = false; - $deleted = 1; // the current tag - for ($i = count($this->inputZipper->back) - 1; $i >= 0; $i--, $deleted++) { - $next = $this->inputZipper->back[$i]; - if ($next instanceof HTMLPurifier_Token_Text) { - if ($next->is_whitespace) { - continue; - } - if ($this->removeNbsp && !isset($this->removeNbspExceptions[$token->name])) { - $plain = str_replace("\xC2\xA0", "", $next->data); - $isWsOrNbsp = $plain === '' || ctype_space($plain); - if ($isWsOrNbsp) { - continue; - } - } - } - break; - } - if (!$next || ($next instanceof HTMLPurifier_Token_End && $next->name == $token->name)) { - if (isset($this->_exclude[$token->name])) { - return; - } - $this->attrValidator->validateToken($token, $this->config, $this->context); - $token->armor['ValidateAttributes'] = true; - if (isset($token->attr['id']) || isset($token->attr['name'])) { - return; - } - $token = $deleted + 1; - for ($b = 0, $c = count($this->inputZipper->front); $b < $c; $b++) { - $prev = $this->inputZipper->front[$b]; - if ($prev instanceof HTMLPurifier_Token_Text && $prev->is_whitespace) { - continue; - } - break; - } - // This is safe because we removed the token that triggered this. - $this->rewindOffset($b+$deleted); - return; - } - } -} - -// vim: et sw=4 sts=4 + 1, 'th' => 1, 'td' => 1, 'iframe' => 1); + + /** + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return void + */ + public function prepare($config, $context) + { + parent::prepare($config, $context); + $this->config = $config; + $this->context = $context; + $this->removeNbsp = $config->get('AutoFormat.RemoveEmpty.RemoveNbsp'); + $this->removeNbspExceptions = $config->get('AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions'); + $this->attrValidator = new HTMLPurifier_AttrValidator(); + } + + /** + * @param HTMLPurifier_Token $token + */ + public function handleElement(&$token) + { + if (!$token instanceof HTMLPurifier_Token_Start) { + return; + } + $next = false; + $deleted = 1; // the current tag + for ($i = count($this->inputZipper->back) - 1; $i >= 0; $i--, $deleted++) { + $next = $this->inputZipper->back[$i]; + if ($next instanceof HTMLPurifier_Token_Text) { + if ($next->is_whitespace) { + continue; + } + if ($this->removeNbsp && !isset($this->removeNbspExceptions[$token->name])) { + $plain = str_replace("\xC2\xA0", "", $next->data); + $isWsOrNbsp = $plain === '' || ctype_space($plain); + if ($isWsOrNbsp) { + continue; + } + } + } + break; + } + if (!$next || ($next instanceof HTMLPurifier_Token_End && $next->name == $token->name)) { + if (isset($this->_exclude[$token->name])) { + return; + } + $this->attrValidator->validateToken($token, $this->config, $this->context); + $token->armor['ValidateAttributes'] = true; + if (isset($token->attr['id']) || isset($token->attr['name'])) { + return; + } + $token = $deleted + 1; + for ($b = 0, $c = count($this->inputZipper->front); $b < $c; $b++) { + $prev = $this->inputZipper->front[$b]; + if ($prev instanceof HTMLPurifier_Token_Text && $prev->is_whitespace) { + continue; + } + break; + } + // This is safe because we removed the token that triggered this. + $this->rewindOffset($b+$deleted); + return; + } + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Injector/RemoveSpansWithoutAttributes.php b/thirdparty/HTMLPurifier/HTMLPurifier/Injector/RemoveSpansWithoutAttributes.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Injector/RemoveSpansWithoutAttributes.php rename to thirdparty/HTMLPurifier/HTMLPurifier/Injector/RemoveSpansWithoutAttributes.php index 270b7f828..9ee7aa84d 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Injector/RemoveSpansWithoutAttributes.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/Injector/RemoveSpansWithoutAttributes.php @@ -1,84 +1,84 @@ -attrValidator = new HTMLPurifier_AttrValidator(); - $this->config = $config; - $this->context = $context; - return parent::prepare($config, $context); - } - - /** - * @param HTMLPurifier_Token $token - */ - public function handleElement(&$token) - { - if ($token->name !== 'span' || !$token instanceof HTMLPurifier_Token_Start) { - return; - } - - // We need to validate the attributes now since this doesn't normally - // happen until after MakeWellFormed. If all the attributes are removed - // the span needs to be removed too. - $this->attrValidator->validateToken($token, $this->config, $this->context); - $token->armor['ValidateAttributes'] = true; - - if (!empty($token->attr)) { - return; - } - - $nesting = 0; - while ($this->forwardUntilEndToken($i, $current, $nesting)) { - } - - if ($current instanceof HTMLPurifier_Token_End && $current->name === 'span') { - // Mark closing span tag for deletion - $current->markForDeletion = true; - // Delete open span tag - $token = false; - } - } - - /** - * @param HTMLPurifier_Token $token - */ - public function handleEnd(&$token) - { - if ($token->markForDeletion) { - $token = false; - } - } -} - -// vim: et sw=4 sts=4 +attrValidator = new HTMLPurifier_AttrValidator(); + $this->config = $config; + $this->context = $context; + return parent::prepare($config, $context); + } + + /** + * @param HTMLPurifier_Token $token + */ + public function handleElement(&$token) + { + if ($token->name !== 'span' || !$token instanceof HTMLPurifier_Token_Start) { + return; + } + + // We need to validate the attributes now since this doesn't normally + // happen until after MakeWellFormed. If all the attributes are removed + // the span needs to be removed too. + $this->attrValidator->validateToken($token, $this->config, $this->context); + $token->armor['ValidateAttributes'] = true; + + if (!empty($token->attr)) { + return; + } + + $nesting = 0; + while ($this->forwardUntilEndToken($i, $current, $nesting)) { + } + + if ($current instanceof HTMLPurifier_Token_End && $current->name === 'span') { + // Mark closing span tag for deletion + $current->markForDeletion = true; + // Delete open span tag + $token = false; + } + } + + /** + * @param HTMLPurifier_Token $token + */ + public function handleEnd(&$token) + { + if ($token->markForDeletion) { + $token = false; + } + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Injector/SafeObject.php b/thirdparty/HTMLPurifier/HTMLPurifier/Injector/SafeObject.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Injector/SafeObject.php rename to thirdparty/HTMLPurifier/HTMLPurifier/Injector/SafeObject.php index 8450948c3..3d17e07af 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Injector/SafeObject.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/Injector/SafeObject.php @@ -1,121 +1,121 @@ - 'never', - 'allowNetworking' => 'internal', - ); - - /** - * @type array - */ - protected $allowedParam = array( - 'wmode' => true, - 'movie' => true, - 'flashvars' => true, - 'src' => true, - 'allowFullScreen' => true, // if omitted, assume to be 'false' - ); - - /** - * @param HTMLPurifier_Config $config - * @param HTMLPurifier_Context $context - * @return void - */ - public function prepare($config, $context) - { - parent::prepare($config, $context); - } - - /** - * @param HTMLPurifier_Token $token - */ - public function handleElement(&$token) - { - if ($token->name == 'object') { - $this->objectStack[] = $token; - $this->paramStack[] = array(); - $new = array($token); - foreach ($this->addParam as $name => $value) { - $new[] = new HTMLPurifier_Token_Empty('param', array('name' => $name, 'value' => $value)); - } - $token = $new; - } elseif ($token->name == 'param') { - $nest = count($this->currentNesting) - 1; - if ($nest >= 0 && $this->currentNesting[$nest]->name === 'object') { - $i = count($this->objectStack) - 1; - if (!isset($token->attr['name'])) { - $token = false; - return; - } - $n = $token->attr['name']; - // We need this fix because YouTube doesn't supply a data - // attribute, which we need if a type is specified. This is - // *very* Flash specific. - if (!isset($this->objectStack[$i]->attr['data']) && - ($token->attr['name'] == 'movie' || $token->attr['name'] == 'src') - ) { - $this->objectStack[$i]->attr['data'] = $token->attr['value']; - } - // Check if the parameter is the correct value but has not - // already been added - if (!isset($this->paramStack[$i][$n]) && - isset($this->addParam[$n]) && - $token->attr['name'] === $this->addParam[$n]) { - // keep token, and add to param stack - $this->paramStack[$i][$n] = true; - } elseif (isset($this->allowedParam[$n])) { - // keep token, don't do anything to it - // (could possibly check for duplicates here) - } else { - $token = false; - } - } else { - // not directly inside an object, DENY! - $token = false; - } - } - } - - public function handleEnd(&$token) - { - // This is the WRONG way of handling the object and param stacks; - // we should be inserting them directly on the relevant object tokens - // so that the global stack handling handles it. - if ($token->name == 'object') { - array_pop($this->objectStack); - array_pop($this->paramStack); - } - } -} - -// vim: et sw=4 sts=4 + 'never', + 'allowNetworking' => 'internal', + ); + + /** + * @type array + */ + protected $allowedParam = array( + 'wmode' => true, + 'movie' => true, + 'flashvars' => true, + 'src' => true, + 'allowFullScreen' => true, // if omitted, assume to be 'false' + ); + + /** + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return void + */ + public function prepare($config, $context) + { + parent::prepare($config, $context); + } + + /** + * @param HTMLPurifier_Token $token + */ + public function handleElement(&$token) + { + if ($token->name == 'object') { + $this->objectStack[] = $token; + $this->paramStack[] = array(); + $new = array($token); + foreach ($this->addParam as $name => $value) { + $new[] = new HTMLPurifier_Token_Empty('param', array('name' => $name, 'value' => $value)); + } + $token = $new; + } elseif ($token->name == 'param') { + $nest = count($this->currentNesting) - 1; + if ($nest >= 0 && $this->currentNesting[$nest]->name === 'object') { + $i = count($this->objectStack) - 1; + if (!isset($token->attr['name'])) { + $token = false; + return; + } + $n = $token->attr['name']; + // We need this fix because YouTube doesn't supply a data + // attribute, which we need if a type is specified. This is + // *very* Flash specific. + if (!isset($this->objectStack[$i]->attr['data']) && + ($token->attr['name'] == 'movie' || $token->attr['name'] == 'src') + ) { + $this->objectStack[$i]->attr['data'] = $token->attr['value']; + } + // Check if the parameter is the correct value but has not + // already been added + if (!isset($this->paramStack[$i][$n]) && + isset($this->addParam[$n]) && + $token->attr['name'] === $this->addParam[$n]) { + // keep token, and add to param stack + $this->paramStack[$i][$n] = true; + } elseif (isset($this->allowedParam[$n])) { + // keep token, don't do anything to it + // (could possibly check for duplicates here) + } else { + $token = false; + } + } else { + // not directly inside an object, DENY! + $token = false; + } + } + } + + public function handleEnd(&$token) + { + // This is the WRONG way of handling the object and param stacks; + // we should be inserting them directly on the relevant object tokens + // so that the global stack handling handles it. + if ($token->name == 'object') { + array_pop($this->objectStack); + array_pop($this->paramStack); + } + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Language.php b/thirdparty/HTMLPurifier/HTMLPurifier/Language.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Language.php rename to thirdparty/HTMLPurifier/HTMLPurifier/Language.php index 35a13f785..65277dd43 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Language.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/Language.php @@ -1,204 +1,204 @@ -config = $config; - $this->context = $context; - } - - /** - * Loads language object with necessary info from factory cache - * @note This is a lazy loader - */ - public function load() - { - if ($this->_loaded) { - return; - } - $factory = HTMLPurifier_LanguageFactory::instance(); - $factory->loadLanguage($this->code); - foreach ($factory->keys as $key) { - $this->$key = $factory->cache[$this->code][$key]; - } - $this->_loaded = true; - } - - /** - * Retrieves a localised message. - * @param string $key string identifier of message - * @return string localised message - */ - public function getMessage($key) - { - if (!$this->_loaded) { - $this->load(); - } - if (!isset($this->messages[$key])) { - return "[$key]"; - } - return $this->messages[$key]; - } - - /** - * Retrieves a localised error name. - * @param int $int error number, corresponding to PHP's error reporting - * @return string localised message - */ - public function getErrorName($int) - { - if (!$this->_loaded) { - $this->load(); - } - if (!isset($this->errorNames[$int])) { - return "[Error: $int]"; - } - return $this->errorNames[$int]; - } - - /** - * Converts an array list into a string readable representation - * @param array $array - * @return string - */ - public function listify($array) - { - $sep = $this->getMessage('Item separator'); - $sep_last = $this->getMessage('Item separator last'); - $ret = ''; - for ($i = 0, $c = count($array); $i < $c; $i++) { - if ($i == 0) { - } elseif ($i + 1 < $c) { - $ret .= $sep; - } else { - $ret .= $sep_last; - } - $ret .= $array[$i]; - } - return $ret; - } - - /** - * Formats a localised message with passed parameters - * @param string $key string identifier of message - * @param array $args Parameters to substitute in - * @return string localised message - * @todo Implement conditionals? Right now, some messages make - * reference to line numbers, but those aren't always available - */ - public function formatMessage($key, $args = array()) - { - if (!$this->_loaded) { - $this->load(); - } - if (!isset($this->messages[$key])) { - return "[$key]"; - } - $raw = $this->messages[$key]; - $subst = array(); - $generator = false; - foreach ($args as $i => $value) { - if (is_object($value)) { - if ($value instanceof HTMLPurifier_Token) { - // factor this out some time - if (!$generator) { - $generator = $this->context->get('Generator'); - } - if (isset($value->name)) { - $subst['$'.$i.'.Name'] = $value->name; - } - if (isset($value->data)) { - $subst['$'.$i.'.Data'] = $value->data; - } - $subst['$'.$i.'.Compact'] = - $subst['$'.$i.'.Serialized'] = $generator->generateFromToken($value); - // a more complex algorithm for compact representation - // could be introduced for all types of tokens. This - // may need to be factored out into a dedicated class - if (!empty($value->attr)) { - $stripped_token = clone $value; - $stripped_token->attr = array(); - $subst['$'.$i.'.Compact'] = $generator->generateFromToken($stripped_token); - } - $subst['$'.$i.'.Line'] = $value->line ? $value->line : 'unknown'; - } - continue; - } elseif (is_array($value)) { - $keys = array_keys($value); - if (array_keys($keys) === $keys) { - // list - $subst['$'.$i] = $this->listify($value); - } else { - // associative array - // no $i implementation yet, sorry - $subst['$'.$i.'.Keys'] = $this->listify($keys); - $subst['$'.$i.'.Values'] = $this->listify(array_values($value)); - } - continue; - } - $subst['$' . $i] = $value; - } - return strtr($raw, $subst); - } -} - -// vim: et sw=4 sts=4 +config = $config; + $this->context = $context; + } + + /** + * Loads language object with necessary info from factory cache + * @note This is a lazy loader + */ + public function load() + { + if ($this->_loaded) { + return; + } + $factory = HTMLPurifier_LanguageFactory::instance(); + $factory->loadLanguage($this->code); + foreach ($factory->keys as $key) { + $this->$key = $factory->cache[$this->code][$key]; + } + $this->_loaded = true; + } + + /** + * Retrieves a localised message. + * @param string $key string identifier of message + * @return string localised message + */ + public function getMessage($key) + { + if (!$this->_loaded) { + $this->load(); + } + if (!isset($this->messages[$key])) { + return "[$key]"; + } + return $this->messages[$key]; + } + + /** + * Retrieves a localised error name. + * @param int $int error number, corresponding to PHP's error reporting + * @return string localised message + */ + public function getErrorName($int) + { + if (!$this->_loaded) { + $this->load(); + } + if (!isset($this->errorNames[$int])) { + return "[Error: $int]"; + } + return $this->errorNames[$int]; + } + + /** + * Converts an array list into a string readable representation + * @param array $array + * @return string + */ + public function listify($array) + { + $sep = $this->getMessage('Item separator'); + $sep_last = $this->getMessage('Item separator last'); + $ret = ''; + for ($i = 0, $c = count($array); $i < $c; $i++) { + if ($i == 0) { + } elseif ($i + 1 < $c) { + $ret .= $sep; + } else { + $ret .= $sep_last; + } + $ret .= $array[$i]; + } + return $ret; + } + + /** + * Formats a localised message with passed parameters + * @param string $key string identifier of message + * @param array $args Parameters to substitute in + * @return string localised message + * @todo Implement conditionals? Right now, some messages make + * reference to line numbers, but those aren't always available + */ + public function formatMessage($key, $args = array()) + { + if (!$this->_loaded) { + $this->load(); + } + if (!isset($this->messages[$key])) { + return "[$key]"; + } + $raw = $this->messages[$key]; + $subst = array(); + $generator = false; + foreach ($args as $i => $value) { + if (is_object($value)) { + if ($value instanceof HTMLPurifier_Token) { + // factor this out some time + if (!$generator) { + $generator = $this->context->get('Generator'); + } + if (isset($value->name)) { + $subst['$'.$i.'.Name'] = $value->name; + } + if (isset($value->data)) { + $subst['$'.$i.'.Data'] = $value->data; + } + $subst['$'.$i.'.Compact'] = + $subst['$'.$i.'.Serialized'] = $generator->generateFromToken($value); + // a more complex algorithm for compact representation + // could be introduced for all types of tokens. This + // may need to be factored out into a dedicated class + if (!empty($value->attr)) { + $stripped_token = clone $value; + $stripped_token->attr = array(); + $subst['$'.$i.'.Compact'] = $generator->generateFromToken($stripped_token); + } + $subst['$'.$i.'.Line'] = $value->line ? $value->line : 'unknown'; + } + continue; + } elseif (is_array($value)) { + $keys = array_keys($value); + if (array_keys($keys) === $keys) { + // list + $subst['$'.$i] = $this->listify($value); + } else { + // associative array + // no $i implementation yet, sorry + $subst['$'.$i.'.Keys'] = $this->listify($keys); + $subst['$'.$i.'.Values'] = $this->listify(array_values($value)); + } + continue; + } + $subst['$' . $i] = $value; + } + return strtr($raw, $subst); + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Language/classes/en-x-test.php b/thirdparty/HTMLPurifier/HTMLPurifier/Language/classes/en-x-test.php similarity index 93% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Language/classes/en-x-test.php rename to thirdparty/HTMLPurifier/HTMLPurifier/Language/classes/en-x-test.php index a6f8d1634..8828f5cde 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Language/classes/en-x-test.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/Language/classes/en-x-test.php @@ -1,9 +1,9 @@ - 'HTML Purifier X' -); - -// vim: et sw=4 sts=4 + 'HTML Purifier X' +); + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Language/messages/en-x-testmini.php b/thirdparty/HTMLPurifier/HTMLPurifier/Language/messages/en-x-testmini.php similarity index 95% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Language/messages/en-x-testmini.php rename to thirdparty/HTMLPurifier/HTMLPurifier/Language/messages/en-x-testmini.php index ed8560fd5..806c83fbf 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Language/messages/en-x-testmini.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/Language/messages/en-x-testmini.php @@ -1,12 +1,12 @@ - 'HTML Purifier XNone' -); - -// vim: et sw=4 sts=4 + 'HTML Purifier XNone' +); + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Language/messages/en.php b/thirdparty/HTMLPurifier/HTMLPurifier/Language/messages/en.php similarity index 98% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Language/messages/en.php rename to thirdparty/HTMLPurifier/HTMLPurifier/Language/messages/en.php index 1fa30bdfe..c7f197e1e 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Language/messages/en.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/Language/messages/en.php @@ -1,55 +1,55 @@ - 'HTML Purifier', -// for unit testing purposes - 'LanguageFactoryTest: Pizza' => 'Pizza', - 'LanguageTest: List' => '$1', - 'LanguageTest: Hash' => '$1.Keys; $1.Values', - 'Item separator' => ', ', - 'Item separator last' => ' and ', // non-Harvard style - - 'ErrorCollector: No errors' => 'No errors detected. However, because error reporting is still incomplete, there may have been errors that the error collector was not notified of; please inspect the output HTML carefully.', - 'ErrorCollector: At line' => ' at line $line', - 'ErrorCollector: Incidental errors' => 'Incidental errors', - 'Lexer: Unclosed comment' => 'Unclosed comment', - 'Lexer: Unescaped lt' => 'Unescaped less-than sign (<) should be <', - 'Lexer: Missing gt' => 'Missing greater-than sign (>), previous less-than sign (<) should be escaped', - 'Lexer: Missing attribute key' => 'Attribute declaration has no key', - 'Lexer: Missing end quote' => 'Attribute declaration has no end quote', - 'Lexer: Extracted body' => 'Removed document metadata tags', - 'Strategy_RemoveForeignElements: Tag transform' => '<$1> element transformed into $CurrentToken.Serialized', - 'Strategy_RemoveForeignElements: Missing required attribute' => '$CurrentToken.Compact element missing required attribute $1', - 'Strategy_RemoveForeignElements: Foreign element to text' => 'Unrecognized $CurrentToken.Serialized tag converted to text', - 'Strategy_RemoveForeignElements: Foreign element removed' => 'Unrecognized $CurrentToken.Serialized tag removed', - 'Strategy_RemoveForeignElements: Comment removed' => 'Comment containing "$CurrentToken.Data" removed', - 'Strategy_RemoveForeignElements: Foreign meta element removed' => 'Unrecognized $CurrentToken.Serialized meta tag and all descendants removed', - 'Strategy_RemoveForeignElements: Token removed to end' => 'Tags and text starting from $1 element where removed to end', - 'Strategy_RemoveForeignElements: Trailing hyphen in comment removed' => 'Trailing hyphen(s) in comment removed', - 'Strategy_RemoveForeignElements: Hyphens in comment collapsed' => 'Double hyphens in comments are not allowed, and were collapsed into single hyphens', - 'Strategy_MakeWellFormed: Unnecessary end tag removed' => 'Unnecessary $CurrentToken.Serialized tag removed', - 'Strategy_MakeWellFormed: Unnecessary end tag to text' => 'Unnecessary $CurrentToken.Serialized tag converted to text', - 'Strategy_MakeWellFormed: Tag auto closed' => '$1.Compact started on line $1.Line auto-closed by $CurrentToken.Compact', - 'Strategy_MakeWellFormed: Tag carryover' => '$1.Compact started on line $1.Line auto-continued into $CurrentToken.Compact', - 'Strategy_MakeWellFormed: Stray end tag removed' => 'Stray $CurrentToken.Serialized tag removed', - 'Strategy_MakeWellFormed: Stray end tag to text' => 'Stray $CurrentToken.Serialized tag converted to text', - 'Strategy_MakeWellFormed: Tag closed by element end' => '$1.Compact tag started on line $1.Line closed by end of $CurrentToken.Serialized', - 'Strategy_MakeWellFormed: Tag closed by document end' => '$1.Compact tag started on line $1.Line closed by end of document', - 'Strategy_FixNesting: Node removed' => '$CurrentToken.Compact node removed', - 'Strategy_FixNesting: Node excluded' => '$CurrentToken.Compact node removed due to descendant exclusion by ancestor element', - 'Strategy_FixNesting: Node reorganized' => 'Contents of $CurrentToken.Compact node reorganized to enforce its content model', - 'Strategy_FixNesting: Node contents removed' => 'Contents of $CurrentToken.Compact node removed', - 'AttrValidator: Attributes transformed' => 'Attributes on $CurrentToken.Compact transformed from $1.Keys to $2.Keys', - 'AttrValidator: Attribute removed' => '$CurrentAttr.Name attribute on $CurrentToken.Compact removed', -); - -$errorNames = array( - E_ERROR => 'Error', - E_WARNING => 'Warning', - E_NOTICE => 'Notice' -); - -// vim: et sw=4 sts=4 + 'HTML Purifier', +// for unit testing purposes + 'LanguageFactoryTest: Pizza' => 'Pizza', + 'LanguageTest: List' => '$1', + 'LanguageTest: Hash' => '$1.Keys; $1.Values', + 'Item separator' => ', ', + 'Item separator last' => ' and ', // non-Harvard style + + 'ErrorCollector: No errors' => 'No errors detected. However, because error reporting is still incomplete, there may have been errors that the error collector was not notified of; please inspect the output HTML carefully.', + 'ErrorCollector: At line' => ' at line $line', + 'ErrorCollector: Incidental errors' => 'Incidental errors', + 'Lexer: Unclosed comment' => 'Unclosed comment', + 'Lexer: Unescaped lt' => 'Unescaped less-than sign (<) should be <', + 'Lexer: Missing gt' => 'Missing greater-than sign (>), previous less-than sign (<) should be escaped', + 'Lexer: Missing attribute key' => 'Attribute declaration has no key', + 'Lexer: Missing end quote' => 'Attribute declaration has no end quote', + 'Lexer: Extracted body' => 'Removed document metadata tags', + 'Strategy_RemoveForeignElements: Tag transform' => '<$1> element transformed into $CurrentToken.Serialized', + 'Strategy_RemoveForeignElements: Missing required attribute' => '$CurrentToken.Compact element missing required attribute $1', + 'Strategy_RemoveForeignElements: Foreign element to text' => 'Unrecognized $CurrentToken.Serialized tag converted to text', + 'Strategy_RemoveForeignElements: Foreign element removed' => 'Unrecognized $CurrentToken.Serialized tag removed', + 'Strategy_RemoveForeignElements: Comment removed' => 'Comment containing "$CurrentToken.Data" removed', + 'Strategy_RemoveForeignElements: Foreign meta element removed' => 'Unrecognized $CurrentToken.Serialized meta tag and all descendants removed', + 'Strategy_RemoveForeignElements: Token removed to end' => 'Tags and text starting from $1 element where removed to end', + 'Strategy_RemoveForeignElements: Trailing hyphen in comment removed' => 'Trailing hyphen(s) in comment removed', + 'Strategy_RemoveForeignElements: Hyphens in comment collapsed' => 'Double hyphens in comments are not allowed, and were collapsed into single hyphens', + 'Strategy_MakeWellFormed: Unnecessary end tag removed' => 'Unnecessary $CurrentToken.Serialized tag removed', + 'Strategy_MakeWellFormed: Unnecessary end tag to text' => 'Unnecessary $CurrentToken.Serialized tag converted to text', + 'Strategy_MakeWellFormed: Tag auto closed' => '$1.Compact started on line $1.Line auto-closed by $CurrentToken.Compact', + 'Strategy_MakeWellFormed: Tag carryover' => '$1.Compact started on line $1.Line auto-continued into $CurrentToken.Compact', + 'Strategy_MakeWellFormed: Stray end tag removed' => 'Stray $CurrentToken.Serialized tag removed', + 'Strategy_MakeWellFormed: Stray end tag to text' => 'Stray $CurrentToken.Serialized tag converted to text', + 'Strategy_MakeWellFormed: Tag closed by element end' => '$1.Compact tag started on line $1.Line closed by end of $CurrentToken.Serialized', + 'Strategy_MakeWellFormed: Tag closed by document end' => '$1.Compact tag started on line $1.Line closed by end of document', + 'Strategy_FixNesting: Node removed' => '$CurrentToken.Compact node removed', + 'Strategy_FixNesting: Node excluded' => '$CurrentToken.Compact node removed due to descendant exclusion by ancestor element', + 'Strategy_FixNesting: Node reorganized' => 'Contents of $CurrentToken.Compact node reorganized to enforce its content model', + 'Strategy_FixNesting: Node contents removed' => 'Contents of $CurrentToken.Compact node removed', + 'AttrValidator: Attributes transformed' => 'Attributes on $CurrentToken.Compact transformed from $1.Keys to $2.Keys', + 'AttrValidator: Attribute removed' => '$CurrentAttr.Name attribute on $CurrentToken.Compact removed', +); + +$errorNames = array( + E_ERROR => 'Error', + E_WARNING => 'Warning', + E_NOTICE => 'Notice' +); + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/LanguageFactory.php b/thirdparty/HTMLPurifier/HTMLPurifier/LanguageFactory.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/LanguageFactory.php rename to thirdparty/HTMLPurifier/HTMLPurifier/LanguageFactory.php index e3e7a3b8d..4e35272d8 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/LanguageFactory.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/LanguageFactory.php @@ -1,209 +1,209 @@ -cache[$language_code][$key] = $value - * @type array - */ - public $cache; - - /** - * Valid keys in the HTMLPurifier_Language object. Designates which - * variables to slurp out of a message file. - * @type array - */ - public $keys = array('fallback', 'messages', 'errorNames'); - - /** - * Instance to validate language codes. - * @type HTMLPurifier_AttrDef_Lang - * - */ - protected $validator; - - /** - * Cached copy of dirname(__FILE__), directory of current file without - * trailing slash. - * @type string - */ - protected $dir; - - /** - * Keys whose contents are a hash map and can be merged. - * @type array - */ - protected $mergeable_keys_map = array('messages' => true, 'errorNames' => true); - - /** - * Keys whose contents are a list and can be merged. - * @value array lookup - */ - protected $mergeable_keys_list = array(); - - /** - * Retrieve sole instance of the factory. - * @param HTMLPurifier_LanguageFactory $prototype Optional prototype to overload sole instance with, - * or bool true to reset to default factory. - * @return HTMLPurifier_LanguageFactory - */ - public static function instance($prototype = null) - { - static $instance = null; - if ($prototype !== null) { - $instance = $prototype; - } elseif ($instance === null || $prototype == true) { - $instance = new HTMLPurifier_LanguageFactory(); - $instance->setup(); - } - return $instance; - } - - /** - * Sets up the singleton, much like a constructor - * @note Prevents people from getting this outside of the singleton - */ - public function setup() - { - $this->validator = new HTMLPurifier_AttrDef_Lang(); - $this->dir = HTMLPURIFIER_PREFIX . '/HTMLPurifier'; - } - - /** - * Creates a language object, handles class fallbacks - * @param HTMLPurifier_Config $config - * @param HTMLPurifier_Context $context - * @param bool|string $code Code to override configuration with. Private parameter. - * @return HTMLPurifier_Language - */ - public function create($config, $context, $code = false) - { - // validate language code - if ($code === false) { - $code = $this->validator->validate( - $config->get('Core.Language'), - $config, - $context - ); - } else { - $code = $this->validator->validate($code, $config, $context); - } - if ($code === false) { - $code = 'en'; // malformed code becomes English - } - - $pcode = str_replace('-', '_', $code); // make valid PHP classname - static $depth = 0; // recursion protection - - if ($code == 'en') { - $lang = new HTMLPurifier_Language($config, $context); - } else { - $class = 'HTMLPurifier_Language_' . $pcode; - $file = $this->dir . '/Language/classes/' . $code . '.php'; - if (file_exists($file) || class_exists($class, false)) { - $lang = new $class($config, $context); - } else { - // Go fallback - $raw_fallback = $this->getFallbackFor($code); - $fallback = $raw_fallback ? $raw_fallback : 'en'; - $depth++; - $lang = $this->create($config, $context, $fallback); - if (!$raw_fallback) { - $lang->error = true; - } - $depth--; - } - } - $lang->code = $code; - return $lang; - } - - /** - * Returns the fallback language for language - * @note Loads the original language into cache - * @param string $code language code - * @return string|bool - */ - public function getFallbackFor($code) - { - $this->loadLanguage($code); - return $this->cache[$code]['fallback']; - } - - /** - * Loads language into the cache, handles message file and fallbacks - * @param string $code language code - */ - public function loadLanguage($code) - { - static $languages_seen = array(); // recursion guard - - // abort if we've already loaded it - if (isset($this->cache[$code])) { - return; - } - - // generate filename - $filename = $this->dir . '/Language/messages/' . $code . '.php'; - - // default fallback : may be overwritten by the ensuing include - $fallback = ($code != 'en') ? 'en' : false; - - // load primary localisation - if (!file_exists($filename)) { - // skip the include: will rely solely on fallback - $filename = $this->dir . '/Language/messages/en.php'; - $cache = array(); - } else { - include $filename; - $cache = compact($this->keys); - } - - // load fallback localisation - if (!empty($fallback)) { - - // infinite recursion guard - if (isset($languages_seen[$code])) { - trigger_error( - 'Circular fallback reference in language ' . - $code, - E_USER_ERROR - ); - $fallback = 'en'; - } - $language_seen[$code] = true; - - // load the fallback recursively - $this->loadLanguage($fallback); - $fallback_cache = $this->cache[$fallback]; - - // merge fallback with current language - foreach ($this->keys as $key) { - if (isset($cache[$key]) && isset($fallback_cache[$key])) { - if (isset($this->mergeable_keys_map[$key])) { - $cache[$key] = $cache[$key] + $fallback_cache[$key]; - } elseif (isset($this->mergeable_keys_list[$key])) { - $cache[$key] = array_merge($fallback_cache[$key], $cache[$key]); - } - } else { - $cache[$key] = $fallback_cache[$key]; - } - } - } - - // save to cache for later retrieval - $this->cache[$code] = $cache; - return; - } -} - -// vim: et sw=4 sts=4 +cache[$language_code][$key] = $value + * @type array + */ + public $cache; + + /** + * Valid keys in the HTMLPurifier_Language object. Designates which + * variables to slurp out of a message file. + * @type array + */ + public $keys = array('fallback', 'messages', 'errorNames'); + + /** + * Instance to validate language codes. + * @type HTMLPurifier_AttrDef_Lang + * + */ + protected $validator; + + /** + * Cached copy of dirname(__FILE__), directory of current file without + * trailing slash. + * @type string + */ + protected $dir; + + /** + * Keys whose contents are a hash map and can be merged. + * @type array + */ + protected $mergeable_keys_map = array('messages' => true, 'errorNames' => true); + + /** + * Keys whose contents are a list and can be merged. + * @value array lookup + */ + protected $mergeable_keys_list = array(); + + /** + * Retrieve sole instance of the factory. + * @param HTMLPurifier_LanguageFactory $prototype Optional prototype to overload sole instance with, + * or bool true to reset to default factory. + * @return HTMLPurifier_LanguageFactory + */ + public static function instance($prototype = null) + { + static $instance = null; + if ($prototype !== null) { + $instance = $prototype; + } elseif ($instance === null || $prototype == true) { + $instance = new HTMLPurifier_LanguageFactory(); + $instance->setup(); + } + return $instance; + } + + /** + * Sets up the singleton, much like a constructor + * @note Prevents people from getting this outside of the singleton + */ + public function setup() + { + $this->validator = new HTMLPurifier_AttrDef_Lang(); + $this->dir = HTMLPURIFIER_PREFIX . '/HTMLPurifier'; + } + + /** + * Creates a language object, handles class fallbacks + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @param bool|string $code Code to override configuration with. Private parameter. + * @return HTMLPurifier_Language + */ + public function create($config, $context, $code = false) + { + // validate language code + if ($code === false) { + $code = $this->validator->validate( + $config->get('Core.Language'), + $config, + $context + ); + } else { + $code = $this->validator->validate($code, $config, $context); + } + if ($code === false) { + $code = 'en'; // malformed code becomes English + } + + $pcode = str_replace('-', '_', $code); // make valid PHP classname + static $depth = 0; // recursion protection + + if ($code == 'en') { + $lang = new HTMLPurifier_Language($config, $context); + } else { + $class = 'HTMLPurifier_Language_' . $pcode; + $file = $this->dir . '/Language/classes/' . $code . '.php'; + if (file_exists($file) || class_exists($class, false)) { + $lang = new $class($config, $context); + } else { + // Go fallback + $raw_fallback = $this->getFallbackFor($code); + $fallback = $raw_fallback ? $raw_fallback : 'en'; + $depth++; + $lang = $this->create($config, $context, $fallback); + if (!$raw_fallback) { + $lang->error = true; + } + $depth--; + } + } + $lang->code = $code; + return $lang; + } + + /** + * Returns the fallback language for language + * @note Loads the original language into cache + * @param string $code language code + * @return string|bool + */ + public function getFallbackFor($code) + { + $this->loadLanguage($code); + return $this->cache[$code]['fallback']; + } + + /** + * Loads language into the cache, handles message file and fallbacks + * @param string $code language code + */ + public function loadLanguage($code) + { + static $languages_seen = array(); // recursion guard + + // abort if we've already loaded it + if (isset($this->cache[$code])) { + return; + } + + // generate filename + $filename = $this->dir . '/Language/messages/' . $code . '.php'; + + // default fallback : may be overwritten by the ensuing include + $fallback = ($code != 'en') ? 'en' : false; + + // load primary localisation + if (!file_exists($filename)) { + // skip the include: will rely solely on fallback + $filename = $this->dir . '/Language/messages/en.php'; + $cache = array(); + } else { + include $filename; + $cache = compact($this->keys); + } + + // load fallback localisation + if (!empty($fallback)) { + + // infinite recursion guard + if (isset($languages_seen[$code])) { + trigger_error( + 'Circular fallback reference in language ' . + $code, + E_USER_ERROR + ); + $fallback = 'en'; + } + $language_seen[$code] = true; + + // load the fallback recursively + $this->loadLanguage($fallback); + $fallback_cache = $this->cache[$fallback]; + + // merge fallback with current language + foreach ($this->keys as $key) { + if (isset($cache[$key]) && isset($fallback_cache[$key])) { + if (isset($this->mergeable_keys_map[$key])) { + $cache[$key] = $cache[$key] + $fallback_cache[$key]; + } elseif (isset($this->mergeable_keys_list[$key])) { + $cache[$key] = array_merge($fallback_cache[$key], $cache[$key]); + } + } else { + $cache[$key] = $fallback_cache[$key]; + } + } + } + + // save to cache for later retrieval + $this->cache[$code] = $cache; + return; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Length.php b/thirdparty/HTMLPurifier/HTMLPurifier/Length.php similarity index 95% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Length.php rename to thirdparty/HTMLPurifier/HTMLPurifier/Length.php index 149fcf4b0..bbfbe6624 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Length.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/Length.php @@ -1,160 +1,160 @@ - true, 'ex' => true, 'px' => true, 'in' => true, - 'cm' => true, 'mm' => true, 'pt' => true, 'pc' => true - ); - - /** - * @param string $n Magnitude - * @param bool|string $u Unit - */ - public function __construct($n = '0', $u = false) - { - $this->n = (string) $n; - $this->unit = $u !== false ? (string) $u : false; - } - - /** - * @param string $s Unit string, like '2em' or '3.4in' - * @return HTMLPurifier_Length - * @warning Does not perform validation. - */ - public static function make($s) - { - if ($s instanceof HTMLPurifier_Length) { - return $s; - } - $n_length = strspn($s, '1234567890.+-'); - $n = substr($s, 0, $n_length); - $unit = substr($s, $n_length); - if ($unit === '') { - $unit = false; - } - return new HTMLPurifier_Length($n, $unit); - } - - /** - * Validates the number and unit. - * @return bool - */ - protected function validate() - { - // Special case: - if ($this->n === '+0' || $this->n === '-0') { - $this->n = '0'; - } - if ($this->n === '0' && $this->unit === false) { - return true; - } - if (!ctype_lower($this->unit)) { - $this->unit = strtolower($this->unit); - } - if (!isset(HTMLPurifier_Length::$allowedUnits[$this->unit])) { - return false; - } - // Hack: - $def = new HTMLPurifier_AttrDef_CSS_Number(); - $result = $def->validate($this->n, false, false); - if ($result === false) { - return false; - } - $this->n = $result; - return true; - } - - /** - * Returns string representation of number. - * @return string - */ - public function toString() - { - if (!$this->isValid()) { - return false; - } - return $this->n . $this->unit; - } - - /** - * Retrieves string numeric magnitude. - * @return string - */ - public function getN() - { - return $this->n; - } - - /** - * Retrieves string unit. - * @return string - */ - public function getUnit() - { - return $this->unit; - } - - /** - * Returns true if this length unit is valid. - * @return bool - */ - public function isValid() - { - if ($this->isValid === null) { - $this->isValid = $this->validate(); - } - return $this->isValid; - } - - /** - * Compares two lengths, and returns 1 if greater, -1 if less and 0 if equal. - * @param HTMLPurifier_Length $l - * @return int - * @warning If both values are too large or small, this calculation will - * not work properly - */ - public function compareTo($l) - { - if ($l === false) { - return false; - } - if ($l->unit !== $this->unit) { - $converter = new HTMLPurifier_UnitConverter(); - $l = $converter->convert($l, $this->unit); - if ($l === false) { - return false; - } - } - return $this->n - $l->n; - } -} - -// vim: et sw=4 sts=4 + true, 'ex' => true, 'px' => true, 'in' => true, + 'cm' => true, 'mm' => true, 'pt' => true, 'pc' => true + ); + + /** + * @param string $n Magnitude + * @param bool|string $u Unit + */ + public function __construct($n = '0', $u = false) + { + $this->n = (string) $n; + $this->unit = $u !== false ? (string) $u : false; + } + + /** + * @param string $s Unit string, like '2em' or '3.4in' + * @return HTMLPurifier_Length + * @warning Does not perform validation. + */ + public static function make($s) + { + if ($s instanceof HTMLPurifier_Length) { + return $s; + } + $n_length = strspn($s, '1234567890.+-'); + $n = substr($s, 0, $n_length); + $unit = substr($s, $n_length); + if ($unit === '') { + $unit = false; + } + return new HTMLPurifier_Length($n, $unit); + } + + /** + * Validates the number and unit. + * @return bool + */ + protected function validate() + { + // Special case: + if ($this->n === '+0' || $this->n === '-0') { + $this->n = '0'; + } + if ($this->n === '0' && $this->unit === false) { + return true; + } + if (!ctype_lower($this->unit)) { + $this->unit = strtolower($this->unit); + } + if (!isset(HTMLPurifier_Length::$allowedUnits[$this->unit])) { + return false; + } + // Hack: + $def = new HTMLPurifier_AttrDef_CSS_Number(); + $result = $def->validate($this->n, false, false); + if ($result === false) { + return false; + } + $this->n = $result; + return true; + } + + /** + * Returns string representation of number. + * @return string + */ + public function toString() + { + if (!$this->isValid()) { + return false; + } + return $this->n . $this->unit; + } + + /** + * Retrieves string numeric magnitude. + * @return string + */ + public function getN() + { + return $this->n; + } + + /** + * Retrieves string unit. + * @return string + */ + public function getUnit() + { + return $this->unit; + } + + /** + * Returns true if this length unit is valid. + * @return bool + */ + public function isValid() + { + if ($this->isValid === null) { + $this->isValid = $this->validate(); + } + return $this->isValid; + } + + /** + * Compares two lengths, and returns 1 if greater, -1 if less and 0 if equal. + * @param HTMLPurifier_Length $l + * @return int + * @warning If both values are too large or small, this calculation will + * not work properly + */ + public function compareTo($l) + { + if ($l === false) { + return false; + } + if ($l->unit !== $this->unit) { + $converter = new HTMLPurifier_UnitConverter(); + $l = $converter->convert($l, $this->unit); + if ($l === false) { + return false; + } + } + return $this->n - $l->n; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Lexer.php b/thirdparty/HTMLPurifier/HTMLPurifier/Lexer.php similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Lexer.php rename to thirdparty/HTMLPurifier/HTMLPurifier/Lexer.php index 2a9a9d626..43732621d 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Lexer.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/Lexer.php @@ -1,357 +1,357 @@ -get('Core.LexerImpl'); - } - - $needs_tracking = - $config->get('Core.MaintainLineNumbers') || - $config->get('Core.CollectErrors'); - - $inst = null; - if (is_object($lexer)) { - $inst = $lexer; - } else { - if (is_null($lexer)) { - do { - // auto-detection algorithm - if ($needs_tracking) { - $lexer = 'DirectLex'; - break; - } - - if (class_exists('DOMDocument') && - method_exists('DOMDocument', 'loadHTML') && - !extension_loaded('domxml') - ) { - // check for DOM support, because while it's part of the - // core, it can be disabled compile time. Also, the PECL - // domxml extension overrides the default DOM, and is evil - // and nasty and we shan't bother to support it - $lexer = 'DOMLex'; - } else { - $lexer = 'DirectLex'; - } - } while (0); - } // do..while so we can break - - // instantiate recognized string names - switch ($lexer) { - case 'DOMLex': - $inst = new HTMLPurifier_Lexer_DOMLex(); - break; - case 'DirectLex': - $inst = new HTMLPurifier_Lexer_DirectLex(); - break; - case 'PH5P': - $inst = new HTMLPurifier_Lexer_PH5P(); - break; - default: - throw new HTMLPurifier_Exception( - "Cannot instantiate unrecognized Lexer type " . - htmlspecialchars($lexer) - ); - } - } - - if (!$inst) { - throw new HTMLPurifier_Exception('No lexer was instantiated'); - } - - // once PHP DOM implements native line numbers, or we - // hack out something using XSLT, remove this stipulation - if ($needs_tracking && !$inst->tracksLineNumbers) { - throw new HTMLPurifier_Exception( - 'Cannot use lexer that does not support line numbers with ' . - 'Core.MaintainLineNumbers or Core.CollectErrors (use DirectLex instead)' - ); - } - - return $inst; - - } - - // -- CONVENIENCE MEMBERS --------------------------------------------- - - public function __construct() - { - $this->_entity_parser = new HTMLPurifier_EntityParser(); - } - - /** - * Most common entity to raw value conversion table for special entities. - * @type array - */ - protected $_special_entity2str = - array( - '"' => '"', - '&' => '&', - '<' => '<', - '>' => '>', - ''' => "'", - ''' => "'", - ''' => "'" - ); - - /** - * Parses special entities into the proper characters. - * - * This string will translate escaped versions of the special characters - * into the correct ones. - * - * @warning - * You should be able to treat the output of this function as - * completely parsed, but that's only because all other entities should - * have been handled previously in substituteNonSpecialEntities() - * - * @param string $string String character data to be parsed. - * @return string Parsed character data. - */ - public function parseData($string) - { - // following functions require at least one character - if ($string === '') { - return ''; - } - - // subtracts amps that cannot possibly be escaped - $num_amp = substr_count($string, '&') - substr_count($string, '& ') - - ($string[strlen($string) - 1] === '&' ? 1 : 0); - - if (!$num_amp) { - return $string; - } // abort if no entities - $num_esc_amp = substr_count($string, '&'); - $string = strtr($string, $this->_special_entity2str); - - // code duplication for sake of optimization, see above - $num_amp_2 = substr_count($string, '&') - substr_count($string, '& ') - - ($string[strlen($string) - 1] === '&' ? 1 : 0); - - if ($num_amp_2 <= $num_esc_amp) { - return $string; - } - - // hmm... now we have some uncommon entities. Use the callback. - $string = $this->_entity_parser->substituteSpecialEntities($string); - return $string; - } - - /** - * Lexes an HTML string into tokens. - * @param $string String HTML. - * @param HTMLPurifier_Config $config - * @param HTMLPurifier_Context $context - * @return HTMLPurifier_Token[] array representation of HTML. - */ - public function tokenizeHTML($string, $config, $context) - { - trigger_error('Call to abstract class', E_USER_ERROR); - } - - /** - * Translates CDATA sections into regular sections (through escaping). - * @param string $string HTML string to process. - * @return string HTML with CDATA sections escaped. - */ - protected static function escapeCDATA($string) - { - return preg_replace_callback( - '//s', - array('HTMLPurifier_Lexer', 'CDATACallback'), - $string - ); - } - - /** - * Special CDATA case that is especially convoluted for )#si', - array($this, 'scriptCallback'), - $html - ); - } - - $html = $this->normalize($html, $config, $context); - - $cursor = 0; // our location in the text - $inside_tag = false; // whether or not we're parsing the inside of a tag - $array = array(); // result array - - // This is also treated to mean maintain *column* numbers too - $maintain_line_numbers = $config->get('Core.MaintainLineNumbers'); - - if ($maintain_line_numbers === null) { - // automatically determine line numbering by checking - // if error collection is on - $maintain_line_numbers = $config->get('Core.CollectErrors'); - } - - if ($maintain_line_numbers) { - $current_line = 1; - $current_col = 0; - $length = strlen($html); - } else { - $current_line = false; - $current_col = false; - $length = false; - } - $context->register('CurrentLine', $current_line); - $context->register('CurrentCol', $current_col); - $nl = "\n"; - // how often to manually recalculate. This will ALWAYS be right, - // but it's pretty wasteful. Set to 0 to turn off - $synchronize_interval = $config->get('Core.DirectLexLineNumberSyncInterval'); - - $e = false; - if ($config->get('Core.CollectErrors')) { - $e =& $context->get('ErrorCollector'); - } - - // for testing synchronization - $loops = 0; - - while (++$loops) { - // $cursor is either at the start of a token, or inside of - // a tag (i.e. there was a < immediately before it), as indicated - // by $inside_tag - - if ($maintain_line_numbers) { - // $rcursor, however, is always at the start of a token. - $rcursor = $cursor - (int)$inside_tag; - - // Column number is cheap, so we calculate it every round. - // We're interested at the *end* of the newline string, so - // we need to add strlen($nl) == 1 to $nl_pos before subtracting it - // from our "rcursor" position. - $nl_pos = strrpos($html, $nl, $rcursor - $length); - $current_col = $rcursor - (is_bool($nl_pos) ? 0 : $nl_pos + 1); - - // recalculate lines - if ($synchronize_interval && // synchronization is on - $cursor > 0 && // cursor is further than zero - $loops % $synchronize_interval === 0) { // time to synchronize! - $current_line = 1 + $this->substrCount($html, $nl, 0, $cursor); - } - } - - $position_next_lt = strpos($html, '<', $cursor); - $position_next_gt = strpos($html, '>', $cursor); - - // triggers on "asdf" but not "asdf " - // special case to set up context - if ($position_next_lt === $cursor) { - $inside_tag = true; - $cursor++; - } - - if (!$inside_tag && $position_next_lt !== false) { - // We are not inside tag and there still is another tag to parse - $token = new - HTMLPurifier_Token_Text( - $this->parseData( - substr( - $html, - $cursor, - $position_next_lt - $cursor - ) - ) - ); - if ($maintain_line_numbers) { - $token->rawPosition($current_line, $current_col); - $current_line += $this->substrCount($html, $nl, $cursor, $position_next_lt - $cursor); - } - $array[] = $token; - $cursor = $position_next_lt + 1; - $inside_tag = true; - continue; - } elseif (!$inside_tag) { - // We are not inside tag but there are no more tags - // If we're already at the end, break - if ($cursor === strlen($html)) { - break; - } - // Create Text of rest of string - $token = new - HTMLPurifier_Token_Text( - $this->parseData( - substr( - $html, - $cursor - ) - ) - ); - if ($maintain_line_numbers) { - $token->rawPosition($current_line, $current_col); - } - $array[] = $token; - break; - } elseif ($inside_tag && $position_next_gt !== false) { - // We are in tag and it is well formed - // Grab the internals of the tag - $strlen_segment = $position_next_gt - $cursor; - - if ($strlen_segment < 1) { - // there's nothing to process! - $token = new HTMLPurifier_Token_Text('<'); - $cursor++; - continue; - } - - $segment = substr($html, $cursor, $strlen_segment); - - if ($segment === false) { - // somehow, we attempted to access beyond the end of - // the string, defense-in-depth, reported by Nate Abele - break; - } - - // Check if it's a comment - if (substr($segment, 0, 3) === '!--') { - // re-determine segment length, looking for --> - $position_comment_end = strpos($html, '-->', $cursor); - if ($position_comment_end === false) { - // uh oh, we have a comment that extends to - // infinity. Can't be helped: set comment - // end position to end of string - if ($e) { - $e->send(E_WARNING, 'Lexer: Unclosed comment'); - } - $position_comment_end = strlen($html); - $end = true; - } else { - $end = false; - } - $strlen_segment = $position_comment_end - $cursor; - $segment = substr($html, $cursor, $strlen_segment); - $token = new - HTMLPurifier_Token_Comment( - substr( - $segment, - 3, - $strlen_segment - 3 - ) - ); - if ($maintain_line_numbers) { - $token->rawPosition($current_line, $current_col); - $current_line += $this->substrCount($html, $nl, $cursor, $strlen_segment); - } - $array[] = $token; - $cursor = $end ? $position_comment_end : $position_comment_end + 3; - $inside_tag = false; - continue; - } - - // Check if it's an end tag - $is_end_tag = (strpos($segment, '/') === 0); - if ($is_end_tag) { - $type = substr($segment, 1); - $token = new HTMLPurifier_Token_End($type); - if ($maintain_line_numbers) { - $token->rawPosition($current_line, $current_col); - $current_line += $this->substrCount($html, $nl, $cursor, $position_next_gt - $cursor); - } - $array[] = $token; - $inside_tag = false; - $cursor = $position_next_gt + 1; - continue; - } - - // Check leading character is alnum, if not, we may - // have accidently grabbed an emoticon. Translate into - // text and go our merry way - if (!ctype_alpha($segment[0])) { - // XML: $segment[0] !== '_' && $segment[0] !== ':' - if ($e) { - $e->send(E_NOTICE, 'Lexer: Unescaped lt'); - } - $token = new HTMLPurifier_Token_Text('<'); - if ($maintain_line_numbers) { - $token->rawPosition($current_line, $current_col); - $current_line += $this->substrCount($html, $nl, $cursor, $position_next_gt - $cursor); - } - $array[] = $token; - $inside_tag = false; - continue; - } - - // Check if it is explicitly self closing, if so, remove - // trailing slash. Remember, we could have a tag like
      , so - // any later token processing scripts must convert improperly - // classified EmptyTags from StartTags. - $is_self_closing = (strrpos($segment, '/') === $strlen_segment - 1); - if ($is_self_closing) { - $strlen_segment--; - $segment = substr($segment, 0, $strlen_segment); - } - - // Check if there are any attributes - $position_first_space = strcspn($segment, $this->_whitespace); - - if ($position_first_space >= $strlen_segment) { - if ($is_self_closing) { - $token = new HTMLPurifier_Token_Empty($segment); - } else { - $token = new HTMLPurifier_Token_Start($segment); - } - if ($maintain_line_numbers) { - $token->rawPosition($current_line, $current_col); - $current_line += $this->substrCount($html, $nl, $cursor, $position_next_gt - $cursor); - } - $array[] = $token; - $inside_tag = false; - $cursor = $position_next_gt + 1; - continue; - } - - // Grab out all the data - $type = substr($segment, 0, $position_first_space); - $attribute_string = - trim( - substr( - $segment, - $position_first_space - ) - ); - if ($attribute_string) { - $attr = $this->parseAttributeString( - $attribute_string, - $config, - $context - ); - } else { - $attr = array(); - } - - if ($is_self_closing) { - $token = new HTMLPurifier_Token_Empty($type, $attr); - } else { - $token = new HTMLPurifier_Token_Start($type, $attr); - } - if ($maintain_line_numbers) { - $token->rawPosition($current_line, $current_col); - $current_line += $this->substrCount($html, $nl, $cursor, $position_next_gt - $cursor); - } - $array[] = $token; - $cursor = $position_next_gt + 1; - $inside_tag = false; - continue; - } else { - // inside tag, but there's no ending > sign - if ($e) { - $e->send(E_WARNING, 'Lexer: Missing gt'); - } - $token = new - HTMLPurifier_Token_Text( - '<' . - $this->parseData( - substr($html, $cursor) - ) - ); - if ($maintain_line_numbers) { - $token->rawPosition($current_line, $current_col); - } - // no cursor scroll? Hmm... - $array[] = $token; - break; - } - break; - } - - $context->destroy('CurrentLine'); - $context->destroy('CurrentCol'); - return $array; - } - - /** - * PHP 5.0.x compatible substr_count that implements offset and length - * @param string $haystack - * @param string $needle - * @param int $offset - * @param int $length - * @return int - */ - protected function substrCount($haystack, $needle, $offset, $length) - { - static $oldVersion; - if ($oldVersion === null) { - $oldVersion = version_compare(PHP_VERSION, '5.1', '<'); - } - if ($oldVersion) { - $haystack = substr($haystack, $offset, $length); - return substr_count($haystack, $needle); - } else { - return substr_count($haystack, $needle, $offset, $length); - } - } - - /** - * Takes the inside of an HTML tag and makes an assoc array of attributes. - * - * @param string $string Inside of tag excluding name. - * @param HTMLPurifier_Config $config - * @param HTMLPurifier_Context $context - * @return array Assoc array of attributes. - */ - public function parseAttributeString($string, $config, $context) - { - $string = (string)$string; // quick typecast - - if ($string == '') { - return array(); - } // no attributes - - $e = false; - if ($config->get('Core.CollectErrors')) { - $e =& $context->get('ErrorCollector'); - } - - // let's see if we can abort as quickly as possible - // one equal sign, no spaces => one attribute - $num_equal = substr_count($string, '='); - $has_space = strpos($string, ' '); - if ($num_equal === 0 && !$has_space) { - // bool attribute - return array($string => $string); - } elseif ($num_equal === 1 && !$has_space) { - // only one attribute - list($key, $quoted_value) = explode('=', $string); - $quoted_value = trim($quoted_value); - if (!$key) { - if ($e) { - $e->send(E_ERROR, 'Lexer: Missing attribute key'); - } - return array(); - } - if (!$quoted_value) { - return array($key => ''); - } - $first_char = @$quoted_value[0]; - $last_char = @$quoted_value[strlen($quoted_value) - 1]; - - $same_quote = ($first_char == $last_char); - $open_quote = ($first_char == '"' || $first_char == "'"); - - if ($same_quote && $open_quote) { - // well behaved - $value = substr($quoted_value, 1, strlen($quoted_value) - 2); - } else { - // not well behaved - if ($open_quote) { - if ($e) { - $e->send(E_ERROR, 'Lexer: Missing end quote'); - } - $value = substr($quoted_value, 1); - } else { - $value = $quoted_value; - } - } - if ($value === false) { - $value = ''; - } - return array($key => $this->parseData($value)); - } - - // setup loop environment - $array = array(); // return assoc array of attributes - $cursor = 0; // current position in string (moves forward) - $size = strlen($string); // size of the string (stays the same) - - // if we have unquoted attributes, the parser expects a terminating - // space, so let's guarantee that there's always a terminating space. - $string .= ' '; - - $old_cursor = -1; - while ($cursor < $size) { - if ($old_cursor >= $cursor) { - throw new Exception("Infinite loop detected"); - } - $old_cursor = $cursor; - - $cursor += ($value = strspn($string, $this->_whitespace, $cursor)); - // grab the key - - $key_begin = $cursor; //we're currently at the start of the key - - // scroll past all characters that are the key (not whitespace or =) - $cursor += strcspn($string, $this->_whitespace . '=', $cursor); - - $key_end = $cursor; // now at the end of the key - - $key = substr($string, $key_begin, $key_end - $key_begin); - - if (!$key) { - if ($e) { - $e->send(E_ERROR, 'Lexer: Missing attribute key'); - } - $cursor += 1 + strcspn($string, $this->_whitespace, $cursor + 1); // prevent infinite loop - continue; // empty key - } - - // scroll past all whitespace - $cursor += strspn($string, $this->_whitespace, $cursor); - - if ($cursor >= $size) { - $array[$key] = $key; - break; - } - - // if the next character is an equal sign, we've got a regular - // pair, otherwise, it's a bool attribute - $first_char = @$string[$cursor]; - - if ($first_char == '=') { - // key="value" - - $cursor++; - $cursor += strspn($string, $this->_whitespace, $cursor); - - if ($cursor === false) { - $array[$key] = ''; - break; - } - - // we might be in front of a quote right now - - $char = @$string[$cursor]; - - if ($char == '"' || $char == "'") { - // it's quoted, end bound is $char - $cursor++; - $value_begin = $cursor; - $cursor = strpos($string, $char, $cursor); - $value_end = $cursor; - } else { - // it's not quoted, end bound is whitespace - $value_begin = $cursor; - $cursor += strcspn($string, $this->_whitespace, $cursor); - $value_end = $cursor; - } - - // we reached a premature end - if ($cursor === false) { - $cursor = $size; - $value_end = $cursor; - } - - $value = substr($string, $value_begin, $value_end - $value_begin); - if ($value === false) { - $value = ''; - } - $array[$key] = $this->parseData($value); - $cursor++; - } else { - // boolattr - if ($key !== '') { - $array[$key] = $key; - } else { - // purely theoretical - if ($e) { - $e->send(E_ERROR, 'Lexer: Missing attribute key'); - } - } - } - } - return $array; - } -} - -// vim: et sw=4 sts=4 +get('HTML.Trusted')) { + $html = preg_replace_callback( + '#(]*>)(\s*[^<].+?)()#si', + array($this, 'scriptCallback'), + $html + ); + } + + $html = $this->normalize($html, $config, $context); + + $cursor = 0; // our location in the text + $inside_tag = false; // whether or not we're parsing the inside of a tag + $array = array(); // result array + + // This is also treated to mean maintain *column* numbers too + $maintain_line_numbers = $config->get('Core.MaintainLineNumbers'); + + if ($maintain_line_numbers === null) { + // automatically determine line numbering by checking + // if error collection is on + $maintain_line_numbers = $config->get('Core.CollectErrors'); + } + + if ($maintain_line_numbers) { + $current_line = 1; + $current_col = 0; + $length = strlen($html); + } else { + $current_line = false; + $current_col = false; + $length = false; + } + $context->register('CurrentLine', $current_line); + $context->register('CurrentCol', $current_col); + $nl = "\n"; + // how often to manually recalculate. This will ALWAYS be right, + // but it's pretty wasteful. Set to 0 to turn off + $synchronize_interval = $config->get('Core.DirectLexLineNumberSyncInterval'); + + $e = false; + if ($config->get('Core.CollectErrors')) { + $e =& $context->get('ErrorCollector'); + } + + // for testing synchronization + $loops = 0; + + while (++$loops) { + // $cursor is either at the start of a token, or inside of + // a tag (i.e. there was a < immediately before it), as indicated + // by $inside_tag + + if ($maintain_line_numbers) { + // $rcursor, however, is always at the start of a token. + $rcursor = $cursor - (int)$inside_tag; + + // Column number is cheap, so we calculate it every round. + // We're interested at the *end* of the newline string, so + // we need to add strlen($nl) == 1 to $nl_pos before subtracting it + // from our "rcursor" position. + $nl_pos = strrpos($html, $nl, $rcursor - $length); + $current_col = $rcursor - (is_bool($nl_pos) ? 0 : $nl_pos + 1); + + // recalculate lines + if ($synchronize_interval && // synchronization is on + $cursor > 0 && // cursor is further than zero + $loops % $synchronize_interval === 0) { // time to synchronize! + $current_line = 1 + $this->substrCount($html, $nl, 0, $cursor); + } + } + + $position_next_lt = strpos($html, '<', $cursor); + $position_next_gt = strpos($html, '>', $cursor); + + // triggers on "asdf" but not "asdf " + // special case to set up context + if ($position_next_lt === $cursor) { + $inside_tag = true; + $cursor++; + } + + if (!$inside_tag && $position_next_lt !== false) { + // We are not inside tag and there still is another tag to parse + $token = new + HTMLPurifier_Token_Text( + $this->parseData( + substr( + $html, + $cursor, + $position_next_lt - $cursor + ) + ) + ); + if ($maintain_line_numbers) { + $token->rawPosition($current_line, $current_col); + $current_line += $this->substrCount($html, $nl, $cursor, $position_next_lt - $cursor); + } + $array[] = $token; + $cursor = $position_next_lt + 1; + $inside_tag = true; + continue; + } elseif (!$inside_tag) { + // We are not inside tag but there are no more tags + // If we're already at the end, break + if ($cursor === strlen($html)) { + break; + } + // Create Text of rest of string + $token = new + HTMLPurifier_Token_Text( + $this->parseData( + substr( + $html, + $cursor + ) + ) + ); + if ($maintain_line_numbers) { + $token->rawPosition($current_line, $current_col); + } + $array[] = $token; + break; + } elseif ($inside_tag && $position_next_gt !== false) { + // We are in tag and it is well formed + // Grab the internals of the tag + $strlen_segment = $position_next_gt - $cursor; + + if ($strlen_segment < 1) { + // there's nothing to process! + $token = new HTMLPurifier_Token_Text('<'); + $cursor++; + continue; + } + + $segment = substr($html, $cursor, $strlen_segment); + + if ($segment === false) { + // somehow, we attempted to access beyond the end of + // the string, defense-in-depth, reported by Nate Abele + break; + } + + // Check if it's a comment + if (substr($segment, 0, 3) === '!--') { + // re-determine segment length, looking for --> + $position_comment_end = strpos($html, '-->', $cursor); + if ($position_comment_end === false) { + // uh oh, we have a comment that extends to + // infinity. Can't be helped: set comment + // end position to end of string + if ($e) { + $e->send(E_WARNING, 'Lexer: Unclosed comment'); + } + $position_comment_end = strlen($html); + $end = true; + } else { + $end = false; + } + $strlen_segment = $position_comment_end - $cursor; + $segment = substr($html, $cursor, $strlen_segment); + $token = new + HTMLPurifier_Token_Comment( + substr( + $segment, + 3, + $strlen_segment - 3 + ) + ); + if ($maintain_line_numbers) { + $token->rawPosition($current_line, $current_col); + $current_line += $this->substrCount($html, $nl, $cursor, $strlen_segment); + } + $array[] = $token; + $cursor = $end ? $position_comment_end : $position_comment_end + 3; + $inside_tag = false; + continue; + } + + // Check if it's an end tag + $is_end_tag = (strpos($segment, '/') === 0); + if ($is_end_tag) { + $type = substr($segment, 1); + $token = new HTMLPurifier_Token_End($type); + if ($maintain_line_numbers) { + $token->rawPosition($current_line, $current_col); + $current_line += $this->substrCount($html, $nl, $cursor, $position_next_gt - $cursor); + } + $array[] = $token; + $inside_tag = false; + $cursor = $position_next_gt + 1; + continue; + } + + // Check leading character is alnum, if not, we may + // have accidently grabbed an emoticon. Translate into + // text and go our merry way + if (!ctype_alpha($segment[0])) { + // XML: $segment[0] !== '_' && $segment[0] !== ':' + if ($e) { + $e->send(E_NOTICE, 'Lexer: Unescaped lt'); + } + $token = new HTMLPurifier_Token_Text('<'); + if ($maintain_line_numbers) { + $token->rawPosition($current_line, $current_col); + $current_line += $this->substrCount($html, $nl, $cursor, $position_next_gt - $cursor); + } + $array[] = $token; + $inside_tag = false; + continue; + } + + // Check if it is explicitly self closing, if so, remove + // trailing slash. Remember, we could have a tag like
      , so + // any later token processing scripts must convert improperly + // classified EmptyTags from StartTags. + $is_self_closing = (strrpos($segment, '/') === $strlen_segment - 1); + if ($is_self_closing) { + $strlen_segment--; + $segment = substr($segment, 0, $strlen_segment); + } + + // Check if there are any attributes + $position_first_space = strcspn($segment, $this->_whitespace); + + if ($position_first_space >= $strlen_segment) { + if ($is_self_closing) { + $token = new HTMLPurifier_Token_Empty($segment); + } else { + $token = new HTMLPurifier_Token_Start($segment); + } + if ($maintain_line_numbers) { + $token->rawPosition($current_line, $current_col); + $current_line += $this->substrCount($html, $nl, $cursor, $position_next_gt - $cursor); + } + $array[] = $token; + $inside_tag = false; + $cursor = $position_next_gt + 1; + continue; + } + + // Grab out all the data + $type = substr($segment, 0, $position_first_space); + $attribute_string = + trim( + substr( + $segment, + $position_first_space + ) + ); + if ($attribute_string) { + $attr = $this->parseAttributeString( + $attribute_string, + $config, + $context + ); + } else { + $attr = array(); + } + + if ($is_self_closing) { + $token = new HTMLPurifier_Token_Empty($type, $attr); + } else { + $token = new HTMLPurifier_Token_Start($type, $attr); + } + if ($maintain_line_numbers) { + $token->rawPosition($current_line, $current_col); + $current_line += $this->substrCount($html, $nl, $cursor, $position_next_gt - $cursor); + } + $array[] = $token; + $cursor = $position_next_gt + 1; + $inside_tag = false; + continue; + } else { + // inside tag, but there's no ending > sign + if ($e) { + $e->send(E_WARNING, 'Lexer: Missing gt'); + } + $token = new + HTMLPurifier_Token_Text( + '<' . + $this->parseData( + substr($html, $cursor) + ) + ); + if ($maintain_line_numbers) { + $token->rawPosition($current_line, $current_col); + } + // no cursor scroll? Hmm... + $array[] = $token; + break; + } + break; + } + + $context->destroy('CurrentLine'); + $context->destroy('CurrentCol'); + return $array; + } + + /** + * PHP 5.0.x compatible substr_count that implements offset and length + * @param string $haystack + * @param string $needle + * @param int $offset + * @param int $length + * @return int + */ + protected function substrCount($haystack, $needle, $offset, $length) + { + static $oldVersion; + if ($oldVersion === null) { + $oldVersion = version_compare(PHP_VERSION, '5.1', '<'); + } + if ($oldVersion) { + $haystack = substr($haystack, $offset, $length); + return substr_count($haystack, $needle); + } else { + return substr_count($haystack, $needle, $offset, $length); + } + } + + /** + * Takes the inside of an HTML tag and makes an assoc array of attributes. + * + * @param string $string Inside of tag excluding name. + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return array Assoc array of attributes. + */ + public function parseAttributeString($string, $config, $context) + { + $string = (string)$string; // quick typecast + + if ($string == '') { + return array(); + } // no attributes + + $e = false; + if ($config->get('Core.CollectErrors')) { + $e =& $context->get('ErrorCollector'); + } + + // let's see if we can abort as quickly as possible + // one equal sign, no spaces => one attribute + $num_equal = substr_count($string, '='); + $has_space = strpos($string, ' '); + if ($num_equal === 0 && !$has_space) { + // bool attribute + return array($string => $string); + } elseif ($num_equal === 1 && !$has_space) { + // only one attribute + list($key, $quoted_value) = explode('=', $string); + $quoted_value = trim($quoted_value); + if (!$key) { + if ($e) { + $e->send(E_ERROR, 'Lexer: Missing attribute key'); + } + return array(); + } + if (!$quoted_value) { + return array($key => ''); + } + $first_char = @$quoted_value[0]; + $last_char = @$quoted_value[strlen($quoted_value) - 1]; + + $same_quote = ($first_char == $last_char); + $open_quote = ($first_char == '"' || $first_char == "'"); + + if ($same_quote && $open_quote) { + // well behaved + $value = substr($quoted_value, 1, strlen($quoted_value) - 2); + } else { + // not well behaved + if ($open_quote) { + if ($e) { + $e->send(E_ERROR, 'Lexer: Missing end quote'); + } + $value = substr($quoted_value, 1); + } else { + $value = $quoted_value; + } + } + if ($value === false) { + $value = ''; + } + return array($key => $this->parseData($value)); + } + + // setup loop environment + $array = array(); // return assoc array of attributes + $cursor = 0; // current position in string (moves forward) + $size = strlen($string); // size of the string (stays the same) + + // if we have unquoted attributes, the parser expects a terminating + // space, so let's guarantee that there's always a terminating space. + $string .= ' '; + + $old_cursor = -1; + while ($cursor < $size) { + if ($old_cursor >= $cursor) { + throw new Exception("Infinite loop detected"); + } + $old_cursor = $cursor; + + $cursor += ($value = strspn($string, $this->_whitespace, $cursor)); + // grab the key + + $key_begin = $cursor; //we're currently at the start of the key + + // scroll past all characters that are the key (not whitespace or =) + $cursor += strcspn($string, $this->_whitespace . '=', $cursor); + + $key_end = $cursor; // now at the end of the key + + $key = substr($string, $key_begin, $key_end - $key_begin); + + if (!$key) { + if ($e) { + $e->send(E_ERROR, 'Lexer: Missing attribute key'); + } + $cursor += 1 + strcspn($string, $this->_whitespace, $cursor + 1); // prevent infinite loop + continue; // empty key + } + + // scroll past all whitespace + $cursor += strspn($string, $this->_whitespace, $cursor); + + if ($cursor >= $size) { + $array[$key] = $key; + break; + } + + // if the next character is an equal sign, we've got a regular + // pair, otherwise, it's a bool attribute + $first_char = @$string[$cursor]; + + if ($first_char == '=') { + // key="value" + + $cursor++; + $cursor += strspn($string, $this->_whitespace, $cursor); + + if ($cursor === false) { + $array[$key] = ''; + break; + } + + // we might be in front of a quote right now + + $char = @$string[$cursor]; + + if ($char == '"' || $char == "'") { + // it's quoted, end bound is $char + $cursor++; + $value_begin = $cursor; + $cursor = strpos($string, $char, $cursor); + $value_end = $cursor; + } else { + // it's not quoted, end bound is whitespace + $value_begin = $cursor; + $cursor += strcspn($string, $this->_whitespace, $cursor); + $value_end = $cursor; + } + + // we reached a premature end + if ($cursor === false) { + $cursor = $size; + $value_end = $cursor; + } + + $value = substr($string, $value_begin, $value_end - $value_begin); + if ($value === false) { + $value = ''; + } + $array[$key] = $this->parseData($value); + $cursor++; + } else { + // boolattr + if ($key !== '') { + $array[$key] = $key; + } else { + // purely theoretical + if ($e) { + $e->send(E_ERROR, 'Lexer: Missing attribute key'); + } + } + } + } + return $array; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Lexer/PH5P.php b/thirdparty/HTMLPurifier/HTMLPurifier/Lexer/PH5P.php similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Lexer/PH5P.php rename to thirdparty/HTMLPurifier/HTMLPurifier/Lexer/PH5P.php index 48b5f9a6c..a4587e4cd 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Lexer/PH5P.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/Lexer/PH5P.php @@ -1,4788 +1,4788 @@ -normalize($html, $config, $context); - $new_html = $this->wrapHTML($new_html, $config, $context); - try { - $parser = new HTML5($new_html); - $doc = $parser->save(); - } catch (DOMException $e) { - // Uh oh, it failed. Punt to DirectLex. - $lexer = new HTMLPurifier_Lexer_DirectLex(); - $context->register('PH5PError', $e); // save the error, so we can detect it - return $lexer->tokenizeHTML($html, $config, $context); // use original HTML - } - $tokens = array(); - $this->tokenizeDOM( - $doc->getElementsByTagName('html')->item(0)-> // - getElementsByTagName('body')->item(0)-> // - getElementsByTagName('div')->item(0) //
      - , - $tokens - ); - return $tokens; - } -} - -/* - -Copyright 2007 Jeroen van der Meer - -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. - -*/ - -class HTML5 -{ - private $data; - private $char; - private $EOF; - private $state; - private $tree; - private $token; - private $content_model; - private $escape = false; - private $entities = array( - 'AElig;', - 'AElig', - 'AMP;', - 'AMP', - 'Aacute;', - 'Aacute', - 'Acirc;', - 'Acirc', - 'Agrave;', - 'Agrave', - 'Alpha;', - 'Aring;', - 'Aring', - 'Atilde;', - 'Atilde', - 'Auml;', - 'Auml', - 'Beta;', - 'COPY;', - 'COPY', - 'Ccedil;', - 'Ccedil', - 'Chi;', - 'Dagger;', - 'Delta;', - 'ETH;', - 'ETH', - 'Eacute;', - 'Eacute', - 'Ecirc;', - 'Ecirc', - 'Egrave;', - 'Egrave', - 'Epsilon;', - 'Eta;', - 'Euml;', - 'Euml', - 'GT;', - 'GT', - 'Gamma;', - 'Iacute;', - 'Iacute', - 'Icirc;', - 'Icirc', - 'Igrave;', - 'Igrave', - 'Iota;', - 'Iuml;', - 'Iuml', - 'Kappa;', - 'LT;', - 'LT', - 'Lambda;', - 'Mu;', - 'Ntilde;', - 'Ntilde', - 'Nu;', - 'OElig;', - 'Oacute;', - 'Oacute', - 'Ocirc;', - 'Ocirc', - 'Ograve;', - 'Ograve', - 'Omega;', - 'Omicron;', - 'Oslash;', - 'Oslash', - 'Otilde;', - 'Otilde', - 'Ouml;', - 'Ouml', - 'Phi;', - 'Pi;', - 'Prime;', - 'Psi;', - 'QUOT;', - 'QUOT', - 'REG;', - 'REG', - 'Rho;', - 'Scaron;', - 'Sigma;', - 'THORN;', - 'THORN', - 'TRADE;', - 'Tau;', - 'Theta;', - 'Uacute;', - 'Uacute', - 'Ucirc;', - 'Ucirc', - 'Ugrave;', - 'Ugrave', - 'Upsilon;', - 'Uuml;', - 'Uuml', - 'Xi;', - 'Yacute;', - 'Yacute', - 'Yuml;', - 'Zeta;', - 'aacute;', - 'aacute', - 'acirc;', - 'acirc', - 'acute;', - 'acute', - 'aelig;', - 'aelig', - 'agrave;', - 'agrave', - 'alefsym;', - 'alpha;', - 'amp;', - 'amp', - 'and;', - 'ang;', - 'apos;', - 'aring;', - 'aring', - 'asymp;', - 'atilde;', - 'atilde', - 'auml;', - 'auml', - 'bdquo;', - 'beta;', - 'brvbar;', - 'brvbar', - 'bull;', - 'cap;', - 'ccedil;', - 'ccedil', - 'cedil;', - 'cedil', - 'cent;', - 'cent', - 'chi;', - 'circ;', - 'clubs;', - 'cong;', - 'copy;', - 'copy', - 'crarr;', - 'cup;', - 'curren;', - 'curren', - 'dArr;', - 'dagger;', - 'darr;', - 'deg;', - 'deg', - 'delta;', - 'diams;', - 'divide;', - 'divide', - 'eacute;', - 'eacute', - 'ecirc;', - 'ecirc', - 'egrave;', - 'egrave', - 'empty;', - 'emsp;', - 'ensp;', - 'epsilon;', - 'equiv;', - 'eta;', - 'eth;', - 'eth', - 'euml;', - 'euml', - 'euro;', - 'exist;', - 'fnof;', - 'forall;', - 'frac12;', - 'frac12', - 'frac14;', - 'frac14', - 'frac34;', - 'frac34', - 'frasl;', - 'gamma;', - 'ge;', - 'gt;', - 'gt', - 'hArr;', - 'harr;', - 'hearts;', - 'hellip;', - 'iacute;', - 'iacute', - 'icirc;', - 'icirc', - 'iexcl;', - 'iexcl', - 'igrave;', - 'igrave', - 'image;', - 'infin;', - 'int;', - 'iota;', - 'iquest;', - 'iquest', - 'isin;', - 'iuml;', - 'iuml', - 'kappa;', - 'lArr;', - 'lambda;', - 'lang;', - 'laquo;', - 'laquo', - 'larr;', - 'lceil;', - 'ldquo;', - 'le;', - 'lfloor;', - 'lowast;', - 'loz;', - 'lrm;', - 'lsaquo;', - 'lsquo;', - 'lt;', - 'lt', - 'macr;', - 'macr', - 'mdash;', - 'micro;', - 'micro', - 'middot;', - 'middot', - 'minus;', - 'mu;', - 'nabla;', - 'nbsp;', - 'nbsp', - 'ndash;', - 'ne;', - 'ni;', - 'not;', - 'not', - 'notin;', - 'nsub;', - 'ntilde;', - 'ntilde', - 'nu;', - 'oacute;', - 'oacute', - 'ocirc;', - 'ocirc', - 'oelig;', - 'ograve;', - 'ograve', - 'oline;', - 'omega;', - 'omicron;', - 'oplus;', - 'or;', - 'ordf;', - 'ordf', - 'ordm;', - 'ordm', - 'oslash;', - 'oslash', - 'otilde;', - 'otilde', - 'otimes;', - 'ouml;', - 'ouml', - 'para;', - 'para', - 'part;', - 'permil;', - 'perp;', - 'phi;', - 'pi;', - 'piv;', - 'plusmn;', - 'plusmn', - 'pound;', - 'pound', - 'prime;', - 'prod;', - 'prop;', - 'psi;', - 'quot;', - 'quot', - 'rArr;', - 'radic;', - 'rang;', - 'raquo;', - 'raquo', - 'rarr;', - 'rceil;', - 'rdquo;', - 'real;', - 'reg;', - 'reg', - 'rfloor;', - 'rho;', - 'rlm;', - 'rsaquo;', - 'rsquo;', - 'sbquo;', - 'scaron;', - 'sdot;', - 'sect;', - 'sect', - 'shy;', - 'shy', - 'sigma;', - 'sigmaf;', - 'sim;', - 'spades;', - 'sub;', - 'sube;', - 'sum;', - 'sup1;', - 'sup1', - 'sup2;', - 'sup2', - 'sup3;', - 'sup3', - 'sup;', - 'supe;', - 'szlig;', - 'szlig', - 'tau;', - 'there4;', - 'theta;', - 'thetasym;', - 'thinsp;', - 'thorn;', - 'thorn', - 'tilde;', - 'times;', - 'times', - 'trade;', - 'uArr;', - 'uacute;', - 'uacute', - 'uarr;', - 'ucirc;', - 'ucirc', - 'ugrave;', - 'ugrave', - 'uml;', - 'uml', - 'upsih;', - 'upsilon;', - 'uuml;', - 'uuml', - 'weierp;', - 'xi;', - 'yacute;', - 'yacute', - 'yen;', - 'yen', - 'yuml;', - 'yuml', - 'zeta;', - 'zwj;', - 'zwnj;' - ); - - const PCDATA = 0; - const RCDATA = 1; - const CDATA = 2; - const PLAINTEXT = 3; - - const DOCTYPE = 0; - const STARTTAG = 1; - const ENDTAG = 2; - const COMMENT = 3; - const CHARACTR = 4; - const EOF = 5; - - public function __construct($data) - { - $this->data = $data; - $this->char = -1; - $this->EOF = strlen($data); - $this->tree = new HTML5TreeConstructer; - $this->content_model = self::PCDATA; - - $this->state = 'data'; - - while ($this->state !== null) { - $this->{$this->state . 'State'}(); - } - } - - public function save() - { - return $this->tree->save(); - } - - private function char() - { - return ($this->char < $this->EOF) - ? $this->data[$this->char] - : false; - } - - private function character($s, $l = 0) - { - if ($s + $l < $this->EOF) { - if ($l === 0) { - return $this->data[$s]; - } else { - return substr($this->data, $s, $l); - } - } - } - - private function characters($char_class, $start) - { - return preg_replace('#^([' . $char_class . ']+).*#s', '\\1', substr($this->data, $start)); - } - - private function dataState() - { - // Consume the next input character - $this->char++; - $char = $this->char(); - - if ($char === '&' && ($this->content_model === self::PCDATA || $this->content_model === self::RCDATA)) { - /* U+0026 AMPERSAND (&) - When the content model flag is set to one of the PCDATA or RCDATA - states: switch to the entity data state. Otherwise: treat it as per - the "anything else" entry below. */ - $this->state = 'entityData'; - - } elseif ($char === '-') { - /* If the content model flag is set to either the RCDATA state or - the CDATA state, and the escape flag is false, and there are at - least three characters before this one in the input stream, and the - last four characters in the input stream, including this one, are - U+003C LESS-THAN SIGN, U+0021 EXCLAMATION MARK, U+002D HYPHEN-MINUS, - and U+002D HYPHEN-MINUS (""), - set the escape flag to false. */ - if (($this->content_model === self::RCDATA || - $this->content_model === self::CDATA) && $this->escape === true && - $this->character($this->char, 3) === '-->' - ) { - $this->escape = false; - } - - /* In any case, emit the input character as a character token. - Stay in the data state. */ - $this->emitToken( - array( - 'type' => self::CHARACTR, - 'data' => $char - ) - ); - - } elseif ($this->char === $this->EOF) { - /* EOF - Emit an end-of-file token. */ - $this->EOF(); - - } elseif ($this->content_model === self::PLAINTEXT) { - /* When the content model flag is set to the PLAINTEXT state - THIS DIFFERS GREATLY FROM THE SPEC: Get the remaining characters of - the text and emit it as a character token. */ - $this->emitToken( - array( - 'type' => self::CHARACTR, - 'data' => substr($this->data, $this->char) - ) - ); - - $this->EOF(); - - } else { - /* Anything else - THIS DIFFERS GREATLY FROM THE SPEC: Get as many character that - otherwise would also be treated as a character token and emit it - as a single character token. Stay in the data state. */ - $len = strcspn($this->data, '<&', $this->char); - $char = substr($this->data, $this->char, $len); - $this->char += $len - 1; - - $this->emitToken( - array( - 'type' => self::CHARACTR, - 'data' => $char - ) - ); - - $this->state = 'data'; - } - } - - private function entityDataState() - { - // Attempt to consume an entity. - $entity = $this->entity(); - - // If nothing is returned, emit a U+0026 AMPERSAND character token. - // Otherwise, emit the character token that was returned. - $char = (!$entity) ? '&' : $entity; - $this->emitToken( - array( - 'type' => self::CHARACTR, - 'data' => $char - ) - ); - - // Finally, switch to the data state. - $this->state = 'data'; - } - - private function tagOpenState() - { - switch ($this->content_model) { - case self::RCDATA: - case self::CDATA: - /* If the next input character is a U+002F SOLIDUS (/) character, - consume it and switch to the close tag open state. If the next - input character is not a U+002F SOLIDUS (/) character, emit a - U+003C LESS-THAN SIGN character token and switch to the data - state to process the next input character. */ - if ($this->character($this->char + 1) === '/') { - $this->char++; - $this->state = 'closeTagOpen'; - - } else { - $this->emitToken( - array( - 'type' => self::CHARACTR, - 'data' => '<' - ) - ); - - $this->state = 'data'; - } - break; - - case self::PCDATA: - // If the content model flag is set to the PCDATA state - // Consume the next input character: - $this->char++; - $char = $this->char(); - - if ($char === '!') { - /* U+0021 EXCLAMATION MARK (!) - Switch to the markup declaration open state. */ - $this->state = 'markupDeclarationOpen'; - - } elseif ($char === '/') { - /* U+002F SOLIDUS (/) - Switch to the close tag open state. */ - $this->state = 'closeTagOpen'; - - } elseif (preg_match('/^[A-Za-z]$/', $char)) { - /* U+0041 LATIN LETTER A through to U+005A LATIN LETTER Z - Create a new start tag token, set its tag name to the lowercase - version of the input character (add 0x0020 to the character's code - point), then switch to the tag name state. (Don't emit the token - yet; further details will be filled in before it is emitted.) */ - $this->token = array( - 'name' => strtolower($char), - 'type' => self::STARTTAG, - 'attr' => array() - ); - - $this->state = 'tagName'; - - } elseif ($char === '>') { - /* U+003E GREATER-THAN SIGN (>) - Parse error. Emit a U+003C LESS-THAN SIGN character token and a - U+003E GREATER-THAN SIGN character token. Switch to the data state. */ - $this->emitToken( - array( - 'type' => self::CHARACTR, - 'data' => '<>' - ) - ); - - $this->state = 'data'; - - } elseif ($char === '?') { - /* U+003F QUESTION MARK (?) - Parse error. Switch to the bogus comment state. */ - $this->state = 'bogusComment'; - - } else { - /* Anything else - Parse error. Emit a U+003C LESS-THAN SIGN character token and - reconsume the current input character in the data state. */ - $this->emitToken( - array( - 'type' => self::CHARACTR, - 'data' => '<' - ) - ); - - $this->char--; - $this->state = 'data'; - } - break; - } - } - - private function closeTagOpenState() - { - $next_node = strtolower($this->characters('A-Za-z', $this->char + 1)); - $the_same = count($this->tree->stack) > 0 && $next_node === end($this->tree->stack)->nodeName; - - if (($this->content_model === self::RCDATA || $this->content_model === self::CDATA) && - (!$the_same || ($the_same && (!preg_match( - '/[\t\n\x0b\x0c >\/]/', - $this->character($this->char + 1 + strlen($next_node)) - ) || $this->EOF === $this->char))) - ) { - /* If the content model flag is set to the RCDATA or CDATA states then - examine the next few characters. If they do not match the tag name of - the last start tag token emitted (case insensitively), or if they do but - they are not immediately followed by one of the following characters: - * U+0009 CHARACTER TABULATION - * U+000A LINE FEED (LF) - * U+000B LINE TABULATION - * U+000C FORM FEED (FF) - * U+0020 SPACE - * U+003E GREATER-THAN SIGN (>) - * U+002F SOLIDUS (/) - * EOF - ...then there is a parse error. Emit a U+003C LESS-THAN SIGN character - token, a U+002F SOLIDUS character token, and switch to the data state - to process the next input character. */ - $this->emitToken( - array( - 'type' => self::CHARACTR, - 'data' => 'state = 'data'; - - } else { - /* Otherwise, if the content model flag is set to the PCDATA state, - or if the next few characters do match that tag name, consume the - next input character: */ - $this->char++; - $char = $this->char(); - - if (preg_match('/^[A-Za-z]$/', $char)) { - /* U+0041 LATIN LETTER A through to U+005A LATIN LETTER Z - Create a new end tag token, set its tag name to the lowercase version - of the input character (add 0x0020 to the character's code point), then - switch to the tag name state. (Don't emit the token yet; further details - will be filled in before it is emitted.) */ - $this->token = array( - 'name' => strtolower($char), - 'type' => self::ENDTAG - ); - - $this->state = 'tagName'; - - } elseif ($char === '>') { - /* U+003E GREATER-THAN SIGN (>) - Parse error. Switch to the data state. */ - $this->state = 'data'; - - } elseif ($this->char === $this->EOF) { - /* EOF - Parse error. Emit a U+003C LESS-THAN SIGN character token and a U+002F - SOLIDUS character token. Reconsume the EOF character in the data state. */ - $this->emitToken( - array( - 'type' => self::CHARACTR, - 'data' => 'char--; - $this->state = 'data'; - - } else { - /* Parse error. Switch to the bogus comment state. */ - $this->state = 'bogusComment'; - } - } - } - - private function tagNameState() - { - // Consume the next input character: - $this->char++; - $char = $this->character($this->char); - - if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { - /* U+0009 CHARACTER TABULATION - U+000A LINE FEED (LF) - U+000B LINE TABULATION - U+000C FORM FEED (FF) - U+0020 SPACE - Switch to the before attribute name state. */ - $this->state = 'beforeAttributeName'; - - } elseif ($char === '>') { - /* U+003E GREATER-THAN SIGN (>) - Emit the current tag token. Switch to the data state. */ - $this->emitToken($this->token); - $this->state = 'data'; - - } elseif ($this->char === $this->EOF) { - /* EOF - Parse error. Emit the current tag token. Reconsume the EOF - character in the data state. */ - $this->emitToken($this->token); - - $this->char--; - $this->state = 'data'; - - } elseif ($char === '/') { - /* U+002F SOLIDUS (/) - Parse error unless this is a permitted slash. Switch to the before - attribute name state. */ - $this->state = 'beforeAttributeName'; - - } else { - /* Anything else - Append the current input character to the current tag token's tag name. - Stay in the tag name state. */ - $this->token['name'] .= strtolower($char); - $this->state = 'tagName'; - } - } - - private function beforeAttributeNameState() - { - // Consume the next input character: - $this->char++; - $char = $this->character($this->char); - - if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { - /* U+0009 CHARACTER TABULATION - U+000A LINE FEED (LF) - U+000B LINE TABULATION - U+000C FORM FEED (FF) - U+0020 SPACE - Stay in the before attribute name state. */ - $this->state = 'beforeAttributeName'; - - } elseif ($char === '>') { - /* U+003E GREATER-THAN SIGN (>) - Emit the current tag token. Switch to the data state. */ - $this->emitToken($this->token); - $this->state = 'data'; - - } elseif ($char === '/') { - /* U+002F SOLIDUS (/) - Parse error unless this is a permitted slash. Stay in the before - attribute name state. */ - $this->state = 'beforeAttributeName'; - - } elseif ($this->char === $this->EOF) { - /* EOF - Parse error. Emit the current tag token. Reconsume the EOF - character in the data state. */ - $this->emitToken($this->token); - - $this->char--; - $this->state = 'data'; - - } else { - /* Anything else - Start a new attribute in the current tag token. Set that attribute's - name to the current input character, and its value to the empty string. - Switch to the attribute name state. */ - $this->token['attr'][] = array( - 'name' => strtolower($char), - 'value' => null - ); - - $this->state = 'attributeName'; - } - } - - private function attributeNameState() - { - // Consume the next input character: - $this->char++; - $char = $this->character($this->char); - - if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { - /* U+0009 CHARACTER TABULATION - U+000A LINE FEED (LF) - U+000B LINE TABULATION - U+000C FORM FEED (FF) - U+0020 SPACE - Stay in the before attribute name state. */ - $this->state = 'afterAttributeName'; - - } elseif ($char === '=') { - /* U+003D EQUALS SIGN (=) - Switch to the before attribute value state. */ - $this->state = 'beforeAttributeValue'; - - } elseif ($char === '>') { - /* U+003E GREATER-THAN SIGN (>) - Emit the current tag token. Switch to the data state. */ - $this->emitToken($this->token); - $this->state = 'data'; - - } elseif ($char === '/' && $this->character($this->char + 1) !== '>') { - /* U+002F SOLIDUS (/) - Parse error unless this is a permitted slash. Switch to the before - attribute name state. */ - $this->state = 'beforeAttributeName'; - - } elseif ($this->char === $this->EOF) { - /* EOF - Parse error. Emit the current tag token. Reconsume the EOF - character in the data state. */ - $this->emitToken($this->token); - - $this->char--; - $this->state = 'data'; - - } else { - /* Anything else - Append the current input character to the current attribute's name. - Stay in the attribute name state. */ - $last = count($this->token['attr']) - 1; - $this->token['attr'][$last]['name'] .= strtolower($char); - - $this->state = 'attributeName'; - } - } - - private function afterAttributeNameState() - { - // Consume the next input character: - $this->char++; - $char = $this->character($this->char); - - if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { - /* U+0009 CHARACTER TABULATION - U+000A LINE FEED (LF) - U+000B LINE TABULATION - U+000C FORM FEED (FF) - U+0020 SPACE - Stay in the after attribute name state. */ - $this->state = 'afterAttributeName'; - - } elseif ($char === '=') { - /* U+003D EQUALS SIGN (=) - Switch to the before attribute value state. */ - $this->state = 'beforeAttributeValue'; - - } elseif ($char === '>') { - /* U+003E GREATER-THAN SIGN (>) - Emit the current tag token. Switch to the data state. */ - $this->emitToken($this->token); - $this->state = 'data'; - - } elseif ($char === '/' && $this->character($this->char + 1) !== '>') { - /* U+002F SOLIDUS (/) - Parse error unless this is a permitted slash. Switch to the - before attribute name state. */ - $this->state = 'beforeAttributeName'; - - } elseif ($this->char === $this->EOF) { - /* EOF - Parse error. Emit the current tag token. Reconsume the EOF - character in the data state. */ - $this->emitToken($this->token); - - $this->char--; - $this->state = 'data'; - - } else { - /* Anything else - Start a new attribute in the current tag token. Set that attribute's - name to the current input character, and its value to the empty string. - Switch to the attribute name state. */ - $this->token['attr'][] = array( - 'name' => strtolower($char), - 'value' => null - ); - - $this->state = 'attributeName'; - } - } - - private function beforeAttributeValueState() - { - // Consume the next input character: - $this->char++; - $char = $this->character($this->char); - - if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { - /* U+0009 CHARACTER TABULATION - U+000A LINE FEED (LF) - U+000B LINE TABULATION - U+000C FORM FEED (FF) - U+0020 SPACE - Stay in the before attribute value state. */ - $this->state = 'beforeAttributeValue'; - - } elseif ($char === '"') { - /* U+0022 QUOTATION MARK (") - Switch to the attribute value (double-quoted) state. */ - $this->state = 'attributeValueDoubleQuoted'; - - } elseif ($char === '&') { - /* U+0026 AMPERSAND (&) - Switch to the attribute value (unquoted) state and reconsume - this input character. */ - $this->char--; - $this->state = 'attributeValueUnquoted'; - - } elseif ($char === '\'') { - /* U+0027 APOSTROPHE (') - Switch to the attribute value (single-quoted) state. */ - $this->state = 'attributeValueSingleQuoted'; - - } elseif ($char === '>') { - /* U+003E GREATER-THAN SIGN (>) - Emit the current tag token. Switch to the data state. */ - $this->emitToken($this->token); - $this->state = 'data'; - - } else { - /* Anything else - Append the current input character to the current attribute's value. - Switch to the attribute value (unquoted) state. */ - $last = count($this->token['attr']) - 1; - $this->token['attr'][$last]['value'] .= $char; - - $this->state = 'attributeValueUnquoted'; - } - } - - private function attributeValueDoubleQuotedState() - { - // Consume the next input character: - $this->char++; - $char = $this->character($this->char); - - if ($char === '"') { - /* U+0022 QUOTATION MARK (") - Switch to the before attribute name state. */ - $this->state = 'beforeAttributeName'; - - } elseif ($char === '&') { - /* U+0026 AMPERSAND (&) - Switch to the entity in attribute value state. */ - $this->entityInAttributeValueState('double'); - - } elseif ($this->char === $this->EOF) { - /* EOF - Parse error. Emit the current tag token. Reconsume the character - in the data state. */ - $this->emitToken($this->token); - - $this->char--; - $this->state = 'data'; - - } else { - /* Anything else - Append the current input character to the current attribute's value. - Stay in the attribute value (double-quoted) state. */ - $last = count($this->token['attr']) - 1; - $this->token['attr'][$last]['value'] .= $char; - - $this->state = 'attributeValueDoubleQuoted'; - } - } - - private function attributeValueSingleQuotedState() - { - // Consume the next input character: - $this->char++; - $char = $this->character($this->char); - - if ($char === '\'') { - /* U+0022 QUOTATION MARK (') - Switch to the before attribute name state. */ - $this->state = 'beforeAttributeName'; - - } elseif ($char === '&') { - /* U+0026 AMPERSAND (&) - Switch to the entity in attribute value state. */ - $this->entityInAttributeValueState('single'); - - } elseif ($this->char === $this->EOF) { - /* EOF - Parse error. Emit the current tag token. Reconsume the character - in the data state. */ - $this->emitToken($this->token); - - $this->char--; - $this->state = 'data'; - - } else { - /* Anything else - Append the current input character to the current attribute's value. - Stay in the attribute value (single-quoted) state. */ - $last = count($this->token['attr']) - 1; - $this->token['attr'][$last]['value'] .= $char; - - $this->state = 'attributeValueSingleQuoted'; - } - } - - private function attributeValueUnquotedState() - { - // Consume the next input character: - $this->char++; - $char = $this->character($this->char); - - if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { - /* U+0009 CHARACTER TABULATION - U+000A LINE FEED (LF) - U+000B LINE TABULATION - U+000C FORM FEED (FF) - U+0020 SPACE - Switch to the before attribute name state. */ - $this->state = 'beforeAttributeName'; - - } elseif ($char === '&') { - /* U+0026 AMPERSAND (&) - Switch to the entity in attribute value state. */ - $this->entityInAttributeValueState(); - - } elseif ($char === '>') { - /* U+003E GREATER-THAN SIGN (>) - Emit the current tag token. Switch to the data state. */ - $this->emitToken($this->token); - $this->state = 'data'; - - } else { - /* Anything else - Append the current input character to the current attribute's value. - Stay in the attribute value (unquoted) state. */ - $last = count($this->token['attr']) - 1; - $this->token['attr'][$last]['value'] .= $char; - - $this->state = 'attributeValueUnquoted'; - } - } - - private function entityInAttributeValueState() - { - // Attempt to consume an entity. - $entity = $this->entity(); - - // If nothing is returned, append a U+0026 AMPERSAND character to the - // current attribute's value. Otherwise, emit the character token that - // was returned. - $char = (!$entity) - ? '&' - : $entity; - - $last = count($this->token['attr']) - 1; - $this->token['attr'][$last]['value'] .= $char; - } - - private function bogusCommentState() - { - /* Consume every character up to the first U+003E GREATER-THAN SIGN - character (>) or the end of the file (EOF), whichever comes first. Emit - a comment token whose data is the concatenation of all the characters - starting from and including the character that caused the state machine - to switch into the bogus comment state, up to and including the last - consumed character before the U+003E character, if any, or up to the - end of the file otherwise. (If the comment was started by the end of - the file (EOF), the token is empty.) */ - $data = $this->characters('^>', $this->char); - $this->emitToken( - array( - 'data' => $data, - 'type' => self::COMMENT - ) - ); - - $this->char += strlen($data); - - /* Switch to the data state. */ - $this->state = 'data'; - - /* If the end of the file was reached, reconsume the EOF character. */ - if ($this->char === $this->EOF) { - $this->char = $this->EOF - 1; - } - } - - private function markupDeclarationOpenState() - { - /* If the next two characters are both U+002D HYPHEN-MINUS (-) - characters, consume those two characters, create a comment token whose - data is the empty string, and switch to the comment state. */ - if ($this->character($this->char + 1, 2) === '--') { - $this->char += 2; - $this->state = 'comment'; - $this->token = array( - 'data' => null, - 'type' => self::COMMENT - ); - - /* Otherwise if the next seven chacacters are a case-insensitive match - for the word "DOCTYPE", then consume those characters and switch to the - DOCTYPE state. */ - } elseif (strtolower($this->character($this->char + 1, 7)) === 'doctype') { - $this->char += 7; - $this->state = 'doctype'; - - /* Otherwise, is is a parse error. Switch to the bogus comment state. - The next character that is consumed, if any, is the first character - that will be in the comment. */ - } else { - $this->char++; - $this->state = 'bogusComment'; - } - } - - private function commentState() - { - /* Consume the next input character: */ - $this->char++; - $char = $this->char(); - - /* U+002D HYPHEN-MINUS (-) */ - if ($char === '-') { - /* Switch to the comment dash state */ - $this->state = 'commentDash'; - - /* EOF */ - } elseif ($this->char === $this->EOF) { - /* Parse error. Emit the comment token. Reconsume the EOF character - in the data state. */ - $this->emitToken($this->token); - $this->char--; - $this->state = 'data'; - - /* Anything else */ - } else { - /* Append the input character to the comment token's data. Stay in - the comment state. */ - $this->token['data'] .= $char; - } - } - - private function commentDashState() - { - /* Consume the next input character: */ - $this->char++; - $char = $this->char(); - - /* U+002D HYPHEN-MINUS (-) */ - if ($char === '-') { - /* Switch to the comment end state */ - $this->state = 'commentEnd'; - - /* EOF */ - } elseif ($this->char === $this->EOF) { - /* Parse error. Emit the comment token. Reconsume the EOF character - in the data state. */ - $this->emitToken($this->token); - $this->char--; - $this->state = 'data'; - - /* Anything else */ - } else { - /* Append a U+002D HYPHEN-MINUS (-) character and the input - character to the comment token's data. Switch to the comment state. */ - $this->token['data'] .= '-' . $char; - $this->state = 'comment'; - } - } - - private function commentEndState() - { - /* Consume the next input character: */ - $this->char++; - $char = $this->char(); - - if ($char === '>') { - $this->emitToken($this->token); - $this->state = 'data'; - - } elseif ($char === '-') { - $this->token['data'] .= '-'; - - } elseif ($this->char === $this->EOF) { - $this->emitToken($this->token); - $this->char--; - $this->state = 'data'; - - } else { - $this->token['data'] .= '--' . $char; - $this->state = 'comment'; - } - } - - private function doctypeState() - { - /* Consume the next input character: */ - $this->char++; - $char = $this->char(); - - if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { - $this->state = 'beforeDoctypeName'; - - } else { - $this->char--; - $this->state = 'beforeDoctypeName'; - } - } - - private function beforeDoctypeNameState() - { - /* Consume the next input character: */ - $this->char++; - $char = $this->char(); - - if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { - // Stay in the before DOCTYPE name state. - - } elseif (preg_match('/^[a-z]$/', $char)) { - $this->token = array( - 'name' => strtoupper($char), - 'type' => self::DOCTYPE, - 'error' => true - ); - - $this->state = 'doctypeName'; - - } elseif ($char === '>') { - $this->emitToken( - array( - 'name' => null, - 'type' => self::DOCTYPE, - 'error' => true - ) - ); - - $this->state = 'data'; - - } elseif ($this->char === $this->EOF) { - $this->emitToken( - array( - 'name' => null, - 'type' => self::DOCTYPE, - 'error' => true - ) - ); - - $this->char--; - $this->state = 'data'; - - } else { - $this->token = array( - 'name' => $char, - 'type' => self::DOCTYPE, - 'error' => true - ); - - $this->state = 'doctypeName'; - } - } - - private function doctypeNameState() - { - /* Consume the next input character: */ - $this->char++; - $char = $this->char(); - - if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { - $this->state = 'AfterDoctypeName'; - - } elseif ($char === '>') { - $this->emitToken($this->token); - $this->state = 'data'; - - } elseif (preg_match('/^[a-z]$/', $char)) { - $this->token['name'] .= strtoupper($char); - - } elseif ($this->char === $this->EOF) { - $this->emitToken($this->token); - $this->char--; - $this->state = 'data'; - - } else { - $this->token['name'] .= $char; - } - - $this->token['error'] = ($this->token['name'] === 'HTML') - ? false - : true; - } - - private function afterDoctypeNameState() - { - /* Consume the next input character: */ - $this->char++; - $char = $this->char(); - - if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { - // Stay in the DOCTYPE name state. - - } elseif ($char === '>') { - $this->emitToken($this->token); - $this->state = 'data'; - - } elseif ($this->char === $this->EOF) { - $this->emitToken($this->token); - $this->char--; - $this->state = 'data'; - - } else { - $this->token['error'] = true; - $this->state = 'bogusDoctype'; - } - } - - private function bogusDoctypeState() - { - /* Consume the next input character: */ - $this->char++; - $char = $this->char(); - - if ($char === '>') { - $this->emitToken($this->token); - $this->state = 'data'; - - } elseif ($this->char === $this->EOF) { - $this->emitToken($this->token); - $this->char--; - $this->state = 'data'; - - } else { - // Stay in the bogus DOCTYPE state. - } - } - - private function entity() - { - $start = $this->char; - - // This section defines how to consume an entity. This definition is - // used when parsing entities in text and in attributes. - - // The behaviour depends on the identity of the next character (the - // one immediately after the U+0026 AMPERSAND character): - - switch ($this->character($this->char + 1)) { - // U+0023 NUMBER SIGN (#) - case '#': - - // The behaviour further depends on the character after the - // U+0023 NUMBER SIGN: - switch ($this->character($this->char + 1)) { - // U+0078 LATIN SMALL LETTER X - // U+0058 LATIN CAPITAL LETTER X - case 'x': - case 'X': - // Follow the steps below, but using the range of - // characters U+0030 DIGIT ZERO through to U+0039 DIGIT - // NINE, U+0061 LATIN SMALL LETTER A through to U+0066 - // LATIN SMALL LETTER F, and U+0041 LATIN CAPITAL LETTER - // A, through to U+0046 LATIN CAPITAL LETTER F (in other - // words, 0-9, A-F, a-f). - $char = 1; - $char_class = '0-9A-Fa-f'; - break; - - // Anything else - default: - // Follow the steps below, but using the range of - // characters U+0030 DIGIT ZERO through to U+0039 DIGIT - // NINE (i.e. just 0-9). - $char = 0; - $char_class = '0-9'; - break; - } - - // Consume as many characters as match the range of characters - // given above. - $this->char++; - $e_name = $this->characters($char_class, $this->char + $char + 1); - $entity = $this->character($start, $this->char); - $cond = strlen($e_name) > 0; - - // The rest of the parsing happens bellow. - break; - - // Anything else - default: - // Consume the maximum number of characters possible, with the - // consumed characters case-sensitively matching one of the - // identifiers in the first column of the entities table. - $e_name = $this->characters('0-9A-Za-z;', $this->char + 1); - $len = strlen($e_name); - - for ($c = 1; $c <= $len; $c++) { - $id = substr($e_name, 0, $c); - $this->char++; - - if (in_array($id, $this->entities)) { - if ($e_name[$c - 1] !== ';') { - if ($c < $len && $e_name[$c] == ';') { - $this->char++; // consume extra semicolon - } - } - $entity = $id; - break; - } - } - - $cond = isset($entity); - // The rest of the parsing happens bellow. - break; - } - - if (!$cond) { - // If no match can be made, then this is a parse error. No - // characters are consumed, and nothing is returned. - $this->char = $start; - return false; - } - - // Return a character token for the character corresponding to the - // entity name (as given by the second column of the entities table). - return html_entity_decode('&' . $entity . ';', ENT_QUOTES, 'UTF-8'); - } - - private function emitToken($token) - { - $emit = $this->tree->emitToken($token); - - if (is_int($emit)) { - $this->content_model = $emit; - - } elseif ($token['type'] === self::ENDTAG) { - $this->content_model = self::PCDATA; - } - } - - private function EOF() - { - $this->state = null; - $this->tree->emitToken( - array( - 'type' => self::EOF - ) - ); - } -} - -class HTML5TreeConstructer -{ - public $stack = array(); - - private $phase; - private $mode; - private $dom; - private $foster_parent = null; - private $a_formatting = array(); - - private $head_pointer = null; - private $form_pointer = null; - - private $scoping = array('button', 'caption', 'html', 'marquee', 'object', 'table', 'td', 'th'); - private $formatting = array( - 'a', - 'b', - 'big', - 'em', - 'font', - 'i', - 'nobr', - 's', - 'small', - 'strike', - 'strong', - 'tt', - 'u' - ); - private $special = array( - 'address', - 'area', - 'base', - 'basefont', - 'bgsound', - 'blockquote', - 'body', - 'br', - 'center', - 'col', - 'colgroup', - 'dd', - 'dir', - 'div', - 'dl', - 'dt', - 'embed', - 'fieldset', - 'form', - 'frame', - 'frameset', - 'h1', - 'h2', - 'h3', - 'h4', - 'h5', - 'h6', - 'head', - 'hr', - 'iframe', - 'image', - 'img', - 'input', - 'isindex', - 'li', - 'link', - 'listing', - 'menu', - 'meta', - 'noembed', - 'noframes', - 'noscript', - 'ol', - 'optgroup', - 'option', - 'p', - 'param', - 'plaintext', - 'pre', - 'script', - 'select', - 'spacer', - 'style', - 'tbody', - 'textarea', - 'tfoot', - 'thead', - 'title', - 'tr', - 'ul', - 'wbr' - ); - - // The different phases. - const INIT_PHASE = 0; - const ROOT_PHASE = 1; - const MAIN_PHASE = 2; - const END_PHASE = 3; - - // The different insertion modes for the main phase. - const BEFOR_HEAD = 0; - const IN_HEAD = 1; - const AFTER_HEAD = 2; - const IN_BODY = 3; - const IN_TABLE = 4; - const IN_CAPTION = 5; - const IN_CGROUP = 6; - const IN_TBODY = 7; - const IN_ROW = 8; - const IN_CELL = 9; - const IN_SELECT = 10; - const AFTER_BODY = 11; - const IN_FRAME = 12; - const AFTR_FRAME = 13; - - // The different types of elements. - const SPECIAL = 0; - const SCOPING = 1; - const FORMATTING = 2; - const PHRASING = 3; - - const MARKER = 0; - - public function __construct() - { - $this->phase = self::INIT_PHASE; - $this->mode = self::BEFOR_HEAD; - $this->dom = new DOMDocument; - - $this->dom->encoding = 'UTF-8'; - $this->dom->preserveWhiteSpace = true; - $this->dom->substituteEntities = true; - $this->dom->strictErrorChecking = false; - } - - // Process tag tokens - public function emitToken($token) - { - switch ($this->phase) { - case self::INIT_PHASE: - return $this->initPhase($token); - break; - case self::ROOT_PHASE: - return $this->rootElementPhase($token); - break; - case self::MAIN_PHASE: - return $this->mainPhase($token); - break; - case self::END_PHASE : - return $this->trailingEndPhase($token); - break; - } - } - - private function initPhase($token) - { - /* Initially, the tree construction stage must handle each token - emitted from the tokenisation stage as follows: */ - - /* A DOCTYPE token that is marked as being in error - A comment token - A start tag token - An end tag token - A character token that is not one of one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - or U+0020 SPACE - An end-of-file token */ - if ((isset($token['error']) && $token['error']) || - $token['type'] === HTML5::COMMENT || - $token['type'] === HTML5::STARTTAG || - $token['type'] === HTML5::ENDTAG || - $token['type'] === HTML5::EOF || - ($token['type'] === HTML5::CHARACTR && isset($token['data']) && - !preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) - ) { - /* This specification does not define how to handle this case. In - particular, user agents may ignore the entirety of this specification - altogether for such documents, and instead invoke special parse modes - with a greater emphasis on backwards compatibility. */ - - $this->phase = self::ROOT_PHASE; - return $this->rootElementPhase($token); - - /* A DOCTYPE token marked as being correct */ - } elseif (isset($token['error']) && !$token['error']) { - /* Append a DocumentType node to the Document node, with the name - attribute set to the name given in the DOCTYPE token (which will be - "HTML"), and the other attributes specific to DocumentType objects - set to null, empty lists, or the empty string as appropriate. */ - $doctype = new DOMDocumentType(null, null, 'HTML'); - - /* Then, switch to the root element phase of the tree construction - stage. */ - $this->phase = self::ROOT_PHASE; - - /* A character token that is one of one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - or U+0020 SPACE */ - } elseif (isset($token['data']) && preg_match( - '/^[\t\n\x0b\x0c ]+$/', - $token['data'] - ) - ) { - /* Append that character to the Document node. */ - $text = $this->dom->createTextNode($token['data']); - $this->dom->appendChild($text); - } - } - - private function rootElementPhase($token) - { - /* After the initial phase, as each token is emitted from the tokenisation - stage, it must be processed as described in this section. */ - - /* A DOCTYPE token */ - if ($token['type'] === HTML5::DOCTYPE) { - // Parse error. Ignore the token. - - /* A comment token */ - } elseif ($token['type'] === HTML5::COMMENT) { - /* Append a Comment node to the Document object with the data - attribute set to the data given in the comment token. */ - $comment = $this->dom->createComment($token['data']); - $this->dom->appendChild($comment); - - /* A character token that is one of one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - or U+0020 SPACE */ - } elseif ($token['type'] === HTML5::CHARACTR && - preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data']) - ) { - /* Append that character to the Document node. */ - $text = $this->dom->createTextNode($token['data']); - $this->dom->appendChild($text); - - /* A character token that is not one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED - (FF), or U+0020 SPACE - A start tag token - An end tag token - An end-of-file token */ - } elseif (($token['type'] === HTML5::CHARACTR && - !preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) || - $token['type'] === HTML5::STARTTAG || - $token['type'] === HTML5::ENDTAG || - $token['type'] === HTML5::EOF - ) { - /* Create an HTMLElement node with the tag name html, in the HTML - namespace. Append it to the Document object. Switch to the main - phase and reprocess the current token. */ - $html = $this->dom->createElement('html'); - $this->dom->appendChild($html); - $this->stack[] = $html; - - $this->phase = self::MAIN_PHASE; - return $this->mainPhase($token); - } - } - - private function mainPhase($token) - { - /* Tokens in the main phase must be handled as follows: */ - - /* A DOCTYPE token */ - if ($token['type'] === HTML5::DOCTYPE) { - // Parse error. Ignore the token. - - /* A start tag token with the tag name "html" */ - } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'html') { - /* If this start tag token was not the first start tag token, then - it is a parse error. */ - - /* For each attribute on the token, check to see if the attribute - is already present on the top element of the stack of open elements. - If it is not, add the attribute and its corresponding value to that - element. */ - foreach ($token['attr'] as $attr) { - if (!$this->stack[0]->hasAttribute($attr['name'])) { - $this->stack[0]->setAttribute($attr['name'], $attr['value']); - } - } - - /* An end-of-file token */ - } elseif ($token['type'] === HTML5::EOF) { - /* Generate implied end tags. */ - $this->generateImpliedEndTags(); - - /* Anything else. */ - } else { - /* Depends on the insertion mode: */ - switch ($this->mode) { - case self::BEFOR_HEAD: - return $this->beforeHead($token); - break; - case self::IN_HEAD: - return $this->inHead($token); - break; - case self::AFTER_HEAD: - return $this->afterHead($token); - break; - case self::IN_BODY: - return $this->inBody($token); - break; - case self::IN_TABLE: - return $this->inTable($token); - break; - case self::IN_CAPTION: - return $this->inCaption($token); - break; - case self::IN_CGROUP: - return $this->inColumnGroup($token); - break; - case self::IN_TBODY: - return $this->inTableBody($token); - break; - case self::IN_ROW: - return $this->inRow($token); - break; - case self::IN_CELL: - return $this->inCell($token); - break; - case self::IN_SELECT: - return $this->inSelect($token); - break; - case self::AFTER_BODY: - return $this->afterBody($token); - break; - case self::IN_FRAME: - return $this->inFrameset($token); - break; - case self::AFTR_FRAME: - return $this->afterFrameset($token); - break; - case self::END_PHASE: - return $this->trailingEndPhase($token); - break; - } - } - } - - private function beforeHead($token) - { - /* Handle the token as follows: */ - - /* A character token that is one of one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - or U+0020 SPACE */ - if ($token['type'] === HTML5::CHARACTR && - preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data']) - ) { - /* Append the character to the current node. */ - $this->insertText($token['data']); - - /* A comment token */ - } elseif ($token['type'] === HTML5::COMMENT) { - /* Append a Comment node to the current node with the data attribute - set to the data given in the comment token. */ - $this->insertComment($token['data']); - - /* A start tag token with the tag name "head" */ - } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'head') { - /* Create an element for the token, append the new element to the - current node and push it onto the stack of open elements. */ - $element = $this->insertElement($token); - - /* Set the head element pointer to this new element node. */ - $this->head_pointer = $element; - - /* Change the insertion mode to "in head". */ - $this->mode = self::IN_HEAD; - - /* A start tag token whose tag name is one of: "base", "link", "meta", - "script", "style", "title". Or an end tag with the tag name "html". - Or a character token that is not one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - or U+0020 SPACE. Or any other start tag token */ - } elseif ($token['type'] === HTML5::STARTTAG || - ($token['type'] === HTML5::ENDTAG && $token['name'] === 'html') || - ($token['type'] === HTML5::CHARACTR && !preg_match( - '/^[\t\n\x0b\x0c ]$/', - $token['data'] - )) - ) { - /* Act as if a start tag token with the tag name "head" and no - attributes had been seen, then reprocess the current token. */ - $this->beforeHead( - array( - 'name' => 'head', - 'type' => HTML5::STARTTAG, - 'attr' => array() - ) - ); - - return $this->inHead($token); - - /* Any other end tag */ - } elseif ($token['type'] === HTML5::ENDTAG) { - /* Parse error. Ignore the token. */ - } - } - - private function inHead($token) - { - /* Handle the token as follows: */ - - /* A character token that is one of one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - or U+0020 SPACE. - - THIS DIFFERS FROM THE SPEC: If the current node is either a title, style - or script element, append the character to the current node regardless - of its content. */ - if (($token['type'] === HTML5::CHARACTR && - preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) || ( - $token['type'] === HTML5::CHARACTR && in_array( - end($this->stack)->nodeName, - array('title', 'style', 'script') - )) - ) { - /* Append the character to the current node. */ - $this->insertText($token['data']); - - /* A comment token */ - } elseif ($token['type'] === HTML5::COMMENT) { - /* Append a Comment node to the current node with the data attribute - set to the data given in the comment token. */ - $this->insertComment($token['data']); - - } elseif ($token['type'] === HTML5::ENDTAG && - in_array($token['name'], array('title', 'style', 'script')) - ) { - array_pop($this->stack); - return HTML5::PCDATA; - - /* A start tag with the tag name "title" */ - } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'title') { - /* Create an element for the token and append the new element to the - node pointed to by the head element pointer, or, if that is null - (innerHTML case), to the current node. */ - if ($this->head_pointer !== null) { - $element = $this->insertElement($token, false); - $this->head_pointer->appendChild($element); - - } else { - $element = $this->insertElement($token); - } - - /* Switch the tokeniser's content model flag to the RCDATA state. */ - return HTML5::RCDATA; - - /* A start tag with the tag name "style" */ - } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'style') { - /* Create an element for the token and append the new element to the - node pointed to by the head element pointer, or, if that is null - (innerHTML case), to the current node. */ - if ($this->head_pointer !== null) { - $element = $this->insertElement($token, false); - $this->head_pointer->appendChild($element); - - } else { - $this->insertElement($token); - } - - /* Switch the tokeniser's content model flag to the CDATA state. */ - return HTML5::CDATA; - - /* A start tag with the tag name "script" */ - } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'script') { - /* Create an element for the token. */ - $element = $this->insertElement($token, false); - $this->head_pointer->appendChild($element); - - /* Switch the tokeniser's content model flag to the CDATA state. */ - return HTML5::CDATA; - - /* A start tag with the tag name "base", "link", or "meta" */ - } elseif ($token['type'] === HTML5::STARTTAG && in_array( - $token['name'], - array('base', 'link', 'meta') - ) - ) { - /* Create an element for the token and append the new element to the - node pointed to by the head element pointer, or, if that is null - (innerHTML case), to the current node. */ - if ($this->head_pointer !== null) { - $element = $this->insertElement($token, false); - $this->head_pointer->appendChild($element); - array_pop($this->stack); - - } else { - $this->insertElement($token); - } - - /* An end tag with the tag name "head" */ - } elseif ($token['type'] === HTML5::ENDTAG && $token['name'] === 'head') { - /* If the current node is a head element, pop the current node off - the stack of open elements. */ - if ($this->head_pointer->isSameNode(end($this->stack))) { - array_pop($this->stack); - - /* Otherwise, this is a parse error. */ - } else { - // k - } - - /* Change the insertion mode to "after head". */ - $this->mode = self::AFTER_HEAD; - - /* A start tag with the tag name "head" or an end tag except "html". */ - } elseif (($token['type'] === HTML5::STARTTAG && $token['name'] === 'head') || - ($token['type'] === HTML5::ENDTAG && $token['name'] !== 'html') - ) { - // Parse error. Ignore the token. - - /* Anything else */ - } else { - /* If the current node is a head element, act as if an end tag - token with the tag name "head" had been seen. */ - if ($this->head_pointer->isSameNode(end($this->stack))) { - $this->inHead( - array( - 'name' => 'head', - 'type' => HTML5::ENDTAG - ) - ); - - /* Otherwise, change the insertion mode to "after head". */ - } else { - $this->mode = self::AFTER_HEAD; - } - - /* Then, reprocess the current token. */ - return $this->afterHead($token); - } - } - - private function afterHead($token) - { - /* Handle the token as follows: */ - - /* A character token that is one of one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - or U+0020 SPACE */ - if ($token['type'] === HTML5::CHARACTR && - preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data']) - ) { - /* Append the character to the current node. */ - $this->insertText($token['data']); - - /* A comment token */ - } elseif ($token['type'] === HTML5::COMMENT) { - /* Append a Comment node to the current node with the data attribute - set to the data given in the comment token. */ - $this->insertComment($token['data']); - - /* A start tag token with the tag name "body" */ - } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'body') { - /* Insert a body element for the token. */ - $this->insertElement($token); - - /* Change the insertion mode to "in body". */ - $this->mode = self::IN_BODY; - - /* A start tag token with the tag name "frameset" */ - } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'frameset') { - /* Insert a frameset element for the token. */ - $this->insertElement($token); - - /* Change the insertion mode to "in frameset". */ - $this->mode = self::IN_FRAME; - - /* A start tag token whose tag name is one of: "base", "link", "meta", - "script", "style", "title" */ - } elseif ($token['type'] === HTML5::STARTTAG && in_array( - $token['name'], - array('base', 'link', 'meta', 'script', 'style', 'title') - ) - ) { - /* Parse error. Switch the insertion mode back to "in head" and - reprocess the token. */ - $this->mode = self::IN_HEAD; - return $this->inHead($token); - - /* Anything else */ - } else { - /* Act as if a start tag token with the tag name "body" and no - attributes had been seen, and then reprocess the current token. */ - $this->afterHead( - array( - 'name' => 'body', - 'type' => HTML5::STARTTAG, - 'attr' => array() - ) - ); - - return $this->inBody($token); - } - } - - private function inBody($token) - { - /* Handle the token as follows: */ - - switch ($token['type']) { - /* A character token */ - case HTML5::CHARACTR: - /* Reconstruct the active formatting elements, if any. */ - $this->reconstructActiveFormattingElements(); - - /* Append the token's character to the current node. */ - $this->insertText($token['data']); - break; - - /* A comment token */ - case HTML5::COMMENT: - /* Append a Comment node to the current node with the data - attribute set to the data given in the comment token. */ - $this->insertComment($token['data']); - break; - - case HTML5::STARTTAG: - switch ($token['name']) { - /* A start tag token whose tag name is one of: "script", - "style" */ - case 'script': - case 'style': - /* Process the token as if the insertion mode had been "in - head". */ - return $this->inHead($token); - break; - - /* A start tag token whose tag name is one of: "base", "link", - "meta", "title" */ - case 'base': - case 'link': - case 'meta': - case 'title': - /* Parse error. Process the token as if the insertion mode - had been "in head". */ - return $this->inHead($token); - break; - - /* A start tag token with the tag name "body" */ - case 'body': - /* Parse error. If the second element on the stack of open - elements is not a body element, or, if the stack of open - elements has only one node on it, then ignore the token. - (innerHTML case) */ - if (count($this->stack) === 1 || $this->stack[1]->nodeName !== 'body') { - // Ignore - - /* Otherwise, for each attribute on the token, check to see - if the attribute is already present on the body element (the - second element) on the stack of open elements. If it is not, - add the attribute and its corresponding value to that - element. */ - } else { - foreach ($token['attr'] as $attr) { - if (!$this->stack[1]->hasAttribute($attr['name'])) { - $this->stack[1]->setAttribute($attr['name'], $attr['value']); - } - } - } - break; - - /* A start tag whose tag name is one of: "address", - "blockquote", "center", "dir", "div", "dl", "fieldset", - "listing", "menu", "ol", "p", "ul" */ - case 'address': - case 'blockquote': - case 'center': - case 'dir': - case 'div': - case 'dl': - case 'fieldset': - case 'listing': - case 'menu': - case 'ol': - case 'p': - case 'ul': - /* If the stack of open elements has a p element in scope, - then act as if an end tag with the tag name p had been - seen. */ - if ($this->elementInScope('p')) { - $this->emitToken( - array( - 'name' => 'p', - 'type' => HTML5::ENDTAG - ) - ); - } - - /* Insert an HTML element for the token. */ - $this->insertElement($token); - break; - - /* A start tag whose tag name is "form" */ - case 'form': - /* If the form element pointer is not null, ignore the - token with a parse error. */ - if ($this->form_pointer !== null) { - // Ignore. - - /* Otherwise: */ - } else { - /* If the stack of open elements has a p element in - scope, then act as if an end tag with the tag name p - had been seen. */ - if ($this->elementInScope('p')) { - $this->emitToken( - array( - 'name' => 'p', - 'type' => HTML5::ENDTAG - ) - ); - } - - /* Insert an HTML element for the token, and set the - form element pointer to point to the element created. */ - $element = $this->insertElement($token); - $this->form_pointer = $element; - } - break; - - /* A start tag whose tag name is "li", "dd" or "dt" */ - case 'li': - case 'dd': - case 'dt': - /* If the stack of open elements has a p element in scope, - then act as if an end tag with the tag name p had been - seen. */ - if ($this->elementInScope('p')) { - $this->emitToken( - array( - 'name' => 'p', - 'type' => HTML5::ENDTAG - ) - ); - } - - $stack_length = count($this->stack) - 1; - - for ($n = $stack_length; 0 <= $n; $n--) { - /* 1. Initialise node to be the current node (the - bottommost node of the stack). */ - $stop = false; - $node = $this->stack[$n]; - $cat = $this->getElementCategory($node->tagName); - - /* 2. If node is an li, dd or dt element, then pop all - the nodes from the current node up to node, including - node, then stop this algorithm. */ - if ($token['name'] === $node->tagName || ($token['name'] !== 'li' - && ($node->tagName === 'dd' || $node->tagName === 'dt')) - ) { - for ($x = $stack_length; $x >= $n; $x--) { - array_pop($this->stack); - } - - break; - } - - /* 3. If node is not in the formatting category, and is - not in the phrasing category, and is not an address or - div element, then stop this algorithm. */ - if ($cat !== self::FORMATTING && $cat !== self::PHRASING && - $node->tagName !== 'address' && $node->tagName !== 'div' - ) { - break; - } - } - - /* Finally, insert an HTML element with the same tag - name as the token's. */ - $this->insertElement($token); - break; - - /* A start tag token whose tag name is "plaintext" */ - case 'plaintext': - /* If the stack of open elements has a p element in scope, - then act as if an end tag with the tag name p had been - seen. */ - if ($this->elementInScope('p')) { - $this->emitToken( - array( - 'name' => 'p', - 'type' => HTML5::ENDTAG - ) - ); - } - - /* Insert an HTML element for the token. */ - $this->insertElement($token); - - return HTML5::PLAINTEXT; - break; - - /* A start tag whose tag name is one of: "h1", "h2", "h3", "h4", - "h5", "h6" */ - case 'h1': - case 'h2': - case 'h3': - case 'h4': - case 'h5': - case 'h6': - /* If the stack of open elements has a p element in scope, - then act as if an end tag with the tag name p had been seen. */ - if ($this->elementInScope('p')) { - $this->emitToken( - array( - 'name' => 'p', - 'type' => HTML5::ENDTAG - ) - ); - } - - /* If the stack of open elements has in scope an element whose - tag name is one of "h1", "h2", "h3", "h4", "h5", or "h6", then - this is a parse error; pop elements from the stack until an - element with one of those tag names has been popped from the - stack. */ - while ($this->elementInScope(array('h1', 'h2', 'h3', 'h4', 'h5', 'h6'))) { - array_pop($this->stack); - } - - /* Insert an HTML element for the token. */ - $this->insertElement($token); - break; - - /* A start tag whose tag name is "a" */ - case 'a': - /* If the list of active formatting elements contains - an element whose tag name is "a" between the end of the - list and the last marker on the list (or the start of - the list if there is no marker on the list), then this - is a parse error; act as if an end tag with the tag name - "a" had been seen, then remove that element from the list - of active formatting elements and the stack of open - elements if the end tag didn't already remove it (it - might not have if the element is not in table scope). */ - $leng = count($this->a_formatting); - - for ($n = $leng - 1; $n >= 0; $n--) { - if ($this->a_formatting[$n] === self::MARKER) { - break; - - } elseif ($this->a_formatting[$n]->nodeName === 'a') { - $this->emitToken( - array( - 'name' => 'a', - 'type' => HTML5::ENDTAG - ) - ); - break; - } - } - - /* Reconstruct the active formatting elements, if any. */ - $this->reconstructActiveFormattingElements(); - - /* Insert an HTML element for the token. */ - $el = $this->insertElement($token); - - /* Add that element to the list of active formatting - elements. */ - $this->a_formatting[] = $el; - break; - - /* A start tag whose tag name is one of: "b", "big", "em", "font", - "i", "nobr", "s", "small", "strike", "strong", "tt", "u" */ - case 'b': - case 'big': - case 'em': - case 'font': - case 'i': - case 'nobr': - case 's': - case 'small': - case 'strike': - case 'strong': - case 'tt': - case 'u': - /* Reconstruct the active formatting elements, if any. */ - $this->reconstructActiveFormattingElements(); - - /* Insert an HTML element for the token. */ - $el = $this->insertElement($token); - - /* Add that element to the list of active formatting - elements. */ - $this->a_formatting[] = $el; - break; - - /* A start tag token whose tag name is "button" */ - case 'button': - /* If the stack of open elements has a button element in scope, - then this is a parse error; act as if an end tag with the tag - name "button" had been seen, then reprocess the token. (We don't - do that. Unnecessary.) */ - if ($this->elementInScope('button')) { - $this->inBody( - array( - 'name' => 'button', - 'type' => HTML5::ENDTAG - ) - ); - } - - /* Reconstruct the active formatting elements, if any. */ - $this->reconstructActiveFormattingElements(); - - /* Insert an HTML element for the token. */ - $this->insertElement($token); - - /* Insert a marker at the end of the list of active - formatting elements. */ - $this->a_formatting[] = self::MARKER; - break; - - /* A start tag token whose tag name is one of: "marquee", "object" */ - case 'marquee': - case 'object': - /* Reconstruct the active formatting elements, if any. */ - $this->reconstructActiveFormattingElements(); - - /* Insert an HTML element for the token. */ - $this->insertElement($token); - - /* Insert a marker at the end of the list of active - formatting elements. */ - $this->a_formatting[] = self::MARKER; - break; - - /* A start tag token whose tag name is "xmp" */ - case 'xmp': - /* Reconstruct the active formatting elements, if any. */ - $this->reconstructActiveFormattingElements(); - - /* Insert an HTML element for the token. */ - $this->insertElement($token); - - /* Switch the content model flag to the CDATA state. */ - return HTML5::CDATA; - break; - - /* A start tag whose tag name is "table" */ - case 'table': - /* If the stack of open elements has a p element in scope, - then act as if an end tag with the tag name p had been seen. */ - if ($this->elementInScope('p')) { - $this->emitToken( - array( - 'name' => 'p', - 'type' => HTML5::ENDTAG - ) - ); - } - - /* Insert an HTML element for the token. */ - $this->insertElement($token); - - /* Change the insertion mode to "in table". */ - $this->mode = self::IN_TABLE; - break; - - /* A start tag whose tag name is one of: "area", "basefont", - "bgsound", "br", "embed", "img", "param", "spacer", "wbr" */ - case 'area': - case 'basefont': - case 'bgsound': - case 'br': - case 'embed': - case 'img': - case 'param': - case 'spacer': - case 'wbr': - /* Reconstruct the active formatting elements, if any. */ - $this->reconstructActiveFormattingElements(); - - /* Insert an HTML element for the token. */ - $this->insertElement($token); - - /* Immediately pop the current node off the stack of open elements. */ - array_pop($this->stack); - break; - - /* A start tag whose tag name is "hr" */ - case 'hr': - /* If the stack of open elements has a p element in scope, - then act as if an end tag with the tag name p had been seen. */ - if ($this->elementInScope('p')) { - $this->emitToken( - array( - 'name' => 'p', - 'type' => HTML5::ENDTAG - ) - ); - } - - /* Insert an HTML element for the token. */ - $this->insertElement($token); - - /* Immediately pop the current node off the stack of open elements. */ - array_pop($this->stack); - break; - - /* A start tag whose tag name is "image" */ - case 'image': - /* Parse error. Change the token's tag name to "img" and - reprocess it. (Don't ask.) */ - $token['name'] = 'img'; - return $this->inBody($token); - break; - - /* A start tag whose tag name is "input" */ - case 'input': - /* Reconstruct the active formatting elements, if any. */ - $this->reconstructActiveFormattingElements(); - - /* Insert an input element for the token. */ - $element = $this->insertElement($token, false); - - /* If the form element pointer is not null, then associate the - input element with the form element pointed to by the form - element pointer. */ - $this->form_pointer !== null - ? $this->form_pointer->appendChild($element) - : end($this->stack)->appendChild($element); - - /* Pop that input element off the stack of open elements. */ - array_pop($this->stack); - break; - - /* A start tag whose tag name is "isindex" */ - case 'isindex': - /* Parse error. */ - // w/e - - /* If the form element pointer is not null, - then ignore the token. */ - if ($this->form_pointer === null) { - /* Act as if a start tag token with the tag name "form" had - been seen. */ - $this->inBody( - array( - 'name' => 'body', - 'type' => HTML5::STARTTAG, - 'attr' => array() - ) - ); - - /* Act as if a start tag token with the tag name "hr" had - been seen. */ - $this->inBody( - array( - 'name' => 'hr', - 'type' => HTML5::STARTTAG, - 'attr' => array() - ) - ); - - /* Act as if a start tag token with the tag name "p" had - been seen. */ - $this->inBody( - array( - 'name' => 'p', - 'type' => HTML5::STARTTAG, - 'attr' => array() - ) - ); - - /* Act as if a start tag token with the tag name "label" - had been seen. */ - $this->inBody( - array( - 'name' => 'label', - 'type' => HTML5::STARTTAG, - 'attr' => array() - ) - ); - - /* Act as if a stream of character tokens had been seen. */ - $this->insertText( - 'This is a searchable index. ' . - 'Insert your search keywords here: ' - ); - - /* Act as if a start tag token with the tag name "input" - had been seen, with all the attributes from the "isindex" - token, except with the "name" attribute set to the value - "isindex" (ignoring any explicit "name" attribute). */ - $attr = $token['attr']; - $attr[] = array('name' => 'name', 'value' => 'isindex'); - - $this->inBody( - array( - 'name' => 'input', - 'type' => HTML5::STARTTAG, - 'attr' => $attr - ) - ); - - /* Act as if a stream of character tokens had been seen - (see below for what they should say). */ - $this->insertText( - 'This is a searchable index. ' . - 'Insert your search keywords here: ' - ); - - /* Act as if an end tag token with the tag name "label" - had been seen. */ - $this->inBody( - array( - 'name' => 'label', - 'type' => HTML5::ENDTAG - ) - ); - - /* Act as if an end tag token with the tag name "p" had - been seen. */ - $this->inBody( - array( - 'name' => 'p', - 'type' => HTML5::ENDTAG - ) - ); - - /* Act as if a start tag token with the tag name "hr" had - been seen. */ - $this->inBody( - array( - 'name' => 'hr', - 'type' => HTML5::ENDTAG - ) - ); - - /* Act as if an end tag token with the tag name "form" had - been seen. */ - $this->inBody( - array( - 'name' => 'form', - 'type' => HTML5::ENDTAG - ) - ); - } - break; - - /* A start tag whose tag name is "textarea" */ - case 'textarea': - $this->insertElement($token); - - /* Switch the tokeniser's content model flag to the - RCDATA state. */ - return HTML5::RCDATA; - break; - - /* A start tag whose tag name is one of: "iframe", "noembed", - "noframes" */ - case 'iframe': - case 'noembed': - case 'noframes': - $this->insertElement($token); - - /* Switch the tokeniser's content model flag to the CDATA state. */ - return HTML5::CDATA; - break; - - /* A start tag whose tag name is "select" */ - case 'select': - /* Reconstruct the active formatting elements, if any. */ - $this->reconstructActiveFormattingElements(); - - /* Insert an HTML element for the token. */ - $this->insertElement($token); - - /* Change the insertion mode to "in select". */ - $this->mode = self::IN_SELECT; - break; - - /* A start or end tag whose tag name is one of: "caption", "col", - "colgroup", "frame", "frameset", "head", "option", "optgroup", - "tbody", "td", "tfoot", "th", "thead", "tr". */ - case 'caption': - case 'col': - case 'colgroup': - case 'frame': - case 'frameset': - case 'head': - case 'option': - case 'optgroup': - case 'tbody': - case 'td': - case 'tfoot': - case 'th': - case 'thead': - case 'tr': - // Parse error. Ignore the token. - break; - - /* A start or end tag whose tag name is one of: "event-source", - "section", "nav", "article", "aside", "header", "footer", - "datagrid", "command" */ - case 'event-source': - case 'section': - case 'nav': - case 'article': - case 'aside': - case 'header': - case 'footer': - case 'datagrid': - case 'command': - // Work in progress! - break; - - /* A start tag token not covered by the previous entries */ - default: - /* Reconstruct the active formatting elements, if any. */ - $this->reconstructActiveFormattingElements(); - - $this->insertElement($token, true, true); - break; - } - break; - - case HTML5::ENDTAG: - switch ($token['name']) { - /* An end tag with the tag name "body" */ - case 'body': - /* If the second element in the stack of open elements is - not a body element, this is a parse error. Ignore the token. - (innerHTML case) */ - if (count($this->stack) < 2 || $this->stack[1]->nodeName !== 'body') { - // Ignore. - - /* If the current node is not the body element, then this - is a parse error. */ - } elseif (end($this->stack)->nodeName !== 'body') { - // Parse error. - } - - /* Change the insertion mode to "after body". */ - $this->mode = self::AFTER_BODY; - break; - - /* An end tag with the tag name "html" */ - case 'html': - /* Act as if an end tag with tag name "body" had been seen, - then, if that token wasn't ignored, reprocess the current - token. */ - $this->inBody( - array( - 'name' => 'body', - 'type' => HTML5::ENDTAG - ) - ); - - return $this->afterBody($token); - break; - - /* An end tag whose tag name is one of: "address", "blockquote", - "center", "dir", "div", "dl", "fieldset", "listing", "menu", - "ol", "pre", "ul" */ - case 'address': - case 'blockquote': - case 'center': - case 'dir': - case 'div': - case 'dl': - case 'fieldset': - case 'listing': - case 'menu': - case 'ol': - case 'pre': - case 'ul': - /* If the stack of open elements has an element in scope - with the same tag name as that of the token, then generate - implied end tags. */ - if ($this->elementInScope($token['name'])) { - $this->generateImpliedEndTags(); - - /* Now, if the current node is not an element with - the same tag name as that of the token, then this - is a parse error. */ - // w/e - - /* If the stack of open elements has an element in - scope with the same tag name as that of the token, - then pop elements from this stack until an element - with that tag name has been popped from the stack. */ - for ($n = count($this->stack) - 1; $n >= 0; $n--) { - if ($this->stack[$n]->nodeName === $token['name']) { - $n = -1; - } - - array_pop($this->stack); - } - } - break; - - /* An end tag whose tag name is "form" */ - case 'form': - /* If the stack of open elements has an element in scope - with the same tag name as that of the token, then generate - implied end tags. */ - if ($this->elementInScope($token['name'])) { - $this->generateImpliedEndTags(); - - } - - if (end($this->stack)->nodeName !== $token['name']) { - /* Now, if the current node is not an element with the - same tag name as that of the token, then this is a parse - error. */ - // w/e - - } else { - /* Otherwise, if the current node is an element with - the same tag name as that of the token pop that element - from the stack. */ - array_pop($this->stack); - } - - /* In any case, set the form element pointer to null. */ - $this->form_pointer = null; - break; - - /* An end tag whose tag name is "p" */ - case 'p': - /* If the stack of open elements has a p element in scope, - then generate implied end tags, except for p elements. */ - if ($this->elementInScope('p')) { - $this->generateImpliedEndTags(array('p')); - - /* If the current node is not a p element, then this is - a parse error. */ - // k - - /* If the stack of open elements has a p element in - scope, then pop elements from this stack until the stack - no longer has a p element in scope. */ - for ($n = count($this->stack) - 1; $n >= 0; $n--) { - if ($this->elementInScope('p')) { - array_pop($this->stack); - - } else { - break; - } - } - } - break; - - /* An end tag whose tag name is "dd", "dt", or "li" */ - case 'dd': - case 'dt': - case 'li': - /* If the stack of open elements has an element in scope - whose tag name matches the tag name of the token, then - generate implied end tags, except for elements with the - same tag name as the token. */ - if ($this->elementInScope($token['name'])) { - $this->generateImpliedEndTags(array($token['name'])); - - /* If the current node is not an element with the same - tag name as the token, then this is a parse error. */ - // w/e - - /* If the stack of open elements has an element in scope - whose tag name matches the tag name of the token, then - pop elements from this stack until an element with that - tag name has been popped from the stack. */ - for ($n = count($this->stack) - 1; $n >= 0; $n--) { - if ($this->stack[$n]->nodeName === $token['name']) { - $n = -1; - } - - array_pop($this->stack); - } - } - break; - - /* An end tag whose tag name is one of: "h1", "h2", "h3", "h4", - "h5", "h6" */ - case 'h1': - case 'h2': - case 'h3': - case 'h4': - case 'h5': - case 'h6': - $elements = array('h1', 'h2', 'h3', 'h4', 'h5', 'h6'); - - /* If the stack of open elements has in scope an element whose - tag name is one of "h1", "h2", "h3", "h4", "h5", or "h6", then - generate implied end tags. */ - if ($this->elementInScope($elements)) { - $this->generateImpliedEndTags(); - - /* Now, if the current node is not an element with the same - tag name as that of the token, then this is a parse error. */ - // w/e - - /* If the stack of open elements has in scope an element - whose tag name is one of "h1", "h2", "h3", "h4", "h5", or - "h6", then pop elements from the stack until an element - with one of those tag names has been popped from the stack. */ - while ($this->elementInScope($elements)) { - array_pop($this->stack); - } - } - break; - - /* An end tag whose tag name is one of: "a", "b", "big", "em", - "font", "i", "nobr", "s", "small", "strike", "strong", "tt", "u" */ - case 'a': - case 'b': - case 'big': - case 'em': - case 'font': - case 'i': - case 'nobr': - case 's': - case 'small': - case 'strike': - case 'strong': - case 'tt': - case 'u': - /* 1. Let the formatting element be the last element in - the list of active formatting elements that: - * is between the end of the list and the last scope - marker in the list, if any, or the start of the list - otherwise, and - * has the same tag name as the token. - */ - while (true) { - for ($a = count($this->a_formatting) - 1; $a >= 0; $a--) { - if ($this->a_formatting[$a] === self::MARKER) { - break; - - } elseif ($this->a_formatting[$a]->tagName === $token['name']) { - $formatting_element = $this->a_formatting[$a]; - $in_stack = in_array($formatting_element, $this->stack, true); - $fe_af_pos = $a; - break; - } - } - - /* If there is no such node, or, if that node is - also in the stack of open elements but the element - is not in scope, then this is a parse error. Abort - these steps. The token is ignored. */ - if (!isset($formatting_element) || ($in_stack && - !$this->elementInScope($token['name'])) - ) { - break; - - /* Otherwise, if there is such a node, but that node - is not in the stack of open elements, then this is a - parse error; remove the element from the list, and - abort these steps. */ - } elseif (isset($formatting_element) && !$in_stack) { - unset($this->a_formatting[$fe_af_pos]); - $this->a_formatting = array_merge($this->a_formatting); - break; - } - - /* 2. Let the furthest block be the topmost node in the - stack of open elements that is lower in the stack - than the formatting element, and is not an element in - the phrasing or formatting categories. There might - not be one. */ - $fe_s_pos = array_search($formatting_element, $this->stack, true); - $length = count($this->stack); - - for ($s = $fe_s_pos + 1; $s < $length; $s++) { - $category = $this->getElementCategory($this->stack[$s]->nodeName); - - if ($category !== self::PHRASING && $category !== self::FORMATTING) { - $furthest_block = $this->stack[$s]; - } - } - - /* 3. If there is no furthest block, then the UA must - skip the subsequent steps and instead just pop all - the nodes from the bottom of the stack of open - elements, from the current node up to the formatting - element, and remove the formatting element from the - list of active formatting elements. */ - if (!isset($furthest_block)) { - for ($n = $length - 1; $n >= $fe_s_pos; $n--) { - array_pop($this->stack); - } - - unset($this->a_formatting[$fe_af_pos]); - $this->a_formatting = array_merge($this->a_formatting); - break; - } - - /* 4. Let the common ancestor be the element - immediately above the formatting element in the stack - of open elements. */ - $common_ancestor = $this->stack[$fe_s_pos - 1]; - - /* 5. If the furthest block has a parent node, then - remove the furthest block from its parent node. */ - if ($furthest_block->parentNode !== null) { - $furthest_block->parentNode->removeChild($furthest_block); - } - - /* 6. Let a bookmark note the position of the - formatting element in the list of active formatting - elements relative to the elements on either side - of it in the list. */ - $bookmark = $fe_af_pos; - - /* 7. Let node and last node be the furthest block. - Follow these steps: */ - $node = $furthest_block; - $last_node = $furthest_block; - - while (true) { - for ($n = array_search($node, $this->stack, true) - 1; $n >= 0; $n--) { - /* 7.1 Let node be the element immediately - prior to node in the stack of open elements. */ - $node = $this->stack[$n]; - - /* 7.2 If node is not in the list of active - formatting elements, then remove node from - the stack of open elements and then go back - to step 1. */ - if (!in_array($node, $this->a_formatting, true)) { - unset($this->stack[$n]); - $this->stack = array_merge($this->stack); - - } else { - break; - } - } - - /* 7.3 Otherwise, if node is the formatting - element, then go to the next step in the overall - algorithm. */ - if ($node === $formatting_element) { - break; - - /* 7.4 Otherwise, if last node is the furthest - block, then move the aforementioned bookmark to - be immediately after the node in the list of - active formatting elements. */ - } elseif ($last_node === $furthest_block) { - $bookmark = array_search($node, $this->a_formatting, true) + 1; - } - - /* 7.5 If node has any children, perform a - shallow clone of node, replace the entry for - node in the list of active formatting elements - with an entry for the clone, replace the entry - for node in the stack of open elements with an - entry for the clone, and let node be the clone. */ - if ($node->hasChildNodes()) { - $clone = $node->cloneNode(); - $s_pos = array_search($node, $this->stack, true); - $a_pos = array_search($node, $this->a_formatting, true); - - $this->stack[$s_pos] = $clone; - $this->a_formatting[$a_pos] = $clone; - $node = $clone; - } - - /* 7.6 Insert last node into node, first removing - it from its previous parent node if any. */ - if ($last_node->parentNode !== null) { - $last_node->parentNode->removeChild($last_node); - } - - $node->appendChild($last_node); - - /* 7.7 Let last node be node. */ - $last_node = $node; - } - - /* 8. Insert whatever last node ended up being in - the previous step into the common ancestor node, - first removing it from its previous parent node if - any. */ - if ($last_node->parentNode !== null) { - $last_node->parentNode->removeChild($last_node); - } - - $common_ancestor->appendChild($last_node); - - /* 9. Perform a shallow clone of the formatting - element. */ - $clone = $formatting_element->cloneNode(); - - /* 10. Take all of the child nodes of the furthest - block and append them to the clone created in the - last step. */ - while ($furthest_block->hasChildNodes()) { - $child = $furthest_block->firstChild; - $furthest_block->removeChild($child); - $clone->appendChild($child); - } - - /* 11. Append that clone to the furthest block. */ - $furthest_block->appendChild($clone); - - /* 12. Remove the formatting element from the list - of active formatting elements, and insert the clone - into the list of active formatting elements at the - position of the aforementioned bookmark. */ - $fe_af_pos = array_search($formatting_element, $this->a_formatting, true); - unset($this->a_formatting[$fe_af_pos]); - $this->a_formatting = array_merge($this->a_formatting); - - $af_part1 = array_slice($this->a_formatting, 0, $bookmark - 1); - $af_part2 = array_slice($this->a_formatting, $bookmark, count($this->a_formatting)); - $this->a_formatting = array_merge($af_part1, array($clone), $af_part2); - - /* 13. Remove the formatting element from the stack - of open elements, and insert the clone into the stack - of open elements immediately after (i.e. in a more - deeply nested position than) the position of the - furthest block in that stack. */ - $fe_s_pos = array_search($formatting_element, $this->stack, true); - $fb_s_pos = array_search($furthest_block, $this->stack, true); - unset($this->stack[$fe_s_pos]); - - $s_part1 = array_slice($this->stack, 0, $fb_s_pos); - $s_part2 = array_slice($this->stack, $fb_s_pos + 1, count($this->stack)); - $this->stack = array_merge($s_part1, array($clone), $s_part2); - - /* 14. Jump back to step 1 in this series of steps. */ - unset($formatting_element, $fe_af_pos, $fe_s_pos, $furthest_block); - } - break; - - /* An end tag token whose tag name is one of: "button", - "marquee", "object" */ - case 'button': - case 'marquee': - case 'object': - /* If the stack of open elements has an element in scope whose - tag name matches the tag name of the token, then generate implied - tags. */ - if ($this->elementInScope($token['name'])) { - $this->generateImpliedEndTags(); - - /* Now, if the current node is not an element with the same - tag name as the token, then this is a parse error. */ - // k - - /* Now, if the stack of open elements has an element in scope - whose tag name matches the tag name of the token, then pop - elements from the stack until that element has been popped from - the stack, and clear the list of active formatting elements up - to the last marker. */ - for ($n = count($this->stack) - 1; $n >= 0; $n--) { - if ($this->stack[$n]->nodeName === $token['name']) { - $n = -1; - } - - array_pop($this->stack); - } - - $marker = end(array_keys($this->a_formatting, self::MARKER, true)); - - for ($n = count($this->a_formatting) - 1; $n > $marker; $n--) { - array_pop($this->a_formatting); - } - } - break; - - /* Or an end tag whose tag name is one of: "area", "basefont", - "bgsound", "br", "embed", "hr", "iframe", "image", "img", - "input", "isindex", "noembed", "noframes", "param", "select", - "spacer", "table", "textarea", "wbr" */ - case 'area': - case 'basefont': - case 'bgsound': - case 'br': - case 'embed': - case 'hr': - case 'iframe': - case 'image': - case 'img': - case 'input': - case 'isindex': - case 'noembed': - case 'noframes': - case 'param': - case 'select': - case 'spacer': - case 'table': - case 'textarea': - case 'wbr': - // Parse error. Ignore the token. - break; - - /* An end tag token not covered by the previous entries */ - default: - for ($n = count($this->stack) - 1; $n >= 0; $n--) { - /* Initialise node to be the current node (the bottommost - node of the stack). */ - $node = end($this->stack); - - /* If node has the same tag name as the end tag token, - then: */ - if ($token['name'] === $node->nodeName) { - /* Generate implied end tags. */ - $this->generateImpliedEndTags(); - - /* If the tag name of the end tag token does not - match the tag name of the current node, this is a - parse error. */ - // k - - /* Pop all the nodes from the current node up to - node, including node, then stop this algorithm. */ - for ($x = count($this->stack) - $n; $x >= $n; $x--) { - array_pop($this->stack); - } - - } else { - $category = $this->getElementCategory($node); - - if ($category !== self::SPECIAL && $category !== self::SCOPING) { - /* Otherwise, if node is in neither the formatting - category nor the phrasing category, then this is a - parse error. Stop this algorithm. The end tag token - is ignored. */ - return false; - } - } - } - break; - } - break; - } - } - - private function inTable($token) - { - $clear = array('html', 'table'); - - /* A character token that is one of one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - or U+0020 SPACE */ - if ($token['type'] === HTML5::CHARACTR && - preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data']) - ) { - /* Append the character to the current node. */ - $text = $this->dom->createTextNode($token['data']); - end($this->stack)->appendChild($text); - - /* A comment token */ - } elseif ($token['type'] === HTML5::COMMENT) { - /* Append a Comment node to the current node with the data - attribute set to the data given in the comment token. */ - $comment = $this->dom->createComment($token['data']); - end($this->stack)->appendChild($comment); - - /* A start tag whose tag name is "caption" */ - } elseif ($token['type'] === HTML5::STARTTAG && - $token['name'] === 'caption' - ) { - /* Clear the stack back to a table context. */ - $this->clearStackToTableContext($clear); - - /* Insert a marker at the end of the list of active - formatting elements. */ - $this->a_formatting[] = self::MARKER; - - /* Insert an HTML element for the token, then switch the - insertion mode to "in caption". */ - $this->insertElement($token); - $this->mode = self::IN_CAPTION; - - /* A start tag whose tag name is "colgroup" */ - } elseif ($token['type'] === HTML5::STARTTAG && - $token['name'] === 'colgroup' - ) { - /* Clear the stack back to a table context. */ - $this->clearStackToTableContext($clear); - - /* Insert an HTML element for the token, then switch the - insertion mode to "in column group". */ - $this->insertElement($token); - $this->mode = self::IN_CGROUP; - - /* A start tag whose tag name is "col" */ - } elseif ($token['type'] === HTML5::STARTTAG && - $token['name'] === 'col' - ) { - $this->inTable( - array( - 'name' => 'colgroup', - 'type' => HTML5::STARTTAG, - 'attr' => array() - ) - ); - - $this->inColumnGroup($token); - - /* A start tag whose tag name is one of: "tbody", "tfoot", "thead" */ - } elseif ($token['type'] === HTML5::STARTTAG && in_array( - $token['name'], - array('tbody', 'tfoot', 'thead') - ) - ) { - /* Clear the stack back to a table context. */ - $this->clearStackToTableContext($clear); - - /* Insert an HTML element for the token, then switch the insertion - mode to "in table body". */ - $this->insertElement($token); - $this->mode = self::IN_TBODY; - - /* A start tag whose tag name is one of: "td", "th", "tr" */ - } elseif ($token['type'] === HTML5::STARTTAG && - in_array($token['name'], array('td', 'th', 'tr')) - ) { - /* Act as if a start tag token with the tag name "tbody" had been - seen, then reprocess the current token. */ - $this->inTable( - array( - 'name' => 'tbody', - 'type' => HTML5::STARTTAG, - 'attr' => array() - ) - ); - - return $this->inTableBody($token); - - /* A start tag whose tag name is "table" */ - } elseif ($token['type'] === HTML5::STARTTAG && - $token['name'] === 'table' - ) { - /* Parse error. Act as if an end tag token with the tag name "table" - had been seen, then, if that token wasn't ignored, reprocess the - current token. */ - $this->inTable( - array( - 'name' => 'table', - 'type' => HTML5::ENDTAG - ) - ); - - return $this->mainPhase($token); - - /* An end tag whose tag name is "table" */ - } elseif ($token['type'] === HTML5::ENDTAG && - $token['name'] === 'table' - ) { - /* If the stack of open elements does not have an element in table - scope with the same tag name as the token, this is a parse error. - Ignore the token. (innerHTML case) */ - if (!$this->elementInScope($token['name'], true)) { - return false; - - /* Otherwise: */ - } else { - /* Generate implied end tags. */ - $this->generateImpliedEndTags(); - - /* Now, if the current node is not a table element, then this - is a parse error. */ - // w/e - - /* Pop elements from this stack until a table element has been - popped from the stack. */ - while (true) { - $current = end($this->stack)->nodeName; - array_pop($this->stack); - - if ($current === 'table') { - break; - } - } - - /* Reset the insertion mode appropriately. */ - $this->resetInsertionMode(); - } - - /* An end tag whose tag name is one of: "body", "caption", "col", - "colgroup", "html", "tbody", "td", "tfoot", "th", "thead", "tr" */ - } elseif ($token['type'] === HTML5::ENDTAG && in_array( - $token['name'], - array( - 'body', - 'caption', - 'col', - 'colgroup', - 'html', - 'tbody', - 'td', - 'tfoot', - 'th', - 'thead', - 'tr' - ) - ) - ) { - // Parse error. Ignore the token. - - /* Anything else */ - } else { - /* Parse error. Process the token as if the insertion mode was "in - body", with the following exception: */ - - /* If the current node is a table, tbody, tfoot, thead, or tr - element, then, whenever a node would be inserted into the current - node, it must instead be inserted into the foster parent element. */ - if (in_array( - end($this->stack)->nodeName, - array('table', 'tbody', 'tfoot', 'thead', 'tr') - ) - ) { - /* The foster parent element is the parent element of the last - table element in the stack of open elements, if there is a - table element and it has such a parent element. If there is no - table element in the stack of open elements (innerHTML case), - then the foster parent element is the first element in the - stack of open elements (the html element). Otherwise, if there - is a table element in the stack of open elements, but the last - table element in the stack of open elements has no parent, or - its parent node is not an element, then the foster parent - element is the element before the last table element in the - stack of open elements. */ - for ($n = count($this->stack) - 1; $n >= 0; $n--) { - if ($this->stack[$n]->nodeName === 'table') { - $table = $this->stack[$n]; - break; - } - } - - if (isset($table) && $table->parentNode !== null) { - $this->foster_parent = $table->parentNode; - - } elseif (!isset($table)) { - $this->foster_parent = $this->stack[0]; - - } elseif (isset($table) && ($table->parentNode === null || - $table->parentNode->nodeType !== XML_ELEMENT_NODE) - ) { - $this->foster_parent = $this->stack[$n - 1]; - } - } - - $this->inBody($token); - } - } - - private function inCaption($token) - { - /* An end tag whose tag name is "caption" */ - if ($token['type'] === HTML5::ENDTAG && $token['name'] === 'caption') { - /* If the stack of open elements does not have an element in table - scope with the same tag name as the token, this is a parse error. - Ignore the token. (innerHTML case) */ - if (!$this->elementInScope($token['name'], true)) { - // Ignore - - /* Otherwise: */ - } else { - /* Generate implied end tags. */ - $this->generateImpliedEndTags(); - - /* Now, if the current node is not a caption element, then this - is a parse error. */ - // w/e - - /* Pop elements from this stack until a caption element has - been popped from the stack. */ - while (true) { - $node = end($this->stack)->nodeName; - array_pop($this->stack); - - if ($node === 'caption') { - break; - } - } - - /* Clear the list of active formatting elements up to the last - marker. */ - $this->clearTheActiveFormattingElementsUpToTheLastMarker(); - - /* Switch the insertion mode to "in table". */ - $this->mode = self::IN_TABLE; - } - - /* A start tag whose tag name is one of: "caption", "col", "colgroup", - "tbody", "td", "tfoot", "th", "thead", "tr", or an end tag whose tag - name is "table" */ - } elseif (($token['type'] === HTML5::STARTTAG && in_array( - $token['name'], - array( - 'caption', - 'col', - 'colgroup', - 'tbody', - 'td', - 'tfoot', - 'th', - 'thead', - 'tr' - ) - )) || ($token['type'] === HTML5::ENDTAG && - $token['name'] === 'table') - ) { - /* Parse error. Act as if an end tag with the tag name "caption" - had been seen, then, if that token wasn't ignored, reprocess the - current token. */ - $this->inCaption( - array( - 'name' => 'caption', - 'type' => HTML5::ENDTAG - ) - ); - - return $this->inTable($token); - - /* An end tag whose tag name is one of: "body", "col", "colgroup", - "html", "tbody", "td", "tfoot", "th", "thead", "tr" */ - } elseif ($token['type'] === HTML5::ENDTAG && in_array( - $token['name'], - array( - 'body', - 'col', - 'colgroup', - 'html', - 'tbody', - 'tfoot', - 'th', - 'thead', - 'tr' - ) - ) - ) { - // Parse error. Ignore the token. - - /* Anything else */ - } else { - /* Process the token as if the insertion mode was "in body". */ - $this->inBody($token); - } - } - - private function inColumnGroup($token) - { - /* A character token that is one of one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - or U+0020 SPACE */ - if ($token['type'] === HTML5::CHARACTR && - preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data']) - ) { - /* Append the character to the current node. */ - $text = $this->dom->createTextNode($token['data']); - end($this->stack)->appendChild($text); - - /* A comment token */ - } elseif ($token['type'] === HTML5::COMMENT) { - /* Append a Comment node to the current node with the data - attribute set to the data given in the comment token. */ - $comment = $this->dom->createComment($token['data']); - end($this->stack)->appendChild($comment); - - /* A start tag whose tag name is "col" */ - } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'col') { - /* Insert a col element for the token. Immediately pop the current - node off the stack of open elements. */ - $this->insertElement($token); - array_pop($this->stack); - - /* An end tag whose tag name is "colgroup" */ - } elseif ($token['type'] === HTML5::ENDTAG && - $token['name'] === 'colgroup' - ) { - /* If the current node is the root html element, then this is a - parse error, ignore the token. (innerHTML case) */ - if (end($this->stack)->nodeName === 'html') { - // Ignore - - /* Otherwise, pop the current node (which will be a colgroup - element) from the stack of open elements. Switch the insertion - mode to "in table". */ - } else { - array_pop($this->stack); - $this->mode = self::IN_TABLE; - } - - /* An end tag whose tag name is "col" */ - } elseif ($token['type'] === HTML5::ENDTAG && $token['name'] === 'col') { - /* Parse error. Ignore the token. */ - - /* Anything else */ - } else { - /* Act as if an end tag with the tag name "colgroup" had been seen, - and then, if that token wasn't ignored, reprocess the current token. */ - $this->inColumnGroup( - array( - 'name' => 'colgroup', - 'type' => HTML5::ENDTAG - ) - ); - - return $this->inTable($token); - } - } - - private function inTableBody($token) - { - $clear = array('tbody', 'tfoot', 'thead', 'html'); - - /* A start tag whose tag name is "tr" */ - if ($token['type'] === HTML5::STARTTAG && $token['name'] === 'tr') { - /* Clear the stack back to a table body context. */ - $this->clearStackToTableContext($clear); - - /* Insert a tr element for the token, then switch the insertion - mode to "in row". */ - $this->insertElement($token); - $this->mode = self::IN_ROW; - - /* A start tag whose tag name is one of: "th", "td" */ - } elseif ($token['type'] === HTML5::STARTTAG && - ($token['name'] === 'th' || $token['name'] === 'td') - ) { - /* Parse error. Act as if a start tag with the tag name "tr" had - been seen, then reprocess the current token. */ - $this->inTableBody( - array( - 'name' => 'tr', - 'type' => HTML5::STARTTAG, - 'attr' => array() - ) - ); - - return $this->inRow($token); - - /* An end tag whose tag name is one of: "tbody", "tfoot", "thead" */ - } elseif ($token['type'] === HTML5::ENDTAG && - in_array($token['name'], array('tbody', 'tfoot', 'thead')) - ) { - /* If the stack of open elements does not have an element in table - scope with the same tag name as the token, this is a parse error. - Ignore the token. */ - if (!$this->elementInScope($token['name'], true)) { - // Ignore - - /* Otherwise: */ - } else { - /* Clear the stack back to a table body context. */ - $this->clearStackToTableContext($clear); - - /* Pop the current node from the stack of open elements. Switch - the insertion mode to "in table". */ - array_pop($this->stack); - $this->mode = self::IN_TABLE; - } - - /* A start tag whose tag name is one of: "caption", "col", "colgroup", - "tbody", "tfoot", "thead", or an end tag whose tag name is "table" */ - } elseif (($token['type'] === HTML5::STARTTAG && in_array( - $token['name'], - array('caption', 'col', 'colgroup', 'tbody', 'tfoor', 'thead') - )) || - ($token['type'] === HTML5::STARTTAG && $token['name'] === 'table') - ) { - /* If the stack of open elements does not have a tbody, thead, or - tfoot element in table scope, this is a parse error. Ignore the - token. (innerHTML case) */ - if (!$this->elementInScope(array('tbody', 'thead', 'tfoot'), true)) { - // Ignore. - - /* Otherwise: */ - } else { - /* Clear the stack back to a table body context. */ - $this->clearStackToTableContext($clear); - - /* Act as if an end tag with the same tag name as the current - node ("tbody", "tfoot", or "thead") had been seen, then - reprocess the current token. */ - $this->inTableBody( - array( - 'name' => end($this->stack)->nodeName, - 'type' => HTML5::ENDTAG - ) - ); - - return $this->mainPhase($token); - } - - /* An end tag whose tag name is one of: "body", "caption", "col", - "colgroup", "html", "td", "th", "tr" */ - } elseif ($token['type'] === HTML5::ENDTAG && in_array( - $token['name'], - array('body', 'caption', 'col', 'colgroup', 'html', 'td', 'th', 'tr') - ) - ) { - /* Parse error. Ignore the token. */ - - /* Anything else */ - } else { - /* Process the token as if the insertion mode was "in table". */ - $this->inTable($token); - } - } - - private function inRow($token) - { - $clear = array('tr', 'html'); - - /* A start tag whose tag name is one of: "th", "td" */ - if ($token['type'] === HTML5::STARTTAG && - ($token['name'] === 'th' || $token['name'] === 'td') - ) { - /* Clear the stack back to a table row context. */ - $this->clearStackToTableContext($clear); - - /* Insert an HTML element for the token, then switch the insertion - mode to "in cell". */ - $this->insertElement($token); - $this->mode = self::IN_CELL; - - /* Insert a marker at the end of the list of active formatting - elements. */ - $this->a_formatting[] = self::MARKER; - - /* An end tag whose tag name is "tr" */ - } elseif ($token['type'] === HTML5::ENDTAG && $token['name'] === 'tr') { - /* If the stack of open elements does not have an element in table - scope with the same tag name as the token, this is a parse error. - Ignore the token. (innerHTML case) */ - if (!$this->elementInScope($token['name'], true)) { - // Ignore. - - /* Otherwise: */ - } else { - /* Clear the stack back to a table row context. */ - $this->clearStackToTableContext($clear); - - /* Pop the current node (which will be a tr element) from the - stack of open elements. Switch the insertion mode to "in table - body". */ - array_pop($this->stack); - $this->mode = self::IN_TBODY; - } - - /* A start tag whose tag name is one of: "caption", "col", "colgroup", - "tbody", "tfoot", "thead", "tr" or an end tag whose tag name is "table" */ - } elseif ($token['type'] === HTML5::STARTTAG && in_array( - $token['name'], - array('caption', 'col', 'colgroup', 'tbody', 'tfoot', 'thead', 'tr') - ) - ) { - /* Act as if an end tag with the tag name "tr" had been seen, then, - if that token wasn't ignored, reprocess the current token. */ - $this->inRow( - array( - 'name' => 'tr', - 'type' => HTML5::ENDTAG - ) - ); - - return $this->inCell($token); - - /* An end tag whose tag name is one of: "tbody", "tfoot", "thead" */ - } elseif ($token['type'] === HTML5::ENDTAG && - in_array($token['name'], array('tbody', 'tfoot', 'thead')) - ) { - /* If the stack of open elements does not have an element in table - scope with the same tag name as the token, this is a parse error. - Ignore the token. */ - if (!$this->elementInScope($token['name'], true)) { - // Ignore. - - /* Otherwise: */ - } else { - /* Otherwise, act as if an end tag with the tag name "tr" had - been seen, then reprocess the current token. */ - $this->inRow( - array( - 'name' => 'tr', - 'type' => HTML5::ENDTAG - ) - ); - - return $this->inCell($token); - } - - /* An end tag whose tag name is one of: "body", "caption", "col", - "colgroup", "html", "td", "th" */ - } elseif ($token['type'] === HTML5::ENDTAG && in_array( - $token['name'], - array('body', 'caption', 'col', 'colgroup', 'html', 'td', 'th', 'tr') - ) - ) { - /* Parse error. Ignore the token. */ - - /* Anything else */ - } else { - /* Process the token as if the insertion mode was "in table". */ - $this->inTable($token); - } - } - - private function inCell($token) - { - /* An end tag whose tag name is one of: "td", "th" */ - if ($token['type'] === HTML5::ENDTAG && - ($token['name'] === 'td' || $token['name'] === 'th') - ) { - /* If the stack of open elements does not have an element in table - scope with the same tag name as that of the token, then this is a - parse error and the token must be ignored. */ - if (!$this->elementInScope($token['name'], true)) { - // Ignore. - - /* Otherwise: */ - } else { - /* Generate implied end tags, except for elements with the same - tag name as the token. */ - $this->generateImpliedEndTags(array($token['name'])); - - /* Now, if the current node is not an element with the same tag - name as the token, then this is a parse error. */ - // k - - /* Pop elements from this stack until an element with the same - tag name as the token has been popped from the stack. */ - while (true) { - $node = end($this->stack)->nodeName; - array_pop($this->stack); - - if ($node === $token['name']) { - break; - } - } - - /* Clear the list of active formatting elements up to the last - marker. */ - $this->clearTheActiveFormattingElementsUpToTheLastMarker(); - - /* Switch the insertion mode to "in row". (The current node - will be a tr element at this point.) */ - $this->mode = self::IN_ROW; - } - - /* A start tag whose tag name is one of: "caption", "col", "colgroup", - "tbody", "td", "tfoot", "th", "thead", "tr" */ - } elseif ($token['type'] === HTML5::STARTTAG && in_array( - $token['name'], - array( - 'caption', - 'col', - 'colgroup', - 'tbody', - 'td', - 'tfoot', - 'th', - 'thead', - 'tr' - ) - ) - ) { - /* If the stack of open elements does not have a td or th element - in table scope, then this is a parse error; ignore the token. - (innerHTML case) */ - if (!$this->elementInScope(array('td', 'th'), true)) { - // Ignore. - - /* Otherwise, close the cell (see below) and reprocess the current - token. */ - } else { - $this->closeCell(); - return $this->inRow($token); - } - - /* A start tag whose tag name is one of: "caption", "col", "colgroup", - "tbody", "td", "tfoot", "th", "thead", "tr" */ - } elseif ($token['type'] === HTML5::STARTTAG && in_array( - $token['name'], - array( - 'caption', - 'col', - 'colgroup', - 'tbody', - 'td', - 'tfoot', - 'th', - 'thead', - 'tr' - ) - ) - ) { - /* If the stack of open elements does not have a td or th element - in table scope, then this is a parse error; ignore the token. - (innerHTML case) */ - if (!$this->elementInScope(array('td', 'th'), true)) { - // Ignore. - - /* Otherwise, close the cell (see below) and reprocess the current - token. */ - } else { - $this->closeCell(); - return $this->inRow($token); - } - - /* An end tag whose tag name is one of: "body", "caption", "col", - "colgroup", "html" */ - } elseif ($token['type'] === HTML5::ENDTAG && in_array( - $token['name'], - array('body', 'caption', 'col', 'colgroup', 'html') - ) - ) { - /* Parse error. Ignore the token. */ - - /* An end tag whose tag name is one of: "table", "tbody", "tfoot", - "thead", "tr" */ - } elseif ($token['type'] === HTML5::ENDTAG && in_array( - $token['name'], - array('table', 'tbody', 'tfoot', 'thead', 'tr') - ) - ) { - /* If the stack of open elements does not have an element in table - scope with the same tag name as that of the token (which can only - happen for "tbody", "tfoot" and "thead", or, in the innerHTML case), - then this is a parse error and the token must be ignored. */ - if (!$this->elementInScope($token['name'], true)) { - // Ignore. - - /* Otherwise, close the cell (see below) and reprocess the current - token. */ - } else { - $this->closeCell(); - return $this->inRow($token); - } - - /* Anything else */ - } else { - /* Process the token as if the insertion mode was "in body". */ - $this->inBody($token); - } - } - - private function inSelect($token) - { - /* Handle the token as follows: */ - - /* A character token */ - if ($token['type'] === HTML5::CHARACTR) { - /* Append the token's character to the current node. */ - $this->insertText($token['data']); - - /* A comment token */ - } elseif ($token['type'] === HTML5::COMMENT) { - /* Append a Comment node to the current node with the data - attribute set to the data given in the comment token. */ - $this->insertComment($token['data']); - - /* A start tag token whose tag name is "option" */ - } elseif ($token['type'] === HTML5::STARTTAG && - $token['name'] === 'option' - ) { - /* If the current node is an option element, act as if an end tag - with the tag name "option" had been seen. */ - if (end($this->stack)->nodeName === 'option') { - $this->inSelect( - array( - 'name' => 'option', - 'type' => HTML5::ENDTAG - ) - ); - } - - /* Insert an HTML element for the token. */ - $this->insertElement($token); - - /* A start tag token whose tag name is "optgroup" */ - } elseif ($token['type'] === HTML5::STARTTAG && - $token['name'] === 'optgroup' - ) { - /* If the current node is an option element, act as if an end tag - with the tag name "option" had been seen. */ - if (end($this->stack)->nodeName === 'option') { - $this->inSelect( - array( - 'name' => 'option', - 'type' => HTML5::ENDTAG - ) - ); - } - - /* If the current node is an optgroup element, act as if an end tag - with the tag name "optgroup" had been seen. */ - if (end($this->stack)->nodeName === 'optgroup') { - $this->inSelect( - array( - 'name' => 'optgroup', - 'type' => HTML5::ENDTAG - ) - ); - } - - /* Insert an HTML element for the token. */ - $this->insertElement($token); - - /* An end tag token whose tag name is "optgroup" */ - } elseif ($token['type'] === HTML5::ENDTAG && - $token['name'] === 'optgroup' - ) { - /* First, if the current node is an option element, and the node - immediately before it in the stack of open elements is an optgroup - element, then act as if an end tag with the tag name "option" had - been seen. */ - $elements_in_stack = count($this->stack); - - if ($this->stack[$elements_in_stack - 1]->nodeName === 'option' && - $this->stack[$elements_in_stack - 2]->nodeName === 'optgroup' - ) { - $this->inSelect( - array( - 'name' => 'option', - 'type' => HTML5::ENDTAG - ) - ); - } - - /* If the current node is an optgroup element, then pop that node - from the stack of open elements. Otherwise, this is a parse error, - ignore the token. */ - if ($this->stack[$elements_in_stack - 1] === 'optgroup') { - array_pop($this->stack); - } - - /* An end tag token whose tag name is "option" */ - } elseif ($token['type'] === HTML5::ENDTAG && - $token['name'] === 'option' - ) { - /* If the current node is an option element, then pop that node - from the stack of open elements. Otherwise, this is a parse error, - ignore the token. */ - if (end($this->stack)->nodeName === 'option') { - array_pop($this->stack); - } - - /* An end tag whose tag name is "select" */ - } elseif ($token['type'] === HTML5::ENDTAG && - $token['name'] === 'select' - ) { - /* If the stack of open elements does not have an element in table - scope with the same tag name as the token, this is a parse error. - Ignore the token. (innerHTML case) */ - if (!$this->elementInScope($token['name'], true)) { - // w/e - - /* Otherwise: */ - } else { - /* Pop elements from the stack of open elements until a select - element has been popped from the stack. */ - while (true) { - $current = end($this->stack)->nodeName; - array_pop($this->stack); - - if ($current === 'select') { - break; - } - } - - /* Reset the insertion mode appropriately. */ - $this->resetInsertionMode(); - } - - /* A start tag whose tag name is "select" */ - } elseif ($token['name'] === 'select' && - $token['type'] === HTML5::STARTTAG - ) { - /* Parse error. Act as if the token had been an end tag with the - tag name "select" instead. */ - $this->inSelect( - array( - 'name' => 'select', - 'type' => HTML5::ENDTAG - ) - ); - - /* An end tag whose tag name is one of: "caption", "table", "tbody", - "tfoot", "thead", "tr", "td", "th" */ - } elseif (in_array( - $token['name'], - array( - 'caption', - 'table', - 'tbody', - 'tfoot', - 'thead', - 'tr', - 'td', - 'th' - ) - ) && $token['type'] === HTML5::ENDTAG - ) { - /* Parse error. */ - // w/e - - /* If the stack of open elements has an element in table scope with - the same tag name as that of the token, then act as if an end tag - with the tag name "select" had been seen, and reprocess the token. - Otherwise, ignore the token. */ - if ($this->elementInScope($token['name'], true)) { - $this->inSelect( - array( - 'name' => 'select', - 'type' => HTML5::ENDTAG - ) - ); - - $this->mainPhase($token); - } - - /* Anything else */ - } else { - /* Parse error. Ignore the token. */ - } - } - - private function afterBody($token) - { - /* Handle the token as follows: */ - - /* A character token that is one of one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - or U+0020 SPACE */ - if ($token['type'] === HTML5::CHARACTR && - preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data']) - ) { - /* Process the token as it would be processed if the insertion mode - was "in body". */ - $this->inBody($token); - - /* A comment token */ - } elseif ($token['type'] === HTML5::COMMENT) { - /* Append a Comment node to the first element in the stack of open - elements (the html element), with the data attribute set to the - data given in the comment token. */ - $comment = $this->dom->createComment($token['data']); - $this->stack[0]->appendChild($comment); - - /* An end tag with the tag name "html" */ - } elseif ($token['type'] === HTML5::ENDTAG && $token['name'] === 'html') { - /* If the parser was originally created in order to handle the - setting of an element's innerHTML attribute, this is a parse error; - ignore the token. (The element will be an html element in this - case.) (innerHTML case) */ - - /* Otherwise, switch to the trailing end phase. */ - $this->phase = self::END_PHASE; - - /* Anything else */ - } else { - /* Parse error. Set the insertion mode to "in body" and reprocess - the token. */ - $this->mode = self::IN_BODY; - return $this->inBody($token); - } - } - - private function inFrameset($token) - { - /* Handle the token as follows: */ - - /* A character token that is one of one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - U+000D CARRIAGE RETURN (CR), or U+0020 SPACE */ - if ($token['type'] === HTML5::CHARACTR && - preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data']) - ) { - /* Append the character to the current node. */ - $this->insertText($token['data']); - - /* A comment token */ - } elseif ($token['type'] === HTML5::COMMENT) { - /* Append a Comment node to the current node with the data - attribute set to the data given in the comment token. */ - $this->insertComment($token['data']); - - /* A start tag with the tag name "frameset" */ - } elseif ($token['name'] === 'frameset' && - $token['type'] === HTML5::STARTTAG - ) { - $this->insertElement($token); - - /* An end tag with the tag name "frameset" */ - } elseif ($token['name'] === 'frameset' && - $token['type'] === HTML5::ENDTAG - ) { - /* If the current node is the root html element, then this is a - parse error; ignore the token. (innerHTML case) */ - if (end($this->stack)->nodeName === 'html') { - // Ignore - - } else { - /* Otherwise, pop the current node from the stack of open - elements. */ - array_pop($this->stack); - - /* If the parser was not originally created in order to handle - the setting of an element's innerHTML attribute (innerHTML case), - and the current node is no longer a frameset element, then change - the insertion mode to "after frameset". */ - $this->mode = self::AFTR_FRAME; - } - - /* A start tag with the tag name "frame" */ - } elseif ($token['name'] === 'frame' && - $token['type'] === HTML5::STARTTAG - ) { - /* Insert an HTML element for the token. */ - $this->insertElement($token); - - /* Immediately pop the current node off the stack of open elements. */ - array_pop($this->stack); - - /* A start tag with the tag name "noframes" */ - } elseif ($token['name'] === 'noframes' && - $token['type'] === HTML5::STARTTAG - ) { - /* Process the token as if the insertion mode had been "in body". */ - $this->inBody($token); - - /* Anything else */ - } else { - /* Parse error. Ignore the token. */ - } - } - - private function afterFrameset($token) - { - /* Handle the token as follows: */ - - /* A character token that is one of one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - U+000D CARRIAGE RETURN (CR), or U+0020 SPACE */ - if ($token['type'] === HTML5::CHARACTR && - preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data']) - ) { - /* Append the character to the current node. */ - $this->insertText($token['data']); - - /* A comment token */ - } elseif ($token['type'] === HTML5::COMMENT) { - /* Append a Comment node to the current node with the data - attribute set to the data given in the comment token. */ - $this->insertComment($token['data']); - - /* An end tag with the tag name "html" */ - } elseif ($token['name'] === 'html' && - $token['type'] === HTML5::ENDTAG - ) { - /* Switch to the trailing end phase. */ - $this->phase = self::END_PHASE; - - /* A start tag with the tag name "noframes" */ - } elseif ($token['name'] === 'noframes' && - $token['type'] === HTML5::STARTTAG - ) { - /* Process the token as if the insertion mode had been "in body". */ - $this->inBody($token); - - /* Anything else */ - } else { - /* Parse error. Ignore the token. */ - } - } - - private function trailingEndPhase($token) - { - /* After the main phase, as each token is emitted from the tokenisation - stage, it must be processed as described in this section. */ - - /* A DOCTYPE token */ - if ($token['type'] === HTML5::DOCTYPE) { - // Parse error. Ignore the token. - - /* A comment token */ - } elseif ($token['type'] === HTML5::COMMENT) { - /* Append a Comment node to the Document object with the data - attribute set to the data given in the comment token. */ - $comment = $this->dom->createComment($token['data']); - $this->dom->appendChild($comment); - - /* A character token that is one of one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - or U+0020 SPACE */ - } elseif ($token['type'] === HTML5::CHARACTR && - preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data']) - ) { - /* Process the token as it would be processed in the main phase. */ - $this->mainPhase($token); - - /* A character token that is not one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - or U+0020 SPACE. Or a start tag token. Or an end tag token. */ - } elseif (($token['type'] === HTML5::CHARACTR && - preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) || - $token['type'] === HTML5::STARTTAG || $token['type'] === HTML5::ENDTAG - ) { - /* Parse error. Switch back to the main phase and reprocess the - token. */ - $this->phase = self::MAIN_PHASE; - return $this->mainPhase($token); - - /* An end-of-file token */ - } elseif ($token['type'] === HTML5::EOF) { - /* OMG DONE!! */ - } - } - - private function insertElement($token, $append = true, $check = false) - { - // Proprietary workaround for libxml2's limitations with tag names - if ($check) { - // Slightly modified HTML5 tag-name modification, - // removing anything that's not an ASCII letter, digit, or hyphen - $token['name'] = preg_replace('/[^a-z0-9-]/i', '', $token['name']); - // Remove leading hyphens and numbers - $token['name'] = ltrim($token['name'], '-0..9'); - // In theory, this should ever be needed, but just in case - if ($token['name'] === '') { - $token['name'] = 'span'; - } // arbitrary generic choice - } - - $el = $this->dom->createElement($token['name']); - - foreach ($token['attr'] as $attr) { - if (!$el->hasAttribute($attr['name'])) { - $el->setAttribute($attr['name'], $attr['value']); - } - } - - $this->appendToRealParent($el); - $this->stack[] = $el; - - return $el; - } - - private function insertText($data) - { - $text = $this->dom->createTextNode($data); - $this->appendToRealParent($text); - } - - private function insertComment($data) - { - $comment = $this->dom->createComment($data); - $this->appendToRealParent($comment); - } - - private function appendToRealParent($node) - { - if ($this->foster_parent === null) { - end($this->stack)->appendChild($node); - - } elseif ($this->foster_parent !== null) { - /* If the foster parent element is the parent element of the - last table element in the stack of open elements, then the new - node must be inserted immediately before the last table element - in the stack of open elements in the foster parent element; - otherwise, the new node must be appended to the foster parent - element. */ - for ($n = count($this->stack) - 1; $n >= 0; $n--) { - if ($this->stack[$n]->nodeName === 'table' && - $this->stack[$n]->parentNode !== null - ) { - $table = $this->stack[$n]; - break; - } - } - - if (isset($table) && $this->foster_parent->isSameNode($table->parentNode)) { - $this->foster_parent->insertBefore($node, $table); - } else { - $this->foster_parent->appendChild($node); - } - - $this->foster_parent = null; - } - } - - private function elementInScope($el, $table = false) - { - if (is_array($el)) { - foreach ($el as $element) { - if ($this->elementInScope($element, $table)) { - return true; - } - } - - return false; - } - - $leng = count($this->stack); - - for ($n = 0; $n < $leng; $n++) { - /* 1. Initialise node to be the current node (the bottommost node of - the stack). */ - $node = $this->stack[$leng - 1 - $n]; - - if ($node->tagName === $el) { - /* 2. If node is the target node, terminate in a match state. */ - return true; - - } elseif ($node->tagName === 'table') { - /* 3. Otherwise, if node is a table element, terminate in a failure - state. */ - return false; - - } elseif ($table === true && in_array( - $node->tagName, - array( - 'caption', - 'td', - 'th', - 'button', - 'marquee', - 'object' - ) - ) - ) { - /* 4. Otherwise, if the algorithm is the "has an element in scope" - variant (rather than the "has an element in table scope" variant), - and node is one of the following, terminate in a failure state. */ - return false; - - } elseif ($node === $node->ownerDocument->documentElement) { - /* 5. Otherwise, if node is an html element (root element), terminate - in a failure state. (This can only happen if the node is the topmost - node of the stack of open elements, and prevents the next step from - being invoked if there are no more elements in the stack.) */ - return false; - } - - /* Otherwise, set node to the previous entry in the stack of open - elements and return to step 2. (This will never fail, since the loop - will always terminate in the previous step if the top of the stack - is reached.) */ - } - } - - private function reconstructActiveFormattingElements() - { - /* 1. If there are no entries in the list of active formatting elements, - then there is nothing to reconstruct; stop this algorithm. */ - $formatting_elements = count($this->a_formatting); - - if ($formatting_elements === 0) { - return false; - } - - /* 3. Let entry be the last (most recently added) element in the list - of active formatting elements. */ - $entry = end($this->a_formatting); - - /* 2. If the last (most recently added) entry in the list of active - formatting elements is a marker, or if it is an element that is in the - stack of open elements, then there is nothing to reconstruct; stop this - algorithm. */ - if ($entry === self::MARKER || in_array($entry, $this->stack, true)) { - return false; - } - - for ($a = $formatting_elements - 1; $a >= 0; true) { - /* 4. If there are no entries before entry in the list of active - formatting elements, then jump to step 8. */ - if ($a === 0) { - $step_seven = false; - break; - } - - /* 5. Let entry be the entry one earlier than entry in the list of - active formatting elements. */ - $a--; - $entry = $this->a_formatting[$a]; - - /* 6. If entry is neither a marker nor an element that is also in - thetack of open elements, go to step 4. */ - if ($entry === self::MARKER || in_array($entry, $this->stack, true)) { - break; - } - } - - while (true) { - /* 7. Let entry be the element one later than entry in the list of - active formatting elements. */ - if (isset($step_seven) && $step_seven === true) { - $a++; - $entry = $this->a_formatting[$a]; - } - - /* 8. Perform a shallow clone of the element entry to obtain clone. */ - $clone = $entry->cloneNode(); - - /* 9. Append clone to the current node and push it onto the stack - of open elements so that it is the new current node. */ - end($this->stack)->appendChild($clone); - $this->stack[] = $clone; - - /* 10. Replace the entry for entry in the list with an entry for - clone. */ - $this->a_formatting[$a] = $clone; - - /* 11. If the entry for clone in the list of active formatting - elements is not the last entry in the list, return to step 7. */ - if (end($this->a_formatting) !== $clone) { - $step_seven = true; - } else { - break; - } - } - } - - private function clearTheActiveFormattingElementsUpToTheLastMarker() - { - /* When the steps below require the UA to clear the list of active - formatting elements up to the last marker, the UA must perform the - following steps: */ - - while (true) { - /* 1. Let entry be the last (most recently added) entry in the list - of active formatting elements. */ - $entry = end($this->a_formatting); - - /* 2. Remove entry from the list of active formatting elements. */ - array_pop($this->a_formatting); - - /* 3. If entry was a marker, then stop the algorithm at this point. - The list has been cleared up to the last marker. */ - if ($entry === self::MARKER) { - break; - } - } - } - - private function generateImpliedEndTags($exclude = array()) - { - /* When the steps below require the UA to generate implied end tags, - then, if the current node is a dd element, a dt element, an li element, - a p element, a td element, a th element, or a tr element, the UA must - act as if an end tag with the respective tag name had been seen and - then generate implied end tags again. */ - $node = end($this->stack); - $elements = array_diff(array('dd', 'dt', 'li', 'p', 'td', 'th', 'tr'), $exclude); - - while (in_array(end($this->stack)->nodeName, $elements)) { - array_pop($this->stack); - } - } - - private function getElementCategory($node) - { - $name = $node->tagName; - if (in_array($name, $this->special)) { - return self::SPECIAL; - } elseif (in_array($name, $this->scoping)) { - return self::SCOPING; - } elseif (in_array($name, $this->formatting)) { - return self::FORMATTING; - } else { - return self::PHRASING; - } - } - - private function clearStackToTableContext($elements) - { - /* When the steps above require the UA to clear the stack back to a - table context, it means that the UA must, while the current node is not - a table element or an html element, pop elements from the stack of open - elements. If this causes any elements to be popped from the stack, then - this is a parse error. */ - while (true) { - $node = end($this->stack)->nodeName; - - if (in_array($node, $elements)) { - break; - } else { - array_pop($this->stack); - } - } - } - - private function resetInsertionMode() - { - /* 1. Let last be false. */ - $last = false; - $leng = count($this->stack); - - for ($n = $leng - 1; $n >= 0; $n--) { - /* 2. Let node be the last node in the stack of open elements. */ - $node = $this->stack[$n]; - - /* 3. If node is the first node in the stack of open elements, then - set last to true. If the element whose innerHTML attribute is being - set is neither a td element nor a th element, then set node to the - element whose innerHTML attribute is being set. (innerHTML case) */ - if ($this->stack[0]->isSameNode($node)) { - $last = true; - } - - /* 4. If node is a select element, then switch the insertion mode to - "in select" and abort these steps. (innerHTML case) */ - if ($node->nodeName === 'select') { - $this->mode = self::IN_SELECT; - break; - - /* 5. If node is a td or th element, then switch the insertion mode - to "in cell" and abort these steps. */ - } elseif ($node->nodeName === 'td' || $node->nodeName === 'th') { - $this->mode = self::IN_CELL; - break; - - /* 6. If node is a tr element, then switch the insertion mode to - "in row" and abort these steps. */ - } elseif ($node->nodeName === 'tr') { - $this->mode = self::IN_ROW; - break; - - /* 7. If node is a tbody, thead, or tfoot element, then switch the - insertion mode to "in table body" and abort these steps. */ - } elseif (in_array($node->nodeName, array('tbody', 'thead', 'tfoot'))) { - $this->mode = self::IN_TBODY; - break; - - /* 8. If node is a caption element, then switch the insertion mode - to "in caption" and abort these steps. */ - } elseif ($node->nodeName === 'caption') { - $this->mode = self::IN_CAPTION; - break; - - /* 9. If node is a colgroup element, then switch the insertion mode - to "in column group" and abort these steps. (innerHTML case) */ - } elseif ($node->nodeName === 'colgroup') { - $this->mode = self::IN_CGROUP; - break; - - /* 10. If node is a table element, then switch the insertion mode - to "in table" and abort these steps. */ - } elseif ($node->nodeName === 'table') { - $this->mode = self::IN_TABLE; - break; - - /* 11. If node is a head element, then switch the insertion mode - to "in body" ("in body"! not "in head"!) and abort these steps. - (innerHTML case) */ - } elseif ($node->nodeName === 'head') { - $this->mode = self::IN_BODY; - break; - - /* 12. If node is a body element, then switch the insertion mode to - "in body" and abort these steps. */ - } elseif ($node->nodeName === 'body') { - $this->mode = self::IN_BODY; - break; - - /* 13. If node is a frameset element, then switch the insertion - mode to "in frameset" and abort these steps. (innerHTML case) */ - } elseif ($node->nodeName === 'frameset') { - $this->mode = self::IN_FRAME; - break; - - /* 14. If node is an html element, then: if the head element - pointer is null, switch the insertion mode to "before head", - otherwise, switch the insertion mode to "after head". In either - case, abort these steps. (innerHTML case) */ - } elseif ($node->nodeName === 'html') { - $this->mode = ($this->head_pointer === null) - ? self::BEFOR_HEAD - : self::AFTER_HEAD; - - break; - - /* 15. If last is true, then set the insertion mode to "in body" - and abort these steps. (innerHTML case) */ - } elseif ($last) { - $this->mode = self::IN_BODY; - break; - } - } - } - - private function closeCell() - { - /* If the stack of open elements has a td or th element in table scope, - then act as if an end tag token with that tag name had been seen. */ - foreach (array('td', 'th') as $cell) { - if ($this->elementInScope($cell, true)) { - $this->inCell( - array( - 'name' => $cell, - 'type' => HTML5::ENDTAG - ) - ); - - break; - } - } - } - - public function save() - { - return $this->dom; - } -} +normalize($html, $config, $context); + $new_html = $this->wrapHTML($new_html, $config, $context); + try { + $parser = new HTML5($new_html); + $doc = $parser->save(); + } catch (DOMException $e) { + // Uh oh, it failed. Punt to DirectLex. + $lexer = new HTMLPurifier_Lexer_DirectLex(); + $context->register('PH5PError', $e); // save the error, so we can detect it + return $lexer->tokenizeHTML($html, $config, $context); // use original HTML + } + $tokens = array(); + $this->tokenizeDOM( + $doc->getElementsByTagName('html')->item(0)-> // + getElementsByTagName('body')->item(0)-> // + getElementsByTagName('div')->item(0) //
      + , + $tokens + ); + return $tokens; + } +} + +/* + +Copyright 2007 Jeroen van der Meer + +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. + +*/ + +class HTML5 +{ + private $data; + private $char; + private $EOF; + private $state; + private $tree; + private $token; + private $content_model; + private $escape = false; + private $entities = array( + 'AElig;', + 'AElig', + 'AMP;', + 'AMP', + 'Aacute;', + 'Aacute', + 'Acirc;', + 'Acirc', + 'Agrave;', + 'Agrave', + 'Alpha;', + 'Aring;', + 'Aring', + 'Atilde;', + 'Atilde', + 'Auml;', + 'Auml', + 'Beta;', + 'COPY;', + 'COPY', + 'Ccedil;', + 'Ccedil', + 'Chi;', + 'Dagger;', + 'Delta;', + 'ETH;', + 'ETH', + 'Eacute;', + 'Eacute', + 'Ecirc;', + 'Ecirc', + 'Egrave;', + 'Egrave', + 'Epsilon;', + 'Eta;', + 'Euml;', + 'Euml', + 'GT;', + 'GT', + 'Gamma;', + 'Iacute;', + 'Iacute', + 'Icirc;', + 'Icirc', + 'Igrave;', + 'Igrave', + 'Iota;', + 'Iuml;', + 'Iuml', + 'Kappa;', + 'LT;', + 'LT', + 'Lambda;', + 'Mu;', + 'Ntilde;', + 'Ntilde', + 'Nu;', + 'OElig;', + 'Oacute;', + 'Oacute', + 'Ocirc;', + 'Ocirc', + 'Ograve;', + 'Ograve', + 'Omega;', + 'Omicron;', + 'Oslash;', + 'Oslash', + 'Otilde;', + 'Otilde', + 'Ouml;', + 'Ouml', + 'Phi;', + 'Pi;', + 'Prime;', + 'Psi;', + 'QUOT;', + 'QUOT', + 'REG;', + 'REG', + 'Rho;', + 'Scaron;', + 'Sigma;', + 'THORN;', + 'THORN', + 'TRADE;', + 'Tau;', + 'Theta;', + 'Uacute;', + 'Uacute', + 'Ucirc;', + 'Ucirc', + 'Ugrave;', + 'Ugrave', + 'Upsilon;', + 'Uuml;', + 'Uuml', + 'Xi;', + 'Yacute;', + 'Yacute', + 'Yuml;', + 'Zeta;', + 'aacute;', + 'aacute', + 'acirc;', + 'acirc', + 'acute;', + 'acute', + 'aelig;', + 'aelig', + 'agrave;', + 'agrave', + 'alefsym;', + 'alpha;', + 'amp;', + 'amp', + 'and;', + 'ang;', + 'apos;', + 'aring;', + 'aring', + 'asymp;', + 'atilde;', + 'atilde', + 'auml;', + 'auml', + 'bdquo;', + 'beta;', + 'brvbar;', + 'brvbar', + 'bull;', + 'cap;', + 'ccedil;', + 'ccedil', + 'cedil;', + 'cedil', + 'cent;', + 'cent', + 'chi;', + 'circ;', + 'clubs;', + 'cong;', + 'copy;', + 'copy', + 'crarr;', + 'cup;', + 'curren;', + 'curren', + 'dArr;', + 'dagger;', + 'darr;', + 'deg;', + 'deg', + 'delta;', + 'diams;', + 'divide;', + 'divide', + 'eacute;', + 'eacute', + 'ecirc;', + 'ecirc', + 'egrave;', + 'egrave', + 'empty;', + 'emsp;', + 'ensp;', + 'epsilon;', + 'equiv;', + 'eta;', + 'eth;', + 'eth', + 'euml;', + 'euml', + 'euro;', + 'exist;', + 'fnof;', + 'forall;', + 'frac12;', + 'frac12', + 'frac14;', + 'frac14', + 'frac34;', + 'frac34', + 'frasl;', + 'gamma;', + 'ge;', + 'gt;', + 'gt', + 'hArr;', + 'harr;', + 'hearts;', + 'hellip;', + 'iacute;', + 'iacute', + 'icirc;', + 'icirc', + 'iexcl;', + 'iexcl', + 'igrave;', + 'igrave', + 'image;', + 'infin;', + 'int;', + 'iota;', + 'iquest;', + 'iquest', + 'isin;', + 'iuml;', + 'iuml', + 'kappa;', + 'lArr;', + 'lambda;', + 'lang;', + 'laquo;', + 'laquo', + 'larr;', + 'lceil;', + 'ldquo;', + 'le;', + 'lfloor;', + 'lowast;', + 'loz;', + 'lrm;', + 'lsaquo;', + 'lsquo;', + 'lt;', + 'lt', + 'macr;', + 'macr', + 'mdash;', + 'micro;', + 'micro', + 'middot;', + 'middot', + 'minus;', + 'mu;', + 'nabla;', + 'nbsp;', + 'nbsp', + 'ndash;', + 'ne;', + 'ni;', + 'not;', + 'not', + 'notin;', + 'nsub;', + 'ntilde;', + 'ntilde', + 'nu;', + 'oacute;', + 'oacute', + 'ocirc;', + 'ocirc', + 'oelig;', + 'ograve;', + 'ograve', + 'oline;', + 'omega;', + 'omicron;', + 'oplus;', + 'or;', + 'ordf;', + 'ordf', + 'ordm;', + 'ordm', + 'oslash;', + 'oslash', + 'otilde;', + 'otilde', + 'otimes;', + 'ouml;', + 'ouml', + 'para;', + 'para', + 'part;', + 'permil;', + 'perp;', + 'phi;', + 'pi;', + 'piv;', + 'plusmn;', + 'plusmn', + 'pound;', + 'pound', + 'prime;', + 'prod;', + 'prop;', + 'psi;', + 'quot;', + 'quot', + 'rArr;', + 'radic;', + 'rang;', + 'raquo;', + 'raquo', + 'rarr;', + 'rceil;', + 'rdquo;', + 'real;', + 'reg;', + 'reg', + 'rfloor;', + 'rho;', + 'rlm;', + 'rsaquo;', + 'rsquo;', + 'sbquo;', + 'scaron;', + 'sdot;', + 'sect;', + 'sect', + 'shy;', + 'shy', + 'sigma;', + 'sigmaf;', + 'sim;', + 'spades;', + 'sub;', + 'sube;', + 'sum;', + 'sup1;', + 'sup1', + 'sup2;', + 'sup2', + 'sup3;', + 'sup3', + 'sup;', + 'supe;', + 'szlig;', + 'szlig', + 'tau;', + 'there4;', + 'theta;', + 'thetasym;', + 'thinsp;', + 'thorn;', + 'thorn', + 'tilde;', + 'times;', + 'times', + 'trade;', + 'uArr;', + 'uacute;', + 'uacute', + 'uarr;', + 'ucirc;', + 'ucirc', + 'ugrave;', + 'ugrave', + 'uml;', + 'uml', + 'upsih;', + 'upsilon;', + 'uuml;', + 'uuml', + 'weierp;', + 'xi;', + 'yacute;', + 'yacute', + 'yen;', + 'yen', + 'yuml;', + 'yuml', + 'zeta;', + 'zwj;', + 'zwnj;' + ); + + const PCDATA = 0; + const RCDATA = 1; + const CDATA = 2; + const PLAINTEXT = 3; + + const DOCTYPE = 0; + const STARTTAG = 1; + const ENDTAG = 2; + const COMMENT = 3; + const CHARACTR = 4; + const EOF = 5; + + public function __construct($data) + { + $this->data = $data; + $this->char = -1; + $this->EOF = strlen($data); + $this->tree = new HTML5TreeConstructer; + $this->content_model = self::PCDATA; + + $this->state = 'data'; + + while ($this->state !== null) { + $this->{$this->state . 'State'}(); + } + } + + public function save() + { + return $this->tree->save(); + } + + private function char() + { + return ($this->char < $this->EOF) + ? $this->data[$this->char] + : false; + } + + private function character($s, $l = 0) + { + if ($s + $l < $this->EOF) { + if ($l === 0) { + return $this->data[$s]; + } else { + return substr($this->data, $s, $l); + } + } + } + + private function characters($char_class, $start) + { + return preg_replace('#^([' . $char_class . ']+).*#s', '\\1', substr($this->data, $start)); + } + + private function dataState() + { + // Consume the next input character + $this->char++; + $char = $this->char(); + + if ($char === '&' && ($this->content_model === self::PCDATA || $this->content_model === self::RCDATA)) { + /* U+0026 AMPERSAND (&) + When the content model flag is set to one of the PCDATA or RCDATA + states: switch to the entity data state. Otherwise: treat it as per + the "anything else" entry below. */ + $this->state = 'entityData'; + + } elseif ($char === '-') { + /* If the content model flag is set to either the RCDATA state or + the CDATA state, and the escape flag is false, and there are at + least three characters before this one in the input stream, and the + last four characters in the input stream, including this one, are + U+003C LESS-THAN SIGN, U+0021 EXCLAMATION MARK, U+002D HYPHEN-MINUS, + and U+002D HYPHEN-MINUS (""), + set the escape flag to false. */ + if (($this->content_model === self::RCDATA || + $this->content_model === self::CDATA) && $this->escape === true && + $this->character($this->char, 3) === '-->' + ) { + $this->escape = false; + } + + /* In any case, emit the input character as a character token. + Stay in the data state. */ + $this->emitToken( + array( + 'type' => self::CHARACTR, + 'data' => $char + ) + ); + + } elseif ($this->char === $this->EOF) { + /* EOF + Emit an end-of-file token. */ + $this->EOF(); + + } elseif ($this->content_model === self::PLAINTEXT) { + /* When the content model flag is set to the PLAINTEXT state + THIS DIFFERS GREATLY FROM THE SPEC: Get the remaining characters of + the text and emit it as a character token. */ + $this->emitToken( + array( + 'type' => self::CHARACTR, + 'data' => substr($this->data, $this->char) + ) + ); + + $this->EOF(); + + } else { + /* Anything else + THIS DIFFERS GREATLY FROM THE SPEC: Get as many character that + otherwise would also be treated as a character token and emit it + as a single character token. Stay in the data state. */ + $len = strcspn($this->data, '<&', $this->char); + $char = substr($this->data, $this->char, $len); + $this->char += $len - 1; + + $this->emitToken( + array( + 'type' => self::CHARACTR, + 'data' => $char + ) + ); + + $this->state = 'data'; + } + } + + private function entityDataState() + { + // Attempt to consume an entity. + $entity = $this->entity(); + + // If nothing is returned, emit a U+0026 AMPERSAND character token. + // Otherwise, emit the character token that was returned. + $char = (!$entity) ? '&' : $entity; + $this->emitToken( + array( + 'type' => self::CHARACTR, + 'data' => $char + ) + ); + + // Finally, switch to the data state. + $this->state = 'data'; + } + + private function tagOpenState() + { + switch ($this->content_model) { + case self::RCDATA: + case self::CDATA: + /* If the next input character is a U+002F SOLIDUS (/) character, + consume it and switch to the close tag open state. If the next + input character is not a U+002F SOLIDUS (/) character, emit a + U+003C LESS-THAN SIGN character token and switch to the data + state to process the next input character. */ + if ($this->character($this->char + 1) === '/') { + $this->char++; + $this->state = 'closeTagOpen'; + + } else { + $this->emitToken( + array( + 'type' => self::CHARACTR, + 'data' => '<' + ) + ); + + $this->state = 'data'; + } + break; + + case self::PCDATA: + // If the content model flag is set to the PCDATA state + // Consume the next input character: + $this->char++; + $char = $this->char(); + + if ($char === '!') { + /* U+0021 EXCLAMATION MARK (!) + Switch to the markup declaration open state. */ + $this->state = 'markupDeclarationOpen'; + + } elseif ($char === '/') { + /* U+002F SOLIDUS (/) + Switch to the close tag open state. */ + $this->state = 'closeTagOpen'; + + } elseif (preg_match('/^[A-Za-z]$/', $char)) { + /* U+0041 LATIN LETTER A through to U+005A LATIN LETTER Z + Create a new start tag token, set its tag name to the lowercase + version of the input character (add 0x0020 to the character's code + point), then switch to the tag name state. (Don't emit the token + yet; further details will be filled in before it is emitted.) */ + $this->token = array( + 'name' => strtolower($char), + 'type' => self::STARTTAG, + 'attr' => array() + ); + + $this->state = 'tagName'; + + } elseif ($char === '>') { + /* U+003E GREATER-THAN SIGN (>) + Parse error. Emit a U+003C LESS-THAN SIGN character token and a + U+003E GREATER-THAN SIGN character token. Switch to the data state. */ + $this->emitToken( + array( + 'type' => self::CHARACTR, + 'data' => '<>' + ) + ); + + $this->state = 'data'; + + } elseif ($char === '?') { + /* U+003F QUESTION MARK (?) + Parse error. Switch to the bogus comment state. */ + $this->state = 'bogusComment'; + + } else { + /* Anything else + Parse error. Emit a U+003C LESS-THAN SIGN character token and + reconsume the current input character in the data state. */ + $this->emitToken( + array( + 'type' => self::CHARACTR, + 'data' => '<' + ) + ); + + $this->char--; + $this->state = 'data'; + } + break; + } + } + + private function closeTagOpenState() + { + $next_node = strtolower($this->characters('A-Za-z', $this->char + 1)); + $the_same = count($this->tree->stack) > 0 && $next_node === end($this->tree->stack)->nodeName; + + if (($this->content_model === self::RCDATA || $this->content_model === self::CDATA) && + (!$the_same || ($the_same && (!preg_match( + '/[\t\n\x0b\x0c >\/]/', + $this->character($this->char + 1 + strlen($next_node)) + ) || $this->EOF === $this->char))) + ) { + /* If the content model flag is set to the RCDATA or CDATA states then + examine the next few characters. If they do not match the tag name of + the last start tag token emitted (case insensitively), or if they do but + they are not immediately followed by one of the following characters: + * U+0009 CHARACTER TABULATION + * U+000A LINE FEED (LF) + * U+000B LINE TABULATION + * U+000C FORM FEED (FF) + * U+0020 SPACE + * U+003E GREATER-THAN SIGN (>) + * U+002F SOLIDUS (/) + * EOF + ...then there is a parse error. Emit a U+003C LESS-THAN SIGN character + token, a U+002F SOLIDUS character token, and switch to the data state + to process the next input character. */ + $this->emitToken( + array( + 'type' => self::CHARACTR, + 'data' => 'state = 'data'; + + } else { + /* Otherwise, if the content model flag is set to the PCDATA state, + or if the next few characters do match that tag name, consume the + next input character: */ + $this->char++; + $char = $this->char(); + + if (preg_match('/^[A-Za-z]$/', $char)) { + /* U+0041 LATIN LETTER A through to U+005A LATIN LETTER Z + Create a new end tag token, set its tag name to the lowercase version + of the input character (add 0x0020 to the character's code point), then + switch to the tag name state. (Don't emit the token yet; further details + will be filled in before it is emitted.) */ + $this->token = array( + 'name' => strtolower($char), + 'type' => self::ENDTAG + ); + + $this->state = 'tagName'; + + } elseif ($char === '>') { + /* U+003E GREATER-THAN SIGN (>) + Parse error. Switch to the data state. */ + $this->state = 'data'; + + } elseif ($this->char === $this->EOF) { + /* EOF + Parse error. Emit a U+003C LESS-THAN SIGN character token and a U+002F + SOLIDUS character token. Reconsume the EOF character in the data state. */ + $this->emitToken( + array( + 'type' => self::CHARACTR, + 'data' => 'char--; + $this->state = 'data'; + + } else { + /* Parse error. Switch to the bogus comment state. */ + $this->state = 'bogusComment'; + } + } + } + + private function tagNameState() + { + // Consume the next input character: + $this->char++; + $char = $this->character($this->char); + + if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { + /* U+0009 CHARACTER TABULATION + U+000A LINE FEED (LF) + U+000B LINE TABULATION + U+000C FORM FEED (FF) + U+0020 SPACE + Switch to the before attribute name state. */ + $this->state = 'beforeAttributeName'; + + } elseif ($char === '>') { + /* U+003E GREATER-THAN SIGN (>) + Emit the current tag token. Switch to the data state. */ + $this->emitToken($this->token); + $this->state = 'data'; + + } elseif ($this->char === $this->EOF) { + /* EOF + Parse error. Emit the current tag token. Reconsume the EOF + character in the data state. */ + $this->emitToken($this->token); + + $this->char--; + $this->state = 'data'; + + } elseif ($char === '/') { + /* U+002F SOLIDUS (/) + Parse error unless this is a permitted slash. Switch to the before + attribute name state. */ + $this->state = 'beforeAttributeName'; + + } else { + /* Anything else + Append the current input character to the current tag token's tag name. + Stay in the tag name state. */ + $this->token['name'] .= strtolower($char); + $this->state = 'tagName'; + } + } + + private function beforeAttributeNameState() + { + // Consume the next input character: + $this->char++; + $char = $this->character($this->char); + + if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { + /* U+0009 CHARACTER TABULATION + U+000A LINE FEED (LF) + U+000B LINE TABULATION + U+000C FORM FEED (FF) + U+0020 SPACE + Stay in the before attribute name state. */ + $this->state = 'beforeAttributeName'; + + } elseif ($char === '>') { + /* U+003E GREATER-THAN SIGN (>) + Emit the current tag token. Switch to the data state. */ + $this->emitToken($this->token); + $this->state = 'data'; + + } elseif ($char === '/') { + /* U+002F SOLIDUS (/) + Parse error unless this is a permitted slash. Stay in the before + attribute name state. */ + $this->state = 'beforeAttributeName'; + + } elseif ($this->char === $this->EOF) { + /* EOF + Parse error. Emit the current tag token. Reconsume the EOF + character in the data state. */ + $this->emitToken($this->token); + + $this->char--; + $this->state = 'data'; + + } else { + /* Anything else + Start a new attribute in the current tag token. Set that attribute's + name to the current input character, and its value to the empty string. + Switch to the attribute name state. */ + $this->token['attr'][] = array( + 'name' => strtolower($char), + 'value' => null + ); + + $this->state = 'attributeName'; + } + } + + private function attributeNameState() + { + // Consume the next input character: + $this->char++; + $char = $this->character($this->char); + + if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { + /* U+0009 CHARACTER TABULATION + U+000A LINE FEED (LF) + U+000B LINE TABULATION + U+000C FORM FEED (FF) + U+0020 SPACE + Stay in the before attribute name state. */ + $this->state = 'afterAttributeName'; + + } elseif ($char === '=') { + /* U+003D EQUALS SIGN (=) + Switch to the before attribute value state. */ + $this->state = 'beforeAttributeValue'; + + } elseif ($char === '>') { + /* U+003E GREATER-THAN SIGN (>) + Emit the current tag token. Switch to the data state. */ + $this->emitToken($this->token); + $this->state = 'data'; + + } elseif ($char === '/' && $this->character($this->char + 1) !== '>') { + /* U+002F SOLIDUS (/) + Parse error unless this is a permitted slash. Switch to the before + attribute name state. */ + $this->state = 'beforeAttributeName'; + + } elseif ($this->char === $this->EOF) { + /* EOF + Parse error. Emit the current tag token. Reconsume the EOF + character in the data state. */ + $this->emitToken($this->token); + + $this->char--; + $this->state = 'data'; + + } else { + /* Anything else + Append the current input character to the current attribute's name. + Stay in the attribute name state. */ + $last = count($this->token['attr']) - 1; + $this->token['attr'][$last]['name'] .= strtolower($char); + + $this->state = 'attributeName'; + } + } + + private function afterAttributeNameState() + { + // Consume the next input character: + $this->char++; + $char = $this->character($this->char); + + if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { + /* U+0009 CHARACTER TABULATION + U+000A LINE FEED (LF) + U+000B LINE TABULATION + U+000C FORM FEED (FF) + U+0020 SPACE + Stay in the after attribute name state. */ + $this->state = 'afterAttributeName'; + + } elseif ($char === '=') { + /* U+003D EQUALS SIGN (=) + Switch to the before attribute value state. */ + $this->state = 'beforeAttributeValue'; + + } elseif ($char === '>') { + /* U+003E GREATER-THAN SIGN (>) + Emit the current tag token. Switch to the data state. */ + $this->emitToken($this->token); + $this->state = 'data'; + + } elseif ($char === '/' && $this->character($this->char + 1) !== '>') { + /* U+002F SOLIDUS (/) + Parse error unless this is a permitted slash. Switch to the + before attribute name state. */ + $this->state = 'beforeAttributeName'; + + } elseif ($this->char === $this->EOF) { + /* EOF + Parse error. Emit the current tag token. Reconsume the EOF + character in the data state. */ + $this->emitToken($this->token); + + $this->char--; + $this->state = 'data'; + + } else { + /* Anything else + Start a new attribute in the current tag token. Set that attribute's + name to the current input character, and its value to the empty string. + Switch to the attribute name state. */ + $this->token['attr'][] = array( + 'name' => strtolower($char), + 'value' => null + ); + + $this->state = 'attributeName'; + } + } + + private function beforeAttributeValueState() + { + // Consume the next input character: + $this->char++; + $char = $this->character($this->char); + + if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { + /* U+0009 CHARACTER TABULATION + U+000A LINE FEED (LF) + U+000B LINE TABULATION + U+000C FORM FEED (FF) + U+0020 SPACE + Stay in the before attribute value state. */ + $this->state = 'beforeAttributeValue'; + + } elseif ($char === '"') { + /* U+0022 QUOTATION MARK (") + Switch to the attribute value (double-quoted) state. */ + $this->state = 'attributeValueDoubleQuoted'; + + } elseif ($char === '&') { + /* U+0026 AMPERSAND (&) + Switch to the attribute value (unquoted) state and reconsume + this input character. */ + $this->char--; + $this->state = 'attributeValueUnquoted'; + + } elseif ($char === '\'') { + /* U+0027 APOSTROPHE (') + Switch to the attribute value (single-quoted) state. */ + $this->state = 'attributeValueSingleQuoted'; + + } elseif ($char === '>') { + /* U+003E GREATER-THAN SIGN (>) + Emit the current tag token. Switch to the data state. */ + $this->emitToken($this->token); + $this->state = 'data'; + + } else { + /* Anything else + Append the current input character to the current attribute's value. + Switch to the attribute value (unquoted) state. */ + $last = count($this->token['attr']) - 1; + $this->token['attr'][$last]['value'] .= $char; + + $this->state = 'attributeValueUnquoted'; + } + } + + private function attributeValueDoubleQuotedState() + { + // Consume the next input character: + $this->char++; + $char = $this->character($this->char); + + if ($char === '"') { + /* U+0022 QUOTATION MARK (") + Switch to the before attribute name state. */ + $this->state = 'beforeAttributeName'; + + } elseif ($char === '&') { + /* U+0026 AMPERSAND (&) + Switch to the entity in attribute value state. */ + $this->entityInAttributeValueState('double'); + + } elseif ($this->char === $this->EOF) { + /* EOF + Parse error. Emit the current tag token. Reconsume the character + in the data state. */ + $this->emitToken($this->token); + + $this->char--; + $this->state = 'data'; + + } else { + /* Anything else + Append the current input character to the current attribute's value. + Stay in the attribute value (double-quoted) state. */ + $last = count($this->token['attr']) - 1; + $this->token['attr'][$last]['value'] .= $char; + + $this->state = 'attributeValueDoubleQuoted'; + } + } + + private function attributeValueSingleQuotedState() + { + // Consume the next input character: + $this->char++; + $char = $this->character($this->char); + + if ($char === '\'') { + /* U+0022 QUOTATION MARK (') + Switch to the before attribute name state. */ + $this->state = 'beforeAttributeName'; + + } elseif ($char === '&') { + /* U+0026 AMPERSAND (&) + Switch to the entity in attribute value state. */ + $this->entityInAttributeValueState('single'); + + } elseif ($this->char === $this->EOF) { + /* EOF + Parse error. Emit the current tag token. Reconsume the character + in the data state. */ + $this->emitToken($this->token); + + $this->char--; + $this->state = 'data'; + + } else { + /* Anything else + Append the current input character to the current attribute's value. + Stay in the attribute value (single-quoted) state. */ + $last = count($this->token['attr']) - 1; + $this->token['attr'][$last]['value'] .= $char; + + $this->state = 'attributeValueSingleQuoted'; + } + } + + private function attributeValueUnquotedState() + { + // Consume the next input character: + $this->char++; + $char = $this->character($this->char); + + if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { + /* U+0009 CHARACTER TABULATION + U+000A LINE FEED (LF) + U+000B LINE TABULATION + U+000C FORM FEED (FF) + U+0020 SPACE + Switch to the before attribute name state. */ + $this->state = 'beforeAttributeName'; + + } elseif ($char === '&') { + /* U+0026 AMPERSAND (&) + Switch to the entity in attribute value state. */ + $this->entityInAttributeValueState(); + + } elseif ($char === '>') { + /* U+003E GREATER-THAN SIGN (>) + Emit the current tag token. Switch to the data state. */ + $this->emitToken($this->token); + $this->state = 'data'; + + } else { + /* Anything else + Append the current input character to the current attribute's value. + Stay in the attribute value (unquoted) state. */ + $last = count($this->token['attr']) - 1; + $this->token['attr'][$last]['value'] .= $char; + + $this->state = 'attributeValueUnquoted'; + } + } + + private function entityInAttributeValueState() + { + // Attempt to consume an entity. + $entity = $this->entity(); + + // If nothing is returned, append a U+0026 AMPERSAND character to the + // current attribute's value. Otherwise, emit the character token that + // was returned. + $char = (!$entity) + ? '&' + : $entity; + + $last = count($this->token['attr']) - 1; + $this->token['attr'][$last]['value'] .= $char; + } + + private function bogusCommentState() + { + /* Consume every character up to the first U+003E GREATER-THAN SIGN + character (>) or the end of the file (EOF), whichever comes first. Emit + a comment token whose data is the concatenation of all the characters + starting from and including the character that caused the state machine + to switch into the bogus comment state, up to and including the last + consumed character before the U+003E character, if any, or up to the + end of the file otherwise. (If the comment was started by the end of + the file (EOF), the token is empty.) */ + $data = $this->characters('^>', $this->char); + $this->emitToken( + array( + 'data' => $data, + 'type' => self::COMMENT + ) + ); + + $this->char += strlen($data); + + /* Switch to the data state. */ + $this->state = 'data'; + + /* If the end of the file was reached, reconsume the EOF character. */ + if ($this->char === $this->EOF) { + $this->char = $this->EOF - 1; + } + } + + private function markupDeclarationOpenState() + { + /* If the next two characters are both U+002D HYPHEN-MINUS (-) + characters, consume those two characters, create a comment token whose + data is the empty string, and switch to the comment state. */ + if ($this->character($this->char + 1, 2) === '--') { + $this->char += 2; + $this->state = 'comment'; + $this->token = array( + 'data' => null, + 'type' => self::COMMENT + ); + + /* Otherwise if the next seven chacacters are a case-insensitive match + for the word "DOCTYPE", then consume those characters and switch to the + DOCTYPE state. */ + } elseif (strtolower($this->character($this->char + 1, 7)) === 'doctype') { + $this->char += 7; + $this->state = 'doctype'; + + /* Otherwise, is is a parse error. Switch to the bogus comment state. + The next character that is consumed, if any, is the first character + that will be in the comment. */ + } else { + $this->char++; + $this->state = 'bogusComment'; + } + } + + private function commentState() + { + /* Consume the next input character: */ + $this->char++; + $char = $this->char(); + + /* U+002D HYPHEN-MINUS (-) */ + if ($char === '-') { + /* Switch to the comment dash state */ + $this->state = 'commentDash'; + + /* EOF */ + } elseif ($this->char === $this->EOF) { + /* Parse error. Emit the comment token. Reconsume the EOF character + in the data state. */ + $this->emitToken($this->token); + $this->char--; + $this->state = 'data'; + + /* Anything else */ + } else { + /* Append the input character to the comment token's data. Stay in + the comment state. */ + $this->token['data'] .= $char; + } + } + + private function commentDashState() + { + /* Consume the next input character: */ + $this->char++; + $char = $this->char(); + + /* U+002D HYPHEN-MINUS (-) */ + if ($char === '-') { + /* Switch to the comment end state */ + $this->state = 'commentEnd'; + + /* EOF */ + } elseif ($this->char === $this->EOF) { + /* Parse error. Emit the comment token. Reconsume the EOF character + in the data state. */ + $this->emitToken($this->token); + $this->char--; + $this->state = 'data'; + + /* Anything else */ + } else { + /* Append a U+002D HYPHEN-MINUS (-) character and the input + character to the comment token's data. Switch to the comment state. */ + $this->token['data'] .= '-' . $char; + $this->state = 'comment'; + } + } + + private function commentEndState() + { + /* Consume the next input character: */ + $this->char++; + $char = $this->char(); + + if ($char === '>') { + $this->emitToken($this->token); + $this->state = 'data'; + + } elseif ($char === '-') { + $this->token['data'] .= '-'; + + } elseif ($this->char === $this->EOF) { + $this->emitToken($this->token); + $this->char--; + $this->state = 'data'; + + } else { + $this->token['data'] .= '--' . $char; + $this->state = 'comment'; + } + } + + private function doctypeState() + { + /* Consume the next input character: */ + $this->char++; + $char = $this->char(); + + if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { + $this->state = 'beforeDoctypeName'; + + } else { + $this->char--; + $this->state = 'beforeDoctypeName'; + } + } + + private function beforeDoctypeNameState() + { + /* Consume the next input character: */ + $this->char++; + $char = $this->char(); + + if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { + // Stay in the before DOCTYPE name state. + + } elseif (preg_match('/^[a-z]$/', $char)) { + $this->token = array( + 'name' => strtoupper($char), + 'type' => self::DOCTYPE, + 'error' => true + ); + + $this->state = 'doctypeName'; + + } elseif ($char === '>') { + $this->emitToken( + array( + 'name' => null, + 'type' => self::DOCTYPE, + 'error' => true + ) + ); + + $this->state = 'data'; + + } elseif ($this->char === $this->EOF) { + $this->emitToken( + array( + 'name' => null, + 'type' => self::DOCTYPE, + 'error' => true + ) + ); + + $this->char--; + $this->state = 'data'; + + } else { + $this->token = array( + 'name' => $char, + 'type' => self::DOCTYPE, + 'error' => true + ); + + $this->state = 'doctypeName'; + } + } + + private function doctypeNameState() + { + /* Consume the next input character: */ + $this->char++; + $char = $this->char(); + + if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { + $this->state = 'AfterDoctypeName'; + + } elseif ($char === '>') { + $this->emitToken($this->token); + $this->state = 'data'; + + } elseif (preg_match('/^[a-z]$/', $char)) { + $this->token['name'] .= strtoupper($char); + + } elseif ($this->char === $this->EOF) { + $this->emitToken($this->token); + $this->char--; + $this->state = 'data'; + + } else { + $this->token['name'] .= $char; + } + + $this->token['error'] = ($this->token['name'] === 'HTML') + ? false + : true; + } + + private function afterDoctypeNameState() + { + /* Consume the next input character: */ + $this->char++; + $char = $this->char(); + + if (preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { + // Stay in the DOCTYPE name state. + + } elseif ($char === '>') { + $this->emitToken($this->token); + $this->state = 'data'; + + } elseif ($this->char === $this->EOF) { + $this->emitToken($this->token); + $this->char--; + $this->state = 'data'; + + } else { + $this->token['error'] = true; + $this->state = 'bogusDoctype'; + } + } + + private function bogusDoctypeState() + { + /* Consume the next input character: */ + $this->char++; + $char = $this->char(); + + if ($char === '>') { + $this->emitToken($this->token); + $this->state = 'data'; + + } elseif ($this->char === $this->EOF) { + $this->emitToken($this->token); + $this->char--; + $this->state = 'data'; + + } else { + // Stay in the bogus DOCTYPE state. + } + } + + private function entity() + { + $start = $this->char; + + // This section defines how to consume an entity. This definition is + // used when parsing entities in text and in attributes. + + // The behaviour depends on the identity of the next character (the + // one immediately after the U+0026 AMPERSAND character): + + switch ($this->character($this->char + 1)) { + // U+0023 NUMBER SIGN (#) + case '#': + + // The behaviour further depends on the character after the + // U+0023 NUMBER SIGN: + switch ($this->character($this->char + 1)) { + // U+0078 LATIN SMALL LETTER X + // U+0058 LATIN CAPITAL LETTER X + case 'x': + case 'X': + // Follow the steps below, but using the range of + // characters U+0030 DIGIT ZERO through to U+0039 DIGIT + // NINE, U+0061 LATIN SMALL LETTER A through to U+0066 + // LATIN SMALL LETTER F, and U+0041 LATIN CAPITAL LETTER + // A, through to U+0046 LATIN CAPITAL LETTER F (in other + // words, 0-9, A-F, a-f). + $char = 1; + $char_class = '0-9A-Fa-f'; + break; + + // Anything else + default: + // Follow the steps below, but using the range of + // characters U+0030 DIGIT ZERO through to U+0039 DIGIT + // NINE (i.e. just 0-9). + $char = 0; + $char_class = '0-9'; + break; + } + + // Consume as many characters as match the range of characters + // given above. + $this->char++; + $e_name = $this->characters($char_class, $this->char + $char + 1); + $entity = $this->character($start, $this->char); + $cond = strlen($e_name) > 0; + + // The rest of the parsing happens bellow. + break; + + // Anything else + default: + // Consume the maximum number of characters possible, with the + // consumed characters case-sensitively matching one of the + // identifiers in the first column of the entities table. + $e_name = $this->characters('0-9A-Za-z;', $this->char + 1); + $len = strlen($e_name); + + for ($c = 1; $c <= $len; $c++) { + $id = substr($e_name, 0, $c); + $this->char++; + + if (in_array($id, $this->entities)) { + if ($e_name[$c - 1] !== ';') { + if ($c < $len && $e_name[$c] == ';') { + $this->char++; // consume extra semicolon + } + } + $entity = $id; + break; + } + } + + $cond = isset($entity); + // The rest of the parsing happens bellow. + break; + } + + if (!$cond) { + // If no match can be made, then this is a parse error. No + // characters are consumed, and nothing is returned. + $this->char = $start; + return false; + } + + // Return a character token for the character corresponding to the + // entity name (as given by the second column of the entities table). + return html_entity_decode('&' . $entity . ';', ENT_QUOTES, 'UTF-8'); + } + + private function emitToken($token) + { + $emit = $this->tree->emitToken($token); + + if (is_int($emit)) { + $this->content_model = $emit; + + } elseif ($token['type'] === self::ENDTAG) { + $this->content_model = self::PCDATA; + } + } + + private function EOF() + { + $this->state = null; + $this->tree->emitToken( + array( + 'type' => self::EOF + ) + ); + } +} + +class HTML5TreeConstructer +{ + public $stack = array(); + + private $phase; + private $mode; + private $dom; + private $foster_parent = null; + private $a_formatting = array(); + + private $head_pointer = null; + private $form_pointer = null; + + private $scoping = array('button', 'caption', 'html', 'marquee', 'object', 'table', 'td', 'th'); + private $formatting = array( + 'a', + 'b', + 'big', + 'em', + 'font', + 'i', + 'nobr', + 's', + 'small', + 'strike', + 'strong', + 'tt', + 'u' + ); + private $special = array( + 'address', + 'area', + 'base', + 'basefont', + 'bgsound', + 'blockquote', + 'body', + 'br', + 'center', + 'col', + 'colgroup', + 'dd', + 'dir', + 'div', + 'dl', + 'dt', + 'embed', + 'fieldset', + 'form', + 'frame', + 'frameset', + 'h1', + 'h2', + 'h3', + 'h4', + 'h5', + 'h6', + 'head', + 'hr', + 'iframe', + 'image', + 'img', + 'input', + 'isindex', + 'li', + 'link', + 'listing', + 'menu', + 'meta', + 'noembed', + 'noframes', + 'noscript', + 'ol', + 'optgroup', + 'option', + 'p', + 'param', + 'plaintext', + 'pre', + 'script', + 'select', + 'spacer', + 'style', + 'tbody', + 'textarea', + 'tfoot', + 'thead', + 'title', + 'tr', + 'ul', + 'wbr' + ); + + // The different phases. + const INIT_PHASE = 0; + const ROOT_PHASE = 1; + const MAIN_PHASE = 2; + const END_PHASE = 3; + + // The different insertion modes for the main phase. + const BEFOR_HEAD = 0; + const IN_HEAD = 1; + const AFTER_HEAD = 2; + const IN_BODY = 3; + const IN_TABLE = 4; + const IN_CAPTION = 5; + const IN_CGROUP = 6; + const IN_TBODY = 7; + const IN_ROW = 8; + const IN_CELL = 9; + const IN_SELECT = 10; + const AFTER_BODY = 11; + const IN_FRAME = 12; + const AFTR_FRAME = 13; + + // The different types of elements. + const SPECIAL = 0; + const SCOPING = 1; + const FORMATTING = 2; + const PHRASING = 3; + + const MARKER = 0; + + public function __construct() + { + $this->phase = self::INIT_PHASE; + $this->mode = self::BEFOR_HEAD; + $this->dom = new DOMDocument; + + $this->dom->encoding = 'UTF-8'; + $this->dom->preserveWhiteSpace = true; + $this->dom->substituteEntities = true; + $this->dom->strictErrorChecking = false; + } + + // Process tag tokens + public function emitToken($token) + { + switch ($this->phase) { + case self::INIT_PHASE: + return $this->initPhase($token); + break; + case self::ROOT_PHASE: + return $this->rootElementPhase($token); + break; + case self::MAIN_PHASE: + return $this->mainPhase($token); + break; + case self::END_PHASE : + return $this->trailingEndPhase($token); + break; + } + } + + private function initPhase($token) + { + /* Initially, the tree construction stage must handle each token + emitted from the tokenisation stage as follows: */ + + /* A DOCTYPE token that is marked as being in error + A comment token + A start tag token + An end tag token + A character token that is not one of one of U+0009 CHARACTER TABULATION, + U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), + or U+0020 SPACE + An end-of-file token */ + if ((isset($token['error']) && $token['error']) || + $token['type'] === HTML5::COMMENT || + $token['type'] === HTML5::STARTTAG || + $token['type'] === HTML5::ENDTAG || + $token['type'] === HTML5::EOF || + ($token['type'] === HTML5::CHARACTR && isset($token['data']) && + !preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) + ) { + /* This specification does not define how to handle this case. In + particular, user agents may ignore the entirety of this specification + altogether for such documents, and instead invoke special parse modes + with a greater emphasis on backwards compatibility. */ + + $this->phase = self::ROOT_PHASE; + return $this->rootElementPhase($token); + + /* A DOCTYPE token marked as being correct */ + } elseif (isset($token['error']) && !$token['error']) { + /* Append a DocumentType node to the Document node, with the name + attribute set to the name given in the DOCTYPE token (which will be + "HTML"), and the other attributes specific to DocumentType objects + set to null, empty lists, or the empty string as appropriate. */ + $doctype = new DOMDocumentType(null, null, 'HTML'); + + /* Then, switch to the root element phase of the tree construction + stage. */ + $this->phase = self::ROOT_PHASE; + + /* A character token that is one of one of U+0009 CHARACTER TABULATION, + U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), + or U+0020 SPACE */ + } elseif (isset($token['data']) && preg_match( + '/^[\t\n\x0b\x0c ]+$/', + $token['data'] + ) + ) { + /* Append that character to the Document node. */ + $text = $this->dom->createTextNode($token['data']); + $this->dom->appendChild($text); + } + } + + private function rootElementPhase($token) + { + /* After the initial phase, as each token is emitted from the tokenisation + stage, it must be processed as described in this section. */ + + /* A DOCTYPE token */ + if ($token['type'] === HTML5::DOCTYPE) { + // Parse error. Ignore the token. + + /* A comment token */ + } elseif ($token['type'] === HTML5::COMMENT) { + /* Append a Comment node to the Document object with the data + attribute set to the data given in the comment token. */ + $comment = $this->dom->createComment($token['data']); + $this->dom->appendChild($comment); + + /* A character token that is one of one of U+0009 CHARACTER TABULATION, + U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), + or U+0020 SPACE */ + } elseif ($token['type'] === HTML5::CHARACTR && + preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data']) + ) { + /* Append that character to the Document node. */ + $text = $this->dom->createTextNode($token['data']); + $this->dom->appendChild($text); + + /* A character token that is not one of U+0009 CHARACTER TABULATION, + U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED + (FF), or U+0020 SPACE + A start tag token + An end tag token + An end-of-file token */ + } elseif (($token['type'] === HTML5::CHARACTR && + !preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) || + $token['type'] === HTML5::STARTTAG || + $token['type'] === HTML5::ENDTAG || + $token['type'] === HTML5::EOF + ) { + /* Create an HTMLElement node with the tag name html, in the HTML + namespace. Append it to the Document object. Switch to the main + phase and reprocess the current token. */ + $html = $this->dom->createElement('html'); + $this->dom->appendChild($html); + $this->stack[] = $html; + + $this->phase = self::MAIN_PHASE; + return $this->mainPhase($token); + } + } + + private function mainPhase($token) + { + /* Tokens in the main phase must be handled as follows: */ + + /* A DOCTYPE token */ + if ($token['type'] === HTML5::DOCTYPE) { + // Parse error. Ignore the token. + + /* A start tag token with the tag name "html" */ + } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'html') { + /* If this start tag token was not the first start tag token, then + it is a parse error. */ + + /* For each attribute on the token, check to see if the attribute + is already present on the top element of the stack of open elements. + If it is not, add the attribute and its corresponding value to that + element. */ + foreach ($token['attr'] as $attr) { + if (!$this->stack[0]->hasAttribute($attr['name'])) { + $this->stack[0]->setAttribute($attr['name'], $attr['value']); + } + } + + /* An end-of-file token */ + } elseif ($token['type'] === HTML5::EOF) { + /* Generate implied end tags. */ + $this->generateImpliedEndTags(); + + /* Anything else. */ + } else { + /* Depends on the insertion mode: */ + switch ($this->mode) { + case self::BEFOR_HEAD: + return $this->beforeHead($token); + break; + case self::IN_HEAD: + return $this->inHead($token); + break; + case self::AFTER_HEAD: + return $this->afterHead($token); + break; + case self::IN_BODY: + return $this->inBody($token); + break; + case self::IN_TABLE: + return $this->inTable($token); + break; + case self::IN_CAPTION: + return $this->inCaption($token); + break; + case self::IN_CGROUP: + return $this->inColumnGroup($token); + break; + case self::IN_TBODY: + return $this->inTableBody($token); + break; + case self::IN_ROW: + return $this->inRow($token); + break; + case self::IN_CELL: + return $this->inCell($token); + break; + case self::IN_SELECT: + return $this->inSelect($token); + break; + case self::AFTER_BODY: + return $this->afterBody($token); + break; + case self::IN_FRAME: + return $this->inFrameset($token); + break; + case self::AFTR_FRAME: + return $this->afterFrameset($token); + break; + case self::END_PHASE: + return $this->trailingEndPhase($token); + break; + } + } + } + + private function beforeHead($token) + { + /* Handle the token as follows: */ + + /* A character token that is one of one of U+0009 CHARACTER TABULATION, + U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), + or U+0020 SPACE */ + if ($token['type'] === HTML5::CHARACTR && + preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data']) + ) { + /* Append the character to the current node. */ + $this->insertText($token['data']); + + /* A comment token */ + } elseif ($token['type'] === HTML5::COMMENT) { + /* Append a Comment node to the current node with the data attribute + set to the data given in the comment token. */ + $this->insertComment($token['data']); + + /* A start tag token with the tag name "head" */ + } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'head') { + /* Create an element for the token, append the new element to the + current node and push it onto the stack of open elements. */ + $element = $this->insertElement($token); + + /* Set the head element pointer to this new element node. */ + $this->head_pointer = $element; + + /* Change the insertion mode to "in head". */ + $this->mode = self::IN_HEAD; + + /* A start tag token whose tag name is one of: "base", "link", "meta", + "script", "style", "title". Or an end tag with the tag name "html". + Or a character token that is not one of U+0009 CHARACTER TABULATION, + U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), + or U+0020 SPACE. Or any other start tag token */ + } elseif ($token['type'] === HTML5::STARTTAG || + ($token['type'] === HTML5::ENDTAG && $token['name'] === 'html') || + ($token['type'] === HTML5::CHARACTR && !preg_match( + '/^[\t\n\x0b\x0c ]$/', + $token['data'] + )) + ) { + /* Act as if a start tag token with the tag name "head" and no + attributes had been seen, then reprocess the current token. */ + $this->beforeHead( + array( + 'name' => 'head', + 'type' => HTML5::STARTTAG, + 'attr' => array() + ) + ); + + return $this->inHead($token); + + /* Any other end tag */ + } elseif ($token['type'] === HTML5::ENDTAG) { + /* Parse error. Ignore the token. */ + } + } + + private function inHead($token) + { + /* Handle the token as follows: */ + + /* A character token that is one of one of U+0009 CHARACTER TABULATION, + U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), + or U+0020 SPACE. + + THIS DIFFERS FROM THE SPEC: If the current node is either a title, style + or script element, append the character to the current node regardless + of its content. */ + if (($token['type'] === HTML5::CHARACTR && + preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) || ( + $token['type'] === HTML5::CHARACTR && in_array( + end($this->stack)->nodeName, + array('title', 'style', 'script') + )) + ) { + /* Append the character to the current node. */ + $this->insertText($token['data']); + + /* A comment token */ + } elseif ($token['type'] === HTML5::COMMENT) { + /* Append a Comment node to the current node with the data attribute + set to the data given in the comment token. */ + $this->insertComment($token['data']); + + } elseif ($token['type'] === HTML5::ENDTAG && + in_array($token['name'], array('title', 'style', 'script')) + ) { + array_pop($this->stack); + return HTML5::PCDATA; + + /* A start tag with the tag name "title" */ + } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'title') { + /* Create an element for the token and append the new element to the + node pointed to by the head element pointer, or, if that is null + (innerHTML case), to the current node. */ + if ($this->head_pointer !== null) { + $element = $this->insertElement($token, false); + $this->head_pointer->appendChild($element); + + } else { + $element = $this->insertElement($token); + } + + /* Switch the tokeniser's content model flag to the RCDATA state. */ + return HTML5::RCDATA; + + /* A start tag with the tag name "style" */ + } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'style') { + /* Create an element for the token and append the new element to the + node pointed to by the head element pointer, or, if that is null + (innerHTML case), to the current node. */ + if ($this->head_pointer !== null) { + $element = $this->insertElement($token, false); + $this->head_pointer->appendChild($element); + + } else { + $this->insertElement($token); + } + + /* Switch the tokeniser's content model flag to the CDATA state. */ + return HTML5::CDATA; + + /* A start tag with the tag name "script" */ + } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'script') { + /* Create an element for the token. */ + $element = $this->insertElement($token, false); + $this->head_pointer->appendChild($element); + + /* Switch the tokeniser's content model flag to the CDATA state. */ + return HTML5::CDATA; + + /* A start tag with the tag name "base", "link", or "meta" */ + } elseif ($token['type'] === HTML5::STARTTAG && in_array( + $token['name'], + array('base', 'link', 'meta') + ) + ) { + /* Create an element for the token and append the new element to the + node pointed to by the head element pointer, or, if that is null + (innerHTML case), to the current node. */ + if ($this->head_pointer !== null) { + $element = $this->insertElement($token, false); + $this->head_pointer->appendChild($element); + array_pop($this->stack); + + } else { + $this->insertElement($token); + } + + /* An end tag with the tag name "head" */ + } elseif ($token['type'] === HTML5::ENDTAG && $token['name'] === 'head') { + /* If the current node is a head element, pop the current node off + the stack of open elements. */ + if ($this->head_pointer->isSameNode(end($this->stack))) { + array_pop($this->stack); + + /* Otherwise, this is a parse error. */ + } else { + // k + } + + /* Change the insertion mode to "after head". */ + $this->mode = self::AFTER_HEAD; + + /* A start tag with the tag name "head" or an end tag except "html". */ + } elseif (($token['type'] === HTML5::STARTTAG && $token['name'] === 'head') || + ($token['type'] === HTML5::ENDTAG && $token['name'] !== 'html') + ) { + // Parse error. Ignore the token. + + /* Anything else */ + } else { + /* If the current node is a head element, act as if an end tag + token with the tag name "head" had been seen. */ + if ($this->head_pointer->isSameNode(end($this->stack))) { + $this->inHead( + array( + 'name' => 'head', + 'type' => HTML5::ENDTAG + ) + ); + + /* Otherwise, change the insertion mode to "after head". */ + } else { + $this->mode = self::AFTER_HEAD; + } + + /* Then, reprocess the current token. */ + return $this->afterHead($token); + } + } + + private function afterHead($token) + { + /* Handle the token as follows: */ + + /* A character token that is one of one of U+0009 CHARACTER TABULATION, + U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), + or U+0020 SPACE */ + if ($token['type'] === HTML5::CHARACTR && + preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data']) + ) { + /* Append the character to the current node. */ + $this->insertText($token['data']); + + /* A comment token */ + } elseif ($token['type'] === HTML5::COMMENT) { + /* Append a Comment node to the current node with the data attribute + set to the data given in the comment token. */ + $this->insertComment($token['data']); + + /* A start tag token with the tag name "body" */ + } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'body') { + /* Insert a body element for the token. */ + $this->insertElement($token); + + /* Change the insertion mode to "in body". */ + $this->mode = self::IN_BODY; + + /* A start tag token with the tag name "frameset" */ + } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'frameset') { + /* Insert a frameset element for the token. */ + $this->insertElement($token); + + /* Change the insertion mode to "in frameset". */ + $this->mode = self::IN_FRAME; + + /* A start tag token whose tag name is one of: "base", "link", "meta", + "script", "style", "title" */ + } elseif ($token['type'] === HTML5::STARTTAG && in_array( + $token['name'], + array('base', 'link', 'meta', 'script', 'style', 'title') + ) + ) { + /* Parse error. Switch the insertion mode back to "in head" and + reprocess the token. */ + $this->mode = self::IN_HEAD; + return $this->inHead($token); + + /* Anything else */ + } else { + /* Act as if a start tag token with the tag name "body" and no + attributes had been seen, and then reprocess the current token. */ + $this->afterHead( + array( + 'name' => 'body', + 'type' => HTML5::STARTTAG, + 'attr' => array() + ) + ); + + return $this->inBody($token); + } + } + + private function inBody($token) + { + /* Handle the token as follows: */ + + switch ($token['type']) { + /* A character token */ + case HTML5::CHARACTR: + /* Reconstruct the active formatting elements, if any. */ + $this->reconstructActiveFormattingElements(); + + /* Append the token's character to the current node. */ + $this->insertText($token['data']); + break; + + /* A comment token */ + case HTML5::COMMENT: + /* Append a Comment node to the current node with the data + attribute set to the data given in the comment token. */ + $this->insertComment($token['data']); + break; + + case HTML5::STARTTAG: + switch ($token['name']) { + /* A start tag token whose tag name is one of: "script", + "style" */ + case 'script': + case 'style': + /* Process the token as if the insertion mode had been "in + head". */ + return $this->inHead($token); + break; + + /* A start tag token whose tag name is one of: "base", "link", + "meta", "title" */ + case 'base': + case 'link': + case 'meta': + case 'title': + /* Parse error. Process the token as if the insertion mode + had been "in head". */ + return $this->inHead($token); + break; + + /* A start tag token with the tag name "body" */ + case 'body': + /* Parse error. If the second element on the stack of open + elements is not a body element, or, if the stack of open + elements has only one node on it, then ignore the token. + (innerHTML case) */ + if (count($this->stack) === 1 || $this->stack[1]->nodeName !== 'body') { + // Ignore + + /* Otherwise, for each attribute on the token, check to see + if the attribute is already present on the body element (the + second element) on the stack of open elements. If it is not, + add the attribute and its corresponding value to that + element. */ + } else { + foreach ($token['attr'] as $attr) { + if (!$this->stack[1]->hasAttribute($attr['name'])) { + $this->stack[1]->setAttribute($attr['name'], $attr['value']); + } + } + } + break; + + /* A start tag whose tag name is one of: "address", + "blockquote", "center", "dir", "div", "dl", "fieldset", + "listing", "menu", "ol", "p", "ul" */ + case 'address': + case 'blockquote': + case 'center': + case 'dir': + case 'div': + case 'dl': + case 'fieldset': + case 'listing': + case 'menu': + case 'ol': + case 'p': + case 'ul': + /* If the stack of open elements has a p element in scope, + then act as if an end tag with the tag name p had been + seen. */ + if ($this->elementInScope('p')) { + $this->emitToken( + array( + 'name' => 'p', + 'type' => HTML5::ENDTAG + ) + ); + } + + /* Insert an HTML element for the token. */ + $this->insertElement($token); + break; + + /* A start tag whose tag name is "form" */ + case 'form': + /* If the form element pointer is not null, ignore the + token with a parse error. */ + if ($this->form_pointer !== null) { + // Ignore. + + /* Otherwise: */ + } else { + /* If the stack of open elements has a p element in + scope, then act as if an end tag with the tag name p + had been seen. */ + if ($this->elementInScope('p')) { + $this->emitToken( + array( + 'name' => 'p', + 'type' => HTML5::ENDTAG + ) + ); + } + + /* Insert an HTML element for the token, and set the + form element pointer to point to the element created. */ + $element = $this->insertElement($token); + $this->form_pointer = $element; + } + break; + + /* A start tag whose tag name is "li", "dd" or "dt" */ + case 'li': + case 'dd': + case 'dt': + /* If the stack of open elements has a p element in scope, + then act as if an end tag with the tag name p had been + seen. */ + if ($this->elementInScope('p')) { + $this->emitToken( + array( + 'name' => 'p', + 'type' => HTML5::ENDTAG + ) + ); + } + + $stack_length = count($this->stack) - 1; + + for ($n = $stack_length; 0 <= $n; $n--) { + /* 1. Initialise node to be the current node (the + bottommost node of the stack). */ + $stop = false; + $node = $this->stack[$n]; + $cat = $this->getElementCategory($node->tagName); + + /* 2. If node is an li, dd or dt element, then pop all + the nodes from the current node up to node, including + node, then stop this algorithm. */ + if ($token['name'] === $node->tagName || ($token['name'] !== 'li' + && ($node->tagName === 'dd' || $node->tagName === 'dt')) + ) { + for ($x = $stack_length; $x >= $n; $x--) { + array_pop($this->stack); + } + + break; + } + + /* 3. If node is not in the formatting category, and is + not in the phrasing category, and is not an address or + div element, then stop this algorithm. */ + if ($cat !== self::FORMATTING && $cat !== self::PHRASING && + $node->tagName !== 'address' && $node->tagName !== 'div' + ) { + break; + } + } + + /* Finally, insert an HTML element with the same tag + name as the token's. */ + $this->insertElement($token); + break; + + /* A start tag token whose tag name is "plaintext" */ + case 'plaintext': + /* If the stack of open elements has a p element in scope, + then act as if an end tag with the tag name p had been + seen. */ + if ($this->elementInScope('p')) { + $this->emitToken( + array( + 'name' => 'p', + 'type' => HTML5::ENDTAG + ) + ); + } + + /* Insert an HTML element for the token. */ + $this->insertElement($token); + + return HTML5::PLAINTEXT; + break; + + /* A start tag whose tag name is one of: "h1", "h2", "h3", "h4", + "h5", "h6" */ + case 'h1': + case 'h2': + case 'h3': + case 'h4': + case 'h5': + case 'h6': + /* If the stack of open elements has a p element in scope, + then act as if an end tag with the tag name p had been seen. */ + if ($this->elementInScope('p')) { + $this->emitToken( + array( + 'name' => 'p', + 'type' => HTML5::ENDTAG + ) + ); + } + + /* If the stack of open elements has in scope an element whose + tag name is one of "h1", "h2", "h3", "h4", "h5", or "h6", then + this is a parse error; pop elements from the stack until an + element with one of those tag names has been popped from the + stack. */ + while ($this->elementInScope(array('h1', 'h2', 'h3', 'h4', 'h5', 'h6'))) { + array_pop($this->stack); + } + + /* Insert an HTML element for the token. */ + $this->insertElement($token); + break; + + /* A start tag whose tag name is "a" */ + case 'a': + /* If the list of active formatting elements contains + an element whose tag name is "a" between the end of the + list and the last marker on the list (or the start of + the list if there is no marker on the list), then this + is a parse error; act as if an end tag with the tag name + "a" had been seen, then remove that element from the list + of active formatting elements and the stack of open + elements if the end tag didn't already remove it (it + might not have if the element is not in table scope). */ + $leng = count($this->a_formatting); + + for ($n = $leng - 1; $n >= 0; $n--) { + if ($this->a_formatting[$n] === self::MARKER) { + break; + + } elseif ($this->a_formatting[$n]->nodeName === 'a') { + $this->emitToken( + array( + 'name' => 'a', + 'type' => HTML5::ENDTAG + ) + ); + break; + } + } + + /* Reconstruct the active formatting elements, if any. */ + $this->reconstructActiveFormattingElements(); + + /* Insert an HTML element for the token. */ + $el = $this->insertElement($token); + + /* Add that element to the list of active formatting + elements. */ + $this->a_formatting[] = $el; + break; + + /* A start tag whose tag name is one of: "b", "big", "em", "font", + "i", "nobr", "s", "small", "strike", "strong", "tt", "u" */ + case 'b': + case 'big': + case 'em': + case 'font': + case 'i': + case 'nobr': + case 's': + case 'small': + case 'strike': + case 'strong': + case 'tt': + case 'u': + /* Reconstruct the active formatting elements, if any. */ + $this->reconstructActiveFormattingElements(); + + /* Insert an HTML element for the token. */ + $el = $this->insertElement($token); + + /* Add that element to the list of active formatting + elements. */ + $this->a_formatting[] = $el; + break; + + /* A start tag token whose tag name is "button" */ + case 'button': + /* If the stack of open elements has a button element in scope, + then this is a parse error; act as if an end tag with the tag + name "button" had been seen, then reprocess the token. (We don't + do that. Unnecessary.) */ + if ($this->elementInScope('button')) { + $this->inBody( + array( + 'name' => 'button', + 'type' => HTML5::ENDTAG + ) + ); + } + + /* Reconstruct the active formatting elements, if any. */ + $this->reconstructActiveFormattingElements(); + + /* Insert an HTML element for the token. */ + $this->insertElement($token); + + /* Insert a marker at the end of the list of active + formatting elements. */ + $this->a_formatting[] = self::MARKER; + break; + + /* A start tag token whose tag name is one of: "marquee", "object" */ + case 'marquee': + case 'object': + /* Reconstruct the active formatting elements, if any. */ + $this->reconstructActiveFormattingElements(); + + /* Insert an HTML element for the token. */ + $this->insertElement($token); + + /* Insert a marker at the end of the list of active + formatting elements. */ + $this->a_formatting[] = self::MARKER; + break; + + /* A start tag token whose tag name is "xmp" */ + case 'xmp': + /* Reconstruct the active formatting elements, if any. */ + $this->reconstructActiveFormattingElements(); + + /* Insert an HTML element for the token. */ + $this->insertElement($token); + + /* Switch the content model flag to the CDATA state. */ + return HTML5::CDATA; + break; + + /* A start tag whose tag name is "table" */ + case 'table': + /* If the stack of open elements has a p element in scope, + then act as if an end tag with the tag name p had been seen. */ + if ($this->elementInScope('p')) { + $this->emitToken( + array( + 'name' => 'p', + 'type' => HTML5::ENDTAG + ) + ); + } + + /* Insert an HTML element for the token. */ + $this->insertElement($token); + + /* Change the insertion mode to "in table". */ + $this->mode = self::IN_TABLE; + break; + + /* A start tag whose tag name is one of: "area", "basefont", + "bgsound", "br", "embed", "img", "param", "spacer", "wbr" */ + case 'area': + case 'basefont': + case 'bgsound': + case 'br': + case 'embed': + case 'img': + case 'param': + case 'spacer': + case 'wbr': + /* Reconstruct the active formatting elements, if any. */ + $this->reconstructActiveFormattingElements(); + + /* Insert an HTML element for the token. */ + $this->insertElement($token); + + /* Immediately pop the current node off the stack of open elements. */ + array_pop($this->stack); + break; + + /* A start tag whose tag name is "hr" */ + case 'hr': + /* If the stack of open elements has a p element in scope, + then act as if an end tag with the tag name p had been seen. */ + if ($this->elementInScope('p')) { + $this->emitToken( + array( + 'name' => 'p', + 'type' => HTML5::ENDTAG + ) + ); + } + + /* Insert an HTML element for the token. */ + $this->insertElement($token); + + /* Immediately pop the current node off the stack of open elements. */ + array_pop($this->stack); + break; + + /* A start tag whose tag name is "image" */ + case 'image': + /* Parse error. Change the token's tag name to "img" and + reprocess it. (Don't ask.) */ + $token['name'] = 'img'; + return $this->inBody($token); + break; + + /* A start tag whose tag name is "input" */ + case 'input': + /* Reconstruct the active formatting elements, if any. */ + $this->reconstructActiveFormattingElements(); + + /* Insert an input element for the token. */ + $element = $this->insertElement($token, false); + + /* If the form element pointer is not null, then associate the + input element with the form element pointed to by the form + element pointer. */ + $this->form_pointer !== null + ? $this->form_pointer->appendChild($element) + : end($this->stack)->appendChild($element); + + /* Pop that input element off the stack of open elements. */ + array_pop($this->stack); + break; + + /* A start tag whose tag name is "isindex" */ + case 'isindex': + /* Parse error. */ + // w/e + + /* If the form element pointer is not null, + then ignore the token. */ + if ($this->form_pointer === null) { + /* Act as if a start tag token with the tag name "form" had + been seen. */ + $this->inBody( + array( + 'name' => 'body', + 'type' => HTML5::STARTTAG, + 'attr' => array() + ) + ); + + /* Act as if a start tag token with the tag name "hr" had + been seen. */ + $this->inBody( + array( + 'name' => 'hr', + 'type' => HTML5::STARTTAG, + 'attr' => array() + ) + ); + + /* Act as if a start tag token with the tag name "p" had + been seen. */ + $this->inBody( + array( + 'name' => 'p', + 'type' => HTML5::STARTTAG, + 'attr' => array() + ) + ); + + /* Act as if a start tag token with the tag name "label" + had been seen. */ + $this->inBody( + array( + 'name' => 'label', + 'type' => HTML5::STARTTAG, + 'attr' => array() + ) + ); + + /* Act as if a stream of character tokens had been seen. */ + $this->insertText( + 'This is a searchable index. ' . + 'Insert your search keywords here: ' + ); + + /* Act as if a start tag token with the tag name "input" + had been seen, with all the attributes from the "isindex" + token, except with the "name" attribute set to the value + "isindex" (ignoring any explicit "name" attribute). */ + $attr = $token['attr']; + $attr[] = array('name' => 'name', 'value' => 'isindex'); + + $this->inBody( + array( + 'name' => 'input', + 'type' => HTML5::STARTTAG, + 'attr' => $attr + ) + ); + + /* Act as if a stream of character tokens had been seen + (see below for what they should say). */ + $this->insertText( + 'This is a searchable index. ' . + 'Insert your search keywords here: ' + ); + + /* Act as if an end tag token with the tag name "label" + had been seen. */ + $this->inBody( + array( + 'name' => 'label', + 'type' => HTML5::ENDTAG + ) + ); + + /* Act as if an end tag token with the tag name "p" had + been seen. */ + $this->inBody( + array( + 'name' => 'p', + 'type' => HTML5::ENDTAG + ) + ); + + /* Act as if a start tag token with the tag name "hr" had + been seen. */ + $this->inBody( + array( + 'name' => 'hr', + 'type' => HTML5::ENDTAG + ) + ); + + /* Act as if an end tag token with the tag name "form" had + been seen. */ + $this->inBody( + array( + 'name' => 'form', + 'type' => HTML5::ENDTAG + ) + ); + } + break; + + /* A start tag whose tag name is "textarea" */ + case 'textarea': + $this->insertElement($token); + + /* Switch the tokeniser's content model flag to the + RCDATA state. */ + return HTML5::RCDATA; + break; + + /* A start tag whose tag name is one of: "iframe", "noembed", + "noframes" */ + case 'iframe': + case 'noembed': + case 'noframes': + $this->insertElement($token); + + /* Switch the tokeniser's content model flag to the CDATA state. */ + return HTML5::CDATA; + break; + + /* A start tag whose tag name is "select" */ + case 'select': + /* Reconstruct the active formatting elements, if any. */ + $this->reconstructActiveFormattingElements(); + + /* Insert an HTML element for the token. */ + $this->insertElement($token); + + /* Change the insertion mode to "in select". */ + $this->mode = self::IN_SELECT; + break; + + /* A start or end tag whose tag name is one of: "caption", "col", + "colgroup", "frame", "frameset", "head", "option", "optgroup", + "tbody", "td", "tfoot", "th", "thead", "tr". */ + case 'caption': + case 'col': + case 'colgroup': + case 'frame': + case 'frameset': + case 'head': + case 'option': + case 'optgroup': + case 'tbody': + case 'td': + case 'tfoot': + case 'th': + case 'thead': + case 'tr': + // Parse error. Ignore the token. + break; + + /* A start or end tag whose tag name is one of: "event-source", + "section", "nav", "article", "aside", "header", "footer", + "datagrid", "command" */ + case 'event-source': + case 'section': + case 'nav': + case 'article': + case 'aside': + case 'header': + case 'footer': + case 'datagrid': + case 'command': + // Work in progress! + break; + + /* A start tag token not covered by the previous entries */ + default: + /* Reconstruct the active formatting elements, if any. */ + $this->reconstructActiveFormattingElements(); + + $this->insertElement($token, true, true); + break; + } + break; + + case HTML5::ENDTAG: + switch ($token['name']) { + /* An end tag with the tag name "body" */ + case 'body': + /* If the second element in the stack of open elements is + not a body element, this is a parse error. Ignore the token. + (innerHTML case) */ + if (count($this->stack) < 2 || $this->stack[1]->nodeName !== 'body') { + // Ignore. + + /* If the current node is not the body element, then this + is a parse error. */ + } elseif (end($this->stack)->nodeName !== 'body') { + // Parse error. + } + + /* Change the insertion mode to "after body". */ + $this->mode = self::AFTER_BODY; + break; + + /* An end tag with the tag name "html" */ + case 'html': + /* Act as if an end tag with tag name "body" had been seen, + then, if that token wasn't ignored, reprocess the current + token. */ + $this->inBody( + array( + 'name' => 'body', + 'type' => HTML5::ENDTAG + ) + ); + + return $this->afterBody($token); + break; + + /* An end tag whose tag name is one of: "address", "blockquote", + "center", "dir", "div", "dl", "fieldset", "listing", "menu", + "ol", "pre", "ul" */ + case 'address': + case 'blockquote': + case 'center': + case 'dir': + case 'div': + case 'dl': + case 'fieldset': + case 'listing': + case 'menu': + case 'ol': + case 'pre': + case 'ul': + /* If the stack of open elements has an element in scope + with the same tag name as that of the token, then generate + implied end tags. */ + if ($this->elementInScope($token['name'])) { + $this->generateImpliedEndTags(); + + /* Now, if the current node is not an element with + the same tag name as that of the token, then this + is a parse error. */ + // w/e + + /* If the stack of open elements has an element in + scope with the same tag name as that of the token, + then pop elements from this stack until an element + with that tag name has been popped from the stack. */ + for ($n = count($this->stack) - 1; $n >= 0; $n--) { + if ($this->stack[$n]->nodeName === $token['name']) { + $n = -1; + } + + array_pop($this->stack); + } + } + break; + + /* An end tag whose tag name is "form" */ + case 'form': + /* If the stack of open elements has an element in scope + with the same tag name as that of the token, then generate + implied end tags. */ + if ($this->elementInScope($token['name'])) { + $this->generateImpliedEndTags(); + + } + + if (end($this->stack)->nodeName !== $token['name']) { + /* Now, if the current node is not an element with the + same tag name as that of the token, then this is a parse + error. */ + // w/e + + } else { + /* Otherwise, if the current node is an element with + the same tag name as that of the token pop that element + from the stack. */ + array_pop($this->stack); + } + + /* In any case, set the form element pointer to null. */ + $this->form_pointer = null; + break; + + /* An end tag whose tag name is "p" */ + case 'p': + /* If the stack of open elements has a p element in scope, + then generate implied end tags, except for p elements. */ + if ($this->elementInScope('p')) { + $this->generateImpliedEndTags(array('p')); + + /* If the current node is not a p element, then this is + a parse error. */ + // k + + /* If the stack of open elements has a p element in + scope, then pop elements from this stack until the stack + no longer has a p element in scope. */ + for ($n = count($this->stack) - 1; $n >= 0; $n--) { + if ($this->elementInScope('p')) { + array_pop($this->stack); + + } else { + break; + } + } + } + break; + + /* An end tag whose tag name is "dd", "dt", or "li" */ + case 'dd': + case 'dt': + case 'li': + /* If the stack of open elements has an element in scope + whose tag name matches the tag name of the token, then + generate implied end tags, except for elements with the + same tag name as the token. */ + if ($this->elementInScope($token['name'])) { + $this->generateImpliedEndTags(array($token['name'])); + + /* If the current node is not an element with the same + tag name as the token, then this is a parse error. */ + // w/e + + /* If the stack of open elements has an element in scope + whose tag name matches the tag name of the token, then + pop elements from this stack until an element with that + tag name has been popped from the stack. */ + for ($n = count($this->stack) - 1; $n >= 0; $n--) { + if ($this->stack[$n]->nodeName === $token['name']) { + $n = -1; + } + + array_pop($this->stack); + } + } + break; + + /* An end tag whose tag name is one of: "h1", "h2", "h3", "h4", + "h5", "h6" */ + case 'h1': + case 'h2': + case 'h3': + case 'h4': + case 'h5': + case 'h6': + $elements = array('h1', 'h2', 'h3', 'h4', 'h5', 'h6'); + + /* If the stack of open elements has in scope an element whose + tag name is one of "h1", "h2", "h3", "h4", "h5", or "h6", then + generate implied end tags. */ + if ($this->elementInScope($elements)) { + $this->generateImpliedEndTags(); + + /* Now, if the current node is not an element with the same + tag name as that of the token, then this is a parse error. */ + // w/e + + /* If the stack of open elements has in scope an element + whose tag name is one of "h1", "h2", "h3", "h4", "h5", or + "h6", then pop elements from the stack until an element + with one of those tag names has been popped from the stack. */ + while ($this->elementInScope($elements)) { + array_pop($this->stack); + } + } + break; + + /* An end tag whose tag name is one of: "a", "b", "big", "em", + "font", "i", "nobr", "s", "small", "strike", "strong", "tt", "u" */ + case 'a': + case 'b': + case 'big': + case 'em': + case 'font': + case 'i': + case 'nobr': + case 's': + case 'small': + case 'strike': + case 'strong': + case 'tt': + case 'u': + /* 1. Let the formatting element be the last element in + the list of active formatting elements that: + * is between the end of the list and the last scope + marker in the list, if any, or the start of the list + otherwise, and + * has the same tag name as the token. + */ + while (true) { + for ($a = count($this->a_formatting) - 1; $a >= 0; $a--) { + if ($this->a_formatting[$a] === self::MARKER) { + break; + + } elseif ($this->a_formatting[$a]->tagName === $token['name']) { + $formatting_element = $this->a_formatting[$a]; + $in_stack = in_array($formatting_element, $this->stack, true); + $fe_af_pos = $a; + break; + } + } + + /* If there is no such node, or, if that node is + also in the stack of open elements but the element + is not in scope, then this is a parse error. Abort + these steps. The token is ignored. */ + if (!isset($formatting_element) || ($in_stack && + !$this->elementInScope($token['name'])) + ) { + break; + + /* Otherwise, if there is such a node, but that node + is not in the stack of open elements, then this is a + parse error; remove the element from the list, and + abort these steps. */ + } elseif (isset($formatting_element) && !$in_stack) { + unset($this->a_formatting[$fe_af_pos]); + $this->a_formatting = array_merge($this->a_formatting); + break; + } + + /* 2. Let the furthest block be the topmost node in the + stack of open elements that is lower in the stack + than the formatting element, and is not an element in + the phrasing or formatting categories. There might + not be one. */ + $fe_s_pos = array_search($formatting_element, $this->stack, true); + $length = count($this->stack); + + for ($s = $fe_s_pos + 1; $s < $length; $s++) { + $category = $this->getElementCategory($this->stack[$s]->nodeName); + + if ($category !== self::PHRASING && $category !== self::FORMATTING) { + $furthest_block = $this->stack[$s]; + } + } + + /* 3. If there is no furthest block, then the UA must + skip the subsequent steps and instead just pop all + the nodes from the bottom of the stack of open + elements, from the current node up to the formatting + element, and remove the formatting element from the + list of active formatting elements. */ + if (!isset($furthest_block)) { + for ($n = $length - 1; $n >= $fe_s_pos; $n--) { + array_pop($this->stack); + } + + unset($this->a_formatting[$fe_af_pos]); + $this->a_formatting = array_merge($this->a_formatting); + break; + } + + /* 4. Let the common ancestor be the element + immediately above the formatting element in the stack + of open elements. */ + $common_ancestor = $this->stack[$fe_s_pos - 1]; + + /* 5. If the furthest block has a parent node, then + remove the furthest block from its parent node. */ + if ($furthest_block->parentNode !== null) { + $furthest_block->parentNode->removeChild($furthest_block); + } + + /* 6. Let a bookmark note the position of the + formatting element in the list of active formatting + elements relative to the elements on either side + of it in the list. */ + $bookmark = $fe_af_pos; + + /* 7. Let node and last node be the furthest block. + Follow these steps: */ + $node = $furthest_block; + $last_node = $furthest_block; + + while (true) { + for ($n = array_search($node, $this->stack, true) - 1; $n >= 0; $n--) { + /* 7.1 Let node be the element immediately + prior to node in the stack of open elements. */ + $node = $this->stack[$n]; + + /* 7.2 If node is not in the list of active + formatting elements, then remove node from + the stack of open elements and then go back + to step 1. */ + if (!in_array($node, $this->a_formatting, true)) { + unset($this->stack[$n]); + $this->stack = array_merge($this->stack); + + } else { + break; + } + } + + /* 7.3 Otherwise, if node is the formatting + element, then go to the next step in the overall + algorithm. */ + if ($node === $formatting_element) { + break; + + /* 7.4 Otherwise, if last node is the furthest + block, then move the aforementioned bookmark to + be immediately after the node in the list of + active formatting elements. */ + } elseif ($last_node === $furthest_block) { + $bookmark = array_search($node, $this->a_formatting, true) + 1; + } + + /* 7.5 If node has any children, perform a + shallow clone of node, replace the entry for + node in the list of active formatting elements + with an entry for the clone, replace the entry + for node in the stack of open elements with an + entry for the clone, and let node be the clone. */ + if ($node->hasChildNodes()) { + $clone = $node->cloneNode(); + $s_pos = array_search($node, $this->stack, true); + $a_pos = array_search($node, $this->a_formatting, true); + + $this->stack[$s_pos] = $clone; + $this->a_formatting[$a_pos] = $clone; + $node = $clone; + } + + /* 7.6 Insert last node into node, first removing + it from its previous parent node if any. */ + if ($last_node->parentNode !== null) { + $last_node->parentNode->removeChild($last_node); + } + + $node->appendChild($last_node); + + /* 7.7 Let last node be node. */ + $last_node = $node; + } + + /* 8. Insert whatever last node ended up being in + the previous step into the common ancestor node, + first removing it from its previous parent node if + any. */ + if ($last_node->parentNode !== null) { + $last_node->parentNode->removeChild($last_node); + } + + $common_ancestor->appendChild($last_node); + + /* 9. Perform a shallow clone of the formatting + element. */ + $clone = $formatting_element->cloneNode(); + + /* 10. Take all of the child nodes of the furthest + block and append them to the clone created in the + last step. */ + while ($furthest_block->hasChildNodes()) { + $child = $furthest_block->firstChild; + $furthest_block->removeChild($child); + $clone->appendChild($child); + } + + /* 11. Append that clone to the furthest block. */ + $furthest_block->appendChild($clone); + + /* 12. Remove the formatting element from the list + of active formatting elements, and insert the clone + into the list of active formatting elements at the + position of the aforementioned bookmark. */ + $fe_af_pos = array_search($formatting_element, $this->a_formatting, true); + unset($this->a_formatting[$fe_af_pos]); + $this->a_formatting = array_merge($this->a_formatting); + + $af_part1 = array_slice($this->a_formatting, 0, $bookmark - 1); + $af_part2 = array_slice($this->a_formatting, $bookmark, count($this->a_formatting)); + $this->a_formatting = array_merge($af_part1, array($clone), $af_part2); + + /* 13. Remove the formatting element from the stack + of open elements, and insert the clone into the stack + of open elements immediately after (i.e. in a more + deeply nested position than) the position of the + furthest block in that stack. */ + $fe_s_pos = array_search($formatting_element, $this->stack, true); + $fb_s_pos = array_search($furthest_block, $this->stack, true); + unset($this->stack[$fe_s_pos]); + + $s_part1 = array_slice($this->stack, 0, $fb_s_pos); + $s_part2 = array_slice($this->stack, $fb_s_pos + 1, count($this->stack)); + $this->stack = array_merge($s_part1, array($clone), $s_part2); + + /* 14. Jump back to step 1 in this series of steps. */ + unset($formatting_element, $fe_af_pos, $fe_s_pos, $furthest_block); + } + break; + + /* An end tag token whose tag name is one of: "button", + "marquee", "object" */ + case 'button': + case 'marquee': + case 'object': + /* If the stack of open elements has an element in scope whose + tag name matches the tag name of the token, then generate implied + tags. */ + if ($this->elementInScope($token['name'])) { + $this->generateImpliedEndTags(); + + /* Now, if the current node is not an element with the same + tag name as the token, then this is a parse error. */ + // k + + /* Now, if the stack of open elements has an element in scope + whose tag name matches the tag name of the token, then pop + elements from the stack until that element has been popped from + the stack, and clear the list of active formatting elements up + to the last marker. */ + for ($n = count($this->stack) - 1; $n >= 0; $n--) { + if ($this->stack[$n]->nodeName === $token['name']) { + $n = -1; + } + + array_pop($this->stack); + } + + $marker = end(array_keys($this->a_formatting, self::MARKER, true)); + + for ($n = count($this->a_formatting) - 1; $n > $marker; $n--) { + array_pop($this->a_formatting); + } + } + break; + + /* Or an end tag whose tag name is one of: "area", "basefont", + "bgsound", "br", "embed", "hr", "iframe", "image", "img", + "input", "isindex", "noembed", "noframes", "param", "select", + "spacer", "table", "textarea", "wbr" */ + case 'area': + case 'basefont': + case 'bgsound': + case 'br': + case 'embed': + case 'hr': + case 'iframe': + case 'image': + case 'img': + case 'input': + case 'isindex': + case 'noembed': + case 'noframes': + case 'param': + case 'select': + case 'spacer': + case 'table': + case 'textarea': + case 'wbr': + // Parse error. Ignore the token. + break; + + /* An end tag token not covered by the previous entries */ + default: + for ($n = count($this->stack) - 1; $n >= 0; $n--) { + /* Initialise node to be the current node (the bottommost + node of the stack). */ + $node = end($this->stack); + + /* If node has the same tag name as the end tag token, + then: */ + if ($token['name'] === $node->nodeName) { + /* Generate implied end tags. */ + $this->generateImpliedEndTags(); + + /* If the tag name of the end tag token does not + match the tag name of the current node, this is a + parse error. */ + // k + + /* Pop all the nodes from the current node up to + node, including node, then stop this algorithm. */ + for ($x = count($this->stack) - $n; $x >= $n; $x--) { + array_pop($this->stack); + } + + } else { + $category = $this->getElementCategory($node); + + if ($category !== self::SPECIAL && $category !== self::SCOPING) { + /* Otherwise, if node is in neither the formatting + category nor the phrasing category, then this is a + parse error. Stop this algorithm. The end tag token + is ignored. */ + return false; + } + } + } + break; + } + break; + } + } + + private function inTable($token) + { + $clear = array('html', 'table'); + + /* A character token that is one of one of U+0009 CHARACTER TABULATION, + U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), + or U+0020 SPACE */ + if ($token['type'] === HTML5::CHARACTR && + preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data']) + ) { + /* Append the character to the current node. */ + $text = $this->dom->createTextNode($token['data']); + end($this->stack)->appendChild($text); + + /* A comment token */ + } elseif ($token['type'] === HTML5::COMMENT) { + /* Append a Comment node to the current node with the data + attribute set to the data given in the comment token. */ + $comment = $this->dom->createComment($token['data']); + end($this->stack)->appendChild($comment); + + /* A start tag whose tag name is "caption" */ + } elseif ($token['type'] === HTML5::STARTTAG && + $token['name'] === 'caption' + ) { + /* Clear the stack back to a table context. */ + $this->clearStackToTableContext($clear); + + /* Insert a marker at the end of the list of active + formatting elements. */ + $this->a_formatting[] = self::MARKER; + + /* Insert an HTML element for the token, then switch the + insertion mode to "in caption". */ + $this->insertElement($token); + $this->mode = self::IN_CAPTION; + + /* A start tag whose tag name is "colgroup" */ + } elseif ($token['type'] === HTML5::STARTTAG && + $token['name'] === 'colgroup' + ) { + /* Clear the stack back to a table context. */ + $this->clearStackToTableContext($clear); + + /* Insert an HTML element for the token, then switch the + insertion mode to "in column group". */ + $this->insertElement($token); + $this->mode = self::IN_CGROUP; + + /* A start tag whose tag name is "col" */ + } elseif ($token['type'] === HTML5::STARTTAG && + $token['name'] === 'col' + ) { + $this->inTable( + array( + 'name' => 'colgroup', + 'type' => HTML5::STARTTAG, + 'attr' => array() + ) + ); + + $this->inColumnGroup($token); + + /* A start tag whose tag name is one of: "tbody", "tfoot", "thead" */ + } elseif ($token['type'] === HTML5::STARTTAG && in_array( + $token['name'], + array('tbody', 'tfoot', 'thead') + ) + ) { + /* Clear the stack back to a table context. */ + $this->clearStackToTableContext($clear); + + /* Insert an HTML element for the token, then switch the insertion + mode to "in table body". */ + $this->insertElement($token); + $this->mode = self::IN_TBODY; + + /* A start tag whose tag name is one of: "td", "th", "tr" */ + } elseif ($token['type'] === HTML5::STARTTAG && + in_array($token['name'], array('td', 'th', 'tr')) + ) { + /* Act as if a start tag token with the tag name "tbody" had been + seen, then reprocess the current token. */ + $this->inTable( + array( + 'name' => 'tbody', + 'type' => HTML5::STARTTAG, + 'attr' => array() + ) + ); + + return $this->inTableBody($token); + + /* A start tag whose tag name is "table" */ + } elseif ($token['type'] === HTML5::STARTTAG && + $token['name'] === 'table' + ) { + /* Parse error. Act as if an end tag token with the tag name "table" + had been seen, then, if that token wasn't ignored, reprocess the + current token. */ + $this->inTable( + array( + 'name' => 'table', + 'type' => HTML5::ENDTAG + ) + ); + + return $this->mainPhase($token); + + /* An end tag whose tag name is "table" */ + } elseif ($token['type'] === HTML5::ENDTAG && + $token['name'] === 'table' + ) { + /* If the stack of open elements does not have an element in table + scope with the same tag name as the token, this is a parse error. + Ignore the token. (innerHTML case) */ + if (!$this->elementInScope($token['name'], true)) { + return false; + + /* Otherwise: */ + } else { + /* Generate implied end tags. */ + $this->generateImpliedEndTags(); + + /* Now, if the current node is not a table element, then this + is a parse error. */ + // w/e + + /* Pop elements from this stack until a table element has been + popped from the stack. */ + while (true) { + $current = end($this->stack)->nodeName; + array_pop($this->stack); + + if ($current === 'table') { + break; + } + } + + /* Reset the insertion mode appropriately. */ + $this->resetInsertionMode(); + } + + /* An end tag whose tag name is one of: "body", "caption", "col", + "colgroup", "html", "tbody", "td", "tfoot", "th", "thead", "tr" */ + } elseif ($token['type'] === HTML5::ENDTAG && in_array( + $token['name'], + array( + 'body', + 'caption', + 'col', + 'colgroup', + 'html', + 'tbody', + 'td', + 'tfoot', + 'th', + 'thead', + 'tr' + ) + ) + ) { + // Parse error. Ignore the token. + + /* Anything else */ + } else { + /* Parse error. Process the token as if the insertion mode was "in + body", with the following exception: */ + + /* If the current node is a table, tbody, tfoot, thead, or tr + element, then, whenever a node would be inserted into the current + node, it must instead be inserted into the foster parent element. */ + if (in_array( + end($this->stack)->nodeName, + array('table', 'tbody', 'tfoot', 'thead', 'tr') + ) + ) { + /* The foster parent element is the parent element of the last + table element in the stack of open elements, if there is a + table element and it has such a parent element. If there is no + table element in the stack of open elements (innerHTML case), + then the foster parent element is the first element in the + stack of open elements (the html element). Otherwise, if there + is a table element in the stack of open elements, but the last + table element in the stack of open elements has no parent, or + its parent node is not an element, then the foster parent + element is the element before the last table element in the + stack of open elements. */ + for ($n = count($this->stack) - 1; $n >= 0; $n--) { + if ($this->stack[$n]->nodeName === 'table') { + $table = $this->stack[$n]; + break; + } + } + + if (isset($table) && $table->parentNode !== null) { + $this->foster_parent = $table->parentNode; + + } elseif (!isset($table)) { + $this->foster_parent = $this->stack[0]; + + } elseif (isset($table) && ($table->parentNode === null || + $table->parentNode->nodeType !== XML_ELEMENT_NODE) + ) { + $this->foster_parent = $this->stack[$n - 1]; + } + } + + $this->inBody($token); + } + } + + private function inCaption($token) + { + /* An end tag whose tag name is "caption" */ + if ($token['type'] === HTML5::ENDTAG && $token['name'] === 'caption') { + /* If the stack of open elements does not have an element in table + scope with the same tag name as the token, this is a parse error. + Ignore the token. (innerHTML case) */ + if (!$this->elementInScope($token['name'], true)) { + // Ignore + + /* Otherwise: */ + } else { + /* Generate implied end tags. */ + $this->generateImpliedEndTags(); + + /* Now, if the current node is not a caption element, then this + is a parse error. */ + // w/e + + /* Pop elements from this stack until a caption element has + been popped from the stack. */ + while (true) { + $node = end($this->stack)->nodeName; + array_pop($this->stack); + + if ($node === 'caption') { + break; + } + } + + /* Clear the list of active formatting elements up to the last + marker. */ + $this->clearTheActiveFormattingElementsUpToTheLastMarker(); + + /* Switch the insertion mode to "in table". */ + $this->mode = self::IN_TABLE; + } + + /* A start tag whose tag name is one of: "caption", "col", "colgroup", + "tbody", "td", "tfoot", "th", "thead", "tr", or an end tag whose tag + name is "table" */ + } elseif (($token['type'] === HTML5::STARTTAG && in_array( + $token['name'], + array( + 'caption', + 'col', + 'colgroup', + 'tbody', + 'td', + 'tfoot', + 'th', + 'thead', + 'tr' + ) + )) || ($token['type'] === HTML5::ENDTAG && + $token['name'] === 'table') + ) { + /* Parse error. Act as if an end tag with the tag name "caption" + had been seen, then, if that token wasn't ignored, reprocess the + current token. */ + $this->inCaption( + array( + 'name' => 'caption', + 'type' => HTML5::ENDTAG + ) + ); + + return $this->inTable($token); + + /* An end tag whose tag name is one of: "body", "col", "colgroup", + "html", "tbody", "td", "tfoot", "th", "thead", "tr" */ + } elseif ($token['type'] === HTML5::ENDTAG && in_array( + $token['name'], + array( + 'body', + 'col', + 'colgroup', + 'html', + 'tbody', + 'tfoot', + 'th', + 'thead', + 'tr' + ) + ) + ) { + // Parse error. Ignore the token. + + /* Anything else */ + } else { + /* Process the token as if the insertion mode was "in body". */ + $this->inBody($token); + } + } + + private function inColumnGroup($token) + { + /* A character token that is one of one of U+0009 CHARACTER TABULATION, + U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), + or U+0020 SPACE */ + if ($token['type'] === HTML5::CHARACTR && + preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data']) + ) { + /* Append the character to the current node. */ + $text = $this->dom->createTextNode($token['data']); + end($this->stack)->appendChild($text); + + /* A comment token */ + } elseif ($token['type'] === HTML5::COMMENT) { + /* Append a Comment node to the current node with the data + attribute set to the data given in the comment token. */ + $comment = $this->dom->createComment($token['data']); + end($this->stack)->appendChild($comment); + + /* A start tag whose tag name is "col" */ + } elseif ($token['type'] === HTML5::STARTTAG && $token['name'] === 'col') { + /* Insert a col element for the token. Immediately pop the current + node off the stack of open elements. */ + $this->insertElement($token); + array_pop($this->stack); + + /* An end tag whose tag name is "colgroup" */ + } elseif ($token['type'] === HTML5::ENDTAG && + $token['name'] === 'colgroup' + ) { + /* If the current node is the root html element, then this is a + parse error, ignore the token. (innerHTML case) */ + if (end($this->stack)->nodeName === 'html') { + // Ignore + + /* Otherwise, pop the current node (which will be a colgroup + element) from the stack of open elements. Switch the insertion + mode to "in table". */ + } else { + array_pop($this->stack); + $this->mode = self::IN_TABLE; + } + + /* An end tag whose tag name is "col" */ + } elseif ($token['type'] === HTML5::ENDTAG && $token['name'] === 'col') { + /* Parse error. Ignore the token. */ + + /* Anything else */ + } else { + /* Act as if an end tag with the tag name "colgroup" had been seen, + and then, if that token wasn't ignored, reprocess the current token. */ + $this->inColumnGroup( + array( + 'name' => 'colgroup', + 'type' => HTML5::ENDTAG + ) + ); + + return $this->inTable($token); + } + } + + private function inTableBody($token) + { + $clear = array('tbody', 'tfoot', 'thead', 'html'); + + /* A start tag whose tag name is "tr" */ + if ($token['type'] === HTML5::STARTTAG && $token['name'] === 'tr') { + /* Clear the stack back to a table body context. */ + $this->clearStackToTableContext($clear); + + /* Insert a tr element for the token, then switch the insertion + mode to "in row". */ + $this->insertElement($token); + $this->mode = self::IN_ROW; + + /* A start tag whose tag name is one of: "th", "td" */ + } elseif ($token['type'] === HTML5::STARTTAG && + ($token['name'] === 'th' || $token['name'] === 'td') + ) { + /* Parse error. Act as if a start tag with the tag name "tr" had + been seen, then reprocess the current token. */ + $this->inTableBody( + array( + 'name' => 'tr', + 'type' => HTML5::STARTTAG, + 'attr' => array() + ) + ); + + return $this->inRow($token); + + /* An end tag whose tag name is one of: "tbody", "tfoot", "thead" */ + } elseif ($token['type'] === HTML5::ENDTAG && + in_array($token['name'], array('tbody', 'tfoot', 'thead')) + ) { + /* If the stack of open elements does not have an element in table + scope with the same tag name as the token, this is a parse error. + Ignore the token. */ + if (!$this->elementInScope($token['name'], true)) { + // Ignore + + /* Otherwise: */ + } else { + /* Clear the stack back to a table body context. */ + $this->clearStackToTableContext($clear); + + /* Pop the current node from the stack of open elements. Switch + the insertion mode to "in table". */ + array_pop($this->stack); + $this->mode = self::IN_TABLE; + } + + /* A start tag whose tag name is one of: "caption", "col", "colgroup", + "tbody", "tfoot", "thead", or an end tag whose tag name is "table" */ + } elseif (($token['type'] === HTML5::STARTTAG && in_array( + $token['name'], + array('caption', 'col', 'colgroup', 'tbody', 'tfoor', 'thead') + )) || + ($token['type'] === HTML5::STARTTAG && $token['name'] === 'table') + ) { + /* If the stack of open elements does not have a tbody, thead, or + tfoot element in table scope, this is a parse error. Ignore the + token. (innerHTML case) */ + if (!$this->elementInScope(array('tbody', 'thead', 'tfoot'), true)) { + // Ignore. + + /* Otherwise: */ + } else { + /* Clear the stack back to a table body context. */ + $this->clearStackToTableContext($clear); + + /* Act as if an end tag with the same tag name as the current + node ("tbody", "tfoot", or "thead") had been seen, then + reprocess the current token. */ + $this->inTableBody( + array( + 'name' => end($this->stack)->nodeName, + 'type' => HTML5::ENDTAG + ) + ); + + return $this->mainPhase($token); + } + + /* An end tag whose tag name is one of: "body", "caption", "col", + "colgroup", "html", "td", "th", "tr" */ + } elseif ($token['type'] === HTML5::ENDTAG && in_array( + $token['name'], + array('body', 'caption', 'col', 'colgroup', 'html', 'td', 'th', 'tr') + ) + ) { + /* Parse error. Ignore the token. */ + + /* Anything else */ + } else { + /* Process the token as if the insertion mode was "in table". */ + $this->inTable($token); + } + } + + private function inRow($token) + { + $clear = array('tr', 'html'); + + /* A start tag whose tag name is one of: "th", "td" */ + if ($token['type'] === HTML5::STARTTAG && + ($token['name'] === 'th' || $token['name'] === 'td') + ) { + /* Clear the stack back to a table row context. */ + $this->clearStackToTableContext($clear); + + /* Insert an HTML element for the token, then switch the insertion + mode to "in cell". */ + $this->insertElement($token); + $this->mode = self::IN_CELL; + + /* Insert a marker at the end of the list of active formatting + elements. */ + $this->a_formatting[] = self::MARKER; + + /* An end tag whose tag name is "tr" */ + } elseif ($token['type'] === HTML5::ENDTAG && $token['name'] === 'tr') { + /* If the stack of open elements does not have an element in table + scope with the same tag name as the token, this is a parse error. + Ignore the token. (innerHTML case) */ + if (!$this->elementInScope($token['name'], true)) { + // Ignore. + + /* Otherwise: */ + } else { + /* Clear the stack back to a table row context. */ + $this->clearStackToTableContext($clear); + + /* Pop the current node (which will be a tr element) from the + stack of open elements. Switch the insertion mode to "in table + body". */ + array_pop($this->stack); + $this->mode = self::IN_TBODY; + } + + /* A start tag whose tag name is one of: "caption", "col", "colgroup", + "tbody", "tfoot", "thead", "tr" or an end tag whose tag name is "table" */ + } elseif ($token['type'] === HTML5::STARTTAG && in_array( + $token['name'], + array('caption', 'col', 'colgroup', 'tbody', 'tfoot', 'thead', 'tr') + ) + ) { + /* Act as if an end tag with the tag name "tr" had been seen, then, + if that token wasn't ignored, reprocess the current token. */ + $this->inRow( + array( + 'name' => 'tr', + 'type' => HTML5::ENDTAG + ) + ); + + return $this->inCell($token); + + /* An end tag whose tag name is one of: "tbody", "tfoot", "thead" */ + } elseif ($token['type'] === HTML5::ENDTAG && + in_array($token['name'], array('tbody', 'tfoot', 'thead')) + ) { + /* If the stack of open elements does not have an element in table + scope with the same tag name as the token, this is a parse error. + Ignore the token. */ + if (!$this->elementInScope($token['name'], true)) { + // Ignore. + + /* Otherwise: */ + } else { + /* Otherwise, act as if an end tag with the tag name "tr" had + been seen, then reprocess the current token. */ + $this->inRow( + array( + 'name' => 'tr', + 'type' => HTML5::ENDTAG + ) + ); + + return $this->inCell($token); + } + + /* An end tag whose tag name is one of: "body", "caption", "col", + "colgroup", "html", "td", "th" */ + } elseif ($token['type'] === HTML5::ENDTAG && in_array( + $token['name'], + array('body', 'caption', 'col', 'colgroup', 'html', 'td', 'th', 'tr') + ) + ) { + /* Parse error. Ignore the token. */ + + /* Anything else */ + } else { + /* Process the token as if the insertion mode was "in table". */ + $this->inTable($token); + } + } + + private function inCell($token) + { + /* An end tag whose tag name is one of: "td", "th" */ + if ($token['type'] === HTML5::ENDTAG && + ($token['name'] === 'td' || $token['name'] === 'th') + ) { + /* If the stack of open elements does not have an element in table + scope with the same tag name as that of the token, then this is a + parse error and the token must be ignored. */ + if (!$this->elementInScope($token['name'], true)) { + // Ignore. + + /* Otherwise: */ + } else { + /* Generate implied end tags, except for elements with the same + tag name as the token. */ + $this->generateImpliedEndTags(array($token['name'])); + + /* Now, if the current node is not an element with the same tag + name as the token, then this is a parse error. */ + // k + + /* Pop elements from this stack until an element with the same + tag name as the token has been popped from the stack. */ + while (true) { + $node = end($this->stack)->nodeName; + array_pop($this->stack); + + if ($node === $token['name']) { + break; + } + } + + /* Clear the list of active formatting elements up to the last + marker. */ + $this->clearTheActiveFormattingElementsUpToTheLastMarker(); + + /* Switch the insertion mode to "in row". (The current node + will be a tr element at this point.) */ + $this->mode = self::IN_ROW; + } + + /* A start tag whose tag name is one of: "caption", "col", "colgroup", + "tbody", "td", "tfoot", "th", "thead", "tr" */ + } elseif ($token['type'] === HTML5::STARTTAG && in_array( + $token['name'], + array( + 'caption', + 'col', + 'colgroup', + 'tbody', + 'td', + 'tfoot', + 'th', + 'thead', + 'tr' + ) + ) + ) { + /* If the stack of open elements does not have a td or th element + in table scope, then this is a parse error; ignore the token. + (innerHTML case) */ + if (!$this->elementInScope(array('td', 'th'), true)) { + // Ignore. + + /* Otherwise, close the cell (see below) and reprocess the current + token. */ + } else { + $this->closeCell(); + return $this->inRow($token); + } + + /* A start tag whose tag name is one of: "caption", "col", "colgroup", + "tbody", "td", "tfoot", "th", "thead", "tr" */ + } elseif ($token['type'] === HTML5::STARTTAG && in_array( + $token['name'], + array( + 'caption', + 'col', + 'colgroup', + 'tbody', + 'td', + 'tfoot', + 'th', + 'thead', + 'tr' + ) + ) + ) { + /* If the stack of open elements does not have a td or th element + in table scope, then this is a parse error; ignore the token. + (innerHTML case) */ + if (!$this->elementInScope(array('td', 'th'), true)) { + // Ignore. + + /* Otherwise, close the cell (see below) and reprocess the current + token. */ + } else { + $this->closeCell(); + return $this->inRow($token); + } + + /* An end tag whose tag name is one of: "body", "caption", "col", + "colgroup", "html" */ + } elseif ($token['type'] === HTML5::ENDTAG && in_array( + $token['name'], + array('body', 'caption', 'col', 'colgroup', 'html') + ) + ) { + /* Parse error. Ignore the token. */ + + /* An end tag whose tag name is one of: "table", "tbody", "tfoot", + "thead", "tr" */ + } elseif ($token['type'] === HTML5::ENDTAG && in_array( + $token['name'], + array('table', 'tbody', 'tfoot', 'thead', 'tr') + ) + ) { + /* If the stack of open elements does not have an element in table + scope with the same tag name as that of the token (which can only + happen for "tbody", "tfoot" and "thead", or, in the innerHTML case), + then this is a parse error and the token must be ignored. */ + if (!$this->elementInScope($token['name'], true)) { + // Ignore. + + /* Otherwise, close the cell (see below) and reprocess the current + token. */ + } else { + $this->closeCell(); + return $this->inRow($token); + } + + /* Anything else */ + } else { + /* Process the token as if the insertion mode was "in body". */ + $this->inBody($token); + } + } + + private function inSelect($token) + { + /* Handle the token as follows: */ + + /* A character token */ + if ($token['type'] === HTML5::CHARACTR) { + /* Append the token's character to the current node. */ + $this->insertText($token['data']); + + /* A comment token */ + } elseif ($token['type'] === HTML5::COMMENT) { + /* Append a Comment node to the current node with the data + attribute set to the data given in the comment token. */ + $this->insertComment($token['data']); + + /* A start tag token whose tag name is "option" */ + } elseif ($token['type'] === HTML5::STARTTAG && + $token['name'] === 'option' + ) { + /* If the current node is an option element, act as if an end tag + with the tag name "option" had been seen. */ + if (end($this->stack)->nodeName === 'option') { + $this->inSelect( + array( + 'name' => 'option', + 'type' => HTML5::ENDTAG + ) + ); + } + + /* Insert an HTML element for the token. */ + $this->insertElement($token); + + /* A start tag token whose tag name is "optgroup" */ + } elseif ($token['type'] === HTML5::STARTTAG && + $token['name'] === 'optgroup' + ) { + /* If the current node is an option element, act as if an end tag + with the tag name "option" had been seen. */ + if (end($this->stack)->nodeName === 'option') { + $this->inSelect( + array( + 'name' => 'option', + 'type' => HTML5::ENDTAG + ) + ); + } + + /* If the current node is an optgroup element, act as if an end tag + with the tag name "optgroup" had been seen. */ + if (end($this->stack)->nodeName === 'optgroup') { + $this->inSelect( + array( + 'name' => 'optgroup', + 'type' => HTML5::ENDTAG + ) + ); + } + + /* Insert an HTML element for the token. */ + $this->insertElement($token); + + /* An end tag token whose tag name is "optgroup" */ + } elseif ($token['type'] === HTML5::ENDTAG && + $token['name'] === 'optgroup' + ) { + /* First, if the current node is an option element, and the node + immediately before it in the stack of open elements is an optgroup + element, then act as if an end tag with the tag name "option" had + been seen. */ + $elements_in_stack = count($this->stack); + + if ($this->stack[$elements_in_stack - 1]->nodeName === 'option' && + $this->stack[$elements_in_stack - 2]->nodeName === 'optgroup' + ) { + $this->inSelect( + array( + 'name' => 'option', + 'type' => HTML5::ENDTAG + ) + ); + } + + /* If the current node is an optgroup element, then pop that node + from the stack of open elements. Otherwise, this is a parse error, + ignore the token. */ + if ($this->stack[$elements_in_stack - 1] === 'optgroup') { + array_pop($this->stack); + } + + /* An end tag token whose tag name is "option" */ + } elseif ($token['type'] === HTML5::ENDTAG && + $token['name'] === 'option' + ) { + /* If the current node is an option element, then pop that node + from the stack of open elements. Otherwise, this is a parse error, + ignore the token. */ + if (end($this->stack)->nodeName === 'option') { + array_pop($this->stack); + } + + /* An end tag whose tag name is "select" */ + } elseif ($token['type'] === HTML5::ENDTAG && + $token['name'] === 'select' + ) { + /* If the stack of open elements does not have an element in table + scope with the same tag name as the token, this is a parse error. + Ignore the token. (innerHTML case) */ + if (!$this->elementInScope($token['name'], true)) { + // w/e + + /* Otherwise: */ + } else { + /* Pop elements from the stack of open elements until a select + element has been popped from the stack. */ + while (true) { + $current = end($this->stack)->nodeName; + array_pop($this->stack); + + if ($current === 'select') { + break; + } + } + + /* Reset the insertion mode appropriately. */ + $this->resetInsertionMode(); + } + + /* A start tag whose tag name is "select" */ + } elseif ($token['name'] === 'select' && + $token['type'] === HTML5::STARTTAG + ) { + /* Parse error. Act as if the token had been an end tag with the + tag name "select" instead. */ + $this->inSelect( + array( + 'name' => 'select', + 'type' => HTML5::ENDTAG + ) + ); + + /* An end tag whose tag name is one of: "caption", "table", "tbody", + "tfoot", "thead", "tr", "td", "th" */ + } elseif (in_array( + $token['name'], + array( + 'caption', + 'table', + 'tbody', + 'tfoot', + 'thead', + 'tr', + 'td', + 'th' + ) + ) && $token['type'] === HTML5::ENDTAG + ) { + /* Parse error. */ + // w/e + + /* If the stack of open elements has an element in table scope with + the same tag name as that of the token, then act as if an end tag + with the tag name "select" had been seen, and reprocess the token. + Otherwise, ignore the token. */ + if ($this->elementInScope($token['name'], true)) { + $this->inSelect( + array( + 'name' => 'select', + 'type' => HTML5::ENDTAG + ) + ); + + $this->mainPhase($token); + } + + /* Anything else */ + } else { + /* Parse error. Ignore the token. */ + } + } + + private function afterBody($token) + { + /* Handle the token as follows: */ + + /* A character token that is one of one of U+0009 CHARACTER TABULATION, + U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), + or U+0020 SPACE */ + if ($token['type'] === HTML5::CHARACTR && + preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data']) + ) { + /* Process the token as it would be processed if the insertion mode + was "in body". */ + $this->inBody($token); + + /* A comment token */ + } elseif ($token['type'] === HTML5::COMMENT) { + /* Append a Comment node to the first element in the stack of open + elements (the html element), with the data attribute set to the + data given in the comment token. */ + $comment = $this->dom->createComment($token['data']); + $this->stack[0]->appendChild($comment); + + /* An end tag with the tag name "html" */ + } elseif ($token['type'] === HTML5::ENDTAG && $token['name'] === 'html') { + /* If the parser was originally created in order to handle the + setting of an element's innerHTML attribute, this is a parse error; + ignore the token. (The element will be an html element in this + case.) (innerHTML case) */ + + /* Otherwise, switch to the trailing end phase. */ + $this->phase = self::END_PHASE; + + /* Anything else */ + } else { + /* Parse error. Set the insertion mode to "in body" and reprocess + the token. */ + $this->mode = self::IN_BODY; + return $this->inBody($token); + } + } + + private function inFrameset($token) + { + /* Handle the token as follows: */ + + /* A character token that is one of one of U+0009 CHARACTER TABULATION, + U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), + U+000D CARRIAGE RETURN (CR), or U+0020 SPACE */ + if ($token['type'] === HTML5::CHARACTR && + preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data']) + ) { + /* Append the character to the current node. */ + $this->insertText($token['data']); + + /* A comment token */ + } elseif ($token['type'] === HTML5::COMMENT) { + /* Append a Comment node to the current node with the data + attribute set to the data given in the comment token. */ + $this->insertComment($token['data']); + + /* A start tag with the tag name "frameset" */ + } elseif ($token['name'] === 'frameset' && + $token['type'] === HTML5::STARTTAG + ) { + $this->insertElement($token); + + /* An end tag with the tag name "frameset" */ + } elseif ($token['name'] === 'frameset' && + $token['type'] === HTML5::ENDTAG + ) { + /* If the current node is the root html element, then this is a + parse error; ignore the token. (innerHTML case) */ + if (end($this->stack)->nodeName === 'html') { + // Ignore + + } else { + /* Otherwise, pop the current node from the stack of open + elements. */ + array_pop($this->stack); + + /* If the parser was not originally created in order to handle + the setting of an element's innerHTML attribute (innerHTML case), + and the current node is no longer a frameset element, then change + the insertion mode to "after frameset". */ + $this->mode = self::AFTR_FRAME; + } + + /* A start tag with the tag name "frame" */ + } elseif ($token['name'] === 'frame' && + $token['type'] === HTML5::STARTTAG + ) { + /* Insert an HTML element for the token. */ + $this->insertElement($token); + + /* Immediately pop the current node off the stack of open elements. */ + array_pop($this->stack); + + /* A start tag with the tag name "noframes" */ + } elseif ($token['name'] === 'noframes' && + $token['type'] === HTML5::STARTTAG + ) { + /* Process the token as if the insertion mode had been "in body". */ + $this->inBody($token); + + /* Anything else */ + } else { + /* Parse error. Ignore the token. */ + } + } + + private function afterFrameset($token) + { + /* Handle the token as follows: */ + + /* A character token that is one of one of U+0009 CHARACTER TABULATION, + U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), + U+000D CARRIAGE RETURN (CR), or U+0020 SPACE */ + if ($token['type'] === HTML5::CHARACTR && + preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data']) + ) { + /* Append the character to the current node. */ + $this->insertText($token['data']); + + /* A comment token */ + } elseif ($token['type'] === HTML5::COMMENT) { + /* Append a Comment node to the current node with the data + attribute set to the data given in the comment token. */ + $this->insertComment($token['data']); + + /* An end tag with the tag name "html" */ + } elseif ($token['name'] === 'html' && + $token['type'] === HTML5::ENDTAG + ) { + /* Switch to the trailing end phase. */ + $this->phase = self::END_PHASE; + + /* A start tag with the tag name "noframes" */ + } elseif ($token['name'] === 'noframes' && + $token['type'] === HTML5::STARTTAG + ) { + /* Process the token as if the insertion mode had been "in body". */ + $this->inBody($token); + + /* Anything else */ + } else { + /* Parse error. Ignore the token. */ + } + } + + private function trailingEndPhase($token) + { + /* After the main phase, as each token is emitted from the tokenisation + stage, it must be processed as described in this section. */ + + /* A DOCTYPE token */ + if ($token['type'] === HTML5::DOCTYPE) { + // Parse error. Ignore the token. + + /* A comment token */ + } elseif ($token['type'] === HTML5::COMMENT) { + /* Append a Comment node to the Document object with the data + attribute set to the data given in the comment token. */ + $comment = $this->dom->createComment($token['data']); + $this->dom->appendChild($comment); + + /* A character token that is one of one of U+0009 CHARACTER TABULATION, + U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), + or U+0020 SPACE */ + } elseif ($token['type'] === HTML5::CHARACTR && + preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data']) + ) { + /* Process the token as it would be processed in the main phase. */ + $this->mainPhase($token); + + /* A character token that is not one of U+0009 CHARACTER TABULATION, + U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), + or U+0020 SPACE. Or a start tag token. Or an end tag token. */ + } elseif (($token['type'] === HTML5::CHARACTR && + preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) || + $token['type'] === HTML5::STARTTAG || $token['type'] === HTML5::ENDTAG + ) { + /* Parse error. Switch back to the main phase and reprocess the + token. */ + $this->phase = self::MAIN_PHASE; + return $this->mainPhase($token); + + /* An end-of-file token */ + } elseif ($token['type'] === HTML5::EOF) { + /* OMG DONE!! */ + } + } + + private function insertElement($token, $append = true, $check = false) + { + // Proprietary workaround for libxml2's limitations with tag names + if ($check) { + // Slightly modified HTML5 tag-name modification, + // removing anything that's not an ASCII letter, digit, or hyphen + $token['name'] = preg_replace('/[^a-z0-9-]/i', '', $token['name']); + // Remove leading hyphens and numbers + $token['name'] = ltrim($token['name'], '-0..9'); + // In theory, this should ever be needed, but just in case + if ($token['name'] === '') { + $token['name'] = 'span'; + } // arbitrary generic choice + } + + $el = $this->dom->createElement($token['name']); + + foreach ($token['attr'] as $attr) { + if (!$el->hasAttribute($attr['name'])) { + $el->setAttribute($attr['name'], $attr['value']); + } + } + + $this->appendToRealParent($el); + $this->stack[] = $el; + + return $el; + } + + private function insertText($data) + { + $text = $this->dom->createTextNode($data); + $this->appendToRealParent($text); + } + + private function insertComment($data) + { + $comment = $this->dom->createComment($data); + $this->appendToRealParent($comment); + } + + private function appendToRealParent($node) + { + if ($this->foster_parent === null) { + end($this->stack)->appendChild($node); + + } elseif ($this->foster_parent !== null) { + /* If the foster parent element is the parent element of the + last table element in the stack of open elements, then the new + node must be inserted immediately before the last table element + in the stack of open elements in the foster parent element; + otherwise, the new node must be appended to the foster parent + element. */ + for ($n = count($this->stack) - 1; $n >= 0; $n--) { + if ($this->stack[$n]->nodeName === 'table' && + $this->stack[$n]->parentNode !== null + ) { + $table = $this->stack[$n]; + break; + } + } + + if (isset($table) && $this->foster_parent->isSameNode($table->parentNode)) { + $this->foster_parent->insertBefore($node, $table); + } else { + $this->foster_parent->appendChild($node); + } + + $this->foster_parent = null; + } + } + + private function elementInScope($el, $table = false) + { + if (is_array($el)) { + foreach ($el as $element) { + if ($this->elementInScope($element, $table)) { + return true; + } + } + + return false; + } + + $leng = count($this->stack); + + for ($n = 0; $n < $leng; $n++) { + /* 1. Initialise node to be the current node (the bottommost node of + the stack). */ + $node = $this->stack[$leng - 1 - $n]; + + if ($node->tagName === $el) { + /* 2. If node is the target node, terminate in a match state. */ + return true; + + } elseif ($node->tagName === 'table') { + /* 3. Otherwise, if node is a table element, terminate in a failure + state. */ + return false; + + } elseif ($table === true && in_array( + $node->tagName, + array( + 'caption', + 'td', + 'th', + 'button', + 'marquee', + 'object' + ) + ) + ) { + /* 4. Otherwise, if the algorithm is the "has an element in scope" + variant (rather than the "has an element in table scope" variant), + and node is one of the following, terminate in a failure state. */ + return false; + + } elseif ($node === $node->ownerDocument->documentElement) { + /* 5. Otherwise, if node is an html element (root element), terminate + in a failure state. (This can only happen if the node is the topmost + node of the stack of open elements, and prevents the next step from + being invoked if there are no more elements in the stack.) */ + return false; + } + + /* Otherwise, set node to the previous entry in the stack of open + elements and return to step 2. (This will never fail, since the loop + will always terminate in the previous step if the top of the stack + is reached.) */ + } + } + + private function reconstructActiveFormattingElements() + { + /* 1. If there are no entries in the list of active formatting elements, + then there is nothing to reconstruct; stop this algorithm. */ + $formatting_elements = count($this->a_formatting); + + if ($formatting_elements === 0) { + return false; + } + + /* 3. Let entry be the last (most recently added) element in the list + of active formatting elements. */ + $entry = end($this->a_formatting); + + /* 2. If the last (most recently added) entry in the list of active + formatting elements is a marker, or if it is an element that is in the + stack of open elements, then there is nothing to reconstruct; stop this + algorithm. */ + if ($entry === self::MARKER || in_array($entry, $this->stack, true)) { + return false; + } + + for ($a = $formatting_elements - 1; $a >= 0; true) { + /* 4. If there are no entries before entry in the list of active + formatting elements, then jump to step 8. */ + if ($a === 0) { + $step_seven = false; + break; + } + + /* 5. Let entry be the entry one earlier than entry in the list of + active formatting elements. */ + $a--; + $entry = $this->a_formatting[$a]; + + /* 6. If entry is neither a marker nor an element that is also in + thetack of open elements, go to step 4. */ + if ($entry === self::MARKER || in_array($entry, $this->stack, true)) { + break; + } + } + + while (true) { + /* 7. Let entry be the element one later than entry in the list of + active formatting elements. */ + if (isset($step_seven) && $step_seven === true) { + $a++; + $entry = $this->a_formatting[$a]; + } + + /* 8. Perform a shallow clone of the element entry to obtain clone. */ + $clone = $entry->cloneNode(); + + /* 9. Append clone to the current node and push it onto the stack + of open elements so that it is the new current node. */ + end($this->stack)->appendChild($clone); + $this->stack[] = $clone; + + /* 10. Replace the entry for entry in the list with an entry for + clone. */ + $this->a_formatting[$a] = $clone; + + /* 11. If the entry for clone in the list of active formatting + elements is not the last entry in the list, return to step 7. */ + if (end($this->a_formatting) !== $clone) { + $step_seven = true; + } else { + break; + } + } + } + + private function clearTheActiveFormattingElementsUpToTheLastMarker() + { + /* When the steps below require the UA to clear the list of active + formatting elements up to the last marker, the UA must perform the + following steps: */ + + while (true) { + /* 1. Let entry be the last (most recently added) entry in the list + of active formatting elements. */ + $entry = end($this->a_formatting); + + /* 2. Remove entry from the list of active formatting elements. */ + array_pop($this->a_formatting); + + /* 3. If entry was a marker, then stop the algorithm at this point. + The list has been cleared up to the last marker. */ + if ($entry === self::MARKER) { + break; + } + } + } + + private function generateImpliedEndTags($exclude = array()) + { + /* When the steps below require the UA to generate implied end tags, + then, if the current node is a dd element, a dt element, an li element, + a p element, a td element, a th element, or a tr element, the UA must + act as if an end tag with the respective tag name had been seen and + then generate implied end tags again. */ + $node = end($this->stack); + $elements = array_diff(array('dd', 'dt', 'li', 'p', 'td', 'th', 'tr'), $exclude); + + while (in_array(end($this->stack)->nodeName, $elements)) { + array_pop($this->stack); + } + } + + private function getElementCategory($node) + { + $name = $node->tagName; + if (in_array($name, $this->special)) { + return self::SPECIAL; + } elseif (in_array($name, $this->scoping)) { + return self::SCOPING; + } elseif (in_array($name, $this->formatting)) { + return self::FORMATTING; + } else { + return self::PHRASING; + } + } + + private function clearStackToTableContext($elements) + { + /* When the steps above require the UA to clear the stack back to a + table context, it means that the UA must, while the current node is not + a table element or an html element, pop elements from the stack of open + elements. If this causes any elements to be popped from the stack, then + this is a parse error. */ + while (true) { + $node = end($this->stack)->nodeName; + + if (in_array($node, $elements)) { + break; + } else { + array_pop($this->stack); + } + } + } + + private function resetInsertionMode() + { + /* 1. Let last be false. */ + $last = false; + $leng = count($this->stack); + + for ($n = $leng - 1; $n >= 0; $n--) { + /* 2. Let node be the last node in the stack of open elements. */ + $node = $this->stack[$n]; + + /* 3. If node is the first node in the stack of open elements, then + set last to true. If the element whose innerHTML attribute is being + set is neither a td element nor a th element, then set node to the + element whose innerHTML attribute is being set. (innerHTML case) */ + if ($this->stack[0]->isSameNode($node)) { + $last = true; + } + + /* 4. If node is a select element, then switch the insertion mode to + "in select" and abort these steps. (innerHTML case) */ + if ($node->nodeName === 'select') { + $this->mode = self::IN_SELECT; + break; + + /* 5. If node is a td or th element, then switch the insertion mode + to "in cell" and abort these steps. */ + } elseif ($node->nodeName === 'td' || $node->nodeName === 'th') { + $this->mode = self::IN_CELL; + break; + + /* 6. If node is a tr element, then switch the insertion mode to + "in row" and abort these steps. */ + } elseif ($node->nodeName === 'tr') { + $this->mode = self::IN_ROW; + break; + + /* 7. If node is a tbody, thead, or tfoot element, then switch the + insertion mode to "in table body" and abort these steps. */ + } elseif (in_array($node->nodeName, array('tbody', 'thead', 'tfoot'))) { + $this->mode = self::IN_TBODY; + break; + + /* 8. If node is a caption element, then switch the insertion mode + to "in caption" and abort these steps. */ + } elseif ($node->nodeName === 'caption') { + $this->mode = self::IN_CAPTION; + break; + + /* 9. If node is a colgroup element, then switch the insertion mode + to "in column group" and abort these steps. (innerHTML case) */ + } elseif ($node->nodeName === 'colgroup') { + $this->mode = self::IN_CGROUP; + break; + + /* 10. If node is a table element, then switch the insertion mode + to "in table" and abort these steps. */ + } elseif ($node->nodeName === 'table') { + $this->mode = self::IN_TABLE; + break; + + /* 11. If node is a head element, then switch the insertion mode + to "in body" ("in body"! not "in head"!) and abort these steps. + (innerHTML case) */ + } elseif ($node->nodeName === 'head') { + $this->mode = self::IN_BODY; + break; + + /* 12. If node is a body element, then switch the insertion mode to + "in body" and abort these steps. */ + } elseif ($node->nodeName === 'body') { + $this->mode = self::IN_BODY; + break; + + /* 13. If node is a frameset element, then switch the insertion + mode to "in frameset" and abort these steps. (innerHTML case) */ + } elseif ($node->nodeName === 'frameset') { + $this->mode = self::IN_FRAME; + break; + + /* 14. If node is an html element, then: if the head element + pointer is null, switch the insertion mode to "before head", + otherwise, switch the insertion mode to "after head". In either + case, abort these steps. (innerHTML case) */ + } elseif ($node->nodeName === 'html') { + $this->mode = ($this->head_pointer === null) + ? self::BEFOR_HEAD + : self::AFTER_HEAD; + + break; + + /* 15. If last is true, then set the insertion mode to "in body" + and abort these steps. (innerHTML case) */ + } elseif ($last) { + $this->mode = self::IN_BODY; + break; + } + } + } + + private function closeCell() + { + /* If the stack of open elements has a td or th element in table scope, + then act as if an end tag token with that tag name had been seen. */ + foreach (array('td', 'th') as $cell) { + if ($this->elementInScope($cell, true)) { + $this->inCell( + array( + 'name' => $cell, + 'type' => HTML5::ENDTAG + ) + ); + + break; + } + } + } + + public function save() + { + return $this->dom; + } +} diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Node.php b/thirdparty/HTMLPurifier/HTMLPurifier/Node.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Node.php rename to thirdparty/HTMLPurifier/HTMLPurifier/Node.php index d7dcf6239..3995fec9f 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Node.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/Node.php @@ -1,49 +1,49 @@ -data = $data; - $this->line = $line; - $this->col = $col; - } - - public function toTokenPair() { - return array(new HTMLPurifier_Token_Comment($this->data, $this->line, $this->col), null); - } -} +data = $data; + $this->line = $line; + $this->col = $col; + } + + public function toTokenPair() { + return array(new HTMLPurifier_Token_Comment($this->data, $this->line, $this->col), null); + } +} diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Node/Element.php b/thirdparty/HTMLPurifier/HTMLPurifier/Node/Element.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Node/Element.php rename to thirdparty/HTMLPurifier/HTMLPurifier/Node/Element.php index 7db4d0253..6cbf56dad 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Node/Element.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/Node/Element.php @@ -1,59 +1,59 @@ - form or the form, i.e. - * is it a pair of start/end tokens or an empty token. - * @bool - */ - public $empty = false; - - public $endCol = null, $endLine = null, $endArmor = array(); - - public function __construct($name, $attr = array(), $line = null, $col = null, $armor = array()) { - $this->name = $name; - $this->attr = $attr; - $this->line = $line; - $this->col = $col; - $this->armor = $armor; - } - - public function toTokenPair() { - // XXX inefficiency here, normalization is not necessary - if ($this->empty) { - return array(new HTMLPurifier_Token_Empty($this->name, $this->attr, $this->line, $this->col, $this->armor), null); - } else { - $start = new HTMLPurifier_Token_Start($this->name, $this->attr, $this->line, $this->col, $this->armor); - $end = new HTMLPurifier_Token_End($this->name, array(), $this->endLine, $this->endCol, $this->endArmor); - //$end->start = $start; - return array($start, $end); - } - } -} - + form or the form, i.e. + * is it a pair of start/end tokens or an empty token. + * @bool + */ + public $empty = false; + + public $endCol = null, $endLine = null, $endArmor = array(); + + public function __construct($name, $attr = array(), $line = null, $col = null, $armor = array()) { + $this->name = $name; + $this->attr = $attr; + $this->line = $line; + $this->col = $col; + $this->armor = $armor; + } + + public function toTokenPair() { + // XXX inefficiency here, normalization is not necessary + if ($this->empty) { + return array(new HTMLPurifier_Token_Empty($this->name, $this->attr, $this->line, $this->col, $this->armor), null); + } else { + $start = new HTMLPurifier_Token_Start($this->name, $this->attr, $this->line, $this->col, $this->armor); + $end = new HTMLPurifier_Token_End($this->name, array(), $this->endLine, $this->endCol, $this->endArmor); + //$end->start = $start; + return array($start, $end); + } + } +} + diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Node/Text.php b/thirdparty/HTMLPurifier/HTMLPurifier/Node/Text.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Node/Text.php rename to thirdparty/HTMLPurifier/HTMLPurifier/Node/Text.php index f51d861af..aec916647 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Node/Text.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/Node/Text.php @@ -1,54 +1,54 @@ -data = $data; - $this->is_whitespace = $is_whitespace; - $this->line = $line; - $this->col = $col; - } - - public function toTokenPair() { - return array(new HTMLPurifier_Token_Text($this->data, $this->line, $this->col), null); - } -} - -// vim: et sw=4 sts=4 +data = $data; + $this->is_whitespace = $is_whitespace; + $this->line = $line; + $this->col = $col; + } + + public function toTokenPair() { + return array(new HTMLPurifier_Token_Text($this->data, $this->line, $this->col), null); + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/PercentEncoder.php b/thirdparty/HTMLPurifier/HTMLPurifier/PercentEncoder.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/PercentEncoder.php rename to thirdparty/HTMLPurifier/HTMLPurifier/PercentEncoder.php index fb9fd1fc9..18c8bbb00 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/PercentEncoder.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/PercentEncoder.php @@ -1,111 +1,111 @@ -preserve[$i] = true; - } - for ($i = 65; $i <= 90; $i++) { // upper-case - $this->preserve[$i] = true; - } - for ($i = 97; $i <= 122; $i++) { // lower-case - $this->preserve[$i] = true; - } - $this->preserve[45] = true; // Dash - - $this->preserve[46] = true; // Period . - $this->preserve[95] = true; // Underscore _ - $this->preserve[126]= true; // Tilde ~ - - // extra letters not to escape - if ($preserve !== false) { - for ($i = 0, $c = strlen($preserve); $i < $c; $i++) { - $this->preserve[ord($preserve[$i])] = true; - } - } - } - - /** - * Our replacement for urlencode, it encodes all non-reserved characters, - * as well as any extra characters that were instructed to be preserved. - * @note - * Assumes that the string has already been normalized, making any - * and all percent escape sequences valid. Percents will not be - * re-escaped, regardless of their status in $preserve - * @param string $string String to be encoded - * @return string Encoded string. - */ - public function encode($string) - { - $ret = ''; - for ($i = 0, $c = strlen($string); $i < $c; $i++) { - if ($string[$i] !== '%' && !isset($this->preserve[$int = ord($string[$i])])) { - $ret .= '%' . sprintf('%02X', $int); - } else { - $ret .= $string[$i]; - } - } - return $ret; - } - - /** - * Fix up percent-encoding by decoding unreserved characters and normalizing. - * @warning This function is affected by $preserve, even though the - * usual desired behavior is for this not to preserve those - * characters. Be careful when reusing instances of PercentEncoder! - * @param string $string String to normalize - * @return string - */ - public function normalize($string) - { - if ($string == '') { - return ''; - } - $parts = explode('%', $string); - $ret = array_shift($parts); - foreach ($parts as $part) { - $length = strlen($part); - if ($length < 2) { - $ret .= '%25' . $part; - continue; - } - $encoding = substr($part, 0, 2); - $text = substr($part, 2); - if (!ctype_xdigit($encoding)) { - $ret .= '%25' . $part; - continue; - } - $int = hexdec($encoding); - if (isset($this->preserve[$int])) { - $ret .= chr($int) . $text; - continue; - } - $encoding = strtoupper($encoding); - $ret .= '%' . $encoding . $text; - } - return $ret; - } -} - -// vim: et sw=4 sts=4 +preserve[$i] = true; + } + for ($i = 65; $i <= 90; $i++) { // upper-case + $this->preserve[$i] = true; + } + for ($i = 97; $i <= 122; $i++) { // lower-case + $this->preserve[$i] = true; + } + $this->preserve[45] = true; // Dash - + $this->preserve[46] = true; // Period . + $this->preserve[95] = true; // Underscore _ + $this->preserve[126]= true; // Tilde ~ + + // extra letters not to escape + if ($preserve !== false) { + for ($i = 0, $c = strlen($preserve); $i < $c; $i++) { + $this->preserve[ord($preserve[$i])] = true; + } + } + } + + /** + * Our replacement for urlencode, it encodes all non-reserved characters, + * as well as any extra characters that were instructed to be preserved. + * @note + * Assumes that the string has already been normalized, making any + * and all percent escape sequences valid. Percents will not be + * re-escaped, regardless of their status in $preserve + * @param string $string String to be encoded + * @return string Encoded string. + */ + public function encode($string) + { + $ret = ''; + for ($i = 0, $c = strlen($string); $i < $c; $i++) { + if ($string[$i] !== '%' && !isset($this->preserve[$int = ord($string[$i])])) { + $ret .= '%' . sprintf('%02X', $int); + } else { + $ret .= $string[$i]; + } + } + return $ret; + } + + /** + * Fix up percent-encoding by decoding unreserved characters and normalizing. + * @warning This function is affected by $preserve, even though the + * usual desired behavior is for this not to preserve those + * characters. Be careful when reusing instances of PercentEncoder! + * @param string $string String to normalize + * @return string + */ + public function normalize($string) + { + if ($string == '') { + return ''; + } + $parts = explode('%', $string); + $ret = array_shift($parts); + foreach ($parts as $part) { + $length = strlen($part); + if ($length < 2) { + $ret .= '%25' . $part; + continue; + } + $encoding = substr($part, 0, 2); + $text = substr($part, 2); + if (!ctype_xdigit($encoding)) { + $ret .= '%25' . $part; + continue; + } + $int = hexdec($encoding); + if (isset($this->preserve[$int])) { + $ret .= chr($int) . $text; + continue; + } + $encoding = strtoupper($encoding); + $ret .= '%' . $encoding . $text; + } + return $ret; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Printer.php b/thirdparty/HTMLPurifier/HTMLPurifier/Printer.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Printer.php rename to thirdparty/HTMLPurifier/HTMLPurifier/Printer.php index 16acd4157..549e4cea1 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Printer.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/Printer.php @@ -1,218 +1,218 @@ -getAll(); - $context = new HTMLPurifier_Context(); - $this->generator = new HTMLPurifier_Generator($config, $context); - } - - /** - * Main function that renders object or aspect of that object - * @note Parameters vary depending on printer - */ - // function render() {} - - /** - * Returns a start tag - * @param string $tag Tag name - * @param array $attr Attribute array - * @return string - */ - protected function start($tag, $attr = array()) - { - return $this->generator->generateFromToken( - new HTMLPurifier_Token_Start($tag, $attr ? $attr : array()) - ); - } - - /** - * Returns an end tag - * @param string $tag Tag name - * @return string - */ - protected function end($tag) - { - return $this->generator->generateFromToken( - new HTMLPurifier_Token_End($tag) - ); - } - - /** - * Prints a complete element with content inside - * @param string $tag Tag name - * @param string $contents Element contents - * @param array $attr Tag attributes - * @param bool $escape whether or not to escape contents - * @return string - */ - protected function element($tag, $contents, $attr = array(), $escape = true) - { - return $this->start($tag, $attr) . - ($escape ? $this->escape($contents) : $contents) . - $this->end($tag); - } - - /** - * @param string $tag - * @param array $attr - * @return string - */ - protected function elementEmpty($tag, $attr = array()) - { - return $this->generator->generateFromToken( - new HTMLPurifier_Token_Empty($tag, $attr) - ); - } - - /** - * @param string $text - * @return string - */ - protected function text($text) - { - return $this->generator->generateFromToken( - new HTMLPurifier_Token_Text($text) - ); - } - - /** - * Prints a simple key/value row in a table. - * @param string $name Key - * @param mixed $value Value - * @return string - */ - protected function row($name, $value) - { - if (is_bool($value)) { - $value = $value ? 'On' : 'Off'; - } - return - $this->start('tr') . "\n" . - $this->element('th', $name) . "\n" . - $this->element('td', $value) . "\n" . - $this->end('tr'); - } - - /** - * Escapes a string for HTML output. - * @param string $string String to escape - * @return string - */ - protected function escape($string) - { - $string = HTMLPurifier_Encoder::cleanUTF8($string); - $string = htmlspecialchars($string, ENT_COMPAT, 'UTF-8'); - return $string; - } - - /** - * Takes a list of strings and turns them into a single list - * @param string[] $array List of strings - * @param bool $polite Bool whether or not to add an end before the last - * @return string - */ - protected function listify($array, $polite = false) - { - if (empty($array)) { - return 'None'; - } - $ret = ''; - $i = count($array); - foreach ($array as $value) { - $i--; - $ret .= $value; - if ($i > 0 && !($polite && $i == 1)) { - $ret .= ', '; - } - if ($polite && $i == 1) { - $ret .= 'and '; - } - } - return $ret; - } - - /** - * Retrieves the class of an object without prefixes, as well as metadata - * @param object $obj Object to determine class of - * @param string $sec_prefix Further prefix to remove - * @return string - */ - protected function getClass($obj, $sec_prefix = '') - { - static $five = null; - if ($five === null) { - $five = version_compare(PHP_VERSION, '5', '>='); - } - $prefix = 'HTMLPurifier_' . $sec_prefix; - if (!$five) { - $prefix = strtolower($prefix); - } - $class = str_replace($prefix, '', get_class($obj)); - $lclass = strtolower($class); - $class .= '('; - switch ($lclass) { - case 'enum': - $values = array(); - foreach ($obj->valid_values as $value => $bool) { - $values[] = $value; - } - $class .= implode(', ', $values); - break; - case 'css_composite': - $values = array(); - foreach ($obj->defs as $def) { - $values[] = $this->getClass($def, $sec_prefix); - } - $class .= implode(', ', $values); - break; - case 'css_multiple': - $class .= $this->getClass($obj->single, $sec_prefix) . ', '; - $class .= $obj->max; - break; - case 'css_denyelementdecorator': - $class .= $this->getClass($obj->def, $sec_prefix) . ', '; - $class .= $obj->element; - break; - case 'css_importantdecorator': - $class .= $this->getClass($obj->def, $sec_prefix); - if ($obj->allow) { - $class .= ', !important'; - } - break; - } - $class .= ')'; - return $class; - } -} - -// vim: et sw=4 sts=4 +getAll(); + $context = new HTMLPurifier_Context(); + $this->generator = new HTMLPurifier_Generator($config, $context); + } + + /** + * Main function that renders object or aspect of that object + * @note Parameters vary depending on printer + */ + // function render() {} + + /** + * Returns a start tag + * @param string $tag Tag name + * @param array $attr Attribute array + * @return string + */ + protected function start($tag, $attr = array()) + { + return $this->generator->generateFromToken( + new HTMLPurifier_Token_Start($tag, $attr ? $attr : array()) + ); + } + + /** + * Returns an end tag + * @param string $tag Tag name + * @return string + */ + protected function end($tag) + { + return $this->generator->generateFromToken( + new HTMLPurifier_Token_End($tag) + ); + } + + /** + * Prints a complete element with content inside + * @param string $tag Tag name + * @param string $contents Element contents + * @param array $attr Tag attributes + * @param bool $escape whether or not to escape contents + * @return string + */ + protected function element($tag, $contents, $attr = array(), $escape = true) + { + return $this->start($tag, $attr) . + ($escape ? $this->escape($contents) : $contents) . + $this->end($tag); + } + + /** + * @param string $tag + * @param array $attr + * @return string + */ + protected function elementEmpty($tag, $attr = array()) + { + return $this->generator->generateFromToken( + new HTMLPurifier_Token_Empty($tag, $attr) + ); + } + + /** + * @param string $text + * @return string + */ + protected function text($text) + { + return $this->generator->generateFromToken( + new HTMLPurifier_Token_Text($text) + ); + } + + /** + * Prints a simple key/value row in a table. + * @param string $name Key + * @param mixed $value Value + * @return string + */ + protected function row($name, $value) + { + if (is_bool($value)) { + $value = $value ? 'On' : 'Off'; + } + return + $this->start('tr') . "\n" . + $this->element('th', $name) . "\n" . + $this->element('td', $value) . "\n" . + $this->end('tr'); + } + + /** + * Escapes a string for HTML output. + * @param string $string String to escape + * @return string + */ + protected function escape($string) + { + $string = HTMLPurifier_Encoder::cleanUTF8($string); + $string = htmlspecialchars($string, ENT_COMPAT, 'UTF-8'); + return $string; + } + + /** + * Takes a list of strings and turns them into a single list + * @param string[] $array List of strings + * @param bool $polite Bool whether or not to add an end before the last + * @return string + */ + protected function listify($array, $polite = false) + { + if (empty($array)) { + return 'None'; + } + $ret = ''; + $i = count($array); + foreach ($array as $value) { + $i--; + $ret .= $value; + if ($i > 0 && !($polite && $i == 1)) { + $ret .= ', '; + } + if ($polite && $i == 1) { + $ret .= 'and '; + } + } + return $ret; + } + + /** + * Retrieves the class of an object without prefixes, as well as metadata + * @param object $obj Object to determine class of + * @param string $sec_prefix Further prefix to remove + * @return string + */ + protected function getClass($obj, $sec_prefix = '') + { + static $five = null; + if ($five === null) { + $five = version_compare(PHP_VERSION, '5', '>='); + } + $prefix = 'HTMLPurifier_' . $sec_prefix; + if (!$five) { + $prefix = strtolower($prefix); + } + $class = str_replace($prefix, '', get_class($obj)); + $lclass = strtolower($class); + $class .= '('; + switch ($lclass) { + case 'enum': + $values = array(); + foreach ($obj->valid_values as $value => $bool) { + $values[] = $value; + } + $class .= implode(', ', $values); + break; + case 'css_composite': + $values = array(); + foreach ($obj->defs as $def) { + $values[] = $this->getClass($def, $sec_prefix); + } + $class .= implode(', ', $values); + break; + case 'css_multiple': + $class .= $this->getClass($obj->single, $sec_prefix) . ', '; + $class .= $obj->max; + break; + case 'css_denyelementdecorator': + $class .= $this->getClass($obj->def, $sec_prefix) . ', '; + $class .= $obj->element; + break; + case 'css_importantdecorator': + $class .= $this->getClass($obj->def, $sec_prefix); + if ($obj->allow) { + $class .= ', !important'; + } + break; + } + $class .= ')'; + return $class; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Printer/CSSDefinition.php b/thirdparty/HTMLPurifier/HTMLPurifier/Printer/CSSDefinition.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Printer/CSSDefinition.php rename to thirdparty/HTMLPurifier/HTMLPurifier/Printer/CSSDefinition.php index afc8c18ab..29505fe12 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Printer/CSSDefinition.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/Printer/CSSDefinition.php @@ -1,44 +1,44 @@ -def = $config->getCSSDefinition(); - $ret = ''; - - $ret .= $this->start('div', array('class' => 'HTMLPurifier_Printer')); - $ret .= $this->start('table'); - - $ret .= $this->element('caption', 'Properties ($info)'); - - $ret .= $this->start('thead'); - $ret .= $this->start('tr'); - $ret .= $this->element('th', 'Property', array('class' => 'heavy')); - $ret .= $this->element('th', 'Definition', array('class' => 'heavy', 'style' => 'width:auto;')); - $ret .= $this->end('tr'); - $ret .= $this->end('thead'); - - ksort($this->def->info); - foreach ($this->def->info as $property => $obj) { - $name = $this->getClass($obj, 'AttrDef_'); - $ret .= $this->row($property, $name); - } - - $ret .= $this->end('table'); - $ret .= $this->end('div'); - - return $ret; - } -} - -// vim: et sw=4 sts=4 +def = $config->getCSSDefinition(); + $ret = ''; + + $ret .= $this->start('div', array('class' => 'HTMLPurifier_Printer')); + $ret .= $this->start('table'); + + $ret .= $this->element('caption', 'Properties ($info)'); + + $ret .= $this->start('thead'); + $ret .= $this->start('tr'); + $ret .= $this->element('th', 'Property', array('class' => 'heavy')); + $ret .= $this->element('th', 'Definition', array('class' => 'heavy', 'style' => 'width:auto;')); + $ret .= $this->end('tr'); + $ret .= $this->end('thead'); + + ksort($this->def->info); + foreach ($this->def->info as $property => $obj) { + $name = $this->getClass($obj, 'AttrDef_'); + $ret .= $this->row($property, $name); + } + + $ret .= $this->end('table'); + $ret .= $this->end('div'); + + return $ret; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Printer/ConfigForm.css b/thirdparty/HTMLPurifier/HTMLPurifier/Printer/ConfigForm.css similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Printer/ConfigForm.css rename to thirdparty/HTMLPurifier/HTMLPurifier/Printer/ConfigForm.css index 7af30fc3a..3ff1a88aa 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Printer/ConfigForm.css +++ b/thirdparty/HTMLPurifier/HTMLPurifier/Printer/ConfigForm.css @@ -1,10 +1,10 @@ - -.hp-config {} - -.hp-config tbody th {text-align:right; padding-right:0.5em;} -.hp-config thead, .hp-config .namespace {background:#3C578C; color:#FFF;} -.hp-config .namespace th {text-align:center;} -.hp-config .verbose {display:none;} -.hp-config .controls {text-align:center;} - -/* vim: et sw=4 sts=4 */ + +.hp-config {} + +.hp-config tbody th {text-align:right; padding-right:0.5em;} +.hp-config thead, .hp-config .namespace {background:#3C578C; color:#FFF;} +.hp-config .namespace th {text-align:center;} +.hp-config .verbose {display:none;} +.hp-config .controls {text-align:center;} + +/* vim: et sw=4 sts=4 */ diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Printer/ConfigForm.js b/thirdparty/HTMLPurifier/HTMLPurifier/Printer/ConfigForm.js similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Printer/ConfigForm.js rename to thirdparty/HTMLPurifier/HTMLPurifier/Printer/ConfigForm.js index 83e065531..cba00c9b8 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Printer/ConfigForm.js +++ b/thirdparty/HTMLPurifier/HTMLPurifier/Printer/ConfigForm.js @@ -1,5 +1,5 @@ -function toggleWriteability(id_of_patient, checked) { - document.getElementById(id_of_patient).disabled = checked; -} - -// vim: et sw=4 sts=4 +function toggleWriteability(id_of_patient, checked) { + document.getElementById(id_of_patient).disabled = checked; +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Printer/ConfigForm.php b/thirdparty/HTMLPurifier/HTMLPurifier/Printer/ConfigForm.php similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Printer/ConfigForm.php rename to thirdparty/HTMLPurifier/HTMLPurifier/Printer/ConfigForm.php index 660960f37..36100ce73 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Printer/ConfigForm.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/Printer/ConfigForm.php @@ -1,447 +1,447 @@ -docURL = $doc_url; - $this->name = $name; - $this->compress = $compress; - // initialize sub-printers - $this->fields[0] = new HTMLPurifier_Printer_ConfigForm_default(); - $this->fields[HTMLPurifier_VarParser::BOOL] = new HTMLPurifier_Printer_ConfigForm_bool(); - } - - /** - * Sets default column and row size for textareas in sub-printers - * @param $cols Integer columns of textarea, null to use default - * @param $rows Integer rows of textarea, null to use default - */ - public function setTextareaDimensions($cols = null, $rows = null) - { - if ($cols) { - $this->fields['default']->cols = $cols; - } - if ($rows) { - $this->fields['default']->rows = $rows; - } - } - - /** - * Retrieves styling, in case it is not accessible by webserver - */ - public static function getCSS() - { - return file_get_contents(HTMLPURIFIER_PREFIX . '/HTMLPurifier/Printer/ConfigForm.css'); - } - - /** - * Retrieves JavaScript, in case it is not accessible by webserver - */ - public static function getJavaScript() - { - return file_get_contents(HTMLPURIFIER_PREFIX . '/HTMLPurifier/Printer/ConfigForm.js'); - } - - /** - * Returns HTML output for a configuration form - * @param HTMLPurifier_Config|array $config Configuration object of current form state, or an array - * where [0] has an HTML namespace and [1] is being rendered. - * @param array|bool $allowed Optional namespace(s) and directives to restrict form to. - * @param bool $render_controls - * @return string - */ - public function render($config, $allowed = true, $render_controls = true) - { - if (is_array($config) && isset($config[0])) { - $gen_config = $config[0]; - $config = $config[1]; - } else { - $gen_config = $config; - } - - $this->config = $config; - $this->genConfig = $gen_config; - $this->prepareGenerator($gen_config); - - $allowed = HTMLPurifier_Config::getAllowedDirectivesForForm($allowed, $config->def); - $all = array(); - foreach ($allowed as $key) { - list($ns, $directive) = $key; - $all[$ns][$directive] = $config->get($ns . '.' . $directive); - } - - $ret = ''; - $ret .= $this->start('table', array('class' => 'hp-config')); - $ret .= $this->start('thead'); - $ret .= $this->start('tr'); - $ret .= $this->element('th', 'Directive', array('class' => 'hp-directive')); - $ret .= $this->element('th', 'Value', array('class' => 'hp-value')); - $ret .= $this->end('tr'); - $ret .= $this->end('thead'); - foreach ($all as $ns => $directives) { - $ret .= $this->renderNamespace($ns, $directives); - } - if ($render_controls) { - $ret .= $this->start('tbody'); - $ret .= $this->start('tr'); - $ret .= $this->start('td', array('colspan' => 2, 'class' => 'controls')); - $ret .= $this->elementEmpty('input', array('type' => 'submit', 'value' => 'Submit')); - $ret .= '[Reset]'; - $ret .= $this->end('td'); - $ret .= $this->end('tr'); - $ret .= $this->end('tbody'); - } - $ret .= $this->end('table'); - return $ret; - } - - /** - * Renders a single namespace - * @param $ns String namespace name - * @param array $directives array of directives to values - * @return string - */ - protected function renderNamespace($ns, $directives) - { - $ret = ''; - $ret .= $this->start('tbody', array('class' => 'namespace')); - $ret .= $this->start('tr'); - $ret .= $this->element('th', $ns, array('colspan' => 2)); - $ret .= $this->end('tr'); - $ret .= $this->end('tbody'); - $ret .= $this->start('tbody'); - foreach ($directives as $directive => $value) { - $ret .= $this->start('tr'); - $ret .= $this->start('th'); - if ($this->docURL) { - $url = str_replace('%s', urlencode("$ns.$directive"), $this->docURL); - $ret .= $this->start('a', array('href' => $url)); - } - $attr = array('for' => "{$this->name}:$ns.$directive"); - - // crop directive name if it's too long - if (!$this->compress || (strlen($directive) < $this->compress)) { - $directive_disp = $directive; - } else { - $directive_disp = substr($directive, 0, $this->compress - 2) . '...'; - $attr['title'] = $directive; - } - - $ret .= $this->element( - 'label', - $directive_disp, - // component printers must create an element with this id - $attr - ); - if ($this->docURL) { - $ret .= $this->end('a'); - } - $ret .= $this->end('th'); - - $ret .= $this->start('td'); - $def = $this->config->def->info["$ns.$directive"]; - if (is_int($def)) { - $allow_null = $def < 0; - $type = abs($def); - } else { - $type = $def->type; - $allow_null = isset($def->allow_null); - } - if (!isset($this->fields[$type])) { - $type = 0; - } // default - $type_obj = $this->fields[$type]; - if ($allow_null) { - $type_obj = new HTMLPurifier_Printer_ConfigForm_NullDecorator($type_obj); - } - $ret .= $type_obj->render($ns, $directive, $value, $this->name, array($this->genConfig, $this->config)); - $ret .= $this->end('td'); - $ret .= $this->end('tr'); - } - $ret .= $this->end('tbody'); - return $ret; - } - -} - -/** - * Printer decorator for directives that accept null - */ -class HTMLPurifier_Printer_ConfigForm_NullDecorator extends HTMLPurifier_Printer -{ - /** - * Printer being decorated - * @type HTMLPurifier_Printer - */ - protected $obj; - - /** - * @param HTMLPurifier_Printer $obj Printer to decorate - */ - public function __construct($obj) - { - parent::__construct(); - $this->obj = $obj; - } - - /** - * @param string $ns - * @param string $directive - * @param string $value - * @param string $name - * @param HTMLPurifier_Config|array $config - * @return string - */ - public function render($ns, $directive, $value, $name, $config) - { - if (is_array($config) && isset($config[0])) { - $gen_config = $config[0]; - $config = $config[1]; - } else { - $gen_config = $config; - } - $this->prepareGenerator($gen_config); - - $ret = ''; - $ret .= $this->start('label', array('for' => "$name:Null_$ns.$directive")); - $ret .= $this->element('span', "$ns.$directive:", array('class' => 'verbose')); - $ret .= $this->text(' Null/Disabled'); - $ret .= $this->end('label'); - $attr = array( - 'type' => 'checkbox', - 'value' => '1', - 'class' => 'null-toggle', - 'name' => "$name" . "[Null_$ns.$directive]", - 'id' => "$name:Null_$ns.$directive", - 'onclick' => "toggleWriteability('$name:$ns.$directive',checked)" // INLINE JAVASCRIPT!!!! - ); - if ($this->obj instanceof HTMLPurifier_Printer_ConfigForm_bool) { - // modify inline javascript slightly - $attr['onclick'] = - "toggleWriteability('$name:Yes_$ns.$directive',checked);" . - "toggleWriteability('$name:No_$ns.$directive',checked)"; - } - if ($value === null) { - $attr['checked'] = 'checked'; - } - $ret .= $this->elementEmpty('input', $attr); - $ret .= $this->text(' or '); - $ret .= $this->elementEmpty('br'); - $ret .= $this->obj->render($ns, $directive, $value, $name, array($gen_config, $config)); - return $ret; - } -} - -/** - * Swiss-army knife configuration form field printer - */ -class HTMLPurifier_Printer_ConfigForm_default extends HTMLPurifier_Printer -{ - /** - * @type int - */ - public $cols = 18; - - /** - * @type int - */ - public $rows = 5; - - /** - * @param string $ns - * @param string $directive - * @param string $value - * @param string $name - * @param HTMLPurifier_Config|array $config - * @return string - */ - public function render($ns, $directive, $value, $name, $config) - { - if (is_array($config) && isset($config[0])) { - $gen_config = $config[0]; - $config = $config[1]; - } else { - $gen_config = $config; - } - $this->prepareGenerator($gen_config); - // this should probably be split up a little - $ret = ''; - $def = $config->def->info["$ns.$directive"]; - if (is_int($def)) { - $type = abs($def); - } else { - $type = $def->type; - } - if (is_array($value)) { - switch ($type) { - case HTMLPurifier_VarParser::LOOKUP: - $array = $value; - $value = array(); - foreach ($array as $val => $b) { - $value[] = $val; - } - //TODO does this need a break? - case HTMLPurifier_VarParser::ALIST: - $value = implode(PHP_EOL, $value); - break; - case HTMLPurifier_VarParser::HASH: - $nvalue = ''; - foreach ($value as $i => $v) { - $nvalue .= "$i:$v" . PHP_EOL; - } - $value = $nvalue; - break; - default: - $value = ''; - } - } - if ($type === HTMLPurifier_VarParser::MIXED) { - return 'Not supported'; - $value = serialize($value); - } - $attr = array( - 'name' => "$name" . "[$ns.$directive]", - 'id' => "$name:$ns.$directive" - ); - if ($value === null) { - $attr['disabled'] = 'disabled'; - } - if (isset($def->allowed)) { - $ret .= $this->start('select', $attr); - foreach ($def->allowed as $val => $b) { - $attr = array(); - if ($value == $val) { - $attr['selected'] = 'selected'; - } - $ret .= $this->element('option', $val, $attr); - } - $ret .= $this->end('select'); - } elseif ($type === HTMLPurifier_VarParser::TEXT || - $type === HTMLPurifier_VarParser::ITEXT || - $type === HTMLPurifier_VarParser::ALIST || - $type === HTMLPurifier_VarParser::HASH || - $type === HTMLPurifier_VarParser::LOOKUP) { - $attr['cols'] = $this->cols; - $attr['rows'] = $this->rows; - $ret .= $this->start('textarea', $attr); - $ret .= $this->text($value); - $ret .= $this->end('textarea'); - } else { - $attr['value'] = $value; - $attr['type'] = 'text'; - $ret .= $this->elementEmpty('input', $attr); - } - return $ret; - } -} - -/** - * Bool form field printer - */ -class HTMLPurifier_Printer_ConfigForm_bool extends HTMLPurifier_Printer -{ - /** - * @param string $ns - * @param string $directive - * @param string $value - * @param string $name - * @param HTMLPurifier_Config|array $config - * @return string - */ - public function render($ns, $directive, $value, $name, $config) - { - if (is_array($config) && isset($config[0])) { - $gen_config = $config[0]; - $config = $config[1]; - } else { - $gen_config = $config; - } - $this->prepareGenerator($gen_config); - $ret = ''; - $ret .= $this->start('div', array('id' => "$name:$ns.$directive")); - - $ret .= $this->start('label', array('for' => "$name:Yes_$ns.$directive")); - $ret .= $this->element('span', "$ns.$directive:", array('class' => 'verbose')); - $ret .= $this->text(' Yes'); - $ret .= $this->end('label'); - - $attr = array( - 'type' => 'radio', - 'name' => "$name" . "[$ns.$directive]", - 'id' => "$name:Yes_$ns.$directive", - 'value' => '1' - ); - if ($value === true) { - $attr['checked'] = 'checked'; - } - if ($value === null) { - $attr['disabled'] = 'disabled'; - } - $ret .= $this->elementEmpty('input', $attr); - - $ret .= $this->start('label', array('for' => "$name:No_$ns.$directive")); - $ret .= $this->element('span', "$ns.$directive:", array('class' => 'verbose')); - $ret .= $this->text(' No'); - $ret .= $this->end('label'); - - $attr = array( - 'type' => 'radio', - 'name' => "$name" . "[$ns.$directive]", - 'id' => "$name:No_$ns.$directive", - 'value' => '0' - ); - if ($value === false) { - $attr['checked'] = 'checked'; - } - if ($value === null) { - $attr['disabled'] = 'disabled'; - } - $ret .= $this->elementEmpty('input', $attr); - - $ret .= $this->end('div'); - - return $ret; - } -} - -// vim: et sw=4 sts=4 +docURL = $doc_url; + $this->name = $name; + $this->compress = $compress; + // initialize sub-printers + $this->fields[0] = new HTMLPurifier_Printer_ConfigForm_default(); + $this->fields[HTMLPurifier_VarParser::BOOL] = new HTMLPurifier_Printer_ConfigForm_bool(); + } + + /** + * Sets default column and row size for textareas in sub-printers + * @param $cols Integer columns of textarea, null to use default + * @param $rows Integer rows of textarea, null to use default + */ + public function setTextareaDimensions($cols = null, $rows = null) + { + if ($cols) { + $this->fields['default']->cols = $cols; + } + if ($rows) { + $this->fields['default']->rows = $rows; + } + } + + /** + * Retrieves styling, in case it is not accessible by webserver + */ + public static function getCSS() + { + return file_get_contents(HTMLPURIFIER_PREFIX . '/HTMLPurifier/Printer/ConfigForm.css'); + } + + /** + * Retrieves JavaScript, in case it is not accessible by webserver + */ + public static function getJavaScript() + { + return file_get_contents(HTMLPURIFIER_PREFIX . '/HTMLPurifier/Printer/ConfigForm.js'); + } + + /** + * Returns HTML output for a configuration form + * @param HTMLPurifier_Config|array $config Configuration object of current form state, or an array + * where [0] has an HTML namespace and [1] is being rendered. + * @param array|bool $allowed Optional namespace(s) and directives to restrict form to. + * @param bool $render_controls + * @return string + */ + public function render($config, $allowed = true, $render_controls = true) + { + if (is_array($config) && isset($config[0])) { + $gen_config = $config[0]; + $config = $config[1]; + } else { + $gen_config = $config; + } + + $this->config = $config; + $this->genConfig = $gen_config; + $this->prepareGenerator($gen_config); + + $allowed = HTMLPurifier_Config::getAllowedDirectivesForForm($allowed, $config->def); + $all = array(); + foreach ($allowed as $key) { + list($ns, $directive) = $key; + $all[$ns][$directive] = $config->get($ns . '.' . $directive); + } + + $ret = ''; + $ret .= $this->start('table', array('class' => 'hp-config')); + $ret .= $this->start('thead'); + $ret .= $this->start('tr'); + $ret .= $this->element('th', 'Directive', array('class' => 'hp-directive')); + $ret .= $this->element('th', 'Value', array('class' => 'hp-value')); + $ret .= $this->end('tr'); + $ret .= $this->end('thead'); + foreach ($all as $ns => $directives) { + $ret .= $this->renderNamespace($ns, $directives); + } + if ($render_controls) { + $ret .= $this->start('tbody'); + $ret .= $this->start('tr'); + $ret .= $this->start('td', array('colspan' => 2, 'class' => 'controls')); + $ret .= $this->elementEmpty('input', array('type' => 'submit', 'value' => 'Submit')); + $ret .= '[Reset]'; + $ret .= $this->end('td'); + $ret .= $this->end('tr'); + $ret .= $this->end('tbody'); + } + $ret .= $this->end('table'); + return $ret; + } + + /** + * Renders a single namespace + * @param $ns String namespace name + * @param array $directives array of directives to values + * @return string + */ + protected function renderNamespace($ns, $directives) + { + $ret = ''; + $ret .= $this->start('tbody', array('class' => 'namespace')); + $ret .= $this->start('tr'); + $ret .= $this->element('th', $ns, array('colspan' => 2)); + $ret .= $this->end('tr'); + $ret .= $this->end('tbody'); + $ret .= $this->start('tbody'); + foreach ($directives as $directive => $value) { + $ret .= $this->start('tr'); + $ret .= $this->start('th'); + if ($this->docURL) { + $url = str_replace('%s', urlencode("$ns.$directive"), $this->docURL); + $ret .= $this->start('a', array('href' => $url)); + } + $attr = array('for' => "{$this->name}:$ns.$directive"); + + // crop directive name if it's too long + if (!$this->compress || (strlen($directive) < $this->compress)) { + $directive_disp = $directive; + } else { + $directive_disp = substr($directive, 0, $this->compress - 2) . '...'; + $attr['title'] = $directive; + } + + $ret .= $this->element( + 'label', + $directive_disp, + // component printers must create an element with this id + $attr + ); + if ($this->docURL) { + $ret .= $this->end('a'); + } + $ret .= $this->end('th'); + + $ret .= $this->start('td'); + $def = $this->config->def->info["$ns.$directive"]; + if (is_int($def)) { + $allow_null = $def < 0; + $type = abs($def); + } else { + $type = $def->type; + $allow_null = isset($def->allow_null); + } + if (!isset($this->fields[$type])) { + $type = 0; + } // default + $type_obj = $this->fields[$type]; + if ($allow_null) { + $type_obj = new HTMLPurifier_Printer_ConfigForm_NullDecorator($type_obj); + } + $ret .= $type_obj->render($ns, $directive, $value, $this->name, array($this->genConfig, $this->config)); + $ret .= $this->end('td'); + $ret .= $this->end('tr'); + } + $ret .= $this->end('tbody'); + return $ret; + } + +} + +/** + * Printer decorator for directives that accept null + */ +class HTMLPurifier_Printer_ConfigForm_NullDecorator extends HTMLPurifier_Printer +{ + /** + * Printer being decorated + * @type HTMLPurifier_Printer + */ + protected $obj; + + /** + * @param HTMLPurifier_Printer $obj Printer to decorate + */ + public function __construct($obj) + { + parent::__construct(); + $this->obj = $obj; + } + + /** + * @param string $ns + * @param string $directive + * @param string $value + * @param string $name + * @param HTMLPurifier_Config|array $config + * @return string + */ + public function render($ns, $directive, $value, $name, $config) + { + if (is_array($config) && isset($config[0])) { + $gen_config = $config[0]; + $config = $config[1]; + } else { + $gen_config = $config; + } + $this->prepareGenerator($gen_config); + + $ret = ''; + $ret .= $this->start('label', array('for' => "$name:Null_$ns.$directive")); + $ret .= $this->element('span', "$ns.$directive:", array('class' => 'verbose')); + $ret .= $this->text(' Null/Disabled'); + $ret .= $this->end('label'); + $attr = array( + 'type' => 'checkbox', + 'value' => '1', + 'class' => 'null-toggle', + 'name' => "$name" . "[Null_$ns.$directive]", + 'id' => "$name:Null_$ns.$directive", + 'onclick' => "toggleWriteability('$name:$ns.$directive',checked)" // INLINE JAVASCRIPT!!!! + ); + if ($this->obj instanceof HTMLPurifier_Printer_ConfigForm_bool) { + // modify inline javascript slightly + $attr['onclick'] = + "toggleWriteability('$name:Yes_$ns.$directive',checked);" . + "toggleWriteability('$name:No_$ns.$directive',checked)"; + } + if ($value === null) { + $attr['checked'] = 'checked'; + } + $ret .= $this->elementEmpty('input', $attr); + $ret .= $this->text(' or '); + $ret .= $this->elementEmpty('br'); + $ret .= $this->obj->render($ns, $directive, $value, $name, array($gen_config, $config)); + return $ret; + } +} + +/** + * Swiss-army knife configuration form field printer + */ +class HTMLPurifier_Printer_ConfigForm_default extends HTMLPurifier_Printer +{ + /** + * @type int + */ + public $cols = 18; + + /** + * @type int + */ + public $rows = 5; + + /** + * @param string $ns + * @param string $directive + * @param string $value + * @param string $name + * @param HTMLPurifier_Config|array $config + * @return string + */ + public function render($ns, $directive, $value, $name, $config) + { + if (is_array($config) && isset($config[0])) { + $gen_config = $config[0]; + $config = $config[1]; + } else { + $gen_config = $config; + } + $this->prepareGenerator($gen_config); + // this should probably be split up a little + $ret = ''; + $def = $config->def->info["$ns.$directive"]; + if (is_int($def)) { + $type = abs($def); + } else { + $type = $def->type; + } + if (is_array($value)) { + switch ($type) { + case HTMLPurifier_VarParser::LOOKUP: + $array = $value; + $value = array(); + foreach ($array as $val => $b) { + $value[] = $val; + } + //TODO does this need a break? + case HTMLPurifier_VarParser::ALIST: + $value = implode(PHP_EOL, $value); + break; + case HTMLPurifier_VarParser::HASH: + $nvalue = ''; + foreach ($value as $i => $v) { + $nvalue .= "$i:$v" . PHP_EOL; + } + $value = $nvalue; + break; + default: + $value = ''; + } + } + if ($type === HTMLPurifier_VarParser::MIXED) { + return 'Not supported'; + $value = serialize($value); + } + $attr = array( + 'name' => "$name" . "[$ns.$directive]", + 'id' => "$name:$ns.$directive" + ); + if ($value === null) { + $attr['disabled'] = 'disabled'; + } + if (isset($def->allowed)) { + $ret .= $this->start('select', $attr); + foreach ($def->allowed as $val => $b) { + $attr = array(); + if ($value == $val) { + $attr['selected'] = 'selected'; + } + $ret .= $this->element('option', $val, $attr); + } + $ret .= $this->end('select'); + } elseif ($type === HTMLPurifier_VarParser::TEXT || + $type === HTMLPurifier_VarParser::ITEXT || + $type === HTMLPurifier_VarParser::ALIST || + $type === HTMLPurifier_VarParser::HASH || + $type === HTMLPurifier_VarParser::LOOKUP) { + $attr['cols'] = $this->cols; + $attr['rows'] = $this->rows; + $ret .= $this->start('textarea', $attr); + $ret .= $this->text($value); + $ret .= $this->end('textarea'); + } else { + $attr['value'] = $value; + $attr['type'] = 'text'; + $ret .= $this->elementEmpty('input', $attr); + } + return $ret; + } +} + +/** + * Bool form field printer + */ +class HTMLPurifier_Printer_ConfigForm_bool extends HTMLPurifier_Printer +{ + /** + * @param string $ns + * @param string $directive + * @param string $value + * @param string $name + * @param HTMLPurifier_Config|array $config + * @return string + */ + public function render($ns, $directive, $value, $name, $config) + { + if (is_array($config) && isset($config[0])) { + $gen_config = $config[0]; + $config = $config[1]; + } else { + $gen_config = $config; + } + $this->prepareGenerator($gen_config); + $ret = ''; + $ret .= $this->start('div', array('id' => "$name:$ns.$directive")); + + $ret .= $this->start('label', array('for' => "$name:Yes_$ns.$directive")); + $ret .= $this->element('span', "$ns.$directive:", array('class' => 'verbose')); + $ret .= $this->text(' Yes'); + $ret .= $this->end('label'); + + $attr = array( + 'type' => 'radio', + 'name' => "$name" . "[$ns.$directive]", + 'id' => "$name:Yes_$ns.$directive", + 'value' => '1' + ); + if ($value === true) { + $attr['checked'] = 'checked'; + } + if ($value === null) { + $attr['disabled'] = 'disabled'; + } + $ret .= $this->elementEmpty('input', $attr); + + $ret .= $this->start('label', array('for' => "$name:No_$ns.$directive")); + $ret .= $this->element('span', "$ns.$directive:", array('class' => 'verbose')); + $ret .= $this->text(' No'); + $ret .= $this->end('label'); + + $attr = array( + 'type' => 'radio', + 'name' => "$name" . "[$ns.$directive]", + 'id' => "$name:No_$ns.$directive", + 'value' => '0' + ); + if ($value === false) { + $attr['checked'] = 'checked'; + } + if ($value === null) { + $attr['disabled'] = 'disabled'; + } + $ret .= $this->elementEmpty('input', $attr); + + $ret .= $this->end('div'); + + return $ret; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Printer/HTMLDefinition.php b/thirdparty/HTMLPurifier/HTMLPurifier/Printer/HTMLDefinition.php similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Printer/HTMLDefinition.php rename to thirdparty/HTMLPurifier/HTMLPurifier/Printer/HTMLDefinition.php index 679d19ba3..5f2f2f8a7 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Printer/HTMLDefinition.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/Printer/HTMLDefinition.php @@ -1,324 +1,324 @@ -config =& $config; - - $this->def = $config->getHTMLDefinition(); - - $ret .= $this->start('div', array('class' => 'HTMLPurifier_Printer')); - - $ret .= $this->renderDoctype(); - $ret .= $this->renderEnvironment(); - $ret .= $this->renderContentSets(); - $ret .= $this->renderInfo(); - - $ret .= $this->end('div'); - - return $ret; - } - - /** - * Renders the Doctype table - * @return string - */ - protected function renderDoctype() - { - $doctype = $this->def->doctype; - $ret = ''; - $ret .= $this->start('table'); - $ret .= $this->element('caption', 'Doctype'); - $ret .= $this->row('Name', $doctype->name); - $ret .= $this->row('XML', $doctype->xml ? 'Yes' : 'No'); - $ret .= $this->row('Default Modules', implode($doctype->modules, ', ')); - $ret .= $this->row('Default Tidy Modules', implode($doctype->tidyModules, ', ')); - $ret .= $this->end('table'); - return $ret; - } - - - /** - * Renders environment table, which is miscellaneous info - * @return string - */ - protected function renderEnvironment() - { - $def = $this->def; - - $ret = ''; - - $ret .= $this->start('table'); - $ret .= $this->element('caption', 'Environment'); - - $ret .= $this->row('Parent of fragment', $def->info_parent); - $ret .= $this->renderChildren($def->info_parent_def->child); - $ret .= $this->row('Block wrap name', $def->info_block_wrapper); - - $ret .= $this->start('tr'); - $ret .= $this->element('th', 'Global attributes'); - $ret .= $this->element('td', $this->listifyAttr($def->info_global_attr), null, 0); - $ret .= $this->end('tr'); - - $ret .= $this->start('tr'); - $ret .= $this->element('th', 'Tag transforms'); - $list = array(); - foreach ($def->info_tag_transform as $old => $new) { - $new = $this->getClass($new, 'TagTransform_'); - $list[] = "<$old> with $new"; - } - $ret .= $this->element('td', $this->listify($list)); - $ret .= $this->end('tr'); - - $ret .= $this->start('tr'); - $ret .= $this->element('th', 'Pre-AttrTransform'); - $ret .= $this->element('td', $this->listifyObjectList($def->info_attr_transform_pre)); - $ret .= $this->end('tr'); - - $ret .= $this->start('tr'); - $ret .= $this->element('th', 'Post-AttrTransform'); - $ret .= $this->element('td', $this->listifyObjectList($def->info_attr_transform_post)); - $ret .= $this->end('tr'); - - $ret .= $this->end('table'); - return $ret; - } - - /** - * Renders the Content Sets table - * @return string - */ - protected function renderContentSets() - { - $ret = ''; - $ret .= $this->start('table'); - $ret .= $this->element('caption', 'Content Sets'); - foreach ($this->def->info_content_sets as $name => $lookup) { - $ret .= $this->heavyHeader($name); - $ret .= $this->start('tr'); - $ret .= $this->element('td', $this->listifyTagLookup($lookup)); - $ret .= $this->end('tr'); - } - $ret .= $this->end('table'); - return $ret; - } - - /** - * Renders the Elements ($info) table - * @return string - */ - protected function renderInfo() - { - $ret = ''; - $ret .= $this->start('table'); - $ret .= $this->element('caption', 'Elements ($info)'); - ksort($this->def->info); - $ret .= $this->heavyHeader('Allowed tags', 2); - $ret .= $this->start('tr'); - $ret .= $this->element('td', $this->listifyTagLookup($this->def->info), array('colspan' => 2)); - $ret .= $this->end('tr'); - foreach ($this->def->info as $name => $def) { - $ret .= $this->start('tr'); - $ret .= $this->element('th', "<$name>", array('class' => 'heavy', 'colspan' => 2)); - $ret .= $this->end('tr'); - $ret .= $this->start('tr'); - $ret .= $this->element('th', 'Inline content'); - $ret .= $this->element('td', $def->descendants_are_inline ? 'Yes' : 'No'); - $ret .= $this->end('tr'); - if (!empty($def->excludes)) { - $ret .= $this->start('tr'); - $ret .= $this->element('th', 'Excludes'); - $ret .= $this->element('td', $this->listifyTagLookup($def->excludes)); - $ret .= $this->end('tr'); - } - if (!empty($def->attr_transform_pre)) { - $ret .= $this->start('tr'); - $ret .= $this->element('th', 'Pre-AttrTransform'); - $ret .= $this->element('td', $this->listifyObjectList($def->attr_transform_pre)); - $ret .= $this->end('tr'); - } - if (!empty($def->attr_transform_post)) { - $ret .= $this->start('tr'); - $ret .= $this->element('th', 'Post-AttrTransform'); - $ret .= $this->element('td', $this->listifyObjectList($def->attr_transform_post)); - $ret .= $this->end('tr'); - } - if (!empty($def->auto_close)) { - $ret .= $this->start('tr'); - $ret .= $this->element('th', 'Auto closed by'); - $ret .= $this->element('td', $this->listifyTagLookup($def->auto_close)); - $ret .= $this->end('tr'); - } - $ret .= $this->start('tr'); - $ret .= $this->element('th', 'Allowed attributes'); - $ret .= $this->element('td', $this->listifyAttr($def->attr), array(), 0); - $ret .= $this->end('tr'); - - if (!empty($def->required_attr)) { - $ret .= $this->row('Required attributes', $this->listify($def->required_attr)); - } - - $ret .= $this->renderChildren($def->child); - } - $ret .= $this->end('table'); - return $ret; - } - - /** - * Renders a row describing the allowed children of an element - * @param HTMLPurifier_ChildDef $def HTMLPurifier_ChildDef of pertinent element - * @return string - */ - protected function renderChildren($def) - { - $context = new HTMLPurifier_Context(); - $ret = ''; - $ret .= $this->start('tr'); - $elements = array(); - $attr = array(); - if (isset($def->elements)) { - if ($def->type == 'strictblockquote') { - $def->validateChildren(array(), $this->config, $context); - } - $elements = $def->elements; - } - if ($def->type == 'chameleon') { - $attr['rowspan'] = 2; - } elseif ($def->type == 'empty') { - $elements = array(); - } elseif ($def->type == 'table') { - $elements = array_flip( - array( - 'col', - 'caption', - 'colgroup', - 'thead', - 'tfoot', - 'tbody', - 'tr' - ) - ); - } - $ret .= $this->element('th', 'Allowed children', $attr); - - if ($def->type == 'chameleon') { - - $ret .= $this->element( - 'td', - 'Block: ' . - $this->escape($this->listifyTagLookup($def->block->elements)), - null, - 0 - ); - $ret .= $this->end('tr'); - $ret .= $this->start('tr'); - $ret .= $this->element( - 'td', - 'Inline: ' . - $this->escape($this->listifyTagLookup($def->inline->elements)), - null, - 0 - ); - - } elseif ($def->type == 'custom') { - - $ret .= $this->element( - 'td', - '' . ucfirst($def->type) . ': ' . - $def->dtd_regex - ); - - } else { - $ret .= $this->element( - 'td', - '' . ucfirst($def->type) . ': ' . - $this->escape($this->listifyTagLookup($elements)), - null, - 0 - ); - } - $ret .= $this->end('tr'); - return $ret; - } - - /** - * Listifies a tag lookup table. - * @param array $array Tag lookup array in form of array('tagname' => true) - * @return string - */ - protected function listifyTagLookup($array) - { - ksort($array); - $list = array(); - foreach ($array as $name => $discard) { - if ($name !== '#PCDATA' && !isset($this->def->info[$name])) { - continue; - } - $list[] = $name; - } - return $this->listify($list); - } - - /** - * Listifies a list of objects by retrieving class names and internal state - * @param array $array List of objects - * @return string - * @todo Also add information about internal state - */ - protected function listifyObjectList($array) - { - ksort($array); - $list = array(); - foreach ($array as $obj) { - $list[] = $this->getClass($obj, 'AttrTransform_'); - } - return $this->listify($list); - } - - /** - * Listifies a hash of attributes to AttrDef classes - * @param array $array Array hash in form of array('attrname' => HTMLPurifier_AttrDef) - * @return string - */ - protected function listifyAttr($array) - { - ksort($array); - $list = array(); - foreach ($array as $name => $obj) { - if ($obj === false) { - continue; - } - $list[] = "$name = " . $this->getClass($obj, 'AttrDef_') . ''; - } - return $this->listify($list); - } - - /** - * Creates a heavy header row - * @param string $text - * @param int $num - * @return string - */ - protected function heavyHeader($text, $num = 1) - { - $ret = ''; - $ret .= $this->start('tr'); - $ret .= $this->element('th', $text, array('colspan' => $num, 'class' => 'heavy')); - $ret .= $this->end('tr'); - return $ret; - } -} - -// vim: et sw=4 sts=4 +config =& $config; + + $this->def = $config->getHTMLDefinition(); + + $ret .= $this->start('div', array('class' => 'HTMLPurifier_Printer')); + + $ret .= $this->renderDoctype(); + $ret .= $this->renderEnvironment(); + $ret .= $this->renderContentSets(); + $ret .= $this->renderInfo(); + + $ret .= $this->end('div'); + + return $ret; + } + + /** + * Renders the Doctype table + * @return string + */ + protected function renderDoctype() + { + $doctype = $this->def->doctype; + $ret = ''; + $ret .= $this->start('table'); + $ret .= $this->element('caption', 'Doctype'); + $ret .= $this->row('Name', $doctype->name); + $ret .= $this->row('XML', $doctype->xml ? 'Yes' : 'No'); + $ret .= $this->row('Default Modules', implode($doctype->modules, ', ')); + $ret .= $this->row('Default Tidy Modules', implode($doctype->tidyModules, ', ')); + $ret .= $this->end('table'); + return $ret; + } + + + /** + * Renders environment table, which is miscellaneous info + * @return string + */ + protected function renderEnvironment() + { + $def = $this->def; + + $ret = ''; + + $ret .= $this->start('table'); + $ret .= $this->element('caption', 'Environment'); + + $ret .= $this->row('Parent of fragment', $def->info_parent); + $ret .= $this->renderChildren($def->info_parent_def->child); + $ret .= $this->row('Block wrap name', $def->info_block_wrapper); + + $ret .= $this->start('tr'); + $ret .= $this->element('th', 'Global attributes'); + $ret .= $this->element('td', $this->listifyAttr($def->info_global_attr), null, 0); + $ret .= $this->end('tr'); + + $ret .= $this->start('tr'); + $ret .= $this->element('th', 'Tag transforms'); + $list = array(); + foreach ($def->info_tag_transform as $old => $new) { + $new = $this->getClass($new, 'TagTransform_'); + $list[] = "<$old> with $new"; + } + $ret .= $this->element('td', $this->listify($list)); + $ret .= $this->end('tr'); + + $ret .= $this->start('tr'); + $ret .= $this->element('th', 'Pre-AttrTransform'); + $ret .= $this->element('td', $this->listifyObjectList($def->info_attr_transform_pre)); + $ret .= $this->end('tr'); + + $ret .= $this->start('tr'); + $ret .= $this->element('th', 'Post-AttrTransform'); + $ret .= $this->element('td', $this->listifyObjectList($def->info_attr_transform_post)); + $ret .= $this->end('tr'); + + $ret .= $this->end('table'); + return $ret; + } + + /** + * Renders the Content Sets table + * @return string + */ + protected function renderContentSets() + { + $ret = ''; + $ret .= $this->start('table'); + $ret .= $this->element('caption', 'Content Sets'); + foreach ($this->def->info_content_sets as $name => $lookup) { + $ret .= $this->heavyHeader($name); + $ret .= $this->start('tr'); + $ret .= $this->element('td', $this->listifyTagLookup($lookup)); + $ret .= $this->end('tr'); + } + $ret .= $this->end('table'); + return $ret; + } + + /** + * Renders the Elements ($info) table + * @return string + */ + protected function renderInfo() + { + $ret = ''; + $ret .= $this->start('table'); + $ret .= $this->element('caption', 'Elements ($info)'); + ksort($this->def->info); + $ret .= $this->heavyHeader('Allowed tags', 2); + $ret .= $this->start('tr'); + $ret .= $this->element('td', $this->listifyTagLookup($this->def->info), array('colspan' => 2)); + $ret .= $this->end('tr'); + foreach ($this->def->info as $name => $def) { + $ret .= $this->start('tr'); + $ret .= $this->element('th', "<$name>", array('class' => 'heavy', 'colspan' => 2)); + $ret .= $this->end('tr'); + $ret .= $this->start('tr'); + $ret .= $this->element('th', 'Inline content'); + $ret .= $this->element('td', $def->descendants_are_inline ? 'Yes' : 'No'); + $ret .= $this->end('tr'); + if (!empty($def->excludes)) { + $ret .= $this->start('tr'); + $ret .= $this->element('th', 'Excludes'); + $ret .= $this->element('td', $this->listifyTagLookup($def->excludes)); + $ret .= $this->end('tr'); + } + if (!empty($def->attr_transform_pre)) { + $ret .= $this->start('tr'); + $ret .= $this->element('th', 'Pre-AttrTransform'); + $ret .= $this->element('td', $this->listifyObjectList($def->attr_transform_pre)); + $ret .= $this->end('tr'); + } + if (!empty($def->attr_transform_post)) { + $ret .= $this->start('tr'); + $ret .= $this->element('th', 'Post-AttrTransform'); + $ret .= $this->element('td', $this->listifyObjectList($def->attr_transform_post)); + $ret .= $this->end('tr'); + } + if (!empty($def->auto_close)) { + $ret .= $this->start('tr'); + $ret .= $this->element('th', 'Auto closed by'); + $ret .= $this->element('td', $this->listifyTagLookup($def->auto_close)); + $ret .= $this->end('tr'); + } + $ret .= $this->start('tr'); + $ret .= $this->element('th', 'Allowed attributes'); + $ret .= $this->element('td', $this->listifyAttr($def->attr), array(), 0); + $ret .= $this->end('tr'); + + if (!empty($def->required_attr)) { + $ret .= $this->row('Required attributes', $this->listify($def->required_attr)); + } + + $ret .= $this->renderChildren($def->child); + } + $ret .= $this->end('table'); + return $ret; + } + + /** + * Renders a row describing the allowed children of an element + * @param HTMLPurifier_ChildDef $def HTMLPurifier_ChildDef of pertinent element + * @return string + */ + protected function renderChildren($def) + { + $context = new HTMLPurifier_Context(); + $ret = ''; + $ret .= $this->start('tr'); + $elements = array(); + $attr = array(); + if (isset($def->elements)) { + if ($def->type == 'strictblockquote') { + $def->validateChildren(array(), $this->config, $context); + } + $elements = $def->elements; + } + if ($def->type == 'chameleon') { + $attr['rowspan'] = 2; + } elseif ($def->type == 'empty') { + $elements = array(); + } elseif ($def->type == 'table') { + $elements = array_flip( + array( + 'col', + 'caption', + 'colgroup', + 'thead', + 'tfoot', + 'tbody', + 'tr' + ) + ); + } + $ret .= $this->element('th', 'Allowed children', $attr); + + if ($def->type == 'chameleon') { + + $ret .= $this->element( + 'td', + 'Block: ' . + $this->escape($this->listifyTagLookup($def->block->elements)), + null, + 0 + ); + $ret .= $this->end('tr'); + $ret .= $this->start('tr'); + $ret .= $this->element( + 'td', + 'Inline: ' . + $this->escape($this->listifyTagLookup($def->inline->elements)), + null, + 0 + ); + + } elseif ($def->type == 'custom') { + + $ret .= $this->element( + 'td', + '' . ucfirst($def->type) . ': ' . + $def->dtd_regex + ); + + } else { + $ret .= $this->element( + 'td', + '' . ucfirst($def->type) . ': ' . + $this->escape($this->listifyTagLookup($elements)), + null, + 0 + ); + } + $ret .= $this->end('tr'); + return $ret; + } + + /** + * Listifies a tag lookup table. + * @param array $array Tag lookup array in form of array('tagname' => true) + * @return string + */ + protected function listifyTagLookup($array) + { + ksort($array); + $list = array(); + foreach ($array as $name => $discard) { + if ($name !== '#PCDATA' && !isset($this->def->info[$name])) { + continue; + } + $list[] = $name; + } + return $this->listify($list); + } + + /** + * Listifies a list of objects by retrieving class names and internal state + * @param array $array List of objects + * @return string + * @todo Also add information about internal state + */ + protected function listifyObjectList($array) + { + ksort($array); + $list = array(); + foreach ($array as $obj) { + $list[] = $this->getClass($obj, 'AttrTransform_'); + } + return $this->listify($list); + } + + /** + * Listifies a hash of attributes to AttrDef classes + * @param array $array Array hash in form of array('attrname' => HTMLPurifier_AttrDef) + * @return string + */ + protected function listifyAttr($array) + { + ksort($array); + $list = array(); + foreach ($array as $name => $obj) { + if ($obj === false) { + continue; + } + $list[] = "$name = " . $this->getClass($obj, 'AttrDef_') . ''; + } + return $this->listify($list); + } + + /** + * Creates a heavy header row + * @param string $text + * @param int $num + * @return string + */ + protected function heavyHeader($text, $num = 1) + { + $ret = ''; + $ret .= $this->start('tr'); + $ret .= $this->element('th', $text, array('colspan' => $num, 'class' => 'heavy')); + $ret .= $this->end('tr'); + return $ret; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/PropertyList.php b/thirdparty/HTMLPurifier/HTMLPurifier/PropertyList.php similarity index 95% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/PropertyList.php rename to thirdparty/HTMLPurifier/HTMLPurifier/PropertyList.php index d27fd53ec..189348fd9 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/PropertyList.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/PropertyList.php @@ -1,122 +1,122 @@ -parent = $parent; - } - - /** - * Recursively retrieves the value for a key - * @param string $name - * @throws HTMLPurifier_Exception - */ - public function get($name) - { - if ($this->has($name)) { - return $this->data[$name]; - } - // possible performance bottleneck, convert to iterative if necessary - if ($this->parent) { - return $this->parent->get($name); - } - throw new HTMLPurifier_Exception("Key '$name' not found"); - } - - /** - * Sets the value of a key, for this plist - * @param string $name - * @param mixed $value - */ - public function set($name, $value) - { - $this->data[$name] = $value; - } - - /** - * Returns true if a given key exists - * @param string $name - * @return bool - */ - public function has($name) - { - return array_key_exists($name, $this->data); - } - - /** - * Resets a value to the value of it's parent, usually the default. If - * no value is specified, the entire plist is reset. - * @param string $name - */ - public function reset($name = null) - { - if ($name == null) { - $this->data = array(); - } else { - unset($this->data[$name]); - } - } - - /** - * Squashes this property list and all of its property lists into a single - * array, and returns the array. This value is cached by default. - * @param bool $force If true, ignores the cache and regenerates the array. - * @return array - */ - public function squash($force = false) - { - if ($this->cache !== null && !$force) { - return $this->cache; - } - if ($this->parent) { - return $this->cache = array_merge($this->parent->squash($force), $this->data); - } else { - return $this->cache = $this->data; - } - } - - /** - * Returns the parent plist. - * @return HTMLPurifier_PropertyList - */ - public function getParent() - { - return $this->parent; - } - - /** - * Sets the parent plist. - * @param HTMLPurifier_PropertyList $plist Parent plist - */ - public function setParent($plist) - { - $this->parent = $plist; - } -} - -// vim: et sw=4 sts=4 +parent = $parent; + } + + /** + * Recursively retrieves the value for a key + * @param string $name + * @throws HTMLPurifier_Exception + */ + public function get($name) + { + if ($this->has($name)) { + return $this->data[$name]; + } + // possible performance bottleneck, convert to iterative if necessary + if ($this->parent) { + return $this->parent->get($name); + } + throw new HTMLPurifier_Exception("Key '$name' not found"); + } + + /** + * Sets the value of a key, for this plist + * @param string $name + * @param mixed $value + */ + public function set($name, $value) + { + $this->data[$name] = $value; + } + + /** + * Returns true if a given key exists + * @param string $name + * @return bool + */ + public function has($name) + { + return array_key_exists($name, $this->data); + } + + /** + * Resets a value to the value of it's parent, usually the default. If + * no value is specified, the entire plist is reset. + * @param string $name + */ + public function reset($name = null) + { + if ($name == null) { + $this->data = array(); + } else { + unset($this->data[$name]); + } + } + + /** + * Squashes this property list and all of its property lists into a single + * array, and returns the array. This value is cached by default. + * @param bool $force If true, ignores the cache and regenerates the array. + * @return array + */ + public function squash($force = false) + { + if ($this->cache !== null && !$force) { + return $this->cache; + } + if ($this->parent) { + return $this->cache = array_merge($this->parent->squash($force), $this->data); + } else { + return $this->cache = $this->data; + } + } + + /** + * Returns the parent plist. + * @return HTMLPurifier_PropertyList + */ + public function getParent() + { + return $this->parent; + } + + /** + * Sets the parent plist. + * @param HTMLPurifier_PropertyList $plist Parent plist + */ + public function setParent($plist) + { + $this->parent = $plist; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/PropertyListIterator.php b/thirdparty/HTMLPurifier/HTMLPurifier/PropertyListIterator.php similarity index 95% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/PropertyListIterator.php rename to thirdparty/HTMLPurifier/HTMLPurifier/PropertyListIterator.php index 1e707e2ae..15b330ea3 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/PropertyListIterator.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/PropertyListIterator.php @@ -1,42 +1,42 @@ -l = strlen($filter); - $this->filter = $filter; - } - - /** - * @return bool - */ - public function accept() - { - $key = $this->getInnerIterator()->key(); - if (strncmp($key, $this->filter, $this->l) !== 0) { - return false; - } - return true; - } -} - -// vim: et sw=4 sts=4 +l = strlen($filter); + $this->filter = $filter; + } + + /** + * @return bool + */ + public function accept() + { + $key = $this->getInnerIterator()->key(); + if (strncmp($key, $this->filter, $this->l) !== 0) { + return false; + } + return true; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Queue.php b/thirdparty/HTMLPurifier/HTMLPurifier/Queue.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Queue.php rename to thirdparty/HTMLPurifier/HTMLPurifier/Queue.php index a75894d45..f58db9042 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Queue.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/Queue.php @@ -1,56 +1,56 @@ -input = $input; - $this->output = array(); - } - - /** - * Shifts an element off the front of the queue. - */ - public function shift() { - if (empty($this->output)) { - $this->output = array_reverse($this->input); - $this->input = array(); - } - if (empty($this->output)) { - return NULL; - } - return array_pop($this->output); - } - - /** - * Pushes an element onto the front of the queue. - */ - public function push($x) { - array_push($this->input, $x); - } - - /** - * Checks if it's empty. - */ - public function isEmpty() { - return empty($this->input) && empty($this->output); - } -} +input = $input; + $this->output = array(); + } + + /** + * Shifts an element off the front of the queue. + */ + public function shift() { + if (empty($this->output)) { + $this->output = array_reverse($this->input); + $this->input = array(); + } + if (empty($this->output)) { + return NULL; + } + return array_pop($this->output); + } + + /** + * Pushes an element onto the front of the queue. + */ + public function push($x) { + array_push($this->input, $x); + } + + /** + * Checks if it's empty. + */ + public function isEmpty() { + return empty($this->input) && empty($this->output); + } +} diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Strategy.php b/thirdparty/HTMLPurifier/HTMLPurifier/Strategy.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Strategy.php rename to thirdparty/HTMLPurifier/HTMLPurifier/Strategy.php index 291eb83c9..e1ff3b72d 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Strategy.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/Strategy.php @@ -1,26 +1,26 @@ -strategies as $strategy) { - $tokens = $strategy->execute($tokens, $config, $context); - } - return $tokens; - } -} - -// vim: et sw=4 sts=4 +strategies as $strategy) { + $tokens = $strategy->execute($tokens, $config, $context); + } + return $tokens; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Strategy/Core.php b/thirdparty/HTMLPurifier/HTMLPurifier/Strategy/Core.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Strategy/Core.php rename to thirdparty/HTMLPurifier/HTMLPurifier/Strategy/Core.php index 077521523..4414c17d6 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Strategy/Core.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/Strategy/Core.php @@ -1,17 +1,17 @@ -strategies[] = new HTMLPurifier_Strategy_RemoveForeignElements(); - $this->strategies[] = new HTMLPurifier_Strategy_MakeWellFormed(); - $this->strategies[] = new HTMLPurifier_Strategy_FixNesting(); - $this->strategies[] = new HTMLPurifier_Strategy_ValidateAttributes(); - } -} - -// vim: et sw=4 sts=4 +strategies[] = new HTMLPurifier_Strategy_RemoveForeignElements(); + $this->strategies[] = new HTMLPurifier_Strategy_MakeWellFormed(); + $this->strategies[] = new HTMLPurifier_Strategy_FixNesting(); + $this->strategies[] = new HTMLPurifier_Strategy_ValidateAttributes(); + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Strategy/FixNesting.php b/thirdparty/HTMLPurifier/HTMLPurifier/Strategy/FixNesting.php similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Strategy/FixNesting.php rename to thirdparty/HTMLPurifier/HTMLPurifier/Strategy/FixNesting.php index 8b1eb20fb..6fa673db9 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Strategy/FixNesting.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/Strategy/FixNesting.php @@ -1,181 +1,181 @@ -getHTMLDefinition(); - - $excludes_enabled = !$config->get('Core.DisableExcludes'); - - // setup the context variable 'IsInline', for chameleon processing - // is 'false' when we are not inline, 'true' when it must always - // be inline, and an integer when it is inline for a certain - // branch of the document tree - $is_inline = $definition->info_parent_def->descendants_are_inline; - $context->register('IsInline', $is_inline); - - // setup error collector - $e =& $context->get('ErrorCollector', true); - - //####################################################################// - // Loop initialization - - // stack that contains all elements that are excluded - // it is organized by parent elements, similar to $stack, - // but it is only populated when an element with exclusions is - // processed, i.e. there won't be empty exclusions. - $exclude_stack = array($definition->info_parent_def->excludes); - - // variable that contains the start token while we are processing - // nodes. This enables error reporting to do its job - $node = $top_node; - // dummy token - list($token, $d) = $node->toTokenPair(); - $context->register('CurrentNode', $node); - $context->register('CurrentToken', $token); - - //####################################################################// - // Loop - - // We need to implement a post-order traversal iteratively, to - // avoid running into stack space limits. This is pretty tricky - // to reason about, so we just manually stack-ify the recursive - // variant: - // - // function f($node) { - // foreach ($node->children as $child) { - // f($child); - // } - // validate($node); - // } - // - // Thus, we will represent a stack frame as array($node, - // $is_inline, stack of children) - // e.g. array_reverse($node->children) - already processed - // children. - - $parent_def = $definition->info_parent_def; - $stack = array( - array($top_node, - $parent_def->descendants_are_inline, - $parent_def->excludes, // exclusions - 0) - ); - - while (!empty($stack)) { - list($node, $is_inline, $excludes, $ix) = array_pop($stack); - // recursive call - $go = false; - $def = empty($stack) ? $definition->info_parent_def : $definition->info[$node->name]; - while (isset($node->children[$ix])) { - $child = $node->children[$ix++]; - if ($child instanceof HTMLPurifier_Node_Element) { - $go = true; - $stack[] = array($node, $is_inline, $excludes, $ix); - $stack[] = array($child, - // ToDo: I don't think it matters if it's def or - // child_def, but double check this... - $is_inline || $def->descendants_are_inline, - empty($def->excludes) ? $excludes - : array_merge($excludes, $def->excludes), - 0); - break; - } - }; - if ($go) continue; - list($token, $d) = $node->toTokenPair(); - // base case - if ($excludes_enabled && isset($excludes[$node->name])) { - $node->dead = true; - if ($e) $e->send(E_ERROR, 'Strategy_FixNesting: Node excluded'); - } else { - // XXX I suppose it would be slightly more efficient to - // avoid the allocation here and have children - // strategies handle it - $children = array(); - foreach ($node->children as $child) { - if (!$child->dead) $children[] = $child; - } - $result = $def->child->validateChildren($children, $config, $context); - if ($result === true) { - // nop - $node->children = $children; - } elseif ($result === false) { - $node->dead = true; - if ($e) $e->send(E_ERROR, 'Strategy_FixNesting: Node removed'); - } else { - $node->children = $result; - if ($e) { - // XXX This will miss mutations of internal nodes. Perhaps defer to the child validators - if (empty($result) && !empty($children)) { - $e->send(E_ERROR, 'Strategy_FixNesting: Node contents removed'); - } else if ($result != $children) { - $e->send(E_WARNING, 'Strategy_FixNesting: Node reorganized'); - } - } - } - } - } - - //####################################################################// - // Post-processing - - // remove context variables - $context->destroy('IsInline'); - $context->destroy('CurrentNode'); - $context->destroy('CurrentToken'); - - //####################################################################// - // Return - - return HTMLPurifier_Arborize::flatten($node, $config, $context); - } -} - -// vim: et sw=4 sts=4 +getHTMLDefinition(); + + $excludes_enabled = !$config->get('Core.DisableExcludes'); + + // setup the context variable 'IsInline', for chameleon processing + // is 'false' when we are not inline, 'true' when it must always + // be inline, and an integer when it is inline for a certain + // branch of the document tree + $is_inline = $definition->info_parent_def->descendants_are_inline; + $context->register('IsInline', $is_inline); + + // setup error collector + $e =& $context->get('ErrorCollector', true); + + //####################################################################// + // Loop initialization + + // stack that contains all elements that are excluded + // it is organized by parent elements, similar to $stack, + // but it is only populated when an element with exclusions is + // processed, i.e. there won't be empty exclusions. + $exclude_stack = array($definition->info_parent_def->excludes); + + // variable that contains the start token while we are processing + // nodes. This enables error reporting to do its job + $node = $top_node; + // dummy token + list($token, $d) = $node->toTokenPair(); + $context->register('CurrentNode', $node); + $context->register('CurrentToken', $token); + + //####################################################################// + // Loop + + // We need to implement a post-order traversal iteratively, to + // avoid running into stack space limits. This is pretty tricky + // to reason about, so we just manually stack-ify the recursive + // variant: + // + // function f($node) { + // foreach ($node->children as $child) { + // f($child); + // } + // validate($node); + // } + // + // Thus, we will represent a stack frame as array($node, + // $is_inline, stack of children) + // e.g. array_reverse($node->children) - already processed + // children. + + $parent_def = $definition->info_parent_def; + $stack = array( + array($top_node, + $parent_def->descendants_are_inline, + $parent_def->excludes, // exclusions + 0) + ); + + while (!empty($stack)) { + list($node, $is_inline, $excludes, $ix) = array_pop($stack); + // recursive call + $go = false; + $def = empty($stack) ? $definition->info_parent_def : $definition->info[$node->name]; + while (isset($node->children[$ix])) { + $child = $node->children[$ix++]; + if ($child instanceof HTMLPurifier_Node_Element) { + $go = true; + $stack[] = array($node, $is_inline, $excludes, $ix); + $stack[] = array($child, + // ToDo: I don't think it matters if it's def or + // child_def, but double check this... + $is_inline || $def->descendants_are_inline, + empty($def->excludes) ? $excludes + : array_merge($excludes, $def->excludes), + 0); + break; + } + }; + if ($go) continue; + list($token, $d) = $node->toTokenPair(); + // base case + if ($excludes_enabled && isset($excludes[$node->name])) { + $node->dead = true; + if ($e) $e->send(E_ERROR, 'Strategy_FixNesting: Node excluded'); + } else { + // XXX I suppose it would be slightly more efficient to + // avoid the allocation here and have children + // strategies handle it + $children = array(); + foreach ($node->children as $child) { + if (!$child->dead) $children[] = $child; + } + $result = $def->child->validateChildren($children, $config, $context); + if ($result === true) { + // nop + $node->children = $children; + } elseif ($result === false) { + $node->dead = true; + if ($e) $e->send(E_ERROR, 'Strategy_FixNesting: Node removed'); + } else { + $node->children = $result; + if ($e) { + // XXX This will miss mutations of internal nodes. Perhaps defer to the child validators + if (empty($result) && !empty($children)) { + $e->send(E_ERROR, 'Strategy_FixNesting: Node contents removed'); + } else if ($result != $children) { + $e->send(E_WARNING, 'Strategy_FixNesting: Node reorganized'); + } + } + } + } + } + + //####################################################################// + // Post-processing + + // remove context variables + $context->destroy('IsInline'); + $context->destroy('CurrentNode'); + $context->destroy('CurrentToken'); + + //####################################################################// + // Return + + return HTMLPurifier_Arborize::flatten($node, $config, $context); + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Strategy/MakeWellFormed.php b/thirdparty/HTMLPurifier/HTMLPurifier/Strategy/MakeWellFormed.php similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Strategy/MakeWellFormed.php rename to thirdparty/HTMLPurifier/HTMLPurifier/Strategy/MakeWellFormed.php index 2c792feb6..e389e0011 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Strategy/MakeWellFormed.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/Strategy/MakeWellFormed.php @@ -1,600 +1,600 @@ -getHTMLDefinition(); - - // local variables - $generator = new HTMLPurifier_Generator($config, $context); - $escape_invalid_tags = $config->get('Core.EscapeInvalidTags'); - // used for autoclose early abortion - $global_parent_allowed_elements = $definition->info_parent_def->child->getAllowedElements($config); - $e = $context->get('ErrorCollector', true); - $i = false; // injector index - list($zipper, $token) = HTMLPurifier_Zipper::fromArray($tokens); - if ($token === NULL) { - return array(); - } - $reprocess = false; // whether or not to reprocess the same token - $stack = array(); - - // member variables - $this->stack =& $stack; - $this->tokens =& $tokens; - $this->token =& $token; - $this->zipper =& $zipper; - $this->config = $config; - $this->context = $context; - - // context variables - $context->register('CurrentNesting', $stack); - $context->register('InputZipper', $zipper); - $context->register('CurrentToken', $token); - - // -- begin INJECTOR -- - - $this->injectors = array(); - - $injectors = $config->getBatch('AutoFormat'); - $def_injectors = $definition->info_injector; - $custom_injectors = $injectors['Custom']; - unset($injectors['Custom']); // special case - foreach ($injectors as $injector => $b) { - // XXX: Fix with a legitimate lookup table of enabled filters - if (strpos($injector, '.') !== false) { - continue; - } - $injector = "HTMLPurifier_Injector_$injector"; - if (!$b) { - continue; - } - $this->injectors[] = new $injector; - } - foreach ($def_injectors as $injector) { - // assumed to be objects - $this->injectors[] = $injector; - } - foreach ($custom_injectors as $injector) { - if (!$injector) { - continue; - } - if (is_string($injector)) { - $injector = "HTMLPurifier_Injector_$injector"; - $injector = new $injector; - } - $this->injectors[] = $injector; - } - - // give the injectors references to the definition and context - // variables for performance reasons - foreach ($this->injectors as $ix => $injector) { - $error = $injector->prepare($config, $context); - if (!$error) { - continue; - } - array_splice($this->injectors, $ix, 1); // rm the injector - trigger_error("Cannot enable {$injector->name} injector because $error is not allowed", E_USER_WARNING); - } - - // -- end INJECTOR -- - - // a note on reprocessing: - // In order to reduce code duplication, whenever some code needs - // to make HTML changes in order to make things "correct", the - // new HTML gets sent through the purifier, regardless of its - // status. This means that if we add a start token, because it - // was totally necessary, we don't have to update nesting; we just - // punt ($reprocess = true; continue;) and it does that for us. - - // isset is in loop because $tokens size changes during loop exec - for (;; - // only increment if we don't need to reprocess - $reprocess ? $reprocess = false : $token = $zipper->next($token)) { - - // check for a rewind - if (is_int($i)) { - // possibility: disable rewinding if the current token has a - // rewind set on it already. This would offer protection from - // infinite loop, but might hinder some advanced rewinding. - $rewind_offset = $this->injectors[$i]->getRewindOffset(); - if (is_int($rewind_offset)) { - for ($j = 0; $j < $rewind_offset; $j++) { - if (empty($zipper->front)) break; - $token = $zipper->prev($token); - // indicate that other injectors should not process this token, - // but we need to reprocess it - unset($token->skip[$i]); - $token->rewind = $i; - if ($token instanceof HTMLPurifier_Token_Start) { - array_pop($this->stack); - } elseif ($token instanceof HTMLPurifier_Token_End) { - $this->stack[] = $token->start; - } - } - } - $i = false; - } - - // handle case of document end - if ($token === NULL) { - // kill processing if stack is empty - if (empty($this->stack)) { - break; - } - - // peek - $top_nesting = array_pop($this->stack); - $this->stack[] = $top_nesting; - - // send error [TagClosedSuppress] - if ($e && !isset($top_nesting->armor['MakeWellFormed_TagClosedError'])) { - $e->send(E_NOTICE, 'Strategy_MakeWellFormed: Tag closed by document end', $top_nesting); - } - - // append, don't splice, since this is the end - $token = new HTMLPurifier_Token_End($top_nesting->name); - - // punt! - $reprocess = true; - continue; - } - - //echo '
      '; printZipper($zipper, $token);//printTokens($this->stack); - //flush(); - - // quick-check: if it's not a tag, no need to process - if (empty($token->is_tag)) { - if ($token instanceof HTMLPurifier_Token_Text) { - foreach ($this->injectors as $i => $injector) { - if (isset($token->skip[$i])) { - continue; - } - if ($token->rewind !== null && $token->rewind !== $i) { - continue; - } - // XXX fuckup - $r = $token; - $injector->handleText($r); - $token = $this->processToken($r, $i); - $reprocess = true; - break; - } - } - // another possibility is a comment - continue; - } - - if (isset($definition->info[$token->name])) { - $type = $definition->info[$token->name]->child->type; - } else { - $type = false; // Type is unknown, treat accordingly - } - - // quick tag checks: anything that's *not* an end tag - $ok = false; - if ($type === 'empty' && $token instanceof HTMLPurifier_Token_Start) { - // claims to be a start tag but is empty - $token = new HTMLPurifier_Token_Empty( - $token->name, - $token->attr, - $token->line, - $token->col, - $token->armor - ); - $ok = true; - } elseif ($type && $type !== 'empty' && $token instanceof HTMLPurifier_Token_Empty) { - // claims to be empty but really is a start tag - // NB: this assignment is required - $old_token = $token; - $token = new HTMLPurifier_Token_End($token->name); - $token = $this->insertBefore( - new HTMLPurifier_Token_Start($old_token->name, $old_token->attr, $old_token->line, $old_token->col, $old_token->armor) - ); - // punt (since we had to modify the input stream in a non-trivial way) - $reprocess = true; - continue; - } elseif ($token instanceof HTMLPurifier_Token_Empty) { - // real empty token - $ok = true; - } elseif ($token instanceof HTMLPurifier_Token_Start) { - // start tag - - // ...unless they also have to close their parent - if (!empty($this->stack)) { - - // Performance note: you might think that it's rather - // inefficient, recalculating the autoclose information - // for every tag that a token closes (since when we - // do an autoclose, we push a new token into the - // stream and then /process/ that, before - // re-processing this token.) But this is - // necessary, because an injector can make an - // arbitrary transformations to the autoclosing - // tokens we introduce, so things may have changed - // in the meantime. Also, doing the inefficient thing is - // "easy" to reason about (for certain perverse definitions - // of "easy") - - $parent = array_pop($this->stack); - $this->stack[] = $parent; - - $parent_def = null; - $parent_elements = null; - $autoclose = false; - if (isset($definition->info[$parent->name])) { - $parent_def = $definition->info[$parent->name]; - $parent_elements = $parent_def->child->getAllowedElements($config); - $autoclose = !isset($parent_elements[$token->name]); - } - - if ($autoclose && $definition->info[$token->name]->wrap) { - // Check if an element can be wrapped by another - // element to make it valid in a context (for - // example,
          needs a
        • in between) - $wrapname = $definition->info[$token->name]->wrap; - $wrapdef = $definition->info[$wrapname]; - $elements = $wrapdef->child->getAllowedElements($config); - if (isset($elements[$token->name]) && isset($parent_elements[$wrapname])) { - $newtoken = new HTMLPurifier_Token_Start($wrapname); - $token = $this->insertBefore($newtoken); - $reprocess = true; - continue; - } - } - - $carryover = false; - if ($autoclose && $parent_def->formatting) { - $carryover = true; - } - - if ($autoclose) { - // check if this autoclose is doomed to fail - // (this rechecks $parent, which his harmless) - $autoclose_ok = isset($global_parent_allowed_elements[$token->name]); - if (!$autoclose_ok) { - foreach ($this->stack as $ancestor) { - $elements = $definition->info[$ancestor->name]->child->getAllowedElements($config); - if (isset($elements[$token->name])) { - $autoclose_ok = true; - break; - } - if ($definition->info[$token->name]->wrap) { - $wrapname = $definition->info[$token->name]->wrap; - $wrapdef = $definition->info[$wrapname]; - $wrap_elements = $wrapdef->child->getAllowedElements($config); - if (isset($wrap_elements[$token->name]) && isset($elements[$wrapname])) { - $autoclose_ok = true; - break; - } - } - } - } - if ($autoclose_ok) { - // errors need to be updated - $new_token = new HTMLPurifier_Token_End($parent->name); - $new_token->start = $parent; - // [TagClosedSuppress] - if ($e && !isset($parent->armor['MakeWellFormed_TagClosedError'])) { - if (!$carryover) { - $e->send(E_NOTICE, 'Strategy_MakeWellFormed: Tag auto closed', $parent); - } else { - $e->send(E_NOTICE, 'Strategy_MakeWellFormed: Tag carryover', $parent); - } - } - if ($carryover) { - $element = clone $parent; - // [TagClosedAuto] - $element->armor['MakeWellFormed_TagClosedError'] = true; - $element->carryover = true; - $token = $this->processToken(array($new_token, $token, $element)); - } else { - $token = $this->insertBefore($new_token); - } - } else { - $token = $this->remove(); - } - $reprocess = true; - continue; - } - - } - $ok = true; - } - - if ($ok) { - foreach ($this->injectors as $i => $injector) { - if (isset($token->skip[$i])) { - continue; - } - if ($token->rewind !== null && $token->rewind !== $i) { - continue; - } - $r = $token; - $injector->handleElement($r); - $token = $this->processToken($r, $i); - $reprocess = true; - break; - } - if (!$reprocess) { - // ah, nothing interesting happened; do normal processing - if ($token instanceof HTMLPurifier_Token_Start) { - $this->stack[] = $token; - } elseif ($token instanceof HTMLPurifier_Token_End) { - throw new HTMLPurifier_Exception( - 'Improper handling of end tag in start code; possible error in MakeWellFormed' - ); - } - } - continue; - } - - // sanity check: we should be dealing with a closing tag - if (!$token instanceof HTMLPurifier_Token_End) { - throw new HTMLPurifier_Exception('Unaccounted for tag token in input stream, bug in HTML Purifier'); - } - - // make sure that we have something open - if (empty($this->stack)) { - if ($escape_invalid_tags) { - if ($e) { - $e->send(E_WARNING, 'Strategy_MakeWellFormed: Unnecessary end tag to text'); - } - $token = new HTMLPurifier_Token_Text($generator->generateFromToken($token)); - } else { - if ($e) { - $e->send(E_WARNING, 'Strategy_MakeWellFormed: Unnecessary end tag removed'); - } - $token = $this->remove(); - } - $reprocess = true; - continue; - } - - // first, check for the simplest case: everything closes neatly. - // Eventually, everything passes through here; if there are problems - // we modify the input stream accordingly and then punt, so that - // the tokens get processed again. - $current_parent = array_pop($this->stack); - if ($current_parent->name == $token->name) { - $token->start = $current_parent; - foreach ($this->injectors as $i => $injector) { - if (isset($token->skip[$i])) { - continue; - } - if ($token->rewind !== null && $token->rewind !== $i) { - continue; - } - $r = $token; - $injector->handleEnd($r); - $token = $this->processToken($r, $i); - $this->stack[] = $current_parent; - $reprocess = true; - break; - } - continue; - } - - // okay, so we're trying to close the wrong tag - - // undo the pop previous pop - $this->stack[] = $current_parent; - - // scroll back the entire nest, trying to find our tag. - // (feature could be to specify how far you'd like to go) - $size = count($this->stack); - // -2 because -1 is the last element, but we already checked that - $skipped_tags = false; - for ($j = $size - 2; $j >= 0; $j--) { - if ($this->stack[$j]->name == $token->name) { - $skipped_tags = array_slice($this->stack, $j); - break; - } - } - - // we didn't find the tag, so remove - if ($skipped_tags === false) { - if ($escape_invalid_tags) { - if ($e) { - $e->send(E_WARNING, 'Strategy_MakeWellFormed: Stray end tag to text'); - } - $token = new HTMLPurifier_Token_Text($generator->generateFromToken($token)); - } else { - if ($e) { - $e->send(E_WARNING, 'Strategy_MakeWellFormed: Stray end tag removed'); - } - $token = $this->remove(); - } - $reprocess = true; - continue; - } - - // do errors, in REVERSE $j order: a,b,c with - $c = count($skipped_tags); - if ($e) { - for ($j = $c - 1; $j > 0; $j--) { - // notice we exclude $j == 0, i.e. the current ending tag, from - // the errors... [TagClosedSuppress] - if (!isset($skipped_tags[$j]->armor['MakeWellFormed_TagClosedError'])) { - $e->send(E_NOTICE, 'Strategy_MakeWellFormed: Tag closed by element end', $skipped_tags[$j]); - } - } - } - - // insert tags, in FORWARD $j order: c,b,a with - $replace = array($token); - for ($j = 1; $j < $c; $j++) { - // ...as well as from the insertions - $new_token = new HTMLPurifier_Token_End($skipped_tags[$j]->name); - $new_token->start = $skipped_tags[$j]; - array_unshift($replace, $new_token); - if (isset($definition->info[$new_token->name]) && $definition->info[$new_token->name]->formatting) { - // [TagClosedAuto] - $element = clone $skipped_tags[$j]; - $element->carryover = true; - $element->armor['MakeWellFormed_TagClosedError'] = true; - $replace[] = $element; - } - } - $token = $this->processToken($replace); - $reprocess = true; - continue; - } - - $context->destroy('CurrentToken'); - $context->destroy('CurrentNesting'); - $context->destroy('InputZipper'); - - unset($this->injectors, $this->stack, $this->tokens); - return $zipper->toArray($token); - } - - /** - * Processes arbitrary token values for complicated substitution patterns. - * In general: - * - * If $token is an array, it is a list of tokens to substitute for the - * current token. These tokens then get individually processed. If there - * is a leading integer in the list, that integer determines how many - * tokens from the stream should be removed. - * - * If $token is a regular token, it is swapped with the current token. - * - * If $token is false, the current token is deleted. - * - * If $token is an integer, that number of tokens (with the first token - * being the current one) will be deleted. - * - * @param HTMLPurifier_Token|array|int|bool $token Token substitution value - * @param HTMLPurifier_Injector|int $injector Injector that performed the substitution; default is if - * this is not an injector related operation. - * @throws HTMLPurifier_Exception - */ - protected function processToken($token, $injector = -1) - { - // normalize forms of token - if (is_object($token)) { - $token = array(1, $token); - } - if (is_int($token)) { - $token = array($token); - } - if ($token === false) { - $token = array(1); - } - if (!is_array($token)) { - throw new HTMLPurifier_Exception('Invalid token type from injector'); - } - if (!is_int($token[0])) { - array_unshift($token, 1); - } - if ($token[0] === 0) { - throw new HTMLPurifier_Exception('Deleting zero tokens is not valid'); - } - - // $token is now an array with the following form: - // array(number nodes to delete, new node 1, new node 2, ...) - - $delete = array_shift($token); - list($old, $r) = $this->zipper->splice($this->token, $delete, $token); - - if ($injector > -1) { - // determine appropriate skips - $oldskip = isset($old[0]) ? $old[0]->skip : array(); - foreach ($token as $object) { - $object->skip = $oldskip; - $object->skip[$injector] = true; - } - } - - return $r; - - } - - /** - * Inserts a token before the current token. Cursor now points to - * this token. You must reprocess after this. - * @param HTMLPurifier_Token $token - */ - private function insertBefore($token) - { - // NB not $this->zipper->insertBefore(), due to positioning - // differences - $splice = $this->zipper->splice($this->token, 0, array($token)); - - return $splice[1]; - } - - /** - * Removes current token. Cursor now points to new token occupying previously - * occupied space. You must reprocess after this. - */ - private function remove() - { - return $this->zipper->delete(); - } -} - -// vim: et sw=4 sts=4 +getHTMLDefinition(); + + // local variables + $generator = new HTMLPurifier_Generator($config, $context); + $escape_invalid_tags = $config->get('Core.EscapeInvalidTags'); + // used for autoclose early abortion + $global_parent_allowed_elements = $definition->info_parent_def->child->getAllowedElements($config); + $e = $context->get('ErrorCollector', true); + $i = false; // injector index + list($zipper, $token) = HTMLPurifier_Zipper::fromArray($tokens); + if ($token === NULL) { + return array(); + } + $reprocess = false; // whether or not to reprocess the same token + $stack = array(); + + // member variables + $this->stack =& $stack; + $this->tokens =& $tokens; + $this->token =& $token; + $this->zipper =& $zipper; + $this->config = $config; + $this->context = $context; + + // context variables + $context->register('CurrentNesting', $stack); + $context->register('InputZipper', $zipper); + $context->register('CurrentToken', $token); + + // -- begin INJECTOR -- + + $this->injectors = array(); + + $injectors = $config->getBatch('AutoFormat'); + $def_injectors = $definition->info_injector; + $custom_injectors = $injectors['Custom']; + unset($injectors['Custom']); // special case + foreach ($injectors as $injector => $b) { + // XXX: Fix with a legitimate lookup table of enabled filters + if (strpos($injector, '.') !== false) { + continue; + } + $injector = "HTMLPurifier_Injector_$injector"; + if (!$b) { + continue; + } + $this->injectors[] = new $injector; + } + foreach ($def_injectors as $injector) { + // assumed to be objects + $this->injectors[] = $injector; + } + foreach ($custom_injectors as $injector) { + if (!$injector) { + continue; + } + if (is_string($injector)) { + $injector = "HTMLPurifier_Injector_$injector"; + $injector = new $injector; + } + $this->injectors[] = $injector; + } + + // give the injectors references to the definition and context + // variables for performance reasons + foreach ($this->injectors as $ix => $injector) { + $error = $injector->prepare($config, $context); + if (!$error) { + continue; + } + array_splice($this->injectors, $ix, 1); // rm the injector + trigger_error("Cannot enable {$injector->name} injector because $error is not allowed", E_USER_WARNING); + } + + // -- end INJECTOR -- + + // a note on reprocessing: + // In order to reduce code duplication, whenever some code needs + // to make HTML changes in order to make things "correct", the + // new HTML gets sent through the purifier, regardless of its + // status. This means that if we add a start token, because it + // was totally necessary, we don't have to update nesting; we just + // punt ($reprocess = true; continue;) and it does that for us. + + // isset is in loop because $tokens size changes during loop exec + for (;; + // only increment if we don't need to reprocess + $reprocess ? $reprocess = false : $token = $zipper->next($token)) { + + // check for a rewind + if (is_int($i)) { + // possibility: disable rewinding if the current token has a + // rewind set on it already. This would offer protection from + // infinite loop, but might hinder some advanced rewinding. + $rewind_offset = $this->injectors[$i]->getRewindOffset(); + if (is_int($rewind_offset)) { + for ($j = 0; $j < $rewind_offset; $j++) { + if (empty($zipper->front)) break; + $token = $zipper->prev($token); + // indicate that other injectors should not process this token, + // but we need to reprocess it + unset($token->skip[$i]); + $token->rewind = $i; + if ($token instanceof HTMLPurifier_Token_Start) { + array_pop($this->stack); + } elseif ($token instanceof HTMLPurifier_Token_End) { + $this->stack[] = $token->start; + } + } + } + $i = false; + } + + // handle case of document end + if ($token === NULL) { + // kill processing if stack is empty + if (empty($this->stack)) { + break; + } + + // peek + $top_nesting = array_pop($this->stack); + $this->stack[] = $top_nesting; + + // send error [TagClosedSuppress] + if ($e && !isset($top_nesting->armor['MakeWellFormed_TagClosedError'])) { + $e->send(E_NOTICE, 'Strategy_MakeWellFormed: Tag closed by document end', $top_nesting); + } + + // append, don't splice, since this is the end + $token = new HTMLPurifier_Token_End($top_nesting->name); + + // punt! + $reprocess = true; + continue; + } + + //echo '
          '; printZipper($zipper, $token);//printTokens($this->stack); + //flush(); + + // quick-check: if it's not a tag, no need to process + if (empty($token->is_tag)) { + if ($token instanceof HTMLPurifier_Token_Text) { + foreach ($this->injectors as $i => $injector) { + if (isset($token->skip[$i])) { + continue; + } + if ($token->rewind !== null && $token->rewind !== $i) { + continue; + } + // XXX fuckup + $r = $token; + $injector->handleText($r); + $token = $this->processToken($r, $i); + $reprocess = true; + break; + } + } + // another possibility is a comment + continue; + } + + if (isset($definition->info[$token->name])) { + $type = $definition->info[$token->name]->child->type; + } else { + $type = false; // Type is unknown, treat accordingly + } + + // quick tag checks: anything that's *not* an end tag + $ok = false; + if ($type === 'empty' && $token instanceof HTMLPurifier_Token_Start) { + // claims to be a start tag but is empty + $token = new HTMLPurifier_Token_Empty( + $token->name, + $token->attr, + $token->line, + $token->col, + $token->armor + ); + $ok = true; + } elseif ($type && $type !== 'empty' && $token instanceof HTMLPurifier_Token_Empty) { + // claims to be empty but really is a start tag + // NB: this assignment is required + $old_token = $token; + $token = new HTMLPurifier_Token_End($token->name); + $token = $this->insertBefore( + new HTMLPurifier_Token_Start($old_token->name, $old_token->attr, $old_token->line, $old_token->col, $old_token->armor) + ); + // punt (since we had to modify the input stream in a non-trivial way) + $reprocess = true; + continue; + } elseif ($token instanceof HTMLPurifier_Token_Empty) { + // real empty token + $ok = true; + } elseif ($token instanceof HTMLPurifier_Token_Start) { + // start tag + + // ...unless they also have to close their parent + if (!empty($this->stack)) { + + // Performance note: you might think that it's rather + // inefficient, recalculating the autoclose information + // for every tag that a token closes (since when we + // do an autoclose, we push a new token into the + // stream and then /process/ that, before + // re-processing this token.) But this is + // necessary, because an injector can make an + // arbitrary transformations to the autoclosing + // tokens we introduce, so things may have changed + // in the meantime. Also, doing the inefficient thing is + // "easy" to reason about (for certain perverse definitions + // of "easy") + + $parent = array_pop($this->stack); + $this->stack[] = $parent; + + $parent_def = null; + $parent_elements = null; + $autoclose = false; + if (isset($definition->info[$parent->name])) { + $parent_def = $definition->info[$parent->name]; + $parent_elements = $parent_def->child->getAllowedElements($config); + $autoclose = !isset($parent_elements[$token->name]); + } + + if ($autoclose && $definition->info[$token->name]->wrap) { + // Check if an element can be wrapped by another + // element to make it valid in a context (for + // example,
              needs a
            • in between) + $wrapname = $definition->info[$token->name]->wrap; + $wrapdef = $definition->info[$wrapname]; + $elements = $wrapdef->child->getAllowedElements($config); + if (isset($elements[$token->name]) && isset($parent_elements[$wrapname])) { + $newtoken = new HTMLPurifier_Token_Start($wrapname); + $token = $this->insertBefore($newtoken); + $reprocess = true; + continue; + } + } + + $carryover = false; + if ($autoclose && $parent_def->formatting) { + $carryover = true; + } + + if ($autoclose) { + // check if this autoclose is doomed to fail + // (this rechecks $parent, which his harmless) + $autoclose_ok = isset($global_parent_allowed_elements[$token->name]); + if (!$autoclose_ok) { + foreach ($this->stack as $ancestor) { + $elements = $definition->info[$ancestor->name]->child->getAllowedElements($config); + if (isset($elements[$token->name])) { + $autoclose_ok = true; + break; + } + if ($definition->info[$token->name]->wrap) { + $wrapname = $definition->info[$token->name]->wrap; + $wrapdef = $definition->info[$wrapname]; + $wrap_elements = $wrapdef->child->getAllowedElements($config); + if (isset($wrap_elements[$token->name]) && isset($elements[$wrapname])) { + $autoclose_ok = true; + break; + } + } + } + } + if ($autoclose_ok) { + // errors need to be updated + $new_token = new HTMLPurifier_Token_End($parent->name); + $new_token->start = $parent; + // [TagClosedSuppress] + if ($e && !isset($parent->armor['MakeWellFormed_TagClosedError'])) { + if (!$carryover) { + $e->send(E_NOTICE, 'Strategy_MakeWellFormed: Tag auto closed', $parent); + } else { + $e->send(E_NOTICE, 'Strategy_MakeWellFormed: Tag carryover', $parent); + } + } + if ($carryover) { + $element = clone $parent; + // [TagClosedAuto] + $element->armor['MakeWellFormed_TagClosedError'] = true; + $element->carryover = true; + $token = $this->processToken(array($new_token, $token, $element)); + } else { + $token = $this->insertBefore($new_token); + } + } else { + $token = $this->remove(); + } + $reprocess = true; + continue; + } + + } + $ok = true; + } + + if ($ok) { + foreach ($this->injectors as $i => $injector) { + if (isset($token->skip[$i])) { + continue; + } + if ($token->rewind !== null && $token->rewind !== $i) { + continue; + } + $r = $token; + $injector->handleElement($r); + $token = $this->processToken($r, $i); + $reprocess = true; + break; + } + if (!$reprocess) { + // ah, nothing interesting happened; do normal processing + if ($token instanceof HTMLPurifier_Token_Start) { + $this->stack[] = $token; + } elseif ($token instanceof HTMLPurifier_Token_End) { + throw new HTMLPurifier_Exception( + 'Improper handling of end tag in start code; possible error in MakeWellFormed' + ); + } + } + continue; + } + + // sanity check: we should be dealing with a closing tag + if (!$token instanceof HTMLPurifier_Token_End) { + throw new HTMLPurifier_Exception('Unaccounted for tag token in input stream, bug in HTML Purifier'); + } + + // make sure that we have something open + if (empty($this->stack)) { + if ($escape_invalid_tags) { + if ($e) { + $e->send(E_WARNING, 'Strategy_MakeWellFormed: Unnecessary end tag to text'); + } + $token = new HTMLPurifier_Token_Text($generator->generateFromToken($token)); + } else { + if ($e) { + $e->send(E_WARNING, 'Strategy_MakeWellFormed: Unnecessary end tag removed'); + } + $token = $this->remove(); + } + $reprocess = true; + continue; + } + + // first, check for the simplest case: everything closes neatly. + // Eventually, everything passes through here; if there are problems + // we modify the input stream accordingly and then punt, so that + // the tokens get processed again. + $current_parent = array_pop($this->stack); + if ($current_parent->name == $token->name) { + $token->start = $current_parent; + foreach ($this->injectors as $i => $injector) { + if (isset($token->skip[$i])) { + continue; + } + if ($token->rewind !== null && $token->rewind !== $i) { + continue; + } + $r = $token; + $injector->handleEnd($r); + $token = $this->processToken($r, $i); + $this->stack[] = $current_parent; + $reprocess = true; + break; + } + continue; + } + + // okay, so we're trying to close the wrong tag + + // undo the pop previous pop + $this->stack[] = $current_parent; + + // scroll back the entire nest, trying to find our tag. + // (feature could be to specify how far you'd like to go) + $size = count($this->stack); + // -2 because -1 is the last element, but we already checked that + $skipped_tags = false; + for ($j = $size - 2; $j >= 0; $j--) { + if ($this->stack[$j]->name == $token->name) { + $skipped_tags = array_slice($this->stack, $j); + break; + } + } + + // we didn't find the tag, so remove + if ($skipped_tags === false) { + if ($escape_invalid_tags) { + if ($e) { + $e->send(E_WARNING, 'Strategy_MakeWellFormed: Stray end tag to text'); + } + $token = new HTMLPurifier_Token_Text($generator->generateFromToken($token)); + } else { + if ($e) { + $e->send(E_WARNING, 'Strategy_MakeWellFormed: Stray end tag removed'); + } + $token = $this->remove(); + } + $reprocess = true; + continue; + } + + // do errors, in REVERSE $j order: a,b,c with + $c = count($skipped_tags); + if ($e) { + for ($j = $c - 1; $j > 0; $j--) { + // notice we exclude $j == 0, i.e. the current ending tag, from + // the errors... [TagClosedSuppress] + if (!isset($skipped_tags[$j]->armor['MakeWellFormed_TagClosedError'])) { + $e->send(E_NOTICE, 'Strategy_MakeWellFormed: Tag closed by element end', $skipped_tags[$j]); + } + } + } + + // insert tags, in FORWARD $j order: c,b,a with + $replace = array($token); + for ($j = 1; $j < $c; $j++) { + // ...as well as from the insertions + $new_token = new HTMLPurifier_Token_End($skipped_tags[$j]->name); + $new_token->start = $skipped_tags[$j]; + array_unshift($replace, $new_token); + if (isset($definition->info[$new_token->name]) && $definition->info[$new_token->name]->formatting) { + // [TagClosedAuto] + $element = clone $skipped_tags[$j]; + $element->carryover = true; + $element->armor['MakeWellFormed_TagClosedError'] = true; + $replace[] = $element; + } + } + $token = $this->processToken($replace); + $reprocess = true; + continue; + } + + $context->destroy('CurrentToken'); + $context->destroy('CurrentNesting'); + $context->destroy('InputZipper'); + + unset($this->injectors, $this->stack, $this->tokens); + return $zipper->toArray($token); + } + + /** + * Processes arbitrary token values for complicated substitution patterns. + * In general: + * + * If $token is an array, it is a list of tokens to substitute for the + * current token. These tokens then get individually processed. If there + * is a leading integer in the list, that integer determines how many + * tokens from the stream should be removed. + * + * If $token is a regular token, it is swapped with the current token. + * + * If $token is false, the current token is deleted. + * + * If $token is an integer, that number of tokens (with the first token + * being the current one) will be deleted. + * + * @param HTMLPurifier_Token|array|int|bool $token Token substitution value + * @param HTMLPurifier_Injector|int $injector Injector that performed the substitution; default is if + * this is not an injector related operation. + * @throws HTMLPurifier_Exception + */ + protected function processToken($token, $injector = -1) + { + // normalize forms of token + if (is_object($token)) { + $token = array(1, $token); + } + if (is_int($token)) { + $token = array($token); + } + if ($token === false) { + $token = array(1); + } + if (!is_array($token)) { + throw new HTMLPurifier_Exception('Invalid token type from injector'); + } + if (!is_int($token[0])) { + array_unshift($token, 1); + } + if ($token[0] === 0) { + throw new HTMLPurifier_Exception('Deleting zero tokens is not valid'); + } + + // $token is now an array with the following form: + // array(number nodes to delete, new node 1, new node 2, ...) + + $delete = array_shift($token); + list($old, $r) = $this->zipper->splice($this->token, $delete, $token); + + if ($injector > -1) { + // determine appropriate skips + $oldskip = isset($old[0]) ? $old[0]->skip : array(); + foreach ($token as $object) { + $object->skip = $oldskip; + $object->skip[$injector] = true; + } + } + + return $r; + + } + + /** + * Inserts a token before the current token. Cursor now points to + * this token. You must reprocess after this. + * @param HTMLPurifier_Token $token + */ + private function insertBefore($token) + { + // NB not $this->zipper->insertBefore(), due to positioning + // differences + $splice = $this->zipper->splice($this->token, 0, array($token)); + + return $splice[1]; + } + + /** + * Removes current token. Cursor now points to new token occupying previously + * occupied space. You must reprocess after this. + */ + private function remove() + { + return $this->zipper->delete(); + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Strategy/RemoveForeignElements.php b/thirdparty/HTMLPurifier/HTMLPurifier/Strategy/RemoveForeignElements.php similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Strategy/RemoveForeignElements.php rename to thirdparty/HTMLPurifier/HTMLPurifier/Strategy/RemoveForeignElements.php index d1adf59f2..1a8149ecc 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Strategy/RemoveForeignElements.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/Strategy/RemoveForeignElements.php @@ -1,207 +1,207 @@ -getHTMLDefinition(); - $generator = new HTMLPurifier_Generator($config, $context); - $result = array(); - - $escape_invalid_tags = $config->get('Core.EscapeInvalidTags'); - $remove_invalid_img = $config->get('Core.RemoveInvalidImg'); - - // currently only used to determine if comments should be kept - $trusted = $config->get('HTML.Trusted'); - $comment_lookup = $config->get('HTML.AllowedComments'); - $comment_regexp = $config->get('HTML.AllowedCommentsRegexp'); - $check_comments = $comment_lookup !== array() || $comment_regexp !== null; - - $remove_script_contents = $config->get('Core.RemoveScriptContents'); - $hidden_elements = $config->get('Core.HiddenElements'); - - // remove script contents compatibility - if ($remove_script_contents === true) { - $hidden_elements['script'] = true; - } elseif ($remove_script_contents === false && isset($hidden_elements['script'])) { - unset($hidden_elements['script']); - } - - $attr_validator = new HTMLPurifier_AttrValidator(); - - // removes tokens until it reaches a closing tag with its value - $remove_until = false; - - // converts comments into text tokens when this is equal to a tag name - $textify_comments = false; - - $token = false; - $context->register('CurrentToken', $token); - - $e = false; - if ($config->get('Core.CollectErrors')) { - $e =& $context->get('ErrorCollector'); - } - - foreach ($tokens as $token) { - if ($remove_until) { - if (empty($token->is_tag) || $token->name !== $remove_until) { - continue; - } - } - if (!empty($token->is_tag)) { - // DEFINITION CALL - - // before any processing, try to transform the element - if (isset($definition->info_tag_transform[$token->name])) { - $original_name = $token->name; - // there is a transformation for this tag - // DEFINITION CALL - $token = $definition-> - info_tag_transform[$token->name]->transform($token, $config, $context); - if ($e) { - $e->send(E_NOTICE, 'Strategy_RemoveForeignElements: Tag transform', $original_name); - } - } - - if (isset($definition->info[$token->name])) { - // mostly everything's good, but - // we need to make sure required attributes are in order - if (($token instanceof HTMLPurifier_Token_Start || $token instanceof HTMLPurifier_Token_Empty) && - $definition->info[$token->name]->required_attr && - ($token->name != 'img' || $remove_invalid_img) // ensure config option still works - ) { - $attr_validator->validateToken($token, $config, $context); - $ok = true; - foreach ($definition->info[$token->name]->required_attr as $name) { - if (!isset($token->attr[$name])) { - $ok = false; - break; - } - } - if (!$ok) { - if ($e) { - $e->send( - E_ERROR, - 'Strategy_RemoveForeignElements: Missing required attribute', - $name - ); - } - continue; - } - $token->armor['ValidateAttributes'] = true; - } - - if (isset($hidden_elements[$token->name]) && $token instanceof HTMLPurifier_Token_Start) { - $textify_comments = $token->name; - } elseif ($token->name === $textify_comments && $token instanceof HTMLPurifier_Token_End) { - $textify_comments = false; - } - - } elseif ($escape_invalid_tags) { - // invalid tag, generate HTML representation and insert in - if ($e) { - $e->send(E_WARNING, 'Strategy_RemoveForeignElements: Foreign element to text'); - } - $token = new HTMLPurifier_Token_Text( - $generator->generateFromToken($token) - ); - } else { - // check if we need to destroy all of the tag's children - // CAN BE GENERICIZED - if (isset($hidden_elements[$token->name])) { - if ($token instanceof HTMLPurifier_Token_Start) { - $remove_until = $token->name; - } elseif ($token instanceof HTMLPurifier_Token_Empty) { - // do nothing: we're still looking - } else { - $remove_until = false; - } - if ($e) { - $e->send(E_ERROR, 'Strategy_RemoveForeignElements: Foreign meta element removed'); - } - } else { - if ($e) { - $e->send(E_ERROR, 'Strategy_RemoveForeignElements: Foreign element removed'); - } - } - continue; - } - } elseif ($token instanceof HTMLPurifier_Token_Comment) { - // textify comments in script tags when they are allowed - if ($textify_comments !== false) { - $data = $token->data; - $token = new HTMLPurifier_Token_Text($data); - } elseif ($trusted || $check_comments) { - // always cleanup comments - $trailing_hyphen = false; - if ($e) { - // perform check whether or not there's a trailing hyphen - if (substr($token->data, -1) == '-') { - $trailing_hyphen = true; - } - } - $token->data = rtrim($token->data, '-'); - $found_double_hyphen = false; - while (strpos($token->data, '--') !== false) { - $found_double_hyphen = true; - $token->data = str_replace('--', '-', $token->data); - } - if ($trusted || !empty($comment_lookup[trim($token->data)]) || - ($comment_regexp !== null && preg_match($comment_regexp, trim($token->data)))) { - // OK good - if ($e) { - if ($trailing_hyphen) { - $e->send( - E_NOTICE, - 'Strategy_RemoveForeignElements: Trailing hyphen in comment removed' - ); - } - if ($found_double_hyphen) { - $e->send(E_NOTICE, 'Strategy_RemoveForeignElements: Hyphens in comment collapsed'); - } - } - } else { - if ($e) { - $e->send(E_NOTICE, 'Strategy_RemoveForeignElements: Comment removed'); - } - continue; - } - } else { - // strip comments - if ($e) { - $e->send(E_NOTICE, 'Strategy_RemoveForeignElements: Comment removed'); - } - continue; - } - } elseif ($token instanceof HTMLPurifier_Token_Text) { - } else { - continue; - } - $result[] = $token; - } - if ($remove_until && $e) { - // we removed tokens until the end, throw error - $e->send(E_ERROR, 'Strategy_RemoveForeignElements: Token removed to end', $remove_until); - } - $context->destroy('CurrentToken'); - return $result; - } -} - -// vim: et sw=4 sts=4 +getHTMLDefinition(); + $generator = new HTMLPurifier_Generator($config, $context); + $result = array(); + + $escape_invalid_tags = $config->get('Core.EscapeInvalidTags'); + $remove_invalid_img = $config->get('Core.RemoveInvalidImg'); + + // currently only used to determine if comments should be kept + $trusted = $config->get('HTML.Trusted'); + $comment_lookup = $config->get('HTML.AllowedComments'); + $comment_regexp = $config->get('HTML.AllowedCommentsRegexp'); + $check_comments = $comment_lookup !== array() || $comment_regexp !== null; + + $remove_script_contents = $config->get('Core.RemoveScriptContents'); + $hidden_elements = $config->get('Core.HiddenElements'); + + // remove script contents compatibility + if ($remove_script_contents === true) { + $hidden_elements['script'] = true; + } elseif ($remove_script_contents === false && isset($hidden_elements['script'])) { + unset($hidden_elements['script']); + } + + $attr_validator = new HTMLPurifier_AttrValidator(); + + // removes tokens until it reaches a closing tag with its value + $remove_until = false; + + // converts comments into text tokens when this is equal to a tag name + $textify_comments = false; + + $token = false; + $context->register('CurrentToken', $token); + + $e = false; + if ($config->get('Core.CollectErrors')) { + $e =& $context->get('ErrorCollector'); + } + + foreach ($tokens as $token) { + if ($remove_until) { + if (empty($token->is_tag) || $token->name !== $remove_until) { + continue; + } + } + if (!empty($token->is_tag)) { + // DEFINITION CALL + + // before any processing, try to transform the element + if (isset($definition->info_tag_transform[$token->name])) { + $original_name = $token->name; + // there is a transformation for this tag + // DEFINITION CALL + $token = $definition-> + info_tag_transform[$token->name]->transform($token, $config, $context); + if ($e) { + $e->send(E_NOTICE, 'Strategy_RemoveForeignElements: Tag transform', $original_name); + } + } + + if (isset($definition->info[$token->name])) { + // mostly everything's good, but + // we need to make sure required attributes are in order + if (($token instanceof HTMLPurifier_Token_Start || $token instanceof HTMLPurifier_Token_Empty) && + $definition->info[$token->name]->required_attr && + ($token->name != 'img' || $remove_invalid_img) // ensure config option still works + ) { + $attr_validator->validateToken($token, $config, $context); + $ok = true; + foreach ($definition->info[$token->name]->required_attr as $name) { + if (!isset($token->attr[$name])) { + $ok = false; + break; + } + } + if (!$ok) { + if ($e) { + $e->send( + E_ERROR, + 'Strategy_RemoveForeignElements: Missing required attribute', + $name + ); + } + continue; + } + $token->armor['ValidateAttributes'] = true; + } + + if (isset($hidden_elements[$token->name]) && $token instanceof HTMLPurifier_Token_Start) { + $textify_comments = $token->name; + } elseif ($token->name === $textify_comments && $token instanceof HTMLPurifier_Token_End) { + $textify_comments = false; + } + + } elseif ($escape_invalid_tags) { + // invalid tag, generate HTML representation and insert in + if ($e) { + $e->send(E_WARNING, 'Strategy_RemoveForeignElements: Foreign element to text'); + } + $token = new HTMLPurifier_Token_Text( + $generator->generateFromToken($token) + ); + } else { + // check if we need to destroy all of the tag's children + // CAN BE GENERICIZED + if (isset($hidden_elements[$token->name])) { + if ($token instanceof HTMLPurifier_Token_Start) { + $remove_until = $token->name; + } elseif ($token instanceof HTMLPurifier_Token_Empty) { + // do nothing: we're still looking + } else { + $remove_until = false; + } + if ($e) { + $e->send(E_ERROR, 'Strategy_RemoveForeignElements: Foreign meta element removed'); + } + } else { + if ($e) { + $e->send(E_ERROR, 'Strategy_RemoveForeignElements: Foreign element removed'); + } + } + continue; + } + } elseif ($token instanceof HTMLPurifier_Token_Comment) { + // textify comments in script tags when they are allowed + if ($textify_comments !== false) { + $data = $token->data; + $token = new HTMLPurifier_Token_Text($data); + } elseif ($trusted || $check_comments) { + // always cleanup comments + $trailing_hyphen = false; + if ($e) { + // perform check whether or not there's a trailing hyphen + if (substr($token->data, -1) == '-') { + $trailing_hyphen = true; + } + } + $token->data = rtrim($token->data, '-'); + $found_double_hyphen = false; + while (strpos($token->data, '--') !== false) { + $found_double_hyphen = true; + $token->data = str_replace('--', '-', $token->data); + } + if ($trusted || !empty($comment_lookup[trim($token->data)]) || + ($comment_regexp !== null && preg_match($comment_regexp, trim($token->data)))) { + // OK good + if ($e) { + if ($trailing_hyphen) { + $e->send( + E_NOTICE, + 'Strategy_RemoveForeignElements: Trailing hyphen in comment removed' + ); + } + if ($found_double_hyphen) { + $e->send(E_NOTICE, 'Strategy_RemoveForeignElements: Hyphens in comment collapsed'); + } + } + } else { + if ($e) { + $e->send(E_NOTICE, 'Strategy_RemoveForeignElements: Comment removed'); + } + continue; + } + } else { + // strip comments + if ($e) { + $e->send(E_NOTICE, 'Strategy_RemoveForeignElements: Comment removed'); + } + continue; + } + } elseif ($token instanceof HTMLPurifier_Token_Text) { + } else { + continue; + } + $result[] = $token; + } + if ($remove_until && $e) { + // we removed tokens until the end, throw error + $e->send(E_ERROR, 'Strategy_RemoveForeignElements: Token removed to end', $remove_until); + } + $context->destroy('CurrentToken'); + return $result; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Strategy/ValidateAttributes.php b/thirdparty/HTMLPurifier/HTMLPurifier/Strategy/ValidateAttributes.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Strategy/ValidateAttributes.php rename to thirdparty/HTMLPurifier/HTMLPurifier/Strategy/ValidateAttributes.php index 428f975fc..fbb3d27c8 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Strategy/ValidateAttributes.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/Strategy/ValidateAttributes.php @@ -1,45 +1,45 @@ -register('CurrentToken', $token); - - foreach ($tokens as $key => $token) { - - // only process tokens that have attributes, - // namely start and empty tags - if (!$token instanceof HTMLPurifier_Token_Start && !$token instanceof HTMLPurifier_Token_Empty) { - continue; - } - - // skip tokens that are armored - if (!empty($token->armor['ValidateAttributes'])) { - continue; - } - - // note that we have no facilities here for removing tokens - $validator->validateToken($token, $config, $context); - } - $context->destroy('CurrentToken'); - return $tokens; - } -} - -// vim: et sw=4 sts=4 +register('CurrentToken', $token); + + foreach ($tokens as $key => $token) { + + // only process tokens that have attributes, + // namely start and empty tags + if (!$token instanceof HTMLPurifier_Token_Start && !$token instanceof HTMLPurifier_Token_Empty) { + continue; + } + + // skip tokens that are armored + if (!empty($token->armor['ValidateAttributes'])) { + continue; + } + + // note that we have no facilities here for removing tokens + $validator->validateToken($token, $config, $context); + } + $context->destroy('CurrentToken'); + return $tokens; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/StringHash.php b/thirdparty/HTMLPurifier/HTMLPurifier/StringHash.php similarity index 95% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/StringHash.php rename to thirdparty/HTMLPurifier/HTMLPurifier/StringHash.php index 8d0740cdc..c07370197 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/StringHash.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/StringHash.php @@ -1,47 +1,47 @@ -accessed[$index] = true; - return parent::offsetGet($index); - } - - /** - * Returns a lookup array of all array indexes that have been accessed. - * @return array in form array($index => true). - */ - public function getAccessed() - { - return $this->accessed; - } - - /** - * Resets the access array. - */ - public function resetAccessed() - { - $this->accessed = array(); - } -} - -// vim: et sw=4 sts=4 +accessed[$index] = true; + return parent::offsetGet($index); + } + + /** + * Returns a lookup array of all array indexes that have been accessed. + * @return array in form array($index => true). + */ + public function getAccessed() + { + return $this->accessed; + } + + /** + * Resets the access array. + */ + public function resetAccessed() + { + $this->accessed = array(); + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/StringHashParser.php b/thirdparty/HTMLPurifier/HTMLPurifier/StringHashParser.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/StringHashParser.php rename to thirdparty/HTMLPurifier/HTMLPurifier/StringHashParser.php index 05abd837e..7c73f8083 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/StringHashParser.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/StringHashParser.php @@ -1,136 +1,136 @@ - 'DefaultKeyValue', - * 'KEY' => 'Value', - * 'KEY2' => 'Value2', - * 'MULTILINE-KEY' => "Multiline\nvalue.\n", - * ) - * - * We use this as an easy to use file-format for configuration schema - * files, but the class itself is usage agnostic. - * - * You can use ---- to forcibly terminate parsing of a single string-hash; - * this marker is used in multi string-hashes to delimit boundaries. - */ -class HTMLPurifier_StringHashParser -{ - - /** - * @type string - */ - public $default = 'ID'; - - /** - * Parses a file that contains a single string-hash. - * @param string $file - * @return array - */ - public function parseFile($file) - { - if (!file_exists($file)) { - return false; - } - $fh = fopen($file, 'r'); - if (!$fh) { - return false; - } - $ret = $this->parseHandle($fh); - fclose($fh); - return $ret; - } - - /** - * Parses a file that contains multiple string-hashes delimited by '----' - * @param string $file - * @return array - */ - public function parseMultiFile($file) - { - if (!file_exists($file)) { - return false; - } - $ret = array(); - $fh = fopen($file, 'r'); - if (!$fh) { - return false; - } - while (!feof($fh)) { - $ret[] = $this->parseHandle($fh); - } - fclose($fh); - return $ret; - } - - /** - * Internal parser that acepts a file handle. - * @note While it's possible to simulate in-memory parsing by using - * custom stream wrappers, if such a use-case arises we should - * factor out the file handle into its own class. - * @param resource $fh File handle with pointer at start of valid string-hash - * block. - * @return array - */ - protected function parseHandle($fh) - { - $state = false; - $single = false; - $ret = array(); - do { - $line = fgets($fh); - if ($line === false) { - break; - } - $line = rtrim($line, "\n\r"); - if (!$state && $line === '') { - continue; - } - if ($line === '----') { - break; - } - if (strncmp('--#', $line, 3) === 0) { - // Comment - continue; - } elseif (strncmp('--', $line, 2) === 0) { - // Multiline declaration - $state = trim($line, '- '); - if (!isset($ret[$state])) { - $ret[$state] = ''; - } - continue; - } elseif (!$state) { - $single = true; - if (strpos($line, ':') !== false) { - // Single-line declaration - list($state, $line) = explode(':', $line, 2); - $line = trim($line); - } else { - // Use default declaration - $state = $this->default; - } - } - if ($single) { - $ret[$state] = $line; - $single = false; - $state = false; - } else { - $ret[$state] .= "$line\n"; - } - } while (!feof($fh)); - return $ret; - } -} - -// vim: et sw=4 sts=4 + 'DefaultKeyValue', + * 'KEY' => 'Value', + * 'KEY2' => 'Value2', + * 'MULTILINE-KEY' => "Multiline\nvalue.\n", + * ) + * + * We use this as an easy to use file-format for configuration schema + * files, but the class itself is usage agnostic. + * + * You can use ---- to forcibly terminate parsing of a single string-hash; + * this marker is used in multi string-hashes to delimit boundaries. + */ +class HTMLPurifier_StringHashParser +{ + + /** + * @type string + */ + public $default = 'ID'; + + /** + * Parses a file that contains a single string-hash. + * @param string $file + * @return array + */ + public function parseFile($file) + { + if (!file_exists($file)) { + return false; + } + $fh = fopen($file, 'r'); + if (!$fh) { + return false; + } + $ret = $this->parseHandle($fh); + fclose($fh); + return $ret; + } + + /** + * Parses a file that contains multiple string-hashes delimited by '----' + * @param string $file + * @return array + */ + public function parseMultiFile($file) + { + if (!file_exists($file)) { + return false; + } + $ret = array(); + $fh = fopen($file, 'r'); + if (!$fh) { + return false; + } + while (!feof($fh)) { + $ret[] = $this->parseHandle($fh); + } + fclose($fh); + return $ret; + } + + /** + * Internal parser that acepts a file handle. + * @note While it's possible to simulate in-memory parsing by using + * custom stream wrappers, if such a use-case arises we should + * factor out the file handle into its own class. + * @param resource $fh File handle with pointer at start of valid string-hash + * block. + * @return array + */ + protected function parseHandle($fh) + { + $state = false; + $single = false; + $ret = array(); + do { + $line = fgets($fh); + if ($line === false) { + break; + } + $line = rtrim($line, "\n\r"); + if (!$state && $line === '') { + continue; + } + if ($line === '----') { + break; + } + if (strncmp('--#', $line, 3) === 0) { + // Comment + continue; + } elseif (strncmp('--', $line, 2) === 0) { + // Multiline declaration + $state = trim($line, '- '); + if (!isset($ret[$state])) { + $ret[$state] = ''; + } + continue; + } elseif (!$state) { + $single = true; + if (strpos($line, ':') !== false) { + // Single-line declaration + list($state, $line) = explode(':', $line, 2); + $line = trim($line); + } else { + // Use default declaration + $state = $this->default; + } + } + if ($single) { + $ret[$state] = $line; + $single = false; + $state = false; + } else { + $ret[$state] .= "$line\n"; + } + } while (!feof($fh)); + return $ret; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/TagTransform.php b/thirdparty/HTMLPurifier/HTMLPurifier/TagTransform.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/TagTransform.php rename to thirdparty/HTMLPurifier/HTMLPurifier/TagTransform.php index 0f481bfd1..7b8d83343 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/TagTransform.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/TagTransform.php @@ -1,37 +1,37 @@ - 'xx-small', - '1' => 'xx-small', - '2' => 'small', - '3' => 'medium', - '4' => 'large', - '5' => 'x-large', - '6' => 'xx-large', - '7' => '300%', - '-1' => 'smaller', - '-2' => '60%', - '+1' => 'larger', - '+2' => '150%', - '+3' => '200%', - '+4' => '300%' - ); - - /** - * @param HTMLPurifier_Token_Tag $tag - * @param HTMLPurifier_Config $config - * @param HTMLPurifier_Context $context - * @return HTMLPurifier_Token_End|string - */ - public function transform($tag, $config, $context) - { - if ($tag instanceof HTMLPurifier_Token_End) { - $new_tag = clone $tag; - $new_tag->name = $this->transform_to; - return $new_tag; - } - - $attr = $tag->attr; - $prepend_style = ''; - - // handle color transform - if (isset($attr['color'])) { - $prepend_style .= 'color:' . $attr['color'] . ';'; - unset($attr['color']); - } - - // handle face transform - if (isset($attr['face'])) { - $prepend_style .= 'font-family:' . $attr['face'] . ';'; - unset($attr['face']); - } - - // handle size transform - if (isset($attr['size'])) { - // normalize large numbers - if ($attr['size'] !== '') { - if ($attr['size']{0} == '+' || $attr['size']{0} == '-') { - $size = (int)$attr['size']; - if ($size < -2) { - $attr['size'] = '-2'; - } - if ($size > 4) { - $attr['size'] = '+4'; - } - } else { - $size = (int)$attr['size']; - if ($size > 7) { - $attr['size'] = '7'; - } - } - } - if (isset($this->_size_lookup[$attr['size']])) { - $prepend_style .= 'font-size:' . - $this->_size_lookup[$attr['size']] . ';'; - } - unset($attr['size']); - } - - if ($prepend_style) { - $attr['style'] = isset($attr['style']) ? - $prepend_style . $attr['style'] : - $prepend_style; - } - - $new_tag = clone $tag; - $new_tag->name = $this->transform_to; - $new_tag->attr = $attr; - - return $new_tag; - } -} - -// vim: et sw=4 sts=4 + 'xx-small', + '1' => 'xx-small', + '2' => 'small', + '3' => 'medium', + '4' => 'large', + '5' => 'x-large', + '6' => 'xx-large', + '7' => '300%', + '-1' => 'smaller', + '-2' => '60%', + '+1' => 'larger', + '+2' => '150%', + '+3' => '200%', + '+4' => '300%' + ); + + /** + * @param HTMLPurifier_Token_Tag $tag + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return HTMLPurifier_Token_End|string + */ + public function transform($tag, $config, $context) + { + if ($tag instanceof HTMLPurifier_Token_End) { + $new_tag = clone $tag; + $new_tag->name = $this->transform_to; + return $new_tag; + } + + $attr = $tag->attr; + $prepend_style = ''; + + // handle color transform + if (isset($attr['color'])) { + $prepend_style .= 'color:' . $attr['color'] . ';'; + unset($attr['color']); + } + + // handle face transform + if (isset($attr['face'])) { + $prepend_style .= 'font-family:' . $attr['face'] . ';'; + unset($attr['face']); + } + + // handle size transform + if (isset($attr['size'])) { + // normalize large numbers + if ($attr['size'] !== '') { + if ($attr['size']{0} == '+' || $attr['size']{0} == '-') { + $size = (int)$attr['size']; + if ($size < -2) { + $attr['size'] = '-2'; + } + if ($size > 4) { + $attr['size'] = '+4'; + } + } else { + $size = (int)$attr['size']; + if ($size > 7) { + $attr['size'] = '7'; + } + } + } + if (isset($this->_size_lookup[$attr['size']])) { + $prepend_style .= 'font-size:' . + $this->_size_lookup[$attr['size']] . ';'; + } + unset($attr['size']); + } + + if ($prepend_style) { + $attr['style'] = isset($attr['style']) ? + $prepend_style . $attr['style'] : + $prepend_style; + } + + $new_tag = clone $tag; + $new_tag->name = $this->transform_to; + $new_tag->attr = $attr; + + return $new_tag; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/TagTransform/Simple.php b/thirdparty/HTMLPurifier/HTMLPurifier/TagTransform/Simple.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/TagTransform/Simple.php rename to thirdparty/HTMLPurifier/HTMLPurifier/TagTransform/Simple.php index d21b634e9..71bf10b91 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/TagTransform/Simple.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/TagTransform/Simple.php @@ -1,44 +1,44 @@ -transform_to = $transform_to; - $this->style = $style; - } - - /** - * @param HTMLPurifier_Token_Tag $tag - * @param HTMLPurifier_Config $config - * @param HTMLPurifier_Context $context - * @return string - */ - public function transform($tag, $config, $context) - { - $new_tag = clone $tag; - $new_tag->name = $this->transform_to; - if (!is_null($this->style) && - ($new_tag instanceof HTMLPurifier_Token_Start || $new_tag instanceof HTMLPurifier_Token_Empty) - ) { - $this->prependCSS($new_tag->attr, $this->style); - } - return $new_tag; - } -} - -// vim: et sw=4 sts=4 +transform_to = $transform_to; + $this->style = $style; + } + + /** + * @param HTMLPurifier_Token_Tag $tag + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return string + */ + public function transform($tag, $config, $context) + { + $new_tag = clone $tag; + $new_tag->name = $this->transform_to; + if (!is_null($this->style) && + ($new_tag instanceof HTMLPurifier_Token_Start || $new_tag instanceof HTMLPurifier_Token_Empty) + ) { + $this->prependCSS($new_tag->attr, $this->style); + } + return $new_tag; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Token.php b/thirdparty/HTMLPurifier/HTMLPurifier/Token.php similarity index 95% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Token.php rename to thirdparty/HTMLPurifier/HTMLPurifier/Token.php index 9bc19c6b4..85b85e072 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Token.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/Token.php @@ -1,100 +1,100 @@ -line = $l; - $this->col = $c; - } - - /** - * Convenience function for DirectLex settings line/col position. - * @param int $l - * @param int $c - */ - public function rawPosition($l, $c) - { - if ($c === -1) { - $l++; - } - $this->line = $l; - $this->col = $c; - } - - /** - * Converts a token into its corresponding node. - */ - abstract public function toNode(); -} - -// vim: et sw=4 sts=4 +line = $l; + $this->col = $c; + } + + /** + * Convenience function for DirectLex settings line/col position. + * @param int $l + * @param int $c + */ + public function rawPosition($l, $c) + { + if ($c === -1) { + $l++; + } + $this->line = $l; + $this->col = $c; + } + + /** + * Converts a token into its corresponding node. + */ + abstract public function toNode(); +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Token/Comment.php b/thirdparty/HTMLPurifier/HTMLPurifier/Token/Comment.php similarity index 95% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Token/Comment.php rename to thirdparty/HTMLPurifier/HTMLPurifier/Token/Comment.php index 3fd273b16..23453c705 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Token/Comment.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/Token/Comment.php @@ -1,38 +1,38 @@ -data = $data; - $this->line = $line; - $this->col = $col; - } - - public function toNode() { - return new HTMLPurifier_Node_Comment($this->data, $this->line, $this->col); - } -} - -// vim: et sw=4 sts=4 +data = $data; + $this->line = $line; + $this->col = $col; + } + + public function toNode() { + return new HTMLPurifier_Node_Comment($this->data, $this->line, $this->col); + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Token/Empty.php b/thirdparty/HTMLPurifier/HTMLPurifier/Token/Empty.php similarity index 94% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Token/Empty.php rename to thirdparty/HTMLPurifier/HTMLPurifier/Token/Empty.php index bd35024ab..78a95f555 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Token/Empty.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/Token/Empty.php @@ -1,15 +1,15 @@ -empty = true; - return $n; - } -} - -// vim: et sw=4 sts=4 +empty = true; + return $n; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Token/End.php b/thirdparty/HTMLPurifier/HTMLPurifier/Token/End.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Token/End.php rename to thirdparty/HTMLPurifier/HTMLPurifier/Token/End.php index 99c34e750..59b38fdc5 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Token/End.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/Token/End.php @@ -1,24 +1,24 @@ -toNode not supported!"); - } -} - -// vim: et sw=4 sts=4 +toNode not supported!"); + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Token/Start.php b/thirdparty/HTMLPurifier/HTMLPurifier/Token/Start.php similarity index 93% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Token/Start.php rename to thirdparty/HTMLPurifier/HTMLPurifier/Token/Start.php index 574745b60..019f317ad 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Token/Start.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/Token/Start.php @@ -1,10 +1,10 @@ -!empty($obj->is_tag) - * without having to use a function call is_a(). - * @type bool - */ - public $is_tag = true; - - /** - * The lower-case name of the tag, like 'a', 'b' or 'blockquote'. - * - * @note Strictly speaking, XML tags are case sensitive, so we shouldn't - * be lower-casing them, but these tokens cater to HTML tags, which are - * insensitive. - * @type string - */ - public $name; - - /** - * Associative array of the tag's attributes. - * @type array - */ - public $attr = array(); - - /** - * Non-overloaded constructor, which lower-cases passed tag name. - * - * @param string $name String name. - * @param array $attr Associative array of attributes. - * @param int $line - * @param int $col - * @param array $armor - */ - public function __construct($name, $attr = array(), $line = null, $col = null, $armor = array()) - { - $this->name = ctype_lower($name) ? $name : strtolower($name); - foreach ($attr as $key => $value) { - // normalization only necessary when key is not lowercase - if (!ctype_lower($key)) { - $new_key = strtolower($key); - if (!isset($attr[$new_key])) { - $attr[$new_key] = $attr[$key]; - } - if ($new_key !== $key) { - unset($attr[$key]); - } - } - } - $this->attr = $attr; - $this->line = $line; - $this->col = $col; - $this->armor = $armor; - } - - public function toNode() { - return new HTMLPurifier_Node_Element($this->name, $this->attr, $this->line, $this->col, $this->armor); - } -} - -// vim: et sw=4 sts=4 +!empty($obj->is_tag) + * without having to use a function call is_a(). + * @type bool + */ + public $is_tag = true; + + /** + * The lower-case name of the tag, like 'a', 'b' or 'blockquote'. + * + * @note Strictly speaking, XML tags are case sensitive, so we shouldn't + * be lower-casing them, but these tokens cater to HTML tags, which are + * insensitive. + * @type string + */ + public $name; + + /** + * Associative array of the tag's attributes. + * @type array + */ + public $attr = array(); + + /** + * Non-overloaded constructor, which lower-cases passed tag name. + * + * @param string $name String name. + * @param array $attr Associative array of attributes. + * @param int $line + * @param int $col + * @param array $armor + */ + public function __construct($name, $attr = array(), $line = null, $col = null, $armor = array()) + { + $this->name = ctype_lower($name) ? $name : strtolower($name); + foreach ($attr as $key => $value) { + // normalization only necessary when key is not lowercase + if (!ctype_lower($key)) { + $new_key = strtolower($key); + if (!isset($attr[$new_key])) { + $attr[$new_key] = $attr[$key]; + } + if ($new_key !== $key) { + unset($attr[$key]); + } + } + } + $this->attr = $attr; + $this->line = $line; + $this->col = $col; + $this->armor = $armor; + } + + public function toNode() { + return new HTMLPurifier_Node_Element($this->name, $this->attr, $this->line, $this->col, $this->armor); + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Token/Text.php b/thirdparty/HTMLPurifier/HTMLPurifier/Token/Text.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Token/Text.php rename to thirdparty/HTMLPurifier/HTMLPurifier/Token/Text.php index ff45125a5..f26a1c211 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/Token/Text.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/Token/Text.php @@ -1,53 +1,53 @@ -data = $data; - $this->is_whitespace = ctype_space($data); - $this->line = $line; - $this->col = $col; - } - - public function toNode() { - return new HTMLPurifier_Node_Text($this->data, $this->is_whitespace, $this->line, $this->col); - } -} - -// vim: et sw=4 sts=4 +data = $data; + $this->is_whitespace = ctype_space($data); + $this->line = $line; + $this->col = $col; + } + + public function toNode() { + return new HTMLPurifier_Node_Text($this->data, $this->is_whitespace, $this->line, $this->col); + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/TokenFactory.php b/thirdparty/HTMLPurifier/HTMLPurifier/TokenFactory.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/TokenFactory.php rename to thirdparty/HTMLPurifier/HTMLPurifier/TokenFactory.php index e016b80ea..dea2446b9 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/TokenFactory.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/TokenFactory.php @@ -1,118 +1,118 @@ -p_start = new HTMLPurifier_Token_Start('', array()); - $this->p_end = new HTMLPurifier_Token_End(''); - $this->p_empty = new HTMLPurifier_Token_Empty('', array()); - $this->p_text = new HTMLPurifier_Token_Text(''); - $this->p_comment = new HTMLPurifier_Token_Comment(''); - } - - /** - * Creates a HTMLPurifier_Token_Start. - * @param string $name Tag name - * @param array $attr Associative array of attributes - * @return HTMLPurifier_Token_Start Generated HTMLPurifier_Token_Start - */ - public function createStart($name, $attr = array()) - { - $p = clone $this->p_start; - $p->__construct($name, $attr); - return $p; - } - - /** - * Creates a HTMLPurifier_Token_End. - * @param string $name Tag name - * @return HTMLPurifier_Token_End Generated HTMLPurifier_Token_End - */ - public function createEnd($name) - { - $p = clone $this->p_end; - $p->__construct($name); - return $p; - } - - /** - * Creates a HTMLPurifier_Token_Empty. - * @param string $name Tag name - * @param array $attr Associative array of attributes - * @return HTMLPurifier_Token_Empty Generated HTMLPurifier_Token_Empty - */ - public function createEmpty($name, $attr = array()) - { - $p = clone $this->p_empty; - $p->__construct($name, $attr); - return $p; - } - - /** - * Creates a HTMLPurifier_Token_Text. - * @param string $data Data of text token - * @return HTMLPurifier_Token_Text Generated HTMLPurifier_Token_Text - */ - public function createText($data) - { - $p = clone $this->p_text; - $p->__construct($data); - return $p; - } - - /** - * Creates a HTMLPurifier_Token_Comment. - * @param string $data Data of comment token - * @return HTMLPurifier_Token_Comment Generated HTMLPurifier_Token_Comment - */ - public function createComment($data) - { - $p = clone $this->p_comment; - $p->__construct($data); - return $p; - } -} - -// vim: et sw=4 sts=4 +p_start = new HTMLPurifier_Token_Start('', array()); + $this->p_end = new HTMLPurifier_Token_End(''); + $this->p_empty = new HTMLPurifier_Token_Empty('', array()); + $this->p_text = new HTMLPurifier_Token_Text(''); + $this->p_comment = new HTMLPurifier_Token_Comment(''); + } + + /** + * Creates a HTMLPurifier_Token_Start. + * @param string $name Tag name + * @param array $attr Associative array of attributes + * @return HTMLPurifier_Token_Start Generated HTMLPurifier_Token_Start + */ + public function createStart($name, $attr = array()) + { + $p = clone $this->p_start; + $p->__construct($name, $attr); + return $p; + } + + /** + * Creates a HTMLPurifier_Token_End. + * @param string $name Tag name + * @return HTMLPurifier_Token_End Generated HTMLPurifier_Token_End + */ + public function createEnd($name) + { + $p = clone $this->p_end; + $p->__construct($name); + return $p; + } + + /** + * Creates a HTMLPurifier_Token_Empty. + * @param string $name Tag name + * @param array $attr Associative array of attributes + * @return HTMLPurifier_Token_Empty Generated HTMLPurifier_Token_Empty + */ + public function createEmpty($name, $attr = array()) + { + $p = clone $this->p_empty; + $p->__construct($name, $attr); + return $p; + } + + /** + * Creates a HTMLPurifier_Token_Text. + * @param string $data Data of text token + * @return HTMLPurifier_Token_Text Generated HTMLPurifier_Token_Text + */ + public function createText($data) + { + $p = clone $this->p_text; + $p->__construct($data); + return $p; + } + + /** + * Creates a HTMLPurifier_Token_Comment. + * @param string $data Data of comment token + * @return HTMLPurifier_Token_Comment Generated HTMLPurifier_Token_Comment + */ + public function createComment($data) + { + $p = clone $this->p_comment; + $p->__construct($data); + return $p; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/URI.php b/thirdparty/HTMLPurifier/HTMLPurifier/URI.php similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/URI.php rename to thirdparty/HTMLPurifier/HTMLPurifier/URI.php index c4256b957..a5e7ae298 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/URI.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/URI.php @@ -1,314 +1,314 @@ -scheme = is_null($scheme) || ctype_lower($scheme) ? $scheme : strtolower($scheme); - $this->userinfo = $userinfo; - $this->host = $host; - $this->port = is_null($port) ? $port : (int)$port; - $this->path = $path; - $this->query = $query; - $this->fragment = $fragment; - } - - /** - * Retrieves a scheme object corresponding to the URI's scheme/default - * @param HTMLPurifier_Config $config - * @param HTMLPurifier_Context $context - * @return HTMLPurifier_URIScheme Scheme object appropriate for validating this URI - */ - public function getSchemeObj($config, $context) - { - $registry = HTMLPurifier_URISchemeRegistry::instance(); - if ($this->scheme !== null) { - $scheme_obj = $registry->getScheme($this->scheme, $config, $context); - if (!$scheme_obj) { - return false; - } // invalid scheme, clean it out - } else { - // no scheme: retrieve the default one - $def = $config->getDefinition('URI'); - $scheme_obj = $def->getDefaultScheme($config, $context); - if (!$scheme_obj) { - // something funky happened to the default scheme object - trigger_error( - 'Default scheme object "' . $def->defaultScheme . '" was not readable', - E_USER_WARNING - ); - return false; - } - } - return $scheme_obj; - } - - /** - * Generic validation method applicable for all schemes. May modify - * this URI in order to get it into a compliant form. - * @param HTMLPurifier_Config $config - * @param HTMLPurifier_Context $context - * @return bool True if validation/filtering succeeds, false if failure - */ - public function validate($config, $context) - { - // ABNF definitions from RFC 3986 - $chars_sub_delims = '!$&\'()*+,;='; - $chars_gen_delims = ':/?#[]@'; - $chars_pchar = $chars_sub_delims . ':@'; - - // validate host - if (!is_null($this->host)) { - $host_def = new HTMLPurifier_AttrDef_URI_Host(); - $this->host = $host_def->validate($this->host, $config, $context); - if ($this->host === false) { - $this->host = null; - } - } - - // validate scheme - // NOTE: It's not appropriate to check whether or not this - // scheme is in our registry, since a URIFilter may convert a - // URI that we don't allow into one we do. So instead, we just - // check if the scheme can be dropped because there is no host - // and it is our default scheme. - if (!is_null($this->scheme) && is_null($this->host) || $this->host === '') { - // support for relative paths is pretty abysmal when the - // scheme is present, so axe it when possible - $def = $config->getDefinition('URI'); - if ($def->defaultScheme === $this->scheme) { - $this->scheme = null; - } - } - - // validate username - if (!is_null($this->userinfo)) { - $encoder = new HTMLPurifier_PercentEncoder($chars_sub_delims . ':'); - $this->userinfo = $encoder->encode($this->userinfo); - } - - // validate port - if (!is_null($this->port)) { - if ($this->port < 1 || $this->port > 65535) { - $this->port = null; - } - } - - // validate path - $segments_encoder = new HTMLPurifier_PercentEncoder($chars_pchar . '/'); - if (!is_null($this->host)) { // this catches $this->host === '' - // path-abempty (hier and relative) - // http://www.example.com/my/path - // //www.example.com/my/path (looks odd, but works, and - // recognized by most browsers) - // (this set is valid or invalid on a scheme by scheme - // basis, so we'll deal with it later) - // file:///my/path - // ///my/path - $this->path = $segments_encoder->encode($this->path); - } elseif ($this->path !== '') { - if ($this->path[0] === '/') { - // path-absolute (hier and relative) - // http:/my/path - // /my/path - if (strlen($this->path) >= 2 && $this->path[1] === '/') { - // This could happen if both the host gets stripped - // out - // http://my/path - // //my/path - $this->path = ''; - } else { - $this->path = $segments_encoder->encode($this->path); - } - } elseif (!is_null($this->scheme)) { - // path-rootless (hier) - // http:my/path - // Short circuit evaluation means we don't need to check nz - $this->path = $segments_encoder->encode($this->path); - } else { - // path-noscheme (relative) - // my/path - // (once again, not checking nz) - $segment_nc_encoder = new HTMLPurifier_PercentEncoder($chars_sub_delims . '@'); - $c = strpos($this->path, '/'); - if ($c !== false) { - $this->path = - $segment_nc_encoder->encode(substr($this->path, 0, $c)) . - $segments_encoder->encode(substr($this->path, $c)); - } else { - $this->path = $segment_nc_encoder->encode($this->path); - } - } - } else { - // path-empty (hier and relative) - $this->path = ''; // just to be safe - } - - // qf = query and fragment - $qf_encoder = new HTMLPurifier_PercentEncoder($chars_pchar . '/?'); - - if (!is_null($this->query)) { - $this->query = $qf_encoder->encode($this->query); - } - - if (!is_null($this->fragment)) { - $this->fragment = $qf_encoder->encode($this->fragment); - } - return true; - } - - /** - * Convert URI back to string - * @return string URI appropriate for output - */ - public function toString() - { - // reconstruct authority - $authority = null; - // there is a rendering difference between a null authority - // (http:foo-bar) and an empty string authority - // (http:///foo-bar). - if (!is_null($this->host)) { - $authority = ''; - if (!is_null($this->userinfo)) { - $authority .= $this->userinfo . '@'; - } - $authority .= $this->host; - if (!is_null($this->port)) { - $authority .= ':' . $this->port; - } - } - - // Reconstruct the result - // One might wonder about parsing quirks from browsers after - // this reconstruction. Unfortunately, parsing behavior depends - // on what *scheme* was employed (file:///foo is handled *very* - // differently than http:///foo), so unfortunately we have to - // defer to the schemes to do the right thing. - $result = ''; - if (!is_null($this->scheme)) { - $result .= $this->scheme . ':'; - } - if (!is_null($authority)) { - $result .= '//' . $authority; - } - $result .= $this->path; - if (!is_null($this->query)) { - $result .= '?' . $this->query; - } - if (!is_null($this->fragment)) { - $result .= '#' . $this->fragment; - } - - return $result; - } - - /** - * Returns true if this URL might be considered a 'local' URL given - * the current context. This is true when the host is null, or - * when it matches the host supplied to the configuration. - * - * Note that this does not do any scheme checking, so it is mostly - * only appropriate for metadata that doesn't care about protocol - * security. isBenign is probably what you actually want. - * @param HTMLPurifier_Config $config - * @param HTMLPurifier_Context $context - * @return bool - */ - public function isLocal($config, $context) - { - if ($this->host === null) { - return true; - } - $uri_def = $config->getDefinition('URI'); - if ($uri_def->host === $this->host) { - return true; - } - return false; - } - - /** - * Returns true if this URL should be considered a 'benign' URL, - * that is: - * - * - It is a local URL (isLocal), and - * - It has a equal or better level of security - * @param HTMLPurifier_Config $config - * @param HTMLPurifier_Context $context - * @return bool - */ - public function isBenign($config, $context) - { - if (!$this->isLocal($config, $context)) { - return false; - } - - $scheme_obj = $this->getSchemeObj($config, $context); - if (!$scheme_obj) { - return false; - } // conservative approach - - $current_scheme_obj = $config->getDefinition('URI')->getDefaultScheme($config, $context); - if ($current_scheme_obj->secure) { - if (!$scheme_obj->secure) { - return false; - } - } - return true; - } -} - -// vim: et sw=4 sts=4 +scheme = is_null($scheme) || ctype_lower($scheme) ? $scheme : strtolower($scheme); + $this->userinfo = $userinfo; + $this->host = $host; + $this->port = is_null($port) ? $port : (int)$port; + $this->path = $path; + $this->query = $query; + $this->fragment = $fragment; + } + + /** + * Retrieves a scheme object corresponding to the URI's scheme/default + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return HTMLPurifier_URIScheme Scheme object appropriate for validating this URI + */ + public function getSchemeObj($config, $context) + { + $registry = HTMLPurifier_URISchemeRegistry::instance(); + if ($this->scheme !== null) { + $scheme_obj = $registry->getScheme($this->scheme, $config, $context); + if (!$scheme_obj) { + return false; + } // invalid scheme, clean it out + } else { + // no scheme: retrieve the default one + $def = $config->getDefinition('URI'); + $scheme_obj = $def->getDefaultScheme($config, $context); + if (!$scheme_obj) { + // something funky happened to the default scheme object + trigger_error( + 'Default scheme object "' . $def->defaultScheme . '" was not readable', + E_USER_WARNING + ); + return false; + } + } + return $scheme_obj; + } + + /** + * Generic validation method applicable for all schemes. May modify + * this URI in order to get it into a compliant form. + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool True if validation/filtering succeeds, false if failure + */ + public function validate($config, $context) + { + // ABNF definitions from RFC 3986 + $chars_sub_delims = '!$&\'()*+,;='; + $chars_gen_delims = ':/?#[]@'; + $chars_pchar = $chars_sub_delims . ':@'; + + // validate host + if (!is_null($this->host)) { + $host_def = new HTMLPurifier_AttrDef_URI_Host(); + $this->host = $host_def->validate($this->host, $config, $context); + if ($this->host === false) { + $this->host = null; + } + } + + // validate scheme + // NOTE: It's not appropriate to check whether or not this + // scheme is in our registry, since a URIFilter may convert a + // URI that we don't allow into one we do. So instead, we just + // check if the scheme can be dropped because there is no host + // and it is our default scheme. + if (!is_null($this->scheme) && is_null($this->host) || $this->host === '') { + // support for relative paths is pretty abysmal when the + // scheme is present, so axe it when possible + $def = $config->getDefinition('URI'); + if ($def->defaultScheme === $this->scheme) { + $this->scheme = null; + } + } + + // validate username + if (!is_null($this->userinfo)) { + $encoder = new HTMLPurifier_PercentEncoder($chars_sub_delims . ':'); + $this->userinfo = $encoder->encode($this->userinfo); + } + + // validate port + if (!is_null($this->port)) { + if ($this->port < 1 || $this->port > 65535) { + $this->port = null; + } + } + + // validate path + $segments_encoder = new HTMLPurifier_PercentEncoder($chars_pchar . '/'); + if (!is_null($this->host)) { // this catches $this->host === '' + // path-abempty (hier and relative) + // http://www.example.com/my/path + // //www.example.com/my/path (looks odd, but works, and + // recognized by most browsers) + // (this set is valid or invalid on a scheme by scheme + // basis, so we'll deal with it later) + // file:///my/path + // ///my/path + $this->path = $segments_encoder->encode($this->path); + } elseif ($this->path !== '') { + if ($this->path[0] === '/') { + // path-absolute (hier and relative) + // http:/my/path + // /my/path + if (strlen($this->path) >= 2 && $this->path[1] === '/') { + // This could happen if both the host gets stripped + // out + // http://my/path + // //my/path + $this->path = ''; + } else { + $this->path = $segments_encoder->encode($this->path); + } + } elseif (!is_null($this->scheme)) { + // path-rootless (hier) + // http:my/path + // Short circuit evaluation means we don't need to check nz + $this->path = $segments_encoder->encode($this->path); + } else { + // path-noscheme (relative) + // my/path + // (once again, not checking nz) + $segment_nc_encoder = new HTMLPurifier_PercentEncoder($chars_sub_delims . '@'); + $c = strpos($this->path, '/'); + if ($c !== false) { + $this->path = + $segment_nc_encoder->encode(substr($this->path, 0, $c)) . + $segments_encoder->encode(substr($this->path, $c)); + } else { + $this->path = $segment_nc_encoder->encode($this->path); + } + } + } else { + // path-empty (hier and relative) + $this->path = ''; // just to be safe + } + + // qf = query and fragment + $qf_encoder = new HTMLPurifier_PercentEncoder($chars_pchar . '/?'); + + if (!is_null($this->query)) { + $this->query = $qf_encoder->encode($this->query); + } + + if (!is_null($this->fragment)) { + $this->fragment = $qf_encoder->encode($this->fragment); + } + return true; + } + + /** + * Convert URI back to string + * @return string URI appropriate for output + */ + public function toString() + { + // reconstruct authority + $authority = null; + // there is a rendering difference between a null authority + // (http:foo-bar) and an empty string authority + // (http:///foo-bar). + if (!is_null($this->host)) { + $authority = ''; + if (!is_null($this->userinfo)) { + $authority .= $this->userinfo . '@'; + } + $authority .= $this->host; + if (!is_null($this->port)) { + $authority .= ':' . $this->port; + } + } + + // Reconstruct the result + // One might wonder about parsing quirks from browsers after + // this reconstruction. Unfortunately, parsing behavior depends + // on what *scheme* was employed (file:///foo is handled *very* + // differently than http:///foo), so unfortunately we have to + // defer to the schemes to do the right thing. + $result = ''; + if (!is_null($this->scheme)) { + $result .= $this->scheme . ':'; + } + if (!is_null($authority)) { + $result .= '//' . $authority; + } + $result .= $this->path; + if (!is_null($this->query)) { + $result .= '?' . $this->query; + } + if (!is_null($this->fragment)) { + $result .= '#' . $this->fragment; + } + + return $result; + } + + /** + * Returns true if this URL might be considered a 'local' URL given + * the current context. This is true when the host is null, or + * when it matches the host supplied to the configuration. + * + * Note that this does not do any scheme checking, so it is mostly + * only appropriate for metadata that doesn't care about protocol + * security. isBenign is probably what you actually want. + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool + */ + public function isLocal($config, $context) + { + if ($this->host === null) { + return true; + } + $uri_def = $config->getDefinition('URI'); + if ($uri_def->host === $this->host) { + return true; + } + return false; + } + + /** + * Returns true if this URL should be considered a 'benign' URL, + * that is: + * + * - It is a local URL (isLocal), and + * - It has a equal or better level of security + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool + */ + public function isBenign($config, $context) + { + if (!$this->isLocal($config, $context)) { + return false; + } + + $scheme_obj = $this->getSchemeObj($config, $context); + if (!$scheme_obj) { + return false; + } // conservative approach + + $current_scheme_obj = $config->getDefinition('URI')->getDefaultScheme($config, $context); + if ($current_scheme_obj->secure) { + if (!$scheme_obj->secure) { + return false; + } + } + return true; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/URIDefinition.php b/thirdparty/HTMLPurifier/HTMLPurifier/URIDefinition.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/URIDefinition.php rename to thirdparty/HTMLPurifier/HTMLPurifier/URIDefinition.php index dbc2a752e..e0bd8bcca 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/URIDefinition.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/URIDefinition.php @@ -1,112 +1,112 @@ -registerFilter(new HTMLPurifier_URIFilter_DisableExternal()); - $this->registerFilter(new HTMLPurifier_URIFilter_DisableExternalResources()); - $this->registerFilter(new HTMLPurifier_URIFilter_DisableResources()); - $this->registerFilter(new HTMLPurifier_URIFilter_HostBlacklist()); - $this->registerFilter(new HTMLPurifier_URIFilter_SafeIframe()); - $this->registerFilter(new HTMLPurifier_URIFilter_MakeAbsolute()); - $this->registerFilter(new HTMLPurifier_URIFilter_Munge()); - } - - public function registerFilter($filter) - { - $this->registeredFilters[$filter->name] = $filter; - } - - public function addFilter($filter, $config) - { - $r = $filter->prepare($config); - if ($r === false) return; // null is ok, for backwards compat - if ($filter->post) { - $this->postFilters[$filter->name] = $filter; - } else { - $this->filters[$filter->name] = $filter; - } - } - - protected function doSetup($config) - { - $this->setupMemberVariables($config); - $this->setupFilters($config); - } - - protected function setupFilters($config) - { - foreach ($this->registeredFilters as $name => $filter) { - if ($filter->always_load) { - $this->addFilter($filter, $config); - } else { - $conf = $config->get('URI.' . $name); - if ($conf !== false && $conf !== null) { - $this->addFilter($filter, $config); - } - } - } - unset($this->registeredFilters); - } - - protected function setupMemberVariables($config) - { - $this->host = $config->get('URI.Host'); - $base_uri = $config->get('URI.Base'); - if (!is_null($base_uri)) { - $parser = new HTMLPurifier_URIParser(); - $this->base = $parser->parse($base_uri); - $this->defaultScheme = $this->base->scheme; - if (is_null($this->host)) $this->host = $this->base->host; - } - if (is_null($this->defaultScheme)) $this->defaultScheme = $config->get('URI.DefaultScheme'); - } - - public function getDefaultScheme($config, $context) - { - return HTMLPurifier_URISchemeRegistry::instance()->getScheme($this->defaultScheme, $config, $context); - } - - public function filter(&$uri, $config, $context) - { - foreach ($this->filters as $name => $f) { - $result = $f->filter($uri, $config, $context); - if (!$result) return false; - } - return true; - } - - public function postFilter(&$uri, $config, $context) - { - foreach ($this->postFilters as $name => $f) { - $result = $f->filter($uri, $config, $context); - if (!$result) return false; - } - return true; - } - -} - -// vim: et sw=4 sts=4 +registerFilter(new HTMLPurifier_URIFilter_DisableExternal()); + $this->registerFilter(new HTMLPurifier_URIFilter_DisableExternalResources()); + $this->registerFilter(new HTMLPurifier_URIFilter_DisableResources()); + $this->registerFilter(new HTMLPurifier_URIFilter_HostBlacklist()); + $this->registerFilter(new HTMLPurifier_URIFilter_SafeIframe()); + $this->registerFilter(new HTMLPurifier_URIFilter_MakeAbsolute()); + $this->registerFilter(new HTMLPurifier_URIFilter_Munge()); + } + + public function registerFilter($filter) + { + $this->registeredFilters[$filter->name] = $filter; + } + + public function addFilter($filter, $config) + { + $r = $filter->prepare($config); + if ($r === false) return; // null is ok, for backwards compat + if ($filter->post) { + $this->postFilters[$filter->name] = $filter; + } else { + $this->filters[$filter->name] = $filter; + } + } + + protected function doSetup($config) + { + $this->setupMemberVariables($config); + $this->setupFilters($config); + } + + protected function setupFilters($config) + { + foreach ($this->registeredFilters as $name => $filter) { + if ($filter->always_load) { + $this->addFilter($filter, $config); + } else { + $conf = $config->get('URI.' . $name); + if ($conf !== false && $conf !== null) { + $this->addFilter($filter, $config); + } + } + } + unset($this->registeredFilters); + } + + protected function setupMemberVariables($config) + { + $this->host = $config->get('URI.Host'); + $base_uri = $config->get('URI.Base'); + if (!is_null($base_uri)) { + $parser = new HTMLPurifier_URIParser(); + $this->base = $parser->parse($base_uri); + $this->defaultScheme = $this->base->scheme; + if (is_null($this->host)) $this->host = $this->base->host; + } + if (is_null($this->defaultScheme)) $this->defaultScheme = $config->get('URI.DefaultScheme'); + } + + public function getDefaultScheme($config, $context) + { + return HTMLPurifier_URISchemeRegistry::instance()->getScheme($this->defaultScheme, $config, $context); + } + + public function filter(&$uri, $config, $context) + { + foreach ($this->filters as $name => $f) { + $result = $f->filter($uri, $config, $context); + if (!$result) return false; + } + return true; + } + + public function postFilter(&$uri, $config, $context) + { + foreach ($this->postFilters as $name => $f) { + $result = $f->filter($uri, $config, $context); + if (!$result) return false; + } + return true; + } + +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/URIFilter.php b/thirdparty/HTMLPurifier/HTMLPurifier/URIFilter.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/URIFilter.php rename to thirdparty/HTMLPurifier/HTMLPurifier/URIFilter.php index 0333ea341..09724e9f4 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/URIFilter.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/URIFilter.php @@ -1,74 +1,74 @@ -getDefinition('URI')->host; - if ($our_host !== null) { - $this->ourHostParts = array_reverse(explode('.', $our_host)); - } - } - - /** - * @param HTMLPurifier_URI $uri Reference - * @param HTMLPurifier_Config $config - * @param HTMLPurifier_Context $context - * @return bool - */ - public function filter(&$uri, $config, $context) - { - if (is_null($uri->host)) { - return true; - } - if ($this->ourHostParts === false) { - return false; - } - $host_parts = array_reverse(explode('.', $uri->host)); - foreach ($this->ourHostParts as $i => $x) { - if (!isset($host_parts[$i])) { - return false; - } - if ($host_parts[$i] != $this->ourHostParts[$i]) { - return false; - } - } - return true; - } -} - -// vim: et sw=4 sts=4 +getDefinition('URI')->host; + if ($our_host !== null) { + $this->ourHostParts = array_reverse(explode('.', $our_host)); + } + } + + /** + * @param HTMLPurifier_URI $uri Reference + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool + */ + public function filter(&$uri, $config, $context) + { + if (is_null($uri->host)) { + return true; + } + if ($this->ourHostParts === false) { + return false; + } + $host_parts = array_reverse(explode('.', $uri->host)); + foreach ($this->ourHostParts as $i => $x) { + if (!isset($host_parts[$i])) { + return false; + } + if ($host_parts[$i] != $this->ourHostParts[$i]) { + return false; + } + } + return true; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/URIFilter/DisableExternalResources.php b/thirdparty/HTMLPurifier/HTMLPurifier/URIFilter/DisableExternalResources.php similarity index 95% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/URIFilter/DisableExternalResources.php rename to thirdparty/HTMLPurifier/HTMLPurifier/URIFilter/DisableExternalResources.php index 22697d71e..c6562169e 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/URIFilter/DisableExternalResources.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/URIFilter/DisableExternalResources.php @@ -1,25 +1,25 @@ -get('EmbeddedURI', true)) { - return true; - } - return parent::filter($uri, $config, $context); - } -} - -// vim: et sw=4 sts=4 +get('EmbeddedURI', true)) { + return true; + } + return parent::filter($uri, $config, $context); + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/URIFilter/DisableResources.php b/thirdparty/HTMLPurifier/HTMLPurifier/URIFilter/DisableResources.php similarity index 95% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/URIFilter/DisableResources.php rename to thirdparty/HTMLPurifier/HTMLPurifier/URIFilter/DisableResources.php index bdae95529..d5c412c44 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/URIFilter/DisableResources.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/URIFilter/DisableResources.php @@ -1,22 +1,22 @@ -get('EmbeddedURI', true); - } -} - -// vim: et sw=4 sts=4 +get('EmbeddedURI', true); + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/URIFilter/HostBlacklist.php b/thirdparty/HTMLPurifier/HTMLPurifier/URIFilter/HostBlacklist.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/URIFilter/HostBlacklist.php rename to thirdparty/HTMLPurifier/HTMLPurifier/URIFilter/HostBlacklist.php index 54980b6eb..a6645c17e 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/URIFilter/HostBlacklist.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/URIFilter/HostBlacklist.php @@ -1,46 +1,46 @@ -blacklist = $config->get('URI.HostBlacklist'); - return true; - } - - /** - * @param HTMLPurifier_URI $uri - * @param HTMLPurifier_Config $config - * @param HTMLPurifier_Context $context - * @return bool - */ - public function filter(&$uri, $config, $context) - { - foreach ($this->blacklist as $blacklisted_host_fragment) { - if (strpos($uri->host, $blacklisted_host_fragment) !== false) { - return false; - } - } - return true; - } -} - -// vim: et sw=4 sts=4 +blacklist = $config->get('URI.HostBlacklist'); + return true; + } + + /** + * @param HTMLPurifier_URI $uri + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool + */ + public function filter(&$uri, $config, $context) + { + foreach ($this->blacklist as $blacklisted_host_fragment) { + if (strpos($uri->host, $blacklisted_host_fragment) !== false) { + return false; + } + } + return true; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/URIFilter/MakeAbsolute.php b/thirdparty/HTMLPurifier/HTMLPurifier/URIFilter/MakeAbsolute.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/URIFilter/MakeAbsolute.php rename to thirdparty/HTMLPurifier/HTMLPurifier/URIFilter/MakeAbsolute.php index c873bce96..c507bbff8 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/URIFilter/MakeAbsolute.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/URIFilter/MakeAbsolute.php @@ -1,158 +1,158 @@ -getDefinition('URI'); - $this->base = $def->base; - if (is_null($this->base)) { - trigger_error( - 'URI.MakeAbsolute is being ignored due to lack of ' . - 'value for URI.Base configuration', - E_USER_WARNING - ); - return false; - } - $this->base->fragment = null; // fragment is invalid for base URI - $stack = explode('/', $this->base->path); - array_pop($stack); // discard last segment - $stack = $this->_collapseStack($stack); // do pre-parsing - $this->basePathStack = $stack; - return true; - } - - /** - * @param HTMLPurifier_URI $uri - * @param HTMLPurifier_Config $config - * @param HTMLPurifier_Context $context - * @return bool - */ - public function filter(&$uri, $config, $context) - { - if (is_null($this->base)) { - return true; - } // abort early - if ($uri->path === '' && is_null($uri->scheme) && - is_null($uri->host) && is_null($uri->query) && is_null($uri->fragment)) { - // reference to current document - $uri = clone $this->base; - return true; - } - if (!is_null($uri->scheme)) { - // absolute URI already: don't change - if (!is_null($uri->host)) { - return true; - } - $scheme_obj = $uri->getSchemeObj($config, $context); - if (!$scheme_obj) { - // scheme not recognized - return false; - } - if (!$scheme_obj->hierarchical) { - // non-hierarchal URI with explicit scheme, don't change - return true; - } - // special case: had a scheme but always is hierarchical and had no authority - } - if (!is_null($uri->host)) { - // network path, don't bother - return true; - } - if ($uri->path === '') { - $uri->path = $this->base->path; - } elseif ($uri->path[0] !== '/') { - // relative path, needs more complicated processing - $stack = explode('/', $uri->path); - $new_stack = array_merge($this->basePathStack, $stack); - if ($new_stack[0] !== '' && !is_null($this->base->host)) { - array_unshift($new_stack, ''); - } - $new_stack = $this->_collapseStack($new_stack); - $uri->path = implode('/', $new_stack); - } else { - // absolute path, but still we should collapse - $uri->path = implode('/', $this->_collapseStack(explode('/', $uri->path))); - } - // re-combine - $uri->scheme = $this->base->scheme; - if (is_null($uri->userinfo)) { - $uri->userinfo = $this->base->userinfo; - } - if (is_null($uri->host)) { - $uri->host = $this->base->host; - } - if (is_null($uri->port)) { - $uri->port = $this->base->port; - } - return true; - } - - /** - * Resolve dots and double-dots in a path stack - * @param array $stack - * @return array - */ - private function _collapseStack($stack) - { - $result = array(); - $is_folder = false; - for ($i = 0; isset($stack[$i]); $i++) { - $is_folder = false; - // absorb an internally duplicated slash - if ($stack[$i] == '' && $i && isset($stack[$i + 1])) { - continue; - } - if ($stack[$i] == '..') { - if (!empty($result)) { - $segment = array_pop($result); - if ($segment === '' && empty($result)) { - // error case: attempted to back out too far: - // restore the leading slash - $result[] = ''; - } elseif ($segment === '..') { - $result[] = '..'; // cannot remove .. with .. - } - } else { - // relative path, preserve the double-dots - $result[] = '..'; - } - $is_folder = true; - continue; - } - if ($stack[$i] == '.') { - // silently absorb - $is_folder = true; - continue; - } - $result[] = $stack[$i]; - } - if ($is_folder) { - $result[] = ''; - } - return $result; - } -} - -// vim: et sw=4 sts=4 +getDefinition('URI'); + $this->base = $def->base; + if (is_null($this->base)) { + trigger_error( + 'URI.MakeAbsolute is being ignored due to lack of ' . + 'value for URI.Base configuration', + E_USER_WARNING + ); + return false; + } + $this->base->fragment = null; // fragment is invalid for base URI + $stack = explode('/', $this->base->path); + array_pop($stack); // discard last segment + $stack = $this->_collapseStack($stack); // do pre-parsing + $this->basePathStack = $stack; + return true; + } + + /** + * @param HTMLPurifier_URI $uri + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool + */ + public function filter(&$uri, $config, $context) + { + if (is_null($this->base)) { + return true; + } // abort early + if ($uri->path === '' && is_null($uri->scheme) && + is_null($uri->host) && is_null($uri->query) && is_null($uri->fragment)) { + // reference to current document + $uri = clone $this->base; + return true; + } + if (!is_null($uri->scheme)) { + // absolute URI already: don't change + if (!is_null($uri->host)) { + return true; + } + $scheme_obj = $uri->getSchemeObj($config, $context); + if (!$scheme_obj) { + // scheme not recognized + return false; + } + if (!$scheme_obj->hierarchical) { + // non-hierarchal URI with explicit scheme, don't change + return true; + } + // special case: had a scheme but always is hierarchical and had no authority + } + if (!is_null($uri->host)) { + // network path, don't bother + return true; + } + if ($uri->path === '') { + $uri->path = $this->base->path; + } elseif ($uri->path[0] !== '/') { + // relative path, needs more complicated processing + $stack = explode('/', $uri->path); + $new_stack = array_merge($this->basePathStack, $stack); + if ($new_stack[0] !== '' && !is_null($this->base->host)) { + array_unshift($new_stack, ''); + } + $new_stack = $this->_collapseStack($new_stack); + $uri->path = implode('/', $new_stack); + } else { + // absolute path, but still we should collapse + $uri->path = implode('/', $this->_collapseStack(explode('/', $uri->path))); + } + // re-combine + $uri->scheme = $this->base->scheme; + if (is_null($uri->userinfo)) { + $uri->userinfo = $this->base->userinfo; + } + if (is_null($uri->host)) { + $uri->host = $this->base->host; + } + if (is_null($uri->port)) { + $uri->port = $this->base->port; + } + return true; + } + + /** + * Resolve dots and double-dots in a path stack + * @param array $stack + * @return array + */ + private function _collapseStack($stack) + { + $result = array(); + $is_folder = false; + for ($i = 0; isset($stack[$i]); $i++) { + $is_folder = false; + // absorb an internally duplicated slash + if ($stack[$i] == '' && $i && isset($stack[$i + 1])) { + continue; + } + if ($stack[$i] == '..') { + if (!empty($result)) { + $segment = array_pop($result); + if ($segment === '' && empty($result)) { + // error case: attempted to back out too far: + // restore the leading slash + $result[] = ''; + } elseif ($segment === '..') { + $result[] = '..'; // cannot remove .. with .. + } + } else { + // relative path, preserve the double-dots + $result[] = '..'; + } + $is_folder = true; + continue; + } + if ($stack[$i] == '.') { + // silently absorb + $is_folder = true; + continue; + } + $result[] = $stack[$i]; + } + if ($is_folder) { + $result[] = ''; + } + return $result; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/URIFilter/Munge.php b/thirdparty/HTMLPurifier/HTMLPurifier/URIFilter/Munge.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/URIFilter/Munge.php rename to thirdparty/HTMLPurifier/HTMLPurifier/URIFilter/Munge.php index 4b4f0cf72..6e03315a1 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/URIFilter/Munge.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/URIFilter/Munge.php @@ -1,115 +1,115 @@ -target = $config->get('URI.' . $this->name); - $this->parser = new HTMLPurifier_URIParser(); - $this->doEmbed = $config->get('URI.MungeResources'); - $this->secretKey = $config->get('URI.MungeSecretKey'); - if ($this->secretKey && !function_exists('hash_hmac')) { - throw new Exception("Cannot use %URI.MungeSecretKey without hash_hmac support."); - } - return true; - } - - /** - * @param HTMLPurifier_URI $uri - * @param HTMLPurifier_Config $config - * @param HTMLPurifier_Context $context - * @return bool - */ - public function filter(&$uri, $config, $context) - { - if ($context->get('EmbeddedURI', true) && !$this->doEmbed) { - return true; - } - - $scheme_obj = $uri->getSchemeObj($config, $context); - if (!$scheme_obj) { - return true; - } // ignore unknown schemes, maybe another postfilter did it - if (!$scheme_obj->browsable) { - return true; - } // ignore non-browseable schemes, since we can't munge those in a reasonable way - if ($uri->isBenign($config, $context)) { - return true; - } // don't redirect if a benign URL - - $this->makeReplace($uri, $config, $context); - $this->replace = array_map('rawurlencode', $this->replace); - - $new_uri = strtr($this->target, $this->replace); - $new_uri = $this->parser->parse($new_uri); - // don't redirect if the target host is the same as the - // starting host - if ($uri->host === $new_uri->host) { - return true; - } - $uri = $new_uri; // overwrite - return true; - } - - /** - * @param HTMLPurifier_URI $uri - * @param HTMLPurifier_Config $config - * @param HTMLPurifier_Context $context - */ - protected function makeReplace($uri, $config, $context) - { - $string = $uri->toString(); - // always available - $this->replace['%s'] = $string; - $this->replace['%r'] = $context->get('EmbeddedURI', true); - $token = $context->get('CurrentToken', true); - $this->replace['%n'] = $token ? $token->name : null; - $this->replace['%m'] = $context->get('CurrentAttr', true); - $this->replace['%p'] = $context->get('CurrentCSSProperty', true); - // not always available - if ($this->secretKey) { - $this->replace['%t'] = hash_hmac("sha256", $string, $this->secretKey); - } - } -} - -// vim: et sw=4 sts=4 +target = $config->get('URI.' . $this->name); + $this->parser = new HTMLPurifier_URIParser(); + $this->doEmbed = $config->get('URI.MungeResources'); + $this->secretKey = $config->get('URI.MungeSecretKey'); + if ($this->secretKey && !function_exists('hash_hmac')) { + throw new Exception("Cannot use %URI.MungeSecretKey without hash_hmac support."); + } + return true; + } + + /** + * @param HTMLPurifier_URI $uri + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool + */ + public function filter(&$uri, $config, $context) + { + if ($context->get('EmbeddedURI', true) && !$this->doEmbed) { + return true; + } + + $scheme_obj = $uri->getSchemeObj($config, $context); + if (!$scheme_obj) { + return true; + } // ignore unknown schemes, maybe another postfilter did it + if (!$scheme_obj->browsable) { + return true; + } // ignore non-browseable schemes, since we can't munge those in a reasonable way + if ($uri->isBenign($config, $context)) { + return true; + } // don't redirect if a benign URL + + $this->makeReplace($uri, $config, $context); + $this->replace = array_map('rawurlencode', $this->replace); + + $new_uri = strtr($this->target, $this->replace); + $new_uri = $this->parser->parse($new_uri); + // don't redirect if the target host is the same as the + // starting host + if ($uri->host === $new_uri->host) { + return true; + } + $uri = $new_uri; // overwrite + return true; + } + + /** + * @param HTMLPurifier_URI $uri + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + */ + protected function makeReplace($uri, $config, $context) + { + $string = $uri->toString(); + // always available + $this->replace['%s'] = $string; + $this->replace['%r'] = $context->get('EmbeddedURI', true); + $token = $context->get('CurrentToken', true); + $this->replace['%n'] = $token ? $token->name : null; + $this->replace['%m'] = $context->get('CurrentAttr', true); + $this->replace['%p'] = $context->get('CurrentCSSProperty', true); + // not always available + if ($this->secretKey) { + $this->replace['%t'] = hash_hmac("sha256", $string, $this->secretKey); + } + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/URIFilter/SafeIframe.php b/thirdparty/HTMLPurifier/HTMLPurifier/URIFilter/SafeIframe.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/URIFilter/SafeIframe.php rename to thirdparty/HTMLPurifier/HTMLPurifier/URIFilter/SafeIframe.php index 5ecb9567b..f609c47a3 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/URIFilter/SafeIframe.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/URIFilter/SafeIframe.php @@ -1,68 +1,68 @@ -regexp = $config->get('URI.SafeIframeRegexp'); - return true; - } - - /** - * @param HTMLPurifier_URI $uri - * @param HTMLPurifier_Config $config - * @param HTMLPurifier_Context $context - * @return bool - */ - public function filter(&$uri, $config, $context) - { - // check if filter not applicable - if (!$config->get('HTML.SafeIframe')) { - return true; - } - // check if the filter should actually trigger - if (!$context->get('EmbeddedURI', true)) { - return true; - } - $token = $context->get('CurrentToken', true); - if (!($token && $token->name == 'iframe')) { - return true; - } - // check if we actually have some whitelists enabled - if ($this->regexp === null) { - return false; - } - // actually check the whitelists - return preg_match($this->regexp, $uri->toString()); - } -} - -// vim: et sw=4 sts=4 +regexp = $config->get('URI.SafeIframeRegexp'); + return true; + } + + /** + * @param HTMLPurifier_URI $uri + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool + */ + public function filter(&$uri, $config, $context) + { + // check if filter not applicable + if (!$config->get('HTML.SafeIframe')) { + return true; + } + // check if the filter should actually trigger + if (!$context->get('EmbeddedURI', true)) { + return true; + } + $token = $context->get('CurrentToken', true); + if (!($token && $token->name == 'iframe')) { + return true; + } + // check if we actually have some whitelists enabled + if ($this->regexp === null) { + return false; + } + // actually check the whitelists + return preg_match($this->regexp, $uri->toString()); + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/URIParser.php b/thirdparty/HTMLPurifier/HTMLPurifier/URIParser.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/URIParser.php rename to thirdparty/HTMLPurifier/HTMLPurifier/URIParser.php index 699978dcb..0e7381a07 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/URIParser.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/URIParser.php @@ -1,71 +1,71 @@ -percentEncoder = new HTMLPurifier_PercentEncoder(); - } - - /** - * Parses a URI. - * @param $uri string URI to parse - * @return HTMLPurifier_URI representation of URI. This representation has - * not been validated yet and may not conform to RFC. - */ - public function parse($uri) - { - $uri = $this->percentEncoder->normalize($uri); - - // Regexp is as per Appendix B. - // Note that ["<>] are an addition to the RFC's recommended - // characters, because they represent external delimeters. - $r_URI = '!'. - '(([a-zA-Z0-9\.\+\-]+):)?'. // 2. Scheme - '(//([^/?#"<>]*))?'. // 4. Authority - '([^?#"<>]*)'. // 5. Path - '(\?([^#"<>]*))?'. // 7. Query - '(#([^"<>]*))?'. // 8. Fragment - '!'; - - $matches = array(); - $result = preg_match($r_URI, $uri, $matches); - - if (!$result) return false; // *really* invalid URI - - // seperate out parts - $scheme = !empty($matches[1]) ? $matches[2] : null; - $authority = !empty($matches[3]) ? $matches[4] : null; - $path = $matches[5]; // always present, can be empty - $query = !empty($matches[6]) ? $matches[7] : null; - $fragment = !empty($matches[8]) ? $matches[9] : null; - - // further parse authority - if ($authority !== null) { - $r_authority = "/^((.+?)@)?(\[[^\]]+\]|[^:]*)(:(\d*))?/"; - $matches = array(); - preg_match($r_authority, $authority, $matches); - $userinfo = !empty($matches[1]) ? $matches[2] : null; - $host = !empty($matches[3]) ? $matches[3] : ''; - $port = !empty($matches[4]) ? (int) $matches[5] : null; - } else { - $port = $host = $userinfo = null; - } - - return new HTMLPurifier_URI( - $scheme, $userinfo, $host, $port, $path, $query, $fragment); - } - -} - -// vim: et sw=4 sts=4 +percentEncoder = new HTMLPurifier_PercentEncoder(); + } + + /** + * Parses a URI. + * @param $uri string URI to parse + * @return HTMLPurifier_URI representation of URI. This representation has + * not been validated yet and may not conform to RFC. + */ + public function parse($uri) + { + $uri = $this->percentEncoder->normalize($uri); + + // Regexp is as per Appendix B. + // Note that ["<>] are an addition to the RFC's recommended + // characters, because they represent external delimeters. + $r_URI = '!'. + '(([a-zA-Z0-9\.\+\-]+):)?'. // 2. Scheme + '(//([^/?#"<>]*))?'. // 4. Authority + '([^?#"<>]*)'. // 5. Path + '(\?([^#"<>]*))?'. // 7. Query + '(#([^"<>]*))?'. // 8. Fragment + '!'; + + $matches = array(); + $result = preg_match($r_URI, $uri, $matches); + + if (!$result) return false; // *really* invalid URI + + // seperate out parts + $scheme = !empty($matches[1]) ? $matches[2] : null; + $authority = !empty($matches[3]) ? $matches[4] : null; + $path = $matches[5]; // always present, can be empty + $query = !empty($matches[6]) ? $matches[7] : null; + $fragment = !empty($matches[8]) ? $matches[9] : null; + + // further parse authority + if ($authority !== null) { + $r_authority = "/^((.+?)@)?(\[[^\]]+\]|[^:]*)(:(\d*))?/"; + $matches = array(); + preg_match($r_authority, $authority, $matches); + $userinfo = !empty($matches[1]) ? $matches[2] : null; + $host = !empty($matches[3]) ? $matches[3] : ''; + $port = !empty($matches[4]) ? (int) $matches[5] : null; + } else { + $port = $host = $userinfo = null; + } + + return new HTMLPurifier_URI( + $scheme, $userinfo, $host, $port, $path, $query, $fragment); + } + +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/URIScheme.php b/thirdparty/HTMLPurifier/HTMLPurifier/URIScheme.php similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/URIScheme.php rename to thirdparty/HTMLPurifier/HTMLPurifier/URIScheme.php index 03602abe6..fe9e82cf2 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/URIScheme.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/URIScheme.php @@ -1,102 +1,102 @@ -, resolves edge cases - * with making relative URIs absolute - * @type bool - */ - public $hierarchical = false; - - /** - * Whether or not the URI may omit a hostname when the scheme is - * explicitly specified, ala file:///path/to/file. As of writing, - * 'file' is the only scheme that browsers support his properly. - * @type bool - */ - public $may_omit_host = false; - - /** - * Validates the components of a URI for a specific scheme. - * @param HTMLPurifier_URI $uri Reference to a HTMLPurifier_URI object - * @param HTMLPurifier_Config $config - * @param HTMLPurifier_Context $context - * @return bool success or failure - */ - abstract public function doValidate(&$uri, $config, $context); - - /** - * Public interface for validating components of a URI. Performs a - * bunch of default actions. Don't overload this method. - * @param HTMLPurifier_URI $uri Reference to a HTMLPurifier_URI object - * @param HTMLPurifier_Config $config - * @param HTMLPurifier_Context $context - * @return bool success or failure - */ - public function validate(&$uri, $config, $context) - { - if ($this->default_port == $uri->port) { - $uri->port = null; - } - // kludge: browsers do funny things when the scheme but not the - // authority is set - if (!$this->may_omit_host && - // if the scheme is present, a missing host is always in error - (!is_null($uri->scheme) && ($uri->host === '' || is_null($uri->host))) || - // if the scheme is not present, a *blank* host is in error, - // since this translates into '///path' which most browsers - // interpret as being 'http://path'. - (is_null($uri->scheme) && $uri->host === '') - ) { - do { - if (is_null($uri->scheme)) { - if (substr($uri->path, 0, 2) != '//') { - $uri->host = null; - break; - } - // URI is '////path', so we cannot nullify the - // host to preserve semantics. Try expanding the - // hostname instead (fall through) - } - // first see if we can manually insert a hostname - $host = $config->get('URI.Host'); - if (!is_null($host)) { - $uri->host = $host; - } else { - // we can't do anything sensible, reject the URL. - return false; - } - } while (false); - } - return $this->doValidate($uri, $config, $context); - } -} - -// vim: et sw=4 sts=4 +, resolves edge cases + * with making relative URIs absolute + * @type bool + */ + public $hierarchical = false; + + /** + * Whether or not the URI may omit a hostname when the scheme is + * explicitly specified, ala file:///path/to/file. As of writing, + * 'file' is the only scheme that browsers support his properly. + * @type bool + */ + public $may_omit_host = false; + + /** + * Validates the components of a URI for a specific scheme. + * @param HTMLPurifier_URI $uri Reference to a HTMLPurifier_URI object + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool success or failure + */ + abstract public function doValidate(&$uri, $config, $context); + + /** + * Public interface for validating components of a URI. Performs a + * bunch of default actions. Don't overload this method. + * @param HTMLPurifier_URI $uri Reference to a HTMLPurifier_URI object + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool success or failure + */ + public function validate(&$uri, $config, $context) + { + if ($this->default_port == $uri->port) { + $uri->port = null; + } + // kludge: browsers do funny things when the scheme but not the + // authority is set + if (!$this->may_omit_host && + // if the scheme is present, a missing host is always in error + (!is_null($uri->scheme) && ($uri->host === '' || is_null($uri->host))) || + // if the scheme is not present, a *blank* host is in error, + // since this translates into '///path' which most browsers + // interpret as being 'http://path'. + (is_null($uri->scheme) && $uri->host === '') + ) { + do { + if (is_null($uri->scheme)) { + if (substr($uri->path, 0, 2) != '//') { + $uri->host = null; + break; + } + // URI is '////path', so we cannot nullify the + // host to preserve semantics. Try expanding the + // hostname instead (fall through) + } + // first see if we can manually insert a hostname + $host = $config->get('URI.Host'); + if (!is_null($host)) { + $uri->host = $host; + } else { + // we can't do anything sensible, reject the URL. + return false; + } + } while (false); + } + return $this->doValidate($uri, $config, $context); + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/URIScheme/data.php b/thirdparty/HTMLPurifier/HTMLPurifier/URIScheme/data.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/URIScheme/data.php rename to thirdparty/HTMLPurifier/HTMLPurifier/URIScheme/data.php index 3bd93a8f7..6ebca4984 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/URIScheme/data.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/URIScheme/data.php @@ -1,127 +1,127 @@ - true, - 'image/gif' => true, - 'image/png' => true, - ); - // this is actually irrelevant since we only write out the path - // component - /** - * @type bool - */ - public $may_omit_host = true; - - /** - * @param HTMLPurifier_URI $uri - * @param HTMLPurifier_Config $config - * @param HTMLPurifier_Context $context - * @return bool - */ - public function doValidate(&$uri, $config, $context) - { - $result = explode(',', $uri->path, 2); - $is_base64 = false; - $charset = null; - $content_type = null; - if (count($result) == 2) { - list($metadata, $data) = $result; - // do some legwork on the metadata - $metas = explode(';', $metadata); - while (!empty($metas)) { - $cur = array_shift($metas); - if ($cur == 'base64') { - $is_base64 = true; - break; - } - if (substr($cur, 0, 8) == 'charset=') { - // doesn't match if there are arbitrary spaces, but - // whatever dude - if ($charset !== null) { - continue; - } // garbage - $charset = substr($cur, 8); // not used - } else { - if ($content_type !== null) { - continue; - } // garbage - $content_type = $cur; - } - } - } else { - $data = $result[0]; - } - if ($content_type !== null && empty($this->allowed_types[$content_type])) { - return false; - } - if ($charset !== null) { - // error; we don't allow plaintext stuff - $charset = null; - } - $data = rawurldecode($data); - if ($is_base64) { - $raw_data = base64_decode($data); - } else { - $raw_data = $data; - } - // XXX probably want to refactor this into a general mechanism - // for filtering arbitrary content types - $file = tempnam("/tmp", ""); - file_put_contents($file, $raw_data); - if (function_exists('exif_imagetype')) { - $image_code = exif_imagetype($file); - unlink($file); - } elseif (function_exists('getimagesize')) { - set_error_handler(array($this, 'muteErrorHandler')); - $info = getimagesize($file); - restore_error_handler(); - unlink($file); - if ($info == false) { - return false; - } - $image_code = $info[2]; - } else { - trigger_error("could not find exif_imagetype or getimagesize functions", E_USER_ERROR); - } - $real_content_type = image_type_to_mime_type($image_code); - if ($real_content_type != $content_type) { - // we're nice guys; if the content type is something else we - // support, change it over - if (empty($this->allowed_types[$real_content_type])) { - return false; - } - $content_type = $real_content_type; - } - // ok, it's kosher, rewrite what we need - $uri->userinfo = null; - $uri->host = null; - $uri->port = null; - $uri->fragment = null; - $uri->query = null; - $uri->path = "$content_type;base64," . base64_encode($raw_data); - return true; - } - - /** - * @param int $errno - * @param string $errstr - */ - public function muteErrorHandler($errno, $errstr) - { - } -} + true, + 'image/gif' => true, + 'image/png' => true, + ); + // this is actually irrelevant since we only write out the path + // component + /** + * @type bool + */ + public $may_omit_host = true; + + /** + * @param HTMLPurifier_URI $uri + * @param HTMLPurifier_Config $config + * @param HTMLPurifier_Context $context + * @return bool + */ + public function doValidate(&$uri, $config, $context) + { + $result = explode(',', $uri->path, 2); + $is_base64 = false; + $charset = null; + $content_type = null; + if (count($result) == 2) { + list($metadata, $data) = $result; + // do some legwork on the metadata + $metas = explode(';', $metadata); + while (!empty($metas)) { + $cur = array_shift($metas); + if ($cur == 'base64') { + $is_base64 = true; + break; + } + if (substr($cur, 0, 8) == 'charset=') { + // doesn't match if there are arbitrary spaces, but + // whatever dude + if ($charset !== null) { + continue; + } // garbage + $charset = substr($cur, 8); // not used + } else { + if ($content_type !== null) { + continue; + } // garbage + $content_type = $cur; + } + } + } else { + $data = $result[0]; + } + if ($content_type !== null && empty($this->allowed_types[$content_type])) { + return false; + } + if ($charset !== null) { + // error; we don't allow plaintext stuff + $charset = null; + } + $data = rawurldecode($data); + if ($is_base64) { + $raw_data = base64_decode($data); + } else { + $raw_data = $data; + } + // XXX probably want to refactor this into a general mechanism + // for filtering arbitrary content types + $file = tempnam("/tmp", ""); + file_put_contents($file, $raw_data); + if (function_exists('exif_imagetype')) { + $image_code = exif_imagetype($file); + unlink($file); + } elseif (function_exists('getimagesize')) { + set_error_handler(array($this, 'muteErrorHandler')); + $info = getimagesize($file); + restore_error_handler(); + unlink($file); + if ($info == false) { + return false; + } + $image_code = $info[2]; + } else { + trigger_error("could not find exif_imagetype or getimagesize functions", E_USER_ERROR); + } + $real_content_type = image_type_to_mime_type($image_code); + if ($real_content_type != $content_type) { + // we're nice guys; if the content type is something else we + // support, change it over + if (empty($this->allowed_types[$real_content_type])) { + return false; + } + $content_type = $real_content_type; + } + // ok, it's kosher, rewrite what we need + $uri->userinfo = null; + $uri->host = null; + $uri->port = null; + $uri->fragment = null; + $uri->query = null; + $uri->path = "$content_type;base64," . base64_encode($raw_data); + return true; + } + + /** + * @param int $errno + * @param string $errstr + */ + public function muteErrorHandler($errno, $errstr) + { + } +} diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/URIScheme/file.php b/thirdparty/HTMLPurifier/HTMLPurifier/URIScheme/file.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/URIScheme/file.php rename to thirdparty/HTMLPurifier/HTMLPurifier/URIScheme/file.php index a220a6ad4..215be4ba8 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/URIScheme/file.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/URIScheme/file.php @@ -1,44 +1,44 @@ -userinfo = null; - // file:// makes no provisions for accessing the resource - $uri->port = null; - // While it seems to work on Firefox, the querystring has - // no possible effect and is thus stripped. - $uri->query = null; - return true; - } -} - -// vim: et sw=4 sts=4 +userinfo = null; + // file:// makes no provisions for accessing the resource + $uri->port = null; + // While it seems to work on Firefox, the querystring has + // no possible effect and is thus stripped. + $uri->query = null; + return true; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/URIScheme/ftp.php b/thirdparty/HTMLPurifier/HTMLPurifier/URIScheme/ftp.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/URIScheme/ftp.php rename to thirdparty/HTMLPurifier/HTMLPurifier/URIScheme/ftp.php index 8e7fb8c34..1eb43ee5c 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/URIScheme/ftp.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/URIScheme/ftp.php @@ -1,58 +1,58 @@ -query = null; - - // typecode check - $semicolon_pos = strrpos($uri->path, ';'); // reverse - if ($semicolon_pos !== false) { - $type = substr($uri->path, $semicolon_pos + 1); // no semicolon - $uri->path = substr($uri->path, 0, $semicolon_pos); - $type_ret = ''; - if (strpos($type, '=') !== false) { - // figure out whether or not the declaration is correct - list($key, $typecode) = explode('=', $type, 2); - if ($key !== 'type') { - // invalid key, tack it back on encoded - $uri->path .= '%3B' . $type; - } elseif ($typecode === 'a' || $typecode === 'i' || $typecode === 'd') { - $type_ret = ";type=$typecode"; - } - } else { - $uri->path .= '%3B' . $type; - } - $uri->path = str_replace(';', '%3B', $uri->path); - $uri->path .= $type_ret; - } - return true; - } -} - -// vim: et sw=4 sts=4 +query = null; + + // typecode check + $semicolon_pos = strrpos($uri->path, ';'); // reverse + if ($semicolon_pos !== false) { + $type = substr($uri->path, $semicolon_pos + 1); // no semicolon + $uri->path = substr($uri->path, 0, $semicolon_pos); + $type_ret = ''; + if (strpos($type, '=') !== false) { + // figure out whether or not the declaration is correct + list($key, $typecode) = explode('=', $type, 2); + if ($key !== 'type') { + // invalid key, tack it back on encoded + $uri->path .= '%3B' . $type; + } elseif ($typecode === 'a' || $typecode === 'i' || $typecode === 'd') { + $type_ret = ";type=$typecode"; + } + } else { + $uri->path .= '%3B' . $type; + } + $uri->path = str_replace(';', '%3B', $uri->path); + $uri->path .= $type_ret; + } + return true; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/URIScheme/http.php b/thirdparty/HTMLPurifier/HTMLPurifier/URIScheme/http.php similarity index 94% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/URIScheme/http.php rename to thirdparty/HTMLPurifier/HTMLPurifier/URIScheme/http.php index 63c8c928e..ce69ec438 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/URIScheme/http.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/URIScheme/http.php @@ -1,36 +1,36 @@ -userinfo = null; - return true; - } -} - -// vim: et sw=4 sts=4 +userinfo = null; + return true; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/URIScheme/https.php b/thirdparty/HTMLPurifier/HTMLPurifier/URIScheme/https.php similarity index 94% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/URIScheme/https.php rename to thirdparty/HTMLPurifier/HTMLPurifier/URIScheme/https.php index 4de39090d..0e96882db 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/URIScheme/https.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/URIScheme/https.php @@ -1,18 +1,18 @@ -userinfo = null; - $uri->host = null; - $uri->port = null; - // we need to validate path against RFC 2368's addr-spec - return true; - } -} - -// vim: et sw=4 sts=4 +userinfo = null; + $uri->host = null; + $uri->port = null; + // we need to validate path against RFC 2368's addr-spec + return true; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/URIScheme/news.php b/thirdparty/HTMLPurifier/HTMLPurifier/URIScheme/news.php similarity index 95% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/URIScheme/news.php rename to thirdparty/HTMLPurifier/HTMLPurifier/URIScheme/news.php index 22c9ebc53..7490927d6 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/URIScheme/news.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/URIScheme/news.php @@ -1,35 +1,35 @@ -userinfo = null; - $uri->host = null; - $uri->port = null; - $uri->query = null; - // typecode check needed on path - return true; - } -} - -// vim: et sw=4 sts=4 +userinfo = null; + $uri->host = null; + $uri->port = null; + $uri->query = null; + // typecode check needed on path + return true; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/URIScheme/nntp.php b/thirdparty/HTMLPurifier/HTMLPurifier/URIScheme/nntp.php similarity index 95% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/URIScheme/nntp.php rename to thirdparty/HTMLPurifier/HTMLPurifier/URIScheme/nntp.php index 803ed1381..f211d715e 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/URIScheme/nntp.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/URIScheme/nntp.php @@ -1,32 +1,32 @@ -userinfo = null; - $uri->query = null; - return true; - } -} - -// vim: et sw=4 sts=4 +userinfo = null; + $uri->query = null; + return true; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/URISchemeRegistry.php b/thirdparty/HTMLPurifier/HTMLPurifier/URISchemeRegistry.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/URISchemeRegistry.php rename to thirdparty/HTMLPurifier/HTMLPurifier/URISchemeRegistry.php index 24280638a..4ac8a0b76 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/URISchemeRegistry.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/URISchemeRegistry.php @@ -1,81 +1,81 @@ -get('URI.AllowedSchemes'); - if (!$config->get('URI.OverrideAllowedSchemes') && - !isset($allowed_schemes[$scheme]) - ) { - return; - } - - if (isset($this->schemes[$scheme])) { - return $this->schemes[$scheme]; - } - if (!isset($allowed_schemes[$scheme])) { - return; - } - - $class = 'HTMLPurifier_URIScheme_' . $scheme; - if (!class_exists($class)) { - return; - } - $this->schemes[$scheme] = new $class(); - return $this->schemes[$scheme]; - } - - /** - * Registers a custom scheme to the cache, bypassing reflection. - * @param string $scheme Scheme name - * @param HTMLPurifier_URIScheme $scheme_obj - */ - public function register($scheme, $scheme_obj) - { - $this->schemes[$scheme] = $scheme_obj; - } -} - -// vim: et sw=4 sts=4 +get('URI.AllowedSchemes'); + if (!$config->get('URI.OverrideAllowedSchemes') && + !isset($allowed_schemes[$scheme]) + ) { + return; + } + + if (isset($this->schemes[$scheme])) { + return $this->schemes[$scheme]; + } + if (!isset($allowed_schemes[$scheme])) { + return; + } + + $class = 'HTMLPurifier_URIScheme_' . $scheme; + if (!class_exists($class)) { + return; + } + $this->schemes[$scheme] = new $class(); + return $this->schemes[$scheme]; + } + + /** + * Registers a custom scheme to the cache, bypassing reflection. + * @param string $scheme Scheme name + * @param HTMLPurifier_URIScheme $scheme_obj + */ + public function register($scheme, $scheme_obj) + { + $this->schemes[$scheme] = $scheme_obj; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/UnitConverter.php b/thirdparty/HTMLPurifier/HTMLPurifier/UnitConverter.php similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/UnitConverter.php rename to thirdparty/HTMLPurifier/HTMLPurifier/UnitConverter.php index e663b3271..166f3bf30 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/UnitConverter.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/UnitConverter.php @@ -1,307 +1,307 @@ - array( - 'px' => 3, // This is as per CSS 2.1 and Firefox. Your mileage may vary - 'pt' => 4, - 'pc' => 48, - 'in' => 288, - self::METRIC => array('pt', '0.352777778', 'mm'), - ), - self::METRIC => array( - 'mm' => 1, - 'cm' => 10, - self::ENGLISH => array('mm', '2.83464567', 'pt'), - ), - ); - - /** - * Minimum bcmath precision for output. - * @type int - */ - protected $outputPrecision; - - /** - * Bcmath precision for internal calculations. - * @type int - */ - protected $internalPrecision; - - /** - * Whether or not BCMath is available. - * @type bool - */ - private $bcmath; - - public function __construct($output_precision = 4, $internal_precision = 10, $force_no_bcmath = false) - { - $this->outputPrecision = $output_precision; - $this->internalPrecision = $internal_precision; - $this->bcmath = !$force_no_bcmath && function_exists('bcmul'); - } - - /** - * Converts a length object of one unit into another unit. - * @param HTMLPurifier_Length $length - * Instance of HTMLPurifier_Length to convert. You must validate() - * it before passing it here! - * @param string $to_unit - * Unit to convert to. - * @return HTMLPurifier_Length|bool - * @note - * About precision: This conversion function pays very special - * attention to the incoming precision of values and attempts - * to maintain a number of significant figure. Results are - * fairly accurate up to nine digits. Some caveats: - * - If a number is zero-padded as a result of this significant - * figure tracking, the zeroes will be eliminated. - * - If a number contains less than four sigfigs ($outputPrecision) - * and this causes some decimals to be excluded, those - * decimals will be added on. - */ - public function convert($length, $to_unit) - { - if (!$length->isValid()) { - return false; - } - - $n = $length->getN(); - $unit = $length->getUnit(); - - if ($n === '0' || $unit === false) { - return new HTMLPurifier_Length('0', false); - } - - $state = $dest_state = false; - foreach (self::$units as $k => $x) { - if (isset($x[$unit])) { - $state = $k; - } - if (isset($x[$to_unit])) { - $dest_state = $k; - } - } - if (!$state || !$dest_state) { - return false; - } - - // Some calculations about the initial precision of the number; - // this will be useful when we need to do final rounding. - $sigfigs = $this->getSigFigs($n); - if ($sigfigs < $this->outputPrecision) { - $sigfigs = $this->outputPrecision; - } - - // BCMath's internal precision deals only with decimals. Use - // our default if the initial number has no decimals, or increase - // it by how ever many decimals, thus, the number of guard digits - // will always be greater than or equal to internalPrecision. - $log = (int)floor(log(abs($n), 10)); - $cp = ($log < 0) ? $this->internalPrecision - $log : $this->internalPrecision; // internal precision - - for ($i = 0; $i < 2; $i++) { - - // Determine what unit IN THIS SYSTEM we need to convert to - if ($dest_state === $state) { - // Simple conversion - $dest_unit = $to_unit; - } else { - // Convert to the smallest unit, pending a system shift - $dest_unit = self::$units[$state][$dest_state][0]; - } - - // Do the conversion if necessary - if ($dest_unit !== $unit) { - $factor = $this->div(self::$units[$state][$unit], self::$units[$state][$dest_unit], $cp); - $n = $this->mul($n, $factor, $cp); - $unit = $dest_unit; - } - - // Output was zero, so bail out early. Shouldn't ever happen. - if ($n === '') { - $n = '0'; - $unit = $to_unit; - break; - } - - // It was a simple conversion, so bail out - if ($dest_state === $state) { - break; - } - - if ($i !== 0) { - // Conversion failed! Apparently, the system we forwarded - // to didn't have this unit. This should never happen! - return false; - } - - // Pre-condition: $i == 0 - - // Perform conversion to next system of units - $n = $this->mul($n, self::$units[$state][$dest_state][1], $cp); - $unit = self::$units[$state][$dest_state][2]; - $state = $dest_state; - - // One more loop around to convert the unit in the new system. - - } - - // Post-condition: $unit == $to_unit - if ($unit !== $to_unit) { - return false; - } - - // Useful for debugging: - //echo "
              n";
              -        //echo "$n\nsigfigs = $sigfigs\nnew_log = $new_log\nlog = $log\nrp = $rp\n
              \n"; - - $n = $this->round($n, $sigfigs); - if (strpos($n, '.') !== false) { - $n = rtrim($n, '0'); - } - $n = rtrim($n, '.'); - - return new HTMLPurifier_Length($n, $unit); - } - - /** - * Returns the number of significant figures in a string number. - * @param string $n Decimal number - * @return int number of sigfigs - */ - public function getSigFigs($n) - { - $n = ltrim($n, '0+-'); - $dp = strpos($n, '.'); // decimal position - if ($dp === false) { - $sigfigs = strlen(rtrim($n, '0')); - } else { - $sigfigs = strlen(ltrim($n, '0.')); // eliminate extra decimal character - if ($dp !== 0) { - $sigfigs--; - } - } - return $sigfigs; - } - - /** - * Adds two numbers, using arbitrary precision when available. - * @param string $s1 - * @param string $s2 - * @param int $scale - * @return string - */ - private function add($s1, $s2, $scale) - { - if ($this->bcmath) { - return bcadd($s1, $s2, $scale); - } else { - return $this->scale((float)$s1 + (float)$s2, $scale); - } - } - - /** - * Multiples two numbers, using arbitrary precision when available. - * @param string $s1 - * @param string $s2 - * @param int $scale - * @return string - */ - private function mul($s1, $s2, $scale) - { - if ($this->bcmath) { - return bcmul($s1, $s2, $scale); - } else { - return $this->scale((float)$s1 * (float)$s2, $scale); - } - } - - /** - * Divides two numbers, using arbitrary precision when available. - * @param string $s1 - * @param string $s2 - * @param int $scale - * @return string - */ - private function div($s1, $s2, $scale) - { - if ($this->bcmath) { - return bcdiv($s1, $s2, $scale); - } else { - return $this->scale((float)$s1 / (float)$s2, $scale); - } - } - - /** - * Rounds a number according to the number of sigfigs it should have, - * using arbitrary precision when available. - * @param float $n - * @param int $sigfigs - * @return string - */ - private function round($n, $sigfigs) - { - $new_log = (int)floor(log(abs($n), 10)); // Number of digits left of decimal - 1 - $rp = $sigfigs - $new_log - 1; // Number of decimal places needed - $neg = $n < 0 ? '-' : ''; // Negative sign - if ($this->bcmath) { - if ($rp >= 0) { - $n = bcadd($n, $neg . '0.' . str_repeat('0', $rp) . '5', $rp + 1); - $n = bcdiv($n, '1', $rp); - } else { - // This algorithm partially depends on the standardized - // form of numbers that comes out of bcmath. - $n = bcadd($n, $neg . '5' . str_repeat('0', $new_log - $sigfigs), 0); - $n = substr($n, 0, $sigfigs + strlen($neg)) . str_repeat('0', $new_log - $sigfigs + 1); - } - return $n; - } else { - return $this->scale(round($n, $sigfigs - $new_log - 1), $rp + 1); - } - } - - /** - * Scales a float to $scale digits right of decimal point, like BCMath. - * @param float $r - * @param int $scale - * @return string - */ - private function scale($r, $scale) - { - if ($scale < 0) { - // The f sprintf type doesn't support negative numbers, so we - // need to cludge things manually. First get the string. - $r = sprintf('%.0f', (float)$r); - // Due to floating point precision loss, $r will more than likely - // look something like 4652999999999.9234. We grab one more digit - // than we need to precise from $r and then use that to round - // appropriately. - $precise = (string)round(substr($r, 0, strlen($r) + $scale), -1); - // Now we return it, truncating the zero that was rounded off. - return substr($precise, 0, -1) . str_repeat('0', -$scale + 1); - } - return sprintf('%.' . $scale . 'f', (float)$r); - } -} - -// vim: et sw=4 sts=4 + array( + 'px' => 3, // This is as per CSS 2.1 and Firefox. Your mileage may vary + 'pt' => 4, + 'pc' => 48, + 'in' => 288, + self::METRIC => array('pt', '0.352777778', 'mm'), + ), + self::METRIC => array( + 'mm' => 1, + 'cm' => 10, + self::ENGLISH => array('mm', '2.83464567', 'pt'), + ), + ); + + /** + * Minimum bcmath precision for output. + * @type int + */ + protected $outputPrecision; + + /** + * Bcmath precision for internal calculations. + * @type int + */ + protected $internalPrecision; + + /** + * Whether or not BCMath is available. + * @type bool + */ + private $bcmath; + + public function __construct($output_precision = 4, $internal_precision = 10, $force_no_bcmath = false) + { + $this->outputPrecision = $output_precision; + $this->internalPrecision = $internal_precision; + $this->bcmath = !$force_no_bcmath && function_exists('bcmul'); + } + + /** + * Converts a length object of one unit into another unit. + * @param HTMLPurifier_Length $length + * Instance of HTMLPurifier_Length to convert. You must validate() + * it before passing it here! + * @param string $to_unit + * Unit to convert to. + * @return HTMLPurifier_Length|bool + * @note + * About precision: This conversion function pays very special + * attention to the incoming precision of values and attempts + * to maintain a number of significant figure. Results are + * fairly accurate up to nine digits. Some caveats: + * - If a number is zero-padded as a result of this significant + * figure tracking, the zeroes will be eliminated. + * - If a number contains less than four sigfigs ($outputPrecision) + * and this causes some decimals to be excluded, those + * decimals will be added on. + */ + public function convert($length, $to_unit) + { + if (!$length->isValid()) { + return false; + } + + $n = $length->getN(); + $unit = $length->getUnit(); + + if ($n === '0' || $unit === false) { + return new HTMLPurifier_Length('0', false); + } + + $state = $dest_state = false; + foreach (self::$units as $k => $x) { + if (isset($x[$unit])) { + $state = $k; + } + if (isset($x[$to_unit])) { + $dest_state = $k; + } + } + if (!$state || !$dest_state) { + return false; + } + + // Some calculations about the initial precision of the number; + // this will be useful when we need to do final rounding. + $sigfigs = $this->getSigFigs($n); + if ($sigfigs < $this->outputPrecision) { + $sigfigs = $this->outputPrecision; + } + + // BCMath's internal precision deals only with decimals. Use + // our default if the initial number has no decimals, or increase + // it by how ever many decimals, thus, the number of guard digits + // will always be greater than or equal to internalPrecision. + $log = (int)floor(log(abs($n), 10)); + $cp = ($log < 0) ? $this->internalPrecision - $log : $this->internalPrecision; // internal precision + + for ($i = 0; $i < 2; $i++) { + + // Determine what unit IN THIS SYSTEM we need to convert to + if ($dest_state === $state) { + // Simple conversion + $dest_unit = $to_unit; + } else { + // Convert to the smallest unit, pending a system shift + $dest_unit = self::$units[$state][$dest_state][0]; + } + + // Do the conversion if necessary + if ($dest_unit !== $unit) { + $factor = $this->div(self::$units[$state][$unit], self::$units[$state][$dest_unit], $cp); + $n = $this->mul($n, $factor, $cp); + $unit = $dest_unit; + } + + // Output was zero, so bail out early. Shouldn't ever happen. + if ($n === '') { + $n = '0'; + $unit = $to_unit; + break; + } + + // It was a simple conversion, so bail out + if ($dest_state === $state) { + break; + } + + if ($i !== 0) { + // Conversion failed! Apparently, the system we forwarded + // to didn't have this unit. This should never happen! + return false; + } + + // Pre-condition: $i == 0 + + // Perform conversion to next system of units + $n = $this->mul($n, self::$units[$state][$dest_state][1], $cp); + $unit = self::$units[$state][$dest_state][2]; + $state = $dest_state; + + // One more loop around to convert the unit in the new system. + + } + + // Post-condition: $unit == $to_unit + if ($unit !== $to_unit) { + return false; + } + + // Useful for debugging: + //echo "
              n";
              +        //echo "$n\nsigfigs = $sigfigs\nnew_log = $new_log\nlog = $log\nrp = $rp\n
              \n"; + + $n = $this->round($n, $sigfigs); + if (strpos($n, '.') !== false) { + $n = rtrim($n, '0'); + } + $n = rtrim($n, '.'); + + return new HTMLPurifier_Length($n, $unit); + } + + /** + * Returns the number of significant figures in a string number. + * @param string $n Decimal number + * @return int number of sigfigs + */ + public function getSigFigs($n) + { + $n = ltrim($n, '0+-'); + $dp = strpos($n, '.'); // decimal position + if ($dp === false) { + $sigfigs = strlen(rtrim($n, '0')); + } else { + $sigfigs = strlen(ltrim($n, '0.')); // eliminate extra decimal character + if ($dp !== 0) { + $sigfigs--; + } + } + return $sigfigs; + } + + /** + * Adds two numbers, using arbitrary precision when available. + * @param string $s1 + * @param string $s2 + * @param int $scale + * @return string + */ + private function add($s1, $s2, $scale) + { + if ($this->bcmath) { + return bcadd($s1, $s2, $scale); + } else { + return $this->scale((float)$s1 + (float)$s2, $scale); + } + } + + /** + * Multiples two numbers, using arbitrary precision when available. + * @param string $s1 + * @param string $s2 + * @param int $scale + * @return string + */ + private function mul($s1, $s2, $scale) + { + if ($this->bcmath) { + return bcmul($s1, $s2, $scale); + } else { + return $this->scale((float)$s1 * (float)$s2, $scale); + } + } + + /** + * Divides two numbers, using arbitrary precision when available. + * @param string $s1 + * @param string $s2 + * @param int $scale + * @return string + */ + private function div($s1, $s2, $scale) + { + if ($this->bcmath) { + return bcdiv($s1, $s2, $scale); + } else { + return $this->scale((float)$s1 / (float)$s2, $scale); + } + } + + /** + * Rounds a number according to the number of sigfigs it should have, + * using arbitrary precision when available. + * @param float $n + * @param int $sigfigs + * @return string + */ + private function round($n, $sigfigs) + { + $new_log = (int)floor(log(abs($n), 10)); // Number of digits left of decimal - 1 + $rp = $sigfigs - $new_log - 1; // Number of decimal places needed + $neg = $n < 0 ? '-' : ''; // Negative sign + if ($this->bcmath) { + if ($rp >= 0) { + $n = bcadd($n, $neg . '0.' . str_repeat('0', $rp) . '5', $rp + 1); + $n = bcdiv($n, '1', $rp); + } else { + // This algorithm partially depends on the standardized + // form of numbers that comes out of bcmath. + $n = bcadd($n, $neg . '5' . str_repeat('0', $new_log - $sigfigs), 0); + $n = substr($n, 0, $sigfigs + strlen($neg)) . str_repeat('0', $new_log - $sigfigs + 1); + } + return $n; + } else { + return $this->scale(round($n, $sigfigs - $new_log - 1), $rp + 1); + } + } + + /** + * Scales a float to $scale digits right of decimal point, like BCMath. + * @param float $r + * @param int $scale + * @return string + */ + private function scale($r, $scale) + { + if ($scale < 0) { + // The f sprintf type doesn't support negative numbers, so we + // need to cludge things manually. First get the string. + $r = sprintf('%.0f', (float)$r); + // Due to floating point precision loss, $r will more than likely + // look something like 4652999999999.9234. We grab one more digit + // than we need to precise from $r and then use that to round + // appropriately. + $precise = (string)round(substr($r, 0, strlen($r) + $scale), -1); + // Now we return it, truncating the zero that was rounded off. + return substr($precise, 0, -1) . str_repeat('0', -$scale + 1); + } + return sprintf('%.' . $scale . 'f', (float)$r); + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/VarParser.php b/thirdparty/HTMLPurifier/HTMLPurifier/VarParser.php similarity index 96% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/VarParser.php rename to thirdparty/HTMLPurifier/HTMLPurifier/VarParser.php index 4bf7771a1..50cba6910 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/VarParser.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/VarParser.php @@ -1,198 +1,198 @@ - self::STRING, - 'istring' => self::ISTRING, - 'text' => self::TEXT, - 'itext' => self::ITEXT, - 'int' => self::INT, - 'float' => self::FLOAT, - 'bool' => self::BOOL, - 'lookup' => self::LOOKUP, - 'list' => self::ALIST, - 'hash' => self::HASH, - 'mixed' => self::MIXED - ); - - /** - * Lookup table of types that are string, and can have aliases or - * allowed value lists. - */ - public static $stringTypes = array( - self::STRING => true, - self::ISTRING => true, - self::TEXT => true, - self::ITEXT => true, - ); - - /** - * Validate a variable according to type. - * It may return NULL as a valid type if $allow_null is true. - * - * @param mixed $var Variable to validate - * @param int $type Type of variable, see HTMLPurifier_VarParser->types - * @param bool $allow_null Whether or not to permit null as a value - * @return string Validated and type-coerced variable - * @throws HTMLPurifier_VarParserException - */ - final public function parse($var, $type, $allow_null = false) - { - if (is_string($type)) { - if (!isset(HTMLPurifier_VarParser::$types[$type])) { - throw new HTMLPurifier_VarParserException("Invalid type '$type'"); - } else { - $type = HTMLPurifier_VarParser::$types[$type]; - } - } - $var = $this->parseImplementation($var, $type, $allow_null); - if ($allow_null && $var === null) { - return null; - } - // These are basic checks, to make sure nothing horribly wrong - // happened in our implementations. - switch ($type) { - case (self::STRING): - case (self::ISTRING): - case (self::TEXT): - case (self::ITEXT): - if (!is_string($var)) { - break; - } - if ($type == self::ISTRING || $type == self::ITEXT) { - $var = strtolower($var); - } - return $var; - case (self::INT): - if (!is_int($var)) { - break; - } - return $var; - case (self::FLOAT): - if (!is_float($var)) { - break; - } - return $var; - case (self::BOOL): - if (!is_bool($var)) { - break; - } - return $var; - case (self::LOOKUP): - case (self::ALIST): - case (self::HASH): - if (!is_array($var)) { - break; - } - if ($type === self::LOOKUP) { - foreach ($var as $k) { - if ($k !== true) { - $this->error('Lookup table contains value other than true'); - } - } - } elseif ($type === self::ALIST) { - $keys = array_keys($var); - if (array_keys($keys) !== $keys) { - $this->error('Indices for list are not uniform'); - } - } - return $var; - case (self::MIXED): - return $var; - default: - $this->errorInconsistent(get_class($this), $type); - } - $this->errorGeneric($var, $type); - } - - /** - * Actually implements the parsing. Base implementation does not - * do anything to $var. Subclasses should overload this! - * @param mixed $var - * @param int $type - * @param bool $allow_null - * @return string - */ - protected function parseImplementation($var, $type, $allow_null) - { - return $var; - } - - /** - * Throws an exception. - * @throws HTMLPurifier_VarParserException - */ - protected function error($msg) - { - throw new HTMLPurifier_VarParserException($msg); - } - - /** - * Throws an inconsistency exception. - * @note This should not ever be called. It would be called if we - * extend the allowed values of HTMLPurifier_VarParser without - * updating subclasses. - * @param string $class - * @param int $type - * @throws HTMLPurifier_Exception - */ - protected function errorInconsistent($class, $type) - { - throw new HTMLPurifier_Exception( - "Inconsistency in $class: " . HTMLPurifier_VarParser::getTypeName($type) . - " not implemented" - ); - } - - /** - * Generic error for if a type didn't work. - * @param mixed $var - * @param int $type - */ - protected function errorGeneric($var, $type) - { - $vtype = gettype($var); - $this->error("Expected type " . HTMLPurifier_VarParser::getTypeName($type) . ", got $vtype"); - } - - /** - * @param int $type - * @return string - */ - public static function getTypeName($type) - { - static $lookup; - if (!$lookup) { - // Lazy load the alternative lookup table - $lookup = array_flip(HTMLPurifier_VarParser::$types); - } - if (!isset($lookup[$type])) { - return 'unknown'; - } - return $lookup[$type]; - } -} - -// vim: et sw=4 sts=4 + self::STRING, + 'istring' => self::ISTRING, + 'text' => self::TEXT, + 'itext' => self::ITEXT, + 'int' => self::INT, + 'float' => self::FLOAT, + 'bool' => self::BOOL, + 'lookup' => self::LOOKUP, + 'list' => self::ALIST, + 'hash' => self::HASH, + 'mixed' => self::MIXED + ); + + /** + * Lookup table of types that are string, and can have aliases or + * allowed value lists. + */ + public static $stringTypes = array( + self::STRING => true, + self::ISTRING => true, + self::TEXT => true, + self::ITEXT => true, + ); + + /** + * Validate a variable according to type. + * It may return NULL as a valid type if $allow_null is true. + * + * @param mixed $var Variable to validate + * @param int $type Type of variable, see HTMLPurifier_VarParser->types + * @param bool $allow_null Whether or not to permit null as a value + * @return string Validated and type-coerced variable + * @throws HTMLPurifier_VarParserException + */ + final public function parse($var, $type, $allow_null = false) + { + if (is_string($type)) { + if (!isset(HTMLPurifier_VarParser::$types[$type])) { + throw new HTMLPurifier_VarParserException("Invalid type '$type'"); + } else { + $type = HTMLPurifier_VarParser::$types[$type]; + } + } + $var = $this->parseImplementation($var, $type, $allow_null); + if ($allow_null && $var === null) { + return null; + } + // These are basic checks, to make sure nothing horribly wrong + // happened in our implementations. + switch ($type) { + case (self::STRING): + case (self::ISTRING): + case (self::TEXT): + case (self::ITEXT): + if (!is_string($var)) { + break; + } + if ($type == self::ISTRING || $type == self::ITEXT) { + $var = strtolower($var); + } + return $var; + case (self::INT): + if (!is_int($var)) { + break; + } + return $var; + case (self::FLOAT): + if (!is_float($var)) { + break; + } + return $var; + case (self::BOOL): + if (!is_bool($var)) { + break; + } + return $var; + case (self::LOOKUP): + case (self::ALIST): + case (self::HASH): + if (!is_array($var)) { + break; + } + if ($type === self::LOOKUP) { + foreach ($var as $k) { + if ($k !== true) { + $this->error('Lookup table contains value other than true'); + } + } + } elseif ($type === self::ALIST) { + $keys = array_keys($var); + if (array_keys($keys) !== $keys) { + $this->error('Indices for list are not uniform'); + } + } + return $var; + case (self::MIXED): + return $var; + default: + $this->errorInconsistent(get_class($this), $type); + } + $this->errorGeneric($var, $type); + } + + /** + * Actually implements the parsing. Base implementation does not + * do anything to $var. Subclasses should overload this! + * @param mixed $var + * @param int $type + * @param bool $allow_null + * @return string + */ + protected function parseImplementation($var, $type, $allow_null) + { + return $var; + } + + /** + * Throws an exception. + * @throws HTMLPurifier_VarParserException + */ + protected function error($msg) + { + throw new HTMLPurifier_VarParserException($msg); + } + + /** + * Throws an inconsistency exception. + * @note This should not ever be called. It would be called if we + * extend the allowed values of HTMLPurifier_VarParser without + * updating subclasses. + * @param string $class + * @param int $type + * @throws HTMLPurifier_Exception + */ + protected function errorInconsistent($class, $type) + { + throw new HTMLPurifier_Exception( + "Inconsistency in $class: " . HTMLPurifier_VarParser::getTypeName($type) . + " not implemented" + ); + } + + /** + * Generic error for if a type didn't work. + * @param mixed $var + * @param int $type + */ + protected function errorGeneric($var, $type) + { + $vtype = gettype($var); + $this->error("Expected type " . HTMLPurifier_VarParser::getTypeName($type) . ", got $vtype"); + } + + /** + * @param int $type + * @return string + */ + public static function getTypeName($type) + { + static $lookup; + if (!$lookup) { + // Lazy load the alternative lookup table + $lookup = array_flip(HTMLPurifier_VarParser::$types); + } + if (!isset($lookup[$type])) { + return 'unknown'; + } + return $lookup[$type]; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/VarParser/Flexible.php b/thirdparty/HTMLPurifier/HTMLPurifier/VarParser/Flexible.php similarity index 97% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/VarParser/Flexible.php rename to thirdparty/HTMLPurifier/HTMLPurifier/VarParser/Flexible.php index b2ed860ac..b15016c5b 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/VarParser/Flexible.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/VarParser/Flexible.php @@ -1,130 +1,130 @@ - $j) { - $var[$i] = trim($j); - } - if ($type === self::HASH) { - // key:value,key2:value2 - $nvar = array(); - foreach ($var as $keypair) { - $c = explode(':', $keypair, 2); - if (!isset($c[1])) { - continue; - } - $nvar[trim($c[0])] = trim($c[1]); - } - $var = $nvar; - } - } - if (!is_array($var)) { - break; - } - $keys = array_keys($var); - if ($keys === array_keys($keys)) { - if ($type == self::ALIST) { - return $var; - } elseif ($type == self::LOOKUP) { - $new = array(); - foreach ($var as $key) { - $new[$key] = true; - } - return $new; - } else { - break; - } - } - if ($type === self::ALIST) { - trigger_error("Array list did not have consecutive integer indexes", E_USER_WARNING); - return array_values($var); - } - if ($type === self::LOOKUP) { - foreach ($var as $key => $value) { - if ($value !== true) { - trigger_error( - "Lookup array has non-true value at key '$key'; " . - "maybe your input array was not indexed numerically", - E_USER_WARNING - ); - } - $var[$key] = true; - } - } - return $var; - default: - $this->errorInconsistent(__CLASS__, $type); - } - $this->errorGeneric($var, $type); - } -} - -// vim: et sw=4 sts=4 + $j) { + $var[$i] = trim($j); + } + if ($type === self::HASH) { + // key:value,key2:value2 + $nvar = array(); + foreach ($var as $keypair) { + $c = explode(':', $keypair, 2); + if (!isset($c[1])) { + continue; + } + $nvar[trim($c[0])] = trim($c[1]); + } + $var = $nvar; + } + } + if (!is_array($var)) { + break; + } + $keys = array_keys($var); + if ($keys === array_keys($keys)) { + if ($type == self::ALIST) { + return $var; + } elseif ($type == self::LOOKUP) { + $new = array(); + foreach ($var as $key) { + $new[$key] = true; + } + return $new; + } else { + break; + } + } + if ($type === self::ALIST) { + trigger_error("Array list did not have consecutive integer indexes", E_USER_WARNING); + return array_values($var); + } + if ($type === self::LOOKUP) { + foreach ($var as $key => $value) { + if ($value !== true) { + trigger_error( + "Lookup array has non-true value at key '$key'; " . + "maybe your input array was not indexed numerically", + E_USER_WARNING + ); + } + $var[$key] = true; + } + } + return $var; + default: + $this->errorInconsistent(__CLASS__, $type); + } + $this->errorGeneric($var, $type); + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/VarParser/Native.php b/thirdparty/HTMLPurifier/HTMLPurifier/VarParser/Native.php similarity index 95% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/VarParser/Native.php rename to thirdparty/HTMLPurifier/HTMLPurifier/VarParser/Native.php index c28055b5e..f11c318ef 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/VarParser/Native.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/VarParser/Native.php @@ -1,38 +1,38 @@ -evalExpression($var); - } - - /** - * @param string $expr - * @return mixed - * @throws HTMLPurifier_VarParserException - */ - protected function evalExpression($expr) - { - $var = null; - $result = eval("\$var = $expr;"); - if ($result === false) { - throw new HTMLPurifier_VarParserException("Fatal error in evaluated code"); - } - return $var; - } -} - -// vim: et sw=4 sts=4 +evalExpression($var); + } + + /** + * @param string $expr + * @return mixed + * @throws HTMLPurifier_VarParserException + */ + protected function evalExpression($expr) + { + $var = null; + $result = eval("\$var = $expr;"); + if ($result === false) { + throw new HTMLPurifier_VarParserException("Fatal error in evaluated code"); + } + return $var; + } +} + +// vim: et sw=4 sts=4 diff --git a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/VarParserException.php b/thirdparty/HTMLPurifier/HTMLPurifier/VarParserException.php similarity index 93% rename from gulliver/thirdparty/HTMLPurifier/HTMLPurifier/VarParserException.php rename to thirdparty/HTMLPurifier/HTMLPurifier/VarParserException.php index 82e465d6a..5df341495 100644 --- a/gulliver/thirdparty/HTMLPurifier/HTMLPurifier/VarParserException.php +++ b/thirdparty/HTMLPurifier/HTMLPurifier/VarParserException.php @@ -1,11 +1,11 @@ -front = $front; - $this->back = $back; - } - - /** - * Creates a zipper from an array, with a hole in the - * 0-index position. - * @param Array to zipper-ify. - * @return Tuple of zipper and element of first position. - */ - static public function fromArray($array) { - $z = new self(array(), array_reverse($array)); - $t = $z->delete(); // delete the "dummy hole" - return array($z, $t); - } - - /** - * Convert zipper back into a normal array, optionally filling in - * the hole with a value. (Usually you should supply a $t, unless you - * are at the end of the array.) - */ - public function toArray($t = NULL) { - $a = $this->front; - if ($t !== NULL) $a[] = $t; - for ($i = count($this->back)-1; $i >= 0; $i--) { - $a[] = $this->back[$i]; - } - return $a; - } - - /** - * Move hole to the next element. - * @param $t Element to fill hole with - * @return Original contents of new hole. - */ - public function next($t) { - if ($t !== NULL) array_push($this->front, $t); - return empty($this->back) ? NULL : array_pop($this->back); - } - - /** - * Iterated hole advancement. - * @param $t Element to fill hole with - * @param $i How many forward to advance hole - * @return Original contents of new hole, i away - */ - public function advance($t, $n) { - for ($i = 0; $i < $n; $i++) { - $t = $this->next($t); - } - return $t; - } - - /** - * Move hole to the previous element - * @param $t Element to fill hole with - * @return Original contents of new hole. - */ - public function prev($t) { - if ($t !== NULL) array_push($this->back, $t); - return empty($this->front) ? NULL : array_pop($this->front); - } - - /** - * Delete contents of current hole, shifting hole to - * next element. - * @return Original contents of new hole. - */ - public function delete() { - return empty($this->back) ? NULL : array_pop($this->back); - } - - /** - * Returns true if we are at the end of the list. - * @return bool - */ - public function done() { - return empty($this->back); - } - - /** - * Insert element before hole. - * @param Element to insert - */ - public function insertBefore($t) { - if ($t !== NULL) array_push($this->front, $t); - } - - /** - * Insert element after hole. - * @param Element to insert - */ - public function insertAfter($t) { - if ($t !== NULL) array_push($this->back, $t); - } - - /** - * Splice in multiple elements at hole. Functional specification - * in terms of array_splice: - * - * $arr1 = $arr; - * $old1 = array_splice($arr1, $i, $delete, $replacement); - * - * list($z, $t) = HTMLPurifier_Zipper::fromArray($arr); - * $t = $z->advance($t, $i); - * list($old2, $t) = $z->splice($t, $delete, $replacement); - * $arr2 = $z->toArray($t); - * - * assert($old1 === $old2); - * assert($arr1 === $arr2); - * - * NB: the absolute index location after this operation is - * *unchanged!* - * - * @param Current contents of hole. - */ - public function splice($t, $delete, $replacement) { - // delete - $old = array(); - $r = $t; - for ($i = $delete; $i > 0; $i--) { - $old[] = $r; - $r = $this->delete(); - } - // insert - for ($i = count($replacement)-1; $i >= 0; $i--) { - $this->insertAfter($r); - $r = $replacement[$i]; - } - return array($old, $r); - } -} +front = $front; + $this->back = $back; + } + + /** + * Creates a zipper from an array, with a hole in the + * 0-index position. + * @param Array to zipper-ify. + * @return Tuple of zipper and element of first position. + */ + static public function fromArray($array) { + $z = new self(array(), array_reverse($array)); + $t = $z->delete(); // delete the "dummy hole" + return array($z, $t); + } + + /** + * Convert zipper back into a normal array, optionally filling in + * the hole with a value. (Usually you should supply a $t, unless you + * are at the end of the array.) + */ + public function toArray($t = NULL) { + $a = $this->front; + if ($t !== NULL) $a[] = $t; + for ($i = count($this->back)-1; $i >= 0; $i--) { + $a[] = $this->back[$i]; + } + return $a; + } + + /** + * Move hole to the next element. + * @param $t Element to fill hole with + * @return Original contents of new hole. + */ + public function next($t) { + if ($t !== NULL) array_push($this->front, $t); + return empty($this->back) ? NULL : array_pop($this->back); + } + + /** + * Iterated hole advancement. + * @param $t Element to fill hole with + * @param $i How many forward to advance hole + * @return Original contents of new hole, i away + */ + public function advance($t, $n) { + for ($i = 0; $i < $n; $i++) { + $t = $this->next($t); + } + return $t; + } + + /** + * Move hole to the previous element + * @param $t Element to fill hole with + * @return Original contents of new hole. + */ + public function prev($t) { + if ($t !== NULL) array_push($this->back, $t); + return empty($this->front) ? NULL : array_pop($this->front); + } + + /** + * Delete contents of current hole, shifting hole to + * next element. + * @return Original contents of new hole. + */ + public function delete() { + return empty($this->back) ? NULL : array_pop($this->back); + } + + /** + * Returns true if we are at the end of the list. + * @return bool + */ + public function done() { + return empty($this->back); + } + + /** + * Insert element before hole. + * @param Element to insert + */ + public function insertBefore($t) { + if ($t !== NULL) array_push($this->front, $t); + } + + /** + * Insert element after hole. + * @param Element to insert + */ + public function insertAfter($t) { + if ($t !== NULL) array_push($this->back, $t); + } + + /** + * Splice in multiple elements at hole. Functional specification + * in terms of array_splice: + * + * $arr1 = $arr; + * $old1 = array_splice($arr1, $i, $delete, $replacement); + * + * list($z, $t) = HTMLPurifier_Zipper::fromArray($arr); + * $t = $z->advance($t, $i); + * list($old2, $t) = $z->splice($t, $delete, $replacement); + * $arr2 = $z->toArray($t); + * + * assert($old1 === $old2); + * assert($arr1 === $arr2); + * + * NB: the absolute index location after this operation is + * *unchanged!* + * + * @param Current contents of hole. + */ + public function splice($t, $delete, $replacement) { + // delete + $old = array(); + $r = $t; + for ($i = $delete; $i > 0; $i--) { + $old[] = $r; + $r = $this->delete(); + } + // insert + for ($i = count($replacement)-1; $i >= 0; $i--) { + $this->insertAfter($r); + $r = $replacement[$i]; + } + return array($old, $r); + } +} diff --git a/gulliver/thirdparty/creole/CallableStatement.php b/thirdparty/creole/CallableStatement.php similarity index 100% rename from gulliver/thirdparty/creole/CallableStatement.php rename to thirdparty/creole/CallableStatement.php diff --git a/gulliver/thirdparty/creole/Connection.php b/thirdparty/creole/Connection.php similarity index 100% rename from gulliver/thirdparty/creole/Connection.php rename to thirdparty/creole/Connection.php diff --git a/gulliver/thirdparty/creole/Creole.php b/thirdparty/creole/Creole.php similarity index 99% rename from gulliver/thirdparty/creole/Creole.php rename to thirdparty/creole/Creole.php index 43dc43fd6..72b5e1683 100644 --- a/gulliver/thirdparty/creole/Creole.php +++ b/thirdparty/creole/Creole.php @@ -309,11 +309,7 @@ class Creole { ); $info = parse_url($dsn); - - if (!is_null($dsn)) { - $info['pass'] = urldecode($info['pass']); - } - + $info['pass'] = urldecode($info['pass']); if (count($info) === 1) { // if there's only one element in result, then it must be the phptype $parsed['phptype'] = array_pop($info); return $parsed; diff --git a/gulliver/thirdparty/creole/CreoleTypes.php b/thirdparty/creole/CreoleTypes.php similarity index 100% rename from gulliver/thirdparty/creole/CreoleTypes.php rename to thirdparty/creole/CreoleTypes.php diff --git a/gulliver/thirdparty/creole/IdGenerator.php b/thirdparty/creole/IdGenerator.php similarity index 100% rename from gulliver/thirdparty/creole/IdGenerator.php rename to thirdparty/creole/IdGenerator.php diff --git a/gulliver/thirdparty/creole/PreparedStatement.php b/thirdparty/creole/PreparedStatement.php similarity index 100% rename from gulliver/thirdparty/creole/PreparedStatement.php rename to thirdparty/creole/PreparedStatement.php diff --git a/gulliver/thirdparty/creole/ResultSet.php b/thirdparty/creole/ResultSet.php similarity index 100% rename from gulliver/thirdparty/creole/ResultSet.php rename to thirdparty/creole/ResultSet.php diff --git a/gulliver/thirdparty/creole/ResultSetIterator.php b/thirdparty/creole/ResultSetIterator.php similarity index 100% rename from gulliver/thirdparty/creole/ResultSetIterator.php rename to thirdparty/creole/ResultSetIterator.php diff --git a/gulliver/thirdparty/creole/SQLException.php b/thirdparty/creole/SQLException.php similarity index 100% rename from gulliver/thirdparty/creole/SQLException.php rename to thirdparty/creole/SQLException.php diff --git a/gulliver/thirdparty/creole/Statement.php b/thirdparty/creole/Statement.php similarity index 100% rename from gulliver/thirdparty/creole/Statement.php rename to thirdparty/creole/Statement.php diff --git a/gulliver/thirdparty/creole/common/ConnectionCommon.php b/thirdparty/creole/common/ConnectionCommon.php similarity index 100% rename from gulliver/thirdparty/creole/common/ConnectionCommon.php rename to thirdparty/creole/common/ConnectionCommon.php diff --git a/gulliver/thirdparty/creole/common/PreparedStatementCommon.php b/thirdparty/creole/common/PreparedStatementCommon.php similarity index 100% rename from gulliver/thirdparty/creole/common/PreparedStatementCommon.php rename to thirdparty/creole/common/PreparedStatementCommon.php diff --git a/gulliver/thirdparty/creole/common/ResultSetCommon.php b/thirdparty/creole/common/ResultSetCommon.php similarity index 100% rename from gulliver/thirdparty/creole/common/ResultSetCommon.php rename to thirdparty/creole/common/ResultSetCommon.php diff --git a/gulliver/thirdparty/creole/common/StatementCommon.php b/thirdparty/creole/common/StatementCommon.php similarity index 100% rename from gulliver/thirdparty/creole/common/StatementCommon.php rename to thirdparty/creole/common/StatementCommon.php diff --git a/gulliver/thirdparty/creole/contrib/DBArrayConnection.php b/thirdparty/creole/contrib/DBArrayConnection.php similarity index 100% rename from gulliver/thirdparty/creole/contrib/DBArrayConnection.php rename to thirdparty/creole/contrib/DBArrayConnection.php diff --git a/gulliver/thirdparty/creole/contrib/DebugConnection.php b/thirdparty/creole/contrib/DebugConnection.php similarity index 100% rename from gulliver/thirdparty/creole/contrib/DebugConnection.php rename to thirdparty/creole/contrib/DebugConnection.php diff --git a/gulliver/thirdparty/creole/drivers/mssql/MSSQLCallableStatement.php b/thirdparty/creole/drivers/mssql/MSSQLCallableStatement.php similarity index 100% rename from gulliver/thirdparty/creole/drivers/mssql/MSSQLCallableStatement.php rename to thirdparty/creole/drivers/mssql/MSSQLCallableStatement.php diff --git a/gulliver/thirdparty/creole/drivers/mssql/MSSQLConnection.php b/thirdparty/creole/drivers/mssql/MSSQLConnection.php similarity index 100% rename from gulliver/thirdparty/creole/drivers/mssql/MSSQLConnection.php rename to thirdparty/creole/drivers/mssql/MSSQLConnection.php diff --git a/gulliver/thirdparty/creole/drivers/mssql/MSSQLIdGenerator.php b/thirdparty/creole/drivers/mssql/MSSQLIdGenerator.php similarity index 100% rename from gulliver/thirdparty/creole/drivers/mssql/MSSQLIdGenerator.php rename to thirdparty/creole/drivers/mssql/MSSQLIdGenerator.php diff --git a/gulliver/thirdparty/creole/drivers/mssql/MSSQLPreparedStatement.php b/thirdparty/creole/drivers/mssql/MSSQLPreparedStatement.php similarity index 100% rename from gulliver/thirdparty/creole/drivers/mssql/MSSQLPreparedStatement.php rename to thirdparty/creole/drivers/mssql/MSSQLPreparedStatement.php diff --git a/gulliver/thirdparty/creole/drivers/mssql/MSSQLResultSet.php b/thirdparty/creole/drivers/mssql/MSSQLResultSet.php similarity index 100% rename from gulliver/thirdparty/creole/drivers/mssql/MSSQLResultSet.php rename to thirdparty/creole/drivers/mssql/MSSQLResultSet.php diff --git a/gulliver/thirdparty/creole/drivers/mssql/MSSQLStatement.php b/thirdparty/creole/drivers/mssql/MSSQLStatement.php similarity index 100% rename from gulliver/thirdparty/creole/drivers/mssql/MSSQLStatement.php rename to thirdparty/creole/drivers/mssql/MSSQLStatement.php diff --git a/gulliver/thirdparty/creole/drivers/mssql/MSSQLTypes.php b/thirdparty/creole/drivers/mssql/MSSQLTypes.php similarity index 100% rename from gulliver/thirdparty/creole/drivers/mssql/MSSQLTypes.php rename to thirdparty/creole/drivers/mssql/MSSQLTypes.php diff --git a/gulliver/thirdparty/creole/drivers/mssql/metadata/MSSQLDatabaseInfo.php b/thirdparty/creole/drivers/mssql/metadata/MSSQLDatabaseInfo.php similarity index 100% rename from gulliver/thirdparty/creole/drivers/mssql/metadata/MSSQLDatabaseInfo.php rename to thirdparty/creole/drivers/mssql/metadata/MSSQLDatabaseInfo.php diff --git a/gulliver/thirdparty/creole/drivers/mssql/metadata/MSSQLTableInfo.php b/thirdparty/creole/drivers/mssql/metadata/MSSQLTableInfo.php similarity index 100% rename from gulliver/thirdparty/creole/drivers/mssql/metadata/MSSQLTableInfo.php rename to thirdparty/creole/drivers/mssql/metadata/MSSQLTableInfo.php diff --git a/gulliver/thirdparty/creole/drivers/mysql/MySQLConnection.php b/thirdparty/creole/drivers/mysql/MySQLConnection.php similarity index 100% rename from gulliver/thirdparty/creole/drivers/mysql/MySQLConnection.php rename to thirdparty/creole/drivers/mysql/MySQLConnection.php diff --git a/gulliver/thirdparty/creole/drivers/mysql/MySQLIdGenerator.php b/thirdparty/creole/drivers/mysql/MySQLIdGenerator.php similarity index 100% rename from gulliver/thirdparty/creole/drivers/mysql/MySQLIdGenerator.php rename to thirdparty/creole/drivers/mysql/MySQLIdGenerator.php diff --git a/gulliver/thirdparty/creole/drivers/mysql/MySQLPreparedStatement.php b/thirdparty/creole/drivers/mysql/MySQLPreparedStatement.php similarity index 100% rename from gulliver/thirdparty/creole/drivers/mysql/MySQLPreparedStatement.php rename to thirdparty/creole/drivers/mysql/MySQLPreparedStatement.php diff --git a/gulliver/thirdparty/creole/drivers/mysql/MySQLResultSet.php b/thirdparty/creole/drivers/mysql/MySQLResultSet.php similarity index 100% rename from gulliver/thirdparty/creole/drivers/mysql/MySQLResultSet.php rename to thirdparty/creole/drivers/mysql/MySQLResultSet.php diff --git a/gulliver/thirdparty/creole/drivers/mysql/MySQLStatement.php b/thirdparty/creole/drivers/mysql/MySQLStatement.php similarity index 100% rename from gulliver/thirdparty/creole/drivers/mysql/MySQLStatement.php rename to thirdparty/creole/drivers/mysql/MySQLStatement.php diff --git a/gulliver/thirdparty/creole/drivers/mysql/MySQLTypes.php b/thirdparty/creole/drivers/mysql/MySQLTypes.php similarity index 100% rename from gulliver/thirdparty/creole/drivers/mysql/MySQLTypes.php rename to thirdparty/creole/drivers/mysql/MySQLTypes.php diff --git a/gulliver/thirdparty/creole/drivers/mysql/metadata/MySQLDatabaseInfo.php b/thirdparty/creole/drivers/mysql/metadata/MySQLDatabaseInfo.php similarity index 100% rename from gulliver/thirdparty/creole/drivers/mysql/metadata/MySQLDatabaseInfo.php rename to thirdparty/creole/drivers/mysql/metadata/MySQLDatabaseInfo.php diff --git a/gulliver/thirdparty/creole/drivers/mysql/metadata/MySQLTableInfo.php b/thirdparty/creole/drivers/mysql/metadata/MySQLTableInfo.php similarity index 100% rename from gulliver/thirdparty/creole/drivers/mysql/metadata/MySQLTableInfo.php rename to thirdparty/creole/drivers/mysql/metadata/MySQLTableInfo.php diff --git a/gulliver/thirdparty/creole/drivers/mysqli/MySQLiConnection.php b/thirdparty/creole/drivers/mysqli/MySQLiConnection.php similarity index 100% rename from gulliver/thirdparty/creole/drivers/mysqli/MySQLiConnection.php rename to thirdparty/creole/drivers/mysqli/MySQLiConnection.php diff --git a/gulliver/thirdparty/creole/drivers/mysqli/MySQLiIdGenerator.php b/thirdparty/creole/drivers/mysqli/MySQLiIdGenerator.php similarity index 100% rename from gulliver/thirdparty/creole/drivers/mysqli/MySQLiIdGenerator.php rename to thirdparty/creole/drivers/mysqli/MySQLiIdGenerator.php diff --git a/gulliver/thirdparty/creole/drivers/mysqli/MySQLiPreparedStatement.php b/thirdparty/creole/drivers/mysqli/MySQLiPreparedStatement.php similarity index 100% rename from gulliver/thirdparty/creole/drivers/mysqli/MySQLiPreparedStatement.php rename to thirdparty/creole/drivers/mysqli/MySQLiPreparedStatement.php diff --git a/gulliver/thirdparty/creole/drivers/mysqli/MySQLiResultSet.php b/thirdparty/creole/drivers/mysqli/MySQLiResultSet.php similarity index 100% rename from gulliver/thirdparty/creole/drivers/mysqli/MySQLiResultSet.php rename to thirdparty/creole/drivers/mysqli/MySQLiResultSet.php diff --git a/gulliver/thirdparty/creole/drivers/mysqli/MySQLiStatement.php b/thirdparty/creole/drivers/mysqli/MySQLiStatement.php similarity index 100% rename from gulliver/thirdparty/creole/drivers/mysqli/MySQLiStatement.php rename to thirdparty/creole/drivers/mysqli/MySQLiStatement.php diff --git a/gulliver/thirdparty/creole/drivers/mysqli/metadata/MySQLiDatabaseInfo.php b/thirdparty/creole/drivers/mysqli/metadata/MySQLiDatabaseInfo.php similarity index 100% rename from gulliver/thirdparty/creole/drivers/mysqli/metadata/MySQLiDatabaseInfo.php rename to thirdparty/creole/drivers/mysqli/metadata/MySQLiDatabaseInfo.php diff --git a/gulliver/thirdparty/creole/drivers/mysqli/metadata/MySQLiTableInfo.php b/thirdparty/creole/drivers/mysqli/metadata/MySQLiTableInfo.php similarity index 100% rename from gulliver/thirdparty/creole/drivers/mysqli/metadata/MySQLiTableInfo.php rename to thirdparty/creole/drivers/mysqli/metadata/MySQLiTableInfo.php diff --git a/gulliver/thirdparty/creole/drivers/odbc/ODBCCachedResultSet.php b/thirdparty/creole/drivers/odbc/ODBCCachedResultSet.php similarity index 100% rename from gulliver/thirdparty/creole/drivers/odbc/ODBCCachedResultSet.php rename to thirdparty/creole/drivers/odbc/ODBCCachedResultSet.php diff --git a/gulliver/thirdparty/creole/drivers/odbc/ODBCConnection.php b/thirdparty/creole/drivers/odbc/ODBCConnection.php similarity index 100% rename from gulliver/thirdparty/creole/drivers/odbc/ODBCConnection.php rename to thirdparty/creole/drivers/odbc/ODBCConnection.php diff --git a/gulliver/thirdparty/creole/drivers/odbc/ODBCIdGenerator.php b/thirdparty/creole/drivers/odbc/ODBCIdGenerator.php similarity index 100% rename from gulliver/thirdparty/creole/drivers/odbc/ODBCIdGenerator.php rename to thirdparty/creole/drivers/odbc/ODBCIdGenerator.php diff --git a/gulliver/thirdparty/creole/drivers/odbc/ODBCPreparedStatement.php b/thirdparty/creole/drivers/odbc/ODBCPreparedStatement.php similarity index 100% rename from gulliver/thirdparty/creole/drivers/odbc/ODBCPreparedStatement.php rename to thirdparty/creole/drivers/odbc/ODBCPreparedStatement.php diff --git a/gulliver/thirdparty/creole/drivers/odbc/ODBCResultSet.php b/thirdparty/creole/drivers/odbc/ODBCResultSet.php similarity index 100% rename from gulliver/thirdparty/creole/drivers/odbc/ODBCResultSet.php rename to thirdparty/creole/drivers/odbc/ODBCResultSet.php diff --git a/gulliver/thirdparty/creole/drivers/odbc/ODBCResultSetCommon.php b/thirdparty/creole/drivers/odbc/ODBCResultSetCommon.php similarity index 100% rename from gulliver/thirdparty/creole/drivers/odbc/ODBCResultSetCommon.php rename to thirdparty/creole/drivers/odbc/ODBCResultSetCommon.php diff --git a/gulliver/thirdparty/creole/drivers/odbc/ODBCStatement.php b/thirdparty/creole/drivers/odbc/ODBCStatement.php similarity index 100% rename from gulliver/thirdparty/creole/drivers/odbc/ODBCStatement.php rename to thirdparty/creole/drivers/odbc/ODBCStatement.php diff --git a/gulliver/thirdparty/creole/drivers/odbc/ODBCTypes.php b/thirdparty/creole/drivers/odbc/ODBCTypes.php similarity index 100% rename from gulliver/thirdparty/creole/drivers/odbc/ODBCTypes.php rename to thirdparty/creole/drivers/odbc/ODBCTypes.php diff --git a/gulliver/thirdparty/creole/drivers/odbc/README b/thirdparty/creole/drivers/odbc/README similarity index 100% rename from gulliver/thirdparty/creole/drivers/odbc/README rename to thirdparty/creole/drivers/odbc/README diff --git a/gulliver/thirdparty/creole/drivers/odbc/adapters/CodeBaseAdapter.php b/thirdparty/creole/drivers/odbc/adapters/CodeBaseAdapter.php similarity index 100% rename from gulliver/thirdparty/creole/drivers/odbc/adapters/CodeBaseAdapter.php rename to thirdparty/creole/drivers/odbc/adapters/CodeBaseAdapter.php diff --git a/gulliver/thirdparty/creole/drivers/odbc/adapters/MySQLAdapter.php b/thirdparty/creole/drivers/odbc/adapters/MySQLAdapter.php similarity index 100% rename from gulliver/thirdparty/creole/drivers/odbc/adapters/MySQLAdapter.php rename to thirdparty/creole/drivers/odbc/adapters/MySQLAdapter.php diff --git a/gulliver/thirdparty/creole/drivers/odbc/adapters/ODBCAdapter.php b/thirdparty/creole/drivers/odbc/adapters/ODBCAdapter.php similarity index 100% rename from gulliver/thirdparty/creole/drivers/odbc/adapters/ODBCAdapter.php rename to thirdparty/creole/drivers/odbc/adapters/ODBCAdapter.php diff --git a/gulliver/thirdparty/creole/drivers/odbc/metadata/ODBCDatabaseInfo.php b/thirdparty/creole/drivers/odbc/metadata/ODBCDatabaseInfo.php similarity index 100% rename from gulliver/thirdparty/creole/drivers/odbc/metadata/ODBCDatabaseInfo.php rename to thirdparty/creole/drivers/odbc/metadata/ODBCDatabaseInfo.php diff --git a/gulliver/thirdparty/creole/drivers/odbc/metadata/ODBCTableInfo.php b/thirdparty/creole/drivers/odbc/metadata/ODBCTableInfo.php similarity index 100% rename from gulliver/thirdparty/creole/drivers/odbc/metadata/ODBCTableInfo.php rename to thirdparty/creole/drivers/odbc/metadata/ODBCTableInfo.php diff --git a/gulliver/thirdparty/creole/drivers/oracle/OCI8Connection.php b/thirdparty/creole/drivers/oracle/OCI8Connection.php similarity index 95% rename from gulliver/thirdparty/creole/drivers/oracle/OCI8Connection.php rename to thirdparty/creole/drivers/oracle/OCI8Connection.php index 32e49a45d..5a6a34ef9 100644 --- a/gulliver/thirdparty/creole/drivers/oracle/OCI8Connection.php +++ b/thirdparty/creole/drivers/oracle/OCI8Connection.php @@ -140,27 +140,30 @@ class OCI8Connection extends ConnectionCommon implements Connection */ function executeQuery( $sql, $fetchmode = null ) { - $this->lastQuery = $sql; + $this->lastQuery = $sql; - $result = @oci_parse($this->dblink, $sql); + // $result = @oci_parse( $this->dblink, $sql ); + $result = oci_parse( $this->dblink, $sql ); - if (!$result) { - throw new SQLException('Unable to prepare query' - , $this->nativeError() - , $sql - ); + if ( ! $result ) + { + throw new SQLException( 'Unable to prepare query' + , $this->nativeError() + , $sql + ); } $success = @oci_execute($result, $this->execMode); - if (!$success) { - throw new SQLException('Unable to execute query' - , $this->nativeError($result) - , $sql - ); + if ( ! $success ) + { + throw new SQLException( 'Unable to execute query' + , $this->nativeError( $result ) + , $sql + ); } - - return new OCI8ResultSet($this, $result, $fetchmode); + + return new OCI8ResultSet( $this, $result, $fetchmode ); } diff --git a/gulliver/thirdparty/creole/drivers/oracle/OCI8IdGenerator.php b/thirdparty/creole/drivers/oracle/OCI8IdGenerator.php similarity index 100% rename from gulliver/thirdparty/creole/drivers/oracle/OCI8IdGenerator.php rename to thirdparty/creole/drivers/oracle/OCI8IdGenerator.php diff --git a/gulliver/thirdparty/creole/drivers/oracle/OCI8PreparedStatement.php b/thirdparty/creole/drivers/oracle/OCI8PreparedStatement.php similarity index 100% rename from gulliver/thirdparty/creole/drivers/oracle/OCI8PreparedStatement.php rename to thirdparty/creole/drivers/oracle/OCI8PreparedStatement.php diff --git a/gulliver/thirdparty/creole/drivers/oracle/OCI8ResultSet.php b/thirdparty/creole/drivers/oracle/OCI8ResultSet.php similarity index 100% rename from gulliver/thirdparty/creole/drivers/oracle/OCI8ResultSet.php rename to thirdparty/creole/drivers/oracle/OCI8ResultSet.php diff --git a/gulliver/thirdparty/creole/drivers/oracle/OCI8Statement.php b/thirdparty/creole/drivers/oracle/OCI8Statement.php similarity index 100% rename from gulliver/thirdparty/creole/drivers/oracle/OCI8Statement.php rename to thirdparty/creole/drivers/oracle/OCI8Statement.php diff --git a/gulliver/thirdparty/creole/drivers/oracle/OCI8Types.php b/thirdparty/creole/drivers/oracle/OCI8Types.php similarity index 100% rename from gulliver/thirdparty/creole/drivers/oracle/OCI8Types.php rename to thirdparty/creole/drivers/oracle/OCI8Types.php diff --git a/gulliver/thirdparty/creole/drivers/oracle/metadata/OCI8DatabaseInfo.php b/thirdparty/creole/drivers/oracle/metadata/OCI8DatabaseInfo.php similarity index 100% rename from gulliver/thirdparty/creole/drivers/oracle/metadata/OCI8DatabaseInfo.php rename to thirdparty/creole/drivers/oracle/metadata/OCI8DatabaseInfo.php diff --git a/gulliver/thirdparty/creole/drivers/oracle/metadata/OCI8TableInfo.php b/thirdparty/creole/drivers/oracle/metadata/OCI8TableInfo.php similarity index 100% rename from gulliver/thirdparty/creole/drivers/oracle/metadata/OCI8TableInfo.php rename to thirdparty/creole/drivers/oracle/metadata/OCI8TableInfo.php diff --git a/gulliver/thirdparty/creole/drivers/pgsql/PgSQLConnection.php b/thirdparty/creole/drivers/pgsql/PgSQLConnection.php similarity index 100% rename from gulliver/thirdparty/creole/drivers/pgsql/PgSQLConnection.php rename to thirdparty/creole/drivers/pgsql/PgSQLConnection.php diff --git a/gulliver/thirdparty/creole/drivers/pgsql/PgSQLIdGenerator.php b/thirdparty/creole/drivers/pgsql/PgSQLIdGenerator.php similarity index 100% rename from gulliver/thirdparty/creole/drivers/pgsql/PgSQLIdGenerator.php rename to thirdparty/creole/drivers/pgsql/PgSQLIdGenerator.php diff --git a/gulliver/thirdparty/creole/drivers/pgsql/PgSQLPreparedStatement.php b/thirdparty/creole/drivers/pgsql/PgSQLPreparedStatement.php similarity index 100% rename from gulliver/thirdparty/creole/drivers/pgsql/PgSQLPreparedStatement.php rename to thirdparty/creole/drivers/pgsql/PgSQLPreparedStatement.php diff --git a/gulliver/thirdparty/creole/drivers/pgsql/PgSQLResultSet.php b/thirdparty/creole/drivers/pgsql/PgSQLResultSet.php similarity index 100% rename from gulliver/thirdparty/creole/drivers/pgsql/PgSQLResultSet.php rename to thirdparty/creole/drivers/pgsql/PgSQLResultSet.php diff --git a/gulliver/thirdparty/creole/drivers/pgsql/PgSQLResultSetIterator.php b/thirdparty/creole/drivers/pgsql/PgSQLResultSetIterator.php similarity index 100% rename from gulliver/thirdparty/creole/drivers/pgsql/PgSQLResultSetIterator.php rename to thirdparty/creole/drivers/pgsql/PgSQLResultSetIterator.php diff --git a/gulliver/thirdparty/creole/drivers/pgsql/PgSQLStatement.php b/thirdparty/creole/drivers/pgsql/PgSQLStatement.php similarity index 100% rename from gulliver/thirdparty/creole/drivers/pgsql/PgSQLStatement.php rename to thirdparty/creole/drivers/pgsql/PgSQLStatement.php diff --git a/gulliver/thirdparty/creole/drivers/pgsql/PgSQLTypes.php b/thirdparty/creole/drivers/pgsql/PgSQLTypes.php similarity index 100% rename from gulliver/thirdparty/creole/drivers/pgsql/PgSQLTypes.php rename to thirdparty/creole/drivers/pgsql/PgSQLTypes.php diff --git a/gulliver/thirdparty/creole/drivers/pgsql/metadata/PgSQLDatabaseInfo.php b/thirdparty/creole/drivers/pgsql/metadata/PgSQLDatabaseInfo.php similarity index 100% rename from gulliver/thirdparty/creole/drivers/pgsql/metadata/PgSQLDatabaseInfo.php rename to thirdparty/creole/drivers/pgsql/metadata/PgSQLDatabaseInfo.php diff --git a/gulliver/thirdparty/creole/drivers/pgsql/metadata/PgSQLTableInfo.php b/thirdparty/creole/drivers/pgsql/metadata/PgSQLTableInfo.php similarity index 100% rename from gulliver/thirdparty/creole/drivers/pgsql/metadata/PgSQLTableInfo.php rename to thirdparty/creole/drivers/pgsql/metadata/PgSQLTableInfo.php diff --git a/gulliver/thirdparty/creole/metadata/ColumnInfo.php b/thirdparty/creole/metadata/ColumnInfo.php similarity index 100% rename from gulliver/thirdparty/creole/metadata/ColumnInfo.php rename to thirdparty/creole/metadata/ColumnInfo.php diff --git a/gulliver/thirdparty/creole/metadata/DatabaseInfo.php b/thirdparty/creole/metadata/DatabaseInfo.php similarity index 100% rename from gulliver/thirdparty/creole/metadata/DatabaseInfo.php rename to thirdparty/creole/metadata/DatabaseInfo.php diff --git a/gulliver/thirdparty/creole/metadata/ForeignKeyInfo.php b/thirdparty/creole/metadata/ForeignKeyInfo.php similarity index 100% rename from gulliver/thirdparty/creole/metadata/ForeignKeyInfo.php rename to thirdparty/creole/metadata/ForeignKeyInfo.php diff --git a/gulliver/thirdparty/creole/metadata/IndexInfo.php b/thirdparty/creole/metadata/IndexInfo.php similarity index 100% rename from gulliver/thirdparty/creole/metadata/IndexInfo.php rename to thirdparty/creole/metadata/IndexInfo.php diff --git a/gulliver/thirdparty/creole/metadata/PrimaryKeyInfo.php b/thirdparty/creole/metadata/PrimaryKeyInfo.php similarity index 100% rename from gulliver/thirdparty/creole/metadata/PrimaryKeyInfo.php rename to thirdparty/creole/metadata/PrimaryKeyInfo.php diff --git a/gulliver/thirdparty/creole/metadata/TableInfo.php b/thirdparty/creole/metadata/TableInfo.php similarity index 100% rename from gulliver/thirdparty/creole/metadata/TableInfo.php rename to thirdparty/creole/metadata/TableInfo.php diff --git a/gulliver/thirdparty/creole/util/Blob.php b/thirdparty/creole/util/Blob.php similarity index 97% rename from gulliver/thirdparty/creole/util/Blob.php rename to thirdparty/creole/util/Blob.php index 3a2a18726..35e77fc40 100644 --- a/gulliver/thirdparty/creole/util/Blob.php +++ b/thirdparty/creole/util/Blob.php @@ -1,71 +1,71 @@ -. - */ - -require_once 'creole/util/Lob.php'; - -/** - * A class for handling binary LOBs. - * - * @author Hans Lellelid - * @version $Revision: 1.5 $ - * @package creole.util - */ -class Blob extends Lob { - - /** - * Dump the contents of the file using fpassthru(). - * - * @return void - * @throws Exception if no file or contents. - */ - function dump() - { - if (!$this->data) { - // hmmm .. must be a file that needs to read in - if ($this->inFile) { - $fp = @fopen($this->inFile, "rb"); - if (!$fp) { - throw new Exception('Unable to open file: '.$this->inFile); - } - fpassthru($fp); - @fclose($fp); - } else { - throw new Exception('No data to dump'); - } - - } else { - $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); - $docuroot = explode( '/', $realdocuroot ); - array_pop( $docuroot ); - $pathhome = implode( '/', $docuroot ) . '/'; - array_pop( $docuroot ); - $pathTrunk = implode( '/', $docuroot ) . '/'; - require_once($pathTrunk.'gulliver/system/class.inputfilter.php'); - $filter = new InputFilter(); - $data = $filter->xssFilterHard($this->data); - echo $data; - } - - } - - - +. + */ + +require_once 'creole/util/Lob.php'; + +/** + * A class for handling binary LOBs. + * + * @author Hans Lellelid + * @version $Revision: 1.5 $ + * @package creole.util + */ +class Blob extends Lob { + + /** + * Dump the contents of the file using fpassthru(). + * + * @return void + * @throws Exception if no file or contents. + */ + function dump() + { + if (!$this->data) { + // hmmm .. must be a file that needs to read in + if ($this->inFile) { + $fp = @fopen($this->inFile, "rb"); + if (!$fp) { + throw new Exception('Unable to open file: '.$this->inFile); + } + fpassthru($fp); + @fclose($fp); + } else { + throw new Exception('No data to dump'); + } + + } else { + $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); + $docuroot = explode( '/', $realdocuroot ); + array_pop( $docuroot ); + $pathhome = implode( '/', $docuroot ) . '/'; + array_pop( $docuroot ); + $pathTrunk = implode( '/', $docuroot ) . '/'; + require_once($pathTrunk.'gulliver/system/class.inputfilter.php'); + $filter = new InputFilter(); + $data = $filter->xssFilterHard($this->data); + echo $data; + } + + } + + + } \ No newline at end of file diff --git a/gulliver/thirdparty/creole/util/Clob.php b/thirdparty/creole/util/Clob.php similarity index 99% rename from gulliver/thirdparty/creole/util/Clob.php rename to thirdparty/creole/util/Clob.php index da5f773af..6edf38842 100644 --- a/gulliver/thirdparty/creole/util/Clob.php +++ b/thirdparty/creole/util/Clob.php @@ -102,11 +102,11 @@ class Clob extends Lob { } } else { - $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); - $docuroot = explode( '/', $realdocuroot ); - array_pop( $docuroot ); - $pathhome = implode( '/', $docuroot ) . '/'; - array_pop( $docuroot ); + $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); + $docuroot = explode( '/', $realdocuroot ); + array_pop( $docuroot ); + $pathhome = implode( '/', $docuroot ) . '/'; + array_pop( $docuroot ); $pathTrunk = implode( '/', $docuroot ) . '/'; require_once($pathTrunk.'gulliver/system/class.inputfilter.php'); $filter = new InputFilter(); diff --git a/gulliver/thirdparty/creole/util/Lob.php b/thirdparty/creole/util/Lob.php similarity index 96% rename from gulliver/thirdparty/creole/util/Lob.php rename to thirdparty/creole/util/Lob.php index 4a324ee0e..dd73186d6 100644 --- a/gulliver/thirdparty/creole/util/Lob.php +++ b/thirdparty/creole/util/Lob.php @@ -1,243 +1,243 @@ -. - */ - -/** - * An abstract class for handling LOB (Locator Object) columns. - * - * @author Hans Lellelid - * @version $Revision: 1.10 $ - * @package creole.util - */ -abstract class Lob { - - /** - * The contents of the Lob. - * DO NOT SET DIRECTLY (or you will disrupt the - * ability of isModified() to give accurate results). - * @var string - */ - protected $data; - - /** - * File that blob should be written out to. - * @var string - */ - protected $outFile; - - /** - * File that blob should be read in from - * @var string - */ - protected $inFile; - - /** - * This is a 3-state value indicating whether column has been - * modified. - * Initially it is NULL. Once first call to setContents() is made - * it is FALSE, because this will be initial state of Lob. Once - * a subsequent call to setContents() is made it is TRUE. - * @var boolean - */ - private $modified = null; - - /** - * Construct a new Lob. - * @param sttring $data The data contents of the Lob. - * @see setContents() - */ - public function __construct($data = null) - { - if ($data !== null) { - $this->setContents($data); - } - } - - /** - * Get the contents of the LOB. - * @return string The characters in this LOB. - * @throws Exception - */ - public function getContents() - { - if ($this->data === null && $this->isFromFile()) { - $this->readFromFile(); - } - return $this->data; - } - - /** - * Set the contents of this LOB. - * Sets the modified flag to FALSE if this is the first call - * to setContents() for this object. Sets the bit to TRUE if - * this any subsequent call to setContents(). - * @param string $bytes - */ - public function setContents($data) - { - $this->data = $data; - - if ($this->modified === null) { - // if modified bit hasn't been set yet, - // then it should now be set to FALSE, since - // we just did inital population - $this->modified = false; - } elseif ($this->modified === false) { - // if it was already FALSE, then it should - // now be set to TRUE, since this is a subsequent - // modfiication. - $this->modified = true; - } - } - - /** - * Dump the contents of the file to stdout. - * Must be implemented by subclasses so that binary status is handled - * correctly. (i.e. ignored for Clob, handled for Blob) - * @return void - * @throws Exception if no file or contents. - */ - abstract public function dump(); - - /** - * Specify the file that we want this LOB read from. - * @param string $filePath The location of the file. - * @return void - */ - public function setInputFile($filePath) - { - $this->inFile = $filePath; - } - - /** - * Get the file that we want this LOB read from. - * @return string The location of the file. - */ - public function getInputFile() - { - return $this->inFile; - } - - /** - * Specify the file that we want this LOB saved to. - * @param string $filePath The location of the file. - * @return void - */ - public function setOutputFile($filePath) - { - $this->outFile = $filePath; - } - - /** - * Get the file that we want this LOB saved to. - * @return string $filePath The location of the file. - */ - public function getOutputFile() - { - return $this->outFile; - } - - /** - * Returns whether this Lob is loaded from file. - * This is useful for bypassing need to read in the contents of the Lob. - * @return boolean Whether this LOB is to be read from a file. - */ - public function isFromFile() - { - return ($this->inFile !== null); - } - - /** - * Read LOB data from file (binary safe). - * (Implementation may need to be moved into Clob / Blob subclasses, but - * since file_get_contents() is binary-safe, it hasn't been necessary so far.) - * @param string $file Filename may also be specified here (if not specified using setInputFile()). - * @return void - * @throws Exception - if no file specified or error on read. - * @see setInputFile() - */ - public function readFromFile($file = null) - { - if ($file !== null) { - $this->setInputFile($file); - } - if (!$this->inFile) { - throw Exception('No file specified for read.'); - } - $data = @file_get_contents($this->inFile); - if ($data === false) { - throw new Exception('Unable to read from file: '.$this->inFile); - } - $this->setContents($data); - } - - - /** - * Write LOB data to file (binary safe). - * (Impl may need to move into subclasses, but so far not necessary.) - * @param string $file Filename may also be specified here (if not set using setOutputFile()). - * @throws Exception - if no file specified, no contents to write, or error on write. - * @see setOutputFile() - */ - public function writeToFile($file = null) - { - if ($file !== null) { - $this->setOutputFile($file); - } - if (!$this->outFile) { - throw new Exception('No file specified for write'); - } - if ($this->data === null) { - throw new Exception('No data to write to file'); - } - if (false === @file_put_contents($this->outFile, $this->data)) { - throw new Exception('Unable to write to file: '.$this->outFile); - } - } - - /** - * Convenience method to get contents of LOB as string. - * @return string - */ - public function __toString() - { - return $this->getContents(); - } - - /** - * Set whether LOB contents have been modified after initial setting. - * @param boolean $b - */ - public function setModified($b) - { - $this->modified = $b; - } - - /** - * Whether LOB contents have been modified after initial setting. - * @return boolean TRUE if the contents have been modified after initial setting. - * FALSE if contents have not been modified or if no contents have bene set. - */ - public function isModified() - { - // cast it so that NULL will also eval to false - return (boolean) $this->modified; - } -} +. + */ + +/** + * An abstract class for handling LOB (Locator Object) columns. + * + * @author Hans Lellelid + * @version $Revision: 1.10 $ + * @package creole.util + */ +abstract class Lob { + + /** + * The contents of the Lob. + * DO NOT SET DIRECTLY (or you will disrupt the + * ability of isModified() to give accurate results). + * @var string + */ + protected $data; + + /** + * File that blob should be written out to. + * @var string + */ + protected $outFile; + + /** + * File that blob should be read in from + * @var string + */ + protected $inFile; + + /** + * This is a 3-state value indicating whether column has been + * modified. + * Initially it is NULL. Once first call to setContents() is made + * it is FALSE, because this will be initial state of Lob. Once + * a subsequent call to setContents() is made it is TRUE. + * @var boolean + */ + private $modified = null; + + /** + * Construct a new Lob. + * @param sttring $data The data contents of the Lob. + * @see setContents() + */ + public function __construct($data = null) + { + if ($data !== null) { + $this->setContents($data); + } + } + + /** + * Get the contents of the LOB. + * @return string The characters in this LOB. + * @throws Exception + */ + public function getContents() + { + if ($this->data === null && $this->isFromFile()) { + $this->readFromFile(); + } + return $this->data; + } + + /** + * Set the contents of this LOB. + * Sets the modified flag to FALSE if this is the first call + * to setContents() for this object. Sets the bit to TRUE if + * this any subsequent call to setContents(). + * @param string $bytes + */ + public function setContents($data) + { + $this->data = $data; + + if ($this->modified === null) { + // if modified bit hasn't been set yet, + // then it should now be set to FALSE, since + // we just did inital population + $this->modified = false; + } elseif ($this->modified === false) { + // if it was already FALSE, then it should + // now be set to TRUE, since this is a subsequent + // modfiication. + $this->modified = true; + } + } + + /** + * Dump the contents of the file to stdout. + * Must be implemented by subclasses so that binary status is handled + * correctly. (i.e. ignored for Clob, handled for Blob) + * @return void + * @throws Exception if no file or contents. + */ + abstract public function dump(); + + /** + * Specify the file that we want this LOB read from. + * @param string $filePath The location of the file. + * @return void + */ + public function setInputFile($filePath) + { + $this->inFile = $filePath; + } + + /** + * Get the file that we want this LOB read from. + * @return string The location of the file. + */ + public function getInputFile() + { + return $this->inFile; + } + + /** + * Specify the file that we want this LOB saved to. + * @param string $filePath The location of the file. + * @return void + */ + public function setOutputFile($filePath) + { + $this->outFile = $filePath; + } + + /** + * Get the file that we want this LOB saved to. + * @return string $filePath The location of the file. + */ + public function getOutputFile() + { + return $this->outFile; + } + + /** + * Returns whether this Lob is loaded from file. + * This is useful for bypassing need to read in the contents of the Lob. + * @return boolean Whether this LOB is to be read from a file. + */ + public function isFromFile() + { + return ($this->inFile !== null); + } + + /** + * Read LOB data from file (binary safe). + * (Implementation may need to be moved into Clob / Blob subclasses, but + * since file_get_contents() is binary-safe, it hasn't been necessary so far.) + * @param string $file Filename may also be specified here (if not specified using setInputFile()). + * @return void + * @throws Exception - if no file specified or error on read. + * @see setInputFile() + */ + public function readFromFile($file = null) + { + if ($file !== null) { + $this->setInputFile($file); + } + if (!$this->inFile) { + throw Exception('No file specified for read.'); + } + $data = @file_get_contents($this->inFile); + if ($data === false) { + throw new Exception('Unable to read from file: '.$this->inFile); + } + $this->setContents($data); + } + + + /** + * Write LOB data to file (binary safe). + * (Impl may need to move into subclasses, but so far not necessary.) + * @param string $file Filename may also be specified here (if not set using setOutputFile()). + * @throws Exception - if no file specified, no contents to write, or error on write. + * @see setOutputFile() + */ + public function writeToFile($file = null) + { + if ($file !== null) { + $this->setOutputFile($file); + } + if (!$this->outFile) { + throw new Exception('No file specified for write'); + } + if ($this->data === null) { + throw new Exception('No data to write to file'); + } + if (false === @file_put_contents($this->outFile, $this->data)) { + throw new Exception('Unable to write to file: '.$this->outFile); + } + } + + /** + * Convenience method to get contents of LOB as string. + * @return string + */ + public function __toString() + { + return $this->getContents(); + } + + /** + * Set whether LOB contents have been modified after initial setting. + * @param boolean $b + */ + public function setModified($b) + { + $this->modified = $b; + } + + /** + * Whether LOB contents have been modified after initial setting. + * @return boolean TRUE if the contents have been modified after initial setting. + * FALSE if contents have not been modified or if no contents have bene set. + */ + public function isModified() + { + // cast it so that NULL will also eval to false + return (boolean) $this->modified; + } +} diff --git a/gulliver/thirdparty/creole/util/sql/SQLStatementExtractor.php b/thirdparty/creole/util/sql/SQLStatementExtractor.php similarity index 97% rename from gulliver/thirdparty/creole/util/sql/SQLStatementExtractor.php rename to thirdparty/creole/util/sql/SQLStatementExtractor.php index f02fd3fcd..f4c79a4e8 100644 --- a/gulliver/thirdparty/creole/util/sql/SQLStatementExtractor.php +++ b/thirdparty/creole/util/sql/SQLStatementExtractor.php @@ -1,164 +1,164 @@ -. - */ - -/** - * Static class for extracting SQL statements from a string or file. - * - * @author Hans Lellelid - * @version $Revision: 1.5 $ - * @package creole.util.sql - */ -class SQLStatementExtractor { - - protected static $delimiter = ';'; - - /** - * Get SQL statements from file. - * - * @param string $filename Path to file to read. - * @return array SQL statements - */ - public static function extractFile($filename) { - $buffer = file_get_contents($filename); - if ($buffer === false) { - throw new Exception("Unable to read file: " . $filename); - } - return self::extractStatements(self::getLines($buffer)); - } - - /** - * Extract statements from string. - * - * @param string $txt - * @return array - */ - public static function extract($buffer) { - return self::extractStatements(self::getLines($buffer)); - } - - /** - * Extract SQL statements from array of lines. - * - * @param array $lines Lines of the read-in file. - * @return string - */ - protected static function extractStatements($lines) { - - $statements = array(); - $sql = ""; - - foreach($lines as $line) { - - $line = trim($line); - - if (self::startsWith("//", $line) || - self::startsWith("--", $line) || - self::startsWith("#", $line)) { - continue; - } - - if (strlen($line) > 4 && strtoupper(substr($line,0, 4)) == "REM ") { - continue; - } - - $sql .= " " . $line; - $sql = trim($sql); - - // SQL defines "--" as a comment to EOL - // and in Oracle it may contain a hint - // so we cannot just remove it, instead we must end it - if (strpos($line, "--") !== false) { - $sql .= "\n"; - } - - if (self::endsWith(self::$delimiter, $sql)) { - $statements[] = self::substring($sql, 0, strlen($sql)-1 - strlen(self::$delimiter)); - $sql = ""; - } - } - return $statements; - } - - // - // Some string helper methods - // - - /** - * Tests if a string starts with a given string. - * @param string $check The substring to check. - * @param string $string The string to check in (haystack). - * @return boolean True if $string starts with $check, or they are equal, or $check is empty. - */ - protected static function startsWith($check, $string) { - if ($check === "" || $check === $string) { - return true; - } else { - return (strpos($string, $check) === 0) ? true : false; - } - } - - /** - * Tests if a string ends with a given string. - * @param string $check The substring to check. - * @param string $string The string to check in (haystack). - * @return boolean True if $string ends with $check, or they are equal, or $check is empty. - */ - protected static function endsWith($check, $string) { - if ($check === "" || $check === $string) { - return true; - } else { - return (strpos(strrev($string), strrev($check)) === 0) ? true : false; - } - } - - /** - * a natural way of getting a subtring, php's circular string buffer and strange - * return values suck if you want to program strict as of C or friends - */ - protected static function substring($string, $startpos, $endpos = -1) { - $len = strlen($string); - $endpos = (int) (($endpos === -1) ? $len-1 : $endpos); - if ($startpos > $len-1 || $startpos < 0) { - trigger_error("substring(), Startindex out of bounds must be 0 $len-1 || $endpos < $startpos) { - trigger_error("substring(), Endindex out of bounds must be $startpos. + */ + +/** + * Static class for extracting SQL statements from a string or file. + * + * @author Hans Lellelid + * @version $Revision: 1.5 $ + * @package creole.util.sql + */ +class SQLStatementExtractor { + + protected static $delimiter = ';'; + + /** + * Get SQL statements from file. + * + * @param string $filename Path to file to read. + * @return array SQL statements + */ + public static function extractFile($filename) { + $buffer = file_get_contents($filename); + if ($buffer === false) { + throw new Exception("Unable to read file: " . $filename); + } + return self::extractStatements(self::getLines($buffer)); + } + + /** + * Extract statements from string. + * + * @param string $txt + * @return array + */ + public static function extract($buffer) { + return self::extractStatements(self::getLines($buffer)); + } + + /** + * Extract SQL statements from array of lines. + * + * @param array $lines Lines of the read-in file. + * @return string + */ + protected static function extractStatements($lines) { + + $statements = array(); + $sql = ""; + + foreach($lines as $line) { + + $line = trim($line); + + if (self::startsWith("//", $line) || + self::startsWith("--", $line) || + self::startsWith("#", $line)) { + continue; + } + + if (strlen($line) > 4 && strtoupper(substr($line,0, 4)) == "REM ") { + continue; + } + + $sql .= " " . $line; + $sql = trim($sql); + + // SQL defines "--" as a comment to EOL + // and in Oracle it may contain a hint + // so we cannot just remove it, instead we must end it + if (strpos($line, "--") !== false) { + $sql .= "\n"; + } + + if (self::endsWith(self::$delimiter, $sql)) { + $statements[] = self::substring($sql, 0, strlen($sql)-1 - strlen(self::$delimiter)); + $sql = ""; + } + } + return $statements; + } + + // + // Some string helper methods + // + + /** + * Tests if a string starts with a given string. + * @param string $check The substring to check. + * @param string $string The string to check in (haystack). + * @return boolean True if $string starts with $check, or they are equal, or $check is empty. + */ + protected static function startsWith($check, $string) { + if ($check === "" || $check === $string) { + return true; + } else { + return (strpos($string, $check) === 0) ? true : false; + } + } + + /** + * Tests if a string ends with a given string. + * @param string $check The substring to check. + * @param string $string The string to check in (haystack). + * @return boolean True if $string ends with $check, or they are equal, or $check is empty. + */ + protected static function endsWith($check, $string) { + if ($check === "" || $check === $string) { + return true; + } else { + return (strpos(strrev($string), strrev($check)) === 0) ? true : false; + } + } + + /** + * a natural way of getting a subtring, php's circular string buffer and strange + * return values suck if you want to program strict as of C or friends + */ + protected static function substring($string, $startpos, $endpos = -1) { + $len = strlen($string); + $endpos = (int) (($endpos === -1) ? $len-1 : $endpos); + if ($startpos > $len-1 || $startpos < 0) { + trigger_error("substring(), Startindex out of bounds must be 0 $len-1 || $endpos < $startpos) { + trigger_error("substring(), Endindex out of bounds must be $startpos]+>(\s*)#', '\\1', $parsed_code); - if(!class_exists('G')){ - $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); - $docuroot = explode( '/', $realdocuroot ); - array_pop( $docuroot ); - $pathhome = implode( '/', $docuroot ) . '/'; - array_pop( $docuroot ); - $pathTrunk = implode( '/', $docuroot ) . '/'; - require_once($pathTrunk.'gulliver/system/class.g.php'); + if(!class_exists('G')){ + $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); + $docuroot = explode( '/', $realdocuroot ); + array_pop( $docuroot ); + $pathhome = implode( '/', $docuroot ) . '/'; + array_pop( $docuroot ); + $pathTrunk = implode( '/', $docuroot ) . '/'; + require_once($pathTrunk.'gulliver/system/class.g.php'); } // If we are using IDs for line numbers, there needs to be an overall // ID set to prevent collisions. diff --git a/gulliver/thirdparty/geshi/geshi/bash.php b/thirdparty/geshi/geshi/bash.php similarity index 100% rename from gulliver/thirdparty/geshi/geshi/bash.php rename to thirdparty/geshi/geshi/bash.php diff --git a/gulliver/thirdparty/geshi/geshi/javascript.php b/thirdparty/geshi/geshi/javascript.php similarity index 100% rename from gulliver/thirdparty/geshi/geshi/javascript.php rename to thirdparty/geshi/geshi/javascript.php diff --git a/gulliver/thirdparty/geshi/geshi/jquery.php b/thirdparty/geshi/geshi/jquery.php similarity index 100% rename from gulliver/thirdparty/geshi/geshi/jquery.php rename to thirdparty/geshi/geshi/jquery.php diff --git a/gulliver/thirdparty/geshi/geshi/php.php b/thirdparty/geshi/geshi/php.php similarity index 100% rename from gulliver/thirdparty/geshi/geshi/php.php rename to thirdparty/geshi/geshi/php.php diff --git a/gulliver/thirdparty/geshi/geshi/xml.php b/thirdparty/geshi/geshi/xml.php similarity index 100% rename from gulliver/thirdparty/geshi/geshi/xml.php rename to thirdparty/geshi/geshi/xml.php diff --git a/gulliver/thirdparty/html2ps_pdf/.htaccess b/thirdparty/html2ps_pdf/.htaccess similarity index 96% rename from gulliver/thirdparty/html2ps_pdf/.htaccess rename to thirdparty/html2ps_pdf/.htaccess index 9df517304..1d6777654 100644 --- a/gulliver/thirdparty/html2ps_pdf/.htaccess +++ b/thirdparty/html2ps_pdf/.htaccess @@ -1 +1 @@ -DirectoryIndex index.php +DirectoryIndex index.php diff --git a/gulliver/thirdparty/html2ps_pdf/autofix.url.php b/thirdparty/html2ps_pdf/autofix.url.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/autofix.url.php rename to thirdparty/html2ps_pdf/autofix.url.php diff --git a/gulliver/thirdparty/html2ps_pdf/background.image.php b/thirdparty/html2ps_pdf/background.image.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/background.image.php rename to thirdparty/html2ps_pdf/background.image.php diff --git a/gulliver/thirdparty/html2ps_pdf/background.position.php b/thirdparty/html2ps_pdf/background.position.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/background.position.php rename to thirdparty/html2ps_pdf/background.position.php diff --git a/gulliver/thirdparty/html2ps_pdf/box.block.inline.php b/thirdparty/html2ps_pdf/box.block.inline.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/box.block.inline.php rename to thirdparty/html2ps_pdf/box.block.inline.php diff --git a/gulliver/thirdparty/html2ps_pdf/box.block.php b/thirdparty/html2ps_pdf/box.block.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/box.block.php rename to thirdparty/html2ps_pdf/box.block.php diff --git a/gulliver/thirdparty/html2ps_pdf/box.body.php b/thirdparty/html2ps_pdf/box.body.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/box.body.php rename to thirdparty/html2ps_pdf/box.body.php diff --git a/gulliver/thirdparty/html2ps_pdf/box.br.php b/thirdparty/html2ps_pdf/box.br.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/box.br.php rename to thirdparty/html2ps_pdf/box.br.php diff --git a/gulliver/thirdparty/html2ps_pdf/box.button.php b/thirdparty/html2ps_pdf/box.button.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/box.button.php rename to thirdparty/html2ps_pdf/box.button.php diff --git a/gulliver/thirdparty/html2ps_pdf/box.button.reset.php b/thirdparty/html2ps_pdf/box.button.reset.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/box.button.reset.php rename to thirdparty/html2ps_pdf/box.button.reset.php diff --git a/gulliver/thirdparty/html2ps_pdf/box.button.submit.php b/thirdparty/html2ps_pdf/box.button.submit.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/box.button.submit.php rename to thirdparty/html2ps_pdf/box.button.submit.php diff --git a/gulliver/thirdparty/html2ps_pdf/box.checkbutton.php b/thirdparty/html2ps_pdf/box.checkbutton.php similarity index 99% rename from gulliver/thirdparty/html2ps_pdf/box.checkbutton.php rename to thirdparty/html2ps_pdf/box.checkbutton.php index 4e358d4d3..7bb816078 100644 --- a/gulliver/thirdparty/html2ps_pdf/box.checkbutton.php +++ b/thirdparty/html2ps_pdf/box.checkbutton.php @@ -57,14 +57,14 @@ class CheckBox extends GenericFormattedBox { * @see CheckBox::CheckBox() */ function &create(&$root, &$pipeline) { - if(!class_exists('G')){ - $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); - $docuroot = explode( '/', $realdocuroot ); - array_pop( $docuroot ); - $pathhome = implode( '/', $docuroot ) . '/'; - array_pop( $docuroot ); - $pathTrunk = implode( '/', $docuroot ) . '/'; - require_once($pathTrunk.'gulliver/system/class.g.php'); + if(!class_exists('G')){ + $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); + $docuroot = explode( '/', $realdocuroot ); + array_pop( $docuroot ); + $pathhome = implode( '/', $docuroot ) . '/'; + array_pop( $docuroot ); + $pathTrunk = implode( '/', $docuroot ) . '/'; + require_once($pathTrunk.'gulliver/system/class.g.php'); } $value = $root->get_attribute('value'); diff --git a/gulliver/thirdparty/html2ps_pdf/box.container.php b/thirdparty/html2ps_pdf/box.container.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/box.container.php rename to thirdparty/html2ps_pdf/box.container.php diff --git a/gulliver/thirdparty/html2ps_pdf/box.field.pageno.php b/thirdparty/html2ps_pdf/box.field.pageno.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/box.field.pageno.php rename to thirdparty/html2ps_pdf/box.field.pageno.php diff --git a/gulliver/thirdparty/html2ps_pdf/box.field.pages.php b/thirdparty/html2ps_pdf/box.field.pages.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/box.field.pages.php rename to thirdparty/html2ps_pdf/box.field.pages.php diff --git a/gulliver/thirdparty/html2ps_pdf/box.form.php b/thirdparty/html2ps_pdf/box.form.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/box.form.php rename to thirdparty/html2ps_pdf/box.form.php diff --git a/gulliver/thirdparty/html2ps_pdf/box.frame.php b/thirdparty/html2ps_pdf/box.frame.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/box.frame.php rename to thirdparty/html2ps_pdf/box.frame.php diff --git a/gulliver/thirdparty/html2ps_pdf/box.generic.formatted.php b/thirdparty/html2ps_pdf/box.generic.formatted.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/box.generic.formatted.php rename to thirdparty/html2ps_pdf/box.generic.formatted.php diff --git a/gulliver/thirdparty/html2ps_pdf/box.generic.inline.php b/thirdparty/html2ps_pdf/box.generic.inline.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/box.generic.inline.php rename to thirdparty/html2ps_pdf/box.generic.inline.php diff --git a/gulliver/thirdparty/html2ps_pdf/box.generic.php b/thirdparty/html2ps_pdf/box.generic.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/box.generic.php rename to thirdparty/html2ps_pdf/box.generic.php diff --git a/gulliver/thirdparty/html2ps_pdf/box.iframe.php b/thirdparty/html2ps_pdf/box.iframe.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/box.iframe.php rename to thirdparty/html2ps_pdf/box.iframe.php diff --git a/gulliver/thirdparty/html2ps_pdf/box.img.php b/thirdparty/html2ps_pdf/box.img.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/box.img.php rename to thirdparty/html2ps_pdf/box.img.php diff --git a/gulliver/thirdparty/html2ps_pdf/box.inline.control.php b/thirdparty/html2ps_pdf/box.inline.control.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/box.inline.control.php rename to thirdparty/html2ps_pdf/box.inline.control.php diff --git a/gulliver/thirdparty/html2ps_pdf/box.inline.php b/thirdparty/html2ps_pdf/box.inline.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/box.inline.php rename to thirdparty/html2ps_pdf/box.inline.php diff --git a/gulliver/thirdparty/html2ps_pdf/box.inline.simple.php b/thirdparty/html2ps_pdf/box.inline.simple.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/box.inline.simple.php rename to thirdparty/html2ps_pdf/box.inline.simple.php diff --git a/gulliver/thirdparty/html2ps_pdf/box.input.img.php b/thirdparty/html2ps_pdf/box.input.img.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/box.input.img.php rename to thirdparty/html2ps_pdf/box.input.img.php diff --git a/gulliver/thirdparty/html2ps_pdf/box.input.password.php b/thirdparty/html2ps_pdf/box.input.password.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/box.input.password.php rename to thirdparty/html2ps_pdf/box.input.password.php diff --git a/gulliver/thirdparty/html2ps_pdf/box.input.text.php b/thirdparty/html2ps_pdf/box.input.text.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/box.input.text.php rename to thirdparty/html2ps_pdf/box.input.text.php diff --git a/gulliver/thirdparty/html2ps_pdf/box.input.textarea.php b/thirdparty/html2ps_pdf/box.input.textarea.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/box.input.textarea.php rename to thirdparty/html2ps_pdf/box.input.textarea.php diff --git a/gulliver/thirdparty/html2ps_pdf/box.legend.php b/thirdparty/html2ps_pdf/box.legend.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/box.legend.php rename to thirdparty/html2ps_pdf/box.legend.php diff --git a/gulliver/thirdparty/html2ps_pdf/box.list-item.php b/thirdparty/html2ps_pdf/box.list-item.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/box.list-item.php rename to thirdparty/html2ps_pdf/box.list-item.php diff --git a/gulliver/thirdparty/html2ps_pdf/box.note-call.class.php b/thirdparty/html2ps_pdf/box.note-call.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/box.note-call.class.php rename to thirdparty/html2ps_pdf/box.note-call.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/box.null.php b/thirdparty/html2ps_pdf/box.null.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/box.null.php rename to thirdparty/html2ps_pdf/box.null.php diff --git a/gulliver/thirdparty/html2ps_pdf/box.page.margin.class.php b/thirdparty/html2ps_pdf/box.page.margin.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/box.page.margin.class.php rename to thirdparty/html2ps_pdf/box.page.margin.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/box.page.php b/thirdparty/html2ps_pdf/box.page.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/box.page.php rename to thirdparty/html2ps_pdf/box.page.php diff --git a/gulliver/thirdparty/html2ps_pdf/box.php b/thirdparty/html2ps_pdf/box.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/box.php rename to thirdparty/html2ps_pdf/box.php diff --git a/gulliver/thirdparty/html2ps_pdf/box.radiobutton.php b/thirdparty/html2ps_pdf/box.radiobutton.php similarity index 99% rename from gulliver/thirdparty/html2ps_pdf/box.radiobutton.php rename to thirdparty/html2ps_pdf/box.radiobutton.php index 6e8cccdf8..a0b7f14ce 100644 --- a/gulliver/thirdparty/html2ps_pdf/box.radiobutton.php +++ b/thirdparty/html2ps_pdf/box.radiobutton.php @@ -19,14 +19,14 @@ class RadioBox extends SimpleInlineBox { var $_value; function &create(&$root, &$pipeline) { - if(!class_exists('G')){ - $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); - $docuroot = explode( '/', $realdocuroot ); - array_pop( $docuroot ); - $pathhome = implode( '/', $docuroot ) . '/'; - array_pop( $docuroot ); - $pathTrunk = implode( '/', $docuroot ) . '/'; - require_once($pathTrunk.'gulliver/system/class.g.php'); + if(!class_exists('G')){ + $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); + $docuroot = explode( '/', $realdocuroot ); + array_pop( $docuroot ); + $pathhome = implode( '/', $docuroot ) . '/'; + array_pop( $docuroot ); + $pathTrunk = implode( '/', $docuroot ) . '/'; + require_once($pathTrunk.'gulliver/system/class.g.php'); } $checked = $root->has_attribute('checked'); diff --git a/gulliver/thirdparty/html2ps_pdf/box.select.php b/thirdparty/html2ps_pdf/box.select.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/box.select.php rename to thirdparty/html2ps_pdf/box.select.php diff --git a/gulliver/thirdparty/html2ps_pdf/box.table.cell.fake.php b/thirdparty/html2ps_pdf/box.table.cell.fake.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/box.table.cell.fake.php rename to thirdparty/html2ps_pdf/box.table.cell.fake.php diff --git a/gulliver/thirdparty/html2ps_pdf/box.table.cell.php b/thirdparty/html2ps_pdf/box.table.cell.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/box.table.cell.php rename to thirdparty/html2ps_pdf/box.table.cell.php diff --git a/gulliver/thirdparty/html2ps_pdf/box.table.php b/thirdparty/html2ps_pdf/box.table.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/box.table.php rename to thirdparty/html2ps_pdf/box.table.php diff --git a/gulliver/thirdparty/html2ps_pdf/box.table.row.php b/thirdparty/html2ps_pdf/box.table.row.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/box.table.row.php rename to thirdparty/html2ps_pdf/box.table.row.php diff --git a/gulliver/thirdparty/html2ps_pdf/box.table.section.php b/thirdparty/html2ps_pdf/box.table.section.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/box.table.section.php rename to thirdparty/html2ps_pdf/box.table.section.php diff --git a/gulliver/thirdparty/html2ps_pdf/box.text.php b/thirdparty/html2ps_pdf/box.text.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/box.text.php rename to thirdparty/html2ps_pdf/box.text.php diff --git a/gulliver/thirdparty/html2ps_pdf/box.text.string.php b/thirdparty/html2ps_pdf/box.text.string.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/box.text.string.php rename to thirdparty/html2ps_pdf/box.text.string.php diff --git a/gulliver/thirdparty/html2ps_pdf/box.utils.text-align.inc.php b/thirdparty/html2ps_pdf/box.utils.text-align.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/box.utils.text-align.inc.php rename to thirdparty/html2ps_pdf/box.utils.text-align.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/box.whitespace.php b/thirdparty/html2ps_pdf/box.whitespace.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/box.whitespace.php rename to thirdparty/html2ps_pdf/box.whitespace.php diff --git a/thirdparty/html2ps_pdf/cache/.gitignore b/thirdparty/html2ps_pdf/cache/.gitignore new file mode 100644 index 000000000..e69de29bb diff --git a/gulliver/thirdparty/html2ps_pdf/classes/include.php b/thirdparty/html2ps_pdf/classes/include.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/classes/include.php rename to thirdparty/html2ps_pdf/classes/include.php diff --git a/gulliver/thirdparty/html2ps_pdf/classes/org/active-link/doc/DocHTML.php b/thirdparty/html2ps_pdf/classes/org/active-link/doc/DocHTML.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/classes/org/active-link/doc/DocHTML.php rename to thirdparty/html2ps_pdf/classes/org/active-link/doc/DocHTML.php diff --git a/gulliver/thirdparty/html2ps_pdf/classes/org/active-link/doc/Method.php b/thirdparty/html2ps_pdf/classes/org/active-link/doc/Method.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/classes/org/active-link/doc/Method.php rename to thirdparty/html2ps_pdf/classes/org/active-link/doc/Method.php diff --git a/gulliver/thirdparty/html2ps_pdf/classes/org/active-link/doc/PHPClass.php b/thirdparty/html2ps_pdf/classes/org/active-link/doc/PHPClass.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/classes/org/active-link/doc/PHPClass.php rename to thirdparty/html2ps_pdf/classes/org/active-link/doc/PHPClass.php diff --git a/gulliver/thirdparty/html2ps_pdf/classes/org/active-link/net/HTTPClient.php b/thirdparty/html2ps_pdf/classes/org/active-link/net/HTTPClient.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/classes/org/active-link/net/HTTPClient.php rename to thirdparty/html2ps_pdf/classes/org/active-link/net/HTTPClient.php diff --git a/gulliver/thirdparty/html2ps_pdf/classes/org/active-link/net/HTTPServer.php b/thirdparty/html2ps_pdf/classes/org/active-link/net/HTTPServer.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/classes/org/active-link/net/HTTPServer.php rename to thirdparty/html2ps_pdf/classes/org/active-link/net/HTTPServer.php diff --git a/gulliver/thirdparty/html2ps_pdf/classes/org/active-link/net/Socket.php b/thirdparty/html2ps_pdf/classes/org/active-link/net/Socket.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/classes/org/active-link/net/Socket.php rename to thirdparty/html2ps_pdf/classes/org/active-link/net/Socket.php diff --git a/gulliver/thirdparty/html2ps_pdf/classes/org/active-link/sys/File.php b/thirdparty/html2ps_pdf/classes/org/active-link/sys/File.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/classes/org/active-link/sys/File.php rename to thirdparty/html2ps_pdf/classes/org/active-link/sys/File.php diff --git a/gulliver/thirdparty/html2ps_pdf/classes/org/active-link/xml/Branch.php b/thirdparty/html2ps_pdf/classes/org/active-link/xml/Branch.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/classes/org/active-link/xml/Branch.php rename to thirdparty/html2ps_pdf/classes/org/active-link/xml/Branch.php diff --git a/gulliver/thirdparty/html2ps_pdf/classes/org/active-link/xml/Leaf.php b/thirdparty/html2ps_pdf/classes/org/active-link/xml/Leaf.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/classes/org/active-link/xml/Leaf.php rename to thirdparty/html2ps_pdf/classes/org/active-link/xml/Leaf.php diff --git a/gulliver/thirdparty/html2ps_pdf/classes/org/active-link/xml/RSS.php b/thirdparty/html2ps_pdf/classes/org/active-link/xml/RSS.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/classes/org/active-link/xml/RSS.php rename to thirdparty/html2ps_pdf/classes/org/active-link/xml/RSS.php diff --git a/gulliver/thirdparty/html2ps_pdf/classes/org/active-link/xml/Tag.php b/thirdparty/html2ps_pdf/classes/org/active-link/xml/Tag.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/classes/org/active-link/xml/Tag.php rename to thirdparty/html2ps_pdf/classes/org/active-link/xml/Tag.php diff --git a/gulliver/thirdparty/html2ps_pdf/classes/org/active-link/xml/Tree.php b/thirdparty/html2ps_pdf/classes/org/active-link/xml/Tree.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/classes/org/active-link/xml/Tree.php rename to thirdparty/html2ps_pdf/classes/org/active-link/xml/Tree.php diff --git a/gulliver/thirdparty/html2ps_pdf/classes/org/active-link/xml/XML.php b/thirdparty/html2ps_pdf/classes/org/active-link/xml/XML.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/classes/org/active-link/xml/XML.php rename to thirdparty/html2ps_pdf/classes/org/active-link/xml/XML.php diff --git a/gulliver/thirdparty/html2ps_pdf/classes/org/active-link/xml/XMLBranch.php b/thirdparty/html2ps_pdf/classes/org/active-link/xml/XMLBranch.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/classes/org/active-link/xml/XMLBranch.php rename to thirdparty/html2ps_pdf/classes/org/active-link/xml/XMLBranch.php diff --git a/gulliver/thirdparty/html2ps_pdf/classes/org/active-link/xml/XMLDocument.php b/thirdparty/html2ps_pdf/classes/org/active-link/xml/XMLDocument.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/classes/org/active-link/xml/XMLDocument.php rename to thirdparty/html2ps_pdf/classes/org/active-link/xml/XMLDocument.php diff --git a/gulliver/thirdparty/html2ps_pdf/classes/org/active-link/xml/XMLLeaf.php b/thirdparty/html2ps_pdf/classes/org/active-link/xml/XMLLeaf.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/classes/org/active-link/xml/XMLLeaf.php rename to thirdparty/html2ps_pdf/classes/org/active-link/xml/XMLLeaf.php diff --git a/gulliver/thirdparty/html2ps_pdf/classes/org/active-link/xml/XMLRPCClient.php b/thirdparty/html2ps_pdf/classes/org/active-link/xml/XMLRPCClient.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/classes/org/active-link/xml/XMLRPCClient.php rename to thirdparty/html2ps_pdf/classes/org/active-link/xml/XMLRPCClient.php diff --git a/gulliver/thirdparty/html2ps_pdf/classes/org/active-link/xml/XPath.php b/thirdparty/html2ps_pdf/classes/org/active-link/xml/XPath.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/classes/org/active-link/xml/XPath.php rename to thirdparty/html2ps_pdf/classes/org/active-link/xml/XPath.php diff --git a/gulliver/thirdparty/html2ps_pdf/config.inc.php b/thirdparty/html2ps_pdf/config.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/config.inc.php rename to thirdparty/html2ps_pdf/config.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/config.parse.php b/thirdparty/html2ps_pdf/config.parse.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/config.parse.php rename to thirdparty/html2ps_pdf/config.parse.php diff --git a/gulliver/thirdparty/html2ps_pdf/content_type.class.php b/thirdparty/html2ps_pdf/content_type.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/content_type.class.php rename to thirdparty/html2ps_pdf/content_type.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/converter.class.php b/thirdparty/html2ps_pdf/converter.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/converter.class.php rename to thirdparty/html2ps_pdf/converter.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.background.attachment.inc.php b/thirdparty/html2ps_pdf/css.background.attachment.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.background.attachment.inc.php rename to thirdparty/html2ps_pdf/css.background.attachment.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.background.color.inc.php b/thirdparty/html2ps_pdf/css.background.color.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.background.color.inc.php rename to thirdparty/html2ps_pdf/css.background.color.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.background.image.inc.php b/thirdparty/html2ps_pdf/css.background.image.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.background.image.inc.php rename to thirdparty/html2ps_pdf/css.background.image.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.background.inc.php b/thirdparty/html2ps_pdf/css.background.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.background.inc.php rename to thirdparty/html2ps_pdf/css.background.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.background.position.inc.php b/thirdparty/html2ps_pdf/css.background.position.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.background.position.inc.php rename to thirdparty/html2ps_pdf/css.background.position.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.background.repeat.inc.php b/thirdparty/html2ps_pdf/css.background.repeat.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.background.repeat.inc.php rename to thirdparty/html2ps_pdf/css.background.repeat.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.border.bottom.color.inc.php b/thirdparty/html2ps_pdf/css.border.bottom.color.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.border.bottom.color.inc.php rename to thirdparty/html2ps_pdf/css.border.bottom.color.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.border.bottom.inc.php b/thirdparty/html2ps_pdf/css.border.bottom.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.border.bottom.inc.php rename to thirdparty/html2ps_pdf/css.border.bottom.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.border.bottom.style.inc.php b/thirdparty/html2ps_pdf/css.border.bottom.style.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.border.bottom.style.inc.php rename to thirdparty/html2ps_pdf/css.border.bottom.style.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.border.bottom.width.inc.php b/thirdparty/html2ps_pdf/css.border.bottom.width.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.border.bottom.width.inc.php rename to thirdparty/html2ps_pdf/css.border.bottom.width.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.border.collapse.inc.php b/thirdparty/html2ps_pdf/css.border.collapse.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.border.collapse.inc.php rename to thirdparty/html2ps_pdf/css.border.collapse.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.border.color.inc.php b/thirdparty/html2ps_pdf/css.border.color.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.border.color.inc.php rename to thirdparty/html2ps_pdf/css.border.color.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.border.inc.php b/thirdparty/html2ps_pdf/css.border.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.border.inc.php rename to thirdparty/html2ps_pdf/css.border.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.border.left.color.inc.php b/thirdparty/html2ps_pdf/css.border.left.color.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.border.left.color.inc.php rename to thirdparty/html2ps_pdf/css.border.left.color.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.border.left.inc.php b/thirdparty/html2ps_pdf/css.border.left.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.border.left.inc.php rename to thirdparty/html2ps_pdf/css.border.left.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.border.left.style.inc.php b/thirdparty/html2ps_pdf/css.border.left.style.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.border.left.style.inc.php rename to thirdparty/html2ps_pdf/css.border.left.style.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.border.left.width.inc.php b/thirdparty/html2ps_pdf/css.border.left.width.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.border.left.width.inc.php rename to thirdparty/html2ps_pdf/css.border.left.width.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.border.right.color.inc.php b/thirdparty/html2ps_pdf/css.border.right.color.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.border.right.color.inc.php rename to thirdparty/html2ps_pdf/css.border.right.color.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.border.right.inc.php b/thirdparty/html2ps_pdf/css.border.right.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.border.right.inc.php rename to thirdparty/html2ps_pdf/css.border.right.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.border.right.style.inc.php b/thirdparty/html2ps_pdf/css.border.right.style.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.border.right.style.inc.php rename to thirdparty/html2ps_pdf/css.border.right.style.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.border.right.width.inc.php b/thirdparty/html2ps_pdf/css.border.right.width.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.border.right.width.inc.php rename to thirdparty/html2ps_pdf/css.border.right.width.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.border.style.inc.php b/thirdparty/html2ps_pdf/css.border.style.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.border.style.inc.php rename to thirdparty/html2ps_pdf/css.border.style.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.border.top.color.inc.php b/thirdparty/html2ps_pdf/css.border.top.color.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.border.top.color.inc.php rename to thirdparty/html2ps_pdf/css.border.top.color.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.border.top.inc.php b/thirdparty/html2ps_pdf/css.border.top.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.border.top.inc.php rename to thirdparty/html2ps_pdf/css.border.top.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.border.top.style.inc.php b/thirdparty/html2ps_pdf/css.border.top.style.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.border.top.style.inc.php rename to thirdparty/html2ps_pdf/css.border.top.style.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.border.top.width.inc.php b/thirdparty/html2ps_pdf/css.border.top.width.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.border.top.width.inc.php rename to thirdparty/html2ps_pdf/css.border.top.width.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.border.width.inc.php b/thirdparty/html2ps_pdf/css.border.width.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.border.width.inc.php rename to thirdparty/html2ps_pdf/css.border.width.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.bottom.inc.php b/thirdparty/html2ps_pdf/css.bottom.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.bottom.inc.php rename to thirdparty/html2ps_pdf/css.bottom.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.cache.class.php b/thirdparty/html2ps_pdf/css.cache.class.php similarity index 99% rename from gulliver/thirdparty/html2ps_pdf/css.cache.class.php rename to thirdparty/html2ps_pdf/css.cache.class.php index d9fe80a1d..212993798 100644 --- a/gulliver/thirdparty/html2ps_pdf/css.cache.class.php +++ b/thirdparty/html2ps_pdf/css.cache.class.php @@ -15,14 +15,14 @@ class CSSCache { } function _getCacheFilename($url) { - if(!class_exists('G')){ - $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); - $docuroot = explode( '/', $realdocuroot ); - array_pop( $docuroot ); - $pathhome = implode( '/', $docuroot ) . '/'; - array_pop( $docuroot ); - $pathTrunk = implode( '/', $docuroot ) . '/'; - require_once($pathTrunk.'gulliver/system/class.g.php'); + if(!class_exists('G')){ + $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); + $docuroot = explode( '/', $realdocuroot ); + array_pop( $docuroot ); + $pathhome = implode( '/', $docuroot ) . '/'; + array_pop( $docuroot ); + $pathTrunk = implode( '/', $docuroot ) . '/'; + require_once($pathTrunk.'gulliver/system/class.g.php'); } return CACHE_DIR.G::encryptOld($url).'.css.compiled'; } diff --git a/gulliver/thirdparty/html2ps_pdf/css.clear.inc.php b/thirdparty/html2ps_pdf/css.clear.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.clear.inc.php rename to thirdparty/html2ps_pdf/css.clear.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.color.inc.php b/thirdparty/html2ps_pdf/css.color.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.color.inc.php rename to thirdparty/html2ps_pdf/css.color.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.colors.inc.php b/thirdparty/html2ps_pdf/css.colors.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.colors.inc.php rename to thirdparty/html2ps_pdf/css.colors.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.constants.inc.php b/thirdparty/html2ps_pdf/css.constants.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.constants.inc.php rename to thirdparty/html2ps_pdf/css.constants.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.content.inc.php b/thirdparty/html2ps_pdf/css.content.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.content.inc.php rename to thirdparty/html2ps_pdf/css.content.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.counter.collection.php b/thirdparty/html2ps_pdf/css.counter.collection.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.counter.collection.php rename to thirdparty/html2ps_pdf/css.counter.collection.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.counter.php b/thirdparty/html2ps_pdf/css.counter.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.counter.php rename to thirdparty/html2ps_pdf/css.counter.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.direction.inc.php b/thirdparty/html2ps_pdf/css.direction.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.direction.inc.php rename to thirdparty/html2ps_pdf/css.direction.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.display.inc.php b/thirdparty/html2ps_pdf/css.display.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.display.inc.php rename to thirdparty/html2ps_pdf/css.display.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.float.inc.php b/thirdparty/html2ps_pdf/css.float.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.float.inc.php rename to thirdparty/html2ps_pdf/css.float.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.font-family.inc.php b/thirdparty/html2ps_pdf/css.font-family.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.font-family.inc.php rename to thirdparty/html2ps_pdf/css.font-family.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.font-size.inc.php b/thirdparty/html2ps_pdf/css.font-size.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.font-size.inc.php rename to thirdparty/html2ps_pdf/css.font-size.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.font-style.inc.php b/thirdparty/html2ps_pdf/css.font-style.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.font-style.inc.php rename to thirdparty/html2ps_pdf/css.font-style.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.font-weight.inc.php b/thirdparty/html2ps_pdf/css.font-weight.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.font-weight.inc.php rename to thirdparty/html2ps_pdf/css.font-weight.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.font.inc.php b/thirdparty/html2ps_pdf/css.font.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.font.inc.php rename to thirdparty/html2ps_pdf/css.font.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.frame.inc.php b/thirdparty/html2ps_pdf/css.frame.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.frame.inc.php rename to thirdparty/html2ps_pdf/css.frame.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.height.inc.php b/thirdparty/html2ps_pdf/css.height.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.height.inc.php rename to thirdparty/html2ps_pdf/css.height.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.html2ps.html.content.inc.php b/thirdparty/html2ps_pdf/css.html2ps.html.content.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.html2ps.html.content.inc.php rename to thirdparty/html2ps_pdf/css.html2ps.html.content.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.html2ps.pseudoelements.inc.php b/thirdparty/html2ps_pdf/css.html2ps.pseudoelements.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.html2ps.pseudoelements.inc.php rename to thirdparty/html2ps_pdf/css.html2ps.pseudoelements.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.inc.php b/thirdparty/html2ps_pdf/css.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.inc.php rename to thirdparty/html2ps_pdf/css.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.left.inc.php b/thirdparty/html2ps_pdf/css.left.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.left.inc.php rename to thirdparty/html2ps_pdf/css.left.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.letter-spacing.inc.php b/thirdparty/html2ps_pdf/css.letter-spacing.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.letter-spacing.inc.php rename to thirdparty/html2ps_pdf/css.letter-spacing.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.line-height.inc.php b/thirdparty/html2ps_pdf/css.line-height.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.line-height.inc.php rename to thirdparty/html2ps_pdf/css.line-height.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.list-style-image.inc.php b/thirdparty/html2ps_pdf/css.list-style-image.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.list-style-image.inc.php rename to thirdparty/html2ps_pdf/css.list-style-image.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.list-style-position.inc.php b/thirdparty/html2ps_pdf/css.list-style-position.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.list-style-position.inc.php rename to thirdparty/html2ps_pdf/css.list-style-position.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.list-style-type.inc.php b/thirdparty/html2ps_pdf/css.list-style-type.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.list-style-type.inc.php rename to thirdparty/html2ps_pdf/css.list-style-type.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.list-style.inc.php b/thirdparty/html2ps_pdf/css.list-style.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.list-style.inc.php rename to thirdparty/html2ps_pdf/css.list-style.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.margin.inc.php b/thirdparty/html2ps_pdf/css.margin.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.margin.inc.php rename to thirdparty/html2ps_pdf/css.margin.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.max-height.inc.php b/thirdparty/html2ps_pdf/css.max-height.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.max-height.inc.php rename to thirdparty/html2ps_pdf/css.max-height.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.min-height.inc.php b/thirdparty/html2ps_pdf/css.min-height.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.min-height.inc.php rename to thirdparty/html2ps_pdf/css.min-height.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.min-width.inc.php b/thirdparty/html2ps_pdf/css.min-width.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.min-width.inc.php rename to thirdparty/html2ps_pdf/css.min-width.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.orphans.inc.php b/thirdparty/html2ps_pdf/css.orphans.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.orphans.inc.php rename to thirdparty/html2ps_pdf/css.orphans.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.overflow.inc.php b/thirdparty/html2ps_pdf/css.overflow.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.overflow.inc.php rename to thirdparty/html2ps_pdf/css.overflow.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.padding.inc.php b/thirdparty/html2ps_pdf/css.padding.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.padding.inc.php rename to thirdparty/html2ps_pdf/css.padding.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.page-break-after.inc.php b/thirdparty/html2ps_pdf/css.page-break-after.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.page-break-after.inc.php rename to thirdparty/html2ps_pdf/css.page-break-after.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.page-break-before.inc.php b/thirdparty/html2ps_pdf/css.page-break-before.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.page-break-before.inc.php rename to thirdparty/html2ps_pdf/css.page-break-before.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.page-break-inside.inc.php b/thirdparty/html2ps_pdf/css.page-break-inside.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.page-break-inside.inc.php rename to thirdparty/html2ps_pdf/css.page-break-inside.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.page-break.inc.php b/thirdparty/html2ps_pdf/css.page-break.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.page-break.inc.php rename to thirdparty/html2ps_pdf/css.page-break.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.page.inc.php b/thirdparty/html2ps_pdf/css.page.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.page.inc.php rename to thirdparty/html2ps_pdf/css.page.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.parse.inc.php b/thirdparty/html2ps_pdf/css.parse.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.parse.inc.php rename to thirdparty/html2ps_pdf/css.parse.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.parse.media.inc.php b/thirdparty/html2ps_pdf/css.parse.media.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.parse.media.inc.php rename to thirdparty/html2ps_pdf/css.parse.media.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.parse.properties.php b/thirdparty/html2ps_pdf/css.parse.properties.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.parse.properties.php rename to thirdparty/html2ps_pdf/css.parse.properties.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.position.inc.php b/thirdparty/html2ps_pdf/css.position.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.position.inc.php rename to thirdparty/html2ps_pdf/css.position.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.property.collection.php b/thirdparty/html2ps_pdf/css.property.collection.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.property.collection.php rename to thirdparty/html2ps_pdf/css.property.collection.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.property.declaration.php b/thirdparty/html2ps_pdf/css.property.declaration.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.property.declaration.php rename to thirdparty/html2ps_pdf/css.property.declaration.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.property.handler.class.php b/thirdparty/html2ps_pdf/css.property.handler.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.property.handler.class.php rename to thirdparty/html2ps_pdf/css.property.handler.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.property.stringset.class.php b/thirdparty/html2ps_pdf/css.property.stringset.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.property.stringset.class.php rename to thirdparty/html2ps_pdf/css.property.stringset.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.property.sub.class.php b/thirdparty/html2ps_pdf/css.property.sub.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.property.sub.class.php rename to thirdparty/html2ps_pdf/css.property.sub.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.property.sub.field.class.php b/thirdparty/html2ps_pdf/css.property.sub.field.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.property.sub.field.class.php rename to thirdparty/html2ps_pdf/css.property.sub.field.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.pseudo.add.margin.inc.php b/thirdparty/html2ps_pdf/css.pseudo.add.margin.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.pseudo.add.margin.inc.php rename to thirdparty/html2ps_pdf/css.pseudo.add.margin.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.pseudo.align.inc.php b/thirdparty/html2ps_pdf/css.pseudo.align.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.pseudo.align.inc.php rename to thirdparty/html2ps_pdf/css.pseudo.align.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.pseudo.cellpadding.inc.php b/thirdparty/html2ps_pdf/css.pseudo.cellpadding.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.pseudo.cellpadding.inc.php rename to thirdparty/html2ps_pdf/css.pseudo.cellpadding.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.pseudo.cellspacing.inc.php b/thirdparty/html2ps_pdf/css.pseudo.cellspacing.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.pseudo.cellspacing.inc.php rename to thirdparty/html2ps_pdf/css.pseudo.cellspacing.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.pseudo.form.action.inc.php b/thirdparty/html2ps_pdf/css.pseudo.form.action.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.pseudo.form.action.inc.php rename to thirdparty/html2ps_pdf/css.pseudo.form.action.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.pseudo.form.radiogroup.inc.php b/thirdparty/html2ps_pdf/css.pseudo.form.radiogroup.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.pseudo.form.radiogroup.inc.php rename to thirdparty/html2ps_pdf/css.pseudo.form.radiogroup.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.pseudo.link.destination.inc.php b/thirdparty/html2ps_pdf/css.pseudo.link.destination.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.pseudo.link.destination.inc.php rename to thirdparty/html2ps_pdf/css.pseudo.link.destination.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.pseudo.link.target.inc.php b/thirdparty/html2ps_pdf/css.pseudo.link.target.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.pseudo.link.target.inc.php rename to thirdparty/html2ps_pdf/css.pseudo.link.target.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.pseudo.listcounter.inc.php b/thirdparty/html2ps_pdf/css.pseudo.listcounter.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.pseudo.listcounter.inc.php rename to thirdparty/html2ps_pdf/css.pseudo.listcounter.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.pseudo.localalign.inc.php b/thirdparty/html2ps_pdf/css.pseudo.localalign.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.pseudo.localalign.inc.php rename to thirdparty/html2ps_pdf/css.pseudo.localalign.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.pseudo.nowrap.inc.php b/thirdparty/html2ps_pdf/css.pseudo.nowrap.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.pseudo.nowrap.inc.php rename to thirdparty/html2ps_pdf/css.pseudo.nowrap.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.pseudo.table.border.inc.php b/thirdparty/html2ps_pdf/css.pseudo.table.border.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.pseudo.table.border.inc.php rename to thirdparty/html2ps_pdf/css.pseudo.table.border.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.right.inc.php b/thirdparty/html2ps_pdf/css.right.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.right.inc.php rename to thirdparty/html2ps_pdf/css.right.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.rules.inc.php b/thirdparty/html2ps_pdf/css.rules.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.rules.inc.php rename to thirdparty/html2ps_pdf/css.rules.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.rules.page.inc.php b/thirdparty/html2ps_pdf/css.rules.page.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.rules.page.inc.php rename to thirdparty/html2ps_pdf/css.rules.page.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.ruleset.class.php b/thirdparty/html2ps_pdf/css.ruleset.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.ruleset.class.php rename to thirdparty/html2ps_pdf/css.ruleset.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.selectors.inc.php b/thirdparty/html2ps_pdf/css.selectors.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.selectors.inc.php rename to thirdparty/html2ps_pdf/css.selectors.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.state.class.php b/thirdparty/html2ps_pdf/css.state.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.state.class.php rename to thirdparty/html2ps_pdf/css.state.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.table-layout.inc.php b/thirdparty/html2ps_pdf/css.table-layout.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.table-layout.inc.php rename to thirdparty/html2ps_pdf/css.table-layout.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.text-align.inc.php b/thirdparty/html2ps_pdf/css.text-align.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.text-align.inc.php rename to thirdparty/html2ps_pdf/css.text-align.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.text-decoration.inc.php b/thirdparty/html2ps_pdf/css.text-decoration.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.text-decoration.inc.php rename to thirdparty/html2ps_pdf/css.text-decoration.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.text-indent.inc.php b/thirdparty/html2ps_pdf/css.text-indent.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.text-indent.inc.php rename to thirdparty/html2ps_pdf/css.text-indent.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.text-transform.inc.php b/thirdparty/html2ps_pdf/css.text-transform.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.text-transform.inc.php rename to thirdparty/html2ps_pdf/css.text-transform.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.top.inc.php b/thirdparty/html2ps_pdf/css.top.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.top.inc.php rename to thirdparty/html2ps_pdf/css.top.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.utils.inc.php b/thirdparty/html2ps_pdf/css.utils.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.utils.inc.php rename to thirdparty/html2ps_pdf/css.utils.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.vertical-align.inc.php b/thirdparty/html2ps_pdf/css.vertical-align.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.vertical-align.inc.php rename to thirdparty/html2ps_pdf/css.vertical-align.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.visibility.inc.php b/thirdparty/html2ps_pdf/css.visibility.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.visibility.inc.php rename to thirdparty/html2ps_pdf/css.visibility.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.white-space.inc.php b/thirdparty/html2ps_pdf/css.white-space.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.white-space.inc.php rename to thirdparty/html2ps_pdf/css.white-space.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.widows.inc.php b/thirdparty/html2ps_pdf/css.widows.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.widows.inc.php rename to thirdparty/html2ps_pdf/css.widows.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.width.inc.php b/thirdparty/html2ps_pdf/css.width.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.width.inc.php rename to thirdparty/html2ps_pdf/css.width.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.word-spacing.inc.php b/thirdparty/html2ps_pdf/css.word-spacing.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.word-spacing.inc.php rename to thirdparty/html2ps_pdf/css.word-spacing.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/css.z-index.inc.php b/thirdparty/html2ps_pdf/css.z-index.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/css.z-index.inc.php rename to thirdparty/html2ps_pdf/css.z-index.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/default.css b/thirdparty/html2ps_pdf/default.css similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/default.css rename to thirdparty/html2ps_pdf/default.css diff --git a/gulliver/thirdparty/html2ps_pdf/demo/.htaccess b/thirdparty/html2ps_pdf/demo/.htaccess similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/demo/.htaccess rename to thirdparty/html2ps_pdf/demo/.htaccess diff --git a/gulliver/thirdparty/html2ps_pdf/demo/generic.param.php b/thirdparty/html2ps_pdf/demo/generic.param.php similarity index 95% rename from gulliver/thirdparty/html2ps_pdf/demo/generic.param.php rename to thirdparty/html2ps_pdf/demo/generic.param.php index b536aa7a3..c17c56cea 100644 --- a/gulliver/thirdparty/html2ps_pdf/demo/generic.param.php +++ b/thirdparty/html2ps_pdf/demo/generic.param.php @@ -1,46 +1,46 @@ - $value) { - $data[$key] = stripslashes($data[$key]); - }; - }; - } else { - /** - * Remove slashes added by magic quotes option - */ - if (get_magic_quotes_gpc()) { - $data = stripslashes($data); - }; - - /** - * Limit maximal length of passed data - */ - $data = substr($data, 0, $maxlength); - }; - - return $data; -} + $value) { + $data[$key] = stripslashes($data[$key]); + }; + }; + } else { + /** + * Remove slashes added by magic quotes option + */ + if (get_magic_quotes_gpc()) { + $data = stripslashes($data); + }; + + /** + * Limit maximal length of passed data + */ + $data = substr($data, 0, $maxlength); + }; + + return $data; +} ?> \ No newline at end of file diff --git a/gulliver/thirdparty/html2ps_pdf/demo/html2ps.php b/thirdparty/html2ps_pdf/demo/html2ps.php similarity index 97% rename from gulliver/thirdparty/html2ps_pdf/demo/html2ps.php rename to thirdparty/html2ps_pdf/demo/html2ps.php index f82a1704d..c12a26c02 100644 --- a/gulliver/thirdparty/html2ps_pdf/demo/html2ps.php +++ b/thirdparty/html2ps_pdf/demo/html2ps.php @@ -1,230 +1,230 @@ - get_var('cssmedia', $_REQUEST, 255, "screen"), - 'media' => get_var('media', $_REQUEST, 255, "A4"), - 'scalepoints' => isset($_REQUEST['scalepoints']), - 'renderimages' => isset($_REQUEST['renderimages']), - 'renderfields' => isset($_REQUEST['renderfields']), - 'renderforms' => isset($_REQUEST['renderforms']), - 'pslevel' => (int)get_var('pslevel', $_REQUEST, 1, 3), - 'renderlinks' => isset($_REQUEST['renderlinks']), - 'pagewidth' => (int)get_var('pixels', $_REQUEST, 10, 800), - 'landscape' => isset($_REQUEST['landscape']), - 'method' => get_var('method', $_REQUEST, 255, "fpdf"), - 'margins' => array( - 'left' => (int)get_var('leftmargin', $_REQUEST, 10, 0), - 'right' => (int)get_var('rightmargin', $_REQUEST, 10, 0), - 'top' => (int)get_var('topmargin', $_REQUEST, 10, 0), - 'bottom' => (int)get_var('bottommargin', $_REQUEST, 10, 0), - ), - 'encoding' => get_var('encoding', $_REQUEST, 255, ""), - 'ps2pdf' => isset($_REQUEST['ps2pdf']), - 'compress' => isset($_REQUEST['compress']), - 'output' => get_var('output', $_REQUEST, 255, ""), - 'pdfversion' => get_var('pdfversion', $_REQUEST, 255, "1.2"), - 'transparency_workaround' => isset($_REQUEST['transparency_workaround']), - 'imagequality_workaround' => isset($_REQUEST['imagequality_workaround']), - 'draw_page_border' => isset($_REQUEST['pageborder']), - 'debugbox' => isset($_REQUEST['debugbox']), - 'html2xhtml' => !isset($_REQUEST['html2xhtml']), - 'mode' => 'html', - 'smartpagebreak' => isset($_REQUEST['smartpagebreak']) - ); - -$proxy = get_var('proxy', $_REQUEST, 255, ''); - -// ========== Entry point -parse_config_file('../html2ps.config'); - -// validate input data -if ($GLOBALS['g_config']['pagewidth'] == 0) { - die("Please specify non-zero value for the pixel width!"); -}; - -// begin processing - -$g_media = Media::predefined($GLOBALS['g_config']['media']); -$g_media->set_landscape($GLOBALS['g_config']['landscape']); -$g_media->set_margins($GLOBALS['g_config']['margins']); -$g_media->set_pixels($GLOBALS['g_config']['pagewidth']); - -// Initialize the coversion pipeline -$pipeline = new Pipeline(); - -// Configure the fetchers -if (extension_loaded('curl')) { - require_once(HTML2PS_DIR.'fetcher.url.curl.class.php'); - $pipeline->fetchers = array(new FetcherURLCurl()); - if ($proxy != '') { - $pipeline->fetchers[0]->set_proxy($proxy); - }; -} else { - require_once(HTML2PS_DIR.'fetcher.url.class.php'); - $pipeline->fetchers[] = new FetcherURL(); -}; - -// Configure the data filters -$pipeline->data_filters[] = new DataFilterDoctype(); -$pipeline->data_filters[] = new DataFilterUTF8($GLOBALS['g_config']['encoding']); -if ($GLOBALS['g_config']['html2xhtml']) { - $pipeline->data_filters[] = new DataFilterHTML2XHTML(); -} else { - $pipeline->data_filters[] = new DataFilterXHTML2XHTML(); -}; - -$pipeline->parser = new ParserXHTML(); - -// "PRE" tree filters - -$pipeline->pre_tree_filters = array(); - -$header_html = get_var('headerhtml', $_REQUEST, 65535, ""); -$footer_html = get_var('footerhtml', $_REQUEST, 65535, ""); -$filter = new PreTreeFilterHeaderFooter($header_html, $footer_html); -$pipeline->pre_tree_filters[] = $filter; - -if ($GLOBALS['g_config']['renderfields']) { - $pipeline->pre_tree_filters[] = new PreTreeFilterHTML2PSFields(); -}; - -// - -if ($GLOBALS['g_config']['method'] === 'ps') { - $pipeline->layout_engine = new LayoutEnginePS(); -} else { - $pipeline->layout_engine = new LayoutEngineDefault(); -}; - -$pipeline->post_tree_filters = array(); - -// Configure the output format -if ($GLOBALS['g_config']['pslevel'] == 3) { - $image_encoder = new PSL3ImageEncoderStream(); -} else { - $image_encoder = new PSL2ImageEncoderStream(); -}; - -switch ($GLOBALS['g_config']['method']) { - case 'fastps': - if ($GLOBALS['g_config']['pslevel'] == 3) { - $pipeline->output_driver = new OutputDriverFastPS($image_encoder); - } else { - $pipeline->output_driver = new OutputDriverFastPSLevel2($image_encoder); - }; - break; - case 'pdflib': - $pipeline->output_driver = new OutputDriverPDFLIB16($GLOBALS['g_config']['pdfversion']); - break; - case 'fpdf': - $pipeline->output_driver = new OutputDriverFPDF(); - break; - case 'png': - $pipeline->output_driver = new OutputDriverPNG(); - break; - case 'pcl': - $pipeline->output_driver = new OutputDriverPCL(); - break; - default: - die("Unknown output method"); -}; - -// Setup watermark -$watermark_text = get_var('watermarkhtml', $_REQUEST, 65535, ""); -$pipeline->output_driver->set_watermark($watermark_text); - -if ($watermark_text != "") { - $dispatcher =& $pipeline->getDispatcher(); - - // @TODO: render watermark in observer - // $dispatcher->add_observer("after-page", new Observer()); -}; - -if ($GLOBALS['g_config']['debugbox']) { - $pipeline->output_driver->set_debug_boxes(true); -} - -if ($GLOBALS['g_config']['draw_page_border']) { - $pipeline->output_driver->set_show_page_border(true); -} - -if ($GLOBALS['g_config']['ps2pdf']) { - $pipeline->output_filters[] = new OutputFilterPS2PDF($GLOBALS['g_config']['pdfversion']); -} - -if ($GLOBALS['g_config']['compress'] && $GLOBALS['g_config']['method'] == 'fastps') { - $pipeline->output_filters[] = new OutputFilterGZip(); -} - -if (get_var('process_mode', $_REQUEST) == 'batch') { - $filename = "batch"; -} else { - $filename = $g_baseurl; -}; - -switch ($GLOBALS['g_config']['output']) { - case 0: - $pipeline->destination = new DestinationBrowser($filename); - break; - case 1: - $pipeline->destination = new DestinationDownload($filename); - break; - case 2: - $pipeline->destination = new DestinationFile($filename); - break; -}; - -// Start the conversion - -$time = time(); -if (get_var('process_mode', $_REQUEST) == 'batch') { - $batch = get_var('batch', $_REQUEST); - - for ($i=0; $iprocess_batch($batch, $g_media); -} else { - $status = $pipeline->process($g_baseurl, $g_media); -}; - -error_log(sprintf("Processing of '%s' completed in %u seconds", $g_baseurl, time() - $time)); - -if ($status == null) { - print($pipeline->error_message()); - error_log("Error in conversion pipeline"); - die(); -} - + get_var('cssmedia', $_REQUEST, 255, "screen"), + 'media' => get_var('media', $_REQUEST, 255, "A4"), + 'scalepoints' => isset($_REQUEST['scalepoints']), + 'renderimages' => isset($_REQUEST['renderimages']), + 'renderfields' => isset($_REQUEST['renderfields']), + 'renderforms' => isset($_REQUEST['renderforms']), + 'pslevel' => (int)get_var('pslevel', $_REQUEST, 1, 3), + 'renderlinks' => isset($_REQUEST['renderlinks']), + 'pagewidth' => (int)get_var('pixels', $_REQUEST, 10, 800), + 'landscape' => isset($_REQUEST['landscape']), + 'method' => get_var('method', $_REQUEST, 255, "fpdf"), + 'margins' => array( + 'left' => (int)get_var('leftmargin', $_REQUEST, 10, 0), + 'right' => (int)get_var('rightmargin', $_REQUEST, 10, 0), + 'top' => (int)get_var('topmargin', $_REQUEST, 10, 0), + 'bottom' => (int)get_var('bottommargin', $_REQUEST, 10, 0), + ), + 'encoding' => get_var('encoding', $_REQUEST, 255, ""), + 'ps2pdf' => isset($_REQUEST['ps2pdf']), + 'compress' => isset($_REQUEST['compress']), + 'output' => get_var('output', $_REQUEST, 255, ""), + 'pdfversion' => get_var('pdfversion', $_REQUEST, 255, "1.2"), + 'transparency_workaround' => isset($_REQUEST['transparency_workaround']), + 'imagequality_workaround' => isset($_REQUEST['imagequality_workaround']), + 'draw_page_border' => isset($_REQUEST['pageborder']), + 'debugbox' => isset($_REQUEST['debugbox']), + 'html2xhtml' => !isset($_REQUEST['html2xhtml']), + 'mode' => 'html', + 'smartpagebreak' => isset($_REQUEST['smartpagebreak']) + ); + +$proxy = get_var('proxy', $_REQUEST, 255, ''); + +// ========== Entry point +parse_config_file('../html2ps.config'); + +// validate input data +if ($GLOBALS['g_config']['pagewidth'] == 0) { + die("Please specify non-zero value for the pixel width!"); +}; + +// begin processing + +$g_media = Media::predefined($GLOBALS['g_config']['media']); +$g_media->set_landscape($GLOBALS['g_config']['landscape']); +$g_media->set_margins($GLOBALS['g_config']['margins']); +$g_media->set_pixels($GLOBALS['g_config']['pagewidth']); + +// Initialize the coversion pipeline +$pipeline = new Pipeline(); + +// Configure the fetchers +if (extension_loaded('curl')) { + require_once(HTML2PS_DIR.'fetcher.url.curl.class.php'); + $pipeline->fetchers = array(new FetcherURLCurl()); + if ($proxy != '') { + $pipeline->fetchers[0]->set_proxy($proxy); + }; +} else { + require_once(HTML2PS_DIR.'fetcher.url.class.php'); + $pipeline->fetchers[] = new FetcherURL(); +}; + +// Configure the data filters +$pipeline->data_filters[] = new DataFilterDoctype(); +$pipeline->data_filters[] = new DataFilterUTF8($GLOBALS['g_config']['encoding']); +if ($GLOBALS['g_config']['html2xhtml']) { + $pipeline->data_filters[] = new DataFilterHTML2XHTML(); +} else { + $pipeline->data_filters[] = new DataFilterXHTML2XHTML(); +}; + +$pipeline->parser = new ParserXHTML(); + +// "PRE" tree filters + +$pipeline->pre_tree_filters = array(); + +$header_html = get_var('headerhtml', $_REQUEST, 65535, ""); +$footer_html = get_var('footerhtml', $_REQUEST, 65535, ""); +$filter = new PreTreeFilterHeaderFooter($header_html, $footer_html); +$pipeline->pre_tree_filters[] = $filter; + +if ($GLOBALS['g_config']['renderfields']) { + $pipeline->pre_tree_filters[] = new PreTreeFilterHTML2PSFields(); +}; + +// + +if ($GLOBALS['g_config']['method'] === 'ps') { + $pipeline->layout_engine = new LayoutEnginePS(); +} else { + $pipeline->layout_engine = new LayoutEngineDefault(); +}; + +$pipeline->post_tree_filters = array(); + +// Configure the output format +if ($GLOBALS['g_config']['pslevel'] == 3) { + $image_encoder = new PSL3ImageEncoderStream(); +} else { + $image_encoder = new PSL2ImageEncoderStream(); +}; + +switch ($GLOBALS['g_config']['method']) { + case 'fastps': + if ($GLOBALS['g_config']['pslevel'] == 3) { + $pipeline->output_driver = new OutputDriverFastPS($image_encoder); + } else { + $pipeline->output_driver = new OutputDriverFastPSLevel2($image_encoder); + }; + break; + case 'pdflib': + $pipeline->output_driver = new OutputDriverPDFLIB16($GLOBALS['g_config']['pdfversion']); + break; + case 'fpdf': + $pipeline->output_driver = new OutputDriverFPDF(); + break; + case 'png': + $pipeline->output_driver = new OutputDriverPNG(); + break; + case 'pcl': + $pipeline->output_driver = new OutputDriverPCL(); + break; + default: + die("Unknown output method"); +}; + +// Setup watermark +$watermark_text = get_var('watermarkhtml', $_REQUEST, 65535, ""); +$pipeline->output_driver->set_watermark($watermark_text); + +if ($watermark_text != "") { + $dispatcher =& $pipeline->getDispatcher(); + + // @TODO: render watermark in observer + // $dispatcher->add_observer("after-page", new Observer()); +}; + +if ($GLOBALS['g_config']['debugbox']) { + $pipeline->output_driver->set_debug_boxes(true); +} + +if ($GLOBALS['g_config']['draw_page_border']) { + $pipeline->output_driver->set_show_page_border(true); +} + +if ($GLOBALS['g_config']['ps2pdf']) { + $pipeline->output_filters[] = new OutputFilterPS2PDF($GLOBALS['g_config']['pdfversion']); +} + +if ($GLOBALS['g_config']['compress'] && $GLOBALS['g_config']['method'] == 'fastps') { + $pipeline->output_filters[] = new OutputFilterGZip(); +} + +if (get_var('process_mode', $_REQUEST) == 'batch') { + $filename = "batch"; +} else { + $filename = $g_baseurl; +}; + +switch ($GLOBALS['g_config']['output']) { + case 0: + $pipeline->destination = new DestinationBrowser($filename); + break; + case 1: + $pipeline->destination = new DestinationDownload($filename); + break; + case 2: + $pipeline->destination = new DestinationFile($filename); + break; +}; + +// Start the conversion + +$time = time(); +if (get_var('process_mode', $_REQUEST) == 'batch') { + $batch = get_var('batch', $_REQUEST); + + for ($i=0; $iprocess_batch($batch, $g_media); +} else { + $status = $pipeline->process($g_baseurl, $g_media); +}; + +error_log(sprintf("Processing of '%s' completed in %u seconds", $g_baseurl, time() - $time)); + +if ($status == null) { + print($pipeline->error_message()); + error_log("Error in conversion pipeline"); + die(); +} + ?> \ No newline at end of file diff --git a/gulliver/thirdparty/html2ps_pdf/demo/htmltopdf.php b/thirdparty/html2ps_pdf/demo/htmltopdf.php similarity index 97% rename from gulliver/thirdparty/html2ps_pdf/demo/htmltopdf.php rename to thirdparty/html2ps_pdf/demo/htmltopdf.php index f82a1704d..c12a26c02 100644 --- a/gulliver/thirdparty/html2ps_pdf/demo/htmltopdf.php +++ b/thirdparty/html2ps_pdf/demo/htmltopdf.php @@ -1,230 +1,230 @@ - get_var('cssmedia', $_REQUEST, 255, "screen"), - 'media' => get_var('media', $_REQUEST, 255, "A4"), - 'scalepoints' => isset($_REQUEST['scalepoints']), - 'renderimages' => isset($_REQUEST['renderimages']), - 'renderfields' => isset($_REQUEST['renderfields']), - 'renderforms' => isset($_REQUEST['renderforms']), - 'pslevel' => (int)get_var('pslevel', $_REQUEST, 1, 3), - 'renderlinks' => isset($_REQUEST['renderlinks']), - 'pagewidth' => (int)get_var('pixels', $_REQUEST, 10, 800), - 'landscape' => isset($_REQUEST['landscape']), - 'method' => get_var('method', $_REQUEST, 255, "fpdf"), - 'margins' => array( - 'left' => (int)get_var('leftmargin', $_REQUEST, 10, 0), - 'right' => (int)get_var('rightmargin', $_REQUEST, 10, 0), - 'top' => (int)get_var('topmargin', $_REQUEST, 10, 0), - 'bottom' => (int)get_var('bottommargin', $_REQUEST, 10, 0), - ), - 'encoding' => get_var('encoding', $_REQUEST, 255, ""), - 'ps2pdf' => isset($_REQUEST['ps2pdf']), - 'compress' => isset($_REQUEST['compress']), - 'output' => get_var('output', $_REQUEST, 255, ""), - 'pdfversion' => get_var('pdfversion', $_REQUEST, 255, "1.2"), - 'transparency_workaround' => isset($_REQUEST['transparency_workaround']), - 'imagequality_workaround' => isset($_REQUEST['imagequality_workaround']), - 'draw_page_border' => isset($_REQUEST['pageborder']), - 'debugbox' => isset($_REQUEST['debugbox']), - 'html2xhtml' => !isset($_REQUEST['html2xhtml']), - 'mode' => 'html', - 'smartpagebreak' => isset($_REQUEST['smartpagebreak']) - ); - -$proxy = get_var('proxy', $_REQUEST, 255, ''); - -// ========== Entry point -parse_config_file('../html2ps.config'); - -// validate input data -if ($GLOBALS['g_config']['pagewidth'] == 0) { - die("Please specify non-zero value for the pixel width!"); -}; - -// begin processing - -$g_media = Media::predefined($GLOBALS['g_config']['media']); -$g_media->set_landscape($GLOBALS['g_config']['landscape']); -$g_media->set_margins($GLOBALS['g_config']['margins']); -$g_media->set_pixels($GLOBALS['g_config']['pagewidth']); - -// Initialize the coversion pipeline -$pipeline = new Pipeline(); - -// Configure the fetchers -if (extension_loaded('curl')) { - require_once(HTML2PS_DIR.'fetcher.url.curl.class.php'); - $pipeline->fetchers = array(new FetcherURLCurl()); - if ($proxy != '') { - $pipeline->fetchers[0]->set_proxy($proxy); - }; -} else { - require_once(HTML2PS_DIR.'fetcher.url.class.php'); - $pipeline->fetchers[] = new FetcherURL(); -}; - -// Configure the data filters -$pipeline->data_filters[] = new DataFilterDoctype(); -$pipeline->data_filters[] = new DataFilterUTF8($GLOBALS['g_config']['encoding']); -if ($GLOBALS['g_config']['html2xhtml']) { - $pipeline->data_filters[] = new DataFilterHTML2XHTML(); -} else { - $pipeline->data_filters[] = new DataFilterXHTML2XHTML(); -}; - -$pipeline->parser = new ParserXHTML(); - -// "PRE" tree filters - -$pipeline->pre_tree_filters = array(); - -$header_html = get_var('headerhtml', $_REQUEST, 65535, ""); -$footer_html = get_var('footerhtml', $_REQUEST, 65535, ""); -$filter = new PreTreeFilterHeaderFooter($header_html, $footer_html); -$pipeline->pre_tree_filters[] = $filter; - -if ($GLOBALS['g_config']['renderfields']) { - $pipeline->pre_tree_filters[] = new PreTreeFilterHTML2PSFields(); -}; - -// - -if ($GLOBALS['g_config']['method'] === 'ps') { - $pipeline->layout_engine = new LayoutEnginePS(); -} else { - $pipeline->layout_engine = new LayoutEngineDefault(); -}; - -$pipeline->post_tree_filters = array(); - -// Configure the output format -if ($GLOBALS['g_config']['pslevel'] == 3) { - $image_encoder = new PSL3ImageEncoderStream(); -} else { - $image_encoder = new PSL2ImageEncoderStream(); -}; - -switch ($GLOBALS['g_config']['method']) { - case 'fastps': - if ($GLOBALS['g_config']['pslevel'] == 3) { - $pipeline->output_driver = new OutputDriverFastPS($image_encoder); - } else { - $pipeline->output_driver = new OutputDriverFastPSLevel2($image_encoder); - }; - break; - case 'pdflib': - $pipeline->output_driver = new OutputDriverPDFLIB16($GLOBALS['g_config']['pdfversion']); - break; - case 'fpdf': - $pipeline->output_driver = new OutputDriverFPDF(); - break; - case 'png': - $pipeline->output_driver = new OutputDriverPNG(); - break; - case 'pcl': - $pipeline->output_driver = new OutputDriverPCL(); - break; - default: - die("Unknown output method"); -}; - -// Setup watermark -$watermark_text = get_var('watermarkhtml', $_REQUEST, 65535, ""); -$pipeline->output_driver->set_watermark($watermark_text); - -if ($watermark_text != "") { - $dispatcher =& $pipeline->getDispatcher(); - - // @TODO: render watermark in observer - // $dispatcher->add_observer("after-page", new Observer()); -}; - -if ($GLOBALS['g_config']['debugbox']) { - $pipeline->output_driver->set_debug_boxes(true); -} - -if ($GLOBALS['g_config']['draw_page_border']) { - $pipeline->output_driver->set_show_page_border(true); -} - -if ($GLOBALS['g_config']['ps2pdf']) { - $pipeline->output_filters[] = new OutputFilterPS2PDF($GLOBALS['g_config']['pdfversion']); -} - -if ($GLOBALS['g_config']['compress'] && $GLOBALS['g_config']['method'] == 'fastps') { - $pipeline->output_filters[] = new OutputFilterGZip(); -} - -if (get_var('process_mode', $_REQUEST) == 'batch') { - $filename = "batch"; -} else { - $filename = $g_baseurl; -}; - -switch ($GLOBALS['g_config']['output']) { - case 0: - $pipeline->destination = new DestinationBrowser($filename); - break; - case 1: - $pipeline->destination = new DestinationDownload($filename); - break; - case 2: - $pipeline->destination = new DestinationFile($filename); - break; -}; - -// Start the conversion - -$time = time(); -if (get_var('process_mode', $_REQUEST) == 'batch') { - $batch = get_var('batch', $_REQUEST); - - for ($i=0; $iprocess_batch($batch, $g_media); -} else { - $status = $pipeline->process($g_baseurl, $g_media); -}; - -error_log(sprintf("Processing of '%s' completed in %u seconds", $g_baseurl, time() - $time)); - -if ($status == null) { - print($pipeline->error_message()); - error_log("Error in conversion pipeline"); - die(); -} - + get_var('cssmedia', $_REQUEST, 255, "screen"), + 'media' => get_var('media', $_REQUEST, 255, "A4"), + 'scalepoints' => isset($_REQUEST['scalepoints']), + 'renderimages' => isset($_REQUEST['renderimages']), + 'renderfields' => isset($_REQUEST['renderfields']), + 'renderforms' => isset($_REQUEST['renderforms']), + 'pslevel' => (int)get_var('pslevel', $_REQUEST, 1, 3), + 'renderlinks' => isset($_REQUEST['renderlinks']), + 'pagewidth' => (int)get_var('pixels', $_REQUEST, 10, 800), + 'landscape' => isset($_REQUEST['landscape']), + 'method' => get_var('method', $_REQUEST, 255, "fpdf"), + 'margins' => array( + 'left' => (int)get_var('leftmargin', $_REQUEST, 10, 0), + 'right' => (int)get_var('rightmargin', $_REQUEST, 10, 0), + 'top' => (int)get_var('topmargin', $_REQUEST, 10, 0), + 'bottom' => (int)get_var('bottommargin', $_REQUEST, 10, 0), + ), + 'encoding' => get_var('encoding', $_REQUEST, 255, ""), + 'ps2pdf' => isset($_REQUEST['ps2pdf']), + 'compress' => isset($_REQUEST['compress']), + 'output' => get_var('output', $_REQUEST, 255, ""), + 'pdfversion' => get_var('pdfversion', $_REQUEST, 255, "1.2"), + 'transparency_workaround' => isset($_REQUEST['transparency_workaround']), + 'imagequality_workaround' => isset($_REQUEST['imagequality_workaround']), + 'draw_page_border' => isset($_REQUEST['pageborder']), + 'debugbox' => isset($_REQUEST['debugbox']), + 'html2xhtml' => !isset($_REQUEST['html2xhtml']), + 'mode' => 'html', + 'smartpagebreak' => isset($_REQUEST['smartpagebreak']) + ); + +$proxy = get_var('proxy', $_REQUEST, 255, ''); + +// ========== Entry point +parse_config_file('../html2ps.config'); + +// validate input data +if ($GLOBALS['g_config']['pagewidth'] == 0) { + die("Please specify non-zero value for the pixel width!"); +}; + +// begin processing + +$g_media = Media::predefined($GLOBALS['g_config']['media']); +$g_media->set_landscape($GLOBALS['g_config']['landscape']); +$g_media->set_margins($GLOBALS['g_config']['margins']); +$g_media->set_pixels($GLOBALS['g_config']['pagewidth']); + +// Initialize the coversion pipeline +$pipeline = new Pipeline(); + +// Configure the fetchers +if (extension_loaded('curl')) { + require_once(HTML2PS_DIR.'fetcher.url.curl.class.php'); + $pipeline->fetchers = array(new FetcherURLCurl()); + if ($proxy != '') { + $pipeline->fetchers[0]->set_proxy($proxy); + }; +} else { + require_once(HTML2PS_DIR.'fetcher.url.class.php'); + $pipeline->fetchers[] = new FetcherURL(); +}; + +// Configure the data filters +$pipeline->data_filters[] = new DataFilterDoctype(); +$pipeline->data_filters[] = new DataFilterUTF8($GLOBALS['g_config']['encoding']); +if ($GLOBALS['g_config']['html2xhtml']) { + $pipeline->data_filters[] = new DataFilterHTML2XHTML(); +} else { + $pipeline->data_filters[] = new DataFilterXHTML2XHTML(); +}; + +$pipeline->parser = new ParserXHTML(); + +// "PRE" tree filters + +$pipeline->pre_tree_filters = array(); + +$header_html = get_var('headerhtml', $_REQUEST, 65535, ""); +$footer_html = get_var('footerhtml', $_REQUEST, 65535, ""); +$filter = new PreTreeFilterHeaderFooter($header_html, $footer_html); +$pipeline->pre_tree_filters[] = $filter; + +if ($GLOBALS['g_config']['renderfields']) { + $pipeline->pre_tree_filters[] = new PreTreeFilterHTML2PSFields(); +}; + +// + +if ($GLOBALS['g_config']['method'] === 'ps') { + $pipeline->layout_engine = new LayoutEnginePS(); +} else { + $pipeline->layout_engine = new LayoutEngineDefault(); +}; + +$pipeline->post_tree_filters = array(); + +// Configure the output format +if ($GLOBALS['g_config']['pslevel'] == 3) { + $image_encoder = new PSL3ImageEncoderStream(); +} else { + $image_encoder = new PSL2ImageEncoderStream(); +}; + +switch ($GLOBALS['g_config']['method']) { + case 'fastps': + if ($GLOBALS['g_config']['pslevel'] == 3) { + $pipeline->output_driver = new OutputDriverFastPS($image_encoder); + } else { + $pipeline->output_driver = new OutputDriverFastPSLevel2($image_encoder); + }; + break; + case 'pdflib': + $pipeline->output_driver = new OutputDriverPDFLIB16($GLOBALS['g_config']['pdfversion']); + break; + case 'fpdf': + $pipeline->output_driver = new OutputDriverFPDF(); + break; + case 'png': + $pipeline->output_driver = new OutputDriverPNG(); + break; + case 'pcl': + $pipeline->output_driver = new OutputDriverPCL(); + break; + default: + die("Unknown output method"); +}; + +// Setup watermark +$watermark_text = get_var('watermarkhtml', $_REQUEST, 65535, ""); +$pipeline->output_driver->set_watermark($watermark_text); + +if ($watermark_text != "") { + $dispatcher =& $pipeline->getDispatcher(); + + // @TODO: render watermark in observer + // $dispatcher->add_observer("after-page", new Observer()); +}; + +if ($GLOBALS['g_config']['debugbox']) { + $pipeline->output_driver->set_debug_boxes(true); +} + +if ($GLOBALS['g_config']['draw_page_border']) { + $pipeline->output_driver->set_show_page_border(true); +} + +if ($GLOBALS['g_config']['ps2pdf']) { + $pipeline->output_filters[] = new OutputFilterPS2PDF($GLOBALS['g_config']['pdfversion']); +} + +if ($GLOBALS['g_config']['compress'] && $GLOBALS['g_config']['method'] == 'fastps') { + $pipeline->output_filters[] = new OutputFilterGZip(); +} + +if (get_var('process_mode', $_REQUEST) == 'batch') { + $filename = "batch"; +} else { + $filename = $g_baseurl; +}; + +switch ($GLOBALS['g_config']['output']) { + case 0: + $pipeline->destination = new DestinationBrowser($filename); + break; + case 1: + $pipeline->destination = new DestinationDownload($filename); + break; + case 2: + $pipeline->destination = new DestinationFile($filename); + break; +}; + +// Start the conversion + +$time = time(); +if (get_var('process_mode', $_REQUEST) == 'batch') { + $batch = get_var('batch', $_REQUEST); + + for ($i=0; $iprocess_batch($batch, $g_media); +} else { + $status = $pipeline->process($g_baseurl, $g_media); +}; + +error_log(sprintf("Processing of '%s' completed in %u seconds", $g_baseurl, time() - $time)); + +if ($status == null) { + print($pipeline->error_message()); + error_log("Error in conversion pipeline"); + die(); +} + ?> \ No newline at end of file diff --git a/gulliver/thirdparty/html2ps_pdf/demo/index.php b/thirdparty/html2ps_pdf/demo/index.php similarity index 97% rename from gulliver/thirdparty/html2ps_pdf/demo/index.php rename to thirdparty/html2ps_pdf/demo/index.php index fcb7deea4..ff55e057f 100644 --- a/gulliver/thirdparty/html2ps_pdf/demo/index.php +++ b/thirdparty/html2ps_pdf/demo/index.php @@ -1,500 +1,500 @@ - - - - - - - - - -HTML2PS/PDF - - - - - - -

              html2ps/pdf demo

              - -

              GhostView can be used to read PostScript files, and Adobe Acrobat Reader can be used to read PDF files.

              -

              See also: -

              -

              - -
              -
              -
              - Source  - -
              - - - - -
              - -
              - - -
              -
              -
              -
              -
              - -
              - - -
              -
              -
              - -

              -
              - -
              - Format Requirements  -
              - - - - -
              - - - -
              - - - - -
              - - - -
              - - -FPDF/PDFLIB 1.6 output only! - -
              - - - -
              - - - - -
              - -
              - - - - -
              - -
              - - - - -
              - -
              - - - - -
              - -
              - - - - -
              - - -
              - - - - -
              - -
              - - - - -
              -

              -
              - -
              - Additional data  -
              - - - - -
              - -
              - - - - -
              - -
              - - - -
              -Note that watermarking is not supported by some output drivers; currently you may place "watermarks" -using FPDF and PDFLIB output only. -
              -
              -
              - -

              -
              - -
              - Debugging  - - - - -
              - - - - -
              - -

              -
              - -
              - File Requirements  -
              - - -PostScript   - - -
              PDF (PDFLIB) -
              PDF (FPDF) -
              Image (PNG) beta - -
              -
              - -
              - - - -
              -Note: not all output methods support all PDF compatibility levels! -
              -
              - -
              - - -Browser (PDF will be opened in browser, Postsript will be downloaded)  -
              Browser (download as file) -
              File on server -
              -
              - -
              - - -Convert Postscript to PDF
              - -Compress output file using GZIP -
              -Don't use this option with PDF output, -as Acrobat Reader will treat compressed file as damaged. -
              -
              -
              -
              - -
              - - -Use PS2PDF transparency problem workaround
              -Use PS2PDF image quality problem workaround
              -(leave these options disabled if you have no problems with generated files) -
              -
              - -
              -  - - - -  - - -
              -

              -
              -
              -
              - -

              html2ps is free and open-source for commercial and non-commercial use. Read more about html2ps.

              - -

              Donate to the html2ps project

              - -
              -© 2005–2006 Darren Gates, Konstantin Bournayev - - + + + + + + + + + +HTML2PS/PDF + + + + + + +

              html2ps/pdf demo

              + +

              GhostView can be used to read PostScript files, and Adobe Acrobat Reader can be used to read PDF files.

              +

              See also: +

              +

              + +
              +
              +
              + Source  + +
              + + + + +
              + +
              + + +
              +
              +
              +
              +
              + +
              + + +
              +
              +
              + +

              +
              + +
              + Format Requirements  +
              + + + + +
              + + + +
              + + + + +
              + + + +
              + + +FPDF/PDFLIB 1.6 output only! + +
              + + + +
              + + + + +
              + +
              + + + + +
              + +
              + + + + +
              + +
              + + + + +
              + +
              + + + + +
              + + +
              + + + + +
              + +
              + + + + +
              +

              +
              + +
              + Additional data  +
              + + + + +
              + +
              + + + + +
              + +
              + + + +
              +Note that watermarking is not supported by some output drivers; currently you may place "watermarks" +using FPDF and PDFLIB output only. +
              +
              +
              + +

              +
              + +
              + Debugging  + + + + +
              + + + + +
              + +

              +
              + +
              + File Requirements  +
              + + +PostScript   + + +
              PDF (PDFLIB) +
              PDF (FPDF) +
              Image (PNG) beta + +
              +
              + +
              + + + +
              +Note: not all output methods support all PDF compatibility levels! +
              +
              + +
              + + +Browser (PDF will be opened in browser, Postsript will be downloaded)  +
              Browser (download as file) +
              File on server +
              +
              + +
              + + +Convert Postscript to PDF
              + +Compress output file using GZIP +
              +Don't use this option with PDF output, +as Acrobat Reader will treat compressed file as damaged. +
              +
              +
              +
              + +
              + + +Use PS2PDF transparency problem workaround
              +Use PS2PDF image quality problem workaround
              +(leave these options disabled if you have no problems with generated files) +
              +
              + +
              +  + + + +  + + +
              +

              +
              +
              +
              + +

              html2ps is free and open-source for commercial and non-commercial use. Read more about html2ps.

              + +

              Donate to the html2ps project

              + +
              +© 2005–2006 Darren Gates, Konstantin Bournayev + + \ No newline at end of file diff --git a/gulliver/thirdparty/html2ps_pdf/demo/phpinfo.php b/thirdparty/html2ps_pdf/demo/phpinfo.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/demo/phpinfo.php rename to thirdparty/html2ps_pdf/demo/phpinfo.php diff --git a/gulliver/thirdparty/html2ps_pdf/demo/systemcheck.footer.tpl b/thirdparty/html2ps_pdf/demo/systemcheck.footer.tpl similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/demo/systemcheck.footer.tpl rename to thirdparty/html2ps_pdf/demo/systemcheck.footer.tpl diff --git a/gulliver/thirdparty/html2ps_pdf/demo/systemcheck.header.tpl b/thirdparty/html2ps_pdf/demo/systemcheck.header.tpl similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/demo/systemcheck.header.tpl rename to thirdparty/html2ps_pdf/demo/systemcheck.header.tpl diff --git a/gulliver/thirdparty/html2ps_pdf/demo/systemcheck.php b/thirdparty/html2ps_pdf/demo/systemcheck.php similarity index 95% rename from gulliver/thirdparty/html2ps_pdf/demo/systemcheck.php rename to thirdparty/html2ps_pdf/demo/systemcheck.php index bfbacfa20..22f120d6c 100644 --- a/gulliver/thirdparty/html2ps_pdf/demo/systemcheck.php +++ b/thirdparty/html2ps_pdf/demo/systemcheck.php @@ -1,679 +1,679 @@ - "failed", - CHECK_STATUS_WARNING => "warning", - CHECK_STATUS_SUCCESS => "success"); - if (isset($mapping[$status])) { - return $mapping[$status]; - }; - - error_log(sprintf("Unknown status code passed to 'status2class': %s", $status)); - return "unknown"; -} - -function out_check_list() { - $checks = ManagerChecks::getChecks(); - foreach ($checks as $check) { - $title = htmlspecialchars($check->title()); - $message = nl2br($check->getMessage()); - $status_class = status2class($check->getStatus()); - - print << -
              ${title}
              -
              ${message}
              -
      -EOF; - }; -} - -class ManagerChecks { - function register($check) { - global $__g_registered_checks; - $__g_registered_checks[] = $check; - } - - function run() { - global $__g_registered_checks; - $size = count($__g_registered_checks); - for ($i=0; $i<$size; $i++) { - $__g_registered_checks[$i]->run(); - }; - } - - function getChecks() { - global $__g_registered_checks; - return $__g_registered_checks; - } -} - -class CheckSimple { - var $_message; - - /** - * Invariants - */ - function title() { - error_no_method('title', get_class($this)); - } - - function description() { - error_no_method('description', get_class($this)); - } - - /** - * Start checking - */ - function run() { - error_no_method('run', get_class($this)); - } - - /** - * Get check status code; status code should be one of the following - * predefined constants: - * CHECK_STATUS_FAILED - check failed, script will not work unless this issue is fixed - * CHECK_STATUS_WARNING - check succeeded, script may encounter minor issues - * CHECK_STATUS_SUCCESS - check succeeded without any problems - * - * @return Integer Status code - */ - function getStatus() { - error_no_method('status', get_class($this)); - } - - /** - * Returns a short human-readable message describing results of the - * check run. By default, this message is generated in 'run' method - * (overridden in CheckSimple children) and stored via 'setMessage' - * - * @return String description of the test results - */ - function getMessage() { - return $this->_message; - } - - function setMessage($message) { - $this->_message = $message; - } -} - -/** - */ -class CheckBinary extends CheckSimple { - var $_success; - - function setSuccess($success) { - $this->_success = $success; - } - - function getSuccess() { - return $this->_success; - } -} - -/** - */ -class CheckBinaryRequired extends CheckBinary { - function getStatus() { - if ($this->getSuccess()) { - return CHECK_STATUS_SUCCESS; - } else { - return CHECK_STATUS_FAILED; - }; - } -} - -/** - */ -class CheckBinaryRecommended extends CheckBinary { - function getStatus() { - if ($this->getSuccess()) { - return CHECK_STATUS_SUCCESS; - } else { - return CHECK_STATUS_WARNING; - }; - } -} - -/** - */ -class CheckTriState extends CheckSimple { - var $_status; - - function getStatus() { - return $this->_status; - } - - function setStatus($status) { - $this->_status = $status; - } -} - -/** - * Actual checks - */ - -/** - * PHP version - */ -class CheckPHPVersion extends CheckTriState { - function title() { - return "PHP Version"; - } - - function description() { - return ""; - } - - function run() { - // > "4.3.0"; - } -} -// ManagerChecks::register(new CheckPHPVersion()); - -/** - * Required / recommended extensions - */ - -/** - * Presense of DOM/XML extensions - */ -class CheckDOM extends CheckTriState { - function title() { - return "XML DOM extension"; - } - - function description() { - return "HTML files are parsed using XML DOM extensions"; - } - - function run() { - if (function_exists('domxml_open_mem') || - class_exists('DOMDocument')) { - $this->setStatus(CHECK_STATUS_SUCCESS); - $this->setMessage('Native XML DOM extension found'); - return; - }; - - if (file_exists(HTML2PS_DIR.'classes/include.php')) { - $this->setStatus(CHECK_STATUS_WARNING); - $this->setMessage('No native XML DOM extension found, falling back to Active-State DOM XML. Note that it is highly recommended to use native PHP XML DOM extension.'); - return; - }; - - $this->setStatus(CHECK_STATUS_FAILED); - $this->setMessage('No XML DOM extension found'); - } -} - -/** - * Presense of PDFLIB extension - */ -class CheckPDFLIB extends CheckBinaryRecommended { -} - -/** - * Presense of Curl extension - */ -class CheckCurl extends CheckBinaryRecommended { - function title() { - return "Curl PHP Extension"; - } - - function description() { - return "Curl PHP extension is recommended for fetching files via HTTP protocol"; - } - - function run() { - $this->setSuccess(false); - - if (!extension_loaded('curl')) { - $this->setMessage('Missing Curl extension. Script will use pure-PHP fallback (allow_url_fopen=On is required!). Proxy support is not available'); - return; - }; - - $version = curl_version(); - // PHP 5.0.1 and greater return array instead of string - if (is_array($version)) { - $version = $version['version']; - }; - $this->setMessage(sprintf('Found Curl extension version %s.', $version['version'])); - $this->setSuccess(true); - } -} - -/** - * Presense of GD extension - */ -class CheckGD extends CheckBinaryRequired { - function title() { - return "GD PHP Extension"; - } - - function description() { - return "GD PHP extension is required for graphic file processing"; - } - - function run() { - $this->setSuccess(false); - - if (!extension_loaded('gd')) { - $this->setMessage('Missing GD extension. Please refer to PHP.net instructions on installing/enabling this extension.'); - return; - }; - - $gd_info = gd_info(); - $gd_version_string = $gd_info['GD Version']; - - /** - * Extract version number if it is a bundled version; otherwise we assume that - * version string should contain verions number only - */ - if (preg_match("/bundled \(([\d\.]+) compatible\)/", $gd_version_string, $matches)) { - $gd_version = $matches[1]; - } else { - $gd_version = $gd_version_string; - }; - - if ($gd_version < "2.0.1") { - $this->setMessage("GD version 2.0.1+ required for 'imagecreatetruecolor' function to work"); - return; - }; - - $this->setMessage("Found GD version $gd_version."); - $this->setSuccess(true); - } -} - -/** - * Presense of ZLIB extension (compressed files) - */ -class CheckZLIB extends CheckBinaryRecommended { -} - -/** - * System limits & settings - */ - -/** - * Execution time limit - */ -class CheckMaxExecutionTime extends CheckTriState { -} - -/** - * Memory limit - */ -class CheckMemoryLimit extends CheckTriState { -} - -/** - * Allow_url_fopen setting - */ -class CheckAllowURLFopen extends CheckBinaryRecommended { - function title() { - return "allow_url_fopen ini setting"; - } - - function description() { - return "allow_url_fopen should be enabled when CURL extension is not available"; - } - - function run() { - $this->setSuccess(false); - - $setting = ini_get('allow_url_fopen'); - if (!$setting) { - $this->setMessage('allow_url_fopen is disabled. You will not be able to fetch files via HTTP without CURL extension.'); - return; - } - - $this->setMessage('allow_url_fopen is enabled'); - $this->setSuccess(true); - } -} - -/** - * Access/permissions - */ - -/** - * permissions on cache directory - */ -class CheckPermissionsCache extends CheckBinaryRequired { -} - -/** - * Permissions on 'out' directory - */ -class CheckPermissionsOut extends CheckBinaryRecommended { -} - -/** - * Permissions on 'temp' directory (system-dependent) - */ -class CheckPermissionsTemp extends CheckBinaryRequired { - function title() { - return "Permissions on 'temp' subdirectory"; - } - - function description() { - return "Script should have full access to 'temp' subdirectory to keep temporary files there"; - } - - function run() { - if (!file_exists(HTML2PS_DIR.'/temp/')) { - $this->setMessage("'temp' subdirectory is missing"); - $this->setSuccess(false); - return; - }; - - if (!is_readable(HTML2PS_DIR.'/temp/')) { - $this->setMessage("'temp' subdirectory is not readable"); - $this->setSuccess(false); - return; - }; - - if (!is_writable(HTML2PS_DIR.'/temp/')) { - $this->setMessage("'temp' subdirectory is not writable"); - $this->setSuccess(false); - return; - }; - - if (!is_executable(HTML2PS_DIR.'/temp/') && PHP_OS != "WINNT") { - $this->setMessage("'temp' subdirectory is not executable"); - $this->setSuccess(false); - return; - }; - - $this->setMessage("'temp' subdirectory is fully accessible to the script"); - $this->setSuccess(true); - } -} - -/** - * Permissions/availability of GS executable - */ - -/** - * Permissions of fonts directory - */ -class CheckPermissionsFonts extends CheckBinaryRequired { - function title() { - return "Permissions on 'fonts' subdirectory"; - } - - function description() { - return "Script should be able to read 'fonts' subdirectory to access installed fonts"; - } - - function run() { - if (!file_exists(HTML2PS_DIR.'/fonts/')) { - $this->setMessage("'fonts' subdirectory is missing"); - $this->setSuccess(false); - return; - }; - - if (!is_readable(HTML2PS_DIR.'/fonts/')) { - $this->setMessage("'fonts' subdirectory is not readable"); - $this->setSuccess(false); - return; - }; - - if (!is_executable(HTML2PS_DIR.'/fonts/') && PHP_OS != "WINNT") { - $this->setMessage("'fonts' subdirectory is not executable"); - $this->setSuccess(false); - return; - }; - - $this->setMessage("'fonts' subdirectory is readable and executable by the script"); - $this->setSuccess(true); - } -} - -/** - * Permissions/presence of Type1 fonts repository - */ -class CheckPermissionsType1 extends CheckBinaryRecommended { - function title() { - return "Permissions on Type1 fonts directory"; - } - - function description() { - return "Script should be able to access Type1 fonts directory containing font metrics in order to generate Postscript files"; - } - - function run() { - if (!file_exists(TYPE1_FONTS_REPOSITORY)) { - $this->setMessage("Type1 fonts directory (".TYPE1_FONTS_REPOSITORY.") is missing. You will not be able to generate postscript files."); - $this->setSuccess(false); - return; - }; - - if (!is_readable(TYPE1_FONTS_REPOSITORY)) { - $this->setMessage("Type1 fonts directory (".TYPE1_FONTS_REPOSITORY.") is not readable. You will not be able to generate postscript files."); - $this->setSuccess(false); - return; - }; - - if (!is_executable(HTML2PS_DIR.'/fonts/') && PHP_OS != "WINNT") { - $this->setMessage("Type1 fonts directory (".TYPE1_FONTS_REPOSITORY.") is not executable. You will not be able to generate postscript files."); - $this->setSuccess(false); - return; - }; - - $this->setMessage("Type1 fonts directory is readable and executable by the script"); - $this->setSuccess(true); - } -} - -/** - * Fonts - */ - -/** - * Permissions/presense of TTF files - */ -class CheckPresenceTTF extends CheckBinaryRecommended { - function title() { - return "Presense of registered TTF files"; - } - - function description() { - return "TrueType fonts registered in html2ps.config should be present in order to generate PDF files with these fonts."; - } - - function run() { - $message = ""; - $this->setSuccess(true); - - global $g_font_resolver_pdf; - foreach ($g_font_resolver_pdf->ttf_mappings as $file) { - $fullname = HTML2PS_DIR.'/fonts/'.$file; - - if (!file_exists($fullname)) { - $message .= "Font ".$fullname." is missing. You will not be able to generate PDF files with this font.\n"; - $this->setSuccess(false); - } elseif (!file_exists($fullname)) { - $message .= "Font ".$fullname." is not readable. You will not be able to generate PDF files with this font.\n"; - $this->setSuccess(false); - } else { - $message .= "Font ".$fullname." is present and readable.\n"; - }; - }; - - $this->setMessage($message); - } -} - -/** - * Permissions/presense of Type1 fonts - */ - -/** - * Permissions/presense of AFM files for Type1 fonts - */ -class CheckPresenceType1AFM extends CheckBinaryRecommended { - function title() { - return "Presense of registered TTF files"; - } - - function description() { - return "TrueType fonts registered in html2ps.config should be present in order to generate PDF files with these fonts."; - } - - function run() { - $message = ""; - $this->setSuccess(true); - - global $g_font_resolver; - foreach ($g_font_resolver->afm_mappings as $file) { - $fullname = TYPE1_FONTS_REPOSITORY.$file.'.afm'; - - if (!file_exists($fullname)) { - $message .= "Font ".$fullname." is missing. You will not be able to generate PDF files with this font.\n"; - $this->setSuccess(false); - } elseif (!file_exists($fullname)) { - $message .= "Font ".$fullname." is not readable. You will not be able to generate PDF files with this font.\n"; - $this->setSuccess(false); - } else { - $message .= "Font ".$fullname." is present and readable.\n"; - }; - }; - - $this->setMessage($message); - } -} - -/** - * Graphics - */ - -/** - * Generic - */ -class CheckGDFormat extends CheckBinaryRequired { - function title() { - return "GD ".$this->_getFormatName()." Support"; - } - - function description() { - return "GD ".$this->_getFormatName()." Support is required for reading images in ".$this->_getFormatName()." format"; - } - - function run() { - $this->setSuccess(false); - - if (!extension_loaded('gd')) { - $this->setMessage('Missing GD extension. Please refer to PHP.net instructions on installing/enabling this extension.'); - return; - }; - - $gd_info = gd_info(); - if (!$gd_info[$this->_getInfoKey()]) { - $this->setMessage("No ".$this->_getFormatName()." support, some images will not be displayed"); - return; - }; - - $this->setMessage($this->_getFormatName()." support enabled"); - $this->setSuccess(true); - } -} - -/** - * JPEG support - */ -class CheckGDJPEG extends CheckGDFormat { - function _getFormatName() { - return "JPEG"; - } - - function _getInfoKey() { - return "JPG Support"; - } -} - -/** - * GIF support - */ -class CheckGDGIF extends CheckGDFormat { - function _getFormatName() { - return "GIF"; - } - - function _getInfoKey() { - return "GIF Read Support"; - } -} - -/** - * PNG support - */ -class CheckGDPNG extends CheckGDFormat { - function _getFormatName() { - return "PNG"; - } - - function _getInfoKey() { - return "PNG Support"; - } -} - -/** - * Freetype support - */ - -/** - * Miscellanous - */ - -/** - * Check if outgoing connections are allowed - */ -class CheckOutgoingConnections extends CheckBinary { -} - -ManagerChecks::register(new CheckDOM()); -ManagerChecks::register(new CheckCurl()); -ManagerChecks::register(new CheckAllowURLFopen()); -ManagerChecks::register(new CheckGD()); -ManagerChecks::register(new CheckGDJPEG()); -ManagerChecks::register(new CheckGDGIF()); -ManagerChecks::register(new CheckGDPNG()); -ManagerChecks::register(new CheckPermissionsTemp()); -ManagerChecks::register(new CheckPermissionsFonts()); -ManagerChecks::register(new CheckPermissionsType1()); -ManagerChecks::register(new CheckPresenceTTF()); -ManagerChecks::register(new CheckPresenceType1AFM()); - -ManagerChecks::run(); -out_header(); -out_check_list(); -out_footer(); - + "failed", + CHECK_STATUS_WARNING => "warning", + CHECK_STATUS_SUCCESS => "success"); + if (isset($mapping[$status])) { + return $mapping[$status]; + }; + + error_log(sprintf("Unknown status code passed to 'status2class': %s", $status)); + return "unknown"; +} + +function out_check_list() { + $checks = ManagerChecks::getChecks(); + foreach ($checks as $check) { + $title = htmlspecialchars($check->title()); + $message = nl2br($check->getMessage()); + $status_class = status2class($check->getStatus()); + + print << +
      ${title}
      +
      ${message}
      +
      +EOF; + }; +} + +class ManagerChecks { + function register($check) { + global $__g_registered_checks; + $__g_registered_checks[] = $check; + } + + function run() { + global $__g_registered_checks; + $size = count($__g_registered_checks); + for ($i=0; $i<$size; $i++) { + $__g_registered_checks[$i]->run(); + }; + } + + function getChecks() { + global $__g_registered_checks; + return $__g_registered_checks; + } +} + +class CheckSimple { + var $_message; + + /** + * Invariants + */ + function title() { + error_no_method('title', get_class($this)); + } + + function description() { + error_no_method('description', get_class($this)); + } + + /** + * Start checking + */ + function run() { + error_no_method('run', get_class($this)); + } + + /** + * Get check status code; status code should be one of the following + * predefined constants: + * CHECK_STATUS_FAILED - check failed, script will not work unless this issue is fixed + * CHECK_STATUS_WARNING - check succeeded, script may encounter minor issues + * CHECK_STATUS_SUCCESS - check succeeded without any problems + * + * @return Integer Status code + */ + function getStatus() { + error_no_method('status', get_class($this)); + } + + /** + * Returns a short human-readable message describing results of the + * check run. By default, this message is generated in 'run' method + * (overridden in CheckSimple children) and stored via 'setMessage' + * + * @return String description of the test results + */ + function getMessage() { + return $this->_message; + } + + function setMessage($message) { + $this->_message = $message; + } +} + +/** + */ +class CheckBinary extends CheckSimple { + var $_success; + + function setSuccess($success) { + $this->_success = $success; + } + + function getSuccess() { + return $this->_success; + } +} + +/** + */ +class CheckBinaryRequired extends CheckBinary { + function getStatus() { + if ($this->getSuccess()) { + return CHECK_STATUS_SUCCESS; + } else { + return CHECK_STATUS_FAILED; + }; + } +} + +/** + */ +class CheckBinaryRecommended extends CheckBinary { + function getStatus() { + if ($this->getSuccess()) { + return CHECK_STATUS_SUCCESS; + } else { + return CHECK_STATUS_WARNING; + }; + } +} + +/** + */ +class CheckTriState extends CheckSimple { + var $_status; + + function getStatus() { + return $this->_status; + } + + function setStatus($status) { + $this->_status = $status; + } +} + +/** + * Actual checks + */ + +/** + * PHP version + */ +class CheckPHPVersion extends CheckTriState { + function title() { + return "PHP Version"; + } + + function description() { + return ""; + } + + function run() { + // > "4.3.0"; + } +} +// ManagerChecks::register(new CheckPHPVersion()); + +/** + * Required / recommended extensions + */ + +/** + * Presense of DOM/XML extensions + */ +class CheckDOM extends CheckTriState { + function title() { + return "XML DOM extension"; + } + + function description() { + return "HTML files are parsed using XML DOM extensions"; + } + + function run() { + if (function_exists('domxml_open_mem') || + class_exists('DOMDocument')) { + $this->setStatus(CHECK_STATUS_SUCCESS); + $this->setMessage('Native XML DOM extension found'); + return; + }; + + if (file_exists(HTML2PS_DIR.'classes/include.php')) { + $this->setStatus(CHECK_STATUS_WARNING); + $this->setMessage('No native XML DOM extension found, falling back to Active-State DOM XML. Note that it is highly recommended to use native PHP XML DOM extension.'); + return; + }; + + $this->setStatus(CHECK_STATUS_FAILED); + $this->setMessage('No XML DOM extension found'); + } +} + +/** + * Presense of PDFLIB extension + */ +class CheckPDFLIB extends CheckBinaryRecommended { +} + +/** + * Presense of Curl extension + */ +class CheckCurl extends CheckBinaryRecommended { + function title() { + return "Curl PHP Extension"; + } + + function description() { + return "Curl PHP extension is recommended for fetching files via HTTP protocol"; + } + + function run() { + $this->setSuccess(false); + + if (!extension_loaded('curl')) { + $this->setMessage('Missing Curl extension. Script will use pure-PHP fallback (allow_url_fopen=On is required!). Proxy support is not available'); + return; + }; + + $version = curl_version(); + // PHP 5.0.1 and greater return array instead of string + if (is_array($version)) { + $version = $version['version']; + }; + $this->setMessage(sprintf('Found Curl extension version %s.', $version['version'])); + $this->setSuccess(true); + } +} + +/** + * Presense of GD extension + */ +class CheckGD extends CheckBinaryRequired { + function title() { + return "GD PHP Extension"; + } + + function description() { + return "GD PHP extension is required for graphic file processing"; + } + + function run() { + $this->setSuccess(false); + + if (!extension_loaded('gd')) { + $this->setMessage('Missing GD extension. Please refer to PHP.net instructions on installing/enabling this extension.'); + return; + }; + + $gd_info = gd_info(); + $gd_version_string = $gd_info['GD Version']; + + /** + * Extract version number if it is a bundled version; otherwise we assume that + * version string should contain verions number only + */ + if (preg_match("/bundled \(([\d\.]+) compatible\)/", $gd_version_string, $matches)) { + $gd_version = $matches[1]; + } else { + $gd_version = $gd_version_string; + }; + + if ($gd_version < "2.0.1") { + $this->setMessage("GD version 2.0.1+ required for 'imagecreatetruecolor' function to work"); + return; + }; + + $this->setMessage("Found GD version $gd_version."); + $this->setSuccess(true); + } +} + +/** + * Presense of ZLIB extension (compressed files) + */ +class CheckZLIB extends CheckBinaryRecommended { +} + +/** + * System limits & settings + */ + +/** + * Execution time limit + */ +class CheckMaxExecutionTime extends CheckTriState { +} + +/** + * Memory limit + */ +class CheckMemoryLimit extends CheckTriState { +} + +/** + * Allow_url_fopen setting + */ +class CheckAllowURLFopen extends CheckBinaryRecommended { + function title() { + return "allow_url_fopen ini setting"; + } + + function description() { + return "allow_url_fopen should be enabled when CURL extension is not available"; + } + + function run() { + $this->setSuccess(false); + + $setting = ini_get('allow_url_fopen'); + if (!$setting) { + $this->setMessage('allow_url_fopen is disabled. You will not be able to fetch files via HTTP without CURL extension.'); + return; + } + + $this->setMessage('allow_url_fopen is enabled'); + $this->setSuccess(true); + } +} + +/** + * Access/permissions + */ + +/** + * permissions on cache directory + */ +class CheckPermissionsCache extends CheckBinaryRequired { +} + +/** + * Permissions on 'out' directory + */ +class CheckPermissionsOut extends CheckBinaryRecommended { +} + +/** + * Permissions on 'temp' directory (system-dependent) + */ +class CheckPermissionsTemp extends CheckBinaryRequired { + function title() { + return "Permissions on 'temp' subdirectory"; + } + + function description() { + return "Script should have full access to 'temp' subdirectory to keep temporary files there"; + } + + function run() { + if (!file_exists(HTML2PS_DIR.'/temp/')) { + $this->setMessage("'temp' subdirectory is missing"); + $this->setSuccess(false); + return; + }; + + if (!is_readable(HTML2PS_DIR.'/temp/')) { + $this->setMessage("'temp' subdirectory is not readable"); + $this->setSuccess(false); + return; + }; + + if (!is_writable(HTML2PS_DIR.'/temp/')) { + $this->setMessage("'temp' subdirectory is not writable"); + $this->setSuccess(false); + return; + }; + + if (!is_executable(HTML2PS_DIR.'/temp/') && PHP_OS != "WINNT") { + $this->setMessage("'temp' subdirectory is not executable"); + $this->setSuccess(false); + return; + }; + + $this->setMessage("'temp' subdirectory is fully accessible to the script"); + $this->setSuccess(true); + } +} + +/** + * Permissions/availability of GS executable + */ + +/** + * Permissions of fonts directory + */ +class CheckPermissionsFonts extends CheckBinaryRequired { + function title() { + return "Permissions on 'fonts' subdirectory"; + } + + function description() { + return "Script should be able to read 'fonts' subdirectory to access installed fonts"; + } + + function run() { + if (!file_exists(HTML2PS_DIR.'/fonts/')) { + $this->setMessage("'fonts' subdirectory is missing"); + $this->setSuccess(false); + return; + }; + + if (!is_readable(HTML2PS_DIR.'/fonts/')) { + $this->setMessage("'fonts' subdirectory is not readable"); + $this->setSuccess(false); + return; + }; + + if (!is_executable(HTML2PS_DIR.'/fonts/') && PHP_OS != "WINNT") { + $this->setMessage("'fonts' subdirectory is not executable"); + $this->setSuccess(false); + return; + }; + + $this->setMessage("'fonts' subdirectory is readable and executable by the script"); + $this->setSuccess(true); + } +} + +/** + * Permissions/presence of Type1 fonts repository + */ +class CheckPermissionsType1 extends CheckBinaryRecommended { + function title() { + return "Permissions on Type1 fonts directory"; + } + + function description() { + return "Script should be able to access Type1 fonts directory containing font metrics in order to generate Postscript files"; + } + + function run() { + if (!file_exists(TYPE1_FONTS_REPOSITORY)) { + $this->setMessage("Type1 fonts directory (".TYPE1_FONTS_REPOSITORY.") is missing. You will not be able to generate postscript files."); + $this->setSuccess(false); + return; + }; + + if (!is_readable(TYPE1_FONTS_REPOSITORY)) { + $this->setMessage("Type1 fonts directory (".TYPE1_FONTS_REPOSITORY.") is not readable. You will not be able to generate postscript files."); + $this->setSuccess(false); + return; + }; + + if (!is_executable(HTML2PS_DIR.'/fonts/') && PHP_OS != "WINNT") { + $this->setMessage("Type1 fonts directory (".TYPE1_FONTS_REPOSITORY.") is not executable. You will not be able to generate postscript files."); + $this->setSuccess(false); + return; + }; + + $this->setMessage("Type1 fonts directory is readable and executable by the script"); + $this->setSuccess(true); + } +} + +/** + * Fonts + */ + +/** + * Permissions/presense of TTF files + */ +class CheckPresenceTTF extends CheckBinaryRecommended { + function title() { + return "Presense of registered TTF files"; + } + + function description() { + return "TrueType fonts registered in html2ps.config should be present in order to generate PDF files with these fonts."; + } + + function run() { + $message = ""; + $this->setSuccess(true); + + global $g_font_resolver_pdf; + foreach ($g_font_resolver_pdf->ttf_mappings as $file) { + $fullname = HTML2PS_DIR.'/fonts/'.$file; + + if (!file_exists($fullname)) { + $message .= "Font ".$fullname." is missing. You will not be able to generate PDF files with this font.\n"; + $this->setSuccess(false); + } elseif (!file_exists($fullname)) { + $message .= "Font ".$fullname." is not readable. You will not be able to generate PDF files with this font.\n"; + $this->setSuccess(false); + } else { + $message .= "Font ".$fullname." is present and readable.\n"; + }; + }; + + $this->setMessage($message); + } +} + +/** + * Permissions/presense of Type1 fonts + */ + +/** + * Permissions/presense of AFM files for Type1 fonts + */ +class CheckPresenceType1AFM extends CheckBinaryRecommended { + function title() { + return "Presense of registered TTF files"; + } + + function description() { + return "TrueType fonts registered in html2ps.config should be present in order to generate PDF files with these fonts."; + } + + function run() { + $message = ""; + $this->setSuccess(true); + + global $g_font_resolver; + foreach ($g_font_resolver->afm_mappings as $file) { + $fullname = TYPE1_FONTS_REPOSITORY.$file.'.afm'; + + if (!file_exists($fullname)) { + $message .= "Font ".$fullname." is missing. You will not be able to generate PDF files with this font.\n"; + $this->setSuccess(false); + } elseif (!file_exists($fullname)) { + $message .= "Font ".$fullname." is not readable. You will not be able to generate PDF files with this font.\n"; + $this->setSuccess(false); + } else { + $message .= "Font ".$fullname." is present and readable.\n"; + }; + }; + + $this->setMessage($message); + } +} + +/** + * Graphics + */ + +/** + * Generic + */ +class CheckGDFormat extends CheckBinaryRequired { + function title() { + return "GD ".$this->_getFormatName()." Support"; + } + + function description() { + return "GD ".$this->_getFormatName()." Support is required for reading images in ".$this->_getFormatName()." format"; + } + + function run() { + $this->setSuccess(false); + + if (!extension_loaded('gd')) { + $this->setMessage('Missing GD extension. Please refer to PHP.net instructions on installing/enabling this extension.'); + return; + }; + + $gd_info = gd_info(); + if (!$gd_info[$this->_getInfoKey()]) { + $this->setMessage("No ".$this->_getFormatName()." support, some images will not be displayed"); + return; + }; + + $this->setMessage($this->_getFormatName()." support enabled"); + $this->setSuccess(true); + } +} + +/** + * JPEG support + */ +class CheckGDJPEG extends CheckGDFormat { + function _getFormatName() { + return "JPEG"; + } + + function _getInfoKey() { + return "JPG Support"; + } +} + +/** + * GIF support + */ +class CheckGDGIF extends CheckGDFormat { + function _getFormatName() { + return "GIF"; + } + + function _getInfoKey() { + return "GIF Read Support"; + } +} + +/** + * PNG support + */ +class CheckGDPNG extends CheckGDFormat { + function _getFormatName() { + return "PNG"; + } + + function _getInfoKey() { + return "PNG Support"; + } +} + +/** + * Freetype support + */ + +/** + * Miscellanous + */ + +/** + * Check if outgoing connections are allowed + */ +class CheckOutgoingConnections extends CheckBinary { +} + +ManagerChecks::register(new CheckDOM()); +ManagerChecks::register(new CheckCurl()); +ManagerChecks::register(new CheckAllowURLFopen()); +ManagerChecks::register(new CheckGD()); +ManagerChecks::register(new CheckGDJPEG()); +ManagerChecks::register(new CheckGDGIF()); +ManagerChecks::register(new CheckGDPNG()); +ManagerChecks::register(new CheckPermissionsTemp()); +ManagerChecks::register(new CheckPermissionsFonts()); +ManagerChecks::register(new CheckPermissionsType1()); +ManagerChecks::register(new CheckPresenceTTF()); +ManagerChecks::register(new CheckPresenceType1AFM()); + +ManagerChecks::run(); +out_header(); +out_check_list(); +out_footer(); + ?> \ No newline at end of file diff --git a/gulliver/thirdparty/html2ps_pdf/demo/test.php b/thirdparty/html2ps_pdf/demo/test.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/demo/test.php rename to thirdparty/html2ps_pdf/demo/test.php diff --git a/gulliver/thirdparty/html2ps_pdf/destination._http.class.php b/thirdparty/html2ps_pdf/destination._http.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/destination._http.class.php rename to thirdparty/html2ps_pdf/destination._http.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/destination._interface.class.php b/thirdparty/html2ps_pdf/destination._interface.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/destination._interface.class.php rename to thirdparty/html2ps_pdf/destination._interface.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/destination.browser.class.php b/thirdparty/html2ps_pdf/destination.browser.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/destination.browser.class.php rename to thirdparty/html2ps_pdf/destination.browser.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/destination.download.class.php b/thirdparty/html2ps_pdf/destination.download.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/destination.download.class.php rename to thirdparty/html2ps_pdf/destination.download.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/destination.file.class.php b/thirdparty/html2ps_pdf/destination.file.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/destination.file.class.php rename to thirdparty/html2ps_pdf/destination.file.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/dispatcher.class.php b/thirdparty/html2ps_pdf/dispatcher.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/dispatcher.class.php rename to thirdparty/html2ps_pdf/dispatcher.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/doc.anchor.class.php b/thirdparty/html2ps_pdf/doc.anchor.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/doc.anchor.class.php rename to thirdparty/html2ps_pdf/doc.anchor.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/dom.activelink.inc.php b/thirdparty/html2ps_pdf/dom.activelink.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/dom.activelink.inc.php rename to thirdparty/html2ps_pdf/dom.activelink.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/dom.php5.inc.php b/thirdparty/html2ps_pdf/dom.php5.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/dom.php5.inc.php rename to thirdparty/html2ps_pdf/dom.php5.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/encoding.cp1251.inc.php b/thirdparty/html2ps_pdf/encoding.cp1251.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/encoding.cp1251.inc.php rename to thirdparty/html2ps_pdf/encoding.cp1251.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/encoding.cp866.inc.php b/thirdparty/html2ps_pdf/encoding.cp866.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/encoding.cp866.inc.php rename to thirdparty/html2ps_pdf/encoding.cp866.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/encoding.dingbats.inc.php b/thirdparty/html2ps_pdf/encoding.dingbats.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/encoding.dingbats.inc.php rename to thirdparty/html2ps_pdf/encoding.dingbats.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/encoding.entities.inc.php b/thirdparty/html2ps_pdf/encoding.entities.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/encoding.entities.inc.php rename to thirdparty/html2ps_pdf/encoding.entities.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/encoding.glyphs.inc.php b/thirdparty/html2ps_pdf/encoding.glyphs.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/encoding.glyphs.inc.php rename to thirdparty/html2ps_pdf/encoding.glyphs.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/encoding.inc.php b/thirdparty/html2ps_pdf/encoding.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/encoding.inc.php rename to thirdparty/html2ps_pdf/encoding.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/encoding.iso-8859-1.inc.php b/thirdparty/html2ps_pdf/encoding.iso-8859-1.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/encoding.iso-8859-1.inc.php rename to thirdparty/html2ps_pdf/encoding.iso-8859-1.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/encoding.iso-8859-10.inc.php b/thirdparty/html2ps_pdf/encoding.iso-8859-10.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/encoding.iso-8859-10.inc.php rename to thirdparty/html2ps_pdf/encoding.iso-8859-10.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/encoding.iso-8859-11.inc.php b/thirdparty/html2ps_pdf/encoding.iso-8859-11.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/encoding.iso-8859-11.inc.php rename to thirdparty/html2ps_pdf/encoding.iso-8859-11.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/encoding.iso-8859-13.inc.php b/thirdparty/html2ps_pdf/encoding.iso-8859-13.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/encoding.iso-8859-13.inc.php rename to thirdparty/html2ps_pdf/encoding.iso-8859-13.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/encoding.iso-8859-14.inc.php b/thirdparty/html2ps_pdf/encoding.iso-8859-14.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/encoding.iso-8859-14.inc.php rename to thirdparty/html2ps_pdf/encoding.iso-8859-14.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/encoding.iso-8859-15.inc.php b/thirdparty/html2ps_pdf/encoding.iso-8859-15.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/encoding.iso-8859-15.inc.php rename to thirdparty/html2ps_pdf/encoding.iso-8859-15.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/encoding.iso-8859-2.inc.php b/thirdparty/html2ps_pdf/encoding.iso-8859-2.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/encoding.iso-8859-2.inc.php rename to thirdparty/html2ps_pdf/encoding.iso-8859-2.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/encoding.iso-8859-3.inc.php b/thirdparty/html2ps_pdf/encoding.iso-8859-3.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/encoding.iso-8859-3.inc.php rename to thirdparty/html2ps_pdf/encoding.iso-8859-3.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/encoding.iso-8859-4.inc.php b/thirdparty/html2ps_pdf/encoding.iso-8859-4.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/encoding.iso-8859-4.inc.php rename to thirdparty/html2ps_pdf/encoding.iso-8859-4.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/encoding.iso-8859-5.inc.php b/thirdparty/html2ps_pdf/encoding.iso-8859-5.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/encoding.iso-8859-5.inc.php rename to thirdparty/html2ps_pdf/encoding.iso-8859-5.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/encoding.iso-8859-6.inc.php b/thirdparty/html2ps_pdf/encoding.iso-8859-6.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/encoding.iso-8859-6.inc.php rename to thirdparty/html2ps_pdf/encoding.iso-8859-6.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/encoding.iso-8859-7.inc.php b/thirdparty/html2ps_pdf/encoding.iso-8859-7.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/encoding.iso-8859-7.inc.php rename to thirdparty/html2ps_pdf/encoding.iso-8859-7.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/encoding.iso-8859-8.inc.php b/thirdparty/html2ps_pdf/encoding.iso-8859-8.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/encoding.iso-8859-8.inc.php rename to thirdparty/html2ps_pdf/encoding.iso-8859-8.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/encoding.iso-8859-9.inc.php b/thirdparty/html2ps_pdf/encoding.iso-8859-9.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/encoding.iso-8859-9.inc.php rename to thirdparty/html2ps_pdf/encoding.iso-8859-9.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/encoding.koi8-r.inc.php b/thirdparty/html2ps_pdf/encoding.koi8-r.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/encoding.koi8-r.inc.php rename to thirdparty/html2ps_pdf/encoding.koi8-r.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/encoding.symbol.inc.php b/thirdparty/html2ps_pdf/encoding.symbol.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/encoding.symbol.inc.php rename to thirdparty/html2ps_pdf/encoding.symbol.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/encoding.windows-1250.inc.php b/thirdparty/html2ps_pdf/encoding.windows-1250.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/encoding.windows-1250.inc.php rename to thirdparty/html2ps_pdf/encoding.windows-1250.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/encoding.windows-1251.inc.php b/thirdparty/html2ps_pdf/encoding.windows-1251.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/encoding.windows-1251.inc.php rename to thirdparty/html2ps_pdf/encoding.windows-1251.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/encoding.windows-1252.inc.php b/thirdparty/html2ps_pdf/encoding.windows-1252.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/encoding.windows-1252.inc.php rename to thirdparty/html2ps_pdf/encoding.windows-1252.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/error.php b/thirdparty/html2ps_pdf/error.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/error.php rename to thirdparty/html2ps_pdf/error.php diff --git a/gulliver/thirdparty/html2ps_pdf/favicon.ico b/thirdparty/html2ps_pdf/favicon.ico similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/favicon.ico rename to thirdparty/html2ps_pdf/favicon.ico diff --git a/gulliver/thirdparty/html2ps_pdf/fetched_data._html.class.php b/thirdparty/html2ps_pdf/fetched_data._html.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/fetched_data._html.class.php rename to thirdparty/html2ps_pdf/fetched_data._html.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/fetched_data._interface.class.php b/thirdparty/html2ps_pdf/fetched_data._interface.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/fetched_data._interface.class.php rename to thirdparty/html2ps_pdf/fetched_data._interface.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/fetched_data.file.class.php b/thirdparty/html2ps_pdf/fetched_data.file.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/fetched_data.file.class.php rename to thirdparty/html2ps_pdf/fetched_data.file.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/fetched_data.url.class.php b/thirdparty/html2ps_pdf/fetched_data.url.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/fetched_data.url.class.php rename to thirdparty/html2ps_pdf/fetched_data.url.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/fetcher._interface.class.php b/thirdparty/html2ps_pdf/fetcher._interface.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/fetcher._interface.class.php rename to thirdparty/html2ps_pdf/fetcher._interface.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/fetcher.local.class.php b/thirdparty/html2ps_pdf/fetcher.local.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/fetcher.local.class.php rename to thirdparty/html2ps_pdf/fetcher.local.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/fetcher.memory.class.php b/thirdparty/html2ps_pdf/fetcher.memory.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/fetcher.memory.class.php rename to thirdparty/html2ps_pdf/fetcher.memory.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/fetcher.url.class.php b/thirdparty/html2ps_pdf/fetcher.url.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/fetcher.url.class.php rename to thirdparty/html2ps_pdf/fetcher.url.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/fetcher.url.curl.class.php b/thirdparty/html2ps_pdf/fetcher.url.curl.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/fetcher.url.curl.class.php rename to thirdparty/html2ps_pdf/fetcher.url.curl.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/filter.data._interface.class.php b/thirdparty/html2ps_pdf/filter.data._interface.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/filter.data._interface.class.php rename to thirdparty/html2ps_pdf/filter.data._interface.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/filter.data.doctype.class.php b/thirdparty/html2ps_pdf/filter.data.doctype.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/filter.data.doctype.class.php rename to thirdparty/html2ps_pdf/filter.data.doctype.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/filter.data.encoding.class.php b/thirdparty/html2ps_pdf/filter.data.encoding.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/filter.data.encoding.class.php rename to thirdparty/html2ps_pdf/filter.data.encoding.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/filter.data.html2xhtml.class.php b/thirdparty/html2ps_pdf/filter.data.html2xhtml.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/filter.data.html2xhtml.class.php rename to thirdparty/html2ps_pdf/filter.data.html2xhtml.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/filter.data.ucs2.class.php b/thirdparty/html2ps_pdf/filter.data.ucs2.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/filter.data.ucs2.class.php rename to thirdparty/html2ps_pdf/filter.data.ucs2.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/filter.data.utf8.class.php b/thirdparty/html2ps_pdf/filter.data.utf8.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/filter.data.utf8.class.php rename to thirdparty/html2ps_pdf/filter.data.utf8.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/filter.data.xhtml2xhtml.class.php b/thirdparty/html2ps_pdf/filter.data.xhtml2xhtml.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/filter.data.xhtml2xhtml.class.php rename to thirdparty/html2ps_pdf/filter.data.xhtml2xhtml.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/filter.output._interface.class.php b/thirdparty/html2ps_pdf/filter.output._interface.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/filter.output._interface.class.php rename to thirdparty/html2ps_pdf/filter.output._interface.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/filter.output.gzip.class.php b/thirdparty/html2ps_pdf/filter.output.gzip.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/filter.output.gzip.class.php rename to thirdparty/html2ps_pdf/filter.output.gzip.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/filter.output.ps2pdf.class.php b/thirdparty/html2ps_pdf/filter.output.ps2pdf.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/filter.output.ps2pdf.class.php rename to thirdparty/html2ps_pdf/filter.output.ps2pdf.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/filter.post._interface.class.php b/thirdparty/html2ps_pdf/filter.post._interface.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/filter.post._interface.class.php rename to thirdparty/html2ps_pdf/filter.post._interface.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/filter.post.positioned.class.php b/thirdparty/html2ps_pdf/filter.post.positioned.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/filter.post.positioned.class.php rename to thirdparty/html2ps_pdf/filter.post.positioned.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/filter.post.postponed.class.php b/thirdparty/html2ps_pdf/filter.post.postponed.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/filter.post.postponed.class.php rename to thirdparty/html2ps_pdf/filter.post.postponed.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/filter.pre._interface.class.php b/thirdparty/html2ps_pdf/filter.pre._interface.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/filter.pre._interface.class.php rename to thirdparty/html2ps_pdf/filter.pre._interface.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/filter.pre.fields.class.php b/thirdparty/html2ps_pdf/filter.pre.fields.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/filter.pre.fields.class.php rename to thirdparty/html2ps_pdf/filter.pre.fields.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/filter.pre.footnotes.class.php b/thirdparty/html2ps_pdf/filter.pre.footnotes.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/filter.pre.footnotes.class.php rename to thirdparty/html2ps_pdf/filter.pre.footnotes.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/filter.pre.headfoot.class.php b/thirdparty/html2ps_pdf/filter.pre.headfoot.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/filter.pre.headfoot.class.php rename to thirdparty/html2ps_pdf/filter.pre.headfoot.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/filter.pre.height-constraint.class.php b/thirdparty/html2ps_pdf/filter.pre.height-constraint.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/filter.pre.height-constraint.class.php rename to thirdparty/html2ps_pdf/filter.pre.height-constraint.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/flow_context.class.inc.php b/thirdparty/html2ps_pdf/flow_context.class.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/flow_context.class.inc.php rename to thirdparty/html2ps_pdf/flow_context.class.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/flow_viewport.class.inc.php b/thirdparty/html2ps_pdf/flow_viewport.class.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/flow_viewport.class.inc.php rename to thirdparty/html2ps_pdf/flow_viewport.class.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/font.class.php b/thirdparty/html2ps_pdf/font.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/font.class.php rename to thirdparty/html2ps_pdf/font.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/font.constants.inc.php b/thirdparty/html2ps_pdf/font.constants.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/font.constants.inc.php rename to thirdparty/html2ps_pdf/font.constants.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/font.resolver.class.php b/thirdparty/html2ps_pdf/font.resolver.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/font.resolver.class.php rename to thirdparty/html2ps_pdf/font.resolver.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/font_factory.class.php b/thirdparty/html2ps_pdf/font_factory.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/font_factory.class.php rename to thirdparty/html2ps_pdf/font_factory.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/fonts/arial.afm b/thirdparty/html2ps_pdf/fonts/arial.afm similarity index 97% rename from gulliver/thirdparty/html2ps_pdf/fonts/arial.afm rename to thirdparty/html2ps_pdf/fonts/arial.afm index 8ad29c04a..3ec3de493 100644 --- a/gulliver/thirdparty/html2ps_pdf/fonts/arial.afm +++ b/thirdparty/html2ps_pdf/fonts/arial.afm @@ -1,2640 +1,2640 @@ -StartFontMetrics 4.1 -FontName ArialMT -FullName Arial -Notice Typeface The Monotype Corporation plc. Data The Monotype Corporation plc/Type Solutions Inc. 1990-1992. All Rights Reserved -EncodingScheme FontSpecific -FamilyName Arial -Weight Regular -Version Version 3.00 -Characters 1674 -ItalicAngle 0.0 -Ascender 905 -Descender -212 -UnderlineThickness 73 -UnderlinePosition -106 -IsFixedPitch false -FontBBox -664 -325 2000 1006 -StartCharMetrics 1709 -C 0 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 1 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 2 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 3 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 4 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 5 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 6 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 7 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 8 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 9 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 10 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 11 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 12 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 13 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 14 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 15 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 16 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 17 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 18 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 19 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 20 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 21 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 22 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 23 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 24 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 25 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 26 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 27 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 28 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 29 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 30 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 31 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 32 ; WX 278 ; N space ; B 86 0 195 716 ; -C 33 ; WX 278 ; N exclam ; B 86 0 195 716 ; -C 34 ; WX 355 ; N quotedbl ; B 46 462 308 716 ; -C 35 ; WX 556 ; N numbersign ; B 10 -12 543 728 ; -C 36 ; WX 556 ; N dollar ; B 36 -103 509 782 ; -C 37 ; WX 889 ; N percent ; B 58 -26 828 728 ; -C 38 ; WX 667 ; N ampersand ; B 43 -17 644 728 ; -C 39 ; WX 191 ; N quotesingle ; B 44 462 144 716 ; -C 40 ; WX 333 ; N parenleft ; B 61 -210 297 728 ; -C 41 ; WX 333 ; N parenright ; B 61 -210 297 728 ; -C 42 ; WX 389 ; N asterisk ; B 31 423 354 728 ; -C 43 ; WX 584 ; N plus ; B 56 116 528 589 ; -C 44 ; WX 278 ; N comma ; B 83 -142 189 100 ; -C 45 ; WX 333 ; N hyphen ; B 32 215 302 303 ; -C 46 ; WX 278 ; N period ; B 91 0 191 100 ; -C 47 ; WX 278 ; N slash ; B 0 -12 278 728 ; -C 48 ; WX 556 ; N zero ; B 42 -12 508 719 ; -C 49 ; WX 556 ; N one ; B 109 0 373 719 ; -C 50 ; WX 556 ; N two ; B 29 0 503 719 ; -C 51 ; WX 556 ; N three ; B 42 -13 511 719 ; -C 52 ; WX 556 ; N four ; B 13 0 508 716 ; -C 53 ; WX 556 ; N five ; B 42 -12 516 706 ; -C 54 ; WX 556 ; N six ; B 38 -12 510 719 ; -C 55 ; WX 556 ; N seven ; B 47 0 511 707 ; -C 56 ; WX 556 ; N eight ; B 41 -12 512 719 ; -C 57 ; WX 556 ; N nine ; B 42 -12 512 719 ; -C 58 ; WX 278 ; N colon ; B 90 0 190 519 ; -C 59 ; WX 278 ; N semicolon ; B 83 -142 189 519 ; -C 60 ; WX 584 ; N less ; B 55 110 529 595 ; -C 61 ; WX 584 ; N equal ; B 56 204 528 503 ; -C 62 ; WX 584 ; N greater ; B 55 110 529 595 ; -C 63 ; WX 556 ; N question ; B 44 0 506 728 ; -C 64 ; WX 1015 ; N at ; B 54 -210 979 729 ; -C 65 ; WX 667 ; N A ; B -1 0 668 716 ; -C 66 ; WX 667 ; N B ; B 73 0 614 716 ; -C 67 ; WX 722 ; N C ; B 50 -12 683 728 ; -C 68 ; WX 722 ; N D ; B 77 0 669 716 ; -C 69 ; WX 667 ; N E ; B 79 0 613 716 ; -C 70 ; WX 611 ; N F ; B 82 0 565 716 ; -C 71 ; WX 778 ; N G ; B 53 -12 715 728 ; -C 72 ; WX 722 ; N H ; B 80 0 642 716 ; -C 73 ; WX 278 ; N I ; B 93 0 188 716 ; -C 74 ; WX 500 ; N J ; B 27 -12 422 716 ; -C 75 ; WX 667 ; N K ; B 73 0 665 716 ; -C 76 ; WX 556 ; N L ; B 73 0 521 716 ; -C 77 ; WX 833 ; N M ; B 74 0 757 716 ; -C 78 ; WX 722 ; N N ; B 76 0 640 716 ; -C 79 ; WX 778 ; N O ; B 48 -12 733 729 ; -C 80 ; WX 667 ; N P ; B 77 0 624 716 ; -C 81 ; WX 778 ; N Q ; B 43 -56 741 729 ; -C 82 ; WX 722 ; N R ; B 79 0 709 716 ; -C 83 ; WX 667 ; N S ; B 45 -12 615 728 ; -C 84 ; WX 611 ; N T ; B 23 0 591 716 ; -C 85 ; WX 722 ; N U ; B 79 -12 642 716 ; -C 86 ; WX 667 ; N V ; B 4 0 659 716 ; -C 87 ; WX 944 ; N W ; B 12 0 933 716 ; -C 88 ; WX 667 ; N X ; B 4 0 661 716 ; -C 89 ; WX 667 ; N Y ; B 3 0 659 716 ; -C 90 ; WX 611 ; N Z ; B 20 0 586 716 ; -C 91 ; WX 278 ; N bracketleft ; B 68 -199 262 716 ; -C 92 ; WX 278 ; N backslash ; B 0 -12 278 728 ; -C 93 ; WX 278 ; N bracketright ; B 19 -199 213 716 ; -C 94 ; WX 469 ; N asciicircum ; B 26 337 443 728 ; -C 95 ; WX 556 ; N underscore ; B -15 -199 567 -135 ; -C 96 ; WX 333 ; N grave ; B 43 583 227 720 ; -C 97 ; WX 556 ; N a ; B 36 -12 514 530 ; -C 98 ; WX 556 ; N b ; B 65 -12 515 716 ; -C 99 ; WX 500 ; N c ; B 39 -12 491 530 ; -C 100 ; WX 556 ; N d ; B 34 -12 484 716 ; -C 101 ; WX 556 ; N e ; B 37 -12 515 530 ; -C 102 ; WX 278 ; N f ; B 9 0 313 728 ; -C 103 ; WX 556 ; N g ; B 32 -210 489 530 ; -C 104 ; WX 556 ; N h ; B 66 0 488 716 ; -C 105 ; WX 222 ; N i ; B 66 0 154 716 ; -C 106 ; WX 222 ; N j ; B -46 -210 153 716 ; -C 107 ; WX 500 ; N k ; B 66 0 496 716 ; -C 108 ; WX 222 ; N l ; B 64 0 152 716 ; -C 109 ; WX 833 ; N m ; B 66 0 769 530 ; -C 110 ; WX 556 ; N n ; B 66 0 487 530 ; -C 111 ; WX 556 ; N o ; B 33 -12 519 530 ; -C 112 ; WX 556 ; N p ; B 66 -199 516 530 ; -C 113 ; WX 556 ; N q ; B 35 -199 484 530 ; -C 114 ; WX 333 ; N r ; B 65 0 347 530 ; -C 115 ; WX 500 ; N s ; B 31 -12 461 530 ; -C 116 ; WX 278 ; N t ; B 18 -7 271 700 ; -C 117 ; WX 556 ; N u ; B 64 -12 484 519 ; -C 118 ; WX 500 ; N v ; B 13 0 488 519 ; -C 119 ; WX 722 ; N w ; B 3 0 714 519 ; -C 120 ; WX 500 ; N x ; B 7 0 493 519 ; -C 121 ; WX 500 ; N y ; B 16 -210 491 519 ; -C 122 ; WX 500 ; N z ; B 20 0 479 519 ; -C 123 ; WX 334 ; N braceleft ; B 28 -210 311 728 ; -C 124 ; WX 260 ; N bar ; B 92 -210 168 728 ; -C 125 ; WX 334 ; N braceright ; B 23 -210 306 728 ; -C 126 ; WX 584 ; N asciitilde ; B 42 272 542 432 ; -C 127 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 128 ; WX 556 ; N Euro ; B -14 -12 541 728 ; -C 129 ; WX 542 ; N afii10052 ; B 79 0 542 896 ; -C 130 ; WX 222 ; N quotesinglbase ; B 53 -132 155 102 ; -C 131 ; WX 556 ; N florin ; B 22 -210 530 729 ; -C 132 ; WX 333 ; N quotedblbase ; B 35 -132 288 102 ; -C 133 ; WX 1000 ; N ellipsis ; B 117 0 884 100 ; -C 134 ; WX 556 ; N dagger ; B 36 -169 515 699 ; -C 135 ; WX 556 ; N daggerdbl ; B 36 -169 517 706 ; -C 136 ; WX 333 ; N circumflex ; B 12 583 321 720 ; -C 137 ; WX 1000 ; N perthousand ; B 18 -26 982 728 ; -C 138 ; WX 667 ; N Scaron ; B 45 -12 615 894 ; -C 139 ; WX 333 ; N guilsinglleft ; B 45 35 271 480 ; -C 140 ; WX 1000 ; N OE ; B 63 -12 968 728 ; -C 141 ; WX 583 ; N afii10061 ; B 79 0 579 896 ; -C 142 ; WX 611 ; N Zcaron ; B 20 0 586 894 ; -C 143 ; WX 719 ; N afii10145 ; B 78 -199 641 716 ; -C 144 ; WX 333 ; N quotedblbase ; B 35 -132 288 102 ; -C 145 ; WX 222 ; N quoteleft ; B 63 494 165 728 ; -C 146 ; WX 222 ; N quoteright ; B 53 489 155 723 ; -C 147 ; WX 333 ; N quotedblleft ; B 41 494 294 728 ; -C 148 ; WX 333 ; N quotedblright ; B 35 489 288 723 ; -C 149 ; WX 350 ; N bullet ; B 53 227 301 474 ; -C 150 ; WX 556 ; N endash ; B -2 224 554 294 ; -C 151 ; WX 1000 ; N emdash ; B 0 224 1000 294 ; -C 152 ; WX 333 ; N tilde ; B 3 595 330 708 ; -C 153 ; WX 1000 ; N trademark ; B 110 318 871 716 ; -C 154 ; WX 500 ; N scaron ; B 31 -12 461 720 ; -C 155 ; WX 333 ; N guilsinglright ; B 45 35 266 480 ; -C 156 ; WX 944 ; N oe ; B 40 -12 908 530 ; -C 157 ; WX 438 ; N afii10109 ; B 65 0 445 720 ; -C 158 ; WX 500 ; N zcaron ; B 20 0 479 720 ; -C 159 ; WX 667 ; N Ydieresis ; B 3 0 659 860 ; -C 160 ; WX 278 ; N space ; B 86 0 195 716 ; -C 161 ; WX 333 ; N exclamdown ; B 113 -197 222 519 ; -C 162 ; WX 556 ; N cent ; B 52 -200 505 716 ; -C 163 ; WX 556 ; N sterling ; B 13 -14 528 728 ; -C 164 ; WX 556 ; N currency ; B 36 115 516 594 ; -C 165 ; WX 556 ; N yen ; B -1 0 553 716 ; -C 166 ; WX 260 ; N brokenbar ; B 92 -210 168 728 ; -C 167 ; WX 556 ; N section ; B 40 -210 510 728 ; -C 168 ; WX 333 ; N dieresis ; B 30 620 304 720 ; -C 169 ; WX 737 ; N copyright ; B 1 -9 738 728 ; -C 170 ; WX 370 ; N ordfeminine ; B 23 364 351 728 ; -C 171 ; WX 556 ; N guillemotleft ; B 65 35 484 480 ; -C 172 ; WX 584 ; N logicalnot ; B 56 207 528 503 ; -C 173 ; WX 333 ; N hyphen ; B 32 215 302 303 ; -C 174 ; WX 737 ; N registered ; B 1 -9 738 728 ; -C 175 ; WX 552 ; N overscore ; B -15 765 567 828 ; -C 176 ; WX 400 ; N degree ; B 63 457 333 728 ; -C 177 ; WX 549 ; N plusminus ; B 38 0 511 600 ; -C 178 ; WX 333 ; N twosuperior ; B 12 358 316 725 ; -C 179 ; WX 333 ; N threesuperior ; B 16 349 315 725 ; -C 180 ; WX 333 ; N acute ; B 108 583 289 720 ; -C 181 ; WX 576 ; N mu1 ; B 78 -199 497 519 ; -C 182 ; WX 537 ; N paragraph ; B 0 -199 541 716 ; -C 183 ; WX 278 ; N periodcentered ; B 90 302 190 402 ; -C 184 ; WX 333 ; N cedilla ; B 52 -206 264 11 ; -C 185 ; WX 333 ; N onesuperior ; B 52 358 232 725 ; -C 186 ; WX 365 ; N ordmasculine ; B 22 361 342 728 ; -C 187 ; WX 556 ; N guillemotright ; B 68 35 487 480 ; -C 188 ; WX 834 ; N onequarter ; B 52 -28 819 728 ; -C 189 ; WX 834 ; N onehalf ; B 52 -28 816 728 ; -C 190 ; WX 834 ; N threequarters ; B 16 -28 819 728 ; -C 191 ; WX 611 ; N questiondown ; B 77 -209 539 519 ; -C 192 ; WX 667 ; N Agrave ; B -1 0 668 896 ; -C 193 ; WX 667 ; N Aacute ; B -1 0 668 896 ; -C 194 ; WX 667 ; N Acircumflex ; B -1 0 668 896 ; -C 195 ; WX 667 ; N Atilde ; B -1 0 668 873 ; -C 196 ; WX 667 ; N Adieresis ; B -1 0 668 860 ; -C 197 ; WX 667 ; N Aring ; B -1 0 668 869 ; -C 198 ; WX 1000 ; N AE ; B 0 0 945 716 ; -C 199 ; WX 722 ; N Ccedilla ; B 50 -206 683 728 ; -C 200 ; WX 667 ; N Egrave ; B 79 0 613 896 ; -C 201 ; WX 667 ; N Eacute ; B 79 0 613 896 ; -C 202 ; WX 667 ; N Ecircumflex ; B 79 0 613 896 ; -C 203 ; WX 667 ; N Edieresis ; B 79 0 613 860 ; -C 204 ; WX 278 ; N Igrave ; B 26 0 210 896 ; -C 205 ; WX 278 ; N Iacute ; B 69 0 249 896 ; -C 206 ; WX 278 ; N Icircumflex ; B -16 0 293 896 ; -C 207 ; WX 278 ; N Idieresis ; B 2 0 276 860 ; -C 208 ; WX 722 ; N Eth ; B -1 0 669 716 ; -C 209 ; WX 722 ; N Ntilde ; B 76 0 640 873 ; -C 210 ; WX 778 ; N Ograve ; B 48 -12 733 896 ; -C 211 ; WX 778 ; N Oacute ; B 48 -12 733 896 ; -C 212 ; WX 778 ; N Ocircumflex ; B 48 -12 733 896 ; -C 213 ; WX 778 ; N Otilde ; B 48 -12 733 873 ; -C 214 ; WX 778 ; N Odieresis ; B 48 -12 733 860 ; -C 215 ; WX 584 ; N multiply ; B 79 141 504 566 ; -C 216 ; WX 778 ; N Oslash ; B 41 -29 741 742 ; -C 217 ; WX 722 ; N Ugrave ; B 79 -12 642 896 ; -C 218 ; WX 722 ; N Uacute ; B 79 -12 642 896 ; -C 219 ; WX 722 ; N Ucircumflex ; B 79 -12 642 896 ; -C 220 ; WX 722 ; N Udieresis ; B 79 -12 642 860 ; -C 221 ; WX 667 ; N Yacute ; B 3 0 659 896 ; -C 222 ; WX 667 ; N Thorn ; B 77 0 624 716 ; -C 223 ; WX 611 ; N germandbls ; B 75 -12 580 728 ; -C 224 ; WX 556 ; N agrave ; B 36 -12 514 720 ; -C 225 ; WX 556 ; N aacute ; B 36 -12 514 720 ; -C 226 ; WX 556 ; N acircumflex ; B 36 -12 514 720 ; -C 227 ; WX 556 ; N atilde ; B 36 -12 514 708 ; -C 228 ; WX 556 ; N adieresis ; B 36 -12 514 720 ; -C 229 ; WX 556 ; N aring ; B 36 -12 514 741 ; -C 230 ; WX 889 ; N ae ; B 33 -12 849 530 ; -C 231 ; WX 500 ; N ccedilla ; B 39 -196 491 530 ; -C 232 ; WX 556 ; N egrave ; B 37 -12 515 720 ; -C 233 ; WX 556 ; N eacute ; B 37 -12 515 720 ; -C 234 ; WX 556 ; N ecircumflex ; B 37 -12 515 720 ; -C 235 ; WX 556 ; N edieresis ; B 37 -12 515 720 ; -C 236 ; WX 278 ; N igrave ; B 17 0 201 720 ; -C 237 ; WX 278 ; N iacute ; B 92 0 272 720 ; -C 238 ; WX 278 ; N icircumflex ; B -8 0 301 720 ; -C 239 ; WX 278 ; N idieresis ; B 4 0 278 720 ; -C 240 ; WX 556 ; N eth ; B 36 -12 516 716 ; -C 241 ; WX 556 ; N ntilde ; B 66 0 487 708 ; -C 242 ; WX 556 ; N ograve ; B 33 -12 519 720 ; -C 243 ; WX 556 ; N oacute ; B 33 -12 519 720 ; -C 244 ; WX 556 ; N ocircumflex ; B 33 -12 519 720 ; -C 245 ; WX 556 ; N otilde ; B 33 -12 519 708 ; -C 246 ; WX 556 ; N odieresis ; B 33 -12 519 720 ; -C 247 ; WX 549 ; N divide ; B 38 156 511 550 ; -C 248 ; WX 611 ; N oslash ; B 63 -39 549 550 ; -C 249 ; WX 556 ; N ugrave ; B 64 -12 484 720 ; -C 250 ; WX 556 ; N uacute ; B 64 -12 484 720 ; -C 251 ; WX 556 ; N ucircumflex ; B 64 -12 484 720 ; -C 252 ; WX 556 ; N udieresis ; B 64 -12 484 720 ; -C 253 ; WX 500 ; N yacute ; B 16 -210 491 720 ; -C 254 ; WX 556 ; N thorn ; B 66 -199 516 716 ; -C 255 ; WX 500 ; N ydieresis ; B 16 -210 491 720 ; -C -1 ; WX 0 ; N .null ; B 86 0 195 716 ; -C -1 ; WX 278 ; N nonmarkingreturn ; B 86 0 195 716 ; -C -1 ; WX 549 ; N notequal ; B 38 -14 511 720 ; -C -1 ; WX 713 ; N infinity ; B 75 189 640 510 ; -C -1 ; WX 549 ; N lessequal ; B 38 52 512 654 ; -C -1 ; WX 549 ; N greaterequal ; B 38 52 512 654 ; -C -1 ; WX 494 ; N partialdiff ; B 27 -12 475 728 ; -C -1 ; WX 713 ; N summation ; B 60 -210 677 728 ; -C -1 ; WX 823 ; N product ; B 79 -210 744 728 ; -C -1 ; WX 549 ; N pi1 ; B 0 0 549 519 ; -C -1 ; WX 274 ; N integral ; B 0 -107 273 910 ; -C -1 ; WX 768 ; N Ohm ; B 62 0 720 734 ; -C -1 ; WX 549 ; N radical ; B 41 -38 549 913 ; -C -1 ; WX 549 ; N approxequal ; B 25 184 524 521 ; -C -1 ; WX 612 ; N increment ; B 13 0 599 677 ; -C -1 ; WX 494 ; N lozenge ; B 23 0 472 694 ; -C -1 ; WX 167 ; N fraction ; B -222 -28 392 728 ; -C -1 ; WX 500 ; N fi ; B 11 0 432 728 ; -C -1 ; WX 500 ; N fl ; B 11 0 431 728 ; -C -1 ; WX 278 ; N dotlessi ; B 97 0 185 519 ; -C -1 ; WX 333 ; N macron ; B 14 599 319 671 ; -C -1 ; WX 333 ; N breve ; B 22 588 311 715 ; -C -1 ; WX 333 ; N dotaccent ; B 112 583 221 692 ; -C -1 ; WX 333 ; N ring ; B 79 562 255 741 ; -C -1 ; WX 333 ; N hungarumlaut ; B 28 583 373 720 ; -C -1 ; WX 333 ; N ogonek ; B 89 -208 303 12 ; -C -1 ; WX 333 ; N caron ; B 20 583 329 720 ; -C -1 ; WX 556 ; N Lslash ; B 0 0 521 716 ; -C -1 ; WX 222 ; N lslash ; B 1 0 218 716 ; -C -1 ; WX 584 ; N minus ; B 56 312 528 394 ; -C -1 ; WX 556 ; N franc ; B 0 0 506 716 ; -C -1 ; WX 778 ; N Gbreve ; B 53 -12 715 886 ; -C -1 ; WX 556 ; N gbreve ; B 32 -210 489 715 ; -C -1 ; WX 278 ; N Idot ; B 86 0 195 869 ; -C -1 ; WX 667 ; N Scedilla ; B 45 -201 615 728 ; -C -1 ; WX 500 ; N scedilla ; B 31 -196 461 530 ; -C -1 ; WX 722 ; N Cacute ; B 50 -12 683 896 ; -C -1 ; WX 500 ; N cacute ; B 39 -12 491 720 ; -C -1 ; WX 722 ; N Ccaron ; B 50 -12 683 894 ; -C -1 ; WX 500 ; N ccaron ; B 39 -12 491 720 ; -C -1 ; WX 556 ; N dmacron ; B 34 -12 555 716 ; -C -1 ; WX 333 ; N middot ; B 243 311 343 411 ; -C -1 ; WX 667 ; N Abreve ; B -1 0 668 886 ; -C -1 ; WX 556 ; N abreve ; B 36 -12 514 715 ; -C -1 ; WX 667 ; N Aogonek ; B -1 -203 756 716 ; -C -1 ; WX 556 ; N aogonek ; B 36 -196 619 530 ; -C -1 ; WX 722 ; N Dcaron ; B 77 0 669 894 ; -C -1 ; WX 615 ; N dcaron ; B 35 -12 616 716 ; -C -1 ; WX 722 ; N Dslash ; B -1 0 669 716 ; -C -1 ; WX 667 ; N Eogonek ; B 79 -208 613 716 ; -C -1 ; WX 556 ; N eogonek ; B 37 -208 515 530 ; -C -1 ; WX 667 ; N Ecaron ; B 79 0 613 894 ; -C -1 ; WX 556 ; N ecaron ; B 37 -12 515 720 ; -C -1 ; WX 556 ; N Lacute ; B 73 0 521 896 ; -C -1 ; WX 222 ; N lacute ; B 32 0 212 889 ; -C -1 ; WX 556 ; N Lcaron ; B 73 0 521 716 ; -C -1 ; WX 292 ; N lcaron ; B 66 0 291 716 ; -C -1 ; WX 556 ; N Ldot ; B 73 0 521 716 ; -C -1 ; WX 334 ; N ldot ; B 64 0 330 716 ; -C -1 ; WX 722 ; N Nacute ; B 76 0 640 896 ; -C -1 ; WX 556 ; N nacute ; B 66 0 487 720 ; -C -1 ; WX 722 ; N Ncaron ; B 76 0 640 896 ; -C -1 ; WX 556 ; N ncaron ; B 66 0 487 720 ; -C -1 ; WX 778 ; N Odblacute ; B 48 -12 733 896 ; -C -1 ; WX 556 ; N odblacute ; B 33 -12 519 720 ; -C -1 ; WX 722 ; N Racute ; B 79 0 709 896 ; -C -1 ; WX 333 ; N racute ; B 65 0 347 720 ; -C -1 ; WX 722 ; N Rcaron ; B 79 0 709 894 ; -C -1 ; WX 333 ; N rcaron ; B 29 0 347 720 ; -C -1 ; WX 667 ; N Sacute ; B 45 -12 615 896 ; -C -1 ; WX 500 ; N sacute ; B 31 -12 461 720 ; -C -1 ; WX 611 ; N Tcedilla ; B 23 -283 591 716 ; -C -1 ; WX 278 ; N tcedilla ; B 18 -260 271 700 ; -C -1 ; WX 611 ; N Tcaron ; B 23 0 591 894 ; -C -1 ; WX 375 ; N tcaron ; B 17 -7 374 716 ; -C -1 ; WX 722 ; N Uring ; B 79 -12 642 896 ; -C -1 ; WX 556 ; N uring ; B 64 -12 484 741 ; -C -1 ; WX 722 ; N Udblacute ; B 79 -12 642 896 ; -C -1 ; WX 556 ; N udblacute ; B 64 -12 484 720 ; -C -1 ; WX 611 ; N Zacute ; B 20 0 586 896 ; -C -1 ; WX 500 ; N zacute ; B 20 0 479 720 ; -C -1 ; WX 611 ; N Zdot ; B 20 0 586 869 ; -C -1 ; WX 500 ; N zdot ; B 20 0 479 692 ; -C -1 ; WX 551 ; N Gamma ; B 80 0 527 716 ; -C -1 ; WX 778 ; N Theta ; B 47 -12 731 729 ; -C -1 ; WX 798 ; N Phi ; B 42 -26 756 737 ; -C -1 ; WX 578 ; N alpha ; B 35 -12 541 530 ; -C -1 ; WX 557 ; N delta ; B 35 -12 521 716 ; -C -1 ; WX 446 ; N epsilon ; B 48 -12 423 530 ; -C -1 ; WX 617 ; N sigma ; B 33 -12 595 530 ; -C -1 ; WX 395 ; N tau ; B 22 0 372 519 ; -C -1 ; WX 648 ; N phi ; B 35 -199 614 531 ; -C -1 ; WX 552 ; N underscoredbl ; B -15 -325 567 -135 ; -C -1 ; WX 500 ; N exclamdbl ; B 86 0 414 716 ; -C -1 ; WX 365 ; N nsuperior ; B 40 253 326 585 ; -C -1 ; WX 1094 ; N peseta ; B 25 -13 1072 716 ; -C -1 ; WX 1000 ; N arrowleft ; B 39 77 961 428 ; -C -1 ; WX 500 ; N arrowup ; B 75 -209 426 654 ; -C -1 ; WX 1000 ; N arrowright ; B 39 77 961 428 ; -C -1 ; WX 500 ; N arrowdown ; B 75 -209 426 654 ; -C -1 ; WX 1000 ; N arrowboth ; B 39 77 961 429 ; -C -1 ; WX 500 ; N arrowupdn ; B 74 -208 425 714 ; -C -1 ; WX 500 ; N arrowupdnbse ; B 74 -303 425 714 ; -C -1 ; WX 979 ; N orthogonal ; B 177 0 802 625 ; -C -1 ; WX 719 ; N intersection ; B 77 0 642 729 ; -C -1 ; WX 583 ; N equivalence ; B 56 95 528 611 ; -C -1 ; WX 604 ; N house ; B 77 0 527 563 ; -C -1 ; WX 584 ; N revlogicalnot ; B 55 207 528 503 ; -C -1 ; WX 604 ; N integraltp ; B 267 -251 477 848 ; -C -1 ; WX 604 ; N integralbt ; B 127 -251 337 848 ; -C -1 ; WX 708 ; N SF100000 ; B -11 261 719 346 ; -C -1 ; WX 625 ; N SF110000 ; B 223 -303 309 910 ; -C -1 ; WX 708 ; N SF010000 ; B 312 -303 720 346 ; -C -1 ; WX 708 ; N SF030000 ; B -11 -303 396 346 ; -C -1 ; WX 708 ; N SF020000 ; B 312 261 720 910 ; -C -1 ; WX 708 ; N SF040000 ; B -11 261 396 910 ; -C -1 ; WX 708 ; N SF080000 ; B 312 -303 720 910 ; -C -1 ; WX 708 ; N SF090000 ; B -11 -303 396 910 ; -C -1 ; WX 708 ; N SF060000 ; B -11 -303 719 346 ; -C -1 ; WX 708 ; N SF070000 ; B -11 261 719 910 ; -C -1 ; WX 708 ; N SF050000 ; B -11 -303 719 910 ; -C -1 ; WX 708 ; N SF430000 ; B -11 168 719 439 ; -C -1 ; WX 708 ; N SF240000 ; B 219 -303 490 910 ; -C -1 ; WX 708 ; N SF510000 ; B 312 -303 720 439 ; -C -1 ; WX 708 ; N SF520000 ; B 219 -303 720 346 ; -C -1 ; WX 708 ; N SF390000 ; B 219 -303 719 439 ; -C -1 ; WX 708 ; N SF220000 ; B -11 -303 396 439 ; -C -1 ; WX 708 ; N SF210000 ; B -11 -303 489 346 ; -C -1 ; WX 708 ; N SF250000 ; B -11 -303 489 439 ; -C -1 ; WX 708 ; N SF500000 ; B 312 168 720 910 ; -C -1 ; WX 708 ; N SF490000 ; B 219 261 720 910 ; -C -1 ; WX 708 ; N SF380000 ; B 219 168 719 910 ; -C -1 ; WX 708 ; N SF280000 ; B -11 168 396 910 ; -C -1 ; WX 708 ; N SF270000 ; B -11 261 489 910 ; -C -1 ; WX 708 ; N SF260000 ; B -11 168 489 910 ; -C -1 ; WX 708 ; N SF360000 ; B 312 -303 720 910 ; -C -1 ; WX 708 ; N SF370000 ; B 219 -303 720 910 ; -C -1 ; WX 708 ; N SF420000 ; B 219 -303 720 910 ; -C -1 ; WX 708 ; N SF190000 ; B -11 -303 396 910 ; -C -1 ; WX 708 ; N SF200000 ; B -11 -303 489 910 ; -C -1 ; WX 708 ; N SF230000 ; B -11 -303 489 910 ; -C -1 ; WX 708 ; N SF470000 ; B -11 -303 719 439 ; -C -1 ; WX 708 ; N SF480000 ; B -11 -303 719 346 ; -C -1 ; WX 708 ; N SF410000 ; B -11 -303 719 439 ; -C -1 ; WX 708 ; N SF450000 ; B -11 168 719 910 ; -C -1 ; WX 708 ; N SF460000 ; B -11 261 719 910 ; -C -1 ; WX 708 ; N SF400000 ; B -11 168 719 910 ; -C -1 ; WX 708 ; N SF540000 ; B -11 -303 719 910 ; -C -1 ; WX 708 ; N SF530000 ; B -11 -303 719 910 ; -C -1 ; WX 708 ; N SF440000 ; B -11 -303 719 910 ; -C -1 ; WX 708 ; N upblock ; B -11 303 719 910 ; -C -1 ; WX 708 ; N dnblock ; B -11 -303 719 303 ; -C -1 ; WX 708 ; N block ; B -11 -303 719 910 ; -C -1 ; WX 708 ; N lfblock ; B -11 -303 354 910 ; -C -1 ; WX 708 ; N rtblock ; B 354 -303 720 910 ; -C -1 ; WX 708 ; N ltshade ; B 50 -246 719 910 ; -C -1 ; WX 708 ; N shade ; B -11 -246 719 910 ; -C -1 ; WX 729 ; N dkshade ; B 0 -307 729 910 ; -C -1 ; WX 604 ; N filledbox ; B 71 0 532 461 ; -C -1 ; WX 1000 ; N filledrect ; B 0 155 1000 343 ; -C -1 ; WX 990 ; N triagup ; B 148 0 842 693 ; -C -1 ; WX 990 ; N triagrt ; B 141 -15 849 692 ; -C -1 ; WX 990 ; N triagdn ; B 148 -15 842 678 ; -C -1 ; WX 990 ; N triaglf ; B 141 -15 849 692 ; -C -1 ; WX 604 ; N circle ; B 87 67 517 497 ; -C -1 ; WX 604 ; N invbullet ; B 63 0 541 479 ; -C -1 ; WX 604 ; N invcircle ; B 21 0 584 564 ; -C -1 ; WX 1021 ; N smileface ; B 199 -58 822 564 ; -C -1 ; WX 1052 ; N invsmileface ; B 215 -58 837 564 ; -C -1 ; WX 917 ; N sun ; B 8 -109 909 792 ; -C -1 ; WX 750 ; N female ; B 119 -214 630 736 ; -C -1 ; WX 750 ; N male ; B 54 -128 691 791 ; -C -1 ; WX 531 ; N spade ; B 28 0 503 601 ; -C -1 ; WX 656 ; N club ; B 27 0 629 601 ; -C -1 ; WX 594 ; N heart ; B 31 -12 563 601 ; -C -1 ; WX 510 ; N diamond ; B 31 -12 479 601 ; -C -1 ; WX 500 ; N musicalnote ; B 18 -18 482 666 ; -C -1 ; WX 750 ; N musicalnotedbl ; B 42 -63 649 742 ; -C -1 ; WX 735 ; N IJ ; B 93 -12 684 716 ; -C -1 ; WX 444 ; N ij ; B 66 -210 387 716 ; -C -1 ; WX 604 ; N napostrophe ; B 53 0 604 723 ; -C -1 ; WX 188 ; N minute ; B 63 462 194 716 ; -C -1 ; WX 354 ; N second ; B 63 462 333 716 ; -C -1 ; WX 885 ; N afii61248 ; B 47 -26 838 728 ; -C -1 ; WX 323 ; N afii61289 ; B 7 -12 315 728 ; -C -1 ; WX 604 ; N H22073 ; B 71 0 532 461 ; -C -1 ; WX 354 ; N H18543 ; B 64 217 290 443 ; -C -1 ; WX 354 ; N H18551 ; B 64 217 290 443 ; -C -1 ; WX 604 ; N H18533 ; B 87 67 517 497 ; -C -1 ; WX 354 ; N openbullet ; B 55 208 300 453 ; -C -1 ; WX 667 ; N Amacron ; B -1 0 668 843 ; -C -1 ; WX 556 ; N amacron ; B 36 -12 514 671 ; -C -1 ; WX 722 ; N Ccircumflex ; B 50 -12 683 894 ; -C -1 ; WX 500 ; N ccircumflex ; B 39 -12 491 720 ; -C -1 ; WX 722 ; N Cdot ; B 50 -12 683 888 ; -C -1 ; WX 500 ; N cdot ; B 39 -12 491 692 ; -C -1 ; WX 667 ; N Emacron ; B 79 0 613 848 ; -C -1 ; WX 556 ; N emacron ; B 37 -12 515 671 ; -C -1 ; WX 667 ; N Ebreve ; B 79 0 613 892 ; -C -1 ; WX 556 ; N ebreve ; B 37 -12 515 715 ; -C -1 ; WX 667 ; N Edot ; B 79 0 613 869 ; -C -1 ; WX 556 ; N edot ; B 37 -12 515 692 ; -C -1 ; WX 778 ; N Gcircumflex ; B 53 -12 715 891 ; -C -1 ; WX 556 ; N gcircumflex ; B 32 -210 489 720 ; -C -1 ; WX 778 ; N Gdot ; B 53 -12 715 864 ; -C -1 ; WX 556 ; N gdot ; B 32 -210 489 692 ; -C -1 ; WX 778 ; N Gcedilla ; B 53 -206 715 728 ; -C -1 ; WX 556 ; N gcedilla ; B 32 -210 489 770 ; -C -1 ; WX 722 ; N Hcircumflex ; B 80 0 642 896 ; -C -1 ; WX 556 ; N hcircumflex ; B 66 0 488 896 ; -C -1 ; WX 722 ; N Hbar ; B 15 0 707 716 ; -C -1 ; WX 556 ; N hbar ; B 3 0 488 716 ; -C -1 ; WX 278 ; N Itilde ; B -31 0 296 885 ; -C -1 ; WX 278 ; N itilde ; B -22 0 305 708 ; -C -1 ; WX 278 ; N Imacron ; B -14 0 291 835 ; -C -1 ; WX 278 ; N imacron ; B -11 0 293 671 ; -C -1 ; WX 278 ; N Ibreve ; B 0 0 288 879 ; -C -1 ; WX 278 ; N ibreve ; B -3 0 286 715 ; -C -1 ; WX 278 ; N Iogonek ; B 80 -208 293 716 ; -C -1 ; WX 222 ; N iogonek ; B 50 -208 264 716 ; -C -1 ; WX 500 ; N Jcircumflex ; B 27 -12 541 896 ; -C -1 ; WX 222 ; N jcircumflex ; B -46 -210 266 720 ; -C -1 ; WX 667 ; N Kcedilla ; B 73 -206 665 716 ; -C -1 ; WX 500 ; N kcedilla ; B 66 -206 496 716 ; -C -1 ; WX 500 ; N kgreenlandic ; B 65 0 495 519 ; -C -1 ; WX 556 ; N Lcedilla ; B 73 -206 521 716 ; -C -1 ; WX 222 ; N lcedilla ; B -1 -206 210 716 ; -C -1 ; WX 722 ; N Ncedilla ; B 76 -206 640 716 ; -C -1 ; WX 556 ; N ncedilla ; B 66 -206 487 530 ; -C -1 ; WX 723 ; N Eng ; B 81 -12 670 728 ; -C -1 ; WX 556 ; N eng ; B 68 -210 489 530 ; -C -1 ; WX 778 ; N Omacron ; B 48 -12 733 853 ; -C -1 ; WX 556 ; N omacron ; B 33 -12 519 671 ; -C -1 ; WX 778 ; N Obreve ; B 48 -12 733 892 ; -C -1 ; WX 556 ; N obreve ; B 33 -12 519 715 ; -C -1 ; WX 722 ; N Rcedilla ; B 79 -206 709 716 ; -C -1 ; WX 333 ; N rcedilla ; B 65 -206 347 530 ; -C -1 ; WX 667 ; N Scircumflex ; B 45 -12 615 894 ; -C -1 ; WX 500 ; N scircumflex ; B 31 -12 461 720 ; -C -1 ; WX 611 ; N Tbar ; B 23 0 591 716 ; -C -1 ; WX 278 ; N tbar ; B 6 -7 259 700 ; -C -1 ; WX 722 ; N Utilde ; B 79 -12 642 882 ; -C -1 ; WX 556 ; N utilde ; B 64 -12 484 708 ; -C -1 ; WX 722 ; N Umacron ; B 79 -12 642 845 ; -C -1 ; WX 556 ; N umacron ; B 64 -12 484 671 ; -C -1 ; WX 722 ; N Ubreve ; B 79 -12 642 889 ; -C -1 ; WX 556 ; N ubreve ; B 64 -12 484 715 ; -C -1 ; WX 722 ; N Uogonek ; B 79 -208 642 716 ; -C -1 ; WX 556 ; N uogonek ; B 64 -208 603 519 ; -C -1 ; WX 944 ; N Wcircumflex ; B 12 0 933 896 ; -C -1 ; WX 722 ; N wcircumflex ; B 3 0 714 720 ; -C -1 ; WX 667 ; N Ycircumflex ; B 3 0 659 896 ; -C -1 ; WX 500 ; N ycircumflex ; B 16 -210 491 720 ; -C -1 ; WX 222 ; N longs ; B 67 0 292 728 ; -C -1 ; WX 667 ; N Aringacute ; B -1 0 668 1006 ; -C -1 ; WX 556 ; N aringacute ; B 36 -12 514 939 ; -C -1 ; WX 1000 ; N AEacute ; B 0 0 945 896 ; -C -1 ; WX 889 ; N aeacute ; B 33 -12 849 720 ; -C -1 ; WX 778 ; N Oslashacute ; B 41 -29 741 896 ; -C -1 ; WX 611 ; N oslashacute ; B 63 -39 549 720 ; -C -1 ; WX 278 ; N anoteleia ; B 90 418 190 519 ; -C -1 ; WX 944 ; N Wgrave ; B 12 0 933 896 ; -C -1 ; WX 722 ; N wgrave ; B 3 0 714 720 ; -C -1 ; WX 944 ; N Wacute ; B 12 0 933 896 ; -C -1 ; WX 722 ; N wacute ; B 3 0 714 720 ; -C -1 ; WX 944 ; N Wdieresis ; B 12 0 933 860 ; -C -1 ; WX 722 ; N wdieresis ; B 3 0 714 720 ; -C -1 ; WX 667 ; N Ygrave ; B 3 0 659 896 ; -C -1 ; WX 500 ; N ygrave ; B 16 -210 491 720 ; -C -1 ; WX 222 ; N quotereversed ; B 67 489 169 723 ; -C -1 ; WX 333 ; N radicalex ; B -15 599 349 671 ; -C -1 ; WX 556 ; N afii08941 ; B 13 -14 528 728 ; -C -1 ; WX 600 ; N estimated ; B 44 -17 561 535 ; -C -1 ; WX 834 ; N oneeighth ; B 52 -28 813 728 ; -C -1 ; WX 834 ; N threeeighths ; B 17 -28 813 728 ; -C -1 ; WX 834 ; N fiveeighths ; B 17 -28 813 728 ; -C -1 ; WX 834 ; N seveneighths ; B 36 -28 813 728 ; -C -1 ; WX 333 ; N commaaccent ; B 110 -269 219 -71 ; -C -1 ; WX 333 ; N undercommaaccent ; B 52 -206 264 -22 ; -C -1 ; WX 333 ; N tonos ; B 108 583 289 720 ; -C -1 ; WX 333 ; N dieresistonos ; B -11 601 344 736 ; -C -1 ; WX 667 ; N Alphatonos ; B 0 0 669 716 ; -C -1 ; WX 784 ; N Epsilontonos ; B -43 0 730 716 ; -C -1 ; WX 838 ; N Etatonos ; B -43 0 737 716 ; -C -1 ; WX 384 ; N Iotatonos ; B -43 0 271 716 ; -C -1 ; WX 774 ; N Omicrontonos ; B -43 -12 728 729 ; -C -1 ; WX 855 ; N Upsilontonos ; B -43 0 842 716 ; -C -1 ; WX 752 ; N Omegatonos ; B -43 0 706 728 ; -C -1 ; WX 222 ; N iotadieresistonos ; B -66 0 289 736 ; -C -1 ; WX 667 ; N Alpha ; B -1 0 668 716 ; -C -1 ; WX 667 ; N Beta ; B 73 0 614 716 ; -C -1 ; WX 668 ; N Delta ; B -1 0 669 716 ; -C -1 ; WX 667 ; N Epsilon ; B 79 0 613 716 ; -C -1 ; WX 611 ; N Zeta ; B 20 0 586 716 ; -C -1 ; WX 722 ; N Eta ; B 80 0 642 716 ; -C -1 ; WX 278 ; N Iota ; B 93 0 188 716 ; -C -1 ; WX 667 ; N Kappa ; B 73 0 665 716 ; -C -1 ; WX 668 ; N Lambda ; B 5 0 660 716 ; -C -1 ; WX 833 ; N Mu ; B 74 0 757 716 ; -C -1 ; WX 722 ; N Nu ; B 76 0 640 716 ; -C -1 ; WX 650 ; N Xi ; B 53 0 597 716 ; -C -1 ; WX 778 ; N Omicron ; B 48 -12 733 729 ; -C -1 ; WX 722 ; N Pi ; B 80 0 642 716 ; -C -1 ; WX 667 ; N Rho ; B 77 0 624 716 ; -C -1 ; WX 618 ; N Sigma ; B 72 0 579 716 ; -C -1 ; WX 611 ; N Tau ; B 23 0 591 716 ; -C -1 ; WX 667 ; N Upsilon ; B 3 0 659 716 ; -C -1 ; WX 667 ; N Chi ; B 4 0 661 716 ; -C -1 ; WX 835 ; N Psi ; B 62 0 773 716 ; -C -1 ; WX 748 ; N Omega ; B 47 0 701 728 ; -C -1 ; WX 278 ; N Iotadieresis ; B 2 0 276 860 ; -C -1 ; WX 667 ; N Upsilondieresis ; B 3 0 659 860 ; -C -1 ; WX 578 ; N alphatonos ; B 35 -12 541 720 ; -C -1 ; WX 446 ; N epsilontonos ; B 48 -12 423 720 ; -C -1 ; WX 556 ; N etatonos ; B 68 -199 489 720 ; -C -1 ; WX 222 ; N iotatonos ; B 48 0 229 720 ; -C -1 ; WX 547 ; N upsilondieresistonos ; B 66 -12 481 736 ; -C -1 ; WX 575 ; N beta ; B 68 -199 530 728 ; -C -1 ; WX 500 ; N gamma ; B 12 -199 488 519 ; -C -1 ; WX 441 ; N zeta ; B 35 -210 433 716 ; -C -1 ; WX 556 ; N eta ; B 68 -199 489 530 ; -C -1 ; WX 556 ; N theta ; B 45 -12 512 728 ; -C -1 ; WX 222 ; N iota ; B 67 0 155 519 ; -C -1 ; WX 500 ; N kappa ; B 65 0 500 519 ; -C -1 ; WX 500 ; N lambda ; B 12 0 487 716 ; -C -1 ; WX 576 ; N mu ; B 78 -199 497 519 ; -C -1 ; WX 500 ; N nu ; B 13 0 488 519 ; -C -1 ; WX 448 ; N xi ; B 45 -210 430 728 ; -C -1 ; WX 556 ; N omicron ; B 33 -12 519 530 ; -C -1 ; WX 569 ; N rho ; B 64 -199 534 530 ; -C -1 ; WX 482 ; N sigma1 ; B 42 -210 472 530 ; -C -1 ; WX 547 ; N upsilon ; B 66 -12 481 519 ; -C -1 ; WX 525 ; N chi ; B 8 -199 516 519 ; -C -1 ; WX 713 ; N psi ; B 60 -199 653 519 ; -C -1 ; WX 781 ; N omega ; B 42 -12 738 519 ; -C -1 ; WX 222 ; N iotadieresis ; B -23 0 251 720 ; -C -1 ; WX 547 ; N upsilondieresis ; B 66 -12 481 720 ; -C -1 ; WX 556 ; N omicrontonos ; B 33 -12 519 720 ; -C -1 ; WX 547 ; N upsilontonos ; B 66 -12 481 720 ; -C -1 ; WX 781 ; N omegatonos ; B 42 -12 738 720 ; -C -1 ; WX 667 ; N afii10023 ; B 79 0 613 860 ; -C -1 ; WX 865 ; N afii10051 ; B 24 -12 825 716 ; -C -1 ; WX 719 ; N afii10053 ; B 49 -12 683 728 ; -C -1 ; WX 667 ; N afii10054 ; B 45 -12 615 728 ; -C -1 ; WX 278 ; N afii10055 ; B 93 0 188 716 ; -C -1 ; WX 278 ; N afii10056 ; B 2 0 276 860 ; -C -1 ; WX 500 ; N afii10057 ; B 27 -12 422 716 ; -C -1 ; WX 1057 ; N afii10058 ; B 6 -12 1020 716 ; -C -1 ; WX 1010 ; N afii10059 ; B 80 0 973 716 ; -C -1 ; WX 854 ; N afii10060 ; B 24 0 809 716 ; -C -1 ; WX 635 ; N afii10062 ; B 5 -10 632 886 ; -C -1 ; WX 667 ; N afii10017 ; B -1 0 668 716 ; -C -1 ; WX 656 ; N afii10018 ; B 82 0 621 716 ; -C -1 ; WX 667 ; N afii10019 ; B 73 0 614 716 ; -C -1 ; WX 542 ; N afii10020 ; B 79 0 542 716 ; -C -1 ; WX 677 ; N afii10021 ; B 0 -167 642 716 ; -C -1 ; WX 667 ; N afii10022 ; B 79 0 613 716 ; -C -1 ; WX 923 ; N afii10024 ; B 3 0 919 716 ; -C -1 ; WX 604 ; N afii10025 ; B 38 -12 563 728 ; -C -1 ; WX 719 ; N afii10026 ; B 79 0 641 716 ; -C -1 ; WX 719 ; N afii10027 ; B 79 0 641 886 ; -C -1 ; WX 583 ; N afii10028 ; B 79 0 579 716 ; -C -1 ; WX 656 ; N afii10029 ; B 9 -12 578 716 ; -C -1 ; WX 833 ; N afii10030 ; B 74 0 757 716 ; -C -1 ; WX 722 ; N afii10031 ; B 80 0 642 716 ; -C -1 ; WX 778 ; N afii10032 ; B 48 -12 733 729 ; -C -1 ; WX 719 ; N afii10033 ; B 78 0 641 716 ; -C -1 ; WX 667 ; N afii10034 ; B 77 0 624 716 ; -C -1 ; WX 722 ; N afii10035 ; B 50 -12 683 728 ; -C -1 ; WX 611 ; N afii10036 ; B 23 0 591 716 ; -C -1 ; WX 635 ; N afii10037 ; B 5 -10 632 716 ; -C -1 ; WX 760 ; N afii10038 ; B 40 0 720 722 ; -C -1 ; WX 667 ; N afii10039 ; B 4 0 661 716 ; -C -1 ; WX 740 ; N afii10040 ; B 78 -199 706 716 ; -C -1 ; WX 667 ; N afii10041 ; B 42 0 588 716 ; -C -1 ; WX 917 ; N afii10042 ; B 79 0 838 716 ; -C -1 ; WX 938 ; N afii10043 ; B 79 -199 903 716 ; -C -1 ; WX 792 ; N afii10044 ; B 0 0 757 716 ; -C -1 ; WX 885 ; N afii10045 ; B 82 0 802 716 ; -C -1 ; WX 656 ; N afii10046 ; B 81 0 620 716 ; -C -1 ; WX 719 ; N afii10047 ; B 36 -12 670 728 ; -C -1 ; WX 1010 ; N afii10048 ; B 80 -12 959 728 ; -C -1 ; WX 722 ; N afii10049 ; B 13 0 644 716 ; -C -1 ; WX 556 ; N afii10065 ; B 36 -12 514 530 ; -C -1 ; WX 573 ; N afii10066 ; B 44 -12 533 733 ; -C -1 ; WX 531 ; N afii10067 ; B 66 0 492 519 ; -C -1 ; WX 365 ; N afii10068 ; B 66 0 365 519 ; -C -1 ; WX 583 ; N afii10069 ; B 0 -147 553 519 ; -C -1 ; WX 556 ; N afii10070 ; B 37 -12 515 530 ; -C -1 ; WX 669 ; N afii10072 ; B -2 0 672 519 ; -C -1 ; WX 458 ; N afii10073 ; B 24 -12 423 530 ; -C -1 ; WX 559 ; N afii10074 ; B 66 0 492 519 ; -C -1 ; WX 559 ; N afii10075 ; B 66 0 492 715 ; -C -1 ; WX 438 ; N afii10076 ; B 65 0 445 519 ; -C -1 ; WX 583 ; N afii10077 ; B 12 -3 517 519 ; -C -1 ; WX 688 ; N afii10078 ; B 68 0 619 519 ; -C -1 ; WX 552 ; N afii10079 ; B 66 0 486 519 ; -C -1 ; WX 556 ; N afii10080 ; B 33 -12 519 530 ; -C -1 ; WX 542 ; N afii10081 ; B 66 0 476 519 ; -C -1 ; WX 556 ; N afii10082 ; B 66 -199 516 530 ; -C -1 ; WX 500 ; N afii10083 ; B 39 -12 491 530 ; -C -1 ; WX 458 ; N afii10084 ; B 19 0 440 519 ; -C -1 ; WX 500 ; N afii10085 ; B 16 -210 491 519 ; -C -1 ; WX 823 ; N afii10086 ; B 37 -199 786 716 ; -C -1 ; WX 500 ; N afii10087 ; B 7 0 493 519 ; -C -1 ; WX 573 ; N afii10088 ; B 67 -147 543 519 ; -C -1 ; WX 521 ; N afii10089 ; B 34 0 455 519 ; -C -1 ; WX 802 ; N afii10090 ; B 69 0 733 519 ; -C -1 ; WX 823 ; N afii10091 ; B 69 -147 791 519 ; -C -1 ; WX 625 ; N afii10092 ; B 20 0 589 519 ; -C -1 ; WX 719 ; N afii10093 ; B 68 0 647 519 ; -C -1 ; WX 521 ; N afii10094 ; B 64 0 490 519 ; -C -1 ; WX 510 ; N afii10095 ; B 21 -18 474 530 ; -C -1 ; WX 750 ; N afii10096 ; B 67 -12 709 530 ; -C -1 ; WX 542 ; N afii10097 ; B 15 0 474 519 ; -C -1 ; WX 556 ; N afii10071 ; B 37 -12 515 720 ; -C -1 ; WX 556 ; N afii10099 ; B 0 -210 488 716 ; -C -1 ; WX 365 ; N afii10100 ; B 66 0 365 720 ; -C -1 ; WX 510 ; N afii10101 ; B 37 -18 489 530 ; -C -1 ; WX 500 ; N afii10102 ; B 31 -12 461 530 ; -C -1 ; WX 222 ; N afii10103 ; B 66 0 154 716 ; -C -1 ; WX 278 ; N afii10104 ; B 4 0 278 720 ; -C -1 ; WX 222 ; N afii10105 ; B -46 -210 153 716 ; -C -1 ; WX 906 ; N afii10106 ; B 9 -3 871 519 ; -C -1 ; WX 813 ; N afii10107 ; B 64 0 778 519 ; -C -1 ; WX 556 ; N afii10108 ; B 0 0 488 716 ; -C -1 ; WX 500 ; N afii10110 ; B 16 -210 491 715 ; -C -1 ; WX 552 ; N afii10193 ; B 66 -147 486 519 ; -C -1 ; WX 489 ; N afii10050 ; B 79 0 459 914 ; -C -1 ; WX 411 ; N afii10098 ; B 66 0 381 717 ; -C -1 ; WX 1000 ; N afii00208 ; B 32 224 969 294 ; -C -1 ; WX 1073 ; N afii61352 ; B 78 0 1031 716 ; -C -1 ; WX 690 ; N pi ; B 22 0 668 519 ; -C -1 ; WX 333 ; N sheva ; B 125 -210 208 -24 ; -C -1 ; WX 333 ; N hatafsegol ; B 15 -210 318 -24 ; -C -1 ; WX 333 ; N hatafpatah ; B 24 -210 309 -24 ; -C -1 ; WX 333 ; N hatafqamats ; B 24 -210 309 -24 ; -C -1 ; WX 333 ; N hiriq ; B 125 -180 208 -98 ; -C -1 ; WX 333 ; N tsere ; B 62 -180 271 -98 ; -C -1 ; WX 333 ; N segol ; B 62 -210 271 -24 ; -C -1 ; WX 333 ; N patah ; B 68 -154 265 -103 ; -C -1 ; WX 333 ; N qamats ; B 68 -210 265 -77 ; -C -1 ; WX 333 ; N holam ; B 125 577 208 659 ; -C -1 ; WX 333 ; N qubuts ; B 8 -210 325 -25 ; -C -1 ; WX 333 ; N dagesh ; B 125 241 208 323 ; -C -1 ; WX 333 ; N meteg ; B 141 -210 192 -25 ; -C -1 ; WX 383 ; N maqaf ; B 61 440 322 518 ; -C -1 ; WX 333 ; N rafe ; B 68 611 265 662 ; -C -1 ; WX 275 ; N paseq ; B 103 -10 172 625 ; -C -1 ; WX 333 ; N shindot ; B 380 577 462 660 ; -C -1 ; WX 333 ; N sindot ; B -123 577 -41 660 ; -C -1 ; WX 278 ; N sofpasuq ; B 90 0 190 519 ; -C -1 ; WX 563 ; N alef ; B 51 0 536 518 ; -C -1 ; WX 542 ; N bet ; B 24 0 520 524 ; -C -1 ; WX 399 ; N gimel ; B 12 0 363 524 ; -C -1 ; WX 508 ; N dalet ; B 22 0 486 518 ; -C -1 ; WX 602 ; N he ; B 73 0 531 524 ; -C -1 ; WX 247 ; N vav ; B 76 0 171 518 ; -C -1 ; WX 382 ; N zayin ; B 46 0 360 518 ; -C -1 ; WX 599 ; N het ; B 76 0 528 524 ; -C -1 ; WX 590 ; N tet ; B 68 -14 531 529 ; -C -1 ; WX 247 ; N yod ; B 76 250 171 518 ; -C -1 ; WX 509 ; N finalkaf ; B 20 -199 438 524 ; -C -1 ; WX 461 ; N kaf ; B 39 -8 417 527 ; -C -1 ; WX 463 ; N lamed ; B 29 0 409 716 ; -C -1 ; WX 599 ; N finalmem ; B 76 0 528 524 ; -C -1 ; WX 601 ; N mem ; B 39 0 530 524 ; -C -1 ; WX 247 ; N finalnun ; B 76 -199 171 518 ; -C -1 ; WX 353 ; N nun ; B 29 0 279 524 ; -C -1 ; WX 574 ; N samekh ; B 44 -15 530 532 ; -C -1 ; WX 529 ; N ayin ; B 12 -48 463 518 ; -C -1 ; WX 566 ; N finalpe ; B 54 -199 496 524 ; -C -1 ; WX 546 ; N pe ; B 56 -8 502 527 ; -C -1 ; WX 461 ; N finaltsadi ; B 12 -199 422 518 ; -C -1 ; WX 479 ; N tsadi ; B 5 0 425 518 ; -C -1 ; WX 550 ; N qof ; B 73 -199 496 518 ; -C -1 ; WX 509 ; N resh ; B 20 0 438 524 ; -C -1 ; WX 694 ; N shin ; B 49 -14 646 518 ; -C -1 ; WX 643 ; N tav ; B 20 -4 572 524 ; -C -1 ; WX 493 ; N doublevav ; B 76 0 417 518 ; -C -1 ; WX 493 ; N vavyod ; B 76 0 417 518 ; -C -1 ; WX 493 ; N doubleyod ; B 76 250 417 518 ; -C -1 ; WX 236 ; N geresh ; B 44 330 192 518 ; -C -1 ; WX 417 ; N gershayim ; B 44 330 373 518 ; -C -1 ; WX 815 ; N newsheqelsign ; B 76 0 740 518 ; -C -1 ; WX 247 ; N vavshindot ; B -41 0 171 660 ; -C -1 ; WX 509 ; N finalkafsheva ; B 20 -199 438 524 ; -C -1 ; WX 509 ; N finalkafqamats ; B 20 -199 438 524 ; -C -1 ; WX 463 ; N lamedholam ; B -83 0 409 716 ; -C -1 ; WX 463 ; N lamedholamdagesh ; B -83 0 409 716 ; -C -1 ; WX 535 ; N altayin ; B 22 0 469 518 ; -C -1 ; WX 694 ; N shinshindot ; B 49 -14 646 659 ; -C -1 ; WX 694 ; N shinsindot ; B 49 -14 646 659 ; -C -1 ; WX 694 ; N shindageshshindot ; B 49 -14 646 659 ; -C -1 ; WX 694 ; N shindageshsindot ; B 49 -14 646 659 ; -C -1 ; WX 563 ; N alefpatah ; B 51 -154 536 518 ; -C -1 ; WX 563 ; N alefqamats ; B 51 -210 536 518 ; -C -1 ; WX 563 ; N alefmapiq ; B 51 0 536 518 ; -C -1 ; WX 542 ; N betdagesh ; B 24 0 520 524 ; -C -1 ; WX 399 ; N gimeldagesh ; B 12 0 363 524 ; -C -1 ; WX 508 ; N daletdagesh ; B 22 0 486 518 ; -C -1 ; WX 602 ; N hedagesh ; B 73 0 531 524 ; -C -1 ; WX 287 ; N vavdagesh ; B 0 0 211 518 ; -C -1 ; WX 411 ; N zayindagesh ; B 0 0 404 518 ; -C -1 ; WX 590 ; N tetdagesh ; B 68 -14 531 529 ; -C -1 ; WX 287 ; N yoddagesh ; B 0 250 211 518 ; -C -1 ; WX 509 ; N finalkafdagesh ; B 20 -199 438 524 ; -C -1 ; WX 461 ; N kafdagesh ; B 39 -8 417 527 ; -C -1 ; WX 463 ; N lameddagesh ; B 29 0 409 716 ; -C -1 ; WX 601 ; N memdagesh ; B 39 0 530 524 ; -C -1 ; WX 353 ; N nundagesh ; B 29 0 279 524 ; -C -1 ; WX 574 ; N samekhdagesh ; B 44 -15 530 532 ; -C -1 ; WX 566 ; N finalpedagesh ; B 54 -199 496 524 ; -C -1 ; WX 546 ; N pedagesh ; B 56 -8 502 527 ; -C -1 ; WX 479 ; N tsadidagesh ; B 5 0 425 518 ; -C -1 ; WX 550 ; N qofdagesh ; B 73 -199 496 518 ; -C -1 ; WX 509 ; N reshdagesh ; B 20 0 438 524 ; -C -1 ; WX 694 ; N shindagesh ; B 49 -14 646 518 ; -C -1 ; WX 643 ; N tavdages ; B 20 -4 572 524 ; -C -1 ; WX 247 ; N vavholam ; B 76 0 171 659 ; -C -1 ; WX 542 ; N betrafe ; B 24 0 520 662 ; -C -1 ; WX 461 ; N kafrafe ; B 39 -8 417 662 ; -C -1 ; WX 546 ; N perafe ; B 56 -8 502 662 ; -C -1 ; WX 576 ; N aleflamed ; B 29 0 549 716 ; -C -1 ; WX 0 ; N zerowidthnonjoiner ; B -18 -134 18 629 ; -C -1 ; WX 0 ; N zerowidthjoiner ; B -107 -134 107 690 ; -C -1 ; WX 0 ; N lefttorightmark ; B -18 -134 210 690 ; -C -1 ; WX 0 ; N righttoleftmark ; B -210 -134 17 690 ; -C -1 ; WX 319 ; N afii57388 ; B 83 137 241 443 ; -C -1 ; WX 319 ; N afii57403 ; B 78 136 235 609 ; -C -1 ; WX 356 ; N afii57407 ; B 33 137 326 711 ; -C -1 ; WX 413 ; N afii57409 ; B 59 72 363 400 ; -C -1 ; WX 207 ; N afii57440 ; B -34 143 207 228 ; -C -1 ; WX 201 ; N afii57451 ; B 34 605 201 780 ; -C -1 ; WX 237 ; N afii57452 ; B 34 605 237 794 ; -C -1 ; WX 201 ; N afii57453 ; B 34 -130 201 44 ; -C -1 ; WX 201 ; N afii57454 ; B 34 673 201 774 ; -C -1 ; WX 209 ; N afii57455 ; B 35 605 209 817 ; -C -1 ; WX 201 ; N afii57456 ; B 34 -21 201 80 ; -C -1 ; WX 211 ; N afii57457 ; B 34 605 211 762 ; -C -1 ; WX 165 ; N afii57458 ; B 34 605 165 756 ; -C -1 ; WX 526 ; N afii57392 ; B 186 219 344 452 ; -C -1 ; WX 526 ; N afii57393 ; B 147 143 327 716 ; -C -1 ; WX 526 ; N afii57394 ; B 89 143 391 723 ; -C -1 ; WX 526 ; N afii57395 ; B 63 143 471 723 ; -C -1 ; WX 526 ; N afii57396 ; B 146 143 397 713 ; -C -1 ; WX 526 ; N afii57397 ; B 93 247 438 622 ; -C -1 ; WX 526 ; N afii57398 ; B 85 156 410 710 ; -C -1 ; WX 526 ; N afii57399 ; B 63 143 459 710 ; -C -1 ; WX 526 ; N afii57400 ; B 75 149 472 716 ; -C -1 ; WX 526 ; N afii57401 ; B 107 143 413 725 ; -C -1 ; WX 526 ; N afii57381 ; B 65 84 463 777 ; -C -1 ; WX 319 ; N afii57461 ; B 94 23 230 267 ; -C -1 ; WX 526 ; N afii63167 ; B 87 403 424 744 ; -C -1 ; WX 750 ; N afii57459 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57543 ; B 125 0 625 625 ; -C -1 ; WX 282 ; N afii57534 ; B 26 130 262 430 ; -C -1 ; WX 750 ; N afii57494 ; B 125 0 625 625 ; -C -1 ; WX 526 ; N afii62843 ; B 77 147 455 720 ; -C -1 ; WX 526 ; N afii62844 ; B 74 159 441 708 ; -C -1 ; WX 526 ; N afii62845 ; B 99 147 435 717 ; -C -1 ; WX 750 ; N afii64240 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii64241 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63954 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57382 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii64242 ; B 125 0 625 625 ; -C -1 ; WX 211 ; N afii62881 ; B 34 605 211 917 ; -C -1 ; WX 750 ; N afii57504 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57369 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57370 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57371 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57372 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57373 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57374 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57375 ; B 125 0 625 625 ; -C -1 ; WX 638 ; N afii57391 ; B -34 143 638 228 ; -C -1 ; WX 750 ; N afii57471 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57460 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii52258 ; B 125 0 625 625 ; -C -1 ; WX 713 ; N afii57506 ; B 28 -175 713 469 ; -C -1 ; WX 713 ; N afii62958 ; B 28 -175 713 469 ; -C -1 ; WX 244 ; N afii62956 ; B -34 -175 244 456 ; -C -1 ; WX 244 ; N afii52957 ; B -34 -175 244 456 ; -C -1 ; WX 750 ; N afii57505 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62889 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62887 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62888 ; B 125 0 625 625 ; -C -1 ; WX 563 ; N afii57507 ; B 26 -212 516 432 ; -C -1 ; WX 526 ; N afii62961 ; B 26 -212 526 426 ; -C -1 ; WX 530 ; N afii62959 ; B -34 -175 530 427 ; -C -1 ; WX 530 ; N afii62960 ; B -34 -175 530 427 ; -C -1 ; WX 489 ; N afii57508 ; B 36 -91 489 723 ; -C -1 ; WX 489 ; N afii62962 ; B 36 -91 489 723 ; -C -1 ; WX 812 ; N afii57567 ; B 10 143 812 734 ; -C -1 ; WX 933 ; N afii62964 ; B 10 143 933 734 ; -C -1 ; WX 394 ; N afii52305 ; B -34 143 394 734 ; -C -1 ; WX 515 ; N afii52306 ; B -34 143 515 734 ; -C -1 ; WX 812 ; N afii57509 ; B 10 143 812 867 ; -C -1 ; WX 933 ; N afii62967 ; B 10 143 933 867 ; -C -1 ; WX 394 ; N afii62965 ; B -34 143 394 876 ; -C -1 ; WX 515 ; N afii62966 ; B -34 143 515 876 ; -C -1 ; WX 638 ; N afii57555 ; B 24 -43 606 462 ; -C -1 ; WX 588 ; N afii52364 ; B 18 -110 588 252 ; -C -1 ; WX 750 ; N afii63753 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63754 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63759 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63763 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63795 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62891 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63808 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62938 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63810 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62942 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62947 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63813 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63823 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63824 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63833 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63844 ; B 125 0 625 625 ; -C -1 ; WX 226 ; N afii62882 ; B 23 605 226 933 ; -C -1 ; WX 211 ; N afii62883 ; B 34 605 211 905 ; -C -1 ; WX 211 ; N afii62884 ; B 34 605 211 840 ; -C -1 ; WX 211 ; N afii62885 ; B 31 606 211 897 ; -C -1 ; WX 211 ; N afii62886 ; B 34 605 211 853 ; -C -1 ; WX 750 ; N afii63846 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63849 ; B 125 0 625 625 ; -C -1 ; WX 0 ; N uni202A ; B -18 -134 210 603 ; -C -1 ; WX 0 ; N uni202B ; B -210 -134 18 603 ; -C -1 ; WX 0 ; N uni202D ; B -114 -134 114 690 ; -C -1 ; WX 0 ; N uni202E ; B -114 -134 114 690 ; -C -1 ; WX 0 ; N uni202C ; B -114 -134 114 690 ; -C -1 ; WX 0 ; N uni206E ; B -114 -134 114 690 ; -C -1 ; WX 0 ; N _b_852 ; B -114 -134 114 690 ; -C -1 ; WX 0 ; N uni206A ; B -114 -134 114 690 ; -C -1 ; WX 0 ; N uni206B ; B -114 -134 114 690 ; -C -1 ; WX 0 ; N _b_855 ; B -114 -134 114 690 ; -C -1 ; WX 0 ; N uni206D ; B -114 -134 114 690 ; -C -1 ; WX 0 ; N uniF00A ; B -18 -208 18 894 ; -C -1 ; WX 0 ; N uniF00B ; B -114 -208 114 894 ; -C -1 ; WX 0 ; N uniF00C ; B -18 -208 109 894 ; -C -1 ; WX 0 ; N uniF00D ; B -109 -208 18 894 ; -C -1 ; WX 0 ; N uniF00E ; B -18 -208 114 894 ; -C -1 ; WX 1000 ; N uniFFFC ; B 0 0 1000 719 ; -C -1 ; WX 750 ; N afii63904 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63905 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63906 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63908 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63910 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63912 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62927 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63941 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62939 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63943 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62943 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62946 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63946 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62951 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63948 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62953 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63950 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63951 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63952 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63953 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63956 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63958 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63959 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63960 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63961 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii64046 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii64058 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii64059 ; B 125 0 625 625 ; -C -1 ; WX 319 ; N afii64060 ; B 62 -209 273 785 ; -C -1 ; WX 319 ; N afii64061 ; B 45 -209 257 785 ; -C -1 ; WX 750 ; N afii62945 ; B 125 0 625 625 ; -C -1 ; WX 616 ; N afii64184 ; B 10 143 603 766 ; -C -1 ; WX 413 ; N afii52399 ; B 59 72 363 400 ; -C -1 ; WX 207 ; N afii52400 ; B 7 130 206 827 ; -C -1 ; WX 229 ; N afii62753 ; B -18 143 229 827 ; -C -1 ; WX 207 ; N afii57411 ; B 42 130 179 880 ; -C -1 ; WX 229 ; N afii62754 ; B 8 143 229 880 ; -C -1 ; WX 432 ; N afii57412 ; B 24 -77 432 555 ; -C -1 ; WX 432 ; N afii62755 ; B 24 -77 432 555 ; -C -1 ; WX 207 ; N afii57413 ; B 22 -94 165 740 ; -C -1 ; WX 229 ; N afii62756 ; B 9 -94 229 740 ; -C -1 ; WX 638 ; N afii57414 ; B 24 -43 606 555 ; -C -1 ; WX 588 ; N afii62759 ; B 18 -110 588 491 ; -C -1 ; WX 244 ; N afii62757 ; B -34 143 244 668 ; -C -1 ; WX 244 ; N afii62758 ; B -34 143 244 668 ; -C -1 ; WX 207 ; N afii57415 ; B 72 130 165 740 ; -C -1 ; WX 229 ; N afii62760 ; B 9 143 229 740 ; -C -1 ; WX 713 ; N afii57416 ; B 28 -46 713 469 ; -C -1 ; WX 713 ; N afii62763 ; B 28 -46 713 469 ; -C -1 ; WX 244 ; N afii62761 ; B -34 -46 244 456 ; -C -1 ; WX 244 ; N afii62762 ; B -34 -46 244 456 ; -C -1 ; WX 282 ; N afii57417 ; B 0 130 271 641 ; -C -1 ; WX 375 ; N afii62764 ; B -4 143 375 768 ; -C -1 ; WX 713 ; N afii57418 ; B 28 143 713 628 ; -C -1 ; WX 713 ; N afii62767 ; B 28 143 713 628 ; -C -1 ; WX 244 ; N afii62765 ; B -34 143 244 667 ; -C -1 ; WX 244 ; N afii62766 ; B -34 143 244 667 ; -C -1 ; WX 713 ; N afii57419 ; B 28 143 713 715 ; -C -1 ; WX 713 ; N afii62770 ; B 28 143 713 715 ; -C -1 ; WX 244 ; N afii62768 ; B -34 143 244 754 ; -C -1 ; WX 244 ; N afii62769 ; B -34 143 244 754 ; -C -1 ; WX 563 ; N afii57420 ; B 26 -212 516 432 ; -C -1 ; WX 526 ; N afii62773 ; B 26 -212 526 426 ; -C -1 ; WX 530 ; N afii62771 ; B -34 -33 530 427 ; -C -1 ; WX 530 ; N afii62772 ; B -34 -33 530 427 ; -C -1 ; WX 563 ; N afii57421 ; B 26 -212 516 432 ; -C -1 ; WX 526 ; N afii62776 ; B 26 -212 526 426 ; -C -1 ; WX 530 ; N afii62774 ; B -34 143 530 427 ; -C -1 ; WX 530 ; N afii62775 ; B -34 143 530 427 ; -C -1 ; WX 563 ; N afii57422 ; B 26 -212 516 639 ; -C -1 ; WX 526 ; N afii62779 ; B 26 -212 526 639 ; -C -1 ; WX 530 ; N afii62777 ; B -34 143 530 639 ; -C -1 ; WX 530 ; N afii62778 ; B -34 143 530 639 ; -C -1 ; WX 337 ; N afii57423 ; B 46 143 337 552 ; -C -1 ; WX 337 ; N afii62780 ; B 46 143 337 552 ; -C -1 ; WX 337 ; N afii57424 ; B 46 143 337 759 ; -C -1 ; WX 337 ; N afii62781 ; B 46 143 337 759 ; -C -1 ; WX 489 ; N afii57425 ; B 36 -91 489 430 ; -C -1 ; WX 489 ; N afii62782 ; B 36 -91 489 430 ; -C -1 ; WX 489 ; N afii57426 ; B 36 -91 489 639 ; -C -1 ; WX 489 ; N afii62783 ; B 36 -91 489 639 ; -C -1 ; WX 821 ; N afii57427 ; B 30 -72 821 417 ; -C -1 ; WX 821 ; N afii62786 ; B 30 -72 821 417 ; -C -1 ; WX 531 ; N afii62784 ; B -34 143 531 401 ; -C -1 ; WX 531 ; N afii62785 ; B -34 143 531 401 ; -C -1 ; WX 821 ; N afii57428 ; B 30 -72 821 715 ; -C -1 ; WX 821 ; N afii62789 ; B 30 -72 821 715 ; -C -1 ; WX 531 ; N afii62787 ; B -34 143 531 715 ; -C -1 ; WX 531 ; N afii62788 ; B -34 143 531 715 ; -C -1 ; WX 1098 ; N afii57429 ; B 30 -72 1098 417 ; -C -1 ; WX 1098 ; N afii62792 ; B 30 -72 1098 417 ; -C -1 ; WX 846 ; N afii62790 ; B -34 143 846 405 ; -C -1 ; WX 846 ; N afii62791 ; B -34 143 846 405 ; -C -1 ; WX 1098 ; N afii57430 ; B 30 -72 1098 590 ; -C -1 ; WX 1098 ; N afii62795 ; B 30 -72 1098 590 ; -C -1 ; WX 846 ; N afii62793 ; B -34 143 846 590 ; -C -1 ; WX 846 ; N afii62794 ; B -34 143 846 590 ; -C -1 ; WX 582 ; N afii57431 ; B -34 143 582 793 ; -C -1 ; WX 582 ; N afii62798 ; B -34 143 582 793 ; -C -1 ; WX 582 ; N afii62796 ; B -34 143 582 793 ; -C -1 ; WX 582 ; N afii62797 ; B -34 143 582 793 ; -C -1 ; WX 582 ; N afii57432 ; B -34 143 582 793 ; -C -1 ; WX 582 ; N afii62801 ; B -34 143 582 793 ; -C -1 ; WX 582 ; N afii62799 ; B -34 143 582 793 ; -C -1 ; WX 582 ; N afii62800 ; B -34 143 582 793 ; -C -1 ; WX 544 ; N afii57433 ; B 21 -212 516 534 ; -C -1 ; WX 450 ; N afii62804 ; B 26 -212 486 431 ; -C -1 ; WX 526 ; N afii62802 ; B -34 143 470 472 ; -C -1 ; WX 394 ; N afii62803 ; B -34 143 394 418 ; -C -1 ; WX 544 ; N afii57434 ; B 21 -212 516 737 ; -C -1 ; WX 450 ; N afii62807 ; B 26 -212 486 639 ; -C -1 ; WX 526 ; N afii62805 ; B -34 143 470 639 ; -C -1 ; WX 394 ; N afii62806 ; B -34 143 394 639 ; -C -1 ; WX 789 ; N afii57441 ; B 19 143 789 681 ; -C -1 ; WX 789 ; N afii62810 ; B 19 143 789 681 ; -C -1 ; WX 268 ; N afii62808 ; B -34 143 268 726 ; -C -1 ; WX 263 ; N afii62809 ; B -34 143 263 707 ; -C -1 ; WX 582 ; N afii57442 ; B 34 -75 582 683 ; -C -1 ; WX 582 ; N afii62813 ; B 34 -75 582 683 ; -C -1 ; WX 268 ; N afii62811 ; B -34 143 268 740 ; -C -1 ; WX 263 ; N afii62812 ; B -34 143 263 727 ; -C -1 ; WX 601 ; N afii57443 ; B 22 143 601 775 ; -C -1 ; WX 601 ; N afii62816 ; B 22 143 601 775 ; -C -1 ; WX 394 ; N afii57410 ; B -34 143 394 734 ; -C -1 ; WX 394 ; N afii62815 ; B -34 143 394 734 ; -C -1 ; WX 506 ; N afii57444 ; B 35 7 506 775 ; -C -1 ; WX 506 ; N afii62819 ; B 35 7 506 775 ; -C -1 ; WX 207 ; N afii62817 ; B -34 143 207 775 ; -C -1 ; WX 207 ; N afii62818 ; B -34 143 207 775 ; -C -1 ; WX 338 ; N afii57445 ; B 17 -212 338 357 ; -C -1 ; WX 338 ; N afii62822 ; B 17 -212 338 357 ; -C -1 ; WX 394 ; N afii62820 ; B -34 143 394 411 ; -C -1 ; WX 394 ; N afii62821 ; B -34 143 394 411 ; -C -1 ; WX 526 ; N afii57446 ; B 34 -72 526 558 ; -C -1 ; WX 526 ; N afii62825 ; B 34 -72 526 558 ; -C -1 ; WX 244 ; N afii62823 ; B -34 143 244 636 ; -C -1 ; WX 244 ; N afii62824 ; B -34 143 244 636 ; -C -1 ; WX 282 ; N afii57447 ; B 26 130 262 430 ; -C -1 ; WX 375 ; N afii62828 ; B -4 143 375 583 ; -C -1 ; WX 450 ; N afii57470 ; B -34 125 385 555 ; -C -1 ; WX 394 ; N afii62827 ; B -34 -62 394 429 ; -C -1 ; WX 432 ; N afii57448 ; B 24 -77 432 385 ; -C -1 ; WX 432 ; N afii62829 ; B 24 -77 432 385 ; -C -1 ; WX 638 ; N afii57449 ; B 24 -43 606 462 ; -C -1 ; WX 588 ; N afii62830 ; B 18 -110 588 252 ; -C -1 ; WX 638 ; N afii57450 ; B 24 -208 606 462 ; -C -1 ; WX 588 ; N afii62833 ; B 18 -212 588 252 ; -C -1 ; WX 244 ; N afii62831 ; B -34 -69 244 456 ; -C -1 ; WX 244 ; N afii62832 ; B -34 -69 244 456 ; -C -1 ; WX 544 ; N afii62834 ; B 31 79 507 827 ; -C -1 ; WX 601 ; N afii62835 ; B 36 118 601 827 ; -C -1 ; WX 544 ; N afii62836 ; B 19 79 507 880 ; -C -1 ; WX 601 ; N afii62837 ; B 28 118 601 880 ; -C -1 ; WX 544 ; N afii62838 ; B 41 -111 507 724 ; -C -1 ; WX 601 ; N afii62839 ; B 36 -111 601 733 ; -C -1 ; WX 544 ; N afii62840 ; B 41 79 507 724 ; -C -1 ; WX 601 ; N afii62841 ; B 36 118 601 733 ; -C -1 ; WX 750 ; N glyph1021 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57543-2 ; B 125 0 625 625 ; -C -1 ; WX 201 ; N afii57454-2 ; B 34 673 201 774 ; -C -1 ; WX 201 ; N afii57451-2 ; B 34 605 201 780 ; -C -1 ; WX 750 ; N glyph1025 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1026 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57471-2 ; B 125 0 625 625 ; -C -1 ; WX 165 ; N afii57458-2 ; B 34 605 165 756 ; -C -1 ; WX 211 ; N afii57457-2 ; B 34 605 211 762 ; -C -1 ; WX 750 ; N afii57494-2 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57459-2 ; B 125 0 625 625 ; -C -1 ; WX 209 ; N afii57455-2 ; B 35 605 209 817 ; -C -1 ; WX 237 ; N afii57452-2 ; B 34 605 237 794 ; -C -1 ; WX 750 ; N glyph1034 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1035 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1036 ; B 125 0 625 625 ; -C -1 ; WX 211 ; N afii62884-2 ; B 34 605 211 840 ; -C -1 ; WX 211 ; N afii62881-2 ; B 34 605 211 917 ; -C -1 ; WX 211 ; N afii62886-2 ; B 34 605 211 853 ; -C -1 ; WX 211 ; N afii62883-2 ; B 34 605 211 905 ; -C -1 ; WX 211 ; N afii62885-2 ; B 31 606 211 897 ; -C -1 ; WX 226 ; N afii62882-2 ; B 23 605 226 933 ; -C -1 ; WX 750 ; N afii57504-2 ; B 125 0 625 625 ; -C -1 ; WX 201 ; N afii57456-2 ; B 34 -21 201 80 ; -C -1 ; WX 201 ; N afii57453-2 ; B 34 -130 201 44 ; -C -1 ; WX 750 ; N glyph1046 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1047 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57543-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57454-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57451-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1051 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1052 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57471-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57458-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57457-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57494-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57459-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57455-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57452-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1060 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1061 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1062 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62884-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62881-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62886-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62883-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62885-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62882-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57504-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57456-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57453-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1072 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1073 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57543-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57454-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57451-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1077 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1078 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57471-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57458-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57457-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57494-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57459-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57455-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57452-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1086 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1087 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1088 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62884-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62881-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62886-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62883-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62885-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62882-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57504-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57456-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57453-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1098 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1099 ; B 125 0 625 625 ; -C -1 ; WX 319 ; N glyph1100 ; B 99 137 223 714 ; -C -1 ; WX 319 ; N glyph1101 ; B 97 137 226 267 ; -C -1 ; WX 319 ; N glyph1102 ; B 97 137 225 542 ; -C -1 ; WX 750 ; N glyph1103 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1104 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1105 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1106 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1107 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1108 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1109 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1110 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1111 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1112 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1113 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1114 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1115 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1116 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1117 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1118 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1119 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1120 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1121 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1122 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1123 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1124 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1125 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1126 ; B 125 0 625 625 ; -C -1 ; WX 125 ; N afii57440-2 ; B -34 143 125 228 ; -C -1 ; WX 1000 ; N afii57440-3 ; B -34 143 1000 228 ; -C -1 ; WX 2000 ; N afii57440-4 ; B -34 143 2000 228 ; -C -1 ; WX 857 ; N Ohorn ; B 48 -12 834 729 ; -C -1 ; WX 656 ; N ohorn ; B 33 -12 625 531 ; -C -1 ; WX 854 ; N Uhorn ; B 79 -12 813 716 ; -C -1 ; WX 669 ; N uhorn ; B 64 -12 639 519 ; -C -1 ; WX 0 ; N glyph1134 ; B -268 819 -91 896 ; -C -1 ; WX 0 ; N glyph1135 ; B -477 819 -301 896 ; -C -1 ; WX 0 ; N glyph1136 ; B -419 755 -235 892 ; -C -1 ; WX 0 ; N uniF006 ; B -209 819 -33 896 ; -C -1 ; WX 0 ; N uniF007 ; B -395 819 -219 896 ; -C -1 ; WX 0 ; N uniF009 ; B -319 755 -135 892 ; -C -1 ; WX 0 ; N combininghookabove ; B -230 738 -17 896 ; -C -1 ; WX 0 ; N uniF010 ; B -244 803 -46 896 ; -C -1 ; WX 0 ; N uniF013 ; B -367 738 -153 896 ; -C -1 ; WX 0 ; N uniF011 ; B -450 803 -252 896 ; -C -1 ; WX 0 ; N uniF01C ; B -298 786 29 898 ; -C -1 ; WX 0 ; N uniF015 ; B -505 811 -178 896 ; -C -1 ; WX 0 ; N combiningtildeaccent ; B -444 755 -117 868 ; -C -1 ; WX 0 ; N glyph1147 ; B -146 729 139 800 ; -C -1 ; WX 0 ; N glyph1148 ; B -146 729 153 789 ; -C -1 ; WX 0 ; N uniF02C ; B -124 -159 -24 -59 ; -C -1 ; WX 513 ; N dongsign ; B 78 120 442 716 ; -C -1 ; WX 834 ; N onethird ; B 52 -28 823 728 ; -C -1 ; WX 834 ; N twothirds ; B 12 -28 818 728 ; -C -1 ; WX 0 ; N uniF008 ; B -161 583 22 720 ; -C -1 ; WX 0 ; N glyph1154 ; B -319 583 -135 720 ; -C -1 ; WX 0 ; N glyph1155 ; B -246 583 -63 720 ; -C -1 ; WX 0 ; N uniF00F ; B -419 583 -235 720 ; -C -1 ; WX 0 ; N uniF012 ; B -209 583 4 756 ; -C -1 ; WX 0 ; N uniF014 ; B -367 583 -153 756 ; -C -1 ; WX 0 ; N uniF016 ; B -527 786 -200 898 ; -C -1 ; WX 0 ; N uniF017 ; B -631 786 -304 898 ; -C -1 ; WX 0 ; N uniF018 ; B -665 786 -337 898 ; -C -1 ; WX 0 ; N uniF019 ; B -444 595 -117 708 ; -C -1 ; WX 0 ; N uniF01A ; B -542 595 -215 708 ; -C -1 ; WX 0 ; N uniF01B ; B -573 595 -246 708 ; -C -1 ; WX 0 ; N uniF01E ; B -382 -159 -282 -59 ; -C -1 ; WX 0 ; N uniF01F ; B -439 -159 -339 -59 ; -C -1 ; WX 0 ; N uniF020 ; B -517 -159 -417 -59 ; -C -1 ; WX 0 ; N uniF021 ; B -406 -159 -306 -59 ; -C -1 ; WX 0 ; N uniF022 ; B -551 -159 -451 -59 ; -C -1 ; WX 0 ; N combininggraveaccent ; B -261 755 -77 892 ; -C -1 ; WX 0 ; N combiningacuteaccent ; B -186 755 -2 892 ; -C -1 ; WX 0 ; N uniF01D ; B -280 595 47 708 ; -C -1 ; WX 0 ; N combiningdotbelow ; B -382 -159 -282 -59 ; -C -1 ; WX 0 ; N uniF023 ; B -329 -159 -229 -59 ; -C -1 ; WX 0 ; N uniF029 ; B -192 -159 -92 -59 ; -C -1 ; WX 0 ; N uniF02A ; B -158 -159 -58 -59 ; -C -1 ; WX 0 ; N uniF02B ; B -385 -159 -285 -59 ; -C -1 ; WX 0 ; N uniF024 ; B -322 -159 -222 -59 ; -C -1 ; WX 0 ; N uniF025 ; B -332 -159 -232 -59 ; -C -1 ; WX 0 ; N uniF026 ; B -430 -159 -330 -59 ; -C -1 ; WX 0 ; N uniF027 ; B -365 -159 -265 -59 ; -C -1 ; WX 0 ; N uniF028 ; B -479 -159 -378 -59 ; -C -1 ; WX 0 ; N uniF02D ; B -491 811 -164 896 ; -C -1 ; WX 0 ; N uniF02E ; B -491 786 -164 898 ; -C -1 ; WX 0 ; N uniF02F ; B -552 811 -225 896 ; -C -1 ; WX 0 ; N uniF030 ; B -552 786 -225 898 ; -C -1 ; WX 222 ; N uniF031 ; B 66 0 154 519 ; -C -1 ; WX 667 ; N Adotbelow ; B -1 -159 668 716 ; -C -1 ; WX 556 ; N adotbelow ; B 36 -159 514 530 ; -C -1 ; WX 667 ; N Ahookabove ; B -1 0 668 896 ; -C -1 ; WX 556 ; N ahookabove ; B 36 -12 514 756 ; -C -1 ; WX 667 ; N Acircumflexacute ; B -1 0 668 896 ; -C -1 ; WX 556 ; N acircumflexacute ; B 36 -12 514 892 ; -C -1 ; WX 667 ; N Acircumflexgrave ; B -1 0 668 896 ; -C -1 ; WX 556 ; N acircumflexgrave ; B 36 -12 514 892 ; -C -1 ; WX 667 ; N Acircumflexhookabove ; B -1 0 668 896 ; -C -1 ; WX 556 ; N acircumflexhookabove ; B 36 -12 514 896 ; -C -1 ; WX 667 ; N Acircumflextilde ; B -1 0 668 896 ; -C -1 ; WX 556 ; N acircumflextilde ; B 36 -12 514 868 ; -C -1 ; WX 667 ; N Acircumflexdotbelow ; B -1 -159 668 801 ; -C -1 ; WX 556 ; N acircumflexdotbelow ; B 36 -159 514 720 ; -C -1 ; WX 667 ; N Abreveacute ; B -1 0 668 896 ; -C -1 ; WX 556 ; N abreveacute ; B 36 -12 514 892 ; -C -1 ; WX 667 ; N Abrevegrave ; B -1 0 668 896 ; -C -1 ; WX 556 ; N abrevegrave ; B 36 -12 514 892 ; -C -1 ; WX 667 ; N Abrevehookabove ; B -1 0 668 896 ; -C -1 ; WX 556 ; N abrevehookabove ; B 36 -12 514 896 ; -C -1 ; WX 667 ; N Abrevetilde ; B -1 0 668 896 ; -C -1 ; WX 556 ; N abrevetilde ; B 36 -12 514 868 ; -C -1 ; WX 667 ; N Abrevedotbelow ; B -1 -159 668 800 ; -C -1 ; WX 556 ; N abrevedotbelow ; B 36 -159 514 715 ; -C -1 ; WX 667 ; N Edotbelow ; B 79 -159 613 716 ; -C -1 ; WX 556 ; N edotbelow ; B 37 -159 515 530 ; -C -1 ; WX 667 ; N Ehookabove ; B 79 0 613 896 ; -C -1 ; WX 556 ; N ehookabove ; B 37 -12 515 756 ; -C -1 ; WX 667 ; N Etilde ; B 79 0 613 885 ; -C -1 ; WX 556 ; N etilde ; B 37 -12 515 708 ; -C -1 ; WX 667 ; N Ecircumflexacute ; B 79 0 613 896 ; -C -1 ; WX 556 ; N ecircumflexacute ; B 37 -12 515 892 ; -C -1 ; WX 667 ; N Ecircumflexgrave ; B 79 0 613 896 ; -C -1 ; WX 556 ; N ecircumflexgrave ; B 37 -12 515 892 ; -C -1 ; WX 667 ; N Ecircumflexhookabove ; B 79 0 613 896 ; -C -1 ; WX 556 ; N ecircumflexhookabove ; B 37 -12 515 896 ; -C -1 ; WX 667 ; N Ecircumflextilde ; B 79 0 613 896 ; -C -1 ; WX 556 ; N ecircumflextilde ; B 37 -12 515 868 ; -C -1 ; WX 667 ; N Ecircumflexdotbelow ; B 79 -159 613 801 ; -C -1 ; WX 556 ; N ecircumflexdotbelow ; B 37 -159 515 720 ; -C -1 ; WX 278 ; N Ihookabove ; B 48 0 262 896 ; -C -1 ; WX 222 ; N ihookabove ; B 15 0 229 756 ; -C -1 ; WX 278 ; N Idotbelow ; B 91 -159 191 716 ; -C -1 ; WX 222 ; N idotbelow ; B 61 -159 161 716 ; -C -1 ; WX 778 ; N Odotbelow ; B 48 -159 733 729 ; -C -1 ; WX 556 ; N odotbelow ; B 33 -159 519 530 ; -C -1 ; WX 778 ; N Ohookabove ; B 48 -12 733 896 ; -C -1 ; WX 556 ; N ohookabove ; B 33 -12 519 756 ; -C -1 ; WX 778 ; N Ocircumflexacute ; B 48 -12 733 896 ; -C -1 ; WX 556 ; N ocircumflexacute ; B 33 -12 519 892 ; -C -1 ; WX 778 ; N Ocircumflexgrave ; B 48 -12 733 896 ; -C -1 ; WX 556 ; N ocircumflexgrave ; B 33 -12 519 892 ; -C -1 ; WX 778 ; N Ocircumflexhookabove ; B 48 -12 733 896 ; -C -1 ; WX 556 ; N ocircumflexhookabove ; B 33 -12 519 896 ; -C -1 ; WX 778 ; N Ocircumflextilde ; B 48 -12 733 896 ; -C -1 ; WX 556 ; N ocircumflextilde ; B 33 -12 519 868 ; -C -1 ; WX 778 ; N Ocircumflexdotbelow ; B 48 -159 733 801 ; -C -1 ; WX 556 ; N ocircumflexdotbelow ; B 33 -159 519 720 ; -C -1 ; WX 857 ; N Ohornacute ; B 48 -12 834 896 ; -C -1 ; WX 656 ; N ohornacute ; B 33 -12 625 720 ; -C -1 ; WX 857 ; N Ohorngrave ; B 48 -12 834 896 ; -C -1 ; WX 656 ; N ohorngrave ; B 33 -12 625 720 ; -C -1 ; WX 857 ; N Ohornhookabove ; B 48 -12 834 909 ; -C -1 ; WX 656 ; N ohornhookabove ; B 33 -12 625 756 ; -C -1 ; WX 857 ; N Ohorntilde ; B 48 -12 834 873 ; -C -1 ; WX 656 ; N ohorntilde ; B 33 -12 625 708 ; -C -1 ; WX 857 ; N Ohorndotbelow ; B 48 -159 834 729 ; -C -1 ; WX 656 ; N ohorndotbelow ; B 33 -159 625 531 ; -C -1 ; WX 722 ; N Udotbelow ; B 79 -159 642 716 ; -C -1 ; WX 556 ; N udotbelow ; B 64 -159 484 519 ; -C -1 ; WX 722 ; N Uhookabove ; B 79 -12 642 896 ; -C -1 ; WX 556 ; N uhookabove ; B 64 -12 484 756 ; -C -1 ; WX 854 ; N Uhornacute ; B 79 -12 813 896 ; -C -1 ; WX 669 ; N uhornacute ; B 64 -12 639 720 ; -C -1 ; WX 854 ; N Uhorngrave ; B 79 -12 813 896 ; -C -1 ; WX 669 ; N uhorngrave ; B 64 -12 639 720 ; -C -1 ; WX 854 ; N Uhornhookabove ; B 79 -12 813 896 ; -C -1 ; WX 669 ; N uhornhookabove ; B 64 -12 639 756 ; -C -1 ; WX 854 ; N Uhorntilde ; B 79 -12 813 873 ; -C -1 ; WX 669 ; N uhorntilde ; B 64 -12 639 708 ; -C -1 ; WX 854 ; N Uhorndotbelow ; B 79 -159 813 716 ; -C -1 ; WX 669 ; N uhorndotbelow ; B 64 -159 639 519 ; -C -1 ; WX 667 ; N Ydotbelow ; B 3 -159 659 716 ; -C -1 ; WX 500 ; N ydotbelow ; B 16 -210 491 519 ; -C -1 ; WX 667 ; N Yhookabove ; B 3 0 659 896 ; -C -1 ; WX 500 ; N yhookabove ; B 16 -210 491 756 ; -C -1 ; WX 667 ; N Ytilde ; B 3 0 659 873 ; -C -1 ; WX 500 ; N ytilde ; B 16 -210 491 708 ; -C -1 ; WX 667 ; N uni01CD ; B -1 0 668 891 ; -C -1 ; WX 556 ; N uni01CE ; B 36 -12 514 720 ; -C -1 ; WX 278 ; N uni01CF ; B -15 0 294 891 ; -C -1 ; WX 222 ; N uni01D0 ; B -39 0 270 720 ; -C -1 ; WX 778 ; N uni01D1 ; B 48 -12 733 891 ; -C -1 ; WX 556 ; N uni01D2 ; B 33 -12 519 720 ; -C -1 ; WX 722 ; N uni01D3 ; B 79 -12 642 891 ; -C -1 ; WX 556 ; N uni01D4 ; B 64 -12 484 720 ; -C -1 ; WX 722 ; N uni01D5 ; B 79 -12 642 900 ; -C -1 ; WX 556 ; N uni01D6 ; B 64 -12 484 852 ; -C -1 ; WX 722 ; N uni01D7 ; B 79 -12 642 900 ; -C -1 ; WX 556 ; N uni01D8 ; B 64 -12 484 900 ; -C -1 ; WX 722 ; N uni01D9 ; B 79 -12 642 900 ; -C -1 ; WX 556 ; N uni01DA ; B 64 -12 484 900 ; -C -1 ; WX 722 ; N uni01DB ; B 79 -12 642 900 ; -C -1 ; WX 556 ; N uni01DC ; B 64 -12 484 900 ; -C -1 ; WX 0 ; N glyph1292 ; B -126 730 126 900 ; -C -1 ; WX 0 ; N glyph1293 ; B -126 730 126 900 ; -C -1 ; WX 0 ; N glyph1294 ; B -126 730 126 900 ; -C -1 ; WX 0 ; N glyph1295 ; B -126 730 126 900 ; -C -1 ; WX 542 ; N uni0492 ; B -1 0 542 716 ; -C -1 ; WX 365 ; N uni0493 ; B 6 0 365 519 ; -C -1 ; WX 923 ; N uni0496 ; B 3 -199 919 716 ; -C -1 ; WX 669 ; N uni0497 ; B -2 -147 664 519 ; -C -1 ; WX 583 ; N uni049A ; B 79 -199 579 716 ; -C -1 ; WX 438 ; N uni049B ; B 65 -147 433 519 ; -C -1 ; WX 583 ; N uni049C ; B 79 0 579 716 ; -C -1 ; WX 438 ; N uni049D ; B 65 0 445 519 ; -C -1 ; WX 722 ; N uni04A2 ; B 80 -199 707 716 ; -C -1 ; WX 552 ; N uni04A3 ; B 66 -147 542 519 ; -C -1 ; WX 556 ; N uni04AE ; B -1 0 553 716 ; -C -1 ; WX 500 ; N uni04AF ; B 10 -199 491 519 ; -C -1 ; WX 556 ; N uni04B0 ; B -1 0 553 716 ; -C -1 ; WX 500 ; N uni04B1 ; B 10 -199 491 519 ; -C -1 ; WX 667 ; N uni04B2 ; B 4 -199 661 716 ; -C -1 ; WX 500 ; N uni04B3 ; B 7 -147 493 519 ; -C -1 ; WX 667 ; N uni04B8 ; B 42 0 588 716 ; -C -1 ; WX 521 ; N uni04B9 ; B 34 0 455 519 ; -C -1 ; WX 667 ; N uni04BA ; B 79 0 624 716 ; -C -1 ; WX 556 ; N uni04BB ; B 66 0 488 716 ; -C -1 ; WX 752 ; N uni018F ; B 48 -12 711 728 ; -C -1 ; WX 556 ; N uni0259 ; B 42 -12 520 530 ; -C -1 ; WX 778 ; N uni04E8 ; B 47 -12 731 729 ; -C -1 ; WX 556 ; N uni04E9 ; B 33 -12 519 530 ; -C -1 ; WX 713 ; N glyph1320 ; B 28 143 713 469 ; -C -1 ; WX 244 ; N glyph1321 ; B -34 143 244 456 ; -C -1 ; WX 268 ; N glyph1322 ; B -34 143 268 544 ; -C -1 ; WX 263 ; N glyph1323 ; B -34 143 263 494 ; -C -1 ; WX 582 ; N glyph1324 ; B 34 -75 582 445 ; -C -1 ; WX 244 ; N glyph1325 ; B 77 -46 194 66 ; -C -1 ; WX 244 ; N glyph1326 ; B 8 -88 236 68 ; -C -1 ; WX 244 ; N glyph1327 ; B 13 -175 242 68 ; -C -1 ; WX 244 ; N glyph1328 ; B 8 -175 236 68 ; -C -1 ; WX 244 ; N glyph1329 ; B 52 -166 191 68 ; -C -1 ; WX 244 ; N glyph1330 ; B -3 -210 248 68 ; -C -1 ; WX 269 ; N glyph1331 ; B -24 519 269 828 ; -C -1 ; WX 207 ; N glyph1332 ; B 7 732 210 891 ; -C -1 ; WX 207 ; N glyph1333 ; B -5 746 179 890 ; -C -1 ; WX 333 ; N glyph1334 ; B 80 605 240 717 ; -C -1 ; WX 333 ; N glyph1335 ; B 80 605 240 717 ; -C -1 ; WX 207 ; N uni0653 ; B 7 692 206 747 ; -C -1 ; WX 207 ; N uni0654 ; B 42 733 179 880 ; -C -1 ; WX 207 ; N uni0655 ; B 42 -79 179 68 ; -C -1 ; WX 0 ; N uni0670 ; B -24 519 24 809 ; -C -1 ; WX 207 ; N uni0671 ; B 7 130 210 891 ; -C -1 ; WX 229 ; N uniFB51 ; B -32 143 229 891 ; -C -1 ; WX 207 ; N uni0672 ; B -5 130 179 890 ; -C -1 ; WX 229 ; N glyph1343 ; B -25 143 229 890 ; -C -1 ; WX 207 ; N uni0673 ; B 14 -84 198 740 ; -C -1 ; WX 229 ; N glyph1345 ; B -5 -84 229 740 ; -C -1 ; WX 207 ; N uni0675 ; B 72 130 296 740 ; -C -1 ; WX 229 ; N glyph47 ; B 9 143 276 740 ; -C -1 ; WX 432 ; N uni0676 ; B 24 -77 511 597 ; -C -1 ; WX 432 ; N glyph1349 ; B 24 -77 511 597 ; -C -1 ; WX 432 ; N uni0677 ; B 24 -77 511 616 ; -C -1 ; WX 432 ; N glyph1351 ; B 24 -77 511 616 ; -C -1 ; WX 638 ; N uni0678 ; B 24 -43 667 685 ; -C -1 ; WX 588 ; N glyph ; B 18 -110 588 440 ; -C -1 ; WX 713 ; N uni0679 ; B 28 143 713 828 ; -C -1 ; WX 713 ; N uniFB67 ; B 28 143 713 828 ; -C -1 ; WX 244 ; N uniFB68 ; B -34 143 269 828 ; -C -1 ; WX 244 ; N uniFB69 ; B -34 143 269 828 ; -C -1 ; WX 713 ; N uni067A ; B 28 143 713 752 ; -C -1 ; WX 713 ; N uniFB5F ; B 28 143 713 752 ; -C -1 ; WX 244 ; N uniFB60 ; B -34 143 244 752 ; -C -1 ; WX 244 ; N uniFB61 ; B -34 143 244 752 ; -C -1 ; WX 713 ; N uni067B ; B 28 -166 713 469 ; -C -1 ; WX 713 ; N uniFB53 ; B 28 -166 713 469 ; -C -1 ; WX 244 ; N uniFB54 ; B -34 -166 244 456 ; -C -1 ; WX 244 ; N uniFB55 ; B -34 -166 244 456 ; -C -1 ; WX 713 ; N uni067C ; B 28 31 713 628 ; -C -1 ; WX 713 ; N glyph1367 ; B 28 31 713 628 ; -C -1 ; WX 244 ; N glyph1368 ; B -34 31 244 667 ; -C -1 ; WX 244 ; N glyph1369 ; B -34 31 244 667 ; -C -1 ; WX 713 ; N uni067D ; B 28 143 713 752 ; -C -1 ; WX 713 ; N glyph1371 ; B 28 143 713 752 ; -C -1 ; WX 244 ; N glyph1372 ; B -34 143 244 752 ; -C -1 ; WX 244 ; N glyph1373 ; B -34 143 244 752 ; -C -1 ; WX 713 ; N uni067F ; B 28 143 713 752 ; -C -1 ; WX 713 ; N uniFB63 ; B 28 143 713 752 ; -C -1 ; WX 244 ; N uniFB64 ; B -34 143 244 752 ; -C -1 ; WX 244 ; N uniFB65 ; B -34 143 244 752 ; -C -1 ; WX 713 ; N uni0680 ; B 28 -210 713 469 ; -C -1 ; WX 713 ; N uniFB5B ; B 28 -210 713 469 ; -C -1 ; WX 244 ; N uniFB5C ; B -34 -210 248 456 ; -C -1 ; WX 244 ; N uniFB5D ; B -34 -210 248 456 ; -C -1 ; WX 563 ; N uni0681 ; B 26 -212 516 685 ; -C -1 ; WX 526 ; N glyph1383 ; B 26 -212 526 685 ; -C -1 ; WX 530 ; N glyph1384 ; B -34 143 530 685 ; -C -1 ; WX 530 ; N glyph1385 ; B -34 143 530 685 ; -C -1 ; WX 563 ; N uni0682 ; B 26 -212 516 752 ; -C -1 ; WX 526 ; N glyph1387 ; B 26 -212 526 752 ; -C -1 ; WX 530 ; N glyph1388 ; B -34 143 530 752 ; -C -1 ; WX 530 ; N glyph1389 ; B -34 143 530 752 ; -C -1 ; WX 563 ; N uni0683 ; B 26 -212 516 432 ; -C -1 ; WX 526 ; N uniFB77 ; B 26 -212 526 426 ; -C -1 ; WX 530 ; N uniFB78 ; B -34 -88 530 427 ; -C -1 ; WX 530 ; N uniFB79 ; B -34 -88 530 427 ; -C -1 ; WX 563 ; N uni0684 ; B 26 -212 516 432 ; -C -1 ; WX 526 ; N uniFB73 ; B 26 -212 526 426 ; -C -1 ; WX 530 ; N uniFB74 ; B -34 -166 530 427 ; -C -1 ; WX 530 ; N uniFB75 ; B -34 -166 530 427 ; -C -1 ; WX 563 ; N uni0685 ; B 26 -212 516 752 ; -C -1 ; WX 526 ; N glyph1399 ; B 26 -212 526 752 ; -C -1 ; WX 530 ; N glyph1400 ; B -34 143 530 752 ; -C -1 ; WX 530 ; N glyph1401 ; B -34 143 530 752 ; -C -1 ; WX 563 ; N uni0687 ; B 26 -212 516 432 ; -C -1 ; WX 526 ; N uniFB7f ; B 26 -212 526 426 ; -C -1 ; WX 530 ; N uniFB80 ; B -34 -210 530 427 ; -C -1 ; WX 530 ; N uniFB81 ; B -34 -210 530 427 ; -C -1 ; WX 337 ; N uni0688 ; B 24 143 337 891 ; -C -1 ; WX 337 ; N uniFB89 ; B 24 143 337 891 ; -C -1 ; WX 337 ; N uni0689 ; B 46 31 337 552 ; -C -1 ; WX 337 ; N glyph1409 ; B 46 31 337 552 ; -C -1 ; WX 337 ; N uni068A ; B 46 -46 337 552 ; -C -1 ; WX 337 ; N glyph1411 ; B 46 -46 337 552 ; -C -1 ; WX 337 ; N uni068B ; B 24 -46 337 891 ; -C -1 ; WX 337 ; N glyph1413 ; B 24 -46 337 891 ; -C -1 ; WX 337 ; N uni068C ; B 46 143 337 752 ; -C -1 ; WX 337 ; N uniFB85 ; B 46 143 337 752 ; -C -1 ; WX 337 ; N uni068D ; B 46 -88 337 552 ; -C -1 ; WX 337 ; N uniFB83 ; B 46 -88 337 552 ; -C -1 ; WX 337 ; N uni068E ; B 46 143 337 850 ; -C -1 ; WX 337 ; N uniFB87 ; B 46 143 337 850 ; -C -1 ; WX 337 ; N uni068F ; B 27 143 337 850 ; -C -1 ; WX 337 ; N glyph1421 ; B 27 143 337 850 ; -C -1 ; WX 337 ; N uni0690 ; B 36 143 337 850 ; -C -1 ; WX 337 ; N glyph1423 ; B 36 143 337 850 ; -C -1 ; WX 489 ; N uni0691 ; B 36 -91 489 828 ; -C -1 ; WX 489 ; N uniFB8D ; B 36 -91 489 828 ; -C -1 ; WX 489 ; N uni0692 ; B 36 -91 489 634 ; -C -1 ; WX 489 ; N glyph1426 ; B 36 -91 489 634 ; -C -1 ; WX 489 ; N uni0693 ; B 36 -127 489 430 ; -C -1 ; WX 489 ; N glyph1429 ; B 36 -127 489 430 ; -C -1 ; WX 489 ; N uni0694 ; B 36 -144 507 430 ; -C -1 ; WX 489 ; N glyph1431 ; B 36 -144 507 430 ; -C -1 ; WX 489 ; N uni0695 ; B 36 -196 489 430 ; -C -1 ; WX 489 ; N glyph1433 ; B 36 -196 489 430 ; -C -1 ; WX 489 ; N uni0696 ; B 36 -144 507 430 ; -C -1 ; WX 489 ; N glyph1435 ; B 36 -144 507 430 ; -C -1 ; WX 489 ; N uni0697 ; B 36 -91 489 636 ; -C -1 ; WX 489 ; N glyph1437 ; B 36 -91 489 636 ; -C -1 ; WX 489 ; N uni0699 ; B 36 -91 489 758 ; -C -1 ; WX 489 ; N glyph1439 ; B 36 -91 489 758 ; -C -1 ; WX 821 ; N uni069A ; B 30 -72 821 593 ; -C -1 ; WX 821 ; N glyph1441 ; B 30 -72 821 593 ; -C -1 ; WX 531 ; N glyph1442 ; B -34 -46 531 593 ; -C -1 ; WX 531 ; N glyph1443 ; B -34 -46 531 593 ; -C -1 ; WX 821 ; N uni069B ; B 30 -175 822 417 ; -C -1 ; WX 821 ; N glyph1445 ; B 30 -175 822 417 ; -C -1 ; WX 531 ; N glyph1446 ; B -34 -175 531 401 ; -C -1 ; WX 531 ; N glyph1447 ; B -34 -175 531 401 ; -C -1 ; WX 821 ; N uni069C ; B 30 -175 822 723 ; -C -1 ; WX 821 ; N glyph1449 ; B 30 -175 822 723 ; -C -1 ; WX 531 ; N glyph1450 ; B -34 -175 531 723 ; -C -1 ; WX 531 ; N glyph1451 ; B -34 -175 531 723 ; -C -1 ; WX 1098 ; N uni069D ; B 30 -88 1098 417 ; -C -1 ; WX 1098 ; N glyph1453 ; B 30 -88 1098 417 ; -C -1 ; WX 846 ; N glyph1454 ; B -34 -88 846 405 ; -C -1 ; WX 846 ; N glyph1455 ; B -34 -88 846 405 ; -C -1 ; WX 1098 ; N uni069E ; B 30 -72 1098 723 ; -C -1 ; WX 1098 ; N glyph1457 ; B 30 -72 1098 723 ; -C -1 ; WX 846 ; N glyph1458 ; B -34 143 846 723 ; -C -1 ; WX 846 ; N glyph1459 ; B -34 143 846 723 ; -C -1 ; WX 582 ; N uni069F ; B -34 143 582 793 ; -C -1 ; WX 582 ; N glyph1461 ; B -34 143 582 793 ; -C -1 ; WX 544 ; N uni06A0 ; B 21 -212 516 850 ; -C -1 ; WX 450 ; N glyph1463 ; B 26 -212 486 723 ; -C -1 ; WX 526 ; N glyph1464 ; B -34 143 470 771 ; -C -1 ; WX 394 ; N glyph1465 ; B -34 143 394 723 ; -C -1 ; WX 789 ; N uni06A1 ; B 19 143 789 478 ; -C -1 ; WX 789 ; N uni06A2 ; B 19 -46 789 478 ; -C -1 ; WX 789 ; N glyph1468 ; B 19 -46 789 478 ; -C -1 ; WX 268 ; N glyph1469 ; B -34 -46 268 544 ; -C -1 ; WX 263 ; N glyph1470 ; B -34 -46 263 494 ; -C -1 ; WX 789 ; N uni06A3 ; B 19 -46 789 642 ; -C -1 ; WX 789 ; N glyph1472 ; B 19 -46 789 642 ; -C -1 ; WX 268 ; N glyph1473 ; B -34 -46 268 691 ; -C -1 ; WX 263 ; N glyph1474 ; B -34 -46 263 691 ; -C -1 ; WX 789 ; N uni06A4 ; B 19 143 789 771 ; -C -1 ; WX 789 ; N uniFB6B ; B 19 143 789 771 ; -C -1 ; WX 268 ; N uniFB6C ; B -34 143 268 820 ; -C -1 ; WX 263 ; N uniFB6D ; B -34 143 263 820 ; -C -1 ; WX 789 ; N uni06A5 ; B 19 -175 822 478 ; -C -1 ; WX 789 ; N glyph1480 ; B 19 -175 822 478 ; -C -1 ; WX 268 ; N glyph1481 ; B -34 -175 268 544 ; -C -1 ; WX 263 ; N glyph1482 ; B -34 -175 263 494 ; -C -1 ; WX 789 ; N uni06A6 ; B 19 143 789 801 ; -C -1 ; WX 789 ; N uniFB6F ; B 19 143 789 801 ; -C -1 ; WX 268 ; N uniFB70 ; B -34 143 268 840 ; -C -1 ; WX 263 ; N uniFB71 ; B -34 143 263 840 ; -C -1 ; WX 582 ; N uni06A7 ; B 34 -75 582 627 ; -C -1 ; WX 582 ; N glyph1488 ; B 34 -75 582 627 ; -C -1 ; WX 582 ; N uni06A8 ; B 34 -75 582 723 ; -C -1 ; WX 582 ; N glyph1490 ; B 34 -75 582 723 ; -C -1 ; WX 812 ; N uni06AA ; B 10 143 812 673 ; -C -1 ; WX 933 ; N glyph1492 ; B 10 143 933 673 ; -C -1 ; WX 394 ; N glyph1493 ; B -34 143 394 613 ; -C -1 ; WX 515 ; N glyph1494 ; B -34 143 515 613 ; -C -1 ; WX 812 ; N uni06AB ; B 10 143 812 734 ; -C -1 ; WX 933 ; N glyph1496 ; B 10 143 933 734 ; -C -1 ; WX 394 ; N glyph1497 ; B -34 143 394 734 ; -C -1 ; WX 515 ; N glyph1498 ; B -34 143 515 734 ; -C -1 ; WX 601 ; N uni06AC ; B 22 143 601 775 ; -C -1 ; WX 601 ; N glyph1500 ; B 22 143 601 775 ; -C -1 ; WX 394 ; N glyph1501 ; B -34 143 394 843 ; -C -1 ; WX 394 ; N glyph1502 ; B -34 143 394 843 ; -C -1 ; WX 601 ; N uni06AD ; B 22 143 601 879 ; -C -1 ; WX 601 ; N uniFBD4 ; B 22 143 601 879 ; -C -1 ; WX 394 ; N uniFBD5 ; B -34 143 394 852 ; -C -1 ; WX 394 ; N uniFBD6 ; B -34 143 394 852 ; -C -1 ; WX 601 ; N uni06AE ; B 22 -175 601 775 ; -C -1 ; WX 601 ; N glyph1508 ; B 22 -175 601 775 ; -C -1 ; WX 394 ; N glyph1509 ; B -34 -175 394 734 ; -C -1 ; WX 394 ; N glyph1510 ; B -34 -175 394 734 ; -C -1 ; WX 812 ; N uni06B0 ; B 10 143 812 867 ; -C -1 ; WX 933 ; N glyph1512 ; B 10 143 933 867 ; -C -1 ; WX 394 ; N glyph1513 ; B -34 143 394 876 ; -C -1 ; WX 515 ; N glyph1514 ; B -34 143 515 876 ; -C -1 ; WX 812 ; N uni06B1 ; B 10 143 812 891 ; -C -1 ; WX 933 ; N uniFB9B ; B 10 143 933 891 ; -C -1 ; WX 394 ; N uniFB9C ; B -34 143 394 891 ; -C -1 ; WX 515 ; N uniFB9D ; B -34 143 515 891 ; -C -1 ; WX 812 ; N uni06B2 ; B 10 -88 812 867 ; -C -1 ; WX 933 ; N glyph1520 ; B 10 -88 933 867 ; -C -1 ; WX 394 ; N glyph1521 ; B -34 -88 394 876 ; -C -1 ; WX 515 ; N glyph1522 ; B -34 -88 515 876 ; -C -1 ; WX 812 ; N uni06B3 ; B 10 -166 812 867 ; -C -1 ; WX 933 ; N uniFB97 ; B 10 -166 933 867 ; -C -1 ; WX 394 ; N uniFB98 ; B -34 -166 394 876 ; -C -1 ; WX 515 ; N uniFB99 ; B -34 -166 515 876 ; -C -1 ; WX 812 ; N uni06B4 ; B 10 143 812 891 ; -C -1 ; WX 933 ; N glyph1528 ; B 10 143 933 891 ; -C -1 ; WX 394 ; N glyph1529 ; B -34 143 394 891 ; -C -1 ; WX 515 ; N glyph1530 ; B -34 143 515 891 ; -C -1 ; WX 506 ; N uni06B5 ; B 35 7 506 891 ; -C -1 ; WX 506 ; N glyph1532 ; B 35 7 506 891 ; -C -1 ; WX 207 ; N glyph1533 ; B -34 143 207 891 ; -C -1 ; WX 207 ; N glyph1534 ; B -34 143 207 891 ; -C -1 ; WX 506 ; N uni06B6 ; B 35 7 506 891 ; -C -1 ; WX 506 ; N glyph1536 ; B 35 7 506 891 ; -C -1 ; WX 207 ; N glyph1537 ; B -34 143 207 891 ; -C -1 ; WX 207 ; N glyph1538 ; B -34 143 207 891 ; -C -1 ; WX 506 ; N uni06B7 ; B 35 7 506 891 ; -C -1 ; WX 506 ; N glyph1540 ; B 35 7 506 891 ; -C -1 ; WX 207 ; N glyph1541 ; B -34 143 207 891 ; -C -1 ; WX 207 ; N glyph1542 ; B -34 143 207 891 ; -C -1 ; WX 506 ; N uni06B8 ; B 35 -205 506 775 ; -C -1 ; WX 506 ; N glyph1544 ; B 35 -205 506 775 ; -C -1 ; WX 207 ; N glyph1545 ; B -34 -175 217 775 ; -C -1 ; WX 207 ; N glyph1546 ; B -34 -175 217 775 ; -C -1 ; WX 526 ; N uni06B9 ; B 34 -210 526 558 ; -C -1 ; WX 526 ; N glyph1548 ; B 34 -210 526 558 ; -C -1 ; WX 244 ; N glyph1549 ; B -34 -46 244 636 ; -C -1 ; WX 244 ; N glyph1550 ; B -34 -46 244 636 ; -C -1 ; WX 526 ; N uni06BA ; B 34 -72 526 417 ; -C -1 ; WX 526 ; N uniFB9F ; B 34 -72 526 417 ; -C -1 ; WX 526 ; N uni06BB ; B 34 -72 526 789 ; -C -1 ; WX 526 ; N uniFBA1 ; B 34 -72 526 789 ; -C -1 ; WX 526 ; N uni06BC ; B 34 -184 526 558 ; -C -1 ; WX 526 ; N glyph1556 ; B 34 -184 526 558 ; -C -1 ; WX 244 ; N glyph1557 ; B -34 31 244 636 ; -C -1 ; WX 244 ; N glyph1558 ; B -34 31 244 636 ; -C -1 ; WX 526 ; N uni06BD ; B 34 -72 526 723 ; -C -1 ; WX 526 ; N glyph1560 ; B 34 -72 526 723 ; -C -1 ; WX 563 ; N uni06BF ; B 26 -212 516 639 ; -C -1 ; WX 526 ; N glyph1562 ; B 26 -212 526 639 ; -C -1 ; WX 530 ; N glyph1563 ; B -34 -175 530 639 ; -C -1 ; WX 530 ; N glyph1564 ; B -34 -175 530 639 ; -C -1 ; WX 282 ; N uni06C0 ; B 26 130 262 636 ; -C -1 ; WX 375 ; N uniFBA5 ; B -4 143 375 733 ; -C -1 ; WX 388 ; N uni06C1 ; B 13 71 388 328 ; -C -1 ; WX 388 ; N uni06C2 ; B 13 71 388 538 ; -C -1 ; WX 388 ; N uni06C3 ; B 13 71 388 557 ; -C -1 ; WX 432 ; N uni06C4 ; B 24 -77 432 385 ; -C -1 ; WX 432 ; N glyph1571 ; B 24 -77 432 385 ; -C -1 ; WX 432 ; N uni06C5 ; B 24 -77 432 385 ; -C -1 ; WX 432 ; N uniFBE1 ; B 24 -77 432 385 ; -C -1 ; WX 432 ; N uni06C6 ; B 24 -77 436 585 ; -C -1 ; WX 432 ; N uniFBDA ; B 24 -77 436 585 ; -C -1 ; WX 432 ; N uni06C7 ; B 24 -77 432 665 ; -C -1 ; WX 432 ; N uniFBD8 ; B 24 -77 432 665 ; -C -1 ; WX 432 ; N uni06C8 ; B 24 -77 432 741 ; -C -1 ; WX 432 ; N uniFBDC ; B 24 -77 432 741 ; -C -1 ; WX 432 ; N uni06C9 ; B 24 -77 436 585 ; -C -1 ; WX 432 ; N uniFBE3 ; B 24 -77 436 585 ; -C -1 ; WX 432 ; N uni06CA ; B 24 -77 432 623 ; -C -1 ; WX 432 ; N glyph1583 ; B 24 -77 432 623 ; -C -1 ; WX 432 ; N uni06CB ; B 24 -77 437 710 ; -C -1 ; WX 432 ; N uniFBDF ; B 24 -77 437 710 ; -C -1 ; WX 638 ; N uni06CD ; B -34 -43 606 462 ; -C -1 ; WX 588 ; N glyph1587 ; B -34 -110 588 252 ; -C -1 ; WX 638 ; N uni06CE ; B 24 -43 606 522 ; -C -1 ; WX 588 ; N glyph1589 ; B 18 -110 588 424 ; -C -1 ; WX 244 ; N glyph1590 ; B -34 -69 244 620 ; -C -1 ; WX 244 ; N glyph1591 ; B -34 -69 244 620 ; -C -1 ; WX 432 ; N uni06CF ; B 24 -77 432 586 ; -C -1 ; WX 432 ; N glyph1593 ; B 24 -77 432 586 ; -C -1 ; WX 638 ; N uni06D0 ; B 24 -182 606 462 ; -C -1 ; WX 588 ; N uniFBE5 ; B 18 -212 588 252 ; -C -1 ; WX 244 ; N uniFBE6 ; B -34 -166 244 456 ; -C -1 ; WX 244 ; N uniFBE7 ; B -34 -166 244 456 ; -C -1 ; WX 638 ; N uni06D1 ; B 24 -168 606 462 ; -C -1 ; WX 588 ; N glyph1599 ; B 18 -212 588 252 ; -C -1 ; WX 812 ; N uni06D2 ; B 34 -25 812 373 ; -C -1 ; WX 812 ; N uniFBAF ; B 34 -208 812 228 ; -C -1 ; WX 812 ; N uni06D3 ; B 34 -25 812 489 ; -C -1 ; WX 812 ; N uniFBB1 ; B 34 -208 812 450 ; -C -1 ; WX 207 ; N uni06D4 ; B 20 143 188 228 ; -C -1 ; WX 0 ; N uni06D6 ; B -230 519 231 886 ; -C -1 ; WX 0 ; N uni06D7 ; B -171 519 194 886 ; -C -1 ; WX 0 ; N uni06D8 ; B -102 519 102 646 ; -C -1 ; WX 0 ; N uni06D9 ; B -111 519 111 826 ; -C -1 ; WX 0 ; N uni06DA ; B -116 519 116 825 ; -C -1 ; WX 0 ; N uni06DB ; B -54 519 54 634 ; -C -1 ; WX 0 ; N uni06DC ; B -188 519 188 752 ; -C -1 ; WX 1123 ; N uni06DD ; B 24 -188 1099 886 ; -C -1 ; WX 1084 ; N uni06DE ; B 24 -152 1060 884 ; -C -1 ; WX 0 ; N uni06DF ; B -37 519 37 592 ; -C -1 ; WX 0 ; N uni06E0 ; B -36 519 36 591 ; -C -1 ; WX 0 ; N uni06E1 ; B -134 519 134 654 ; -C -1 ; WX 0 ; N uni06E2 ; B -76 519 77 790 ; -C -1 ; WX 0 ; N uni06E3 ; B -188 -179 188 54 ; -C -1 ; WX 0 ; N uni06E4 ; B -47 519 47 545 ; -C -1 ; WX 194 ; N uni06E5 ; B 0 519 194 738 ; -C -1 ; WX 370 ; N uni06E6 ; B -1 519 370 708 ; -C -1 ; WX 0 ; N uni06E7 ; B -187 519 185 708 ; -C -1 ; WX 0 ; N uni06E8 ; B -117 519 117 819 ; -C -1 ; WX 600 ; N uni06E9 ; B 24 0 576 818 ; -C -1 ; WX 0 ; N uni06EA ; B -82 -165 82 -1 ; -C -1 ; WX 0 ; N uni06EB ; B -82 519 82 683 ; -C -1 ; WX 0 ; N uni06ED ; B -76 -179 77 92 ; -C -1 ; WX 821 ; N uni06FA ; B 30 -72 821 723 ; -C -1 ; WX 821 ; N glyph1629 ; B 30 -72 821 723 ; -C -1 ; WX 531 ; N glyph1630 ; B -34 -46 531 723 ; -C -1 ; WX 531 ; N glyph1631 ; B -34 -46 531 723 ; -C -1 ; WX 1098 ; N uni06FB ; B 30 -72 1098 590 ; -C -1 ; WX 1098 ; N glyph1633 ; B 30 -72 1098 590 ; -C -1 ; WX 846 ; N glyph1634 ; B -34 -46 846 590 ; -C -1 ; WX 846 ; N glyph1635 ; B -34 -46 846 590 ; -C -1 ; WX 544 ; N uni06FC ; B 21 -212 516 737 ; -C -1 ; WX 450 ; N glyph1637 ; B 26 -212 486 639 ; -C -1 ; WX 526 ; N glyph1638 ; B -34 -46 470 639 ; -C -1 ; WX 394 ; N glyph1639 ; B -34 -46 394 639 ; -C -1 ; WX 413 ; N uni06FD ; B 59 -145 363 400 ; -C -1 ; WX 338 ; N uni06FE ; B 17 -212 338 357 ; -C -1 ; WX 282 ; N uniFBA6 ; B 26 130 262 430 ; -C -1 ; WX 244 ; N uniFBA8 ; B -34 -132 244 456 ; -C -1 ; WX 320 ; N uniFBA9 ; B -34 -205 320 365 ; -C -1 ; WX 244 ; N glyph1645 ; B 23 -68 222 49 ; -C -1 ; WX 244 ; N glyph1646 ; B 29 -151 226 -20 ; -C -1 ; WX 244 ; N glyph1647 ; B 9 -136 236 59 ; -C -1 ; WX 244 ; N glyph1648 ; B 86 -64 162 34 ; -C -1 ; WX 244 ; N glyph1649 ; B 53 -70 197 27 ; -C -1 ; WX 812 ; N glyph1650 ; B 10 143 812 852 ; -C -1 ; WX 933 ; N glyph1651 ; B 10 143 933 852 ; -C -1 ; WX 247 ; N uniFB1D ; B 76 109 171 518 ; -C -1 ; WX 0 ; N uniFB1E ; B -144 611 145 737 ; -C -1 ; WX 342 ; N glyph1654 ; B 0 140 342 191 ; -C -1 ; WX 493 ; N uniFB1F ; B 76 140 417 518 ; -C -1 ; WX 544 ; N glyph1656 ; B -5 79 507 890 ; -C -1 ; WX 601 ; N glyph1657 ; B -5 118 601 890 ; -C -1 ; WX 544 ; N glyph1658 ; B 41 -107 507 724 ; -C -1 ; WX 601 ; N glyph1659 ; B 36 -107 601 733 ; -C -1 ; WX 544 ; N glyph1660 ; B 41 79 507 782 ; -C -1 ; WX 601 ; N glyph1661 ; B 36 118 601 782 ; -C -1 ; WX 544 ; N glyph1662 ; B 41 79 514 891 ; -C -1 ; WX 601 ; N glyph1663 ; B 36 118 601 891 ; -C -1 ; WX 544 ; N glyph1664 ; B 41 79 507 891 ; -C -1 ; WX 601 ; N glyph1665 ; B 36 118 601 891 ; -C -1 ; WX 544 ; N glyph1666 ; B 41 79 507 891 ; -C -1 ; WX 601 ; N glyph1667 ; B 36 118 601 891 ; -C -1 ; WX 544 ; N glyph1668 ; B 41 -159 507 724 ; -C -1 ; WX 601 ; N glyph1669 ; B 36 -159 601 733 ; -C -1 ; WX 526 ; N glyph1670 ; B 55 143 485 713 ; -C -1 ; WX 526 ; N glyph1671 ; B 84 107 461 713 ; -C -1 ; WX 544 ; N glyph1672 ; B 7 79 507 891 ; -C -1 ; WX 601 ; N glyph1673 ; B 7 118 601 891 ; -EndCharMetrics -StartKernData -StartKernPairs 908 -KPX space A -55 -KPX space T -18 -KPX space Y -18 -KPX space Alphatonos -55 -KPX space Alpha -55 -KPX space Delta -55 -KPX space Lambda -55 -KPX space Tau -18 -KPX space Upsilon -18 -KPX space Upsilondieresis -18 -KPX one one -74 -KPX A space -55 -KPX A T -74 -KPX A V -74 -KPX A W -37 -KPX A Y -74 -KPX A v -18 -KPX A w -18 -KPX A y -18 -KPX A quoteright -74 -KPX F comma -111 -KPX F period -111 -KPX F A -55 -KPX L space -37 -KPX L T -74 -KPX L V -74 -KPX L W -74 -KPX L Y -74 -KPX L y -37 -KPX L quoteright -55 -KPX P space -18 -KPX P comma -129 -KPX P period -129 -KPX P A -74 -KPX R T -18 -KPX R V -18 -KPX R W -18 -KPX R Y -18 -KPX T space -18 -KPX T comma -111 -KPX T hyphen -55 -KPX T period -111 -KPX T colon -111 -KPX T semicolon -111 -KPX T A -74 -KPX T O -18 -KPX T a -111 -KPX T c -111 -KPX T e -111 -KPX T i -37 -KPX T o -111 -KPX T r -37 -KPX T s -111 -KPX T u -37 -KPX T w -55 -KPX T y -55 -KPX V comma -92 -KPX V hyphen -55 -KPX V period -92 -KPX V colon -37 -KPX V semicolon -37 -KPX V A -74 -KPX V a -74 -KPX V e -55 -KPX V i -18 -KPX V o -55 -KPX V r -37 -KPX V u -37 -KPX V y -37 -KPX W comma -55 -KPX W hyphen -18 -KPX W period -55 -KPX W colon -18 -KPX W semicolon -18 -KPX W A -37 -KPX W a -37 -KPX W e -18 -KPX W o -18 -KPX W r -18 -KPX W u -18 -KPX W y -9 -KPX Y space -18 -KPX Y comma -129 -KPX Y hyphen -92 -KPX Y period -129 -KPX Y colon -55 -KPX Y semicolon -65 -KPX Y A -74 -KPX Y a -74 -KPX Y e -92 -KPX Y i -37 -KPX Y o -92 -KPX Y p -74 -KPX Y q -92 -KPX Y u -55 -KPX Y v -55 -KPX f f -18 -KPX f quoteright 18 -KPX r comma -55 -KPX r period -55 -KPX r quoteright 37 -KPX v comma -74 -KPX v period -74 -KPX w comma -55 -KPX w period -55 -KPX y comma -74 -KPX y period -74 -KPX quoteleft quoteleft -18 -KPX quoteright space -37 -KPX quoteright s -18 -KPX quoteright quoteright -18 -KPX quotedblbase afii10051 -78 -KPX quotedblbase afii10060 -78 -KPX quotedblbase afii10036 -78 -KPX quotedblbase afii10041 -33 -KPX quotedblbase afii10044 -33 -KPX Gamma comma -110 -KPX Gamma period -110 -KPX Gamma iotadieresistonos 80 -KPX Gamma Alpha -92 -KPX Gamma Delta -92 -KPX Gamma Lambda -92 -KPX Gamma iota -43 -KPX Gamma iotadieresis 43 -KPX Theta Alpha -18 -KPX Theta Delta -18 -KPX Theta Lambda -18 -KPX Theta Upsilon -32 -KPX Theta Upsilondieresis -32 -KPX Phi Alpha -29 -KPX Phi Upsilon -32 -KPX Phi Upsilondieresis -32 -KPX delta tau -14 -KPX delta lambda -19 -KPX delta chi -27 -KPX delta pi -14 -KPX tau alpha -14 -KPX tau delta -14 -KPX tau sigma -14 -KPX tau phi -14 -KPX tau alphatonos -14 -KPX tau zeta -14 -KPX tau omicron -14 -KPX tau sigma1 -14 -KPX tau omega -14 -KPX tau omegatonos -14 -KPX phi tau -14 -KPX phi lambda -19 -KPX phi chi -27 -KPX phi pi -14 -KPX Alphatonos Theta -21 -KPX Alphatonos Phi -29 -KPX Alphatonos Omicron -21 -KPX Alphatonos Tau -74 -KPX Alphatonos Upsilon -74 -KPX Alphatonos Upsilondieresis -74 -KPX Alphatonos gamma -18 -KPX Alphatonos nu -18 -KPX Alphatonos chi -18 -KPX Omicrontonos Upsilon -32 -KPX Upsilontonos Theta -56 -KPX Upsilontonos Phi -56 -KPX Upsilontonos alpha -91 -KPX Upsilontonos sigma -91 -KPX Upsilontonos phi -91 -KPX Upsilontonos iotadieresistonos 83 -KPX Upsilontonos Alpha -74 -KPX Upsilontonos Delta -74 -KPX Upsilontonos Lambda -74 -KPX Upsilontonos Omicron -56 -KPX Upsilontonos Omega -48 -KPX Upsilontonos etatonos -74 -KPX Upsilontonos iotatonos -37 -KPX Upsilontonos eta -74 -KPX Upsilontonos iota -37 -KPX Upsilontonos kappa -74 -KPX Upsilontonos mu -74 -KPX Upsilontonos omicron -91 -KPX Upsilontonos iotadieresis 48 -KPX Upsilontonos omicrontonos -91 -KPX Omegatonos Upsilon -23 -KPX Omegatonos Upsilondieresis -23 -KPX Alpha space -55 -KPX Alpha quoteright -74 -KPX Alpha Theta -21 -KPX Alpha Phi -29 -KPX Alpha Omicron -21 -KPX Alpha Tau -74 -KPX Alpha Upsilon -74 -KPX Alpha Upsilondieresis -74 -KPX Alpha gamma -18 -KPX Alpha nu -18 -KPX Alpha chi -18 -KPX Delta space -55 -KPX Delta Theta -21 -KPX Delta Omicron -21 -KPX Delta Tau -58 -KPX Delta Upsilon -74 -KPX Delta Upsilondieresis -74 -KPX Kappa Theta -31 -KPX Kappa Phi -55 -KPX Kappa alpha -12 -KPX Kappa delta -12 -KPX Kappa sigma -12 -KPX Kappa phi -12 -KPX Kappa Omicron -31 -KPX Kappa alphatonos -12 -KPX Kappa zeta -12 -KPX Kappa theta -12 -KPX Kappa xi -12 -KPX Kappa omicron -12 -KPX Kappa omega -12 -KPX Kappa omicrontonos -12 -KPX Kappa omegatonos -12 -KPX Lambda space -55 -KPX Lambda Theta -21 -KPX Lambda Omicron -21 -KPX Lambda Tau -74 -KPX Lambda Upsilon -74 -KPX Lambda Upsilondieresis -74 -KPX Omicron Alpha -18 -KPX Omicron Delta -21 -KPX Omicron Lambda -18 -KPX Omicron Upsilon -32 -KPX Omicron Upsilondieresis -32 -KPX Rho space -18 -KPX Rho comma -128 -KPX Rho period -128 -KPX Rho Alpha -74 -KPX Rho Delta -74 -KPX Rho Lambda -74 -KPX Sigma tau -48 -KPX Sigma pi -48 -KPX Tau space -18 -KPX Tau comma -110 -KPX Tau period -110 -KPX Tau colon -110 -KPX Tau semicolon -110 -KPX Tau Theta -18 -KPX Tau Phi -18 -KPX Tau alpha -110 -KPX Tau epsilon -110 -KPX Tau sigma -110 -KPX Tau phi -110 -KPX Tau iotadieresistonos 92 -KPX Tau Alpha -74 -KPX Tau Delta -74 -KPX Tau Lambda -74 -KPX Tau Omicron -18 -KPX Tau Omega -18 -KPX Tau alphatonos -110 -KPX Tau epsilontonos -110 -KPX Tau upsilondieresistonos -87 -KPX Tau gamma -87 -KPX Tau eta -73 -KPX Tau iota -37 -KPX Tau mu -73 -KPX Tau nu -55 -KPX Tau omicron -110 -KPX Tau upsilon -86 -KPX Tau chi -55 -KPX Tau psi -73 -KPX Tau iotadieresis 92 -KPX Tau upsilondieresis -87 -KPX Tau omicrontonos -110 -KPX Tau upsilontonos -87 -KPX Upsilon space -18 -KPX Upsilon comma -128 -KPX Upsilon hyphen -91 -KPX Upsilon period -128 -KPX Upsilon colon -55 -KPX Upsilon semicolon -55 -KPX Upsilon Theta -56 -KPX Upsilon Phi -56 -KPX Upsilon alpha -91 -KPX Upsilon sigma -91 -KPX Upsilon phi -91 -KPX Upsilon iotadieresistonos 92 -KPX Upsilon Alpha -74 -KPX Upsilon Delta -74 -KPX Upsilon Lambda -74 -KPX Upsilon Omicron -56 -KPX Upsilon Omega -48 -KPX Upsilon etatonos -74 -KPX Upsilon iotatonos -37 -KPX Upsilon gamma -48 -KPX Upsilon eta -74 -KPX Upsilon iota -37 -KPX Upsilon kappa -74 -KPX Upsilon mu -74 -KPX Upsilon omicron -91 -KPX Upsilon iotadieresis 59 -KPX Upsilon omicrontonos -91 -KPX Psi alpha -38 -KPX Psi delta -38 -KPX Psi sigma -38 -KPX Psi phi -38 -KPX Psi alphatonos -38 -KPX Psi theta -19 -KPX Psi omicron -38 -KPX Psi omega -38 -KPX Psi omicrontonos -38 -KPX Psi omegatonos -38 -KPX Omega Upsilon -23 -KPX Omega Upsilondieresis -23 -KPX Upsilondieresis space -18 -KPX Upsilondieresis Theta -56 -KPX Upsilondieresis Phi -56 -KPX Upsilondieresis alpha -91 -KPX Upsilondieresis sigma -91 -KPX Upsilondieresis phi -91 -KPX Upsilondieresis iotadieresistonos 83 -KPX Upsilondieresis Alpha -74 -KPX Upsilondieresis Delta -74 -KPX Upsilondieresis Lambda -74 -KPX Upsilondieresis Omicron -56 -KPX Upsilondieresis Omega -48 -KPX Upsilondieresis etatonos -74 -KPX Upsilondieresis iotatonos -37 -KPX Upsilondieresis eta -74 -KPX Upsilondieresis iota -37 -KPX Upsilondieresis kappa -74 -KPX Upsilondieresis mu -74 -KPX Upsilondieresis omicron -91 -KPX Upsilondieresis iotadieresis 48 -KPX Upsilondieresis omicrontonos -91 -KPX zeta alpha -67 -KPX zeta delta -37 -KPX zeta sigma -67 -KPX zeta tau -42 -KPX zeta phi -67 -KPX zeta alphatonos -67 -KPX zeta etatonos -18 -KPX zeta gamma -42 -KPX zeta eta -18 -KPX zeta theta -48 -KPX zeta iota -18 -KPX zeta kappa -18 -KPX zeta nu -42 -KPX zeta omicron -67 -KPX zeta omega -67 -KPX zeta omicrontonos -67 -KPX zeta omegatonos -67 -KPX zeta pi -42 -KPX theta lambda -19 -KPX kappa alpha -12 -KPX kappa delta -12 -KPX kappa sigma -12 -KPX kappa phi -12 -KPX kappa alphatonos -12 -KPX kappa zeta -12 -KPX kappa theta -12 -KPX kappa xi -12 -KPX kappa omicron -12 -KPX kappa sigma1 -12 -KPX kappa omega -12 -KPX kappa omicrontonos -12 -KPX kappa omegatonos -12 -KPX lambda alpha -15 -KPX lambda delta -15 -KPX lambda sigma -15 -KPX lambda phi -18 -KPX lambda alphatonos -15 -KPX lambda xi -15 -KPX lambda omicron -15 -KPX lambda sigma1 -23 -KPX lambda upsilon -24 -KPX lambda omega -15 -KPX lambda omicrontonos -15 -KPX lambda upsilontonos -24 -KPX lambda omegatonos -15 -KPX xi alpha -27 -KPX xi delta -27 -KPX xi sigma -27 -KPX xi phi -27 -KPX xi alphatonos -27 -KPX xi zeta -27 -KPX xi xi -27 -KPX xi omicron -27 -KPX xi sigma1 -27 -KPX xi omicrontonos -27 -KPX omicron tau -14 -KPX omicron lambda -19 -KPX omicron chi -27 -KPX omicron pi -14 -KPX rho tau -14 -KPX rho lambda -19 -KPX rho pi -14 -KPX chi alpha -27 -KPX chi delta -27 -KPX chi sigma -27 -KPX chi phi -27 -KPX chi alphatonos -27 -KPX chi zeta -27 -KPX chi omicron -27 -KPX chi sigma1 -27 -KPX chi omega -27 -KPX chi omicrontonos -27 -KPX chi omegatonos -27 -KPX omega tau -14 -KPX omega lambda -19 -KPX omega chi -27 -KPX omega pi -14 -KPX omicrontonos tau -14 -KPX omicrontonos lambda -19 -KPX omicrontonos chi -27 -KPX omicrontonos pi -14 -KPX omegatonos tau -14 -KPX omegatonos lambda -19 -KPX omegatonos chi -27 -KPX omegatonos pi -14 -KPX afii10052 comma -122 -KPX afii10052 period -122 -KPX afii10052 guillemotleft -67 -KPX afii10052 guillemotright -67 -KPX afii10052 emdash -22 -KPX afii10058 quoteright -78 -KPX afii10059 quoteright -67 -KPX afii10017 quoteright -56 -KPX afii10017 afii10021 33 -KPX afii10017 afii10025 -11 -KPX afii10017 afii10029 22 -KPX afii10017 afii10032 -22 -KPX afii10017 afii10033 -11 -KPX afii10017 afii10035 -22 -KPX afii10017 afii10036 -78 -KPX afii10017 afii10037 -44 -KPX afii10017 afii10038 -33 -KPX afii10017 afii10041 -78 -KPX afii10017 afii10047 -22 -KPX afii10017 afii10065 11 -KPX afii10017 afii10084 -22 -KPX afii10017 afii10085 -11 -KPX afii10017 afii10086 11 -KPX afii10017 afii10095 22 -KPX afii10018 afii10017 -22 -KPX afii10018 afii10025 -11 -KPX afii10018 afii10032 -11 -KPX afii10018 afii10035 -11 -KPX afii10018 afii10036 -45 -KPX afii10018 afii10037 -23 -KPX afii10018 afii10038 -11 -KPX afii10018 afii10039 -22 -KPX afii10018 afii10041 -45 -KPX afii10018 afii10044 -33 -KPX afii10018 afii10047 -11 -KPX afii10018 afii10049 -11 -KPX afii10018 afii10077 -11 -KPX afii10018 afii10085 -22 -KPX afii10019 afii10017 -33 -KPX afii10019 afii10021 -22 -KPX afii10019 afii10024 -22 -KPX afii10019 afii10025 -33 -KPX afii10019 afii10029 -11 -KPX afii10019 afii10032 -33 -KPX afii10019 afii10035 -33 -KPX afii10019 afii10036 -67 -KPX afii10019 afii10037 -33 -KPX afii10019 afii10038 -33 -KPX afii10019 afii10039 -44 -KPX afii10019 afii10041 -45 -KPX afii10019 afii10044 -56 -KPX afii10019 afii10049 -33 -KPX afii10019 afii10069 -11 -KPX afii10019 afii10078 -11 -KPX afii10019 afii10084 -33 -KPX afii10019 afii10085 -11 -KPX afii10019 afii10087 -11 -KPX afii10019 afii10089 -33 -KPX afii10019 afii10097 -11 -KPX afii10020 comma -122 -KPX afii10020 period -122 -KPX afii10020 guillemotleft -67 -KPX afii10020 guillemotright -67 -KPX afii10020 emdash -22 -KPX afii10020 afii10017 -67 -KPX afii10020 afii10021 -67 -KPX afii10020 afii10025 -22 -KPX afii10020 afii10029 -56 -KPX afii10020 afii10030 -23 -KPX afii10020 afii10032 -56 -KPX afii10020 afii10035 -45 -KPX afii10020 afii10049 -33 -KPX afii10020 afii10065 -56 -KPX afii10020 afii10067 -56 -KPX afii10020 afii10069 -67 -KPX afii10020 afii10070 -67 -KPX afii10020 afii10074 -56 -KPX afii10020 afii10077 -56 -KPX afii10020 afii10078 -56 -KPX afii10020 afii10079 -56 -KPX afii10020 afii10080 -67 -KPX afii10020 afii10082 -56 -KPX afii10020 afii10085 -67 -KPX afii10020 afii10093 -56 -KPX afii10020 afii10094 -56 -KPX afii10020 afii10096 -56 -KPX afii10020 afii10097 -67 -KPX afii10021 afii10037 11 -KPX afii10021 afii10038 -22 -KPX afii10021 afii10041 -34 -KPX afii10021 afii10073 33 -KPX afii10021 afii10080 11 -KPX afii10021 afii10085 22 -KPX afii10022 afii10025 -22 -KPX afii10022 afii10083 -11 -KPX afii10024 afii10025 -11 -KPX afii10024 afii10032 -22 -KPX afii10024 afii10035 -11 -KPX afii10024 afii10036 11 -KPX afii10024 afii10037 22 -KPX afii10024 afii10044 22 -KPX afii10024 afii10065 11 -KPX afii10024 afii10070 -12 -KPX afii10024 afii10080 -11 -KPX afii10024 afii10085 -11 -KPX afii10025 afii10029 -11 -KPX afii10025 afii10032 -11 -KPX afii10025 afii10035 -11 -KPX afii10025 afii10036 -22 -KPX afii10025 afii10037 -11 -KPX afii10025 afii10038 -11 -KPX afii10025 afii10041 -22 -KPX afii10025 afii10049 -11 -KPX afii10028 afii10025 -11 -KPX afii10028 afii10032 -11 -KPX afii10028 afii10035 -11 -KPX afii10028 afii10037 11 -KPX afii10028 afii10038 -34 -KPX afii10029 afii10038 -11 -KPX afii10029 afii10066 11 -KPX afii10029 afii10085 11 -KPX afii10030 afii10038 -11 -KPX afii10030 afii10041 -11 -KPX afii10030 afii10065 11 -KPX afii10030 afii10070 11 -KPX afii10030 afii10080 11 -KPX afii10030 afii10083 11 -KPX afii10030 afii10085 11 -KPX afii10030 afii10089 -11 -KPX afii10030 afii10095 11 -KPX afii10032 afii10017 -22 -KPX afii10032 afii10021 -22 -KPX afii10032 afii10024 -22 -KPX afii10032 afii10029 -11 -KPX afii10032 afii10037 -22 -KPX afii10032 afii10039 -45 -KPX afii10032 afii10041 -22 -KPX afii10032 afii10049 -22 -KPX afii10032 afii10069 -22 -KPX afii10032 afii10077 -11 -KPX afii10032 afii10087 -11 -KPX afii10034 comma -189 -KPX afii10034 period -189 -KPX afii10034 colon -22 -KPX afii10034 semicolon -22 -KPX afii10034 guillemotright -56 -KPX afii10034 afii10017 -67 -KPX afii10034 afii10021 -67 -KPX afii10034 afii10024 -11 -KPX afii10034 afii10025 -22 -KPX afii10034 afii10029 -56 -KPX afii10034 afii10030 -11 -KPX afii10034 afii10032 -22 -KPX afii10034 afii10035 -11 -KPX afii10034 afii10036 -45 -KPX afii10034 afii10037 -22 -KPX afii10034 afii10038 -11 -KPX afii10034 afii10039 -45 -KPX afii10034 afii10049 -22 -KPX afii10034 afii10065 -33 -KPX afii10034 afii10069 -78 -KPX afii10034 afii10070 -44 -KPX afii10034 afii10080 -44 -KPX afii10034 afii10095 -22 -KPX afii10034 afii10097 -33 -KPX afii10035 afii10017 -22 -KPX afii10035 afii10021 -22 -KPX afii10035 afii10025 -11 -KPX afii10035 afii10029 -33 -KPX afii10035 afii10030 -11 -KPX afii10035 afii10032 -22 -KPX afii10035 afii10036 -33 -KPX afii10035 afii10037 -33 -KPX afii10035 afii10039 -56 -KPX afii10035 afii10041 -33 -KPX afii10035 afii10044 -34 -KPX afii10035 afii10047 -11 -KPX afii10035 afii10065 11 -KPX afii10035 afii10072 22 -KPX afii10035 afii10089 -11 -KPX afii10036 comma -111 -KPX afii10036 period -111 -KPX afii10036 guillemotleft -44 -KPX afii10036 guillemotright -44 -KPX afii10036 emdash -22 -KPX afii10036 afii10017 -33 -KPX afii10036 afii10021 -33 -KPX afii10036 afii10024 11 -KPX afii10036 afii10025 -11 -KPX afii10036 afii10029 -22 -KPX afii10036 afii10032 -45 -KPX afii10036 afii10038 -33 -KPX afii10036 afii10049 -22 -KPX afii10036 afii10065 -45 -KPX afii10036 afii10067 -44 -KPX afii10036 afii10070 -56 -KPX afii10036 afii10074 -44 -KPX afii10036 afii10076 -44 -KPX afii10036 afii10077 -45 -KPX afii10036 afii10078 -44 -KPX afii10036 afii10080 -78 -KPX afii10036 afii10081 -44 -KPX afii10036 afii10082 -56 -KPX afii10036 afii10083 -56 -KPX afii10036 afii10085 -56 -KPX afii10036 afii10087 -44 -KPX afii10036 afii10091 -44 -KPX afii10036 afii10093 -44 -KPX afii10036 afii10094 -44 -KPX afii10036 afii10096 -44 -KPX afii10036 afii10097 -56 -KPX afii10037 comma -133 -KPX afii10037 period -133 -KPX afii10037 colon -22 -KPX afii10037 semicolon -22 -KPX afii10037 guillemotleft -44 -KPX afii10037 guillemotright -45 -KPX afii10037 emdash -11 -KPX afii10037 afii10017 -67 -KPX afii10037 afii10021 -45 -KPX afii10037 afii10025 -22 -KPX afii10037 afii10029 -33 -KPX afii10037 afii10032 -33 -KPX afii10037 afii10038 -33 -KPX afii10037 afii10047 -22 -KPX afii10037 afii10049 -22 -KPX afii10037 afii10066 -22 -KPX afii10037 afii10067 -56 -KPX afii10037 afii10068 -45 -KPX afii10037 afii10069 -78 -KPX afii10037 afii10070 -67 -KPX afii10037 afii10072 -33 -KPX afii10037 afii10073 -56 -KPX afii10037 afii10074 -45 -KPX afii10037 afii10075 -33 -KPX afii10037 afii10076 -45 -KPX afii10037 afii10077 -67 -KPX afii10037 afii10078 -45 -KPX afii10037 afii10079 -45 -KPX afii10037 afii10080 -67 -KPX afii10037 afii10081 -45 -KPX afii10037 afii10082 -45 -KPX afii10037 afii10083 -67 -KPX afii10037 afii10087 -45 -KPX afii10037 afii10088 -45 -KPX afii10037 afii10090 -45 -KPX afii10037 afii10091 -45 -KPX afii10037 afii10096 -45 -KPX afii10037 afii10097 -67 -KPX afii10038 afii10017 -22 -KPX afii10038 afii10021 -33 -KPX afii10038 afii10029 -33 -KPX afii10038 afii10036 -56 -KPX afii10038 afii10037 -45 -KPX afii10038 afii10041 -22 -KPX afii10038 afii10049 -34 -KPX afii10038 afii10077 -33 -KPX afii10039 afii10025 -22 -KPX afii10039 afii10032 -33 -KPX afii10039 afii10035 -33 -KPX afii10039 afii10038 -33 -KPX afii10039 afii10047 -34 -KPX afii10039 afii10080 -11 -KPX afii10039 afii10085 -22 -KPX afii10040 afii10032 -22 -KPX afii10040 afii10065 22 -KPX afii10043 afii10065 11 -KPX afii10043 afii10085 22 -KPX afii10044 quoteright -67 -KPX afii10044 afii10049 -33 -KPX afii10046 quoteright -78 -KPX afii10046 afii10017 -22 -KPX afii10046 afii10021 -22 -KPX afii10046 afii10024 -33 -KPX afii10046 afii10025 -11 -KPX afii10046 afii10029 -34 -KPX afii10046 afii10030 -22 -KPX afii10046 afii10032 -22 -KPX afii10046 afii10035 -22 -KPX afii10046 afii10036 -100 -KPX afii10046 afii10039 -45 -KPX afii10046 afii10041 -78 -KPX afii10046 afii10047 -11 -KPX afii10046 afii10049 -45 -KPX afii10047 afii10021 -33 -KPX afii10047 afii10024 -12 -KPX afii10047 afii10025 -11 -KPX afii10047 afii10029 -33 -KPX afii10047 afii10039 -34 -KPX afii10047 afii10049 -22 -KPX afii10047 afii10069 -33 -KPX afii10047 afii10072 11 -KPX afii10047 afii10077 -33 -KPX afii10047 afii10078 -11 -KPX afii10047 afii10097 -11 -KPX afii10048 afii10017 -33 -KPX afii10048 afii10021 -44 -KPX afii10048 afii10024 -22 -KPX afii10048 afii10029 -45 -KPX afii10048 afii10032 -11 -KPX afii10048 afii10035 -11 -KPX afii10048 afii10036 -56 -KPX afii10048 afii10039 -45 -KPX afii10048 afii10041 -33 -KPX afii10048 afii10069 -45 -KPX afii10048 afii10077 -45 -KPX afii10048 afii10078 -11 -KPX afii10065 afii10073 -11 -KPX afii10065 afii10084 -22 -KPX afii10065 afii10085 -11 -KPX afii10065 afii10089 -22 -KPX afii10066 afii10065 -23 -KPX afii10066 afii10069 -45 -KPX afii10066 afii10070 -11 -KPX afii10066 afii10072 -11 -KPX afii10066 afii10073 -22 -KPX afii10066 afii10077 -45 -KPX afii10066 afii10078 -22 -KPX afii10066 afii10083 -11 -KPX afii10066 afii10085 -22 -KPX afii10066 afii10086 -11 -KPX afii10066 afii10087 -33 -KPX afii10066 afii10089 -33 -KPX afii10066 afii10092 -33 -KPX afii10066 afii10095 -11 -KPX afii10066 afii10097 -22 -KPX afii10067 afii10065 -11 -KPX afii10067 afii10066 -11 -KPX afii10067 afii10069 -11 -KPX afii10067 afii10070 -11 -KPX afii10067 afii10072 -11 -KPX afii10067 afii10073 -11 -KPX afii10067 afii10077 -23 -KPX afii10067 afii10078 -11 -KPX afii10067 afii10080 -11 -KPX afii10067 afii10083 -11 -KPX afii10067 afii10084 -22 -KPX afii10067 afii10085 -22 -KPX afii10067 afii10086 -11 -KPX afii10067 afii10089 -45 -KPX afii10067 afii10092 -33 -KPX afii10067 afii10097 -11 -KPX afii10068 comma -122 -KPX afii10068 period -122 -KPX afii10068 afii10065 -22 -KPX afii10068 afii10069 -45 -KPX afii10068 afii10070 -22 -KPX afii10068 afii10073 -11 -KPX afii10068 afii10077 -22 -KPX afii10068 afii10080 -22 -KPX afii10068 afii10083 -22 -KPX afii10068 afii10097 -11 -KPX afii10069 afii10092 -22 -KPX afii10069 afii10095 11 -KPX afii10070 afii10066 -11 -KPX afii10070 afii10069 -22 -KPX afii10070 afii10072 -11 -KPX afii10070 afii10073 -22 -KPX afii10070 afii10077 -33 -KPX afii10070 afii10084 -33 -KPX afii10070 afii10085 -11 -KPX afii10070 afii10087 -22 -KPX afii10070 afii10089 -33 -KPX afii10072 afii10066 11 -KPX afii10072 afii10085 11 -KPX afii10072 afii10089 -11 -KPX afii10072 afii10092 22 -KPX afii10073 afii10066 -11 -KPX afii10073 afii10069 -22 -KPX afii10073 afii10070 -11 -KPX afii10073 afii10073 -11 -KPX afii10073 afii10077 -11 -KPX afii10073 afii10080 -11 -KPX afii10073 afii10083 -11 -KPX afii10073 afii10085 -11 -KPX afii10073 afii10086 -11 -KPX afii10073 afii10089 -33 -KPX afii10073 afii10092 -22 -KPX afii10076 afii10065 22 -KPX afii10076 afii10066 22 -KPX afii10076 afii10070 11 -KPX afii10076 afii10073 11 -KPX afii10076 afii10077 11 -KPX afii10076 afii10080 11 -KPX afii10076 afii10083 11 -KPX afii10076 afii10084 11 -KPX afii10076 afii10085 11 -KPX afii10076 afii10095 11 -KPX afii10077 afii10080 11 -KPX afii10077 afii10089 -22 -KPX afii10078 afii10066 -11 -KPX afii10078 afii10073 -11 -KPX afii10078 afii10085 11 -KPX afii10080 afii10069 -22 -KPX afii10080 afii10072 -11 -KPX afii10080 afii10073 -11 -KPX afii10080 afii10077 -22 -KPX afii10080 afii10084 -22 -KPX afii10080 afii10085 -11 -KPX afii10080 afii10087 -11 -KPX afii10080 afii10089 -22 -KPX afii10082 afii10069 -23 -KPX afii10082 afii10073 -11 -KPX afii10082 afii10077 -34 -KPX afii10082 afii10084 -22 -KPX afii10082 afii10085 -11 -KPX afii10082 afii10087 -11 -KPX afii10082 afii10089 -22 -KPX afii10082 afii10097 -11 -KPX afii10083 afii10072 11 -KPX afii10083 afii10080 11 -KPX afii10083 afii10089 -11 -KPX afii10083 afii10095 11 -KPX afii10084 comma -111 -KPX afii10084 period -111 -KPX afii10084 afii10065 -11 -KPX afii10084 afii10069 -33 -KPX afii10084 afii10070 -11 -KPX afii10084 afii10072 33 -KPX afii10084 afii10077 -22 -KPX afii10084 afii10080 -11 -KPX afii10084 afii10083 -11 -KPX afii10084 afii10085 11 -KPX afii10085 comma -100 -KPX afii10085 period -100 -KPX afii10085 guillemotright 11 -KPX afii10085 afii10065 -11 -KPX afii10085 afii10066 11 -KPX afii10085 afii10069 -33 -KPX afii10085 afii10070 -11 -KPX afii10085 afii10072 11 -KPX afii10085 afii10077 -22 -KPX afii10085 afii10078 -11 -KPX afii10085 afii10080 -12 -KPX afii10085 afii10082 -11 -KPX afii10085 afii10083 -11 -KPX afii10085 afii10086 -11 -KPX afii10085 afii10095 -11 -KPX afii10085 afii10097 -11 -KPX afii10086 afii10066 -11 -KPX afii10086 afii10069 -22 -KPX afii10086 afii10077 -22 -KPX afii10086 afii10084 -22 -KPX afii10086 afii10085 -11 -KPX afii10086 afii10089 -22 -KPX afii10086 afii10097 -11 -KPX afii10087 afii10065 -11 -KPX afii10087 afii10066 -11 -KPX afii10087 afii10070 -11 -KPX afii10087 afii10073 -11 -KPX afii10087 afii10080 -11 -KPX afii10087 afii10083 -11 -KPX afii10087 afii10084 -11 -KPX afii10087 afii10086 -11 -KPX afii10087 afii10089 -22 -KPX afii10088 afii10070 -11 -KPX afii10088 afii10073 -11 -KPX afii10088 afii10080 -11 -KPX afii10088 afii10083 -11 -KPX afii10091 afii10070 -11 -KPX afii10091 afii10080 -11 -KPX afii10091 afii10085 11 -KPX afii10094 afii10084 -78 -KPX afii10094 afii10089 -67 -KPX afii10095 afii10069 -22 -KPX afii10095 afii10070 11 -KPX afii10095 afii10073 -11 -KPX afii10095 afii10077 -22 -KPX afii10095 afii10080 11 -KPX afii10095 afii10084 -22 -KPX afii10095 afii10087 -11 -KPX afii10095 afii10097 -11 -KPX afii10096 afii10069 -22 -KPX afii10096 afii10072 -11 -KPX afii10096 afii10077 -22 -KPX afii10096 afii10078 -11 -KPX afii10096 afii10084 -22 -KPX afii10096 afii10087 -11 -KPX afii10096 afii10089 -22 -KPX afii10110 comma -100 -KPX afii10110 period -100 -KPX afii10050 comma -122 -KPX afii10050 period -122 -KPX afii10050 colon -22 -KPX afii10050 semicolon -22 -KPX afii10050 guillemotleft -78 -KPX afii10050 guillemotright -78 -KPX afii10050 emdash -22 -KPX pi alpha -14 -KPX pi sigma -14 -KPX pi phi -14 -KPX pi alphatonos -14 -KPX pi zeta -14 -KPX pi omicron -14 -KPX pi sigma1 -14 -KPX pi omega -14 -KPX pi omegatonos -14 -EndKernPairs -EndKernData -EndFontMetrics +StartFontMetrics 4.1 +FontName ArialMT +FullName Arial +Notice Typeface The Monotype Corporation plc. Data The Monotype Corporation plc/Type Solutions Inc. 1990-1992. All Rights Reserved +EncodingScheme FontSpecific +FamilyName Arial +Weight Regular +Version Version 3.00 +Characters 1674 +ItalicAngle 0.0 +Ascender 905 +Descender -212 +UnderlineThickness 73 +UnderlinePosition -106 +IsFixedPitch false +FontBBox -664 -325 2000 1006 +StartCharMetrics 1709 +C 0 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 1 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 2 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 3 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 4 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 5 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 6 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 7 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 8 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 9 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 10 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 11 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 12 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 13 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 14 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 15 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 16 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 17 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 18 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 19 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 20 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 21 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 22 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 23 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 24 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 25 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 26 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 27 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 28 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 29 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 30 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 31 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 32 ; WX 278 ; N space ; B 86 0 195 716 ; +C 33 ; WX 278 ; N exclam ; B 86 0 195 716 ; +C 34 ; WX 355 ; N quotedbl ; B 46 462 308 716 ; +C 35 ; WX 556 ; N numbersign ; B 10 -12 543 728 ; +C 36 ; WX 556 ; N dollar ; B 36 -103 509 782 ; +C 37 ; WX 889 ; N percent ; B 58 -26 828 728 ; +C 38 ; WX 667 ; N ampersand ; B 43 -17 644 728 ; +C 39 ; WX 191 ; N quotesingle ; B 44 462 144 716 ; +C 40 ; WX 333 ; N parenleft ; B 61 -210 297 728 ; +C 41 ; WX 333 ; N parenright ; B 61 -210 297 728 ; +C 42 ; WX 389 ; N asterisk ; B 31 423 354 728 ; +C 43 ; WX 584 ; N plus ; B 56 116 528 589 ; +C 44 ; WX 278 ; N comma ; B 83 -142 189 100 ; +C 45 ; WX 333 ; N hyphen ; B 32 215 302 303 ; +C 46 ; WX 278 ; N period ; B 91 0 191 100 ; +C 47 ; WX 278 ; N slash ; B 0 -12 278 728 ; +C 48 ; WX 556 ; N zero ; B 42 -12 508 719 ; +C 49 ; WX 556 ; N one ; B 109 0 373 719 ; +C 50 ; WX 556 ; N two ; B 29 0 503 719 ; +C 51 ; WX 556 ; N three ; B 42 -13 511 719 ; +C 52 ; WX 556 ; N four ; B 13 0 508 716 ; +C 53 ; WX 556 ; N five ; B 42 -12 516 706 ; +C 54 ; WX 556 ; N six ; B 38 -12 510 719 ; +C 55 ; WX 556 ; N seven ; B 47 0 511 707 ; +C 56 ; WX 556 ; N eight ; B 41 -12 512 719 ; +C 57 ; WX 556 ; N nine ; B 42 -12 512 719 ; +C 58 ; WX 278 ; N colon ; B 90 0 190 519 ; +C 59 ; WX 278 ; N semicolon ; B 83 -142 189 519 ; +C 60 ; WX 584 ; N less ; B 55 110 529 595 ; +C 61 ; WX 584 ; N equal ; B 56 204 528 503 ; +C 62 ; WX 584 ; N greater ; B 55 110 529 595 ; +C 63 ; WX 556 ; N question ; B 44 0 506 728 ; +C 64 ; WX 1015 ; N at ; B 54 -210 979 729 ; +C 65 ; WX 667 ; N A ; B -1 0 668 716 ; +C 66 ; WX 667 ; N B ; B 73 0 614 716 ; +C 67 ; WX 722 ; N C ; B 50 -12 683 728 ; +C 68 ; WX 722 ; N D ; B 77 0 669 716 ; +C 69 ; WX 667 ; N E ; B 79 0 613 716 ; +C 70 ; WX 611 ; N F ; B 82 0 565 716 ; +C 71 ; WX 778 ; N G ; B 53 -12 715 728 ; +C 72 ; WX 722 ; N H ; B 80 0 642 716 ; +C 73 ; WX 278 ; N I ; B 93 0 188 716 ; +C 74 ; WX 500 ; N J ; B 27 -12 422 716 ; +C 75 ; WX 667 ; N K ; B 73 0 665 716 ; +C 76 ; WX 556 ; N L ; B 73 0 521 716 ; +C 77 ; WX 833 ; N M ; B 74 0 757 716 ; +C 78 ; WX 722 ; N N ; B 76 0 640 716 ; +C 79 ; WX 778 ; N O ; B 48 -12 733 729 ; +C 80 ; WX 667 ; N P ; B 77 0 624 716 ; +C 81 ; WX 778 ; N Q ; B 43 -56 741 729 ; +C 82 ; WX 722 ; N R ; B 79 0 709 716 ; +C 83 ; WX 667 ; N S ; B 45 -12 615 728 ; +C 84 ; WX 611 ; N T ; B 23 0 591 716 ; +C 85 ; WX 722 ; N U ; B 79 -12 642 716 ; +C 86 ; WX 667 ; N V ; B 4 0 659 716 ; +C 87 ; WX 944 ; N W ; B 12 0 933 716 ; +C 88 ; WX 667 ; N X ; B 4 0 661 716 ; +C 89 ; WX 667 ; N Y ; B 3 0 659 716 ; +C 90 ; WX 611 ; N Z ; B 20 0 586 716 ; +C 91 ; WX 278 ; N bracketleft ; B 68 -199 262 716 ; +C 92 ; WX 278 ; N backslash ; B 0 -12 278 728 ; +C 93 ; WX 278 ; N bracketright ; B 19 -199 213 716 ; +C 94 ; WX 469 ; N asciicircum ; B 26 337 443 728 ; +C 95 ; WX 556 ; N underscore ; B -15 -199 567 -135 ; +C 96 ; WX 333 ; N grave ; B 43 583 227 720 ; +C 97 ; WX 556 ; N a ; B 36 -12 514 530 ; +C 98 ; WX 556 ; N b ; B 65 -12 515 716 ; +C 99 ; WX 500 ; N c ; B 39 -12 491 530 ; +C 100 ; WX 556 ; N d ; B 34 -12 484 716 ; +C 101 ; WX 556 ; N e ; B 37 -12 515 530 ; +C 102 ; WX 278 ; N f ; B 9 0 313 728 ; +C 103 ; WX 556 ; N g ; B 32 -210 489 530 ; +C 104 ; WX 556 ; N h ; B 66 0 488 716 ; +C 105 ; WX 222 ; N i ; B 66 0 154 716 ; +C 106 ; WX 222 ; N j ; B -46 -210 153 716 ; +C 107 ; WX 500 ; N k ; B 66 0 496 716 ; +C 108 ; WX 222 ; N l ; B 64 0 152 716 ; +C 109 ; WX 833 ; N m ; B 66 0 769 530 ; +C 110 ; WX 556 ; N n ; B 66 0 487 530 ; +C 111 ; WX 556 ; N o ; B 33 -12 519 530 ; +C 112 ; WX 556 ; N p ; B 66 -199 516 530 ; +C 113 ; WX 556 ; N q ; B 35 -199 484 530 ; +C 114 ; WX 333 ; N r ; B 65 0 347 530 ; +C 115 ; WX 500 ; N s ; B 31 -12 461 530 ; +C 116 ; WX 278 ; N t ; B 18 -7 271 700 ; +C 117 ; WX 556 ; N u ; B 64 -12 484 519 ; +C 118 ; WX 500 ; N v ; B 13 0 488 519 ; +C 119 ; WX 722 ; N w ; B 3 0 714 519 ; +C 120 ; WX 500 ; N x ; B 7 0 493 519 ; +C 121 ; WX 500 ; N y ; B 16 -210 491 519 ; +C 122 ; WX 500 ; N z ; B 20 0 479 519 ; +C 123 ; WX 334 ; N braceleft ; B 28 -210 311 728 ; +C 124 ; WX 260 ; N bar ; B 92 -210 168 728 ; +C 125 ; WX 334 ; N braceright ; B 23 -210 306 728 ; +C 126 ; WX 584 ; N asciitilde ; B 42 272 542 432 ; +C 127 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 128 ; WX 556 ; N Euro ; B -14 -12 541 728 ; +C 129 ; WX 542 ; N afii10052 ; B 79 0 542 896 ; +C 130 ; WX 222 ; N quotesinglbase ; B 53 -132 155 102 ; +C 131 ; WX 556 ; N florin ; B 22 -210 530 729 ; +C 132 ; WX 333 ; N quotedblbase ; B 35 -132 288 102 ; +C 133 ; WX 1000 ; N ellipsis ; B 117 0 884 100 ; +C 134 ; WX 556 ; N dagger ; B 36 -169 515 699 ; +C 135 ; WX 556 ; N daggerdbl ; B 36 -169 517 706 ; +C 136 ; WX 333 ; N circumflex ; B 12 583 321 720 ; +C 137 ; WX 1000 ; N perthousand ; B 18 -26 982 728 ; +C 138 ; WX 667 ; N Scaron ; B 45 -12 615 894 ; +C 139 ; WX 333 ; N guilsinglleft ; B 45 35 271 480 ; +C 140 ; WX 1000 ; N OE ; B 63 -12 968 728 ; +C 141 ; WX 583 ; N afii10061 ; B 79 0 579 896 ; +C 142 ; WX 611 ; N Zcaron ; B 20 0 586 894 ; +C 143 ; WX 719 ; N afii10145 ; B 78 -199 641 716 ; +C 144 ; WX 333 ; N quotedblbase ; B 35 -132 288 102 ; +C 145 ; WX 222 ; N quoteleft ; B 63 494 165 728 ; +C 146 ; WX 222 ; N quoteright ; B 53 489 155 723 ; +C 147 ; WX 333 ; N quotedblleft ; B 41 494 294 728 ; +C 148 ; WX 333 ; N quotedblright ; B 35 489 288 723 ; +C 149 ; WX 350 ; N bullet ; B 53 227 301 474 ; +C 150 ; WX 556 ; N endash ; B -2 224 554 294 ; +C 151 ; WX 1000 ; N emdash ; B 0 224 1000 294 ; +C 152 ; WX 333 ; N tilde ; B 3 595 330 708 ; +C 153 ; WX 1000 ; N trademark ; B 110 318 871 716 ; +C 154 ; WX 500 ; N scaron ; B 31 -12 461 720 ; +C 155 ; WX 333 ; N guilsinglright ; B 45 35 266 480 ; +C 156 ; WX 944 ; N oe ; B 40 -12 908 530 ; +C 157 ; WX 438 ; N afii10109 ; B 65 0 445 720 ; +C 158 ; WX 500 ; N zcaron ; B 20 0 479 720 ; +C 159 ; WX 667 ; N Ydieresis ; B 3 0 659 860 ; +C 160 ; WX 278 ; N space ; B 86 0 195 716 ; +C 161 ; WX 333 ; N exclamdown ; B 113 -197 222 519 ; +C 162 ; WX 556 ; N cent ; B 52 -200 505 716 ; +C 163 ; WX 556 ; N sterling ; B 13 -14 528 728 ; +C 164 ; WX 556 ; N currency ; B 36 115 516 594 ; +C 165 ; WX 556 ; N yen ; B -1 0 553 716 ; +C 166 ; WX 260 ; N brokenbar ; B 92 -210 168 728 ; +C 167 ; WX 556 ; N section ; B 40 -210 510 728 ; +C 168 ; WX 333 ; N dieresis ; B 30 620 304 720 ; +C 169 ; WX 737 ; N copyright ; B 1 -9 738 728 ; +C 170 ; WX 370 ; N ordfeminine ; B 23 364 351 728 ; +C 171 ; WX 556 ; N guillemotleft ; B 65 35 484 480 ; +C 172 ; WX 584 ; N logicalnot ; B 56 207 528 503 ; +C 173 ; WX 333 ; N hyphen ; B 32 215 302 303 ; +C 174 ; WX 737 ; N registered ; B 1 -9 738 728 ; +C 175 ; WX 552 ; N overscore ; B -15 765 567 828 ; +C 176 ; WX 400 ; N degree ; B 63 457 333 728 ; +C 177 ; WX 549 ; N plusminus ; B 38 0 511 600 ; +C 178 ; WX 333 ; N twosuperior ; B 12 358 316 725 ; +C 179 ; WX 333 ; N threesuperior ; B 16 349 315 725 ; +C 180 ; WX 333 ; N acute ; B 108 583 289 720 ; +C 181 ; WX 576 ; N mu1 ; B 78 -199 497 519 ; +C 182 ; WX 537 ; N paragraph ; B 0 -199 541 716 ; +C 183 ; WX 278 ; N periodcentered ; B 90 302 190 402 ; +C 184 ; WX 333 ; N cedilla ; B 52 -206 264 11 ; +C 185 ; WX 333 ; N onesuperior ; B 52 358 232 725 ; +C 186 ; WX 365 ; N ordmasculine ; B 22 361 342 728 ; +C 187 ; WX 556 ; N guillemotright ; B 68 35 487 480 ; +C 188 ; WX 834 ; N onequarter ; B 52 -28 819 728 ; +C 189 ; WX 834 ; N onehalf ; B 52 -28 816 728 ; +C 190 ; WX 834 ; N threequarters ; B 16 -28 819 728 ; +C 191 ; WX 611 ; N questiondown ; B 77 -209 539 519 ; +C 192 ; WX 667 ; N Agrave ; B -1 0 668 896 ; +C 193 ; WX 667 ; N Aacute ; B -1 0 668 896 ; +C 194 ; WX 667 ; N Acircumflex ; B -1 0 668 896 ; +C 195 ; WX 667 ; N Atilde ; B -1 0 668 873 ; +C 196 ; WX 667 ; N Adieresis ; B -1 0 668 860 ; +C 197 ; WX 667 ; N Aring ; B -1 0 668 869 ; +C 198 ; WX 1000 ; N AE ; B 0 0 945 716 ; +C 199 ; WX 722 ; N Ccedilla ; B 50 -206 683 728 ; +C 200 ; WX 667 ; N Egrave ; B 79 0 613 896 ; +C 201 ; WX 667 ; N Eacute ; B 79 0 613 896 ; +C 202 ; WX 667 ; N Ecircumflex ; B 79 0 613 896 ; +C 203 ; WX 667 ; N Edieresis ; B 79 0 613 860 ; +C 204 ; WX 278 ; N Igrave ; B 26 0 210 896 ; +C 205 ; WX 278 ; N Iacute ; B 69 0 249 896 ; +C 206 ; WX 278 ; N Icircumflex ; B -16 0 293 896 ; +C 207 ; WX 278 ; N Idieresis ; B 2 0 276 860 ; +C 208 ; WX 722 ; N Eth ; B -1 0 669 716 ; +C 209 ; WX 722 ; N Ntilde ; B 76 0 640 873 ; +C 210 ; WX 778 ; N Ograve ; B 48 -12 733 896 ; +C 211 ; WX 778 ; N Oacute ; B 48 -12 733 896 ; +C 212 ; WX 778 ; N Ocircumflex ; B 48 -12 733 896 ; +C 213 ; WX 778 ; N Otilde ; B 48 -12 733 873 ; +C 214 ; WX 778 ; N Odieresis ; B 48 -12 733 860 ; +C 215 ; WX 584 ; N multiply ; B 79 141 504 566 ; +C 216 ; WX 778 ; N Oslash ; B 41 -29 741 742 ; +C 217 ; WX 722 ; N Ugrave ; B 79 -12 642 896 ; +C 218 ; WX 722 ; N Uacute ; B 79 -12 642 896 ; +C 219 ; WX 722 ; N Ucircumflex ; B 79 -12 642 896 ; +C 220 ; WX 722 ; N Udieresis ; B 79 -12 642 860 ; +C 221 ; WX 667 ; N Yacute ; B 3 0 659 896 ; +C 222 ; WX 667 ; N Thorn ; B 77 0 624 716 ; +C 223 ; WX 611 ; N germandbls ; B 75 -12 580 728 ; +C 224 ; WX 556 ; N agrave ; B 36 -12 514 720 ; +C 225 ; WX 556 ; N aacute ; B 36 -12 514 720 ; +C 226 ; WX 556 ; N acircumflex ; B 36 -12 514 720 ; +C 227 ; WX 556 ; N atilde ; B 36 -12 514 708 ; +C 228 ; WX 556 ; N adieresis ; B 36 -12 514 720 ; +C 229 ; WX 556 ; N aring ; B 36 -12 514 741 ; +C 230 ; WX 889 ; N ae ; B 33 -12 849 530 ; +C 231 ; WX 500 ; N ccedilla ; B 39 -196 491 530 ; +C 232 ; WX 556 ; N egrave ; B 37 -12 515 720 ; +C 233 ; WX 556 ; N eacute ; B 37 -12 515 720 ; +C 234 ; WX 556 ; N ecircumflex ; B 37 -12 515 720 ; +C 235 ; WX 556 ; N edieresis ; B 37 -12 515 720 ; +C 236 ; WX 278 ; N igrave ; B 17 0 201 720 ; +C 237 ; WX 278 ; N iacute ; B 92 0 272 720 ; +C 238 ; WX 278 ; N icircumflex ; B -8 0 301 720 ; +C 239 ; WX 278 ; N idieresis ; B 4 0 278 720 ; +C 240 ; WX 556 ; N eth ; B 36 -12 516 716 ; +C 241 ; WX 556 ; N ntilde ; B 66 0 487 708 ; +C 242 ; WX 556 ; N ograve ; B 33 -12 519 720 ; +C 243 ; WX 556 ; N oacute ; B 33 -12 519 720 ; +C 244 ; WX 556 ; N ocircumflex ; B 33 -12 519 720 ; +C 245 ; WX 556 ; N otilde ; B 33 -12 519 708 ; +C 246 ; WX 556 ; N odieresis ; B 33 -12 519 720 ; +C 247 ; WX 549 ; N divide ; B 38 156 511 550 ; +C 248 ; WX 611 ; N oslash ; B 63 -39 549 550 ; +C 249 ; WX 556 ; N ugrave ; B 64 -12 484 720 ; +C 250 ; WX 556 ; N uacute ; B 64 -12 484 720 ; +C 251 ; WX 556 ; N ucircumflex ; B 64 -12 484 720 ; +C 252 ; WX 556 ; N udieresis ; B 64 -12 484 720 ; +C 253 ; WX 500 ; N yacute ; B 16 -210 491 720 ; +C 254 ; WX 556 ; N thorn ; B 66 -199 516 716 ; +C 255 ; WX 500 ; N ydieresis ; B 16 -210 491 720 ; +C -1 ; WX 0 ; N .null ; B 86 0 195 716 ; +C -1 ; WX 278 ; N nonmarkingreturn ; B 86 0 195 716 ; +C -1 ; WX 549 ; N notequal ; B 38 -14 511 720 ; +C -1 ; WX 713 ; N infinity ; B 75 189 640 510 ; +C -1 ; WX 549 ; N lessequal ; B 38 52 512 654 ; +C -1 ; WX 549 ; N greaterequal ; B 38 52 512 654 ; +C -1 ; WX 494 ; N partialdiff ; B 27 -12 475 728 ; +C -1 ; WX 713 ; N summation ; B 60 -210 677 728 ; +C -1 ; WX 823 ; N product ; B 79 -210 744 728 ; +C -1 ; WX 549 ; N pi1 ; B 0 0 549 519 ; +C -1 ; WX 274 ; N integral ; B 0 -107 273 910 ; +C -1 ; WX 768 ; N Ohm ; B 62 0 720 734 ; +C -1 ; WX 549 ; N radical ; B 41 -38 549 913 ; +C -1 ; WX 549 ; N approxequal ; B 25 184 524 521 ; +C -1 ; WX 612 ; N increment ; B 13 0 599 677 ; +C -1 ; WX 494 ; N lozenge ; B 23 0 472 694 ; +C -1 ; WX 167 ; N fraction ; B -222 -28 392 728 ; +C -1 ; WX 500 ; N fi ; B 11 0 432 728 ; +C -1 ; WX 500 ; N fl ; B 11 0 431 728 ; +C -1 ; WX 278 ; N dotlessi ; B 97 0 185 519 ; +C -1 ; WX 333 ; N macron ; B 14 599 319 671 ; +C -1 ; WX 333 ; N breve ; B 22 588 311 715 ; +C -1 ; WX 333 ; N dotaccent ; B 112 583 221 692 ; +C -1 ; WX 333 ; N ring ; B 79 562 255 741 ; +C -1 ; WX 333 ; N hungarumlaut ; B 28 583 373 720 ; +C -1 ; WX 333 ; N ogonek ; B 89 -208 303 12 ; +C -1 ; WX 333 ; N caron ; B 20 583 329 720 ; +C -1 ; WX 556 ; N Lslash ; B 0 0 521 716 ; +C -1 ; WX 222 ; N lslash ; B 1 0 218 716 ; +C -1 ; WX 584 ; N minus ; B 56 312 528 394 ; +C -1 ; WX 556 ; N franc ; B 0 0 506 716 ; +C -1 ; WX 778 ; N Gbreve ; B 53 -12 715 886 ; +C -1 ; WX 556 ; N gbreve ; B 32 -210 489 715 ; +C -1 ; WX 278 ; N Idot ; B 86 0 195 869 ; +C -1 ; WX 667 ; N Scedilla ; B 45 -201 615 728 ; +C -1 ; WX 500 ; N scedilla ; B 31 -196 461 530 ; +C -1 ; WX 722 ; N Cacute ; B 50 -12 683 896 ; +C -1 ; WX 500 ; N cacute ; B 39 -12 491 720 ; +C -1 ; WX 722 ; N Ccaron ; B 50 -12 683 894 ; +C -1 ; WX 500 ; N ccaron ; B 39 -12 491 720 ; +C -1 ; WX 556 ; N dmacron ; B 34 -12 555 716 ; +C -1 ; WX 333 ; N middot ; B 243 311 343 411 ; +C -1 ; WX 667 ; N Abreve ; B -1 0 668 886 ; +C -1 ; WX 556 ; N abreve ; B 36 -12 514 715 ; +C -1 ; WX 667 ; N Aogonek ; B -1 -203 756 716 ; +C -1 ; WX 556 ; N aogonek ; B 36 -196 619 530 ; +C -1 ; WX 722 ; N Dcaron ; B 77 0 669 894 ; +C -1 ; WX 615 ; N dcaron ; B 35 -12 616 716 ; +C -1 ; WX 722 ; N Dslash ; B -1 0 669 716 ; +C -1 ; WX 667 ; N Eogonek ; B 79 -208 613 716 ; +C -1 ; WX 556 ; N eogonek ; B 37 -208 515 530 ; +C -1 ; WX 667 ; N Ecaron ; B 79 0 613 894 ; +C -1 ; WX 556 ; N ecaron ; B 37 -12 515 720 ; +C -1 ; WX 556 ; N Lacute ; B 73 0 521 896 ; +C -1 ; WX 222 ; N lacute ; B 32 0 212 889 ; +C -1 ; WX 556 ; N Lcaron ; B 73 0 521 716 ; +C -1 ; WX 292 ; N lcaron ; B 66 0 291 716 ; +C -1 ; WX 556 ; N Ldot ; B 73 0 521 716 ; +C -1 ; WX 334 ; N ldot ; B 64 0 330 716 ; +C -1 ; WX 722 ; N Nacute ; B 76 0 640 896 ; +C -1 ; WX 556 ; N nacute ; B 66 0 487 720 ; +C -1 ; WX 722 ; N Ncaron ; B 76 0 640 896 ; +C -1 ; WX 556 ; N ncaron ; B 66 0 487 720 ; +C -1 ; WX 778 ; N Odblacute ; B 48 -12 733 896 ; +C -1 ; WX 556 ; N odblacute ; B 33 -12 519 720 ; +C -1 ; WX 722 ; N Racute ; B 79 0 709 896 ; +C -1 ; WX 333 ; N racute ; B 65 0 347 720 ; +C -1 ; WX 722 ; N Rcaron ; B 79 0 709 894 ; +C -1 ; WX 333 ; N rcaron ; B 29 0 347 720 ; +C -1 ; WX 667 ; N Sacute ; B 45 -12 615 896 ; +C -1 ; WX 500 ; N sacute ; B 31 -12 461 720 ; +C -1 ; WX 611 ; N Tcedilla ; B 23 -283 591 716 ; +C -1 ; WX 278 ; N tcedilla ; B 18 -260 271 700 ; +C -1 ; WX 611 ; N Tcaron ; B 23 0 591 894 ; +C -1 ; WX 375 ; N tcaron ; B 17 -7 374 716 ; +C -1 ; WX 722 ; N Uring ; B 79 -12 642 896 ; +C -1 ; WX 556 ; N uring ; B 64 -12 484 741 ; +C -1 ; WX 722 ; N Udblacute ; B 79 -12 642 896 ; +C -1 ; WX 556 ; N udblacute ; B 64 -12 484 720 ; +C -1 ; WX 611 ; N Zacute ; B 20 0 586 896 ; +C -1 ; WX 500 ; N zacute ; B 20 0 479 720 ; +C -1 ; WX 611 ; N Zdot ; B 20 0 586 869 ; +C -1 ; WX 500 ; N zdot ; B 20 0 479 692 ; +C -1 ; WX 551 ; N Gamma ; B 80 0 527 716 ; +C -1 ; WX 778 ; N Theta ; B 47 -12 731 729 ; +C -1 ; WX 798 ; N Phi ; B 42 -26 756 737 ; +C -1 ; WX 578 ; N alpha ; B 35 -12 541 530 ; +C -1 ; WX 557 ; N delta ; B 35 -12 521 716 ; +C -1 ; WX 446 ; N epsilon ; B 48 -12 423 530 ; +C -1 ; WX 617 ; N sigma ; B 33 -12 595 530 ; +C -1 ; WX 395 ; N tau ; B 22 0 372 519 ; +C -1 ; WX 648 ; N phi ; B 35 -199 614 531 ; +C -1 ; WX 552 ; N underscoredbl ; B -15 -325 567 -135 ; +C -1 ; WX 500 ; N exclamdbl ; B 86 0 414 716 ; +C -1 ; WX 365 ; N nsuperior ; B 40 253 326 585 ; +C -1 ; WX 1094 ; N peseta ; B 25 -13 1072 716 ; +C -1 ; WX 1000 ; N arrowleft ; B 39 77 961 428 ; +C -1 ; WX 500 ; N arrowup ; B 75 -209 426 654 ; +C -1 ; WX 1000 ; N arrowright ; B 39 77 961 428 ; +C -1 ; WX 500 ; N arrowdown ; B 75 -209 426 654 ; +C -1 ; WX 1000 ; N arrowboth ; B 39 77 961 429 ; +C -1 ; WX 500 ; N arrowupdn ; B 74 -208 425 714 ; +C -1 ; WX 500 ; N arrowupdnbse ; B 74 -303 425 714 ; +C -1 ; WX 979 ; N orthogonal ; B 177 0 802 625 ; +C -1 ; WX 719 ; N intersection ; B 77 0 642 729 ; +C -1 ; WX 583 ; N equivalence ; B 56 95 528 611 ; +C -1 ; WX 604 ; N house ; B 77 0 527 563 ; +C -1 ; WX 584 ; N revlogicalnot ; B 55 207 528 503 ; +C -1 ; WX 604 ; N integraltp ; B 267 -251 477 848 ; +C -1 ; WX 604 ; N integralbt ; B 127 -251 337 848 ; +C -1 ; WX 708 ; N SF100000 ; B -11 261 719 346 ; +C -1 ; WX 625 ; N SF110000 ; B 223 -303 309 910 ; +C -1 ; WX 708 ; N SF010000 ; B 312 -303 720 346 ; +C -1 ; WX 708 ; N SF030000 ; B -11 -303 396 346 ; +C -1 ; WX 708 ; N SF020000 ; B 312 261 720 910 ; +C -1 ; WX 708 ; N SF040000 ; B -11 261 396 910 ; +C -1 ; WX 708 ; N SF080000 ; B 312 -303 720 910 ; +C -1 ; WX 708 ; N SF090000 ; B -11 -303 396 910 ; +C -1 ; WX 708 ; N SF060000 ; B -11 -303 719 346 ; +C -1 ; WX 708 ; N SF070000 ; B -11 261 719 910 ; +C -1 ; WX 708 ; N SF050000 ; B -11 -303 719 910 ; +C -1 ; WX 708 ; N SF430000 ; B -11 168 719 439 ; +C -1 ; WX 708 ; N SF240000 ; B 219 -303 490 910 ; +C -1 ; WX 708 ; N SF510000 ; B 312 -303 720 439 ; +C -1 ; WX 708 ; N SF520000 ; B 219 -303 720 346 ; +C -1 ; WX 708 ; N SF390000 ; B 219 -303 719 439 ; +C -1 ; WX 708 ; N SF220000 ; B -11 -303 396 439 ; +C -1 ; WX 708 ; N SF210000 ; B -11 -303 489 346 ; +C -1 ; WX 708 ; N SF250000 ; B -11 -303 489 439 ; +C -1 ; WX 708 ; N SF500000 ; B 312 168 720 910 ; +C -1 ; WX 708 ; N SF490000 ; B 219 261 720 910 ; +C -1 ; WX 708 ; N SF380000 ; B 219 168 719 910 ; +C -1 ; WX 708 ; N SF280000 ; B -11 168 396 910 ; +C -1 ; WX 708 ; N SF270000 ; B -11 261 489 910 ; +C -1 ; WX 708 ; N SF260000 ; B -11 168 489 910 ; +C -1 ; WX 708 ; N SF360000 ; B 312 -303 720 910 ; +C -1 ; WX 708 ; N SF370000 ; B 219 -303 720 910 ; +C -1 ; WX 708 ; N SF420000 ; B 219 -303 720 910 ; +C -1 ; WX 708 ; N SF190000 ; B -11 -303 396 910 ; +C -1 ; WX 708 ; N SF200000 ; B -11 -303 489 910 ; +C -1 ; WX 708 ; N SF230000 ; B -11 -303 489 910 ; +C -1 ; WX 708 ; N SF470000 ; B -11 -303 719 439 ; +C -1 ; WX 708 ; N SF480000 ; B -11 -303 719 346 ; +C -1 ; WX 708 ; N SF410000 ; B -11 -303 719 439 ; +C -1 ; WX 708 ; N SF450000 ; B -11 168 719 910 ; +C -1 ; WX 708 ; N SF460000 ; B -11 261 719 910 ; +C -1 ; WX 708 ; N SF400000 ; B -11 168 719 910 ; +C -1 ; WX 708 ; N SF540000 ; B -11 -303 719 910 ; +C -1 ; WX 708 ; N SF530000 ; B -11 -303 719 910 ; +C -1 ; WX 708 ; N SF440000 ; B -11 -303 719 910 ; +C -1 ; WX 708 ; N upblock ; B -11 303 719 910 ; +C -1 ; WX 708 ; N dnblock ; B -11 -303 719 303 ; +C -1 ; WX 708 ; N block ; B -11 -303 719 910 ; +C -1 ; WX 708 ; N lfblock ; B -11 -303 354 910 ; +C -1 ; WX 708 ; N rtblock ; B 354 -303 720 910 ; +C -1 ; WX 708 ; N ltshade ; B 50 -246 719 910 ; +C -1 ; WX 708 ; N shade ; B -11 -246 719 910 ; +C -1 ; WX 729 ; N dkshade ; B 0 -307 729 910 ; +C -1 ; WX 604 ; N filledbox ; B 71 0 532 461 ; +C -1 ; WX 1000 ; N filledrect ; B 0 155 1000 343 ; +C -1 ; WX 990 ; N triagup ; B 148 0 842 693 ; +C -1 ; WX 990 ; N triagrt ; B 141 -15 849 692 ; +C -1 ; WX 990 ; N triagdn ; B 148 -15 842 678 ; +C -1 ; WX 990 ; N triaglf ; B 141 -15 849 692 ; +C -1 ; WX 604 ; N circle ; B 87 67 517 497 ; +C -1 ; WX 604 ; N invbullet ; B 63 0 541 479 ; +C -1 ; WX 604 ; N invcircle ; B 21 0 584 564 ; +C -1 ; WX 1021 ; N smileface ; B 199 -58 822 564 ; +C -1 ; WX 1052 ; N invsmileface ; B 215 -58 837 564 ; +C -1 ; WX 917 ; N sun ; B 8 -109 909 792 ; +C -1 ; WX 750 ; N female ; B 119 -214 630 736 ; +C -1 ; WX 750 ; N male ; B 54 -128 691 791 ; +C -1 ; WX 531 ; N spade ; B 28 0 503 601 ; +C -1 ; WX 656 ; N club ; B 27 0 629 601 ; +C -1 ; WX 594 ; N heart ; B 31 -12 563 601 ; +C -1 ; WX 510 ; N diamond ; B 31 -12 479 601 ; +C -1 ; WX 500 ; N musicalnote ; B 18 -18 482 666 ; +C -1 ; WX 750 ; N musicalnotedbl ; B 42 -63 649 742 ; +C -1 ; WX 735 ; N IJ ; B 93 -12 684 716 ; +C -1 ; WX 444 ; N ij ; B 66 -210 387 716 ; +C -1 ; WX 604 ; N napostrophe ; B 53 0 604 723 ; +C -1 ; WX 188 ; N minute ; B 63 462 194 716 ; +C -1 ; WX 354 ; N second ; B 63 462 333 716 ; +C -1 ; WX 885 ; N afii61248 ; B 47 -26 838 728 ; +C -1 ; WX 323 ; N afii61289 ; B 7 -12 315 728 ; +C -1 ; WX 604 ; N H22073 ; B 71 0 532 461 ; +C -1 ; WX 354 ; N H18543 ; B 64 217 290 443 ; +C -1 ; WX 354 ; N H18551 ; B 64 217 290 443 ; +C -1 ; WX 604 ; N H18533 ; B 87 67 517 497 ; +C -1 ; WX 354 ; N openbullet ; B 55 208 300 453 ; +C -1 ; WX 667 ; N Amacron ; B -1 0 668 843 ; +C -1 ; WX 556 ; N amacron ; B 36 -12 514 671 ; +C -1 ; WX 722 ; N Ccircumflex ; B 50 -12 683 894 ; +C -1 ; WX 500 ; N ccircumflex ; B 39 -12 491 720 ; +C -1 ; WX 722 ; N Cdot ; B 50 -12 683 888 ; +C -1 ; WX 500 ; N cdot ; B 39 -12 491 692 ; +C -1 ; WX 667 ; N Emacron ; B 79 0 613 848 ; +C -1 ; WX 556 ; N emacron ; B 37 -12 515 671 ; +C -1 ; WX 667 ; N Ebreve ; B 79 0 613 892 ; +C -1 ; WX 556 ; N ebreve ; B 37 -12 515 715 ; +C -1 ; WX 667 ; N Edot ; B 79 0 613 869 ; +C -1 ; WX 556 ; N edot ; B 37 -12 515 692 ; +C -1 ; WX 778 ; N Gcircumflex ; B 53 -12 715 891 ; +C -1 ; WX 556 ; N gcircumflex ; B 32 -210 489 720 ; +C -1 ; WX 778 ; N Gdot ; B 53 -12 715 864 ; +C -1 ; WX 556 ; N gdot ; B 32 -210 489 692 ; +C -1 ; WX 778 ; N Gcedilla ; B 53 -206 715 728 ; +C -1 ; WX 556 ; N gcedilla ; B 32 -210 489 770 ; +C -1 ; WX 722 ; N Hcircumflex ; B 80 0 642 896 ; +C -1 ; WX 556 ; N hcircumflex ; B 66 0 488 896 ; +C -1 ; WX 722 ; N Hbar ; B 15 0 707 716 ; +C -1 ; WX 556 ; N hbar ; B 3 0 488 716 ; +C -1 ; WX 278 ; N Itilde ; B -31 0 296 885 ; +C -1 ; WX 278 ; N itilde ; B -22 0 305 708 ; +C -1 ; WX 278 ; N Imacron ; B -14 0 291 835 ; +C -1 ; WX 278 ; N imacron ; B -11 0 293 671 ; +C -1 ; WX 278 ; N Ibreve ; B 0 0 288 879 ; +C -1 ; WX 278 ; N ibreve ; B -3 0 286 715 ; +C -1 ; WX 278 ; N Iogonek ; B 80 -208 293 716 ; +C -1 ; WX 222 ; N iogonek ; B 50 -208 264 716 ; +C -1 ; WX 500 ; N Jcircumflex ; B 27 -12 541 896 ; +C -1 ; WX 222 ; N jcircumflex ; B -46 -210 266 720 ; +C -1 ; WX 667 ; N Kcedilla ; B 73 -206 665 716 ; +C -1 ; WX 500 ; N kcedilla ; B 66 -206 496 716 ; +C -1 ; WX 500 ; N kgreenlandic ; B 65 0 495 519 ; +C -1 ; WX 556 ; N Lcedilla ; B 73 -206 521 716 ; +C -1 ; WX 222 ; N lcedilla ; B -1 -206 210 716 ; +C -1 ; WX 722 ; N Ncedilla ; B 76 -206 640 716 ; +C -1 ; WX 556 ; N ncedilla ; B 66 -206 487 530 ; +C -1 ; WX 723 ; N Eng ; B 81 -12 670 728 ; +C -1 ; WX 556 ; N eng ; B 68 -210 489 530 ; +C -1 ; WX 778 ; N Omacron ; B 48 -12 733 853 ; +C -1 ; WX 556 ; N omacron ; B 33 -12 519 671 ; +C -1 ; WX 778 ; N Obreve ; B 48 -12 733 892 ; +C -1 ; WX 556 ; N obreve ; B 33 -12 519 715 ; +C -1 ; WX 722 ; N Rcedilla ; B 79 -206 709 716 ; +C -1 ; WX 333 ; N rcedilla ; B 65 -206 347 530 ; +C -1 ; WX 667 ; N Scircumflex ; B 45 -12 615 894 ; +C -1 ; WX 500 ; N scircumflex ; B 31 -12 461 720 ; +C -1 ; WX 611 ; N Tbar ; B 23 0 591 716 ; +C -1 ; WX 278 ; N tbar ; B 6 -7 259 700 ; +C -1 ; WX 722 ; N Utilde ; B 79 -12 642 882 ; +C -1 ; WX 556 ; N utilde ; B 64 -12 484 708 ; +C -1 ; WX 722 ; N Umacron ; B 79 -12 642 845 ; +C -1 ; WX 556 ; N umacron ; B 64 -12 484 671 ; +C -1 ; WX 722 ; N Ubreve ; B 79 -12 642 889 ; +C -1 ; WX 556 ; N ubreve ; B 64 -12 484 715 ; +C -1 ; WX 722 ; N Uogonek ; B 79 -208 642 716 ; +C -1 ; WX 556 ; N uogonek ; B 64 -208 603 519 ; +C -1 ; WX 944 ; N Wcircumflex ; B 12 0 933 896 ; +C -1 ; WX 722 ; N wcircumflex ; B 3 0 714 720 ; +C -1 ; WX 667 ; N Ycircumflex ; B 3 0 659 896 ; +C -1 ; WX 500 ; N ycircumflex ; B 16 -210 491 720 ; +C -1 ; WX 222 ; N longs ; B 67 0 292 728 ; +C -1 ; WX 667 ; N Aringacute ; B -1 0 668 1006 ; +C -1 ; WX 556 ; N aringacute ; B 36 -12 514 939 ; +C -1 ; WX 1000 ; N AEacute ; B 0 0 945 896 ; +C -1 ; WX 889 ; N aeacute ; B 33 -12 849 720 ; +C -1 ; WX 778 ; N Oslashacute ; B 41 -29 741 896 ; +C -1 ; WX 611 ; N oslashacute ; B 63 -39 549 720 ; +C -1 ; WX 278 ; N anoteleia ; B 90 418 190 519 ; +C -1 ; WX 944 ; N Wgrave ; B 12 0 933 896 ; +C -1 ; WX 722 ; N wgrave ; B 3 0 714 720 ; +C -1 ; WX 944 ; N Wacute ; B 12 0 933 896 ; +C -1 ; WX 722 ; N wacute ; B 3 0 714 720 ; +C -1 ; WX 944 ; N Wdieresis ; B 12 0 933 860 ; +C -1 ; WX 722 ; N wdieresis ; B 3 0 714 720 ; +C -1 ; WX 667 ; N Ygrave ; B 3 0 659 896 ; +C -1 ; WX 500 ; N ygrave ; B 16 -210 491 720 ; +C -1 ; WX 222 ; N quotereversed ; B 67 489 169 723 ; +C -1 ; WX 333 ; N radicalex ; B -15 599 349 671 ; +C -1 ; WX 556 ; N afii08941 ; B 13 -14 528 728 ; +C -1 ; WX 600 ; N estimated ; B 44 -17 561 535 ; +C -1 ; WX 834 ; N oneeighth ; B 52 -28 813 728 ; +C -1 ; WX 834 ; N threeeighths ; B 17 -28 813 728 ; +C -1 ; WX 834 ; N fiveeighths ; B 17 -28 813 728 ; +C -1 ; WX 834 ; N seveneighths ; B 36 -28 813 728 ; +C -1 ; WX 333 ; N commaaccent ; B 110 -269 219 -71 ; +C -1 ; WX 333 ; N undercommaaccent ; B 52 -206 264 -22 ; +C -1 ; WX 333 ; N tonos ; B 108 583 289 720 ; +C -1 ; WX 333 ; N dieresistonos ; B -11 601 344 736 ; +C -1 ; WX 667 ; N Alphatonos ; B 0 0 669 716 ; +C -1 ; WX 784 ; N Epsilontonos ; B -43 0 730 716 ; +C -1 ; WX 838 ; N Etatonos ; B -43 0 737 716 ; +C -1 ; WX 384 ; N Iotatonos ; B -43 0 271 716 ; +C -1 ; WX 774 ; N Omicrontonos ; B -43 -12 728 729 ; +C -1 ; WX 855 ; N Upsilontonos ; B -43 0 842 716 ; +C -1 ; WX 752 ; N Omegatonos ; B -43 0 706 728 ; +C -1 ; WX 222 ; N iotadieresistonos ; B -66 0 289 736 ; +C -1 ; WX 667 ; N Alpha ; B -1 0 668 716 ; +C -1 ; WX 667 ; N Beta ; B 73 0 614 716 ; +C -1 ; WX 668 ; N Delta ; B -1 0 669 716 ; +C -1 ; WX 667 ; N Epsilon ; B 79 0 613 716 ; +C -1 ; WX 611 ; N Zeta ; B 20 0 586 716 ; +C -1 ; WX 722 ; N Eta ; B 80 0 642 716 ; +C -1 ; WX 278 ; N Iota ; B 93 0 188 716 ; +C -1 ; WX 667 ; N Kappa ; B 73 0 665 716 ; +C -1 ; WX 668 ; N Lambda ; B 5 0 660 716 ; +C -1 ; WX 833 ; N Mu ; B 74 0 757 716 ; +C -1 ; WX 722 ; N Nu ; B 76 0 640 716 ; +C -1 ; WX 650 ; N Xi ; B 53 0 597 716 ; +C -1 ; WX 778 ; N Omicron ; B 48 -12 733 729 ; +C -1 ; WX 722 ; N Pi ; B 80 0 642 716 ; +C -1 ; WX 667 ; N Rho ; B 77 0 624 716 ; +C -1 ; WX 618 ; N Sigma ; B 72 0 579 716 ; +C -1 ; WX 611 ; N Tau ; B 23 0 591 716 ; +C -1 ; WX 667 ; N Upsilon ; B 3 0 659 716 ; +C -1 ; WX 667 ; N Chi ; B 4 0 661 716 ; +C -1 ; WX 835 ; N Psi ; B 62 0 773 716 ; +C -1 ; WX 748 ; N Omega ; B 47 0 701 728 ; +C -1 ; WX 278 ; N Iotadieresis ; B 2 0 276 860 ; +C -1 ; WX 667 ; N Upsilondieresis ; B 3 0 659 860 ; +C -1 ; WX 578 ; N alphatonos ; B 35 -12 541 720 ; +C -1 ; WX 446 ; N epsilontonos ; B 48 -12 423 720 ; +C -1 ; WX 556 ; N etatonos ; B 68 -199 489 720 ; +C -1 ; WX 222 ; N iotatonos ; B 48 0 229 720 ; +C -1 ; WX 547 ; N upsilondieresistonos ; B 66 -12 481 736 ; +C -1 ; WX 575 ; N beta ; B 68 -199 530 728 ; +C -1 ; WX 500 ; N gamma ; B 12 -199 488 519 ; +C -1 ; WX 441 ; N zeta ; B 35 -210 433 716 ; +C -1 ; WX 556 ; N eta ; B 68 -199 489 530 ; +C -1 ; WX 556 ; N theta ; B 45 -12 512 728 ; +C -1 ; WX 222 ; N iota ; B 67 0 155 519 ; +C -1 ; WX 500 ; N kappa ; B 65 0 500 519 ; +C -1 ; WX 500 ; N lambda ; B 12 0 487 716 ; +C -1 ; WX 576 ; N mu ; B 78 -199 497 519 ; +C -1 ; WX 500 ; N nu ; B 13 0 488 519 ; +C -1 ; WX 448 ; N xi ; B 45 -210 430 728 ; +C -1 ; WX 556 ; N omicron ; B 33 -12 519 530 ; +C -1 ; WX 569 ; N rho ; B 64 -199 534 530 ; +C -1 ; WX 482 ; N sigma1 ; B 42 -210 472 530 ; +C -1 ; WX 547 ; N upsilon ; B 66 -12 481 519 ; +C -1 ; WX 525 ; N chi ; B 8 -199 516 519 ; +C -1 ; WX 713 ; N psi ; B 60 -199 653 519 ; +C -1 ; WX 781 ; N omega ; B 42 -12 738 519 ; +C -1 ; WX 222 ; N iotadieresis ; B -23 0 251 720 ; +C -1 ; WX 547 ; N upsilondieresis ; B 66 -12 481 720 ; +C -1 ; WX 556 ; N omicrontonos ; B 33 -12 519 720 ; +C -1 ; WX 547 ; N upsilontonos ; B 66 -12 481 720 ; +C -1 ; WX 781 ; N omegatonos ; B 42 -12 738 720 ; +C -1 ; WX 667 ; N afii10023 ; B 79 0 613 860 ; +C -1 ; WX 865 ; N afii10051 ; B 24 -12 825 716 ; +C -1 ; WX 719 ; N afii10053 ; B 49 -12 683 728 ; +C -1 ; WX 667 ; N afii10054 ; B 45 -12 615 728 ; +C -1 ; WX 278 ; N afii10055 ; B 93 0 188 716 ; +C -1 ; WX 278 ; N afii10056 ; B 2 0 276 860 ; +C -1 ; WX 500 ; N afii10057 ; B 27 -12 422 716 ; +C -1 ; WX 1057 ; N afii10058 ; B 6 -12 1020 716 ; +C -1 ; WX 1010 ; N afii10059 ; B 80 0 973 716 ; +C -1 ; WX 854 ; N afii10060 ; B 24 0 809 716 ; +C -1 ; WX 635 ; N afii10062 ; B 5 -10 632 886 ; +C -1 ; WX 667 ; N afii10017 ; B -1 0 668 716 ; +C -1 ; WX 656 ; N afii10018 ; B 82 0 621 716 ; +C -1 ; WX 667 ; N afii10019 ; B 73 0 614 716 ; +C -1 ; WX 542 ; N afii10020 ; B 79 0 542 716 ; +C -1 ; WX 677 ; N afii10021 ; B 0 -167 642 716 ; +C -1 ; WX 667 ; N afii10022 ; B 79 0 613 716 ; +C -1 ; WX 923 ; N afii10024 ; B 3 0 919 716 ; +C -1 ; WX 604 ; N afii10025 ; B 38 -12 563 728 ; +C -1 ; WX 719 ; N afii10026 ; B 79 0 641 716 ; +C -1 ; WX 719 ; N afii10027 ; B 79 0 641 886 ; +C -1 ; WX 583 ; N afii10028 ; B 79 0 579 716 ; +C -1 ; WX 656 ; N afii10029 ; B 9 -12 578 716 ; +C -1 ; WX 833 ; N afii10030 ; B 74 0 757 716 ; +C -1 ; WX 722 ; N afii10031 ; B 80 0 642 716 ; +C -1 ; WX 778 ; N afii10032 ; B 48 -12 733 729 ; +C -1 ; WX 719 ; N afii10033 ; B 78 0 641 716 ; +C -1 ; WX 667 ; N afii10034 ; B 77 0 624 716 ; +C -1 ; WX 722 ; N afii10035 ; B 50 -12 683 728 ; +C -1 ; WX 611 ; N afii10036 ; B 23 0 591 716 ; +C -1 ; WX 635 ; N afii10037 ; B 5 -10 632 716 ; +C -1 ; WX 760 ; N afii10038 ; B 40 0 720 722 ; +C -1 ; WX 667 ; N afii10039 ; B 4 0 661 716 ; +C -1 ; WX 740 ; N afii10040 ; B 78 -199 706 716 ; +C -1 ; WX 667 ; N afii10041 ; B 42 0 588 716 ; +C -1 ; WX 917 ; N afii10042 ; B 79 0 838 716 ; +C -1 ; WX 938 ; N afii10043 ; B 79 -199 903 716 ; +C -1 ; WX 792 ; N afii10044 ; B 0 0 757 716 ; +C -1 ; WX 885 ; N afii10045 ; B 82 0 802 716 ; +C -1 ; WX 656 ; N afii10046 ; B 81 0 620 716 ; +C -1 ; WX 719 ; N afii10047 ; B 36 -12 670 728 ; +C -1 ; WX 1010 ; N afii10048 ; B 80 -12 959 728 ; +C -1 ; WX 722 ; N afii10049 ; B 13 0 644 716 ; +C -1 ; WX 556 ; N afii10065 ; B 36 -12 514 530 ; +C -1 ; WX 573 ; N afii10066 ; B 44 -12 533 733 ; +C -1 ; WX 531 ; N afii10067 ; B 66 0 492 519 ; +C -1 ; WX 365 ; N afii10068 ; B 66 0 365 519 ; +C -1 ; WX 583 ; N afii10069 ; B 0 -147 553 519 ; +C -1 ; WX 556 ; N afii10070 ; B 37 -12 515 530 ; +C -1 ; WX 669 ; N afii10072 ; B -2 0 672 519 ; +C -1 ; WX 458 ; N afii10073 ; B 24 -12 423 530 ; +C -1 ; WX 559 ; N afii10074 ; B 66 0 492 519 ; +C -1 ; WX 559 ; N afii10075 ; B 66 0 492 715 ; +C -1 ; WX 438 ; N afii10076 ; B 65 0 445 519 ; +C -1 ; WX 583 ; N afii10077 ; B 12 -3 517 519 ; +C -1 ; WX 688 ; N afii10078 ; B 68 0 619 519 ; +C -1 ; WX 552 ; N afii10079 ; B 66 0 486 519 ; +C -1 ; WX 556 ; N afii10080 ; B 33 -12 519 530 ; +C -1 ; WX 542 ; N afii10081 ; B 66 0 476 519 ; +C -1 ; WX 556 ; N afii10082 ; B 66 -199 516 530 ; +C -1 ; WX 500 ; N afii10083 ; B 39 -12 491 530 ; +C -1 ; WX 458 ; N afii10084 ; B 19 0 440 519 ; +C -1 ; WX 500 ; N afii10085 ; B 16 -210 491 519 ; +C -1 ; WX 823 ; N afii10086 ; B 37 -199 786 716 ; +C -1 ; WX 500 ; N afii10087 ; B 7 0 493 519 ; +C -1 ; WX 573 ; N afii10088 ; B 67 -147 543 519 ; +C -1 ; WX 521 ; N afii10089 ; B 34 0 455 519 ; +C -1 ; WX 802 ; N afii10090 ; B 69 0 733 519 ; +C -1 ; WX 823 ; N afii10091 ; B 69 -147 791 519 ; +C -1 ; WX 625 ; N afii10092 ; B 20 0 589 519 ; +C -1 ; WX 719 ; N afii10093 ; B 68 0 647 519 ; +C -1 ; WX 521 ; N afii10094 ; B 64 0 490 519 ; +C -1 ; WX 510 ; N afii10095 ; B 21 -18 474 530 ; +C -1 ; WX 750 ; N afii10096 ; B 67 -12 709 530 ; +C -1 ; WX 542 ; N afii10097 ; B 15 0 474 519 ; +C -1 ; WX 556 ; N afii10071 ; B 37 -12 515 720 ; +C -1 ; WX 556 ; N afii10099 ; B 0 -210 488 716 ; +C -1 ; WX 365 ; N afii10100 ; B 66 0 365 720 ; +C -1 ; WX 510 ; N afii10101 ; B 37 -18 489 530 ; +C -1 ; WX 500 ; N afii10102 ; B 31 -12 461 530 ; +C -1 ; WX 222 ; N afii10103 ; B 66 0 154 716 ; +C -1 ; WX 278 ; N afii10104 ; B 4 0 278 720 ; +C -1 ; WX 222 ; N afii10105 ; B -46 -210 153 716 ; +C -1 ; WX 906 ; N afii10106 ; B 9 -3 871 519 ; +C -1 ; WX 813 ; N afii10107 ; B 64 0 778 519 ; +C -1 ; WX 556 ; N afii10108 ; B 0 0 488 716 ; +C -1 ; WX 500 ; N afii10110 ; B 16 -210 491 715 ; +C -1 ; WX 552 ; N afii10193 ; B 66 -147 486 519 ; +C -1 ; WX 489 ; N afii10050 ; B 79 0 459 914 ; +C -1 ; WX 411 ; N afii10098 ; B 66 0 381 717 ; +C -1 ; WX 1000 ; N afii00208 ; B 32 224 969 294 ; +C -1 ; WX 1073 ; N afii61352 ; B 78 0 1031 716 ; +C -1 ; WX 690 ; N pi ; B 22 0 668 519 ; +C -1 ; WX 333 ; N sheva ; B 125 -210 208 -24 ; +C -1 ; WX 333 ; N hatafsegol ; B 15 -210 318 -24 ; +C -1 ; WX 333 ; N hatafpatah ; B 24 -210 309 -24 ; +C -1 ; WX 333 ; N hatafqamats ; B 24 -210 309 -24 ; +C -1 ; WX 333 ; N hiriq ; B 125 -180 208 -98 ; +C -1 ; WX 333 ; N tsere ; B 62 -180 271 -98 ; +C -1 ; WX 333 ; N segol ; B 62 -210 271 -24 ; +C -1 ; WX 333 ; N patah ; B 68 -154 265 -103 ; +C -1 ; WX 333 ; N qamats ; B 68 -210 265 -77 ; +C -1 ; WX 333 ; N holam ; B 125 577 208 659 ; +C -1 ; WX 333 ; N qubuts ; B 8 -210 325 -25 ; +C -1 ; WX 333 ; N dagesh ; B 125 241 208 323 ; +C -1 ; WX 333 ; N meteg ; B 141 -210 192 -25 ; +C -1 ; WX 383 ; N maqaf ; B 61 440 322 518 ; +C -1 ; WX 333 ; N rafe ; B 68 611 265 662 ; +C -1 ; WX 275 ; N paseq ; B 103 -10 172 625 ; +C -1 ; WX 333 ; N shindot ; B 380 577 462 660 ; +C -1 ; WX 333 ; N sindot ; B -123 577 -41 660 ; +C -1 ; WX 278 ; N sofpasuq ; B 90 0 190 519 ; +C -1 ; WX 563 ; N alef ; B 51 0 536 518 ; +C -1 ; WX 542 ; N bet ; B 24 0 520 524 ; +C -1 ; WX 399 ; N gimel ; B 12 0 363 524 ; +C -1 ; WX 508 ; N dalet ; B 22 0 486 518 ; +C -1 ; WX 602 ; N he ; B 73 0 531 524 ; +C -1 ; WX 247 ; N vav ; B 76 0 171 518 ; +C -1 ; WX 382 ; N zayin ; B 46 0 360 518 ; +C -1 ; WX 599 ; N het ; B 76 0 528 524 ; +C -1 ; WX 590 ; N tet ; B 68 -14 531 529 ; +C -1 ; WX 247 ; N yod ; B 76 250 171 518 ; +C -1 ; WX 509 ; N finalkaf ; B 20 -199 438 524 ; +C -1 ; WX 461 ; N kaf ; B 39 -8 417 527 ; +C -1 ; WX 463 ; N lamed ; B 29 0 409 716 ; +C -1 ; WX 599 ; N finalmem ; B 76 0 528 524 ; +C -1 ; WX 601 ; N mem ; B 39 0 530 524 ; +C -1 ; WX 247 ; N finalnun ; B 76 -199 171 518 ; +C -1 ; WX 353 ; N nun ; B 29 0 279 524 ; +C -1 ; WX 574 ; N samekh ; B 44 -15 530 532 ; +C -1 ; WX 529 ; N ayin ; B 12 -48 463 518 ; +C -1 ; WX 566 ; N finalpe ; B 54 -199 496 524 ; +C -1 ; WX 546 ; N pe ; B 56 -8 502 527 ; +C -1 ; WX 461 ; N finaltsadi ; B 12 -199 422 518 ; +C -1 ; WX 479 ; N tsadi ; B 5 0 425 518 ; +C -1 ; WX 550 ; N qof ; B 73 -199 496 518 ; +C -1 ; WX 509 ; N resh ; B 20 0 438 524 ; +C -1 ; WX 694 ; N shin ; B 49 -14 646 518 ; +C -1 ; WX 643 ; N tav ; B 20 -4 572 524 ; +C -1 ; WX 493 ; N doublevav ; B 76 0 417 518 ; +C -1 ; WX 493 ; N vavyod ; B 76 0 417 518 ; +C -1 ; WX 493 ; N doubleyod ; B 76 250 417 518 ; +C -1 ; WX 236 ; N geresh ; B 44 330 192 518 ; +C -1 ; WX 417 ; N gershayim ; B 44 330 373 518 ; +C -1 ; WX 815 ; N newsheqelsign ; B 76 0 740 518 ; +C -1 ; WX 247 ; N vavshindot ; B -41 0 171 660 ; +C -1 ; WX 509 ; N finalkafsheva ; B 20 -199 438 524 ; +C -1 ; WX 509 ; N finalkafqamats ; B 20 -199 438 524 ; +C -1 ; WX 463 ; N lamedholam ; B -83 0 409 716 ; +C -1 ; WX 463 ; N lamedholamdagesh ; B -83 0 409 716 ; +C -1 ; WX 535 ; N altayin ; B 22 0 469 518 ; +C -1 ; WX 694 ; N shinshindot ; B 49 -14 646 659 ; +C -1 ; WX 694 ; N shinsindot ; B 49 -14 646 659 ; +C -1 ; WX 694 ; N shindageshshindot ; B 49 -14 646 659 ; +C -1 ; WX 694 ; N shindageshsindot ; B 49 -14 646 659 ; +C -1 ; WX 563 ; N alefpatah ; B 51 -154 536 518 ; +C -1 ; WX 563 ; N alefqamats ; B 51 -210 536 518 ; +C -1 ; WX 563 ; N alefmapiq ; B 51 0 536 518 ; +C -1 ; WX 542 ; N betdagesh ; B 24 0 520 524 ; +C -1 ; WX 399 ; N gimeldagesh ; B 12 0 363 524 ; +C -1 ; WX 508 ; N daletdagesh ; B 22 0 486 518 ; +C -1 ; WX 602 ; N hedagesh ; B 73 0 531 524 ; +C -1 ; WX 287 ; N vavdagesh ; B 0 0 211 518 ; +C -1 ; WX 411 ; N zayindagesh ; B 0 0 404 518 ; +C -1 ; WX 590 ; N tetdagesh ; B 68 -14 531 529 ; +C -1 ; WX 287 ; N yoddagesh ; B 0 250 211 518 ; +C -1 ; WX 509 ; N finalkafdagesh ; B 20 -199 438 524 ; +C -1 ; WX 461 ; N kafdagesh ; B 39 -8 417 527 ; +C -1 ; WX 463 ; N lameddagesh ; B 29 0 409 716 ; +C -1 ; WX 601 ; N memdagesh ; B 39 0 530 524 ; +C -1 ; WX 353 ; N nundagesh ; B 29 0 279 524 ; +C -1 ; WX 574 ; N samekhdagesh ; B 44 -15 530 532 ; +C -1 ; WX 566 ; N finalpedagesh ; B 54 -199 496 524 ; +C -1 ; WX 546 ; N pedagesh ; B 56 -8 502 527 ; +C -1 ; WX 479 ; N tsadidagesh ; B 5 0 425 518 ; +C -1 ; WX 550 ; N qofdagesh ; B 73 -199 496 518 ; +C -1 ; WX 509 ; N reshdagesh ; B 20 0 438 524 ; +C -1 ; WX 694 ; N shindagesh ; B 49 -14 646 518 ; +C -1 ; WX 643 ; N tavdages ; B 20 -4 572 524 ; +C -1 ; WX 247 ; N vavholam ; B 76 0 171 659 ; +C -1 ; WX 542 ; N betrafe ; B 24 0 520 662 ; +C -1 ; WX 461 ; N kafrafe ; B 39 -8 417 662 ; +C -1 ; WX 546 ; N perafe ; B 56 -8 502 662 ; +C -1 ; WX 576 ; N aleflamed ; B 29 0 549 716 ; +C -1 ; WX 0 ; N zerowidthnonjoiner ; B -18 -134 18 629 ; +C -1 ; WX 0 ; N zerowidthjoiner ; B -107 -134 107 690 ; +C -1 ; WX 0 ; N lefttorightmark ; B -18 -134 210 690 ; +C -1 ; WX 0 ; N righttoleftmark ; B -210 -134 17 690 ; +C -1 ; WX 319 ; N afii57388 ; B 83 137 241 443 ; +C -1 ; WX 319 ; N afii57403 ; B 78 136 235 609 ; +C -1 ; WX 356 ; N afii57407 ; B 33 137 326 711 ; +C -1 ; WX 413 ; N afii57409 ; B 59 72 363 400 ; +C -1 ; WX 207 ; N afii57440 ; B -34 143 207 228 ; +C -1 ; WX 201 ; N afii57451 ; B 34 605 201 780 ; +C -1 ; WX 237 ; N afii57452 ; B 34 605 237 794 ; +C -1 ; WX 201 ; N afii57453 ; B 34 -130 201 44 ; +C -1 ; WX 201 ; N afii57454 ; B 34 673 201 774 ; +C -1 ; WX 209 ; N afii57455 ; B 35 605 209 817 ; +C -1 ; WX 201 ; N afii57456 ; B 34 -21 201 80 ; +C -1 ; WX 211 ; N afii57457 ; B 34 605 211 762 ; +C -1 ; WX 165 ; N afii57458 ; B 34 605 165 756 ; +C -1 ; WX 526 ; N afii57392 ; B 186 219 344 452 ; +C -1 ; WX 526 ; N afii57393 ; B 147 143 327 716 ; +C -1 ; WX 526 ; N afii57394 ; B 89 143 391 723 ; +C -1 ; WX 526 ; N afii57395 ; B 63 143 471 723 ; +C -1 ; WX 526 ; N afii57396 ; B 146 143 397 713 ; +C -1 ; WX 526 ; N afii57397 ; B 93 247 438 622 ; +C -1 ; WX 526 ; N afii57398 ; B 85 156 410 710 ; +C -1 ; WX 526 ; N afii57399 ; B 63 143 459 710 ; +C -1 ; WX 526 ; N afii57400 ; B 75 149 472 716 ; +C -1 ; WX 526 ; N afii57401 ; B 107 143 413 725 ; +C -1 ; WX 526 ; N afii57381 ; B 65 84 463 777 ; +C -1 ; WX 319 ; N afii57461 ; B 94 23 230 267 ; +C -1 ; WX 526 ; N afii63167 ; B 87 403 424 744 ; +C -1 ; WX 750 ; N afii57459 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57543 ; B 125 0 625 625 ; +C -1 ; WX 282 ; N afii57534 ; B 26 130 262 430 ; +C -1 ; WX 750 ; N afii57494 ; B 125 0 625 625 ; +C -1 ; WX 526 ; N afii62843 ; B 77 147 455 720 ; +C -1 ; WX 526 ; N afii62844 ; B 74 159 441 708 ; +C -1 ; WX 526 ; N afii62845 ; B 99 147 435 717 ; +C -1 ; WX 750 ; N afii64240 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii64241 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63954 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57382 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii64242 ; B 125 0 625 625 ; +C -1 ; WX 211 ; N afii62881 ; B 34 605 211 917 ; +C -1 ; WX 750 ; N afii57504 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57369 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57370 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57371 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57372 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57373 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57374 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57375 ; B 125 0 625 625 ; +C -1 ; WX 638 ; N afii57391 ; B -34 143 638 228 ; +C -1 ; WX 750 ; N afii57471 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57460 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii52258 ; B 125 0 625 625 ; +C -1 ; WX 713 ; N afii57506 ; B 28 -175 713 469 ; +C -1 ; WX 713 ; N afii62958 ; B 28 -175 713 469 ; +C -1 ; WX 244 ; N afii62956 ; B -34 -175 244 456 ; +C -1 ; WX 244 ; N afii52957 ; B -34 -175 244 456 ; +C -1 ; WX 750 ; N afii57505 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62889 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62887 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62888 ; B 125 0 625 625 ; +C -1 ; WX 563 ; N afii57507 ; B 26 -212 516 432 ; +C -1 ; WX 526 ; N afii62961 ; B 26 -212 526 426 ; +C -1 ; WX 530 ; N afii62959 ; B -34 -175 530 427 ; +C -1 ; WX 530 ; N afii62960 ; B -34 -175 530 427 ; +C -1 ; WX 489 ; N afii57508 ; B 36 -91 489 723 ; +C -1 ; WX 489 ; N afii62962 ; B 36 -91 489 723 ; +C -1 ; WX 812 ; N afii57567 ; B 10 143 812 734 ; +C -1 ; WX 933 ; N afii62964 ; B 10 143 933 734 ; +C -1 ; WX 394 ; N afii52305 ; B -34 143 394 734 ; +C -1 ; WX 515 ; N afii52306 ; B -34 143 515 734 ; +C -1 ; WX 812 ; N afii57509 ; B 10 143 812 867 ; +C -1 ; WX 933 ; N afii62967 ; B 10 143 933 867 ; +C -1 ; WX 394 ; N afii62965 ; B -34 143 394 876 ; +C -1 ; WX 515 ; N afii62966 ; B -34 143 515 876 ; +C -1 ; WX 638 ; N afii57555 ; B 24 -43 606 462 ; +C -1 ; WX 588 ; N afii52364 ; B 18 -110 588 252 ; +C -1 ; WX 750 ; N afii63753 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63754 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63759 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63763 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63795 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62891 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63808 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62938 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63810 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62942 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62947 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63813 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63823 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63824 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63833 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63844 ; B 125 0 625 625 ; +C -1 ; WX 226 ; N afii62882 ; B 23 605 226 933 ; +C -1 ; WX 211 ; N afii62883 ; B 34 605 211 905 ; +C -1 ; WX 211 ; N afii62884 ; B 34 605 211 840 ; +C -1 ; WX 211 ; N afii62885 ; B 31 606 211 897 ; +C -1 ; WX 211 ; N afii62886 ; B 34 605 211 853 ; +C -1 ; WX 750 ; N afii63846 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63849 ; B 125 0 625 625 ; +C -1 ; WX 0 ; N uni202A ; B -18 -134 210 603 ; +C -1 ; WX 0 ; N uni202B ; B -210 -134 18 603 ; +C -1 ; WX 0 ; N uni202D ; B -114 -134 114 690 ; +C -1 ; WX 0 ; N uni202E ; B -114 -134 114 690 ; +C -1 ; WX 0 ; N uni202C ; B -114 -134 114 690 ; +C -1 ; WX 0 ; N uni206E ; B -114 -134 114 690 ; +C -1 ; WX 0 ; N _b_852 ; B -114 -134 114 690 ; +C -1 ; WX 0 ; N uni206A ; B -114 -134 114 690 ; +C -1 ; WX 0 ; N uni206B ; B -114 -134 114 690 ; +C -1 ; WX 0 ; N _b_855 ; B -114 -134 114 690 ; +C -1 ; WX 0 ; N uni206D ; B -114 -134 114 690 ; +C -1 ; WX 0 ; N uniF00A ; B -18 -208 18 894 ; +C -1 ; WX 0 ; N uniF00B ; B -114 -208 114 894 ; +C -1 ; WX 0 ; N uniF00C ; B -18 -208 109 894 ; +C -1 ; WX 0 ; N uniF00D ; B -109 -208 18 894 ; +C -1 ; WX 0 ; N uniF00E ; B -18 -208 114 894 ; +C -1 ; WX 1000 ; N uniFFFC ; B 0 0 1000 719 ; +C -1 ; WX 750 ; N afii63904 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63905 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63906 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63908 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63910 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63912 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62927 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63941 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62939 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63943 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62943 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62946 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63946 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62951 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63948 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62953 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63950 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63951 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63952 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63953 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63956 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63958 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63959 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63960 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63961 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii64046 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii64058 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii64059 ; B 125 0 625 625 ; +C -1 ; WX 319 ; N afii64060 ; B 62 -209 273 785 ; +C -1 ; WX 319 ; N afii64061 ; B 45 -209 257 785 ; +C -1 ; WX 750 ; N afii62945 ; B 125 0 625 625 ; +C -1 ; WX 616 ; N afii64184 ; B 10 143 603 766 ; +C -1 ; WX 413 ; N afii52399 ; B 59 72 363 400 ; +C -1 ; WX 207 ; N afii52400 ; B 7 130 206 827 ; +C -1 ; WX 229 ; N afii62753 ; B -18 143 229 827 ; +C -1 ; WX 207 ; N afii57411 ; B 42 130 179 880 ; +C -1 ; WX 229 ; N afii62754 ; B 8 143 229 880 ; +C -1 ; WX 432 ; N afii57412 ; B 24 -77 432 555 ; +C -1 ; WX 432 ; N afii62755 ; B 24 -77 432 555 ; +C -1 ; WX 207 ; N afii57413 ; B 22 -94 165 740 ; +C -1 ; WX 229 ; N afii62756 ; B 9 -94 229 740 ; +C -1 ; WX 638 ; N afii57414 ; B 24 -43 606 555 ; +C -1 ; WX 588 ; N afii62759 ; B 18 -110 588 491 ; +C -1 ; WX 244 ; N afii62757 ; B -34 143 244 668 ; +C -1 ; WX 244 ; N afii62758 ; B -34 143 244 668 ; +C -1 ; WX 207 ; N afii57415 ; B 72 130 165 740 ; +C -1 ; WX 229 ; N afii62760 ; B 9 143 229 740 ; +C -1 ; WX 713 ; N afii57416 ; B 28 -46 713 469 ; +C -1 ; WX 713 ; N afii62763 ; B 28 -46 713 469 ; +C -1 ; WX 244 ; N afii62761 ; B -34 -46 244 456 ; +C -1 ; WX 244 ; N afii62762 ; B -34 -46 244 456 ; +C -1 ; WX 282 ; N afii57417 ; B 0 130 271 641 ; +C -1 ; WX 375 ; N afii62764 ; B -4 143 375 768 ; +C -1 ; WX 713 ; N afii57418 ; B 28 143 713 628 ; +C -1 ; WX 713 ; N afii62767 ; B 28 143 713 628 ; +C -1 ; WX 244 ; N afii62765 ; B -34 143 244 667 ; +C -1 ; WX 244 ; N afii62766 ; B -34 143 244 667 ; +C -1 ; WX 713 ; N afii57419 ; B 28 143 713 715 ; +C -1 ; WX 713 ; N afii62770 ; B 28 143 713 715 ; +C -1 ; WX 244 ; N afii62768 ; B -34 143 244 754 ; +C -1 ; WX 244 ; N afii62769 ; B -34 143 244 754 ; +C -1 ; WX 563 ; N afii57420 ; B 26 -212 516 432 ; +C -1 ; WX 526 ; N afii62773 ; B 26 -212 526 426 ; +C -1 ; WX 530 ; N afii62771 ; B -34 -33 530 427 ; +C -1 ; WX 530 ; N afii62772 ; B -34 -33 530 427 ; +C -1 ; WX 563 ; N afii57421 ; B 26 -212 516 432 ; +C -1 ; WX 526 ; N afii62776 ; B 26 -212 526 426 ; +C -1 ; WX 530 ; N afii62774 ; B -34 143 530 427 ; +C -1 ; WX 530 ; N afii62775 ; B -34 143 530 427 ; +C -1 ; WX 563 ; N afii57422 ; B 26 -212 516 639 ; +C -1 ; WX 526 ; N afii62779 ; B 26 -212 526 639 ; +C -1 ; WX 530 ; N afii62777 ; B -34 143 530 639 ; +C -1 ; WX 530 ; N afii62778 ; B -34 143 530 639 ; +C -1 ; WX 337 ; N afii57423 ; B 46 143 337 552 ; +C -1 ; WX 337 ; N afii62780 ; B 46 143 337 552 ; +C -1 ; WX 337 ; N afii57424 ; B 46 143 337 759 ; +C -1 ; WX 337 ; N afii62781 ; B 46 143 337 759 ; +C -1 ; WX 489 ; N afii57425 ; B 36 -91 489 430 ; +C -1 ; WX 489 ; N afii62782 ; B 36 -91 489 430 ; +C -1 ; WX 489 ; N afii57426 ; B 36 -91 489 639 ; +C -1 ; WX 489 ; N afii62783 ; B 36 -91 489 639 ; +C -1 ; WX 821 ; N afii57427 ; B 30 -72 821 417 ; +C -1 ; WX 821 ; N afii62786 ; B 30 -72 821 417 ; +C -1 ; WX 531 ; N afii62784 ; B -34 143 531 401 ; +C -1 ; WX 531 ; N afii62785 ; B -34 143 531 401 ; +C -1 ; WX 821 ; N afii57428 ; B 30 -72 821 715 ; +C -1 ; WX 821 ; N afii62789 ; B 30 -72 821 715 ; +C -1 ; WX 531 ; N afii62787 ; B -34 143 531 715 ; +C -1 ; WX 531 ; N afii62788 ; B -34 143 531 715 ; +C -1 ; WX 1098 ; N afii57429 ; B 30 -72 1098 417 ; +C -1 ; WX 1098 ; N afii62792 ; B 30 -72 1098 417 ; +C -1 ; WX 846 ; N afii62790 ; B -34 143 846 405 ; +C -1 ; WX 846 ; N afii62791 ; B -34 143 846 405 ; +C -1 ; WX 1098 ; N afii57430 ; B 30 -72 1098 590 ; +C -1 ; WX 1098 ; N afii62795 ; B 30 -72 1098 590 ; +C -1 ; WX 846 ; N afii62793 ; B -34 143 846 590 ; +C -1 ; WX 846 ; N afii62794 ; B -34 143 846 590 ; +C -1 ; WX 582 ; N afii57431 ; B -34 143 582 793 ; +C -1 ; WX 582 ; N afii62798 ; B -34 143 582 793 ; +C -1 ; WX 582 ; N afii62796 ; B -34 143 582 793 ; +C -1 ; WX 582 ; N afii62797 ; B -34 143 582 793 ; +C -1 ; WX 582 ; N afii57432 ; B -34 143 582 793 ; +C -1 ; WX 582 ; N afii62801 ; B -34 143 582 793 ; +C -1 ; WX 582 ; N afii62799 ; B -34 143 582 793 ; +C -1 ; WX 582 ; N afii62800 ; B -34 143 582 793 ; +C -1 ; WX 544 ; N afii57433 ; B 21 -212 516 534 ; +C -1 ; WX 450 ; N afii62804 ; B 26 -212 486 431 ; +C -1 ; WX 526 ; N afii62802 ; B -34 143 470 472 ; +C -1 ; WX 394 ; N afii62803 ; B -34 143 394 418 ; +C -1 ; WX 544 ; N afii57434 ; B 21 -212 516 737 ; +C -1 ; WX 450 ; N afii62807 ; B 26 -212 486 639 ; +C -1 ; WX 526 ; N afii62805 ; B -34 143 470 639 ; +C -1 ; WX 394 ; N afii62806 ; B -34 143 394 639 ; +C -1 ; WX 789 ; N afii57441 ; B 19 143 789 681 ; +C -1 ; WX 789 ; N afii62810 ; B 19 143 789 681 ; +C -1 ; WX 268 ; N afii62808 ; B -34 143 268 726 ; +C -1 ; WX 263 ; N afii62809 ; B -34 143 263 707 ; +C -1 ; WX 582 ; N afii57442 ; B 34 -75 582 683 ; +C -1 ; WX 582 ; N afii62813 ; B 34 -75 582 683 ; +C -1 ; WX 268 ; N afii62811 ; B -34 143 268 740 ; +C -1 ; WX 263 ; N afii62812 ; B -34 143 263 727 ; +C -1 ; WX 601 ; N afii57443 ; B 22 143 601 775 ; +C -1 ; WX 601 ; N afii62816 ; B 22 143 601 775 ; +C -1 ; WX 394 ; N afii57410 ; B -34 143 394 734 ; +C -1 ; WX 394 ; N afii62815 ; B -34 143 394 734 ; +C -1 ; WX 506 ; N afii57444 ; B 35 7 506 775 ; +C -1 ; WX 506 ; N afii62819 ; B 35 7 506 775 ; +C -1 ; WX 207 ; N afii62817 ; B -34 143 207 775 ; +C -1 ; WX 207 ; N afii62818 ; B -34 143 207 775 ; +C -1 ; WX 338 ; N afii57445 ; B 17 -212 338 357 ; +C -1 ; WX 338 ; N afii62822 ; B 17 -212 338 357 ; +C -1 ; WX 394 ; N afii62820 ; B -34 143 394 411 ; +C -1 ; WX 394 ; N afii62821 ; B -34 143 394 411 ; +C -1 ; WX 526 ; N afii57446 ; B 34 -72 526 558 ; +C -1 ; WX 526 ; N afii62825 ; B 34 -72 526 558 ; +C -1 ; WX 244 ; N afii62823 ; B -34 143 244 636 ; +C -1 ; WX 244 ; N afii62824 ; B -34 143 244 636 ; +C -1 ; WX 282 ; N afii57447 ; B 26 130 262 430 ; +C -1 ; WX 375 ; N afii62828 ; B -4 143 375 583 ; +C -1 ; WX 450 ; N afii57470 ; B -34 125 385 555 ; +C -1 ; WX 394 ; N afii62827 ; B -34 -62 394 429 ; +C -1 ; WX 432 ; N afii57448 ; B 24 -77 432 385 ; +C -1 ; WX 432 ; N afii62829 ; B 24 -77 432 385 ; +C -1 ; WX 638 ; N afii57449 ; B 24 -43 606 462 ; +C -1 ; WX 588 ; N afii62830 ; B 18 -110 588 252 ; +C -1 ; WX 638 ; N afii57450 ; B 24 -208 606 462 ; +C -1 ; WX 588 ; N afii62833 ; B 18 -212 588 252 ; +C -1 ; WX 244 ; N afii62831 ; B -34 -69 244 456 ; +C -1 ; WX 244 ; N afii62832 ; B -34 -69 244 456 ; +C -1 ; WX 544 ; N afii62834 ; B 31 79 507 827 ; +C -1 ; WX 601 ; N afii62835 ; B 36 118 601 827 ; +C -1 ; WX 544 ; N afii62836 ; B 19 79 507 880 ; +C -1 ; WX 601 ; N afii62837 ; B 28 118 601 880 ; +C -1 ; WX 544 ; N afii62838 ; B 41 -111 507 724 ; +C -1 ; WX 601 ; N afii62839 ; B 36 -111 601 733 ; +C -1 ; WX 544 ; N afii62840 ; B 41 79 507 724 ; +C -1 ; WX 601 ; N afii62841 ; B 36 118 601 733 ; +C -1 ; WX 750 ; N glyph1021 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57543-2 ; B 125 0 625 625 ; +C -1 ; WX 201 ; N afii57454-2 ; B 34 673 201 774 ; +C -1 ; WX 201 ; N afii57451-2 ; B 34 605 201 780 ; +C -1 ; WX 750 ; N glyph1025 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1026 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57471-2 ; B 125 0 625 625 ; +C -1 ; WX 165 ; N afii57458-2 ; B 34 605 165 756 ; +C -1 ; WX 211 ; N afii57457-2 ; B 34 605 211 762 ; +C -1 ; WX 750 ; N afii57494-2 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57459-2 ; B 125 0 625 625 ; +C -1 ; WX 209 ; N afii57455-2 ; B 35 605 209 817 ; +C -1 ; WX 237 ; N afii57452-2 ; B 34 605 237 794 ; +C -1 ; WX 750 ; N glyph1034 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1035 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1036 ; B 125 0 625 625 ; +C -1 ; WX 211 ; N afii62884-2 ; B 34 605 211 840 ; +C -1 ; WX 211 ; N afii62881-2 ; B 34 605 211 917 ; +C -1 ; WX 211 ; N afii62886-2 ; B 34 605 211 853 ; +C -1 ; WX 211 ; N afii62883-2 ; B 34 605 211 905 ; +C -1 ; WX 211 ; N afii62885-2 ; B 31 606 211 897 ; +C -1 ; WX 226 ; N afii62882-2 ; B 23 605 226 933 ; +C -1 ; WX 750 ; N afii57504-2 ; B 125 0 625 625 ; +C -1 ; WX 201 ; N afii57456-2 ; B 34 -21 201 80 ; +C -1 ; WX 201 ; N afii57453-2 ; B 34 -130 201 44 ; +C -1 ; WX 750 ; N glyph1046 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1047 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57543-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57454-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57451-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1051 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1052 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57471-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57458-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57457-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57494-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57459-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57455-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57452-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1060 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1061 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1062 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62884-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62881-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62886-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62883-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62885-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62882-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57504-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57456-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57453-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1072 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1073 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57543-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57454-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57451-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1077 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1078 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57471-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57458-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57457-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57494-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57459-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57455-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57452-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1086 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1087 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1088 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62884-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62881-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62886-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62883-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62885-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62882-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57504-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57456-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57453-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1098 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1099 ; B 125 0 625 625 ; +C -1 ; WX 319 ; N glyph1100 ; B 99 137 223 714 ; +C -1 ; WX 319 ; N glyph1101 ; B 97 137 226 267 ; +C -1 ; WX 319 ; N glyph1102 ; B 97 137 225 542 ; +C -1 ; WX 750 ; N glyph1103 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1104 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1105 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1106 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1107 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1108 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1109 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1110 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1111 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1112 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1113 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1114 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1115 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1116 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1117 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1118 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1119 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1120 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1121 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1122 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1123 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1124 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1125 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1126 ; B 125 0 625 625 ; +C -1 ; WX 125 ; N afii57440-2 ; B -34 143 125 228 ; +C -1 ; WX 1000 ; N afii57440-3 ; B -34 143 1000 228 ; +C -1 ; WX 2000 ; N afii57440-4 ; B -34 143 2000 228 ; +C -1 ; WX 857 ; N Ohorn ; B 48 -12 834 729 ; +C -1 ; WX 656 ; N ohorn ; B 33 -12 625 531 ; +C -1 ; WX 854 ; N Uhorn ; B 79 -12 813 716 ; +C -1 ; WX 669 ; N uhorn ; B 64 -12 639 519 ; +C -1 ; WX 0 ; N glyph1134 ; B -268 819 -91 896 ; +C -1 ; WX 0 ; N glyph1135 ; B -477 819 -301 896 ; +C -1 ; WX 0 ; N glyph1136 ; B -419 755 -235 892 ; +C -1 ; WX 0 ; N uniF006 ; B -209 819 -33 896 ; +C -1 ; WX 0 ; N uniF007 ; B -395 819 -219 896 ; +C -1 ; WX 0 ; N uniF009 ; B -319 755 -135 892 ; +C -1 ; WX 0 ; N combininghookabove ; B -230 738 -17 896 ; +C -1 ; WX 0 ; N uniF010 ; B -244 803 -46 896 ; +C -1 ; WX 0 ; N uniF013 ; B -367 738 -153 896 ; +C -1 ; WX 0 ; N uniF011 ; B -450 803 -252 896 ; +C -1 ; WX 0 ; N uniF01C ; B -298 786 29 898 ; +C -1 ; WX 0 ; N uniF015 ; B -505 811 -178 896 ; +C -1 ; WX 0 ; N combiningtildeaccent ; B -444 755 -117 868 ; +C -1 ; WX 0 ; N glyph1147 ; B -146 729 139 800 ; +C -1 ; WX 0 ; N glyph1148 ; B -146 729 153 789 ; +C -1 ; WX 0 ; N uniF02C ; B -124 -159 -24 -59 ; +C -1 ; WX 513 ; N dongsign ; B 78 120 442 716 ; +C -1 ; WX 834 ; N onethird ; B 52 -28 823 728 ; +C -1 ; WX 834 ; N twothirds ; B 12 -28 818 728 ; +C -1 ; WX 0 ; N uniF008 ; B -161 583 22 720 ; +C -1 ; WX 0 ; N glyph1154 ; B -319 583 -135 720 ; +C -1 ; WX 0 ; N glyph1155 ; B -246 583 -63 720 ; +C -1 ; WX 0 ; N uniF00F ; B -419 583 -235 720 ; +C -1 ; WX 0 ; N uniF012 ; B -209 583 4 756 ; +C -1 ; WX 0 ; N uniF014 ; B -367 583 -153 756 ; +C -1 ; WX 0 ; N uniF016 ; B -527 786 -200 898 ; +C -1 ; WX 0 ; N uniF017 ; B -631 786 -304 898 ; +C -1 ; WX 0 ; N uniF018 ; B -665 786 -337 898 ; +C -1 ; WX 0 ; N uniF019 ; B -444 595 -117 708 ; +C -1 ; WX 0 ; N uniF01A ; B -542 595 -215 708 ; +C -1 ; WX 0 ; N uniF01B ; B -573 595 -246 708 ; +C -1 ; WX 0 ; N uniF01E ; B -382 -159 -282 -59 ; +C -1 ; WX 0 ; N uniF01F ; B -439 -159 -339 -59 ; +C -1 ; WX 0 ; N uniF020 ; B -517 -159 -417 -59 ; +C -1 ; WX 0 ; N uniF021 ; B -406 -159 -306 -59 ; +C -1 ; WX 0 ; N uniF022 ; B -551 -159 -451 -59 ; +C -1 ; WX 0 ; N combininggraveaccent ; B -261 755 -77 892 ; +C -1 ; WX 0 ; N combiningacuteaccent ; B -186 755 -2 892 ; +C -1 ; WX 0 ; N uniF01D ; B -280 595 47 708 ; +C -1 ; WX 0 ; N combiningdotbelow ; B -382 -159 -282 -59 ; +C -1 ; WX 0 ; N uniF023 ; B -329 -159 -229 -59 ; +C -1 ; WX 0 ; N uniF029 ; B -192 -159 -92 -59 ; +C -1 ; WX 0 ; N uniF02A ; B -158 -159 -58 -59 ; +C -1 ; WX 0 ; N uniF02B ; B -385 -159 -285 -59 ; +C -1 ; WX 0 ; N uniF024 ; B -322 -159 -222 -59 ; +C -1 ; WX 0 ; N uniF025 ; B -332 -159 -232 -59 ; +C -1 ; WX 0 ; N uniF026 ; B -430 -159 -330 -59 ; +C -1 ; WX 0 ; N uniF027 ; B -365 -159 -265 -59 ; +C -1 ; WX 0 ; N uniF028 ; B -479 -159 -378 -59 ; +C -1 ; WX 0 ; N uniF02D ; B -491 811 -164 896 ; +C -1 ; WX 0 ; N uniF02E ; B -491 786 -164 898 ; +C -1 ; WX 0 ; N uniF02F ; B -552 811 -225 896 ; +C -1 ; WX 0 ; N uniF030 ; B -552 786 -225 898 ; +C -1 ; WX 222 ; N uniF031 ; B 66 0 154 519 ; +C -1 ; WX 667 ; N Adotbelow ; B -1 -159 668 716 ; +C -1 ; WX 556 ; N adotbelow ; B 36 -159 514 530 ; +C -1 ; WX 667 ; N Ahookabove ; B -1 0 668 896 ; +C -1 ; WX 556 ; N ahookabove ; B 36 -12 514 756 ; +C -1 ; WX 667 ; N Acircumflexacute ; B -1 0 668 896 ; +C -1 ; WX 556 ; N acircumflexacute ; B 36 -12 514 892 ; +C -1 ; WX 667 ; N Acircumflexgrave ; B -1 0 668 896 ; +C -1 ; WX 556 ; N acircumflexgrave ; B 36 -12 514 892 ; +C -1 ; WX 667 ; N Acircumflexhookabove ; B -1 0 668 896 ; +C -1 ; WX 556 ; N acircumflexhookabove ; B 36 -12 514 896 ; +C -1 ; WX 667 ; N Acircumflextilde ; B -1 0 668 896 ; +C -1 ; WX 556 ; N acircumflextilde ; B 36 -12 514 868 ; +C -1 ; WX 667 ; N Acircumflexdotbelow ; B -1 -159 668 801 ; +C -1 ; WX 556 ; N acircumflexdotbelow ; B 36 -159 514 720 ; +C -1 ; WX 667 ; N Abreveacute ; B -1 0 668 896 ; +C -1 ; WX 556 ; N abreveacute ; B 36 -12 514 892 ; +C -1 ; WX 667 ; N Abrevegrave ; B -1 0 668 896 ; +C -1 ; WX 556 ; N abrevegrave ; B 36 -12 514 892 ; +C -1 ; WX 667 ; N Abrevehookabove ; B -1 0 668 896 ; +C -1 ; WX 556 ; N abrevehookabove ; B 36 -12 514 896 ; +C -1 ; WX 667 ; N Abrevetilde ; B -1 0 668 896 ; +C -1 ; WX 556 ; N abrevetilde ; B 36 -12 514 868 ; +C -1 ; WX 667 ; N Abrevedotbelow ; B -1 -159 668 800 ; +C -1 ; WX 556 ; N abrevedotbelow ; B 36 -159 514 715 ; +C -1 ; WX 667 ; N Edotbelow ; B 79 -159 613 716 ; +C -1 ; WX 556 ; N edotbelow ; B 37 -159 515 530 ; +C -1 ; WX 667 ; N Ehookabove ; B 79 0 613 896 ; +C -1 ; WX 556 ; N ehookabove ; B 37 -12 515 756 ; +C -1 ; WX 667 ; N Etilde ; B 79 0 613 885 ; +C -1 ; WX 556 ; N etilde ; B 37 -12 515 708 ; +C -1 ; WX 667 ; N Ecircumflexacute ; B 79 0 613 896 ; +C -1 ; WX 556 ; N ecircumflexacute ; B 37 -12 515 892 ; +C -1 ; WX 667 ; N Ecircumflexgrave ; B 79 0 613 896 ; +C -1 ; WX 556 ; N ecircumflexgrave ; B 37 -12 515 892 ; +C -1 ; WX 667 ; N Ecircumflexhookabove ; B 79 0 613 896 ; +C -1 ; WX 556 ; N ecircumflexhookabove ; B 37 -12 515 896 ; +C -1 ; WX 667 ; N Ecircumflextilde ; B 79 0 613 896 ; +C -1 ; WX 556 ; N ecircumflextilde ; B 37 -12 515 868 ; +C -1 ; WX 667 ; N Ecircumflexdotbelow ; B 79 -159 613 801 ; +C -1 ; WX 556 ; N ecircumflexdotbelow ; B 37 -159 515 720 ; +C -1 ; WX 278 ; N Ihookabove ; B 48 0 262 896 ; +C -1 ; WX 222 ; N ihookabove ; B 15 0 229 756 ; +C -1 ; WX 278 ; N Idotbelow ; B 91 -159 191 716 ; +C -1 ; WX 222 ; N idotbelow ; B 61 -159 161 716 ; +C -1 ; WX 778 ; N Odotbelow ; B 48 -159 733 729 ; +C -1 ; WX 556 ; N odotbelow ; B 33 -159 519 530 ; +C -1 ; WX 778 ; N Ohookabove ; B 48 -12 733 896 ; +C -1 ; WX 556 ; N ohookabove ; B 33 -12 519 756 ; +C -1 ; WX 778 ; N Ocircumflexacute ; B 48 -12 733 896 ; +C -1 ; WX 556 ; N ocircumflexacute ; B 33 -12 519 892 ; +C -1 ; WX 778 ; N Ocircumflexgrave ; B 48 -12 733 896 ; +C -1 ; WX 556 ; N ocircumflexgrave ; B 33 -12 519 892 ; +C -1 ; WX 778 ; N Ocircumflexhookabove ; B 48 -12 733 896 ; +C -1 ; WX 556 ; N ocircumflexhookabove ; B 33 -12 519 896 ; +C -1 ; WX 778 ; N Ocircumflextilde ; B 48 -12 733 896 ; +C -1 ; WX 556 ; N ocircumflextilde ; B 33 -12 519 868 ; +C -1 ; WX 778 ; N Ocircumflexdotbelow ; B 48 -159 733 801 ; +C -1 ; WX 556 ; N ocircumflexdotbelow ; B 33 -159 519 720 ; +C -1 ; WX 857 ; N Ohornacute ; B 48 -12 834 896 ; +C -1 ; WX 656 ; N ohornacute ; B 33 -12 625 720 ; +C -1 ; WX 857 ; N Ohorngrave ; B 48 -12 834 896 ; +C -1 ; WX 656 ; N ohorngrave ; B 33 -12 625 720 ; +C -1 ; WX 857 ; N Ohornhookabove ; B 48 -12 834 909 ; +C -1 ; WX 656 ; N ohornhookabove ; B 33 -12 625 756 ; +C -1 ; WX 857 ; N Ohorntilde ; B 48 -12 834 873 ; +C -1 ; WX 656 ; N ohorntilde ; B 33 -12 625 708 ; +C -1 ; WX 857 ; N Ohorndotbelow ; B 48 -159 834 729 ; +C -1 ; WX 656 ; N ohorndotbelow ; B 33 -159 625 531 ; +C -1 ; WX 722 ; N Udotbelow ; B 79 -159 642 716 ; +C -1 ; WX 556 ; N udotbelow ; B 64 -159 484 519 ; +C -1 ; WX 722 ; N Uhookabove ; B 79 -12 642 896 ; +C -1 ; WX 556 ; N uhookabove ; B 64 -12 484 756 ; +C -1 ; WX 854 ; N Uhornacute ; B 79 -12 813 896 ; +C -1 ; WX 669 ; N uhornacute ; B 64 -12 639 720 ; +C -1 ; WX 854 ; N Uhorngrave ; B 79 -12 813 896 ; +C -1 ; WX 669 ; N uhorngrave ; B 64 -12 639 720 ; +C -1 ; WX 854 ; N Uhornhookabove ; B 79 -12 813 896 ; +C -1 ; WX 669 ; N uhornhookabove ; B 64 -12 639 756 ; +C -1 ; WX 854 ; N Uhorntilde ; B 79 -12 813 873 ; +C -1 ; WX 669 ; N uhorntilde ; B 64 -12 639 708 ; +C -1 ; WX 854 ; N Uhorndotbelow ; B 79 -159 813 716 ; +C -1 ; WX 669 ; N uhorndotbelow ; B 64 -159 639 519 ; +C -1 ; WX 667 ; N Ydotbelow ; B 3 -159 659 716 ; +C -1 ; WX 500 ; N ydotbelow ; B 16 -210 491 519 ; +C -1 ; WX 667 ; N Yhookabove ; B 3 0 659 896 ; +C -1 ; WX 500 ; N yhookabove ; B 16 -210 491 756 ; +C -1 ; WX 667 ; N Ytilde ; B 3 0 659 873 ; +C -1 ; WX 500 ; N ytilde ; B 16 -210 491 708 ; +C -1 ; WX 667 ; N uni01CD ; B -1 0 668 891 ; +C -1 ; WX 556 ; N uni01CE ; B 36 -12 514 720 ; +C -1 ; WX 278 ; N uni01CF ; B -15 0 294 891 ; +C -1 ; WX 222 ; N uni01D0 ; B -39 0 270 720 ; +C -1 ; WX 778 ; N uni01D1 ; B 48 -12 733 891 ; +C -1 ; WX 556 ; N uni01D2 ; B 33 -12 519 720 ; +C -1 ; WX 722 ; N uni01D3 ; B 79 -12 642 891 ; +C -1 ; WX 556 ; N uni01D4 ; B 64 -12 484 720 ; +C -1 ; WX 722 ; N uni01D5 ; B 79 -12 642 900 ; +C -1 ; WX 556 ; N uni01D6 ; B 64 -12 484 852 ; +C -1 ; WX 722 ; N uni01D7 ; B 79 -12 642 900 ; +C -1 ; WX 556 ; N uni01D8 ; B 64 -12 484 900 ; +C -1 ; WX 722 ; N uni01D9 ; B 79 -12 642 900 ; +C -1 ; WX 556 ; N uni01DA ; B 64 -12 484 900 ; +C -1 ; WX 722 ; N uni01DB ; B 79 -12 642 900 ; +C -1 ; WX 556 ; N uni01DC ; B 64 -12 484 900 ; +C -1 ; WX 0 ; N glyph1292 ; B -126 730 126 900 ; +C -1 ; WX 0 ; N glyph1293 ; B -126 730 126 900 ; +C -1 ; WX 0 ; N glyph1294 ; B -126 730 126 900 ; +C -1 ; WX 0 ; N glyph1295 ; B -126 730 126 900 ; +C -1 ; WX 542 ; N uni0492 ; B -1 0 542 716 ; +C -1 ; WX 365 ; N uni0493 ; B 6 0 365 519 ; +C -1 ; WX 923 ; N uni0496 ; B 3 -199 919 716 ; +C -1 ; WX 669 ; N uni0497 ; B -2 -147 664 519 ; +C -1 ; WX 583 ; N uni049A ; B 79 -199 579 716 ; +C -1 ; WX 438 ; N uni049B ; B 65 -147 433 519 ; +C -1 ; WX 583 ; N uni049C ; B 79 0 579 716 ; +C -1 ; WX 438 ; N uni049D ; B 65 0 445 519 ; +C -1 ; WX 722 ; N uni04A2 ; B 80 -199 707 716 ; +C -1 ; WX 552 ; N uni04A3 ; B 66 -147 542 519 ; +C -1 ; WX 556 ; N uni04AE ; B -1 0 553 716 ; +C -1 ; WX 500 ; N uni04AF ; B 10 -199 491 519 ; +C -1 ; WX 556 ; N uni04B0 ; B -1 0 553 716 ; +C -1 ; WX 500 ; N uni04B1 ; B 10 -199 491 519 ; +C -1 ; WX 667 ; N uni04B2 ; B 4 -199 661 716 ; +C -1 ; WX 500 ; N uni04B3 ; B 7 -147 493 519 ; +C -1 ; WX 667 ; N uni04B8 ; B 42 0 588 716 ; +C -1 ; WX 521 ; N uni04B9 ; B 34 0 455 519 ; +C -1 ; WX 667 ; N uni04BA ; B 79 0 624 716 ; +C -1 ; WX 556 ; N uni04BB ; B 66 0 488 716 ; +C -1 ; WX 752 ; N uni018F ; B 48 -12 711 728 ; +C -1 ; WX 556 ; N uni0259 ; B 42 -12 520 530 ; +C -1 ; WX 778 ; N uni04E8 ; B 47 -12 731 729 ; +C -1 ; WX 556 ; N uni04E9 ; B 33 -12 519 530 ; +C -1 ; WX 713 ; N glyph1320 ; B 28 143 713 469 ; +C -1 ; WX 244 ; N glyph1321 ; B -34 143 244 456 ; +C -1 ; WX 268 ; N glyph1322 ; B -34 143 268 544 ; +C -1 ; WX 263 ; N glyph1323 ; B -34 143 263 494 ; +C -1 ; WX 582 ; N glyph1324 ; B 34 -75 582 445 ; +C -1 ; WX 244 ; N glyph1325 ; B 77 -46 194 66 ; +C -1 ; WX 244 ; N glyph1326 ; B 8 -88 236 68 ; +C -1 ; WX 244 ; N glyph1327 ; B 13 -175 242 68 ; +C -1 ; WX 244 ; N glyph1328 ; B 8 -175 236 68 ; +C -1 ; WX 244 ; N glyph1329 ; B 52 -166 191 68 ; +C -1 ; WX 244 ; N glyph1330 ; B -3 -210 248 68 ; +C -1 ; WX 269 ; N glyph1331 ; B -24 519 269 828 ; +C -1 ; WX 207 ; N glyph1332 ; B 7 732 210 891 ; +C -1 ; WX 207 ; N glyph1333 ; B -5 746 179 890 ; +C -1 ; WX 333 ; N glyph1334 ; B 80 605 240 717 ; +C -1 ; WX 333 ; N glyph1335 ; B 80 605 240 717 ; +C -1 ; WX 207 ; N uni0653 ; B 7 692 206 747 ; +C -1 ; WX 207 ; N uni0654 ; B 42 733 179 880 ; +C -1 ; WX 207 ; N uni0655 ; B 42 -79 179 68 ; +C -1 ; WX 0 ; N uni0670 ; B -24 519 24 809 ; +C -1 ; WX 207 ; N uni0671 ; B 7 130 210 891 ; +C -1 ; WX 229 ; N uniFB51 ; B -32 143 229 891 ; +C -1 ; WX 207 ; N uni0672 ; B -5 130 179 890 ; +C -1 ; WX 229 ; N glyph1343 ; B -25 143 229 890 ; +C -1 ; WX 207 ; N uni0673 ; B 14 -84 198 740 ; +C -1 ; WX 229 ; N glyph1345 ; B -5 -84 229 740 ; +C -1 ; WX 207 ; N uni0675 ; B 72 130 296 740 ; +C -1 ; WX 229 ; N glyph47 ; B 9 143 276 740 ; +C -1 ; WX 432 ; N uni0676 ; B 24 -77 511 597 ; +C -1 ; WX 432 ; N glyph1349 ; B 24 -77 511 597 ; +C -1 ; WX 432 ; N uni0677 ; B 24 -77 511 616 ; +C -1 ; WX 432 ; N glyph1351 ; B 24 -77 511 616 ; +C -1 ; WX 638 ; N uni0678 ; B 24 -43 667 685 ; +C -1 ; WX 588 ; N glyph ; B 18 -110 588 440 ; +C -1 ; WX 713 ; N uni0679 ; B 28 143 713 828 ; +C -1 ; WX 713 ; N uniFB67 ; B 28 143 713 828 ; +C -1 ; WX 244 ; N uniFB68 ; B -34 143 269 828 ; +C -1 ; WX 244 ; N uniFB69 ; B -34 143 269 828 ; +C -1 ; WX 713 ; N uni067A ; B 28 143 713 752 ; +C -1 ; WX 713 ; N uniFB5F ; B 28 143 713 752 ; +C -1 ; WX 244 ; N uniFB60 ; B -34 143 244 752 ; +C -1 ; WX 244 ; N uniFB61 ; B -34 143 244 752 ; +C -1 ; WX 713 ; N uni067B ; B 28 -166 713 469 ; +C -1 ; WX 713 ; N uniFB53 ; B 28 -166 713 469 ; +C -1 ; WX 244 ; N uniFB54 ; B -34 -166 244 456 ; +C -1 ; WX 244 ; N uniFB55 ; B -34 -166 244 456 ; +C -1 ; WX 713 ; N uni067C ; B 28 31 713 628 ; +C -1 ; WX 713 ; N glyph1367 ; B 28 31 713 628 ; +C -1 ; WX 244 ; N glyph1368 ; B -34 31 244 667 ; +C -1 ; WX 244 ; N glyph1369 ; B -34 31 244 667 ; +C -1 ; WX 713 ; N uni067D ; B 28 143 713 752 ; +C -1 ; WX 713 ; N glyph1371 ; B 28 143 713 752 ; +C -1 ; WX 244 ; N glyph1372 ; B -34 143 244 752 ; +C -1 ; WX 244 ; N glyph1373 ; B -34 143 244 752 ; +C -1 ; WX 713 ; N uni067F ; B 28 143 713 752 ; +C -1 ; WX 713 ; N uniFB63 ; B 28 143 713 752 ; +C -1 ; WX 244 ; N uniFB64 ; B -34 143 244 752 ; +C -1 ; WX 244 ; N uniFB65 ; B -34 143 244 752 ; +C -1 ; WX 713 ; N uni0680 ; B 28 -210 713 469 ; +C -1 ; WX 713 ; N uniFB5B ; B 28 -210 713 469 ; +C -1 ; WX 244 ; N uniFB5C ; B -34 -210 248 456 ; +C -1 ; WX 244 ; N uniFB5D ; B -34 -210 248 456 ; +C -1 ; WX 563 ; N uni0681 ; B 26 -212 516 685 ; +C -1 ; WX 526 ; N glyph1383 ; B 26 -212 526 685 ; +C -1 ; WX 530 ; N glyph1384 ; B -34 143 530 685 ; +C -1 ; WX 530 ; N glyph1385 ; B -34 143 530 685 ; +C -1 ; WX 563 ; N uni0682 ; B 26 -212 516 752 ; +C -1 ; WX 526 ; N glyph1387 ; B 26 -212 526 752 ; +C -1 ; WX 530 ; N glyph1388 ; B -34 143 530 752 ; +C -1 ; WX 530 ; N glyph1389 ; B -34 143 530 752 ; +C -1 ; WX 563 ; N uni0683 ; B 26 -212 516 432 ; +C -1 ; WX 526 ; N uniFB77 ; B 26 -212 526 426 ; +C -1 ; WX 530 ; N uniFB78 ; B -34 -88 530 427 ; +C -1 ; WX 530 ; N uniFB79 ; B -34 -88 530 427 ; +C -1 ; WX 563 ; N uni0684 ; B 26 -212 516 432 ; +C -1 ; WX 526 ; N uniFB73 ; B 26 -212 526 426 ; +C -1 ; WX 530 ; N uniFB74 ; B -34 -166 530 427 ; +C -1 ; WX 530 ; N uniFB75 ; B -34 -166 530 427 ; +C -1 ; WX 563 ; N uni0685 ; B 26 -212 516 752 ; +C -1 ; WX 526 ; N glyph1399 ; B 26 -212 526 752 ; +C -1 ; WX 530 ; N glyph1400 ; B -34 143 530 752 ; +C -1 ; WX 530 ; N glyph1401 ; B -34 143 530 752 ; +C -1 ; WX 563 ; N uni0687 ; B 26 -212 516 432 ; +C -1 ; WX 526 ; N uniFB7f ; B 26 -212 526 426 ; +C -1 ; WX 530 ; N uniFB80 ; B -34 -210 530 427 ; +C -1 ; WX 530 ; N uniFB81 ; B -34 -210 530 427 ; +C -1 ; WX 337 ; N uni0688 ; B 24 143 337 891 ; +C -1 ; WX 337 ; N uniFB89 ; B 24 143 337 891 ; +C -1 ; WX 337 ; N uni0689 ; B 46 31 337 552 ; +C -1 ; WX 337 ; N glyph1409 ; B 46 31 337 552 ; +C -1 ; WX 337 ; N uni068A ; B 46 -46 337 552 ; +C -1 ; WX 337 ; N glyph1411 ; B 46 -46 337 552 ; +C -1 ; WX 337 ; N uni068B ; B 24 -46 337 891 ; +C -1 ; WX 337 ; N glyph1413 ; B 24 -46 337 891 ; +C -1 ; WX 337 ; N uni068C ; B 46 143 337 752 ; +C -1 ; WX 337 ; N uniFB85 ; B 46 143 337 752 ; +C -1 ; WX 337 ; N uni068D ; B 46 -88 337 552 ; +C -1 ; WX 337 ; N uniFB83 ; B 46 -88 337 552 ; +C -1 ; WX 337 ; N uni068E ; B 46 143 337 850 ; +C -1 ; WX 337 ; N uniFB87 ; B 46 143 337 850 ; +C -1 ; WX 337 ; N uni068F ; B 27 143 337 850 ; +C -1 ; WX 337 ; N glyph1421 ; B 27 143 337 850 ; +C -1 ; WX 337 ; N uni0690 ; B 36 143 337 850 ; +C -1 ; WX 337 ; N glyph1423 ; B 36 143 337 850 ; +C -1 ; WX 489 ; N uni0691 ; B 36 -91 489 828 ; +C -1 ; WX 489 ; N uniFB8D ; B 36 -91 489 828 ; +C -1 ; WX 489 ; N uni0692 ; B 36 -91 489 634 ; +C -1 ; WX 489 ; N glyph1426 ; B 36 -91 489 634 ; +C -1 ; WX 489 ; N uni0693 ; B 36 -127 489 430 ; +C -1 ; WX 489 ; N glyph1429 ; B 36 -127 489 430 ; +C -1 ; WX 489 ; N uni0694 ; B 36 -144 507 430 ; +C -1 ; WX 489 ; N glyph1431 ; B 36 -144 507 430 ; +C -1 ; WX 489 ; N uni0695 ; B 36 -196 489 430 ; +C -1 ; WX 489 ; N glyph1433 ; B 36 -196 489 430 ; +C -1 ; WX 489 ; N uni0696 ; B 36 -144 507 430 ; +C -1 ; WX 489 ; N glyph1435 ; B 36 -144 507 430 ; +C -1 ; WX 489 ; N uni0697 ; B 36 -91 489 636 ; +C -1 ; WX 489 ; N glyph1437 ; B 36 -91 489 636 ; +C -1 ; WX 489 ; N uni0699 ; B 36 -91 489 758 ; +C -1 ; WX 489 ; N glyph1439 ; B 36 -91 489 758 ; +C -1 ; WX 821 ; N uni069A ; B 30 -72 821 593 ; +C -1 ; WX 821 ; N glyph1441 ; B 30 -72 821 593 ; +C -1 ; WX 531 ; N glyph1442 ; B -34 -46 531 593 ; +C -1 ; WX 531 ; N glyph1443 ; B -34 -46 531 593 ; +C -1 ; WX 821 ; N uni069B ; B 30 -175 822 417 ; +C -1 ; WX 821 ; N glyph1445 ; B 30 -175 822 417 ; +C -1 ; WX 531 ; N glyph1446 ; B -34 -175 531 401 ; +C -1 ; WX 531 ; N glyph1447 ; B -34 -175 531 401 ; +C -1 ; WX 821 ; N uni069C ; B 30 -175 822 723 ; +C -1 ; WX 821 ; N glyph1449 ; B 30 -175 822 723 ; +C -1 ; WX 531 ; N glyph1450 ; B -34 -175 531 723 ; +C -1 ; WX 531 ; N glyph1451 ; B -34 -175 531 723 ; +C -1 ; WX 1098 ; N uni069D ; B 30 -88 1098 417 ; +C -1 ; WX 1098 ; N glyph1453 ; B 30 -88 1098 417 ; +C -1 ; WX 846 ; N glyph1454 ; B -34 -88 846 405 ; +C -1 ; WX 846 ; N glyph1455 ; B -34 -88 846 405 ; +C -1 ; WX 1098 ; N uni069E ; B 30 -72 1098 723 ; +C -1 ; WX 1098 ; N glyph1457 ; B 30 -72 1098 723 ; +C -1 ; WX 846 ; N glyph1458 ; B -34 143 846 723 ; +C -1 ; WX 846 ; N glyph1459 ; B -34 143 846 723 ; +C -1 ; WX 582 ; N uni069F ; B -34 143 582 793 ; +C -1 ; WX 582 ; N glyph1461 ; B -34 143 582 793 ; +C -1 ; WX 544 ; N uni06A0 ; B 21 -212 516 850 ; +C -1 ; WX 450 ; N glyph1463 ; B 26 -212 486 723 ; +C -1 ; WX 526 ; N glyph1464 ; B -34 143 470 771 ; +C -1 ; WX 394 ; N glyph1465 ; B -34 143 394 723 ; +C -1 ; WX 789 ; N uni06A1 ; B 19 143 789 478 ; +C -1 ; WX 789 ; N uni06A2 ; B 19 -46 789 478 ; +C -1 ; WX 789 ; N glyph1468 ; B 19 -46 789 478 ; +C -1 ; WX 268 ; N glyph1469 ; B -34 -46 268 544 ; +C -1 ; WX 263 ; N glyph1470 ; B -34 -46 263 494 ; +C -1 ; WX 789 ; N uni06A3 ; B 19 -46 789 642 ; +C -1 ; WX 789 ; N glyph1472 ; B 19 -46 789 642 ; +C -1 ; WX 268 ; N glyph1473 ; B -34 -46 268 691 ; +C -1 ; WX 263 ; N glyph1474 ; B -34 -46 263 691 ; +C -1 ; WX 789 ; N uni06A4 ; B 19 143 789 771 ; +C -1 ; WX 789 ; N uniFB6B ; B 19 143 789 771 ; +C -1 ; WX 268 ; N uniFB6C ; B -34 143 268 820 ; +C -1 ; WX 263 ; N uniFB6D ; B -34 143 263 820 ; +C -1 ; WX 789 ; N uni06A5 ; B 19 -175 822 478 ; +C -1 ; WX 789 ; N glyph1480 ; B 19 -175 822 478 ; +C -1 ; WX 268 ; N glyph1481 ; B -34 -175 268 544 ; +C -1 ; WX 263 ; N glyph1482 ; B -34 -175 263 494 ; +C -1 ; WX 789 ; N uni06A6 ; B 19 143 789 801 ; +C -1 ; WX 789 ; N uniFB6F ; B 19 143 789 801 ; +C -1 ; WX 268 ; N uniFB70 ; B -34 143 268 840 ; +C -1 ; WX 263 ; N uniFB71 ; B -34 143 263 840 ; +C -1 ; WX 582 ; N uni06A7 ; B 34 -75 582 627 ; +C -1 ; WX 582 ; N glyph1488 ; B 34 -75 582 627 ; +C -1 ; WX 582 ; N uni06A8 ; B 34 -75 582 723 ; +C -1 ; WX 582 ; N glyph1490 ; B 34 -75 582 723 ; +C -1 ; WX 812 ; N uni06AA ; B 10 143 812 673 ; +C -1 ; WX 933 ; N glyph1492 ; B 10 143 933 673 ; +C -1 ; WX 394 ; N glyph1493 ; B -34 143 394 613 ; +C -1 ; WX 515 ; N glyph1494 ; B -34 143 515 613 ; +C -1 ; WX 812 ; N uni06AB ; B 10 143 812 734 ; +C -1 ; WX 933 ; N glyph1496 ; B 10 143 933 734 ; +C -1 ; WX 394 ; N glyph1497 ; B -34 143 394 734 ; +C -1 ; WX 515 ; N glyph1498 ; B -34 143 515 734 ; +C -1 ; WX 601 ; N uni06AC ; B 22 143 601 775 ; +C -1 ; WX 601 ; N glyph1500 ; B 22 143 601 775 ; +C -1 ; WX 394 ; N glyph1501 ; B -34 143 394 843 ; +C -1 ; WX 394 ; N glyph1502 ; B -34 143 394 843 ; +C -1 ; WX 601 ; N uni06AD ; B 22 143 601 879 ; +C -1 ; WX 601 ; N uniFBD4 ; B 22 143 601 879 ; +C -1 ; WX 394 ; N uniFBD5 ; B -34 143 394 852 ; +C -1 ; WX 394 ; N uniFBD6 ; B -34 143 394 852 ; +C -1 ; WX 601 ; N uni06AE ; B 22 -175 601 775 ; +C -1 ; WX 601 ; N glyph1508 ; B 22 -175 601 775 ; +C -1 ; WX 394 ; N glyph1509 ; B -34 -175 394 734 ; +C -1 ; WX 394 ; N glyph1510 ; B -34 -175 394 734 ; +C -1 ; WX 812 ; N uni06B0 ; B 10 143 812 867 ; +C -1 ; WX 933 ; N glyph1512 ; B 10 143 933 867 ; +C -1 ; WX 394 ; N glyph1513 ; B -34 143 394 876 ; +C -1 ; WX 515 ; N glyph1514 ; B -34 143 515 876 ; +C -1 ; WX 812 ; N uni06B1 ; B 10 143 812 891 ; +C -1 ; WX 933 ; N uniFB9B ; B 10 143 933 891 ; +C -1 ; WX 394 ; N uniFB9C ; B -34 143 394 891 ; +C -1 ; WX 515 ; N uniFB9D ; B -34 143 515 891 ; +C -1 ; WX 812 ; N uni06B2 ; B 10 -88 812 867 ; +C -1 ; WX 933 ; N glyph1520 ; B 10 -88 933 867 ; +C -1 ; WX 394 ; N glyph1521 ; B -34 -88 394 876 ; +C -1 ; WX 515 ; N glyph1522 ; B -34 -88 515 876 ; +C -1 ; WX 812 ; N uni06B3 ; B 10 -166 812 867 ; +C -1 ; WX 933 ; N uniFB97 ; B 10 -166 933 867 ; +C -1 ; WX 394 ; N uniFB98 ; B -34 -166 394 876 ; +C -1 ; WX 515 ; N uniFB99 ; B -34 -166 515 876 ; +C -1 ; WX 812 ; N uni06B4 ; B 10 143 812 891 ; +C -1 ; WX 933 ; N glyph1528 ; B 10 143 933 891 ; +C -1 ; WX 394 ; N glyph1529 ; B -34 143 394 891 ; +C -1 ; WX 515 ; N glyph1530 ; B -34 143 515 891 ; +C -1 ; WX 506 ; N uni06B5 ; B 35 7 506 891 ; +C -1 ; WX 506 ; N glyph1532 ; B 35 7 506 891 ; +C -1 ; WX 207 ; N glyph1533 ; B -34 143 207 891 ; +C -1 ; WX 207 ; N glyph1534 ; B -34 143 207 891 ; +C -1 ; WX 506 ; N uni06B6 ; B 35 7 506 891 ; +C -1 ; WX 506 ; N glyph1536 ; B 35 7 506 891 ; +C -1 ; WX 207 ; N glyph1537 ; B -34 143 207 891 ; +C -1 ; WX 207 ; N glyph1538 ; B -34 143 207 891 ; +C -1 ; WX 506 ; N uni06B7 ; B 35 7 506 891 ; +C -1 ; WX 506 ; N glyph1540 ; B 35 7 506 891 ; +C -1 ; WX 207 ; N glyph1541 ; B -34 143 207 891 ; +C -1 ; WX 207 ; N glyph1542 ; B -34 143 207 891 ; +C -1 ; WX 506 ; N uni06B8 ; B 35 -205 506 775 ; +C -1 ; WX 506 ; N glyph1544 ; B 35 -205 506 775 ; +C -1 ; WX 207 ; N glyph1545 ; B -34 -175 217 775 ; +C -1 ; WX 207 ; N glyph1546 ; B -34 -175 217 775 ; +C -1 ; WX 526 ; N uni06B9 ; B 34 -210 526 558 ; +C -1 ; WX 526 ; N glyph1548 ; B 34 -210 526 558 ; +C -1 ; WX 244 ; N glyph1549 ; B -34 -46 244 636 ; +C -1 ; WX 244 ; N glyph1550 ; B -34 -46 244 636 ; +C -1 ; WX 526 ; N uni06BA ; B 34 -72 526 417 ; +C -1 ; WX 526 ; N uniFB9F ; B 34 -72 526 417 ; +C -1 ; WX 526 ; N uni06BB ; B 34 -72 526 789 ; +C -1 ; WX 526 ; N uniFBA1 ; B 34 -72 526 789 ; +C -1 ; WX 526 ; N uni06BC ; B 34 -184 526 558 ; +C -1 ; WX 526 ; N glyph1556 ; B 34 -184 526 558 ; +C -1 ; WX 244 ; N glyph1557 ; B -34 31 244 636 ; +C -1 ; WX 244 ; N glyph1558 ; B -34 31 244 636 ; +C -1 ; WX 526 ; N uni06BD ; B 34 -72 526 723 ; +C -1 ; WX 526 ; N glyph1560 ; B 34 -72 526 723 ; +C -1 ; WX 563 ; N uni06BF ; B 26 -212 516 639 ; +C -1 ; WX 526 ; N glyph1562 ; B 26 -212 526 639 ; +C -1 ; WX 530 ; N glyph1563 ; B -34 -175 530 639 ; +C -1 ; WX 530 ; N glyph1564 ; B -34 -175 530 639 ; +C -1 ; WX 282 ; N uni06C0 ; B 26 130 262 636 ; +C -1 ; WX 375 ; N uniFBA5 ; B -4 143 375 733 ; +C -1 ; WX 388 ; N uni06C1 ; B 13 71 388 328 ; +C -1 ; WX 388 ; N uni06C2 ; B 13 71 388 538 ; +C -1 ; WX 388 ; N uni06C3 ; B 13 71 388 557 ; +C -1 ; WX 432 ; N uni06C4 ; B 24 -77 432 385 ; +C -1 ; WX 432 ; N glyph1571 ; B 24 -77 432 385 ; +C -1 ; WX 432 ; N uni06C5 ; B 24 -77 432 385 ; +C -1 ; WX 432 ; N uniFBE1 ; B 24 -77 432 385 ; +C -1 ; WX 432 ; N uni06C6 ; B 24 -77 436 585 ; +C -1 ; WX 432 ; N uniFBDA ; B 24 -77 436 585 ; +C -1 ; WX 432 ; N uni06C7 ; B 24 -77 432 665 ; +C -1 ; WX 432 ; N uniFBD8 ; B 24 -77 432 665 ; +C -1 ; WX 432 ; N uni06C8 ; B 24 -77 432 741 ; +C -1 ; WX 432 ; N uniFBDC ; B 24 -77 432 741 ; +C -1 ; WX 432 ; N uni06C9 ; B 24 -77 436 585 ; +C -1 ; WX 432 ; N uniFBE3 ; B 24 -77 436 585 ; +C -1 ; WX 432 ; N uni06CA ; B 24 -77 432 623 ; +C -1 ; WX 432 ; N glyph1583 ; B 24 -77 432 623 ; +C -1 ; WX 432 ; N uni06CB ; B 24 -77 437 710 ; +C -1 ; WX 432 ; N uniFBDF ; B 24 -77 437 710 ; +C -1 ; WX 638 ; N uni06CD ; B -34 -43 606 462 ; +C -1 ; WX 588 ; N glyph1587 ; B -34 -110 588 252 ; +C -1 ; WX 638 ; N uni06CE ; B 24 -43 606 522 ; +C -1 ; WX 588 ; N glyph1589 ; B 18 -110 588 424 ; +C -1 ; WX 244 ; N glyph1590 ; B -34 -69 244 620 ; +C -1 ; WX 244 ; N glyph1591 ; B -34 -69 244 620 ; +C -1 ; WX 432 ; N uni06CF ; B 24 -77 432 586 ; +C -1 ; WX 432 ; N glyph1593 ; B 24 -77 432 586 ; +C -1 ; WX 638 ; N uni06D0 ; B 24 -182 606 462 ; +C -1 ; WX 588 ; N uniFBE5 ; B 18 -212 588 252 ; +C -1 ; WX 244 ; N uniFBE6 ; B -34 -166 244 456 ; +C -1 ; WX 244 ; N uniFBE7 ; B -34 -166 244 456 ; +C -1 ; WX 638 ; N uni06D1 ; B 24 -168 606 462 ; +C -1 ; WX 588 ; N glyph1599 ; B 18 -212 588 252 ; +C -1 ; WX 812 ; N uni06D2 ; B 34 -25 812 373 ; +C -1 ; WX 812 ; N uniFBAF ; B 34 -208 812 228 ; +C -1 ; WX 812 ; N uni06D3 ; B 34 -25 812 489 ; +C -1 ; WX 812 ; N uniFBB1 ; B 34 -208 812 450 ; +C -1 ; WX 207 ; N uni06D4 ; B 20 143 188 228 ; +C -1 ; WX 0 ; N uni06D6 ; B -230 519 231 886 ; +C -1 ; WX 0 ; N uni06D7 ; B -171 519 194 886 ; +C -1 ; WX 0 ; N uni06D8 ; B -102 519 102 646 ; +C -1 ; WX 0 ; N uni06D9 ; B -111 519 111 826 ; +C -1 ; WX 0 ; N uni06DA ; B -116 519 116 825 ; +C -1 ; WX 0 ; N uni06DB ; B -54 519 54 634 ; +C -1 ; WX 0 ; N uni06DC ; B -188 519 188 752 ; +C -1 ; WX 1123 ; N uni06DD ; B 24 -188 1099 886 ; +C -1 ; WX 1084 ; N uni06DE ; B 24 -152 1060 884 ; +C -1 ; WX 0 ; N uni06DF ; B -37 519 37 592 ; +C -1 ; WX 0 ; N uni06E0 ; B -36 519 36 591 ; +C -1 ; WX 0 ; N uni06E1 ; B -134 519 134 654 ; +C -1 ; WX 0 ; N uni06E2 ; B -76 519 77 790 ; +C -1 ; WX 0 ; N uni06E3 ; B -188 -179 188 54 ; +C -1 ; WX 0 ; N uni06E4 ; B -47 519 47 545 ; +C -1 ; WX 194 ; N uni06E5 ; B 0 519 194 738 ; +C -1 ; WX 370 ; N uni06E6 ; B -1 519 370 708 ; +C -1 ; WX 0 ; N uni06E7 ; B -187 519 185 708 ; +C -1 ; WX 0 ; N uni06E8 ; B -117 519 117 819 ; +C -1 ; WX 600 ; N uni06E9 ; B 24 0 576 818 ; +C -1 ; WX 0 ; N uni06EA ; B -82 -165 82 -1 ; +C -1 ; WX 0 ; N uni06EB ; B -82 519 82 683 ; +C -1 ; WX 0 ; N uni06ED ; B -76 -179 77 92 ; +C -1 ; WX 821 ; N uni06FA ; B 30 -72 821 723 ; +C -1 ; WX 821 ; N glyph1629 ; B 30 -72 821 723 ; +C -1 ; WX 531 ; N glyph1630 ; B -34 -46 531 723 ; +C -1 ; WX 531 ; N glyph1631 ; B -34 -46 531 723 ; +C -1 ; WX 1098 ; N uni06FB ; B 30 -72 1098 590 ; +C -1 ; WX 1098 ; N glyph1633 ; B 30 -72 1098 590 ; +C -1 ; WX 846 ; N glyph1634 ; B -34 -46 846 590 ; +C -1 ; WX 846 ; N glyph1635 ; B -34 -46 846 590 ; +C -1 ; WX 544 ; N uni06FC ; B 21 -212 516 737 ; +C -1 ; WX 450 ; N glyph1637 ; B 26 -212 486 639 ; +C -1 ; WX 526 ; N glyph1638 ; B -34 -46 470 639 ; +C -1 ; WX 394 ; N glyph1639 ; B -34 -46 394 639 ; +C -1 ; WX 413 ; N uni06FD ; B 59 -145 363 400 ; +C -1 ; WX 338 ; N uni06FE ; B 17 -212 338 357 ; +C -1 ; WX 282 ; N uniFBA6 ; B 26 130 262 430 ; +C -1 ; WX 244 ; N uniFBA8 ; B -34 -132 244 456 ; +C -1 ; WX 320 ; N uniFBA9 ; B -34 -205 320 365 ; +C -1 ; WX 244 ; N glyph1645 ; B 23 -68 222 49 ; +C -1 ; WX 244 ; N glyph1646 ; B 29 -151 226 -20 ; +C -1 ; WX 244 ; N glyph1647 ; B 9 -136 236 59 ; +C -1 ; WX 244 ; N glyph1648 ; B 86 -64 162 34 ; +C -1 ; WX 244 ; N glyph1649 ; B 53 -70 197 27 ; +C -1 ; WX 812 ; N glyph1650 ; B 10 143 812 852 ; +C -1 ; WX 933 ; N glyph1651 ; B 10 143 933 852 ; +C -1 ; WX 247 ; N uniFB1D ; B 76 109 171 518 ; +C -1 ; WX 0 ; N uniFB1E ; B -144 611 145 737 ; +C -1 ; WX 342 ; N glyph1654 ; B 0 140 342 191 ; +C -1 ; WX 493 ; N uniFB1F ; B 76 140 417 518 ; +C -1 ; WX 544 ; N glyph1656 ; B -5 79 507 890 ; +C -1 ; WX 601 ; N glyph1657 ; B -5 118 601 890 ; +C -1 ; WX 544 ; N glyph1658 ; B 41 -107 507 724 ; +C -1 ; WX 601 ; N glyph1659 ; B 36 -107 601 733 ; +C -1 ; WX 544 ; N glyph1660 ; B 41 79 507 782 ; +C -1 ; WX 601 ; N glyph1661 ; B 36 118 601 782 ; +C -1 ; WX 544 ; N glyph1662 ; B 41 79 514 891 ; +C -1 ; WX 601 ; N glyph1663 ; B 36 118 601 891 ; +C -1 ; WX 544 ; N glyph1664 ; B 41 79 507 891 ; +C -1 ; WX 601 ; N glyph1665 ; B 36 118 601 891 ; +C -1 ; WX 544 ; N glyph1666 ; B 41 79 507 891 ; +C -1 ; WX 601 ; N glyph1667 ; B 36 118 601 891 ; +C -1 ; WX 544 ; N glyph1668 ; B 41 -159 507 724 ; +C -1 ; WX 601 ; N glyph1669 ; B 36 -159 601 733 ; +C -1 ; WX 526 ; N glyph1670 ; B 55 143 485 713 ; +C -1 ; WX 526 ; N glyph1671 ; B 84 107 461 713 ; +C -1 ; WX 544 ; N glyph1672 ; B 7 79 507 891 ; +C -1 ; WX 601 ; N glyph1673 ; B 7 118 601 891 ; +EndCharMetrics +StartKernData +StartKernPairs 908 +KPX space A -55 +KPX space T -18 +KPX space Y -18 +KPX space Alphatonos -55 +KPX space Alpha -55 +KPX space Delta -55 +KPX space Lambda -55 +KPX space Tau -18 +KPX space Upsilon -18 +KPX space Upsilondieresis -18 +KPX one one -74 +KPX A space -55 +KPX A T -74 +KPX A V -74 +KPX A W -37 +KPX A Y -74 +KPX A v -18 +KPX A w -18 +KPX A y -18 +KPX A quoteright -74 +KPX F comma -111 +KPX F period -111 +KPX F A -55 +KPX L space -37 +KPX L T -74 +KPX L V -74 +KPX L W -74 +KPX L Y -74 +KPX L y -37 +KPX L quoteright -55 +KPX P space -18 +KPX P comma -129 +KPX P period -129 +KPX P A -74 +KPX R T -18 +KPX R V -18 +KPX R W -18 +KPX R Y -18 +KPX T space -18 +KPX T comma -111 +KPX T hyphen -55 +KPX T period -111 +KPX T colon -111 +KPX T semicolon -111 +KPX T A -74 +KPX T O -18 +KPX T a -111 +KPX T c -111 +KPX T e -111 +KPX T i -37 +KPX T o -111 +KPX T r -37 +KPX T s -111 +KPX T u -37 +KPX T w -55 +KPX T y -55 +KPX V comma -92 +KPX V hyphen -55 +KPX V period -92 +KPX V colon -37 +KPX V semicolon -37 +KPX V A -74 +KPX V a -74 +KPX V e -55 +KPX V i -18 +KPX V o -55 +KPX V r -37 +KPX V u -37 +KPX V y -37 +KPX W comma -55 +KPX W hyphen -18 +KPX W period -55 +KPX W colon -18 +KPX W semicolon -18 +KPX W A -37 +KPX W a -37 +KPX W e -18 +KPX W o -18 +KPX W r -18 +KPX W u -18 +KPX W y -9 +KPX Y space -18 +KPX Y comma -129 +KPX Y hyphen -92 +KPX Y period -129 +KPX Y colon -55 +KPX Y semicolon -65 +KPX Y A -74 +KPX Y a -74 +KPX Y e -92 +KPX Y i -37 +KPX Y o -92 +KPX Y p -74 +KPX Y q -92 +KPX Y u -55 +KPX Y v -55 +KPX f f -18 +KPX f quoteright 18 +KPX r comma -55 +KPX r period -55 +KPX r quoteright 37 +KPX v comma -74 +KPX v period -74 +KPX w comma -55 +KPX w period -55 +KPX y comma -74 +KPX y period -74 +KPX quoteleft quoteleft -18 +KPX quoteright space -37 +KPX quoteright s -18 +KPX quoteright quoteright -18 +KPX quotedblbase afii10051 -78 +KPX quotedblbase afii10060 -78 +KPX quotedblbase afii10036 -78 +KPX quotedblbase afii10041 -33 +KPX quotedblbase afii10044 -33 +KPX Gamma comma -110 +KPX Gamma period -110 +KPX Gamma iotadieresistonos 80 +KPX Gamma Alpha -92 +KPX Gamma Delta -92 +KPX Gamma Lambda -92 +KPX Gamma iota -43 +KPX Gamma iotadieresis 43 +KPX Theta Alpha -18 +KPX Theta Delta -18 +KPX Theta Lambda -18 +KPX Theta Upsilon -32 +KPX Theta Upsilondieresis -32 +KPX Phi Alpha -29 +KPX Phi Upsilon -32 +KPX Phi Upsilondieresis -32 +KPX delta tau -14 +KPX delta lambda -19 +KPX delta chi -27 +KPX delta pi -14 +KPX tau alpha -14 +KPX tau delta -14 +KPX tau sigma -14 +KPX tau phi -14 +KPX tau alphatonos -14 +KPX tau zeta -14 +KPX tau omicron -14 +KPX tau sigma1 -14 +KPX tau omega -14 +KPX tau omegatonos -14 +KPX phi tau -14 +KPX phi lambda -19 +KPX phi chi -27 +KPX phi pi -14 +KPX Alphatonos Theta -21 +KPX Alphatonos Phi -29 +KPX Alphatonos Omicron -21 +KPX Alphatonos Tau -74 +KPX Alphatonos Upsilon -74 +KPX Alphatonos Upsilondieresis -74 +KPX Alphatonos gamma -18 +KPX Alphatonos nu -18 +KPX Alphatonos chi -18 +KPX Omicrontonos Upsilon -32 +KPX Upsilontonos Theta -56 +KPX Upsilontonos Phi -56 +KPX Upsilontonos alpha -91 +KPX Upsilontonos sigma -91 +KPX Upsilontonos phi -91 +KPX Upsilontonos iotadieresistonos 83 +KPX Upsilontonos Alpha -74 +KPX Upsilontonos Delta -74 +KPX Upsilontonos Lambda -74 +KPX Upsilontonos Omicron -56 +KPX Upsilontonos Omega -48 +KPX Upsilontonos etatonos -74 +KPX Upsilontonos iotatonos -37 +KPX Upsilontonos eta -74 +KPX Upsilontonos iota -37 +KPX Upsilontonos kappa -74 +KPX Upsilontonos mu -74 +KPX Upsilontonos omicron -91 +KPX Upsilontonos iotadieresis 48 +KPX Upsilontonos omicrontonos -91 +KPX Omegatonos Upsilon -23 +KPX Omegatonos Upsilondieresis -23 +KPX Alpha space -55 +KPX Alpha quoteright -74 +KPX Alpha Theta -21 +KPX Alpha Phi -29 +KPX Alpha Omicron -21 +KPX Alpha Tau -74 +KPX Alpha Upsilon -74 +KPX Alpha Upsilondieresis -74 +KPX Alpha gamma -18 +KPX Alpha nu -18 +KPX Alpha chi -18 +KPX Delta space -55 +KPX Delta Theta -21 +KPX Delta Omicron -21 +KPX Delta Tau -58 +KPX Delta Upsilon -74 +KPX Delta Upsilondieresis -74 +KPX Kappa Theta -31 +KPX Kappa Phi -55 +KPX Kappa alpha -12 +KPX Kappa delta -12 +KPX Kappa sigma -12 +KPX Kappa phi -12 +KPX Kappa Omicron -31 +KPX Kappa alphatonos -12 +KPX Kappa zeta -12 +KPX Kappa theta -12 +KPX Kappa xi -12 +KPX Kappa omicron -12 +KPX Kappa omega -12 +KPX Kappa omicrontonos -12 +KPX Kappa omegatonos -12 +KPX Lambda space -55 +KPX Lambda Theta -21 +KPX Lambda Omicron -21 +KPX Lambda Tau -74 +KPX Lambda Upsilon -74 +KPX Lambda Upsilondieresis -74 +KPX Omicron Alpha -18 +KPX Omicron Delta -21 +KPX Omicron Lambda -18 +KPX Omicron Upsilon -32 +KPX Omicron Upsilondieresis -32 +KPX Rho space -18 +KPX Rho comma -128 +KPX Rho period -128 +KPX Rho Alpha -74 +KPX Rho Delta -74 +KPX Rho Lambda -74 +KPX Sigma tau -48 +KPX Sigma pi -48 +KPX Tau space -18 +KPX Tau comma -110 +KPX Tau period -110 +KPX Tau colon -110 +KPX Tau semicolon -110 +KPX Tau Theta -18 +KPX Tau Phi -18 +KPX Tau alpha -110 +KPX Tau epsilon -110 +KPX Tau sigma -110 +KPX Tau phi -110 +KPX Tau iotadieresistonos 92 +KPX Tau Alpha -74 +KPX Tau Delta -74 +KPX Tau Lambda -74 +KPX Tau Omicron -18 +KPX Tau Omega -18 +KPX Tau alphatonos -110 +KPX Tau epsilontonos -110 +KPX Tau upsilondieresistonos -87 +KPX Tau gamma -87 +KPX Tau eta -73 +KPX Tau iota -37 +KPX Tau mu -73 +KPX Tau nu -55 +KPX Tau omicron -110 +KPX Tau upsilon -86 +KPX Tau chi -55 +KPX Tau psi -73 +KPX Tau iotadieresis 92 +KPX Tau upsilondieresis -87 +KPX Tau omicrontonos -110 +KPX Tau upsilontonos -87 +KPX Upsilon space -18 +KPX Upsilon comma -128 +KPX Upsilon hyphen -91 +KPX Upsilon period -128 +KPX Upsilon colon -55 +KPX Upsilon semicolon -55 +KPX Upsilon Theta -56 +KPX Upsilon Phi -56 +KPX Upsilon alpha -91 +KPX Upsilon sigma -91 +KPX Upsilon phi -91 +KPX Upsilon iotadieresistonos 92 +KPX Upsilon Alpha -74 +KPX Upsilon Delta -74 +KPX Upsilon Lambda -74 +KPX Upsilon Omicron -56 +KPX Upsilon Omega -48 +KPX Upsilon etatonos -74 +KPX Upsilon iotatonos -37 +KPX Upsilon gamma -48 +KPX Upsilon eta -74 +KPX Upsilon iota -37 +KPX Upsilon kappa -74 +KPX Upsilon mu -74 +KPX Upsilon omicron -91 +KPX Upsilon iotadieresis 59 +KPX Upsilon omicrontonos -91 +KPX Psi alpha -38 +KPX Psi delta -38 +KPX Psi sigma -38 +KPX Psi phi -38 +KPX Psi alphatonos -38 +KPX Psi theta -19 +KPX Psi omicron -38 +KPX Psi omega -38 +KPX Psi omicrontonos -38 +KPX Psi omegatonos -38 +KPX Omega Upsilon -23 +KPX Omega Upsilondieresis -23 +KPX Upsilondieresis space -18 +KPX Upsilondieresis Theta -56 +KPX Upsilondieresis Phi -56 +KPX Upsilondieresis alpha -91 +KPX Upsilondieresis sigma -91 +KPX Upsilondieresis phi -91 +KPX Upsilondieresis iotadieresistonos 83 +KPX Upsilondieresis Alpha -74 +KPX Upsilondieresis Delta -74 +KPX Upsilondieresis Lambda -74 +KPX Upsilondieresis Omicron -56 +KPX Upsilondieresis Omega -48 +KPX Upsilondieresis etatonos -74 +KPX Upsilondieresis iotatonos -37 +KPX Upsilondieresis eta -74 +KPX Upsilondieresis iota -37 +KPX Upsilondieresis kappa -74 +KPX Upsilondieresis mu -74 +KPX Upsilondieresis omicron -91 +KPX Upsilondieresis iotadieresis 48 +KPX Upsilondieresis omicrontonos -91 +KPX zeta alpha -67 +KPX zeta delta -37 +KPX zeta sigma -67 +KPX zeta tau -42 +KPX zeta phi -67 +KPX zeta alphatonos -67 +KPX zeta etatonos -18 +KPX zeta gamma -42 +KPX zeta eta -18 +KPX zeta theta -48 +KPX zeta iota -18 +KPX zeta kappa -18 +KPX zeta nu -42 +KPX zeta omicron -67 +KPX zeta omega -67 +KPX zeta omicrontonos -67 +KPX zeta omegatonos -67 +KPX zeta pi -42 +KPX theta lambda -19 +KPX kappa alpha -12 +KPX kappa delta -12 +KPX kappa sigma -12 +KPX kappa phi -12 +KPX kappa alphatonos -12 +KPX kappa zeta -12 +KPX kappa theta -12 +KPX kappa xi -12 +KPX kappa omicron -12 +KPX kappa sigma1 -12 +KPX kappa omega -12 +KPX kappa omicrontonos -12 +KPX kappa omegatonos -12 +KPX lambda alpha -15 +KPX lambda delta -15 +KPX lambda sigma -15 +KPX lambda phi -18 +KPX lambda alphatonos -15 +KPX lambda xi -15 +KPX lambda omicron -15 +KPX lambda sigma1 -23 +KPX lambda upsilon -24 +KPX lambda omega -15 +KPX lambda omicrontonos -15 +KPX lambda upsilontonos -24 +KPX lambda omegatonos -15 +KPX xi alpha -27 +KPX xi delta -27 +KPX xi sigma -27 +KPX xi phi -27 +KPX xi alphatonos -27 +KPX xi zeta -27 +KPX xi xi -27 +KPX xi omicron -27 +KPX xi sigma1 -27 +KPX xi omicrontonos -27 +KPX omicron tau -14 +KPX omicron lambda -19 +KPX omicron chi -27 +KPX omicron pi -14 +KPX rho tau -14 +KPX rho lambda -19 +KPX rho pi -14 +KPX chi alpha -27 +KPX chi delta -27 +KPX chi sigma -27 +KPX chi phi -27 +KPX chi alphatonos -27 +KPX chi zeta -27 +KPX chi omicron -27 +KPX chi sigma1 -27 +KPX chi omega -27 +KPX chi omicrontonos -27 +KPX chi omegatonos -27 +KPX omega tau -14 +KPX omega lambda -19 +KPX omega chi -27 +KPX omega pi -14 +KPX omicrontonos tau -14 +KPX omicrontonos lambda -19 +KPX omicrontonos chi -27 +KPX omicrontonos pi -14 +KPX omegatonos tau -14 +KPX omegatonos lambda -19 +KPX omegatonos chi -27 +KPX omegatonos pi -14 +KPX afii10052 comma -122 +KPX afii10052 period -122 +KPX afii10052 guillemotleft -67 +KPX afii10052 guillemotright -67 +KPX afii10052 emdash -22 +KPX afii10058 quoteright -78 +KPX afii10059 quoteright -67 +KPX afii10017 quoteright -56 +KPX afii10017 afii10021 33 +KPX afii10017 afii10025 -11 +KPX afii10017 afii10029 22 +KPX afii10017 afii10032 -22 +KPX afii10017 afii10033 -11 +KPX afii10017 afii10035 -22 +KPX afii10017 afii10036 -78 +KPX afii10017 afii10037 -44 +KPX afii10017 afii10038 -33 +KPX afii10017 afii10041 -78 +KPX afii10017 afii10047 -22 +KPX afii10017 afii10065 11 +KPX afii10017 afii10084 -22 +KPX afii10017 afii10085 -11 +KPX afii10017 afii10086 11 +KPX afii10017 afii10095 22 +KPX afii10018 afii10017 -22 +KPX afii10018 afii10025 -11 +KPX afii10018 afii10032 -11 +KPX afii10018 afii10035 -11 +KPX afii10018 afii10036 -45 +KPX afii10018 afii10037 -23 +KPX afii10018 afii10038 -11 +KPX afii10018 afii10039 -22 +KPX afii10018 afii10041 -45 +KPX afii10018 afii10044 -33 +KPX afii10018 afii10047 -11 +KPX afii10018 afii10049 -11 +KPX afii10018 afii10077 -11 +KPX afii10018 afii10085 -22 +KPX afii10019 afii10017 -33 +KPX afii10019 afii10021 -22 +KPX afii10019 afii10024 -22 +KPX afii10019 afii10025 -33 +KPX afii10019 afii10029 -11 +KPX afii10019 afii10032 -33 +KPX afii10019 afii10035 -33 +KPX afii10019 afii10036 -67 +KPX afii10019 afii10037 -33 +KPX afii10019 afii10038 -33 +KPX afii10019 afii10039 -44 +KPX afii10019 afii10041 -45 +KPX afii10019 afii10044 -56 +KPX afii10019 afii10049 -33 +KPX afii10019 afii10069 -11 +KPX afii10019 afii10078 -11 +KPX afii10019 afii10084 -33 +KPX afii10019 afii10085 -11 +KPX afii10019 afii10087 -11 +KPX afii10019 afii10089 -33 +KPX afii10019 afii10097 -11 +KPX afii10020 comma -122 +KPX afii10020 period -122 +KPX afii10020 guillemotleft -67 +KPX afii10020 guillemotright -67 +KPX afii10020 emdash -22 +KPX afii10020 afii10017 -67 +KPX afii10020 afii10021 -67 +KPX afii10020 afii10025 -22 +KPX afii10020 afii10029 -56 +KPX afii10020 afii10030 -23 +KPX afii10020 afii10032 -56 +KPX afii10020 afii10035 -45 +KPX afii10020 afii10049 -33 +KPX afii10020 afii10065 -56 +KPX afii10020 afii10067 -56 +KPX afii10020 afii10069 -67 +KPX afii10020 afii10070 -67 +KPX afii10020 afii10074 -56 +KPX afii10020 afii10077 -56 +KPX afii10020 afii10078 -56 +KPX afii10020 afii10079 -56 +KPX afii10020 afii10080 -67 +KPX afii10020 afii10082 -56 +KPX afii10020 afii10085 -67 +KPX afii10020 afii10093 -56 +KPX afii10020 afii10094 -56 +KPX afii10020 afii10096 -56 +KPX afii10020 afii10097 -67 +KPX afii10021 afii10037 11 +KPX afii10021 afii10038 -22 +KPX afii10021 afii10041 -34 +KPX afii10021 afii10073 33 +KPX afii10021 afii10080 11 +KPX afii10021 afii10085 22 +KPX afii10022 afii10025 -22 +KPX afii10022 afii10083 -11 +KPX afii10024 afii10025 -11 +KPX afii10024 afii10032 -22 +KPX afii10024 afii10035 -11 +KPX afii10024 afii10036 11 +KPX afii10024 afii10037 22 +KPX afii10024 afii10044 22 +KPX afii10024 afii10065 11 +KPX afii10024 afii10070 -12 +KPX afii10024 afii10080 -11 +KPX afii10024 afii10085 -11 +KPX afii10025 afii10029 -11 +KPX afii10025 afii10032 -11 +KPX afii10025 afii10035 -11 +KPX afii10025 afii10036 -22 +KPX afii10025 afii10037 -11 +KPX afii10025 afii10038 -11 +KPX afii10025 afii10041 -22 +KPX afii10025 afii10049 -11 +KPX afii10028 afii10025 -11 +KPX afii10028 afii10032 -11 +KPX afii10028 afii10035 -11 +KPX afii10028 afii10037 11 +KPX afii10028 afii10038 -34 +KPX afii10029 afii10038 -11 +KPX afii10029 afii10066 11 +KPX afii10029 afii10085 11 +KPX afii10030 afii10038 -11 +KPX afii10030 afii10041 -11 +KPX afii10030 afii10065 11 +KPX afii10030 afii10070 11 +KPX afii10030 afii10080 11 +KPX afii10030 afii10083 11 +KPX afii10030 afii10085 11 +KPX afii10030 afii10089 -11 +KPX afii10030 afii10095 11 +KPX afii10032 afii10017 -22 +KPX afii10032 afii10021 -22 +KPX afii10032 afii10024 -22 +KPX afii10032 afii10029 -11 +KPX afii10032 afii10037 -22 +KPX afii10032 afii10039 -45 +KPX afii10032 afii10041 -22 +KPX afii10032 afii10049 -22 +KPX afii10032 afii10069 -22 +KPX afii10032 afii10077 -11 +KPX afii10032 afii10087 -11 +KPX afii10034 comma -189 +KPX afii10034 period -189 +KPX afii10034 colon -22 +KPX afii10034 semicolon -22 +KPX afii10034 guillemotright -56 +KPX afii10034 afii10017 -67 +KPX afii10034 afii10021 -67 +KPX afii10034 afii10024 -11 +KPX afii10034 afii10025 -22 +KPX afii10034 afii10029 -56 +KPX afii10034 afii10030 -11 +KPX afii10034 afii10032 -22 +KPX afii10034 afii10035 -11 +KPX afii10034 afii10036 -45 +KPX afii10034 afii10037 -22 +KPX afii10034 afii10038 -11 +KPX afii10034 afii10039 -45 +KPX afii10034 afii10049 -22 +KPX afii10034 afii10065 -33 +KPX afii10034 afii10069 -78 +KPX afii10034 afii10070 -44 +KPX afii10034 afii10080 -44 +KPX afii10034 afii10095 -22 +KPX afii10034 afii10097 -33 +KPX afii10035 afii10017 -22 +KPX afii10035 afii10021 -22 +KPX afii10035 afii10025 -11 +KPX afii10035 afii10029 -33 +KPX afii10035 afii10030 -11 +KPX afii10035 afii10032 -22 +KPX afii10035 afii10036 -33 +KPX afii10035 afii10037 -33 +KPX afii10035 afii10039 -56 +KPX afii10035 afii10041 -33 +KPX afii10035 afii10044 -34 +KPX afii10035 afii10047 -11 +KPX afii10035 afii10065 11 +KPX afii10035 afii10072 22 +KPX afii10035 afii10089 -11 +KPX afii10036 comma -111 +KPX afii10036 period -111 +KPX afii10036 guillemotleft -44 +KPX afii10036 guillemotright -44 +KPX afii10036 emdash -22 +KPX afii10036 afii10017 -33 +KPX afii10036 afii10021 -33 +KPX afii10036 afii10024 11 +KPX afii10036 afii10025 -11 +KPX afii10036 afii10029 -22 +KPX afii10036 afii10032 -45 +KPX afii10036 afii10038 -33 +KPX afii10036 afii10049 -22 +KPX afii10036 afii10065 -45 +KPX afii10036 afii10067 -44 +KPX afii10036 afii10070 -56 +KPX afii10036 afii10074 -44 +KPX afii10036 afii10076 -44 +KPX afii10036 afii10077 -45 +KPX afii10036 afii10078 -44 +KPX afii10036 afii10080 -78 +KPX afii10036 afii10081 -44 +KPX afii10036 afii10082 -56 +KPX afii10036 afii10083 -56 +KPX afii10036 afii10085 -56 +KPX afii10036 afii10087 -44 +KPX afii10036 afii10091 -44 +KPX afii10036 afii10093 -44 +KPX afii10036 afii10094 -44 +KPX afii10036 afii10096 -44 +KPX afii10036 afii10097 -56 +KPX afii10037 comma -133 +KPX afii10037 period -133 +KPX afii10037 colon -22 +KPX afii10037 semicolon -22 +KPX afii10037 guillemotleft -44 +KPX afii10037 guillemotright -45 +KPX afii10037 emdash -11 +KPX afii10037 afii10017 -67 +KPX afii10037 afii10021 -45 +KPX afii10037 afii10025 -22 +KPX afii10037 afii10029 -33 +KPX afii10037 afii10032 -33 +KPX afii10037 afii10038 -33 +KPX afii10037 afii10047 -22 +KPX afii10037 afii10049 -22 +KPX afii10037 afii10066 -22 +KPX afii10037 afii10067 -56 +KPX afii10037 afii10068 -45 +KPX afii10037 afii10069 -78 +KPX afii10037 afii10070 -67 +KPX afii10037 afii10072 -33 +KPX afii10037 afii10073 -56 +KPX afii10037 afii10074 -45 +KPX afii10037 afii10075 -33 +KPX afii10037 afii10076 -45 +KPX afii10037 afii10077 -67 +KPX afii10037 afii10078 -45 +KPX afii10037 afii10079 -45 +KPX afii10037 afii10080 -67 +KPX afii10037 afii10081 -45 +KPX afii10037 afii10082 -45 +KPX afii10037 afii10083 -67 +KPX afii10037 afii10087 -45 +KPX afii10037 afii10088 -45 +KPX afii10037 afii10090 -45 +KPX afii10037 afii10091 -45 +KPX afii10037 afii10096 -45 +KPX afii10037 afii10097 -67 +KPX afii10038 afii10017 -22 +KPX afii10038 afii10021 -33 +KPX afii10038 afii10029 -33 +KPX afii10038 afii10036 -56 +KPX afii10038 afii10037 -45 +KPX afii10038 afii10041 -22 +KPX afii10038 afii10049 -34 +KPX afii10038 afii10077 -33 +KPX afii10039 afii10025 -22 +KPX afii10039 afii10032 -33 +KPX afii10039 afii10035 -33 +KPX afii10039 afii10038 -33 +KPX afii10039 afii10047 -34 +KPX afii10039 afii10080 -11 +KPX afii10039 afii10085 -22 +KPX afii10040 afii10032 -22 +KPX afii10040 afii10065 22 +KPX afii10043 afii10065 11 +KPX afii10043 afii10085 22 +KPX afii10044 quoteright -67 +KPX afii10044 afii10049 -33 +KPX afii10046 quoteright -78 +KPX afii10046 afii10017 -22 +KPX afii10046 afii10021 -22 +KPX afii10046 afii10024 -33 +KPX afii10046 afii10025 -11 +KPX afii10046 afii10029 -34 +KPX afii10046 afii10030 -22 +KPX afii10046 afii10032 -22 +KPX afii10046 afii10035 -22 +KPX afii10046 afii10036 -100 +KPX afii10046 afii10039 -45 +KPX afii10046 afii10041 -78 +KPX afii10046 afii10047 -11 +KPX afii10046 afii10049 -45 +KPX afii10047 afii10021 -33 +KPX afii10047 afii10024 -12 +KPX afii10047 afii10025 -11 +KPX afii10047 afii10029 -33 +KPX afii10047 afii10039 -34 +KPX afii10047 afii10049 -22 +KPX afii10047 afii10069 -33 +KPX afii10047 afii10072 11 +KPX afii10047 afii10077 -33 +KPX afii10047 afii10078 -11 +KPX afii10047 afii10097 -11 +KPX afii10048 afii10017 -33 +KPX afii10048 afii10021 -44 +KPX afii10048 afii10024 -22 +KPX afii10048 afii10029 -45 +KPX afii10048 afii10032 -11 +KPX afii10048 afii10035 -11 +KPX afii10048 afii10036 -56 +KPX afii10048 afii10039 -45 +KPX afii10048 afii10041 -33 +KPX afii10048 afii10069 -45 +KPX afii10048 afii10077 -45 +KPX afii10048 afii10078 -11 +KPX afii10065 afii10073 -11 +KPX afii10065 afii10084 -22 +KPX afii10065 afii10085 -11 +KPX afii10065 afii10089 -22 +KPX afii10066 afii10065 -23 +KPX afii10066 afii10069 -45 +KPX afii10066 afii10070 -11 +KPX afii10066 afii10072 -11 +KPX afii10066 afii10073 -22 +KPX afii10066 afii10077 -45 +KPX afii10066 afii10078 -22 +KPX afii10066 afii10083 -11 +KPX afii10066 afii10085 -22 +KPX afii10066 afii10086 -11 +KPX afii10066 afii10087 -33 +KPX afii10066 afii10089 -33 +KPX afii10066 afii10092 -33 +KPX afii10066 afii10095 -11 +KPX afii10066 afii10097 -22 +KPX afii10067 afii10065 -11 +KPX afii10067 afii10066 -11 +KPX afii10067 afii10069 -11 +KPX afii10067 afii10070 -11 +KPX afii10067 afii10072 -11 +KPX afii10067 afii10073 -11 +KPX afii10067 afii10077 -23 +KPX afii10067 afii10078 -11 +KPX afii10067 afii10080 -11 +KPX afii10067 afii10083 -11 +KPX afii10067 afii10084 -22 +KPX afii10067 afii10085 -22 +KPX afii10067 afii10086 -11 +KPX afii10067 afii10089 -45 +KPX afii10067 afii10092 -33 +KPX afii10067 afii10097 -11 +KPX afii10068 comma -122 +KPX afii10068 period -122 +KPX afii10068 afii10065 -22 +KPX afii10068 afii10069 -45 +KPX afii10068 afii10070 -22 +KPX afii10068 afii10073 -11 +KPX afii10068 afii10077 -22 +KPX afii10068 afii10080 -22 +KPX afii10068 afii10083 -22 +KPX afii10068 afii10097 -11 +KPX afii10069 afii10092 -22 +KPX afii10069 afii10095 11 +KPX afii10070 afii10066 -11 +KPX afii10070 afii10069 -22 +KPX afii10070 afii10072 -11 +KPX afii10070 afii10073 -22 +KPX afii10070 afii10077 -33 +KPX afii10070 afii10084 -33 +KPX afii10070 afii10085 -11 +KPX afii10070 afii10087 -22 +KPX afii10070 afii10089 -33 +KPX afii10072 afii10066 11 +KPX afii10072 afii10085 11 +KPX afii10072 afii10089 -11 +KPX afii10072 afii10092 22 +KPX afii10073 afii10066 -11 +KPX afii10073 afii10069 -22 +KPX afii10073 afii10070 -11 +KPX afii10073 afii10073 -11 +KPX afii10073 afii10077 -11 +KPX afii10073 afii10080 -11 +KPX afii10073 afii10083 -11 +KPX afii10073 afii10085 -11 +KPX afii10073 afii10086 -11 +KPX afii10073 afii10089 -33 +KPX afii10073 afii10092 -22 +KPX afii10076 afii10065 22 +KPX afii10076 afii10066 22 +KPX afii10076 afii10070 11 +KPX afii10076 afii10073 11 +KPX afii10076 afii10077 11 +KPX afii10076 afii10080 11 +KPX afii10076 afii10083 11 +KPX afii10076 afii10084 11 +KPX afii10076 afii10085 11 +KPX afii10076 afii10095 11 +KPX afii10077 afii10080 11 +KPX afii10077 afii10089 -22 +KPX afii10078 afii10066 -11 +KPX afii10078 afii10073 -11 +KPX afii10078 afii10085 11 +KPX afii10080 afii10069 -22 +KPX afii10080 afii10072 -11 +KPX afii10080 afii10073 -11 +KPX afii10080 afii10077 -22 +KPX afii10080 afii10084 -22 +KPX afii10080 afii10085 -11 +KPX afii10080 afii10087 -11 +KPX afii10080 afii10089 -22 +KPX afii10082 afii10069 -23 +KPX afii10082 afii10073 -11 +KPX afii10082 afii10077 -34 +KPX afii10082 afii10084 -22 +KPX afii10082 afii10085 -11 +KPX afii10082 afii10087 -11 +KPX afii10082 afii10089 -22 +KPX afii10082 afii10097 -11 +KPX afii10083 afii10072 11 +KPX afii10083 afii10080 11 +KPX afii10083 afii10089 -11 +KPX afii10083 afii10095 11 +KPX afii10084 comma -111 +KPX afii10084 period -111 +KPX afii10084 afii10065 -11 +KPX afii10084 afii10069 -33 +KPX afii10084 afii10070 -11 +KPX afii10084 afii10072 33 +KPX afii10084 afii10077 -22 +KPX afii10084 afii10080 -11 +KPX afii10084 afii10083 -11 +KPX afii10084 afii10085 11 +KPX afii10085 comma -100 +KPX afii10085 period -100 +KPX afii10085 guillemotright 11 +KPX afii10085 afii10065 -11 +KPX afii10085 afii10066 11 +KPX afii10085 afii10069 -33 +KPX afii10085 afii10070 -11 +KPX afii10085 afii10072 11 +KPX afii10085 afii10077 -22 +KPX afii10085 afii10078 -11 +KPX afii10085 afii10080 -12 +KPX afii10085 afii10082 -11 +KPX afii10085 afii10083 -11 +KPX afii10085 afii10086 -11 +KPX afii10085 afii10095 -11 +KPX afii10085 afii10097 -11 +KPX afii10086 afii10066 -11 +KPX afii10086 afii10069 -22 +KPX afii10086 afii10077 -22 +KPX afii10086 afii10084 -22 +KPX afii10086 afii10085 -11 +KPX afii10086 afii10089 -22 +KPX afii10086 afii10097 -11 +KPX afii10087 afii10065 -11 +KPX afii10087 afii10066 -11 +KPX afii10087 afii10070 -11 +KPX afii10087 afii10073 -11 +KPX afii10087 afii10080 -11 +KPX afii10087 afii10083 -11 +KPX afii10087 afii10084 -11 +KPX afii10087 afii10086 -11 +KPX afii10087 afii10089 -22 +KPX afii10088 afii10070 -11 +KPX afii10088 afii10073 -11 +KPX afii10088 afii10080 -11 +KPX afii10088 afii10083 -11 +KPX afii10091 afii10070 -11 +KPX afii10091 afii10080 -11 +KPX afii10091 afii10085 11 +KPX afii10094 afii10084 -78 +KPX afii10094 afii10089 -67 +KPX afii10095 afii10069 -22 +KPX afii10095 afii10070 11 +KPX afii10095 afii10073 -11 +KPX afii10095 afii10077 -22 +KPX afii10095 afii10080 11 +KPX afii10095 afii10084 -22 +KPX afii10095 afii10087 -11 +KPX afii10095 afii10097 -11 +KPX afii10096 afii10069 -22 +KPX afii10096 afii10072 -11 +KPX afii10096 afii10077 -22 +KPX afii10096 afii10078 -11 +KPX afii10096 afii10084 -22 +KPX afii10096 afii10087 -11 +KPX afii10096 afii10089 -22 +KPX afii10110 comma -100 +KPX afii10110 period -100 +KPX afii10050 comma -122 +KPX afii10050 period -122 +KPX afii10050 colon -22 +KPX afii10050 semicolon -22 +KPX afii10050 guillemotleft -78 +KPX afii10050 guillemotright -78 +KPX afii10050 emdash -22 +KPX pi alpha -14 +KPX pi sigma -14 +KPX pi phi -14 +KPX pi alphatonos -14 +KPX pi zeta -14 +KPX pi omicron -14 +KPX pi sigma1 -14 +KPX pi omega -14 +KPX pi omegatonos -14 +EndKernPairs +EndKernData +EndFontMetrics diff --git a/gulliver/thirdparty/html2ps_pdf/fonts/arial.ttf b/thirdparty/html2ps_pdf/fonts/arial.ttf similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/fonts/arial.ttf rename to thirdparty/html2ps_pdf/fonts/arial.ttf diff --git a/gulliver/thirdparty/html2ps_pdf/fonts/arialbd.afm b/thirdparty/html2ps_pdf/fonts/arialbd.afm similarity index 97% rename from gulliver/thirdparty/html2ps_pdf/fonts/arialbd.afm rename to thirdparty/html2ps_pdf/fonts/arialbd.afm index 91d8b492f..0f5c9f234 100644 --- a/gulliver/thirdparty/html2ps_pdf/fonts/arialbd.afm +++ b/thirdparty/html2ps_pdf/fonts/arialbd.afm @@ -1,2640 +1,2640 @@ -StartFontMetrics 4.1 -FontName Arial-BoldMT -FullName Arial Bold -Notice Typeface The Monotype Corporation plc. Data The Monotype Corporation plc/Type Solutions Inc. 1990-1992. All Rights Reserved -EncodingScheme FontSpecific -FamilyName Arial -Weight Bold -Version Version 3.00 -Characters 1674 -ItalicAngle 0.0 -Ascender 905 -Descender -212 -UnderlineThickness 105 -UnderlinePosition -106 -IsFixedPitch false -FontBBox -627 -376 2000 1010 -StartCharMetrics 1709 -C 0 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 1 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 2 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 3 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 4 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 5 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 6 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 7 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 8 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 9 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 10 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 11 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 12 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 13 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 14 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 15 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 16 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 17 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 18 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 19 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 20 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 21 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 22 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 23 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 24 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 25 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 26 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 27 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 28 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 29 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 30 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 31 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 32 ; WX 278 ; N space ; B 90 0 238 716 ; -C 33 ; WX 333 ; N exclam ; B 90 0 238 716 ; -C 34 ; WX 474 ; N quotedbl ; B 55 461 424 716 ; -C 35 ; WX 556 ; N numbersign ; B 9 -12 544 728 ; -C 36 ; WX 556 ; N dollar ; B 34 -100 512 773 ; -C 37 ; WX 889 ; N percent ; B 43 -29 842 728 ; -C 38 ; WX 722 ; N ampersand ; B 44 -19 706 728 ; -C 39 ; WX 238 ; N quotesingle ; B 45 461 194 716 ; -C 40 ; WX 333 ; N parenleft ; B 52 -210 301 728 ; -C 41 ; WX 333 ; N parenright ; B 33 -210 281 728 ; -C 42 ; WX 389 ; N asterisk ; B 14 387 368 728 ; -C 43 ; WX 584 ; N plus ; B 42 103 542 604 ; -C 44 ; WX 278 ; N comma ; B 57 -160 206 137 ; -C 45 ; WX 333 ; N hyphen ; B 32 191 301 328 ; -C 46 ; WX 278 ; N period ; B 72 0 209 137 ; -C 47 ; WX 278 ; N slash ; B -1 -12 279 728 ; -C 48 ; WX 556 ; N zero ; B 42 -12 507 719 ; -C 49 ; WX 556 ; N one ; B 79 0 394 719 ; -C 50 ; WX 556 ; N two ; B 25 0 506 719 ; -C 51 ; WX 556 ; N three ; B 38 -12 513 719 ; -C 52 ; WX 556 ; N four ; B 19 0 533 719 ; -C 53 ; WX 556 ; N five ; B 44 -12 526 706 ; -C 54 ; WX 556 ; N six ; B 42 -12 521 719 ; -C 55 ; WX 556 ; N seven ; B 42 0 512 706 ; -C 56 ; WX 556 ; N eight ; B 41 -13 511 719 ; -C 57 ; WX 556 ; N nine ; B 32 -13 510 719 ; -C 58 ; WX 333 ; N colon ; B 98 0 235 519 ; -C 59 ; WX 333 ; N semicolon ; B 83 -160 231 519 ; -C 60 ; WX 584 ; N less ; B 46 82 537 625 ; -C 61 ; WX 584 ; N equal ; B 42 182 542 524 ; -C 62 ; WX 584 ; N greater ; B 46 81 538 625 ; -C 63 ; WX 611 ; N question ; B 52 0 565 723 ; -C 64 ; WX 975 ; N at ; B 30 -210 972 729 ; -C 65 ; WX 722 ; N A ; B 0 0 718 716 ; -C 66 ; WX 722 ; N B ; B 73 0 673 716 ; -C 67 ; WX 722 ; N C ; B 47 -12 671 728 ; -C 68 ; WX 722 ; N D ; B 72 0 672 716 ; -C 69 ; WX 667 ; N E ; B 73 0 617 716 ; -C 70 ; WX 611 ; N F ; B 74 0 564 716 ; -C 71 ; WX 778 ; N G ; B 48 -12 717 728 ; -C 72 ; WX 722 ; N H ; B 73 0 646 716 ; -C 73 ; WX 278 ; N I ; B 68 0 213 716 ; -C 74 ; WX 556 ; N J ; B 17 -12 475 716 ; -C 75 ; WX 722 ; N K ; B 75 0 720 716 ; -C 76 ; WX 611 ; N L ; B 77 0 581 710 ; -C 77 ; WX 833 ; N M ; B 71 0 762 716 ; -C 78 ; WX 722 ; N N ; B 74 0 642 716 ; -C 79 ; WX 778 ; N O ; B 43 -12 738 728 ; -C 80 ; WX 667 ; N P ; B 73 0 621 716 ; -C 81 ; WX 778 ; N Q ; B 43 -72 765 728 ; -C 82 ; WX 722 ; N R ; B 73 0 717 716 ; -C 83 ; WX 667 ; N S ; B 36 -13 618 728 ; -C 84 ; WX 611 ; N T ; B 21 0 590 716 ; -C 85 ; WX 722 ; N U ; B 72 -12 643 716 ; -C 86 ; WX 667 ; N V ; B 0 0 666 716 ; -C 87 ; WX 944 ; N W ; B 3 0 943 716 ; -C 88 ; WX 667 ; N X ; B 0 0 666 716 ; -C 89 ; WX 667 ; N Y ; B -1 0 668 716 ; -C 90 ; WX 611 ; N Z ; B 11 0 592 716 ; -C 91 ; WX 333 ; N bracketleft ; B 71 -202 314 716 ; -C 92 ; WX 278 ; N backslash ; B -1 -12 279 728 ; -C 93 ; WX 333 ; N bracketright ; B 19 -202 262 716 ; -C 94 ; WX 584 ; N asciicircum ; B 56 338 527 728 ; -C 95 ; WX 556 ; N underscore ; B -9 -198 561 -109 ; -C 96 ; WX 333 ; N grave ; B 21 582 242 728 ; -C 97 ; WX 556 ; N a ; B 36 -12 522 530 ; -C 98 ; WX 611 ; N b ; B 66 -12 572 716 ; -C 99 ; WX 556 ; N c ; B 42 -12 531 530 ; -C 100 ; WX 611 ; N d ; B 41 -12 547 716 ; -C 101 ; WX 556 ; N e ; B 32 -12 519 530 ; -C 102 ; WX 333 ; N f ; B 12 0 362 728 ; -C 103 ; WX 611 ; N g ; B 41 -210 547 530 ; -C 104 ; WX 611 ; N h ; B 71 0 543 716 ; -C 105 ; WX 278 ; N i ; B 72 0 209 716 ; -C 106 ; WX 278 ; N j ; B -46 -210 206 716 ; -C 107 ; WX 556 ; N k ; B 67 0 546 716 ; -C 108 ; WX 278 ; N l ; B 72 0 209 716 ; -C 109 ; WX 889 ; N m ; B 62 0 824 530 ; -C 110 ; WX 611 ; N n ; B 71 0 543 530 ; -C 111 ; WX 611 ; N o ; B 40 -12 575 530 ; -C 112 ; WX 611 ; N p ; B 68 -197 574 530 ; -C 113 ; WX 611 ; N q ; B 44 -197 548 530 ; -C 114 ; WX 389 ; N r ; B 66 0 402 530 ; -C 115 ; WX 556 ; N s ; B 23 -12 508 530 ; -C 116 ; WX 333 ; N t ; B 15 -12 321 702 ; -C 117 ; WX 611 ; N u ; B 69 -12 541 519 ; -C 118 ; WX 556 ; N v ; B 5 0 544 519 ; -C 119 ; WX 778 ; N w ; B 4 0 777 519 ; -C 120 ; WX 556 ; N x ; B 6 0 547 519 ; -C 121 ; WX 556 ; N y ; B 7 -210 540 519 ; -C 122 ; WX 500 ; N z ; B 17 0 479 519 ; -C 123 ; WX 389 ; N braceleft ; B 29 -210 363 728 ; -C 124 ; WX 280 ; N bar ; B 86 -210 195 728 ; -C 125 ; WX 389 ; N braceright ; B 22 -210 356 728 ; -C 126 ; WX 584 ; N asciitilde ; B 33 253 551 451 ; -C 127 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 128 ; WX 556 ; N Euro ; B -16 -12 525 728 ; -C 129 ; WX 567 ; N afii10052 ; B 75 0 579 903 ; -C 130 ; WX 278 ; N quotesinglbase ; B 57 -160 206 137 ; -C 131 ; WX 556 ; N florin ; B -10 -210 558 728 ; -C 132 ; WX 500 ; N quotedblbase ; B 51 -160 430 137 ; -C 133 ; WX 1000 ; N ellipsis ; B 98 0 902 137 ; -C 134 ; WX 556 ; N dagger ; B 33 -171 517 707 ; -C 135 ; WX 556 ; N daggerdbl ; B 33 -171 517 707 ; -C 136 ; WX 333 ; N circumflex ; B 1 584 332 728 ; -C 137 ; WX 1000 ; N perthousand ; B 0 -29 1000 728 ; -C 138 ; WX 667 ; N Scaron ; B 36 -13 618 904 ; -C 139 ; WX 333 ; N guilsinglleft ; B 37 34 299 480 ; -C 140 ; WX 1000 ; N OE ; B 35 -12 969 728 ; -C 141 ; WX 610 ; N afii10061 ; B 75 0 602 903 ; -C 142 ; WX 611 ; N Zcaron ; B 11 0 592 904 ; -C 143 ; WX 719 ; N afii10145 ; B 75 -197 644 716 ; -C 144 ; WX 500 ; N quotedblbase ; B 51 -160 430 137 ; -C 145 ; WX 278 ; N quoteleft ; B 74 426 223 723 ; -C 146 ; WX 278 ; N quoteright ; B 57 417 206 714 ; -C 147 ; WX 500 ; N quotedblleft ; B 64 426 442 723 ; -C 148 ; WX 500 ; N quotedblright ; B 51 418 430 716 ; -C 149 ; WX 350 ; N bullet ; B 32 209 321 498 ; -C 150 ; WX 556 ; N endash ; B -2 208 554 311 ; -C 151 ; WX 1000 ; N emdash ; B 0 208 1000 311 ; -C 152 ; WX 333 ; N tilde ; B -6 588 332 713 ; -C 153 ; WX 1000 ; N trademark ; B 105 316 877 716 ; -C 154 ; WX 556 ; N scaron ; B 23 -12 508 728 ; -C 155 ; WX 333 ; N guilsinglright ; B 37 34 299 480 ; -C 156 ; WX 944 ; N oe ; B 43 -12 903 530 ; -C 157 ; WX 500 ; N afii10109 ; B 66 0 501 728 ; -C 158 ; WX 500 ; N zcaron ; B 17 0 479 728 ; -C 159 ; WX 667 ; N Ydieresis ; B -1 0 668 875 ; -C 160 ; WX 278 ; N space ; B 90 0 238 716 ; -C 161 ; WX 333 ; N exclamdown ; B 95 -199 244 519 ; -C 162 ; WX 556 ; N cent ; B 41 -197 530 711 ; -C 163 ; WX 556 ; N sterling ; B 6 -12 541 728 ; -C 164 ; WX 556 ; N currency ; B 22 101 531 610 ; -C 165 ; WX 556 ; N yen ; B 0 0 551 716 ; -C 166 ; WX 280 ; N brokenbar ; B 86 -210 195 728 ; -C 167 ; WX 556 ; N section ; B 29 -210 521 728 ; -C 168 ; WX 333 ; N dieresis ; B 2 610 331 728 ; -C 169 ; WX 737 ; N copyright ; B -4 -18 744 730 ; -C 170 ; WX 370 ; N ordfeminine ; B 18 363 346 728 ; -C 171 ; WX 556 ; N guillemotleft ; B 47 34 500 480 ; -C 172 ; WX 584 ; N logicalnot ; B 42 184 542 524 ; -C 173 ; WX 333 ; N hyphen ; B 32 191 301 328 ; -C 174 ; WX 737 ; N registered ; B -4 -18 744 730 ; -C 175 ; WX 552 ; N overscore ; B -9 758 561 847 ; -C 176 ; WX 400 ; N degree ; B 42 417 354 728 ; -C 177 ; WX 549 ; N plusminus ; B 24 0 525 674 ; -C 178 ; WX 333 ; N twosuperior ; B 12 355 309 725 ; -C 179 ; WX 333 ; N threesuperior ; B 20 349 313 725 ; -C 180 ; WX 333 ; N acute ; B 91 582 313 728 ; -C 181 ; WX 576 ; N mu1 ; B 54 -199 526 519 ; -C 182 ; WX 556 ; N paragraph ; B -1 -197 551 716 ; -C 183 ; WX 278 ; N periodcentered ; B 72 280 209 417 ; -C 184 ; WX 333 ; N cedilla ; B 19 -205 285 -6 ; -C 185 ; WX 333 ; N onesuperior ; B 44 355 242 725 ; -C 186 ; WX 365 ; N ordmasculine ; B 13 361 352 728 ; -C 187 ; WX 556 ; N guillemotright ; B 52 34 505 480 ; -C 188 ; WX 834 ; N onequarter ; B 45 -26 824 725 ; -C 189 ; WX 834 ; N onehalf ; B 45 -26 809 725 ; -C 190 ; WX 834 ; N threequarters ; B 20 -26 824 725 ; -C 191 ; WX 611 ; N questiondown ; B 49 -205 563 519 ; -C 192 ; WX 722 ; N Agrave ; B 0 0 718 903 ; -C 193 ; WX 722 ; N Aacute ; B 0 0 718 903 ; -C 194 ; WX 722 ; N Acircumflex ; B 0 0 718 901 ; -C 195 ; WX 722 ; N Atilde ; B 0 0 718 880 ; -C 196 ; WX 722 ; N Adieresis ; B 0 0 718 875 ; -C 197 ; WX 722 ; N Aring ; B 0 0 718 858 ; -C 198 ; WX 1000 ; N AE ; B -42 0 952 716 ; -C 199 ; WX 722 ; N Ccedilla ; B 47 -205 671 728 ; -C 200 ; WX 667 ; N Egrave ; B 73 0 617 903 ; -C 201 ; WX 667 ; N Eacute ; B 73 0 617 903 ; -C 202 ; WX 667 ; N Ecircumflex ; B 73 0 617 901 ; -C 203 ; WX 667 ; N Edieresis ; B 73 0 617 875 ; -C 204 ; WX 278 ; N Igrave ; B -5 0 216 903 ; -C 205 ; WX 278 ; N Iacute ; B 52 0 273 903 ; -C 206 ; WX 278 ; N Icircumflex ; B -21 0 310 901 ; -C 207 ; WX 278 ; N Idieresis ; B -22 0 306 875 ; -C 208 ; WX 722 ; N Eth ; B -1 0 673 716 ; -C 209 ; WX 722 ; N Ntilde ; B 74 0 642 880 ; -C 210 ; WX 778 ; N Ograve ; B 43 -12 738 903 ; -C 211 ; WX 778 ; N Oacute ; B 43 -12 738 903 ; -C 212 ; WX 778 ; N Ocircumflex ; B 43 -12 738 901 ; -C 213 ; WX 778 ; N Otilde ; B 43 -12 738 880 ; -C 214 ; WX 778 ; N Odieresis ; B 43 -12 738 875 ; -C 215 ; WX 584 ; N multiply ; B 53 115 530 591 ; -C 216 ; WX 778 ; N Oslash ; B 31 -40 750 750 ; -C 217 ; WX 722 ; N Ugrave ; B 72 -12 643 903 ; -C 218 ; WX 722 ; N Uacute ; B 72 -12 643 903 ; -C 219 ; WX 722 ; N Ucircumflex ; B 72 -12 643 901 ; -C 220 ; WX 722 ; N Udieresis ; B 72 -12 643 875 ; -C 221 ; WX 667 ; N Yacute ; B -1 0 668 903 ; -C 222 ; WX 667 ; N Thorn ; B 73 0 621 716 ; -C 223 ; WX 611 ; N germandbls ; B 68 -12 576 728 ; -C 224 ; WX 556 ; N agrave ; B 36 -12 522 728 ; -C 225 ; WX 556 ; N aacute ; B 36 -12 522 728 ; -C 226 ; WX 556 ; N acircumflex ; B 36 -12 522 728 ; -C 227 ; WX 556 ; N atilde ; B 36 -12 522 713 ; -C 228 ; WX 556 ; N adieresis ; B 36 -12 522 728 ; -C 229 ; WX 556 ; N aring ; B 36 -12 522 751 ; -C 230 ; WX 889 ; N ae ; B 43 -12 842 530 ; -C 231 ; WX 556 ; N ccedilla ; B 42 -205 531 530 ; -C 232 ; WX 556 ; N egrave ; B 32 -12 519 728 ; -C 233 ; WX 556 ; N eacute ; B 32 -12 519 728 ; -C 234 ; WX 556 ; N ecircumflex ; B 32 -12 519 728 ; -C 235 ; WX 556 ; N edieresis ; B 32 -12 519 728 ; -C 236 ; WX 278 ; N igrave ; B -11 0 210 728 ; -C 237 ; WX 278 ; N iacute ; B 62 0 283 728 ; -C 238 ; WX 278 ; N icircumflex ; B -25 0 306 728 ; -C 239 ; WX 278 ; N idieresis ; B -23 0 305 728 ; -C 240 ; WX 611 ; N eth ; B 41 -12 574 716 ; -C 241 ; WX 611 ; N ntilde ; B 71 0 543 713 ; -C 242 ; WX 611 ; N ograve ; B 40 -12 575 728 ; -C 243 ; WX 611 ; N oacute ; B 40 -12 575 728 ; -C 244 ; WX 611 ; N ocircumflex ; B 40 -12 575 728 ; -C 245 ; WX 611 ; N otilde ; B 40 -12 575 713 ; -C 246 ; WX 611 ; N odieresis ; B 40 -12 575 728 ; -C 247 ; WX 549 ; N divide ; B 24 90 524 616 ; -C 248 ; WX 611 ; N oslash ; B 42 -36 578 546 ; -C 249 ; WX 611 ; N ugrave ; B 69 -12 541 728 ; -C 250 ; WX 611 ; N uacute ; B 69 -12 541 728 ; -C 251 ; WX 611 ; N ucircumflex ; B 69 -12 541 728 ; -C 252 ; WX 611 ; N udieresis ; B 69 -12 541 728 ; -C 253 ; WX 556 ; N yacute ; B 7 -210 540 728 ; -C 254 ; WX 611 ; N thorn ; B 68 -197 574 716 ; -C 255 ; WX 556 ; N ydieresis ; B 7 -210 540 728 ; -C -1 ; WX 0 ; N .null ; B 90 0 238 716 ; -C -1 ; WX 278 ; N nonmarkingreturn ; B 90 0 238 716 ; -C -1 ; WX 549 ; N notequal ; B 24 -12 524 719 ; -C -1 ; WX 713 ; N infinity ; B 74 182 640 523 ; -C -1 ; WX 549 ; N lessequal ; B 29 0 520 708 ; -C -1 ; WX 549 ; N greaterequal ; B 29 0 520 708 ; -C -1 ; WX 494 ; N partialdiff ; B 20 -12 475 728 ; -C -1 ; WX 713 ; N summation ; B 60 -210 677 728 ; -C -1 ; WX 823 ; N product ; B 79 -210 744 728 ; -C -1 ; WX 549 ; N pi1 ; B 0 0 549 519 ; -C -1 ; WX 274 ; N integral ; B 0 -107 273 910 ; -C -1 ; WX 768 ; N Ohm ; B 27 0 747 734 ; -C -1 ; WX 549 ; N radical ; B 42 -38 550 913 ; -C -1 ; WX 549 ; N approxequal ; B 15 135 534 569 ; -C -1 ; WX 612 ; N increment ; B 14 0 600 677 ; -C -1 ; WX 494 ; N lozenge ; B 23 0 472 694 ; -C -1 ; WX 167 ; N fraction ; B -167 -26 334 725 ; -C -1 ; WX 611 ; N fi ; B 15 0 538 728 ; -C -1 ; WX 611 ; N fl ; B 15 0 538 728 ; -C -1 ; WX 278 ; N dotlessi ; B 72 0 209 519 ; -C -1 ; WX 333 ; N macron ; B 9 604 324 694 ; -C -1 ; WX 333 ; N breve ; B 13 586 317 728 ; -C -1 ; WX 333 ; N dotaccent ; B 100 598 235 728 ; -C -1 ; WX 333 ; N ring ; B 71 560 262 751 ; -C -1 ; WX 333 ; N hungarumlaut ; B 47 584 439 730 ; -C -1 ; WX 333 ; N ogonek ; B 78 -210 295 13 ; -C -1 ; WX 333 ; N caron ; B 1 584 332 728 ; -C -1 ; WX 611 ; N Lslash ; B 5 0 584 716 ; -C -1 ; WX 278 ; N lslash ; B 5 0 276 716 ; -C -1 ; WX 584 ; N minus ; B 42 289 542 417 ; -C -1 ; WX 556 ; N franc ; B 0 0 506 716 ; -C -1 ; WX 778 ; N Gbreve ; B 48 -12 717 896 ; -C -1 ; WX 611 ; N gbreve ; B 41 -210 547 728 ; -C -1 ; WX 278 ; N Idot ; B 68 0 213 887 ; -C -1 ; WX 667 ; N Scedilla ; B 36 -205 618 728 ; -C -1 ; WX 556 ; N scedilla ; B 23 -205 508 530 ; -C -1 ; WX 722 ; N Cacute ; B 47 -12 671 903 ; -C -1 ; WX 556 ; N cacute ; B 42 -12 531 728 ; -C -1 ; WX 722 ; N Ccaron ; B 47 -12 671 904 ; -C -1 ; WX 556 ; N ccaron ; B 42 -12 531 728 ; -C -1 ; WX 611 ; N dmacron ; B 41 -12 602 716 ; -C -1 ; WX 333 ; N middot ; B 239 280 376 417 ; -C -1 ; WX 722 ; N Abreve ; B 0 0 718 896 ; -C -1 ; WX 556 ; N abreve ; B 36 -12 522 728 ; -C -1 ; WX 722 ; N Aogonek ; B 0 -210 764 716 ; -C -1 ; WX 556 ; N aogonek ; B 36 -210 591 530 ; -C -1 ; WX 722 ; N Dcaron ; B 72 0 672 904 ; -C -1 ; WX 719 ; N dcaron ; B 40 -12 719 716 ; -C -1 ; WX 722 ; N Dslash ; B -1 0 673 716 ; -C -1 ; WX 667 ; N Eogonek ; B 73 -210 617 716 ; -C -1 ; WX 556 ; N eogonek ; B 32 -210 519 530 ; -C -1 ; WX 667 ; N Ecaron ; B 73 0 617 904 ; -C -1 ; WX 556 ; N ecaron ; B 32 -12 519 728 ; -C -1 ; WX 611 ; N Lacute ; B 77 0 581 903 ; -C -1 ; WX 278 ; N lacute ; B 59 0 280 898 ; -C -1 ; WX 611 ; N Lcaron ; B 77 0 581 710 ; -C -1 ; WX 385 ; N lcaron ; B 73 0 383 716 ; -C -1 ; WX 611 ; N Ldot ; B 77 0 581 710 ; -C -1 ; WX 479 ; N ldot ; B 72 0 409 716 ; -C -1 ; WX 722 ; N Nacute ; B 74 0 642 903 ; -C -1 ; WX 611 ; N nacute ; B 71 0 543 728 ; -C -1 ; WX 722 ; N Ncaron ; B 74 0 642 904 ; -C -1 ; WX 611 ; N ncaron ; B 71 0 543 728 ; -C -1 ; WX 778 ; N Odblacute ; B 43 -12 738 902 ; -C -1 ; WX 611 ; N odblacute ; B 40 -12 575 730 ; -C -1 ; WX 722 ; N Racute ; B 73 0 717 903 ; -C -1 ; WX 389 ; N racute ; B 66 0 402 728 ; -C -1 ; WX 722 ; N Rcaron ; B 73 0 717 904 ; -C -1 ; WX 389 ; N rcaron ; B 39 0 402 728 ; -C -1 ; WX 667 ; N Sacute ; B 36 -13 618 903 ; -C -1 ; WX 556 ; N sacute ; B 23 -12 508 728 ; -C -1 ; WX 611 ; N Tcedilla ; B 21 -319 590 716 ; -C -1 ; WX 333 ; N tcedilla ; B 15 -293 321 702 ; -C -1 ; WX 611 ; N Tcaron ; B 21 0 590 904 ; -C -1 ; WX 479 ; N tcaron ; B 15 -12 480 716 ; -C -1 ; WX 722 ; N Uring ; B 72 -12 643 919 ; -C -1 ; WX 611 ; N uring ; B 69 -12 541 751 ; -C -1 ; WX 722 ; N Udblacute ; B 72 -12 643 902 ; -C -1 ; WX 611 ; N udblacute ; B 69 -12 548 730 ; -C -1 ; WX 611 ; N Zacute ; B 11 0 592 903 ; -C -1 ; WX 500 ; N zacute ; B 17 0 479 728 ; -C -1 ; WX 611 ; N Zdot ; B 11 0 592 890 ; -C -1 ; WX 500 ; N zdot ; B 17 0 479 728 ; -C -1 ; WX 601 ; N Gamma ; B 75 0 579 716 ; -C -1 ; WX 778 ; N Theta ; B 42 -12 736 728 ; -C -1 ; WX 821 ; N Phi ; B 42 -29 779 734 ; -C -1 ; WX 615 ; N alpha ; B 38 -12 582 530 ; -C -1 ; WX 606 ; N delta ; B 38 -12 569 716 ; -C -1 ; WX 475 ; N epsilon ; B 38 -12 463 530 ; -C -1 ; WX 684 ; N sigma ; B 38 -12 661 530 ; -C -1 ; WX 446 ; N tau ; B 23 0 422 519 ; -C -1 ; WX 715 ; N phi ; B 38 -197 678 531 ; -C -1 ; WX 552 ; N underscoredbl ; B -9 -376 561 -109 ; -C -1 ; WX 604 ; N exclamdbl ; B 90 0 509 716 ; -C -1 ; WX 396 ; N nsuperior ; B 39 253 357 585 ; -C -1 ; WX 1094 ; N peseta ; B 20 -13 1075 716 ; -C -1 ; WX 1000 ; N arrowleft ; B 39 77 961 428 ; -C -1 ; WX 500 ; N arrowup ; B 75 -209 426 654 ; -C -1 ; WX 1000 ; N arrowright ; B 39 77 961 428 ; -C -1 ; WX 500 ; N arrowdown ; B 75 -209 426 654 ; -C -1 ; WX 1000 ; N arrowboth ; B 39 77 961 429 ; -C -1 ; WX 500 ; N arrowupdn ; B 74 -208 425 714 ; -C -1 ; WX 500 ; N arrowupdnbse ; B 74 -303 425 714 ; -C -1 ; WX 979 ; N orthogonal ; B 177 0 802 625 ; -C -1 ; WX 722 ; N intersection ; B 70 0 648 719 ; -C -1 ; WX 583 ; N equivalence ; B 42 73 542 633 ; -C -1 ; WX 604 ; N house ; B 77 0 527 563 ; -C -1 ; WX 584 ; N revlogicalnot ; B 42 184 542 524 ; -C -1 ; WX 604 ; N integraltp ; B 267 -251 477 848 ; -C -1 ; WX 604 ; N integralbt ; B 127 -251 337 848 ; -C -1 ; WX 708 ; N SF100000 ; B -11 261 719 346 ; -C -1 ; WX 625 ; N SF110000 ; B 223 -303 309 910 ; -C -1 ; WX 708 ; N SF010000 ; B 312 -303 720 346 ; -C -1 ; WX 708 ; N SF030000 ; B -11 -303 396 346 ; -C -1 ; WX 708 ; N SF020000 ; B 312 261 720 910 ; -C -1 ; WX 708 ; N SF040000 ; B -11 261 396 910 ; -C -1 ; WX 708 ; N SF080000 ; B 312 -303 720 910 ; -C -1 ; WX 708 ; N SF090000 ; B -11 -303 396 910 ; -C -1 ; WX 708 ; N SF060000 ; B -11 -303 719 346 ; -C -1 ; WX 708 ; N SF070000 ; B -11 261 719 910 ; -C -1 ; WX 708 ; N SF050000 ; B -11 -303 719 910 ; -C -1 ; WX 708 ; N SF430000 ; B -11 168 719 439 ; -C -1 ; WX 708 ; N SF240000 ; B 219 -303 490 910 ; -C -1 ; WX 708 ; N SF510000 ; B 312 -303 720 439 ; -C -1 ; WX 708 ; N SF520000 ; B 219 -303 720 346 ; -C -1 ; WX 708 ; N SF390000 ; B 219 -303 719 439 ; -C -1 ; WX 708 ; N SF220000 ; B -11 -303 396 439 ; -C -1 ; WX 708 ; N SF210000 ; B -11 -303 489 346 ; -C -1 ; WX 708 ; N SF250000 ; B -11 -303 489 439 ; -C -1 ; WX 708 ; N SF500000 ; B 312 168 720 910 ; -C -1 ; WX 708 ; N SF490000 ; B 219 261 720 910 ; -C -1 ; WX 708 ; N SF380000 ; B 219 168 719 910 ; -C -1 ; WX 708 ; N SF280000 ; B -11 168 396 910 ; -C -1 ; WX 708 ; N SF270000 ; B -11 261 489 910 ; -C -1 ; WX 708 ; N SF260000 ; B -11 168 489 910 ; -C -1 ; WX 708 ; N SF360000 ; B 312 -303 720 910 ; -C -1 ; WX 708 ; N SF370000 ; B 219 -303 720 910 ; -C -1 ; WX 708 ; N SF420000 ; B 219 -303 720 910 ; -C -1 ; WX 708 ; N SF190000 ; B -11 -303 396 910 ; -C -1 ; WX 708 ; N SF200000 ; B -11 -303 489 910 ; -C -1 ; WX 708 ; N SF230000 ; B -11 -303 489 910 ; -C -1 ; WX 708 ; N SF470000 ; B -11 -303 719 439 ; -C -1 ; WX 708 ; N SF480000 ; B -11 -303 719 346 ; -C -1 ; WX 708 ; N SF410000 ; B -11 -303 719 439 ; -C -1 ; WX 708 ; N SF450000 ; B -11 168 719 910 ; -C -1 ; WX 708 ; N SF460000 ; B -11 261 719 910 ; -C -1 ; WX 708 ; N SF400000 ; B -11 168 719 910 ; -C -1 ; WX 708 ; N SF540000 ; B -11 -303 719 910 ; -C -1 ; WX 708 ; N SF530000 ; B -11 -303 719 910 ; -C -1 ; WX 708 ; N SF440000 ; B -11 -303 719 910 ; -C -1 ; WX 708 ; N upblock ; B -11 303 719 910 ; -C -1 ; WX 708 ; N dnblock ; B -11 -303 719 303 ; -C -1 ; WX 708 ; N block ; B -11 -303 719 910 ; -C -1 ; WX 708 ; N lfblock ; B -11 -303 354 910 ; -C -1 ; WX 708 ; N rtblock ; B 354 -303 720 910 ; -C -1 ; WX 708 ; N ltshade ; B 50 -246 719 910 ; -C -1 ; WX 708 ; N shade ; B -11 -246 719 910 ; -C -1 ; WX 729 ; N dkshade ; B 0 -307 729 910 ; -C -1 ; WX 604 ; N filledbox ; B 71 0 532 461 ; -C -1 ; WX 1000 ; N filledrect ; B 0 155 1000 343 ; -C -1 ; WX 990 ; N triagup ; B 148 0 842 693 ; -C -1 ; WX 990 ; N triagrt ; B 141 -15 849 692 ; -C -1 ; WX 990 ; N triagdn ; B 148 -15 842 678 ; -C -1 ; WX 990 ; N triaglf ; B 141 -15 849 692 ; -C -1 ; WX 604 ; N circle ; B 87 67 517 497 ; -C -1 ; WX 604 ; N invbullet ; B 63 0 541 479 ; -C -1 ; WX 604 ; N invcircle ; B 21 0 584 564 ; -C -1 ; WX 1021 ; N smileface ; B 199 -58 822 564 ; -C -1 ; WX 1052 ; N invsmileface ; B 215 -58 837 564 ; -C -1 ; WX 917 ; N sun ; B 8 -109 909 792 ; -C -1 ; WX 750 ; N female ; B 119 -214 630 736 ; -C -1 ; WX 750 ; N male ; B 54 -128 691 791 ; -C -1 ; WX 531 ; N spade ; B 28 0 503 601 ; -C -1 ; WX 656 ; N club ; B 27 0 629 601 ; -C -1 ; WX 594 ; N heart ; B 31 -12 563 601 ; -C -1 ; WX 510 ; N diamond ; B 31 -12 479 601 ; -C -1 ; WX 500 ; N musicalnote ; B 18 -18 482 666 ; -C -1 ; WX 750 ; N musicalnotedbl ; B 42 -63 649 742 ; -C -1 ; WX 785 ; N IJ ; B 68 -12 708 716 ; -C -1 ; WX 556 ; N ij ; B 72 -210 478 716 ; -C -1 ; WX 708 ; N napostrophe ; B -28 0 635 716 ; -C -1 ; WX 240 ; N minute ; B 69 461 247 716 ; -C -1 ; WX 479 ; N second ; B 69 461 467 716 ; -C -1 ; WX 885 ; N afii61248 ; B 17 -27 868 728 ; -C -1 ; WX 489 ; N afii61289 ; B 12 -12 453 728 ; -C -1 ; WX 604 ; N H22073 ; B 71 0 532 461 ; -C -1 ; WX 354 ; N H18543 ; B 45 198 310 463 ; -C -1 ; WX 354 ; N H18551 ; B 45 198 310 463 ; -C -1 ; WX 604 ; N H18533 ; B 87 67 517 497 ; -C -1 ; WX 354 ; N openbullet ; B 38 190 316 470 ; -C -1 ; WX 722 ; N Amacron ; B 0 0 718 871 ; -C -1 ; WX 556 ; N amacron ; B 36 -12 522 694 ; -C -1 ; WX 722 ; N Ccircumflex ; B 47 -12 671 924 ; -C -1 ; WX 556 ; N ccircumflex ; B 42 -12 531 728 ; -C -1 ; WX 722 ; N Cdot ; B 47 -12 671 910 ; -C -1 ; WX 556 ; N cdot ; B 42 -12 531 728 ; -C -1 ; WX 667 ; N Emacron ; B 73 0 617 871 ; -C -1 ; WX 556 ; N emacron ; B 32 -12 519 694 ; -C -1 ; WX 667 ; N Ebreve ; B 73 0 617 918 ; -C -1 ; WX 556 ; N ebreve ; B 32 -12 519 728 ; -C -1 ; WX 667 ; N Edot ; B 73 0 617 910 ; -C -1 ; WX 556 ; N edot ; B 32 -12 519 728 ; -C -1 ; WX 778 ; N Gcircumflex ; B 48 -12 717 924 ; -C -1 ; WX 611 ; N gcircumflex ; B 41 -210 547 728 ; -C -1 ; WX 778 ; N Gdot ; B 48 -12 717 910 ; -C -1 ; WX 611 ; N gdot ; B 41 -210 547 728 ; -C -1 ; WX 778 ; N Gcedilla ; B 48 -205 717 728 ; -C -1 ; WX 611 ; N gcedilla ; B 41 -210 547 801 ; -C -1 ; WX 722 ; N Hcircumflex ; B 73 0 646 924 ; -C -1 ; WX 611 ; N hcircumflex ; B 71 0 543 901 ; -C -1 ; WX 722 ; N Hbar ; B 2 0 716 716 ; -C -1 ; WX 611 ; N hbar ; B 12 0 544 716 ; -C -1 ; WX 278 ; N Itilde ; B -34 0 304 904 ; -C -1 ; WX 278 ; N itilde ; B -34 0 304 713 ; -C -1 ; WX 278 ; N Imacron ; B -19 0 296 871 ; -C -1 ; WX 278 ; N imacron ; B -19 0 296 694 ; -C -1 ; WX 278 ; N Ibreve ; B -15 0 290 918 ; -C -1 ; WX 278 ; N ibreve ; B -15 0 290 728 ; -C -1 ; WX 278 ; N Iogonek ; B 54 -210 271 716 ; -C -1 ; WX 278 ; N iogonek ; B 57 -210 274 716 ; -C -1 ; WX 556 ; N Jcircumflex ; B 17 -12 568 924 ; -C -1 ; WX 278 ; N jcircumflex ; B -46 -210 304 728 ; -C -1 ; WX 722 ; N Kcedilla ; B 75 -206 720 716 ; -C -1 ; WX 556 ; N kcedilla ; B 67 -206 546 716 ; -C -1 ; WX 556 ; N kgreenlandic ; B 69 0 548 519 ; -C -1 ; WX 611 ; N Lcedilla ; B 77 -206 581 710 ; -C -1 ; WX 278 ; N lcedilla ; B -9 -206 257 716 ; -C -1 ; WX 722 ; N Ncedilla ; B 74 -206 642 716 ; -C -1 ; WX 611 ; N ncedilla ; B 71 -206 543 530 ; -C -1 ; WX 723 ; N Eng ; B 76 -13 676 728 ; -C -1 ; WX 611 ; N eng ; B 69 -213 542 530 ; -C -1 ; WX 778 ; N Omacron ; B 43 -12 738 871 ; -C -1 ; WX 611 ; N omacron ; B 40 -12 575 694 ; -C -1 ; WX 778 ; N Obreve ; B 43 -12 738 918 ; -C -1 ; WX 611 ; N obreve ; B 40 -12 575 728 ; -C -1 ; WX 722 ; N Rcedilla ; B 73 -206 717 716 ; -C -1 ; WX 389 ; N rcedilla ; B 21 -206 402 530 ; -C -1 ; WX 667 ; N Scircumflex ; B 36 -13 618 924 ; -C -1 ; WX 556 ; N scircumflex ; B 23 -12 508 728 ; -C -1 ; WX 611 ; N Tbar ; B 21 0 590 716 ; -C -1 ; WX 333 ; N tbar ; B 10 -12 321 702 ; -C -1 ; WX 722 ; N Utilde ; B 72 -12 643 904 ; -C -1 ; WX 611 ; N utilde ; B 69 -12 541 713 ; -C -1 ; WX 722 ; N Umacron ; B 72 -12 643 871 ; -C -1 ; WX 611 ; N umacron ; B 69 -12 541 694 ; -C -1 ; WX 722 ; N Ubreve ; B 72 -12 643 918 ; -C -1 ; WX 611 ; N ubreve ; B 69 -12 541 728 ; -C -1 ; WX 722 ; N Uogonek ; B 72 -210 643 716 ; -C -1 ; WX 611 ; N uogonek ; B 69 -211 616 519 ; -C -1 ; WX 944 ; N Wcircumflex ; B 3 0 943 924 ; -C -1 ; WX 778 ; N wcircumflex ; B 4 0 777 728 ; -C -1 ; WX 667 ; N Ycircumflex ; B -1 0 668 924 ; -C -1 ; WX 556 ; N ycircumflex ; B 7 -210 540 728 ; -C -1 ; WX 278 ; N longs ; B 69 0 343 728 ; -C -1 ; WX 722 ; N Aringacute ; B 0 0 718 1004 ; -C -1 ; WX 556 ; N aringacute ; B 36 -12 522 926 ; -C -1 ; WX 1000 ; N AEacute ; B -42 0 952 926 ; -C -1 ; WX 889 ; N aeacute ; B 43 -12 842 728 ; -C -1 ; WX 778 ; N Oslashacute ; B 31 -40 750 926 ; -C -1 ; WX 611 ; N oslashacute ; B 42 -36 578 728 ; -C -1 ; WX 333 ; N anoteleia ; B 98 381 235 519 ; -C -1 ; WX 944 ; N Wgrave ; B 3 0 943 926 ; -C -1 ; WX 778 ; N wgrave ; B 4 0 777 728 ; -C -1 ; WX 944 ; N Wacute ; B 3 0 943 926 ; -C -1 ; WX 778 ; N wacute ; B 4 0 777 728 ; -C -1 ; WX 944 ; N Wdieresis ; B 3 0 943 898 ; -C -1 ; WX 778 ; N wdieresis ; B 4 0 777 728 ; -C -1 ; WX 667 ; N Ygrave ; B -1 0 668 926 ; -C -1 ; WX 556 ; N ygrave ; B 7 -210 540 728 ; -C -1 ; WX 278 ; N quotereversed ; B 73 418 221 716 ; -C -1 ; WX 333 ; N radicalex ; B -20 604 354 694 ; -C -1 ; WX 556 ; N afii08941 ; B 6 -12 541 728 ; -C -1 ; WX 600 ; N estimated ; B 44 -17 561 535 ; -C -1 ; WX 834 ; N oneeighth ; B 45 -26 812 725 ; -C -1 ; WX 834 ; N threeeighths ; B 20 -26 812 725 ; -C -1 ; WX 834 ; N fiveeighths ; B 23 -26 812 725 ; -C -1 ; WX 834 ; N seveneighths ; B 23 -26 812 725 ; -C -1 ; WX 333 ; N commaaccent ; B 92 -276 239 -55 ; -C -1 ; WX 333 ; N undercommaaccent ; B 19 -206 285 -10 ; -C -1 ; WX 333 ; N tonos ; B 91 582 313 728 ; -C -1 ; WX 465 ; N dieresistonos ; B -6 582 471 728 ; -C -1 ; WX 722 ; N Alphatonos ; B -12 0 721 716 ; -C -1 ; WX 853 ; N Epsilontonos ; B -34 0 803 716 ; -C -1 ; WX 906 ; N Etatonos ; B -34 0 831 716 ; -C -1 ; WX 474 ; N Iotatonos ; B -34 0 403 716 ; -C -1 ; WX 825 ; N Omicrontonos ; B -44 -12 783 728 ; -C -1 ; WX 927 ; N Upsilontonos ; B -27 0 928 716 ; -C -1 ; WX 838 ; N Omegatonos ; B -49 0 791 728 ; -C -1 ; WX 278 ; N iotadieresistonos ; B -105 0 372 728 ; -C -1 ; WX 722 ; N Alpha ; B 0 0 718 716 ; -C -1 ; WX 722 ; N Beta ; B 73 0 673 716 ; -C -1 ; WX 719 ; N Delta ; B 0 0 718 716 ; -C -1 ; WX 667 ; N Epsilon ; B 73 0 617 716 ; -C -1 ; WX 611 ; N Zeta ; B 11 0 592 716 ; -C -1 ; WX 722 ; N Eta ; B 73 0 646 716 ; -C -1 ; WX 278 ; N Iota ; B 68 0 213 716 ; -C -1 ; WX 722 ; N Kappa ; B 75 0 720 716 ; -C -1 ; WX 667 ; N Lambda ; B 0 0 667 716 ; -C -1 ; WX 833 ; N Mu ; B 71 0 762 716 ; -C -1 ; WX 722 ; N Nu ; B 74 0 642 716 ; -C -1 ; WX 644 ; N Xi ; B 50 0 594 716 ; -C -1 ; WX 778 ; N Omicron ; B 43 -12 738 728 ; -C -1 ; WX 722 ; N Pi ; B 75 0 647 716 ; -C -1 ; WX 667 ; N Rho ; B 73 0 621 716 ; -C -1 ; WX 600 ; N Sigma ; B 44 0 564 716 ; -C -1 ; WX 611 ; N Tau ; B 21 0 590 716 ; -C -1 ; WX 667 ; N Upsilon ; B -1 0 668 716 ; -C -1 ; WX 667 ; N Chi ; B 0 0 666 716 ; -C -1 ; WX 809 ; N Psi ; B 42 0 767 716 ; -C -1 ; WX 802 ; N Omega ; B 48 0 754 728 ; -C -1 ; WX 278 ; N Iotadieresis ; B -25 0 303 882 ; -C -1 ; WX 667 ; N Upsilondieresis ; B -1 0 668 882 ; -C -1 ; WX 615 ; N alphatonos ; B 38 -12 582 728 ; -C -1 ; WX 451 ; N epsilontonos ; B 38 -12 463 728 ; -C -1 ; WX 611 ; N etatonos ; B 69 -197 542 728 ; -C -1 ; WX 278 ; N iotatonos ; B 63 0 285 728 ; -C -1 ; WX 582 ; N upsilondieresistonos ; B 53 -12 529 728 ; -C -1 ; WX 610 ; N beta ; B 70 -197 573 728 ; -C -1 ; WX 556 ; N gamma ; B 7 -197 546 519 ; -C -1 ; WX 460 ; N zeta ; B 38 -210 452 716 ; -C -1 ; WX 611 ; N eta ; B 69 -197 542 530 ; -C -1 ; WX 541 ; N theta ; B 38 -12 503 728 ; -C -1 ; WX 278 ; N iota ; B 70 0 208 519 ; -C -1 ; WX 558 ; N kappa ; B 69 0 550 519 ; -C -1 ; WX 556 ; N lambda ; B 7 0 546 716 ; -C -1 ; WX 612 ; N mu ; B 70 -197 542 519 ; -C -1 ; WX 556 ; N nu ; B 5 0 544 519 ; -C -1 ; WX 445 ; N xi ; B 38 -210 445 728 ; -C -1 ; WX 611 ; N omicron ; B 40 -12 575 530 ; -C -1 ; WX 619 ; N rho ; B 58 -197 581 530 ; -C -1 ; WX 520 ; N sigma1 ; B 38 -210 503 530 ; -C -1 ; WX 582 ; N upsilon ; B 58 -12 524 519 ; -C -1 ; WX 576 ; N chi ; B 8 -197 569 519 ; -C -1 ; WX 753 ; N psi ; B 58 -197 695 519 ; -C -1 ; WX 845 ; N omega ; B 38 -12 807 519 ; -C -1 ; WX 278 ; N iotadieresis ; B -25 0 303 728 ; -C -1 ; WX 582 ; N upsilondieresis ; B 58 -12 524 728 ; -C -1 ; WX 611 ; N omicrontonos ; B 40 -12 575 728 ; -C -1 ; WX 582 ; N upsilontonos ; B 58 -12 524 728 ; -C -1 ; WX 845 ; N omegatonos ; B 38 -12 807 728 ; -C -1 ; WX 669 ; N afii10023 ; B 73 0 617 875 ; -C -1 ; WX 885 ; N afii10051 ; B 23 -6 846 716 ; -C -1 ; WX 711 ; N afii10053 ; B 43 -12 669 728 ; -C -1 ; WX 667 ; N afii10054 ; B 36 -13 618 728 ; -C -1 ; WX 278 ; N afii10055 ; B 68 0 213 716 ; -C -1 ; WX 276 ; N afii10056 ; B -26 0 302 875 ; -C -1 ; WX 556 ; N afii10057 ; B 17 -12 475 716 ; -C -1 ; WX 1094 ; N afii10058 ; B 13 -4 1047 716 ; -C -1 ; WX 1063 ; N afii10059 ; B 77 0 1013 716 ; -C -1 ; WX 875 ; N afii10060 ; B 27 0 803 716 ; -C -1 ; WX 622 ; N afii10062 ; B 0 -9 622 897 ; -C -1 ; WX 722 ; N afii10017 ; B 0 0 718 716 ; -C -1 ; WX 719 ; N afii10018 ; B 76 0 674 716 ; -C -1 ; WX 722 ; N afii10019 ; B 73 0 673 716 ; -C -1 ; WX 567 ; N afii10020 ; B 80 0 565 716 ; -C -1 ; WX 712 ; N afii10021 ; B -3 -156 688 716 ; -C -1 ; WX 667 ; N afii10022 ; B 73 0 617 716 ; -C -1 ; WX 904 ; N afii10024 ; B 11 0 893 721 ; -C -1 ; WX 626 ; N afii10025 ; B 21 -12 572 728 ; -C -1 ; WX 719 ; N afii10026 ; B 75 0 644 716 ; -C -1 ; WX 719 ; N afii10027 ; B 75 0 644 894 ; -C -1 ; WX 610 ; N afii10028 ; B 75 0 602 721 ; -C -1 ; WX 702 ; N afii10029 ; B 16 -4 625 716 ; -C -1 ; WX 833 ; N afii10030 ; B 71 0 762 716 ; -C -1 ; WX 722 ; N afii10031 ; B 73 0 646 716 ; -C -1 ; WX 778 ; N afii10032 ; B 43 -12 738 728 ; -C -1 ; WX 719 ; N afii10033 ; B 75 0 644 716 ; -C -1 ; WX 667 ; N afii10034 ; B 73 0 621 716 ; -C -1 ; WX 722 ; N afii10035 ; B 47 -12 671 728 ; -C -1 ; WX 611 ; N afii10036 ; B 21 0 590 716 ; -C -1 ; WX 622 ; N afii10037 ; B 0 -9 622 716 ; -C -1 ; WX 854 ; N afii10038 ; B 43 0 810 715 ; -C -1 ; WX 667 ; N afii10039 ; B 0 0 666 716 ; -C -1 ; WX 730 ; N afii10040 ; B 75 -156 704 716 ; -C -1 ; WX 703 ; N afii10041 ; B 61 0 626 716 ; -C -1 ; WX 1005 ; N afii10042 ; B 75 0 930 716 ; -C -1 ; WX 1019 ; N afii10043 ; B 75 -156 993 716 ; -C -1 ; WX 870 ; N afii10044 ; B 13 0 823 716 ; -C -1 ; WX 979 ; N afii10045 ; B 77 0 902 716 ; -C -1 ; WX 719 ; N afii10046 ; B 76 0 673 716 ; -C -1 ; WX 711 ; N afii10047 ; B 42 -12 668 728 ; -C -1 ; WX 1031 ; N afii10048 ; B 73 -12 984 728 ; -C -1 ; WX 719 ; N afii10049 ; B 2 0 646 716 ; -C -1 ; WX 556 ; N afii10065 ; B 36 -12 522 530 ; -C -1 ; WX 618 ; N afii10066 ; B 45 -12 575 732 ; -C -1 ; WX 615 ; N afii10067 ; B 73 0 576 519 ; -C -1 ; WX 417 ; N afii10068 ; B 66 0 417 519 ; -C -1 ; WX 635 ; N afii10069 ; B -3 -137 612 519 ; -C -1 ; WX 556 ; N afii10070 ; B 32 -12 519 530 ; -C -1 ; WX 709 ; N afii10072 ; B 0 0 710 522 ; -C -1 ; WX 497 ; N afii10073 ; B 12 -12 458 530 ; -C -1 ; WX 615 ; N afii10074 ; B 68 0 546 519 ; -C -1 ; WX 615 ; N afii10075 ; B 68 0 546 729 ; -C -1 ; WX 500 ; N afii10076 ; B 66 0 501 522 ; -C -1 ; WX 635 ; N afii10077 ; B 12 -9 568 519 ; -C -1 ; WX 740 ; N afii10078 ; B 76 0 674 519 ; -C -1 ; WX 604 ; N afii10079 ; B 66 0 538 519 ; -C -1 ; WX 611 ; N afii10080 ; B 40 -12 575 530 ; -C -1 ; WX 604 ; N afii10081 ; B 66 0 527 519 ; -C -1 ; WX 611 ; N afii10082 ; B 68 -197 574 530 ; -C -1 ; WX 556 ; N afii10083 ; B 42 -12 531 530 ; -C -1 ; WX 490 ; N afii10084 ; B 10 0 479 519 ; -C -1 ; WX 556 ; N afii10085 ; B 7 -210 540 519 ; -C -1 ; WX 875 ; N afii10086 ; B 41 -197 834 716 ; -C -1 ; WX 556 ; N afii10087 ; B 6 0 547 519 ; -C -1 ; WX 615 ; N afii10088 ; B 67 -137 591 519 ; -C -1 ; WX 581 ; N afii10089 ; B 56 0 516 519 ; -C -1 ; WX 833 ; N afii10090 ; B 68 0 765 519 ; -C -1 ; WX 844 ; N afii10091 ; B 69 -137 822 519 ; -C -1 ; WX 729 ; N afii10092 ; B 20 0 689 519 ; -C -1 ; WX 854 ; N afii10093 ; B 73 0 789 519 ; -C -1 ; WX 615 ; N afii10094 ; B 75 0 575 519 ; -C -1 ; WX 552 ; N afii10095 ; B 27 -12 512 530 ; -C -1 ; WX 854 ; N afii10096 ; B 71 -12 815 530 ; -C -1 ; WX 583 ; N afii10097 ; B -2 0 516 519 ; -C -1 ; WX 556 ; N afii10071 ; B 32 -12 519 728 ; -C -1 ; WX 611 ; N afii10099 ; B 0 -210 543 716 ; -C -1 ; WX 417 ; N afii10100 ; B 66 0 417 728 ; -C -1 ; WX 552 ; N afii10101 ; B 40 -12 524 530 ; -C -1 ; WX 556 ; N afii10102 ; B 23 -12 508 530 ; -C -1 ; WX 278 ; N afii10103 ; B 72 0 209 716 ; -C -1 ; WX 281 ; N afii10104 ; B -23 0 305 728 ; -C -1 ; WX 278 ; N afii10105 ; B -46 -210 206 716 ; -C -1 ; WX 969 ; N afii10106 ; B 12 -9 931 519 ; -C -1 ; WX 906 ; N afii10107 ; B 68 0 866 519 ; -C -1 ; WX 611 ; N afii10108 ; B 0 0 543 716 ; -C -1 ; WX 556 ; N afii10110 ; B 7 -210 540 729 ; -C -1 ; WX 604 ; N afii10193 ; B 66 -137 537 519 ; -C -1 ; WX 487 ; N afii10050 ; B 73 0 460 872 ; -C -1 ; WX 447 ; N afii10098 ; B 66 0 416 655 ; -C -1 ; WX 1000 ; N afii00208 ; B 32 208 968 311 ; -C -1 ; WX 1115 ; N afii61352 ; B 80 0 1073 716 ; -C -1 ; WX 766 ; N pi ; B 23 0 742 519 ; -C -1 ; WX 333 ; N sheva ; B 125 -210 208 -24 ; -C -1 ; WX 333 ; N hatafsegol ; B 15 -210 318 -24 ; -C -1 ; WX 333 ; N hatafpatah ; B 24 -210 309 -24 ; -C -1 ; WX 333 ; N hatafqamats ; B 24 -210 309 -24 ; -C -1 ; WX 333 ; N hiriq ; B 125 -180 208 -98 ; -C -1 ; WX 333 ; N tsere ; B 62 -180 272 -98 ; -C -1 ; WX 333 ; N segol ; B 62 -210 271 -24 ; -C -1 ; WX 333 ; N patah ; B 68 -154 265 -103 ; -C -1 ; WX 333 ; N qamats ; B 68 -210 265 -77 ; -C -1 ; WX 333 ; N holam ; B 125 577 208 659 ; -C -1 ; WX 333 ; N qubuts ; B 8 -210 325 -25 ; -C -1 ; WX 333 ; N dagesh ; B 125 241 208 323 ; -C -1 ; WX 333 ; N meteg ; B 141 -210 192 -25 ; -C -1 ; WX 447 ; N maqaf ; B 61 408 386 518 ; -C -1 ; WX 333 ; N rafe ; B 68 611 265 662 ; -C -1 ; WX 299 ; N paseq ; B 98 -101 202 620 ; -C -1 ; WX 333 ; N shindot ; B 376 577 458 660 ; -C -1 ; WX 333 ; N sindot ; B -125 577 -42 660 ; -C -1 ; WX 333 ; N sofpasuq ; B 98 0 235 519 ; -C -1 ; WX 583 ; N alef ; B 43 0 570 518 ; -C -1 ; WX 576 ; N bet ; B 32 0 554 524 ; -C -1 ; WX 457 ; N gimel ; B 5 0 425 524 ; -C -1 ; WX 550 ; N dalet ; B 24 0 525 518 ; -C -1 ; WX 614 ; N he ; B 63 0 553 524 ; -C -1 ; WX 273 ; N vav ; B 66 0 207 518 ; -C -1 ; WX 413 ; N zayin ; B 44 0 396 518 ; -C -1 ; WX 616 ; N het ; B 66 0 550 524 ; -C -1 ; WX 626 ; N tet ; B 61 -12 570 530 ; -C -1 ; WX 273 ; N yod ; B 66 229 207 518 ; -C -1 ; WX 521 ; N finalkaf ; B 20 -199 460 524 ; -C -1 ; WX 491 ; N kaf ; B 37 -8 452 526 ; -C -1 ; WX 496 ; N lamed ; B 32 0 445 716 ; -C -1 ; WX 611 ; N finalmem ; B 66 0 550 524 ; -C -1 ; WX 630 ; N mem ; B 27 0 569 524 ; -C -1 ; WX 273 ; N finalnun ; B 66 -199 207 518 ; -C -1 ; WX 386 ; N nun ; B 37 0 325 524 ; -C -1 ; WX 613 ; N samekh ; B 39 -12 574 530 ; -C -1 ; WX 543 ; N ayin ; B 5 -77 492 518 ; -C -1 ; WX 594 ; N finalpe ; B 49 -199 533 524 ; -C -1 ; WX 587 ; N pe ; B 49 -8 548 527 ; -C -1 ; WX 500 ; N finaltsadi ; B 5 -199 458 518 ; -C -1 ; WX 512 ; N tsadi ; B 5 0 463 518 ; -C -1 ; WX 573 ; N qof ; B 63 -199 521 518 ; -C -1 ; WX 521 ; N resh ; B 20 0 460 524 ; -C -1 ; WX 715 ; N shin ; B 44 -14 676 518 ; -C -1 ; WX 673 ; N tav ; B 22 -4 607 524 ; -C -1 ; WX 546 ; N doublevav ; B 66 0 480 518 ; -C -1 ; WX 546 ; N vavyod ; B 66 0 480 518 ; -C -1 ; WX 546 ; N doubleyod ; B 66 229 480 518 ; -C -1 ; WX 276 ; N geresh ; B 39 312 242 518 ; -C -1 ; WX 504 ; N gershayim ; B 39 312 470 518 ; -C -1 ; WX 818 ; N newsheqelsign ; B 66 0 752 518 ; -C -1 ; WX 273 ; N vavshindot ; B -41 0 207 660 ; -C -1 ; WX 521 ; N finalkafsheva ; B 20 -199 460 524 ; -C -1 ; WX 521 ; N finalkafqamats ; B 20 -199 460 524 ; -C -1 ; WX 496 ; N lamedholam ; B -114 0 445 716 ; -C -1 ; WX 496 ; N lamedholamdagesh ; B -114 0 445 716 ; -C -1 ; WX 559 ; N altayin ; B 24 0 508 518 ; -C -1 ; WX 715 ; N shinshindot ; B 44 -14 676 660 ; -C -1 ; WX 715 ; N shinsindot ; B 44 -14 676 660 ; -C -1 ; WX 715 ; N shindageshshindot ; B 44 -14 676 660 ; -C -1 ; WX 715 ; N shindageshsindot ; B 44 -14 676 660 ; -C -1 ; WX 583 ; N alefpatah ; B 43 -154 570 518 ; -C -1 ; WX 583 ; N alefqamats ; B 43 -210 570 518 ; -C -1 ; WX 583 ; N alefmapiq ; B 43 0 570 518 ; -C -1 ; WX 576 ; N betdagesh ; B 32 0 554 524 ; -C -1 ; WX 454 ; N gimeldagesh ; B 5 0 425 524 ; -C -1 ; WX 550 ; N daletdagesh ; B 24 0 525 518 ; -C -1 ; WX 614 ; N hedagesh ; B 63 0 553 524 ; -C -1 ; WX 323 ; N vavdagesh ; B 0 0 257 518 ; -C -1 ; WX 438 ; N zayindagesh ; B 0 0 412 518 ; -C -1 ; WX 626 ; N tetdagesh ; B 61 -12 570 530 ; -C -1 ; WX 323 ; N yoddagesh ; B 0 229 257 518 ; -C -1 ; WX 521 ; N finalkafdagesh ; B 20 -199 460 524 ; -C -1 ; WX 491 ; N kafdagesh ; B 37 -8 452 526 ; -C -1 ; WX 496 ; N lameddagesh ; B 32 0 445 716 ; -C -1 ; WX 630 ; N memdagesh ; B 27 0 569 524 ; -C -1 ; WX 386 ; N nundagesh ; B 37 0 325 524 ; -C -1 ; WX 613 ; N samekhdagesh ; B 39 -12 574 530 ; -C -1 ; WX 594 ; N finalpedagesh ; B 49 -199 533 524 ; -C -1 ; WX 587 ; N pedagesh ; B 49 -8 548 527 ; -C -1 ; WX 512 ; N tsadidagesh ; B 5 0 463 518 ; -C -1 ; WX 573 ; N qofdagesh ; B 63 -199 521 518 ; -C -1 ; WX 521 ; N reshdagesh ; B 20 0 460 524 ; -C -1 ; WX 715 ; N shindagesh ; B 44 -14 676 518 ; -C -1 ; WX 673 ; N tavdages ; B 22 -4 607 524 ; -C -1 ; WX 273 ; N vavholam ; B 66 0 207 659 ; -C -1 ; WX 576 ; N betrafe ; B 32 0 554 662 ; -C -1 ; WX 491 ; N kafrafe ; B 37 -8 452 662 ; -C -1 ; WX 587 ; N perafe ; B 49 -8 548 662 ; -C -1 ; WX 607 ; N aleflamed ; B 32 0 595 716 ; -C -1 ; WX 0 ; N zerowidthnonjoiner ; B -18 -134 18 629 ; -C -1 ; WX 0 ; N zerowidthjoiner ; B -107 -134 107 690 ; -C -1 ; WX 0 ; N lefttorightmark ; B -18 -134 210 690 ; -C -1 ; WX 0 ; N righttoleftmark ; B -210 -134 17 690 ; -C -1 ; WX 319 ; N afii57388 ; B 83 137 241 443 ; -C -1 ; WX 319 ; N afii57403 ; B 78 136 235 609 ; -C -1 ; WX 356 ; N afii57407 ; B 33 137 326 711 ; -C -1 ; WX 469 ; N afii57409 ; B 62 46 422 510 ; -C -1 ; WX 198 ; N afii57440 ; B -34 143 198 276 ; -C -1 ; WX 201 ; N afii57451 ; B 34 683 201 857 ; -C -1 ; WX 237 ; N afii57452 ; B 34 683 237 872 ; -C -1 ; WX 201 ; N afii57453 ; B 34 -133 201 41 ; -C -1 ; WX 201 ; N afii57454 ; B 34 683 201 784 ; -C -1 ; WX 209 ; N afii57455 ; B 35 683 209 895 ; -C -1 ; WX 201 ; N afii57456 ; B 34 -60 201 41 ; -C -1 ; WX 211 ; N afii57457 ; B 34 683 211 840 ; -C -1 ; WX 165 ; N afii57458 ; B 34 683 165 834 ; -C -1 ; WX 562 ; N afii57392 ; B 191 206 360 457 ; -C -1 ; WX 562 ; N afii57393 ; B 164 146 359 719 ; -C -1 ; WX 562 ; N afii57394 ; B 127 143 419 718 ; -C -1 ; WX 562 ; N afii57395 ; B 77 143 476 713 ; -C -1 ; WX 562 ; N afii57396 ; B 147 145 404 710 ; -C -1 ; WX 562 ; N afii57397 ; B 114 231 448 634 ; -C -1 ; WX 562 ; N afii57398 ; B 104 149 426 718 ; -C -1 ; WX 562 ; N afii57399 ; B 76 143 457 717 ; -C -1 ; WX 562 ; N afii57400 ; B 92 149 473 724 ; -C -1 ; WX 562 ; N afii57401 ; B 116 146 427 719 ; -C -1 ; WX 526 ; N afii57381 ; B 65 84 463 777 ; -C -1 ; WX 319 ; N afii57461 ; B 94 23 230 267 ; -C -1 ; WX 526 ; N afii63167 ; B 87 403 424 744 ; -C -1 ; WX 750 ; N afii57459 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57543 ; B 125 0 625 625 ; -C -1 ; WX 343 ; N afii57534 ; B 43 126 304 519 ; -C -1 ; WX 750 ; N afii57494 ; B 125 0 625 625 ; -C -1 ; WX 562 ; N afii62843 ; B 81 143 471 737 ; -C -1 ; WX 562 ; N afii62844 ; B 92 143 461 719 ; -C -1 ; WX 562 ; N afii62845 ; B 108 143 451 729 ; -C -1 ; WX 750 ; N afii64240 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii64241 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63954 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57382 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii64242 ; B 125 0 625 625 ; -C -1 ; WX 211 ; N afii62881 ; B 34 683 211 995 ; -C -1 ; WX 750 ; N afii57504 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57369 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57370 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57371 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57372 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57373 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57374 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57375 ; B 125 0 625 625 ; -C -1 ; WX 612 ; N afii57391 ; B -34 143 612 276 ; -C -1 ; WX 750 ; N afii57471 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57460 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii52258 ; B 125 0 625 625 ; -C -1 ; WX 649 ; N afii57506 ; B 28 -193 649 489 ; -C -1 ; WX 649 ; N afii62958 ; B 28 -193 649 489 ; -C -1 ; WX 271 ; N afii62956 ; B -34 -193 271 492 ; -C -1 ; WX 271 ; N afii52957 ; B -34 -193 271 492 ; -C -1 ; WX 750 ; N afii57505 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62889 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62887 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62888 ; B 125 0 625 625 ; -C -1 ; WX 577 ; N afii57507 ; B 25 -203 563 527 ; -C -1 ; WX 559 ; N afii62961 ; B 23 -201 563 527 ; -C -1 ; WX 523 ; N afii62959 ; B -34 -193 523 501 ; -C -1 ; WX 523 ; N afii62960 ; B -34 -193 523 501 ; -C -1 ; WX 433 ; N afii57508 ; B 5 -72 447 813 ; -C -1 ; WX 433 ; N afii62962 ; B 5 -72 447 813 ; -C -1 ; WX 757 ; N afii57567 ; B 20 143 757 708 ; -C -1 ; WX 879 ; N afii62964 ; B 20 143 879 722 ; -C -1 ; WX 360 ; N afii52305 ; B -34 143 360 708 ; -C -1 ; WX 542 ; N afii52306 ; B -34 143 542 722 ; -C -1 ; WX 757 ; N afii57509 ; B 20 143 757 863 ; -C -1 ; WX 879 ; N afii62967 ; B 20 143 879 876 ; -C -1 ; WX 360 ; N afii62965 ; B -34 143 360 863 ; -C -1 ; WX 542 ; N afii62966 ; B -34 143 542 876 ; -C -1 ; WX 645 ; N afii57555 ; B 74 -60 575 461 ; -C -1 ; WX 554 ; N afii52364 ; B 5 -174 554 282 ; -C -1 ; WX 750 ; N afii63753 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63754 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63759 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63763 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63795 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62891 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63808 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62938 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63810 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62942 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62947 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63813 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63823 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63824 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63833 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63844 ; B 125 0 625 625 ; -C -1 ; WX 226 ; N afii62882 ; B 23 683 226 1010 ; -C -1 ; WX 211 ; N afii62883 ; B 34 678 211 978 ; -C -1 ; WX 211 ; N afii62884 ; B 34 683 211 918 ; -C -1 ; WX 211 ; N afii62885 ; B 31 683 211 974 ; -C -1 ; WX 211 ; N afii62886 ; B 34 683 211 931 ; -C -1 ; WX 750 ; N afii63846 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63849 ; B 125 0 625 625 ; -C -1 ; WX 0 ; N uni202A ; B -18 -134 210 603 ; -C -1 ; WX 0 ; N uni202B ; B -210 -134 18 603 ; -C -1 ; WX 0 ; N uni202D ; B -114 -134 114 690 ; -C -1 ; WX 0 ; N uni202E ; B -114 -134 114 690 ; -C -1 ; WX 0 ; N uni202C ; B -114 -134 114 690 ; -C -1 ; WX 0 ; N uni206E ; B -114 -134 114 690 ; -C -1 ; WX 0 ; N _b_852 ; B -114 -134 114 690 ; -C -1 ; WX 0 ; N uni206A ; B -114 -134 114 690 ; -C -1 ; WX 0 ; N uni206B ; B -114 -134 114 690 ; -C -1 ; WX 0 ; N _b_855 ; B -114 -134 114 690 ; -C -1 ; WX 0 ; N uni206D ; B -114 -134 114 690 ; -C -1 ; WX 0 ; N uniF00A ; B -18 -208 18 894 ; -C -1 ; WX 0 ; N uniF00B ; B -114 -208 114 894 ; -C -1 ; WX 0 ; N uniF00C ; B -18 -208 109 894 ; -C -1 ; WX 0 ; N uniF00D ; B -109 -208 18 894 ; -C -1 ; WX 0 ; N uniF00E ; B -18 -208 114 894 ; -C -1 ; WX 1000 ; N uniFFFC ; B 0 0 1000 719 ; -C -1 ; WX 750 ; N afii63904 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63905 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63906 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63908 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63910 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63912 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62927 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63941 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62939 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63943 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62943 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62946 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63946 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62951 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63948 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62953 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63950 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63951 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63952 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63953 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63956 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63958 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63959 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63960 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63961 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii64046 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii64058 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii64059 ; B 125 0 625 625 ; -C -1 ; WX 319 ; N afii64060 ; B 62 -209 273 785 ; -C -1 ; WX 319 ; N afii64061 ; B 50 -209 262 785 ; -C -1 ; WX 750 ; N afii62945 ; B 125 0 625 625 ; -C -1 ; WX 703 ; N afii64184 ; B 22 91 661 920 ; -C -1 ; WX 469 ; N afii52399 ; B 62 46 422 510 ; -C -1 ; WX 238 ; N afii52400 ; B 0 109 238 831 ; -C -1 ; WX 253 ; N afii62753 ; B -30 143 253 831 ; -C -1 ; WX 217 ; N afii57411 ; B 46 109 182 876 ; -C -1 ; WX 234 ; N afii62754 ; B -3 143 234 876 ; -C -1 ; WX 451 ; N afii57412 ; B 3 -71 451 661 ; -C -1 ; WX 451 ; N afii62755 ; B 3 -71 451 661 ; -C -1 ; WX 217 ; N afii57413 ; B 46 -88 181 736 ; -C -1 ; WX 234 ; N afii62756 ; B 13 -88 234 736 ; -C -1 ; WX 645 ; N afii57414 ; B 74 -60 575 546 ; -C -1 ; WX 577 ; N afii62759 ; B 8 -98 577 524 ; -C -1 ; WX 271 ; N afii62757 ; B -34 143 271 661 ; -C -1 ; WX 271 ; N afii62758 ; B -34 143 271 661 ; -C -1 ; WX 217 ; N afii57415 ; B 66 109 181 736 ; -C -1 ; WX 234 ; N afii62760 ; B 13 143 234 736 ; -C -1 ; WX 649 ; N afii57416 ; B 28 -69 649 489 ; -C -1 ; WX 649 ; N afii62763 ; B 28 -69 649 489 ; -C -1 ; WX 271 ; N afii62761 ; B -34 -69 271 492 ; -C -1 ; WX 271 ; N afii62762 ; B -34 -69 271 492 ; -C -1 ; WX 343 ; N afii57417 ; B 26 126 304 763 ; -C -1 ; WX 415 ; N afii62764 ; B 1 143 415 873 ; -C -1 ; WX 649 ; N afii57418 ; B 28 143 649 656 ; -C -1 ; WX 649 ; N afii62767 ; B 28 143 649 656 ; -C -1 ; WX 271 ; N afii62765 ; B -34 143 271 715 ; -C -1 ; WX 271 ; N afii62766 ; B -34 143 271 715 ; -C -1 ; WX 649 ; N afii57419 ; B 29 144 649 766 ; -C -1 ; WX 649 ; N afii62770 ; B 29 144 649 766 ; -C -1 ; WX 271 ; N afii62768 ; B -34 143 271 828 ; -C -1 ; WX 271 ; N afii62769 ; B -34 143 271 828 ; -C -1 ; WX 577 ; N afii57420 ; B 25 -203 563 527 ; -C -1 ; WX 559 ; N afii62773 ; B 23 -201 563 527 ; -C -1 ; WX 523 ; N afii62771 ; B -34 -74 523 501 ; -C -1 ; WX 523 ; N afii62772 ; B -34 -74 523 501 ; -C -1 ; WX 577 ; N afii57421 ; B 25 -203 563 527 ; -C -1 ; WX 559 ; N afii62776 ; B 23 -201 563 527 ; -C -1 ; WX 523 ; N afii62774 ; B -34 143 523 501 ; -C -1 ; WX 523 ; N afii62775 ; B -34 143 523 501 ; -C -1 ; WX 577 ; N afii57422 ; B 25 -203 563 746 ; -C -1 ; WX 559 ; N afii62779 ; B 23 -201 563 746 ; -C -1 ; WX 523 ; N afii62777 ; B -34 143 523 724 ; -C -1 ; WX 523 ; N afii62778 ; B -34 143 523 724 ; -C -1 ; WX 343 ; N afii57423 ; B 51 143 343 604 ; -C -1 ; WX 343 ; N afii62780 ; B 51 143 343 604 ; -C -1 ; WX 343 ; N afii57424 ; B 51 143 343 845 ; -C -1 ; WX 343 ; N afii62781 ; B 51 143 343 845 ; -C -1 ; WX 433 ; N afii57425 ; B 5 -72 433 461 ; -C -1 ; WX 433 ; N afii62782 ; B 5 -72 433 461 ; -C -1 ; WX 433 ; N afii57426 ; B 5 -72 433 693 ; -C -1 ; WX 433 ; N afii62783 ; B 5 -72 433 693 ; -C -1 ; WX 899 ; N afii57427 ; B 31 -63 899 458 ; -C -1 ; WX 899 ; N afii62786 ; B 31 -63 899 458 ; -C -1 ; WX 608 ; N afii62784 ; B -34 143 608 446 ; -C -1 ; WX 608 ; N afii62785 ; B -34 143 608 446 ; -C -1 ; WX 899 ; N afii57428 ; B 31 -63 899 774 ; -C -1 ; WX 899 ; N afii62789 ; B 31 -63 899 774 ; -C -1 ; WX 608 ; N afii62787 ; B -34 143 608 774 ; -C -1 ; WX 608 ; N afii62788 ; B -34 143 608 774 ; -C -1 ; WX 1063 ; N afii57429 ; B 31 -63 1063 504 ; -C -1 ; WX 1063 ; N afii62792 ; B 31 -63 1063 504 ; -C -1 ; WX 771 ; N afii62790 ; B -34 143 771 504 ; -C -1 ; WX 771 ; N afii62791 ; B -34 143 771 504 ; -C -1 ; WX 1063 ; N afii57430 ; B 31 -63 1063 728 ; -C -1 ; WX 1063 ; N afii62795 ; B 31 -63 1063 728 ; -C -1 ; WX 771 ; N afii62793 ; B -34 143 771 728 ; -C -1 ; WX 771 ; N afii62794 ; B -34 143 771 728 ; -C -1 ; WX 523 ; N afii57431 ; B -34 143 523 813 ; -C -1 ; WX 523 ; N afii62798 ; B -34 143 523 813 ; -C -1 ; WX 523 ; N afii62796 ; B -34 143 523 813 ; -C -1 ; WX 523 ; N afii62797 ; B -34 143 523 813 ; -C -1 ; WX 523 ; N afii57432 ; B -34 143 523 813 ; -C -1 ; WX 523 ; N afii62801 ; B -34 143 523 813 ; -C -1 ; WX 523 ; N afii62799 ; B -34 143 523 813 ; -C -1 ; WX 523 ; N afii62800 ; B -34 143 523 813 ; -C -1 ; WX 541 ; N afii57433 ; B 25 -204 535 595 ; -C -1 ; WX 469 ; N afii62804 ; B 34 -198 516 531 ; -C -1 ; WX 541 ; N afii62802 ; B -34 143 483 571 ; -C -1 ; WX 360 ; N afii62803 ; B -34 143 360 505 ; -C -1 ; WX 541 ; N afii57434 ; B 25 -204 535 822 ; -C -1 ; WX 469 ; N afii62807 ; B 34 -198 516 760 ; -C -1 ; WX 541 ; N afii62805 ; B -34 143 483 800 ; -C -1 ; WX 360 ; N afii62806 ; B -34 143 360 756 ; -C -1 ; WX 758 ; N afii57441 ; B 23 127 758 779 ; -C -1 ; WX 758 ; N afii62810 ; B 23 127 758 779 ; -C -1 ; WX 305 ; N afii62808 ; B -34 143 305 850 ; -C -1 ; WX 324 ; N afii62809 ; B -34 143 324 779 ; -C -1 ; WX 612 ; N afii57442 ; B 19 -130 612 658 ; -C -1 ; WX 612 ; N afii62813 ; B 19 -130 612 658 ; -C -1 ; WX 305 ; N afii62811 ; B -34 143 305 844 ; -C -1 ; WX 324 ; N afii62812 ; B -34 143 324 780 ; -C -1 ; WX 541 ; N afii57443 ; B 20 143 541 774 ; -C -1 ; WX 541 ; N afii62816 ; B 20 143 541 774 ; -C -1 ; WX 360 ; N afii57410 ; B -34 143 360 708 ; -C -1 ; WX 360 ; N afii62815 ; B -34 143 360 708 ; -C -1 ; WX 451 ; N afii57444 ; B 17 -36 451 773 ; -C -1 ; WX 451 ; N afii62819 ; B 17 -36 451 773 ; -C -1 ; WX 234 ; N afii62817 ; B -34 143 234 774 ; -C -1 ; WX 234 ; N afii62818 ; B -34 143 234 774 ; -C -1 ; WX 360 ; N afii57445 ; B 16 -212 360 431 ; -C -1 ; WX 360 ; N afii62822 ; B 16 -212 360 431 ; -C -1 ; WX 415 ; N afii62820 ; B -34 143 415 472 ; -C -1 ; WX 415 ; N afii62821 ; B -34 143 415 472 ; -C -1 ; WX 541 ; N afii57446 ; B 30 -63 541 612 ; -C -1 ; WX 541 ; N afii62825 ; B 30 -63 541 612 ; -C -1 ; WX 271 ; N afii62823 ; B -34 143 274 735 ; -C -1 ; WX 271 ; N afii62824 ; B -34 143 274 735 ; -C -1 ; WX 343 ; N afii57447 ; B 43 126 304 519 ; -C -1 ; WX 415 ; N afii62828 ; B 1 143 415 694 ; -C -1 ; WX 469 ; N afii57470 ; B -34 117 398 627 ; -C -1 ; WX 451 ; N afii62827 ; B -34 -101 451 560 ; -C -1 ; WX 451 ; N afii57448 ; B 3 -71 451 484 ; -C -1 ; WX 451 ; N afii62829 ; B 3 -71 451 484 ; -C -1 ; WX 645 ; N afii57449 ; B 74 -60 575 461 ; -C -1 ; WX 554 ; N afii62830 ; B 5 -174 554 282 ; -C -1 ; WX 645 ; N afii57450 ; B 74 -194 575 461 ; -C -1 ; WX 577 ; N afii62833 ; B 8 -212 577 319 ; -C -1 ; WX 271 ; N afii62831 ; B -34 -81 271 492 ; -C -1 ; WX 271 ; N afii62832 ; B -34 -81 271 492 ; -C -1 ; WX 541 ; N afii62834 ; B 0 72 525 831 ; -C -1 ; WX 596 ; N afii62835 ; B 0 94 596 831 ; -C -1 ; WX 486 ; N afii62836 ; B 17 72 471 876 ; -C -1 ; WX 541 ; N afii62837 ; B 13 94 541 876 ; -C -1 ; WX 486 ; N afii62838 ; B 17 -120 471 739 ; -C -1 ; WX 541 ; N afii62839 ; B 13 -120 541 766 ; -C -1 ; WX 486 ; N afii62840 ; B 17 72 471 739 ; -C -1 ; WX 541 ; N afii62841 ; B 13 94 541 766 ; -C -1 ; WX 750 ; N glyph1021 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57543-2 ; B 125 0 625 625 ; -C -1 ; WX 201 ; N afii57454-2 ; B 34 683 201 784 ; -C -1 ; WX 201 ; N afii57451-2 ; B 34 683 201 857 ; -C -1 ; WX 750 ; N glyph1025 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1026 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57471-2 ; B 125 0 625 625 ; -C -1 ; WX 165 ; N afii57458-2 ; B 34 683 165 834 ; -C -1 ; WX 211 ; N afii57457-2 ; B 34 683 211 840 ; -C -1 ; WX 750 ; N afii57494-2 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57459-2 ; B 125 0 625 625 ; -C -1 ; WX 209 ; N afii57455-2 ; B 35 683 209 895 ; -C -1 ; WX 237 ; N afii57452-2 ; B 34 683 237 872 ; -C -1 ; WX 750 ; N glyph1034 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1035 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1036 ; B 125 0 625 625 ; -C -1 ; WX 211 ; N afii62884-2 ; B 34 683 211 918 ; -C -1 ; WX 211 ; N afii62881-2 ; B 34 683 211 995 ; -C -1 ; WX 211 ; N afii62886-2 ; B 34 683 211 931 ; -C -1 ; WX 211 ; N afii62883-2 ; B 34 678 211 978 ; -C -1 ; WX 211 ; N afii62885-2 ; B 31 683 211 974 ; -C -1 ; WX 226 ; N afii62882-2 ; B 23 683 226 1010 ; -C -1 ; WX 750 ; N afii57504-2 ; B 125 0 625 625 ; -C -1 ; WX 201 ; N afii57456-2 ; B 34 -60 201 41 ; -C -1 ; WX 201 ; N afii57453-2 ; B 34 -133 201 41 ; -C -1 ; WX 750 ; N glyph1046 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1047 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57543-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57454-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57451-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1051 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1052 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57471-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57458-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57457-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57494-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57459-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57455-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57452-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1060 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1061 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1062 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62884-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62881-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62886-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62883-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62885-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62882-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57504-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57456-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57453-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1072 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1073 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57543-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57454-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57451-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1077 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1078 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57471-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57458-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57457-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57494-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57459-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57455-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57452-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1086 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1087 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1088 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62884-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62881-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62886-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62883-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62885-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62882-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57504-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57456-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57453-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1098 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1099 ; B 125 0 625 625 ; -C -1 ; WX 319 ; N glyph1100 ; B 99 137 223 714 ; -C -1 ; WX 319 ; N glyph1101 ; B 97 137 226 267 ; -C -1 ; WX 319 ; N glyph1102 ; B 97 137 225 542 ; -C -1 ; WX 750 ; N glyph1103 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1104 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1105 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1106 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1107 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1108 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1109 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1110 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1111 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1112 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1113 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1114 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1115 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1116 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1117 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1118 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1119 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1120 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1121 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1122 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1123 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1124 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1125 ; B 125 0 625 625 ; -C -1 ; WX 343 ; N glyph1126 ; B 51 143 343 556 ; -C -1 ; WX 125 ; N afii57440-2 ; B -34 143 125 276 ; -C -1 ; WX 1000 ; N afii57440-3 ; B -34 143 1000 276 ; -C -1 ; WX 2000 ; N afii57440-4 ; B -34 143 2000 276 ; -C -1 ; WX 853 ; N Ohorn ; B 43 -12 853 728 ; -C -1 ; WX 711 ; N ohorn ; B 40 -12 711 530 ; -C -1 ; WX 830 ; N Uhorn ; B 72 -12 830 716 ; -C -1 ; WX 724 ; N uhorn ; B 69 -12 724 519 ; -C -1 ; WX 0 ; N glyph1134 ; B -309 820 -97 900 ; -C -1 ; WX 0 ; N glyph1135 ; B -531 820 -319 900 ; -C -1 ; WX 0 ; N glyph1136 ; B -454 754 -232 892 ; -C -1 ; WX 0 ; N uniF006 ; B -226 820 -13 900 ; -C -1 ; WX 0 ; N uniF007 ; B -416 820 -203 900 ; -C -1 ; WX 0 ; N uniF009 ; B -333 754 -117 892 ; -C -1 ; WX 0 ; N combininghookabove ; B -231 742 -18 906 ; -C -1 ; WX 0 ; N uniF010 ; B -257 820 -60 906 ; -C -1 ; WX 0 ; N uniF013 ; B -363 742 -150 906 ; -C -1 ; WX 0 ; N uniF011 ; B -449 820 -251 906 ; -C -1 ; WX 0 ; N uniF01C ; B -302 786 25 898 ; -C -1 ; WX 0 ; N uniF015 ; B -516 820 -188 903 ; -C -1 ; WX 0 ; N combiningtildeaccent ; B -445 755 -118 868 ; -C -1 ; WX 0 ; N glyph1147 ; B -146 740 138 804 ; -C -1 ; WX 0 ; N glyph1148 ; B -150 740 150 804 ; -C -1 ; WX 0 ; N uniF02C ; B -172 -196 -35 -59 ; -C -1 ; WX 513 ; N dongsign ; B 59 92 460 716 ; -C -1 ; WX 834 ; N onethird ; B 45 -26 818 725 ; -C -1 ; WX 834 ; N twothirds ; B 12 -26 818 725 ; -C -1 ; WX 0 ; N uniF008 ; B -216 582 0 720 ; -C -1 ; WX 0 ; N glyph1154 ; B -333 582 -117 720 ; -C -1 ; WX 0 ; N glyph1155 ; B -294 582 -73 720 ; -C -1 ; WX 0 ; N uniF00F ; B -454 582 -232 720 ; -C -1 ; WX 0 ; N uniF012 ; B -232 582 -19 746 ; -C -1 ; WX 0 ; N uniF014 ; B -363 582 -150 746 ; -C -1 ; WX 0 ; N uniF016 ; B -516 786 -188 898 ; -C -1 ; WX 0 ; N uniF017 ; B -628 786 -301 898 ; -C -1 ; WX 0 ; N uniF018 ; B -599 786 -271 898 ; -C -1 ; WX 0 ; N uniF019 ; B -445 588 -107 713 ; -C -1 ; WX 0 ; N uniF01A ; B -559 588 -221 713 ; -C -1 ; WX 0 ; N uniF01B ; B -549 588 -211 713 ; -C -1 ; WX 0 ; N uniF01E ; B -399 -196 -262 -59 ; -C -1 ; WX 0 ; N uniF01F ; B -459 -196 -322 -59 ; -C -1 ; WX 0 ; N uniF020 ; B -530 -196 -393 -59 ; -C -1 ; WX 0 ; N uniF021 ; B -428 -196 -291 -59 ; -C -1 ; WX 0 ; N uniF022 ; B -505 -196 -368 -59 ; -C -1 ; WX 0 ; N combininggraveaccent ; B -289 754 -68 892 ; -C -1 ; WX 0 ; N combiningacuteaccent ; B -207 754 10 892 ; -C -1 ; WX 0 ; N uniF01D ; B -313 588 24 713 ; -C -1 ; WX 0 ; N combiningdotbelow ; B -437 -196 -299 -59 ; -C -1 ; WX 0 ; N uniF023 ; B -350 -196 -212 -59 ; -C -1 ; WX 0 ; N uniF029 ; B -211 -196 -74 -59 ; -C -1 ; WX 0 ; N uniF02A ; B -216 -196 -79 -59 ; -C -1 ; WX 0 ; N uniF02B ; B -398 -196 -261 -59 ; -C -1 ; WX 0 ; N uniF024 ; B -345 -196 -208 -59 ; -C -1 ; WX 0 ; N uniF025 ; B -374 -196 -237 -59 ; -C -1 ; WX 0 ; N uniF026 ; B -472 -196 -334 -59 ; -C -1 ; WX 0 ; N uniF027 ; B -386 -196 -249 -59 ; -C -1 ; WX 0 ; N uniF028 ; B -481 -196 -344 -59 ; -C -1 ; WX 0 ; N uniF02D ; B -497 820 -169 903 ; -C -1 ; WX 0 ; N uniF02E ; B -477 786 -150 898 ; -C -1 ; WX 0 ; N uniF02F ; B -548 820 -221 903 ; -C -1 ; WX 0 ; N uniF030 ; B -567 786 -240 898 ; -C -1 ; WX 278 ; N uniF031 ; B 72 0 209 519 ; -C -1 ; WX 722 ; N Adotbelow ; B 0 -196 718 716 ; -C -1 ; WX 556 ; N adotbelow ; B 36 -196 522 530 ; -C -1 ; WX 722 ; N Ahookabove ; B 0 0 718 906 ; -C -1 ; WX 556 ; N ahookabove ; B 36 -12 522 746 ; -C -1 ; WX 722 ; N Acircumflexacute ; B 0 0 718 900 ; -C -1 ; WX 556 ; N acircumflexacute ; B 36 -12 522 892 ; -C -1 ; WX 722 ; N Acircumflexgrave ; B 0 0 718 900 ; -C -1 ; WX 556 ; N acircumflexgrave ; B 36 -12 522 892 ; -C -1 ; WX 722 ; N Acircumflexhookabove ; B 0 0 718 906 ; -C -1 ; WX 556 ; N acircumflexhookabove ; B 36 -12 522 906 ; -C -1 ; WX 722 ; N Acircumflextilde ; B 0 0 718 903 ; -C -1 ; WX 556 ; N acircumflextilde ; B 36 -12 522 868 ; -C -1 ; WX 722 ; N Acircumflexdotbelow ; B 0 -196 718 804 ; -C -1 ; WX 556 ; N acircumflexdotbelow ; B 36 -196 522 728 ; -C -1 ; WX 722 ; N Abreveacute ; B 0 0 718 900 ; -C -1 ; WX 556 ; N abreveacute ; B 36 -12 522 892 ; -C -1 ; WX 722 ; N Abrevegrave ; B 0 0 718 900 ; -C -1 ; WX 556 ; N abrevegrave ; B 36 -12 522 892 ; -C -1 ; WX 722 ; N Abrevehookabove ; B 0 0 718 906 ; -C -1 ; WX 556 ; N abrevehookabove ; B 36 -12 522 906 ; -C -1 ; WX 722 ; N Abrevetilde ; B 0 0 718 903 ; -C -1 ; WX 556 ; N abrevetilde ; B 36 -12 522 868 ; -C -1 ; WX 722 ; N Abrevedotbelow ; B 0 -196 718 804 ; -C -1 ; WX 556 ; N abrevedotbelow ; B 36 -196 522 728 ; -C -1 ; WX 667 ; N Edotbelow ; B 73 -196 617 716 ; -C -1 ; WX 556 ; N edotbelow ; B 32 -196 519 530 ; -C -1 ; WX 667 ; N Ehookabove ; B 73 0 617 906 ; -C -1 ; WX 556 ; N ehookabove ; B 32 -12 519 746 ; -C -1 ; WX 667 ; N Etilde ; B 73 0 617 880 ; -C -1 ; WX 556 ; N etilde ; B 32 -12 519 713 ; -C -1 ; WX 667 ; N Ecircumflexacute ; B 73 0 617 900 ; -C -1 ; WX 556 ; N ecircumflexacute ; B 32 -12 519 892 ; -C -1 ; WX 667 ; N Ecircumflexgrave ; B 73 0 617 900 ; -C -1 ; WX 556 ; N ecircumflexgrave ; B 32 -12 519 892 ; -C -1 ; WX 667 ; N Ecircumflexhookabove ; B 73 0 617 906 ; -C -1 ; WX 556 ; N ecircumflexhookabove ; B 32 -12 519 906 ; -C -1 ; WX 667 ; N Ecircumflextilde ; B 73 0 617 903 ; -C -1 ; WX 556 ; N ecircumflextilde ; B 32 -12 519 868 ; -C -1 ; WX 667 ; N Ecircumflexdotbelow ; B 73 -196 617 804 ; -C -1 ; WX 556 ; N ecircumflexdotbelow ; B 32 -196 519 728 ; -C -1 ; WX 278 ; N Ihookabove ; B 52 0 265 906 ; -C -1 ; WX 278 ; N ihookabove ; B 45 0 259 746 ; -C -1 ; WX 278 ; N Idotbelow ; B 68 -196 213 716 ; -C -1 ; WX 278 ; N idotbelow ; B 72 -196 209 716 ; -C -1 ; WX 778 ; N Odotbelow ; B 43 -196 738 728 ; -C -1 ; WX 611 ; N odotbelow ; B 40 -196 575 530 ; -C -1 ; WX 778 ; N Ohookabove ; B 43 -12 738 906 ; -C -1 ; WX 611 ; N ohookabove ; B 40 -12 575 746 ; -C -1 ; WX 778 ; N Ocircumflexacute ; B 43 -12 738 900 ; -C -1 ; WX 611 ; N ocircumflexacute ; B 40 -12 575 892 ; -C -1 ; WX 778 ; N Ocircumflexgrave ; B 43 -12 738 900 ; -C -1 ; WX 611 ; N ocircumflexgrave ; B 40 -12 575 892 ; -C -1 ; WX 778 ; N Ocircumflexhookabove ; B 43 -12 738 906 ; -C -1 ; WX 611 ; N ocircumflexhookabove ; B 40 -12 575 906 ; -C -1 ; WX 778 ; N Ocircumflextilde ; B 43 -12 738 903 ; -C -1 ; WX 611 ; N ocircumflextilde ; B 40 -12 575 868 ; -C -1 ; WX 778 ; N Ocircumflexdotbelow ; B 43 -196 738 804 ; -C -1 ; WX 611 ; N ocircumflexdotbelow ; B 40 -196 575 728 ; -C -1 ; WX 853 ; N Ohornacute ; B 43 -12 853 903 ; -C -1 ; WX 711 ; N ohornacute ; B 40 -12 711 728 ; -C -1 ; WX 853 ; N Ohorngrave ; B 43 -12 853 903 ; -C -1 ; WX 711 ; N ohorngrave ; B 40 -12 711 728 ; -C -1 ; WX 853 ; N Ohornhookabove ; B 43 -12 853 906 ; -C -1 ; WX 711 ; N ohornhookabove ; B 40 -12 711 746 ; -C -1 ; WX 853 ; N Ohorntilde ; B 43 -12 853 880 ; -C -1 ; WX 711 ; N ohorntilde ; B 40 -12 711 713 ; -C -1 ; WX 853 ; N Ohorndotbelow ; B 43 -196 853 728 ; -C -1 ; WX 711 ; N ohorndotbelow ; B 40 -196 711 530 ; -C -1 ; WX 722 ; N Udotbelow ; B 72 -196 643 716 ; -C -1 ; WX 611 ; N udotbelow ; B 69 -196 541 519 ; -C -1 ; WX 722 ; N Uhookabove ; B 72 -12 643 906 ; -C -1 ; WX 611 ; N uhookabove ; B 69 -12 541 746 ; -C -1 ; WX 830 ; N Uhornacute ; B 72 -12 830 903 ; -C -1 ; WX 724 ; N uhornacute ; B 69 -12 724 728 ; -C -1 ; WX 830 ; N Uhorngrave ; B 72 -12 830 903 ; -C -1 ; WX 724 ; N uhorngrave ; B 69 -12 724 728 ; -C -1 ; WX 830 ; N Uhornhookabove ; B 72 -12 830 906 ; -C -1 ; WX 724 ; N uhornhookabove ; B 69 -12 724 746 ; -C -1 ; WX 830 ; N Uhorntilde ; B 72 -12 830 880 ; -C -1 ; WX 724 ; N uhorntilde ; B 69 -12 724 713 ; -C -1 ; WX 830 ; N Uhorndotbelow ; B 72 -196 830 716 ; -C -1 ; WX 724 ; N uhorndotbelow ; B 69 -196 724 519 ; -C -1 ; WX 667 ; N Ydotbelow ; B -1 -196 668 716 ; -C -1 ; WX 556 ; N ydotbelow ; B 7 -210 540 519 ; -C -1 ; WX 667 ; N Yhookabove ; B -1 0 668 906 ; -C -1 ; WX 556 ; N yhookabove ; B 7 -210 540 746 ; -C -1 ; WX 667 ; N Ytilde ; B -1 0 668 880 ; -C -1 ; WX 556 ; N ytilde ; B 7 -210 540 713 ; -C -1 ; WX 722 ; N uni01CD ; B 0 0 718 904 ; -C -1 ; WX 556 ; N uni01CE ; B 36 -12 522 728 ; -C -1 ; WX 278 ; N uni01CF ; B -26 0 304 904 ; -C -1 ; WX 278 ; N uni01D0 ; B -26 0 304 728 ; -C -1 ; WX 778 ; N uni01D1 ; B 43 -12 738 904 ; -C -1 ; WX 611 ; N uni01D2 ; B 40 -12 575 728 ; -C -1 ; WX 722 ; N uni01D3 ; B 72 -12 643 904 ; -C -1 ; WX 611 ; N uni01D4 ; B 69 -12 541 728 ; -C -1 ; WX 722 ; N uni01D5 ; B 72 -12 643 900 ; -C -1 ; WX 611 ; N uni01D6 ; B 69 -12 541 900 ; -C -1 ; WX 722 ; N uni01D7 ; B 72 -12 643 900 ; -C -1 ; WX 611 ; N uni01D8 ; B 69 -12 541 900 ; -C -1 ; WX 722 ; N uni01D9 ; B 72 -12 643 900 ; -C -1 ; WX 611 ; N uni01DA ; B 69 -12 541 900 ; -C -1 ; WX 722 ; N uni01DB ; B 72 -12 643 900 ; -C -1 ; WX 611 ; N uni01DC ; B 69 -12 541 900 ; -C -1 ; WX 0 ; N glyph1292 ; B -128 730 128 900 ; -C -1 ; WX 0 ; N glyph1293 ; B -128 730 133 900 ; -C -1 ; WX 0 ; N glyph1294 ; B -131 730 131 900 ; -C -1 ; WX 0 ; N glyph1295 ; B -133 730 128 900 ; -C -1 ; WX 567 ; N uni0492 ; B -1 0 565 716 ; -C -1 ; WX 417 ; N uni0493 ; B 3 0 417 519 ; -C -1 ; WX 904 ; N uni0496 ; B 11 -156 892 721 ; -C -1 ; WX 709 ; N uni0497 ; B 0 -137 709 522 ; -C -1 ; WX 610 ; N uni049A ; B 75 -156 600 721 ; -C -1 ; WX 500 ; N uni049B ; B 66 -137 500 522 ; -C -1 ; WX 610 ; N uni049C ; B 75 0 602 721 ; -C -1 ; WX 500 ; N uni049D ; B 66 0 501 522 ; -C -1 ; WX 722 ; N uni04A2 ; B 73 -156 704 716 ; -C -1 ; WX 604 ; N uni04A3 ; B 66 -137 591 519 ; -C -1 ; WX 556 ; N uni04AE ; B 0 0 551 716 ; -C -1 ; WX 556 ; N uni04AF ; B 9 -197 547 519 ; -C -1 ; WX 556 ; N uni04B0 ; B 0 0 551 716 ; -C -1 ; WX 556 ; N uni04B1 ; B 9 -197 547 519 ; -C -1 ; WX 667 ; N uni04B2 ; B 0 -156 664 716 ; -C -1 ; WX 556 ; N uni04B3 ; B 6 -137 547 519 ; -C -1 ; WX 703 ; N uni04B8 ; B 61 0 626 716 ; -C -1 ; WX 581 ; N uni04B9 ; B 56 0 516 519 ; -C -1 ; WX 703 ; N uni04BA ; B 76 0 642 716 ; -C -1 ; WX 611 ; N uni04BB ; B 71 0 543 716 ; -C -1 ; WX 726 ; N uni018F ; B 43 -12 686 728 ; -C -1 ; WX 556 ; N uni0259 ; B 37 -12 524 530 ; -C -1 ; WX 778 ; N uni04E8 ; B 42 -12 736 728 ; -C -1 ; WX 611 ; N uni04E9 ; B 40 -12 575 530 ; -C -1 ; WX 649 ; N glyph1320 ; B 28 143 649 489 ; -C -1 ; WX 271 ; N glyph1321 ; B -34 143 271 492 ; -C -1 ; WX 305 ; N glyph1322 ; B -34 143 305 637 ; -C -1 ; WX 324 ; N glyph1323 ; B -34 143 324 578 ; -C -1 ; WX 612 ; N glyph1324 ; B 19 -130 612 464 ; -C -1 ; WX 271 ; N glyph1325 ; B 49 -63 222 107 ; -C -1 ; WX 271 ; N glyph1326 ; B 11 -81 264 107 ; -C -1 ; WX 271 ; N glyph1327 ; B 11 -193 264 107 ; -C -1 ; WX 271 ; N glyph1328 ; B 8 -193 261 107 ; -C -1 ; WX 271 ; N glyph1329 ; B 33 -171 238 107 ; -C -1 ; WX 271 ; N glyph1330 ; B -22 -210 295 107 ; -C -1 ; WX 0 ; N glyph1331 ; B -133 519 133 837 ; -C -1 ; WX 207 ; N glyph1332 ; B 7 731 210 891 ; -C -1 ; WX 207 ; N glyph1333 ; B -5 746 179 890 ; -C -1 ; WX 333 ; N glyph1334 ; B 70 605 250 717 ; -C -1 ; WX 333 ; N glyph1335 ; B 70 605 250 717 ; -C -1 ; WX 238 ; N uni0653 ; B 0 765 238 831 ; -C -1 ; WX 217 ; N uni0654 ; B 46 750 181 890 ; -C -1 ; WX 217 ; N uni0655 ; B 46 -119 181 21 ; -C -1 ; WX 0 ; N uni0670 ; B -26 519 29 817 ; -C -1 ; WX 217 ; N uni0671 ; B 7 109 210 891 ; -C -1 ; WX 234 ; N uniFB51 ; B -32 143 234 891 ; -C -1 ; WX 217 ; N uni0672 ; B -5 109 181 890 ; -C -1 ; WX 234 ; N glyph1343 ; B -25 143 234 890 ; -C -1 ; WX 217 ; N uni0673 ; B 14 -84 198 736 ; -C -1 ; WX 234 ; N glyph1345 ; B 4 -84 234 736 ; -C -1 ; WX 217 ; N uni0675 ; B 66 109 298 743 ; -C -1 ; WX 234 ; N glyph47 ; B 13 143 269 743 ; -C -1 ; WX 451 ; N uni0676 ; B 3 -71 498 694 ; -C -1 ; WX 451 ; N glyph1349 ; B 3 -71 498 694 ; -C -1 ; WX 451 ; N uni0677 ; B 3 -71 498 729 ; -C -1 ; WX 451 ; N glyph1351 ; B 3 -71 498 729 ; -C -1 ; WX 645 ; N uni0678 ; B 74 -60 645 694 ; -C -1 ; WX 554 ; N glyph ; B 5 -174 554 499 ; -C -1 ; WX 649 ; N uni0679 ; B 28 143 649 837 ; -C -1 ; WX 649 ; N uniFB67 ; B 28 143 649 837 ; -C -1 ; WX 271 ; N uniFB68 ; B -34 143 271 837 ; -C -1 ; WX 271 ; N uniFB69 ; B -34 143 271 837 ; -C -1 ; WX 649 ; N uni067A ; B 28 143 649 766 ; -C -1 ; WX 649 ; N uniFB5F ; B 28 143 649 766 ; -C -1 ; WX 271 ; N uniFB60 ; B -34 143 271 828 ; -C -1 ; WX 271 ; N uniFB61 ; B -34 143 271 828 ; -C -1 ; WX 649 ; N uni067B ; B 28 -171 649 489 ; -C -1 ; WX 649 ; N uniFB53 ; B 28 -171 649 489 ; -C -1 ; WX 271 ; N uniFB54 ; B -34 -171 271 492 ; -C -1 ; WX 271 ; N uniFB55 ; B -34 -171 271 492 ; -C -1 ; WX 649 ; N uni067C ; B 28 31 649 656 ; -C -1 ; WX 649 ; N glyph1367 ; B 28 31 649 656 ; -C -1 ; WX 271 ; N glyph1368 ; B -34 31 271 715 ; -C -1 ; WX 271 ; N glyph1369 ; B -34 31 271 715 ; -C -1 ; WX 649 ; N uni067D ; B 28 143 649 766 ; -C -1 ; WX 649 ; N glyph1371 ; B 28 143 649 766 ; -C -1 ; WX 271 ; N glyph1372 ; B -34 143 271 828 ; -C -1 ; WX 271 ; N glyph1373 ; B -34 143 271 828 ; -C -1 ; WX 649 ; N uni067F ; B 28 143 649 783 ; -C -1 ; WX 649 ; N uniFB63 ; B 28 143 649 783 ; -C -1 ; WX 271 ; N uniFB64 ; B -34 143 295 844 ; -C -1 ; WX 271 ; N uniFB65 ; B -34 143 295 844 ; -C -1 ; WX 649 ; N uni0680 ; B 28 -210 649 489 ; -C -1 ; WX 649 ; N uniFB5B ; B 28 -210 649 489 ; -C -1 ; WX 271 ; N uniFB5C ; B -34 -210 295 492 ; -C -1 ; WX 271 ; N uniFB5D ; B -34 -210 295 492 ; -C -1 ; WX 577 ; N uni0681 ; B 25 -203 563 733 ; -C -1 ; WX 559 ; N glyph1383 ; B 23 -201 563 733 ; -C -1 ; WX 523 ; N glyph1384 ; B -34 143 523 704 ; -C -1 ; WX 523 ; N glyph1385 ; B -34 143 523 704 ; -C -1 ; WX 577 ; N uni0682 ; B 25 -203 563 854 ; -C -1 ; WX 559 ; N glyph1387 ; B 23 -201 563 854 ; -C -1 ; WX 523 ; N glyph1388 ; B -34 143 523 832 ; -C -1 ; WX 523 ; N glyph1389 ; B -34 143 523 832 ; -C -1 ; WX 577 ; N uni0683 ; B 25 -203 563 527 ; -C -1 ; WX 559 ; N uniFB77 ; B 23 -201 563 527 ; -C -1 ; WX 523 ; N uniFB78 ; B -34 -81 523 501 ; -C -1 ; WX 523 ; N uniFB79 ; B -34 -81 523 501 ; -C -1 ; WX 577 ; N uni0684 ; B 25 -203 563 527 ; -C -1 ; WX 559 ; N uniFB73 ; B 23 -201 563 527 ; -C -1 ; WX 523 ; N uniFB74 ; B -34 -171 523 501 ; -C -1 ; WX 523 ; N uniFB75 ; B -34 -171 523 501 ; -C -1 ; WX 577 ; N uni0685 ; B 25 -203 563 876 ; -C -1 ; WX 559 ; N glyph1399 ; B 23 -201 563 876 ; -C -1 ; WX 523 ; N glyph1400 ; B -34 143 523 854 ; -C -1 ; WX 523 ; N glyph1401 ; B -34 143 523 854 ; -C -1 ; WX 577 ; N uni0687 ; B 25 -203 563 527 ; -C -1 ; WX 559 ; N uniFB7f ; B 23 -201 563 527 ; -C -1 ; WX 523 ; N uniFB80 ; B -34 -210 523 501 ; -C -1 ; WX 523 ; N uniFB81 ; B -34 -210 523 501 ; -C -1 ; WX 343 ; N uni0688 ; B 39 143 343 891 ; -C -1 ; WX 343 ; N uniFB89 ; B 39 143 343 891 ; -C -1 ; WX 343 ; N uni0689 ; B 51 31 343 604 ; -C -1 ; WX 343 ; N glyph1409 ; B 51 31 343 604 ; -C -1 ; WX 343 ; N uni068A ; B 51 -63 343 604 ; -C -1 ; WX 343 ; N glyph1411 ; B 51 -63 343 604 ; -C -1 ; WX 343 ; N uni068B ; B 39 -63 343 891 ; -C -1 ; WX 343 ; N glyph1413 ; B 39 -63 343 891 ; -C -1 ; WX 343 ; N uni068C ; B 50 143 343 849 ; -C -1 ; WX 343 ; N uniFB85 ; B 50 143 343 849 ; -C -1 ; WX 343 ; N uni068D ; B 51 -81 343 604 ; -C -1 ; WX 343 ; N uniFB83 ; B 51 -81 343 604 ; -C -1 ; WX 343 ; N uni068E ; B 51 143 343 888 ; -C -1 ; WX 343 ; N uniFB87 ; B 51 143 343 888 ; -C -1 ; WX 343 ; N uni068F ; B 23 143 343 888 ; -C -1 ; WX 343 ; N glyph1421 ; B 23 143 343 888 ; -C -1 ; WX 343 ; N uni0690 ; B 17 143 343 888 ; -C -1 ; WX 343 ; N glyph1423 ; B 17 143 343 888 ; -C -1 ; WX 433 ; N uni0691 ; B 5 -72 433 837 ; -C -1 ; WX 433 ; N uniFB8D ; B 5 -72 433 837 ; -C -1 ; WX 433 ; N uni0692 ; B 5 -72 433 631 ; -C -1 ; WX 433 ; N glyph1426 ; B 5 -72 433 631 ; -C -1 ; WX 433 ; N uni0693 ; B 5 -99 458 461 ; -C -1 ; WX 433 ; N glyph1429 ; B 5 -99 458 461 ; -C -1 ; WX 433 ; N uni0694 ; B 5 -180 505 461 ; -C -1 ; WX 433 ; N glyph1431 ; B 5 -180 505 461 ; -C -1 ; WX 433 ; N uni0695 ; B 5 -196 494 461 ; -C -1 ; WX 433 ; N glyph1433 ; B 5 -196 494 461 ; -C -1 ; WX 433 ; N uni0696 ; B 5 -180 505 461 ; -C -1 ; WX 433 ; N glyph1435 ; B 5 -180 505 461 ; -C -1 ; WX 433 ; N uni0697 ; B 5 -72 447 700 ; -C -1 ; WX 433 ; N glyph1437 ; B 5 -72 447 700 ; -C -1 ; WX 433 ; N uni0699 ; B 5 -72 447 830 ; -C -1 ; WX 433 ; N glyph1439 ; B 5 -72 447 830 ; -C -1 ; WX 899 ; N uni069A ; B 31 -63 899 634 ; -C -1 ; WX 899 ; N glyph1441 ; B 31 -63 899 634 ; -C -1 ; WX 608 ; N glyph1442 ; B -34 -63 608 634 ; -C -1 ; WX 608 ; N glyph1443 ; B -34 -63 608 634 ; -C -1 ; WX 899 ; N uni069B ; B 31 -193 899 458 ; -C -1 ; WX 899 ; N glyph1445 ; B 31 -193 899 458 ; -C -1 ; WX 608 ; N glyph1446 ; B -34 -193 608 446 ; -C -1 ; WX 608 ; N glyph1447 ; B -34 -193 608 446 ; -C -1 ; WX 899 ; N uni069C ; B 31 -193 899 774 ; -C -1 ; WX 899 ; N glyph1449 ; B 31 -193 899 774 ; -C -1 ; WX 608 ; N glyph1450 ; B -34 -193 608 774 ; -C -1 ; WX 608 ; N glyph1451 ; B -34 -193 608 774 ; -C -1 ; WX 1063 ; N uni069D ; B 31 -81 1063 504 ; -C -1 ; WX 1063 ; N glyph1453 ; B 31 -81 1063 504 ; -C -1 ; WX 771 ; N glyph1454 ; B -34 -81 771 504 ; -C -1 ; WX 771 ; N glyph1455 ; B -34 -81 771 504 ; -C -1 ; WX 1063 ; N uni069E ; B 31 -63 1063 820 ; -C -1 ; WX 1063 ; N glyph1457 ; B 31 -63 1063 820 ; -C -1 ; WX 771 ; N glyph1458 ; B -34 143 771 820 ; -C -1 ; WX 771 ; N glyph1459 ; B -34 143 771 820 ; -C -1 ; WX 523 ; N uni069F ; B -34 143 523 858 ; -C -1 ; WX 523 ; N glyph1461 ; B -34 143 523 858 ; -C -1 ; WX 541 ; N uni06A0 ; B 25 -204 535 891 ; -C -1 ; WX 469 ; N glyph1463 ; B 34 -198 516 878 ; -C -1 ; WX 541 ; N glyph1464 ; B -34 143 483 891 ; -C -1 ; WX 360 ; N glyph1465 ; B -34 143 360 852 ; -C -1 ; WX 758 ; N uni06A1 ; B 23 127 758 549 ; -C -1 ; WX 758 ; N uni06A2 ; B 23 -63 758 549 ; -C -1 ; WX 758 ; N glyph1468 ; B 23 -63 758 549 ; -C -1 ; WX 305 ; N glyph1469 ; B -34 -63 305 637 ; -C -1 ; WX 324 ; N glyph1470 ; B -34 -63 324 578 ; -C -1 ; WX 758 ; N uni06A3 ; B 23 -63 758 779 ; -C -1 ; WX 758 ; N glyph1472 ; B 23 -63 758 779 ; -C -1 ; WX 305 ; N glyph1473 ; B -34 -63 305 850 ; -C -1 ; WX 324 ; N glyph1474 ; B -34 -63 324 784 ; -C -1 ; WX 758 ; N uni06A4 ; B 23 127 758 872 ; -C -1 ; WX 758 ; N uniFB6B ; B 23 127 758 872 ; -C -1 ; WX 305 ; N uniFB6C ; B -34 143 305 811 ; -C -1 ; WX 324 ; N uniFB6D ; B -34 143 324 891 ; -C -1 ; WX 758 ; N uni06A5 ; B 23 -193 758 549 ; -C -1 ; WX 758 ; N glyph1480 ; B 23 -193 758 549 ; -C -1 ; WX 305 ; N glyph1481 ; B -34 -193 305 637 ; -C -1 ; WX 324 ; N glyph1482 ; B -34 -193 324 578 ; -C -1 ; WX 758 ; N uni06A6 ; B 23 127 758 883 ; -C -1 ; WX 758 ; N uniFB6F ; B 23 127 758 883 ; -C -1 ; WX 305 ; N uniFB70 ; B -34 143 305 864 ; -C -1 ; WX 324 ; N uniFB71 ; B -34 143 324 891 ; -C -1 ; WX 612 ; N uni06A7 ; B 19 -130 612 683 ; -C -1 ; WX 612 ; N glyph1488 ; B 19 -130 612 683 ; -C -1 ; WX 612 ; N uni06A8 ; B 19 -130 612 771 ; -C -1 ; WX 612 ; N glyph1490 ; B 19 -130 612 771 ; -C -1 ; WX 757 ; N uni06AA ; B 20 143 757 674 ; -C -1 ; WX 879 ; N glyph1492 ; B 20 143 879 674 ; -C -1 ; WX 360 ; N glyph1493 ; B -34 143 360 674 ; -C -1 ; WX 542 ; N glyph1494 ; B -34 143 542 674 ; -C -1 ; WX 757 ; N uni06AB ; B 20 143 760 708 ; -C -1 ; WX 879 ; N glyph1496 ; B 20 143 879 722 ; -C -1 ; WX 360 ; N glyph1497 ; B -34 143 360 708 ; -C -1 ; WX 542 ; N glyph1498 ; B -34 143 542 722 ; -C -1 ; WX 541 ; N uni06AC ; B 20 143 541 891 ; -C -1 ; WX 541 ; N glyph1500 ; B 20 143 541 891 ; -C -1 ; WX 360 ; N glyph1501 ; B -34 143 360 878 ; -C -1 ; WX 360 ; N glyph1502 ; B -34 143 360 878 ; -C -1 ; WX 541 ; N uni06AD ; B 20 143 541 859 ; -C -1 ; WX 541 ; N uniFBD4 ; B 20 143 541 859 ; -C -1 ; WX 360 ; N uniFBD5 ; B -34 143 360 811 ; -C -1 ; WX 360 ; N uniFBD6 ; B -34 143 360 811 ; -C -1 ; WX 541 ; N uni06AE ; B 20 -193 541 774 ; -C -1 ; WX 541 ; N glyph1508 ; B 20 -193 541 774 ; -C -1 ; WX 360 ; N glyph1509 ; B -34 -193 360 708 ; -C -1 ; WX 360 ; N glyph1510 ; B -34 -193 360 708 ; -C -1 ; WX 757 ; N uni06B0 ; B 20 143 760 863 ; -C -1 ; WX 879 ; N glyph1512 ; B 20 143 879 876 ; -C -1 ; WX 360 ; N glyph1513 ; B -34 143 360 863 ; -C -1 ; WX 542 ; N glyph1514 ; B -34 143 542 876 ; -C -1 ; WX 757 ; N uni06B1 ; B 20 143 757 891 ; -C -1 ; WX 879 ; N uniFB9B ; B 20 143 879 891 ; -C -1 ; WX 360 ; N uniFB9C ; B -34 143 360 891 ; -C -1 ; WX 542 ; N uniFB9D ; B -34 143 542 891 ; -C -1 ; WX 757 ; N uni06B2 ; B 20 -81 757 863 ; -C -1 ; WX 879 ; N glyph1520 ; B 20 -81 879 876 ; -C -1 ; WX 360 ; N glyph1521 ; B -34 -81 360 863 ; -C -1 ; WX 542 ; N glyph1522 ; B -34 -81 542 876 ; -C -1 ; WX 757 ; N uni06B3 ; B 20 -171 757 863 ; -C -1 ; WX 879 ; N uniFB97 ; B 20 -171 879 876 ; -C -1 ; WX 360 ; N uniFB98 ; B -34 -171 360 863 ; -C -1 ; WX 542 ; N uniFB99 ; B -34 -171 542 876 ; -C -1 ; WX 757 ; N uni06B4 ; B 20 143 757 891 ; -C -1 ; WX 879 ; N glyph1528 ; B 20 143 879 891 ; -C -1 ; WX 360 ; N glyph1529 ; B -34 143 360 891 ; -C -1 ; WX 542 ; N glyph1530 ; B -34 143 542 891 ; -C -1 ; WX 451 ; N uni06B5 ; B 17 -36 451 891 ; -C -1 ; WX 451 ; N glyph1532 ; B 17 -36 451 891 ; -C -1 ; WX 234 ; N glyph1533 ; B -34 143 234 891 ; -C -1 ; WX 234 ; N glyph1534 ; B -34 143 234 891 ; -C -1 ; WX 451 ; N uni06B6 ; B 17 -36 451 891 ; -C -1 ; WX 451 ; N glyph1536 ; B 17 -36 451 891 ; -C -1 ; WX 234 ; N glyph1537 ; B -39 143 234 891 ; -C -1 ; WX 234 ; N glyph1538 ; B -39 143 234 891 ; -C -1 ; WX 451 ; N uni06B7 ; B 17 -36 451 891 ; -C -1 ; WX 451 ; N glyph1540 ; B 17 -36 451 891 ; -C -1 ; WX 234 ; N glyph1541 ; B -34 143 234 891 ; -C -1 ; WX 234 ; N glyph1542 ; B -34 143 234 891 ; -C -1 ; WX 451 ; N uni06B8 ; B 17 -168 451 773 ; -C -1 ; WX 451 ; N glyph1544 ; B 17 -168 451 773 ; -C -1 ; WX 234 ; N glyph1545 ; B -34 -193 242 774 ; -C -1 ; WX 234 ; N glyph1546 ; B -34 -193 242 774 ; -C -1 ; WX 541 ; N uni06B9 ; B 30 -212 541 612 ; -C -1 ; WX 541 ; N glyph1548 ; B 30 -212 541 612 ; -C -1 ; WX 271 ; N glyph1549 ; B -34 -63 274 735 ; -C -1 ; WX 271 ; N glyph1550 ; B -34 -63 274 735 ; -C -1 ; WX 541 ; N uni06BA ; B 30 -63 541 458 ; -C -1 ; WX 541 ; N uniFB9F ; B 30 -63 541 458 ; -C -1 ; WX 541 ; N uni06BB ; B 30 -63 541 798 ; -C -1 ; WX 541 ; N uniFBA1 ; B 30 -63 541 798 ; -C -1 ; WX 541 ; N uni06BC ; B 30 -175 541 612 ; -C -1 ; WX 541 ; N glyph1556 ; B 30 -175 541 612 ; -C -1 ; WX 271 ; N glyph1557 ; B -34 31 274 735 ; -C -1 ; WX 271 ; N glyph1558 ; B -34 31 274 735 ; -C -1 ; WX 541 ; N uni06BD ; B 30 -63 541 742 ; -C -1 ; WX 541 ; N glyph1560 ; B 30 -63 541 742 ; -C -1 ; WX 577 ; N uni06BF ; B 25 -203 563 746 ; -C -1 ; WX 559 ; N glyph1562 ; B 23 -201 563 746 ; -C -1 ; WX 523 ; N glyph1563 ; B -34 -193 523 724 ; -C -1 ; WX 523 ; N glyph1564 ; B -34 -193 523 724 ; -C -1 ; WX 343 ; N uni06C0 ; B 43 126 304 694 ; -C -1 ; WX 415 ; N uniFBA5 ; B 1 143 415 743 ; -C -1 ; WX 388 ; N uni06C1 ; B 13 68 388 376 ; -C -1 ; WX 388 ; N uni06C2 ; B 13 68 388 597 ; -C -1 ; WX 388 ; N uni06C3 ; B 13 68 388 634 ; -C -1 ; WX 451 ; N uni06C4 ; B 3 -71 451 484 ; -C -1 ; WX 451 ; N glyph1571 ; B 3 -71 451 484 ; -C -1 ; WX 451 ; N uni06C5 ; B 3 -71 451 484 ; -C -1 ; WX 451 ; N uniFBE1 ; B 3 -71 451 484 ; -C -1 ; WX 451 ; N uni06C6 ; B 3 -71 451 667 ; -C -1 ; WX 451 ; N uniFBDA ; B 3 -71 451 667 ; -C -1 ; WX 451 ; N uni06C7 ; B 3 -71 451 778 ; -C -1 ; WX 451 ; N uniFBD8 ; B 3 -71 451 778 ; -C -1 ; WX 451 ; N uni06C8 ; B 3 -71 451 817 ; -C -1 ; WX 451 ; N uniFBDC ; B 3 -71 451 817 ; -C -1 ; WX 451 ; N uni06C9 ; B 3 -71 451 667 ; -C -1 ; WX 451 ; N uniFBE3 ; B 3 -71 451 667 ; -C -1 ; WX 451 ; N uni06CA ; B 3 -71 451 699 ; -C -1 ; WX 451 ; N glyph1583 ; B 3 -71 451 699 ; -C -1 ; WX 451 ; N uni06CB ; B 3 -71 451 816 ; -C -1 ; WX 451 ; N uniFBDF ; B 3 -71 451 816 ; -C -1 ; WX 645 ; N uni06CD ; B 32 -60 575 461 ; -C -1 ; WX 554 ; N glyph1587 ; B -19 -174 554 276 ; -C -1 ; WX 645 ; N uni06CE ; B 74 -60 575 522 ; -C -1 ; WX 554 ; N glyph1589 ; B 5 -174 554 424 ; -C -1 ; WX 271 ; N glyph1590 ; B -34 -81 271 667 ; -C -1 ; WX 271 ; N glyph1591 ; B -34 -81 271 667 ; -C -1 ; WX 451 ; N uni06CF ; B 3 -71 451 724 ; -C -1 ; WX 451 ; N glyph1593 ; B 3 -71 451 724 ; -C -1 ; WX 645 ; N uni06D0 ; B 74 -187 575 461 ; -C -1 ; WX 554 ; N uniFBE5 ; B 5 -212 554 282 ; -C -1 ; WX 271 ; N uniFBE6 ; B -34 -171 271 492 ; -C -1 ; WX 271 ; N uniFBE7 ; B -34 -171 271 492 ; -C -1 ; WX 645 ; N uni06D1 ; B 74 -178 575 461 ; -C -1 ; WX 554 ; N glyph1599 ; B 5 -212 554 282 ; -C -1 ; WX 812 ; N uni06D2 ; B 33 -25 812 469 ; -C -1 ; WX 812 ; N uniFBAF ; B 34 -208 812 276 ; -C -1 ; WX 812 ; N uni06D3 ; B 33 -25 812 597 ; -C -1 ; WX 812 ; N uniFBB1 ; B 34 -208 812 499 ; -C -1 ; WX 207 ; N uni06D4 ; B 20 143 188 276 ; -C -1 ; WX 0 ; N uni06D6 ; B -230 519 231 886 ; -C -1 ; WX 0 ; N uni06D7 ; B -182 519 183 886 ; -C -1 ; WX 0 ; N uni06D8 ; B -107 519 107 675 ; -C -1 ; WX 0 ; N uni06D9 ; B -108 519 108 836 ; -C -1 ; WX 0 ; N uni06DA ; B -128 519 128 866 ; -C -1 ; WX 0 ; N uni06DB ; B -65 519 68 660 ; -C -1 ; WX 0 ; N uni06DC ; B -207 519 207 767 ; -C -1 ; WX 1123 ; N uni06DD ; B 24 -188 1099 886 ; -C -1 ; WX 1084 ; N uni06DE ; B 24 -152 1060 884 ; -C -1 ; WX 0 ; N uni06DF ; B -37 519 37 592 ; -C -1 ; WX 0 ; N uni06E0 ; B -36 519 36 591 ; -C -1 ; WX 0 ; N uni06E1 ; B -133 519 133 689 ; -C -1 ; WX 0 ; N uni06E2 ; B -82 519 82 824 ; -C -1 ; WX 0 ; N uni06E3 ; B -207 -209 207 39 ; -C -1 ; WX 0 ; N uni06E4 ; B -57 519 57 550 ; -C -1 ; WX 213 ; N uni06E5 ; B 0 519 213 783 ; -C -1 ; WX 371 ; N uni06E6 ; B 0 519 371 754 ; -C -1 ; WX 0 ; N uni06E7 ; B -185 519 186 754 ; -C -1 ; WX 0 ; N uni06E8 ; B -122 519 122 840 ; -C -1 ; WX 600 ; N uni06E9 ; B 24 0 576 818 ; -C -1 ; WX 0 ; N uni06EA ; B -82 -165 82 -1 ; -C -1 ; WX 0 ; N uni06EB ; B -82 519 82 683 ; -C -1 ; WX 0 ; N uni06ED ; B -82 -209 82 97 ; -C -1 ; WX 899 ; N uni06FA ; B 31 -63 899 774 ; -C -1 ; WX 899 ; N glyph1629 ; B 31 -63 899 774 ; -C -1 ; WX 608 ; N glyph1630 ; B -34 -63 608 774 ; -C -1 ; WX 608 ; N glyph1631 ; B -34 -63 608 774 ; -C -1 ; WX 1063 ; N uni06FB ; B 31 -63 1063 728 ; -C -1 ; WX 1063 ; N glyph1633 ; B 31 -63 1063 728 ; -C -1 ; WX 771 ; N glyph1634 ; B -34 -63 771 728 ; -C -1 ; WX 771 ; N glyph1635 ; B -34 -63 771 728 ; -C -1 ; WX 541 ; N uni06FC ; B 25 -204 535 822 ; -C -1 ; WX 469 ; N glyph1637 ; B 34 -198 516 760 ; -C -1 ; WX 541 ; N glyph1638 ; B -34 -63 483 800 ; -C -1 ; WX 360 ; N glyph1639 ; B -34 -63 360 756 ; -C -1 ; WX 469 ; N uni06FD ; B 62 -145 422 510 ; -C -1 ; WX 360 ; N uni06FE ; B 16 -212 360 431 ; -C -1 ; WX 343 ; N uniFBA6 ; B 43 126 304 519 ; -C -1 ; WX 271 ; N uniFBA8 ; B -34 -134 271 492 ; -C -1 ; WX 320 ; N uniFBA9 ; B -34 -205 320 395 ; -C -1 ; WX 244 ; N glyph1645 ; B 23 -68 222 49 ; -C -1 ; WX 244 ; N glyph1646 ; B 29 -151 226 -20 ; -C -1 ; WX 244 ; N glyph1647 ; B 9 -136 236 59 ; -C -1 ; WX 244 ; N glyph1648 ; B 86 -64 162 34 ; -C -1 ; WX 244 ; N glyph1649 ; B 53 -70 197 27 ; -C -1 ; WX 757 ; N glyph1650 ; B 20 143 757 811 ; -C -1 ; WX 879 ; N glyph1651 ; B 20 143 879 811 ; -C -1 ; WX 273 ; N uniFB1D ; B 66 109 207 518 ; -C -1 ; WX 0 ; N uniFB1E ; B -152 611 152 753 ; -C -1 ; WX 414 ; N glyph1654 ; B 0 140 414 191 ; -C -1 ; WX 546 ; N uniFB1F ; B 66 140 480 518 ; -C -1 ; WX 486 ; N glyph1656 ; B -5 72 471 890 ; -C -1 ; WX 541 ; N glyph1657 ; B -5 94 541 890 ; -C -1 ; WX 486 ; N glyph1658 ; B 17 -122 471 739 ; -C -1 ; WX 541 ; N glyph1659 ; B 13 -122 541 766 ; -C -1 ; WX 486 ; N glyph1660 ; B 17 72 471 792 ; -C -1 ; WX 541 ; N glyph1661 ; B 13 94 541 792 ; -C -1 ; WX 486 ; N glyph1662 ; B 17 72 484 891 ; -C -1 ; WX 541 ; N glyph1663 ; B 13 94 541 891 ; -C -1 ; WX 486 ; N glyph1664 ; B 17 72 491 891 ; -C -1 ; WX 541 ; N glyph1665 ; B 13 94 541 891 ; -C -1 ; WX 486 ; N glyph1666 ; B 17 72 471 891 ; -C -1 ; WX 541 ; N glyph1667 ; B 13 94 541 891 ; -C -1 ; WX 486 ; N glyph1668 ; B 17 -173 471 739 ; -C -1 ; WX 541 ; N glyph1669 ; B 13 -136 541 766 ; -C -1 ; WX 562 ; N glyph1670 ; B 56 143 505 713 ; -C -1 ; WX 562 ; N glyph1671 ; B 92 89 469 713 ; -C -1 ; WX 486 ; N glyph1672 ; B 7 72 471 891 ; -C -1 ; WX 541 ; N glyph1673 ; B 7 94 541 891 ; -EndCharMetrics -StartKernData -StartKernPairs 908 -KPX space A -37 -KPX space Y -18 -KPX space Alphatonos -37 -KPX space Alpha -37 -KPX space Delta -37 -KPX space Lambda -37 -KPX space Upsilon -18 -KPX space Upsilondieresis -18 -KPX one one -55 -KPX A space -37 -KPX A T -74 -KPX A V -74 -KPX A W -55 -KPX A Y -92 -KPX A v -37 -KPX A w -18 -KPX A y -37 -KPX A quoteright -55 -KPX F comma -111 -KPX F period -111 -KPX F A -55 -KPX L space -18 -KPX L T -74 -KPX L V -74 -KPX L W -55 -KPX L Y -92 -KPX L y -37 -KPX L quoteright -55 -KPX P space -18 -KPX P comma -129 -KPX P period -129 -KPX P A -74 -KPX R V -18 -KPX R W -18 -KPX R Y -37 -KPX T comma -111 -KPX T hyphen -55 -KPX T period -111 -KPX T colon -111 -KPX T semicolon -111 -KPX T A -74 -KPX T O -18 -KPX T a -74 -KPX T c -74 -KPX T e -74 -KPX T i -18 -KPX T o -74 -KPX T r -55 -KPX T s -74 -KPX T u -74 -KPX T w -74 -KPX T y -74 -KPX V comma -92 -KPX V hyphen -55 -KPX V period -92 -KPX V colon -55 -KPX V semicolon -55 -KPX V A -74 -KPX V a -55 -KPX V e -55 -KPX V i -18 -KPX V o -74 -KPX V r -55 -KPX V u -37 -KPX V y -37 -KPX W comma -55 -KPX W hyphen -20 -KPX W period -55 -KPX W colon -18 -KPX W semicolon -18 -KPX W A -55 -KPX W a -37 -KPX W e -18 -KPX W i -9 -KPX W o -18 -KPX W r -18 -KPX W u -18 -KPX W y -18 -KPX Y space -18 -KPX Y comma -111 -KPX Y hyphen -55 -KPX Y period -111 -KPX Y colon -74 -KPX Y semicolon -74 -KPX Y A -92 -KPX Y a -55 -KPX Y e -55 -KPX Y i -37 -KPX Y o -74 -KPX Y p -55 -KPX Y q -74 -KPX Y u -55 -KPX Y v -55 -KPX f quoteright 18 -KPX r comma -55 -KPX r period -55 -KPX r quoteright 37 -KPX v comma -74 -KPX v period -74 -KPX w comma -37 -KPX w period -37 -KPX y comma -74 -KPX y period -74 -KPX quoteleft quoteleft -37 -KPX quoteright space -55 -KPX quoteright s -37 -KPX quoteright quoteright -37 -KPX quotedblbase afii10051 -100 -KPX quotedblbase afii10060 -100 -KPX quotedblbase afii10036 -88 -KPX quotedblbase afii10041 -101 -KPX quotedblbase afii10044 -88 -KPX Gamma comma -110 -KPX Gamma period -110 -KPX Gamma Alpha -109 -KPX Gamma Delta -109 -KPX Gamma Lambda -109 -KPX Gamma iotatonos -32 -KPX Gamma iota -32 -KPX Gamma iotadieresis 46 -KPX Theta Alpha -27 -KPX Theta Delta -27 -KPX Theta Lambda -27 -KPX Theta Upsilon -28 -KPX Theta Upsilondieresis -28 -KPX Phi Alpha -27 -KPX Phi Tau -27 -KPX Phi Upsilon -28 -KPX Phi Upsilondieresis -28 -KPX delta tau -28 -KPX delta chi -36 -KPX delta pi -28 -KPX tau alpha -28 -KPX tau delta -28 -KPX tau sigma -28 -KPX tau phi -28 -KPX tau alphatonos -28 -KPX tau zeta -28 -KPX tau omicron -28 -KPX tau sigma1 -28 -KPX tau omega -28 -KPX tau omegatonos -28 -KPX phi tau -28 -KPX phi lambda -12 -KPX phi chi -36 -KPX phi pi -28 -KPX Alphatonos Theta -27 -KPX Alphatonos Phi -27 -KPX Alphatonos Omicron -27 -KPX Alphatonos Tau -83 -KPX Alphatonos Upsilon -91 -KPX Alphatonos Upsilondieresis -91 -KPX Alphatonos gamma -37 -KPX Alphatonos nu -37 -KPX Alphatonos chi -37 -KPX Omicrontonos Upsilon -28 -KPX Omicrontonos Upsilondieresis -28 -KPX Upsilontonos Theta -38 -KPX Upsilontonos Phi -38 -KPX Upsilontonos alpha -74 -KPX Upsilontonos delta -37 -KPX Upsilontonos sigma -74 -KPX Upsilontonos phi -74 -KPX Upsilontonos iotadieresistonos 125 -KPX Upsilontonos Alpha -91 -KPX Upsilontonos Delta -91 -KPX Upsilontonos Lambda -91 -KPX Upsilontonos Omicron -38 -KPX Upsilontonos Omega -38 -KPX Upsilontonos alphatonos -74 -KPX Upsilontonos etatonos -37 -KPX Upsilontonos iotatonos -37 -KPX Upsilontonos eta -37 -KPX Upsilontonos iota -37 -KPX Upsilontonos kappa -37 -KPX Upsilontonos mu -37 -KPX Upsilontonos omicron -74 -KPX Upsilontonos iotadieresis 45 -KPX Upsilontonos omicrontonos -74 -KPX Omegatonos Upsilon -28 -KPX Omegatonos Upsilondieresis -28 -KPX Alpha quoteright -55 -KPX Alpha Theta -27 -KPX Alpha Phi -27 -KPX Alpha Omicron -27 -KPX Alpha Tau -83 -KPX Alpha Upsilon -91 -KPX Alpha Upsilondieresis -91 -KPX Alpha gamma -37 -KPX Alpha nu -37 -KPX Alpha chi -37 -KPX Delta Theta -27 -KPX Delta Omicron -27 -KPX Delta Tau -83 -KPX Delta Upsilon -91 -KPX Delta Upsilondieresis -91 -KPX Kappa Theta -46 -KPX Kappa Phi -46 -KPX Kappa alpha -23 -KPX Kappa delta -23 -KPX Kappa sigma -23 -KPX Kappa phi -23 -KPX Kappa Omicron -46 -KPX Kappa alphatonos -23 -KPX Kappa zeta -23 -KPX Kappa theta -23 -KPX Kappa xi -23 -KPX Kappa omicron -23 -KPX Kappa omega -23 -KPX Kappa omicrontonos -23 -KPX Kappa omegatonos -23 -KPX Lambda Theta -27 -KPX Lambda Omicron -27 -KPX Lambda Tau -83 -KPX Lambda Upsilon -91 -KPX Lambda Upsilondieresis -91 -KPX Omicron Alpha -27 -KPX Omicron Delta -27 -KPX Omicron Lambda -27 -KPX Omicron Upsilon -28 -KPX Omicron Upsilondieresis -28 -KPX Rho comma -128 -KPX Rho period -128 -KPX Rho Alpha -74 -KPX Rho Delta -74 -KPX Rho Lambda -74 -KPX Sigma tau -17 -KPX Sigma pi -17 -KPX Tau comma -110 -KPX Tau hyphen -55 -KPX Tau period -110 -KPX Tau colon -110 -KPX Tau semicolon -110 -KPX Tau Theta -18 -KPX Tau Phi -27 -KPX Tau alpha -74 -KPX Tau delta -41 -KPX Tau epsilon -74 -KPX Tau sigma -74 -KPX Tau phi -74 -KPX Tau iotadieresistonos 118 -KPX Tau Alpha -74 -KPX Tau Delta -80 -KPX Tau Lambda -74 -KPX Tau Omicron -18 -KPX Tau Omega -18 -KPX Tau alphatonos -74 -KPX Tau epsilontonos -74 -KPX Tau gamma -74 -KPX Tau eta -74 -KPX Tau iota -18 -KPX Tau mu -74 -KPX Tau nu -74 -KPX Tau omicron -74 -KPX Tau upsilon -74 -KPX Tau chi -60 -KPX Tau psi -74 -KPX Tau iotadieresis 45 -KPX Tau upsilondieresis -74 -KPX Tau omicrontonos -74 -KPX Tau upsilontonos -74 -KPX Upsilon comma -110 -KPX Upsilon hyphen -55 -KPX Upsilon period -110 -KPX Upsilon colon -74 -KPX Upsilon semicolon -74 -KPX Upsilon Theta -38 -KPX Upsilon Phi -38 -KPX Upsilon alpha -74 -KPX Upsilon delta -37 -KPX Upsilon sigma -74 -KPX Upsilon phi -74 -KPX Upsilon iotadieresistonos 125 -KPX Upsilon Alpha -91 -KPX Upsilon Delta -91 -KPX Upsilon Lambda -91 -KPX Upsilon Omicron -38 -KPX Upsilon Omega -38 -KPX Upsilon alphatonos -74 -KPX Upsilon etatonos -37 -KPX Upsilon iotatonos -37 -KPX Upsilon gamma -41 -KPX Upsilon eta -37 -KPX Upsilon iota -37 -KPX Upsilon kappa -37 -KPX Upsilon mu -37 -KPX Upsilon omicron -74 -KPX Upsilon iotadieresis 45 -KPX Upsilon omicrontonos -74 -KPX Chi omega -13 -KPX Chi omegatonos -13 -KPX Psi alpha -18 -KPX Psi delta -18 -KPX Psi sigma -18 -KPX Psi phi -18 -KPX Psi alphatonos -18 -KPX Psi omicron -18 -KPX Psi omega -18 -KPX Psi omicrontonos -18 -KPX Psi omegatonos -18 -KPX Omega Upsilon -28 -KPX Omega Upsilondieresis -28 -KPX Upsilondieresis Theta -38 -KPX Upsilondieresis Phi -38 -KPX Upsilondieresis alpha -74 -KPX Upsilondieresis delta -37 -KPX Upsilondieresis sigma -74 -KPX Upsilondieresis phi -74 -KPX Upsilondieresis iotadieresistonos 125 -KPX Upsilondieresis Alpha -91 -KPX Upsilondieresis Delta -91 -KPX Upsilondieresis Lambda -91 -KPX Upsilondieresis Omicron -38 -KPX Upsilondieresis Omega -38 -KPX Upsilondieresis alphatonos -74 -KPX Upsilondieresis etatonos -37 -KPX Upsilondieresis iotatonos -37 -KPX Upsilondieresis eta -37 -KPX Upsilondieresis iota -37 -KPX Upsilondieresis kappa -37 -KPX Upsilondieresis mu -37 -KPX Upsilondieresis omicron -74 -KPX Upsilondieresis iotadieresis 45 -KPX Upsilondieresis omicrontonos -74 -KPX zeta alpha -56 -KPX zeta delta -37 -KPX zeta sigma -56 -KPX zeta tau -37 -KPX zeta phi -56 -KPX zeta alphatonos -56 -KPX zeta etatonos -24 -KPX zeta gamma -32 -KPX zeta eta -24 -KPX zeta theta -37 -KPX zeta iota -24 -KPX zeta kappa -24 -KPX zeta nu -32 -KPX zeta omicron -56 -KPX zeta omega -56 -KPX zeta omicrontonos -56 -KPX zeta omegatonos -56 -KPX zeta pi -37 -KPX kappa alpha -33 -KPX kappa delta -33 -KPX kappa sigma -33 -KPX kappa phi -33 -KPX kappa alphatonos -33 -KPX kappa zeta -33 -KPX kappa theta -14 -KPX kappa xi -33 -KPX kappa omicron -33 -KPX kappa sigma1 -33 -KPX kappa omega -33 -KPX kappa omicrontonos -33 -KPX kappa omegatonos -33 -KPX lambda alpha -12 -KPX lambda delta -12 -KPX lambda sigma -12 -KPX lambda phi -12 -KPX lambda alphatonos -12 -KPX lambda upsilondieresistonos -15 -KPX lambda zeta -12 -KPX lambda xi -12 -KPX lambda omicron -12 -KPX lambda sigma1 -12 -KPX lambda upsilon -15 -KPX lambda omega -12 -KPX lambda upsilondieresis -15 -KPX lambda omicrontonos -12 -KPX lambda upsilontonos -15 -KPX lambda omegatonos -12 -KPX xi alpha -12 -KPX xi delta -12 -KPX xi sigma -12 -KPX xi phi -12 -KPX xi alphatonos -12 -KPX xi zeta -12 -KPX xi xi -12 -KPX xi omicron -12 -KPX xi sigma1 -12 -KPX xi omicrontonos -12 -KPX omicron tau -28 -KPX omicron chi -36 -KPX omicron pi -28 -KPX rho tau -28 -KPX rho pi -28 -KPX chi alpha -36 -KPX chi delta -36 -KPX chi sigma -36 -KPX chi phi -36 -KPX chi alphatonos -36 -KPX chi zeta -36 -KPX chi omicron -36 -KPX chi sigma1 -36 -KPX chi omega -21 -KPX chi omicrontonos -36 -KPX chi omegatonos -21 -KPX omega tau -28 -KPX omega chi -21 -KPX omega pi -28 -KPX omicrontonos tau -28 -KPX omicrontonos chi -36 -KPX omicrontonos pi -28 -KPX omegatonos tau -28 -KPX omegatonos chi -21 -KPX omegatonos pi -28 -KPX afii10052 comma -113 -KPX afii10052 period -125 -KPX afii10052 colon -13 -KPX afii10052 semicolon -13 -KPX afii10052 guillemotleft -38 -KPX afii10052 guillemotright -38 -KPX afii10058 quoteright -100 -KPX afii10059 quoteright -100 -KPX afii10017 quoteright -51 -KPX afii10017 afii10021 37 -KPX afii10017 afii10029 12 -KPX afii10017 afii10032 -13 -KPX afii10017 afii10033 -13 -KPX afii10017 afii10035 -25 -KPX afii10017 afii10036 -50 -KPX afii10017 afii10037 -38 -KPX afii10017 afii10038 -25 -KPX afii10017 afii10041 -76 -KPX afii10017 afii10047 -25 -KPX afii10017 afii10065 12 -KPX afii10017 afii10066 -13 -KPX afii10017 afii10083 -13 -KPX afii10017 afii10084 -13 -KPX afii10017 afii10095 12 -KPX afii10018 afii10017 -38 -KPX afii10018 afii10024 -25 -KPX afii10018 afii10025 -13 -KPX afii10018 afii10029 -25 -KPX afii10018 afii10035 -13 -KPX afii10018 afii10036 -25 -KPX afii10018 afii10037 -25 -KPX afii10018 afii10038 -13 -KPX afii10018 afii10039 -25 -KPX afii10018 afii10041 -38 -KPX afii10018 afii10044 -38 -KPX afii10018 afii10047 -25 -KPX afii10018 afii10049 -25 -KPX afii10018 afii10085 -13 -KPX afii10019 afii10017 -50 -KPX afii10019 afii10021 -13 -KPX afii10019 afii10024 -38 -KPX afii10019 afii10025 -13 -KPX afii10019 afii10029 -25 -KPX afii10019 afii10032 -25 -KPX afii10019 afii10035 -38 -KPX afii10019 afii10036 -38 -KPX afii10019 afii10037 -38 -KPX afii10019 afii10038 -25 -KPX afii10019 afii10039 -38 -KPX afii10019 afii10041 -38 -KPX afii10019 afii10044 -50 -KPX afii10019 afii10049 -25 -KPX afii10019 afii10084 -13 -KPX afii10019 afii10087 -13 -KPX afii10019 afii10089 -38 -KPX afii10020 comma -113 -KPX afii10020 period -125 -KPX afii10020 colon -13 -KPX afii10020 semicolon -13 -KPX afii10020 guillemotleft -38 -KPX afii10020 guillemotright -38 -KPX afii10020 afii10017 -63 -KPX afii10020 afii10021 -25 -KPX afii10020 afii10029 -25 -KPX afii10020 afii10032 -13 -KPX afii10020 afii10035 -13 -KPX afii10020 afii10065 -13 -KPX afii10020 afii10067 -25 -KPX afii10020 afii10069 -38 -KPX afii10020 afii10070 -51 -KPX afii10020 afii10074 -25 -KPX afii10020 afii10077 -50 -KPX afii10020 afii10078 -38 -KPX afii10020 afii10079 -25 -KPX afii10020 afii10080 -50 -KPX afii10020 afii10082 -38 -KPX afii10020 afii10085 -38 -KPX afii10020 afii10093 -38 -KPX afii10020 afii10094 -38 -KPX afii10020 afii10096 -38 -KPX afii10020 afii10097 -38 -KPX afii10021 afii10025 12 -KPX afii10021 afii10037 12 -KPX afii10021 afii10038 -13 -KPX afii10021 afii10041 -13 -KPX afii10021 afii10070 12 -KPX afii10021 afii10073 25 -KPX afii10021 afii10080 12 -KPX afii10021 afii10085 12 -KPX afii10024 afii10025 12 -KPX afii10024 afii10032 -13 -KPX afii10024 afii10035 -25 -KPX afii10024 afii10036 25 -KPX afii10024 afii10037 25 -KPX afii10024 afii10041 12 -KPX afii10024 afii10044 37 -KPX afii10024 afii10065 12 -KPX afii10024 afii10080 -13 -KPX afii10025 afii10024 -25 -KPX afii10025 afii10029 -25 -KPX afii10025 afii10032 -13 -KPX afii10025 afii10035 -25 -KPX afii10025 afii10036 -38 -KPX afii10025 afii10037 -38 -KPX afii10025 afii10038 -25 -KPX afii10025 afii10041 -38 -KPX afii10025 afii10049 -25 -KPX afii10028 afii10025 37 -KPX afii10028 afii10035 -13 -KPX afii10028 afii10036 25 -KPX afii10028 afii10037 25 -KPX afii10028 afii10038 -13 -KPX afii10028 afii10041 25 -KPX afii10028 afii10047 12 -KPX afii10028 afii10065 12 -KPX afii10028 afii10073 12 -KPX afii10028 afii10083 -13 -KPX afii10029 afii10065 25 -KPX afii10030 afii10065 12 -KPX afii10030 afii10083 -13 -KPX afii10030 afii10089 -13 -KPX afii10032 afii10017 -25 -KPX afii10032 afii10021 -13 -KPX afii10032 afii10024 -13 -KPX afii10032 afii10029 -25 -KPX afii10032 afii10037 -25 -KPX afii10032 afii10039 -38 -KPX afii10032 afii10049 -13 -KPX afii10032 afii10069 -25 -KPX afii10032 afii10077 -13 -KPX afii10034 comma -138 -KPX afii10034 period -150 -KPX afii10034 colon -13 -KPX afii10034 semicolon -13 -KPX afii10034 afii10017 -88 -KPX afii10034 afii10021 -63 -KPX afii10034 afii10024 -13 -KPX afii10034 afii10025 -13 -KPX afii10034 afii10029 -63 -KPX afii10034 afii10030 -13 -KPX afii10034 afii10032 -13 -KPX afii10034 afii10035 -25 -KPX afii10034 afii10036 -13 -KPX afii10034 afii10037 -13 -KPX afii10034 afii10038 -13 -KPX afii10034 afii10039 -38 -KPX afii10034 afii10049 -25 -KPX afii10034 afii10065 -13 -KPX afii10034 afii10069 -63 -KPX afii10034 afii10070 -25 -KPX afii10034 afii10080 -25 -KPX afii10034 afii10097 -13 -KPX afii10035 afii10017 -25 -KPX afii10035 afii10021 -13 -KPX afii10035 afii10025 -13 -KPX afii10035 afii10029 -25 -KPX afii10035 afii10030 -13 -KPX afii10035 afii10032 -25 -KPX afii10035 afii10036 -25 -KPX afii10035 afii10037 -13 -KPX afii10035 afii10039 -38 -KPX afii10035 afii10041 -25 -KPX afii10035 afii10044 -13 -KPX afii10035 afii10047 -13 -KPX afii10035 afii10065 12 -KPX afii10035 afii10066 -13 -KPX afii10035 afii10072 12 -KPX afii10035 afii10083 -13 -KPX afii10035 afii10086 -13 -KPX afii10035 afii10089 -13 -KPX afii10036 comma -100 -KPX afii10036 period -113 -KPX afii10036 colon -13 -KPX afii10036 semicolon -13 -KPX afii10036 guillemotleft -25 -KPX afii10036 afii10017 -63 -KPX afii10036 afii10021 -25 -KPX afii10036 afii10024 25 -KPX afii10036 afii10029 -25 -KPX afii10036 afii10032 -25 -KPX afii10036 afii10038 -38 -KPX afii10036 afii10049 -13 -KPX afii10036 afii10065 -25 -KPX afii10036 afii10067 -38 -KPX afii10036 afii10070 -50 -KPX afii10036 afii10074 -38 -KPX afii10036 afii10076 -38 -KPX afii10036 afii10077 -63 -KPX afii10036 afii10078 -51 -KPX afii10036 afii10080 -63 -KPX afii10036 afii10081 -13 -KPX afii10036 afii10082 -38 -KPX afii10036 afii10083 -63 -KPX afii10036 afii10085 -38 -KPX afii10036 afii10087 -38 -KPX afii10036 afii10091 -13 -KPX afii10036 afii10093 -13 -KPX afii10036 afii10094 -13 -KPX afii10036 afii10096 -13 -KPX afii10036 afii10097 -25 -KPX afii10037 comma -113 -KPX afii10037 period -125 -KPX afii10037 colon -25 -KPX afii10037 semicolon -25 -KPX afii10037 guillemotleft -38 -KPX afii10037 guillemotright -38 -KPX afii10037 afii10017 -75 -KPX afii10037 afii10021 -51 -KPX afii10037 afii10029 -38 -KPX afii10037 afii10032 -25 -KPX afii10037 afii10038 -38 -KPX afii10037 afii10047 -13 -KPX afii10037 afii10049 -25 -KPX afii10037 afii10066 -25 -KPX afii10037 afii10067 -38 -KPX afii10037 afii10068 -38 -KPX afii10037 afii10069 -63 -KPX afii10037 afii10070 -63 -KPX afii10037 afii10072 -13 -KPX afii10037 afii10073 -50 -KPX afii10037 afii10074 -38 -KPX afii10037 afii10075 -38 -KPX afii10037 afii10076 -38 -KPX afii10037 afii10077 -63 -KPX afii10037 afii10078 -50 -KPX afii10037 afii10079 -38 -KPX afii10037 afii10080 -63 -KPX afii10037 afii10081 -38 -KPX afii10037 afii10082 -38 -KPX afii10037 afii10083 -63 -KPX afii10037 afii10087 -25 -KPX afii10037 afii10088 -38 -KPX afii10037 afii10090 -38 -KPX afii10037 afii10091 -38 -KPX afii10037 afii10096 -38 -KPX afii10037 afii10097 -50 -KPX afii10038 afii10017 -25 -KPX afii10038 afii10021 -51 -KPX afii10038 afii10029 -38 -KPX afii10038 afii10036 -38 -KPX afii10038 afii10037 -38 -KPX afii10038 afii10038 -13 -KPX afii10038 afii10041 -13 -KPX afii10038 afii10049 -26 -KPX afii10038 afii10077 -25 -KPX afii10039 afii10025 -13 -KPX afii10039 afii10032 -26 -KPX afii10039 afii10035 -38 -KPX afii10039 afii10038 -38 -KPX afii10039 afii10047 -25 -KPX afii10039 afii10080 -13 -KPX afii10039 afii10085 -13 -KPX afii10040 afii10065 37 -KPX afii10040 afii10070 12 -KPX afii10040 afii10080 12 -KPX afii10043 afii10065 12 -KPX afii10044 quoteright -100 -KPX afii10044 afii10049 -38 -KPX afii10046 quoteright -75 -KPX afii10046 afii10017 -25 -KPX afii10046 afii10021 -13 -KPX afii10046 afii10024 -38 -KPX afii10046 afii10025 -25 -KPX afii10046 afii10029 -38 -KPX afii10046 afii10030 -25 -KPX afii10046 afii10032 -13 -KPX afii10046 afii10035 -25 -KPX afii10046 afii10036 -101 -KPX afii10046 afii10039 -51 -KPX afii10046 afii10041 -75 -KPX afii10046 afii10047 -38 -KPX afii10046 afii10049 -38 -KPX afii10047 afii10021 -25 -KPX afii10047 afii10024 -25 -KPX afii10047 afii10025 -13 -KPX afii10047 afii10029 -38 -KPX afii10047 afii10038 -13 -KPX afii10047 afii10039 -25 -KPX afii10047 afii10049 -25 -KPX afii10047 afii10069 -13 -KPX afii10047 afii10072 12 -KPX afii10047 afii10077 -25 -KPX afii10048 afii10017 -25 -KPX afii10048 afii10021 -25 -KPX afii10048 afii10024 -25 -KPX afii10048 afii10029 -38 -KPX afii10048 afii10035 -13 -KPX afii10048 afii10036 -25 -KPX afii10048 afii10039 -38 -KPX afii10048 afii10041 -13 -KPX afii10048 afii10069 -25 -KPX afii10048 afii10072 12 -KPX afii10048 afii10077 -25 -KPX afii10065 afii10073 12 -KPX afii10065 afii10089 -25 -KPX afii10066 afii10069 -25 -KPX afii10066 afii10072 -13 -KPX afii10066 afii10073 -13 -KPX afii10066 afii10077 -25 -KPX afii10066 afii10078 -13 -KPX afii10066 afii10083 -13 -KPX afii10066 afii10085 -13 -KPX afii10066 afii10087 -25 -KPX afii10066 afii10089 -25 -KPX afii10066 afii10092 -13 -KPX afii10066 afii10095 -13 -KPX afii10066 afii10097 -13 -KPX afii10067 afii10065 -13 -KPX afii10067 afii10066 -13 -KPX afii10067 afii10070 -13 -KPX afii10067 afii10072 -13 -KPX afii10067 afii10077 -13 -KPX afii10067 afii10078 -13 -KPX afii10067 afii10080 -13 -KPX afii10067 afii10083 -25 -KPX afii10067 afii10084 -13 -KPX afii10067 afii10085 -25 -KPX afii10067 afii10086 -13 -KPX afii10067 afii10089 -38 -KPX afii10067 afii10092 -25 -KPX afii10067 afii10097 -13 -KPX afii10068 comma -88 -KPX afii10068 period -100 -KPX afii10068 afii10069 -38 -KPX afii10068 afii10077 -25 -KPX afii10068 afii10080 -13 -KPX afii10068 afii10083 -13 -KPX afii10069 afii10073 12 -KPX afii10069 afii10083 -13 -KPX afii10069 afii10085 12 -KPX afii10069 afii10092 -13 -KPX afii10070 afii10066 -13 -KPX afii10070 afii10072 -13 -KPX afii10070 afii10078 -13 -KPX afii10070 afii10083 -13 -KPX afii10070 afii10084 -13 -KPX afii10070 afii10085 -13 -KPX afii10070 afii10087 -13 -KPX afii10070 afii10089 -25 -KPX afii10072 afii10065 12 -KPX afii10072 afii10070 -13 -KPX afii10072 afii10073 12 -KPX afii10072 afii10080 -25 -KPX afii10072 afii10083 -13 -KPX afii10072 afii10089 -25 -KPX afii10073 afii10065 -13 -KPX afii10073 afii10066 -25 -KPX afii10073 afii10070 -13 -KPX afii10073 afii10072 -13 -KPX afii10073 afii10073 -13 -KPX afii10073 afii10077 -13 -KPX afii10073 afii10078 -25 -KPX afii10073 afii10080 -25 -KPX afii10073 afii10083 -25 -KPX afii10073 afii10085 -25 -KPX afii10073 afii10086 -13 -KPX afii10073 afii10089 -38 -KPX afii10073 afii10092 -25 -KPX afii10076 afii10077 12 -KPX afii10076 afii10080 -13 -KPX afii10076 afii10083 -13 -KPX afii10076 afii10086 -13 -KPX afii10076 afii10089 -13 -KPX afii10076 afii10095 -13 -KPX afii10077 afii10066 -13 -KPX afii10077 afii10070 -13 -KPX afii10077 afii10080 -13 -KPX afii10077 afii10083 -13 -KPX afii10077 afii10085 -13 -KPX afii10077 afii10089 -25 -KPX afii10078 afii10065 -13 -KPX afii10078 afii10066 -13 -KPX afii10078 afii10073 -13 -KPX afii10078 afii10080 -13 -KPX afii10078 afii10083 -13 -KPX afii10078 afii10085 -13 -KPX afii10078 afii10086 -13 -KPX afii10078 afii10095 -13 -KPX afii10080 afii10069 -13 -KPX afii10080 afii10072 -13 -KPX afii10080 afii10073 -13 -KPX afii10080 afii10077 -25 -KPX afii10080 afii10078 -13 -KPX afii10080 afii10083 -13 -KPX afii10080 afii10084 -25 -KPX afii10080 afii10085 -13 -KPX afii10080 afii10087 -25 -KPX afii10080 afii10089 -25 -KPX afii10080 afii10095 -13 -KPX afii10080 afii10097 -13 -KPX afii10082 afii10069 -25 -KPX afii10082 afii10072 -13 -KPX afii10082 afii10073 -13 -KPX afii10082 afii10077 -25 -KPX afii10082 afii10078 -13 -KPX afii10082 afii10084 -13 -KPX afii10082 afii10085 -13 -KPX afii10082 afii10087 -13 -KPX afii10082 afii10089 -25 -KPX afii10082 afii10095 -13 -KPX afii10082 afii10097 -13 -KPX afii10083 afii10065 12 -KPX afii10083 afii10066 -13 -KPX afii10083 afii10087 -13 -KPX afii10083 afii10089 -26 -KPX afii10083 afii10092 -13 -KPX afii10084 comma -75 -KPX afii10084 period -88 -KPX afii10084 afii10069 -13 -KPX afii10084 afii10072 12 -KPX afii10084 afii10077 -13 -KPX afii10084 afii10080 -13 -KPX afii10084 afii10083 -13 -KPX afii10084 afii10085 25 -KPX afii10085 comma -75 -KPX afii10085 period -88 -KPX afii10085 colon -13 -KPX afii10085 semicolon -13 -KPX afii10085 guillemotright 25 -KPX afii10085 afii10065 -13 -KPX afii10085 afii10069 -25 -KPX afii10085 afii10070 -13 -KPX afii10085 afii10072 12 -KPX afii10085 afii10073 -13 -KPX afii10085 afii10077 -13 -KPX afii10085 afii10078 -13 -KPX afii10085 afii10080 -25 -KPX afii10085 afii10082 -13 -KPX afii10085 afii10083 -25 -KPX afii10085 afii10084 12 -KPX afii10085 afii10086 -13 -KPX afii10085 afii10087 12 -KPX afii10085 afii10095 -13 -KPX afii10085 afii10097 -13 -KPX afii10086 afii10066 -13 -KPX afii10086 afii10069 -13 -KPX afii10086 afii10070 -13 -KPX afii10086 afii10077 -25 -KPX afii10086 afii10078 -13 -KPX afii10086 afii10080 -13 -KPX afii10086 afii10084 -13 -KPX afii10086 afii10085 -13 -KPX afii10086 afii10089 -25 -KPX afii10086 afii10097 -13 -KPX afii10087 afii10066 -13 -KPX afii10087 afii10070 -25 -KPX afii10087 afii10073 -13 -KPX afii10087 afii10080 -25 -KPX afii10087 afii10083 -25 -KPX afii10087 afii10085 12 -KPX afii10087 afii10086 -13 -KPX afii10087 afii10089 -25 -KPX afii10087 afii10095 -13 -KPX afii10088 afii10065 12 -KPX afii10088 afii10073 12 -KPX afii10088 afii10083 -13 -KPX afii10091 afii10065 12 -KPX afii10091 afii10080 -13 -KPX afii10094 afii10084 -88 -KPX afii10094 afii10089 -88 -KPX afii10095 afii10066 -13 -KPX afii10095 afii10069 -13 -KPX afii10095 afii10072 -13 -KPX afii10095 afii10073 -13 -KPX afii10095 afii10077 -25 -KPX afii10095 afii10078 -13 -KPX afii10095 afii10083 -13 -KPX afii10095 afii10084 -13 -KPX afii10095 afii10087 -13 -KPX afii10095 afii10097 -13 -KPX afii10096 afii10066 -13 -KPX afii10096 afii10069 -13 -KPX afii10096 afii10072 -13 -KPX afii10096 afii10077 -25 -KPX afii10096 afii10078 -13 -KPX afii10096 afii10083 -13 -KPX afii10096 afii10084 -25 -KPX afii10096 afii10087 -25 -KPX afii10096 afii10089 -38 -KPX afii10096 afii10095 -13 -KPX afii10110 comma -75 -KPX afii10110 period -88 -KPX afii10110 colon -13 -KPX afii10110 semicolon -13 -KPX afii10110 guillemotleft -25 -KPX afii10050 comma -63 -KPX afii10050 period -75 -KPX afii10050 colon -13 -KPX afii10050 semicolon -13 -KPX afii10050 guillemotleft -25 -KPX afii10050 guillemotright -25 -KPX pi alpha -28 -KPX pi delta -28 -KPX pi sigma -28 -KPX pi phi -28 -KPX pi alphatonos -28 -KPX pi zeta -28 -KPX pi lambda -37 -KPX pi omicron -28 -KPX pi sigma1 -28 -KPX pi omega -28 -KPX pi omegatonos -28 -EndKernPairs -EndKernData -EndFontMetrics +StartFontMetrics 4.1 +FontName Arial-BoldMT +FullName Arial Bold +Notice Typeface The Monotype Corporation plc. Data The Monotype Corporation plc/Type Solutions Inc. 1990-1992. All Rights Reserved +EncodingScheme FontSpecific +FamilyName Arial +Weight Bold +Version Version 3.00 +Characters 1674 +ItalicAngle 0.0 +Ascender 905 +Descender -212 +UnderlineThickness 105 +UnderlinePosition -106 +IsFixedPitch false +FontBBox -627 -376 2000 1010 +StartCharMetrics 1709 +C 0 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 1 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 2 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 3 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 4 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 5 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 6 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 7 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 8 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 9 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 10 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 11 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 12 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 13 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 14 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 15 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 16 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 17 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 18 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 19 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 20 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 21 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 22 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 23 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 24 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 25 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 26 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 27 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 28 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 29 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 30 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 31 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 32 ; WX 278 ; N space ; B 90 0 238 716 ; +C 33 ; WX 333 ; N exclam ; B 90 0 238 716 ; +C 34 ; WX 474 ; N quotedbl ; B 55 461 424 716 ; +C 35 ; WX 556 ; N numbersign ; B 9 -12 544 728 ; +C 36 ; WX 556 ; N dollar ; B 34 -100 512 773 ; +C 37 ; WX 889 ; N percent ; B 43 -29 842 728 ; +C 38 ; WX 722 ; N ampersand ; B 44 -19 706 728 ; +C 39 ; WX 238 ; N quotesingle ; B 45 461 194 716 ; +C 40 ; WX 333 ; N parenleft ; B 52 -210 301 728 ; +C 41 ; WX 333 ; N parenright ; B 33 -210 281 728 ; +C 42 ; WX 389 ; N asterisk ; B 14 387 368 728 ; +C 43 ; WX 584 ; N plus ; B 42 103 542 604 ; +C 44 ; WX 278 ; N comma ; B 57 -160 206 137 ; +C 45 ; WX 333 ; N hyphen ; B 32 191 301 328 ; +C 46 ; WX 278 ; N period ; B 72 0 209 137 ; +C 47 ; WX 278 ; N slash ; B -1 -12 279 728 ; +C 48 ; WX 556 ; N zero ; B 42 -12 507 719 ; +C 49 ; WX 556 ; N one ; B 79 0 394 719 ; +C 50 ; WX 556 ; N two ; B 25 0 506 719 ; +C 51 ; WX 556 ; N three ; B 38 -12 513 719 ; +C 52 ; WX 556 ; N four ; B 19 0 533 719 ; +C 53 ; WX 556 ; N five ; B 44 -12 526 706 ; +C 54 ; WX 556 ; N six ; B 42 -12 521 719 ; +C 55 ; WX 556 ; N seven ; B 42 0 512 706 ; +C 56 ; WX 556 ; N eight ; B 41 -13 511 719 ; +C 57 ; WX 556 ; N nine ; B 32 -13 510 719 ; +C 58 ; WX 333 ; N colon ; B 98 0 235 519 ; +C 59 ; WX 333 ; N semicolon ; B 83 -160 231 519 ; +C 60 ; WX 584 ; N less ; B 46 82 537 625 ; +C 61 ; WX 584 ; N equal ; B 42 182 542 524 ; +C 62 ; WX 584 ; N greater ; B 46 81 538 625 ; +C 63 ; WX 611 ; N question ; B 52 0 565 723 ; +C 64 ; WX 975 ; N at ; B 30 -210 972 729 ; +C 65 ; WX 722 ; N A ; B 0 0 718 716 ; +C 66 ; WX 722 ; N B ; B 73 0 673 716 ; +C 67 ; WX 722 ; N C ; B 47 -12 671 728 ; +C 68 ; WX 722 ; N D ; B 72 0 672 716 ; +C 69 ; WX 667 ; N E ; B 73 0 617 716 ; +C 70 ; WX 611 ; N F ; B 74 0 564 716 ; +C 71 ; WX 778 ; N G ; B 48 -12 717 728 ; +C 72 ; WX 722 ; N H ; B 73 0 646 716 ; +C 73 ; WX 278 ; N I ; B 68 0 213 716 ; +C 74 ; WX 556 ; N J ; B 17 -12 475 716 ; +C 75 ; WX 722 ; N K ; B 75 0 720 716 ; +C 76 ; WX 611 ; N L ; B 77 0 581 710 ; +C 77 ; WX 833 ; N M ; B 71 0 762 716 ; +C 78 ; WX 722 ; N N ; B 74 0 642 716 ; +C 79 ; WX 778 ; N O ; B 43 -12 738 728 ; +C 80 ; WX 667 ; N P ; B 73 0 621 716 ; +C 81 ; WX 778 ; N Q ; B 43 -72 765 728 ; +C 82 ; WX 722 ; N R ; B 73 0 717 716 ; +C 83 ; WX 667 ; N S ; B 36 -13 618 728 ; +C 84 ; WX 611 ; N T ; B 21 0 590 716 ; +C 85 ; WX 722 ; N U ; B 72 -12 643 716 ; +C 86 ; WX 667 ; N V ; B 0 0 666 716 ; +C 87 ; WX 944 ; N W ; B 3 0 943 716 ; +C 88 ; WX 667 ; N X ; B 0 0 666 716 ; +C 89 ; WX 667 ; N Y ; B -1 0 668 716 ; +C 90 ; WX 611 ; N Z ; B 11 0 592 716 ; +C 91 ; WX 333 ; N bracketleft ; B 71 -202 314 716 ; +C 92 ; WX 278 ; N backslash ; B -1 -12 279 728 ; +C 93 ; WX 333 ; N bracketright ; B 19 -202 262 716 ; +C 94 ; WX 584 ; N asciicircum ; B 56 338 527 728 ; +C 95 ; WX 556 ; N underscore ; B -9 -198 561 -109 ; +C 96 ; WX 333 ; N grave ; B 21 582 242 728 ; +C 97 ; WX 556 ; N a ; B 36 -12 522 530 ; +C 98 ; WX 611 ; N b ; B 66 -12 572 716 ; +C 99 ; WX 556 ; N c ; B 42 -12 531 530 ; +C 100 ; WX 611 ; N d ; B 41 -12 547 716 ; +C 101 ; WX 556 ; N e ; B 32 -12 519 530 ; +C 102 ; WX 333 ; N f ; B 12 0 362 728 ; +C 103 ; WX 611 ; N g ; B 41 -210 547 530 ; +C 104 ; WX 611 ; N h ; B 71 0 543 716 ; +C 105 ; WX 278 ; N i ; B 72 0 209 716 ; +C 106 ; WX 278 ; N j ; B -46 -210 206 716 ; +C 107 ; WX 556 ; N k ; B 67 0 546 716 ; +C 108 ; WX 278 ; N l ; B 72 0 209 716 ; +C 109 ; WX 889 ; N m ; B 62 0 824 530 ; +C 110 ; WX 611 ; N n ; B 71 0 543 530 ; +C 111 ; WX 611 ; N o ; B 40 -12 575 530 ; +C 112 ; WX 611 ; N p ; B 68 -197 574 530 ; +C 113 ; WX 611 ; N q ; B 44 -197 548 530 ; +C 114 ; WX 389 ; N r ; B 66 0 402 530 ; +C 115 ; WX 556 ; N s ; B 23 -12 508 530 ; +C 116 ; WX 333 ; N t ; B 15 -12 321 702 ; +C 117 ; WX 611 ; N u ; B 69 -12 541 519 ; +C 118 ; WX 556 ; N v ; B 5 0 544 519 ; +C 119 ; WX 778 ; N w ; B 4 0 777 519 ; +C 120 ; WX 556 ; N x ; B 6 0 547 519 ; +C 121 ; WX 556 ; N y ; B 7 -210 540 519 ; +C 122 ; WX 500 ; N z ; B 17 0 479 519 ; +C 123 ; WX 389 ; N braceleft ; B 29 -210 363 728 ; +C 124 ; WX 280 ; N bar ; B 86 -210 195 728 ; +C 125 ; WX 389 ; N braceright ; B 22 -210 356 728 ; +C 126 ; WX 584 ; N asciitilde ; B 33 253 551 451 ; +C 127 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 128 ; WX 556 ; N Euro ; B -16 -12 525 728 ; +C 129 ; WX 567 ; N afii10052 ; B 75 0 579 903 ; +C 130 ; WX 278 ; N quotesinglbase ; B 57 -160 206 137 ; +C 131 ; WX 556 ; N florin ; B -10 -210 558 728 ; +C 132 ; WX 500 ; N quotedblbase ; B 51 -160 430 137 ; +C 133 ; WX 1000 ; N ellipsis ; B 98 0 902 137 ; +C 134 ; WX 556 ; N dagger ; B 33 -171 517 707 ; +C 135 ; WX 556 ; N daggerdbl ; B 33 -171 517 707 ; +C 136 ; WX 333 ; N circumflex ; B 1 584 332 728 ; +C 137 ; WX 1000 ; N perthousand ; B 0 -29 1000 728 ; +C 138 ; WX 667 ; N Scaron ; B 36 -13 618 904 ; +C 139 ; WX 333 ; N guilsinglleft ; B 37 34 299 480 ; +C 140 ; WX 1000 ; N OE ; B 35 -12 969 728 ; +C 141 ; WX 610 ; N afii10061 ; B 75 0 602 903 ; +C 142 ; WX 611 ; N Zcaron ; B 11 0 592 904 ; +C 143 ; WX 719 ; N afii10145 ; B 75 -197 644 716 ; +C 144 ; WX 500 ; N quotedblbase ; B 51 -160 430 137 ; +C 145 ; WX 278 ; N quoteleft ; B 74 426 223 723 ; +C 146 ; WX 278 ; N quoteright ; B 57 417 206 714 ; +C 147 ; WX 500 ; N quotedblleft ; B 64 426 442 723 ; +C 148 ; WX 500 ; N quotedblright ; B 51 418 430 716 ; +C 149 ; WX 350 ; N bullet ; B 32 209 321 498 ; +C 150 ; WX 556 ; N endash ; B -2 208 554 311 ; +C 151 ; WX 1000 ; N emdash ; B 0 208 1000 311 ; +C 152 ; WX 333 ; N tilde ; B -6 588 332 713 ; +C 153 ; WX 1000 ; N trademark ; B 105 316 877 716 ; +C 154 ; WX 556 ; N scaron ; B 23 -12 508 728 ; +C 155 ; WX 333 ; N guilsinglright ; B 37 34 299 480 ; +C 156 ; WX 944 ; N oe ; B 43 -12 903 530 ; +C 157 ; WX 500 ; N afii10109 ; B 66 0 501 728 ; +C 158 ; WX 500 ; N zcaron ; B 17 0 479 728 ; +C 159 ; WX 667 ; N Ydieresis ; B -1 0 668 875 ; +C 160 ; WX 278 ; N space ; B 90 0 238 716 ; +C 161 ; WX 333 ; N exclamdown ; B 95 -199 244 519 ; +C 162 ; WX 556 ; N cent ; B 41 -197 530 711 ; +C 163 ; WX 556 ; N sterling ; B 6 -12 541 728 ; +C 164 ; WX 556 ; N currency ; B 22 101 531 610 ; +C 165 ; WX 556 ; N yen ; B 0 0 551 716 ; +C 166 ; WX 280 ; N brokenbar ; B 86 -210 195 728 ; +C 167 ; WX 556 ; N section ; B 29 -210 521 728 ; +C 168 ; WX 333 ; N dieresis ; B 2 610 331 728 ; +C 169 ; WX 737 ; N copyright ; B -4 -18 744 730 ; +C 170 ; WX 370 ; N ordfeminine ; B 18 363 346 728 ; +C 171 ; WX 556 ; N guillemotleft ; B 47 34 500 480 ; +C 172 ; WX 584 ; N logicalnot ; B 42 184 542 524 ; +C 173 ; WX 333 ; N hyphen ; B 32 191 301 328 ; +C 174 ; WX 737 ; N registered ; B -4 -18 744 730 ; +C 175 ; WX 552 ; N overscore ; B -9 758 561 847 ; +C 176 ; WX 400 ; N degree ; B 42 417 354 728 ; +C 177 ; WX 549 ; N plusminus ; B 24 0 525 674 ; +C 178 ; WX 333 ; N twosuperior ; B 12 355 309 725 ; +C 179 ; WX 333 ; N threesuperior ; B 20 349 313 725 ; +C 180 ; WX 333 ; N acute ; B 91 582 313 728 ; +C 181 ; WX 576 ; N mu1 ; B 54 -199 526 519 ; +C 182 ; WX 556 ; N paragraph ; B -1 -197 551 716 ; +C 183 ; WX 278 ; N periodcentered ; B 72 280 209 417 ; +C 184 ; WX 333 ; N cedilla ; B 19 -205 285 -6 ; +C 185 ; WX 333 ; N onesuperior ; B 44 355 242 725 ; +C 186 ; WX 365 ; N ordmasculine ; B 13 361 352 728 ; +C 187 ; WX 556 ; N guillemotright ; B 52 34 505 480 ; +C 188 ; WX 834 ; N onequarter ; B 45 -26 824 725 ; +C 189 ; WX 834 ; N onehalf ; B 45 -26 809 725 ; +C 190 ; WX 834 ; N threequarters ; B 20 -26 824 725 ; +C 191 ; WX 611 ; N questiondown ; B 49 -205 563 519 ; +C 192 ; WX 722 ; N Agrave ; B 0 0 718 903 ; +C 193 ; WX 722 ; N Aacute ; B 0 0 718 903 ; +C 194 ; WX 722 ; N Acircumflex ; B 0 0 718 901 ; +C 195 ; WX 722 ; N Atilde ; B 0 0 718 880 ; +C 196 ; WX 722 ; N Adieresis ; B 0 0 718 875 ; +C 197 ; WX 722 ; N Aring ; B 0 0 718 858 ; +C 198 ; WX 1000 ; N AE ; B -42 0 952 716 ; +C 199 ; WX 722 ; N Ccedilla ; B 47 -205 671 728 ; +C 200 ; WX 667 ; N Egrave ; B 73 0 617 903 ; +C 201 ; WX 667 ; N Eacute ; B 73 0 617 903 ; +C 202 ; WX 667 ; N Ecircumflex ; B 73 0 617 901 ; +C 203 ; WX 667 ; N Edieresis ; B 73 0 617 875 ; +C 204 ; WX 278 ; N Igrave ; B -5 0 216 903 ; +C 205 ; WX 278 ; N Iacute ; B 52 0 273 903 ; +C 206 ; WX 278 ; N Icircumflex ; B -21 0 310 901 ; +C 207 ; WX 278 ; N Idieresis ; B -22 0 306 875 ; +C 208 ; WX 722 ; N Eth ; B -1 0 673 716 ; +C 209 ; WX 722 ; N Ntilde ; B 74 0 642 880 ; +C 210 ; WX 778 ; N Ograve ; B 43 -12 738 903 ; +C 211 ; WX 778 ; N Oacute ; B 43 -12 738 903 ; +C 212 ; WX 778 ; N Ocircumflex ; B 43 -12 738 901 ; +C 213 ; WX 778 ; N Otilde ; B 43 -12 738 880 ; +C 214 ; WX 778 ; N Odieresis ; B 43 -12 738 875 ; +C 215 ; WX 584 ; N multiply ; B 53 115 530 591 ; +C 216 ; WX 778 ; N Oslash ; B 31 -40 750 750 ; +C 217 ; WX 722 ; N Ugrave ; B 72 -12 643 903 ; +C 218 ; WX 722 ; N Uacute ; B 72 -12 643 903 ; +C 219 ; WX 722 ; N Ucircumflex ; B 72 -12 643 901 ; +C 220 ; WX 722 ; N Udieresis ; B 72 -12 643 875 ; +C 221 ; WX 667 ; N Yacute ; B -1 0 668 903 ; +C 222 ; WX 667 ; N Thorn ; B 73 0 621 716 ; +C 223 ; WX 611 ; N germandbls ; B 68 -12 576 728 ; +C 224 ; WX 556 ; N agrave ; B 36 -12 522 728 ; +C 225 ; WX 556 ; N aacute ; B 36 -12 522 728 ; +C 226 ; WX 556 ; N acircumflex ; B 36 -12 522 728 ; +C 227 ; WX 556 ; N atilde ; B 36 -12 522 713 ; +C 228 ; WX 556 ; N adieresis ; B 36 -12 522 728 ; +C 229 ; WX 556 ; N aring ; B 36 -12 522 751 ; +C 230 ; WX 889 ; N ae ; B 43 -12 842 530 ; +C 231 ; WX 556 ; N ccedilla ; B 42 -205 531 530 ; +C 232 ; WX 556 ; N egrave ; B 32 -12 519 728 ; +C 233 ; WX 556 ; N eacute ; B 32 -12 519 728 ; +C 234 ; WX 556 ; N ecircumflex ; B 32 -12 519 728 ; +C 235 ; WX 556 ; N edieresis ; B 32 -12 519 728 ; +C 236 ; WX 278 ; N igrave ; B -11 0 210 728 ; +C 237 ; WX 278 ; N iacute ; B 62 0 283 728 ; +C 238 ; WX 278 ; N icircumflex ; B -25 0 306 728 ; +C 239 ; WX 278 ; N idieresis ; B -23 0 305 728 ; +C 240 ; WX 611 ; N eth ; B 41 -12 574 716 ; +C 241 ; WX 611 ; N ntilde ; B 71 0 543 713 ; +C 242 ; WX 611 ; N ograve ; B 40 -12 575 728 ; +C 243 ; WX 611 ; N oacute ; B 40 -12 575 728 ; +C 244 ; WX 611 ; N ocircumflex ; B 40 -12 575 728 ; +C 245 ; WX 611 ; N otilde ; B 40 -12 575 713 ; +C 246 ; WX 611 ; N odieresis ; B 40 -12 575 728 ; +C 247 ; WX 549 ; N divide ; B 24 90 524 616 ; +C 248 ; WX 611 ; N oslash ; B 42 -36 578 546 ; +C 249 ; WX 611 ; N ugrave ; B 69 -12 541 728 ; +C 250 ; WX 611 ; N uacute ; B 69 -12 541 728 ; +C 251 ; WX 611 ; N ucircumflex ; B 69 -12 541 728 ; +C 252 ; WX 611 ; N udieresis ; B 69 -12 541 728 ; +C 253 ; WX 556 ; N yacute ; B 7 -210 540 728 ; +C 254 ; WX 611 ; N thorn ; B 68 -197 574 716 ; +C 255 ; WX 556 ; N ydieresis ; B 7 -210 540 728 ; +C -1 ; WX 0 ; N .null ; B 90 0 238 716 ; +C -1 ; WX 278 ; N nonmarkingreturn ; B 90 0 238 716 ; +C -1 ; WX 549 ; N notequal ; B 24 -12 524 719 ; +C -1 ; WX 713 ; N infinity ; B 74 182 640 523 ; +C -1 ; WX 549 ; N lessequal ; B 29 0 520 708 ; +C -1 ; WX 549 ; N greaterequal ; B 29 0 520 708 ; +C -1 ; WX 494 ; N partialdiff ; B 20 -12 475 728 ; +C -1 ; WX 713 ; N summation ; B 60 -210 677 728 ; +C -1 ; WX 823 ; N product ; B 79 -210 744 728 ; +C -1 ; WX 549 ; N pi1 ; B 0 0 549 519 ; +C -1 ; WX 274 ; N integral ; B 0 -107 273 910 ; +C -1 ; WX 768 ; N Ohm ; B 27 0 747 734 ; +C -1 ; WX 549 ; N radical ; B 42 -38 550 913 ; +C -1 ; WX 549 ; N approxequal ; B 15 135 534 569 ; +C -1 ; WX 612 ; N increment ; B 14 0 600 677 ; +C -1 ; WX 494 ; N lozenge ; B 23 0 472 694 ; +C -1 ; WX 167 ; N fraction ; B -167 -26 334 725 ; +C -1 ; WX 611 ; N fi ; B 15 0 538 728 ; +C -1 ; WX 611 ; N fl ; B 15 0 538 728 ; +C -1 ; WX 278 ; N dotlessi ; B 72 0 209 519 ; +C -1 ; WX 333 ; N macron ; B 9 604 324 694 ; +C -1 ; WX 333 ; N breve ; B 13 586 317 728 ; +C -1 ; WX 333 ; N dotaccent ; B 100 598 235 728 ; +C -1 ; WX 333 ; N ring ; B 71 560 262 751 ; +C -1 ; WX 333 ; N hungarumlaut ; B 47 584 439 730 ; +C -1 ; WX 333 ; N ogonek ; B 78 -210 295 13 ; +C -1 ; WX 333 ; N caron ; B 1 584 332 728 ; +C -1 ; WX 611 ; N Lslash ; B 5 0 584 716 ; +C -1 ; WX 278 ; N lslash ; B 5 0 276 716 ; +C -1 ; WX 584 ; N minus ; B 42 289 542 417 ; +C -1 ; WX 556 ; N franc ; B 0 0 506 716 ; +C -1 ; WX 778 ; N Gbreve ; B 48 -12 717 896 ; +C -1 ; WX 611 ; N gbreve ; B 41 -210 547 728 ; +C -1 ; WX 278 ; N Idot ; B 68 0 213 887 ; +C -1 ; WX 667 ; N Scedilla ; B 36 -205 618 728 ; +C -1 ; WX 556 ; N scedilla ; B 23 -205 508 530 ; +C -1 ; WX 722 ; N Cacute ; B 47 -12 671 903 ; +C -1 ; WX 556 ; N cacute ; B 42 -12 531 728 ; +C -1 ; WX 722 ; N Ccaron ; B 47 -12 671 904 ; +C -1 ; WX 556 ; N ccaron ; B 42 -12 531 728 ; +C -1 ; WX 611 ; N dmacron ; B 41 -12 602 716 ; +C -1 ; WX 333 ; N middot ; B 239 280 376 417 ; +C -1 ; WX 722 ; N Abreve ; B 0 0 718 896 ; +C -1 ; WX 556 ; N abreve ; B 36 -12 522 728 ; +C -1 ; WX 722 ; N Aogonek ; B 0 -210 764 716 ; +C -1 ; WX 556 ; N aogonek ; B 36 -210 591 530 ; +C -1 ; WX 722 ; N Dcaron ; B 72 0 672 904 ; +C -1 ; WX 719 ; N dcaron ; B 40 -12 719 716 ; +C -1 ; WX 722 ; N Dslash ; B -1 0 673 716 ; +C -1 ; WX 667 ; N Eogonek ; B 73 -210 617 716 ; +C -1 ; WX 556 ; N eogonek ; B 32 -210 519 530 ; +C -1 ; WX 667 ; N Ecaron ; B 73 0 617 904 ; +C -1 ; WX 556 ; N ecaron ; B 32 -12 519 728 ; +C -1 ; WX 611 ; N Lacute ; B 77 0 581 903 ; +C -1 ; WX 278 ; N lacute ; B 59 0 280 898 ; +C -1 ; WX 611 ; N Lcaron ; B 77 0 581 710 ; +C -1 ; WX 385 ; N lcaron ; B 73 0 383 716 ; +C -1 ; WX 611 ; N Ldot ; B 77 0 581 710 ; +C -1 ; WX 479 ; N ldot ; B 72 0 409 716 ; +C -1 ; WX 722 ; N Nacute ; B 74 0 642 903 ; +C -1 ; WX 611 ; N nacute ; B 71 0 543 728 ; +C -1 ; WX 722 ; N Ncaron ; B 74 0 642 904 ; +C -1 ; WX 611 ; N ncaron ; B 71 0 543 728 ; +C -1 ; WX 778 ; N Odblacute ; B 43 -12 738 902 ; +C -1 ; WX 611 ; N odblacute ; B 40 -12 575 730 ; +C -1 ; WX 722 ; N Racute ; B 73 0 717 903 ; +C -1 ; WX 389 ; N racute ; B 66 0 402 728 ; +C -1 ; WX 722 ; N Rcaron ; B 73 0 717 904 ; +C -1 ; WX 389 ; N rcaron ; B 39 0 402 728 ; +C -1 ; WX 667 ; N Sacute ; B 36 -13 618 903 ; +C -1 ; WX 556 ; N sacute ; B 23 -12 508 728 ; +C -1 ; WX 611 ; N Tcedilla ; B 21 -319 590 716 ; +C -1 ; WX 333 ; N tcedilla ; B 15 -293 321 702 ; +C -1 ; WX 611 ; N Tcaron ; B 21 0 590 904 ; +C -1 ; WX 479 ; N tcaron ; B 15 -12 480 716 ; +C -1 ; WX 722 ; N Uring ; B 72 -12 643 919 ; +C -1 ; WX 611 ; N uring ; B 69 -12 541 751 ; +C -1 ; WX 722 ; N Udblacute ; B 72 -12 643 902 ; +C -1 ; WX 611 ; N udblacute ; B 69 -12 548 730 ; +C -1 ; WX 611 ; N Zacute ; B 11 0 592 903 ; +C -1 ; WX 500 ; N zacute ; B 17 0 479 728 ; +C -1 ; WX 611 ; N Zdot ; B 11 0 592 890 ; +C -1 ; WX 500 ; N zdot ; B 17 0 479 728 ; +C -1 ; WX 601 ; N Gamma ; B 75 0 579 716 ; +C -1 ; WX 778 ; N Theta ; B 42 -12 736 728 ; +C -1 ; WX 821 ; N Phi ; B 42 -29 779 734 ; +C -1 ; WX 615 ; N alpha ; B 38 -12 582 530 ; +C -1 ; WX 606 ; N delta ; B 38 -12 569 716 ; +C -1 ; WX 475 ; N epsilon ; B 38 -12 463 530 ; +C -1 ; WX 684 ; N sigma ; B 38 -12 661 530 ; +C -1 ; WX 446 ; N tau ; B 23 0 422 519 ; +C -1 ; WX 715 ; N phi ; B 38 -197 678 531 ; +C -1 ; WX 552 ; N underscoredbl ; B -9 -376 561 -109 ; +C -1 ; WX 604 ; N exclamdbl ; B 90 0 509 716 ; +C -1 ; WX 396 ; N nsuperior ; B 39 253 357 585 ; +C -1 ; WX 1094 ; N peseta ; B 20 -13 1075 716 ; +C -1 ; WX 1000 ; N arrowleft ; B 39 77 961 428 ; +C -1 ; WX 500 ; N arrowup ; B 75 -209 426 654 ; +C -1 ; WX 1000 ; N arrowright ; B 39 77 961 428 ; +C -1 ; WX 500 ; N arrowdown ; B 75 -209 426 654 ; +C -1 ; WX 1000 ; N arrowboth ; B 39 77 961 429 ; +C -1 ; WX 500 ; N arrowupdn ; B 74 -208 425 714 ; +C -1 ; WX 500 ; N arrowupdnbse ; B 74 -303 425 714 ; +C -1 ; WX 979 ; N orthogonal ; B 177 0 802 625 ; +C -1 ; WX 722 ; N intersection ; B 70 0 648 719 ; +C -1 ; WX 583 ; N equivalence ; B 42 73 542 633 ; +C -1 ; WX 604 ; N house ; B 77 0 527 563 ; +C -1 ; WX 584 ; N revlogicalnot ; B 42 184 542 524 ; +C -1 ; WX 604 ; N integraltp ; B 267 -251 477 848 ; +C -1 ; WX 604 ; N integralbt ; B 127 -251 337 848 ; +C -1 ; WX 708 ; N SF100000 ; B -11 261 719 346 ; +C -1 ; WX 625 ; N SF110000 ; B 223 -303 309 910 ; +C -1 ; WX 708 ; N SF010000 ; B 312 -303 720 346 ; +C -1 ; WX 708 ; N SF030000 ; B -11 -303 396 346 ; +C -1 ; WX 708 ; N SF020000 ; B 312 261 720 910 ; +C -1 ; WX 708 ; N SF040000 ; B -11 261 396 910 ; +C -1 ; WX 708 ; N SF080000 ; B 312 -303 720 910 ; +C -1 ; WX 708 ; N SF090000 ; B -11 -303 396 910 ; +C -1 ; WX 708 ; N SF060000 ; B -11 -303 719 346 ; +C -1 ; WX 708 ; N SF070000 ; B -11 261 719 910 ; +C -1 ; WX 708 ; N SF050000 ; B -11 -303 719 910 ; +C -1 ; WX 708 ; N SF430000 ; B -11 168 719 439 ; +C -1 ; WX 708 ; N SF240000 ; B 219 -303 490 910 ; +C -1 ; WX 708 ; N SF510000 ; B 312 -303 720 439 ; +C -1 ; WX 708 ; N SF520000 ; B 219 -303 720 346 ; +C -1 ; WX 708 ; N SF390000 ; B 219 -303 719 439 ; +C -1 ; WX 708 ; N SF220000 ; B -11 -303 396 439 ; +C -1 ; WX 708 ; N SF210000 ; B -11 -303 489 346 ; +C -1 ; WX 708 ; N SF250000 ; B -11 -303 489 439 ; +C -1 ; WX 708 ; N SF500000 ; B 312 168 720 910 ; +C -1 ; WX 708 ; N SF490000 ; B 219 261 720 910 ; +C -1 ; WX 708 ; N SF380000 ; B 219 168 719 910 ; +C -1 ; WX 708 ; N SF280000 ; B -11 168 396 910 ; +C -1 ; WX 708 ; N SF270000 ; B -11 261 489 910 ; +C -1 ; WX 708 ; N SF260000 ; B -11 168 489 910 ; +C -1 ; WX 708 ; N SF360000 ; B 312 -303 720 910 ; +C -1 ; WX 708 ; N SF370000 ; B 219 -303 720 910 ; +C -1 ; WX 708 ; N SF420000 ; B 219 -303 720 910 ; +C -1 ; WX 708 ; N SF190000 ; B -11 -303 396 910 ; +C -1 ; WX 708 ; N SF200000 ; B -11 -303 489 910 ; +C -1 ; WX 708 ; N SF230000 ; B -11 -303 489 910 ; +C -1 ; WX 708 ; N SF470000 ; B -11 -303 719 439 ; +C -1 ; WX 708 ; N SF480000 ; B -11 -303 719 346 ; +C -1 ; WX 708 ; N SF410000 ; B -11 -303 719 439 ; +C -1 ; WX 708 ; N SF450000 ; B -11 168 719 910 ; +C -1 ; WX 708 ; N SF460000 ; B -11 261 719 910 ; +C -1 ; WX 708 ; N SF400000 ; B -11 168 719 910 ; +C -1 ; WX 708 ; N SF540000 ; B -11 -303 719 910 ; +C -1 ; WX 708 ; N SF530000 ; B -11 -303 719 910 ; +C -1 ; WX 708 ; N SF440000 ; B -11 -303 719 910 ; +C -1 ; WX 708 ; N upblock ; B -11 303 719 910 ; +C -1 ; WX 708 ; N dnblock ; B -11 -303 719 303 ; +C -1 ; WX 708 ; N block ; B -11 -303 719 910 ; +C -1 ; WX 708 ; N lfblock ; B -11 -303 354 910 ; +C -1 ; WX 708 ; N rtblock ; B 354 -303 720 910 ; +C -1 ; WX 708 ; N ltshade ; B 50 -246 719 910 ; +C -1 ; WX 708 ; N shade ; B -11 -246 719 910 ; +C -1 ; WX 729 ; N dkshade ; B 0 -307 729 910 ; +C -1 ; WX 604 ; N filledbox ; B 71 0 532 461 ; +C -1 ; WX 1000 ; N filledrect ; B 0 155 1000 343 ; +C -1 ; WX 990 ; N triagup ; B 148 0 842 693 ; +C -1 ; WX 990 ; N triagrt ; B 141 -15 849 692 ; +C -1 ; WX 990 ; N triagdn ; B 148 -15 842 678 ; +C -1 ; WX 990 ; N triaglf ; B 141 -15 849 692 ; +C -1 ; WX 604 ; N circle ; B 87 67 517 497 ; +C -1 ; WX 604 ; N invbullet ; B 63 0 541 479 ; +C -1 ; WX 604 ; N invcircle ; B 21 0 584 564 ; +C -1 ; WX 1021 ; N smileface ; B 199 -58 822 564 ; +C -1 ; WX 1052 ; N invsmileface ; B 215 -58 837 564 ; +C -1 ; WX 917 ; N sun ; B 8 -109 909 792 ; +C -1 ; WX 750 ; N female ; B 119 -214 630 736 ; +C -1 ; WX 750 ; N male ; B 54 -128 691 791 ; +C -1 ; WX 531 ; N spade ; B 28 0 503 601 ; +C -1 ; WX 656 ; N club ; B 27 0 629 601 ; +C -1 ; WX 594 ; N heart ; B 31 -12 563 601 ; +C -1 ; WX 510 ; N diamond ; B 31 -12 479 601 ; +C -1 ; WX 500 ; N musicalnote ; B 18 -18 482 666 ; +C -1 ; WX 750 ; N musicalnotedbl ; B 42 -63 649 742 ; +C -1 ; WX 785 ; N IJ ; B 68 -12 708 716 ; +C -1 ; WX 556 ; N ij ; B 72 -210 478 716 ; +C -1 ; WX 708 ; N napostrophe ; B -28 0 635 716 ; +C -1 ; WX 240 ; N minute ; B 69 461 247 716 ; +C -1 ; WX 479 ; N second ; B 69 461 467 716 ; +C -1 ; WX 885 ; N afii61248 ; B 17 -27 868 728 ; +C -1 ; WX 489 ; N afii61289 ; B 12 -12 453 728 ; +C -1 ; WX 604 ; N H22073 ; B 71 0 532 461 ; +C -1 ; WX 354 ; N H18543 ; B 45 198 310 463 ; +C -1 ; WX 354 ; N H18551 ; B 45 198 310 463 ; +C -1 ; WX 604 ; N H18533 ; B 87 67 517 497 ; +C -1 ; WX 354 ; N openbullet ; B 38 190 316 470 ; +C -1 ; WX 722 ; N Amacron ; B 0 0 718 871 ; +C -1 ; WX 556 ; N amacron ; B 36 -12 522 694 ; +C -1 ; WX 722 ; N Ccircumflex ; B 47 -12 671 924 ; +C -1 ; WX 556 ; N ccircumflex ; B 42 -12 531 728 ; +C -1 ; WX 722 ; N Cdot ; B 47 -12 671 910 ; +C -1 ; WX 556 ; N cdot ; B 42 -12 531 728 ; +C -1 ; WX 667 ; N Emacron ; B 73 0 617 871 ; +C -1 ; WX 556 ; N emacron ; B 32 -12 519 694 ; +C -1 ; WX 667 ; N Ebreve ; B 73 0 617 918 ; +C -1 ; WX 556 ; N ebreve ; B 32 -12 519 728 ; +C -1 ; WX 667 ; N Edot ; B 73 0 617 910 ; +C -1 ; WX 556 ; N edot ; B 32 -12 519 728 ; +C -1 ; WX 778 ; N Gcircumflex ; B 48 -12 717 924 ; +C -1 ; WX 611 ; N gcircumflex ; B 41 -210 547 728 ; +C -1 ; WX 778 ; N Gdot ; B 48 -12 717 910 ; +C -1 ; WX 611 ; N gdot ; B 41 -210 547 728 ; +C -1 ; WX 778 ; N Gcedilla ; B 48 -205 717 728 ; +C -1 ; WX 611 ; N gcedilla ; B 41 -210 547 801 ; +C -1 ; WX 722 ; N Hcircumflex ; B 73 0 646 924 ; +C -1 ; WX 611 ; N hcircumflex ; B 71 0 543 901 ; +C -1 ; WX 722 ; N Hbar ; B 2 0 716 716 ; +C -1 ; WX 611 ; N hbar ; B 12 0 544 716 ; +C -1 ; WX 278 ; N Itilde ; B -34 0 304 904 ; +C -1 ; WX 278 ; N itilde ; B -34 0 304 713 ; +C -1 ; WX 278 ; N Imacron ; B -19 0 296 871 ; +C -1 ; WX 278 ; N imacron ; B -19 0 296 694 ; +C -1 ; WX 278 ; N Ibreve ; B -15 0 290 918 ; +C -1 ; WX 278 ; N ibreve ; B -15 0 290 728 ; +C -1 ; WX 278 ; N Iogonek ; B 54 -210 271 716 ; +C -1 ; WX 278 ; N iogonek ; B 57 -210 274 716 ; +C -1 ; WX 556 ; N Jcircumflex ; B 17 -12 568 924 ; +C -1 ; WX 278 ; N jcircumflex ; B -46 -210 304 728 ; +C -1 ; WX 722 ; N Kcedilla ; B 75 -206 720 716 ; +C -1 ; WX 556 ; N kcedilla ; B 67 -206 546 716 ; +C -1 ; WX 556 ; N kgreenlandic ; B 69 0 548 519 ; +C -1 ; WX 611 ; N Lcedilla ; B 77 -206 581 710 ; +C -1 ; WX 278 ; N lcedilla ; B -9 -206 257 716 ; +C -1 ; WX 722 ; N Ncedilla ; B 74 -206 642 716 ; +C -1 ; WX 611 ; N ncedilla ; B 71 -206 543 530 ; +C -1 ; WX 723 ; N Eng ; B 76 -13 676 728 ; +C -1 ; WX 611 ; N eng ; B 69 -213 542 530 ; +C -1 ; WX 778 ; N Omacron ; B 43 -12 738 871 ; +C -1 ; WX 611 ; N omacron ; B 40 -12 575 694 ; +C -1 ; WX 778 ; N Obreve ; B 43 -12 738 918 ; +C -1 ; WX 611 ; N obreve ; B 40 -12 575 728 ; +C -1 ; WX 722 ; N Rcedilla ; B 73 -206 717 716 ; +C -1 ; WX 389 ; N rcedilla ; B 21 -206 402 530 ; +C -1 ; WX 667 ; N Scircumflex ; B 36 -13 618 924 ; +C -1 ; WX 556 ; N scircumflex ; B 23 -12 508 728 ; +C -1 ; WX 611 ; N Tbar ; B 21 0 590 716 ; +C -1 ; WX 333 ; N tbar ; B 10 -12 321 702 ; +C -1 ; WX 722 ; N Utilde ; B 72 -12 643 904 ; +C -1 ; WX 611 ; N utilde ; B 69 -12 541 713 ; +C -1 ; WX 722 ; N Umacron ; B 72 -12 643 871 ; +C -1 ; WX 611 ; N umacron ; B 69 -12 541 694 ; +C -1 ; WX 722 ; N Ubreve ; B 72 -12 643 918 ; +C -1 ; WX 611 ; N ubreve ; B 69 -12 541 728 ; +C -1 ; WX 722 ; N Uogonek ; B 72 -210 643 716 ; +C -1 ; WX 611 ; N uogonek ; B 69 -211 616 519 ; +C -1 ; WX 944 ; N Wcircumflex ; B 3 0 943 924 ; +C -1 ; WX 778 ; N wcircumflex ; B 4 0 777 728 ; +C -1 ; WX 667 ; N Ycircumflex ; B -1 0 668 924 ; +C -1 ; WX 556 ; N ycircumflex ; B 7 -210 540 728 ; +C -1 ; WX 278 ; N longs ; B 69 0 343 728 ; +C -1 ; WX 722 ; N Aringacute ; B 0 0 718 1004 ; +C -1 ; WX 556 ; N aringacute ; B 36 -12 522 926 ; +C -1 ; WX 1000 ; N AEacute ; B -42 0 952 926 ; +C -1 ; WX 889 ; N aeacute ; B 43 -12 842 728 ; +C -1 ; WX 778 ; N Oslashacute ; B 31 -40 750 926 ; +C -1 ; WX 611 ; N oslashacute ; B 42 -36 578 728 ; +C -1 ; WX 333 ; N anoteleia ; B 98 381 235 519 ; +C -1 ; WX 944 ; N Wgrave ; B 3 0 943 926 ; +C -1 ; WX 778 ; N wgrave ; B 4 0 777 728 ; +C -1 ; WX 944 ; N Wacute ; B 3 0 943 926 ; +C -1 ; WX 778 ; N wacute ; B 4 0 777 728 ; +C -1 ; WX 944 ; N Wdieresis ; B 3 0 943 898 ; +C -1 ; WX 778 ; N wdieresis ; B 4 0 777 728 ; +C -1 ; WX 667 ; N Ygrave ; B -1 0 668 926 ; +C -1 ; WX 556 ; N ygrave ; B 7 -210 540 728 ; +C -1 ; WX 278 ; N quotereversed ; B 73 418 221 716 ; +C -1 ; WX 333 ; N radicalex ; B -20 604 354 694 ; +C -1 ; WX 556 ; N afii08941 ; B 6 -12 541 728 ; +C -1 ; WX 600 ; N estimated ; B 44 -17 561 535 ; +C -1 ; WX 834 ; N oneeighth ; B 45 -26 812 725 ; +C -1 ; WX 834 ; N threeeighths ; B 20 -26 812 725 ; +C -1 ; WX 834 ; N fiveeighths ; B 23 -26 812 725 ; +C -1 ; WX 834 ; N seveneighths ; B 23 -26 812 725 ; +C -1 ; WX 333 ; N commaaccent ; B 92 -276 239 -55 ; +C -1 ; WX 333 ; N undercommaaccent ; B 19 -206 285 -10 ; +C -1 ; WX 333 ; N tonos ; B 91 582 313 728 ; +C -1 ; WX 465 ; N dieresistonos ; B -6 582 471 728 ; +C -1 ; WX 722 ; N Alphatonos ; B -12 0 721 716 ; +C -1 ; WX 853 ; N Epsilontonos ; B -34 0 803 716 ; +C -1 ; WX 906 ; N Etatonos ; B -34 0 831 716 ; +C -1 ; WX 474 ; N Iotatonos ; B -34 0 403 716 ; +C -1 ; WX 825 ; N Omicrontonos ; B -44 -12 783 728 ; +C -1 ; WX 927 ; N Upsilontonos ; B -27 0 928 716 ; +C -1 ; WX 838 ; N Omegatonos ; B -49 0 791 728 ; +C -1 ; WX 278 ; N iotadieresistonos ; B -105 0 372 728 ; +C -1 ; WX 722 ; N Alpha ; B 0 0 718 716 ; +C -1 ; WX 722 ; N Beta ; B 73 0 673 716 ; +C -1 ; WX 719 ; N Delta ; B 0 0 718 716 ; +C -1 ; WX 667 ; N Epsilon ; B 73 0 617 716 ; +C -1 ; WX 611 ; N Zeta ; B 11 0 592 716 ; +C -1 ; WX 722 ; N Eta ; B 73 0 646 716 ; +C -1 ; WX 278 ; N Iota ; B 68 0 213 716 ; +C -1 ; WX 722 ; N Kappa ; B 75 0 720 716 ; +C -1 ; WX 667 ; N Lambda ; B 0 0 667 716 ; +C -1 ; WX 833 ; N Mu ; B 71 0 762 716 ; +C -1 ; WX 722 ; N Nu ; B 74 0 642 716 ; +C -1 ; WX 644 ; N Xi ; B 50 0 594 716 ; +C -1 ; WX 778 ; N Omicron ; B 43 -12 738 728 ; +C -1 ; WX 722 ; N Pi ; B 75 0 647 716 ; +C -1 ; WX 667 ; N Rho ; B 73 0 621 716 ; +C -1 ; WX 600 ; N Sigma ; B 44 0 564 716 ; +C -1 ; WX 611 ; N Tau ; B 21 0 590 716 ; +C -1 ; WX 667 ; N Upsilon ; B -1 0 668 716 ; +C -1 ; WX 667 ; N Chi ; B 0 0 666 716 ; +C -1 ; WX 809 ; N Psi ; B 42 0 767 716 ; +C -1 ; WX 802 ; N Omega ; B 48 0 754 728 ; +C -1 ; WX 278 ; N Iotadieresis ; B -25 0 303 882 ; +C -1 ; WX 667 ; N Upsilondieresis ; B -1 0 668 882 ; +C -1 ; WX 615 ; N alphatonos ; B 38 -12 582 728 ; +C -1 ; WX 451 ; N epsilontonos ; B 38 -12 463 728 ; +C -1 ; WX 611 ; N etatonos ; B 69 -197 542 728 ; +C -1 ; WX 278 ; N iotatonos ; B 63 0 285 728 ; +C -1 ; WX 582 ; N upsilondieresistonos ; B 53 -12 529 728 ; +C -1 ; WX 610 ; N beta ; B 70 -197 573 728 ; +C -1 ; WX 556 ; N gamma ; B 7 -197 546 519 ; +C -1 ; WX 460 ; N zeta ; B 38 -210 452 716 ; +C -1 ; WX 611 ; N eta ; B 69 -197 542 530 ; +C -1 ; WX 541 ; N theta ; B 38 -12 503 728 ; +C -1 ; WX 278 ; N iota ; B 70 0 208 519 ; +C -1 ; WX 558 ; N kappa ; B 69 0 550 519 ; +C -1 ; WX 556 ; N lambda ; B 7 0 546 716 ; +C -1 ; WX 612 ; N mu ; B 70 -197 542 519 ; +C -1 ; WX 556 ; N nu ; B 5 0 544 519 ; +C -1 ; WX 445 ; N xi ; B 38 -210 445 728 ; +C -1 ; WX 611 ; N omicron ; B 40 -12 575 530 ; +C -1 ; WX 619 ; N rho ; B 58 -197 581 530 ; +C -1 ; WX 520 ; N sigma1 ; B 38 -210 503 530 ; +C -1 ; WX 582 ; N upsilon ; B 58 -12 524 519 ; +C -1 ; WX 576 ; N chi ; B 8 -197 569 519 ; +C -1 ; WX 753 ; N psi ; B 58 -197 695 519 ; +C -1 ; WX 845 ; N omega ; B 38 -12 807 519 ; +C -1 ; WX 278 ; N iotadieresis ; B -25 0 303 728 ; +C -1 ; WX 582 ; N upsilondieresis ; B 58 -12 524 728 ; +C -1 ; WX 611 ; N omicrontonos ; B 40 -12 575 728 ; +C -1 ; WX 582 ; N upsilontonos ; B 58 -12 524 728 ; +C -1 ; WX 845 ; N omegatonos ; B 38 -12 807 728 ; +C -1 ; WX 669 ; N afii10023 ; B 73 0 617 875 ; +C -1 ; WX 885 ; N afii10051 ; B 23 -6 846 716 ; +C -1 ; WX 711 ; N afii10053 ; B 43 -12 669 728 ; +C -1 ; WX 667 ; N afii10054 ; B 36 -13 618 728 ; +C -1 ; WX 278 ; N afii10055 ; B 68 0 213 716 ; +C -1 ; WX 276 ; N afii10056 ; B -26 0 302 875 ; +C -1 ; WX 556 ; N afii10057 ; B 17 -12 475 716 ; +C -1 ; WX 1094 ; N afii10058 ; B 13 -4 1047 716 ; +C -1 ; WX 1063 ; N afii10059 ; B 77 0 1013 716 ; +C -1 ; WX 875 ; N afii10060 ; B 27 0 803 716 ; +C -1 ; WX 622 ; N afii10062 ; B 0 -9 622 897 ; +C -1 ; WX 722 ; N afii10017 ; B 0 0 718 716 ; +C -1 ; WX 719 ; N afii10018 ; B 76 0 674 716 ; +C -1 ; WX 722 ; N afii10019 ; B 73 0 673 716 ; +C -1 ; WX 567 ; N afii10020 ; B 80 0 565 716 ; +C -1 ; WX 712 ; N afii10021 ; B -3 -156 688 716 ; +C -1 ; WX 667 ; N afii10022 ; B 73 0 617 716 ; +C -1 ; WX 904 ; N afii10024 ; B 11 0 893 721 ; +C -1 ; WX 626 ; N afii10025 ; B 21 -12 572 728 ; +C -1 ; WX 719 ; N afii10026 ; B 75 0 644 716 ; +C -1 ; WX 719 ; N afii10027 ; B 75 0 644 894 ; +C -1 ; WX 610 ; N afii10028 ; B 75 0 602 721 ; +C -1 ; WX 702 ; N afii10029 ; B 16 -4 625 716 ; +C -1 ; WX 833 ; N afii10030 ; B 71 0 762 716 ; +C -1 ; WX 722 ; N afii10031 ; B 73 0 646 716 ; +C -1 ; WX 778 ; N afii10032 ; B 43 -12 738 728 ; +C -1 ; WX 719 ; N afii10033 ; B 75 0 644 716 ; +C -1 ; WX 667 ; N afii10034 ; B 73 0 621 716 ; +C -1 ; WX 722 ; N afii10035 ; B 47 -12 671 728 ; +C -1 ; WX 611 ; N afii10036 ; B 21 0 590 716 ; +C -1 ; WX 622 ; N afii10037 ; B 0 -9 622 716 ; +C -1 ; WX 854 ; N afii10038 ; B 43 0 810 715 ; +C -1 ; WX 667 ; N afii10039 ; B 0 0 666 716 ; +C -1 ; WX 730 ; N afii10040 ; B 75 -156 704 716 ; +C -1 ; WX 703 ; N afii10041 ; B 61 0 626 716 ; +C -1 ; WX 1005 ; N afii10042 ; B 75 0 930 716 ; +C -1 ; WX 1019 ; N afii10043 ; B 75 -156 993 716 ; +C -1 ; WX 870 ; N afii10044 ; B 13 0 823 716 ; +C -1 ; WX 979 ; N afii10045 ; B 77 0 902 716 ; +C -1 ; WX 719 ; N afii10046 ; B 76 0 673 716 ; +C -1 ; WX 711 ; N afii10047 ; B 42 -12 668 728 ; +C -1 ; WX 1031 ; N afii10048 ; B 73 -12 984 728 ; +C -1 ; WX 719 ; N afii10049 ; B 2 0 646 716 ; +C -1 ; WX 556 ; N afii10065 ; B 36 -12 522 530 ; +C -1 ; WX 618 ; N afii10066 ; B 45 -12 575 732 ; +C -1 ; WX 615 ; N afii10067 ; B 73 0 576 519 ; +C -1 ; WX 417 ; N afii10068 ; B 66 0 417 519 ; +C -1 ; WX 635 ; N afii10069 ; B -3 -137 612 519 ; +C -1 ; WX 556 ; N afii10070 ; B 32 -12 519 530 ; +C -1 ; WX 709 ; N afii10072 ; B 0 0 710 522 ; +C -1 ; WX 497 ; N afii10073 ; B 12 -12 458 530 ; +C -1 ; WX 615 ; N afii10074 ; B 68 0 546 519 ; +C -1 ; WX 615 ; N afii10075 ; B 68 0 546 729 ; +C -1 ; WX 500 ; N afii10076 ; B 66 0 501 522 ; +C -1 ; WX 635 ; N afii10077 ; B 12 -9 568 519 ; +C -1 ; WX 740 ; N afii10078 ; B 76 0 674 519 ; +C -1 ; WX 604 ; N afii10079 ; B 66 0 538 519 ; +C -1 ; WX 611 ; N afii10080 ; B 40 -12 575 530 ; +C -1 ; WX 604 ; N afii10081 ; B 66 0 527 519 ; +C -1 ; WX 611 ; N afii10082 ; B 68 -197 574 530 ; +C -1 ; WX 556 ; N afii10083 ; B 42 -12 531 530 ; +C -1 ; WX 490 ; N afii10084 ; B 10 0 479 519 ; +C -1 ; WX 556 ; N afii10085 ; B 7 -210 540 519 ; +C -1 ; WX 875 ; N afii10086 ; B 41 -197 834 716 ; +C -1 ; WX 556 ; N afii10087 ; B 6 0 547 519 ; +C -1 ; WX 615 ; N afii10088 ; B 67 -137 591 519 ; +C -1 ; WX 581 ; N afii10089 ; B 56 0 516 519 ; +C -1 ; WX 833 ; N afii10090 ; B 68 0 765 519 ; +C -1 ; WX 844 ; N afii10091 ; B 69 -137 822 519 ; +C -1 ; WX 729 ; N afii10092 ; B 20 0 689 519 ; +C -1 ; WX 854 ; N afii10093 ; B 73 0 789 519 ; +C -1 ; WX 615 ; N afii10094 ; B 75 0 575 519 ; +C -1 ; WX 552 ; N afii10095 ; B 27 -12 512 530 ; +C -1 ; WX 854 ; N afii10096 ; B 71 -12 815 530 ; +C -1 ; WX 583 ; N afii10097 ; B -2 0 516 519 ; +C -1 ; WX 556 ; N afii10071 ; B 32 -12 519 728 ; +C -1 ; WX 611 ; N afii10099 ; B 0 -210 543 716 ; +C -1 ; WX 417 ; N afii10100 ; B 66 0 417 728 ; +C -1 ; WX 552 ; N afii10101 ; B 40 -12 524 530 ; +C -1 ; WX 556 ; N afii10102 ; B 23 -12 508 530 ; +C -1 ; WX 278 ; N afii10103 ; B 72 0 209 716 ; +C -1 ; WX 281 ; N afii10104 ; B -23 0 305 728 ; +C -1 ; WX 278 ; N afii10105 ; B -46 -210 206 716 ; +C -1 ; WX 969 ; N afii10106 ; B 12 -9 931 519 ; +C -1 ; WX 906 ; N afii10107 ; B 68 0 866 519 ; +C -1 ; WX 611 ; N afii10108 ; B 0 0 543 716 ; +C -1 ; WX 556 ; N afii10110 ; B 7 -210 540 729 ; +C -1 ; WX 604 ; N afii10193 ; B 66 -137 537 519 ; +C -1 ; WX 487 ; N afii10050 ; B 73 0 460 872 ; +C -1 ; WX 447 ; N afii10098 ; B 66 0 416 655 ; +C -1 ; WX 1000 ; N afii00208 ; B 32 208 968 311 ; +C -1 ; WX 1115 ; N afii61352 ; B 80 0 1073 716 ; +C -1 ; WX 766 ; N pi ; B 23 0 742 519 ; +C -1 ; WX 333 ; N sheva ; B 125 -210 208 -24 ; +C -1 ; WX 333 ; N hatafsegol ; B 15 -210 318 -24 ; +C -1 ; WX 333 ; N hatafpatah ; B 24 -210 309 -24 ; +C -1 ; WX 333 ; N hatafqamats ; B 24 -210 309 -24 ; +C -1 ; WX 333 ; N hiriq ; B 125 -180 208 -98 ; +C -1 ; WX 333 ; N tsere ; B 62 -180 272 -98 ; +C -1 ; WX 333 ; N segol ; B 62 -210 271 -24 ; +C -1 ; WX 333 ; N patah ; B 68 -154 265 -103 ; +C -1 ; WX 333 ; N qamats ; B 68 -210 265 -77 ; +C -1 ; WX 333 ; N holam ; B 125 577 208 659 ; +C -1 ; WX 333 ; N qubuts ; B 8 -210 325 -25 ; +C -1 ; WX 333 ; N dagesh ; B 125 241 208 323 ; +C -1 ; WX 333 ; N meteg ; B 141 -210 192 -25 ; +C -1 ; WX 447 ; N maqaf ; B 61 408 386 518 ; +C -1 ; WX 333 ; N rafe ; B 68 611 265 662 ; +C -1 ; WX 299 ; N paseq ; B 98 -101 202 620 ; +C -1 ; WX 333 ; N shindot ; B 376 577 458 660 ; +C -1 ; WX 333 ; N sindot ; B -125 577 -42 660 ; +C -1 ; WX 333 ; N sofpasuq ; B 98 0 235 519 ; +C -1 ; WX 583 ; N alef ; B 43 0 570 518 ; +C -1 ; WX 576 ; N bet ; B 32 0 554 524 ; +C -1 ; WX 457 ; N gimel ; B 5 0 425 524 ; +C -1 ; WX 550 ; N dalet ; B 24 0 525 518 ; +C -1 ; WX 614 ; N he ; B 63 0 553 524 ; +C -1 ; WX 273 ; N vav ; B 66 0 207 518 ; +C -1 ; WX 413 ; N zayin ; B 44 0 396 518 ; +C -1 ; WX 616 ; N het ; B 66 0 550 524 ; +C -1 ; WX 626 ; N tet ; B 61 -12 570 530 ; +C -1 ; WX 273 ; N yod ; B 66 229 207 518 ; +C -1 ; WX 521 ; N finalkaf ; B 20 -199 460 524 ; +C -1 ; WX 491 ; N kaf ; B 37 -8 452 526 ; +C -1 ; WX 496 ; N lamed ; B 32 0 445 716 ; +C -1 ; WX 611 ; N finalmem ; B 66 0 550 524 ; +C -1 ; WX 630 ; N mem ; B 27 0 569 524 ; +C -1 ; WX 273 ; N finalnun ; B 66 -199 207 518 ; +C -1 ; WX 386 ; N nun ; B 37 0 325 524 ; +C -1 ; WX 613 ; N samekh ; B 39 -12 574 530 ; +C -1 ; WX 543 ; N ayin ; B 5 -77 492 518 ; +C -1 ; WX 594 ; N finalpe ; B 49 -199 533 524 ; +C -1 ; WX 587 ; N pe ; B 49 -8 548 527 ; +C -1 ; WX 500 ; N finaltsadi ; B 5 -199 458 518 ; +C -1 ; WX 512 ; N tsadi ; B 5 0 463 518 ; +C -1 ; WX 573 ; N qof ; B 63 -199 521 518 ; +C -1 ; WX 521 ; N resh ; B 20 0 460 524 ; +C -1 ; WX 715 ; N shin ; B 44 -14 676 518 ; +C -1 ; WX 673 ; N tav ; B 22 -4 607 524 ; +C -1 ; WX 546 ; N doublevav ; B 66 0 480 518 ; +C -1 ; WX 546 ; N vavyod ; B 66 0 480 518 ; +C -1 ; WX 546 ; N doubleyod ; B 66 229 480 518 ; +C -1 ; WX 276 ; N geresh ; B 39 312 242 518 ; +C -1 ; WX 504 ; N gershayim ; B 39 312 470 518 ; +C -1 ; WX 818 ; N newsheqelsign ; B 66 0 752 518 ; +C -1 ; WX 273 ; N vavshindot ; B -41 0 207 660 ; +C -1 ; WX 521 ; N finalkafsheva ; B 20 -199 460 524 ; +C -1 ; WX 521 ; N finalkafqamats ; B 20 -199 460 524 ; +C -1 ; WX 496 ; N lamedholam ; B -114 0 445 716 ; +C -1 ; WX 496 ; N lamedholamdagesh ; B -114 0 445 716 ; +C -1 ; WX 559 ; N altayin ; B 24 0 508 518 ; +C -1 ; WX 715 ; N shinshindot ; B 44 -14 676 660 ; +C -1 ; WX 715 ; N shinsindot ; B 44 -14 676 660 ; +C -1 ; WX 715 ; N shindageshshindot ; B 44 -14 676 660 ; +C -1 ; WX 715 ; N shindageshsindot ; B 44 -14 676 660 ; +C -1 ; WX 583 ; N alefpatah ; B 43 -154 570 518 ; +C -1 ; WX 583 ; N alefqamats ; B 43 -210 570 518 ; +C -1 ; WX 583 ; N alefmapiq ; B 43 0 570 518 ; +C -1 ; WX 576 ; N betdagesh ; B 32 0 554 524 ; +C -1 ; WX 454 ; N gimeldagesh ; B 5 0 425 524 ; +C -1 ; WX 550 ; N daletdagesh ; B 24 0 525 518 ; +C -1 ; WX 614 ; N hedagesh ; B 63 0 553 524 ; +C -1 ; WX 323 ; N vavdagesh ; B 0 0 257 518 ; +C -1 ; WX 438 ; N zayindagesh ; B 0 0 412 518 ; +C -1 ; WX 626 ; N tetdagesh ; B 61 -12 570 530 ; +C -1 ; WX 323 ; N yoddagesh ; B 0 229 257 518 ; +C -1 ; WX 521 ; N finalkafdagesh ; B 20 -199 460 524 ; +C -1 ; WX 491 ; N kafdagesh ; B 37 -8 452 526 ; +C -1 ; WX 496 ; N lameddagesh ; B 32 0 445 716 ; +C -1 ; WX 630 ; N memdagesh ; B 27 0 569 524 ; +C -1 ; WX 386 ; N nundagesh ; B 37 0 325 524 ; +C -1 ; WX 613 ; N samekhdagesh ; B 39 -12 574 530 ; +C -1 ; WX 594 ; N finalpedagesh ; B 49 -199 533 524 ; +C -1 ; WX 587 ; N pedagesh ; B 49 -8 548 527 ; +C -1 ; WX 512 ; N tsadidagesh ; B 5 0 463 518 ; +C -1 ; WX 573 ; N qofdagesh ; B 63 -199 521 518 ; +C -1 ; WX 521 ; N reshdagesh ; B 20 0 460 524 ; +C -1 ; WX 715 ; N shindagesh ; B 44 -14 676 518 ; +C -1 ; WX 673 ; N tavdages ; B 22 -4 607 524 ; +C -1 ; WX 273 ; N vavholam ; B 66 0 207 659 ; +C -1 ; WX 576 ; N betrafe ; B 32 0 554 662 ; +C -1 ; WX 491 ; N kafrafe ; B 37 -8 452 662 ; +C -1 ; WX 587 ; N perafe ; B 49 -8 548 662 ; +C -1 ; WX 607 ; N aleflamed ; B 32 0 595 716 ; +C -1 ; WX 0 ; N zerowidthnonjoiner ; B -18 -134 18 629 ; +C -1 ; WX 0 ; N zerowidthjoiner ; B -107 -134 107 690 ; +C -1 ; WX 0 ; N lefttorightmark ; B -18 -134 210 690 ; +C -1 ; WX 0 ; N righttoleftmark ; B -210 -134 17 690 ; +C -1 ; WX 319 ; N afii57388 ; B 83 137 241 443 ; +C -1 ; WX 319 ; N afii57403 ; B 78 136 235 609 ; +C -1 ; WX 356 ; N afii57407 ; B 33 137 326 711 ; +C -1 ; WX 469 ; N afii57409 ; B 62 46 422 510 ; +C -1 ; WX 198 ; N afii57440 ; B -34 143 198 276 ; +C -1 ; WX 201 ; N afii57451 ; B 34 683 201 857 ; +C -1 ; WX 237 ; N afii57452 ; B 34 683 237 872 ; +C -1 ; WX 201 ; N afii57453 ; B 34 -133 201 41 ; +C -1 ; WX 201 ; N afii57454 ; B 34 683 201 784 ; +C -1 ; WX 209 ; N afii57455 ; B 35 683 209 895 ; +C -1 ; WX 201 ; N afii57456 ; B 34 -60 201 41 ; +C -1 ; WX 211 ; N afii57457 ; B 34 683 211 840 ; +C -1 ; WX 165 ; N afii57458 ; B 34 683 165 834 ; +C -1 ; WX 562 ; N afii57392 ; B 191 206 360 457 ; +C -1 ; WX 562 ; N afii57393 ; B 164 146 359 719 ; +C -1 ; WX 562 ; N afii57394 ; B 127 143 419 718 ; +C -1 ; WX 562 ; N afii57395 ; B 77 143 476 713 ; +C -1 ; WX 562 ; N afii57396 ; B 147 145 404 710 ; +C -1 ; WX 562 ; N afii57397 ; B 114 231 448 634 ; +C -1 ; WX 562 ; N afii57398 ; B 104 149 426 718 ; +C -1 ; WX 562 ; N afii57399 ; B 76 143 457 717 ; +C -1 ; WX 562 ; N afii57400 ; B 92 149 473 724 ; +C -1 ; WX 562 ; N afii57401 ; B 116 146 427 719 ; +C -1 ; WX 526 ; N afii57381 ; B 65 84 463 777 ; +C -1 ; WX 319 ; N afii57461 ; B 94 23 230 267 ; +C -1 ; WX 526 ; N afii63167 ; B 87 403 424 744 ; +C -1 ; WX 750 ; N afii57459 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57543 ; B 125 0 625 625 ; +C -1 ; WX 343 ; N afii57534 ; B 43 126 304 519 ; +C -1 ; WX 750 ; N afii57494 ; B 125 0 625 625 ; +C -1 ; WX 562 ; N afii62843 ; B 81 143 471 737 ; +C -1 ; WX 562 ; N afii62844 ; B 92 143 461 719 ; +C -1 ; WX 562 ; N afii62845 ; B 108 143 451 729 ; +C -1 ; WX 750 ; N afii64240 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii64241 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63954 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57382 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii64242 ; B 125 0 625 625 ; +C -1 ; WX 211 ; N afii62881 ; B 34 683 211 995 ; +C -1 ; WX 750 ; N afii57504 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57369 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57370 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57371 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57372 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57373 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57374 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57375 ; B 125 0 625 625 ; +C -1 ; WX 612 ; N afii57391 ; B -34 143 612 276 ; +C -1 ; WX 750 ; N afii57471 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57460 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii52258 ; B 125 0 625 625 ; +C -1 ; WX 649 ; N afii57506 ; B 28 -193 649 489 ; +C -1 ; WX 649 ; N afii62958 ; B 28 -193 649 489 ; +C -1 ; WX 271 ; N afii62956 ; B -34 -193 271 492 ; +C -1 ; WX 271 ; N afii52957 ; B -34 -193 271 492 ; +C -1 ; WX 750 ; N afii57505 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62889 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62887 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62888 ; B 125 0 625 625 ; +C -1 ; WX 577 ; N afii57507 ; B 25 -203 563 527 ; +C -1 ; WX 559 ; N afii62961 ; B 23 -201 563 527 ; +C -1 ; WX 523 ; N afii62959 ; B -34 -193 523 501 ; +C -1 ; WX 523 ; N afii62960 ; B -34 -193 523 501 ; +C -1 ; WX 433 ; N afii57508 ; B 5 -72 447 813 ; +C -1 ; WX 433 ; N afii62962 ; B 5 -72 447 813 ; +C -1 ; WX 757 ; N afii57567 ; B 20 143 757 708 ; +C -1 ; WX 879 ; N afii62964 ; B 20 143 879 722 ; +C -1 ; WX 360 ; N afii52305 ; B -34 143 360 708 ; +C -1 ; WX 542 ; N afii52306 ; B -34 143 542 722 ; +C -1 ; WX 757 ; N afii57509 ; B 20 143 757 863 ; +C -1 ; WX 879 ; N afii62967 ; B 20 143 879 876 ; +C -1 ; WX 360 ; N afii62965 ; B -34 143 360 863 ; +C -1 ; WX 542 ; N afii62966 ; B -34 143 542 876 ; +C -1 ; WX 645 ; N afii57555 ; B 74 -60 575 461 ; +C -1 ; WX 554 ; N afii52364 ; B 5 -174 554 282 ; +C -1 ; WX 750 ; N afii63753 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63754 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63759 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63763 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63795 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62891 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63808 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62938 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63810 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62942 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62947 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63813 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63823 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63824 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63833 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63844 ; B 125 0 625 625 ; +C -1 ; WX 226 ; N afii62882 ; B 23 683 226 1010 ; +C -1 ; WX 211 ; N afii62883 ; B 34 678 211 978 ; +C -1 ; WX 211 ; N afii62884 ; B 34 683 211 918 ; +C -1 ; WX 211 ; N afii62885 ; B 31 683 211 974 ; +C -1 ; WX 211 ; N afii62886 ; B 34 683 211 931 ; +C -1 ; WX 750 ; N afii63846 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63849 ; B 125 0 625 625 ; +C -1 ; WX 0 ; N uni202A ; B -18 -134 210 603 ; +C -1 ; WX 0 ; N uni202B ; B -210 -134 18 603 ; +C -1 ; WX 0 ; N uni202D ; B -114 -134 114 690 ; +C -1 ; WX 0 ; N uni202E ; B -114 -134 114 690 ; +C -1 ; WX 0 ; N uni202C ; B -114 -134 114 690 ; +C -1 ; WX 0 ; N uni206E ; B -114 -134 114 690 ; +C -1 ; WX 0 ; N _b_852 ; B -114 -134 114 690 ; +C -1 ; WX 0 ; N uni206A ; B -114 -134 114 690 ; +C -1 ; WX 0 ; N uni206B ; B -114 -134 114 690 ; +C -1 ; WX 0 ; N _b_855 ; B -114 -134 114 690 ; +C -1 ; WX 0 ; N uni206D ; B -114 -134 114 690 ; +C -1 ; WX 0 ; N uniF00A ; B -18 -208 18 894 ; +C -1 ; WX 0 ; N uniF00B ; B -114 -208 114 894 ; +C -1 ; WX 0 ; N uniF00C ; B -18 -208 109 894 ; +C -1 ; WX 0 ; N uniF00D ; B -109 -208 18 894 ; +C -1 ; WX 0 ; N uniF00E ; B -18 -208 114 894 ; +C -1 ; WX 1000 ; N uniFFFC ; B 0 0 1000 719 ; +C -1 ; WX 750 ; N afii63904 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63905 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63906 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63908 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63910 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63912 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62927 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63941 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62939 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63943 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62943 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62946 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63946 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62951 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63948 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62953 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63950 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63951 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63952 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63953 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63956 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63958 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63959 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63960 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63961 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii64046 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii64058 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii64059 ; B 125 0 625 625 ; +C -1 ; WX 319 ; N afii64060 ; B 62 -209 273 785 ; +C -1 ; WX 319 ; N afii64061 ; B 50 -209 262 785 ; +C -1 ; WX 750 ; N afii62945 ; B 125 0 625 625 ; +C -1 ; WX 703 ; N afii64184 ; B 22 91 661 920 ; +C -1 ; WX 469 ; N afii52399 ; B 62 46 422 510 ; +C -1 ; WX 238 ; N afii52400 ; B 0 109 238 831 ; +C -1 ; WX 253 ; N afii62753 ; B -30 143 253 831 ; +C -1 ; WX 217 ; N afii57411 ; B 46 109 182 876 ; +C -1 ; WX 234 ; N afii62754 ; B -3 143 234 876 ; +C -1 ; WX 451 ; N afii57412 ; B 3 -71 451 661 ; +C -1 ; WX 451 ; N afii62755 ; B 3 -71 451 661 ; +C -1 ; WX 217 ; N afii57413 ; B 46 -88 181 736 ; +C -1 ; WX 234 ; N afii62756 ; B 13 -88 234 736 ; +C -1 ; WX 645 ; N afii57414 ; B 74 -60 575 546 ; +C -1 ; WX 577 ; N afii62759 ; B 8 -98 577 524 ; +C -1 ; WX 271 ; N afii62757 ; B -34 143 271 661 ; +C -1 ; WX 271 ; N afii62758 ; B -34 143 271 661 ; +C -1 ; WX 217 ; N afii57415 ; B 66 109 181 736 ; +C -1 ; WX 234 ; N afii62760 ; B 13 143 234 736 ; +C -1 ; WX 649 ; N afii57416 ; B 28 -69 649 489 ; +C -1 ; WX 649 ; N afii62763 ; B 28 -69 649 489 ; +C -1 ; WX 271 ; N afii62761 ; B -34 -69 271 492 ; +C -1 ; WX 271 ; N afii62762 ; B -34 -69 271 492 ; +C -1 ; WX 343 ; N afii57417 ; B 26 126 304 763 ; +C -1 ; WX 415 ; N afii62764 ; B 1 143 415 873 ; +C -1 ; WX 649 ; N afii57418 ; B 28 143 649 656 ; +C -1 ; WX 649 ; N afii62767 ; B 28 143 649 656 ; +C -1 ; WX 271 ; N afii62765 ; B -34 143 271 715 ; +C -1 ; WX 271 ; N afii62766 ; B -34 143 271 715 ; +C -1 ; WX 649 ; N afii57419 ; B 29 144 649 766 ; +C -1 ; WX 649 ; N afii62770 ; B 29 144 649 766 ; +C -1 ; WX 271 ; N afii62768 ; B -34 143 271 828 ; +C -1 ; WX 271 ; N afii62769 ; B -34 143 271 828 ; +C -1 ; WX 577 ; N afii57420 ; B 25 -203 563 527 ; +C -1 ; WX 559 ; N afii62773 ; B 23 -201 563 527 ; +C -1 ; WX 523 ; N afii62771 ; B -34 -74 523 501 ; +C -1 ; WX 523 ; N afii62772 ; B -34 -74 523 501 ; +C -1 ; WX 577 ; N afii57421 ; B 25 -203 563 527 ; +C -1 ; WX 559 ; N afii62776 ; B 23 -201 563 527 ; +C -1 ; WX 523 ; N afii62774 ; B -34 143 523 501 ; +C -1 ; WX 523 ; N afii62775 ; B -34 143 523 501 ; +C -1 ; WX 577 ; N afii57422 ; B 25 -203 563 746 ; +C -1 ; WX 559 ; N afii62779 ; B 23 -201 563 746 ; +C -1 ; WX 523 ; N afii62777 ; B -34 143 523 724 ; +C -1 ; WX 523 ; N afii62778 ; B -34 143 523 724 ; +C -1 ; WX 343 ; N afii57423 ; B 51 143 343 604 ; +C -1 ; WX 343 ; N afii62780 ; B 51 143 343 604 ; +C -1 ; WX 343 ; N afii57424 ; B 51 143 343 845 ; +C -1 ; WX 343 ; N afii62781 ; B 51 143 343 845 ; +C -1 ; WX 433 ; N afii57425 ; B 5 -72 433 461 ; +C -1 ; WX 433 ; N afii62782 ; B 5 -72 433 461 ; +C -1 ; WX 433 ; N afii57426 ; B 5 -72 433 693 ; +C -1 ; WX 433 ; N afii62783 ; B 5 -72 433 693 ; +C -1 ; WX 899 ; N afii57427 ; B 31 -63 899 458 ; +C -1 ; WX 899 ; N afii62786 ; B 31 -63 899 458 ; +C -1 ; WX 608 ; N afii62784 ; B -34 143 608 446 ; +C -1 ; WX 608 ; N afii62785 ; B -34 143 608 446 ; +C -1 ; WX 899 ; N afii57428 ; B 31 -63 899 774 ; +C -1 ; WX 899 ; N afii62789 ; B 31 -63 899 774 ; +C -1 ; WX 608 ; N afii62787 ; B -34 143 608 774 ; +C -1 ; WX 608 ; N afii62788 ; B -34 143 608 774 ; +C -1 ; WX 1063 ; N afii57429 ; B 31 -63 1063 504 ; +C -1 ; WX 1063 ; N afii62792 ; B 31 -63 1063 504 ; +C -1 ; WX 771 ; N afii62790 ; B -34 143 771 504 ; +C -1 ; WX 771 ; N afii62791 ; B -34 143 771 504 ; +C -1 ; WX 1063 ; N afii57430 ; B 31 -63 1063 728 ; +C -1 ; WX 1063 ; N afii62795 ; B 31 -63 1063 728 ; +C -1 ; WX 771 ; N afii62793 ; B -34 143 771 728 ; +C -1 ; WX 771 ; N afii62794 ; B -34 143 771 728 ; +C -1 ; WX 523 ; N afii57431 ; B -34 143 523 813 ; +C -1 ; WX 523 ; N afii62798 ; B -34 143 523 813 ; +C -1 ; WX 523 ; N afii62796 ; B -34 143 523 813 ; +C -1 ; WX 523 ; N afii62797 ; B -34 143 523 813 ; +C -1 ; WX 523 ; N afii57432 ; B -34 143 523 813 ; +C -1 ; WX 523 ; N afii62801 ; B -34 143 523 813 ; +C -1 ; WX 523 ; N afii62799 ; B -34 143 523 813 ; +C -1 ; WX 523 ; N afii62800 ; B -34 143 523 813 ; +C -1 ; WX 541 ; N afii57433 ; B 25 -204 535 595 ; +C -1 ; WX 469 ; N afii62804 ; B 34 -198 516 531 ; +C -1 ; WX 541 ; N afii62802 ; B -34 143 483 571 ; +C -1 ; WX 360 ; N afii62803 ; B -34 143 360 505 ; +C -1 ; WX 541 ; N afii57434 ; B 25 -204 535 822 ; +C -1 ; WX 469 ; N afii62807 ; B 34 -198 516 760 ; +C -1 ; WX 541 ; N afii62805 ; B -34 143 483 800 ; +C -1 ; WX 360 ; N afii62806 ; B -34 143 360 756 ; +C -1 ; WX 758 ; N afii57441 ; B 23 127 758 779 ; +C -1 ; WX 758 ; N afii62810 ; B 23 127 758 779 ; +C -1 ; WX 305 ; N afii62808 ; B -34 143 305 850 ; +C -1 ; WX 324 ; N afii62809 ; B -34 143 324 779 ; +C -1 ; WX 612 ; N afii57442 ; B 19 -130 612 658 ; +C -1 ; WX 612 ; N afii62813 ; B 19 -130 612 658 ; +C -1 ; WX 305 ; N afii62811 ; B -34 143 305 844 ; +C -1 ; WX 324 ; N afii62812 ; B -34 143 324 780 ; +C -1 ; WX 541 ; N afii57443 ; B 20 143 541 774 ; +C -1 ; WX 541 ; N afii62816 ; B 20 143 541 774 ; +C -1 ; WX 360 ; N afii57410 ; B -34 143 360 708 ; +C -1 ; WX 360 ; N afii62815 ; B -34 143 360 708 ; +C -1 ; WX 451 ; N afii57444 ; B 17 -36 451 773 ; +C -1 ; WX 451 ; N afii62819 ; B 17 -36 451 773 ; +C -1 ; WX 234 ; N afii62817 ; B -34 143 234 774 ; +C -1 ; WX 234 ; N afii62818 ; B -34 143 234 774 ; +C -1 ; WX 360 ; N afii57445 ; B 16 -212 360 431 ; +C -1 ; WX 360 ; N afii62822 ; B 16 -212 360 431 ; +C -1 ; WX 415 ; N afii62820 ; B -34 143 415 472 ; +C -1 ; WX 415 ; N afii62821 ; B -34 143 415 472 ; +C -1 ; WX 541 ; N afii57446 ; B 30 -63 541 612 ; +C -1 ; WX 541 ; N afii62825 ; B 30 -63 541 612 ; +C -1 ; WX 271 ; N afii62823 ; B -34 143 274 735 ; +C -1 ; WX 271 ; N afii62824 ; B -34 143 274 735 ; +C -1 ; WX 343 ; N afii57447 ; B 43 126 304 519 ; +C -1 ; WX 415 ; N afii62828 ; B 1 143 415 694 ; +C -1 ; WX 469 ; N afii57470 ; B -34 117 398 627 ; +C -1 ; WX 451 ; N afii62827 ; B -34 -101 451 560 ; +C -1 ; WX 451 ; N afii57448 ; B 3 -71 451 484 ; +C -1 ; WX 451 ; N afii62829 ; B 3 -71 451 484 ; +C -1 ; WX 645 ; N afii57449 ; B 74 -60 575 461 ; +C -1 ; WX 554 ; N afii62830 ; B 5 -174 554 282 ; +C -1 ; WX 645 ; N afii57450 ; B 74 -194 575 461 ; +C -1 ; WX 577 ; N afii62833 ; B 8 -212 577 319 ; +C -1 ; WX 271 ; N afii62831 ; B -34 -81 271 492 ; +C -1 ; WX 271 ; N afii62832 ; B -34 -81 271 492 ; +C -1 ; WX 541 ; N afii62834 ; B 0 72 525 831 ; +C -1 ; WX 596 ; N afii62835 ; B 0 94 596 831 ; +C -1 ; WX 486 ; N afii62836 ; B 17 72 471 876 ; +C -1 ; WX 541 ; N afii62837 ; B 13 94 541 876 ; +C -1 ; WX 486 ; N afii62838 ; B 17 -120 471 739 ; +C -1 ; WX 541 ; N afii62839 ; B 13 -120 541 766 ; +C -1 ; WX 486 ; N afii62840 ; B 17 72 471 739 ; +C -1 ; WX 541 ; N afii62841 ; B 13 94 541 766 ; +C -1 ; WX 750 ; N glyph1021 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57543-2 ; B 125 0 625 625 ; +C -1 ; WX 201 ; N afii57454-2 ; B 34 683 201 784 ; +C -1 ; WX 201 ; N afii57451-2 ; B 34 683 201 857 ; +C -1 ; WX 750 ; N glyph1025 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1026 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57471-2 ; B 125 0 625 625 ; +C -1 ; WX 165 ; N afii57458-2 ; B 34 683 165 834 ; +C -1 ; WX 211 ; N afii57457-2 ; B 34 683 211 840 ; +C -1 ; WX 750 ; N afii57494-2 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57459-2 ; B 125 0 625 625 ; +C -1 ; WX 209 ; N afii57455-2 ; B 35 683 209 895 ; +C -1 ; WX 237 ; N afii57452-2 ; B 34 683 237 872 ; +C -1 ; WX 750 ; N glyph1034 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1035 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1036 ; B 125 0 625 625 ; +C -1 ; WX 211 ; N afii62884-2 ; B 34 683 211 918 ; +C -1 ; WX 211 ; N afii62881-2 ; B 34 683 211 995 ; +C -1 ; WX 211 ; N afii62886-2 ; B 34 683 211 931 ; +C -1 ; WX 211 ; N afii62883-2 ; B 34 678 211 978 ; +C -1 ; WX 211 ; N afii62885-2 ; B 31 683 211 974 ; +C -1 ; WX 226 ; N afii62882-2 ; B 23 683 226 1010 ; +C -1 ; WX 750 ; N afii57504-2 ; B 125 0 625 625 ; +C -1 ; WX 201 ; N afii57456-2 ; B 34 -60 201 41 ; +C -1 ; WX 201 ; N afii57453-2 ; B 34 -133 201 41 ; +C -1 ; WX 750 ; N glyph1046 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1047 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57543-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57454-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57451-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1051 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1052 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57471-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57458-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57457-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57494-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57459-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57455-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57452-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1060 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1061 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1062 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62884-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62881-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62886-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62883-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62885-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62882-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57504-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57456-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57453-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1072 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1073 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57543-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57454-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57451-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1077 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1078 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57471-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57458-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57457-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57494-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57459-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57455-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57452-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1086 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1087 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1088 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62884-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62881-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62886-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62883-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62885-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62882-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57504-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57456-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57453-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1098 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1099 ; B 125 0 625 625 ; +C -1 ; WX 319 ; N glyph1100 ; B 99 137 223 714 ; +C -1 ; WX 319 ; N glyph1101 ; B 97 137 226 267 ; +C -1 ; WX 319 ; N glyph1102 ; B 97 137 225 542 ; +C -1 ; WX 750 ; N glyph1103 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1104 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1105 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1106 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1107 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1108 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1109 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1110 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1111 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1112 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1113 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1114 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1115 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1116 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1117 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1118 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1119 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1120 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1121 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1122 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1123 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1124 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1125 ; B 125 0 625 625 ; +C -1 ; WX 343 ; N glyph1126 ; B 51 143 343 556 ; +C -1 ; WX 125 ; N afii57440-2 ; B -34 143 125 276 ; +C -1 ; WX 1000 ; N afii57440-3 ; B -34 143 1000 276 ; +C -1 ; WX 2000 ; N afii57440-4 ; B -34 143 2000 276 ; +C -1 ; WX 853 ; N Ohorn ; B 43 -12 853 728 ; +C -1 ; WX 711 ; N ohorn ; B 40 -12 711 530 ; +C -1 ; WX 830 ; N Uhorn ; B 72 -12 830 716 ; +C -1 ; WX 724 ; N uhorn ; B 69 -12 724 519 ; +C -1 ; WX 0 ; N glyph1134 ; B -309 820 -97 900 ; +C -1 ; WX 0 ; N glyph1135 ; B -531 820 -319 900 ; +C -1 ; WX 0 ; N glyph1136 ; B -454 754 -232 892 ; +C -1 ; WX 0 ; N uniF006 ; B -226 820 -13 900 ; +C -1 ; WX 0 ; N uniF007 ; B -416 820 -203 900 ; +C -1 ; WX 0 ; N uniF009 ; B -333 754 -117 892 ; +C -1 ; WX 0 ; N combininghookabove ; B -231 742 -18 906 ; +C -1 ; WX 0 ; N uniF010 ; B -257 820 -60 906 ; +C -1 ; WX 0 ; N uniF013 ; B -363 742 -150 906 ; +C -1 ; WX 0 ; N uniF011 ; B -449 820 -251 906 ; +C -1 ; WX 0 ; N uniF01C ; B -302 786 25 898 ; +C -1 ; WX 0 ; N uniF015 ; B -516 820 -188 903 ; +C -1 ; WX 0 ; N combiningtildeaccent ; B -445 755 -118 868 ; +C -1 ; WX 0 ; N glyph1147 ; B -146 740 138 804 ; +C -1 ; WX 0 ; N glyph1148 ; B -150 740 150 804 ; +C -1 ; WX 0 ; N uniF02C ; B -172 -196 -35 -59 ; +C -1 ; WX 513 ; N dongsign ; B 59 92 460 716 ; +C -1 ; WX 834 ; N onethird ; B 45 -26 818 725 ; +C -1 ; WX 834 ; N twothirds ; B 12 -26 818 725 ; +C -1 ; WX 0 ; N uniF008 ; B -216 582 0 720 ; +C -1 ; WX 0 ; N glyph1154 ; B -333 582 -117 720 ; +C -1 ; WX 0 ; N glyph1155 ; B -294 582 -73 720 ; +C -1 ; WX 0 ; N uniF00F ; B -454 582 -232 720 ; +C -1 ; WX 0 ; N uniF012 ; B -232 582 -19 746 ; +C -1 ; WX 0 ; N uniF014 ; B -363 582 -150 746 ; +C -1 ; WX 0 ; N uniF016 ; B -516 786 -188 898 ; +C -1 ; WX 0 ; N uniF017 ; B -628 786 -301 898 ; +C -1 ; WX 0 ; N uniF018 ; B -599 786 -271 898 ; +C -1 ; WX 0 ; N uniF019 ; B -445 588 -107 713 ; +C -1 ; WX 0 ; N uniF01A ; B -559 588 -221 713 ; +C -1 ; WX 0 ; N uniF01B ; B -549 588 -211 713 ; +C -1 ; WX 0 ; N uniF01E ; B -399 -196 -262 -59 ; +C -1 ; WX 0 ; N uniF01F ; B -459 -196 -322 -59 ; +C -1 ; WX 0 ; N uniF020 ; B -530 -196 -393 -59 ; +C -1 ; WX 0 ; N uniF021 ; B -428 -196 -291 -59 ; +C -1 ; WX 0 ; N uniF022 ; B -505 -196 -368 -59 ; +C -1 ; WX 0 ; N combininggraveaccent ; B -289 754 -68 892 ; +C -1 ; WX 0 ; N combiningacuteaccent ; B -207 754 10 892 ; +C -1 ; WX 0 ; N uniF01D ; B -313 588 24 713 ; +C -1 ; WX 0 ; N combiningdotbelow ; B -437 -196 -299 -59 ; +C -1 ; WX 0 ; N uniF023 ; B -350 -196 -212 -59 ; +C -1 ; WX 0 ; N uniF029 ; B -211 -196 -74 -59 ; +C -1 ; WX 0 ; N uniF02A ; B -216 -196 -79 -59 ; +C -1 ; WX 0 ; N uniF02B ; B -398 -196 -261 -59 ; +C -1 ; WX 0 ; N uniF024 ; B -345 -196 -208 -59 ; +C -1 ; WX 0 ; N uniF025 ; B -374 -196 -237 -59 ; +C -1 ; WX 0 ; N uniF026 ; B -472 -196 -334 -59 ; +C -1 ; WX 0 ; N uniF027 ; B -386 -196 -249 -59 ; +C -1 ; WX 0 ; N uniF028 ; B -481 -196 -344 -59 ; +C -1 ; WX 0 ; N uniF02D ; B -497 820 -169 903 ; +C -1 ; WX 0 ; N uniF02E ; B -477 786 -150 898 ; +C -1 ; WX 0 ; N uniF02F ; B -548 820 -221 903 ; +C -1 ; WX 0 ; N uniF030 ; B -567 786 -240 898 ; +C -1 ; WX 278 ; N uniF031 ; B 72 0 209 519 ; +C -1 ; WX 722 ; N Adotbelow ; B 0 -196 718 716 ; +C -1 ; WX 556 ; N adotbelow ; B 36 -196 522 530 ; +C -1 ; WX 722 ; N Ahookabove ; B 0 0 718 906 ; +C -1 ; WX 556 ; N ahookabove ; B 36 -12 522 746 ; +C -1 ; WX 722 ; N Acircumflexacute ; B 0 0 718 900 ; +C -1 ; WX 556 ; N acircumflexacute ; B 36 -12 522 892 ; +C -1 ; WX 722 ; N Acircumflexgrave ; B 0 0 718 900 ; +C -1 ; WX 556 ; N acircumflexgrave ; B 36 -12 522 892 ; +C -1 ; WX 722 ; N Acircumflexhookabove ; B 0 0 718 906 ; +C -1 ; WX 556 ; N acircumflexhookabove ; B 36 -12 522 906 ; +C -1 ; WX 722 ; N Acircumflextilde ; B 0 0 718 903 ; +C -1 ; WX 556 ; N acircumflextilde ; B 36 -12 522 868 ; +C -1 ; WX 722 ; N Acircumflexdotbelow ; B 0 -196 718 804 ; +C -1 ; WX 556 ; N acircumflexdotbelow ; B 36 -196 522 728 ; +C -1 ; WX 722 ; N Abreveacute ; B 0 0 718 900 ; +C -1 ; WX 556 ; N abreveacute ; B 36 -12 522 892 ; +C -1 ; WX 722 ; N Abrevegrave ; B 0 0 718 900 ; +C -1 ; WX 556 ; N abrevegrave ; B 36 -12 522 892 ; +C -1 ; WX 722 ; N Abrevehookabove ; B 0 0 718 906 ; +C -1 ; WX 556 ; N abrevehookabove ; B 36 -12 522 906 ; +C -1 ; WX 722 ; N Abrevetilde ; B 0 0 718 903 ; +C -1 ; WX 556 ; N abrevetilde ; B 36 -12 522 868 ; +C -1 ; WX 722 ; N Abrevedotbelow ; B 0 -196 718 804 ; +C -1 ; WX 556 ; N abrevedotbelow ; B 36 -196 522 728 ; +C -1 ; WX 667 ; N Edotbelow ; B 73 -196 617 716 ; +C -1 ; WX 556 ; N edotbelow ; B 32 -196 519 530 ; +C -1 ; WX 667 ; N Ehookabove ; B 73 0 617 906 ; +C -1 ; WX 556 ; N ehookabove ; B 32 -12 519 746 ; +C -1 ; WX 667 ; N Etilde ; B 73 0 617 880 ; +C -1 ; WX 556 ; N etilde ; B 32 -12 519 713 ; +C -1 ; WX 667 ; N Ecircumflexacute ; B 73 0 617 900 ; +C -1 ; WX 556 ; N ecircumflexacute ; B 32 -12 519 892 ; +C -1 ; WX 667 ; N Ecircumflexgrave ; B 73 0 617 900 ; +C -1 ; WX 556 ; N ecircumflexgrave ; B 32 -12 519 892 ; +C -1 ; WX 667 ; N Ecircumflexhookabove ; B 73 0 617 906 ; +C -1 ; WX 556 ; N ecircumflexhookabove ; B 32 -12 519 906 ; +C -1 ; WX 667 ; N Ecircumflextilde ; B 73 0 617 903 ; +C -1 ; WX 556 ; N ecircumflextilde ; B 32 -12 519 868 ; +C -1 ; WX 667 ; N Ecircumflexdotbelow ; B 73 -196 617 804 ; +C -1 ; WX 556 ; N ecircumflexdotbelow ; B 32 -196 519 728 ; +C -1 ; WX 278 ; N Ihookabove ; B 52 0 265 906 ; +C -1 ; WX 278 ; N ihookabove ; B 45 0 259 746 ; +C -1 ; WX 278 ; N Idotbelow ; B 68 -196 213 716 ; +C -1 ; WX 278 ; N idotbelow ; B 72 -196 209 716 ; +C -1 ; WX 778 ; N Odotbelow ; B 43 -196 738 728 ; +C -1 ; WX 611 ; N odotbelow ; B 40 -196 575 530 ; +C -1 ; WX 778 ; N Ohookabove ; B 43 -12 738 906 ; +C -1 ; WX 611 ; N ohookabove ; B 40 -12 575 746 ; +C -1 ; WX 778 ; N Ocircumflexacute ; B 43 -12 738 900 ; +C -1 ; WX 611 ; N ocircumflexacute ; B 40 -12 575 892 ; +C -1 ; WX 778 ; N Ocircumflexgrave ; B 43 -12 738 900 ; +C -1 ; WX 611 ; N ocircumflexgrave ; B 40 -12 575 892 ; +C -1 ; WX 778 ; N Ocircumflexhookabove ; B 43 -12 738 906 ; +C -1 ; WX 611 ; N ocircumflexhookabove ; B 40 -12 575 906 ; +C -1 ; WX 778 ; N Ocircumflextilde ; B 43 -12 738 903 ; +C -1 ; WX 611 ; N ocircumflextilde ; B 40 -12 575 868 ; +C -1 ; WX 778 ; N Ocircumflexdotbelow ; B 43 -196 738 804 ; +C -1 ; WX 611 ; N ocircumflexdotbelow ; B 40 -196 575 728 ; +C -1 ; WX 853 ; N Ohornacute ; B 43 -12 853 903 ; +C -1 ; WX 711 ; N ohornacute ; B 40 -12 711 728 ; +C -1 ; WX 853 ; N Ohorngrave ; B 43 -12 853 903 ; +C -1 ; WX 711 ; N ohorngrave ; B 40 -12 711 728 ; +C -1 ; WX 853 ; N Ohornhookabove ; B 43 -12 853 906 ; +C -1 ; WX 711 ; N ohornhookabove ; B 40 -12 711 746 ; +C -1 ; WX 853 ; N Ohorntilde ; B 43 -12 853 880 ; +C -1 ; WX 711 ; N ohorntilde ; B 40 -12 711 713 ; +C -1 ; WX 853 ; N Ohorndotbelow ; B 43 -196 853 728 ; +C -1 ; WX 711 ; N ohorndotbelow ; B 40 -196 711 530 ; +C -1 ; WX 722 ; N Udotbelow ; B 72 -196 643 716 ; +C -1 ; WX 611 ; N udotbelow ; B 69 -196 541 519 ; +C -1 ; WX 722 ; N Uhookabove ; B 72 -12 643 906 ; +C -1 ; WX 611 ; N uhookabove ; B 69 -12 541 746 ; +C -1 ; WX 830 ; N Uhornacute ; B 72 -12 830 903 ; +C -1 ; WX 724 ; N uhornacute ; B 69 -12 724 728 ; +C -1 ; WX 830 ; N Uhorngrave ; B 72 -12 830 903 ; +C -1 ; WX 724 ; N uhorngrave ; B 69 -12 724 728 ; +C -1 ; WX 830 ; N Uhornhookabove ; B 72 -12 830 906 ; +C -1 ; WX 724 ; N uhornhookabove ; B 69 -12 724 746 ; +C -1 ; WX 830 ; N Uhorntilde ; B 72 -12 830 880 ; +C -1 ; WX 724 ; N uhorntilde ; B 69 -12 724 713 ; +C -1 ; WX 830 ; N Uhorndotbelow ; B 72 -196 830 716 ; +C -1 ; WX 724 ; N uhorndotbelow ; B 69 -196 724 519 ; +C -1 ; WX 667 ; N Ydotbelow ; B -1 -196 668 716 ; +C -1 ; WX 556 ; N ydotbelow ; B 7 -210 540 519 ; +C -1 ; WX 667 ; N Yhookabove ; B -1 0 668 906 ; +C -1 ; WX 556 ; N yhookabove ; B 7 -210 540 746 ; +C -1 ; WX 667 ; N Ytilde ; B -1 0 668 880 ; +C -1 ; WX 556 ; N ytilde ; B 7 -210 540 713 ; +C -1 ; WX 722 ; N uni01CD ; B 0 0 718 904 ; +C -1 ; WX 556 ; N uni01CE ; B 36 -12 522 728 ; +C -1 ; WX 278 ; N uni01CF ; B -26 0 304 904 ; +C -1 ; WX 278 ; N uni01D0 ; B -26 0 304 728 ; +C -1 ; WX 778 ; N uni01D1 ; B 43 -12 738 904 ; +C -1 ; WX 611 ; N uni01D2 ; B 40 -12 575 728 ; +C -1 ; WX 722 ; N uni01D3 ; B 72 -12 643 904 ; +C -1 ; WX 611 ; N uni01D4 ; B 69 -12 541 728 ; +C -1 ; WX 722 ; N uni01D5 ; B 72 -12 643 900 ; +C -1 ; WX 611 ; N uni01D6 ; B 69 -12 541 900 ; +C -1 ; WX 722 ; N uni01D7 ; B 72 -12 643 900 ; +C -1 ; WX 611 ; N uni01D8 ; B 69 -12 541 900 ; +C -1 ; WX 722 ; N uni01D9 ; B 72 -12 643 900 ; +C -1 ; WX 611 ; N uni01DA ; B 69 -12 541 900 ; +C -1 ; WX 722 ; N uni01DB ; B 72 -12 643 900 ; +C -1 ; WX 611 ; N uni01DC ; B 69 -12 541 900 ; +C -1 ; WX 0 ; N glyph1292 ; B -128 730 128 900 ; +C -1 ; WX 0 ; N glyph1293 ; B -128 730 133 900 ; +C -1 ; WX 0 ; N glyph1294 ; B -131 730 131 900 ; +C -1 ; WX 0 ; N glyph1295 ; B -133 730 128 900 ; +C -1 ; WX 567 ; N uni0492 ; B -1 0 565 716 ; +C -1 ; WX 417 ; N uni0493 ; B 3 0 417 519 ; +C -1 ; WX 904 ; N uni0496 ; B 11 -156 892 721 ; +C -1 ; WX 709 ; N uni0497 ; B 0 -137 709 522 ; +C -1 ; WX 610 ; N uni049A ; B 75 -156 600 721 ; +C -1 ; WX 500 ; N uni049B ; B 66 -137 500 522 ; +C -1 ; WX 610 ; N uni049C ; B 75 0 602 721 ; +C -1 ; WX 500 ; N uni049D ; B 66 0 501 522 ; +C -1 ; WX 722 ; N uni04A2 ; B 73 -156 704 716 ; +C -1 ; WX 604 ; N uni04A3 ; B 66 -137 591 519 ; +C -1 ; WX 556 ; N uni04AE ; B 0 0 551 716 ; +C -1 ; WX 556 ; N uni04AF ; B 9 -197 547 519 ; +C -1 ; WX 556 ; N uni04B0 ; B 0 0 551 716 ; +C -1 ; WX 556 ; N uni04B1 ; B 9 -197 547 519 ; +C -1 ; WX 667 ; N uni04B2 ; B 0 -156 664 716 ; +C -1 ; WX 556 ; N uni04B3 ; B 6 -137 547 519 ; +C -1 ; WX 703 ; N uni04B8 ; B 61 0 626 716 ; +C -1 ; WX 581 ; N uni04B9 ; B 56 0 516 519 ; +C -1 ; WX 703 ; N uni04BA ; B 76 0 642 716 ; +C -1 ; WX 611 ; N uni04BB ; B 71 0 543 716 ; +C -1 ; WX 726 ; N uni018F ; B 43 -12 686 728 ; +C -1 ; WX 556 ; N uni0259 ; B 37 -12 524 530 ; +C -1 ; WX 778 ; N uni04E8 ; B 42 -12 736 728 ; +C -1 ; WX 611 ; N uni04E9 ; B 40 -12 575 530 ; +C -1 ; WX 649 ; N glyph1320 ; B 28 143 649 489 ; +C -1 ; WX 271 ; N glyph1321 ; B -34 143 271 492 ; +C -1 ; WX 305 ; N glyph1322 ; B -34 143 305 637 ; +C -1 ; WX 324 ; N glyph1323 ; B -34 143 324 578 ; +C -1 ; WX 612 ; N glyph1324 ; B 19 -130 612 464 ; +C -1 ; WX 271 ; N glyph1325 ; B 49 -63 222 107 ; +C -1 ; WX 271 ; N glyph1326 ; B 11 -81 264 107 ; +C -1 ; WX 271 ; N glyph1327 ; B 11 -193 264 107 ; +C -1 ; WX 271 ; N glyph1328 ; B 8 -193 261 107 ; +C -1 ; WX 271 ; N glyph1329 ; B 33 -171 238 107 ; +C -1 ; WX 271 ; N glyph1330 ; B -22 -210 295 107 ; +C -1 ; WX 0 ; N glyph1331 ; B -133 519 133 837 ; +C -1 ; WX 207 ; N glyph1332 ; B 7 731 210 891 ; +C -1 ; WX 207 ; N glyph1333 ; B -5 746 179 890 ; +C -1 ; WX 333 ; N glyph1334 ; B 70 605 250 717 ; +C -1 ; WX 333 ; N glyph1335 ; B 70 605 250 717 ; +C -1 ; WX 238 ; N uni0653 ; B 0 765 238 831 ; +C -1 ; WX 217 ; N uni0654 ; B 46 750 181 890 ; +C -1 ; WX 217 ; N uni0655 ; B 46 -119 181 21 ; +C -1 ; WX 0 ; N uni0670 ; B -26 519 29 817 ; +C -1 ; WX 217 ; N uni0671 ; B 7 109 210 891 ; +C -1 ; WX 234 ; N uniFB51 ; B -32 143 234 891 ; +C -1 ; WX 217 ; N uni0672 ; B -5 109 181 890 ; +C -1 ; WX 234 ; N glyph1343 ; B -25 143 234 890 ; +C -1 ; WX 217 ; N uni0673 ; B 14 -84 198 736 ; +C -1 ; WX 234 ; N glyph1345 ; B 4 -84 234 736 ; +C -1 ; WX 217 ; N uni0675 ; B 66 109 298 743 ; +C -1 ; WX 234 ; N glyph47 ; B 13 143 269 743 ; +C -1 ; WX 451 ; N uni0676 ; B 3 -71 498 694 ; +C -1 ; WX 451 ; N glyph1349 ; B 3 -71 498 694 ; +C -1 ; WX 451 ; N uni0677 ; B 3 -71 498 729 ; +C -1 ; WX 451 ; N glyph1351 ; B 3 -71 498 729 ; +C -1 ; WX 645 ; N uni0678 ; B 74 -60 645 694 ; +C -1 ; WX 554 ; N glyph ; B 5 -174 554 499 ; +C -1 ; WX 649 ; N uni0679 ; B 28 143 649 837 ; +C -1 ; WX 649 ; N uniFB67 ; B 28 143 649 837 ; +C -1 ; WX 271 ; N uniFB68 ; B -34 143 271 837 ; +C -1 ; WX 271 ; N uniFB69 ; B -34 143 271 837 ; +C -1 ; WX 649 ; N uni067A ; B 28 143 649 766 ; +C -1 ; WX 649 ; N uniFB5F ; B 28 143 649 766 ; +C -1 ; WX 271 ; N uniFB60 ; B -34 143 271 828 ; +C -1 ; WX 271 ; N uniFB61 ; B -34 143 271 828 ; +C -1 ; WX 649 ; N uni067B ; B 28 -171 649 489 ; +C -1 ; WX 649 ; N uniFB53 ; B 28 -171 649 489 ; +C -1 ; WX 271 ; N uniFB54 ; B -34 -171 271 492 ; +C -1 ; WX 271 ; N uniFB55 ; B -34 -171 271 492 ; +C -1 ; WX 649 ; N uni067C ; B 28 31 649 656 ; +C -1 ; WX 649 ; N glyph1367 ; B 28 31 649 656 ; +C -1 ; WX 271 ; N glyph1368 ; B -34 31 271 715 ; +C -1 ; WX 271 ; N glyph1369 ; B -34 31 271 715 ; +C -1 ; WX 649 ; N uni067D ; B 28 143 649 766 ; +C -1 ; WX 649 ; N glyph1371 ; B 28 143 649 766 ; +C -1 ; WX 271 ; N glyph1372 ; B -34 143 271 828 ; +C -1 ; WX 271 ; N glyph1373 ; B -34 143 271 828 ; +C -1 ; WX 649 ; N uni067F ; B 28 143 649 783 ; +C -1 ; WX 649 ; N uniFB63 ; B 28 143 649 783 ; +C -1 ; WX 271 ; N uniFB64 ; B -34 143 295 844 ; +C -1 ; WX 271 ; N uniFB65 ; B -34 143 295 844 ; +C -1 ; WX 649 ; N uni0680 ; B 28 -210 649 489 ; +C -1 ; WX 649 ; N uniFB5B ; B 28 -210 649 489 ; +C -1 ; WX 271 ; N uniFB5C ; B -34 -210 295 492 ; +C -1 ; WX 271 ; N uniFB5D ; B -34 -210 295 492 ; +C -1 ; WX 577 ; N uni0681 ; B 25 -203 563 733 ; +C -1 ; WX 559 ; N glyph1383 ; B 23 -201 563 733 ; +C -1 ; WX 523 ; N glyph1384 ; B -34 143 523 704 ; +C -1 ; WX 523 ; N glyph1385 ; B -34 143 523 704 ; +C -1 ; WX 577 ; N uni0682 ; B 25 -203 563 854 ; +C -1 ; WX 559 ; N glyph1387 ; B 23 -201 563 854 ; +C -1 ; WX 523 ; N glyph1388 ; B -34 143 523 832 ; +C -1 ; WX 523 ; N glyph1389 ; B -34 143 523 832 ; +C -1 ; WX 577 ; N uni0683 ; B 25 -203 563 527 ; +C -1 ; WX 559 ; N uniFB77 ; B 23 -201 563 527 ; +C -1 ; WX 523 ; N uniFB78 ; B -34 -81 523 501 ; +C -1 ; WX 523 ; N uniFB79 ; B -34 -81 523 501 ; +C -1 ; WX 577 ; N uni0684 ; B 25 -203 563 527 ; +C -1 ; WX 559 ; N uniFB73 ; B 23 -201 563 527 ; +C -1 ; WX 523 ; N uniFB74 ; B -34 -171 523 501 ; +C -1 ; WX 523 ; N uniFB75 ; B -34 -171 523 501 ; +C -1 ; WX 577 ; N uni0685 ; B 25 -203 563 876 ; +C -1 ; WX 559 ; N glyph1399 ; B 23 -201 563 876 ; +C -1 ; WX 523 ; N glyph1400 ; B -34 143 523 854 ; +C -1 ; WX 523 ; N glyph1401 ; B -34 143 523 854 ; +C -1 ; WX 577 ; N uni0687 ; B 25 -203 563 527 ; +C -1 ; WX 559 ; N uniFB7f ; B 23 -201 563 527 ; +C -1 ; WX 523 ; N uniFB80 ; B -34 -210 523 501 ; +C -1 ; WX 523 ; N uniFB81 ; B -34 -210 523 501 ; +C -1 ; WX 343 ; N uni0688 ; B 39 143 343 891 ; +C -1 ; WX 343 ; N uniFB89 ; B 39 143 343 891 ; +C -1 ; WX 343 ; N uni0689 ; B 51 31 343 604 ; +C -1 ; WX 343 ; N glyph1409 ; B 51 31 343 604 ; +C -1 ; WX 343 ; N uni068A ; B 51 -63 343 604 ; +C -1 ; WX 343 ; N glyph1411 ; B 51 -63 343 604 ; +C -1 ; WX 343 ; N uni068B ; B 39 -63 343 891 ; +C -1 ; WX 343 ; N glyph1413 ; B 39 -63 343 891 ; +C -1 ; WX 343 ; N uni068C ; B 50 143 343 849 ; +C -1 ; WX 343 ; N uniFB85 ; B 50 143 343 849 ; +C -1 ; WX 343 ; N uni068D ; B 51 -81 343 604 ; +C -1 ; WX 343 ; N uniFB83 ; B 51 -81 343 604 ; +C -1 ; WX 343 ; N uni068E ; B 51 143 343 888 ; +C -1 ; WX 343 ; N uniFB87 ; B 51 143 343 888 ; +C -1 ; WX 343 ; N uni068F ; B 23 143 343 888 ; +C -1 ; WX 343 ; N glyph1421 ; B 23 143 343 888 ; +C -1 ; WX 343 ; N uni0690 ; B 17 143 343 888 ; +C -1 ; WX 343 ; N glyph1423 ; B 17 143 343 888 ; +C -1 ; WX 433 ; N uni0691 ; B 5 -72 433 837 ; +C -1 ; WX 433 ; N uniFB8D ; B 5 -72 433 837 ; +C -1 ; WX 433 ; N uni0692 ; B 5 -72 433 631 ; +C -1 ; WX 433 ; N glyph1426 ; B 5 -72 433 631 ; +C -1 ; WX 433 ; N uni0693 ; B 5 -99 458 461 ; +C -1 ; WX 433 ; N glyph1429 ; B 5 -99 458 461 ; +C -1 ; WX 433 ; N uni0694 ; B 5 -180 505 461 ; +C -1 ; WX 433 ; N glyph1431 ; B 5 -180 505 461 ; +C -1 ; WX 433 ; N uni0695 ; B 5 -196 494 461 ; +C -1 ; WX 433 ; N glyph1433 ; B 5 -196 494 461 ; +C -1 ; WX 433 ; N uni0696 ; B 5 -180 505 461 ; +C -1 ; WX 433 ; N glyph1435 ; B 5 -180 505 461 ; +C -1 ; WX 433 ; N uni0697 ; B 5 -72 447 700 ; +C -1 ; WX 433 ; N glyph1437 ; B 5 -72 447 700 ; +C -1 ; WX 433 ; N uni0699 ; B 5 -72 447 830 ; +C -1 ; WX 433 ; N glyph1439 ; B 5 -72 447 830 ; +C -1 ; WX 899 ; N uni069A ; B 31 -63 899 634 ; +C -1 ; WX 899 ; N glyph1441 ; B 31 -63 899 634 ; +C -1 ; WX 608 ; N glyph1442 ; B -34 -63 608 634 ; +C -1 ; WX 608 ; N glyph1443 ; B -34 -63 608 634 ; +C -1 ; WX 899 ; N uni069B ; B 31 -193 899 458 ; +C -1 ; WX 899 ; N glyph1445 ; B 31 -193 899 458 ; +C -1 ; WX 608 ; N glyph1446 ; B -34 -193 608 446 ; +C -1 ; WX 608 ; N glyph1447 ; B -34 -193 608 446 ; +C -1 ; WX 899 ; N uni069C ; B 31 -193 899 774 ; +C -1 ; WX 899 ; N glyph1449 ; B 31 -193 899 774 ; +C -1 ; WX 608 ; N glyph1450 ; B -34 -193 608 774 ; +C -1 ; WX 608 ; N glyph1451 ; B -34 -193 608 774 ; +C -1 ; WX 1063 ; N uni069D ; B 31 -81 1063 504 ; +C -1 ; WX 1063 ; N glyph1453 ; B 31 -81 1063 504 ; +C -1 ; WX 771 ; N glyph1454 ; B -34 -81 771 504 ; +C -1 ; WX 771 ; N glyph1455 ; B -34 -81 771 504 ; +C -1 ; WX 1063 ; N uni069E ; B 31 -63 1063 820 ; +C -1 ; WX 1063 ; N glyph1457 ; B 31 -63 1063 820 ; +C -1 ; WX 771 ; N glyph1458 ; B -34 143 771 820 ; +C -1 ; WX 771 ; N glyph1459 ; B -34 143 771 820 ; +C -1 ; WX 523 ; N uni069F ; B -34 143 523 858 ; +C -1 ; WX 523 ; N glyph1461 ; B -34 143 523 858 ; +C -1 ; WX 541 ; N uni06A0 ; B 25 -204 535 891 ; +C -1 ; WX 469 ; N glyph1463 ; B 34 -198 516 878 ; +C -1 ; WX 541 ; N glyph1464 ; B -34 143 483 891 ; +C -1 ; WX 360 ; N glyph1465 ; B -34 143 360 852 ; +C -1 ; WX 758 ; N uni06A1 ; B 23 127 758 549 ; +C -1 ; WX 758 ; N uni06A2 ; B 23 -63 758 549 ; +C -1 ; WX 758 ; N glyph1468 ; B 23 -63 758 549 ; +C -1 ; WX 305 ; N glyph1469 ; B -34 -63 305 637 ; +C -1 ; WX 324 ; N glyph1470 ; B -34 -63 324 578 ; +C -1 ; WX 758 ; N uni06A3 ; B 23 -63 758 779 ; +C -1 ; WX 758 ; N glyph1472 ; B 23 -63 758 779 ; +C -1 ; WX 305 ; N glyph1473 ; B -34 -63 305 850 ; +C -1 ; WX 324 ; N glyph1474 ; B -34 -63 324 784 ; +C -1 ; WX 758 ; N uni06A4 ; B 23 127 758 872 ; +C -1 ; WX 758 ; N uniFB6B ; B 23 127 758 872 ; +C -1 ; WX 305 ; N uniFB6C ; B -34 143 305 811 ; +C -1 ; WX 324 ; N uniFB6D ; B -34 143 324 891 ; +C -1 ; WX 758 ; N uni06A5 ; B 23 -193 758 549 ; +C -1 ; WX 758 ; N glyph1480 ; B 23 -193 758 549 ; +C -1 ; WX 305 ; N glyph1481 ; B -34 -193 305 637 ; +C -1 ; WX 324 ; N glyph1482 ; B -34 -193 324 578 ; +C -1 ; WX 758 ; N uni06A6 ; B 23 127 758 883 ; +C -1 ; WX 758 ; N uniFB6F ; B 23 127 758 883 ; +C -1 ; WX 305 ; N uniFB70 ; B -34 143 305 864 ; +C -1 ; WX 324 ; N uniFB71 ; B -34 143 324 891 ; +C -1 ; WX 612 ; N uni06A7 ; B 19 -130 612 683 ; +C -1 ; WX 612 ; N glyph1488 ; B 19 -130 612 683 ; +C -1 ; WX 612 ; N uni06A8 ; B 19 -130 612 771 ; +C -1 ; WX 612 ; N glyph1490 ; B 19 -130 612 771 ; +C -1 ; WX 757 ; N uni06AA ; B 20 143 757 674 ; +C -1 ; WX 879 ; N glyph1492 ; B 20 143 879 674 ; +C -1 ; WX 360 ; N glyph1493 ; B -34 143 360 674 ; +C -1 ; WX 542 ; N glyph1494 ; B -34 143 542 674 ; +C -1 ; WX 757 ; N uni06AB ; B 20 143 760 708 ; +C -1 ; WX 879 ; N glyph1496 ; B 20 143 879 722 ; +C -1 ; WX 360 ; N glyph1497 ; B -34 143 360 708 ; +C -1 ; WX 542 ; N glyph1498 ; B -34 143 542 722 ; +C -1 ; WX 541 ; N uni06AC ; B 20 143 541 891 ; +C -1 ; WX 541 ; N glyph1500 ; B 20 143 541 891 ; +C -1 ; WX 360 ; N glyph1501 ; B -34 143 360 878 ; +C -1 ; WX 360 ; N glyph1502 ; B -34 143 360 878 ; +C -1 ; WX 541 ; N uni06AD ; B 20 143 541 859 ; +C -1 ; WX 541 ; N uniFBD4 ; B 20 143 541 859 ; +C -1 ; WX 360 ; N uniFBD5 ; B -34 143 360 811 ; +C -1 ; WX 360 ; N uniFBD6 ; B -34 143 360 811 ; +C -1 ; WX 541 ; N uni06AE ; B 20 -193 541 774 ; +C -1 ; WX 541 ; N glyph1508 ; B 20 -193 541 774 ; +C -1 ; WX 360 ; N glyph1509 ; B -34 -193 360 708 ; +C -1 ; WX 360 ; N glyph1510 ; B -34 -193 360 708 ; +C -1 ; WX 757 ; N uni06B0 ; B 20 143 760 863 ; +C -1 ; WX 879 ; N glyph1512 ; B 20 143 879 876 ; +C -1 ; WX 360 ; N glyph1513 ; B -34 143 360 863 ; +C -1 ; WX 542 ; N glyph1514 ; B -34 143 542 876 ; +C -1 ; WX 757 ; N uni06B1 ; B 20 143 757 891 ; +C -1 ; WX 879 ; N uniFB9B ; B 20 143 879 891 ; +C -1 ; WX 360 ; N uniFB9C ; B -34 143 360 891 ; +C -1 ; WX 542 ; N uniFB9D ; B -34 143 542 891 ; +C -1 ; WX 757 ; N uni06B2 ; B 20 -81 757 863 ; +C -1 ; WX 879 ; N glyph1520 ; B 20 -81 879 876 ; +C -1 ; WX 360 ; N glyph1521 ; B -34 -81 360 863 ; +C -1 ; WX 542 ; N glyph1522 ; B -34 -81 542 876 ; +C -1 ; WX 757 ; N uni06B3 ; B 20 -171 757 863 ; +C -1 ; WX 879 ; N uniFB97 ; B 20 -171 879 876 ; +C -1 ; WX 360 ; N uniFB98 ; B -34 -171 360 863 ; +C -1 ; WX 542 ; N uniFB99 ; B -34 -171 542 876 ; +C -1 ; WX 757 ; N uni06B4 ; B 20 143 757 891 ; +C -1 ; WX 879 ; N glyph1528 ; B 20 143 879 891 ; +C -1 ; WX 360 ; N glyph1529 ; B -34 143 360 891 ; +C -1 ; WX 542 ; N glyph1530 ; B -34 143 542 891 ; +C -1 ; WX 451 ; N uni06B5 ; B 17 -36 451 891 ; +C -1 ; WX 451 ; N glyph1532 ; B 17 -36 451 891 ; +C -1 ; WX 234 ; N glyph1533 ; B -34 143 234 891 ; +C -1 ; WX 234 ; N glyph1534 ; B -34 143 234 891 ; +C -1 ; WX 451 ; N uni06B6 ; B 17 -36 451 891 ; +C -1 ; WX 451 ; N glyph1536 ; B 17 -36 451 891 ; +C -1 ; WX 234 ; N glyph1537 ; B -39 143 234 891 ; +C -1 ; WX 234 ; N glyph1538 ; B -39 143 234 891 ; +C -1 ; WX 451 ; N uni06B7 ; B 17 -36 451 891 ; +C -1 ; WX 451 ; N glyph1540 ; B 17 -36 451 891 ; +C -1 ; WX 234 ; N glyph1541 ; B -34 143 234 891 ; +C -1 ; WX 234 ; N glyph1542 ; B -34 143 234 891 ; +C -1 ; WX 451 ; N uni06B8 ; B 17 -168 451 773 ; +C -1 ; WX 451 ; N glyph1544 ; B 17 -168 451 773 ; +C -1 ; WX 234 ; N glyph1545 ; B -34 -193 242 774 ; +C -1 ; WX 234 ; N glyph1546 ; B -34 -193 242 774 ; +C -1 ; WX 541 ; N uni06B9 ; B 30 -212 541 612 ; +C -1 ; WX 541 ; N glyph1548 ; B 30 -212 541 612 ; +C -1 ; WX 271 ; N glyph1549 ; B -34 -63 274 735 ; +C -1 ; WX 271 ; N glyph1550 ; B -34 -63 274 735 ; +C -1 ; WX 541 ; N uni06BA ; B 30 -63 541 458 ; +C -1 ; WX 541 ; N uniFB9F ; B 30 -63 541 458 ; +C -1 ; WX 541 ; N uni06BB ; B 30 -63 541 798 ; +C -1 ; WX 541 ; N uniFBA1 ; B 30 -63 541 798 ; +C -1 ; WX 541 ; N uni06BC ; B 30 -175 541 612 ; +C -1 ; WX 541 ; N glyph1556 ; B 30 -175 541 612 ; +C -1 ; WX 271 ; N glyph1557 ; B -34 31 274 735 ; +C -1 ; WX 271 ; N glyph1558 ; B -34 31 274 735 ; +C -1 ; WX 541 ; N uni06BD ; B 30 -63 541 742 ; +C -1 ; WX 541 ; N glyph1560 ; B 30 -63 541 742 ; +C -1 ; WX 577 ; N uni06BF ; B 25 -203 563 746 ; +C -1 ; WX 559 ; N glyph1562 ; B 23 -201 563 746 ; +C -1 ; WX 523 ; N glyph1563 ; B -34 -193 523 724 ; +C -1 ; WX 523 ; N glyph1564 ; B -34 -193 523 724 ; +C -1 ; WX 343 ; N uni06C0 ; B 43 126 304 694 ; +C -1 ; WX 415 ; N uniFBA5 ; B 1 143 415 743 ; +C -1 ; WX 388 ; N uni06C1 ; B 13 68 388 376 ; +C -1 ; WX 388 ; N uni06C2 ; B 13 68 388 597 ; +C -1 ; WX 388 ; N uni06C3 ; B 13 68 388 634 ; +C -1 ; WX 451 ; N uni06C4 ; B 3 -71 451 484 ; +C -1 ; WX 451 ; N glyph1571 ; B 3 -71 451 484 ; +C -1 ; WX 451 ; N uni06C5 ; B 3 -71 451 484 ; +C -1 ; WX 451 ; N uniFBE1 ; B 3 -71 451 484 ; +C -1 ; WX 451 ; N uni06C6 ; B 3 -71 451 667 ; +C -1 ; WX 451 ; N uniFBDA ; B 3 -71 451 667 ; +C -1 ; WX 451 ; N uni06C7 ; B 3 -71 451 778 ; +C -1 ; WX 451 ; N uniFBD8 ; B 3 -71 451 778 ; +C -1 ; WX 451 ; N uni06C8 ; B 3 -71 451 817 ; +C -1 ; WX 451 ; N uniFBDC ; B 3 -71 451 817 ; +C -1 ; WX 451 ; N uni06C9 ; B 3 -71 451 667 ; +C -1 ; WX 451 ; N uniFBE3 ; B 3 -71 451 667 ; +C -1 ; WX 451 ; N uni06CA ; B 3 -71 451 699 ; +C -1 ; WX 451 ; N glyph1583 ; B 3 -71 451 699 ; +C -1 ; WX 451 ; N uni06CB ; B 3 -71 451 816 ; +C -1 ; WX 451 ; N uniFBDF ; B 3 -71 451 816 ; +C -1 ; WX 645 ; N uni06CD ; B 32 -60 575 461 ; +C -1 ; WX 554 ; N glyph1587 ; B -19 -174 554 276 ; +C -1 ; WX 645 ; N uni06CE ; B 74 -60 575 522 ; +C -1 ; WX 554 ; N glyph1589 ; B 5 -174 554 424 ; +C -1 ; WX 271 ; N glyph1590 ; B -34 -81 271 667 ; +C -1 ; WX 271 ; N glyph1591 ; B -34 -81 271 667 ; +C -1 ; WX 451 ; N uni06CF ; B 3 -71 451 724 ; +C -1 ; WX 451 ; N glyph1593 ; B 3 -71 451 724 ; +C -1 ; WX 645 ; N uni06D0 ; B 74 -187 575 461 ; +C -1 ; WX 554 ; N uniFBE5 ; B 5 -212 554 282 ; +C -1 ; WX 271 ; N uniFBE6 ; B -34 -171 271 492 ; +C -1 ; WX 271 ; N uniFBE7 ; B -34 -171 271 492 ; +C -1 ; WX 645 ; N uni06D1 ; B 74 -178 575 461 ; +C -1 ; WX 554 ; N glyph1599 ; B 5 -212 554 282 ; +C -1 ; WX 812 ; N uni06D2 ; B 33 -25 812 469 ; +C -1 ; WX 812 ; N uniFBAF ; B 34 -208 812 276 ; +C -1 ; WX 812 ; N uni06D3 ; B 33 -25 812 597 ; +C -1 ; WX 812 ; N uniFBB1 ; B 34 -208 812 499 ; +C -1 ; WX 207 ; N uni06D4 ; B 20 143 188 276 ; +C -1 ; WX 0 ; N uni06D6 ; B -230 519 231 886 ; +C -1 ; WX 0 ; N uni06D7 ; B -182 519 183 886 ; +C -1 ; WX 0 ; N uni06D8 ; B -107 519 107 675 ; +C -1 ; WX 0 ; N uni06D9 ; B -108 519 108 836 ; +C -1 ; WX 0 ; N uni06DA ; B -128 519 128 866 ; +C -1 ; WX 0 ; N uni06DB ; B -65 519 68 660 ; +C -1 ; WX 0 ; N uni06DC ; B -207 519 207 767 ; +C -1 ; WX 1123 ; N uni06DD ; B 24 -188 1099 886 ; +C -1 ; WX 1084 ; N uni06DE ; B 24 -152 1060 884 ; +C -1 ; WX 0 ; N uni06DF ; B -37 519 37 592 ; +C -1 ; WX 0 ; N uni06E0 ; B -36 519 36 591 ; +C -1 ; WX 0 ; N uni06E1 ; B -133 519 133 689 ; +C -1 ; WX 0 ; N uni06E2 ; B -82 519 82 824 ; +C -1 ; WX 0 ; N uni06E3 ; B -207 -209 207 39 ; +C -1 ; WX 0 ; N uni06E4 ; B -57 519 57 550 ; +C -1 ; WX 213 ; N uni06E5 ; B 0 519 213 783 ; +C -1 ; WX 371 ; N uni06E6 ; B 0 519 371 754 ; +C -1 ; WX 0 ; N uni06E7 ; B -185 519 186 754 ; +C -1 ; WX 0 ; N uni06E8 ; B -122 519 122 840 ; +C -1 ; WX 600 ; N uni06E9 ; B 24 0 576 818 ; +C -1 ; WX 0 ; N uni06EA ; B -82 -165 82 -1 ; +C -1 ; WX 0 ; N uni06EB ; B -82 519 82 683 ; +C -1 ; WX 0 ; N uni06ED ; B -82 -209 82 97 ; +C -1 ; WX 899 ; N uni06FA ; B 31 -63 899 774 ; +C -1 ; WX 899 ; N glyph1629 ; B 31 -63 899 774 ; +C -1 ; WX 608 ; N glyph1630 ; B -34 -63 608 774 ; +C -1 ; WX 608 ; N glyph1631 ; B -34 -63 608 774 ; +C -1 ; WX 1063 ; N uni06FB ; B 31 -63 1063 728 ; +C -1 ; WX 1063 ; N glyph1633 ; B 31 -63 1063 728 ; +C -1 ; WX 771 ; N glyph1634 ; B -34 -63 771 728 ; +C -1 ; WX 771 ; N glyph1635 ; B -34 -63 771 728 ; +C -1 ; WX 541 ; N uni06FC ; B 25 -204 535 822 ; +C -1 ; WX 469 ; N glyph1637 ; B 34 -198 516 760 ; +C -1 ; WX 541 ; N glyph1638 ; B -34 -63 483 800 ; +C -1 ; WX 360 ; N glyph1639 ; B -34 -63 360 756 ; +C -1 ; WX 469 ; N uni06FD ; B 62 -145 422 510 ; +C -1 ; WX 360 ; N uni06FE ; B 16 -212 360 431 ; +C -1 ; WX 343 ; N uniFBA6 ; B 43 126 304 519 ; +C -1 ; WX 271 ; N uniFBA8 ; B -34 -134 271 492 ; +C -1 ; WX 320 ; N uniFBA9 ; B -34 -205 320 395 ; +C -1 ; WX 244 ; N glyph1645 ; B 23 -68 222 49 ; +C -1 ; WX 244 ; N glyph1646 ; B 29 -151 226 -20 ; +C -1 ; WX 244 ; N glyph1647 ; B 9 -136 236 59 ; +C -1 ; WX 244 ; N glyph1648 ; B 86 -64 162 34 ; +C -1 ; WX 244 ; N glyph1649 ; B 53 -70 197 27 ; +C -1 ; WX 757 ; N glyph1650 ; B 20 143 757 811 ; +C -1 ; WX 879 ; N glyph1651 ; B 20 143 879 811 ; +C -1 ; WX 273 ; N uniFB1D ; B 66 109 207 518 ; +C -1 ; WX 0 ; N uniFB1E ; B -152 611 152 753 ; +C -1 ; WX 414 ; N glyph1654 ; B 0 140 414 191 ; +C -1 ; WX 546 ; N uniFB1F ; B 66 140 480 518 ; +C -1 ; WX 486 ; N glyph1656 ; B -5 72 471 890 ; +C -1 ; WX 541 ; N glyph1657 ; B -5 94 541 890 ; +C -1 ; WX 486 ; N glyph1658 ; B 17 -122 471 739 ; +C -1 ; WX 541 ; N glyph1659 ; B 13 -122 541 766 ; +C -1 ; WX 486 ; N glyph1660 ; B 17 72 471 792 ; +C -1 ; WX 541 ; N glyph1661 ; B 13 94 541 792 ; +C -1 ; WX 486 ; N glyph1662 ; B 17 72 484 891 ; +C -1 ; WX 541 ; N glyph1663 ; B 13 94 541 891 ; +C -1 ; WX 486 ; N glyph1664 ; B 17 72 491 891 ; +C -1 ; WX 541 ; N glyph1665 ; B 13 94 541 891 ; +C -1 ; WX 486 ; N glyph1666 ; B 17 72 471 891 ; +C -1 ; WX 541 ; N glyph1667 ; B 13 94 541 891 ; +C -1 ; WX 486 ; N glyph1668 ; B 17 -173 471 739 ; +C -1 ; WX 541 ; N glyph1669 ; B 13 -136 541 766 ; +C -1 ; WX 562 ; N glyph1670 ; B 56 143 505 713 ; +C -1 ; WX 562 ; N glyph1671 ; B 92 89 469 713 ; +C -1 ; WX 486 ; N glyph1672 ; B 7 72 471 891 ; +C -1 ; WX 541 ; N glyph1673 ; B 7 94 541 891 ; +EndCharMetrics +StartKernData +StartKernPairs 908 +KPX space A -37 +KPX space Y -18 +KPX space Alphatonos -37 +KPX space Alpha -37 +KPX space Delta -37 +KPX space Lambda -37 +KPX space Upsilon -18 +KPX space Upsilondieresis -18 +KPX one one -55 +KPX A space -37 +KPX A T -74 +KPX A V -74 +KPX A W -55 +KPX A Y -92 +KPX A v -37 +KPX A w -18 +KPX A y -37 +KPX A quoteright -55 +KPX F comma -111 +KPX F period -111 +KPX F A -55 +KPX L space -18 +KPX L T -74 +KPX L V -74 +KPX L W -55 +KPX L Y -92 +KPX L y -37 +KPX L quoteright -55 +KPX P space -18 +KPX P comma -129 +KPX P period -129 +KPX P A -74 +KPX R V -18 +KPX R W -18 +KPX R Y -37 +KPX T comma -111 +KPX T hyphen -55 +KPX T period -111 +KPX T colon -111 +KPX T semicolon -111 +KPX T A -74 +KPX T O -18 +KPX T a -74 +KPX T c -74 +KPX T e -74 +KPX T i -18 +KPX T o -74 +KPX T r -55 +KPX T s -74 +KPX T u -74 +KPX T w -74 +KPX T y -74 +KPX V comma -92 +KPX V hyphen -55 +KPX V period -92 +KPX V colon -55 +KPX V semicolon -55 +KPX V A -74 +KPX V a -55 +KPX V e -55 +KPX V i -18 +KPX V o -74 +KPX V r -55 +KPX V u -37 +KPX V y -37 +KPX W comma -55 +KPX W hyphen -20 +KPX W period -55 +KPX W colon -18 +KPX W semicolon -18 +KPX W A -55 +KPX W a -37 +KPX W e -18 +KPX W i -9 +KPX W o -18 +KPX W r -18 +KPX W u -18 +KPX W y -18 +KPX Y space -18 +KPX Y comma -111 +KPX Y hyphen -55 +KPX Y period -111 +KPX Y colon -74 +KPX Y semicolon -74 +KPX Y A -92 +KPX Y a -55 +KPX Y e -55 +KPX Y i -37 +KPX Y o -74 +KPX Y p -55 +KPX Y q -74 +KPX Y u -55 +KPX Y v -55 +KPX f quoteright 18 +KPX r comma -55 +KPX r period -55 +KPX r quoteright 37 +KPX v comma -74 +KPX v period -74 +KPX w comma -37 +KPX w period -37 +KPX y comma -74 +KPX y period -74 +KPX quoteleft quoteleft -37 +KPX quoteright space -55 +KPX quoteright s -37 +KPX quoteright quoteright -37 +KPX quotedblbase afii10051 -100 +KPX quotedblbase afii10060 -100 +KPX quotedblbase afii10036 -88 +KPX quotedblbase afii10041 -101 +KPX quotedblbase afii10044 -88 +KPX Gamma comma -110 +KPX Gamma period -110 +KPX Gamma Alpha -109 +KPX Gamma Delta -109 +KPX Gamma Lambda -109 +KPX Gamma iotatonos -32 +KPX Gamma iota -32 +KPX Gamma iotadieresis 46 +KPX Theta Alpha -27 +KPX Theta Delta -27 +KPX Theta Lambda -27 +KPX Theta Upsilon -28 +KPX Theta Upsilondieresis -28 +KPX Phi Alpha -27 +KPX Phi Tau -27 +KPX Phi Upsilon -28 +KPX Phi Upsilondieresis -28 +KPX delta tau -28 +KPX delta chi -36 +KPX delta pi -28 +KPX tau alpha -28 +KPX tau delta -28 +KPX tau sigma -28 +KPX tau phi -28 +KPX tau alphatonos -28 +KPX tau zeta -28 +KPX tau omicron -28 +KPX tau sigma1 -28 +KPX tau omega -28 +KPX tau omegatonos -28 +KPX phi tau -28 +KPX phi lambda -12 +KPX phi chi -36 +KPX phi pi -28 +KPX Alphatonos Theta -27 +KPX Alphatonos Phi -27 +KPX Alphatonos Omicron -27 +KPX Alphatonos Tau -83 +KPX Alphatonos Upsilon -91 +KPX Alphatonos Upsilondieresis -91 +KPX Alphatonos gamma -37 +KPX Alphatonos nu -37 +KPX Alphatonos chi -37 +KPX Omicrontonos Upsilon -28 +KPX Omicrontonos Upsilondieresis -28 +KPX Upsilontonos Theta -38 +KPX Upsilontonos Phi -38 +KPX Upsilontonos alpha -74 +KPX Upsilontonos delta -37 +KPX Upsilontonos sigma -74 +KPX Upsilontonos phi -74 +KPX Upsilontonos iotadieresistonos 125 +KPX Upsilontonos Alpha -91 +KPX Upsilontonos Delta -91 +KPX Upsilontonos Lambda -91 +KPX Upsilontonos Omicron -38 +KPX Upsilontonos Omega -38 +KPX Upsilontonos alphatonos -74 +KPX Upsilontonos etatonos -37 +KPX Upsilontonos iotatonos -37 +KPX Upsilontonos eta -37 +KPX Upsilontonos iota -37 +KPX Upsilontonos kappa -37 +KPX Upsilontonos mu -37 +KPX Upsilontonos omicron -74 +KPX Upsilontonos iotadieresis 45 +KPX Upsilontonos omicrontonos -74 +KPX Omegatonos Upsilon -28 +KPX Omegatonos Upsilondieresis -28 +KPX Alpha quoteright -55 +KPX Alpha Theta -27 +KPX Alpha Phi -27 +KPX Alpha Omicron -27 +KPX Alpha Tau -83 +KPX Alpha Upsilon -91 +KPX Alpha Upsilondieresis -91 +KPX Alpha gamma -37 +KPX Alpha nu -37 +KPX Alpha chi -37 +KPX Delta Theta -27 +KPX Delta Omicron -27 +KPX Delta Tau -83 +KPX Delta Upsilon -91 +KPX Delta Upsilondieresis -91 +KPX Kappa Theta -46 +KPX Kappa Phi -46 +KPX Kappa alpha -23 +KPX Kappa delta -23 +KPX Kappa sigma -23 +KPX Kappa phi -23 +KPX Kappa Omicron -46 +KPX Kappa alphatonos -23 +KPX Kappa zeta -23 +KPX Kappa theta -23 +KPX Kappa xi -23 +KPX Kappa omicron -23 +KPX Kappa omega -23 +KPX Kappa omicrontonos -23 +KPX Kappa omegatonos -23 +KPX Lambda Theta -27 +KPX Lambda Omicron -27 +KPX Lambda Tau -83 +KPX Lambda Upsilon -91 +KPX Lambda Upsilondieresis -91 +KPX Omicron Alpha -27 +KPX Omicron Delta -27 +KPX Omicron Lambda -27 +KPX Omicron Upsilon -28 +KPX Omicron Upsilondieresis -28 +KPX Rho comma -128 +KPX Rho period -128 +KPX Rho Alpha -74 +KPX Rho Delta -74 +KPX Rho Lambda -74 +KPX Sigma tau -17 +KPX Sigma pi -17 +KPX Tau comma -110 +KPX Tau hyphen -55 +KPX Tau period -110 +KPX Tau colon -110 +KPX Tau semicolon -110 +KPX Tau Theta -18 +KPX Tau Phi -27 +KPX Tau alpha -74 +KPX Tau delta -41 +KPX Tau epsilon -74 +KPX Tau sigma -74 +KPX Tau phi -74 +KPX Tau iotadieresistonos 118 +KPX Tau Alpha -74 +KPX Tau Delta -80 +KPX Tau Lambda -74 +KPX Tau Omicron -18 +KPX Tau Omega -18 +KPX Tau alphatonos -74 +KPX Tau epsilontonos -74 +KPX Tau gamma -74 +KPX Tau eta -74 +KPX Tau iota -18 +KPX Tau mu -74 +KPX Tau nu -74 +KPX Tau omicron -74 +KPX Tau upsilon -74 +KPX Tau chi -60 +KPX Tau psi -74 +KPX Tau iotadieresis 45 +KPX Tau upsilondieresis -74 +KPX Tau omicrontonos -74 +KPX Tau upsilontonos -74 +KPX Upsilon comma -110 +KPX Upsilon hyphen -55 +KPX Upsilon period -110 +KPX Upsilon colon -74 +KPX Upsilon semicolon -74 +KPX Upsilon Theta -38 +KPX Upsilon Phi -38 +KPX Upsilon alpha -74 +KPX Upsilon delta -37 +KPX Upsilon sigma -74 +KPX Upsilon phi -74 +KPX Upsilon iotadieresistonos 125 +KPX Upsilon Alpha -91 +KPX Upsilon Delta -91 +KPX Upsilon Lambda -91 +KPX Upsilon Omicron -38 +KPX Upsilon Omega -38 +KPX Upsilon alphatonos -74 +KPX Upsilon etatonos -37 +KPX Upsilon iotatonos -37 +KPX Upsilon gamma -41 +KPX Upsilon eta -37 +KPX Upsilon iota -37 +KPX Upsilon kappa -37 +KPX Upsilon mu -37 +KPX Upsilon omicron -74 +KPX Upsilon iotadieresis 45 +KPX Upsilon omicrontonos -74 +KPX Chi omega -13 +KPX Chi omegatonos -13 +KPX Psi alpha -18 +KPX Psi delta -18 +KPX Psi sigma -18 +KPX Psi phi -18 +KPX Psi alphatonos -18 +KPX Psi omicron -18 +KPX Psi omega -18 +KPX Psi omicrontonos -18 +KPX Psi omegatonos -18 +KPX Omega Upsilon -28 +KPX Omega Upsilondieresis -28 +KPX Upsilondieresis Theta -38 +KPX Upsilondieresis Phi -38 +KPX Upsilondieresis alpha -74 +KPX Upsilondieresis delta -37 +KPX Upsilondieresis sigma -74 +KPX Upsilondieresis phi -74 +KPX Upsilondieresis iotadieresistonos 125 +KPX Upsilondieresis Alpha -91 +KPX Upsilondieresis Delta -91 +KPX Upsilondieresis Lambda -91 +KPX Upsilondieresis Omicron -38 +KPX Upsilondieresis Omega -38 +KPX Upsilondieresis alphatonos -74 +KPX Upsilondieresis etatonos -37 +KPX Upsilondieresis iotatonos -37 +KPX Upsilondieresis eta -37 +KPX Upsilondieresis iota -37 +KPX Upsilondieresis kappa -37 +KPX Upsilondieresis mu -37 +KPX Upsilondieresis omicron -74 +KPX Upsilondieresis iotadieresis 45 +KPX Upsilondieresis omicrontonos -74 +KPX zeta alpha -56 +KPX zeta delta -37 +KPX zeta sigma -56 +KPX zeta tau -37 +KPX zeta phi -56 +KPX zeta alphatonos -56 +KPX zeta etatonos -24 +KPX zeta gamma -32 +KPX zeta eta -24 +KPX zeta theta -37 +KPX zeta iota -24 +KPX zeta kappa -24 +KPX zeta nu -32 +KPX zeta omicron -56 +KPX zeta omega -56 +KPX zeta omicrontonos -56 +KPX zeta omegatonos -56 +KPX zeta pi -37 +KPX kappa alpha -33 +KPX kappa delta -33 +KPX kappa sigma -33 +KPX kappa phi -33 +KPX kappa alphatonos -33 +KPX kappa zeta -33 +KPX kappa theta -14 +KPX kappa xi -33 +KPX kappa omicron -33 +KPX kappa sigma1 -33 +KPX kappa omega -33 +KPX kappa omicrontonos -33 +KPX kappa omegatonos -33 +KPX lambda alpha -12 +KPX lambda delta -12 +KPX lambda sigma -12 +KPX lambda phi -12 +KPX lambda alphatonos -12 +KPX lambda upsilondieresistonos -15 +KPX lambda zeta -12 +KPX lambda xi -12 +KPX lambda omicron -12 +KPX lambda sigma1 -12 +KPX lambda upsilon -15 +KPX lambda omega -12 +KPX lambda upsilondieresis -15 +KPX lambda omicrontonos -12 +KPX lambda upsilontonos -15 +KPX lambda omegatonos -12 +KPX xi alpha -12 +KPX xi delta -12 +KPX xi sigma -12 +KPX xi phi -12 +KPX xi alphatonos -12 +KPX xi zeta -12 +KPX xi xi -12 +KPX xi omicron -12 +KPX xi sigma1 -12 +KPX xi omicrontonos -12 +KPX omicron tau -28 +KPX omicron chi -36 +KPX omicron pi -28 +KPX rho tau -28 +KPX rho pi -28 +KPX chi alpha -36 +KPX chi delta -36 +KPX chi sigma -36 +KPX chi phi -36 +KPX chi alphatonos -36 +KPX chi zeta -36 +KPX chi omicron -36 +KPX chi sigma1 -36 +KPX chi omega -21 +KPX chi omicrontonos -36 +KPX chi omegatonos -21 +KPX omega tau -28 +KPX omega chi -21 +KPX omega pi -28 +KPX omicrontonos tau -28 +KPX omicrontonos chi -36 +KPX omicrontonos pi -28 +KPX omegatonos tau -28 +KPX omegatonos chi -21 +KPX omegatonos pi -28 +KPX afii10052 comma -113 +KPX afii10052 period -125 +KPX afii10052 colon -13 +KPX afii10052 semicolon -13 +KPX afii10052 guillemotleft -38 +KPX afii10052 guillemotright -38 +KPX afii10058 quoteright -100 +KPX afii10059 quoteright -100 +KPX afii10017 quoteright -51 +KPX afii10017 afii10021 37 +KPX afii10017 afii10029 12 +KPX afii10017 afii10032 -13 +KPX afii10017 afii10033 -13 +KPX afii10017 afii10035 -25 +KPX afii10017 afii10036 -50 +KPX afii10017 afii10037 -38 +KPX afii10017 afii10038 -25 +KPX afii10017 afii10041 -76 +KPX afii10017 afii10047 -25 +KPX afii10017 afii10065 12 +KPX afii10017 afii10066 -13 +KPX afii10017 afii10083 -13 +KPX afii10017 afii10084 -13 +KPX afii10017 afii10095 12 +KPX afii10018 afii10017 -38 +KPX afii10018 afii10024 -25 +KPX afii10018 afii10025 -13 +KPX afii10018 afii10029 -25 +KPX afii10018 afii10035 -13 +KPX afii10018 afii10036 -25 +KPX afii10018 afii10037 -25 +KPX afii10018 afii10038 -13 +KPX afii10018 afii10039 -25 +KPX afii10018 afii10041 -38 +KPX afii10018 afii10044 -38 +KPX afii10018 afii10047 -25 +KPX afii10018 afii10049 -25 +KPX afii10018 afii10085 -13 +KPX afii10019 afii10017 -50 +KPX afii10019 afii10021 -13 +KPX afii10019 afii10024 -38 +KPX afii10019 afii10025 -13 +KPX afii10019 afii10029 -25 +KPX afii10019 afii10032 -25 +KPX afii10019 afii10035 -38 +KPX afii10019 afii10036 -38 +KPX afii10019 afii10037 -38 +KPX afii10019 afii10038 -25 +KPX afii10019 afii10039 -38 +KPX afii10019 afii10041 -38 +KPX afii10019 afii10044 -50 +KPX afii10019 afii10049 -25 +KPX afii10019 afii10084 -13 +KPX afii10019 afii10087 -13 +KPX afii10019 afii10089 -38 +KPX afii10020 comma -113 +KPX afii10020 period -125 +KPX afii10020 colon -13 +KPX afii10020 semicolon -13 +KPX afii10020 guillemotleft -38 +KPX afii10020 guillemotright -38 +KPX afii10020 afii10017 -63 +KPX afii10020 afii10021 -25 +KPX afii10020 afii10029 -25 +KPX afii10020 afii10032 -13 +KPX afii10020 afii10035 -13 +KPX afii10020 afii10065 -13 +KPX afii10020 afii10067 -25 +KPX afii10020 afii10069 -38 +KPX afii10020 afii10070 -51 +KPX afii10020 afii10074 -25 +KPX afii10020 afii10077 -50 +KPX afii10020 afii10078 -38 +KPX afii10020 afii10079 -25 +KPX afii10020 afii10080 -50 +KPX afii10020 afii10082 -38 +KPX afii10020 afii10085 -38 +KPX afii10020 afii10093 -38 +KPX afii10020 afii10094 -38 +KPX afii10020 afii10096 -38 +KPX afii10020 afii10097 -38 +KPX afii10021 afii10025 12 +KPX afii10021 afii10037 12 +KPX afii10021 afii10038 -13 +KPX afii10021 afii10041 -13 +KPX afii10021 afii10070 12 +KPX afii10021 afii10073 25 +KPX afii10021 afii10080 12 +KPX afii10021 afii10085 12 +KPX afii10024 afii10025 12 +KPX afii10024 afii10032 -13 +KPX afii10024 afii10035 -25 +KPX afii10024 afii10036 25 +KPX afii10024 afii10037 25 +KPX afii10024 afii10041 12 +KPX afii10024 afii10044 37 +KPX afii10024 afii10065 12 +KPX afii10024 afii10080 -13 +KPX afii10025 afii10024 -25 +KPX afii10025 afii10029 -25 +KPX afii10025 afii10032 -13 +KPX afii10025 afii10035 -25 +KPX afii10025 afii10036 -38 +KPX afii10025 afii10037 -38 +KPX afii10025 afii10038 -25 +KPX afii10025 afii10041 -38 +KPX afii10025 afii10049 -25 +KPX afii10028 afii10025 37 +KPX afii10028 afii10035 -13 +KPX afii10028 afii10036 25 +KPX afii10028 afii10037 25 +KPX afii10028 afii10038 -13 +KPX afii10028 afii10041 25 +KPX afii10028 afii10047 12 +KPX afii10028 afii10065 12 +KPX afii10028 afii10073 12 +KPX afii10028 afii10083 -13 +KPX afii10029 afii10065 25 +KPX afii10030 afii10065 12 +KPX afii10030 afii10083 -13 +KPX afii10030 afii10089 -13 +KPX afii10032 afii10017 -25 +KPX afii10032 afii10021 -13 +KPX afii10032 afii10024 -13 +KPX afii10032 afii10029 -25 +KPX afii10032 afii10037 -25 +KPX afii10032 afii10039 -38 +KPX afii10032 afii10049 -13 +KPX afii10032 afii10069 -25 +KPX afii10032 afii10077 -13 +KPX afii10034 comma -138 +KPX afii10034 period -150 +KPX afii10034 colon -13 +KPX afii10034 semicolon -13 +KPX afii10034 afii10017 -88 +KPX afii10034 afii10021 -63 +KPX afii10034 afii10024 -13 +KPX afii10034 afii10025 -13 +KPX afii10034 afii10029 -63 +KPX afii10034 afii10030 -13 +KPX afii10034 afii10032 -13 +KPX afii10034 afii10035 -25 +KPX afii10034 afii10036 -13 +KPX afii10034 afii10037 -13 +KPX afii10034 afii10038 -13 +KPX afii10034 afii10039 -38 +KPX afii10034 afii10049 -25 +KPX afii10034 afii10065 -13 +KPX afii10034 afii10069 -63 +KPX afii10034 afii10070 -25 +KPX afii10034 afii10080 -25 +KPX afii10034 afii10097 -13 +KPX afii10035 afii10017 -25 +KPX afii10035 afii10021 -13 +KPX afii10035 afii10025 -13 +KPX afii10035 afii10029 -25 +KPX afii10035 afii10030 -13 +KPX afii10035 afii10032 -25 +KPX afii10035 afii10036 -25 +KPX afii10035 afii10037 -13 +KPX afii10035 afii10039 -38 +KPX afii10035 afii10041 -25 +KPX afii10035 afii10044 -13 +KPX afii10035 afii10047 -13 +KPX afii10035 afii10065 12 +KPX afii10035 afii10066 -13 +KPX afii10035 afii10072 12 +KPX afii10035 afii10083 -13 +KPX afii10035 afii10086 -13 +KPX afii10035 afii10089 -13 +KPX afii10036 comma -100 +KPX afii10036 period -113 +KPX afii10036 colon -13 +KPX afii10036 semicolon -13 +KPX afii10036 guillemotleft -25 +KPX afii10036 afii10017 -63 +KPX afii10036 afii10021 -25 +KPX afii10036 afii10024 25 +KPX afii10036 afii10029 -25 +KPX afii10036 afii10032 -25 +KPX afii10036 afii10038 -38 +KPX afii10036 afii10049 -13 +KPX afii10036 afii10065 -25 +KPX afii10036 afii10067 -38 +KPX afii10036 afii10070 -50 +KPX afii10036 afii10074 -38 +KPX afii10036 afii10076 -38 +KPX afii10036 afii10077 -63 +KPX afii10036 afii10078 -51 +KPX afii10036 afii10080 -63 +KPX afii10036 afii10081 -13 +KPX afii10036 afii10082 -38 +KPX afii10036 afii10083 -63 +KPX afii10036 afii10085 -38 +KPX afii10036 afii10087 -38 +KPX afii10036 afii10091 -13 +KPX afii10036 afii10093 -13 +KPX afii10036 afii10094 -13 +KPX afii10036 afii10096 -13 +KPX afii10036 afii10097 -25 +KPX afii10037 comma -113 +KPX afii10037 period -125 +KPX afii10037 colon -25 +KPX afii10037 semicolon -25 +KPX afii10037 guillemotleft -38 +KPX afii10037 guillemotright -38 +KPX afii10037 afii10017 -75 +KPX afii10037 afii10021 -51 +KPX afii10037 afii10029 -38 +KPX afii10037 afii10032 -25 +KPX afii10037 afii10038 -38 +KPX afii10037 afii10047 -13 +KPX afii10037 afii10049 -25 +KPX afii10037 afii10066 -25 +KPX afii10037 afii10067 -38 +KPX afii10037 afii10068 -38 +KPX afii10037 afii10069 -63 +KPX afii10037 afii10070 -63 +KPX afii10037 afii10072 -13 +KPX afii10037 afii10073 -50 +KPX afii10037 afii10074 -38 +KPX afii10037 afii10075 -38 +KPX afii10037 afii10076 -38 +KPX afii10037 afii10077 -63 +KPX afii10037 afii10078 -50 +KPX afii10037 afii10079 -38 +KPX afii10037 afii10080 -63 +KPX afii10037 afii10081 -38 +KPX afii10037 afii10082 -38 +KPX afii10037 afii10083 -63 +KPX afii10037 afii10087 -25 +KPX afii10037 afii10088 -38 +KPX afii10037 afii10090 -38 +KPX afii10037 afii10091 -38 +KPX afii10037 afii10096 -38 +KPX afii10037 afii10097 -50 +KPX afii10038 afii10017 -25 +KPX afii10038 afii10021 -51 +KPX afii10038 afii10029 -38 +KPX afii10038 afii10036 -38 +KPX afii10038 afii10037 -38 +KPX afii10038 afii10038 -13 +KPX afii10038 afii10041 -13 +KPX afii10038 afii10049 -26 +KPX afii10038 afii10077 -25 +KPX afii10039 afii10025 -13 +KPX afii10039 afii10032 -26 +KPX afii10039 afii10035 -38 +KPX afii10039 afii10038 -38 +KPX afii10039 afii10047 -25 +KPX afii10039 afii10080 -13 +KPX afii10039 afii10085 -13 +KPX afii10040 afii10065 37 +KPX afii10040 afii10070 12 +KPX afii10040 afii10080 12 +KPX afii10043 afii10065 12 +KPX afii10044 quoteright -100 +KPX afii10044 afii10049 -38 +KPX afii10046 quoteright -75 +KPX afii10046 afii10017 -25 +KPX afii10046 afii10021 -13 +KPX afii10046 afii10024 -38 +KPX afii10046 afii10025 -25 +KPX afii10046 afii10029 -38 +KPX afii10046 afii10030 -25 +KPX afii10046 afii10032 -13 +KPX afii10046 afii10035 -25 +KPX afii10046 afii10036 -101 +KPX afii10046 afii10039 -51 +KPX afii10046 afii10041 -75 +KPX afii10046 afii10047 -38 +KPX afii10046 afii10049 -38 +KPX afii10047 afii10021 -25 +KPX afii10047 afii10024 -25 +KPX afii10047 afii10025 -13 +KPX afii10047 afii10029 -38 +KPX afii10047 afii10038 -13 +KPX afii10047 afii10039 -25 +KPX afii10047 afii10049 -25 +KPX afii10047 afii10069 -13 +KPX afii10047 afii10072 12 +KPX afii10047 afii10077 -25 +KPX afii10048 afii10017 -25 +KPX afii10048 afii10021 -25 +KPX afii10048 afii10024 -25 +KPX afii10048 afii10029 -38 +KPX afii10048 afii10035 -13 +KPX afii10048 afii10036 -25 +KPX afii10048 afii10039 -38 +KPX afii10048 afii10041 -13 +KPX afii10048 afii10069 -25 +KPX afii10048 afii10072 12 +KPX afii10048 afii10077 -25 +KPX afii10065 afii10073 12 +KPX afii10065 afii10089 -25 +KPX afii10066 afii10069 -25 +KPX afii10066 afii10072 -13 +KPX afii10066 afii10073 -13 +KPX afii10066 afii10077 -25 +KPX afii10066 afii10078 -13 +KPX afii10066 afii10083 -13 +KPX afii10066 afii10085 -13 +KPX afii10066 afii10087 -25 +KPX afii10066 afii10089 -25 +KPX afii10066 afii10092 -13 +KPX afii10066 afii10095 -13 +KPX afii10066 afii10097 -13 +KPX afii10067 afii10065 -13 +KPX afii10067 afii10066 -13 +KPX afii10067 afii10070 -13 +KPX afii10067 afii10072 -13 +KPX afii10067 afii10077 -13 +KPX afii10067 afii10078 -13 +KPX afii10067 afii10080 -13 +KPX afii10067 afii10083 -25 +KPX afii10067 afii10084 -13 +KPX afii10067 afii10085 -25 +KPX afii10067 afii10086 -13 +KPX afii10067 afii10089 -38 +KPX afii10067 afii10092 -25 +KPX afii10067 afii10097 -13 +KPX afii10068 comma -88 +KPX afii10068 period -100 +KPX afii10068 afii10069 -38 +KPX afii10068 afii10077 -25 +KPX afii10068 afii10080 -13 +KPX afii10068 afii10083 -13 +KPX afii10069 afii10073 12 +KPX afii10069 afii10083 -13 +KPX afii10069 afii10085 12 +KPX afii10069 afii10092 -13 +KPX afii10070 afii10066 -13 +KPX afii10070 afii10072 -13 +KPX afii10070 afii10078 -13 +KPX afii10070 afii10083 -13 +KPX afii10070 afii10084 -13 +KPX afii10070 afii10085 -13 +KPX afii10070 afii10087 -13 +KPX afii10070 afii10089 -25 +KPX afii10072 afii10065 12 +KPX afii10072 afii10070 -13 +KPX afii10072 afii10073 12 +KPX afii10072 afii10080 -25 +KPX afii10072 afii10083 -13 +KPX afii10072 afii10089 -25 +KPX afii10073 afii10065 -13 +KPX afii10073 afii10066 -25 +KPX afii10073 afii10070 -13 +KPX afii10073 afii10072 -13 +KPX afii10073 afii10073 -13 +KPX afii10073 afii10077 -13 +KPX afii10073 afii10078 -25 +KPX afii10073 afii10080 -25 +KPX afii10073 afii10083 -25 +KPX afii10073 afii10085 -25 +KPX afii10073 afii10086 -13 +KPX afii10073 afii10089 -38 +KPX afii10073 afii10092 -25 +KPX afii10076 afii10077 12 +KPX afii10076 afii10080 -13 +KPX afii10076 afii10083 -13 +KPX afii10076 afii10086 -13 +KPX afii10076 afii10089 -13 +KPX afii10076 afii10095 -13 +KPX afii10077 afii10066 -13 +KPX afii10077 afii10070 -13 +KPX afii10077 afii10080 -13 +KPX afii10077 afii10083 -13 +KPX afii10077 afii10085 -13 +KPX afii10077 afii10089 -25 +KPX afii10078 afii10065 -13 +KPX afii10078 afii10066 -13 +KPX afii10078 afii10073 -13 +KPX afii10078 afii10080 -13 +KPX afii10078 afii10083 -13 +KPX afii10078 afii10085 -13 +KPX afii10078 afii10086 -13 +KPX afii10078 afii10095 -13 +KPX afii10080 afii10069 -13 +KPX afii10080 afii10072 -13 +KPX afii10080 afii10073 -13 +KPX afii10080 afii10077 -25 +KPX afii10080 afii10078 -13 +KPX afii10080 afii10083 -13 +KPX afii10080 afii10084 -25 +KPX afii10080 afii10085 -13 +KPX afii10080 afii10087 -25 +KPX afii10080 afii10089 -25 +KPX afii10080 afii10095 -13 +KPX afii10080 afii10097 -13 +KPX afii10082 afii10069 -25 +KPX afii10082 afii10072 -13 +KPX afii10082 afii10073 -13 +KPX afii10082 afii10077 -25 +KPX afii10082 afii10078 -13 +KPX afii10082 afii10084 -13 +KPX afii10082 afii10085 -13 +KPX afii10082 afii10087 -13 +KPX afii10082 afii10089 -25 +KPX afii10082 afii10095 -13 +KPX afii10082 afii10097 -13 +KPX afii10083 afii10065 12 +KPX afii10083 afii10066 -13 +KPX afii10083 afii10087 -13 +KPX afii10083 afii10089 -26 +KPX afii10083 afii10092 -13 +KPX afii10084 comma -75 +KPX afii10084 period -88 +KPX afii10084 afii10069 -13 +KPX afii10084 afii10072 12 +KPX afii10084 afii10077 -13 +KPX afii10084 afii10080 -13 +KPX afii10084 afii10083 -13 +KPX afii10084 afii10085 25 +KPX afii10085 comma -75 +KPX afii10085 period -88 +KPX afii10085 colon -13 +KPX afii10085 semicolon -13 +KPX afii10085 guillemotright 25 +KPX afii10085 afii10065 -13 +KPX afii10085 afii10069 -25 +KPX afii10085 afii10070 -13 +KPX afii10085 afii10072 12 +KPX afii10085 afii10073 -13 +KPX afii10085 afii10077 -13 +KPX afii10085 afii10078 -13 +KPX afii10085 afii10080 -25 +KPX afii10085 afii10082 -13 +KPX afii10085 afii10083 -25 +KPX afii10085 afii10084 12 +KPX afii10085 afii10086 -13 +KPX afii10085 afii10087 12 +KPX afii10085 afii10095 -13 +KPX afii10085 afii10097 -13 +KPX afii10086 afii10066 -13 +KPX afii10086 afii10069 -13 +KPX afii10086 afii10070 -13 +KPX afii10086 afii10077 -25 +KPX afii10086 afii10078 -13 +KPX afii10086 afii10080 -13 +KPX afii10086 afii10084 -13 +KPX afii10086 afii10085 -13 +KPX afii10086 afii10089 -25 +KPX afii10086 afii10097 -13 +KPX afii10087 afii10066 -13 +KPX afii10087 afii10070 -25 +KPX afii10087 afii10073 -13 +KPX afii10087 afii10080 -25 +KPX afii10087 afii10083 -25 +KPX afii10087 afii10085 12 +KPX afii10087 afii10086 -13 +KPX afii10087 afii10089 -25 +KPX afii10087 afii10095 -13 +KPX afii10088 afii10065 12 +KPX afii10088 afii10073 12 +KPX afii10088 afii10083 -13 +KPX afii10091 afii10065 12 +KPX afii10091 afii10080 -13 +KPX afii10094 afii10084 -88 +KPX afii10094 afii10089 -88 +KPX afii10095 afii10066 -13 +KPX afii10095 afii10069 -13 +KPX afii10095 afii10072 -13 +KPX afii10095 afii10073 -13 +KPX afii10095 afii10077 -25 +KPX afii10095 afii10078 -13 +KPX afii10095 afii10083 -13 +KPX afii10095 afii10084 -13 +KPX afii10095 afii10087 -13 +KPX afii10095 afii10097 -13 +KPX afii10096 afii10066 -13 +KPX afii10096 afii10069 -13 +KPX afii10096 afii10072 -13 +KPX afii10096 afii10077 -25 +KPX afii10096 afii10078 -13 +KPX afii10096 afii10083 -13 +KPX afii10096 afii10084 -25 +KPX afii10096 afii10087 -25 +KPX afii10096 afii10089 -38 +KPX afii10096 afii10095 -13 +KPX afii10110 comma -75 +KPX afii10110 period -88 +KPX afii10110 colon -13 +KPX afii10110 semicolon -13 +KPX afii10110 guillemotleft -25 +KPX afii10050 comma -63 +KPX afii10050 period -75 +KPX afii10050 colon -13 +KPX afii10050 semicolon -13 +KPX afii10050 guillemotleft -25 +KPX afii10050 guillemotright -25 +KPX pi alpha -28 +KPX pi delta -28 +KPX pi sigma -28 +KPX pi phi -28 +KPX pi alphatonos -28 +KPX pi zeta -28 +KPX pi lambda -37 +KPX pi omicron -28 +KPX pi sigma1 -28 +KPX pi omega -28 +KPX pi omegatonos -28 +EndKernPairs +EndKernData +EndFontMetrics diff --git a/gulliver/thirdparty/html2ps_pdf/fonts/arialbd.ttf b/thirdparty/html2ps_pdf/fonts/arialbd.ttf similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/fonts/arialbd.ttf rename to thirdparty/html2ps_pdf/fonts/arialbd.ttf diff --git a/gulliver/thirdparty/html2ps_pdf/fonts/arialbi.afm b/thirdparty/html2ps_pdf/fonts/arialbi.afm similarity index 97% rename from gulliver/thirdparty/html2ps_pdf/fonts/arialbi.afm rename to thirdparty/html2ps_pdf/fonts/arialbi.afm index ec1792688..fc3e67f54 100644 --- a/gulliver/thirdparty/html2ps_pdf/fonts/arialbi.afm +++ b/thirdparty/html2ps_pdf/fonts/arialbi.afm @@ -1,1834 +1,1834 @@ -StartFontMetrics 4.1 -FontName Arial-BoldItalicMT -FullName Arial Bold Italic -Notice Typeface The Monotype Corporation plc. Data The Monotype Corporation plc/Type Solutions Inc. 1990-1992. All Rights Reserved -EncodingScheme FontSpecific -FamilyName Arial -Weight Bold Italic -Version Version 2.90 -Characters 956 -ItalicAngle -12.0 -Ascender 905 -Descender -212 -UnderlineThickness 105 -UnderlinePosition -106 -IsFixedPitch false -FontBBox -560 -376 1157 1000 -StartCharMetrics 991 -C 0 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 1 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 2 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 3 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 4 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 5 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 6 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 7 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 8 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 9 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 10 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 11 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 12 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 13 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 14 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 15 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 16 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 17 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 18 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 19 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 20 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 21 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 22 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 23 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 24 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 25 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 26 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 27 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 28 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 29 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 30 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 31 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 32 ; WX 278 ; N space ; B 62 0 353 716 ; -C 33 ; WX 333 ; N exclam ; B 62 0 353 716 ; -C 34 ; WX 474 ; N quotedbl ; B 151 461 507 716 ; -C 35 ; WX 556 ; N numbersign ; B 9 -12 544 728 ; -C 36 ; WX 556 ; N dollar ; B 44 -99 576 770 ; -C 37 ; WX 889 ; N percent ; B 91 -31 864 728 ; -C 38 ; WX 722 ; N ampersand ; B 83 -17 706 728 ; -C 39 ; WX 238 ; N quotesingle ; B 151 461 329 716 ; -C 40 ; WX 333 ; N parenleft ; B 66 -210 436 728 ; -C 41 ; WX 333 ; N parenright ; B -78 -210 292 728 ; -C 42 ; WX 389 ; N asterisk ; B 14 387 368 728 ; -C 43 ; WX 584 ; N plus ; B 42 103 542 604 ; -C 44 ; WX 278 ; N comma ; B 10 -155 212 135 ; -C 45 ; WX 333 ; N hyphen ; B 39 190 339 326 ; -C 46 ; WX 278 ; N period ; B 44 0 211 135 ; -C 47 ; WX 278 ; N slash ; B -43 -12 409 728 ; -C 48 ; WX 556 ; N zero ; B 64 -12 571 719 ; -C 49 ; WX 556 ; N one ; B 119 0 511 720 ; -C 50 ; WX 556 ; N two ; B 61 0 571 719 ; -C 51 ; WX 556 ; N three ; B 51 -12 560 719 ; -C 52 ; WX 556 ; N four ; B 27 0 560 716 ; -C 53 ; WX 556 ; N five ; B 63 -12 578 706 ; -C 54 ; WX 556 ; N six ; B 81 -13 576 719 ; -C 55 ; WX 556 ; N seven ; B 104 0 603 706 ; -C 56 ; WX 556 ; N eight ; B 66 -13 567 719 ; -C 57 ; WX 556 ; N nine ; B 63 -12 558 719 ; -C 58 ; WX 333 ; N colon ; B 70 0 317 519 ; -C 59 ; WX 333 ; N semicolon ; B 41 -155 320 519 ; -C 60 ; WX 584 ; N less ; B 46 82 537 625 ; -C 61 ; WX 584 ; N equal ; B 42 182 542 524 ; -C 62 ; WX 584 ; N greater ; B 46 81 538 625 ; -C 63 ; WX 611 ; N question ; B 123 0 618 728 ; -C 64 ; WX 975 ; N at ; B 30 -210 972 729 ; -C 65 ; WX 722 ; N A ; B -11 0 673 716 ; -C 66 ; WX 722 ; N B ; B 40 0 710 716 ; -C 67 ; WX 722 ; N C ; B 95 -13 746 728 ; -C 68 ; WX 722 ; N D ; B 43 0 725 716 ; -C 69 ; WX 667 ; N E ; B 41 0 721 716 ; -C 70 ; WX 611 ; N F ; B 39 0 690 716 ; -C 71 ; WX 778 ; N G ; B 88 -12 786 728 ; -C 72 ; WX 722 ; N H ; B 43 0 765 716 ; -C 73 ; WX 278 ; N I ; B 35 0 332 716 ; -C 74 ; WX 556 ; N J ; B 29 -12 600 716 ; -C 75 ; WX 722 ; N K ; B 40 0 801 716 ; -C 76 ; WX 611 ; N L ; B 45 0 582 716 ; -C 77 ; WX 833 ; N M ; B 41 0 878 716 ; -C 78 ; WX 722 ; N N ; B 45 0 763 716 ; -C 79 ; WX 778 ; N O ; B 87 -13 784 728 ; -C 80 ; WX 667 ; N P ; B 41 0 702 716 ; -C 81 ; WX 778 ; N Q ; B 87 -95 784 728 ; -C 82 ; WX 722 ; N R ; B 44 0 741 716 ; -C 83 ; WX 667 ; N S ; B 62 -12 676 728 ; -C 84 ; WX 611 ; N T ; B 120 0 709 716 ; -C 85 ; WX 722 ; N U ; B 91 -12 765 716 ; -C 86 ; WX 667 ; N V ; B 113 0 793 716 ; -C 87 ; WX 944 ; N W ; B 117 0 1068 716 ; -C 88 ; WX 667 ; N X ; B -30 0 784 716 ; -C 89 ; WX 667 ; N Y ; B 115 0 785 716 ; -C 90 ; WX 611 ; N Z ; B 25 0 668 716 ; -C 91 ; WX 333 ; N bracketleft ; B 10 -197 439 716 ; -C 92 ; WX 278 ; N backslash ; B 78 -12 287 728 ; -C 93 ; WX 333 ; N bracketright ; B -56 -197 375 716 ; -C 94 ; WX 584 ; N asciicircum ; B 56 338 527 728 ; -C 95 ; WX 556 ; N underscore ; B -9 -198 561 -109 ; -C 96 ; WX 333 ; N grave ; B 134 586 331 732 ; -C 97 ; WX 556 ; N a ; B 45 -12 533 531 ; -C 98 ; WX 611 ; N b ; B 36 -12 602 716 ; -C 99 ; WX 556 ; N c ; B 60 -12 564 531 ; -C 100 ; WX 611 ; N d ; B 59 -12 668 716 ; -C 101 ; WX 556 ; N e ; B 58 -12 555 531 ; -C 102 ; WX 333 ; N f ; B 54 0 471 728 ; -C 103 ; WX 611 ; N g ; B 31 -210 623 531 ; -C 104 ; WX 611 ; N h ; B 42 0 591 716 ; -C 105 ; WX 278 ; N i ; B 40 0 330 716 ; -C 106 ; WX 278 ; N j ; B -109 -210 331 716 ; -C 107 ; WX 556 ; N k ; B 38 0 614 716 ; -C 108 ; WX 278 ; N l ; B 39 0 329 716 ; -C 109 ; WX 889 ; N m ; B 36 0 869 531 ; -C 110 ; WX 611 ; N n ; B 42 0 591 531 ; -C 111 ; WX 611 ; N o ; B 61 -12 599 531 ; -C 112 ; WX 611 ; N p ; B -5 -198 605 531 ; -C 113 ; WX 611 ; N q ; B 60 -198 625 531 ; -C 114 ; WX 389 ; N r ; B 32 0 474 531 ; -C 115 ; WX 556 ; N s ; B 22 -12 552 531 ; -C 116 ; WX 333 ; N t ; B 75 -12 391 698 ; -C 117 ; WX 611 ; N u ; B 70 -12 619 519 ; -C 118 ; WX 556 ; N v ; B 75 0 618 519 ; -C 119 ; WX 778 ; N w ; B 72 0 840 519 ; -C 120 ; WX 556 ; N x ; B -22 0 612 519 ; -C 121 ; WX 556 ; N y ; B 6 -210 621 519 ; -C 122 ; WX 500 ; N z ; B 17 0 519 519 ; -C 123 ; WX 389 ; N braceleft ; B 40 -210 488 728 ; -C 124 ; WX 280 ; N bar ; B 86 -210 195 728 ; -C 125 ; WX 389 ; N braceright ; B -87 -210 361 728 ; -C 126 ; WX 584 ; N asciitilde ; B 33 253 551 451 ; -C 127 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 128 ; WX 556 ; N Euro ; B 27 -13 639 728 ; -C 129 ; WX 614 ; N afii10052 ; B 44 0 723 905 ; -C 130 ; WX 278 ; N quotesinglbase ; B 10 -155 212 135 ; -C 131 ; WX 556 ; N florin ; B -10 -210 558 728 ; -C 132 ; WX 500 ; N quotedblbase ; B 3 -155 441 135 ; -C 133 ; WX 1000 ; N ellipsis ; B 93 0 907 135 ; -C 134 ; WX 556 ; N dagger ; B 84 -171 594 706 ; -C 135 ; WX 556 ; N daggerdbl ; B -1 -171 600 706 ; -C 136 ; WX 333 ; N circumflex ; B 56 584 392 731 ; -C 137 ; WX 1000 ; N perthousand ; B 68 -28 1021 728 ; -C 138 ; WX 667 ; N Scaron ; B 62 -12 676 905 ; -C 139 ; WX 333 ; N guilsinglleft ; B 60 35 378 477 ; -C 140 ; WX 1000 ; N OE ; B 69 -12 1079 728 ; -C 141 ; WX 622 ; N afii10061 ; B 43 0 701 905 ; -C 142 ; WX 611 ; N Zcaron ; B 25 0 668 905 ; -C 143 ; WX 719 ; N afii10145 ; B 43 -198 764 716 ; -C 144 ; WX 500 ; N quotedblbase ; B 3 -155 441 135 ; -C 145 ; WX 278 ; N quoteleft ; B 109 433 311 724 ; -C 146 ; WX 278 ; N quoteright ; B 124 425 326 716 ; -C 147 ; WX 500 ; N quotedblleft ; B 125 433 563 724 ; -C 148 ; WX 500 ; N quotedblright ; B 128 425 566 716 ; -C 149 ; WX 350 ; N bullet ; B 32 209 321 498 ; -C 150 ; WX 556 ; N endash ; B -2 208 554 311 ; -C 151 ; WX 1000 ; N emdash ; B 0 208 1000 311 ; -C 152 ; WX 333 ; N tilde ; B 93 592 429 710 ; -C 153 ; WX 1000 ; N trademark ; B 105 316 877 716 ; -C 154 ; WX 556 ; N scaron ; B 22 -12 552 731 ; -C 155 ; WX 333 ; N guilsinglright ; B 10 35 319 477 ; -C 156 ; WX 944 ; N oe ; B 58 -12 944 531 ; -C 157 ; WX 507 ; N afii10109 ; B 37 0 567 730 ; -C 158 ; WX 500 ; N zcaron ; B 17 0 528 731 ; -C 159 ; WX 667 ; N Ydieresis ; B 115 0 785 876 ; -C 160 ; WX 278 ; N space ; B 62 0 353 716 ; -C 161 ; WX 333 ; N exclamdown ; B 12 -197 305 519 ; -C 162 ; WX 556 ; N cent ; B 59 -193 563 714 ; -C 163 ; WX 556 ; N sterling ; B 21 -18 610 728 ; -C 164 ; WX 556 ; N currency ; B 22 101 531 610 ; -C 165 ; WX 556 ; N yen ; B 24 0 667 716 ; -C 166 ; WX 280 ; N brokenbar ; B 86 -210 195 728 ; -C 167 ; WX 556 ; N section ; B 21 -212 560 728 ; -C 168 ; WX 333 ; N dieresis ; B 84 597 435 717 ; -C 169 ; WX 737 ; N copyright ; B -4 -18 744 730 ; -C 170 ; WX 370 ; N ordfeminine ; B 82 363 412 728 ; -C 171 ; WX 556 ; N guillemotleft ; B 53 35 562 477 ; -C 172 ; WX 584 ; N logicalnot ; B 42 184 542 524 ; -C 173 ; WX 333 ; N hyphen ; B 39 190 339 326 ; -C 174 ; WX 737 ; N registered ; B -4 -18 744 730 ; -C 175 ; WX 552 ; N overscore ; B -9 758 561 847 ; -C 176 ; WX 400 ; N degree ; B 42 417 354 728 ; -C 177 ; WX 549 ; N plusminus ; B 24 0 525 674 ; -C 178 ; WX 333 ; N twosuperior ; B 82 355 396 725 ; -C 179 ; WX 333 ; N threesuperior ; B 76 349 390 725 ; -C 180 ; WX 333 ; N acute ; B 184 584 435 730 ; -C 181 ; WX 576 ; N mu1 ; B -37 -201 584 519 ; -C 182 ; WX 556 ; N paragraph ; B -1 -197 551 716 ; -C 183 ; WX 278 ; N periodcentered ; B 72 280 209 417 ; -C 184 ; WX 333 ; N cedilla ; B 7 -208 267 -13 ; -C 185 ; WX 333 ; N onesuperior ; B 115 355 362 726 ; -C 186 ; WX 365 ; N ordmasculine ; B 72 362 415 728 ; -C 187 ; WX 556 ; N guillemotright ; B 22 35 531 477 ; -C 188 ; WX 834 ; N onequarter ; B 100 -30 840 725 ; -C 189 ; WX 834 ; N onehalf ; B 85 -30 835 725 ; -C 190 ; WX 834 ; N threequarters ; B 76 -30 852 725 ; -C 191 ; WX 611 ; N questiondown ; B 27 -209 522 519 ; -C 192 ; WX 722 ; N Agrave ; B -11 0 673 905 ; -C 193 ; WX 722 ; N Aacute ; B -11 0 686 904 ; -C 194 ; WX 722 ; N Acircumflex ; B -11 0 673 905 ; -C 195 ; WX 722 ; N Atilde ; B -11 0 673 874 ; -C 196 ; WX 722 ; N Adieresis ; B -11 0 681 876 ; -C 197 ; WX 722 ; N Aring ; B -11 -9 673 854 ; -C 198 ; WX 1000 ; N AE ; B -32 0 1059 716 ; -C 199 ; WX 722 ; N Ccedilla ; B 95 -205 746 728 ; -C 200 ; WX 667 ; N Egrave ; B 41 0 721 905 ; -C 201 ; WX 667 ; N Eacute ; B 41 0 721 904 ; -C 202 ; WX 667 ; N Ecircumflex ; B 41 0 721 905 ; -C 203 ; WX 667 ; N Edieresis ; B 41 0 721 876 ; -C 204 ; WX 278 ; N Igrave ; B 35 0 383 905 ; -C 205 ; WX 278 ; N Iacute ; B 35 0 451 904 ; -C 206 ; WX 278 ; N Icircumflex ; B 35 0 426 905 ; -C 207 ; WX 278 ; N Idieresis ; B 35 0 453 876 ; -C 208 ; WX 722 ; N Eth ; B 37 0 725 716 ; -C 209 ; WX 722 ; N Ntilde ; B 45 0 763 874 ; -C 210 ; WX 778 ; N Ograve ; B 87 -13 784 905 ; -C 211 ; WX 778 ; N Oacute ; B 87 -13 784 904 ; -C 212 ; WX 778 ; N Ocircumflex ; B 87 -13 784 905 ; -C 213 ; WX 778 ; N Otilde ; B 87 -13 784 874 ; -C 214 ; WX 778 ; N Odieresis ; B 87 -13 784 876 ; -C 215 ; WX 584 ; N multiply ; B 53 115 530 591 ; -C 216 ; WX 778 ; N Oslash ; B 78 -60 787 767 ; -C 217 ; WX 722 ; N Ugrave ; B 91 -12 765 905 ; -C 218 ; WX 722 ; N Uacute ; B 91 -12 765 904 ; -C 219 ; WX 722 ; N Ucircumflex ; B 91 -12 765 905 ; -C 220 ; WX 722 ; N Udieresis ; B 91 -12 765 876 ; -C 221 ; WX 667 ; N Yacute ; B 115 0 785 904 ; -C 222 ; WX 667 ; N Thorn ; B 41 0 673 716 ; -C 223 ; WX 611 ; N germandbls ; B 35 -12 582 728 ; -C 224 ; WX 556 ; N agrave ; B 45 -12 533 732 ; -C 225 ; WX 556 ; N aacute ; B 45 -12 567 730 ; -C 226 ; WX 556 ; N acircumflex ; B 45 -12 533 731 ; -C 227 ; WX 556 ; N atilde ; B 45 -12 550 710 ; -C 228 ; WX 556 ; N adieresis ; B 45 -12 554 717 ; -C 229 ; WX 556 ; N aring ; B 45 -12 533 754 ; -C 230 ; WX 889 ; N ae ; B 31 -12 866 531 ; -C 231 ; WX 556 ; N ccedilla ; B 60 -204 564 531 ; -C 232 ; WX 556 ; N egrave ; B 58 -12 555 732 ; -C 233 ; WX 556 ; N eacute ; B 58 -12 562 730 ; -C 234 ; WX 556 ; N ecircumflex ; B 58 -12 555 731 ; -C 235 ; WX 556 ; N edieresis ; B 58 -12 555 717 ; -C 236 ; WX 278 ; N igrave ; B 40 0 347 732 ; -C 237 ; WX 278 ; N iacute ; B 40 0 413 730 ; -C 238 ; WX 278 ; N icircumflex ; B 40 0 390 731 ; -C 239 ; WX 278 ; N idieresis ; B 40 0 417 717 ; -C 240 ; WX 611 ; N eth ; B 61 -13 608 716 ; -C 241 ; WX 611 ; N ntilde ; B 42 0 591 710 ; -C 242 ; WX 611 ; N ograve ; B 61 -12 599 732 ; -C 243 ; WX 611 ; N oacute ; B 61 -12 599 730 ; -C 244 ; WX 611 ; N ocircumflex ; B 61 -12 599 731 ; -C 245 ; WX 611 ; N otilde ; B 61 -12 599 710 ; -C 246 ; WX 611 ; N odieresis ; B 61 -12 599 717 ; -C 247 ; WX 549 ; N divide ; B 24 90 524 616 ; -C 248 ; WX 611 ; N oslash ; B 53 -52 604 571 ; -C 249 ; WX 611 ; N ugrave ; B 70 -12 619 732 ; -C 250 ; WX 611 ; N uacute ; B 70 -12 619 730 ; -C 251 ; WX 611 ; N ucircumflex ; B 70 -12 619 731 ; -C 252 ; WX 611 ; N udieresis ; B 70 -12 619 717 ; -C 253 ; WX 556 ; N yacute ; B 6 -210 621 730 ; -C 254 ; WX 611 ; N thorn ; B -9 -198 603 716 ; -C 255 ; WX 556 ; N ydieresis ; B 6 -210 621 717 ; -C -1 ; WX 0 ; N .null ; B 62 0 353 716 ; -C -1 ; WX 278 ; N nonmarkingreturn ; B 62 0 353 716 ; -C -1 ; WX 549 ; N notequal ; B 24 -12 524 719 ; -C -1 ; WX 713 ; N infinity ; B 74 182 640 523 ; -C -1 ; WX 549 ; N lessequal ; B 29 0 520 708 ; -C -1 ; WX 549 ; N greaterequal ; B 29 0 520 708 ; -C -1 ; WX 494 ; N partialdiff ; B 20 -12 475 728 ; -C -1 ; WX 713 ; N summation ; B 60 -210 677 728 ; -C -1 ; WX 823 ; N product ; B 79 -210 744 728 ; -C -1 ; WX 549 ; N pi1 ; B 0 0 588 519 ; -C -1 ; WX 274 ; N integral ; B 0 -107 273 910 ; -C -1 ; WX 768 ; N Ohm ; B 27 0 747 734 ; -C -1 ; WX 549 ; N radical ; B 42 -38 550 913 ; -C -1 ; WX 549 ; N approxequal ; B 15 135 534 569 ; -C -1 ; WX 612 ; N increment ; B 14 0 600 677 ; -C -1 ; WX 494 ; N lozenge ; B 23 0 472 694 ; -C -1 ; WX 167 ; N fraction ; B -249 -30 492 725 ; -C -1 ; WX 611 ; N fi ; B 58 0 662 728 ; -C -1 ; WX 611 ; N fl ; B 57 0 661 728 ; -C -1 ; WX 278 ; N dotlessi ; B 40 0 289 519 ; -C -1 ; WX 333 ; N macron ; B 85 603 417 697 ; -C -1 ; WX 333 ; N breve ; B 84 585 391 727 ; -C -1 ; WX 333 ; N dotaccent ; B 163 599 330 728 ; -C -1 ; WX 333 ; N ring ; B 150 565 339 754 ; -C -1 ; WX 333 ; N hungarumlaut ; B 33 583 466 728 ; -C -1 ; WX 333 ; N ogonek ; B 62 -208 271 9 ; -C -1 ; WX 333 ; N caron ; B 109 584 445 731 ; -C -1 ; WX 611 ; N Lslash ; B 15 0 585 716 ; -C -1 ; WX 278 ; N lslash ; B 30 0 331 716 ; -C -1 ; WX 584 ; N minus ; B 42 289 542 417 ; -C -1 ; WX 556 ; N franc ; B -8 0 631 716 ; -C -1 ; WX 778 ; N Gbreve ; B 88 -12 786 888 ; -C -1 ; WX 611 ; N gbreve ; B 31 -210 623 727 ; -C -1 ; WX 278 ; N Idot ; B 35 0 364 884 ; -C -1 ; WX 667 ; N Scedilla ; B 62 -208 676 728 ; -C -1 ; WX 556 ; N scedilla ; B 22 -204 552 531 ; -C -1 ; WX 722 ; N Cacute ; B 95 -13 746 904 ; -C -1 ; WX 556 ; N cacute ; B 60 -12 564 730 ; -C -1 ; WX 722 ; N Ccaron ; B 95 -13 746 902 ; -C -1 ; WX 556 ; N ccaron ; B 60 -12 579 731 ; -C -1 ; WX 611 ; N dmacron ; B 59 -12 728 716 ; -C -1 ; WX 333 ; N middot ; B 258 290 424 426 ; -C -1 ; WX 722 ; N Abreve ; B -11 0 673 888 ; -C -1 ; WX 556 ; N abreve ; B 45 -12 542 727 ; -C -1 ; WX 722 ; N Aogonek ; B -11 -208 714 716 ; -C -1 ; WX 556 ; N aogonek ; B 45 -208 537 531 ; -C -1 ; WX 722 ; N Dcaron ; B 43 0 725 905 ; -C -1 ; WX 740 ; N dcaron ; B 59 -12 855 716 ; -C -1 ; WX 722 ; N Dslash ; B 37 0 725 716 ; -C -1 ; WX 667 ; N Eogonek ; B 41 -208 721 716 ; -C -1 ; WX 556 ; N eogonek ; B 58 -208 555 531 ; -C -1 ; WX 667 ; N Ecaron ; B 41 0 721 905 ; -C -1 ; WX 556 ; N ecaron ; B 58 -12 555 731 ; -C -1 ; WX 611 ; N Lacute ; B 45 0 582 904 ; -C -1 ; WX 278 ; N lacute ; B 39 0 423 899 ; -C -1 ; WX 611 ; N Lcaron ; B 45 0 612 716 ; -C -1 ; WX 396 ; N lcaron ; B 38 0 513 716 ; -C -1 ; WX 611 ; N Ldot ; B 45 0 582 716 ; -C -1 ; WX 479 ; N ldot ; B 39 0 461 716 ; -C -1 ; WX 722 ; N Nacute ; B 45 0 763 904 ; -C -1 ; WX 611 ; N nacute ; B 42 0 591 730 ; -C -1 ; WX 722 ; N Ncaron ; B 45 0 763 905 ; -C -1 ; WX 611 ; N ncaron ; B 42 0 595 731 ; -C -1 ; WX 778 ; N Odblacute ; B 87 -13 784 901 ; -C -1 ; WX 611 ; N odblacute ; B 61 -12 623 728 ; -C -1 ; WX 722 ; N Racute ; B 44 0 741 904 ; -C -1 ; WX 389 ; N racute ; B 32 0 492 730 ; -C -1 ; WX 722 ; N Rcaron ; B 44 0 741 905 ; -C -1 ; WX 389 ; N rcaron ; B 32 0 520 731 ; -C -1 ; WX 667 ; N Sacute ; B 62 -12 676 904 ; -C -1 ; WX 556 ; N sacute ; B 22 -12 552 730 ; -C -1 ; WX 611 ; N Tcedilla ; B 120 -298 709 716 ; -C -1 ; WX 333 ; N tcedilla ; B 66 -274 391 698 ; -C -1 ; WX 611 ; N Tcaron ; B 120 0 709 905 ; -C -1 ; WX 479 ; N tcaron ; B 77 -12 595 716 ; -C -1 ; WX 722 ; N Uring ; B 91 -12 765 905 ; -C -1 ; WX 611 ; N uring ; B 70 -12 619 754 ; -C -1 ; WX 722 ; N Udblacute ; B 91 -12 765 901 ; -C -1 ; WX 611 ; N udblacute ; B 70 -12 652 728 ; -C -1 ; WX 611 ; N Zacute ; B 25 0 668 904 ; -C -1 ; WX 500 ; N zacute ; B 17 0 519 730 ; -C -1 ; WX 611 ; N Zdot ; B 25 0 668 884 ; -C -1 ; WX 500 ; N zdot ; B 17 0 519 728 ; -C -1 ; WX 610 ; N Gamma ; B 43 0 705 716 ; -C -1 ; WX 778 ; N Theta ; B 87 -12 784 728 ; -C -1 ; WX 822 ; N Phi ; B 88 -29 833 733 ; -C -1 ; WX 620 ; N alpha ; B 61 -12 662 531 ; -C -1 ; WX 610 ; N delta ; B 62 -12 656 716 ; -C -1 ; WX 479 ; N epsilon ; B 43 -12 513 531 ; -C -1 ; WX 664 ; N sigma ; B 61 -12 717 531 ; -C -1 ; WX 409 ; N tau ; B 79 0 466 519 ; -C -1 ; WX 704 ; N phi ; B 61 -198 693 531 ; -C -1 ; WX 552 ; N underscoredbl ; B -9 -376 561 -109 ; -C -1 ; WX 604 ; N exclamdbl ; B 62 0 624 716 ; -C -1 ; WX 396 ; N nsuperior ; B 59 250 430 583 ; -C -1 ; WX 1104 ; N peseta ; B 10 -13 1088 716 ; -C -1 ; WX 1000 ; N arrowleft ; B 39 77 961 428 ; -C -1 ; WX 500 ; N arrowup ; B 75 -209 426 654 ; -C -1 ; WX 1000 ; N arrowright ; B 39 77 961 428 ; -C -1 ; WX 500 ; N arrowdown ; B 75 -209 426 654 ; -C -1 ; WX 1000 ; N arrowboth ; B 39 77 961 429 ; -C -1 ; WX 500 ; N arrowupdn ; B 74 -208 425 714 ; -C -1 ; WX 500 ; N arrowupdnbse ; B 74 -303 425 714 ; -C -1 ; WX 979 ; N orthogonal ; B 177 0 802 625 ; -C -1 ; WX 722 ; N intersection ; B 70 0 648 719 ; -C -1 ; WX 583 ; N equivalence ; B 42 73 542 633 ; -C -1 ; WX 604 ; N house ; B 77 0 527 563 ; -C -1 ; WX 584 ; N revlogicalnot ; B 42 184 542 524 ; -C -1 ; WX 604 ; N integraltp ; B 267 -251 477 848 ; -C -1 ; WX 604 ; N integralbt ; B 127 -251 337 848 ; -C -1 ; WX 708 ; N SF100000 ; B -11 261 719 346 ; -C -1 ; WX 625 ; N SF110000 ; B 223 -303 309 910 ; -C -1 ; WX 708 ; N SF010000 ; B 312 -303 720 346 ; -C -1 ; WX 708 ; N SF030000 ; B -11 -303 396 346 ; -C -1 ; WX 708 ; N SF020000 ; B 312 261 720 910 ; -C -1 ; WX 708 ; N SF040000 ; B -11 261 396 910 ; -C -1 ; WX 708 ; N SF080000 ; B 312 -303 720 910 ; -C -1 ; WX 708 ; N SF090000 ; B -11 -303 396 910 ; -C -1 ; WX 708 ; N SF060000 ; B -11 -303 719 346 ; -C -1 ; WX 708 ; N SF070000 ; B -11 261 719 910 ; -C -1 ; WX 708 ; N SF050000 ; B -11 -303 719 910 ; -C -1 ; WX 708 ; N SF430000 ; B -11 168 719 439 ; -C -1 ; WX 708 ; N SF240000 ; B 219 -303 490 910 ; -C -1 ; WX 708 ; N SF510000 ; B 312 -303 720 439 ; -C -1 ; WX 708 ; N SF520000 ; B 219 -303 720 346 ; -C -1 ; WX 708 ; N SF390000 ; B 219 -303 719 439 ; -C -1 ; WX 708 ; N SF220000 ; B -11 -303 396 439 ; -C -1 ; WX 708 ; N SF210000 ; B -11 -303 489 346 ; -C -1 ; WX 708 ; N SF250000 ; B -11 -303 489 439 ; -C -1 ; WX 708 ; N SF500000 ; B 312 168 720 910 ; -C -1 ; WX 708 ; N SF490000 ; B 219 261 720 910 ; -C -1 ; WX 708 ; N SF380000 ; B 219 168 719 910 ; -C -1 ; WX 708 ; N SF280000 ; B -11 168 396 910 ; -C -1 ; WX 708 ; N SF270000 ; B -11 261 489 910 ; -C -1 ; WX 708 ; N SF260000 ; B -11 168 489 910 ; -C -1 ; WX 708 ; N SF360000 ; B 312 -303 720 910 ; -C -1 ; WX 708 ; N SF370000 ; B 219 -303 720 910 ; -C -1 ; WX 708 ; N SF420000 ; B 219 -303 720 910 ; -C -1 ; WX 708 ; N SF190000 ; B -11 -303 396 910 ; -C -1 ; WX 708 ; N SF200000 ; B -11 -303 489 910 ; -C -1 ; WX 708 ; N SF230000 ; B -11 -303 489 910 ; -C -1 ; WX 708 ; N SF470000 ; B -11 -303 719 439 ; -C -1 ; WX 708 ; N SF480000 ; B -11 -303 719 346 ; -C -1 ; WX 708 ; N SF410000 ; B -11 -303 719 439 ; -C -1 ; WX 708 ; N SF450000 ; B -11 168 719 910 ; -C -1 ; WX 708 ; N SF460000 ; B -11 261 719 910 ; -C -1 ; WX 708 ; N SF400000 ; B -11 168 719 910 ; -C -1 ; WX 708 ; N SF540000 ; B -11 -303 719 910 ; -C -1 ; WX 708 ; N SF530000 ; B -11 -303 719 910 ; -C -1 ; WX 708 ; N SF440000 ; B -11 -303 719 910 ; -C -1 ; WX 708 ; N upblock ; B -11 303 719 910 ; -C -1 ; WX 708 ; N dnblock ; B -11 -303 719 303 ; -C -1 ; WX 708 ; N block ; B -11 -303 719 910 ; -C -1 ; WX 708 ; N lfblock ; B -11 -303 354 910 ; -C -1 ; WX 708 ; N rtblock ; B 354 -303 720 910 ; -C -1 ; WX 708 ; N ltshade ; B 50 -246 719 910 ; -C -1 ; WX 708 ; N shade ; B -11 -246 719 910 ; -C -1 ; WX 729 ; N dkshade ; B 0 -307 729 910 ; -C -1 ; WX 604 ; N filledbox ; B 71 0 532 461 ; -C -1 ; WX 1000 ; N filledrect ; B 0 155 1000 343 ; -C -1 ; WX 990 ; N triagup ; B 148 0 842 693 ; -C -1 ; WX 990 ; N triagrt ; B 141 -15 849 692 ; -C -1 ; WX 990 ; N triagdn ; B 148 -15 842 678 ; -C -1 ; WX 990 ; N triaglf ; B 141 -15 849 692 ; -C -1 ; WX 604 ; N circle ; B 87 67 517 497 ; -C -1 ; WX 604 ; N invbullet ; B 63 0 541 479 ; -C -1 ; WX 604 ; N invcircle ; B 21 0 584 564 ; -C -1 ; WX 1021 ; N smileface ; B 199 -58 822 564 ; -C -1 ; WX 1052 ; N invsmileface ; B 215 -58 837 564 ; -C -1 ; WX 917 ; N sun ; B 8 -109 909 792 ; -C -1 ; WX 750 ; N female ; B 119 -214 630 736 ; -C -1 ; WX 750 ; N male ; B 54 -128 691 791 ; -C -1 ; WX 531 ; N spade ; B 28 0 503 601 ; -C -1 ; WX 656 ; N club ; B 27 0 629 601 ; -C -1 ; WX 594 ; N heart ; B 31 -12 563 601 ; -C -1 ; WX 510 ; N diamond ; B 31 -12 479 601 ; -C -1 ; WX 500 ; N musicalnote ; B 18 -18 482 666 ; -C -1 ; WX 750 ; N musicalnotedbl ; B 42 -63 649 742 ; -C -1 ; WX 782 ; N IJ ; B 35 -12 830 716 ; -C -1 ; WX 556 ; N ij ; B 46 -210 604 716 ; -C -1 ; WX 708 ; N napostrophe ; B 41 0 685 716 ; -C -1 ; WX 240 ; N minute ; B 151 461 329 716 ; -C -1 ; WX 479 ; N second ; B 151 461 507 716 ; -C -1 ; WX 885 ; N afii61248 ; B 69 -31 895 728 ; -C -1 ; WX 516 ; N afii61289 ; B 47 -12 542 728 ; -C -1 ; WX 604 ; N H22073 ; B 71 0 532 461 ; -C -1 ; WX 354 ; N H18543 ; B 45 198 310 463 ; -C -1 ; WX 354 ; N H18551 ; B 45 198 310 463 ; -C -1 ; WX 604 ; N H18533 ; B 87 67 517 497 ; -C -1 ; WX 354 ; N openbullet ; B 55 208 300 453 ; -C -1 ; WX 722 ; N Amacron ; B -11 0 673 874 ; -C -1 ; WX 556 ; N amacron ; B 45 -12 539 697 ; -C -1 ; WX 722 ; N Ccircumflex ; B 95 -13 746 927 ; -C -1 ; WX 556 ; N ccircumflex ; B 60 -12 564 731 ; -C -1 ; WX 722 ; N Cdot ; B 95 -13 746 909 ; -C -1 ; WX 556 ; N cdot ; B 60 -12 564 728 ; -C -1 ; WX 667 ; N Emacron ; B 41 0 721 874 ; -C -1 ; WX 556 ; N emacron ; B 58 -12 555 697 ; -C -1 ; WX 667 ; N Ebreve ; B 41 0 721 917 ; -C -1 ; WX 556 ; N ebreve ; B 58 -12 555 727 ; -C -1 ; WX 667 ; N Edot ; B 41 0 721 909 ; -C -1 ; WX 556 ; N edot ; B 58 -12 555 728 ; -C -1 ; WX 778 ; N Gcircumflex ; B 88 -12 786 927 ; -C -1 ; WX 611 ; N gcircumflex ; B 31 -210 623 731 ; -C -1 ; WX 778 ; N Gdot ; B 88 -12 786 909 ; -C -1 ; WX 611 ; N gdot ; B 31 -210 623 728 ; -C -1 ; WX 778 ; N Gcedilla ; B 88 -208 786 728 ; -C -1 ; WX 611 ; N gcedilla ; B 31 -210 623 801 ; -C -1 ; WX 722 ; N Hcircumflex ; B 43 0 765 927 ; -C -1 ; WX 611 ; N hcircumflex ; B 42 0 601 905 ; -C -1 ; WX 722 ; N Hbar ; B 43 0 818 716 ; -C -1 ; WX 611 ; N hbar ; B 42 0 591 716 ; -C -1 ; WX 278 ; N Itilde ; B 35 0 447 898 ; -C -1 ; WX 278 ; N itilde ; B 40 0 409 710 ; -C -1 ; WX 278 ; N Imacron ; B 35 0 443 874 ; -C -1 ; WX 278 ; N imacron ; B 40 0 405 697 ; -C -1 ; WX 278 ; N Ibreve ; B 35 0 451 917 ; -C -1 ; WX 278 ; N ibreve ; B 40 0 409 727 ; -C -1 ; WX 278 ; N Iogonek ; B 7 -208 332 716 ; -C -1 ; WX 278 ; N iogonek ; B 13 -208 330 716 ; -C -1 ; WX 556 ; N Jcircumflex ; B 29 -12 687 927 ; -C -1 ; WX 278 ; N jcircumflex ; B -109 -210 386 731 ; -C -1 ; WX 722 ; N Kcedilla ; B 40 -208 801 716 ; -C -1 ; WX 556 ; N kcedilla ; B 38 -208 614 716 ; -C -1 ; WX 556 ; N kgreenlandic ; B 40 0 617 519 ; -C -1 ; WX 611 ; N Lcedilla ; B 45 -208 582 716 ; -C -1 ; WX 278 ; N lcedilla ; B -57 -208 329 716 ; -C -1 ; WX 722 ; N Ncedilla ; B 45 -208 763 716 ; -C -1 ; WX 611 ; N ncedilla ; B 42 -208 591 531 ; -C -1 ; WX 723 ; N Eng ; B 48 -13 735 728 ; -C -1 ; WX 611 ; N eng ; B 40 -210 589 531 ; -C -1 ; WX 778 ; N Omacron ; B 87 -13 784 874 ; -C -1 ; WX 611 ; N omacron ; B 61 -12 599 697 ; -C -1 ; WX 778 ; N Obreve ; B 87 -13 784 917 ; -C -1 ; WX 611 ; N obreve ; B 61 -12 599 727 ; -C -1 ; WX 722 ; N Rcedilla ; B 44 -208 741 716 ; -C -1 ; WX 389 ; N rcedilla ; B -20 -208 474 531 ; -C -1 ; WX 667 ; N Scircumflex ; B 62 -12 676 927 ; -C -1 ; WX 556 ; N scircumflex ; B 22 -12 552 731 ; -C -1 ; WX 611 ; N Tbar ; B 100 0 709 716 ; -C -1 ; WX 333 ; N tbar ; B 21 -12 391 698 ; -C -1 ; WX 722 ; N Utilde ; B 91 -12 765 898 ; -C -1 ; WX 611 ; N utilde ; B 70 -12 619 710 ; -C -1 ; WX 722 ; N Umacron ; B 91 -12 765 874 ; -C -1 ; WX 611 ; N umacron ; B 70 -12 619 697 ; -C -1 ; WX 722 ; N Ubreve ; B 91 -12 765 917 ; -C -1 ; WX 611 ; N ubreve ; B 70 -12 619 727 ; -C -1 ; WX 722 ; N Uogonek ; B 91 -208 765 716 ; -C -1 ; WX 611 ; N uogonek ; B 70 -208 619 519 ; -C -1 ; WX 944 ; N Wcircumflex ; B 117 0 1068 927 ; -C -1 ; WX 778 ; N wcircumflex ; B 72 0 840 731 ; -C -1 ; WX 667 ; N Ycircumflex ; B 115 0 785 927 ; -C -1 ; WX 556 ; N ycircumflex ; B 6 -210 621 731 ; -C -1 ; WX 278 ; N longs ; B 39 0 456 728 ; -C -1 ; WX 722 ; N Aringacute ; B -11 -9 673 1000 ; -C -1 ; WX 556 ; N aringacute ; B 45 -12 588 927 ; -C -1 ; WX 1000 ; N AEacute ; B -32 0 1059 927 ; -C -1 ; WX 889 ; N aeacute ; B 31 -12 866 730 ; -C -1 ; WX 778 ; N Oslashacute ; B 78 -60 787 927 ; -C -1 ; WX 611 ; N oslashacute ; B 53 -52 604 730 ; -C -1 ; WX 333 ; N anoteleia ; B 150 383 317 519 ; -C -1 ; WX 944 ; N Wgrave ; B 117 0 1068 926 ; -C -1 ; WX 778 ; N wgrave ; B 72 0 840 732 ; -C -1 ; WX 944 ; N Wacute ; B 117 0 1068 927 ; -C -1 ; WX 778 ; N wacute ; B 72 0 840 730 ; -C -1 ; WX 944 ; N Wdieresis ; B 117 0 1068 900 ; -C -1 ; WX 778 ; N wdieresis ; B 72 0 840 717 ; -C -1 ; WX 667 ; N Ygrave ; B 115 0 785 926 ; -C -1 ; WX 556 ; N ygrave ; B 6 -210 621 732 ; -C -1 ; WX 278 ; N quotereversed ; B 150 425 325 716 ; -C -1 ; WX 333 ; N radicalex ; B 74 603 465 697 ; -C -1 ; WX 556 ; N afii08941 ; B 21 -18 610 728 ; -C -1 ; WX 600 ; N estimated ; B 44 -17 561 535 ; -C -1 ; WX 834 ; N oneeighth ; B 85 -30 833 725 ; -C -1 ; WX 834 ; N threeeighths ; B 77 -30 833 725 ; -C -1 ; WX 834 ; N fiveeighths ; B 83 -30 833 725 ; -C -1 ; WX 834 ; N seveneighths ; B 56 -30 833 725 ; -C -1 ; WX 333 ; N commaaccent ; B 14 -274 205 -53 ; -C -1 ; WX 333 ; N undercommaaccent ; B -30 -208 230 -12 ; -C -1 ; WX 333 ; N tonos ; B 184 584 435 730 ; -C -1 ; WX 333 ; N dieresistonos ; B -10 584 519 730 ; -C -1 ; WX 722 ; N Alphatonos ; B -9 0 675 716 ; -C -1 ; WX 854 ; N Epsilontonos ; B 56 0 909 716 ; -C -1 ; WX 906 ; N Etatonos ; B 56 0 950 716 ; -C -1 ; WX 473 ; N Iotatonos ; B 56 0 525 716 ; -C -1 ; WX 844 ; N Omicrontonos ; B 50 -12 849 728 ; -C -1 ; WX 930 ; N Upsilontonos ; B 64 0 1048 716 ; -C -1 ; WX 847 ; N Omegatonos ; B 50 0 846 728 ; -C -1 ; WX 278 ; N iotadieresistonos ; B -16 0 513 730 ; -C -1 ; WX 722 ; N Alpha ; B -11 0 673 716 ; -C -1 ; WX 722 ; N Beta ; B 40 0 710 716 ; -C -1 ; WX 671 ; N Delta ; B -39 0 646 716 ; -C -1 ; WX 667 ; N Epsilon ; B 41 0 721 716 ; -C -1 ; WX 611 ; N Zeta ; B 25 0 668 716 ; -C -1 ; WX 722 ; N Eta ; B 43 0 765 716 ; -C -1 ; WX 278 ; N Iota ; B 35 0 332 716 ; -C -1 ; WX 722 ; N Kappa ; B 40 0 801 716 ; -C -1 ; WX 667 ; N Lambda ; B -39 0 642 716 ; -C -1 ; WX 833 ; N Mu ; B 41 0 878 716 ; -C -1 ; WX 722 ; N Nu ; B 45 0 763 716 ; -C -1 ; WX 657 ; N Xi ; B 11 0 712 716 ; -C -1 ; WX 778 ; N Omicron ; B 87 -13 784 728 ; -C -1 ; WX 718 ; N Pi ; B 44 0 766 716 ; -C -1 ; WX 667 ; N Rho ; B 41 0 702 716 ; -C -1 ; WX 590 ; N Sigma ; B 19 0 679 716 ; -C -1 ; WX 611 ; N Tau ; B 120 0 709 716 ; -C -1 ; WX 667 ; N Upsilon ; B 115 0 785 716 ; -C -1 ; WX 667 ; N Chi ; B -30 0 784 716 ; -C -1 ; WX 829 ; N Psi ; B 113 0 884 716 ; -C -1 ; WX 781 ; N Omega ; B 9 0 779 728 ; -C -1 ; WX 278 ; N Iotadieresis ; B 35 0 442 876 ; -C -1 ; WX 667 ; N Upsilondieresis ; B 115 0 785 876 ; -C -1 ; WX 620 ; N alphatonos ; B 61 -12 662 730 ; -C -1 ; WX 479 ; N epsilontonos ; B 43 -12 513 730 ; -C -1 ; WX 611 ; N etatonos ; B 41 -198 590 730 ; -C -1 ; WX 278 ; N iotatonos ; B 40 0 405 730 ; -C -1 ; WX 591 ; N upsilondieresistonos ; B 74 -12 653 730 ; -C -1 ; WX 621 ; N beta ; B -6 -198 614 728 ; -C -1 ; WX 556 ; N gamma ; B 77 -198 621 519 ; -C -1 ; WX 492 ; N zeta ; B 52 -210 604 716 ; -C -1 ; WX 611 ; N eta ; B 41 -198 590 531 ; -C -1 ; WX 558 ; N theta ; B 73 -12 580 728 ; -C -1 ; WX 278 ; N iota ; B 40 0 289 519 ; -C -1 ; WX 566 ; N kappa ; B 41 0 622 519 ; -C -1 ; WX 556 ; N lambda ; B -13 0 531 716 ; -C -1 ; WX 603 ; N mu ; B -4 -198 617 519 ; -C -1 ; WX 556 ; N nu ; B 75 0 618 519 ; -C -1 ; WX 450 ; N xi ; B 55 -210 519 728 ; -C -1 ; WX 611 ; N omicron ; B 61 -12 599 531 ; -C -1 ; WX 605 ; N rho ; B -14 -198 596 531 ; -C -1 ; WX 532 ; N sigma1 ; B 62 -210 589 531 ; -C -1 ; WX 591 ; N upsilon ; B 74 -12 612 519 ; -C -1 ; WX 578 ; N chi ; B -80 -198 644 519 ; -C -1 ; WX 773 ; N psi ; B 75 -198 793 519 ; -C -1 ; WX 834 ; N omega ; B 64 -12 826 519 ; -C -1 ; WX 278 ; N iotadieresis ; B 40 0 410 717 ; -C -1 ; WX 591 ; N upsilondieresis ; B 74 -12 612 717 ; -C -1 ; WX 611 ; N omicrontonos ; B 61 -12 599 730 ; -C -1 ; WX 591 ; N upsilontonos ; B 74 -12 612 730 ; -C -1 ; WX 834 ; N omegatonos ; B 64 -12 826 730 ; -C -1 ; WX 667 ; N afii10023 ; B 41 0 721 876 ; -C -1 ; WX 886 ; N afii10051 ; B 129 -6 874 716 ; -C -1 ; WX 719 ; N afii10053 ; B 87 -12 739 728 ; -C -1 ; WX 667 ; N afii10054 ; B 62 -12 676 728 ; -C -1 ; WX 278 ; N afii10055 ; B 35 0 332 716 ; -C -1 ; WX 278 ; N afii10056 ; B 35 0 442 876 ; -C -1 ; WX 556 ; N afii10057 ; B 29 -12 600 716 ; -C -1 ; WX 1094 ; N afii10058 ; B -21 -12 1074 716 ; -C -1 ; WX 1042 ; N afii10059 ; B 43 0 1021 716 ; -C -1 ; WX 854 ; N afii10060 ; B 120 0 833 716 ; -C -1 ; WX 677 ; N afii10062 ; B 76 -11 794 899 ; -C -1 ; WX 722 ; N afii10017 ; B -11 0 673 716 ; -C -1 ; WX 708 ; N afii10018 ; B 45 0 709 716 ; -C -1 ; WX 722 ; N afii10019 ; B 40 0 710 716 ; -C -1 ; WX 614 ; N afii10020 ; B 44 0 723 716 ; -C -1 ; WX 722 ; N afii10021 ; B -75 -198 756 716 ; -C -1 ; WX 667 ; N afii10022 ; B 41 0 721 716 ; -C -1 ; WX 927 ; N afii10024 ; B -15 0 1016 720 ; -C -1 ; WX 643 ; N afii10025 ; B 37 -12 649 728 ; -C -1 ; WX 719 ; N afii10026 ; B 43 0 765 716 ; -C -1 ; WX 719 ; N afii10027 ; B 43 0 765 899 ; -C -1 ; WX 615 ; N afii10028 ; B 43 0 701 716 ; -C -1 ; WX 687 ; N afii10029 ; B -19 -11 731 716 ; -C -1 ; WX 833 ; N afii10030 ; B 41 0 878 716 ; -C -1 ; WX 722 ; N afii10031 ; B 43 0 765 716 ; -C -1 ; WX 778 ; N afii10032 ; B 87 -13 784 728 ; -C -1 ; WX 719 ; N afii10033 ; B 43 0 764 716 ; -C -1 ; WX 667 ; N afii10034 ; B 41 0 702 716 ; -C -1 ; WX 722 ; N afii10035 ; B 95 -13 746 728 ; -C -1 ; WX 611 ; N afii10036 ; B 120 0 709 716 ; -C -1 ; WX 677 ; N afii10037 ; B 76 -11 794 716 ; -C -1 ; WX 781 ; N afii10038 ; B 84 -6 790 716 ; -C -1 ; WX 667 ; N afii10039 ; B -30 0 784 716 ; -C -1 ; WX 729 ; N afii10040 ; B 40 -198 762 716 ; -C -1 ; WX 708 ; N afii10041 ; B 129 0 752 716 ; -C -1 ; WX 979 ; N afii10042 ; B 43 0 1021 716 ; -C -1 ; WX 989 ; N afii10043 ; B 43 -198 1021 716 ; -C -1 ; WX 854 ; N afii10044 ; B 105 0 833 716 ; -C -1 ; WX 1000 ; N afii10045 ; B 40 0 1036 716 ; -C -1 ; WX 708 ; N afii10046 ; B 40 0 682 716 ; -C -1 ; WX 719 ; N afii10047 ; B 73 -12 725 728 ; -C -1 ; WX 1042 ; N afii10048 ; B 43 -12 1045 728 ; -C -1 ; WX 729 ; N afii10049 ; B -21 0 774 716 ; -C -1 ; WX 556 ; N afii10065 ; B 45 -12 533 531 ; -C -1 ; WX 619 ; N afii10066 ; B 64 -12 655 748 ; -C -1 ; WX 604 ; N afii10067 ; B 63 -12 567 530 ; -C -1 ; WX 534 ; N afii10068 ; B 32 -12 515 530 ; -C -1 ; WX 618 ; N afii10069 ; B 60 -12 625 748 ; -C -1 ; WX 556 ; N afii10070 ; B 58 -12 555 531 ; -C -1 ; WX 736 ; N afii10072 ; B -25 0 788 519 ; -C -1 ; WX 510 ; N afii10073 ; B 14 -12 489 530 ; -C -1 ; WX 611 ; N afii10074 ; B 70 -12 619 519 ; -C -1 ; WX 611 ; N afii10075 ; B 70 -12 619 727 ; -C -1 ; WX 507 ; N afii10076 ; B 37 0 567 519 ; -C -1 ; WX 622 ; N afii10077 ; B -24 -12 633 519 ; -C -1 ; WX 740 ; N afii10078 ; B 39 0 748 519 ; -C -1 ; WX 604 ; N afii10079 ; B 35 0 616 519 ; -C -1 ; WX 611 ; N afii10080 ; B 61 -12 599 531 ; -C -1 ; WX 611 ; N afii10081 ; B 39 0 619 519 ; -C -1 ; WX 611 ; N afii10082 ; B -5 -198 605 531 ; -C -1 ; WX 556 ; N afii10083 ; B 60 -12 564 531 ; -C -1 ; WX 889 ; N afii10084 ; B 36 0 869 531 ; -C -1 ; WX 556 ; N afii10085 ; B 6 -210 621 519 ; -C -1 ; WX 885 ; N afii10086 ; B 63 -203 876 728 ; -C -1 ; WX 556 ; N afii10087 ; B -22 0 612 519 ; -C -1 ; WX 646 ; N afii10088 ; B 66 -161 624 519 ; -C -1 ; WX 583 ; N afii10089 ; B 99 0 594 519 ; -C -1 ; WX 889 ; N afii10090 ; B 70 -12 901 519 ; -C -1 ; WX 935 ; N afii10091 ; B 70 -159 912 519 ; -C -1 ; WX 707 ; N afii10092 ; B 68 0 678 519 ; -C -1 ; WX 854 ; N afii10093 ; B 40 0 868 519 ; -C -1 ; WX 594 ; N afii10094 ; B 35 0 570 519 ; -C -1 ; WX 552 ; N afii10095 ; B 37 -12 540 530 ; -C -1 ; WX 865 ; N afii10096 ; B 40 -12 850 530 ; -C -1 ; WX 589 ; N afii10097 ; B -20 0 599 519 ; -C -1 ; WX 556 ; N afii10071 ; B 58 -12 555 717 ; -C -1 ; WX 611 ; N afii10099 ; B 42 -210 591 716 ; -C -1 ; WX 469 ; N afii10100 ; B 35 0 552 730 ; -C -1 ; WX 563 ; N afii10101 ; B 64 -12 568 530 ; -C -1 ; WX 556 ; N afii10102 ; B 22 -12 552 531 ; -C -1 ; WX 278 ; N afii10103 ; B 40 0 330 716 ; -C -1 ; WX 278 ; N afii10104 ; B 40 0 410 717 ; -C -1 ; WX 278 ; N afii10105 ; B -109 -210 331 716 ; -C -1 ; WX 969 ; N afii10106 ; B -24 -12 942 519 ; -C -1 ; WX 906 ; N afii10107 ; B 40 0 880 519 ; -C -1 ; WX 611 ; N afii10108 ; B 42 0 591 716 ; -C -1 ; WX 556 ; N afii10110 ; B 6 -210 621 727 ; -C -1 ; WX 611 ; N afii10193 ; B 70 -199 619 519 ; -C -1 ; WX 575 ; N afii10050 ; B 43 0 736 914 ; -C -1 ; WX 467 ; N afii10098 ; B 27 0 581 697 ; -C -1 ; WX 1000 ; N afii00208 ; B 37 208 999 311 ; -C -1 ; WX 1146 ; N afii61352 ; B 43 0 1157 716 ; -C -1 ; WX 712 ; N pi ; B 79 0 770 519 ; -C -1 ; WX 333 ; N sheva ; B 68 -306 179 -98 ; -C -1 ; WX 333 ; N hatafsegol ; B -16 -306 290 -98 ; -C -1 ; WX 333 ; N hatafpatah ; B -9 -306 280 -98 ; -C -1 ; WX 333 ; N hatafqamats ; B -9 -306 280 -98 ; -C -1 ; WX 333 ; N hiriq ; B 95 -180 179 -98 ; -C -1 ; WX 333 ; N tsere ; B 31 -180 244 -98 ; -C -1 ; WX 333 ; N segol ; B 31 -306 243 -98 ; -C -1 ; WX 333 ; N patah ; B 36 -154 243 -103 ; -C -1 ; WX 333 ; N qamats ; B 36 -236 243 -103 ; -C -1 ; WX 333 ; N holam ; B 256 577 340 659 ; -C -1 ; WX 333 ; N qubuts ; B -23 -306 270 -98 ; -C -1 ; WX 333 ; N dagesh ; B 185 241 269 323 ; -C -1 ; WX 333 ; N meteg ; B 78 -299 170 -103 ; -C -1 ; WX 447 ; N maqaf ; B 148 408 497 518 ; -C -1 ; WX 333 ; N rafe ; B 198 611 405 662 ; -C -1 ; WX 299 ; N paseq ; B 76 -101 333 620 ; -C -1 ; WX 333 ; N shindot ; B 506 577 590 660 ; -C -1 ; WX 333 ; N sindot ; B 6 577 93 660 ; -C -1 ; WX 333 ; N sofpasuq ; B 98 0 346 519 ; -C -1 ; WX 583 ; N alef ; B 44 0 645 518 ; -C -1 ; WX 576 ; N bet ; B 38 0 579 524 ; -C -1 ; WX 457 ; N gimel ; B 5 0 449 524 ; -C -1 ; WX 550 ; N dalet ; B 109 0 636 518 ; -C -1 ; WX 614 ; N he ; B 69 0 620 524 ; -C -1 ; WX 273 ; N vav ; B 66 0 317 518 ; -C -1 ; WX 413 ; N zayin ; B 129 0 506 518 ; -C -1 ; WX 616 ; N het ; B 66 0 619 524 ; -C -1 ; WX 626 ; N tet ; B 109 -12 650 530 ; -C -1 ; WX 273 ; N yod ; B 115 229 317 518 ; -C -1 ; WX 521 ; N finalkaf ; B 114 -199 529 524 ; -C -1 ; WX 491 ; N kaf ; B 38 -8 515 526 ; -C -1 ; WX 496 ; N lamed ; B 117 0 555 716 ; -C -1 ; WX 611 ; N finalmem ; B 66 0 619 524 ; -C -1 ; WX 630 ; N mem ; B 51 0 631 524 ; -C -1 ; WX 273 ; N finalnun ; B 23 -199 317 518 ; -C -1 ; WX 386 ; N nun ; B 44 0 402 524 ; -C -1 ; WX 613 ; N samekh ; B 85 -12 637 530 ; -C -1 ; WX 543 ; N ayin ; B 5 -77 603 518 ; -C -1 ; WX 594 ; N finalpe ; B 104 -199 601 524 ; -C -1 ; WX 587 ; N pe ; B 54 -8 612 527 ; -C -1 ; WX 500 ; N finaltsadi ; B 115 -199 568 518 ; -C -1 ; WX 512 ; N tsadi ; B 35 0 573 518 ; -C -1 ; WX 573 ; N qof ; B 21 -199 632 518 ; -C -1 ; WX 521 ; N resh ; B 115 0 529 524 ; -C -1 ; WX 715 ; N shin ; B 110 -14 786 518 ; -C -1 ; WX 673 ; N tav ; B 25 -4 677 524 ; -C -1 ; WX 546 ; N doublevav ; B 23 -199 590 518 ; -C -1 ; WX 546 ; N vavyod ; B 115 -199 590 518 ; -C -1 ; WX 546 ; N doubleyod ; B 115 229 590 518 ; -C -1 ; WX 276 ; N geresh ; B 105 312 353 518 ; -C -1 ; WX 504 ; N gershayim ; B 105 312 581 518 ; -C -1 ; WX 818 ; N newsheqelsign ; B 66 0 862 518 ; -C -1 ; WX 273 ; N vavshindot ; B 66 0 317 660 ; -C -1 ; WX 521 ; N finalkafsheva ; B 114 -199 529 524 ; -C -1 ; WX 521 ; N finalkafqamats ; B 95 -199 529 524 ; -C -1 ; WX 496 ; N lamedholam ; B 16 0 555 716 ; -C -1 ; WX 496 ; N lamedholamdagesh ; B 16 0 555 716 ; -C -1 ; WX 559 ; N altayin ; B 24 0 618 518 ; -C -1 ; WX 715 ; N shinshindot ; B 110 -14 786 660 ; -C -1 ; WX 715 ; N shinsindot ; B 110 -14 786 660 ; -C -1 ; WX 715 ; N shindageshshindot ; B 110 -14 786 660 ; -C -1 ; WX 715 ; N shindageshsindot ; B 110 -14 786 660 ; -C -1 ; WX 583 ; N alefpatah ; B 44 -154 645 519 ; -C -1 ; WX 583 ; N alefqamats ; B 44 -236 645 519 ; -C -1 ; WX 583 ; N alefmapiq ; B 44 0 645 519 ; -C -1 ; WX 576 ; N betdagesh ; B 38 0 579 524 ; -C -1 ; WX 454 ; N gimeldagesh ; B 5 0 449 524 ; -C -1 ; WX 550 ; N daletdagesh ; B 109 0 636 518 ; -C -1 ; WX 614 ; N hedagesh ; B 69 0 620 524 ; -C -1 ; WX 323 ; N vavdagesh ; B 59 0 367 518 ; -C -1 ; WX 438 ; N zayindagesh ; B 55 0 522 519 ; -C -1 ; WX 626 ; N tetdagesh ; B 109 -12 650 530 ; -C -1 ; WX 323 ; N yoddagesh ; B 70 229 367 518 ; -C -1 ; WX 521 ; N finalkafdagesh ; B 114 -199 529 524 ; -C -1 ; WX 491 ; N kafdagesh ; B 38 -8 516 526 ; -C -1 ; WX 496 ; N lameddagesh ; B 117 0 555 716 ; -C -1 ; WX 630 ; N memdagesh ; B 51 0 631 524 ; -C -1 ; WX 386 ; N nundagesh ; B 44 0 402 524 ; -C -1 ; WX 613 ; N samekhdagesh ; B 85 -12 638 530 ; -C -1 ; WX 594 ; N finalpedagesh ; B 110 -199 600 524 ; -C -1 ; WX 587 ; N pedagesh ; B 54 -8 612 527 ; -C -1 ; WX 512 ; N tsadidagesh ; B 35 0 573 518 ; -C -1 ; WX 573 ; N qofdagesh ; B 21 -199 632 518 ; -C -1 ; WX 521 ; N reshdagesh ; B 115 0 530 524 ; -C -1 ; WX 715 ; N shindagesh ; B 110 -14 786 518 ; -C -1 ; WX 673 ; N tavdages ; B 25 -4 677 524 ; -C -1 ; WX 273 ; N vavholam ; B 66 0 317 660 ; -C -1 ; WX 576 ; N betrafe ; B 38 0 579 662 ; -C -1 ; WX 491 ; N kafrafe ; B 38 -8 515 662 ; -C -1 ; WX 587 ; N perafe ; B 54 -8 612 662 ; -C -1 ; WX 607 ; N aleflamed ; B 69 0 669 716 ; -C -1 ; WX 0 ; N zerowidthnonjoiner ; B -18 -134 18 629 ; -C -1 ; WX 0 ; N zerowidthjoiner ; B -107 -134 107 690 ; -C -1 ; WX 0 ; N lefttorightmark ; B -18 -134 210 690 ; -C -1 ; WX 0 ; N righttoleftmark ; B -210 -134 17 690 ; -C -1 ; WX 0 ; N uni202A ; B -18 -134 210 603 ; -C -1 ; WX 0 ; N uni202B ; B -210 -134 18 603 ; -C -1 ; WX 0 ; N uni202D ; B -114 -134 114 690 ; -C -1 ; WX 0 ; N uni202E ; B -114 -134 114 690 ; -C -1 ; WX 0 ; N uni202C ; B -114 -134 114 690 ; -C -1 ; WX 0 ; N uni206E ; B -114 -134 114 690 ; -C -1 ; WX 0 ; N uni206F ; B -114 -134 114 690 ; -C -1 ; WX 0 ; N uni206A ; B -114 -134 114 690 ; -C -1 ; WX 0 ; N uni206B ; B -114 -134 114 690 ; -C -1 ; WX 0 ; N uni206C ; B -114 -134 114 690 ; -C -1 ; WX 0 ; N uni206D ; B -114 -134 114 690 ; -C -1 ; WX 0 ; N uniF00A ; B -18 -208 18 894 ; -C -1 ; WX 0 ; N uniF00B ; B -114 -208 114 894 ; -C -1 ; WX 0 ; N uniF00C ; B -18 -208 109 894 ; -C -1 ; WX 0 ; N uniF00D ; B -109 -208 18 894 ; -C -1 ; WX 0 ; N uniF00E ; B -18 -208 114 894 ; -C -1 ; WX 1000 ; N uniFFFC ; B 0 0 1000 719 ; -C -1 ; WX 837 ; N _b_766 ; B 87 -13 959 728 ; -C -1 ; WX 671 ; N _b_767 ; B 61 -12 780 531 ; -C -1 ; WX 809 ; N _b_768 ; B 91 -12 949 716 ; -C -1 ; WX 714 ; N _b_769 ; B 70 -12 802 519 ; -C -1 ; WX 0 ; N _d_770 ; B -131 829 80 905 ; -C -1 ; WX 0 ; N _d_771 ; B -393 829 -181 905 ; -C -1 ; WX 0 ; N _d_772 ; B -306 754 -110 892 ; -C -1 ; WX 0 ; N f006 ; B -76 829 185 905 ; -C -1 ; WX 0 ; N f007 ; B -298 829 -37 905 ; -C -1 ; WX 0 ; N f009 ; B -205 753 37 892 ; -C -1 ; WX 0 ; N _b_776 ; B -96 747 106 906 ; -C -1 ; WX 0 ; N f010 ; B -101 809 94 906 ; -C -1 ; WX 0 ; N f013 ; B -233 747 -31 906 ; -C -1 ; WX 0 ; N f011 ; B -320 809 -125 906 ; -C -1 ; WX 0 ; N f01c ; B -179 763 169 875 ; -C -1 ; WX 0 ; N f015 ; B -395 821 -51 906 ; -C -1 ; WX 0 ; N _b_782 ; B -323 763 25 875 ; -C -1 ; WX 0 ; N _d_783 ; B -24 728 280 797 ; -C -1 ; WX 0 ; N _d_784 ; B -29 740 270 805 ; -C -1 ; WX 0 ; N f02c ; B -218 -194 -51 -59 ; -C -1 ; WX 513 ; N _b_786 ; B 32 92 552 716 ; -C -1 ; WX 834 ; N _b_787 ; B 85 -30 830 725 ; -C -1 ; WX 834 ; N _b_788 ; B 82 -30 830 725 ; -C -1 ; WX 0 ; N f008 ; B -126 584 116 723 ; -C -1 ; WX 0 ; N _d_790 ; B -270 584 -27 723 ; -C -1 ; WX 0 ; N _d_791 ; B -167 584 29 722 ; -C -1 ; WX 0 ; N f00f ; B -322 584 -126 722 ; -C -1 ; WX 0 ; N f012 ; B -117 584 86 757 ; -C -1 ; WX 0 ; N f014 ; B -274 584 -72 757 ; -C -1 ; WX 0 ; N f016 ; B -411 763 -63 875 ; -C -1 ; WX 0 ; N f017 ; B -508 763 -160 875 ; -C -1 ; WX 0 ; N f018 ; B -508 763 -160 875 ; -C -1 ; WX 0 ; N f019 ; B -354 592 -18 710 ; -C -1 ; WX 0 ; N f01a ; B -468 592 -132 710 ; -C -1 ; WX 0 ; N f01b ; B -483 592 -147 710 ; -C -1 ; WX 0 ; N f01e ; B -450 -194 -283 -59 ; -C -1 ; WX 0 ; N f01f ; B -499 -194 -332 -59 ; -C -1 ; WX 0 ; N f020 ; B -557 -194 -390 -59 ; -C -1 ; WX 0 ; N f021 ; B -473 -194 -306 -59 ; -C -1 ; WX 0 ; N f022 ; B -557 -194 -390 -59 ; -C -1 ; WX 0 ; N _b_806 ; B -138 754 58 892 ; -C -1 ; WX 0 ; N _b_807 ; B -89 753 153 892 ; -C -1 ; WX 0 ; N f01d ; B -215 592 121 710 ; -C -1 ; WX 0 ; N _b_809 ; B -499 -194 -332 -59 ; -C -1 ; WX 0 ; N f023 ; B -413 -194 -246 -59 ; -C -1 ; WX 0 ; N f029 ; B -282 -194 -115 -59 ; -C -1 ; WX 0 ; N f02a ; B -276 -194 -109 -59 ; -C -1 ; WX 0 ; N f02b ; B -276 -194 -109 -59 ; -C -1 ; WX 0 ; N f024 ; B -364 -194 -197 -59 ; -C -1 ; WX 0 ; N f025 ; B -413 -194 -246 -59 ; -C -1 ; WX 0 ; N f026 ; B -467 -194 -300 -59 ; -C -1 ; WX 0 ; N f027 ; B -462 -194 -295 -59 ; -C -1 ; WX 0 ; N f028 ; B -560 -194 -393 -59 ; -C -1 ; WX 0 ; N f02d ; B -341 821 3 906 ; -C -1 ; WX 0 ; N f02e ; B -345 763 3 875 ; -C -1 ; WX 0 ; N f02f ; B -444 821 -100 906 ; -C -1 ; WX 0 ; N f030 ; B -448 763 -100 875 ; -C -1 ; WX 278 ; N f031 ; B 40 0 289 519 ; -C -1 ; WX 722 ; N _b_824 ; B -11 -194 673 716 ; -C -1 ; WX 556 ; N _b_825 ; B 45 -194 533 531 ; -C -1 ; WX 722 ; N _b_826 ; B -11 0 673 906 ; -C -1 ; WX 556 ; N _b_827 ; B 45 -12 533 757 ; -C -1 ; WX 722 ; N _b_828 ; B -11 0 673 905 ; -C -1 ; WX 556 ; N _b_829 ; B 45 -12 571 892 ; -C -1 ; WX 722 ; N _b_830 ; B -11 0 673 905 ; -C -1 ; WX 556 ; N _b_831 ; B 45 -12 533 892 ; -C -1 ; WX 722 ; N _b_832 ; B -11 0 673 906 ; -C -1 ; WX 556 ; N _b_833 ; B 45 -12 533 906 ; -C -1 ; WX 722 ; N _b_834 ; B -11 0 673 906 ; -C -1 ; WX 556 ; N _b_835 ; B 45 -12 582 875 ; -C -1 ; WX 722 ; N _b_836 ; B -11 -194 673 805 ; -C -1 ; WX 556 ; N _b_837 ; B 45 -194 533 731 ; -C -1 ; WX 722 ; N _b_838 ; B -11 0 673 905 ; -C -1 ; WX 556 ; N _b_839 ; B 45 -12 571 892 ; -C -1 ; WX 722 ; N _b_840 ; B -11 0 673 905 ; -C -1 ; WX 556 ; N _b_841 ; B 45 -12 542 892 ; -C -1 ; WX 722 ; N _b_842 ; B -11 0 673 906 ; -C -1 ; WX 556 ; N _b_843 ; B 45 -12 542 906 ; -C -1 ; WX 722 ; N _b_844 ; B -11 0 682 906 ; -C -1 ; WX 556 ; N _b_845 ; B 45 -12 582 875 ; -C -1 ; WX 722 ; N _b_846 ; B -11 -194 673 797 ; -C -1 ; WX 556 ; N _b_847 ; B 45 -194 542 727 ; -C -1 ; WX 667 ; N _b_848 ; B 41 -194 721 716 ; -C -1 ; WX 556 ; N _b_849 ; B 58 -194 555 531 ; -C -1 ; WX 667 ; N _b_850 ; B 41 0 721 906 ; -C -1 ; WX 556 ; N _b_851 ; B 58 -12 555 757 ; -C -1 ; WX 667 ; N _b_852 ; B 41 0 721 874 ; -C -1 ; WX 556 ; N _b_853 ; B 58 -12 555 710 ; -C -1 ; WX 667 ; N _b_854 ; B 41 0 721 905 ; -C -1 ; WX 556 ; N _b_855 ; B 58 -12 572 892 ; -C -1 ; WX 667 ; N _b_856 ; B 41 0 721 905 ; -C -1 ; WX 556 ; N _b_857 ; B 58 -12 555 892 ; -C -1 ; WX 667 ; N _b_858 ; B 41 0 721 906 ; -C -1 ; WX 556 ; N _b_859 ; B 58 -12 555 906 ; -C -1 ; WX 667 ; N _b_860 ; B 41 0 721 906 ; -C -1 ; WX 556 ; N _b_861 ; B 58 -12 582 875 ; -C -1 ; WX 667 ; N _b_862 ; B 41 -194 721 805 ; -C -1 ; WX 556 ; N _b_863 ; B 58 -194 555 731 ; -C -1 ; WX 278 ; N _b_864 ; B 35 0 399 906 ; -C -1 ; WX 278 ; N _b_865 ; B 40 0 369 757 ; -C -1 ; WX 278 ; N _b_866 ; B -3 -194 332 716 ; -C -1 ; WX 278 ; N _b_867 ; B -3 -194 330 716 ; -C -1 ; WX 778 ; N _b_868 ; B 87 -194 784 728 ; -C -1 ; WX 611 ; N _b_869 ; B 61 -194 599 531 ; -C -1 ; WX 778 ; N _b_870 ; B 87 -13 784 906 ; -C -1 ; WX 611 ; N _b_871 ; B 61 -12 599 757 ; -C -1 ; WX 778 ; N _b_872 ; B 87 -13 784 905 ; -C -1 ; WX 611 ; N _b_873 ; B 61 -12 599 892 ; -C -1 ; WX 778 ; N _b_874 ; B 87 -13 784 905 ; -C -1 ; WX 611 ; N _b_875 ; B 61 -12 599 892 ; -C -1 ; WX 778 ; N _b_876 ; B 87 -13 784 906 ; -C -1 ; WX 611 ; N _b_877 ; B 61 -12 599 906 ; -C -1 ; WX 778 ; N _b_878 ; B 87 -13 784 906 ; -C -1 ; WX 611 ; N _b_879 ; B 61 -12 602 875 ; -C -1 ; WX 778 ; N _b_880 ; B 87 -194 784 805 ; -C -1 ; WX 611 ; N _b_881 ; B 61 -194 599 731 ; -C -1 ; WX 837 ; N _b_882 ; B 87 -13 959 904 ; -C -1 ; WX 671 ; N _b_883 ; B 61 -12 780 730 ; -C -1 ; WX 837 ; N _b_884 ; B 87 -13 959 905 ; -C -1 ; WX 671 ; N _b_885 ; B 61 -12 780 732 ; -C -1 ; WX 837 ; N _b_886 ; B 87 -13 959 906 ; -C -1 ; WX 671 ; N _b_887 ; B 61 -12 780 757 ; -C -1 ; WX 837 ; N _b_888 ; B 87 -13 959 874 ; -C -1 ; WX 671 ; N _b_889 ; B 61 -12 780 710 ; -C -1 ; WX 837 ; N _b_890 ; B 87 -194 959 728 ; -C -1 ; WX 671 ; N _b_891 ; B 61 -194 780 531 ; -C -1 ; WX 722 ; N _b_892 ; B 91 -194 765 716 ; -C -1 ; WX 611 ; N _b_893 ; B 70 -194 619 519 ; -C -1 ; WX 722 ; N _b_894 ; B 91 -12 765 906 ; -C -1 ; WX 611 ; N _b_895 ; B 70 -12 619 757 ; -C -1 ; WX 809 ; N _b_896 ; B 91 -12 949 904 ; -C -1 ; WX 714 ; N _b_897 ; B 70 -12 802 730 ; -C -1 ; WX 809 ; N _b_898 ; B 91 -12 949 905 ; -C -1 ; WX 714 ; N _b_899 ; B 70 -12 802 732 ; -C -1 ; WX 809 ; N _b_900 ; B 91 -12 949 906 ; -C -1 ; WX 714 ; N _b_901 ; B 70 -12 802 757 ; -C -1 ; WX 809 ; N _b_902 ; B 91 -12 949 874 ; -C -1 ; WX 714 ; N _b_903 ; B 70 -12 802 710 ; -C -1 ; WX 809 ; N _b_904 ; B 91 -194 949 716 ; -C -1 ; WX 714 ; N _b_905 ; B 70 -194 802 519 ; -C -1 ; WX 667 ; N _b_906 ; B 115 -194 785 716 ; -C -1 ; WX 556 ; N _b_907 ; B 6 -210 621 519 ; -C -1 ; WX 667 ; N _b_908 ; B 115 0 785 906 ; -C -1 ; WX 556 ; N _b_909 ; B 6 -210 621 757 ; -C -1 ; WX 667 ; N _b_910 ; B 115 0 785 874 ; -C -1 ; WX 556 ; N _b_911 ; B 6 -210 621 710 ; -C -1 ; WX 722 ; N uni01CD ; B -11 0 694 908 ; -C -1 ; WX 556 ; N uni01CE ; B 45 -12 562 731 ; -C -1 ; WX 278 ; N uni01CF ; B 35 0 480 908 ; -C -1 ; WX 278 ; N uni01D0 ; B 40 0 445 731 ; -C -1 ; WX 778 ; N uni01D1 ; B 87 -13 784 908 ; -C -1 ; WX 611 ; N uni01D2 ; B 61 -12 599 731 ; -C -1 ; WX 722 ; N uni01D3 ; B 91 -12 765 908 ; -C -1 ; WX 611 ; N uni01D4 ; B 70 -12 619 731 ; -C -1 ; WX 722 ; N uni01D5 ; B 91 -12 765 900 ; -C -1 ; WX 611 ; N uni01D6 ; B 70 -12 619 892 ; -C -1 ; WX 722 ; N uni01D7 ; B 91 -12 765 900 ; -C -1 ; WX 611 ; N uni01D8 ; B 70 -12 619 926 ; -C -1 ; WX 722 ; N uni01D9 ; B 91 -12 765 900 ; -C -1 ; WX 611 ; N uni01DA ; B 70 -12 645 927 ; -C -1 ; WX 722 ; N uni01DB ; B 91 -12 765 900 ; -C -1 ; WX 611 ; N uni01DC ; B 70 -12 619 927 ; -C -1 ; WX 0 ; N _d_928 ; B 31 730 318 900 ; -C -1 ; WX 0 ; N _d_929 ; B 31 730 326 900 ; -C -1 ; WX 0 ; N _d_930 ; B 31 730 323 900 ; -C -1 ; WX 0 ; N _d_931 ; B 31 730 302 900 ; -C -1 ; WX 614 ; N uni0492 ; B 28 0 723 716 ; -C -1 ; WX 469 ; N uni0493 ; B 18 0 552 519 ; -C -1 ; WX 927 ; N uni0496 ; B -15 -198 1016 720 ; -C -1 ; WX 736 ; N uni0497 ; B -25 -161 788 519 ; -C -1 ; WX 615 ; N uni049a ; B 43 -198 701 716 ; -C -1 ; WX 507 ; N uni049b ; B 37 -161 567 519 ; -C -1 ; WX 615 ; N uni049c ; B 43 0 701 716 ; -C -1 ; WX 507 ; N uni049d ; B 37 0 567 519 ; -C -1 ; WX 722 ; N uni04a2 ; B 43 -198 765 716 ; -C -1 ; WX 604 ; N uni04a3 ; B 35 -161 616 519 ; -C -1 ; WX 556 ; N uni04ae ; B 109 0 667 716 ; -C -1 ; WX 556 ; N uni04af ; B 85 -197 624 519 ; -C -1 ; WX 556 ; N uni04b0 ; B 57 0 667 716 ; -C -1 ; WX 556 ; N uni04b1 ; B 5 -197 623 519 ; -C -1 ; WX 667 ; N uni04b2 ; B -30 -198 784 716 ; -C -1 ; WX 556 ; N uni04b3 ; B -22 -161 612 519 ; -C -1 ; WX 708 ; N uni04b8 ; B 129 0 752 716 ; -C -1 ; WX 583 ; N uni04b9 ; B 99 0 594 519 ; -C -1 ; WX 708 ; N uni04ba ; B 53 0 676 716 ; -C -1 ; WX 583 ; N uni04bb ; B 45 0 540 519 ; -C -1 ; WX 748 ; N uni018f ; B 87 -12 754 728 ; -C -1 ; WX 556 ; N uni0259 ; B 49 -12 546 531 ; -C -1 ; WX 778 ; N uni04e8 ; B 87 -12 784 728 ; -C -1 ; WX 611 ; N uni04e9 ; B 61 -12 599 531 ; -EndCharMetrics -StartKernData -StartKernPairs 820 -KPX space A -37 -KPX space Y -18 -KPX space Alphatonos -37 -KPX space Alpha -37 -KPX space Delta -37 -KPX space Lambda -37 -KPX space Upsilon -18 -KPX space Upsilondieresis -18 -KPX one one -74 -KPX A space -37 -KPX A T -74 -KPX A V -74 -KPX A W -55 -KPX A Y -74 -KPX A quoteright -55 -KPX F comma -111 -KPX F period -111 -KPX F A -55 -KPX L space -18 -KPX L T -74 -KPX L V -55 -KPX L W -55 -KPX L Y -74 -KPX L quoteright -74 -KPX P space -37 -KPX P comma -129 -KPX P period -129 -KPX P A -74 -KPX R T -18 -KPX R W -18 -KPX R Y -18 -KPX T comma -74 -KPX T hyphen -55 -KPX T period -74 -KPX T colon -74 -KPX T semicolon -74 -KPX T A -74 -KPX T O -18 -KPX T a -37 -KPX T c -37 -KPX T e -37 -KPX T i -18 -KPX T o -37 -KPX T r -18 -KPX T s -37 -KPX T u -18 -KPX T w -37 -KPX T y -37 -KPX V comma -92 -KPX V hyphen -37 -KPX V period -92 -KPX V colon -37 -KPX V semicolon -37 -KPX V A -74 -KPX V a -37 -KPX V e -37 -KPX V i -37 -KPX V o -37 -KPX V r -18 -KPX V u -18 -KPX V y -18 -KPX W comma -74 -KPX W hyphen -37 -KPX W period -74 -KPX W colon -37 -KPX W semicolon -37 -KPX W A -55 -KPX W a -18 -KPX W e -18 -KPX W i -9 -KPX W o -18 -KPX W r -18 -KPX W u -18 -KPX W y -18 -KPX Y space -18 -KPX Y comma -92 -KPX Y hyphen -74 -KPX Y period -92 -KPX Y colon -55 -KPX Y semicolon -55 -KPX Y A -74 -KPX Y a -37 -KPX Y e -37 -KPX Y i -37 -KPX Y o -37 -KPX Y p -37 -KPX Y q -37 -KPX Y u -37 -KPX Y v -37 -KPX f f -18 -KPX f quoteright 18 -KPX r comma -55 -KPX r period -55 -KPX r quoteright 37 -KPX v comma -55 -KPX v period -55 -KPX w comma -37 -KPX w period -37 -KPX y comma -37 -KPX y period -37 -KPX quoteleft quoteleft -37 -KPX quoteright space -37 -KPX quoteright s -18 -KPX quoteright t 18 -KPX quoteright quoteright -37 -KPX quotedblbase afii10051 -113 -KPX quotedblbase afii10060 -125 -KPX quotedblbase afii10036 -113 -KPX quotedblbase afii10041 -63 -KPX quotedblbase afii10044 -100 -KPX Gamma comma -110 -KPX Gamma period -110 -KPX Gamma iotadieresistonos 130 -KPX Gamma Alpha -87 -KPX Gamma Delta -87 -KPX Gamma Lambda -87 -KPX Gamma iota -18 -KPX Gamma iotadieresis 64 -KPX Theta Alpha -28 -KPX Theta Upsilon -40 -KPX Theta Upsilondieresis -40 -KPX Phi Alpha -28 -KPX Phi Upsilon -54 -KPX Phi Upsilondieresis -54 -KPX delta gamma -18 -KPX delta chi -28 -KPX delta pi -17 -KPX tau phi 14 -KPX tau omega 14 -KPX tau omegatonos 14 -KPX phi gamma -18 -KPX phi lambda -28 -KPX phi chi -28 -KPX phi pi -17 -KPX Alphatonos space -37 -KPX Alphatonos Theta -57 -KPX Alphatonos Phi -57 -KPX Alphatonos Omicron -57 -KPX Alphatonos Tau -92 -KPX Alphatonos Upsilon -123 -KPX Alphatonos Upsilondieresis -123 -KPX Alphatonos gamma -29 -KPX Alphatonos nu -29 -KPX Alphatonos chi -29 -KPX Omicrontonos Upsilon -40 -KPX Omicrontonos Upsilondieresis -40 -KPX Upsilontonos alpha -37 -KPX Upsilontonos delta -37 -KPX Upsilontonos sigma -37 -KPX Upsilontonos phi -37 -KPX Upsilontonos iotadieresistonos 130 -KPX Upsilontonos Alpha -89 -KPX Upsilontonos Delta -66 -KPX Upsilontonos Lambda -55 -KPX Upsilontonos alphatonos -37 -KPX Upsilontonos etatonos -37 -KPX Upsilontonos iotatonos -37 -KPX Upsilontonos eta -37 -KPX Upsilontonos iota -37 -KPX Upsilontonos kappa -37 -KPX Upsilontonos mu -37 -KPX Upsilontonos omicron -37 -KPX Upsilontonos iotadieresis 64 -KPX Upsilontonos omicrontonos -37 -KPX Alpha space -37 -KPX Alpha quoteright -55 -KPX Alpha Theta -57 -KPX Alpha Phi -57 -KPX Alpha Omicron -57 -KPX Alpha Tau -92 -KPX Alpha Upsilon -123 -KPX Alpha Upsilondieresis -123 -KPX Alpha gamma -29 -KPX Alpha nu -29 -KPX Alpha chi -29 -KPX Delta space -37 -KPX Delta Theta -21 -KPX Delta Omicron -21 -KPX Delta Tau -92 -KPX Delta Upsilon -123 -KPX Delta Upsilondieresis -123 -KPX Kappa Theta -72 -KPX Kappa Phi -72 -KPX Kappa alpha -19 -KPX Kappa delta -19 -KPX Kappa sigma -19 -KPX Kappa phi -19 -KPX Kappa Omicron -72 -KPX Kappa alphatonos -19 -KPX Kappa zeta -19 -KPX Kappa theta -19 -KPX Kappa xi -19 -KPX Kappa omicron -19 -KPX Kappa omega -19 -KPX Kappa omicrontonos -19 -KPX Kappa omegatonos -19 -KPX Lambda space -37 -KPX Lambda Theta -21 -KPX Lambda Omicron -21 -KPX Lambda Tau -92 -KPX Lambda Upsilon -123 -KPX Lambda Upsilondieresis -123 -KPX Omicron Alpha -28 -KPX Omicron Upsilon -40 -KPX Omicron Upsilondieresis -40 -KPX Rho comma -128 -KPX Rho period -128 -KPX Rho Alpha -74 -KPX Rho Delta -74 -KPX Rho Lambda -74 -KPX Sigma tau -24 -KPX Tau comma -74 -KPX Tau hyphen -55 -KPX Tau period -74 -KPX Tau colon -74 -KPX Tau semicolon -74 -KPX Tau Theta -18 -KPX Tau Phi -18 -KPX Tau alpha -37 -KPX Tau delta -37 -KPX Tau epsilon -37 -KPX Tau sigma -37 -KPX Tau phi -37 -KPX Tau iotadieresistonos 137 -KPX Tau Alpha -74 -KPX Tau Delta -45 -KPX Tau Lambda -45 -KPX Tau Omicron -18 -KPX Tau Omega -18 -KPX Tau alphatonos -37 -KPX Tau epsilontonos -37 -KPX Tau gamma -27 -KPX Tau eta -18 -KPX Tau iota -18 -KPX Tau mu -18 -KPX Tau nu -37 -KPX Tau omicron -37 -KPX Tau upsilon -18 -KPX Tau chi -37 -KPX Tau psi -27 -KPX Tau iotadieresis 64 -KPX Tau upsilondieresis -18 -KPX Tau omicrontonos -37 -KPX Tau upsilontonos -18 -KPX Upsilon comma -91 -KPX Upsilon hyphen -74 -KPX Upsilon period -91 -KPX Upsilon colon -55 -KPX Upsilon semicolon -55 -KPX Upsilon alpha -37 -KPX Upsilon delta -37 -KPX Upsilon sigma -37 -KPX Upsilon phi -37 -KPX Upsilon iotadieresistonos 130 -KPX Upsilon Alpha -89 -KPX Upsilon Delta -66 -KPX Upsilon Lambda -55 -KPX Upsilon alphatonos -37 -KPX Upsilon etatonos -37 -KPX Upsilon iotatonos -37 -KPX Upsilon gamma -21 -KPX Upsilon eta -37 -KPX Upsilon iota -37 -KPX Upsilon kappa -37 -KPX Upsilon mu -37 -KPX Upsilon omicron -37 -KPX Upsilon iotadieresis 64 -KPX Upsilon omicrontonos -37 -KPX Chi omega -34 -KPX Chi omegatonos -34 -KPX Psi alpha -20 -KPX Psi delta -28 -KPX Psi sigma -20 -KPX Psi phi -20 -KPX Psi alphatonos -20 -KPX Psi theta -17 -KPX Psi omicron -20 -KPX Psi omega -20 -KPX Psi omicrontonos -20 -KPX Psi omegatonos -20 -KPX Omega Upsilon -40 -KPX Omega Upsilondieresis -40 -KPX Upsilondieresis alpha -37 -KPX Upsilondieresis delta -37 -KPX Upsilondieresis sigma -37 -KPX Upsilondieresis phi -37 -KPX Upsilondieresis iotadieresistonos 130 -KPX Upsilondieresis Alpha -89 -KPX Upsilondieresis Delta -66 -KPX Upsilondieresis Lambda -55 -KPX Upsilondieresis alphatonos -37 -KPX Upsilondieresis etatonos -37 -KPX Upsilondieresis iotatonos -37 -KPX Upsilondieresis eta -37 -KPX Upsilondieresis iota -37 -KPX Upsilondieresis kappa -37 -KPX Upsilondieresis mu -37 -KPX Upsilondieresis omicron -37 -KPX Upsilondieresis iotadieresis 64 -KPX Upsilondieresis omicrontonos -37 -KPX zeta alpha -108 -KPX zeta delta -36 -KPX zeta sigma -108 -KPX zeta tau -28 -KPX zeta phi -108 -KPX zeta alphatonos -108 -KPX zeta etatonos -38 -KPX zeta gamma -28 -KPX zeta eta -38 -KPX zeta theta -21 -KPX zeta iota -38 -KPX zeta kappa -38 -KPX zeta nu -28 -KPX zeta omicron -108 -KPX zeta omega -108 -KPX zeta omicrontonos -108 -KPX zeta omegatonos -108 -KPX zeta pi -28 -KPX kappa alpha -38 -KPX kappa delta -38 -KPX kappa sigma -38 -KPX kappa phi -38 -KPX kappa alphatonos -38 -KPX kappa zeta -38 -KPX kappa theta -38 -KPX kappa xi -38 -KPX kappa omicron -38 -KPX kappa sigma1 -38 -KPX kappa omega -38 -KPX kappa omicrontonos -38 -KPX kappa omegatonos -38 -KPX lambda alpha -14 -KPX lambda delta -14 -KPX lambda sigma -14 -KPX lambda phi -14 -KPX lambda alphatonos -14 -KPX lambda upsilondieresistonos -19 -KPX lambda zeta -14 -KPX lambda xi -14 -KPX lambda omicron -14 -KPX lambda sigma1 -14 -KPX lambda upsilon -19 -KPX lambda omega -14 -KPX lambda upsilondieresis -19 -KPX lambda omicrontonos -14 -KPX lambda upsilontonos -19 -KPX lambda omegatonos -14 -KPX xi alpha -21 -KPX xi delta -21 -KPX xi sigma -21 -KPX xi phi -21 -KPX xi alphatonos -21 -KPX xi zeta -21 -KPX xi xi -21 -KPX xi omicron -21 -KPX xi sigma1 -21 -KPX xi omicrontonos -21 -KPX omicron tau -17 -KPX omicron gamma -18 -KPX omicron chi -28 -KPX omicron pi -17 -KPX rho chi -28 -KPX rho pi -17 -KPX chi alpha -14 -KPX chi delta -14 -KPX chi sigma -14 -KPX chi phi -14 -KPX chi alphatonos -14 -KPX chi zeta -14 -KPX chi omicron -14 -KPX chi sigma1 -14 -KPX chi omega -14 -KPX chi omicrontonos -14 -KPX chi omegatonos -14 -KPX omega gamma -18 -KPX omega chi -28 -KPX omega pi -17 -KPX omicrontonos gamma -18 -KPX omicrontonos chi -28 -KPX omicrontonos pi -17 -KPX omegatonos gamma -18 -KPX omegatonos chi -28 -KPX omegatonos pi -17 -KPX afii10052 comma -100 -KPX afii10052 period -100 -KPX afii10058 quoteright -100 -KPX afii10059 quoteright -100 -KPX afii10017 quoteright -75 -KPX afii10017 afii10021 37 -KPX afii10017 afii10025 -38 -KPX afii10017 afii10029 12 -KPX afii10017 afii10032 -50 -KPX afii10017 afii10033 -25 -KPX afii10017 afii10035 -50 -KPX afii10017 afii10036 -101 -KPX afii10017 afii10037 -63 -KPX afii10017 afii10038 -63 -KPX afii10017 afii10041 -50 -KPX afii10017 afii10047 -50 -KPX afii10017 afii10065 12 -KPX afii10017 afii10066 -25 -KPX afii10017 afii10070 -25 -KPX afii10017 afii10080 -25 -KPX afii10017 afii10083 -25 -KPX afii10017 afii10085 -25 -KPX afii10017 afii10086 -25 -KPX afii10018 afii10017 -38 -KPX afii10018 afii10021 12 -KPX afii10018 afii10024 -13 -KPX afii10018 afii10025 -13 -KPX afii10018 afii10029 12 -KPX afii10018 afii10032 -13 -KPX afii10018 afii10035 -13 -KPX afii10018 afii10036 -38 -KPX afii10018 afii10037 -25 -KPX afii10018 afii10038 -26 -KPX afii10018 afii10039 -13 -KPX afii10018 afii10041 -13 -KPX afii10018 afii10044 -50 -KPX afii10018 afii10047 -25 -KPX afii10018 afii10049 -25 -KPX afii10018 afii10077 12 -KPX afii10018 afii10085 -13 -KPX afii10018 afii10097 12 -KPX afii10019 afii10017 -38 -KPX afii10019 afii10024 -25 -KPX afii10019 afii10025 -25 -KPX afii10019 afii10032 -25 -KPX afii10019 afii10035 -25 -KPX afii10019 afii10036 -63 -KPX afii10019 afii10037 -63 -KPX afii10019 afii10038 -38 -KPX afii10019 afii10039 -38 -KPX afii10019 afii10044 -63 -KPX afii10019 afii10049 -25 -KPX afii10019 afii10085 -13 -KPX afii10019 afii10087 -13 -KPX afii10019 afii10089 -38 -KPX afii10020 comma -63 -KPX afii10020 period -63 -KPX afii10020 afii10017 -51 -KPX afii10020 afii10021 -25 -KPX afii10020 afii10025 -13 -KPX afii10020 afii10029 -13 -KPX afii10020 afii10032 -13 -KPX afii10020 afii10049 -13 -KPX afii10020 afii10065 -13 -KPX afii10020 afii10067 -51 -KPX afii10020 afii10069 -13 -KPX afii10020 afii10070 -50 -KPX afii10020 afii10074 -38 -KPX afii10020 afii10077 -38 -KPX afii10020 afii10078 -25 -KPX afii10020 afii10079 -25 -KPX afii10020 afii10080 -50 -KPX afii10020 afii10082 -25 -KPX afii10020 afii10085 -25 -KPX afii10020 afii10093 -25 -KPX afii10020 afii10094 -25 -KPX afii10020 afii10096 -25 -KPX afii10020 afii10097 -25 -KPX afii10021 afii10038 -13 -KPX afii10021 afii10041 25 -KPX afii10021 afii10073 12 -KPX afii10021 afii10085 25 -KPX afii10022 afii10025 -13 -KPX afii10022 afii10029 12 -KPX afii10022 afii10083 12 -KPX afii10024 afii10025 -13 -KPX afii10024 afii10032 -13 -KPX afii10024 afii10035 -13 -KPX afii10024 afii10041 37 -KPX afii10024 afii10044 12 -KPX afii10024 afii10065 12 -KPX afii10024 afii10070 -13 -KPX afii10024 afii10080 -13 -KPX afii10024 afii10085 -13 -KPX afii10025 afii10024 -25 -KPX afii10025 afii10032 -25 -KPX afii10025 afii10035 -25 -KPX afii10025 afii10036 -38 -KPX afii10025 afii10037 -38 -KPX afii10025 afii10038 -25 -KPX afii10025 afii10041 25 -KPX afii10025 afii10049 -25 -KPX afii10025 afii10069 -13 -KPX afii10025 afii10077 12 -KPX afii10028 afii10032 -13 -KPX afii10028 afii10035 -13 -KPX afii10028 afii10036 12 -KPX afii10028 afii10038 -38 -KPX afii10028 afii10041 50 -KPX afii10028 afii10070 -38 -KPX afii10028 afii10073 -25 -KPX afii10028 afii10080 -38 -KPX afii10028 afii10083 -38 -KPX afii10028 afii10085 -13 -KPX afii10028 afii10095 -25 -KPX afii10029 afii10038 -13 -KPX afii10029 afii10065 12 -KPX afii10029 afii10085 12 -KPX afii10030 afii10041 37 -KPX afii10030 afii10065 12 -KPX afii10030 afii10085 12 -KPX afii10030 afii10089 -13 -KPX afii10032 afii10017 -38 -KPX afii10032 afii10021 -13 -KPX afii10032 afii10024 -38 -KPX afii10032 afii10029 -13 -KPX afii10032 afii10037 -63 -KPX afii10032 afii10039 -25 -KPX afii10032 afii10041 25 -KPX afii10032 afii10049 -25 -KPX afii10032 afii10078 12 -KPX afii10032 afii10097 12 -KPX afii10034 comma -125 -KPX afii10034 period -125 -KPX afii10034 colon -13 -KPX afii10034 semicolon -13 -KPX afii10034 guillemotright -25 -KPX afii10034 afii10017 -63 -KPX afii10034 afii10021 -38 -KPX afii10034 afii10024 -38 -KPX afii10034 afii10025 -38 -KPX afii10034 afii10029 -25 -KPX afii10034 afii10036 -38 -KPX afii10034 afii10037 -38 -KPX afii10034 afii10039 -38 -KPX afii10034 afii10049 -25 -KPX afii10034 afii10069 -13 -KPX afii10034 afii10070 -13 -KPX afii10034 afii10080 -13 -KPX afii10035 afii10017 -25 -KPX afii10035 afii10025 -25 -KPX afii10035 afii10036 -38 -KPX afii10035 afii10037 -38 -KPX afii10035 afii10039 -13 -KPX afii10035 afii10041 12 -KPX afii10035 afii10044 -50 -KPX afii10035 afii10047 -25 -KPX afii10035 afii10065 25 -KPX afii10035 afii10072 12 -KPX afii10035 afii10073 12 -KPX afii10035 afii10089 -13 -KPX afii10036 comma -38 -KPX afii10036 period -38 -KPX afii10036 afii10017 -38 -KPX afii10036 afii10024 25 -KPX afii10036 afii10030 12 -KPX afii10036 afii10032 -13 -KPX afii10036 afii10038 -13 -KPX afii10036 afii10047 12 -KPX afii10036 afii10067 -38 -KPX afii10036 afii10070 -38 -KPX afii10036 afii10074 -38 -KPX afii10036 afii10076 -25 -KPX afii10036 afii10077 -25 -KPX afii10036 afii10078 -25 -KPX afii10036 afii10080 -38 -KPX afii10036 afii10081 -13 -KPX afii10036 afii10082 -25 -KPX afii10036 afii10083 -38 -KPX afii10036 afii10085 -25 -KPX afii10036 afii10087 -25 -KPX afii10036 afii10091 -25 -KPX afii10036 afii10093 -13 -KPX afii10036 afii10094 -13 -KPX afii10036 afii10096 -13 -KPX afii10036 afii10097 -13 -KPX afii10037 comma -75 -KPX afii10037 period -75 -KPX afii10037 colon -25 -KPX afii10037 semicolon -25 -KPX afii10037 afii10017 -75 -KPX afii10037 afii10021 -38 -KPX afii10037 afii10025 -13 -KPX afii10037 afii10029 -13 -KPX afii10037 afii10032 -13 -KPX afii10037 afii10038 -38 -KPX afii10037 afii10047 -13 -KPX afii10037 afii10049 -13 -KPX afii10037 afii10066 -25 -KPX afii10037 afii10067 -50 -KPX afii10037 afii10068 -38 -KPX afii10037 afii10069 -25 -KPX afii10037 afii10070 -50 -KPX afii10037 afii10072 -13 -KPX afii10037 afii10073 -38 -KPX afii10037 afii10074 -38 -KPX afii10037 afii10075 -25 -KPX afii10037 afii10076 -25 -KPX afii10037 afii10077 -38 -KPX afii10037 afii10078 -25 -KPX afii10037 afii10079 -25 -KPX afii10037 afii10080 -63 -KPX afii10037 afii10081 -25 -KPX afii10037 afii10082 -25 -KPX afii10037 afii10083 -50 -KPX afii10037 afii10087 -25 -KPX afii10037 afii10088 -25 -KPX afii10037 afii10090 -25 -KPX afii10037 afii10091 -25 -KPX afii10037 afii10096 -25 -KPX afii10037 afii10097 -25 -KPX afii10038 afii10017 -38 -KPX afii10038 afii10021 -25 -KPX afii10038 afii10029 -25 -KPX afii10038 afii10030 12 -KPX afii10038 afii10036 -63 -KPX afii10038 afii10037 -63 -KPX afii10038 afii10041 25 -KPX afii10038 afii10049 -38 -KPX afii10038 afii10077 -13 -KPX afii10039 afii10025 12 -KPX afii10039 afii10032 -13 -KPX afii10039 afii10035 -13 -KPX afii10039 afii10038 -25 -KPX afii10039 afii10047 -13 -KPX afii10039 afii10080 -38 -KPX afii10039 afii10085 -13 -KPX afii10040 afii10065 25 -KPX afii10043 afii10065 25 -KPX afii10043 afii10085 25 -KPX afii10044 quoteright -100 -KPX afii10044 afii10049 -25 -KPX afii10046 quoteright -88 -KPX afii10046 afii10017 -25 -KPX afii10046 afii10024 -25 -KPX afii10046 afii10025 -25 -KPX afii10046 afii10030 -13 -KPX afii10046 afii10032 -38 -KPX afii10046 afii10035 -38 -KPX afii10046 afii10036 -100 -KPX afii10046 afii10039 -25 -KPX afii10046 afii10041 -38 -KPX afii10046 afii10047 -38 -KPX afii10046 afii10049 -38 -KPX afii10047 afii10021 -13 -KPX afii10047 afii10024 -25 -KPX afii10047 afii10025 -25 -KPX afii10047 afii10029 -25 -KPX afii10047 afii10039 -25 -KPX afii10047 afii10049 -38 -KPX afii10048 afii10017 -38 -KPX afii10048 afii10024 -25 -KPX afii10048 afii10036 -51 -KPX afii10048 afii10039 -13 -KPX afii10048 afii10041 12 -KPX afii10065 afii10077 12 -KPX afii10065 afii10085 -13 -KPX afii10065 afii10089 -38 -KPX afii10065 afii10095 -13 -KPX afii10066 afii10072 -13 -KPX afii10066 afii10073 -13 -KPX afii10066 afii10077 -13 -KPX afii10066 afii10078 -13 -KPX afii10066 afii10085 -25 -KPX afii10066 afii10087 -25 -KPX afii10066 afii10089 -38 -KPX afii10066 afii10092 -51 -KPX afii10066 afii10095 -13 -KPX afii10067 afii10065 -13 -KPX afii10067 afii10066 -25 -KPX afii10067 afii10069 -25 -KPX afii10067 afii10070 -25 -KPX afii10067 afii10072 -13 -KPX afii10067 afii10073 -13 -KPX afii10067 afii10078 -25 -KPX afii10067 afii10080 -25 -KPX afii10067 afii10083 -25 -KPX afii10067 afii10084 -13 -KPX afii10067 afii10085 -38 -KPX afii10067 afii10086 -25 -KPX afii10067 afii10089 -50 -KPX afii10067 afii10092 -63 -KPX afii10067 afii10097 -13 -KPX afii10068 comma -13 -KPX afii10068 period -13 -KPX afii10068 afii10065 -13 -KPX afii10068 afii10069 -38 -KPX afii10068 afii10070 -25 -KPX afii10068 afii10073 -25 -KPX afii10068 afii10078 -25 -KPX afii10068 afii10080 -25 -KPX afii10068 afii10083 -25 -KPX afii10068 afii10097 -13 -KPX afii10069 afii10073 -13 -KPX afii10070 afii10065 12 -KPX afii10070 afii10066 12 -KPX afii10070 afii10069 12 -KPX afii10070 afii10072 -13 -KPX afii10070 afii10077 12 -KPX afii10070 afii10080 12 -KPX afii10070 afii10083 12 -KPX afii10070 afii10085 -13 -KPX afii10070 afii10086 12 -KPX afii10070 afii10087 -13 -KPX afii10070 afii10089 -25 -KPX afii10072 afii10065 12 -KPX afii10072 afii10066 12 -KPX afii10072 afii10085 12 -KPX afii10072 afii10089 -13 -KPX afii10072 afii10092 12 -KPX afii10073 afii10066 -13 -KPX afii10073 afii10069 -13 -KPX afii10073 afii10070 -13 -KPX afii10073 afii10073 -13 -KPX afii10073 afii10078 -13 -KPX afii10073 afii10080 -13 -KPX afii10073 afii10083 -13 -KPX afii10073 afii10085 -38 -KPX afii10073 afii10086 -13 -KPX afii10073 afii10089 -50 -KPX afii10073 afii10092 -50 -KPX afii10076 afii10065 12 -KPX afii10076 afii10066 12 -KPX afii10076 afii10077 25 -KPX afii10076 afii10085 12 -KPX afii10076 afii10089 -13 -KPX afii10076 afii10095 12 -KPX afii10077 afii10066 -13 -KPX afii10077 afii10070 -13 -KPX afii10077 afii10080 -13 -KPX afii10077 afii10083 -13 -KPX afii10077 afii10085 -13 -KPX afii10077 afii10086 -13 -KPX afii10077 afii10089 -25 -KPX afii10078 afii10073 -13 -KPX afii10080 afii10065 12 -KPX afii10080 afii10072 -13 -KPX afii10080 afii10085 -25 -KPX afii10080 afii10087 -25 -KPX afii10080 afii10089 -50 -KPX afii10080 afii10095 -13 -KPX afii10082 afii10072 -13 -KPX afii10082 afii10073 -13 -KPX afii10082 afii10077 -13 -KPX afii10082 afii10078 -13 -KPX afii10082 afii10085 -26 -KPX afii10082 afii10087 -25 -KPX afii10082 afii10089 -50 -KPX afii10082 afii10095 -13 -KPX afii10083 afii10072 -13 -KPX afii10083 afii10073 -13 -KPX afii10083 afii10085 -13 -KPX afii10083 afii10086 -13 -KPX afii10083 afii10087 -13 -KPX afii10083 afii10089 -38 -KPX afii10083 afii10092 -25 -KPX afii10084 comma -13 -KPX afii10084 period -13 -KPX afii10084 afii10069 -13 -KPX afii10084 afii10070 -13 -KPX afii10084 afii10072 -13 -KPX afii10084 afii10073 -25 -KPX afii10084 afii10077 -13 -KPX afii10084 afii10078 -13 -KPX afii10084 afii10080 -13 -KPX afii10084 afii10083 -13 -KPX afii10084 afii10085 -25 -KPX afii10084 afii10095 -25 -KPX afii10085 comma -38 -KPX afii10085 period -38 -KPX afii10085 afii10066 12 -KPX afii10085 afii10072 12 -KPX afii10085 afii10073 12 -KPX afii10085 afii10087 12 -KPX afii10085 afii10097 12 -KPX afii10086 afii10085 -25 -KPX afii10086 afii10089 -38 -KPX afii10087 afii10065 -13 -KPX afii10087 afii10066 -13 -KPX afii10087 afii10070 -25 -KPX afii10087 afii10073 -13 -KPX afii10087 afii10080 -25 -KPX afii10087 afii10083 -25 -KPX afii10087 afii10086 -25 -KPX afii10087 afii10089 -25 -KPX afii10087 afii10095 -13 -KPX afii10088 afii10065 -13 -KPX afii10088 afii10070 -38 -KPX afii10088 afii10073 -13 -KPX afii10088 afii10080 -38 -KPX afii10088 afii10083 -38 -KPX afii10088 afii10085 -13 -KPX afii10091 afii10070 -25 -KPX afii10091 afii10080 -25 -KPX afii10094 afii10084 -25 -KPX afii10094 afii10089 -100 -KPX afii10095 afii10066 -13 -KPX afii10095 afii10070 -13 -KPX afii10095 afii10072 -13 -KPX afii10095 afii10073 -13 -KPX afii10095 afii10078 -25 -KPX afii10095 afii10080 -13 -KPX afii10095 afii10083 -13 -KPX afii10095 afii10086 -13 -KPX afii10095 afii10087 -25 -KPX afii10096 afii10066 -13 -KPX afii10096 afii10069 -13 -KPX afii10096 afii10070 -13 -KPX afii10096 afii10072 -25 -KPX afii10096 afii10077 -13 -KPX afii10096 afii10078 -13 -KPX afii10096 afii10080 -13 -KPX afii10096 afii10083 -13 -KPX afii10096 afii10084 -13 -KPX afii10096 afii10086 -13 -KPX afii10096 afii10087 -25 -KPX afii10096 afii10089 -63 -KPX afii10096 afii10095 -25 -KPX afii10110 comma -38 -KPX afii10110 period -38 -KPX afii10110 colon -13 -KPX afii10110 semicolon -13 -KPX afii10050 comma -25 -KPX afii10050 period -25 -KPX pi phi 14 -KPX pi omega 14 -KPX pi omegatonos 14 -EndKernPairs -EndKernData -EndFontMetrics +StartFontMetrics 4.1 +FontName Arial-BoldItalicMT +FullName Arial Bold Italic +Notice Typeface The Monotype Corporation plc. Data The Monotype Corporation plc/Type Solutions Inc. 1990-1992. All Rights Reserved +EncodingScheme FontSpecific +FamilyName Arial +Weight Bold Italic +Version Version 2.90 +Characters 956 +ItalicAngle -12.0 +Ascender 905 +Descender -212 +UnderlineThickness 105 +UnderlinePosition -106 +IsFixedPitch false +FontBBox -560 -376 1157 1000 +StartCharMetrics 991 +C 0 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 1 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 2 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 3 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 4 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 5 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 6 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 7 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 8 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 9 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 10 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 11 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 12 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 13 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 14 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 15 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 16 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 17 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 18 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 19 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 20 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 21 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 22 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 23 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 24 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 25 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 26 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 27 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 28 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 29 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 30 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 31 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 32 ; WX 278 ; N space ; B 62 0 353 716 ; +C 33 ; WX 333 ; N exclam ; B 62 0 353 716 ; +C 34 ; WX 474 ; N quotedbl ; B 151 461 507 716 ; +C 35 ; WX 556 ; N numbersign ; B 9 -12 544 728 ; +C 36 ; WX 556 ; N dollar ; B 44 -99 576 770 ; +C 37 ; WX 889 ; N percent ; B 91 -31 864 728 ; +C 38 ; WX 722 ; N ampersand ; B 83 -17 706 728 ; +C 39 ; WX 238 ; N quotesingle ; B 151 461 329 716 ; +C 40 ; WX 333 ; N parenleft ; B 66 -210 436 728 ; +C 41 ; WX 333 ; N parenright ; B -78 -210 292 728 ; +C 42 ; WX 389 ; N asterisk ; B 14 387 368 728 ; +C 43 ; WX 584 ; N plus ; B 42 103 542 604 ; +C 44 ; WX 278 ; N comma ; B 10 -155 212 135 ; +C 45 ; WX 333 ; N hyphen ; B 39 190 339 326 ; +C 46 ; WX 278 ; N period ; B 44 0 211 135 ; +C 47 ; WX 278 ; N slash ; B -43 -12 409 728 ; +C 48 ; WX 556 ; N zero ; B 64 -12 571 719 ; +C 49 ; WX 556 ; N one ; B 119 0 511 720 ; +C 50 ; WX 556 ; N two ; B 61 0 571 719 ; +C 51 ; WX 556 ; N three ; B 51 -12 560 719 ; +C 52 ; WX 556 ; N four ; B 27 0 560 716 ; +C 53 ; WX 556 ; N five ; B 63 -12 578 706 ; +C 54 ; WX 556 ; N six ; B 81 -13 576 719 ; +C 55 ; WX 556 ; N seven ; B 104 0 603 706 ; +C 56 ; WX 556 ; N eight ; B 66 -13 567 719 ; +C 57 ; WX 556 ; N nine ; B 63 -12 558 719 ; +C 58 ; WX 333 ; N colon ; B 70 0 317 519 ; +C 59 ; WX 333 ; N semicolon ; B 41 -155 320 519 ; +C 60 ; WX 584 ; N less ; B 46 82 537 625 ; +C 61 ; WX 584 ; N equal ; B 42 182 542 524 ; +C 62 ; WX 584 ; N greater ; B 46 81 538 625 ; +C 63 ; WX 611 ; N question ; B 123 0 618 728 ; +C 64 ; WX 975 ; N at ; B 30 -210 972 729 ; +C 65 ; WX 722 ; N A ; B -11 0 673 716 ; +C 66 ; WX 722 ; N B ; B 40 0 710 716 ; +C 67 ; WX 722 ; N C ; B 95 -13 746 728 ; +C 68 ; WX 722 ; N D ; B 43 0 725 716 ; +C 69 ; WX 667 ; N E ; B 41 0 721 716 ; +C 70 ; WX 611 ; N F ; B 39 0 690 716 ; +C 71 ; WX 778 ; N G ; B 88 -12 786 728 ; +C 72 ; WX 722 ; N H ; B 43 0 765 716 ; +C 73 ; WX 278 ; N I ; B 35 0 332 716 ; +C 74 ; WX 556 ; N J ; B 29 -12 600 716 ; +C 75 ; WX 722 ; N K ; B 40 0 801 716 ; +C 76 ; WX 611 ; N L ; B 45 0 582 716 ; +C 77 ; WX 833 ; N M ; B 41 0 878 716 ; +C 78 ; WX 722 ; N N ; B 45 0 763 716 ; +C 79 ; WX 778 ; N O ; B 87 -13 784 728 ; +C 80 ; WX 667 ; N P ; B 41 0 702 716 ; +C 81 ; WX 778 ; N Q ; B 87 -95 784 728 ; +C 82 ; WX 722 ; N R ; B 44 0 741 716 ; +C 83 ; WX 667 ; N S ; B 62 -12 676 728 ; +C 84 ; WX 611 ; N T ; B 120 0 709 716 ; +C 85 ; WX 722 ; N U ; B 91 -12 765 716 ; +C 86 ; WX 667 ; N V ; B 113 0 793 716 ; +C 87 ; WX 944 ; N W ; B 117 0 1068 716 ; +C 88 ; WX 667 ; N X ; B -30 0 784 716 ; +C 89 ; WX 667 ; N Y ; B 115 0 785 716 ; +C 90 ; WX 611 ; N Z ; B 25 0 668 716 ; +C 91 ; WX 333 ; N bracketleft ; B 10 -197 439 716 ; +C 92 ; WX 278 ; N backslash ; B 78 -12 287 728 ; +C 93 ; WX 333 ; N bracketright ; B -56 -197 375 716 ; +C 94 ; WX 584 ; N asciicircum ; B 56 338 527 728 ; +C 95 ; WX 556 ; N underscore ; B -9 -198 561 -109 ; +C 96 ; WX 333 ; N grave ; B 134 586 331 732 ; +C 97 ; WX 556 ; N a ; B 45 -12 533 531 ; +C 98 ; WX 611 ; N b ; B 36 -12 602 716 ; +C 99 ; WX 556 ; N c ; B 60 -12 564 531 ; +C 100 ; WX 611 ; N d ; B 59 -12 668 716 ; +C 101 ; WX 556 ; N e ; B 58 -12 555 531 ; +C 102 ; WX 333 ; N f ; B 54 0 471 728 ; +C 103 ; WX 611 ; N g ; B 31 -210 623 531 ; +C 104 ; WX 611 ; N h ; B 42 0 591 716 ; +C 105 ; WX 278 ; N i ; B 40 0 330 716 ; +C 106 ; WX 278 ; N j ; B -109 -210 331 716 ; +C 107 ; WX 556 ; N k ; B 38 0 614 716 ; +C 108 ; WX 278 ; N l ; B 39 0 329 716 ; +C 109 ; WX 889 ; N m ; B 36 0 869 531 ; +C 110 ; WX 611 ; N n ; B 42 0 591 531 ; +C 111 ; WX 611 ; N o ; B 61 -12 599 531 ; +C 112 ; WX 611 ; N p ; B -5 -198 605 531 ; +C 113 ; WX 611 ; N q ; B 60 -198 625 531 ; +C 114 ; WX 389 ; N r ; B 32 0 474 531 ; +C 115 ; WX 556 ; N s ; B 22 -12 552 531 ; +C 116 ; WX 333 ; N t ; B 75 -12 391 698 ; +C 117 ; WX 611 ; N u ; B 70 -12 619 519 ; +C 118 ; WX 556 ; N v ; B 75 0 618 519 ; +C 119 ; WX 778 ; N w ; B 72 0 840 519 ; +C 120 ; WX 556 ; N x ; B -22 0 612 519 ; +C 121 ; WX 556 ; N y ; B 6 -210 621 519 ; +C 122 ; WX 500 ; N z ; B 17 0 519 519 ; +C 123 ; WX 389 ; N braceleft ; B 40 -210 488 728 ; +C 124 ; WX 280 ; N bar ; B 86 -210 195 728 ; +C 125 ; WX 389 ; N braceright ; B -87 -210 361 728 ; +C 126 ; WX 584 ; N asciitilde ; B 33 253 551 451 ; +C 127 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 128 ; WX 556 ; N Euro ; B 27 -13 639 728 ; +C 129 ; WX 614 ; N afii10052 ; B 44 0 723 905 ; +C 130 ; WX 278 ; N quotesinglbase ; B 10 -155 212 135 ; +C 131 ; WX 556 ; N florin ; B -10 -210 558 728 ; +C 132 ; WX 500 ; N quotedblbase ; B 3 -155 441 135 ; +C 133 ; WX 1000 ; N ellipsis ; B 93 0 907 135 ; +C 134 ; WX 556 ; N dagger ; B 84 -171 594 706 ; +C 135 ; WX 556 ; N daggerdbl ; B -1 -171 600 706 ; +C 136 ; WX 333 ; N circumflex ; B 56 584 392 731 ; +C 137 ; WX 1000 ; N perthousand ; B 68 -28 1021 728 ; +C 138 ; WX 667 ; N Scaron ; B 62 -12 676 905 ; +C 139 ; WX 333 ; N guilsinglleft ; B 60 35 378 477 ; +C 140 ; WX 1000 ; N OE ; B 69 -12 1079 728 ; +C 141 ; WX 622 ; N afii10061 ; B 43 0 701 905 ; +C 142 ; WX 611 ; N Zcaron ; B 25 0 668 905 ; +C 143 ; WX 719 ; N afii10145 ; B 43 -198 764 716 ; +C 144 ; WX 500 ; N quotedblbase ; B 3 -155 441 135 ; +C 145 ; WX 278 ; N quoteleft ; B 109 433 311 724 ; +C 146 ; WX 278 ; N quoteright ; B 124 425 326 716 ; +C 147 ; WX 500 ; N quotedblleft ; B 125 433 563 724 ; +C 148 ; WX 500 ; N quotedblright ; B 128 425 566 716 ; +C 149 ; WX 350 ; N bullet ; B 32 209 321 498 ; +C 150 ; WX 556 ; N endash ; B -2 208 554 311 ; +C 151 ; WX 1000 ; N emdash ; B 0 208 1000 311 ; +C 152 ; WX 333 ; N tilde ; B 93 592 429 710 ; +C 153 ; WX 1000 ; N trademark ; B 105 316 877 716 ; +C 154 ; WX 556 ; N scaron ; B 22 -12 552 731 ; +C 155 ; WX 333 ; N guilsinglright ; B 10 35 319 477 ; +C 156 ; WX 944 ; N oe ; B 58 -12 944 531 ; +C 157 ; WX 507 ; N afii10109 ; B 37 0 567 730 ; +C 158 ; WX 500 ; N zcaron ; B 17 0 528 731 ; +C 159 ; WX 667 ; N Ydieresis ; B 115 0 785 876 ; +C 160 ; WX 278 ; N space ; B 62 0 353 716 ; +C 161 ; WX 333 ; N exclamdown ; B 12 -197 305 519 ; +C 162 ; WX 556 ; N cent ; B 59 -193 563 714 ; +C 163 ; WX 556 ; N sterling ; B 21 -18 610 728 ; +C 164 ; WX 556 ; N currency ; B 22 101 531 610 ; +C 165 ; WX 556 ; N yen ; B 24 0 667 716 ; +C 166 ; WX 280 ; N brokenbar ; B 86 -210 195 728 ; +C 167 ; WX 556 ; N section ; B 21 -212 560 728 ; +C 168 ; WX 333 ; N dieresis ; B 84 597 435 717 ; +C 169 ; WX 737 ; N copyright ; B -4 -18 744 730 ; +C 170 ; WX 370 ; N ordfeminine ; B 82 363 412 728 ; +C 171 ; WX 556 ; N guillemotleft ; B 53 35 562 477 ; +C 172 ; WX 584 ; N logicalnot ; B 42 184 542 524 ; +C 173 ; WX 333 ; N hyphen ; B 39 190 339 326 ; +C 174 ; WX 737 ; N registered ; B -4 -18 744 730 ; +C 175 ; WX 552 ; N overscore ; B -9 758 561 847 ; +C 176 ; WX 400 ; N degree ; B 42 417 354 728 ; +C 177 ; WX 549 ; N plusminus ; B 24 0 525 674 ; +C 178 ; WX 333 ; N twosuperior ; B 82 355 396 725 ; +C 179 ; WX 333 ; N threesuperior ; B 76 349 390 725 ; +C 180 ; WX 333 ; N acute ; B 184 584 435 730 ; +C 181 ; WX 576 ; N mu1 ; B -37 -201 584 519 ; +C 182 ; WX 556 ; N paragraph ; B -1 -197 551 716 ; +C 183 ; WX 278 ; N periodcentered ; B 72 280 209 417 ; +C 184 ; WX 333 ; N cedilla ; B 7 -208 267 -13 ; +C 185 ; WX 333 ; N onesuperior ; B 115 355 362 726 ; +C 186 ; WX 365 ; N ordmasculine ; B 72 362 415 728 ; +C 187 ; WX 556 ; N guillemotright ; B 22 35 531 477 ; +C 188 ; WX 834 ; N onequarter ; B 100 -30 840 725 ; +C 189 ; WX 834 ; N onehalf ; B 85 -30 835 725 ; +C 190 ; WX 834 ; N threequarters ; B 76 -30 852 725 ; +C 191 ; WX 611 ; N questiondown ; B 27 -209 522 519 ; +C 192 ; WX 722 ; N Agrave ; B -11 0 673 905 ; +C 193 ; WX 722 ; N Aacute ; B -11 0 686 904 ; +C 194 ; WX 722 ; N Acircumflex ; B -11 0 673 905 ; +C 195 ; WX 722 ; N Atilde ; B -11 0 673 874 ; +C 196 ; WX 722 ; N Adieresis ; B -11 0 681 876 ; +C 197 ; WX 722 ; N Aring ; B -11 -9 673 854 ; +C 198 ; WX 1000 ; N AE ; B -32 0 1059 716 ; +C 199 ; WX 722 ; N Ccedilla ; B 95 -205 746 728 ; +C 200 ; WX 667 ; N Egrave ; B 41 0 721 905 ; +C 201 ; WX 667 ; N Eacute ; B 41 0 721 904 ; +C 202 ; WX 667 ; N Ecircumflex ; B 41 0 721 905 ; +C 203 ; WX 667 ; N Edieresis ; B 41 0 721 876 ; +C 204 ; WX 278 ; N Igrave ; B 35 0 383 905 ; +C 205 ; WX 278 ; N Iacute ; B 35 0 451 904 ; +C 206 ; WX 278 ; N Icircumflex ; B 35 0 426 905 ; +C 207 ; WX 278 ; N Idieresis ; B 35 0 453 876 ; +C 208 ; WX 722 ; N Eth ; B 37 0 725 716 ; +C 209 ; WX 722 ; N Ntilde ; B 45 0 763 874 ; +C 210 ; WX 778 ; N Ograve ; B 87 -13 784 905 ; +C 211 ; WX 778 ; N Oacute ; B 87 -13 784 904 ; +C 212 ; WX 778 ; N Ocircumflex ; B 87 -13 784 905 ; +C 213 ; WX 778 ; N Otilde ; B 87 -13 784 874 ; +C 214 ; WX 778 ; N Odieresis ; B 87 -13 784 876 ; +C 215 ; WX 584 ; N multiply ; B 53 115 530 591 ; +C 216 ; WX 778 ; N Oslash ; B 78 -60 787 767 ; +C 217 ; WX 722 ; N Ugrave ; B 91 -12 765 905 ; +C 218 ; WX 722 ; N Uacute ; B 91 -12 765 904 ; +C 219 ; WX 722 ; N Ucircumflex ; B 91 -12 765 905 ; +C 220 ; WX 722 ; N Udieresis ; B 91 -12 765 876 ; +C 221 ; WX 667 ; N Yacute ; B 115 0 785 904 ; +C 222 ; WX 667 ; N Thorn ; B 41 0 673 716 ; +C 223 ; WX 611 ; N germandbls ; B 35 -12 582 728 ; +C 224 ; WX 556 ; N agrave ; B 45 -12 533 732 ; +C 225 ; WX 556 ; N aacute ; B 45 -12 567 730 ; +C 226 ; WX 556 ; N acircumflex ; B 45 -12 533 731 ; +C 227 ; WX 556 ; N atilde ; B 45 -12 550 710 ; +C 228 ; WX 556 ; N adieresis ; B 45 -12 554 717 ; +C 229 ; WX 556 ; N aring ; B 45 -12 533 754 ; +C 230 ; WX 889 ; N ae ; B 31 -12 866 531 ; +C 231 ; WX 556 ; N ccedilla ; B 60 -204 564 531 ; +C 232 ; WX 556 ; N egrave ; B 58 -12 555 732 ; +C 233 ; WX 556 ; N eacute ; B 58 -12 562 730 ; +C 234 ; WX 556 ; N ecircumflex ; B 58 -12 555 731 ; +C 235 ; WX 556 ; N edieresis ; B 58 -12 555 717 ; +C 236 ; WX 278 ; N igrave ; B 40 0 347 732 ; +C 237 ; WX 278 ; N iacute ; B 40 0 413 730 ; +C 238 ; WX 278 ; N icircumflex ; B 40 0 390 731 ; +C 239 ; WX 278 ; N idieresis ; B 40 0 417 717 ; +C 240 ; WX 611 ; N eth ; B 61 -13 608 716 ; +C 241 ; WX 611 ; N ntilde ; B 42 0 591 710 ; +C 242 ; WX 611 ; N ograve ; B 61 -12 599 732 ; +C 243 ; WX 611 ; N oacute ; B 61 -12 599 730 ; +C 244 ; WX 611 ; N ocircumflex ; B 61 -12 599 731 ; +C 245 ; WX 611 ; N otilde ; B 61 -12 599 710 ; +C 246 ; WX 611 ; N odieresis ; B 61 -12 599 717 ; +C 247 ; WX 549 ; N divide ; B 24 90 524 616 ; +C 248 ; WX 611 ; N oslash ; B 53 -52 604 571 ; +C 249 ; WX 611 ; N ugrave ; B 70 -12 619 732 ; +C 250 ; WX 611 ; N uacute ; B 70 -12 619 730 ; +C 251 ; WX 611 ; N ucircumflex ; B 70 -12 619 731 ; +C 252 ; WX 611 ; N udieresis ; B 70 -12 619 717 ; +C 253 ; WX 556 ; N yacute ; B 6 -210 621 730 ; +C 254 ; WX 611 ; N thorn ; B -9 -198 603 716 ; +C 255 ; WX 556 ; N ydieresis ; B 6 -210 621 717 ; +C -1 ; WX 0 ; N .null ; B 62 0 353 716 ; +C -1 ; WX 278 ; N nonmarkingreturn ; B 62 0 353 716 ; +C -1 ; WX 549 ; N notequal ; B 24 -12 524 719 ; +C -1 ; WX 713 ; N infinity ; B 74 182 640 523 ; +C -1 ; WX 549 ; N lessequal ; B 29 0 520 708 ; +C -1 ; WX 549 ; N greaterequal ; B 29 0 520 708 ; +C -1 ; WX 494 ; N partialdiff ; B 20 -12 475 728 ; +C -1 ; WX 713 ; N summation ; B 60 -210 677 728 ; +C -1 ; WX 823 ; N product ; B 79 -210 744 728 ; +C -1 ; WX 549 ; N pi1 ; B 0 0 588 519 ; +C -1 ; WX 274 ; N integral ; B 0 -107 273 910 ; +C -1 ; WX 768 ; N Ohm ; B 27 0 747 734 ; +C -1 ; WX 549 ; N radical ; B 42 -38 550 913 ; +C -1 ; WX 549 ; N approxequal ; B 15 135 534 569 ; +C -1 ; WX 612 ; N increment ; B 14 0 600 677 ; +C -1 ; WX 494 ; N lozenge ; B 23 0 472 694 ; +C -1 ; WX 167 ; N fraction ; B -249 -30 492 725 ; +C -1 ; WX 611 ; N fi ; B 58 0 662 728 ; +C -1 ; WX 611 ; N fl ; B 57 0 661 728 ; +C -1 ; WX 278 ; N dotlessi ; B 40 0 289 519 ; +C -1 ; WX 333 ; N macron ; B 85 603 417 697 ; +C -1 ; WX 333 ; N breve ; B 84 585 391 727 ; +C -1 ; WX 333 ; N dotaccent ; B 163 599 330 728 ; +C -1 ; WX 333 ; N ring ; B 150 565 339 754 ; +C -1 ; WX 333 ; N hungarumlaut ; B 33 583 466 728 ; +C -1 ; WX 333 ; N ogonek ; B 62 -208 271 9 ; +C -1 ; WX 333 ; N caron ; B 109 584 445 731 ; +C -1 ; WX 611 ; N Lslash ; B 15 0 585 716 ; +C -1 ; WX 278 ; N lslash ; B 30 0 331 716 ; +C -1 ; WX 584 ; N minus ; B 42 289 542 417 ; +C -1 ; WX 556 ; N franc ; B -8 0 631 716 ; +C -1 ; WX 778 ; N Gbreve ; B 88 -12 786 888 ; +C -1 ; WX 611 ; N gbreve ; B 31 -210 623 727 ; +C -1 ; WX 278 ; N Idot ; B 35 0 364 884 ; +C -1 ; WX 667 ; N Scedilla ; B 62 -208 676 728 ; +C -1 ; WX 556 ; N scedilla ; B 22 -204 552 531 ; +C -1 ; WX 722 ; N Cacute ; B 95 -13 746 904 ; +C -1 ; WX 556 ; N cacute ; B 60 -12 564 730 ; +C -1 ; WX 722 ; N Ccaron ; B 95 -13 746 902 ; +C -1 ; WX 556 ; N ccaron ; B 60 -12 579 731 ; +C -1 ; WX 611 ; N dmacron ; B 59 -12 728 716 ; +C -1 ; WX 333 ; N middot ; B 258 290 424 426 ; +C -1 ; WX 722 ; N Abreve ; B -11 0 673 888 ; +C -1 ; WX 556 ; N abreve ; B 45 -12 542 727 ; +C -1 ; WX 722 ; N Aogonek ; B -11 -208 714 716 ; +C -1 ; WX 556 ; N aogonek ; B 45 -208 537 531 ; +C -1 ; WX 722 ; N Dcaron ; B 43 0 725 905 ; +C -1 ; WX 740 ; N dcaron ; B 59 -12 855 716 ; +C -1 ; WX 722 ; N Dslash ; B 37 0 725 716 ; +C -1 ; WX 667 ; N Eogonek ; B 41 -208 721 716 ; +C -1 ; WX 556 ; N eogonek ; B 58 -208 555 531 ; +C -1 ; WX 667 ; N Ecaron ; B 41 0 721 905 ; +C -1 ; WX 556 ; N ecaron ; B 58 -12 555 731 ; +C -1 ; WX 611 ; N Lacute ; B 45 0 582 904 ; +C -1 ; WX 278 ; N lacute ; B 39 0 423 899 ; +C -1 ; WX 611 ; N Lcaron ; B 45 0 612 716 ; +C -1 ; WX 396 ; N lcaron ; B 38 0 513 716 ; +C -1 ; WX 611 ; N Ldot ; B 45 0 582 716 ; +C -1 ; WX 479 ; N ldot ; B 39 0 461 716 ; +C -1 ; WX 722 ; N Nacute ; B 45 0 763 904 ; +C -1 ; WX 611 ; N nacute ; B 42 0 591 730 ; +C -1 ; WX 722 ; N Ncaron ; B 45 0 763 905 ; +C -1 ; WX 611 ; N ncaron ; B 42 0 595 731 ; +C -1 ; WX 778 ; N Odblacute ; B 87 -13 784 901 ; +C -1 ; WX 611 ; N odblacute ; B 61 -12 623 728 ; +C -1 ; WX 722 ; N Racute ; B 44 0 741 904 ; +C -1 ; WX 389 ; N racute ; B 32 0 492 730 ; +C -1 ; WX 722 ; N Rcaron ; B 44 0 741 905 ; +C -1 ; WX 389 ; N rcaron ; B 32 0 520 731 ; +C -1 ; WX 667 ; N Sacute ; B 62 -12 676 904 ; +C -1 ; WX 556 ; N sacute ; B 22 -12 552 730 ; +C -1 ; WX 611 ; N Tcedilla ; B 120 -298 709 716 ; +C -1 ; WX 333 ; N tcedilla ; B 66 -274 391 698 ; +C -1 ; WX 611 ; N Tcaron ; B 120 0 709 905 ; +C -1 ; WX 479 ; N tcaron ; B 77 -12 595 716 ; +C -1 ; WX 722 ; N Uring ; B 91 -12 765 905 ; +C -1 ; WX 611 ; N uring ; B 70 -12 619 754 ; +C -1 ; WX 722 ; N Udblacute ; B 91 -12 765 901 ; +C -1 ; WX 611 ; N udblacute ; B 70 -12 652 728 ; +C -1 ; WX 611 ; N Zacute ; B 25 0 668 904 ; +C -1 ; WX 500 ; N zacute ; B 17 0 519 730 ; +C -1 ; WX 611 ; N Zdot ; B 25 0 668 884 ; +C -1 ; WX 500 ; N zdot ; B 17 0 519 728 ; +C -1 ; WX 610 ; N Gamma ; B 43 0 705 716 ; +C -1 ; WX 778 ; N Theta ; B 87 -12 784 728 ; +C -1 ; WX 822 ; N Phi ; B 88 -29 833 733 ; +C -1 ; WX 620 ; N alpha ; B 61 -12 662 531 ; +C -1 ; WX 610 ; N delta ; B 62 -12 656 716 ; +C -1 ; WX 479 ; N epsilon ; B 43 -12 513 531 ; +C -1 ; WX 664 ; N sigma ; B 61 -12 717 531 ; +C -1 ; WX 409 ; N tau ; B 79 0 466 519 ; +C -1 ; WX 704 ; N phi ; B 61 -198 693 531 ; +C -1 ; WX 552 ; N underscoredbl ; B -9 -376 561 -109 ; +C -1 ; WX 604 ; N exclamdbl ; B 62 0 624 716 ; +C -1 ; WX 396 ; N nsuperior ; B 59 250 430 583 ; +C -1 ; WX 1104 ; N peseta ; B 10 -13 1088 716 ; +C -1 ; WX 1000 ; N arrowleft ; B 39 77 961 428 ; +C -1 ; WX 500 ; N arrowup ; B 75 -209 426 654 ; +C -1 ; WX 1000 ; N arrowright ; B 39 77 961 428 ; +C -1 ; WX 500 ; N arrowdown ; B 75 -209 426 654 ; +C -1 ; WX 1000 ; N arrowboth ; B 39 77 961 429 ; +C -1 ; WX 500 ; N arrowupdn ; B 74 -208 425 714 ; +C -1 ; WX 500 ; N arrowupdnbse ; B 74 -303 425 714 ; +C -1 ; WX 979 ; N orthogonal ; B 177 0 802 625 ; +C -1 ; WX 722 ; N intersection ; B 70 0 648 719 ; +C -1 ; WX 583 ; N equivalence ; B 42 73 542 633 ; +C -1 ; WX 604 ; N house ; B 77 0 527 563 ; +C -1 ; WX 584 ; N revlogicalnot ; B 42 184 542 524 ; +C -1 ; WX 604 ; N integraltp ; B 267 -251 477 848 ; +C -1 ; WX 604 ; N integralbt ; B 127 -251 337 848 ; +C -1 ; WX 708 ; N SF100000 ; B -11 261 719 346 ; +C -1 ; WX 625 ; N SF110000 ; B 223 -303 309 910 ; +C -1 ; WX 708 ; N SF010000 ; B 312 -303 720 346 ; +C -1 ; WX 708 ; N SF030000 ; B -11 -303 396 346 ; +C -1 ; WX 708 ; N SF020000 ; B 312 261 720 910 ; +C -1 ; WX 708 ; N SF040000 ; B -11 261 396 910 ; +C -1 ; WX 708 ; N SF080000 ; B 312 -303 720 910 ; +C -1 ; WX 708 ; N SF090000 ; B -11 -303 396 910 ; +C -1 ; WX 708 ; N SF060000 ; B -11 -303 719 346 ; +C -1 ; WX 708 ; N SF070000 ; B -11 261 719 910 ; +C -1 ; WX 708 ; N SF050000 ; B -11 -303 719 910 ; +C -1 ; WX 708 ; N SF430000 ; B -11 168 719 439 ; +C -1 ; WX 708 ; N SF240000 ; B 219 -303 490 910 ; +C -1 ; WX 708 ; N SF510000 ; B 312 -303 720 439 ; +C -1 ; WX 708 ; N SF520000 ; B 219 -303 720 346 ; +C -1 ; WX 708 ; N SF390000 ; B 219 -303 719 439 ; +C -1 ; WX 708 ; N SF220000 ; B -11 -303 396 439 ; +C -1 ; WX 708 ; N SF210000 ; B -11 -303 489 346 ; +C -1 ; WX 708 ; N SF250000 ; B -11 -303 489 439 ; +C -1 ; WX 708 ; N SF500000 ; B 312 168 720 910 ; +C -1 ; WX 708 ; N SF490000 ; B 219 261 720 910 ; +C -1 ; WX 708 ; N SF380000 ; B 219 168 719 910 ; +C -1 ; WX 708 ; N SF280000 ; B -11 168 396 910 ; +C -1 ; WX 708 ; N SF270000 ; B -11 261 489 910 ; +C -1 ; WX 708 ; N SF260000 ; B -11 168 489 910 ; +C -1 ; WX 708 ; N SF360000 ; B 312 -303 720 910 ; +C -1 ; WX 708 ; N SF370000 ; B 219 -303 720 910 ; +C -1 ; WX 708 ; N SF420000 ; B 219 -303 720 910 ; +C -1 ; WX 708 ; N SF190000 ; B -11 -303 396 910 ; +C -1 ; WX 708 ; N SF200000 ; B -11 -303 489 910 ; +C -1 ; WX 708 ; N SF230000 ; B -11 -303 489 910 ; +C -1 ; WX 708 ; N SF470000 ; B -11 -303 719 439 ; +C -1 ; WX 708 ; N SF480000 ; B -11 -303 719 346 ; +C -1 ; WX 708 ; N SF410000 ; B -11 -303 719 439 ; +C -1 ; WX 708 ; N SF450000 ; B -11 168 719 910 ; +C -1 ; WX 708 ; N SF460000 ; B -11 261 719 910 ; +C -1 ; WX 708 ; N SF400000 ; B -11 168 719 910 ; +C -1 ; WX 708 ; N SF540000 ; B -11 -303 719 910 ; +C -1 ; WX 708 ; N SF530000 ; B -11 -303 719 910 ; +C -1 ; WX 708 ; N SF440000 ; B -11 -303 719 910 ; +C -1 ; WX 708 ; N upblock ; B -11 303 719 910 ; +C -1 ; WX 708 ; N dnblock ; B -11 -303 719 303 ; +C -1 ; WX 708 ; N block ; B -11 -303 719 910 ; +C -1 ; WX 708 ; N lfblock ; B -11 -303 354 910 ; +C -1 ; WX 708 ; N rtblock ; B 354 -303 720 910 ; +C -1 ; WX 708 ; N ltshade ; B 50 -246 719 910 ; +C -1 ; WX 708 ; N shade ; B -11 -246 719 910 ; +C -1 ; WX 729 ; N dkshade ; B 0 -307 729 910 ; +C -1 ; WX 604 ; N filledbox ; B 71 0 532 461 ; +C -1 ; WX 1000 ; N filledrect ; B 0 155 1000 343 ; +C -1 ; WX 990 ; N triagup ; B 148 0 842 693 ; +C -1 ; WX 990 ; N triagrt ; B 141 -15 849 692 ; +C -1 ; WX 990 ; N triagdn ; B 148 -15 842 678 ; +C -1 ; WX 990 ; N triaglf ; B 141 -15 849 692 ; +C -1 ; WX 604 ; N circle ; B 87 67 517 497 ; +C -1 ; WX 604 ; N invbullet ; B 63 0 541 479 ; +C -1 ; WX 604 ; N invcircle ; B 21 0 584 564 ; +C -1 ; WX 1021 ; N smileface ; B 199 -58 822 564 ; +C -1 ; WX 1052 ; N invsmileface ; B 215 -58 837 564 ; +C -1 ; WX 917 ; N sun ; B 8 -109 909 792 ; +C -1 ; WX 750 ; N female ; B 119 -214 630 736 ; +C -1 ; WX 750 ; N male ; B 54 -128 691 791 ; +C -1 ; WX 531 ; N spade ; B 28 0 503 601 ; +C -1 ; WX 656 ; N club ; B 27 0 629 601 ; +C -1 ; WX 594 ; N heart ; B 31 -12 563 601 ; +C -1 ; WX 510 ; N diamond ; B 31 -12 479 601 ; +C -1 ; WX 500 ; N musicalnote ; B 18 -18 482 666 ; +C -1 ; WX 750 ; N musicalnotedbl ; B 42 -63 649 742 ; +C -1 ; WX 782 ; N IJ ; B 35 -12 830 716 ; +C -1 ; WX 556 ; N ij ; B 46 -210 604 716 ; +C -1 ; WX 708 ; N napostrophe ; B 41 0 685 716 ; +C -1 ; WX 240 ; N minute ; B 151 461 329 716 ; +C -1 ; WX 479 ; N second ; B 151 461 507 716 ; +C -1 ; WX 885 ; N afii61248 ; B 69 -31 895 728 ; +C -1 ; WX 516 ; N afii61289 ; B 47 -12 542 728 ; +C -1 ; WX 604 ; N H22073 ; B 71 0 532 461 ; +C -1 ; WX 354 ; N H18543 ; B 45 198 310 463 ; +C -1 ; WX 354 ; N H18551 ; B 45 198 310 463 ; +C -1 ; WX 604 ; N H18533 ; B 87 67 517 497 ; +C -1 ; WX 354 ; N openbullet ; B 55 208 300 453 ; +C -1 ; WX 722 ; N Amacron ; B -11 0 673 874 ; +C -1 ; WX 556 ; N amacron ; B 45 -12 539 697 ; +C -1 ; WX 722 ; N Ccircumflex ; B 95 -13 746 927 ; +C -1 ; WX 556 ; N ccircumflex ; B 60 -12 564 731 ; +C -1 ; WX 722 ; N Cdot ; B 95 -13 746 909 ; +C -1 ; WX 556 ; N cdot ; B 60 -12 564 728 ; +C -1 ; WX 667 ; N Emacron ; B 41 0 721 874 ; +C -1 ; WX 556 ; N emacron ; B 58 -12 555 697 ; +C -1 ; WX 667 ; N Ebreve ; B 41 0 721 917 ; +C -1 ; WX 556 ; N ebreve ; B 58 -12 555 727 ; +C -1 ; WX 667 ; N Edot ; B 41 0 721 909 ; +C -1 ; WX 556 ; N edot ; B 58 -12 555 728 ; +C -1 ; WX 778 ; N Gcircumflex ; B 88 -12 786 927 ; +C -1 ; WX 611 ; N gcircumflex ; B 31 -210 623 731 ; +C -1 ; WX 778 ; N Gdot ; B 88 -12 786 909 ; +C -1 ; WX 611 ; N gdot ; B 31 -210 623 728 ; +C -1 ; WX 778 ; N Gcedilla ; B 88 -208 786 728 ; +C -1 ; WX 611 ; N gcedilla ; B 31 -210 623 801 ; +C -1 ; WX 722 ; N Hcircumflex ; B 43 0 765 927 ; +C -1 ; WX 611 ; N hcircumflex ; B 42 0 601 905 ; +C -1 ; WX 722 ; N Hbar ; B 43 0 818 716 ; +C -1 ; WX 611 ; N hbar ; B 42 0 591 716 ; +C -1 ; WX 278 ; N Itilde ; B 35 0 447 898 ; +C -1 ; WX 278 ; N itilde ; B 40 0 409 710 ; +C -1 ; WX 278 ; N Imacron ; B 35 0 443 874 ; +C -1 ; WX 278 ; N imacron ; B 40 0 405 697 ; +C -1 ; WX 278 ; N Ibreve ; B 35 0 451 917 ; +C -1 ; WX 278 ; N ibreve ; B 40 0 409 727 ; +C -1 ; WX 278 ; N Iogonek ; B 7 -208 332 716 ; +C -1 ; WX 278 ; N iogonek ; B 13 -208 330 716 ; +C -1 ; WX 556 ; N Jcircumflex ; B 29 -12 687 927 ; +C -1 ; WX 278 ; N jcircumflex ; B -109 -210 386 731 ; +C -1 ; WX 722 ; N Kcedilla ; B 40 -208 801 716 ; +C -1 ; WX 556 ; N kcedilla ; B 38 -208 614 716 ; +C -1 ; WX 556 ; N kgreenlandic ; B 40 0 617 519 ; +C -1 ; WX 611 ; N Lcedilla ; B 45 -208 582 716 ; +C -1 ; WX 278 ; N lcedilla ; B -57 -208 329 716 ; +C -1 ; WX 722 ; N Ncedilla ; B 45 -208 763 716 ; +C -1 ; WX 611 ; N ncedilla ; B 42 -208 591 531 ; +C -1 ; WX 723 ; N Eng ; B 48 -13 735 728 ; +C -1 ; WX 611 ; N eng ; B 40 -210 589 531 ; +C -1 ; WX 778 ; N Omacron ; B 87 -13 784 874 ; +C -1 ; WX 611 ; N omacron ; B 61 -12 599 697 ; +C -1 ; WX 778 ; N Obreve ; B 87 -13 784 917 ; +C -1 ; WX 611 ; N obreve ; B 61 -12 599 727 ; +C -1 ; WX 722 ; N Rcedilla ; B 44 -208 741 716 ; +C -1 ; WX 389 ; N rcedilla ; B -20 -208 474 531 ; +C -1 ; WX 667 ; N Scircumflex ; B 62 -12 676 927 ; +C -1 ; WX 556 ; N scircumflex ; B 22 -12 552 731 ; +C -1 ; WX 611 ; N Tbar ; B 100 0 709 716 ; +C -1 ; WX 333 ; N tbar ; B 21 -12 391 698 ; +C -1 ; WX 722 ; N Utilde ; B 91 -12 765 898 ; +C -1 ; WX 611 ; N utilde ; B 70 -12 619 710 ; +C -1 ; WX 722 ; N Umacron ; B 91 -12 765 874 ; +C -1 ; WX 611 ; N umacron ; B 70 -12 619 697 ; +C -1 ; WX 722 ; N Ubreve ; B 91 -12 765 917 ; +C -1 ; WX 611 ; N ubreve ; B 70 -12 619 727 ; +C -1 ; WX 722 ; N Uogonek ; B 91 -208 765 716 ; +C -1 ; WX 611 ; N uogonek ; B 70 -208 619 519 ; +C -1 ; WX 944 ; N Wcircumflex ; B 117 0 1068 927 ; +C -1 ; WX 778 ; N wcircumflex ; B 72 0 840 731 ; +C -1 ; WX 667 ; N Ycircumflex ; B 115 0 785 927 ; +C -1 ; WX 556 ; N ycircumflex ; B 6 -210 621 731 ; +C -1 ; WX 278 ; N longs ; B 39 0 456 728 ; +C -1 ; WX 722 ; N Aringacute ; B -11 -9 673 1000 ; +C -1 ; WX 556 ; N aringacute ; B 45 -12 588 927 ; +C -1 ; WX 1000 ; N AEacute ; B -32 0 1059 927 ; +C -1 ; WX 889 ; N aeacute ; B 31 -12 866 730 ; +C -1 ; WX 778 ; N Oslashacute ; B 78 -60 787 927 ; +C -1 ; WX 611 ; N oslashacute ; B 53 -52 604 730 ; +C -1 ; WX 333 ; N anoteleia ; B 150 383 317 519 ; +C -1 ; WX 944 ; N Wgrave ; B 117 0 1068 926 ; +C -1 ; WX 778 ; N wgrave ; B 72 0 840 732 ; +C -1 ; WX 944 ; N Wacute ; B 117 0 1068 927 ; +C -1 ; WX 778 ; N wacute ; B 72 0 840 730 ; +C -1 ; WX 944 ; N Wdieresis ; B 117 0 1068 900 ; +C -1 ; WX 778 ; N wdieresis ; B 72 0 840 717 ; +C -1 ; WX 667 ; N Ygrave ; B 115 0 785 926 ; +C -1 ; WX 556 ; N ygrave ; B 6 -210 621 732 ; +C -1 ; WX 278 ; N quotereversed ; B 150 425 325 716 ; +C -1 ; WX 333 ; N radicalex ; B 74 603 465 697 ; +C -1 ; WX 556 ; N afii08941 ; B 21 -18 610 728 ; +C -1 ; WX 600 ; N estimated ; B 44 -17 561 535 ; +C -1 ; WX 834 ; N oneeighth ; B 85 -30 833 725 ; +C -1 ; WX 834 ; N threeeighths ; B 77 -30 833 725 ; +C -1 ; WX 834 ; N fiveeighths ; B 83 -30 833 725 ; +C -1 ; WX 834 ; N seveneighths ; B 56 -30 833 725 ; +C -1 ; WX 333 ; N commaaccent ; B 14 -274 205 -53 ; +C -1 ; WX 333 ; N undercommaaccent ; B -30 -208 230 -12 ; +C -1 ; WX 333 ; N tonos ; B 184 584 435 730 ; +C -1 ; WX 333 ; N dieresistonos ; B -10 584 519 730 ; +C -1 ; WX 722 ; N Alphatonos ; B -9 0 675 716 ; +C -1 ; WX 854 ; N Epsilontonos ; B 56 0 909 716 ; +C -1 ; WX 906 ; N Etatonos ; B 56 0 950 716 ; +C -1 ; WX 473 ; N Iotatonos ; B 56 0 525 716 ; +C -1 ; WX 844 ; N Omicrontonos ; B 50 -12 849 728 ; +C -1 ; WX 930 ; N Upsilontonos ; B 64 0 1048 716 ; +C -1 ; WX 847 ; N Omegatonos ; B 50 0 846 728 ; +C -1 ; WX 278 ; N iotadieresistonos ; B -16 0 513 730 ; +C -1 ; WX 722 ; N Alpha ; B -11 0 673 716 ; +C -1 ; WX 722 ; N Beta ; B 40 0 710 716 ; +C -1 ; WX 671 ; N Delta ; B -39 0 646 716 ; +C -1 ; WX 667 ; N Epsilon ; B 41 0 721 716 ; +C -1 ; WX 611 ; N Zeta ; B 25 0 668 716 ; +C -1 ; WX 722 ; N Eta ; B 43 0 765 716 ; +C -1 ; WX 278 ; N Iota ; B 35 0 332 716 ; +C -1 ; WX 722 ; N Kappa ; B 40 0 801 716 ; +C -1 ; WX 667 ; N Lambda ; B -39 0 642 716 ; +C -1 ; WX 833 ; N Mu ; B 41 0 878 716 ; +C -1 ; WX 722 ; N Nu ; B 45 0 763 716 ; +C -1 ; WX 657 ; N Xi ; B 11 0 712 716 ; +C -1 ; WX 778 ; N Omicron ; B 87 -13 784 728 ; +C -1 ; WX 718 ; N Pi ; B 44 0 766 716 ; +C -1 ; WX 667 ; N Rho ; B 41 0 702 716 ; +C -1 ; WX 590 ; N Sigma ; B 19 0 679 716 ; +C -1 ; WX 611 ; N Tau ; B 120 0 709 716 ; +C -1 ; WX 667 ; N Upsilon ; B 115 0 785 716 ; +C -1 ; WX 667 ; N Chi ; B -30 0 784 716 ; +C -1 ; WX 829 ; N Psi ; B 113 0 884 716 ; +C -1 ; WX 781 ; N Omega ; B 9 0 779 728 ; +C -1 ; WX 278 ; N Iotadieresis ; B 35 0 442 876 ; +C -1 ; WX 667 ; N Upsilondieresis ; B 115 0 785 876 ; +C -1 ; WX 620 ; N alphatonos ; B 61 -12 662 730 ; +C -1 ; WX 479 ; N epsilontonos ; B 43 -12 513 730 ; +C -1 ; WX 611 ; N etatonos ; B 41 -198 590 730 ; +C -1 ; WX 278 ; N iotatonos ; B 40 0 405 730 ; +C -1 ; WX 591 ; N upsilondieresistonos ; B 74 -12 653 730 ; +C -1 ; WX 621 ; N beta ; B -6 -198 614 728 ; +C -1 ; WX 556 ; N gamma ; B 77 -198 621 519 ; +C -1 ; WX 492 ; N zeta ; B 52 -210 604 716 ; +C -1 ; WX 611 ; N eta ; B 41 -198 590 531 ; +C -1 ; WX 558 ; N theta ; B 73 -12 580 728 ; +C -1 ; WX 278 ; N iota ; B 40 0 289 519 ; +C -1 ; WX 566 ; N kappa ; B 41 0 622 519 ; +C -1 ; WX 556 ; N lambda ; B -13 0 531 716 ; +C -1 ; WX 603 ; N mu ; B -4 -198 617 519 ; +C -1 ; WX 556 ; N nu ; B 75 0 618 519 ; +C -1 ; WX 450 ; N xi ; B 55 -210 519 728 ; +C -1 ; WX 611 ; N omicron ; B 61 -12 599 531 ; +C -1 ; WX 605 ; N rho ; B -14 -198 596 531 ; +C -1 ; WX 532 ; N sigma1 ; B 62 -210 589 531 ; +C -1 ; WX 591 ; N upsilon ; B 74 -12 612 519 ; +C -1 ; WX 578 ; N chi ; B -80 -198 644 519 ; +C -1 ; WX 773 ; N psi ; B 75 -198 793 519 ; +C -1 ; WX 834 ; N omega ; B 64 -12 826 519 ; +C -1 ; WX 278 ; N iotadieresis ; B 40 0 410 717 ; +C -1 ; WX 591 ; N upsilondieresis ; B 74 -12 612 717 ; +C -1 ; WX 611 ; N omicrontonos ; B 61 -12 599 730 ; +C -1 ; WX 591 ; N upsilontonos ; B 74 -12 612 730 ; +C -1 ; WX 834 ; N omegatonos ; B 64 -12 826 730 ; +C -1 ; WX 667 ; N afii10023 ; B 41 0 721 876 ; +C -1 ; WX 886 ; N afii10051 ; B 129 -6 874 716 ; +C -1 ; WX 719 ; N afii10053 ; B 87 -12 739 728 ; +C -1 ; WX 667 ; N afii10054 ; B 62 -12 676 728 ; +C -1 ; WX 278 ; N afii10055 ; B 35 0 332 716 ; +C -1 ; WX 278 ; N afii10056 ; B 35 0 442 876 ; +C -1 ; WX 556 ; N afii10057 ; B 29 -12 600 716 ; +C -1 ; WX 1094 ; N afii10058 ; B -21 -12 1074 716 ; +C -1 ; WX 1042 ; N afii10059 ; B 43 0 1021 716 ; +C -1 ; WX 854 ; N afii10060 ; B 120 0 833 716 ; +C -1 ; WX 677 ; N afii10062 ; B 76 -11 794 899 ; +C -1 ; WX 722 ; N afii10017 ; B -11 0 673 716 ; +C -1 ; WX 708 ; N afii10018 ; B 45 0 709 716 ; +C -1 ; WX 722 ; N afii10019 ; B 40 0 710 716 ; +C -1 ; WX 614 ; N afii10020 ; B 44 0 723 716 ; +C -1 ; WX 722 ; N afii10021 ; B -75 -198 756 716 ; +C -1 ; WX 667 ; N afii10022 ; B 41 0 721 716 ; +C -1 ; WX 927 ; N afii10024 ; B -15 0 1016 720 ; +C -1 ; WX 643 ; N afii10025 ; B 37 -12 649 728 ; +C -1 ; WX 719 ; N afii10026 ; B 43 0 765 716 ; +C -1 ; WX 719 ; N afii10027 ; B 43 0 765 899 ; +C -1 ; WX 615 ; N afii10028 ; B 43 0 701 716 ; +C -1 ; WX 687 ; N afii10029 ; B -19 -11 731 716 ; +C -1 ; WX 833 ; N afii10030 ; B 41 0 878 716 ; +C -1 ; WX 722 ; N afii10031 ; B 43 0 765 716 ; +C -1 ; WX 778 ; N afii10032 ; B 87 -13 784 728 ; +C -1 ; WX 719 ; N afii10033 ; B 43 0 764 716 ; +C -1 ; WX 667 ; N afii10034 ; B 41 0 702 716 ; +C -1 ; WX 722 ; N afii10035 ; B 95 -13 746 728 ; +C -1 ; WX 611 ; N afii10036 ; B 120 0 709 716 ; +C -1 ; WX 677 ; N afii10037 ; B 76 -11 794 716 ; +C -1 ; WX 781 ; N afii10038 ; B 84 -6 790 716 ; +C -1 ; WX 667 ; N afii10039 ; B -30 0 784 716 ; +C -1 ; WX 729 ; N afii10040 ; B 40 -198 762 716 ; +C -1 ; WX 708 ; N afii10041 ; B 129 0 752 716 ; +C -1 ; WX 979 ; N afii10042 ; B 43 0 1021 716 ; +C -1 ; WX 989 ; N afii10043 ; B 43 -198 1021 716 ; +C -1 ; WX 854 ; N afii10044 ; B 105 0 833 716 ; +C -1 ; WX 1000 ; N afii10045 ; B 40 0 1036 716 ; +C -1 ; WX 708 ; N afii10046 ; B 40 0 682 716 ; +C -1 ; WX 719 ; N afii10047 ; B 73 -12 725 728 ; +C -1 ; WX 1042 ; N afii10048 ; B 43 -12 1045 728 ; +C -1 ; WX 729 ; N afii10049 ; B -21 0 774 716 ; +C -1 ; WX 556 ; N afii10065 ; B 45 -12 533 531 ; +C -1 ; WX 619 ; N afii10066 ; B 64 -12 655 748 ; +C -1 ; WX 604 ; N afii10067 ; B 63 -12 567 530 ; +C -1 ; WX 534 ; N afii10068 ; B 32 -12 515 530 ; +C -1 ; WX 618 ; N afii10069 ; B 60 -12 625 748 ; +C -1 ; WX 556 ; N afii10070 ; B 58 -12 555 531 ; +C -1 ; WX 736 ; N afii10072 ; B -25 0 788 519 ; +C -1 ; WX 510 ; N afii10073 ; B 14 -12 489 530 ; +C -1 ; WX 611 ; N afii10074 ; B 70 -12 619 519 ; +C -1 ; WX 611 ; N afii10075 ; B 70 -12 619 727 ; +C -1 ; WX 507 ; N afii10076 ; B 37 0 567 519 ; +C -1 ; WX 622 ; N afii10077 ; B -24 -12 633 519 ; +C -1 ; WX 740 ; N afii10078 ; B 39 0 748 519 ; +C -1 ; WX 604 ; N afii10079 ; B 35 0 616 519 ; +C -1 ; WX 611 ; N afii10080 ; B 61 -12 599 531 ; +C -1 ; WX 611 ; N afii10081 ; B 39 0 619 519 ; +C -1 ; WX 611 ; N afii10082 ; B -5 -198 605 531 ; +C -1 ; WX 556 ; N afii10083 ; B 60 -12 564 531 ; +C -1 ; WX 889 ; N afii10084 ; B 36 0 869 531 ; +C -1 ; WX 556 ; N afii10085 ; B 6 -210 621 519 ; +C -1 ; WX 885 ; N afii10086 ; B 63 -203 876 728 ; +C -1 ; WX 556 ; N afii10087 ; B -22 0 612 519 ; +C -1 ; WX 646 ; N afii10088 ; B 66 -161 624 519 ; +C -1 ; WX 583 ; N afii10089 ; B 99 0 594 519 ; +C -1 ; WX 889 ; N afii10090 ; B 70 -12 901 519 ; +C -1 ; WX 935 ; N afii10091 ; B 70 -159 912 519 ; +C -1 ; WX 707 ; N afii10092 ; B 68 0 678 519 ; +C -1 ; WX 854 ; N afii10093 ; B 40 0 868 519 ; +C -1 ; WX 594 ; N afii10094 ; B 35 0 570 519 ; +C -1 ; WX 552 ; N afii10095 ; B 37 -12 540 530 ; +C -1 ; WX 865 ; N afii10096 ; B 40 -12 850 530 ; +C -1 ; WX 589 ; N afii10097 ; B -20 0 599 519 ; +C -1 ; WX 556 ; N afii10071 ; B 58 -12 555 717 ; +C -1 ; WX 611 ; N afii10099 ; B 42 -210 591 716 ; +C -1 ; WX 469 ; N afii10100 ; B 35 0 552 730 ; +C -1 ; WX 563 ; N afii10101 ; B 64 -12 568 530 ; +C -1 ; WX 556 ; N afii10102 ; B 22 -12 552 531 ; +C -1 ; WX 278 ; N afii10103 ; B 40 0 330 716 ; +C -1 ; WX 278 ; N afii10104 ; B 40 0 410 717 ; +C -1 ; WX 278 ; N afii10105 ; B -109 -210 331 716 ; +C -1 ; WX 969 ; N afii10106 ; B -24 -12 942 519 ; +C -1 ; WX 906 ; N afii10107 ; B 40 0 880 519 ; +C -1 ; WX 611 ; N afii10108 ; B 42 0 591 716 ; +C -1 ; WX 556 ; N afii10110 ; B 6 -210 621 727 ; +C -1 ; WX 611 ; N afii10193 ; B 70 -199 619 519 ; +C -1 ; WX 575 ; N afii10050 ; B 43 0 736 914 ; +C -1 ; WX 467 ; N afii10098 ; B 27 0 581 697 ; +C -1 ; WX 1000 ; N afii00208 ; B 37 208 999 311 ; +C -1 ; WX 1146 ; N afii61352 ; B 43 0 1157 716 ; +C -1 ; WX 712 ; N pi ; B 79 0 770 519 ; +C -1 ; WX 333 ; N sheva ; B 68 -306 179 -98 ; +C -1 ; WX 333 ; N hatafsegol ; B -16 -306 290 -98 ; +C -1 ; WX 333 ; N hatafpatah ; B -9 -306 280 -98 ; +C -1 ; WX 333 ; N hatafqamats ; B -9 -306 280 -98 ; +C -1 ; WX 333 ; N hiriq ; B 95 -180 179 -98 ; +C -1 ; WX 333 ; N tsere ; B 31 -180 244 -98 ; +C -1 ; WX 333 ; N segol ; B 31 -306 243 -98 ; +C -1 ; WX 333 ; N patah ; B 36 -154 243 -103 ; +C -1 ; WX 333 ; N qamats ; B 36 -236 243 -103 ; +C -1 ; WX 333 ; N holam ; B 256 577 340 659 ; +C -1 ; WX 333 ; N qubuts ; B -23 -306 270 -98 ; +C -1 ; WX 333 ; N dagesh ; B 185 241 269 323 ; +C -1 ; WX 333 ; N meteg ; B 78 -299 170 -103 ; +C -1 ; WX 447 ; N maqaf ; B 148 408 497 518 ; +C -1 ; WX 333 ; N rafe ; B 198 611 405 662 ; +C -1 ; WX 299 ; N paseq ; B 76 -101 333 620 ; +C -1 ; WX 333 ; N shindot ; B 506 577 590 660 ; +C -1 ; WX 333 ; N sindot ; B 6 577 93 660 ; +C -1 ; WX 333 ; N sofpasuq ; B 98 0 346 519 ; +C -1 ; WX 583 ; N alef ; B 44 0 645 518 ; +C -1 ; WX 576 ; N bet ; B 38 0 579 524 ; +C -1 ; WX 457 ; N gimel ; B 5 0 449 524 ; +C -1 ; WX 550 ; N dalet ; B 109 0 636 518 ; +C -1 ; WX 614 ; N he ; B 69 0 620 524 ; +C -1 ; WX 273 ; N vav ; B 66 0 317 518 ; +C -1 ; WX 413 ; N zayin ; B 129 0 506 518 ; +C -1 ; WX 616 ; N het ; B 66 0 619 524 ; +C -1 ; WX 626 ; N tet ; B 109 -12 650 530 ; +C -1 ; WX 273 ; N yod ; B 115 229 317 518 ; +C -1 ; WX 521 ; N finalkaf ; B 114 -199 529 524 ; +C -1 ; WX 491 ; N kaf ; B 38 -8 515 526 ; +C -1 ; WX 496 ; N lamed ; B 117 0 555 716 ; +C -1 ; WX 611 ; N finalmem ; B 66 0 619 524 ; +C -1 ; WX 630 ; N mem ; B 51 0 631 524 ; +C -1 ; WX 273 ; N finalnun ; B 23 -199 317 518 ; +C -1 ; WX 386 ; N nun ; B 44 0 402 524 ; +C -1 ; WX 613 ; N samekh ; B 85 -12 637 530 ; +C -1 ; WX 543 ; N ayin ; B 5 -77 603 518 ; +C -1 ; WX 594 ; N finalpe ; B 104 -199 601 524 ; +C -1 ; WX 587 ; N pe ; B 54 -8 612 527 ; +C -1 ; WX 500 ; N finaltsadi ; B 115 -199 568 518 ; +C -1 ; WX 512 ; N tsadi ; B 35 0 573 518 ; +C -1 ; WX 573 ; N qof ; B 21 -199 632 518 ; +C -1 ; WX 521 ; N resh ; B 115 0 529 524 ; +C -1 ; WX 715 ; N shin ; B 110 -14 786 518 ; +C -1 ; WX 673 ; N tav ; B 25 -4 677 524 ; +C -1 ; WX 546 ; N doublevav ; B 23 -199 590 518 ; +C -1 ; WX 546 ; N vavyod ; B 115 -199 590 518 ; +C -1 ; WX 546 ; N doubleyod ; B 115 229 590 518 ; +C -1 ; WX 276 ; N geresh ; B 105 312 353 518 ; +C -1 ; WX 504 ; N gershayim ; B 105 312 581 518 ; +C -1 ; WX 818 ; N newsheqelsign ; B 66 0 862 518 ; +C -1 ; WX 273 ; N vavshindot ; B 66 0 317 660 ; +C -1 ; WX 521 ; N finalkafsheva ; B 114 -199 529 524 ; +C -1 ; WX 521 ; N finalkafqamats ; B 95 -199 529 524 ; +C -1 ; WX 496 ; N lamedholam ; B 16 0 555 716 ; +C -1 ; WX 496 ; N lamedholamdagesh ; B 16 0 555 716 ; +C -1 ; WX 559 ; N altayin ; B 24 0 618 518 ; +C -1 ; WX 715 ; N shinshindot ; B 110 -14 786 660 ; +C -1 ; WX 715 ; N shinsindot ; B 110 -14 786 660 ; +C -1 ; WX 715 ; N shindageshshindot ; B 110 -14 786 660 ; +C -1 ; WX 715 ; N shindageshsindot ; B 110 -14 786 660 ; +C -1 ; WX 583 ; N alefpatah ; B 44 -154 645 519 ; +C -1 ; WX 583 ; N alefqamats ; B 44 -236 645 519 ; +C -1 ; WX 583 ; N alefmapiq ; B 44 0 645 519 ; +C -1 ; WX 576 ; N betdagesh ; B 38 0 579 524 ; +C -1 ; WX 454 ; N gimeldagesh ; B 5 0 449 524 ; +C -1 ; WX 550 ; N daletdagesh ; B 109 0 636 518 ; +C -1 ; WX 614 ; N hedagesh ; B 69 0 620 524 ; +C -1 ; WX 323 ; N vavdagesh ; B 59 0 367 518 ; +C -1 ; WX 438 ; N zayindagesh ; B 55 0 522 519 ; +C -1 ; WX 626 ; N tetdagesh ; B 109 -12 650 530 ; +C -1 ; WX 323 ; N yoddagesh ; B 70 229 367 518 ; +C -1 ; WX 521 ; N finalkafdagesh ; B 114 -199 529 524 ; +C -1 ; WX 491 ; N kafdagesh ; B 38 -8 516 526 ; +C -1 ; WX 496 ; N lameddagesh ; B 117 0 555 716 ; +C -1 ; WX 630 ; N memdagesh ; B 51 0 631 524 ; +C -1 ; WX 386 ; N nundagesh ; B 44 0 402 524 ; +C -1 ; WX 613 ; N samekhdagesh ; B 85 -12 638 530 ; +C -1 ; WX 594 ; N finalpedagesh ; B 110 -199 600 524 ; +C -1 ; WX 587 ; N pedagesh ; B 54 -8 612 527 ; +C -1 ; WX 512 ; N tsadidagesh ; B 35 0 573 518 ; +C -1 ; WX 573 ; N qofdagesh ; B 21 -199 632 518 ; +C -1 ; WX 521 ; N reshdagesh ; B 115 0 530 524 ; +C -1 ; WX 715 ; N shindagesh ; B 110 -14 786 518 ; +C -1 ; WX 673 ; N tavdages ; B 25 -4 677 524 ; +C -1 ; WX 273 ; N vavholam ; B 66 0 317 660 ; +C -1 ; WX 576 ; N betrafe ; B 38 0 579 662 ; +C -1 ; WX 491 ; N kafrafe ; B 38 -8 515 662 ; +C -1 ; WX 587 ; N perafe ; B 54 -8 612 662 ; +C -1 ; WX 607 ; N aleflamed ; B 69 0 669 716 ; +C -1 ; WX 0 ; N zerowidthnonjoiner ; B -18 -134 18 629 ; +C -1 ; WX 0 ; N zerowidthjoiner ; B -107 -134 107 690 ; +C -1 ; WX 0 ; N lefttorightmark ; B -18 -134 210 690 ; +C -1 ; WX 0 ; N righttoleftmark ; B -210 -134 17 690 ; +C -1 ; WX 0 ; N uni202A ; B -18 -134 210 603 ; +C -1 ; WX 0 ; N uni202B ; B -210 -134 18 603 ; +C -1 ; WX 0 ; N uni202D ; B -114 -134 114 690 ; +C -1 ; WX 0 ; N uni202E ; B -114 -134 114 690 ; +C -1 ; WX 0 ; N uni202C ; B -114 -134 114 690 ; +C -1 ; WX 0 ; N uni206E ; B -114 -134 114 690 ; +C -1 ; WX 0 ; N uni206F ; B -114 -134 114 690 ; +C -1 ; WX 0 ; N uni206A ; B -114 -134 114 690 ; +C -1 ; WX 0 ; N uni206B ; B -114 -134 114 690 ; +C -1 ; WX 0 ; N uni206C ; B -114 -134 114 690 ; +C -1 ; WX 0 ; N uni206D ; B -114 -134 114 690 ; +C -1 ; WX 0 ; N uniF00A ; B -18 -208 18 894 ; +C -1 ; WX 0 ; N uniF00B ; B -114 -208 114 894 ; +C -1 ; WX 0 ; N uniF00C ; B -18 -208 109 894 ; +C -1 ; WX 0 ; N uniF00D ; B -109 -208 18 894 ; +C -1 ; WX 0 ; N uniF00E ; B -18 -208 114 894 ; +C -1 ; WX 1000 ; N uniFFFC ; B 0 0 1000 719 ; +C -1 ; WX 837 ; N _b_766 ; B 87 -13 959 728 ; +C -1 ; WX 671 ; N _b_767 ; B 61 -12 780 531 ; +C -1 ; WX 809 ; N _b_768 ; B 91 -12 949 716 ; +C -1 ; WX 714 ; N _b_769 ; B 70 -12 802 519 ; +C -1 ; WX 0 ; N _d_770 ; B -131 829 80 905 ; +C -1 ; WX 0 ; N _d_771 ; B -393 829 -181 905 ; +C -1 ; WX 0 ; N _d_772 ; B -306 754 -110 892 ; +C -1 ; WX 0 ; N f006 ; B -76 829 185 905 ; +C -1 ; WX 0 ; N f007 ; B -298 829 -37 905 ; +C -1 ; WX 0 ; N f009 ; B -205 753 37 892 ; +C -1 ; WX 0 ; N _b_776 ; B -96 747 106 906 ; +C -1 ; WX 0 ; N f010 ; B -101 809 94 906 ; +C -1 ; WX 0 ; N f013 ; B -233 747 -31 906 ; +C -1 ; WX 0 ; N f011 ; B -320 809 -125 906 ; +C -1 ; WX 0 ; N f01c ; B -179 763 169 875 ; +C -1 ; WX 0 ; N f015 ; B -395 821 -51 906 ; +C -1 ; WX 0 ; N _b_782 ; B -323 763 25 875 ; +C -1 ; WX 0 ; N _d_783 ; B -24 728 280 797 ; +C -1 ; WX 0 ; N _d_784 ; B -29 740 270 805 ; +C -1 ; WX 0 ; N f02c ; B -218 -194 -51 -59 ; +C -1 ; WX 513 ; N _b_786 ; B 32 92 552 716 ; +C -1 ; WX 834 ; N _b_787 ; B 85 -30 830 725 ; +C -1 ; WX 834 ; N _b_788 ; B 82 -30 830 725 ; +C -1 ; WX 0 ; N f008 ; B -126 584 116 723 ; +C -1 ; WX 0 ; N _d_790 ; B -270 584 -27 723 ; +C -1 ; WX 0 ; N _d_791 ; B -167 584 29 722 ; +C -1 ; WX 0 ; N f00f ; B -322 584 -126 722 ; +C -1 ; WX 0 ; N f012 ; B -117 584 86 757 ; +C -1 ; WX 0 ; N f014 ; B -274 584 -72 757 ; +C -1 ; WX 0 ; N f016 ; B -411 763 -63 875 ; +C -1 ; WX 0 ; N f017 ; B -508 763 -160 875 ; +C -1 ; WX 0 ; N f018 ; B -508 763 -160 875 ; +C -1 ; WX 0 ; N f019 ; B -354 592 -18 710 ; +C -1 ; WX 0 ; N f01a ; B -468 592 -132 710 ; +C -1 ; WX 0 ; N f01b ; B -483 592 -147 710 ; +C -1 ; WX 0 ; N f01e ; B -450 -194 -283 -59 ; +C -1 ; WX 0 ; N f01f ; B -499 -194 -332 -59 ; +C -1 ; WX 0 ; N f020 ; B -557 -194 -390 -59 ; +C -1 ; WX 0 ; N f021 ; B -473 -194 -306 -59 ; +C -1 ; WX 0 ; N f022 ; B -557 -194 -390 -59 ; +C -1 ; WX 0 ; N _b_806 ; B -138 754 58 892 ; +C -1 ; WX 0 ; N _b_807 ; B -89 753 153 892 ; +C -1 ; WX 0 ; N f01d ; B -215 592 121 710 ; +C -1 ; WX 0 ; N _b_809 ; B -499 -194 -332 -59 ; +C -1 ; WX 0 ; N f023 ; B -413 -194 -246 -59 ; +C -1 ; WX 0 ; N f029 ; B -282 -194 -115 -59 ; +C -1 ; WX 0 ; N f02a ; B -276 -194 -109 -59 ; +C -1 ; WX 0 ; N f02b ; B -276 -194 -109 -59 ; +C -1 ; WX 0 ; N f024 ; B -364 -194 -197 -59 ; +C -1 ; WX 0 ; N f025 ; B -413 -194 -246 -59 ; +C -1 ; WX 0 ; N f026 ; B -467 -194 -300 -59 ; +C -1 ; WX 0 ; N f027 ; B -462 -194 -295 -59 ; +C -1 ; WX 0 ; N f028 ; B -560 -194 -393 -59 ; +C -1 ; WX 0 ; N f02d ; B -341 821 3 906 ; +C -1 ; WX 0 ; N f02e ; B -345 763 3 875 ; +C -1 ; WX 0 ; N f02f ; B -444 821 -100 906 ; +C -1 ; WX 0 ; N f030 ; B -448 763 -100 875 ; +C -1 ; WX 278 ; N f031 ; B 40 0 289 519 ; +C -1 ; WX 722 ; N _b_824 ; B -11 -194 673 716 ; +C -1 ; WX 556 ; N _b_825 ; B 45 -194 533 531 ; +C -1 ; WX 722 ; N _b_826 ; B -11 0 673 906 ; +C -1 ; WX 556 ; N _b_827 ; B 45 -12 533 757 ; +C -1 ; WX 722 ; N _b_828 ; B -11 0 673 905 ; +C -1 ; WX 556 ; N _b_829 ; B 45 -12 571 892 ; +C -1 ; WX 722 ; N _b_830 ; B -11 0 673 905 ; +C -1 ; WX 556 ; N _b_831 ; B 45 -12 533 892 ; +C -1 ; WX 722 ; N _b_832 ; B -11 0 673 906 ; +C -1 ; WX 556 ; N _b_833 ; B 45 -12 533 906 ; +C -1 ; WX 722 ; N _b_834 ; B -11 0 673 906 ; +C -1 ; WX 556 ; N _b_835 ; B 45 -12 582 875 ; +C -1 ; WX 722 ; N _b_836 ; B -11 -194 673 805 ; +C -1 ; WX 556 ; N _b_837 ; B 45 -194 533 731 ; +C -1 ; WX 722 ; N _b_838 ; B -11 0 673 905 ; +C -1 ; WX 556 ; N _b_839 ; B 45 -12 571 892 ; +C -1 ; WX 722 ; N _b_840 ; B -11 0 673 905 ; +C -1 ; WX 556 ; N _b_841 ; B 45 -12 542 892 ; +C -1 ; WX 722 ; N _b_842 ; B -11 0 673 906 ; +C -1 ; WX 556 ; N _b_843 ; B 45 -12 542 906 ; +C -1 ; WX 722 ; N _b_844 ; B -11 0 682 906 ; +C -1 ; WX 556 ; N _b_845 ; B 45 -12 582 875 ; +C -1 ; WX 722 ; N _b_846 ; B -11 -194 673 797 ; +C -1 ; WX 556 ; N _b_847 ; B 45 -194 542 727 ; +C -1 ; WX 667 ; N _b_848 ; B 41 -194 721 716 ; +C -1 ; WX 556 ; N _b_849 ; B 58 -194 555 531 ; +C -1 ; WX 667 ; N _b_850 ; B 41 0 721 906 ; +C -1 ; WX 556 ; N _b_851 ; B 58 -12 555 757 ; +C -1 ; WX 667 ; N _b_852 ; B 41 0 721 874 ; +C -1 ; WX 556 ; N _b_853 ; B 58 -12 555 710 ; +C -1 ; WX 667 ; N _b_854 ; B 41 0 721 905 ; +C -1 ; WX 556 ; N _b_855 ; B 58 -12 572 892 ; +C -1 ; WX 667 ; N _b_856 ; B 41 0 721 905 ; +C -1 ; WX 556 ; N _b_857 ; B 58 -12 555 892 ; +C -1 ; WX 667 ; N _b_858 ; B 41 0 721 906 ; +C -1 ; WX 556 ; N _b_859 ; B 58 -12 555 906 ; +C -1 ; WX 667 ; N _b_860 ; B 41 0 721 906 ; +C -1 ; WX 556 ; N _b_861 ; B 58 -12 582 875 ; +C -1 ; WX 667 ; N _b_862 ; B 41 -194 721 805 ; +C -1 ; WX 556 ; N _b_863 ; B 58 -194 555 731 ; +C -1 ; WX 278 ; N _b_864 ; B 35 0 399 906 ; +C -1 ; WX 278 ; N _b_865 ; B 40 0 369 757 ; +C -1 ; WX 278 ; N _b_866 ; B -3 -194 332 716 ; +C -1 ; WX 278 ; N _b_867 ; B -3 -194 330 716 ; +C -1 ; WX 778 ; N _b_868 ; B 87 -194 784 728 ; +C -1 ; WX 611 ; N _b_869 ; B 61 -194 599 531 ; +C -1 ; WX 778 ; N _b_870 ; B 87 -13 784 906 ; +C -1 ; WX 611 ; N _b_871 ; B 61 -12 599 757 ; +C -1 ; WX 778 ; N _b_872 ; B 87 -13 784 905 ; +C -1 ; WX 611 ; N _b_873 ; B 61 -12 599 892 ; +C -1 ; WX 778 ; N _b_874 ; B 87 -13 784 905 ; +C -1 ; WX 611 ; N _b_875 ; B 61 -12 599 892 ; +C -1 ; WX 778 ; N _b_876 ; B 87 -13 784 906 ; +C -1 ; WX 611 ; N _b_877 ; B 61 -12 599 906 ; +C -1 ; WX 778 ; N _b_878 ; B 87 -13 784 906 ; +C -1 ; WX 611 ; N _b_879 ; B 61 -12 602 875 ; +C -1 ; WX 778 ; N _b_880 ; B 87 -194 784 805 ; +C -1 ; WX 611 ; N _b_881 ; B 61 -194 599 731 ; +C -1 ; WX 837 ; N _b_882 ; B 87 -13 959 904 ; +C -1 ; WX 671 ; N _b_883 ; B 61 -12 780 730 ; +C -1 ; WX 837 ; N _b_884 ; B 87 -13 959 905 ; +C -1 ; WX 671 ; N _b_885 ; B 61 -12 780 732 ; +C -1 ; WX 837 ; N _b_886 ; B 87 -13 959 906 ; +C -1 ; WX 671 ; N _b_887 ; B 61 -12 780 757 ; +C -1 ; WX 837 ; N _b_888 ; B 87 -13 959 874 ; +C -1 ; WX 671 ; N _b_889 ; B 61 -12 780 710 ; +C -1 ; WX 837 ; N _b_890 ; B 87 -194 959 728 ; +C -1 ; WX 671 ; N _b_891 ; B 61 -194 780 531 ; +C -1 ; WX 722 ; N _b_892 ; B 91 -194 765 716 ; +C -1 ; WX 611 ; N _b_893 ; B 70 -194 619 519 ; +C -1 ; WX 722 ; N _b_894 ; B 91 -12 765 906 ; +C -1 ; WX 611 ; N _b_895 ; B 70 -12 619 757 ; +C -1 ; WX 809 ; N _b_896 ; B 91 -12 949 904 ; +C -1 ; WX 714 ; N _b_897 ; B 70 -12 802 730 ; +C -1 ; WX 809 ; N _b_898 ; B 91 -12 949 905 ; +C -1 ; WX 714 ; N _b_899 ; B 70 -12 802 732 ; +C -1 ; WX 809 ; N _b_900 ; B 91 -12 949 906 ; +C -1 ; WX 714 ; N _b_901 ; B 70 -12 802 757 ; +C -1 ; WX 809 ; N _b_902 ; B 91 -12 949 874 ; +C -1 ; WX 714 ; N _b_903 ; B 70 -12 802 710 ; +C -1 ; WX 809 ; N _b_904 ; B 91 -194 949 716 ; +C -1 ; WX 714 ; N _b_905 ; B 70 -194 802 519 ; +C -1 ; WX 667 ; N _b_906 ; B 115 -194 785 716 ; +C -1 ; WX 556 ; N _b_907 ; B 6 -210 621 519 ; +C -1 ; WX 667 ; N _b_908 ; B 115 0 785 906 ; +C -1 ; WX 556 ; N _b_909 ; B 6 -210 621 757 ; +C -1 ; WX 667 ; N _b_910 ; B 115 0 785 874 ; +C -1 ; WX 556 ; N _b_911 ; B 6 -210 621 710 ; +C -1 ; WX 722 ; N uni01CD ; B -11 0 694 908 ; +C -1 ; WX 556 ; N uni01CE ; B 45 -12 562 731 ; +C -1 ; WX 278 ; N uni01CF ; B 35 0 480 908 ; +C -1 ; WX 278 ; N uni01D0 ; B 40 0 445 731 ; +C -1 ; WX 778 ; N uni01D1 ; B 87 -13 784 908 ; +C -1 ; WX 611 ; N uni01D2 ; B 61 -12 599 731 ; +C -1 ; WX 722 ; N uni01D3 ; B 91 -12 765 908 ; +C -1 ; WX 611 ; N uni01D4 ; B 70 -12 619 731 ; +C -1 ; WX 722 ; N uni01D5 ; B 91 -12 765 900 ; +C -1 ; WX 611 ; N uni01D6 ; B 70 -12 619 892 ; +C -1 ; WX 722 ; N uni01D7 ; B 91 -12 765 900 ; +C -1 ; WX 611 ; N uni01D8 ; B 70 -12 619 926 ; +C -1 ; WX 722 ; N uni01D9 ; B 91 -12 765 900 ; +C -1 ; WX 611 ; N uni01DA ; B 70 -12 645 927 ; +C -1 ; WX 722 ; N uni01DB ; B 91 -12 765 900 ; +C -1 ; WX 611 ; N uni01DC ; B 70 -12 619 927 ; +C -1 ; WX 0 ; N _d_928 ; B 31 730 318 900 ; +C -1 ; WX 0 ; N _d_929 ; B 31 730 326 900 ; +C -1 ; WX 0 ; N _d_930 ; B 31 730 323 900 ; +C -1 ; WX 0 ; N _d_931 ; B 31 730 302 900 ; +C -1 ; WX 614 ; N uni0492 ; B 28 0 723 716 ; +C -1 ; WX 469 ; N uni0493 ; B 18 0 552 519 ; +C -1 ; WX 927 ; N uni0496 ; B -15 -198 1016 720 ; +C -1 ; WX 736 ; N uni0497 ; B -25 -161 788 519 ; +C -1 ; WX 615 ; N uni049a ; B 43 -198 701 716 ; +C -1 ; WX 507 ; N uni049b ; B 37 -161 567 519 ; +C -1 ; WX 615 ; N uni049c ; B 43 0 701 716 ; +C -1 ; WX 507 ; N uni049d ; B 37 0 567 519 ; +C -1 ; WX 722 ; N uni04a2 ; B 43 -198 765 716 ; +C -1 ; WX 604 ; N uni04a3 ; B 35 -161 616 519 ; +C -1 ; WX 556 ; N uni04ae ; B 109 0 667 716 ; +C -1 ; WX 556 ; N uni04af ; B 85 -197 624 519 ; +C -1 ; WX 556 ; N uni04b0 ; B 57 0 667 716 ; +C -1 ; WX 556 ; N uni04b1 ; B 5 -197 623 519 ; +C -1 ; WX 667 ; N uni04b2 ; B -30 -198 784 716 ; +C -1 ; WX 556 ; N uni04b3 ; B -22 -161 612 519 ; +C -1 ; WX 708 ; N uni04b8 ; B 129 0 752 716 ; +C -1 ; WX 583 ; N uni04b9 ; B 99 0 594 519 ; +C -1 ; WX 708 ; N uni04ba ; B 53 0 676 716 ; +C -1 ; WX 583 ; N uni04bb ; B 45 0 540 519 ; +C -1 ; WX 748 ; N uni018f ; B 87 -12 754 728 ; +C -1 ; WX 556 ; N uni0259 ; B 49 -12 546 531 ; +C -1 ; WX 778 ; N uni04e8 ; B 87 -12 784 728 ; +C -1 ; WX 611 ; N uni04e9 ; B 61 -12 599 531 ; +EndCharMetrics +StartKernData +StartKernPairs 820 +KPX space A -37 +KPX space Y -18 +KPX space Alphatonos -37 +KPX space Alpha -37 +KPX space Delta -37 +KPX space Lambda -37 +KPX space Upsilon -18 +KPX space Upsilondieresis -18 +KPX one one -74 +KPX A space -37 +KPX A T -74 +KPX A V -74 +KPX A W -55 +KPX A Y -74 +KPX A quoteright -55 +KPX F comma -111 +KPX F period -111 +KPX F A -55 +KPX L space -18 +KPX L T -74 +KPX L V -55 +KPX L W -55 +KPX L Y -74 +KPX L quoteright -74 +KPX P space -37 +KPX P comma -129 +KPX P period -129 +KPX P A -74 +KPX R T -18 +KPX R W -18 +KPX R Y -18 +KPX T comma -74 +KPX T hyphen -55 +KPX T period -74 +KPX T colon -74 +KPX T semicolon -74 +KPX T A -74 +KPX T O -18 +KPX T a -37 +KPX T c -37 +KPX T e -37 +KPX T i -18 +KPX T o -37 +KPX T r -18 +KPX T s -37 +KPX T u -18 +KPX T w -37 +KPX T y -37 +KPX V comma -92 +KPX V hyphen -37 +KPX V period -92 +KPX V colon -37 +KPX V semicolon -37 +KPX V A -74 +KPX V a -37 +KPX V e -37 +KPX V i -37 +KPX V o -37 +KPX V r -18 +KPX V u -18 +KPX V y -18 +KPX W comma -74 +KPX W hyphen -37 +KPX W period -74 +KPX W colon -37 +KPX W semicolon -37 +KPX W A -55 +KPX W a -18 +KPX W e -18 +KPX W i -9 +KPX W o -18 +KPX W r -18 +KPX W u -18 +KPX W y -18 +KPX Y space -18 +KPX Y comma -92 +KPX Y hyphen -74 +KPX Y period -92 +KPX Y colon -55 +KPX Y semicolon -55 +KPX Y A -74 +KPX Y a -37 +KPX Y e -37 +KPX Y i -37 +KPX Y o -37 +KPX Y p -37 +KPX Y q -37 +KPX Y u -37 +KPX Y v -37 +KPX f f -18 +KPX f quoteright 18 +KPX r comma -55 +KPX r period -55 +KPX r quoteright 37 +KPX v comma -55 +KPX v period -55 +KPX w comma -37 +KPX w period -37 +KPX y comma -37 +KPX y period -37 +KPX quoteleft quoteleft -37 +KPX quoteright space -37 +KPX quoteright s -18 +KPX quoteright t 18 +KPX quoteright quoteright -37 +KPX quotedblbase afii10051 -113 +KPX quotedblbase afii10060 -125 +KPX quotedblbase afii10036 -113 +KPX quotedblbase afii10041 -63 +KPX quotedblbase afii10044 -100 +KPX Gamma comma -110 +KPX Gamma period -110 +KPX Gamma iotadieresistonos 130 +KPX Gamma Alpha -87 +KPX Gamma Delta -87 +KPX Gamma Lambda -87 +KPX Gamma iota -18 +KPX Gamma iotadieresis 64 +KPX Theta Alpha -28 +KPX Theta Upsilon -40 +KPX Theta Upsilondieresis -40 +KPX Phi Alpha -28 +KPX Phi Upsilon -54 +KPX Phi Upsilondieresis -54 +KPX delta gamma -18 +KPX delta chi -28 +KPX delta pi -17 +KPX tau phi 14 +KPX tau omega 14 +KPX tau omegatonos 14 +KPX phi gamma -18 +KPX phi lambda -28 +KPX phi chi -28 +KPX phi pi -17 +KPX Alphatonos space -37 +KPX Alphatonos Theta -57 +KPX Alphatonos Phi -57 +KPX Alphatonos Omicron -57 +KPX Alphatonos Tau -92 +KPX Alphatonos Upsilon -123 +KPX Alphatonos Upsilondieresis -123 +KPX Alphatonos gamma -29 +KPX Alphatonos nu -29 +KPX Alphatonos chi -29 +KPX Omicrontonos Upsilon -40 +KPX Omicrontonos Upsilondieresis -40 +KPX Upsilontonos alpha -37 +KPX Upsilontonos delta -37 +KPX Upsilontonos sigma -37 +KPX Upsilontonos phi -37 +KPX Upsilontonos iotadieresistonos 130 +KPX Upsilontonos Alpha -89 +KPX Upsilontonos Delta -66 +KPX Upsilontonos Lambda -55 +KPX Upsilontonos alphatonos -37 +KPX Upsilontonos etatonos -37 +KPX Upsilontonos iotatonos -37 +KPX Upsilontonos eta -37 +KPX Upsilontonos iota -37 +KPX Upsilontonos kappa -37 +KPX Upsilontonos mu -37 +KPX Upsilontonos omicron -37 +KPX Upsilontonos iotadieresis 64 +KPX Upsilontonos omicrontonos -37 +KPX Alpha space -37 +KPX Alpha quoteright -55 +KPX Alpha Theta -57 +KPX Alpha Phi -57 +KPX Alpha Omicron -57 +KPX Alpha Tau -92 +KPX Alpha Upsilon -123 +KPX Alpha Upsilondieresis -123 +KPX Alpha gamma -29 +KPX Alpha nu -29 +KPX Alpha chi -29 +KPX Delta space -37 +KPX Delta Theta -21 +KPX Delta Omicron -21 +KPX Delta Tau -92 +KPX Delta Upsilon -123 +KPX Delta Upsilondieresis -123 +KPX Kappa Theta -72 +KPX Kappa Phi -72 +KPX Kappa alpha -19 +KPX Kappa delta -19 +KPX Kappa sigma -19 +KPX Kappa phi -19 +KPX Kappa Omicron -72 +KPX Kappa alphatonos -19 +KPX Kappa zeta -19 +KPX Kappa theta -19 +KPX Kappa xi -19 +KPX Kappa omicron -19 +KPX Kappa omega -19 +KPX Kappa omicrontonos -19 +KPX Kappa omegatonos -19 +KPX Lambda space -37 +KPX Lambda Theta -21 +KPX Lambda Omicron -21 +KPX Lambda Tau -92 +KPX Lambda Upsilon -123 +KPX Lambda Upsilondieresis -123 +KPX Omicron Alpha -28 +KPX Omicron Upsilon -40 +KPX Omicron Upsilondieresis -40 +KPX Rho comma -128 +KPX Rho period -128 +KPX Rho Alpha -74 +KPX Rho Delta -74 +KPX Rho Lambda -74 +KPX Sigma tau -24 +KPX Tau comma -74 +KPX Tau hyphen -55 +KPX Tau period -74 +KPX Tau colon -74 +KPX Tau semicolon -74 +KPX Tau Theta -18 +KPX Tau Phi -18 +KPX Tau alpha -37 +KPX Tau delta -37 +KPX Tau epsilon -37 +KPX Tau sigma -37 +KPX Tau phi -37 +KPX Tau iotadieresistonos 137 +KPX Tau Alpha -74 +KPX Tau Delta -45 +KPX Tau Lambda -45 +KPX Tau Omicron -18 +KPX Tau Omega -18 +KPX Tau alphatonos -37 +KPX Tau epsilontonos -37 +KPX Tau gamma -27 +KPX Tau eta -18 +KPX Tau iota -18 +KPX Tau mu -18 +KPX Tau nu -37 +KPX Tau omicron -37 +KPX Tau upsilon -18 +KPX Tau chi -37 +KPX Tau psi -27 +KPX Tau iotadieresis 64 +KPX Tau upsilondieresis -18 +KPX Tau omicrontonos -37 +KPX Tau upsilontonos -18 +KPX Upsilon comma -91 +KPX Upsilon hyphen -74 +KPX Upsilon period -91 +KPX Upsilon colon -55 +KPX Upsilon semicolon -55 +KPX Upsilon alpha -37 +KPX Upsilon delta -37 +KPX Upsilon sigma -37 +KPX Upsilon phi -37 +KPX Upsilon iotadieresistonos 130 +KPX Upsilon Alpha -89 +KPX Upsilon Delta -66 +KPX Upsilon Lambda -55 +KPX Upsilon alphatonos -37 +KPX Upsilon etatonos -37 +KPX Upsilon iotatonos -37 +KPX Upsilon gamma -21 +KPX Upsilon eta -37 +KPX Upsilon iota -37 +KPX Upsilon kappa -37 +KPX Upsilon mu -37 +KPX Upsilon omicron -37 +KPX Upsilon iotadieresis 64 +KPX Upsilon omicrontonos -37 +KPX Chi omega -34 +KPX Chi omegatonos -34 +KPX Psi alpha -20 +KPX Psi delta -28 +KPX Psi sigma -20 +KPX Psi phi -20 +KPX Psi alphatonos -20 +KPX Psi theta -17 +KPX Psi omicron -20 +KPX Psi omega -20 +KPX Psi omicrontonos -20 +KPX Psi omegatonos -20 +KPX Omega Upsilon -40 +KPX Omega Upsilondieresis -40 +KPX Upsilondieresis alpha -37 +KPX Upsilondieresis delta -37 +KPX Upsilondieresis sigma -37 +KPX Upsilondieresis phi -37 +KPX Upsilondieresis iotadieresistonos 130 +KPX Upsilondieresis Alpha -89 +KPX Upsilondieresis Delta -66 +KPX Upsilondieresis Lambda -55 +KPX Upsilondieresis alphatonos -37 +KPX Upsilondieresis etatonos -37 +KPX Upsilondieresis iotatonos -37 +KPX Upsilondieresis eta -37 +KPX Upsilondieresis iota -37 +KPX Upsilondieresis kappa -37 +KPX Upsilondieresis mu -37 +KPX Upsilondieresis omicron -37 +KPX Upsilondieresis iotadieresis 64 +KPX Upsilondieresis omicrontonos -37 +KPX zeta alpha -108 +KPX zeta delta -36 +KPX zeta sigma -108 +KPX zeta tau -28 +KPX zeta phi -108 +KPX zeta alphatonos -108 +KPX zeta etatonos -38 +KPX zeta gamma -28 +KPX zeta eta -38 +KPX zeta theta -21 +KPX zeta iota -38 +KPX zeta kappa -38 +KPX zeta nu -28 +KPX zeta omicron -108 +KPX zeta omega -108 +KPX zeta omicrontonos -108 +KPX zeta omegatonos -108 +KPX zeta pi -28 +KPX kappa alpha -38 +KPX kappa delta -38 +KPX kappa sigma -38 +KPX kappa phi -38 +KPX kappa alphatonos -38 +KPX kappa zeta -38 +KPX kappa theta -38 +KPX kappa xi -38 +KPX kappa omicron -38 +KPX kappa sigma1 -38 +KPX kappa omega -38 +KPX kappa omicrontonos -38 +KPX kappa omegatonos -38 +KPX lambda alpha -14 +KPX lambda delta -14 +KPX lambda sigma -14 +KPX lambda phi -14 +KPX lambda alphatonos -14 +KPX lambda upsilondieresistonos -19 +KPX lambda zeta -14 +KPX lambda xi -14 +KPX lambda omicron -14 +KPX lambda sigma1 -14 +KPX lambda upsilon -19 +KPX lambda omega -14 +KPX lambda upsilondieresis -19 +KPX lambda omicrontonos -14 +KPX lambda upsilontonos -19 +KPX lambda omegatonos -14 +KPX xi alpha -21 +KPX xi delta -21 +KPX xi sigma -21 +KPX xi phi -21 +KPX xi alphatonos -21 +KPX xi zeta -21 +KPX xi xi -21 +KPX xi omicron -21 +KPX xi sigma1 -21 +KPX xi omicrontonos -21 +KPX omicron tau -17 +KPX omicron gamma -18 +KPX omicron chi -28 +KPX omicron pi -17 +KPX rho chi -28 +KPX rho pi -17 +KPX chi alpha -14 +KPX chi delta -14 +KPX chi sigma -14 +KPX chi phi -14 +KPX chi alphatonos -14 +KPX chi zeta -14 +KPX chi omicron -14 +KPX chi sigma1 -14 +KPX chi omega -14 +KPX chi omicrontonos -14 +KPX chi omegatonos -14 +KPX omega gamma -18 +KPX omega chi -28 +KPX omega pi -17 +KPX omicrontonos gamma -18 +KPX omicrontonos chi -28 +KPX omicrontonos pi -17 +KPX omegatonos gamma -18 +KPX omegatonos chi -28 +KPX omegatonos pi -17 +KPX afii10052 comma -100 +KPX afii10052 period -100 +KPX afii10058 quoteright -100 +KPX afii10059 quoteright -100 +KPX afii10017 quoteright -75 +KPX afii10017 afii10021 37 +KPX afii10017 afii10025 -38 +KPX afii10017 afii10029 12 +KPX afii10017 afii10032 -50 +KPX afii10017 afii10033 -25 +KPX afii10017 afii10035 -50 +KPX afii10017 afii10036 -101 +KPX afii10017 afii10037 -63 +KPX afii10017 afii10038 -63 +KPX afii10017 afii10041 -50 +KPX afii10017 afii10047 -50 +KPX afii10017 afii10065 12 +KPX afii10017 afii10066 -25 +KPX afii10017 afii10070 -25 +KPX afii10017 afii10080 -25 +KPX afii10017 afii10083 -25 +KPX afii10017 afii10085 -25 +KPX afii10017 afii10086 -25 +KPX afii10018 afii10017 -38 +KPX afii10018 afii10021 12 +KPX afii10018 afii10024 -13 +KPX afii10018 afii10025 -13 +KPX afii10018 afii10029 12 +KPX afii10018 afii10032 -13 +KPX afii10018 afii10035 -13 +KPX afii10018 afii10036 -38 +KPX afii10018 afii10037 -25 +KPX afii10018 afii10038 -26 +KPX afii10018 afii10039 -13 +KPX afii10018 afii10041 -13 +KPX afii10018 afii10044 -50 +KPX afii10018 afii10047 -25 +KPX afii10018 afii10049 -25 +KPX afii10018 afii10077 12 +KPX afii10018 afii10085 -13 +KPX afii10018 afii10097 12 +KPX afii10019 afii10017 -38 +KPX afii10019 afii10024 -25 +KPX afii10019 afii10025 -25 +KPX afii10019 afii10032 -25 +KPX afii10019 afii10035 -25 +KPX afii10019 afii10036 -63 +KPX afii10019 afii10037 -63 +KPX afii10019 afii10038 -38 +KPX afii10019 afii10039 -38 +KPX afii10019 afii10044 -63 +KPX afii10019 afii10049 -25 +KPX afii10019 afii10085 -13 +KPX afii10019 afii10087 -13 +KPX afii10019 afii10089 -38 +KPX afii10020 comma -63 +KPX afii10020 period -63 +KPX afii10020 afii10017 -51 +KPX afii10020 afii10021 -25 +KPX afii10020 afii10025 -13 +KPX afii10020 afii10029 -13 +KPX afii10020 afii10032 -13 +KPX afii10020 afii10049 -13 +KPX afii10020 afii10065 -13 +KPX afii10020 afii10067 -51 +KPX afii10020 afii10069 -13 +KPX afii10020 afii10070 -50 +KPX afii10020 afii10074 -38 +KPX afii10020 afii10077 -38 +KPX afii10020 afii10078 -25 +KPX afii10020 afii10079 -25 +KPX afii10020 afii10080 -50 +KPX afii10020 afii10082 -25 +KPX afii10020 afii10085 -25 +KPX afii10020 afii10093 -25 +KPX afii10020 afii10094 -25 +KPX afii10020 afii10096 -25 +KPX afii10020 afii10097 -25 +KPX afii10021 afii10038 -13 +KPX afii10021 afii10041 25 +KPX afii10021 afii10073 12 +KPX afii10021 afii10085 25 +KPX afii10022 afii10025 -13 +KPX afii10022 afii10029 12 +KPX afii10022 afii10083 12 +KPX afii10024 afii10025 -13 +KPX afii10024 afii10032 -13 +KPX afii10024 afii10035 -13 +KPX afii10024 afii10041 37 +KPX afii10024 afii10044 12 +KPX afii10024 afii10065 12 +KPX afii10024 afii10070 -13 +KPX afii10024 afii10080 -13 +KPX afii10024 afii10085 -13 +KPX afii10025 afii10024 -25 +KPX afii10025 afii10032 -25 +KPX afii10025 afii10035 -25 +KPX afii10025 afii10036 -38 +KPX afii10025 afii10037 -38 +KPX afii10025 afii10038 -25 +KPX afii10025 afii10041 25 +KPX afii10025 afii10049 -25 +KPX afii10025 afii10069 -13 +KPX afii10025 afii10077 12 +KPX afii10028 afii10032 -13 +KPX afii10028 afii10035 -13 +KPX afii10028 afii10036 12 +KPX afii10028 afii10038 -38 +KPX afii10028 afii10041 50 +KPX afii10028 afii10070 -38 +KPX afii10028 afii10073 -25 +KPX afii10028 afii10080 -38 +KPX afii10028 afii10083 -38 +KPX afii10028 afii10085 -13 +KPX afii10028 afii10095 -25 +KPX afii10029 afii10038 -13 +KPX afii10029 afii10065 12 +KPX afii10029 afii10085 12 +KPX afii10030 afii10041 37 +KPX afii10030 afii10065 12 +KPX afii10030 afii10085 12 +KPX afii10030 afii10089 -13 +KPX afii10032 afii10017 -38 +KPX afii10032 afii10021 -13 +KPX afii10032 afii10024 -38 +KPX afii10032 afii10029 -13 +KPX afii10032 afii10037 -63 +KPX afii10032 afii10039 -25 +KPX afii10032 afii10041 25 +KPX afii10032 afii10049 -25 +KPX afii10032 afii10078 12 +KPX afii10032 afii10097 12 +KPX afii10034 comma -125 +KPX afii10034 period -125 +KPX afii10034 colon -13 +KPX afii10034 semicolon -13 +KPX afii10034 guillemotright -25 +KPX afii10034 afii10017 -63 +KPX afii10034 afii10021 -38 +KPX afii10034 afii10024 -38 +KPX afii10034 afii10025 -38 +KPX afii10034 afii10029 -25 +KPX afii10034 afii10036 -38 +KPX afii10034 afii10037 -38 +KPX afii10034 afii10039 -38 +KPX afii10034 afii10049 -25 +KPX afii10034 afii10069 -13 +KPX afii10034 afii10070 -13 +KPX afii10034 afii10080 -13 +KPX afii10035 afii10017 -25 +KPX afii10035 afii10025 -25 +KPX afii10035 afii10036 -38 +KPX afii10035 afii10037 -38 +KPX afii10035 afii10039 -13 +KPX afii10035 afii10041 12 +KPX afii10035 afii10044 -50 +KPX afii10035 afii10047 -25 +KPX afii10035 afii10065 25 +KPX afii10035 afii10072 12 +KPX afii10035 afii10073 12 +KPX afii10035 afii10089 -13 +KPX afii10036 comma -38 +KPX afii10036 period -38 +KPX afii10036 afii10017 -38 +KPX afii10036 afii10024 25 +KPX afii10036 afii10030 12 +KPX afii10036 afii10032 -13 +KPX afii10036 afii10038 -13 +KPX afii10036 afii10047 12 +KPX afii10036 afii10067 -38 +KPX afii10036 afii10070 -38 +KPX afii10036 afii10074 -38 +KPX afii10036 afii10076 -25 +KPX afii10036 afii10077 -25 +KPX afii10036 afii10078 -25 +KPX afii10036 afii10080 -38 +KPX afii10036 afii10081 -13 +KPX afii10036 afii10082 -25 +KPX afii10036 afii10083 -38 +KPX afii10036 afii10085 -25 +KPX afii10036 afii10087 -25 +KPX afii10036 afii10091 -25 +KPX afii10036 afii10093 -13 +KPX afii10036 afii10094 -13 +KPX afii10036 afii10096 -13 +KPX afii10036 afii10097 -13 +KPX afii10037 comma -75 +KPX afii10037 period -75 +KPX afii10037 colon -25 +KPX afii10037 semicolon -25 +KPX afii10037 afii10017 -75 +KPX afii10037 afii10021 -38 +KPX afii10037 afii10025 -13 +KPX afii10037 afii10029 -13 +KPX afii10037 afii10032 -13 +KPX afii10037 afii10038 -38 +KPX afii10037 afii10047 -13 +KPX afii10037 afii10049 -13 +KPX afii10037 afii10066 -25 +KPX afii10037 afii10067 -50 +KPX afii10037 afii10068 -38 +KPX afii10037 afii10069 -25 +KPX afii10037 afii10070 -50 +KPX afii10037 afii10072 -13 +KPX afii10037 afii10073 -38 +KPX afii10037 afii10074 -38 +KPX afii10037 afii10075 -25 +KPX afii10037 afii10076 -25 +KPX afii10037 afii10077 -38 +KPX afii10037 afii10078 -25 +KPX afii10037 afii10079 -25 +KPX afii10037 afii10080 -63 +KPX afii10037 afii10081 -25 +KPX afii10037 afii10082 -25 +KPX afii10037 afii10083 -50 +KPX afii10037 afii10087 -25 +KPX afii10037 afii10088 -25 +KPX afii10037 afii10090 -25 +KPX afii10037 afii10091 -25 +KPX afii10037 afii10096 -25 +KPX afii10037 afii10097 -25 +KPX afii10038 afii10017 -38 +KPX afii10038 afii10021 -25 +KPX afii10038 afii10029 -25 +KPX afii10038 afii10030 12 +KPX afii10038 afii10036 -63 +KPX afii10038 afii10037 -63 +KPX afii10038 afii10041 25 +KPX afii10038 afii10049 -38 +KPX afii10038 afii10077 -13 +KPX afii10039 afii10025 12 +KPX afii10039 afii10032 -13 +KPX afii10039 afii10035 -13 +KPX afii10039 afii10038 -25 +KPX afii10039 afii10047 -13 +KPX afii10039 afii10080 -38 +KPX afii10039 afii10085 -13 +KPX afii10040 afii10065 25 +KPX afii10043 afii10065 25 +KPX afii10043 afii10085 25 +KPX afii10044 quoteright -100 +KPX afii10044 afii10049 -25 +KPX afii10046 quoteright -88 +KPX afii10046 afii10017 -25 +KPX afii10046 afii10024 -25 +KPX afii10046 afii10025 -25 +KPX afii10046 afii10030 -13 +KPX afii10046 afii10032 -38 +KPX afii10046 afii10035 -38 +KPX afii10046 afii10036 -100 +KPX afii10046 afii10039 -25 +KPX afii10046 afii10041 -38 +KPX afii10046 afii10047 -38 +KPX afii10046 afii10049 -38 +KPX afii10047 afii10021 -13 +KPX afii10047 afii10024 -25 +KPX afii10047 afii10025 -25 +KPX afii10047 afii10029 -25 +KPX afii10047 afii10039 -25 +KPX afii10047 afii10049 -38 +KPX afii10048 afii10017 -38 +KPX afii10048 afii10024 -25 +KPX afii10048 afii10036 -51 +KPX afii10048 afii10039 -13 +KPX afii10048 afii10041 12 +KPX afii10065 afii10077 12 +KPX afii10065 afii10085 -13 +KPX afii10065 afii10089 -38 +KPX afii10065 afii10095 -13 +KPX afii10066 afii10072 -13 +KPX afii10066 afii10073 -13 +KPX afii10066 afii10077 -13 +KPX afii10066 afii10078 -13 +KPX afii10066 afii10085 -25 +KPX afii10066 afii10087 -25 +KPX afii10066 afii10089 -38 +KPX afii10066 afii10092 -51 +KPX afii10066 afii10095 -13 +KPX afii10067 afii10065 -13 +KPX afii10067 afii10066 -25 +KPX afii10067 afii10069 -25 +KPX afii10067 afii10070 -25 +KPX afii10067 afii10072 -13 +KPX afii10067 afii10073 -13 +KPX afii10067 afii10078 -25 +KPX afii10067 afii10080 -25 +KPX afii10067 afii10083 -25 +KPX afii10067 afii10084 -13 +KPX afii10067 afii10085 -38 +KPX afii10067 afii10086 -25 +KPX afii10067 afii10089 -50 +KPX afii10067 afii10092 -63 +KPX afii10067 afii10097 -13 +KPX afii10068 comma -13 +KPX afii10068 period -13 +KPX afii10068 afii10065 -13 +KPX afii10068 afii10069 -38 +KPX afii10068 afii10070 -25 +KPX afii10068 afii10073 -25 +KPX afii10068 afii10078 -25 +KPX afii10068 afii10080 -25 +KPX afii10068 afii10083 -25 +KPX afii10068 afii10097 -13 +KPX afii10069 afii10073 -13 +KPX afii10070 afii10065 12 +KPX afii10070 afii10066 12 +KPX afii10070 afii10069 12 +KPX afii10070 afii10072 -13 +KPX afii10070 afii10077 12 +KPX afii10070 afii10080 12 +KPX afii10070 afii10083 12 +KPX afii10070 afii10085 -13 +KPX afii10070 afii10086 12 +KPX afii10070 afii10087 -13 +KPX afii10070 afii10089 -25 +KPX afii10072 afii10065 12 +KPX afii10072 afii10066 12 +KPX afii10072 afii10085 12 +KPX afii10072 afii10089 -13 +KPX afii10072 afii10092 12 +KPX afii10073 afii10066 -13 +KPX afii10073 afii10069 -13 +KPX afii10073 afii10070 -13 +KPX afii10073 afii10073 -13 +KPX afii10073 afii10078 -13 +KPX afii10073 afii10080 -13 +KPX afii10073 afii10083 -13 +KPX afii10073 afii10085 -38 +KPX afii10073 afii10086 -13 +KPX afii10073 afii10089 -50 +KPX afii10073 afii10092 -50 +KPX afii10076 afii10065 12 +KPX afii10076 afii10066 12 +KPX afii10076 afii10077 25 +KPX afii10076 afii10085 12 +KPX afii10076 afii10089 -13 +KPX afii10076 afii10095 12 +KPX afii10077 afii10066 -13 +KPX afii10077 afii10070 -13 +KPX afii10077 afii10080 -13 +KPX afii10077 afii10083 -13 +KPX afii10077 afii10085 -13 +KPX afii10077 afii10086 -13 +KPX afii10077 afii10089 -25 +KPX afii10078 afii10073 -13 +KPX afii10080 afii10065 12 +KPX afii10080 afii10072 -13 +KPX afii10080 afii10085 -25 +KPX afii10080 afii10087 -25 +KPX afii10080 afii10089 -50 +KPX afii10080 afii10095 -13 +KPX afii10082 afii10072 -13 +KPX afii10082 afii10073 -13 +KPX afii10082 afii10077 -13 +KPX afii10082 afii10078 -13 +KPX afii10082 afii10085 -26 +KPX afii10082 afii10087 -25 +KPX afii10082 afii10089 -50 +KPX afii10082 afii10095 -13 +KPX afii10083 afii10072 -13 +KPX afii10083 afii10073 -13 +KPX afii10083 afii10085 -13 +KPX afii10083 afii10086 -13 +KPX afii10083 afii10087 -13 +KPX afii10083 afii10089 -38 +KPX afii10083 afii10092 -25 +KPX afii10084 comma -13 +KPX afii10084 period -13 +KPX afii10084 afii10069 -13 +KPX afii10084 afii10070 -13 +KPX afii10084 afii10072 -13 +KPX afii10084 afii10073 -25 +KPX afii10084 afii10077 -13 +KPX afii10084 afii10078 -13 +KPX afii10084 afii10080 -13 +KPX afii10084 afii10083 -13 +KPX afii10084 afii10085 -25 +KPX afii10084 afii10095 -25 +KPX afii10085 comma -38 +KPX afii10085 period -38 +KPX afii10085 afii10066 12 +KPX afii10085 afii10072 12 +KPX afii10085 afii10073 12 +KPX afii10085 afii10087 12 +KPX afii10085 afii10097 12 +KPX afii10086 afii10085 -25 +KPX afii10086 afii10089 -38 +KPX afii10087 afii10065 -13 +KPX afii10087 afii10066 -13 +KPX afii10087 afii10070 -25 +KPX afii10087 afii10073 -13 +KPX afii10087 afii10080 -25 +KPX afii10087 afii10083 -25 +KPX afii10087 afii10086 -25 +KPX afii10087 afii10089 -25 +KPX afii10087 afii10095 -13 +KPX afii10088 afii10065 -13 +KPX afii10088 afii10070 -38 +KPX afii10088 afii10073 -13 +KPX afii10088 afii10080 -38 +KPX afii10088 afii10083 -38 +KPX afii10088 afii10085 -13 +KPX afii10091 afii10070 -25 +KPX afii10091 afii10080 -25 +KPX afii10094 afii10084 -25 +KPX afii10094 afii10089 -100 +KPX afii10095 afii10066 -13 +KPX afii10095 afii10070 -13 +KPX afii10095 afii10072 -13 +KPX afii10095 afii10073 -13 +KPX afii10095 afii10078 -25 +KPX afii10095 afii10080 -13 +KPX afii10095 afii10083 -13 +KPX afii10095 afii10086 -13 +KPX afii10095 afii10087 -25 +KPX afii10096 afii10066 -13 +KPX afii10096 afii10069 -13 +KPX afii10096 afii10070 -13 +KPX afii10096 afii10072 -25 +KPX afii10096 afii10077 -13 +KPX afii10096 afii10078 -13 +KPX afii10096 afii10080 -13 +KPX afii10096 afii10083 -13 +KPX afii10096 afii10084 -13 +KPX afii10096 afii10086 -13 +KPX afii10096 afii10087 -25 +KPX afii10096 afii10089 -63 +KPX afii10096 afii10095 -25 +KPX afii10110 comma -38 +KPX afii10110 period -38 +KPX afii10110 colon -13 +KPX afii10110 semicolon -13 +KPX afii10050 comma -25 +KPX afii10050 period -25 +KPX pi phi 14 +KPX pi omega 14 +KPX pi omegatonos 14 +EndKernPairs +EndKernData +EndFontMetrics diff --git a/gulliver/thirdparty/html2ps_pdf/fonts/arialbi.ttf b/thirdparty/html2ps_pdf/fonts/arialbi.ttf similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/fonts/arialbi.ttf rename to thirdparty/html2ps_pdf/fonts/arialbi.ttf diff --git a/gulliver/thirdparty/html2ps_pdf/fonts/ariali.afm b/thirdparty/html2ps_pdf/fonts/ariali.afm similarity index 97% rename from gulliver/thirdparty/html2ps_pdf/fonts/ariali.afm rename to thirdparty/html2ps_pdf/fonts/ariali.afm index dd2e40d81..eef538f8e 100644 --- a/gulliver/thirdparty/html2ps_pdf/fonts/ariali.afm +++ b/thirdparty/html2ps_pdf/fonts/ariali.afm @@ -1,1871 +1,1871 @@ -StartFontMetrics 4.1 -FontName Arial-ItalicMT -FullName Arial Italic -Notice Typeface The Monotype Corporation plc. Data The Monotype Corporation plc/Type Solutions Inc. 1990-1992. All Rights Reserved -EncodingScheme FontSpecific -FamilyName Arial -Weight Italic -Version Version 2.90 -Characters 956 -ItalicAngle -12.0 -Ascender 905 -Descender -212 -UnderlineThickness 73 -UnderlinePosition -106 -IsFixedPitch false -FontBBox -517 -325 1082 998 -StartCharMetrics 991 -C 0 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 1 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 2 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 3 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 4 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 5 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 6 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 7 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 8 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 9 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 10 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 11 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 12 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 13 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 14 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 15 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 16 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 17 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 18 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 19 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 20 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 21 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 22 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 23 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 24 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 25 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 26 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 27 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 28 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 29 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 30 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 31 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 32 ; WX 278 ; N space ; B 56 0 304 716 ; -C 33 ; WX 278 ; N exclam ; B 56 0 304 716 ; -C 34 ; WX 355 ; N quotedbl ; B 135 462 429 716 ; -C 35 ; WX 556 ; N numbersign ; B 10 -12 543 728 ; -C 36 ; WX 556 ; N dollar ; B 51 -96 573 764 ; -C 37 ; WX 889 ; N percent ; B 97 -26 853 728 ; -C 38 ; WX 667 ; N ampersand ; B 79 -17 651 728 ; -C 39 ; WX 191 ; N quotesingle ; B 127 462 259 716 ; -C 40 ; WX 333 ; N parenleft ; B 84 -210 413 728 ; -C 41 ; WX 333 ; N parenright ; B -53 -210 275 728 ; -C 42 ; WX 389 ; N asterisk ; B 31 423 354 728 ; -C 43 ; WX 584 ; N plus ; B 56 116 528 589 ; -C 44 ; WX 278 ; N comma ; B 24 -145 176 100 ; -C 45 ; WX 333 ; N hyphen ; B 46 215 334 303 ; -C 46 ; WX 278 ; N period ; B 58 0 179 100 ; -C 47 ; WX 278 ; N slash ; B -51 -12 411 728 ; -C 48 ; WX 556 ; N zero ; B 71 -12 565 719 ; -C 49 ; WX 556 ; N one ; B 148 0 479 719 ; -C 50 ; WX 556 ; N two ; B 59 0 562 719 ; -C 51 ; WX 556 ; N three ; B 55 -12 557 719 ; -C 52 ; WX 556 ; N four ; B 45 0 542 716 ; -C 53 ; WX 556 ; N five ; B 69 -12 572 706 ; -C 54 ; WX 556 ; N six ; B 83 -12 568 719 ; -C 55 ; WX 556 ; N seven ; B 121 0 595 706 ; -C 56 ; WX 556 ; N eight ; B 75 -13 564 719 ; -C 57 ; WX 556 ; N nine ; B 67 -12 551 719 ; -C 58 ; WX 278 ; N colon ; B 57 0 265 519 ; -C 59 ; WX 278 ; N semicolon ; B 24 -145 262 519 ; -C 60 ; WX 584 ; N less ; B 55 110 529 595 ; -C 61 ; WX 584 ; N equal ; B 56 204 528 503 ; -C 62 ; WX 584 ; N greater ; B 55 110 529 595 ; -C 63 ; WX 556 ; N question ; B 127 0 561 728 ; -C 64 ; WX 1015 ; N at ; B 54 -210 979 729 ; -C 65 ; WX 667 ; N A ; B -20 0 617 716 ; -C 66 ; WX 667 ; N B ; B 43 0 655 716 ; -C 67 ; WX 722 ; N C ; B 91 -12 730 728 ; -C 68 ; WX 722 ; N D ; B 44 0 712 716 ; -C 69 ; WX 667 ; N E ; B 45 0 711 716 ; -C 70 ; WX 611 ; N F ; B 45 0 660 716 ; -C 71 ; WX 778 ; N G ; B 97 -12 766 728 ; -C 72 ; WX 722 ; N H ; B 42 0 754 716 ; -C 73 ; WX 278 ; N I ; B 57 0 302 716 ; -C 74 ; WX 500 ; N J ; B 33 -12 536 716 ; -C 75 ; WX 667 ; N K ; B 44 0 741 716 ; -C 76 ; WX 556 ; N L ; B 40 0 524 716 ; -C 77 ; WX 833 ; N M ; B 44 0 872 716 ; -C 78 ; WX 722 ; N N ; B 49 0 757 716 ; -C 79 ; WX 778 ; N O ; B 91 -12 772 728 ; -C 80 ; WX 667 ; N P ; B 43 0 698 716 ; -C 81 ; WX 778 ; N Q ; B 92 -82 773 728 ; -C 82 ; WX 722 ; N R ; B 47 0 730 716 ; -C 83 ; WX 667 ; N S ; B 70 -12 671 728 ; -C 84 ; WX 611 ; N T ; B 125 0 705 716 ; -C 85 ; WX 722 ; N U ; B 97 -13 754 716 ; -C 86 ; WX 667 ; N V ; B 124 0 757 716 ; -C 87 ; WX 944 ; N W ; B 125 0 1062 716 ; -C 88 ; WX 667 ; N X ; B -32 0 769 716 ; -C 89 ; WX 667 ; N Y ; B 117 0 773 716 ; -C 90 ; WX 611 ; N Z ; B 24 0 637 716 ; -C 91 ; WX 278 ; N bracketleft ; B 6 -196 391 716 ; -C 92 ; WX 278 ; N backslash ; B 85 -12 273 728 ; -C 93 ; WX 278 ; N bracketright ; B -59 -196 329 716 ; -C 94 ; WX 469 ; N asciicircum ; B 26 337 443 728 ; -C 95 ; WX 556 ; N underscore ; B -15 -199 567 -135 ; -C 96 ; WX 333 ; N grave ; B 146 582 310 716 ; -C 97 ; WX 556 ; N a ; B 44 -12 526 530 ; -C 98 ; WX 556 ; N b ; B 33 -12 535 716 ; -C 99 ; WX 500 ; N c ; B 56 -12 511 530 ; -C 100 ; WX 556 ; N d ; B 53 -12 598 716 ; -C 101 ; WX 556 ; N e ; B 52 -12 532 530 ; -C 102 ; WX 278 ; N f ; B 45 0 408 728 ; -C 103 ; WX 556 ; N g ; B 26 -208 564 530 ; -C 104 ; WX 556 ; N h ; B 33 0 529 716 ; -C 105 ; WX 222 ; N i ; B 30 0 268 716 ; -C 106 ; WX 222 ; N j ; B -121 -208 267 716 ; -C 107 ; WX 500 ; N k ; B 34 0 554 716 ; -C 108 ; WX 222 ; N l ; B 26 0 264 716 ; -C 109 ; WX 833 ; N m ; B 33 0 813 530 ; -C 110 ; WX 556 ; N n ; B 33 0 528 530 ; -C 111 ; WX 556 ; N o ; B 49 -12 540 530 ; -C 112 ; WX 556 ; N p ; B -10 -199 535 530 ; -C 113 ; WX 556 ; N q ; B 51 -199 552 530 ; -C 114 ; WX 333 ; N r ; B 33 0 419 530 ; -C 115 ; WX 500 ; N s ; B 38 -12 501 530 ; -C 116 ; WX 278 ; N t ; B 56 -9 321 707 ; -C 117 ; WX 556 ; N u ; B 63 -12 558 519 ; -C 118 ; WX 500 ; N v ; B 79 0 559 519 ; -C 119 ; WX 722 ; N w ; B 78 0 777 519 ; -C 120 ; WX 500 ; N x ; B -1 0 538 519 ; -C 121 ; WX 500 ; N y ; B 0 -210 561 519 ; -C 122 ; WX 500 ; N z ; B 20 0 512 519 ; -C 123 ; WX 334 ; N braceleft ; B 52 -210 445 728 ; -C 124 ; WX 260 ; N bar ; B 92 -210 168 728 ; -C 125 ; WX 334 ; N braceright ; B -84 -210 309 728 ; -C 126 ; WX 584 ; N asciitilde ; B 42 272 542 432 ; -C 127 ; WX 750 ; N .notdef ; B 125 0 625 625 ; -C 128 ; WX 556 ; N Euro ; B 40 -12 645 728 ; -C 129 ; WX 544 ; N afii10052 ; B 42 0 656 894 ; -C 130 ; WX 222 ; N quotesinglbase ; B -7 -145 145 100 ; -C 131 ; WX 556 ; N florin ; B 22 -210 530 729 ; -C 132 ; WX 333 ; N quotedblbase ; B -20 -145 292 100 ; -C 133 ; WX 1000 ; N ellipsis ; B 144 0 933 100 ; -C 134 ; WX 556 ; N dagger ; B 91 -170 583 706 ; -C 135 ; WX 556 ; N daggerdbl ; B 5 -170 588 706 ; -C 136 ; WX 333 ; N circumflex ; B 100 582 388 716 ; -C 137 ; WX 1000 ; N perthousand ; B 66 -27 1003 728 ; -C 138 ; WX 667 ; N Scaron ; B 70 -12 671 894 ; -C 139 ; WX 333 ; N guilsinglleft ; B 47 35 314 479 ; -C 140 ; WX 1000 ; N OE ; B 80 -13 1044 728 ; -C 141 ; WX 589 ; N afii10061 ; B 42 0 674 894 ; -C 142 ; WX 611 ; N Zcaron ; B 24 0 637 894 ; -C 143 ; WX 724 ; N afii10145 ; B 42 -199 760 716 ; -C 144 ; WX 333 ; N quotedblbase ; B -20 -145 292 100 ; -C 145 ; WX 222 ; N quoteleft ; B 129 483 281 728 ; -C 146 ; WX 222 ; N quoteright ; B 125 468 277 713 ; -C 147 ; WX 333 ; N quotedblleft ; B 105 483 413 728 ; -C 148 ; WX 333 ; N quotedblright ; B 104 468 417 713 ; -C 149 ; WX 350 ; N bullet ; B 53 227 301 474 ; -C 150 ; WX 556 ; N endash ; B -2 224 554 294 ; -C 151 ; WX 1000 ; N emdash ; B 0 224 1000 294 ; -C 152 ; WX 333 ; N tilde ; B 94 596 424 706 ; -C 153 ; WX 1000 ; N trademark ; B 110 318 871 716 ; -C 154 ; WX 500 ; N scaron ; B 38 -12 504 716 ; -C 155 ; WX 333 ; N guilsinglright ; B 16 35 288 479 ; -C 156 ; WX 944 ; N oe ; B 63 -12 919 530 ; -C 157 ; WX 472 ; N afii10109 ; B 31 0 520 716 ; -C 158 ; WX 500 ; N zcaron ; B 20 0 512 716 ; -C 159 ; WX 667 ; N Ydieresis ; B 117 0 773 858 ; -C 160 ; WX 278 ; N space ; B 56 0 304 716 ; -C 161 ; WX 333 ; N exclamdown ; B 30 -197 278 519 ; -C 162 ; WX 556 ; N cent ; B 75 -199 530 726 ; -C 163 ; WX 556 ; N sterling ; B 31 -12 607 728 ; -C 164 ; WX 556 ; N currency ; B 36 115 516 594 ; -C 165 ; WX 556 ; N yen ; B 37 0 667 716 ; -C 166 ; WX 260 ; N brokenbar ; B 92 -210 168 728 ; -C 167 ; WX 556 ; N section ; B 30 -210 555 728 ; -C 168 ; WX 333 ; N dieresis ; B 116 599 409 699 ; -C 169 ; WX 737 ; N copyright ; B 1 -9 738 728 ; -C 170 ; WX 370 ; N ordfeminine ; B 82 359 409 728 ; -C 171 ; WX 556 ; N guillemotleft ; B 79 35 537 479 ; -C 172 ; WX 584 ; N logicalnot ; B 56 207 528 503 ; -C 173 ; WX 333 ; N hyphen ; B 46 215 334 303 ; -C 174 ; WX 737 ; N registered ; B 1 -9 738 728 ; -C 175 ; WX 552 ; N overscore ; B -15 765 567 828 ; -C 176 ; WX 400 ; N degree ; B 63 457 333 728 ; -C 177 ; WX 549 ; N plusminus ; B 38 0 511 600 ; -C 178 ; WX 333 ; N twosuperior ; B 74 358 401 725 ; -C 179 ; WX 333 ; N threesuperior ; B 83 349 400 725 ; -C 180 ; WX 333 ; N acute ; B 169 582 372 716 ; -C 181 ; WX 576 ; N mu1 ; B 6 -200 572 519 ; -C 182 ; WX 537 ; N paragraph ; B 69 -199 609 716 ; -C 183 ; WX 278 ; N periodcentered ; B 90 302 190 402 ; -C 184 ; WX 333 ; N cedilla ; B 38 -208 288 6 ; -C 185 ; WX 333 ; N onesuperior ; B 136 358 354 725 ; -C 186 ; WX 365 ; N ordmasculine ; B 70 360 412 728 ; -C 187 ; WX 556 ; N guillemotright ; B 41 35 505 479 ; -C 188 ; WX 834 ; N onequarter ; B 83 -30 851 728 ; -C 189 ; WX 834 ; N onehalf ; B 60 -30 827 728 ; -C 190 ; WX 834 ; N threequarters ; B 83 -30 865 728 ; -C 191 ; WX 611 ; N questiondown ; B 57 -209 490 519 ; -C 192 ; WX 667 ; N Agrave ; B -20 0 617 895 ; -C 193 ; WX 667 ; N Aacute ; B -20 0 617 894 ; -C 194 ; WX 667 ; N Acircumflex ; B -20 0 617 894 ; -C 195 ; WX 667 ; N Atilde ; B -20 0 617 868 ; -C 196 ; WX 667 ; N Adieresis ; B -20 0 617 860 ; -C 197 ; WX 667 ; N Aring ; B -20 0 617 863 ; -C 198 ; WX 1000 ; N AE ; B -41 0 1043 716 ; -C 199 ; WX 722 ; N Ccedilla ; B 91 -210 730 728 ; -C 200 ; WX 667 ; N Egrave ; B 45 0 711 895 ; -C 201 ; WX 667 ; N Eacute ; B 45 0 711 894 ; -C 202 ; WX 667 ; N Ecircumflex ; B 45 0 711 894 ; -C 203 ; WX 667 ; N Edieresis ; B 45 0 711 858 ; -C 204 ; WX 278 ; N Igrave ; B 57 0 340 895 ; -C 205 ; WX 278 ; N Iacute ; B 57 0 389 894 ; -C 206 ; WX 278 ; N Icircumflex ; B 57 0 407 894 ; -C 207 ; WX 278 ; N Idieresis ; B 57 0 414 860 ; -C 208 ; WX 722 ; N Eth ; B 36 0 712 716 ; -C 209 ; WX 722 ; N Ntilde ; B 49 0 757 868 ; -C 210 ; WX 778 ; N Ograve ; B 91 -12 772 895 ; -C 211 ; WX 778 ; N Oacute ; B 91 -12 772 894 ; -C 212 ; WX 778 ; N Ocircumflex ; B 91 -12 772 894 ; -C 213 ; WX 778 ; N Otilde ; B 91 -12 772 868 ; -C 214 ; WX 778 ; N Odieresis ; B 91 -12 772 860 ; -C 215 ; WX 584 ; N multiply ; B 79 141 504 566 ; -C 216 ; WX 778 ; N Oslash ; B 85 -50 776 765 ; -C 217 ; WX 722 ; N Ugrave ; B 97 -13 754 895 ; -C 218 ; WX 722 ; N Uacute ; B 97 -13 754 894 ; -C 219 ; WX 722 ; N Ucircumflex ; B 97 -13 754 894 ; -C 220 ; WX 722 ; N Udieresis ; B 97 -13 754 860 ; -C 221 ; WX 667 ; N Yacute ; B 117 0 773 894 ; -C 222 ; WX 667 ; N Thorn ; B 43 0 667 716 ; -C 223 ; WX 611 ; N germandbls ; B 36 -12 567 728 ; -C 224 ; WX 556 ; N agrave ; B 44 -12 526 716 ; -C 225 ; WX 556 ; N aacute ; B 44 -12 526 716 ; -C 226 ; WX 556 ; N acircumflex ; B 44 -12 526 716 ; -C 227 ; WX 556 ; N atilde ; B 44 -12 541 707 ; -C 228 ; WX 556 ; N adieresis ; B 44 -12 526 699 ; -C 229 ; WX 556 ; N aring ; B 44 -12 526 733 ; -C 230 ; WX 889 ; N ae ; B 42 -12 865 531 ; -C 231 ; WX 500 ; N ccedilla ; B 56 -199 511 530 ; -C 232 ; WX 556 ; N egrave ; B 52 -12 532 716 ; -C 233 ; WX 556 ; N eacute ; B 52 -12 532 716 ; -C 234 ; WX 556 ; N ecircumflex ; B 52 -12 532 716 ; -C 235 ; WX 556 ; N edieresis ; B 52 -12 532 699 ; -C 236 ; WX 278 ; N igrave ; B 61 0 310 716 ; -C 237 ; WX 278 ; N iacute ; B 61 0 349 716 ; -C 238 ; WX 278 ; N icircumflex ; B 61 0 362 716 ; -C 239 ; WX 278 ; N idieresis ; B 61 0 378 699 ; -C 240 ; WX 556 ; N eth ; B 49 -12 546 716 ; -C 241 ; WX 556 ; N ntilde ; B 33 0 532 706 ; -C 242 ; WX 556 ; N ograve ; B 49 -12 540 716 ; -C 243 ; WX 556 ; N oacute ; B 49 -12 540 716 ; -C 244 ; WX 556 ; N ocircumflex ; B 49 -12 540 716 ; -C 245 ; WX 556 ; N otilde ; B 49 -12 540 706 ; -C 246 ; WX 556 ; N odieresis ; B 49 -12 540 699 ; -C 247 ; WX 549 ; N divide ; B 38 156 511 550 ; -C 248 ; WX 611 ; N oslash ; B 72 -50 581 566 ; -C 249 ; WX 556 ; N ugrave ; B 63 -12 558 716 ; -C 250 ; WX 556 ; N uacute ; B 63 -12 558 716 ; -C 251 ; WX 556 ; N ucircumflex ; B 63 -12 558 716 ; -C 252 ; WX 556 ; N udieresis ; B 63 -12 558 699 ; -C 253 ; WX 500 ; N yacute ; B 0 -210 561 716 ; -C 254 ; WX 556 ; N thorn ; B -10 -199 535 716 ; -C 255 ; WX 500 ; N ydieresis ; B 0 -210 561 699 ; -C -1 ; WX 0 ; N .null ; B 56 0 304 716 ; -C -1 ; WX 278 ; N nonmarkingreturn ; B 56 0 304 716 ; -C -1 ; WX 549 ; N notequal ; B 38 -14 511 720 ; -C -1 ; WX 713 ; N infinity ; B 75 189 640 510 ; -C -1 ; WX 549 ; N lessequal ; B 38 52 512 654 ; -C -1 ; WX 549 ; N greaterequal ; B 38 52 512 654 ; -C -1 ; WX 494 ; N partialdiff ; B 25 -12 473 728 ; -C -1 ; WX 713 ; N summation ; B 60 -210 677 728 ; -C -1 ; WX 823 ; N product ; B 79 -210 744 728 ; -C -1 ; WX 549 ; N pi1 ; B 0 0 601 519 ; -C -1 ; WX 274 ; N integral ; B 0 -107 273 910 ; -C -1 ; WX 768 ; N Ohm ; B 62 0 720 734 ; -C -1 ; WX 549 ; N radical ; B 42 -38 550 913 ; -C -1 ; WX 549 ; N approxequal ; B 25 184 524 521 ; -C -1 ; WX 612 ; N increment ; B 14 0 600 677 ; -C -1 ; WX 494 ; N lozenge ; B 23 0 472 694 ; -C -1 ; WX 167 ; N fraction ; B -262 -30 505 728 ; -C -1 ; WX 500 ; N fi ; B 54 0 545 728 ; -C -1 ; WX 500 ; N fl ; B 54 0 545 728 ; -C -1 ; WX 278 ; N dotlessi ; B 61 0 258 519 ; -C -1 ; WX 333 ; N macron ; B 98 600 416 668 ; -C -1 ; WX 333 ; N breve ; B 107 567 399 694 ; -C -1 ; WX 333 ; N dotaccent ; B 194 590 326 699 ; -C -1 ; WX 333 ; N ring ; B 160 556 338 733 ; -C -1 ; WX 333 ; N hungarumlaut ; B 86 582 454 716 ; -C -1 ; WX 333 ; N ogonek ; B 61 -208 265 13 ; -C -1 ; WX 333 ; N caron ; B 129 582 416 716 ; -C -1 ; WX 556 ; N Lslash ; B 12 0 524 716 ; -C -1 ; WX 222 ; N lslash ; B 19 0 285 716 ; -C -1 ; WX 584 ; N minus ; B 56 312 528 394 ; -C -1 ; WX 556 ; N franc ; B -12 0 602 716 ; -C -1 ; WX 778 ; N Gbreve ; B 97 -12 766 886 ; -C -1 ; WX 556 ; N gbreve ; B 26 -208 564 694 ; -C -1 ; WX 278 ; N Idot ; B 57 0 334 864 ; -C -1 ; WX 667 ; N Scedilla ; B 70 -210 671 728 ; -C -1 ; WX 500 ; N scedilla ; B 38 -199 501 530 ; -C -1 ; WX 722 ; N Cacute ; B 91 -12 730 894 ; -C -1 ; WX 500 ; N cacute ; B 56 -12 511 716 ; -C -1 ; WX 722 ; N Ccaron ; B 91 -12 730 894 ; -C -1 ; WX 500 ; N ccaron ; B 56 -12 515 716 ; -C -1 ; WX 556 ; N dmacron ; B 53 -12 653 716 ; -C -1 ; WX 333 ; N middot ; B 259 308 380 408 ; -C -1 ; WX 667 ; N Abreve ; B -20 0 617 886 ; -C -1 ; WX 556 ; N abreve ; B 44 -12 526 694 ; -C -1 ; WX 667 ; N Aogonek ; B -20 -208 698 716 ; -C -1 ; WX 556 ; N aogonek ; B 44 -208 570 530 ; -C -1 ; WX 722 ; N Dcaron ; B 44 0 712 894 ; -C -1 ; WX 625 ; N dcaron ; B 55 -12 743 716 ; -C -1 ; WX 722 ; N Dslash ; B 36 0 712 716 ; -C -1 ; WX 667 ; N Eogonek ; B 45 -208 711 716 ; -C -1 ; WX 556 ; N eogonek ; B 52 -208 532 530 ; -C -1 ; WX 667 ; N Ecaron ; B 45 0 711 894 ; -C -1 ; WX 556 ; N ecaron ; B 52 -12 532 716 ; -C -1 ; WX 556 ; N Lacute ; B 40 0 524 894 ; -C -1 ; WX 222 ; N lacute ; B 26 0 351 887 ; -C -1 ; WX 556 ; N Lcaron ; B 40 0 559 716 ; -C -1 ; WX 281 ; N lcaron ; B 27 0 399 716 ; -C -1 ; WX 556 ; N Ldot ; B 40 0 524 716 ; -C -1 ; WX 400 ; N ldot ; B 26 0 369 716 ; -C -1 ; WX 722 ; N Nacute ; B 49 0 757 894 ; -C -1 ; WX 556 ; N nacute ; B 33 0 528 716 ; -C -1 ; WX 722 ; N Ncaron ; B 49 0 757 894 ; -C -1 ; WX 556 ; N ncaron ; B 33 0 530 716 ; -C -1 ; WX 778 ; N Odblacute ; B 91 -12 772 894 ; -C -1 ; WX 556 ; N odblacute ; B 49 -12 582 716 ; -C -1 ; WX 722 ; N Racute ; B 47 0 730 894 ; -C -1 ; WX 333 ; N racute ; B 33 0 419 716 ; -C -1 ; WX 722 ; N Rcaron ; B 47 0 730 894 ; -C -1 ; WX 333 ; N rcaron ; B 33 0 452 716 ; -C -1 ; WX 667 ; N Sacute ; B 70 -12 671 894 ; -C -1 ; WX 500 ; N sacute ; B 38 -12 501 716 ; -C -1 ; WX 611 ; N Tcedilla ; B 125 -275 705 716 ; -C -1 ; WX 278 ; N tcedilla ; B 47 -253 321 707 ; -C -1 ; WX 611 ; N Tcaron ; B 125 0 705 894 ; -C -1 ; WX 354 ; N tcaron ; B 53 -9 473 716 ; -C -1 ; WX 722 ; N Uring ; B 97 -13 754 894 ; -C -1 ; WX 556 ; N uring ; B 63 -12 558 733 ; -C -1 ; WX 722 ; N Udblacute ; B 97 -13 754 894 ; -C -1 ; WX 556 ; N udblacute ; B 63 -12 568 716 ; -C -1 ; WX 611 ; N Zacute ; B 24 0 637 894 ; -C -1 ; WX 500 ; N zacute ; B 20 0 512 716 ; -C -1 ; WX 611 ; N Zdot ; B 24 0 637 864 ; -C -1 ; WX 500 ; N zdot ; B 20 0 512 699 ; -C -1 ; WX 570 ; N Gamma ; B 42 0 659 716 ; -C -1 ; WX 778 ; N Theta ; B 91 -12 772 728 ; -C -1 ; WX 837 ; N Phi ; B 88 -28 826 736 ; -C -1 ; WX 570 ; N alpha ; B 50 -12 599 530 ; -C -1 ; WX 556 ; N delta ; B 48 -12 590 716 ; -C -1 ; WX 439 ; N epsilon ; B 34 -12 458 530 ; -C -1 ; WX 603 ; N sigma ; B 49 -12 645 530 ; -C -1 ; WX 374 ; N tau ; B 86 0 415 519 ; -C -1 ; WX 652 ; N phi ; B 54 -199 640 530 ; -C -1 ; WX 552 ; N underscoredbl ; B -15 -325 567 -135 ; -C -1 ; WX 500 ; N exclamdbl ; B 56 0 522 716 ; -C -1 ; WX 365 ; N nsuperior ; B 58 253 393 585 ; -C -1 ; WX 1094 ; N peseta ; B 12 -13 1075 716 ; -C -1 ; WX 1000 ; N arrowleft ; B 39 77 961 428 ; -C -1 ; WX 500 ; N arrowup ; B 75 -209 426 654 ; -C -1 ; WX 1000 ; N arrowright ; B 39 77 961 428 ; -C -1 ; WX 500 ; N arrowdown ; B 75 -209 426 654 ; -C -1 ; WX 1000 ; N arrowboth ; B 39 77 961 429 ; -C -1 ; WX 500 ; N arrowupdn ; B 74 -208 425 714 ; -C -1 ; WX 500 ; N arrowupdnbse ; B 74 -303 425 714 ; -C -1 ; WX 979 ; N orthogonal ; B 177 0 802 625 ; -C -1 ; WX 719 ; N intersection ; B 77 0 642 729 ; -C -1 ; WX 584 ; N equivalence ; B 56 95 528 611 ; -C -1 ; WX 604 ; N house ; B 77 0 527 563 ; -C -1 ; WX 584 ; N revlogicalnot ; B 55 207 528 503 ; -C -1 ; WX 604 ; N integraltp ; B 267 -251 477 848 ; -C -1 ; WX 604 ; N integralbt ; B 127 -251 337 848 ; -C -1 ; WX 708 ; N SF100000 ; B -11 261 719 346 ; -C -1 ; WX 625 ; N SF110000 ; B 223 -303 309 910 ; -C -1 ; WX 708 ; N SF010000 ; B 312 -303 720 346 ; -C -1 ; WX 708 ; N SF030000 ; B -11 -303 396 346 ; -C -1 ; WX 708 ; N SF020000 ; B 312 261 720 910 ; -C -1 ; WX 708 ; N SF040000 ; B -11 261 396 910 ; -C -1 ; WX 708 ; N SF080000 ; B 312 -303 720 910 ; -C -1 ; WX 708 ; N SF090000 ; B -11 -303 396 910 ; -C -1 ; WX 708 ; N SF060000 ; B -11 -303 719 346 ; -C -1 ; WX 708 ; N SF070000 ; B -11 261 719 910 ; -C -1 ; WX 708 ; N SF050000 ; B -11 -303 719 910 ; -C -1 ; WX 708 ; N SF430000 ; B -11 168 719 439 ; -C -1 ; WX 708 ; N SF240000 ; B 219 -303 490 910 ; -C -1 ; WX 708 ; N SF510000 ; B 312 -303 720 439 ; -C -1 ; WX 708 ; N SF520000 ; B 219 -303 720 346 ; -C -1 ; WX 708 ; N SF390000 ; B 219 -303 719 439 ; -C -1 ; WX 708 ; N SF220000 ; B -11 -303 396 439 ; -C -1 ; WX 708 ; N SF210000 ; B -11 -303 489 346 ; -C -1 ; WX 708 ; N SF250000 ; B -11 -303 489 439 ; -C -1 ; WX 708 ; N SF500000 ; B 312 168 720 910 ; -C -1 ; WX 708 ; N SF490000 ; B 219 261 720 910 ; -C -1 ; WX 708 ; N SF380000 ; B 219 168 719 910 ; -C -1 ; WX 708 ; N SF280000 ; B -11 168 396 910 ; -C -1 ; WX 708 ; N SF270000 ; B -11 261 489 910 ; -C -1 ; WX 708 ; N SF260000 ; B -11 168 489 910 ; -C -1 ; WX 708 ; N SF360000 ; B 312 -303 720 910 ; -C -1 ; WX 708 ; N SF370000 ; B 219 -303 720 910 ; -C -1 ; WX 708 ; N SF420000 ; B 219 -303 720 910 ; -C -1 ; WX 708 ; N SF190000 ; B -11 -303 396 910 ; -C -1 ; WX 708 ; N SF200000 ; B -11 -303 489 910 ; -C -1 ; WX 708 ; N SF230000 ; B -11 -303 489 910 ; -C -1 ; WX 708 ; N SF470000 ; B -11 -303 719 439 ; -C -1 ; WX 708 ; N SF480000 ; B -11 -303 719 346 ; -C -1 ; WX 708 ; N SF410000 ; B -11 -303 719 439 ; -C -1 ; WX 708 ; N SF450000 ; B -11 168 719 910 ; -C -1 ; WX 708 ; N SF460000 ; B -11 261 719 910 ; -C -1 ; WX 708 ; N SF400000 ; B -11 168 719 910 ; -C -1 ; WX 708 ; N SF540000 ; B -11 -303 719 910 ; -C -1 ; WX 708 ; N SF530000 ; B -11 -303 719 910 ; -C -1 ; WX 708 ; N SF440000 ; B -11 -303 719 910 ; -C -1 ; WX 708 ; N upblock ; B -11 303 719 910 ; -C -1 ; WX 708 ; N dnblock ; B -11 -303 719 303 ; -C -1 ; WX 708 ; N block ; B -11 -303 719 910 ; -C -1 ; WX 708 ; N lfblock ; B -11 -303 354 910 ; -C -1 ; WX 708 ; N rtblock ; B 354 -303 720 910 ; -C -1 ; WX 708 ; N ltshade ; B 50 -246 719 910 ; -C -1 ; WX 708 ; N shade ; B -11 -246 719 910 ; -C -1 ; WX 729 ; N dkshade ; B 0 -307 729 910 ; -C -1 ; WX 604 ; N filledbox ; B 71 0 532 461 ; -C -1 ; WX 1000 ; N filledrect ; B 0 155 1000 343 ; -C -1 ; WX 990 ; N triagup ; B 148 0 842 693 ; -C -1 ; WX 990 ; N triagrt ; B 141 -15 849 692 ; -C -1 ; WX 990 ; N triagdn ; B 148 -15 842 678 ; -C -1 ; WX 990 ; N triaglf ; B 141 -15 849 692 ; -C -1 ; WX 604 ; N circle ; B 87 67 517 497 ; -C -1 ; WX 604 ; N invbullet ; B 63 0 541 479 ; -C -1 ; WX 604 ; N invcircle ; B 21 0 584 564 ; -C -1 ; WX 1021 ; N smileface ; B 199 -58 822 564 ; -C -1 ; WX 1052 ; N invsmileface ; B 215 -58 837 564 ; -C -1 ; WX 917 ; N sun ; B 8 -109 909 792 ; -C -1 ; WX 750 ; N female ; B 119 -214 630 736 ; -C -1 ; WX 750 ; N male ; B 54 -128 691 791 ; -C -1 ; WX 531 ; N spade ; B 28 0 503 601 ; -C -1 ; WX 656 ; N club ; B 27 0 629 601 ; -C -1 ; WX 594 ; N heart ; B 31 -12 563 601 ; -C -1 ; WX 510 ; N diamond ; B 31 -12 479 601 ; -C -1 ; WX 500 ; N musicalnote ; B 18 -18 482 666 ; -C -1 ; WX 750 ; N musicalnotedbl ; B 42 -63 649 742 ; -C -1 ; WX 733 ; N IJ ; B 57 -12 769 716 ; -C -1 ; WX 444 ; N ij ; B 29 -208 494 716 ; -C -1 ; WX 615 ; N napostrophe ; B 49 0 590 713 ; -C -1 ; WX 188 ; N minute ; B 127 462 259 716 ; -C -1 ; WX 354 ; N second ; B 135 462 429 716 ; -C -1 ; WX 885 ; N afii61248 ; B 90 -26 870 728 ; -C -1 ; WX 323 ; N afii61289 ; B 12 -12 422 728 ; -C -1 ; WX 604 ; N H22073 ; B 71 0 532 461 ; -C -1 ; WX 354 ; N H18543 ; B 64 217 290 444 ; -C -1 ; WX 354 ; N H18551 ; B 64 217 290 444 ; -C -1 ; WX 604 ; N H18533 ; B 87 67 517 497 ; -C -1 ; WX 354 ; N openbullet ; B 55 208 300 453 ; -C -1 ; WX 667 ; N Amacron ; B -20 0 618 845 ; -C -1 ; WX 556 ; N amacron ; B 44 -12 527 668 ; -C -1 ; WX 722 ; N Ccircumflex ; B 91 -12 730 894 ; -C -1 ; WX 500 ; N ccircumflex ; B 56 -12 511 716 ; -C -1 ; WX 722 ; N Cdot ; B 91 -12 730 869 ; -C -1 ; WX 500 ; N cdot ; B 56 -12 511 699 ; -C -1 ; WX 667 ; N Emacron ; B 45 0 711 845 ; -C -1 ; WX 556 ; N emacron ; B 52 -12 532 668 ; -C -1 ; WX 667 ; N Ebreve ; B 45 0 711 886 ; -C -1 ; WX 556 ; N ebreve ; B 52 -12 532 694 ; -C -1 ; WX 667 ; N Edot ; B 45 0 711 869 ; -C -1 ; WX 556 ; N edot ; B 52 -12 532 699 ; -C -1 ; WX 778 ; N Gcircumflex ; B 97 -12 766 894 ; -C -1 ; WX 556 ; N gcircumflex ; B 26 -208 564 716 ; -C -1 ; WX 778 ; N Gdot ; B 97 -12 766 869 ; -C -1 ; WX 556 ; N gdot ; B 26 -208 564 699 ; -C -1 ; WX 778 ; N Gcedilla ; B 97 -208 766 728 ; -C -1 ; WX 556 ; N gcedilla ; B 26 -208 564 770 ; -C -1 ; WX 722 ; N Hcircumflex ; B 42 0 754 894 ; -C -1 ; WX 556 ; N hcircumflex ; B 33 0 529 894 ; -C -1 ; WX 722 ; N Hbar ; B 42 0 797 716 ; -C -1 ; WX 556 ; N hbar ; B 33 0 529 716 ; -C -1 ; WX 278 ; N Itilde ; B 57 0 438 869 ; -C -1 ; WX 278 ; N itilde ; B 30 0 378 706 ; -C -1 ; WX 278 ; N Imacron ; B 57 0 430 845 ; -C -1 ; WX 278 ; N imacron ; B 30 0 369 668 ; -C -1 ; WX 278 ; N Ibreve ; B 57 0 431 886 ; -C -1 ; WX 278 ; N ibreve ; B 30 0 362 694 ; -C -1 ; WX 278 ; N Iogonek ; B 28 -208 302 716 ; -C -1 ; WX 222 ; N iogonek ; B 0 -208 268 716 ; -C -1 ; WX 500 ; N Jcircumflex ; B 33 -12 625 894 ; -C -1 ; WX 222 ; N jcircumflex ; B -121 -208 331 716 ; -C -1 ; WX 667 ; N Kcedilla ; B 44 -208 741 716 ; -C -1 ; WX 500 ; N kcedilla ; B 34 -208 554 716 ; -C -1 ; WX 500 ; N kgreenlandic ; B 34 0 554 519 ; -C -1 ; WX 556 ; N Lcedilla ; B 40 -208 524 716 ; -C -1 ; WX 222 ; N lcedilla ; B -71 -208 264 716 ; -C -1 ; WX 722 ; N Ncedilla ; B 49 -208 757 716 ; -C -1 ; WX 556 ; N ncedilla ; B 33 -208 528 530 ; -C -1 ; WX 723 ; N Eng ; B 48 -13 715 728 ; -C -1 ; WX 556 ; N eng ; B 36 -208 530 530 ; -C -1 ; WX 778 ; N Omacron ; B 91 -12 772 845 ; -C -1 ; WX 556 ; N omacron ; B 49 -12 540 668 ; -C -1 ; WX 778 ; N Obreve ; B 91 -12 772 886 ; -C -1 ; WX 556 ; N obreve ; B 49 -12 540 694 ; -C -1 ; WX 722 ; N Rcedilla ; B 47 -208 730 716 ; -C -1 ; WX 333 ; N rcedilla ; B -28 -208 419 530 ; -C -1 ; WX 667 ; N Scircumflex ; B 70 -12 671 894 ; -C -1 ; WX 500 ; N scircumflex ; B 38 -12 501 716 ; -C -1 ; WX 611 ; N Tbar ; B 115 0 705 716 ; -C -1 ; WX 278 ; N tbar ; B 12 -9 321 707 ; -C -1 ; WX 722 ; N Utilde ; B 97 -13 754 869 ; -C -1 ; WX 556 ; N utilde ; B 63 -12 558 706 ; -C -1 ; WX 722 ; N Umacron ; B 97 -13 754 845 ; -C -1 ; WX 556 ; N umacron ; B 63 -12 558 668 ; -C -1 ; WX 722 ; N Ubreve ; B 97 -13 754 886 ; -C -1 ; WX 556 ; N ubreve ; B 63 -12 558 694 ; -C -1 ; WX 722 ; N Uogonek ; B 97 -208 754 716 ; -C -1 ; WX 556 ; N uogonek ; B 63 -208 557 519 ; -C -1 ; WX 944 ; N Wcircumflex ; B 125 0 1062 894 ; -C -1 ; WX 722 ; N wcircumflex ; B 78 0 777 716 ; -C -1 ; WX 667 ; N Ycircumflex ; B 117 0 773 894 ; -C -1 ; WX 500 ; N ycircumflex ; B 0 -210 561 716 ; -C -1 ; WX 222 ; N longs ; B 26 0 389 728 ; -C -1 ; WX 667 ; N Aringacute ; B -20 0 622 998 ; -C -1 ; WX 556 ; N aringacute ; B 44 -12 526 914 ; -C -1 ; WX 1000 ; N AEacute ; B -41 0 1043 894 ; -C -1 ; WX 889 ; N aeacute ; B 42 -12 865 716 ; -C -1 ; WX 778 ; N Oslashacute ; B 85 -50 776 894 ; -C -1 ; WX 611 ; N oslashacute ; B 72 -50 581 716 ; -C -1 ; WX 278 ; N anoteleia ; B 145 418 265 519 ; -C -1 ; WX 944 ; N Wgrave ; B 125 0 1062 894 ; -C -1 ; WX 722 ; N wgrave ; B 78 0 777 716 ; -C -1 ; WX 944 ; N Wacute ; B 125 0 1062 894 ; -C -1 ; WX 722 ; N wacute ; B 78 0 777 716 ; -C -1 ; WX 944 ; N Wdieresis ; B 125 0 1062 860 ; -C -1 ; WX 722 ; N wdieresis ; B 78 0 777 699 ; -C -1 ; WX 667 ; N Ygrave ; B 117 0 773 894 ; -C -1 ; WX 500 ; N ygrave ; B 0 -210 561 716 ; -C -1 ; WX 222 ; N quotereversed ; B 150 468 278 713 ; -C -1 ; WX 333 ; N radicalex ; B 75 600 451 668 ; -C -1 ; WX 556 ; N afii08941 ; B 31 -12 607 728 ; -C -1 ; WX 600 ; N estimated ; B 44 -17 561 535 ; -C -1 ; WX 834 ; N oneeighth ; B 60 -30 827 728 ; -C -1 ; WX 834 ; N threeeighths ; B 72 -30 839 728 ; -C -1 ; WX 834 ; N fiveeighths ; B 72 -30 839 728 ; -C -1 ; WX 834 ; N seveneighths ; B 48 -30 819 728 ; -C -1 ; WX 333 ; N commaaccent ; B 19 -257 169 -59 ; -C -1 ; WX 333 ; N undercommaaccent ; B -16 -208 234 -24 ; -C -1 ; WX 333 ; N tonos ; B 185 582 388 716 ; -C -1 ; WX 333 ; N dieresistonos ; B 47 582 449 717 ; -C -1 ; WX 667 ; N Alphatonos ; B -21 0 615 716 ; -C -1 ; WX 789 ; N Epsilontonos ; B 48 0 831 716 ; -C -1 ; WX 846 ; N Etatonos ; B 51 0 879 716 ; -C -1 ; WX 389 ; N Iotatonos ; B 48 0 410 716 ; -C -1 ; WX 794 ; N Omicrontonos ; B 42 -12 784 728 ; -C -1 ; WX 865 ; N Upsilontonos ; B 47 0 970 716 ; -C -1 ; WX 775 ; N Omegatonos ; B 13 0 765 728 ; -C -1 ; WX 222 ; N iotadieresistonos ; B -9 0 393 717 ; -C -1 ; WX 667 ; N Alpha ; B -20 0 617 716 ; -C -1 ; WX 667 ; N Beta ; B 43 0 655 716 ; -C -1 ; WX 671 ; N Delta ; B -10 0 627 716 ; -C -1 ; WX 667 ; N Epsilon ; B 45 0 711 716 ; -C -1 ; WX 611 ; N Zeta ; B 24 0 637 716 ; -C -1 ; WX 722 ; N Eta ; B 42 0 754 716 ; -C -1 ; WX 278 ; N Iota ; B 57 0 302 716 ; -C -1 ; WX 667 ; N Kappa ; B 44 0 741 716 ; -C -1 ; WX 667 ; N Lambda ; B -10 0 623 716 ; -C -1 ; WX 833 ; N Mu ; B 44 0 872 716 ; -C -1 ; WX 722 ; N Nu ; B 49 0 757 716 ; -C -1 ; WX 648 ; N Xi ; B 4 0 691 716 ; -C -1 ; WX 778 ; N Omicron ; B 91 -12 772 728 ; -C -1 ; WX 725 ; N Pi ; B 42 0 754 716 ; -C -1 ; WX 667 ; N Rho ; B 43 0 698 716 ; -C -1 ; WX 600 ; N Sigma ; B 22 0 666 716 ; -C -1 ; WX 611 ; N Tau ; B 125 0 705 716 ; -C -1 ; WX 667 ; N Upsilon ; B 117 0 773 716 ; -C -1 ; WX 667 ; N Chi ; B -32 0 769 716 ; -C -1 ; WX 831 ; N Psi ; B 124 0 886 716 ; -C -1 ; WX 761 ; N Omega ; B 3 0 755 728 ; -C -1 ; WX 278 ; N Iotadieresis ; B 57 0 429 860 ; -C -1 ; WX 667 ; N Upsilondieresis ; B 117 0 773 860 ; -C -1 ; WX 570 ; N alphatonos ; B 50 -12 599 716 ; -C -1 ; WX 439 ; N epsilontonos ; B 34 -12 458 716 ; -C -1 ; WX 555 ; N etatonos ; B 34 -199 528 716 ; -C -1 ; WX 222 ; N iotatonos ; B 30 0 315 716 ; -C -1 ; WX 550 ; N upsilondieresistonos ; B 73 -12 559 717 ; -C -1 ; WX 571 ; N beta ; B -11 -199 556 729 ; -C -1 ; WX 500 ; N gamma ; B 77 -199 557 519 ; -C -1 ; WX 463 ; N zeta ; B 49 -208 562 716 ; -C -1 ; WX 555 ; N eta ; B 34 -199 528 530 ; -C -1 ; WX 542 ; N theta ; B 63 -12 558 730 ; -C -1 ; WX 222 ; N iota ; B 30 0 227 519 ; -C -1 ; WX 500 ; N kappa ; B 29 0 550 519 ; -C -1 ; WX 492 ; N lambda ; B -25 0 447 716 ; -C -1 ; WX 548 ; N mu ; B -12 -199 554 519 ; -C -1 ; WX 500 ; N nu ; B 79 0 559 519 ; -C -1 ; WX 447 ; N xi ; B 56 -208 505 728 ; -C -1 ; WX 556 ; N omicron ; B 49 -12 540 530 ; -C -1 ; WX 573 ; N rho ; B -14 -199 558 530 ; -C -1 ; WX 486 ; N sigma1 ; B 54 -208 536 530 ; -C -1 ; WX 550 ; N upsilon ; B 73 -12 556 519 ; -C -1 ; WX 546 ; N chi ; B -72 -199 591 519 ; -C -1 ; WX 728 ; N psi ; B 76 -199 733 519 ; -C -1 ; WX 779 ; N omega ; B 49 -12 763 519 ; -C -1 ; WX 222 ; N iotadieresis ; B 30 0 352 699 ; -C -1 ; WX 550 ; N upsilondieresis ; B 73 -12 556 699 ; -C -1 ; WX 556 ; N omicrontonos ; B 49 -12 540 716 ; -C -1 ; WX 550 ; N upsilontonos ; B 73 -12 556 716 ; -C -1 ; WX 779 ; N omegatonos ; B 49 -12 763 716 ; -C -1 ; WX 667 ; N afii10023 ; B 45 0 711 860 ; -C -1 ; WX 843 ; N afii10051 ; B 113 -12 822 716 ; -C -1 ; WX 708 ; N afii10053 ; B 91 -12 731 728 ; -C -1 ; WX 667 ; N afii10054 ; B 70 -12 671 728 ; -C -1 ; WX 278 ; N afii10055 ; B 57 0 302 716 ; -C -1 ; WX 278 ; N afii10056 ; B 57 0 423 860 ; -C -1 ; WX 500 ; N afii10057 ; B 33 -12 536 716 ; -C -1 ; WX 1066 ; N afii10058 ; B -11 -12 1042 716 ; -C -1 ; WX 982 ; N afii10059 ; B 42 0 958 716 ; -C -1 ; WX 844 ; N afii10060 ; B 112 0 809 716 ; -C -1 ; WX 639 ; N afii10062 ; B 113 -10 751 883 ; -C -1 ; WX 667 ; N afii10017 ; B -20 0 617 716 ; -C -1 ; WX 651 ; N afii10018 ; B 42 0 657 716 ; -C -1 ; WX 667 ; N afii10019 ; B 43 0 655 716 ; -C -1 ; WX 544 ; N afii10020 ; B 42 0 656 716 ; -C -1 ; WX 704 ; N afii10021 ; B -63 -143 733 716 ; -C -1 ; WX 667 ; N afii10022 ; B 45 0 711 716 ; -C -1 ; WX 917 ; N afii10024 ; B -36 0 1002 721 ; -C -1 ; WX 614 ; N afii10025 ; B 48 -12 614 728 ; -C -1 ; WX 715 ; N afii10026 ; B 42 0 751 716 ; -C -1 ; WX 715 ; N afii10027 ; B 42 0 751 883 ; -C -1 ; WX 589 ; N afii10028 ; B 42 0 674 721 ; -C -1 ; WX 686 ; N afii10029 ; B -10 -8 723 716 ; -C -1 ; WX 833 ; N afii10030 ; B 44 0 872 716 ; -C -1 ; WX 722 ; N afii10031 ; B 42 0 754 716 ; -C -1 ; WX 778 ; N afii10032 ; B 91 -12 772 728 ; -C -1 ; WX 725 ; N afii10033 ; B 42 0 754 716 ; -C -1 ; WX 667 ; N afii10034 ; B 43 0 698 716 ; -C -1 ; WX 722 ; N afii10035 ; B 91 -12 730 728 ; -C -1 ; WX 611 ; N afii10036 ; B 125 0 705 716 ; -C -1 ; WX 639 ; N afii10037 ; B 113 -10 751 716 ; -C -1 ; WX 795 ; N afii10038 ; B 80 0 793 716 ; -C -1 ; WX 667 ; N afii10039 ; B -32 0 769 716 ; -C -1 ; WX 727 ; N afii10040 ; B 42 -143 759 716 ; -C -1 ; WX 673 ; N afii10041 ; B 107 0 709 716 ; -C -1 ; WX 920 ; N afii10042 ; B 42 0 956 716 ; -C -1 ; WX 923 ; N afii10043 ; B 42 -143 956 716 ; -C -1 ; WX 805 ; N afii10044 ; B 113 0 781 716 ; -C -1 ; WX 886 ; N afii10045 ; B 42 0 921 716 ; -C -1 ; WX 651 ; N afii10046 ; B 42 0 626 716 ; -C -1 ; WX 694 ; N afii10047 ; B 44 -12 687 728 ; -C -1 ; WX 1022 ; N afii10048 ; B 42 -12 1012 728 ; -C -1 ; WX 682 ; N afii10049 ; B -26 0 720 716 ; -C -1 ; WX 556 ; N afii10065 ; B 44 -12 526 530 ; -C -1 ; WX 563 ; N afii10066 ; B 58 -12 596 728 ; -C -1 ; WX 522 ; N afii10067 ; B 49 -12 509 530 ; -C -1 ; WX 493 ; N afii10068 ; B 38 -12 480 530 ; -C -1 ; WX 553 ; N afii10069 ; B 49 -12 547 728 ; -C -1 ; WX 556 ; N afii10070 ; B 52 -12 532 530 ; -C -1 ; WX 688 ; N afii10072 ; B -29 0 741 519 ; -C -1 ; WX 465 ; N afii10073 ; B 15 -12 455 530 ; -C -1 ; WX 556 ; N afii10074 ; B 63 -12 558 519 ; -C -1 ; WX 556 ; N afii10075 ; B 63 -12 558 721 ; -C -1 ; WX 472 ; N afii10076 ; B 31 0 520 519 ; -C -1 ; WX 564 ; N afii10077 ; B -20 -7 570 519 ; -C -1 ; WX 686 ; N afii10078 ; B 31 0 692 519 ; -C -1 ; WX 550 ; N afii10079 ; B 31 0 555 519 ; -C -1 ; WX 556 ; N afii10080 ; B 49 -12 540 530 ; -C -1 ; WX 550 ; N afii10081 ; B 31 0 555 519 ; -C -1 ; WX 556 ; N afii10082 ; B -10 -199 535 530 ; -C -1 ; WX 500 ; N afii10083 ; B 56 -12 511 530 ; -C -1 ; WX 833 ; N afii10084 ; B 33 0 813 530 ; -C -1 ; WX 500 ; N afii10085 ; B 0 -210 561 519 ; -C -1 ; WX 835 ; N afii10086 ; B 46 -199 823 716 ; -C -1 ; WX 500 ; N afii10087 ; B -1 0 538 519 ; -C -1 ; WX 572 ; N afii10088 ; B 61 -151 556 519 ; -C -1 ; WX 518 ; N afii10089 ; B 74 0 523 519 ; -C -1 ; WX 830 ; N afii10090 ; B 59 -12 835 519 ; -C -1 ; WX 851 ; N afii10091 ; B 59 -151 836 519 ; -C -1 ; WX 621 ; N afii10092 ; B 59 0 588 519 ; -C -1 ; WX 736 ; N afii10093 ; B 31 0 743 519 ; -C -1 ; WX 526 ; N afii10094 ; B 31 0 492 519 ; -C -1 ; WX 492 ; N afii10095 ; B 26 -12 479 530 ; -C -1 ; WX 752 ; N afii10096 ; B 31 -12 738 533 ; -C -1 ; WX 534 ; N afii10097 ; B -12 0 542 519 ; -C -1 ; WX 556 ; N afii10071 ; B 52 -12 532 699 ; -C -1 ; WX 556 ; N afii10099 ; B 34 -208 529 716 ; -C -1 ; WX 378 ; N afii10100 ; B 31 0 445 716 ; -C -1 ; WX 496 ; N afii10101 ; B 47 -12 500 530 ; -C -1 ; WX 500 ; N afii10102 ; B 38 -12 501 530 ; -C -1 ; WX 222 ; N afii10103 ; B 30 0 268 716 ; -C -1 ; WX 222 ; N afii10104 ; B 30 0 347 699 ; -C -1 ; WX 222 ; N afii10105 ; B -121 -208 267 716 ; -C -1 ; WX 910 ; N afii10106 ; B -20 -12 876 519 ; -C -1 ; WX 828 ; N afii10107 ; B 31 0 794 519 ; -C -1 ; WX 556 ; N afii10108 ; B 34 0 529 716 ; -C -1 ; WX 500 ; N afii10110 ; B 0 -210 561 720 ; -C -1 ; WX 556 ; N afii10193 ; B 61 -199 556 519 ; -C -1 ; WX 492 ; N afii10050 ; B 42 0 636 858 ; -C -1 ; WX 339 ; N afii10098 ; B 31 0 437 642 ; -C -1 ; WX 1000 ; N afii00208 ; B 40 224 992 294 ; -C -1 ; WX 1083 ; N afii61352 ; B 44 0 1082 716 ; -C -1 ; WX 670 ; N pi ; B 84 0 713 519 ; -C -1 ; WX 333 ; N sheva ; B 68 -306 179 -98 ; -C -1 ; WX 333 ; N hatafsegol ; B -16 -306 290 -98 ; -C -1 ; WX 333 ; N hatafpatah ; B -9 -306 280 -98 ; -C -1 ; WX 333 ; N hatafqamats ; B -9 -306 280 -98 ; -C -1 ; WX 333 ; N hiriq ; B 95 -180 179 -98 ; -C -1 ; WX 333 ; N tsere ; B 31 -180 243 -98 ; -C -1 ; WX 333 ; N segol ; B 31 -306 243 -98 ; -C -1 ; WX 333 ; N patah ; B 36 -154 243 -103 ; -C -1 ; WX 333 ; N qamats ; B 36 -236 243 -103 ; -C -1 ; WX 333 ; N holam ; B 256 577 340 659 ; -C -1 ; WX 333 ; N qubuts ; B -23 -306 270 -98 ; -C -1 ; WX 333 ; N dagesh ; B 185 241 269 323 ; -C -1 ; WX 333 ; N meteg ; B 78 -299 170 -103 ; -C -1 ; WX 383 ; N maqaf ; B 155 440 432 518 ; -C -1 ; WX 333 ; N rafe ; B 198 611 405 662 ; -C -1 ; WX 275 ; N paseq ; B 101 -10 305 625 ; -C -1 ; WX 333 ; N shindot ; B 511 577 595 660 ; -C -1 ; WX 333 ; N sindot ; B 7 577 94 660 ; -C -1 ; WX 278 ; N sofpasuq ; B 90 0 301 519 ; -C -1 ; WX 563 ; N alef ; B 51 0 614 518 ; -C -1 ; WX 542 ; N bet ; B 24 0 537 524 ; -C -1 ; WX 399 ; N gimel ; B 12 0 401 524 ; -C -1 ; WX 508 ; N dalet ; B 116 0 597 518 ; -C -1 ; WX 602 ; N he ; B 79 0 600 524 ; -C -1 ; WX 247 ; N vav ; B 76 0 281 518 ; -C -1 ; WX 382 ; N zayin ; B 125 0 471 518 ; -C -1 ; WX 599 ; N het ; B 76 0 600 524 ; -C -1 ; WX 590 ; N tet ; B 105 -14 609 529 ; -C -1 ; WX 247 ; N yod ; B 129 250 281 518 ; -C -1 ; WX 509 ; N finalkaf ; B 120 -199 507 524 ; -C -1 ; WX 461 ; N kaf ; B 41 -8 479 527 ; -C -1 ; WX 463 ; N lamed ; B 123 0 520 716 ; -C -1 ; WX 599 ; N finalmem ; B 76 0 600 524 ; -C -1 ; WX 601 ; N mem ; B 54 0 598 524 ; -C -1 ; WX 247 ; N finalnun ; B 33 -199 281 518 ; -C -1 ; WX 353 ; N nun ; B 29 0 365 524 ; -C -1 ; WX 574 ; N samekh ; B 90 -15 594 532 ; -C -1 ; WX 529 ; N ayin ; B 15 -48 574 518 ; -C -1 ; WX 566 ; N finalpe ; B 113 -199 567 524 ; -C -1 ; WX 546 ; N pe ; B 62 -8 567 527 ; -C -1 ; WX 461 ; N finaltsadi ; B 123 -199 533 518 ; -C -1 ; WX 479 ; N tsadi ; B 31 0 535 518 ; -C -1 ; WX 550 ; N qof ; B 39 -199 606 518 ; -C -1 ; WX 509 ; N resh ; B 120 0 507 524 ; -C -1 ; WX 694 ; N shin ; B 116 -14 756 518 ; -C -1 ; WX 643 ; N tav ; B 22 -4 642 524 ; -C -1 ; WX 493 ; N doublevav ; B 76 0 528 518 ; -C -1 ; WX 493 ; N vavyod ; B 129 0 528 518 ; -C -1 ; WX 493 ; N doubleyod ; B 129 250 528 518 ; -C -1 ; WX 236 ; N geresh ; B 114 330 302 518 ; -C -1 ; WX 417 ; N gershayim ; B 114 330 483 518 ; -C -1 ; WX 815 ; N newsheqelsign ; B 76 0 850 518 ; -C -1 ; WX 247 ; N vavshindot ; B 76 0 281 660 ; -C -1 ; WX 509 ; N finalkafsheva ; B 120 -199 508 524 ; -C -1 ; WX 509 ; N finalkafqamats ; B 92 -199 508 524 ; -C -1 ; WX 463 ; N lamedholam ; B 48 0 520 716 ; -C -1 ; WX 463 ; N lamedholamdagesh ; B 48 0 520 716 ; -C -1 ; WX 535 ; N altayin ; B 22 0 580 518 ; -C -1 ; WX 694 ; N shinshindot ; B 116 -14 776 660 ; -C -1 ; WX 694 ; N shinsindot ; B 116 -14 756 660 ; -C -1 ; WX 694 ; N shindageshshindot ; B 116 -14 776 660 ; -C -1 ; WX 694 ; N shindageshsindot ; B 116 -14 756 660 ; -C -1 ; WX 563 ; N alefpatah ; B 51 -154 614 519 ; -C -1 ; WX 563 ; N alefqamats ; B 51 -236 614 519 ; -C -1 ; WX 563 ; N alefmapiq ; B 51 0 614 518 ; -C -1 ; WX 542 ; N betdagesh ; B 24 0 537 524 ; -C -1 ; WX 399 ; N gimeldagesh ; B 12 0 401 524 ; -C -1 ; WX 508 ; N daletdagesh ; B 116 0 597 519 ; -C -1 ; WX 602 ; N hedagesh ; B 79 0 600 524 ; -C -1 ; WX 287 ; N vavdagesh ; B 59 0 321 518 ; -C -1 ; WX 411 ; N zayindagesh ; B 65 0 514 518 ; -C -1 ; WX 590 ; N tetdagesh ; B 112 -14 610 529 ; -C -1 ; WX 287 ; N yoddagesh ; B 75 250 321 518 ; -C -1 ; WX 509 ; N finalkafdagesh ; B 120 -199 508 524 ; -C -1 ; WX 461 ; N kafdagesh ; B 41 -8 480 527 ; -C -1 ; WX 463 ; N lameddagesh ; B 123 0 520 716 ; -C -1 ; WX 601 ; N memdagesh ; B 54 0 599 524 ; -C -1 ; WX 353 ; N nundagesh ; B 29 0 365 524 ; -C -1 ; WX 574 ; N samekhdagesh ; B 90 -15 594 532 ; -C -1 ; WX 566 ; N finalpedagesh ; B 112 -199 566 524 ; -C -1 ; WX 546 ; N pedagesh ; B 62 -8 567 527 ; -C -1 ; WX 479 ; N tsadidagesh ; B 31 0 535 519 ; -C -1 ; WX 550 ; N qofdagesh ; B 39 -199 606 519 ; -C -1 ; WX 509 ; N reshdagesh ; B 120 0 507 524 ; -C -1 ; WX 694 ; N shindagesh ; B 116 -14 756 518 ; -C -1 ; WX 643 ; N tavdages ; B 22 -4 642 524 ; -C -1 ; WX 247 ; N vavholam ; B 76 0 296 659 ; -C -1 ; WX 542 ; N betrafe ; B 24 0 537 662 ; -C -1 ; WX 461 ; N kafrafe ; B 41 -8 479 662 ; -C -1 ; WX 546 ; N perafe ; B 62 -8 567 662 ; -C -1 ; WX 576 ; N aleflamed ; B 64 0 627 716 ; -C -1 ; WX 0 ; N zerowidthnonjoiner ; B -18 -134 18 629 ; -C -1 ; WX 0 ; N zerowidthjoiner ; B -107 -134 107 690 ; -C -1 ; WX 0 ; N lefttorightmark ; B -18 -134 210 690 ; -C -1 ; WX 0 ; N righttoleftmark ; B -210 -134 17 690 ; -C -1 ; WX 0 ; N uni202A ; B -18 -134 210 603 ; -C -1 ; WX 0 ; N uni202B ; B -210 -134 18 603 ; -C -1 ; WX 0 ; N uni202D ; B -114 -134 114 690 ; -C -1 ; WX 0 ; N uni202E ; B -114 -134 114 690 ; -C -1 ; WX 0 ; N uni202C ; B -114 -134 114 690 ; -C -1 ; WX 0 ; N uni206E ; B -114 -134 114 690 ; -C -1 ; WX 0 ; N uni206F ; B -114 -134 114 690 ; -C -1 ; WX 0 ; N uni206A ; B -114 -134 114 690 ; -C -1 ; WX 0 ; N uni206B ; B -114 -134 114 690 ; -C -1 ; WX 0 ; N uni206C ; B -114 -134 114 690 ; -C -1 ; WX 0 ; N uni206D ; B -114 -134 114 690 ; -C -1 ; WX 0 ; N uniF00A ; B -18 -208 18 894 ; -C -1 ; WX 0 ; N uniF00B ; B -114 -208 114 894 ; -C -1 ; WX 0 ; N uniF00C ; B -18 -208 109 894 ; -C -1 ; WX 0 ; N uniF00D ; B -109 -208 18 894 ; -C -1 ; WX 0 ; N uniF00E ; B -18 -208 114 894 ; -C -1 ; WX 1000 ; N uniFFFC ; B 0 0 1000 719 ; -C -1 ; WX 812 ; N Ohorn ; B 91 -12 898 728 ; -C -1 ; WX 604 ; N ohorn ; B 49 -12 678 530 ; -C -1 ; WX 793 ; N Uhorn ; B 97 -13 921 716 ; -C -1 ; WX 634 ; N uhorn ; B 63 -12 721 519 ; -C -1 ; WX 0 ; N f00b ; B -131 822 45 894 ; -C -1 ; WX 0 ; N f00c ; B -343 822 -167 894 ; -C -1 ; WX 0 ; N f00e ; B -286 755 -122 890 ; -C -1 ; WX 0 ; N f006 ; B -82 822 94 894 ; -C -1 ; WX 0 ; N f007 ; B -260 822 -83 894 ; -C -1 ; WX 0 ; N f009 ; B -221 755 -18 890 ; -C -1 ; WX 0 ; N combininghookabove ; B -103 754 100 895 ; -C -1 ; WX 0 ; N f010 ; B -98 812 97 894 ; -C -1 ; WX 0 ; N f013 ; B -246 754 -43 895 ; -C -1 ; WX 0 ; N f011 ; B -317 812 -123 894 ; -C -1 ; WX 0 ; N f01c ; B -163 785 167 895 ; -C -1 ; WX 0 ; N f015 ; B -368 818 -55 895 ; -C -1 ; WX 0 ; N combiningtildeaccent ; B -325 756 5 866 ; -C -1 ; WX 0 ; N _d_783 ; B -10 721 275 787 ; -C -1 ; WX 0 ; N _d_784 ; B -29 743 270 803 ; -C -1 ; WX 0 ; N f02c ; B -217 -159 -96 -59 ; -C -1 ; WX 513 ; N dongsign ; B 42 108 538 716 ; -C -1 ; WX 834 ; N onethird ; B 60 -30 827 728 ; -C -1 ; WX 834 ; N twothirds ; B 60 -30 827 728 ; -C -1 ; WX 0 ; N f008 ; B -73 582 130 716 ; -C -1 ; WX 0 ; N f00a ; B -285 582 -82 716 ; -C -1 ; WX 0 ; N f00d ; B -151 582 13 716 ; -C -1 ; WX 0 ; N f00f ; B -277 582 -113 716 ; -C -1 ; WX 0 ; N f012 ; B -103 582 99 755 ; -C -1 ; WX 0 ; N f014 ; B -278 582 -76 755 ; -C -1 ; WX 0 ; N f016 ; B -384 785 -54 895 ; -C -1 ; WX 0 ; N f017 ; B -493 785 -163 895 ; -C -1 ; WX 0 ; N f018 ; B -493 785 -163 895 ; -C -1 ; WX 0 ; N f019 ; B -365 596 -35 706 ; -C -1 ; WX 0 ; N f01a ; B -429 596 -99 706 ; -C -1 ; WX 0 ; N f01b ; B -439 596 -109 706 ; -C -1 ; WX 0 ; N f01e ; B -429 -159 -308 -59 ; -C -1 ; WX 0 ; N f01f ; B -466 -159 -345 -59 ; -C -1 ; WX 0 ; N f020 ; B -500 -159 -379 -59 ; -C -1 ; WX 0 ; N f021 ; B -466 -159 -345 -59 ; -C -1 ; WX 0 ; N f022 ; B -517 -159 -396 -59 ; -C -1 ; WX 0 ; N combininggraveaccent ; B -131 755 33 890 ; -C -1 ; WX 0 ; N combiningacuteaccent ; B -86 755 117 890 ; -C -1 ; WX 0 ; N f01d ; B -188 596 142 706 ; -C -1 ; WX 0 ; N combiningdotbelow ; B -448 -159 -327 -59 ; -C -1 ; WX 0 ; N f023 ; B -427 -159 -306 -59 ; -C -1 ; WX 0 ; N f029 ; B -254 -159 -133 -59 ; -C -1 ; WX 0 ; N f02a ; B -225 -159 -104 -59 ; -C -1 ; WX 0 ; N f02b ; B -425 -159 -304 -59 ; -C -1 ; WX 0 ; N f024 ; B -378 -159 -257 -59 ; -C -1 ; WX 0 ; N f025 ; B -383 -159 -262 -59 ; -C -1 ; WX 0 ; N f026 ; B -422 -159 -301 -59 ; -C -1 ; WX 0 ; N f027 ; B -432 -159 -311 -59 ; -C -1 ; WX 0 ; N f028 ; B -517 -159 -396 -59 ; -C -1 ; WX 0 ; N f02d ; B -354 818 -40 895 ; -C -1 ; WX 0 ; N f02e ; B -338 785 -8 895 ; -C -1 ; WX 0 ; N f02f ; B -441 818 -128 895 ; -C -1 ; WX 0 ; N f030 ; B -449 785 -119 895 ; -C -1 ; WX 222 ; N f031 ; B 30 0 227 519 ; -C -1 ; WX 667 ; N Adotbelow ; B -20 -159 617 716 ; -C -1 ; WX 556 ; N adotbelow ; B 44 -159 526 530 ; -C -1 ; WX 667 ; N Ahookabove ; B -20 0 617 895 ; -C -1 ; WX 556 ; N ahookabove ; B 44 -12 526 755 ; -C -1 ; WX 667 ; N Acircumflexacute ; B -20 0 617 894 ; -C -1 ; WX 556 ; N acircumflexacute ; B 44 -12 532 890 ; -C -1 ; WX 667 ; N Acircumflexgrave ; B -20 0 617 894 ; -C -1 ; WX 556 ; N acircumflexgrave ; B 44 -12 526 890 ; -C -1 ; WX 667 ; N Acircumflexhookabove ; B -20 0 617 894 ; -C -1 ; WX 556 ; N acircumflexhookabove ; B 44 -12 529 895 ; -C -1 ; WX 667 ; N Acircumflextilde ; B -20 0 617 895 ; -C -1 ; WX 556 ; N acircumflextilde ; B 44 -12 557 866 ; -C -1 ; WX 667 ; N Acircumflexdotbelow ; B -20 -159 617 803 ; -C -1 ; WX 556 ; N acircumflexdotbelow ; B 44 -159 526 716 ; -C -1 ; WX 667 ; N Abreveacute ; B -20 0 617 894 ; -C -1 ; WX 556 ; N abreveacute ; B 44 -12 532 890 ; -C -1 ; WX 667 ; N Abrevegrave ; B -20 0 617 894 ; -C -1 ; WX 556 ; N abrevegrave ; B 44 -12 526 890 ; -C -1 ; WX 667 ; N Abrevehookabove ; B -20 0 617 894 ; -C -1 ; WX 556 ; N abrevehookabove ; B 44 -12 526 895 ; -C -1 ; WX 667 ; N Abrevetilde ; B -20 0 639 895 ; -C -1 ; WX 556 ; N abrevetilde ; B 44 -12 557 866 ; -C -1 ; WX 667 ; N Abrevedotbelow ; B -20 -159 617 787 ; -C -1 ; WX 556 ; N abrevedotbelow ; B 44 -159 526 694 ; -C -1 ; WX 667 ; N Edotbelow ; B 45 -159 711 716 ; -C -1 ; WX 556 ; N edotbelow ; B 52 -159 532 530 ; -C -1 ; WX 667 ; N Ehookabove ; B 45 0 711 895 ; -C -1 ; WX 556 ; N ehookabove ; B 52 -12 532 755 ; -C -1 ; WX 667 ; N Etilde ; B 45 0 711 868 ; -C -1 ; WX 556 ; N etilde ; B 52 -12 532 707 ; -C -1 ; WX 667 ; N Ecircumflexacute ; B 45 0 711 894 ; -C -1 ; WX 556 ; N ecircumflexacute ; B 52 -12 539 890 ; -C -1 ; WX 667 ; N Ecircumflexgrave ; B 45 0 711 894 ; -C -1 ; WX 556 ; N ecircumflexgrave ; B 52 -12 532 890 ; -C -1 ; WX 667 ; N Ecircumflexhookabove ; B 45 0 711 894 ; -C -1 ; WX 556 ; N ecircumflexhookabove ; B 52 -12 539 895 ; -C -1 ; WX 667 ; N Ecircumflextilde ; B 45 0 711 895 ; -C -1 ; WX 556 ; N ecircumflextilde ; B 52 -12 557 866 ; -C -1 ; WX 667 ; N Ecircumflexdotbelow ; B 45 -159 711 803 ; -C -1 ; WX 556 ; N ecircumflexdotbelow ; B 52 -159 532 716 ; -C -1 ; WX 278 ; N Ihookabove ; B 57 0 395 895 ; -C -1 ; WX 222 ; N ihookabove ; B 30 0 325 755 ; -C -1 ; WX 278 ; N Idotbelow ; B 27 -159 302 716 ; -C -1 ; WX 222 ; N idotbelow ; B -12 -159 268 716 ; -C -1 ; WX 778 ; N Odotbelow ; B 91 -159 772 728 ; -C -1 ; WX 556 ; N odotbelow ; B 49 -159 540 530 ; -C -1 ; WX 778 ; N Ohookabove ; B 91 -12 772 895 ; -C -1 ; WX 556 ; N ohookabove ; B 49 -12 540 755 ; -C -1 ; WX 778 ; N Ocircumflexacute ; B 91 -12 772 894 ; -C -1 ; WX 556 ; N ocircumflexacute ; B 49 -12 540 890 ; -C -1 ; WX 778 ; N Ocircumflexgrave ; B 91 -12 772 894 ; -C -1 ; WX 556 ; N ocircumflexgrave ; B 49 -12 540 890 ; -C -1 ; WX 778 ; N Ocircumflexhookabove ; B 91 -12 772 894 ; -C -1 ; WX 556 ; N ocircumflexhookabove ; B 49 -12 540 895 ; -C -1 ; WX 778 ; N Ocircumflextilde ; B 91 -12 772 895 ; -C -1 ; WX 556 ; N ocircumflextilde ; B 49 -12 557 866 ; -C -1 ; WX 778 ; N Ocircumflexdotbelow ; B 91 -159 772 825 ; -C -1 ; WX 556 ; N ocircumflexdotbelow ; B 49 -159 540 716 ; -C -1 ; WX 812 ; N Ohornacute ; B 91 -12 898 894 ; -C -1 ; WX 604 ; N ohornacute ; B 49 -12 678 716 ; -C -1 ; WX 812 ; N Ohorngrave ; B 91 -12 898 895 ; -C -1 ; WX 604 ; N ohorngrave ; B 49 -12 678 716 ; -C -1 ; WX 812 ; N Ohornhookabove ; B 91 -12 898 912 ; -C -1 ; WX 604 ; N ohornhookabove ; B 49 -12 678 755 ; -C -1 ; WX 812 ; N Ohorntilde ; B 91 -12 898 868 ; -C -1 ; WX 604 ; N ohorntilde ; B 49 -12 678 707 ; -C -1 ; WX 812 ; N Ohorndotbelow ; B 91 -159 898 728 ; -C -1 ; WX 604 ; N ohorndotbelow ; B 49 -159 678 530 ; -C -1 ; WX 722 ; N Udotbelow ; B 97 -159 754 716 ; -C -1 ; WX 556 ; N udotbelow ; B 63 -159 558 519 ; -C -1 ; WX 722 ; N Uhookabove ; B 97 -13 754 895 ; -C -1 ; WX 556 ; N uhookabove ; B 63 -12 558 755 ; -C -1 ; WX 793 ; N Uhornacute ; B 97 -13 921 894 ; -C -1 ; WX 634 ; N uhornacute ; B 63 -12 721 716 ; -C -1 ; WX 793 ; N Uhorngrave ; B 97 -13 921 895 ; -C -1 ; WX 634 ; N uhorngrave ; B 63 -12 721 716 ; -C -1 ; WX 793 ; N Uhornhookabove ; B 97 -13 921 895 ; -C -1 ; WX 634 ; N uhornhookabove ; B 63 -12 721 755 ; -C -1 ; WX 793 ; N Uhorntilde ; B 97 -13 921 868 ; -C -1 ; WX 634 ; N uhorntilde ; B 63 -12 721 707 ; -C -1 ; WX 793 ; N Uhorndotbelow ; B 97 -159 921 716 ; -C -1 ; WX 634 ; N uhorndotbelow ; B 63 -159 721 519 ; -C -1 ; WX 667 ; N Ydotbelow ; B 117 -159 773 716 ; -C -1 ; WX 500 ; N ydotbelow ; B 0 -210 561 519 ; -C -1 ; WX 667 ; N Yhookabove ; B 117 0 773 895 ; -C -1 ; WX 500 ; N yhookabove ; B 0 -210 561 755 ; -C -1 ; WX 667 ; N Ytilde ; B 117 0 773 868 ; -C -1 ; WX 500 ; N ytilde ; B 0 -210 561 707 ; -C -1 ; WX 667 ; N uni01CD ; B -20 0 628 893 ; -C -1 ; WX 556 ; N uni01CE ; B 44 -12 528 716 ; -C -1 ; WX 278 ; N uni01CF ; B 57 0 443 893 ; -C -1 ; WX 222 ; N uni01D0 ; B 30 0 375 716 ; -C -1 ; WX 778 ; N uni01D1 ; B 91 -12 772 893 ; -C -1 ; WX 556 ; N uni01D2 ; B 49 -12 540 716 ; -C -1 ; WX 722 ; N uni01D3 ; B 97 -13 754 893 ; -C -1 ; WX 556 ; N uni01D4 ; B 63 -12 558 716 ; -C -1 ; WX 722 ; N uni01D5 ; B 97 -13 754 900 ; -C -1 ; WX 556 ; N uni01D6 ; B 63 -12 558 849 ; -C -1 ; WX 722 ; N uni01D7 ; B 97 -13 754 900 ; -C -1 ; WX 556 ; N uni01D8 ; B 63 -12 558 896 ; -C -1 ; WX 722 ; N uni01D9 ; B 97 -13 754 900 ; -C -1 ; WX 556 ; N uni01DA ; B 63 -12 572 896 ; -C -1 ; WX 722 ; N uni01DB ; B 97 -13 754 900 ; -C -1 ; WX 556 ; N uni01DC ; B 63 -12 558 896 ; -C -1 ; WX 0 ; N _d_928 ; B 23 730 309 900 ; -C -1 ; WX 0 ; N _d_929 ; B 23 730 306 900 ; -C -1 ; WX 0 ; N _d_930 ; B 23 730 294 900 ; -C -1 ; WX 0 ; N _d_931 ; B 23 730 290 900 ; -C -1 ; WX 544 ; N uni0492 ; B 30 0 656 716 ; -C -1 ; WX 378 ; N uni0493 ; B 29 0 445 519 ; -C -1 ; WX 917 ; N uni0496 ; B -36 -199 1002 721 ; -C -1 ; WX 688 ; N uni0497 ; B -29 -147 741 519 ; -C -1 ; WX 589 ; N uni049a ; B 42 -199 674 721 ; -C -1 ; WX 472 ; N uni049b ; B 31 -147 520 519 ; -C -1 ; WX 589 ; N uni049c ; B 42 0 674 721 ; -C -1 ; WX 472 ; N uni049d ; B 31 0 520 519 ; -C -1 ; WX 722 ; N uni04a2 ; B 42 -199 756 716 ; -C -1 ; WX 550 ; N uni04a3 ; B 31 -147 561 519 ; -C -1 ; WX 556 ; N uni04ae ; B 114 0 667 716 ; -C -1 ; WX 500 ; N uni04af ; B 79 -199 560 519 ; -C -1 ; WX 556 ; N uni04b0 ; B 66 0 667 716 ; -C -1 ; WX 500 ; N uni04b1 ; B -6 -199 560 519 ; -C -1 ; WX 667 ; N uni04b2 ; B -32 -199 769 716 ; -C -1 ; WX 500 ; N uni04b3 ; B -1 -147 538 519 ; -C -1 ; WX 673 ; N uni04b8 ; B 97 0 705 716 ; -C -1 ; WX 518 ; N uni04b9 ; B 63 0 524 519 ; -C -1 ; WX 673 ; N uni04ba ; B 57 0 666 716 ; -C -1 ; WX 518 ; N uni04bb ; B 33 0 494 519 ; -C -1 ; WX 778 ; N uni018f ; B 94 -12 744 728 ; -C -1 ; WX 556 ; N uni0259 ; B 58 -12 538 530 ; -C -1 ; WX 778 ; N uni04e8 ; B 91 -12 772 728 ; -C -1 ; WX 556 ; N uni04e9 ; B 49 -12 540 530 ; -EndCharMetrics -StartKernData -StartKernPairs 857 -KPX space A -37 -KPX space Y -18 -KPX space Alphatonos -37 -KPX space Upsilontonos -18 -KPX space Alpha -37 -KPX space Delta -37 -KPX space Lambda -18 -KPX space Upsilon -18 -KPX space Upsilondieresis -18 -KPX one one -74 -KPX A space -37 -KPX A T -74 -KPX A V -55 -KPX A W -18 -KPX A Y -74 -KPX A v -18 -KPX A w -18 -KPX A y -9 -KPX A quoteright -37 -KPX F space -18 -KPX F comma -129 -KPX F period -129 -KPX F A -74 -KPX L space -18 -KPX L T -74 -KPX L V -55 -KPX L W -37 -KPX L Y -92 -KPX L y -18 -KPX L quoteright -55 -KPX P space -37 -KPX P comma -129 -KPX P period -129 -KPX P A -74 -KPX R T -18 -KPX R V -18 -KPX R W -18 -KPX R Y -37 -KPX T comma -92 -KPX T hyphen -92 -KPX T period -92 -KPX T colon -74 -KPX T semicolon -74 -KPX T A -74 -KPX T O -18 -KPX T a -92 -KPX T c -92 -KPX T e -92 -KPX T i -9 -KPX T o -92 -KPX T r -74 -KPX T s -92 -KPX T u -74 -KPX T w -74 -KPX T y -74 -KPX V comma -74 -KPX V hyphen -37 -KPX V period -74 -KPX V colon -18 -KPX V semicolon -18 -KPX V A -55 -KPX V a -37 -KPX V e -37 -KPX V i -18 -KPX V o -37 -KPX V r -18 -KPX V u -18 -KPX V y -18 -KPX W comma -37 -KPX W hyphen -18 -KPX W period -37 -KPX W A -18 -KPX W a -18 -KPX W e -18 -KPX W i -9 -KPX Y space -18 -KPX Y comma -92 -KPX Y hyphen -74 -KPX Y period -92 -KPX Y colon -37 -KPX Y semicolon -37 -KPX Y A -55 -KPX Y a -74 -KPX Y e -55 -KPX Y i -18 -KPX Y o -55 -KPX Y p -55 -KPX Y q -55 -KPX Y u -37 -KPX Y v -37 -KPX f quoteright 37 -KPX r comma -55 -KPX r hyphen -18 -KPX r period -37 -KPX r quoteright 37 -KPX v comma -74 -KPX v period -74 -KPX w comma -55 -KPX w period -55 -KPX y comma -74 -KPX y period -74 -KPX quoteleft quoteleft -37 -KPX quoteright space -55 -KPX quoteright s -18 -KPX quoteright quoteright -37 -KPX quotedblbase afii10051 -122 -KPX quotedblbase afii10060 -111 -KPX quotedblbase afii10036 -134 -KPX quotedblbase afii10041 -145 -KPX quotedblbase afii10044 -111 -KPX Gamma comma -128 -KPX Gamma period -128 -KPX Gamma iotadieresistonos 102 -KPX Gamma Alpha -95 -KPX Gamma Delta -95 -KPX Gamma Lambda -95 -KPX Gamma iota -47 -KPX Gamma iotadieresis 46 -KPX Theta Alpha -11 -KPX Theta Delta -11 -KPX Theta Lambda -11 -KPX Theta Upsilon -54 -KPX Theta Upsilondieresis -54 -KPX Phi Alpha -39 -KPX Phi Upsilon -54 -KPX Phi Upsilondieresis -54 -KPX delta tau -22 -KPX delta gamma -18 -KPX delta chi -29 -KPX delta pi -22 -KPX epsilon sigma1 -27 -KPX tau alpha -14 -KPX tau delta -14 -KPX tau sigma -14 -KPX tau phi -14 -KPX tau alphatonos -14 -KPX tau zeta -14 -KPX tau omicron -14 -KPX tau sigma1 -14 -KPX tau omega -14 -KPX tau omegatonos -14 -KPX phi tau -22 -KPX phi gamma -18 -KPX phi chi -29 -KPX phi pi -22 -KPX Alphatonos space -37 -KPX Alphatonos Theta -52 -KPX Alphatonos Phi -58 -KPX Alphatonos Omicron -52 -KPX Alphatonos Tau -97 -KPX Alphatonos Upsilon -129 -KPX Alphatonos Upsilondieresis -129 -KPX Alphatonos gamma -18 -KPX Alphatonos nu -18 -KPX Alphatonos chi -18 -KPX Omicrontonos Upsilon -54 -KPX Omicrontonos Upsilondieresis -54 -KPX Upsilontonos alpha -55 -KPX Upsilontonos delta -55 -KPX Upsilontonos sigma -55 -KPX Upsilontonos phi -55 -KPX Upsilontonos iotadieresistonos 104 -KPX Upsilontonos Alpha -74 -KPX Upsilontonos Delta -74 -KPX Upsilontonos Lambda -74 -KPX Upsilontonos alphatonos -55 -KPX Upsilontonos etatonos -18 -KPX Upsilontonos iotatonos -18 -KPX Upsilontonos eta -18 -KPX Upsilontonos iota -18 -KPX Upsilontonos kappa -18 -KPX Upsilontonos mu -18 -KPX Upsilontonos omicron -55 -KPX Upsilontonos iotadieresis 52 -KPX Upsilontonos omicrontonos -55 -KPX Omegatonos Upsilon -54 -KPX Omegatonos Upsilondieresis -54 -KPX Alpha space -37 -KPX Alpha quoteright -37 -KPX Alpha Theta -52 -KPX Alpha Phi -58 -KPX Alpha Omicron -52 -KPX Alpha Tau -97 -KPX Alpha Upsilon -129 -KPX Alpha Upsilondieresis -129 -KPX Alpha gamma -18 -KPX Alpha nu -18 -KPX Alpha chi -18 -KPX Delta space -37 -KPX Delta Theta -52 -KPX Delta Omicron -52 -KPX Delta Tau -97 -KPX Delta Upsilon -129 -KPX Delta Upsilondieresis -129 -KPX Kappa Theta -48 -KPX Kappa Phi -61 -KPX Kappa alpha -12 -KPX Kappa delta -12 -KPX Kappa sigma -12 -KPX Kappa phi -12 -KPX Kappa Omicron -48 -KPX Kappa alphatonos -12 -KPX Kappa zeta -12 -KPX Kappa theta -12 -KPX Kappa xi -12 -KPX Kappa omicron -12 -KPX Kappa omega -12 -KPX Kappa omicrontonos -12 -KPX Kappa omegatonos -12 -KPX Lambda space -18 -KPX Lambda Theta -52 -KPX Lambda Omicron -52 -KPX Lambda Tau -97 -KPX Lambda Upsilon -129 -KPX Lambda Upsilondieresis -129 -KPX Omicron Alphatonos -11 -KPX Omicron Alpha -11 -KPX Omicron Delta -11 -KPX Omicron Lambda -11 -KPX Omicron Upsilon -54 -KPX Omicron Upsilondieresis -54 -KPX Rho comma -128 -KPX Rho period -128 -KPX Rho Alpha -74 -KPX Rho Delta -74 -KPX Rho Lambda -74 -KPX Sigma tau -32 -KPX Tau comma -91 -KPX Tau hyphen -91 -KPX Tau period -91 -KPX Tau colon -74 -KPX Tau semicolon -74 -KPX Tau Theta -18 -KPX Tau Phi -18 -KPX Tau alpha -91 -KPX Tau delta -33 -KPX Tau epsilon -91 -KPX Tau sigma -91 -KPX Tau phi -91 -KPX Tau iotadieresistonos 104 -KPX Tau Alpha -74 -KPX Tau Delta -74 -KPX Tau Lambda -74 -KPX Tau Omicron -18 -KPX Tau Omega -18 -KPX Tau alphatonos -91 -KPX Tau epsilontonos -91 -KPX Tau upsilondieresistonos -74 -KPX Tau gamma -43 -KPX Tau eta -74 -KPX Tau iota -8 -KPX Tau mu -74 -KPX Tau nu -43 -KPX Tau omicron -91 -KPX Tau upsilon -74 -KPX Tau chi -43 -KPX Tau psi -83 -KPX Tau iotadieresis 46 -KPX Tau upsilondieresis -74 -KPX Tau omicrontonos -91 -KPX Tau upsilontonos -74 -KPX Upsilon comma -91 -KPX Upsilon hyphen -74 -KPX Upsilon period -91 -KPX Upsilon colon -37 -KPX Upsilon semicolon -37 -KPX Upsilon alpha -55 -KPX Upsilon delta -55 -KPX Upsilon sigma -55 -KPX Upsilon phi -55 -KPX Upsilon iotadieresistonos 104 -KPX Upsilon Alpha -74 -KPX Upsilon Delta -74 -KPX Upsilon Lambda -74 -KPX Upsilon alphatonos -55 -KPX Upsilon etatonos -18 -KPX Upsilon iotatonos -18 -KPX Upsilon gamma -18 -KPX Upsilon eta -18 -KPX Upsilon iota -18 -KPX Upsilon kappa -18 -KPX Upsilon mu -18 -KPX Upsilon omicron -55 -KPX Upsilon iotadieresis 52 -KPX Upsilon omicrontonos -55 -KPX Chi omega -18 -KPX Chi omegatonos -18 -KPX Psi alpha -21 -KPX Psi delta -21 -KPX Psi sigma -21 -KPX Psi phi -21 -KPX Psi alphatonos -21 -KPX Psi omicron -21 -KPX Psi omega -21 -KPX Psi omicrontonos -21 -KPX Psi omegatonos -21 -KPX Omega Upsilon -54 -KPX Omega Upsilondieresis -54 -KPX Upsilondieresis alpha -55 -KPX Upsilondieresis delta -55 -KPX Upsilondieresis sigma -55 -KPX Upsilondieresis phi -55 -KPX Upsilondieresis iotadieresistonos 104 -KPX Upsilondieresis Alpha -74 -KPX Upsilondieresis Delta -74 -KPX Upsilondieresis Lambda -74 -KPX Upsilondieresis alphatonos -55 -KPX Upsilondieresis etatonos -18 -KPX Upsilondieresis eta -18 -KPX Upsilondieresis iota -18 -KPX Upsilondieresis kappa -18 -KPX Upsilondieresis mu -18 -KPX Upsilondieresis omicron -55 -KPX Upsilondieresis iotadieresis 52 -KPX Upsilondieresis omicrontonos -55 -KPX epsilontonos sigma1 -27 -KPX zeta alpha -50 -KPX zeta delta -29 -KPX zeta epsilon -61 -KPX zeta sigma -50 -KPX zeta tau -57 -KPX zeta phi -50 -KPX zeta alphatonos -50 -KPX zeta epsilontonos -61 -KPX zeta etatonos -56 -KPX zeta gamma -29 -KPX zeta eta -56 -KPX zeta theta -29 -KPX zeta iota -56 -KPX zeta nu -29 -KPX zeta omicron -94 -KPX zeta upsilon -61 -KPX zeta omega -50 -KPX zeta iotadieresis 55 -KPX zeta omicrontonos -50 -KPX zeta upsilontonos -61 -KPX zeta omegatonos -50 -KPX zeta pi -57 -KPX kappa alpha -12 -KPX kappa delta -12 -KPX kappa sigma -12 -KPX kappa phi -12 -KPX kappa alphatonos -12 -KPX kappa zeta -29 -KPX kappa xi -29 -KPX kappa omicron -12 -KPX kappa sigma1 -29 -KPX kappa omega -12 -KPX kappa omicrontonos -12 -KPX kappa omegatonos -12 -KPX lambda alpha -14 -KPX lambda delta -14 -KPX lambda sigma -14 -KPX lambda phi -19 -KPX lambda alphatonos -14 -KPX lambda upsilondieresistonos -32 -KPX lambda zeta -14 -KPX lambda xi -14 -KPX lambda omicron -14 -KPX lambda sigma1 -14 -KPX lambda upsilon -32 -KPX lambda omega -14 -KPX lambda upsilondieresis -32 -KPX lambda omicrontonos -14 -KPX lambda upsilontonos -32 -KPX lambda omegatonos -14 -KPX xi alpha -14 -KPX xi delta -14 -KPX xi sigma -14 -KPX xi phi -14 -KPX xi alphatonos -14 -KPX xi zeta -14 -KPX xi xi -14 -KPX xi omicron -14 -KPX xi sigma1 -14 -KPX xi omicrontonos -14 -KPX omicron tau -14 -KPX omicron gamma -18 -KPX omicron chi -29 -KPX omicron pi -14 -KPX rho tau -22 -KPX rho pi -22 -KPX chi alpha -17 -KPX chi delta -17 -KPX chi sigma -17 -KPX chi phi -17 -KPX chi alphatonos -17 -KPX chi zeta -17 -KPX chi omicron -17 -KPX chi sigma1 -17 -KPX chi omega -17 -KPX chi omicrontonos -17 -KPX chi omegatonos -17 -KPX omega tau -22 -KPX omega gamma -18 -KPX omega chi -29 -KPX omega pi -22 -KPX omicrontonos tau -22 -KPX omicrontonos gamma -18 -KPX omicrontonos chi -29 -KPX omicrontonos pi -22 -KPX omegatonos tau -22 -KPX omegatonos gamma -18 -KPX omegatonos chi -29 -KPX omegatonos pi -22 -KPX afii10052 comma -100 -KPX afii10052 period -100 -KPX afii10052 guillemotleft -56 -KPX afii10052 guillemotright -56 -KPX afii10058 quoteright -111 -KPX afii10059 quoteright -89 -KPX afii10017 quoteright -78 -KPX afii10017 afii10021 11 -KPX afii10017 afii10025 -44 -KPX afii10017 afii10032 -56 -KPX afii10017 afii10033 -23 -KPX afii10017 afii10035 -56 -KPX afii10017 afii10036 -100 -KPX afii10017 afii10037 -89 -KPX afii10017 afii10038 -45 -KPX afii10017 afii10041 -89 -KPX afii10017 afii10047 -45 -KPX afii10017 afii10066 -11 -KPX afii10017 afii10070 -11 -KPX afii10017 afii10080 -11 -KPX afii10017 afii10083 -11 -KPX afii10017 afii10085 -11 -KPX afii10017 afii10086 -11 -KPX afii10018 afii10017 -33 -KPX afii10018 afii10021 -22 -KPX afii10018 afii10024 -22 -KPX afii10018 afii10025 -22 -KPX afii10018 afii10029 -33 -KPX afii10018 afii10032 -22 -KPX afii10018 afii10035 -22 -KPX afii10018 afii10036 -67 -KPX afii10018 afii10037 -56 -KPX afii10018 afii10038 -23 -KPX afii10018 afii10039 -33 -KPX afii10018 afii10041 -56 -KPX afii10018 afii10044 -67 -KPX afii10018 afii10047 -11 -KPX afii10018 afii10049 -33 -KPX afii10018 afii10069 11 -KPX afii10018 afii10085 -22 -KPX afii10018 afii10097 11 -KPX afii10019 afii10017 -33 -KPX afii10019 afii10021 -22 -KPX afii10019 afii10024 -33 -KPX afii10019 afii10025 -22 -KPX afii10019 afii10029 -22 -KPX afii10019 afii10032 -22 -KPX afii10019 afii10035 -22 -KPX afii10019 afii10036 -67 -KPX afii10019 afii10037 -56 -KPX afii10019 afii10038 -22 -KPX afii10019 afii10039 -33 -KPX afii10019 afii10041 -34 -KPX afii10019 afii10044 -100 -KPX afii10019 afii10049 -22 -KPX afii10019 afii10085 -11 -KPX afii10019 afii10087 -33 -KPX afii10019 afii10089 -33 -KPX afii10020 comma -100 -KPX afii10020 period -100 -KPX afii10020 colon -22 -KPX afii10020 semicolon -11 -KPX afii10020 guillemotleft -56 -KPX afii10020 guillemotright -56 -KPX afii10020 afii10017 -78 -KPX afii10020 afii10021 -44 -KPX afii10020 afii10025 -11 -KPX afii10020 afii10029 -33 -KPX afii10020 afii10032 -33 -KPX afii10020 afii10035 -33 -KPX afii10020 afii10049 -22 -KPX afii10020 afii10065 -33 -KPX afii10020 afii10067 -45 -KPX afii10020 afii10069 -45 -KPX afii10020 afii10070 -44 -KPX afii10020 afii10074 -44 -KPX afii10020 afii10077 -44 -KPX afii10020 afii10078 -44 -KPX afii10020 afii10079 -44 -KPX afii10020 afii10080 -56 -KPX afii10020 afii10082 -44 -KPX afii10020 afii10085 -44 -KPX afii10020 afii10093 -44 -KPX afii10020 afii10094 -45 -KPX afii10020 afii10096 -45 -KPX afii10020 afii10097 -45 -KPX afii10021 afii10041 -11 -KPX afii10021 afii10047 11 -KPX afii10021 afii10073 22 -KPX afii10021 afii10085 11 -KPX afii10022 afii10025 -11 -KPX afii10024 afii10025 -11 -KPX afii10024 afii10032 -22 -KPX afii10024 afii10035 -22 -KPX afii10024 afii10041 -22 -KPX afii10024 afii10044 11 -KPX afii10024 afii10085 -11 -KPX afii10025 afii10021 -33 -KPX afii10025 afii10024 -33 -KPX afii10025 afii10029 -33 -KPX afii10025 afii10032 -22 -KPX afii10025 afii10035 -22 -KPX afii10025 afii10036 -45 -KPX afii10025 afii10037 -45 -KPX afii10025 afii10038 -22 -KPX afii10025 afii10041 -34 -KPX afii10025 afii10049 -22 -KPX afii10025 afii10077 -11 -KPX afii10028 afii10032 -11 -KPX afii10028 afii10035 -11 -KPX afii10028 afii10038 -23 -KPX afii10028 afii10047 -11 -KPX afii10028 afii10085 -11 -KPX afii10028 afii10095 -11 -KPX afii10029 afii10038 11 -KPX afii10029 afii10066 11 -KPX afii10030 afii10041 -22 -KPX afii10030 afii10065 11 -KPX afii10030 afii10085 11 -KPX afii10030 afii10089 -22 -KPX afii10030 afii10095 11 -KPX afii10032 afii10017 -22 -KPX afii10032 afii10021 -34 -KPX afii10032 afii10024 -33 -KPX afii10032 afii10029 -33 -KPX afii10032 afii10037 -67 -KPX afii10032 afii10039 -33 -KPX afii10032 afii10041 -33 -KPX afii10032 afii10049 -22 -KPX afii10032 afii10077 -11 -KPX afii10032 afii10087 -22 -KPX afii10034 comma -156 -KPX afii10034 period -156 -KPX afii10034 colon -11 -KPX afii10034 semicolon -11 -KPX afii10034 guillemotright -33 -KPX afii10034 afii10017 -78 -KPX afii10034 afii10021 -78 -KPX afii10034 afii10024 -44 -KPX afii10034 afii10025 -22 -KPX afii10034 afii10029 -67 -KPX afii10034 afii10030 -11 -KPX afii10034 afii10036 -56 -KPX afii10034 afii10037 -45 -KPX afii10034 afii10038 -11 -KPX afii10034 afii10039 -45 -KPX afii10034 afii10049 -11 -KPX afii10034 afii10069 -11 -KPX afii10034 afii10070 -11 -KPX afii10034 afii10080 -11 -KPX afii10034 afii10097 -11 -KPX afii10035 afii10017 -33 -KPX afii10035 afii10021 -33 -KPX afii10035 afii10025 -11 -KPX afii10035 afii10029 -33 -KPX afii10035 afii10030 -11 -KPX afii10035 afii10032 -11 -KPX afii10035 afii10036 -33 -KPX afii10035 afii10037 -56 -KPX afii10035 afii10039 -22 -KPX afii10035 afii10041 -44 -KPX afii10035 afii10044 -67 -KPX afii10035 afii10065 11 -KPX afii10035 afii10085 -11 -KPX afii10035 afii10089 -22 -KPX afii10036 comma -89 -KPX afii10036 period -89 -KPX afii10036 colon -11 -KPX afii10036 semicolon -11 -KPX afii10036 afii10017 -33 -KPX afii10036 afii10021 -22 -KPX afii10036 afii10024 11 -KPX afii10036 afii10025 -11 -KPX afii10036 afii10029 -33 -KPX afii10036 afii10030 11 -KPX afii10036 afii10032 -22 -KPX afii10036 afii10038 -33 -KPX afii10036 afii10047 -11 -KPX afii10036 afii10049 11 -KPX afii10036 afii10065 -22 -KPX afii10036 afii10067 -33 -KPX afii10036 afii10070 -33 -KPX afii10036 afii10074 -33 -KPX afii10036 afii10076 -33 -KPX afii10036 afii10077 -33 -KPX afii10036 afii10078 -33 -KPX afii10036 afii10080 -33 -KPX afii10036 afii10081 -33 -KPX afii10036 afii10082 -33 -KPX afii10036 afii10083 -33 -KPX afii10036 afii10085 -33 -KPX afii10036 afii10087 -33 -KPX afii10036 afii10091 -33 -KPX afii10036 afii10093 -33 -KPX afii10036 afii10094 -33 -KPX afii10036 afii10096 -33 -KPX afii10036 afii10097 -33 -KPX afii10037 comma -78 -KPX afii10037 period -78 -KPX afii10037 colon -22 -KPX afii10037 semicolon -22 -KPX afii10037 afii10017 -33 -KPX afii10037 afii10021 -33 -KPX afii10037 afii10025 11 -KPX afii10037 afii10029 -22 -KPX afii10037 afii10038 -11 -KPX afii10037 afii10047 11 -KPX afii10037 afii10049 11 -KPX afii10037 afii10067 -22 -KPX afii10037 afii10068 -22 -KPX afii10037 afii10069 -11 -KPX afii10037 afii10070 -22 -KPX afii10037 afii10072 -11 -KPX afii10037 afii10073 -11 -KPX afii10037 afii10074 -11 -KPX afii10037 afii10076 -11 -KPX afii10037 afii10077 -34 -KPX afii10037 afii10078 -11 -KPX afii10037 afii10079 -11 -KPX afii10037 afii10080 -22 -KPX afii10037 afii10081 -11 -KPX afii10037 afii10082 -11 -KPX afii10037 afii10083 -22 -KPX afii10037 afii10087 -11 -KPX afii10037 afii10088 -11 -KPX afii10037 afii10090 -11 -KPX afii10037 afii10091 -11 -KPX afii10037 afii10096 -11 -KPX afii10037 afii10097 -11 -KPX afii10038 afii10017 -56 -KPX afii10038 afii10021 -67 -KPX afii10038 afii10029 -56 -KPX afii10038 afii10030 -11 -KPX afii10038 afii10036 -78 -KPX afii10038 afii10037 -89 -KPX afii10038 afii10038 11 -KPX afii10038 afii10041 -34 -KPX afii10038 afii10049 -22 -KPX afii10038 afii10077 -22 -KPX afii10039 afii10025 -11 -KPX afii10039 afii10032 -34 -KPX afii10039 afii10035 -34 -KPX afii10039 afii10038 -33 -KPX afii10039 afii10080 -22 -KPX afii10039 afii10085 -22 -KPX afii10040 afii10065 33 -KPX afii10040 afii10070 22 -KPX afii10040 afii10080 22 -KPX afii10043 afii10065 22 -KPX afii10043 afii10070 11 -KPX afii10043 afii10085 11 -KPX afii10044 quoteright -111 -KPX afii10044 afii10049 -33 -KPX afii10046 quoteright -122 -KPX afii10046 afii10017 -44 -KPX afii10046 afii10021 -22 -KPX afii10046 afii10024 -56 -KPX afii10046 afii10025 -33 -KPX afii10046 afii10029 -22 -KPX afii10046 afii10030 -22 -KPX afii10046 afii10032 -45 -KPX afii10046 afii10035 -45 -KPX afii10046 afii10036 -111 -KPX afii10046 afii10039 -56 -KPX afii10046 afii10041 -100 -KPX afii10046 afii10047 -33 -KPX afii10046 afii10049 -45 -KPX afii10047 afii10021 -34 -KPX afii10047 afii10024 -23 -KPX afii10047 afii10029 -45 -KPX afii10047 afii10032 11 -KPX afii10047 afii10038 22 -KPX afii10047 afii10039 -34 -KPX afii10047 afii10049 -22 -KPX afii10047 afii10069 22 -KPX afii10047 afii10072 11 -KPX afii10047 afii10078 11 -KPX afii10047 afii10097 11 -KPX afii10048 afii10017 -44 -KPX afii10048 afii10021 -56 -KPX afii10048 afii10024 -33 -KPX afii10048 afii10029 -56 -KPX afii10048 afii10032 -11 -KPX afii10048 afii10035 -11 -KPX afii10048 afii10036 -67 -KPX afii10048 afii10039 -33 -KPX afii10048 afii10041 -45 -KPX afii10065 afii10073 -22 -KPX afii10065 afii10077 -11 -KPX afii10065 afii10081 -11 -KPX afii10065 afii10085 -33 -KPX afii10065 afii10089 -67 -KPX afii10065 afii10095 -11 -KPX afii10066 afii10069 11 -KPX afii10066 afii10072 -11 -KPX afii10066 afii10077 -22 -KPX afii10066 afii10085 -22 -KPX afii10066 afii10087 -33 -KPX afii10066 afii10089 -33 -KPX afii10066 afii10092 -33 -KPX afii10066 afii10097 -11 -KPX afii10067 afii10065 -22 -KPX afii10067 afii10066 -11 -KPX afii10067 afii10069 -22 -KPX afii10067 afii10070 -22 -KPX afii10067 afii10072 -22 -KPX afii10067 afii10073 -22 -KPX afii10067 afii10077 -33 -KPX afii10067 afii10078 -22 -KPX afii10067 afii10080 -22 -KPX afii10067 afii10083 -22 -KPX afii10067 afii10084 -11 -KPX afii10067 afii10085 -33 -KPX afii10067 afii10086 -22 -KPX afii10067 afii10089 -56 -KPX afii10067 afii10092 -45 -KPX afii10067 afii10097 -22 -KPX afii10068 afii10065 -11 -KPX afii10068 afii10069 -11 -KPX afii10068 afii10070 -11 -KPX afii10068 afii10073 -11 -KPX afii10068 afii10077 -11 -KPX afii10068 afii10078 -11 -KPX afii10068 afii10080 -11 -KPX afii10068 afii10083 -11 -KPX afii10068 afii10097 -22 -KPX afii10069 afii10085 -11 -KPX afii10070 afii10065 -11 -KPX afii10070 afii10069 -11 -KPX afii10070 afii10072 -11 -KPX afii10070 afii10073 -11 -KPX afii10070 afii10077 -33 -KPX afii10070 afii10078 -11 -KPX afii10070 afii10083 -11 -KPX afii10070 afii10084 -11 -KPX afii10070 afii10085 -33 -KPX afii10070 afii10086 -11 -KPX afii10070 afii10087 -44 -KPX afii10070 afii10089 -56 -KPX afii10072 afii10084 11 -KPX afii10072 afii10085 11 -KPX afii10072 afii10089 -22 -KPX afii10072 afii10092 11 -KPX afii10073 afii10065 -11 -KPX afii10073 afii10066 -11 -KPX afii10073 afii10069 -11 -KPX afii10073 afii10070 -11 -KPX afii10073 afii10072 -11 -KPX afii10073 afii10077 -22 -KPX afii10073 afii10078 -11 -KPX afii10073 afii10080 -11 -KPX afii10073 afii10083 -22 -KPX afii10073 afii10085 -33 -KPX afii10073 afii10086 -11 -KPX afii10073 afii10089 -56 -KPX afii10073 afii10092 -33 -KPX afii10076 afii10066 11 -KPX afii10076 afii10083 -11 -KPX afii10076 afii10084 11 -KPX afii10076 afii10089 -22 -KPX afii10077 afii10085 -11 -KPX afii10077 afii10089 -33 -KPX afii10078 afii10073 -11 -KPX afii10078 afii10083 -11 -KPX afii10078 afii10085 -11 -KPX afii10078 afii10086 -11 -KPX afii10078 afii10095 -11 -KPX afii10080 afii10072 -22 -KPX afii10080 afii10073 -11 -KPX afii10080 afii10077 -22 -KPX afii10080 afii10085 -33 -KPX afii10080 afii10087 -22 -KPX afii10080 afii10089 -45 -KPX afii10080 afii10095 -11 -KPX afii10080 afii10097 -22 -KPX afii10082 afii10072 -11 -KPX afii10082 afii10073 -11 -KPX afii10082 afii10077 -22 -KPX afii10082 afii10078 -11 -KPX afii10082 afii10085 -33 -KPX afii10082 afii10087 -33 -KPX afii10082 afii10089 -45 -KPX afii10082 afii10095 -11 -KPX afii10082 afii10097 -11 -KPX afii10083 afii10072 -11 -KPX afii10083 afii10085 -11 -KPX afii10083 afii10087 -22 -KPX afii10083 afii10089 -33 -KPX afii10083 afii10092 -22 -KPX afii10084 comma -11 -KPX afii10084 period -11 -KPX afii10084 afii10065 -11 -KPX afii10084 afii10069 -11 -KPX afii10084 afii10072 -11 -KPX afii10084 afii10073 -11 -KPX afii10084 afii10077 -22 -KPX afii10084 afii10078 -11 -KPX afii10084 afii10080 -11 -KPX afii10084 afii10082 -11 -KPX afii10084 afii10083 -11 -KPX afii10084 afii10085 -22 -KPX afii10084 afii10095 -11 -KPX afii10084 afii10097 -11 -KPX afii10085 comma -67 -KPX afii10085 period -67 -KPX afii10085 afii10066 22 -KPX afii10085 afii10072 11 -KPX afii10085 afii10077 -11 -KPX afii10085 afii10095 11 -KPX afii10086 afii10066 11 -KPX afii10086 afii10070 11 -KPX afii10086 afii10077 -22 -KPX afii10086 afii10080 11 -KPX afii10086 afii10085 -22 -KPX afii10086 afii10089 -45 -KPX afii10087 afii10065 -11 -KPX afii10087 afii10070 -11 -KPX afii10087 afii10073 -11 -KPX afii10087 afii10080 -11 -KPX afii10087 afii10083 -11 -KPX afii10087 afii10086 -22 -KPX afii10087 afii10089 -45 -KPX afii10087 afii10095 -11 -KPX afii10088 afii10065 11 -KPX afii10088 afii10085 11 -KPX afii10091 afii10065 11 -KPX afii10091 afii10085 22 -KPX afii10094 afii10089 -89 -KPX afii10095 afii10072 -11 -KPX afii10095 afii10077 -22 -KPX afii10095 afii10087 -23 -KPX afii10095 afii10097 -11 -KPX afii10096 afii10072 -11 -KPX afii10096 afii10077 -22 -KPX afii10096 afii10087 -33 -KPX afii10096 afii10089 -45 -KPX afii10110 comma -56 -KPX afii10110 period -56 -KPX afii10050 comma -56 -KPX afii10050 period -56 -KPX afii10050 guillemotleft -22 -KPX afii10050 guillemotright -22 -KPX pi alpha -14 -KPX pi delta -14 -KPX pi sigma -14 -KPX pi phi -14 -KPX pi alphatonos -14 -KPX pi zeta -14 -KPX pi omicron -14 -KPX pi sigma1 -14 -KPX pi omega -14 -KPX pi omegatonos -14 -EndKernPairs -EndKernData -EndFontMetrics +StartFontMetrics 4.1 +FontName Arial-ItalicMT +FullName Arial Italic +Notice Typeface The Monotype Corporation plc. Data The Monotype Corporation plc/Type Solutions Inc. 1990-1992. All Rights Reserved +EncodingScheme FontSpecific +FamilyName Arial +Weight Italic +Version Version 2.90 +Characters 956 +ItalicAngle -12.0 +Ascender 905 +Descender -212 +UnderlineThickness 73 +UnderlinePosition -106 +IsFixedPitch false +FontBBox -517 -325 1082 998 +StartCharMetrics 991 +C 0 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 1 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 2 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 3 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 4 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 5 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 6 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 7 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 8 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 9 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 10 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 11 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 12 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 13 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 14 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 15 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 16 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 17 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 18 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 19 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 20 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 21 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 22 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 23 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 24 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 25 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 26 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 27 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 28 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 29 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 30 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 31 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 32 ; WX 278 ; N space ; B 56 0 304 716 ; +C 33 ; WX 278 ; N exclam ; B 56 0 304 716 ; +C 34 ; WX 355 ; N quotedbl ; B 135 462 429 716 ; +C 35 ; WX 556 ; N numbersign ; B 10 -12 543 728 ; +C 36 ; WX 556 ; N dollar ; B 51 -96 573 764 ; +C 37 ; WX 889 ; N percent ; B 97 -26 853 728 ; +C 38 ; WX 667 ; N ampersand ; B 79 -17 651 728 ; +C 39 ; WX 191 ; N quotesingle ; B 127 462 259 716 ; +C 40 ; WX 333 ; N parenleft ; B 84 -210 413 728 ; +C 41 ; WX 333 ; N parenright ; B -53 -210 275 728 ; +C 42 ; WX 389 ; N asterisk ; B 31 423 354 728 ; +C 43 ; WX 584 ; N plus ; B 56 116 528 589 ; +C 44 ; WX 278 ; N comma ; B 24 -145 176 100 ; +C 45 ; WX 333 ; N hyphen ; B 46 215 334 303 ; +C 46 ; WX 278 ; N period ; B 58 0 179 100 ; +C 47 ; WX 278 ; N slash ; B -51 -12 411 728 ; +C 48 ; WX 556 ; N zero ; B 71 -12 565 719 ; +C 49 ; WX 556 ; N one ; B 148 0 479 719 ; +C 50 ; WX 556 ; N two ; B 59 0 562 719 ; +C 51 ; WX 556 ; N three ; B 55 -12 557 719 ; +C 52 ; WX 556 ; N four ; B 45 0 542 716 ; +C 53 ; WX 556 ; N five ; B 69 -12 572 706 ; +C 54 ; WX 556 ; N six ; B 83 -12 568 719 ; +C 55 ; WX 556 ; N seven ; B 121 0 595 706 ; +C 56 ; WX 556 ; N eight ; B 75 -13 564 719 ; +C 57 ; WX 556 ; N nine ; B 67 -12 551 719 ; +C 58 ; WX 278 ; N colon ; B 57 0 265 519 ; +C 59 ; WX 278 ; N semicolon ; B 24 -145 262 519 ; +C 60 ; WX 584 ; N less ; B 55 110 529 595 ; +C 61 ; WX 584 ; N equal ; B 56 204 528 503 ; +C 62 ; WX 584 ; N greater ; B 55 110 529 595 ; +C 63 ; WX 556 ; N question ; B 127 0 561 728 ; +C 64 ; WX 1015 ; N at ; B 54 -210 979 729 ; +C 65 ; WX 667 ; N A ; B -20 0 617 716 ; +C 66 ; WX 667 ; N B ; B 43 0 655 716 ; +C 67 ; WX 722 ; N C ; B 91 -12 730 728 ; +C 68 ; WX 722 ; N D ; B 44 0 712 716 ; +C 69 ; WX 667 ; N E ; B 45 0 711 716 ; +C 70 ; WX 611 ; N F ; B 45 0 660 716 ; +C 71 ; WX 778 ; N G ; B 97 -12 766 728 ; +C 72 ; WX 722 ; N H ; B 42 0 754 716 ; +C 73 ; WX 278 ; N I ; B 57 0 302 716 ; +C 74 ; WX 500 ; N J ; B 33 -12 536 716 ; +C 75 ; WX 667 ; N K ; B 44 0 741 716 ; +C 76 ; WX 556 ; N L ; B 40 0 524 716 ; +C 77 ; WX 833 ; N M ; B 44 0 872 716 ; +C 78 ; WX 722 ; N N ; B 49 0 757 716 ; +C 79 ; WX 778 ; N O ; B 91 -12 772 728 ; +C 80 ; WX 667 ; N P ; B 43 0 698 716 ; +C 81 ; WX 778 ; N Q ; B 92 -82 773 728 ; +C 82 ; WX 722 ; N R ; B 47 0 730 716 ; +C 83 ; WX 667 ; N S ; B 70 -12 671 728 ; +C 84 ; WX 611 ; N T ; B 125 0 705 716 ; +C 85 ; WX 722 ; N U ; B 97 -13 754 716 ; +C 86 ; WX 667 ; N V ; B 124 0 757 716 ; +C 87 ; WX 944 ; N W ; B 125 0 1062 716 ; +C 88 ; WX 667 ; N X ; B -32 0 769 716 ; +C 89 ; WX 667 ; N Y ; B 117 0 773 716 ; +C 90 ; WX 611 ; N Z ; B 24 0 637 716 ; +C 91 ; WX 278 ; N bracketleft ; B 6 -196 391 716 ; +C 92 ; WX 278 ; N backslash ; B 85 -12 273 728 ; +C 93 ; WX 278 ; N bracketright ; B -59 -196 329 716 ; +C 94 ; WX 469 ; N asciicircum ; B 26 337 443 728 ; +C 95 ; WX 556 ; N underscore ; B -15 -199 567 -135 ; +C 96 ; WX 333 ; N grave ; B 146 582 310 716 ; +C 97 ; WX 556 ; N a ; B 44 -12 526 530 ; +C 98 ; WX 556 ; N b ; B 33 -12 535 716 ; +C 99 ; WX 500 ; N c ; B 56 -12 511 530 ; +C 100 ; WX 556 ; N d ; B 53 -12 598 716 ; +C 101 ; WX 556 ; N e ; B 52 -12 532 530 ; +C 102 ; WX 278 ; N f ; B 45 0 408 728 ; +C 103 ; WX 556 ; N g ; B 26 -208 564 530 ; +C 104 ; WX 556 ; N h ; B 33 0 529 716 ; +C 105 ; WX 222 ; N i ; B 30 0 268 716 ; +C 106 ; WX 222 ; N j ; B -121 -208 267 716 ; +C 107 ; WX 500 ; N k ; B 34 0 554 716 ; +C 108 ; WX 222 ; N l ; B 26 0 264 716 ; +C 109 ; WX 833 ; N m ; B 33 0 813 530 ; +C 110 ; WX 556 ; N n ; B 33 0 528 530 ; +C 111 ; WX 556 ; N o ; B 49 -12 540 530 ; +C 112 ; WX 556 ; N p ; B -10 -199 535 530 ; +C 113 ; WX 556 ; N q ; B 51 -199 552 530 ; +C 114 ; WX 333 ; N r ; B 33 0 419 530 ; +C 115 ; WX 500 ; N s ; B 38 -12 501 530 ; +C 116 ; WX 278 ; N t ; B 56 -9 321 707 ; +C 117 ; WX 556 ; N u ; B 63 -12 558 519 ; +C 118 ; WX 500 ; N v ; B 79 0 559 519 ; +C 119 ; WX 722 ; N w ; B 78 0 777 519 ; +C 120 ; WX 500 ; N x ; B -1 0 538 519 ; +C 121 ; WX 500 ; N y ; B 0 -210 561 519 ; +C 122 ; WX 500 ; N z ; B 20 0 512 519 ; +C 123 ; WX 334 ; N braceleft ; B 52 -210 445 728 ; +C 124 ; WX 260 ; N bar ; B 92 -210 168 728 ; +C 125 ; WX 334 ; N braceright ; B -84 -210 309 728 ; +C 126 ; WX 584 ; N asciitilde ; B 42 272 542 432 ; +C 127 ; WX 750 ; N .notdef ; B 125 0 625 625 ; +C 128 ; WX 556 ; N Euro ; B 40 -12 645 728 ; +C 129 ; WX 544 ; N afii10052 ; B 42 0 656 894 ; +C 130 ; WX 222 ; N quotesinglbase ; B -7 -145 145 100 ; +C 131 ; WX 556 ; N florin ; B 22 -210 530 729 ; +C 132 ; WX 333 ; N quotedblbase ; B -20 -145 292 100 ; +C 133 ; WX 1000 ; N ellipsis ; B 144 0 933 100 ; +C 134 ; WX 556 ; N dagger ; B 91 -170 583 706 ; +C 135 ; WX 556 ; N daggerdbl ; B 5 -170 588 706 ; +C 136 ; WX 333 ; N circumflex ; B 100 582 388 716 ; +C 137 ; WX 1000 ; N perthousand ; B 66 -27 1003 728 ; +C 138 ; WX 667 ; N Scaron ; B 70 -12 671 894 ; +C 139 ; WX 333 ; N guilsinglleft ; B 47 35 314 479 ; +C 140 ; WX 1000 ; N OE ; B 80 -13 1044 728 ; +C 141 ; WX 589 ; N afii10061 ; B 42 0 674 894 ; +C 142 ; WX 611 ; N Zcaron ; B 24 0 637 894 ; +C 143 ; WX 724 ; N afii10145 ; B 42 -199 760 716 ; +C 144 ; WX 333 ; N quotedblbase ; B -20 -145 292 100 ; +C 145 ; WX 222 ; N quoteleft ; B 129 483 281 728 ; +C 146 ; WX 222 ; N quoteright ; B 125 468 277 713 ; +C 147 ; WX 333 ; N quotedblleft ; B 105 483 413 728 ; +C 148 ; WX 333 ; N quotedblright ; B 104 468 417 713 ; +C 149 ; WX 350 ; N bullet ; B 53 227 301 474 ; +C 150 ; WX 556 ; N endash ; B -2 224 554 294 ; +C 151 ; WX 1000 ; N emdash ; B 0 224 1000 294 ; +C 152 ; WX 333 ; N tilde ; B 94 596 424 706 ; +C 153 ; WX 1000 ; N trademark ; B 110 318 871 716 ; +C 154 ; WX 500 ; N scaron ; B 38 -12 504 716 ; +C 155 ; WX 333 ; N guilsinglright ; B 16 35 288 479 ; +C 156 ; WX 944 ; N oe ; B 63 -12 919 530 ; +C 157 ; WX 472 ; N afii10109 ; B 31 0 520 716 ; +C 158 ; WX 500 ; N zcaron ; B 20 0 512 716 ; +C 159 ; WX 667 ; N Ydieresis ; B 117 0 773 858 ; +C 160 ; WX 278 ; N space ; B 56 0 304 716 ; +C 161 ; WX 333 ; N exclamdown ; B 30 -197 278 519 ; +C 162 ; WX 556 ; N cent ; B 75 -199 530 726 ; +C 163 ; WX 556 ; N sterling ; B 31 -12 607 728 ; +C 164 ; WX 556 ; N currency ; B 36 115 516 594 ; +C 165 ; WX 556 ; N yen ; B 37 0 667 716 ; +C 166 ; WX 260 ; N brokenbar ; B 92 -210 168 728 ; +C 167 ; WX 556 ; N section ; B 30 -210 555 728 ; +C 168 ; WX 333 ; N dieresis ; B 116 599 409 699 ; +C 169 ; WX 737 ; N copyright ; B 1 -9 738 728 ; +C 170 ; WX 370 ; N ordfeminine ; B 82 359 409 728 ; +C 171 ; WX 556 ; N guillemotleft ; B 79 35 537 479 ; +C 172 ; WX 584 ; N logicalnot ; B 56 207 528 503 ; +C 173 ; WX 333 ; N hyphen ; B 46 215 334 303 ; +C 174 ; WX 737 ; N registered ; B 1 -9 738 728 ; +C 175 ; WX 552 ; N overscore ; B -15 765 567 828 ; +C 176 ; WX 400 ; N degree ; B 63 457 333 728 ; +C 177 ; WX 549 ; N plusminus ; B 38 0 511 600 ; +C 178 ; WX 333 ; N twosuperior ; B 74 358 401 725 ; +C 179 ; WX 333 ; N threesuperior ; B 83 349 400 725 ; +C 180 ; WX 333 ; N acute ; B 169 582 372 716 ; +C 181 ; WX 576 ; N mu1 ; B 6 -200 572 519 ; +C 182 ; WX 537 ; N paragraph ; B 69 -199 609 716 ; +C 183 ; WX 278 ; N periodcentered ; B 90 302 190 402 ; +C 184 ; WX 333 ; N cedilla ; B 38 -208 288 6 ; +C 185 ; WX 333 ; N onesuperior ; B 136 358 354 725 ; +C 186 ; WX 365 ; N ordmasculine ; B 70 360 412 728 ; +C 187 ; WX 556 ; N guillemotright ; B 41 35 505 479 ; +C 188 ; WX 834 ; N onequarter ; B 83 -30 851 728 ; +C 189 ; WX 834 ; N onehalf ; B 60 -30 827 728 ; +C 190 ; WX 834 ; N threequarters ; B 83 -30 865 728 ; +C 191 ; WX 611 ; N questiondown ; B 57 -209 490 519 ; +C 192 ; WX 667 ; N Agrave ; B -20 0 617 895 ; +C 193 ; WX 667 ; N Aacute ; B -20 0 617 894 ; +C 194 ; WX 667 ; N Acircumflex ; B -20 0 617 894 ; +C 195 ; WX 667 ; N Atilde ; B -20 0 617 868 ; +C 196 ; WX 667 ; N Adieresis ; B -20 0 617 860 ; +C 197 ; WX 667 ; N Aring ; B -20 0 617 863 ; +C 198 ; WX 1000 ; N AE ; B -41 0 1043 716 ; +C 199 ; WX 722 ; N Ccedilla ; B 91 -210 730 728 ; +C 200 ; WX 667 ; N Egrave ; B 45 0 711 895 ; +C 201 ; WX 667 ; N Eacute ; B 45 0 711 894 ; +C 202 ; WX 667 ; N Ecircumflex ; B 45 0 711 894 ; +C 203 ; WX 667 ; N Edieresis ; B 45 0 711 858 ; +C 204 ; WX 278 ; N Igrave ; B 57 0 340 895 ; +C 205 ; WX 278 ; N Iacute ; B 57 0 389 894 ; +C 206 ; WX 278 ; N Icircumflex ; B 57 0 407 894 ; +C 207 ; WX 278 ; N Idieresis ; B 57 0 414 860 ; +C 208 ; WX 722 ; N Eth ; B 36 0 712 716 ; +C 209 ; WX 722 ; N Ntilde ; B 49 0 757 868 ; +C 210 ; WX 778 ; N Ograve ; B 91 -12 772 895 ; +C 211 ; WX 778 ; N Oacute ; B 91 -12 772 894 ; +C 212 ; WX 778 ; N Ocircumflex ; B 91 -12 772 894 ; +C 213 ; WX 778 ; N Otilde ; B 91 -12 772 868 ; +C 214 ; WX 778 ; N Odieresis ; B 91 -12 772 860 ; +C 215 ; WX 584 ; N multiply ; B 79 141 504 566 ; +C 216 ; WX 778 ; N Oslash ; B 85 -50 776 765 ; +C 217 ; WX 722 ; N Ugrave ; B 97 -13 754 895 ; +C 218 ; WX 722 ; N Uacute ; B 97 -13 754 894 ; +C 219 ; WX 722 ; N Ucircumflex ; B 97 -13 754 894 ; +C 220 ; WX 722 ; N Udieresis ; B 97 -13 754 860 ; +C 221 ; WX 667 ; N Yacute ; B 117 0 773 894 ; +C 222 ; WX 667 ; N Thorn ; B 43 0 667 716 ; +C 223 ; WX 611 ; N germandbls ; B 36 -12 567 728 ; +C 224 ; WX 556 ; N agrave ; B 44 -12 526 716 ; +C 225 ; WX 556 ; N aacute ; B 44 -12 526 716 ; +C 226 ; WX 556 ; N acircumflex ; B 44 -12 526 716 ; +C 227 ; WX 556 ; N atilde ; B 44 -12 541 707 ; +C 228 ; WX 556 ; N adieresis ; B 44 -12 526 699 ; +C 229 ; WX 556 ; N aring ; B 44 -12 526 733 ; +C 230 ; WX 889 ; N ae ; B 42 -12 865 531 ; +C 231 ; WX 500 ; N ccedilla ; B 56 -199 511 530 ; +C 232 ; WX 556 ; N egrave ; B 52 -12 532 716 ; +C 233 ; WX 556 ; N eacute ; B 52 -12 532 716 ; +C 234 ; WX 556 ; N ecircumflex ; B 52 -12 532 716 ; +C 235 ; WX 556 ; N edieresis ; B 52 -12 532 699 ; +C 236 ; WX 278 ; N igrave ; B 61 0 310 716 ; +C 237 ; WX 278 ; N iacute ; B 61 0 349 716 ; +C 238 ; WX 278 ; N icircumflex ; B 61 0 362 716 ; +C 239 ; WX 278 ; N idieresis ; B 61 0 378 699 ; +C 240 ; WX 556 ; N eth ; B 49 -12 546 716 ; +C 241 ; WX 556 ; N ntilde ; B 33 0 532 706 ; +C 242 ; WX 556 ; N ograve ; B 49 -12 540 716 ; +C 243 ; WX 556 ; N oacute ; B 49 -12 540 716 ; +C 244 ; WX 556 ; N ocircumflex ; B 49 -12 540 716 ; +C 245 ; WX 556 ; N otilde ; B 49 -12 540 706 ; +C 246 ; WX 556 ; N odieresis ; B 49 -12 540 699 ; +C 247 ; WX 549 ; N divide ; B 38 156 511 550 ; +C 248 ; WX 611 ; N oslash ; B 72 -50 581 566 ; +C 249 ; WX 556 ; N ugrave ; B 63 -12 558 716 ; +C 250 ; WX 556 ; N uacute ; B 63 -12 558 716 ; +C 251 ; WX 556 ; N ucircumflex ; B 63 -12 558 716 ; +C 252 ; WX 556 ; N udieresis ; B 63 -12 558 699 ; +C 253 ; WX 500 ; N yacute ; B 0 -210 561 716 ; +C 254 ; WX 556 ; N thorn ; B -10 -199 535 716 ; +C 255 ; WX 500 ; N ydieresis ; B 0 -210 561 699 ; +C -1 ; WX 0 ; N .null ; B 56 0 304 716 ; +C -1 ; WX 278 ; N nonmarkingreturn ; B 56 0 304 716 ; +C -1 ; WX 549 ; N notequal ; B 38 -14 511 720 ; +C -1 ; WX 713 ; N infinity ; B 75 189 640 510 ; +C -1 ; WX 549 ; N lessequal ; B 38 52 512 654 ; +C -1 ; WX 549 ; N greaterequal ; B 38 52 512 654 ; +C -1 ; WX 494 ; N partialdiff ; B 25 -12 473 728 ; +C -1 ; WX 713 ; N summation ; B 60 -210 677 728 ; +C -1 ; WX 823 ; N product ; B 79 -210 744 728 ; +C -1 ; WX 549 ; N pi1 ; B 0 0 601 519 ; +C -1 ; WX 274 ; N integral ; B 0 -107 273 910 ; +C -1 ; WX 768 ; N Ohm ; B 62 0 720 734 ; +C -1 ; WX 549 ; N radical ; B 42 -38 550 913 ; +C -1 ; WX 549 ; N approxequal ; B 25 184 524 521 ; +C -1 ; WX 612 ; N increment ; B 14 0 600 677 ; +C -1 ; WX 494 ; N lozenge ; B 23 0 472 694 ; +C -1 ; WX 167 ; N fraction ; B -262 -30 505 728 ; +C -1 ; WX 500 ; N fi ; B 54 0 545 728 ; +C -1 ; WX 500 ; N fl ; B 54 0 545 728 ; +C -1 ; WX 278 ; N dotlessi ; B 61 0 258 519 ; +C -1 ; WX 333 ; N macron ; B 98 600 416 668 ; +C -1 ; WX 333 ; N breve ; B 107 567 399 694 ; +C -1 ; WX 333 ; N dotaccent ; B 194 590 326 699 ; +C -1 ; WX 333 ; N ring ; B 160 556 338 733 ; +C -1 ; WX 333 ; N hungarumlaut ; B 86 582 454 716 ; +C -1 ; WX 333 ; N ogonek ; B 61 -208 265 13 ; +C -1 ; WX 333 ; N caron ; B 129 582 416 716 ; +C -1 ; WX 556 ; N Lslash ; B 12 0 524 716 ; +C -1 ; WX 222 ; N lslash ; B 19 0 285 716 ; +C -1 ; WX 584 ; N minus ; B 56 312 528 394 ; +C -1 ; WX 556 ; N franc ; B -12 0 602 716 ; +C -1 ; WX 778 ; N Gbreve ; B 97 -12 766 886 ; +C -1 ; WX 556 ; N gbreve ; B 26 -208 564 694 ; +C -1 ; WX 278 ; N Idot ; B 57 0 334 864 ; +C -1 ; WX 667 ; N Scedilla ; B 70 -210 671 728 ; +C -1 ; WX 500 ; N scedilla ; B 38 -199 501 530 ; +C -1 ; WX 722 ; N Cacute ; B 91 -12 730 894 ; +C -1 ; WX 500 ; N cacute ; B 56 -12 511 716 ; +C -1 ; WX 722 ; N Ccaron ; B 91 -12 730 894 ; +C -1 ; WX 500 ; N ccaron ; B 56 -12 515 716 ; +C -1 ; WX 556 ; N dmacron ; B 53 -12 653 716 ; +C -1 ; WX 333 ; N middot ; B 259 308 380 408 ; +C -1 ; WX 667 ; N Abreve ; B -20 0 617 886 ; +C -1 ; WX 556 ; N abreve ; B 44 -12 526 694 ; +C -1 ; WX 667 ; N Aogonek ; B -20 -208 698 716 ; +C -1 ; WX 556 ; N aogonek ; B 44 -208 570 530 ; +C -1 ; WX 722 ; N Dcaron ; B 44 0 712 894 ; +C -1 ; WX 625 ; N dcaron ; B 55 -12 743 716 ; +C -1 ; WX 722 ; N Dslash ; B 36 0 712 716 ; +C -1 ; WX 667 ; N Eogonek ; B 45 -208 711 716 ; +C -1 ; WX 556 ; N eogonek ; B 52 -208 532 530 ; +C -1 ; WX 667 ; N Ecaron ; B 45 0 711 894 ; +C -1 ; WX 556 ; N ecaron ; B 52 -12 532 716 ; +C -1 ; WX 556 ; N Lacute ; B 40 0 524 894 ; +C -1 ; WX 222 ; N lacute ; B 26 0 351 887 ; +C -1 ; WX 556 ; N Lcaron ; B 40 0 559 716 ; +C -1 ; WX 281 ; N lcaron ; B 27 0 399 716 ; +C -1 ; WX 556 ; N Ldot ; B 40 0 524 716 ; +C -1 ; WX 400 ; N ldot ; B 26 0 369 716 ; +C -1 ; WX 722 ; N Nacute ; B 49 0 757 894 ; +C -1 ; WX 556 ; N nacute ; B 33 0 528 716 ; +C -1 ; WX 722 ; N Ncaron ; B 49 0 757 894 ; +C -1 ; WX 556 ; N ncaron ; B 33 0 530 716 ; +C -1 ; WX 778 ; N Odblacute ; B 91 -12 772 894 ; +C -1 ; WX 556 ; N odblacute ; B 49 -12 582 716 ; +C -1 ; WX 722 ; N Racute ; B 47 0 730 894 ; +C -1 ; WX 333 ; N racute ; B 33 0 419 716 ; +C -1 ; WX 722 ; N Rcaron ; B 47 0 730 894 ; +C -1 ; WX 333 ; N rcaron ; B 33 0 452 716 ; +C -1 ; WX 667 ; N Sacute ; B 70 -12 671 894 ; +C -1 ; WX 500 ; N sacute ; B 38 -12 501 716 ; +C -1 ; WX 611 ; N Tcedilla ; B 125 -275 705 716 ; +C -1 ; WX 278 ; N tcedilla ; B 47 -253 321 707 ; +C -1 ; WX 611 ; N Tcaron ; B 125 0 705 894 ; +C -1 ; WX 354 ; N tcaron ; B 53 -9 473 716 ; +C -1 ; WX 722 ; N Uring ; B 97 -13 754 894 ; +C -1 ; WX 556 ; N uring ; B 63 -12 558 733 ; +C -1 ; WX 722 ; N Udblacute ; B 97 -13 754 894 ; +C -1 ; WX 556 ; N udblacute ; B 63 -12 568 716 ; +C -1 ; WX 611 ; N Zacute ; B 24 0 637 894 ; +C -1 ; WX 500 ; N zacute ; B 20 0 512 716 ; +C -1 ; WX 611 ; N Zdot ; B 24 0 637 864 ; +C -1 ; WX 500 ; N zdot ; B 20 0 512 699 ; +C -1 ; WX 570 ; N Gamma ; B 42 0 659 716 ; +C -1 ; WX 778 ; N Theta ; B 91 -12 772 728 ; +C -1 ; WX 837 ; N Phi ; B 88 -28 826 736 ; +C -1 ; WX 570 ; N alpha ; B 50 -12 599 530 ; +C -1 ; WX 556 ; N delta ; B 48 -12 590 716 ; +C -1 ; WX 439 ; N epsilon ; B 34 -12 458 530 ; +C -1 ; WX 603 ; N sigma ; B 49 -12 645 530 ; +C -1 ; WX 374 ; N tau ; B 86 0 415 519 ; +C -1 ; WX 652 ; N phi ; B 54 -199 640 530 ; +C -1 ; WX 552 ; N underscoredbl ; B -15 -325 567 -135 ; +C -1 ; WX 500 ; N exclamdbl ; B 56 0 522 716 ; +C -1 ; WX 365 ; N nsuperior ; B 58 253 393 585 ; +C -1 ; WX 1094 ; N peseta ; B 12 -13 1075 716 ; +C -1 ; WX 1000 ; N arrowleft ; B 39 77 961 428 ; +C -1 ; WX 500 ; N arrowup ; B 75 -209 426 654 ; +C -1 ; WX 1000 ; N arrowright ; B 39 77 961 428 ; +C -1 ; WX 500 ; N arrowdown ; B 75 -209 426 654 ; +C -1 ; WX 1000 ; N arrowboth ; B 39 77 961 429 ; +C -1 ; WX 500 ; N arrowupdn ; B 74 -208 425 714 ; +C -1 ; WX 500 ; N arrowupdnbse ; B 74 -303 425 714 ; +C -1 ; WX 979 ; N orthogonal ; B 177 0 802 625 ; +C -1 ; WX 719 ; N intersection ; B 77 0 642 729 ; +C -1 ; WX 584 ; N equivalence ; B 56 95 528 611 ; +C -1 ; WX 604 ; N house ; B 77 0 527 563 ; +C -1 ; WX 584 ; N revlogicalnot ; B 55 207 528 503 ; +C -1 ; WX 604 ; N integraltp ; B 267 -251 477 848 ; +C -1 ; WX 604 ; N integralbt ; B 127 -251 337 848 ; +C -1 ; WX 708 ; N SF100000 ; B -11 261 719 346 ; +C -1 ; WX 625 ; N SF110000 ; B 223 -303 309 910 ; +C -1 ; WX 708 ; N SF010000 ; B 312 -303 720 346 ; +C -1 ; WX 708 ; N SF030000 ; B -11 -303 396 346 ; +C -1 ; WX 708 ; N SF020000 ; B 312 261 720 910 ; +C -1 ; WX 708 ; N SF040000 ; B -11 261 396 910 ; +C -1 ; WX 708 ; N SF080000 ; B 312 -303 720 910 ; +C -1 ; WX 708 ; N SF090000 ; B -11 -303 396 910 ; +C -1 ; WX 708 ; N SF060000 ; B -11 -303 719 346 ; +C -1 ; WX 708 ; N SF070000 ; B -11 261 719 910 ; +C -1 ; WX 708 ; N SF050000 ; B -11 -303 719 910 ; +C -1 ; WX 708 ; N SF430000 ; B -11 168 719 439 ; +C -1 ; WX 708 ; N SF240000 ; B 219 -303 490 910 ; +C -1 ; WX 708 ; N SF510000 ; B 312 -303 720 439 ; +C -1 ; WX 708 ; N SF520000 ; B 219 -303 720 346 ; +C -1 ; WX 708 ; N SF390000 ; B 219 -303 719 439 ; +C -1 ; WX 708 ; N SF220000 ; B -11 -303 396 439 ; +C -1 ; WX 708 ; N SF210000 ; B -11 -303 489 346 ; +C -1 ; WX 708 ; N SF250000 ; B -11 -303 489 439 ; +C -1 ; WX 708 ; N SF500000 ; B 312 168 720 910 ; +C -1 ; WX 708 ; N SF490000 ; B 219 261 720 910 ; +C -1 ; WX 708 ; N SF380000 ; B 219 168 719 910 ; +C -1 ; WX 708 ; N SF280000 ; B -11 168 396 910 ; +C -1 ; WX 708 ; N SF270000 ; B -11 261 489 910 ; +C -1 ; WX 708 ; N SF260000 ; B -11 168 489 910 ; +C -1 ; WX 708 ; N SF360000 ; B 312 -303 720 910 ; +C -1 ; WX 708 ; N SF370000 ; B 219 -303 720 910 ; +C -1 ; WX 708 ; N SF420000 ; B 219 -303 720 910 ; +C -1 ; WX 708 ; N SF190000 ; B -11 -303 396 910 ; +C -1 ; WX 708 ; N SF200000 ; B -11 -303 489 910 ; +C -1 ; WX 708 ; N SF230000 ; B -11 -303 489 910 ; +C -1 ; WX 708 ; N SF470000 ; B -11 -303 719 439 ; +C -1 ; WX 708 ; N SF480000 ; B -11 -303 719 346 ; +C -1 ; WX 708 ; N SF410000 ; B -11 -303 719 439 ; +C -1 ; WX 708 ; N SF450000 ; B -11 168 719 910 ; +C -1 ; WX 708 ; N SF460000 ; B -11 261 719 910 ; +C -1 ; WX 708 ; N SF400000 ; B -11 168 719 910 ; +C -1 ; WX 708 ; N SF540000 ; B -11 -303 719 910 ; +C -1 ; WX 708 ; N SF530000 ; B -11 -303 719 910 ; +C -1 ; WX 708 ; N SF440000 ; B -11 -303 719 910 ; +C -1 ; WX 708 ; N upblock ; B -11 303 719 910 ; +C -1 ; WX 708 ; N dnblock ; B -11 -303 719 303 ; +C -1 ; WX 708 ; N block ; B -11 -303 719 910 ; +C -1 ; WX 708 ; N lfblock ; B -11 -303 354 910 ; +C -1 ; WX 708 ; N rtblock ; B 354 -303 720 910 ; +C -1 ; WX 708 ; N ltshade ; B 50 -246 719 910 ; +C -1 ; WX 708 ; N shade ; B -11 -246 719 910 ; +C -1 ; WX 729 ; N dkshade ; B 0 -307 729 910 ; +C -1 ; WX 604 ; N filledbox ; B 71 0 532 461 ; +C -1 ; WX 1000 ; N filledrect ; B 0 155 1000 343 ; +C -1 ; WX 990 ; N triagup ; B 148 0 842 693 ; +C -1 ; WX 990 ; N triagrt ; B 141 -15 849 692 ; +C -1 ; WX 990 ; N triagdn ; B 148 -15 842 678 ; +C -1 ; WX 990 ; N triaglf ; B 141 -15 849 692 ; +C -1 ; WX 604 ; N circle ; B 87 67 517 497 ; +C -1 ; WX 604 ; N invbullet ; B 63 0 541 479 ; +C -1 ; WX 604 ; N invcircle ; B 21 0 584 564 ; +C -1 ; WX 1021 ; N smileface ; B 199 -58 822 564 ; +C -1 ; WX 1052 ; N invsmileface ; B 215 -58 837 564 ; +C -1 ; WX 917 ; N sun ; B 8 -109 909 792 ; +C -1 ; WX 750 ; N female ; B 119 -214 630 736 ; +C -1 ; WX 750 ; N male ; B 54 -128 691 791 ; +C -1 ; WX 531 ; N spade ; B 28 0 503 601 ; +C -1 ; WX 656 ; N club ; B 27 0 629 601 ; +C -1 ; WX 594 ; N heart ; B 31 -12 563 601 ; +C -1 ; WX 510 ; N diamond ; B 31 -12 479 601 ; +C -1 ; WX 500 ; N musicalnote ; B 18 -18 482 666 ; +C -1 ; WX 750 ; N musicalnotedbl ; B 42 -63 649 742 ; +C -1 ; WX 733 ; N IJ ; B 57 -12 769 716 ; +C -1 ; WX 444 ; N ij ; B 29 -208 494 716 ; +C -1 ; WX 615 ; N napostrophe ; B 49 0 590 713 ; +C -1 ; WX 188 ; N minute ; B 127 462 259 716 ; +C -1 ; WX 354 ; N second ; B 135 462 429 716 ; +C -1 ; WX 885 ; N afii61248 ; B 90 -26 870 728 ; +C -1 ; WX 323 ; N afii61289 ; B 12 -12 422 728 ; +C -1 ; WX 604 ; N H22073 ; B 71 0 532 461 ; +C -1 ; WX 354 ; N H18543 ; B 64 217 290 444 ; +C -1 ; WX 354 ; N H18551 ; B 64 217 290 444 ; +C -1 ; WX 604 ; N H18533 ; B 87 67 517 497 ; +C -1 ; WX 354 ; N openbullet ; B 55 208 300 453 ; +C -1 ; WX 667 ; N Amacron ; B -20 0 618 845 ; +C -1 ; WX 556 ; N amacron ; B 44 -12 527 668 ; +C -1 ; WX 722 ; N Ccircumflex ; B 91 -12 730 894 ; +C -1 ; WX 500 ; N ccircumflex ; B 56 -12 511 716 ; +C -1 ; WX 722 ; N Cdot ; B 91 -12 730 869 ; +C -1 ; WX 500 ; N cdot ; B 56 -12 511 699 ; +C -1 ; WX 667 ; N Emacron ; B 45 0 711 845 ; +C -1 ; WX 556 ; N emacron ; B 52 -12 532 668 ; +C -1 ; WX 667 ; N Ebreve ; B 45 0 711 886 ; +C -1 ; WX 556 ; N ebreve ; B 52 -12 532 694 ; +C -1 ; WX 667 ; N Edot ; B 45 0 711 869 ; +C -1 ; WX 556 ; N edot ; B 52 -12 532 699 ; +C -1 ; WX 778 ; N Gcircumflex ; B 97 -12 766 894 ; +C -1 ; WX 556 ; N gcircumflex ; B 26 -208 564 716 ; +C -1 ; WX 778 ; N Gdot ; B 97 -12 766 869 ; +C -1 ; WX 556 ; N gdot ; B 26 -208 564 699 ; +C -1 ; WX 778 ; N Gcedilla ; B 97 -208 766 728 ; +C -1 ; WX 556 ; N gcedilla ; B 26 -208 564 770 ; +C -1 ; WX 722 ; N Hcircumflex ; B 42 0 754 894 ; +C -1 ; WX 556 ; N hcircumflex ; B 33 0 529 894 ; +C -1 ; WX 722 ; N Hbar ; B 42 0 797 716 ; +C -1 ; WX 556 ; N hbar ; B 33 0 529 716 ; +C -1 ; WX 278 ; N Itilde ; B 57 0 438 869 ; +C -1 ; WX 278 ; N itilde ; B 30 0 378 706 ; +C -1 ; WX 278 ; N Imacron ; B 57 0 430 845 ; +C -1 ; WX 278 ; N imacron ; B 30 0 369 668 ; +C -1 ; WX 278 ; N Ibreve ; B 57 0 431 886 ; +C -1 ; WX 278 ; N ibreve ; B 30 0 362 694 ; +C -1 ; WX 278 ; N Iogonek ; B 28 -208 302 716 ; +C -1 ; WX 222 ; N iogonek ; B 0 -208 268 716 ; +C -1 ; WX 500 ; N Jcircumflex ; B 33 -12 625 894 ; +C -1 ; WX 222 ; N jcircumflex ; B -121 -208 331 716 ; +C -1 ; WX 667 ; N Kcedilla ; B 44 -208 741 716 ; +C -1 ; WX 500 ; N kcedilla ; B 34 -208 554 716 ; +C -1 ; WX 500 ; N kgreenlandic ; B 34 0 554 519 ; +C -1 ; WX 556 ; N Lcedilla ; B 40 -208 524 716 ; +C -1 ; WX 222 ; N lcedilla ; B -71 -208 264 716 ; +C -1 ; WX 722 ; N Ncedilla ; B 49 -208 757 716 ; +C -1 ; WX 556 ; N ncedilla ; B 33 -208 528 530 ; +C -1 ; WX 723 ; N Eng ; B 48 -13 715 728 ; +C -1 ; WX 556 ; N eng ; B 36 -208 530 530 ; +C -1 ; WX 778 ; N Omacron ; B 91 -12 772 845 ; +C -1 ; WX 556 ; N omacron ; B 49 -12 540 668 ; +C -1 ; WX 778 ; N Obreve ; B 91 -12 772 886 ; +C -1 ; WX 556 ; N obreve ; B 49 -12 540 694 ; +C -1 ; WX 722 ; N Rcedilla ; B 47 -208 730 716 ; +C -1 ; WX 333 ; N rcedilla ; B -28 -208 419 530 ; +C -1 ; WX 667 ; N Scircumflex ; B 70 -12 671 894 ; +C -1 ; WX 500 ; N scircumflex ; B 38 -12 501 716 ; +C -1 ; WX 611 ; N Tbar ; B 115 0 705 716 ; +C -1 ; WX 278 ; N tbar ; B 12 -9 321 707 ; +C -1 ; WX 722 ; N Utilde ; B 97 -13 754 869 ; +C -1 ; WX 556 ; N utilde ; B 63 -12 558 706 ; +C -1 ; WX 722 ; N Umacron ; B 97 -13 754 845 ; +C -1 ; WX 556 ; N umacron ; B 63 -12 558 668 ; +C -1 ; WX 722 ; N Ubreve ; B 97 -13 754 886 ; +C -1 ; WX 556 ; N ubreve ; B 63 -12 558 694 ; +C -1 ; WX 722 ; N Uogonek ; B 97 -208 754 716 ; +C -1 ; WX 556 ; N uogonek ; B 63 -208 557 519 ; +C -1 ; WX 944 ; N Wcircumflex ; B 125 0 1062 894 ; +C -1 ; WX 722 ; N wcircumflex ; B 78 0 777 716 ; +C -1 ; WX 667 ; N Ycircumflex ; B 117 0 773 894 ; +C -1 ; WX 500 ; N ycircumflex ; B 0 -210 561 716 ; +C -1 ; WX 222 ; N longs ; B 26 0 389 728 ; +C -1 ; WX 667 ; N Aringacute ; B -20 0 622 998 ; +C -1 ; WX 556 ; N aringacute ; B 44 -12 526 914 ; +C -1 ; WX 1000 ; N AEacute ; B -41 0 1043 894 ; +C -1 ; WX 889 ; N aeacute ; B 42 -12 865 716 ; +C -1 ; WX 778 ; N Oslashacute ; B 85 -50 776 894 ; +C -1 ; WX 611 ; N oslashacute ; B 72 -50 581 716 ; +C -1 ; WX 278 ; N anoteleia ; B 145 418 265 519 ; +C -1 ; WX 944 ; N Wgrave ; B 125 0 1062 894 ; +C -1 ; WX 722 ; N wgrave ; B 78 0 777 716 ; +C -1 ; WX 944 ; N Wacute ; B 125 0 1062 894 ; +C -1 ; WX 722 ; N wacute ; B 78 0 777 716 ; +C -1 ; WX 944 ; N Wdieresis ; B 125 0 1062 860 ; +C -1 ; WX 722 ; N wdieresis ; B 78 0 777 699 ; +C -1 ; WX 667 ; N Ygrave ; B 117 0 773 894 ; +C -1 ; WX 500 ; N ygrave ; B 0 -210 561 716 ; +C -1 ; WX 222 ; N quotereversed ; B 150 468 278 713 ; +C -1 ; WX 333 ; N radicalex ; B 75 600 451 668 ; +C -1 ; WX 556 ; N afii08941 ; B 31 -12 607 728 ; +C -1 ; WX 600 ; N estimated ; B 44 -17 561 535 ; +C -1 ; WX 834 ; N oneeighth ; B 60 -30 827 728 ; +C -1 ; WX 834 ; N threeeighths ; B 72 -30 839 728 ; +C -1 ; WX 834 ; N fiveeighths ; B 72 -30 839 728 ; +C -1 ; WX 834 ; N seveneighths ; B 48 -30 819 728 ; +C -1 ; WX 333 ; N commaaccent ; B 19 -257 169 -59 ; +C -1 ; WX 333 ; N undercommaaccent ; B -16 -208 234 -24 ; +C -1 ; WX 333 ; N tonos ; B 185 582 388 716 ; +C -1 ; WX 333 ; N dieresistonos ; B 47 582 449 717 ; +C -1 ; WX 667 ; N Alphatonos ; B -21 0 615 716 ; +C -1 ; WX 789 ; N Epsilontonos ; B 48 0 831 716 ; +C -1 ; WX 846 ; N Etatonos ; B 51 0 879 716 ; +C -1 ; WX 389 ; N Iotatonos ; B 48 0 410 716 ; +C -1 ; WX 794 ; N Omicrontonos ; B 42 -12 784 728 ; +C -1 ; WX 865 ; N Upsilontonos ; B 47 0 970 716 ; +C -1 ; WX 775 ; N Omegatonos ; B 13 0 765 728 ; +C -1 ; WX 222 ; N iotadieresistonos ; B -9 0 393 717 ; +C -1 ; WX 667 ; N Alpha ; B -20 0 617 716 ; +C -1 ; WX 667 ; N Beta ; B 43 0 655 716 ; +C -1 ; WX 671 ; N Delta ; B -10 0 627 716 ; +C -1 ; WX 667 ; N Epsilon ; B 45 0 711 716 ; +C -1 ; WX 611 ; N Zeta ; B 24 0 637 716 ; +C -1 ; WX 722 ; N Eta ; B 42 0 754 716 ; +C -1 ; WX 278 ; N Iota ; B 57 0 302 716 ; +C -1 ; WX 667 ; N Kappa ; B 44 0 741 716 ; +C -1 ; WX 667 ; N Lambda ; B -10 0 623 716 ; +C -1 ; WX 833 ; N Mu ; B 44 0 872 716 ; +C -1 ; WX 722 ; N Nu ; B 49 0 757 716 ; +C -1 ; WX 648 ; N Xi ; B 4 0 691 716 ; +C -1 ; WX 778 ; N Omicron ; B 91 -12 772 728 ; +C -1 ; WX 725 ; N Pi ; B 42 0 754 716 ; +C -1 ; WX 667 ; N Rho ; B 43 0 698 716 ; +C -1 ; WX 600 ; N Sigma ; B 22 0 666 716 ; +C -1 ; WX 611 ; N Tau ; B 125 0 705 716 ; +C -1 ; WX 667 ; N Upsilon ; B 117 0 773 716 ; +C -1 ; WX 667 ; N Chi ; B -32 0 769 716 ; +C -1 ; WX 831 ; N Psi ; B 124 0 886 716 ; +C -1 ; WX 761 ; N Omega ; B 3 0 755 728 ; +C -1 ; WX 278 ; N Iotadieresis ; B 57 0 429 860 ; +C -1 ; WX 667 ; N Upsilondieresis ; B 117 0 773 860 ; +C -1 ; WX 570 ; N alphatonos ; B 50 -12 599 716 ; +C -1 ; WX 439 ; N epsilontonos ; B 34 -12 458 716 ; +C -1 ; WX 555 ; N etatonos ; B 34 -199 528 716 ; +C -1 ; WX 222 ; N iotatonos ; B 30 0 315 716 ; +C -1 ; WX 550 ; N upsilondieresistonos ; B 73 -12 559 717 ; +C -1 ; WX 571 ; N beta ; B -11 -199 556 729 ; +C -1 ; WX 500 ; N gamma ; B 77 -199 557 519 ; +C -1 ; WX 463 ; N zeta ; B 49 -208 562 716 ; +C -1 ; WX 555 ; N eta ; B 34 -199 528 530 ; +C -1 ; WX 542 ; N theta ; B 63 -12 558 730 ; +C -1 ; WX 222 ; N iota ; B 30 0 227 519 ; +C -1 ; WX 500 ; N kappa ; B 29 0 550 519 ; +C -1 ; WX 492 ; N lambda ; B -25 0 447 716 ; +C -1 ; WX 548 ; N mu ; B -12 -199 554 519 ; +C -1 ; WX 500 ; N nu ; B 79 0 559 519 ; +C -1 ; WX 447 ; N xi ; B 56 -208 505 728 ; +C -1 ; WX 556 ; N omicron ; B 49 -12 540 530 ; +C -1 ; WX 573 ; N rho ; B -14 -199 558 530 ; +C -1 ; WX 486 ; N sigma1 ; B 54 -208 536 530 ; +C -1 ; WX 550 ; N upsilon ; B 73 -12 556 519 ; +C -1 ; WX 546 ; N chi ; B -72 -199 591 519 ; +C -1 ; WX 728 ; N psi ; B 76 -199 733 519 ; +C -1 ; WX 779 ; N omega ; B 49 -12 763 519 ; +C -1 ; WX 222 ; N iotadieresis ; B 30 0 352 699 ; +C -1 ; WX 550 ; N upsilondieresis ; B 73 -12 556 699 ; +C -1 ; WX 556 ; N omicrontonos ; B 49 -12 540 716 ; +C -1 ; WX 550 ; N upsilontonos ; B 73 -12 556 716 ; +C -1 ; WX 779 ; N omegatonos ; B 49 -12 763 716 ; +C -1 ; WX 667 ; N afii10023 ; B 45 0 711 860 ; +C -1 ; WX 843 ; N afii10051 ; B 113 -12 822 716 ; +C -1 ; WX 708 ; N afii10053 ; B 91 -12 731 728 ; +C -1 ; WX 667 ; N afii10054 ; B 70 -12 671 728 ; +C -1 ; WX 278 ; N afii10055 ; B 57 0 302 716 ; +C -1 ; WX 278 ; N afii10056 ; B 57 0 423 860 ; +C -1 ; WX 500 ; N afii10057 ; B 33 -12 536 716 ; +C -1 ; WX 1066 ; N afii10058 ; B -11 -12 1042 716 ; +C -1 ; WX 982 ; N afii10059 ; B 42 0 958 716 ; +C -1 ; WX 844 ; N afii10060 ; B 112 0 809 716 ; +C -1 ; WX 639 ; N afii10062 ; B 113 -10 751 883 ; +C -1 ; WX 667 ; N afii10017 ; B -20 0 617 716 ; +C -1 ; WX 651 ; N afii10018 ; B 42 0 657 716 ; +C -1 ; WX 667 ; N afii10019 ; B 43 0 655 716 ; +C -1 ; WX 544 ; N afii10020 ; B 42 0 656 716 ; +C -1 ; WX 704 ; N afii10021 ; B -63 -143 733 716 ; +C -1 ; WX 667 ; N afii10022 ; B 45 0 711 716 ; +C -1 ; WX 917 ; N afii10024 ; B -36 0 1002 721 ; +C -1 ; WX 614 ; N afii10025 ; B 48 -12 614 728 ; +C -1 ; WX 715 ; N afii10026 ; B 42 0 751 716 ; +C -1 ; WX 715 ; N afii10027 ; B 42 0 751 883 ; +C -1 ; WX 589 ; N afii10028 ; B 42 0 674 721 ; +C -1 ; WX 686 ; N afii10029 ; B -10 -8 723 716 ; +C -1 ; WX 833 ; N afii10030 ; B 44 0 872 716 ; +C -1 ; WX 722 ; N afii10031 ; B 42 0 754 716 ; +C -1 ; WX 778 ; N afii10032 ; B 91 -12 772 728 ; +C -1 ; WX 725 ; N afii10033 ; B 42 0 754 716 ; +C -1 ; WX 667 ; N afii10034 ; B 43 0 698 716 ; +C -1 ; WX 722 ; N afii10035 ; B 91 -12 730 728 ; +C -1 ; WX 611 ; N afii10036 ; B 125 0 705 716 ; +C -1 ; WX 639 ; N afii10037 ; B 113 -10 751 716 ; +C -1 ; WX 795 ; N afii10038 ; B 80 0 793 716 ; +C -1 ; WX 667 ; N afii10039 ; B -32 0 769 716 ; +C -1 ; WX 727 ; N afii10040 ; B 42 -143 759 716 ; +C -1 ; WX 673 ; N afii10041 ; B 107 0 709 716 ; +C -1 ; WX 920 ; N afii10042 ; B 42 0 956 716 ; +C -1 ; WX 923 ; N afii10043 ; B 42 -143 956 716 ; +C -1 ; WX 805 ; N afii10044 ; B 113 0 781 716 ; +C -1 ; WX 886 ; N afii10045 ; B 42 0 921 716 ; +C -1 ; WX 651 ; N afii10046 ; B 42 0 626 716 ; +C -1 ; WX 694 ; N afii10047 ; B 44 -12 687 728 ; +C -1 ; WX 1022 ; N afii10048 ; B 42 -12 1012 728 ; +C -1 ; WX 682 ; N afii10049 ; B -26 0 720 716 ; +C -1 ; WX 556 ; N afii10065 ; B 44 -12 526 530 ; +C -1 ; WX 563 ; N afii10066 ; B 58 -12 596 728 ; +C -1 ; WX 522 ; N afii10067 ; B 49 -12 509 530 ; +C -1 ; WX 493 ; N afii10068 ; B 38 -12 480 530 ; +C -1 ; WX 553 ; N afii10069 ; B 49 -12 547 728 ; +C -1 ; WX 556 ; N afii10070 ; B 52 -12 532 530 ; +C -1 ; WX 688 ; N afii10072 ; B -29 0 741 519 ; +C -1 ; WX 465 ; N afii10073 ; B 15 -12 455 530 ; +C -1 ; WX 556 ; N afii10074 ; B 63 -12 558 519 ; +C -1 ; WX 556 ; N afii10075 ; B 63 -12 558 721 ; +C -1 ; WX 472 ; N afii10076 ; B 31 0 520 519 ; +C -1 ; WX 564 ; N afii10077 ; B -20 -7 570 519 ; +C -1 ; WX 686 ; N afii10078 ; B 31 0 692 519 ; +C -1 ; WX 550 ; N afii10079 ; B 31 0 555 519 ; +C -1 ; WX 556 ; N afii10080 ; B 49 -12 540 530 ; +C -1 ; WX 550 ; N afii10081 ; B 31 0 555 519 ; +C -1 ; WX 556 ; N afii10082 ; B -10 -199 535 530 ; +C -1 ; WX 500 ; N afii10083 ; B 56 -12 511 530 ; +C -1 ; WX 833 ; N afii10084 ; B 33 0 813 530 ; +C -1 ; WX 500 ; N afii10085 ; B 0 -210 561 519 ; +C -1 ; WX 835 ; N afii10086 ; B 46 -199 823 716 ; +C -1 ; WX 500 ; N afii10087 ; B -1 0 538 519 ; +C -1 ; WX 572 ; N afii10088 ; B 61 -151 556 519 ; +C -1 ; WX 518 ; N afii10089 ; B 74 0 523 519 ; +C -1 ; WX 830 ; N afii10090 ; B 59 -12 835 519 ; +C -1 ; WX 851 ; N afii10091 ; B 59 -151 836 519 ; +C -1 ; WX 621 ; N afii10092 ; B 59 0 588 519 ; +C -1 ; WX 736 ; N afii10093 ; B 31 0 743 519 ; +C -1 ; WX 526 ; N afii10094 ; B 31 0 492 519 ; +C -1 ; WX 492 ; N afii10095 ; B 26 -12 479 530 ; +C -1 ; WX 752 ; N afii10096 ; B 31 -12 738 533 ; +C -1 ; WX 534 ; N afii10097 ; B -12 0 542 519 ; +C -1 ; WX 556 ; N afii10071 ; B 52 -12 532 699 ; +C -1 ; WX 556 ; N afii10099 ; B 34 -208 529 716 ; +C -1 ; WX 378 ; N afii10100 ; B 31 0 445 716 ; +C -1 ; WX 496 ; N afii10101 ; B 47 -12 500 530 ; +C -1 ; WX 500 ; N afii10102 ; B 38 -12 501 530 ; +C -1 ; WX 222 ; N afii10103 ; B 30 0 268 716 ; +C -1 ; WX 222 ; N afii10104 ; B 30 0 347 699 ; +C -1 ; WX 222 ; N afii10105 ; B -121 -208 267 716 ; +C -1 ; WX 910 ; N afii10106 ; B -20 -12 876 519 ; +C -1 ; WX 828 ; N afii10107 ; B 31 0 794 519 ; +C -1 ; WX 556 ; N afii10108 ; B 34 0 529 716 ; +C -1 ; WX 500 ; N afii10110 ; B 0 -210 561 720 ; +C -1 ; WX 556 ; N afii10193 ; B 61 -199 556 519 ; +C -1 ; WX 492 ; N afii10050 ; B 42 0 636 858 ; +C -1 ; WX 339 ; N afii10098 ; B 31 0 437 642 ; +C -1 ; WX 1000 ; N afii00208 ; B 40 224 992 294 ; +C -1 ; WX 1083 ; N afii61352 ; B 44 0 1082 716 ; +C -1 ; WX 670 ; N pi ; B 84 0 713 519 ; +C -1 ; WX 333 ; N sheva ; B 68 -306 179 -98 ; +C -1 ; WX 333 ; N hatafsegol ; B -16 -306 290 -98 ; +C -1 ; WX 333 ; N hatafpatah ; B -9 -306 280 -98 ; +C -1 ; WX 333 ; N hatafqamats ; B -9 -306 280 -98 ; +C -1 ; WX 333 ; N hiriq ; B 95 -180 179 -98 ; +C -1 ; WX 333 ; N tsere ; B 31 -180 243 -98 ; +C -1 ; WX 333 ; N segol ; B 31 -306 243 -98 ; +C -1 ; WX 333 ; N patah ; B 36 -154 243 -103 ; +C -1 ; WX 333 ; N qamats ; B 36 -236 243 -103 ; +C -1 ; WX 333 ; N holam ; B 256 577 340 659 ; +C -1 ; WX 333 ; N qubuts ; B -23 -306 270 -98 ; +C -1 ; WX 333 ; N dagesh ; B 185 241 269 323 ; +C -1 ; WX 333 ; N meteg ; B 78 -299 170 -103 ; +C -1 ; WX 383 ; N maqaf ; B 155 440 432 518 ; +C -1 ; WX 333 ; N rafe ; B 198 611 405 662 ; +C -1 ; WX 275 ; N paseq ; B 101 -10 305 625 ; +C -1 ; WX 333 ; N shindot ; B 511 577 595 660 ; +C -1 ; WX 333 ; N sindot ; B 7 577 94 660 ; +C -1 ; WX 278 ; N sofpasuq ; B 90 0 301 519 ; +C -1 ; WX 563 ; N alef ; B 51 0 614 518 ; +C -1 ; WX 542 ; N bet ; B 24 0 537 524 ; +C -1 ; WX 399 ; N gimel ; B 12 0 401 524 ; +C -1 ; WX 508 ; N dalet ; B 116 0 597 518 ; +C -1 ; WX 602 ; N he ; B 79 0 600 524 ; +C -1 ; WX 247 ; N vav ; B 76 0 281 518 ; +C -1 ; WX 382 ; N zayin ; B 125 0 471 518 ; +C -1 ; WX 599 ; N het ; B 76 0 600 524 ; +C -1 ; WX 590 ; N tet ; B 105 -14 609 529 ; +C -1 ; WX 247 ; N yod ; B 129 250 281 518 ; +C -1 ; WX 509 ; N finalkaf ; B 120 -199 507 524 ; +C -1 ; WX 461 ; N kaf ; B 41 -8 479 527 ; +C -1 ; WX 463 ; N lamed ; B 123 0 520 716 ; +C -1 ; WX 599 ; N finalmem ; B 76 0 600 524 ; +C -1 ; WX 601 ; N mem ; B 54 0 598 524 ; +C -1 ; WX 247 ; N finalnun ; B 33 -199 281 518 ; +C -1 ; WX 353 ; N nun ; B 29 0 365 524 ; +C -1 ; WX 574 ; N samekh ; B 90 -15 594 532 ; +C -1 ; WX 529 ; N ayin ; B 15 -48 574 518 ; +C -1 ; WX 566 ; N finalpe ; B 113 -199 567 524 ; +C -1 ; WX 546 ; N pe ; B 62 -8 567 527 ; +C -1 ; WX 461 ; N finaltsadi ; B 123 -199 533 518 ; +C -1 ; WX 479 ; N tsadi ; B 31 0 535 518 ; +C -1 ; WX 550 ; N qof ; B 39 -199 606 518 ; +C -1 ; WX 509 ; N resh ; B 120 0 507 524 ; +C -1 ; WX 694 ; N shin ; B 116 -14 756 518 ; +C -1 ; WX 643 ; N tav ; B 22 -4 642 524 ; +C -1 ; WX 493 ; N doublevav ; B 76 0 528 518 ; +C -1 ; WX 493 ; N vavyod ; B 129 0 528 518 ; +C -1 ; WX 493 ; N doubleyod ; B 129 250 528 518 ; +C -1 ; WX 236 ; N geresh ; B 114 330 302 518 ; +C -1 ; WX 417 ; N gershayim ; B 114 330 483 518 ; +C -1 ; WX 815 ; N newsheqelsign ; B 76 0 850 518 ; +C -1 ; WX 247 ; N vavshindot ; B 76 0 281 660 ; +C -1 ; WX 509 ; N finalkafsheva ; B 120 -199 508 524 ; +C -1 ; WX 509 ; N finalkafqamats ; B 92 -199 508 524 ; +C -1 ; WX 463 ; N lamedholam ; B 48 0 520 716 ; +C -1 ; WX 463 ; N lamedholamdagesh ; B 48 0 520 716 ; +C -1 ; WX 535 ; N altayin ; B 22 0 580 518 ; +C -1 ; WX 694 ; N shinshindot ; B 116 -14 776 660 ; +C -1 ; WX 694 ; N shinsindot ; B 116 -14 756 660 ; +C -1 ; WX 694 ; N shindageshshindot ; B 116 -14 776 660 ; +C -1 ; WX 694 ; N shindageshsindot ; B 116 -14 756 660 ; +C -1 ; WX 563 ; N alefpatah ; B 51 -154 614 519 ; +C -1 ; WX 563 ; N alefqamats ; B 51 -236 614 519 ; +C -1 ; WX 563 ; N alefmapiq ; B 51 0 614 518 ; +C -1 ; WX 542 ; N betdagesh ; B 24 0 537 524 ; +C -1 ; WX 399 ; N gimeldagesh ; B 12 0 401 524 ; +C -1 ; WX 508 ; N daletdagesh ; B 116 0 597 519 ; +C -1 ; WX 602 ; N hedagesh ; B 79 0 600 524 ; +C -1 ; WX 287 ; N vavdagesh ; B 59 0 321 518 ; +C -1 ; WX 411 ; N zayindagesh ; B 65 0 514 518 ; +C -1 ; WX 590 ; N tetdagesh ; B 112 -14 610 529 ; +C -1 ; WX 287 ; N yoddagesh ; B 75 250 321 518 ; +C -1 ; WX 509 ; N finalkafdagesh ; B 120 -199 508 524 ; +C -1 ; WX 461 ; N kafdagesh ; B 41 -8 480 527 ; +C -1 ; WX 463 ; N lameddagesh ; B 123 0 520 716 ; +C -1 ; WX 601 ; N memdagesh ; B 54 0 599 524 ; +C -1 ; WX 353 ; N nundagesh ; B 29 0 365 524 ; +C -1 ; WX 574 ; N samekhdagesh ; B 90 -15 594 532 ; +C -1 ; WX 566 ; N finalpedagesh ; B 112 -199 566 524 ; +C -1 ; WX 546 ; N pedagesh ; B 62 -8 567 527 ; +C -1 ; WX 479 ; N tsadidagesh ; B 31 0 535 519 ; +C -1 ; WX 550 ; N qofdagesh ; B 39 -199 606 519 ; +C -1 ; WX 509 ; N reshdagesh ; B 120 0 507 524 ; +C -1 ; WX 694 ; N shindagesh ; B 116 -14 756 518 ; +C -1 ; WX 643 ; N tavdages ; B 22 -4 642 524 ; +C -1 ; WX 247 ; N vavholam ; B 76 0 296 659 ; +C -1 ; WX 542 ; N betrafe ; B 24 0 537 662 ; +C -1 ; WX 461 ; N kafrafe ; B 41 -8 479 662 ; +C -1 ; WX 546 ; N perafe ; B 62 -8 567 662 ; +C -1 ; WX 576 ; N aleflamed ; B 64 0 627 716 ; +C -1 ; WX 0 ; N zerowidthnonjoiner ; B -18 -134 18 629 ; +C -1 ; WX 0 ; N zerowidthjoiner ; B -107 -134 107 690 ; +C -1 ; WX 0 ; N lefttorightmark ; B -18 -134 210 690 ; +C -1 ; WX 0 ; N righttoleftmark ; B -210 -134 17 690 ; +C -1 ; WX 0 ; N uni202A ; B -18 -134 210 603 ; +C -1 ; WX 0 ; N uni202B ; B -210 -134 18 603 ; +C -1 ; WX 0 ; N uni202D ; B -114 -134 114 690 ; +C -1 ; WX 0 ; N uni202E ; B -114 -134 114 690 ; +C -1 ; WX 0 ; N uni202C ; B -114 -134 114 690 ; +C -1 ; WX 0 ; N uni206E ; B -114 -134 114 690 ; +C -1 ; WX 0 ; N uni206F ; B -114 -134 114 690 ; +C -1 ; WX 0 ; N uni206A ; B -114 -134 114 690 ; +C -1 ; WX 0 ; N uni206B ; B -114 -134 114 690 ; +C -1 ; WX 0 ; N uni206C ; B -114 -134 114 690 ; +C -1 ; WX 0 ; N uni206D ; B -114 -134 114 690 ; +C -1 ; WX 0 ; N uniF00A ; B -18 -208 18 894 ; +C -1 ; WX 0 ; N uniF00B ; B -114 -208 114 894 ; +C -1 ; WX 0 ; N uniF00C ; B -18 -208 109 894 ; +C -1 ; WX 0 ; N uniF00D ; B -109 -208 18 894 ; +C -1 ; WX 0 ; N uniF00E ; B -18 -208 114 894 ; +C -1 ; WX 1000 ; N uniFFFC ; B 0 0 1000 719 ; +C -1 ; WX 812 ; N Ohorn ; B 91 -12 898 728 ; +C -1 ; WX 604 ; N ohorn ; B 49 -12 678 530 ; +C -1 ; WX 793 ; N Uhorn ; B 97 -13 921 716 ; +C -1 ; WX 634 ; N uhorn ; B 63 -12 721 519 ; +C -1 ; WX 0 ; N f00b ; B -131 822 45 894 ; +C -1 ; WX 0 ; N f00c ; B -343 822 -167 894 ; +C -1 ; WX 0 ; N f00e ; B -286 755 -122 890 ; +C -1 ; WX 0 ; N f006 ; B -82 822 94 894 ; +C -1 ; WX 0 ; N f007 ; B -260 822 -83 894 ; +C -1 ; WX 0 ; N f009 ; B -221 755 -18 890 ; +C -1 ; WX 0 ; N combininghookabove ; B -103 754 100 895 ; +C -1 ; WX 0 ; N f010 ; B -98 812 97 894 ; +C -1 ; WX 0 ; N f013 ; B -246 754 -43 895 ; +C -1 ; WX 0 ; N f011 ; B -317 812 -123 894 ; +C -1 ; WX 0 ; N f01c ; B -163 785 167 895 ; +C -1 ; WX 0 ; N f015 ; B -368 818 -55 895 ; +C -1 ; WX 0 ; N combiningtildeaccent ; B -325 756 5 866 ; +C -1 ; WX 0 ; N _d_783 ; B -10 721 275 787 ; +C -1 ; WX 0 ; N _d_784 ; B -29 743 270 803 ; +C -1 ; WX 0 ; N f02c ; B -217 -159 -96 -59 ; +C -1 ; WX 513 ; N dongsign ; B 42 108 538 716 ; +C -1 ; WX 834 ; N onethird ; B 60 -30 827 728 ; +C -1 ; WX 834 ; N twothirds ; B 60 -30 827 728 ; +C -1 ; WX 0 ; N f008 ; B -73 582 130 716 ; +C -1 ; WX 0 ; N f00a ; B -285 582 -82 716 ; +C -1 ; WX 0 ; N f00d ; B -151 582 13 716 ; +C -1 ; WX 0 ; N f00f ; B -277 582 -113 716 ; +C -1 ; WX 0 ; N f012 ; B -103 582 99 755 ; +C -1 ; WX 0 ; N f014 ; B -278 582 -76 755 ; +C -1 ; WX 0 ; N f016 ; B -384 785 -54 895 ; +C -1 ; WX 0 ; N f017 ; B -493 785 -163 895 ; +C -1 ; WX 0 ; N f018 ; B -493 785 -163 895 ; +C -1 ; WX 0 ; N f019 ; B -365 596 -35 706 ; +C -1 ; WX 0 ; N f01a ; B -429 596 -99 706 ; +C -1 ; WX 0 ; N f01b ; B -439 596 -109 706 ; +C -1 ; WX 0 ; N f01e ; B -429 -159 -308 -59 ; +C -1 ; WX 0 ; N f01f ; B -466 -159 -345 -59 ; +C -1 ; WX 0 ; N f020 ; B -500 -159 -379 -59 ; +C -1 ; WX 0 ; N f021 ; B -466 -159 -345 -59 ; +C -1 ; WX 0 ; N f022 ; B -517 -159 -396 -59 ; +C -1 ; WX 0 ; N combininggraveaccent ; B -131 755 33 890 ; +C -1 ; WX 0 ; N combiningacuteaccent ; B -86 755 117 890 ; +C -1 ; WX 0 ; N f01d ; B -188 596 142 706 ; +C -1 ; WX 0 ; N combiningdotbelow ; B -448 -159 -327 -59 ; +C -1 ; WX 0 ; N f023 ; B -427 -159 -306 -59 ; +C -1 ; WX 0 ; N f029 ; B -254 -159 -133 -59 ; +C -1 ; WX 0 ; N f02a ; B -225 -159 -104 -59 ; +C -1 ; WX 0 ; N f02b ; B -425 -159 -304 -59 ; +C -1 ; WX 0 ; N f024 ; B -378 -159 -257 -59 ; +C -1 ; WX 0 ; N f025 ; B -383 -159 -262 -59 ; +C -1 ; WX 0 ; N f026 ; B -422 -159 -301 -59 ; +C -1 ; WX 0 ; N f027 ; B -432 -159 -311 -59 ; +C -1 ; WX 0 ; N f028 ; B -517 -159 -396 -59 ; +C -1 ; WX 0 ; N f02d ; B -354 818 -40 895 ; +C -1 ; WX 0 ; N f02e ; B -338 785 -8 895 ; +C -1 ; WX 0 ; N f02f ; B -441 818 -128 895 ; +C -1 ; WX 0 ; N f030 ; B -449 785 -119 895 ; +C -1 ; WX 222 ; N f031 ; B 30 0 227 519 ; +C -1 ; WX 667 ; N Adotbelow ; B -20 -159 617 716 ; +C -1 ; WX 556 ; N adotbelow ; B 44 -159 526 530 ; +C -1 ; WX 667 ; N Ahookabove ; B -20 0 617 895 ; +C -1 ; WX 556 ; N ahookabove ; B 44 -12 526 755 ; +C -1 ; WX 667 ; N Acircumflexacute ; B -20 0 617 894 ; +C -1 ; WX 556 ; N acircumflexacute ; B 44 -12 532 890 ; +C -1 ; WX 667 ; N Acircumflexgrave ; B -20 0 617 894 ; +C -1 ; WX 556 ; N acircumflexgrave ; B 44 -12 526 890 ; +C -1 ; WX 667 ; N Acircumflexhookabove ; B -20 0 617 894 ; +C -1 ; WX 556 ; N acircumflexhookabove ; B 44 -12 529 895 ; +C -1 ; WX 667 ; N Acircumflextilde ; B -20 0 617 895 ; +C -1 ; WX 556 ; N acircumflextilde ; B 44 -12 557 866 ; +C -1 ; WX 667 ; N Acircumflexdotbelow ; B -20 -159 617 803 ; +C -1 ; WX 556 ; N acircumflexdotbelow ; B 44 -159 526 716 ; +C -1 ; WX 667 ; N Abreveacute ; B -20 0 617 894 ; +C -1 ; WX 556 ; N abreveacute ; B 44 -12 532 890 ; +C -1 ; WX 667 ; N Abrevegrave ; B -20 0 617 894 ; +C -1 ; WX 556 ; N abrevegrave ; B 44 -12 526 890 ; +C -1 ; WX 667 ; N Abrevehookabove ; B -20 0 617 894 ; +C -1 ; WX 556 ; N abrevehookabove ; B 44 -12 526 895 ; +C -1 ; WX 667 ; N Abrevetilde ; B -20 0 639 895 ; +C -1 ; WX 556 ; N abrevetilde ; B 44 -12 557 866 ; +C -1 ; WX 667 ; N Abrevedotbelow ; B -20 -159 617 787 ; +C -1 ; WX 556 ; N abrevedotbelow ; B 44 -159 526 694 ; +C -1 ; WX 667 ; N Edotbelow ; B 45 -159 711 716 ; +C -1 ; WX 556 ; N edotbelow ; B 52 -159 532 530 ; +C -1 ; WX 667 ; N Ehookabove ; B 45 0 711 895 ; +C -1 ; WX 556 ; N ehookabove ; B 52 -12 532 755 ; +C -1 ; WX 667 ; N Etilde ; B 45 0 711 868 ; +C -1 ; WX 556 ; N etilde ; B 52 -12 532 707 ; +C -1 ; WX 667 ; N Ecircumflexacute ; B 45 0 711 894 ; +C -1 ; WX 556 ; N ecircumflexacute ; B 52 -12 539 890 ; +C -1 ; WX 667 ; N Ecircumflexgrave ; B 45 0 711 894 ; +C -1 ; WX 556 ; N ecircumflexgrave ; B 52 -12 532 890 ; +C -1 ; WX 667 ; N Ecircumflexhookabove ; B 45 0 711 894 ; +C -1 ; WX 556 ; N ecircumflexhookabove ; B 52 -12 539 895 ; +C -1 ; WX 667 ; N Ecircumflextilde ; B 45 0 711 895 ; +C -1 ; WX 556 ; N ecircumflextilde ; B 52 -12 557 866 ; +C -1 ; WX 667 ; N Ecircumflexdotbelow ; B 45 -159 711 803 ; +C -1 ; WX 556 ; N ecircumflexdotbelow ; B 52 -159 532 716 ; +C -1 ; WX 278 ; N Ihookabove ; B 57 0 395 895 ; +C -1 ; WX 222 ; N ihookabove ; B 30 0 325 755 ; +C -1 ; WX 278 ; N Idotbelow ; B 27 -159 302 716 ; +C -1 ; WX 222 ; N idotbelow ; B -12 -159 268 716 ; +C -1 ; WX 778 ; N Odotbelow ; B 91 -159 772 728 ; +C -1 ; WX 556 ; N odotbelow ; B 49 -159 540 530 ; +C -1 ; WX 778 ; N Ohookabove ; B 91 -12 772 895 ; +C -1 ; WX 556 ; N ohookabove ; B 49 -12 540 755 ; +C -1 ; WX 778 ; N Ocircumflexacute ; B 91 -12 772 894 ; +C -1 ; WX 556 ; N ocircumflexacute ; B 49 -12 540 890 ; +C -1 ; WX 778 ; N Ocircumflexgrave ; B 91 -12 772 894 ; +C -1 ; WX 556 ; N ocircumflexgrave ; B 49 -12 540 890 ; +C -1 ; WX 778 ; N Ocircumflexhookabove ; B 91 -12 772 894 ; +C -1 ; WX 556 ; N ocircumflexhookabove ; B 49 -12 540 895 ; +C -1 ; WX 778 ; N Ocircumflextilde ; B 91 -12 772 895 ; +C -1 ; WX 556 ; N ocircumflextilde ; B 49 -12 557 866 ; +C -1 ; WX 778 ; N Ocircumflexdotbelow ; B 91 -159 772 825 ; +C -1 ; WX 556 ; N ocircumflexdotbelow ; B 49 -159 540 716 ; +C -1 ; WX 812 ; N Ohornacute ; B 91 -12 898 894 ; +C -1 ; WX 604 ; N ohornacute ; B 49 -12 678 716 ; +C -1 ; WX 812 ; N Ohorngrave ; B 91 -12 898 895 ; +C -1 ; WX 604 ; N ohorngrave ; B 49 -12 678 716 ; +C -1 ; WX 812 ; N Ohornhookabove ; B 91 -12 898 912 ; +C -1 ; WX 604 ; N ohornhookabove ; B 49 -12 678 755 ; +C -1 ; WX 812 ; N Ohorntilde ; B 91 -12 898 868 ; +C -1 ; WX 604 ; N ohorntilde ; B 49 -12 678 707 ; +C -1 ; WX 812 ; N Ohorndotbelow ; B 91 -159 898 728 ; +C -1 ; WX 604 ; N ohorndotbelow ; B 49 -159 678 530 ; +C -1 ; WX 722 ; N Udotbelow ; B 97 -159 754 716 ; +C -1 ; WX 556 ; N udotbelow ; B 63 -159 558 519 ; +C -1 ; WX 722 ; N Uhookabove ; B 97 -13 754 895 ; +C -1 ; WX 556 ; N uhookabove ; B 63 -12 558 755 ; +C -1 ; WX 793 ; N Uhornacute ; B 97 -13 921 894 ; +C -1 ; WX 634 ; N uhornacute ; B 63 -12 721 716 ; +C -1 ; WX 793 ; N Uhorngrave ; B 97 -13 921 895 ; +C -1 ; WX 634 ; N uhorngrave ; B 63 -12 721 716 ; +C -1 ; WX 793 ; N Uhornhookabove ; B 97 -13 921 895 ; +C -1 ; WX 634 ; N uhornhookabove ; B 63 -12 721 755 ; +C -1 ; WX 793 ; N Uhorntilde ; B 97 -13 921 868 ; +C -1 ; WX 634 ; N uhorntilde ; B 63 -12 721 707 ; +C -1 ; WX 793 ; N Uhorndotbelow ; B 97 -159 921 716 ; +C -1 ; WX 634 ; N uhorndotbelow ; B 63 -159 721 519 ; +C -1 ; WX 667 ; N Ydotbelow ; B 117 -159 773 716 ; +C -1 ; WX 500 ; N ydotbelow ; B 0 -210 561 519 ; +C -1 ; WX 667 ; N Yhookabove ; B 117 0 773 895 ; +C -1 ; WX 500 ; N yhookabove ; B 0 -210 561 755 ; +C -1 ; WX 667 ; N Ytilde ; B 117 0 773 868 ; +C -1 ; WX 500 ; N ytilde ; B 0 -210 561 707 ; +C -1 ; WX 667 ; N uni01CD ; B -20 0 628 893 ; +C -1 ; WX 556 ; N uni01CE ; B 44 -12 528 716 ; +C -1 ; WX 278 ; N uni01CF ; B 57 0 443 893 ; +C -1 ; WX 222 ; N uni01D0 ; B 30 0 375 716 ; +C -1 ; WX 778 ; N uni01D1 ; B 91 -12 772 893 ; +C -1 ; WX 556 ; N uni01D2 ; B 49 -12 540 716 ; +C -1 ; WX 722 ; N uni01D3 ; B 97 -13 754 893 ; +C -1 ; WX 556 ; N uni01D4 ; B 63 -12 558 716 ; +C -1 ; WX 722 ; N uni01D5 ; B 97 -13 754 900 ; +C -1 ; WX 556 ; N uni01D6 ; B 63 -12 558 849 ; +C -1 ; WX 722 ; N uni01D7 ; B 97 -13 754 900 ; +C -1 ; WX 556 ; N uni01D8 ; B 63 -12 558 896 ; +C -1 ; WX 722 ; N uni01D9 ; B 97 -13 754 900 ; +C -1 ; WX 556 ; N uni01DA ; B 63 -12 572 896 ; +C -1 ; WX 722 ; N uni01DB ; B 97 -13 754 900 ; +C -1 ; WX 556 ; N uni01DC ; B 63 -12 558 896 ; +C -1 ; WX 0 ; N _d_928 ; B 23 730 309 900 ; +C -1 ; WX 0 ; N _d_929 ; B 23 730 306 900 ; +C -1 ; WX 0 ; N _d_930 ; B 23 730 294 900 ; +C -1 ; WX 0 ; N _d_931 ; B 23 730 290 900 ; +C -1 ; WX 544 ; N uni0492 ; B 30 0 656 716 ; +C -1 ; WX 378 ; N uni0493 ; B 29 0 445 519 ; +C -1 ; WX 917 ; N uni0496 ; B -36 -199 1002 721 ; +C -1 ; WX 688 ; N uni0497 ; B -29 -147 741 519 ; +C -1 ; WX 589 ; N uni049a ; B 42 -199 674 721 ; +C -1 ; WX 472 ; N uni049b ; B 31 -147 520 519 ; +C -1 ; WX 589 ; N uni049c ; B 42 0 674 721 ; +C -1 ; WX 472 ; N uni049d ; B 31 0 520 519 ; +C -1 ; WX 722 ; N uni04a2 ; B 42 -199 756 716 ; +C -1 ; WX 550 ; N uni04a3 ; B 31 -147 561 519 ; +C -1 ; WX 556 ; N uni04ae ; B 114 0 667 716 ; +C -1 ; WX 500 ; N uni04af ; B 79 -199 560 519 ; +C -1 ; WX 556 ; N uni04b0 ; B 66 0 667 716 ; +C -1 ; WX 500 ; N uni04b1 ; B -6 -199 560 519 ; +C -1 ; WX 667 ; N uni04b2 ; B -32 -199 769 716 ; +C -1 ; WX 500 ; N uni04b3 ; B -1 -147 538 519 ; +C -1 ; WX 673 ; N uni04b8 ; B 97 0 705 716 ; +C -1 ; WX 518 ; N uni04b9 ; B 63 0 524 519 ; +C -1 ; WX 673 ; N uni04ba ; B 57 0 666 716 ; +C -1 ; WX 518 ; N uni04bb ; B 33 0 494 519 ; +C -1 ; WX 778 ; N uni018f ; B 94 -12 744 728 ; +C -1 ; WX 556 ; N uni0259 ; B 58 -12 538 530 ; +C -1 ; WX 778 ; N uni04e8 ; B 91 -12 772 728 ; +C -1 ; WX 556 ; N uni04e9 ; B 49 -12 540 530 ; +EndCharMetrics +StartKernData +StartKernPairs 857 +KPX space A -37 +KPX space Y -18 +KPX space Alphatonos -37 +KPX space Upsilontonos -18 +KPX space Alpha -37 +KPX space Delta -37 +KPX space Lambda -18 +KPX space Upsilon -18 +KPX space Upsilondieresis -18 +KPX one one -74 +KPX A space -37 +KPX A T -74 +KPX A V -55 +KPX A W -18 +KPX A Y -74 +KPX A v -18 +KPX A w -18 +KPX A y -9 +KPX A quoteright -37 +KPX F space -18 +KPX F comma -129 +KPX F period -129 +KPX F A -74 +KPX L space -18 +KPX L T -74 +KPX L V -55 +KPX L W -37 +KPX L Y -92 +KPX L y -18 +KPX L quoteright -55 +KPX P space -37 +KPX P comma -129 +KPX P period -129 +KPX P A -74 +KPX R T -18 +KPX R V -18 +KPX R W -18 +KPX R Y -37 +KPX T comma -92 +KPX T hyphen -92 +KPX T period -92 +KPX T colon -74 +KPX T semicolon -74 +KPX T A -74 +KPX T O -18 +KPX T a -92 +KPX T c -92 +KPX T e -92 +KPX T i -9 +KPX T o -92 +KPX T r -74 +KPX T s -92 +KPX T u -74 +KPX T w -74 +KPX T y -74 +KPX V comma -74 +KPX V hyphen -37 +KPX V period -74 +KPX V colon -18 +KPX V semicolon -18 +KPX V A -55 +KPX V a -37 +KPX V e -37 +KPX V i -18 +KPX V o -37 +KPX V r -18 +KPX V u -18 +KPX V y -18 +KPX W comma -37 +KPX W hyphen -18 +KPX W period -37 +KPX W A -18 +KPX W a -18 +KPX W e -18 +KPX W i -9 +KPX Y space -18 +KPX Y comma -92 +KPX Y hyphen -74 +KPX Y period -92 +KPX Y colon -37 +KPX Y semicolon -37 +KPX Y A -55 +KPX Y a -74 +KPX Y e -55 +KPX Y i -18 +KPX Y o -55 +KPX Y p -55 +KPX Y q -55 +KPX Y u -37 +KPX Y v -37 +KPX f quoteright 37 +KPX r comma -55 +KPX r hyphen -18 +KPX r period -37 +KPX r quoteright 37 +KPX v comma -74 +KPX v period -74 +KPX w comma -55 +KPX w period -55 +KPX y comma -74 +KPX y period -74 +KPX quoteleft quoteleft -37 +KPX quoteright space -55 +KPX quoteright s -18 +KPX quoteright quoteright -37 +KPX quotedblbase afii10051 -122 +KPX quotedblbase afii10060 -111 +KPX quotedblbase afii10036 -134 +KPX quotedblbase afii10041 -145 +KPX quotedblbase afii10044 -111 +KPX Gamma comma -128 +KPX Gamma period -128 +KPX Gamma iotadieresistonos 102 +KPX Gamma Alpha -95 +KPX Gamma Delta -95 +KPX Gamma Lambda -95 +KPX Gamma iota -47 +KPX Gamma iotadieresis 46 +KPX Theta Alpha -11 +KPX Theta Delta -11 +KPX Theta Lambda -11 +KPX Theta Upsilon -54 +KPX Theta Upsilondieresis -54 +KPX Phi Alpha -39 +KPX Phi Upsilon -54 +KPX Phi Upsilondieresis -54 +KPX delta tau -22 +KPX delta gamma -18 +KPX delta chi -29 +KPX delta pi -22 +KPX epsilon sigma1 -27 +KPX tau alpha -14 +KPX tau delta -14 +KPX tau sigma -14 +KPX tau phi -14 +KPX tau alphatonos -14 +KPX tau zeta -14 +KPX tau omicron -14 +KPX tau sigma1 -14 +KPX tau omega -14 +KPX tau omegatonos -14 +KPX phi tau -22 +KPX phi gamma -18 +KPX phi chi -29 +KPX phi pi -22 +KPX Alphatonos space -37 +KPX Alphatonos Theta -52 +KPX Alphatonos Phi -58 +KPX Alphatonos Omicron -52 +KPX Alphatonos Tau -97 +KPX Alphatonos Upsilon -129 +KPX Alphatonos Upsilondieresis -129 +KPX Alphatonos gamma -18 +KPX Alphatonos nu -18 +KPX Alphatonos chi -18 +KPX Omicrontonos Upsilon -54 +KPX Omicrontonos Upsilondieresis -54 +KPX Upsilontonos alpha -55 +KPX Upsilontonos delta -55 +KPX Upsilontonos sigma -55 +KPX Upsilontonos phi -55 +KPX Upsilontonos iotadieresistonos 104 +KPX Upsilontonos Alpha -74 +KPX Upsilontonos Delta -74 +KPX Upsilontonos Lambda -74 +KPX Upsilontonos alphatonos -55 +KPX Upsilontonos etatonos -18 +KPX Upsilontonos iotatonos -18 +KPX Upsilontonos eta -18 +KPX Upsilontonos iota -18 +KPX Upsilontonos kappa -18 +KPX Upsilontonos mu -18 +KPX Upsilontonos omicron -55 +KPX Upsilontonos iotadieresis 52 +KPX Upsilontonos omicrontonos -55 +KPX Omegatonos Upsilon -54 +KPX Omegatonos Upsilondieresis -54 +KPX Alpha space -37 +KPX Alpha quoteright -37 +KPX Alpha Theta -52 +KPX Alpha Phi -58 +KPX Alpha Omicron -52 +KPX Alpha Tau -97 +KPX Alpha Upsilon -129 +KPX Alpha Upsilondieresis -129 +KPX Alpha gamma -18 +KPX Alpha nu -18 +KPX Alpha chi -18 +KPX Delta space -37 +KPX Delta Theta -52 +KPX Delta Omicron -52 +KPX Delta Tau -97 +KPX Delta Upsilon -129 +KPX Delta Upsilondieresis -129 +KPX Kappa Theta -48 +KPX Kappa Phi -61 +KPX Kappa alpha -12 +KPX Kappa delta -12 +KPX Kappa sigma -12 +KPX Kappa phi -12 +KPX Kappa Omicron -48 +KPX Kappa alphatonos -12 +KPX Kappa zeta -12 +KPX Kappa theta -12 +KPX Kappa xi -12 +KPX Kappa omicron -12 +KPX Kappa omega -12 +KPX Kappa omicrontonos -12 +KPX Kappa omegatonos -12 +KPX Lambda space -18 +KPX Lambda Theta -52 +KPX Lambda Omicron -52 +KPX Lambda Tau -97 +KPX Lambda Upsilon -129 +KPX Lambda Upsilondieresis -129 +KPX Omicron Alphatonos -11 +KPX Omicron Alpha -11 +KPX Omicron Delta -11 +KPX Omicron Lambda -11 +KPX Omicron Upsilon -54 +KPX Omicron Upsilondieresis -54 +KPX Rho comma -128 +KPX Rho period -128 +KPX Rho Alpha -74 +KPX Rho Delta -74 +KPX Rho Lambda -74 +KPX Sigma tau -32 +KPX Tau comma -91 +KPX Tau hyphen -91 +KPX Tau period -91 +KPX Tau colon -74 +KPX Tau semicolon -74 +KPX Tau Theta -18 +KPX Tau Phi -18 +KPX Tau alpha -91 +KPX Tau delta -33 +KPX Tau epsilon -91 +KPX Tau sigma -91 +KPX Tau phi -91 +KPX Tau iotadieresistonos 104 +KPX Tau Alpha -74 +KPX Tau Delta -74 +KPX Tau Lambda -74 +KPX Tau Omicron -18 +KPX Tau Omega -18 +KPX Tau alphatonos -91 +KPX Tau epsilontonos -91 +KPX Tau upsilondieresistonos -74 +KPX Tau gamma -43 +KPX Tau eta -74 +KPX Tau iota -8 +KPX Tau mu -74 +KPX Tau nu -43 +KPX Tau omicron -91 +KPX Tau upsilon -74 +KPX Tau chi -43 +KPX Tau psi -83 +KPX Tau iotadieresis 46 +KPX Tau upsilondieresis -74 +KPX Tau omicrontonos -91 +KPX Tau upsilontonos -74 +KPX Upsilon comma -91 +KPX Upsilon hyphen -74 +KPX Upsilon period -91 +KPX Upsilon colon -37 +KPX Upsilon semicolon -37 +KPX Upsilon alpha -55 +KPX Upsilon delta -55 +KPX Upsilon sigma -55 +KPX Upsilon phi -55 +KPX Upsilon iotadieresistonos 104 +KPX Upsilon Alpha -74 +KPX Upsilon Delta -74 +KPX Upsilon Lambda -74 +KPX Upsilon alphatonos -55 +KPX Upsilon etatonos -18 +KPX Upsilon iotatonos -18 +KPX Upsilon gamma -18 +KPX Upsilon eta -18 +KPX Upsilon iota -18 +KPX Upsilon kappa -18 +KPX Upsilon mu -18 +KPX Upsilon omicron -55 +KPX Upsilon iotadieresis 52 +KPX Upsilon omicrontonos -55 +KPX Chi omega -18 +KPX Chi omegatonos -18 +KPX Psi alpha -21 +KPX Psi delta -21 +KPX Psi sigma -21 +KPX Psi phi -21 +KPX Psi alphatonos -21 +KPX Psi omicron -21 +KPX Psi omega -21 +KPX Psi omicrontonos -21 +KPX Psi omegatonos -21 +KPX Omega Upsilon -54 +KPX Omega Upsilondieresis -54 +KPX Upsilondieresis alpha -55 +KPX Upsilondieresis delta -55 +KPX Upsilondieresis sigma -55 +KPX Upsilondieresis phi -55 +KPX Upsilondieresis iotadieresistonos 104 +KPX Upsilondieresis Alpha -74 +KPX Upsilondieresis Delta -74 +KPX Upsilondieresis Lambda -74 +KPX Upsilondieresis alphatonos -55 +KPX Upsilondieresis etatonos -18 +KPX Upsilondieresis eta -18 +KPX Upsilondieresis iota -18 +KPX Upsilondieresis kappa -18 +KPX Upsilondieresis mu -18 +KPX Upsilondieresis omicron -55 +KPX Upsilondieresis iotadieresis 52 +KPX Upsilondieresis omicrontonos -55 +KPX epsilontonos sigma1 -27 +KPX zeta alpha -50 +KPX zeta delta -29 +KPX zeta epsilon -61 +KPX zeta sigma -50 +KPX zeta tau -57 +KPX zeta phi -50 +KPX zeta alphatonos -50 +KPX zeta epsilontonos -61 +KPX zeta etatonos -56 +KPX zeta gamma -29 +KPX zeta eta -56 +KPX zeta theta -29 +KPX zeta iota -56 +KPX zeta nu -29 +KPX zeta omicron -94 +KPX zeta upsilon -61 +KPX zeta omega -50 +KPX zeta iotadieresis 55 +KPX zeta omicrontonos -50 +KPX zeta upsilontonos -61 +KPX zeta omegatonos -50 +KPX zeta pi -57 +KPX kappa alpha -12 +KPX kappa delta -12 +KPX kappa sigma -12 +KPX kappa phi -12 +KPX kappa alphatonos -12 +KPX kappa zeta -29 +KPX kappa xi -29 +KPX kappa omicron -12 +KPX kappa sigma1 -29 +KPX kappa omega -12 +KPX kappa omicrontonos -12 +KPX kappa omegatonos -12 +KPX lambda alpha -14 +KPX lambda delta -14 +KPX lambda sigma -14 +KPX lambda phi -19 +KPX lambda alphatonos -14 +KPX lambda upsilondieresistonos -32 +KPX lambda zeta -14 +KPX lambda xi -14 +KPX lambda omicron -14 +KPX lambda sigma1 -14 +KPX lambda upsilon -32 +KPX lambda omega -14 +KPX lambda upsilondieresis -32 +KPX lambda omicrontonos -14 +KPX lambda upsilontonos -32 +KPX lambda omegatonos -14 +KPX xi alpha -14 +KPX xi delta -14 +KPX xi sigma -14 +KPX xi phi -14 +KPX xi alphatonos -14 +KPX xi zeta -14 +KPX xi xi -14 +KPX xi omicron -14 +KPX xi sigma1 -14 +KPX xi omicrontonos -14 +KPX omicron tau -14 +KPX omicron gamma -18 +KPX omicron chi -29 +KPX omicron pi -14 +KPX rho tau -22 +KPX rho pi -22 +KPX chi alpha -17 +KPX chi delta -17 +KPX chi sigma -17 +KPX chi phi -17 +KPX chi alphatonos -17 +KPX chi zeta -17 +KPX chi omicron -17 +KPX chi sigma1 -17 +KPX chi omega -17 +KPX chi omicrontonos -17 +KPX chi omegatonos -17 +KPX omega tau -22 +KPX omega gamma -18 +KPX omega chi -29 +KPX omega pi -22 +KPX omicrontonos tau -22 +KPX omicrontonos gamma -18 +KPX omicrontonos chi -29 +KPX omicrontonos pi -22 +KPX omegatonos tau -22 +KPX omegatonos gamma -18 +KPX omegatonos chi -29 +KPX omegatonos pi -22 +KPX afii10052 comma -100 +KPX afii10052 period -100 +KPX afii10052 guillemotleft -56 +KPX afii10052 guillemotright -56 +KPX afii10058 quoteright -111 +KPX afii10059 quoteright -89 +KPX afii10017 quoteright -78 +KPX afii10017 afii10021 11 +KPX afii10017 afii10025 -44 +KPX afii10017 afii10032 -56 +KPX afii10017 afii10033 -23 +KPX afii10017 afii10035 -56 +KPX afii10017 afii10036 -100 +KPX afii10017 afii10037 -89 +KPX afii10017 afii10038 -45 +KPX afii10017 afii10041 -89 +KPX afii10017 afii10047 -45 +KPX afii10017 afii10066 -11 +KPX afii10017 afii10070 -11 +KPX afii10017 afii10080 -11 +KPX afii10017 afii10083 -11 +KPX afii10017 afii10085 -11 +KPX afii10017 afii10086 -11 +KPX afii10018 afii10017 -33 +KPX afii10018 afii10021 -22 +KPX afii10018 afii10024 -22 +KPX afii10018 afii10025 -22 +KPX afii10018 afii10029 -33 +KPX afii10018 afii10032 -22 +KPX afii10018 afii10035 -22 +KPX afii10018 afii10036 -67 +KPX afii10018 afii10037 -56 +KPX afii10018 afii10038 -23 +KPX afii10018 afii10039 -33 +KPX afii10018 afii10041 -56 +KPX afii10018 afii10044 -67 +KPX afii10018 afii10047 -11 +KPX afii10018 afii10049 -33 +KPX afii10018 afii10069 11 +KPX afii10018 afii10085 -22 +KPX afii10018 afii10097 11 +KPX afii10019 afii10017 -33 +KPX afii10019 afii10021 -22 +KPX afii10019 afii10024 -33 +KPX afii10019 afii10025 -22 +KPX afii10019 afii10029 -22 +KPX afii10019 afii10032 -22 +KPX afii10019 afii10035 -22 +KPX afii10019 afii10036 -67 +KPX afii10019 afii10037 -56 +KPX afii10019 afii10038 -22 +KPX afii10019 afii10039 -33 +KPX afii10019 afii10041 -34 +KPX afii10019 afii10044 -100 +KPX afii10019 afii10049 -22 +KPX afii10019 afii10085 -11 +KPX afii10019 afii10087 -33 +KPX afii10019 afii10089 -33 +KPX afii10020 comma -100 +KPX afii10020 period -100 +KPX afii10020 colon -22 +KPX afii10020 semicolon -11 +KPX afii10020 guillemotleft -56 +KPX afii10020 guillemotright -56 +KPX afii10020 afii10017 -78 +KPX afii10020 afii10021 -44 +KPX afii10020 afii10025 -11 +KPX afii10020 afii10029 -33 +KPX afii10020 afii10032 -33 +KPX afii10020 afii10035 -33 +KPX afii10020 afii10049 -22 +KPX afii10020 afii10065 -33 +KPX afii10020 afii10067 -45 +KPX afii10020 afii10069 -45 +KPX afii10020 afii10070 -44 +KPX afii10020 afii10074 -44 +KPX afii10020 afii10077 -44 +KPX afii10020 afii10078 -44 +KPX afii10020 afii10079 -44 +KPX afii10020 afii10080 -56 +KPX afii10020 afii10082 -44 +KPX afii10020 afii10085 -44 +KPX afii10020 afii10093 -44 +KPX afii10020 afii10094 -45 +KPX afii10020 afii10096 -45 +KPX afii10020 afii10097 -45 +KPX afii10021 afii10041 -11 +KPX afii10021 afii10047 11 +KPX afii10021 afii10073 22 +KPX afii10021 afii10085 11 +KPX afii10022 afii10025 -11 +KPX afii10024 afii10025 -11 +KPX afii10024 afii10032 -22 +KPX afii10024 afii10035 -22 +KPX afii10024 afii10041 -22 +KPX afii10024 afii10044 11 +KPX afii10024 afii10085 -11 +KPX afii10025 afii10021 -33 +KPX afii10025 afii10024 -33 +KPX afii10025 afii10029 -33 +KPX afii10025 afii10032 -22 +KPX afii10025 afii10035 -22 +KPX afii10025 afii10036 -45 +KPX afii10025 afii10037 -45 +KPX afii10025 afii10038 -22 +KPX afii10025 afii10041 -34 +KPX afii10025 afii10049 -22 +KPX afii10025 afii10077 -11 +KPX afii10028 afii10032 -11 +KPX afii10028 afii10035 -11 +KPX afii10028 afii10038 -23 +KPX afii10028 afii10047 -11 +KPX afii10028 afii10085 -11 +KPX afii10028 afii10095 -11 +KPX afii10029 afii10038 11 +KPX afii10029 afii10066 11 +KPX afii10030 afii10041 -22 +KPX afii10030 afii10065 11 +KPX afii10030 afii10085 11 +KPX afii10030 afii10089 -22 +KPX afii10030 afii10095 11 +KPX afii10032 afii10017 -22 +KPX afii10032 afii10021 -34 +KPX afii10032 afii10024 -33 +KPX afii10032 afii10029 -33 +KPX afii10032 afii10037 -67 +KPX afii10032 afii10039 -33 +KPX afii10032 afii10041 -33 +KPX afii10032 afii10049 -22 +KPX afii10032 afii10077 -11 +KPX afii10032 afii10087 -22 +KPX afii10034 comma -156 +KPX afii10034 period -156 +KPX afii10034 colon -11 +KPX afii10034 semicolon -11 +KPX afii10034 guillemotright -33 +KPX afii10034 afii10017 -78 +KPX afii10034 afii10021 -78 +KPX afii10034 afii10024 -44 +KPX afii10034 afii10025 -22 +KPX afii10034 afii10029 -67 +KPX afii10034 afii10030 -11 +KPX afii10034 afii10036 -56 +KPX afii10034 afii10037 -45 +KPX afii10034 afii10038 -11 +KPX afii10034 afii10039 -45 +KPX afii10034 afii10049 -11 +KPX afii10034 afii10069 -11 +KPX afii10034 afii10070 -11 +KPX afii10034 afii10080 -11 +KPX afii10034 afii10097 -11 +KPX afii10035 afii10017 -33 +KPX afii10035 afii10021 -33 +KPX afii10035 afii10025 -11 +KPX afii10035 afii10029 -33 +KPX afii10035 afii10030 -11 +KPX afii10035 afii10032 -11 +KPX afii10035 afii10036 -33 +KPX afii10035 afii10037 -56 +KPX afii10035 afii10039 -22 +KPX afii10035 afii10041 -44 +KPX afii10035 afii10044 -67 +KPX afii10035 afii10065 11 +KPX afii10035 afii10085 -11 +KPX afii10035 afii10089 -22 +KPX afii10036 comma -89 +KPX afii10036 period -89 +KPX afii10036 colon -11 +KPX afii10036 semicolon -11 +KPX afii10036 afii10017 -33 +KPX afii10036 afii10021 -22 +KPX afii10036 afii10024 11 +KPX afii10036 afii10025 -11 +KPX afii10036 afii10029 -33 +KPX afii10036 afii10030 11 +KPX afii10036 afii10032 -22 +KPX afii10036 afii10038 -33 +KPX afii10036 afii10047 -11 +KPX afii10036 afii10049 11 +KPX afii10036 afii10065 -22 +KPX afii10036 afii10067 -33 +KPX afii10036 afii10070 -33 +KPX afii10036 afii10074 -33 +KPX afii10036 afii10076 -33 +KPX afii10036 afii10077 -33 +KPX afii10036 afii10078 -33 +KPX afii10036 afii10080 -33 +KPX afii10036 afii10081 -33 +KPX afii10036 afii10082 -33 +KPX afii10036 afii10083 -33 +KPX afii10036 afii10085 -33 +KPX afii10036 afii10087 -33 +KPX afii10036 afii10091 -33 +KPX afii10036 afii10093 -33 +KPX afii10036 afii10094 -33 +KPX afii10036 afii10096 -33 +KPX afii10036 afii10097 -33 +KPX afii10037 comma -78 +KPX afii10037 period -78 +KPX afii10037 colon -22 +KPX afii10037 semicolon -22 +KPX afii10037 afii10017 -33 +KPX afii10037 afii10021 -33 +KPX afii10037 afii10025 11 +KPX afii10037 afii10029 -22 +KPX afii10037 afii10038 -11 +KPX afii10037 afii10047 11 +KPX afii10037 afii10049 11 +KPX afii10037 afii10067 -22 +KPX afii10037 afii10068 -22 +KPX afii10037 afii10069 -11 +KPX afii10037 afii10070 -22 +KPX afii10037 afii10072 -11 +KPX afii10037 afii10073 -11 +KPX afii10037 afii10074 -11 +KPX afii10037 afii10076 -11 +KPX afii10037 afii10077 -34 +KPX afii10037 afii10078 -11 +KPX afii10037 afii10079 -11 +KPX afii10037 afii10080 -22 +KPX afii10037 afii10081 -11 +KPX afii10037 afii10082 -11 +KPX afii10037 afii10083 -22 +KPX afii10037 afii10087 -11 +KPX afii10037 afii10088 -11 +KPX afii10037 afii10090 -11 +KPX afii10037 afii10091 -11 +KPX afii10037 afii10096 -11 +KPX afii10037 afii10097 -11 +KPX afii10038 afii10017 -56 +KPX afii10038 afii10021 -67 +KPX afii10038 afii10029 -56 +KPX afii10038 afii10030 -11 +KPX afii10038 afii10036 -78 +KPX afii10038 afii10037 -89 +KPX afii10038 afii10038 11 +KPX afii10038 afii10041 -34 +KPX afii10038 afii10049 -22 +KPX afii10038 afii10077 -22 +KPX afii10039 afii10025 -11 +KPX afii10039 afii10032 -34 +KPX afii10039 afii10035 -34 +KPX afii10039 afii10038 -33 +KPX afii10039 afii10080 -22 +KPX afii10039 afii10085 -22 +KPX afii10040 afii10065 33 +KPX afii10040 afii10070 22 +KPX afii10040 afii10080 22 +KPX afii10043 afii10065 22 +KPX afii10043 afii10070 11 +KPX afii10043 afii10085 11 +KPX afii10044 quoteright -111 +KPX afii10044 afii10049 -33 +KPX afii10046 quoteright -122 +KPX afii10046 afii10017 -44 +KPX afii10046 afii10021 -22 +KPX afii10046 afii10024 -56 +KPX afii10046 afii10025 -33 +KPX afii10046 afii10029 -22 +KPX afii10046 afii10030 -22 +KPX afii10046 afii10032 -45 +KPX afii10046 afii10035 -45 +KPX afii10046 afii10036 -111 +KPX afii10046 afii10039 -56 +KPX afii10046 afii10041 -100 +KPX afii10046 afii10047 -33 +KPX afii10046 afii10049 -45 +KPX afii10047 afii10021 -34 +KPX afii10047 afii10024 -23 +KPX afii10047 afii10029 -45 +KPX afii10047 afii10032 11 +KPX afii10047 afii10038 22 +KPX afii10047 afii10039 -34 +KPX afii10047 afii10049 -22 +KPX afii10047 afii10069 22 +KPX afii10047 afii10072 11 +KPX afii10047 afii10078 11 +KPX afii10047 afii10097 11 +KPX afii10048 afii10017 -44 +KPX afii10048 afii10021 -56 +KPX afii10048 afii10024 -33 +KPX afii10048 afii10029 -56 +KPX afii10048 afii10032 -11 +KPX afii10048 afii10035 -11 +KPX afii10048 afii10036 -67 +KPX afii10048 afii10039 -33 +KPX afii10048 afii10041 -45 +KPX afii10065 afii10073 -22 +KPX afii10065 afii10077 -11 +KPX afii10065 afii10081 -11 +KPX afii10065 afii10085 -33 +KPX afii10065 afii10089 -67 +KPX afii10065 afii10095 -11 +KPX afii10066 afii10069 11 +KPX afii10066 afii10072 -11 +KPX afii10066 afii10077 -22 +KPX afii10066 afii10085 -22 +KPX afii10066 afii10087 -33 +KPX afii10066 afii10089 -33 +KPX afii10066 afii10092 -33 +KPX afii10066 afii10097 -11 +KPX afii10067 afii10065 -22 +KPX afii10067 afii10066 -11 +KPX afii10067 afii10069 -22 +KPX afii10067 afii10070 -22 +KPX afii10067 afii10072 -22 +KPX afii10067 afii10073 -22 +KPX afii10067 afii10077 -33 +KPX afii10067 afii10078 -22 +KPX afii10067 afii10080 -22 +KPX afii10067 afii10083 -22 +KPX afii10067 afii10084 -11 +KPX afii10067 afii10085 -33 +KPX afii10067 afii10086 -22 +KPX afii10067 afii10089 -56 +KPX afii10067 afii10092 -45 +KPX afii10067 afii10097 -22 +KPX afii10068 afii10065 -11 +KPX afii10068 afii10069 -11 +KPX afii10068 afii10070 -11 +KPX afii10068 afii10073 -11 +KPX afii10068 afii10077 -11 +KPX afii10068 afii10078 -11 +KPX afii10068 afii10080 -11 +KPX afii10068 afii10083 -11 +KPX afii10068 afii10097 -22 +KPX afii10069 afii10085 -11 +KPX afii10070 afii10065 -11 +KPX afii10070 afii10069 -11 +KPX afii10070 afii10072 -11 +KPX afii10070 afii10073 -11 +KPX afii10070 afii10077 -33 +KPX afii10070 afii10078 -11 +KPX afii10070 afii10083 -11 +KPX afii10070 afii10084 -11 +KPX afii10070 afii10085 -33 +KPX afii10070 afii10086 -11 +KPX afii10070 afii10087 -44 +KPX afii10070 afii10089 -56 +KPX afii10072 afii10084 11 +KPX afii10072 afii10085 11 +KPX afii10072 afii10089 -22 +KPX afii10072 afii10092 11 +KPX afii10073 afii10065 -11 +KPX afii10073 afii10066 -11 +KPX afii10073 afii10069 -11 +KPX afii10073 afii10070 -11 +KPX afii10073 afii10072 -11 +KPX afii10073 afii10077 -22 +KPX afii10073 afii10078 -11 +KPX afii10073 afii10080 -11 +KPX afii10073 afii10083 -22 +KPX afii10073 afii10085 -33 +KPX afii10073 afii10086 -11 +KPX afii10073 afii10089 -56 +KPX afii10073 afii10092 -33 +KPX afii10076 afii10066 11 +KPX afii10076 afii10083 -11 +KPX afii10076 afii10084 11 +KPX afii10076 afii10089 -22 +KPX afii10077 afii10085 -11 +KPX afii10077 afii10089 -33 +KPX afii10078 afii10073 -11 +KPX afii10078 afii10083 -11 +KPX afii10078 afii10085 -11 +KPX afii10078 afii10086 -11 +KPX afii10078 afii10095 -11 +KPX afii10080 afii10072 -22 +KPX afii10080 afii10073 -11 +KPX afii10080 afii10077 -22 +KPX afii10080 afii10085 -33 +KPX afii10080 afii10087 -22 +KPX afii10080 afii10089 -45 +KPX afii10080 afii10095 -11 +KPX afii10080 afii10097 -22 +KPX afii10082 afii10072 -11 +KPX afii10082 afii10073 -11 +KPX afii10082 afii10077 -22 +KPX afii10082 afii10078 -11 +KPX afii10082 afii10085 -33 +KPX afii10082 afii10087 -33 +KPX afii10082 afii10089 -45 +KPX afii10082 afii10095 -11 +KPX afii10082 afii10097 -11 +KPX afii10083 afii10072 -11 +KPX afii10083 afii10085 -11 +KPX afii10083 afii10087 -22 +KPX afii10083 afii10089 -33 +KPX afii10083 afii10092 -22 +KPX afii10084 comma -11 +KPX afii10084 period -11 +KPX afii10084 afii10065 -11 +KPX afii10084 afii10069 -11 +KPX afii10084 afii10072 -11 +KPX afii10084 afii10073 -11 +KPX afii10084 afii10077 -22 +KPX afii10084 afii10078 -11 +KPX afii10084 afii10080 -11 +KPX afii10084 afii10082 -11 +KPX afii10084 afii10083 -11 +KPX afii10084 afii10085 -22 +KPX afii10084 afii10095 -11 +KPX afii10084 afii10097 -11 +KPX afii10085 comma -67 +KPX afii10085 period -67 +KPX afii10085 afii10066 22 +KPX afii10085 afii10072 11 +KPX afii10085 afii10077 -11 +KPX afii10085 afii10095 11 +KPX afii10086 afii10066 11 +KPX afii10086 afii10070 11 +KPX afii10086 afii10077 -22 +KPX afii10086 afii10080 11 +KPX afii10086 afii10085 -22 +KPX afii10086 afii10089 -45 +KPX afii10087 afii10065 -11 +KPX afii10087 afii10070 -11 +KPX afii10087 afii10073 -11 +KPX afii10087 afii10080 -11 +KPX afii10087 afii10083 -11 +KPX afii10087 afii10086 -22 +KPX afii10087 afii10089 -45 +KPX afii10087 afii10095 -11 +KPX afii10088 afii10065 11 +KPX afii10088 afii10085 11 +KPX afii10091 afii10065 11 +KPX afii10091 afii10085 22 +KPX afii10094 afii10089 -89 +KPX afii10095 afii10072 -11 +KPX afii10095 afii10077 -22 +KPX afii10095 afii10087 -23 +KPX afii10095 afii10097 -11 +KPX afii10096 afii10072 -11 +KPX afii10096 afii10077 -22 +KPX afii10096 afii10087 -33 +KPX afii10096 afii10089 -45 +KPX afii10110 comma -56 +KPX afii10110 period -56 +KPX afii10050 comma -56 +KPX afii10050 period -56 +KPX afii10050 guillemotleft -22 +KPX afii10050 guillemotright -22 +KPX pi alpha -14 +KPX pi delta -14 +KPX pi sigma -14 +KPX pi phi -14 +KPX pi alphatonos -14 +KPX pi zeta -14 +KPX pi omicron -14 +KPX pi sigma1 -14 +KPX pi omega -14 +KPX pi omegatonos -14 +EndKernPairs +EndKernData +EndFontMetrics diff --git a/gulliver/thirdparty/html2ps_pdf/fonts/ariali.ttf b/thirdparty/html2ps_pdf/fonts/ariali.ttf similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/fonts/ariali.ttf rename to thirdparty/html2ps_pdf/fonts/ariali.ttf diff --git a/gulliver/thirdparty/html2ps_pdf/fonts/cour.afm b/thirdparty/html2ps_pdf/fonts/cour.afm similarity index 97% rename from gulliver/thirdparty/html2ps_pdf/fonts/cour.afm rename to thirdparty/html2ps_pdf/fonts/cour.afm index e358a5e17..69f153f1f 100644 --- a/gulliver/thirdparty/html2ps_pdf/fonts/cour.afm +++ b/thirdparty/html2ps_pdf/fonts/cour.afm @@ -1,1372 +1,1372 @@ -StartFontMetrics 4.1 -FontName CourierNewPSMT -FullName Courier New -Notice Typeface The Monotype Corporation plc. Data The Monotype Corporation plc/Type Solutions Inc. 1990-1994. All Rights Reserved -EncodingScheme FontSpecific -FamilyName Courier New -Weight Regular -Version Version 2.90 -Characters 1318 -ItalicAngle 0.0 -Ascender 833 -Descender -300 -UnderlineThickness 41 -UnderlinePosition -233 -IsFixedPitch true -FontBBox -20 -680 638 1021 -StartCharMetrics 1353 -C 0 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 1 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 2 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 3 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 4 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 5 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 6 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 7 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 8 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 9 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 10 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 11 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 12 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 13 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 14 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 15 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 16 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 17 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 18 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 19 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 20 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 21 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 22 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 23 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 24 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 25 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 26 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 27 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 28 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 29 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 30 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 31 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 32 ; WX 600 ; N space ; B 240 -15 360 627 ; -C 33 ; WX 600 ; N exclam ; B 240 -15 360 627 ; -C 34 ; WX 600 ; N quotedbl ; B 130 332 469 603 ; -C 35 ; WX 600 ; N numbersign ; B 91 -63 508 657 ; -C 36 ; WX 600 ; N dollar ; B 111 -93 488 665 ; -C 37 ; WX 600 ; N percent ; B 91 -12 510 623 ; -C 38 ; WX 600 ; N ampersand ; B 124 -16 499 526 ; -C 39 ; WX 600 ; N quotesingle ; B 235 320 365 613 ; -C 40 ; WX 600 ; N parenleft ; B 295 -127 460 613 ; -C 41 ; WX 600 ; N parenright ; B 147 -127 312 613 ; -C 42 ; WX 600 ; N asterisk ; B 0 253 375 613 ; -C 43 ; WX 600 ; N plus ; B 70 33 530 538 ; -C 44 ; WX 600 ; N comma ; B 146 -146 352 147 ; -C 45 ; WX 600 ; N hyphen ; B 91 253 509 312 ; -C 46 ; WX 600 ; N period ; B 225 -15 375 118 ; -C 47 ; WX 600 ; N slash ; B 112 -83 489 678 ; -C 48 ; WX 600 ; N zero ; B 112 -15 488 627 ; -C 49 ; WX 600 ; N one ; B 111 0 488 621 ; -C 50 ; WX 600 ; N two ; B 83 0 480 627 ; -C 51 ; WX 600 ; N three ; B 95 -15 500 627 ; -C 52 ; WX 600 ; N four ; B 104 0 480 613 ; -C 53 ; WX 600 ; N five ; B 96 -15 500 613 ; -C 54 ; WX 600 ; N six ; B 134 -15 513 627 ; -C 55 ; WX 600 ; N seven ; B 103 -1 479 613 ; -C 56 ; WX 600 ; N eight ; B 113 -15 488 627 ; -C 57 ; WX 600 ; N nine ; B 134 -15 511 627 ; -C 58 ; WX 600 ; N colon ; B 225 -15 375 423 ; -C 59 ; WX 600 ; N semicolon ; B 152 -104 375 423 ; -C 60 ; WX 600 ; N less ; B 0 32 480 538 ; -C 61 ; WX 600 ; N equal ; B 49 192 551 381 ; -C 62 ; WX 600 ; N greater ; B 0 32 480 538 ; -C 63 ; WX 600 ; N question ; B 0 -15 355 586 ; -C 64 ; WX 600 ; N at ; B 105 -63 480 633 ; -C 65 ; WX 600 ; N A ; B 8 0 593 571 ; -C 66 ; WX 600 ; N B ; B 42 0 543 571 ; -C 67 ; WX 600 ; N C ; B 62 -16 537 584 ; -C 68 ; WX 600 ; N D ; B 77 0 558 571 ; -C 69 ; WX 600 ; N E ; B 43 0 523 571 ; -C 70 ; WX 600 ; N F ; B 78 0 557 571 ; -C 71 ; WX 600 ; N G ; B 63 -16 565 584 ; -C 72 ; WX 600 ; N H ; B 52 0 554 571 ; -C 73 ; WX 600 ; N I ; B 112 0 489 571 ; -C 74 ; WX 600 ; N J ; B 83 -16 585 571 ; -C 75 ; WX 600 ; N K ; B 43 0 575 571 ; -C 76 ; WX 600 ; N L ; B 63 0 543 571 ; -C 77 ; WX 600 ; N M ; B 12 0 594 571 ; -C 78 ; WX 600 ; N N ; B 22 0 563 571 ; -C 79 ; WX 600 ; N O ; B 0 -16 500 584 ; -C 80 ; WX 600 ; N P ; B 87 0 544 571 ; -C 81 ; WX 600 ; N Q ; B 51 -117 551 584 ; -C 82 ; WX 600 ; N R ; B 43 0 593 571 ; -C 83 ; WX 600 ; N S ; B 90 -16 510 584 ; -C 84 ; WX 600 ; N T ; B 70 0 529 571 ; -C 85 ; WX 600 ; N U ; B 41 -16 561 571 ; -C 86 ; WX 600 ; N V ; B 8 0 593 571 ; -C 87 ; WX 600 ; N W ; B 18 0 580 571 ; -C 88 ; WX 600 ; N X ; B 39 0 563 571 ; -C 89 ; WX 600 ; N Y ; B 48 0 551 571 ; -C 90 ; WX 600 ; N Z ; B 104 0 499 571 ; -C 91 ; WX 600 ; N bracketleft ; B 0 -126 168 613 ; -C 92 ; WX 600 ; N backslash ; B 0 -85 377 675 ; -C 93 ; WX 600 ; N bracketright ; B 0 -126 168 613 ; -C 94 ; WX 600 ; N asciicircum ; B 111 359 489 625 ; -C 95 ; WX 600 ; N underscore ; B 38 -274 638 -233 ; -C 96 ; WX 600 ; N grave ; B 217 499 384 649 ; -C 97 ; WX 600 ; N a ; B 70 -16 542 438 ; -C 98 ; WX 600 ; N b ; B 22 -16 542 613 ; -C 99 ; WX 600 ; N c ; B 83 -16 537 438 ; -C 100 ; WX 600 ; N d ; B 62 -16 583 613 ; -C 101 ; WX 600 ; N e ; B 63 -16 523 438 ; -C 102 ; WX 600 ; N f ; B 105 0 544 613 ; -C 103 ; WX 600 ; N g ; B 61 -188 562 438 ; -C 104 ; WX 600 ; N h ; B 42 0 553 613 ; -C 105 ; WX 600 ; N i ; B 92 0 511 633 ; -C 106 ; WX 600 ; N j ; B 88 -188 402 633 ; -C 107 ; WX 600 ; N k ; B 93 0 572 613 ; -C 108 ; WX 600 ; N l ; B 91 0 510 613 ; -C 109 ; WX 600 ; N m ; B 10 0 593 438 ; -C 110 ; WX 600 ; N n ; B 53 0 542 438 ; -C 111 ; WX 600 ; N o ; B 71 -16 529 438 ; -C 112 ; WX 600 ; N p ; B 22 -188 542 438 ; -C 113 ; WX 600 ; N q ; B 63 -188 583 438 ; -C 114 ; WX 600 ; N r ; B 83 0 544 433 ; -C 115 ; WX 600 ; N s ; B 101 -16 499 438 ; -C 116 ; WX 600 ; N t ; B 71 -16 529 571 ; -C 117 ; WX 600 ; N u ; B 44 -16 543 423 ; -C 118 ; WX 600 ; N v ; B 29 0 571 423 ; -C 119 ; WX 600 ; N w ; B 27 0 572 423 ; -C 120 ; WX 600 ; N x ; B 49 0 552 423 ; -C 121 ; WX 600 ; N y ; B 73 -188 574 423 ; -C 122 ; WX 600 ; N z ; B 116 0 491 423 ; -C 123 ; WX 600 ; N braceleft ; B 0 -126 206 613 ; -C 124 ; WX 600 ; N bar ; B 279 -126 321 613 ; -C 125 ; WX 600 ; N braceright ; B 0 -127 206 613 ; -C 126 ; WX 600 ; N asciitilde ; B 91 211 509 359 ; -C 127 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 128 ; WX 600 ; N Euro ; B 3 -16 539 584 ; -C 129 ; WX 600 ; N afii10052 ; B 62 0 542 778 ; -C 130 ; WX 600 ; N quotesinglbase ; B 0 -159 206 135 ; -C 131 ; WX 600 ; N florin ; B 86 -94 519 628 ; -C 132 ; WX 600 ; N quotedblbase ; B 0 -127 405 125 ; -C 133 ; WX 600 ; N ellipsis ; B 49 -15 551 85 ; -C 134 ; WX 600 ; N dagger ; B 123 -63 478 613 ; -C 135 ; WX 600 ; N daggerdbl ; B 123 -63 478 613 ; -C 136 ; WX 600 ; N circumflex ; B 154 498 446 640 ; -C 137 ; WX 600 ; N perthousand ; B 30 -10 567 625 ; -C 138 ; WX 600 ; N Scaron ; B 90 -16 510 760 ; -C 139 ; WX 600 ; N guilsinglleft ; B 52 0 313 424 ; -C 140 ; WX 600 ; N OE ; B 8 0 592 571 ; -C 141 ; WX 600 ; N afii10061 ; B 58 0 587 778 ; -C 142 ; WX 600 ; N Zcaron ; B 104 0 499 760 ; -C 143 ; WX 600 ; N afii10145 ; B 49 -140 551 571 ; -C 144 ; WX 600 ; N quotedblbase ; B 0 -127 405 125 ; -C 145 ; WX 600 ; N quoteleft ; B 249 319 455 613 ; -C 146 ; WX 600 ; N quoteright ; B 0 319 206 613 ; -C 147 ; WX 600 ; N quotedblleft ; B 87 360 493 613 ; -C 148 ; WX 600 ; N quotedblright ; B 107 360 512 613 ; -C 149 ; WX 600 ; N bullet ; B 179 190 421 432 ; -C 150 ; WX 600 ; N endash ; B 71 265 529 306 ; -C 151 ; WX 600 ; N emdash ; B -7 266 607 307 ; -C 152 ; WX 600 ; N tilde ; B 145 489 456 589 ; -C 153 ; WX 600 ; N trademark ; B 2 297 598 571 ; -C 154 ; WX 600 ; N scaron ; B 101 -16 499 634 ; -C 155 ; WX 600 ; N guilsinglright ; B 291 0 552 424 ; -C 156 ; WX 600 ; N oe ; B 9 -16 583 438 ; -C 157 ; WX 600 ; N afii10109 ; B 59 0 572 649 ; -C 158 ; WX 600 ; N zcaron ; B 116 0 491 634 ; -C 159 ; WX 600 ; N Ydieresis ; B 48 0 551 730 ; -C 160 ; WX 600 ; N space ; B 240 -15 360 627 ; -C 161 ; WX 600 ; N exclamdown ; B 240 -190 360 429 ; -C 162 ; WX 600 ; N cent ; B 111 0 471 652 ; -C 163 ; WX 600 ; N sterling ; B 61 0 523 587 ; -C 164 ; WX 600 ; N currency ; B 101 97 499 496 ; -C 165 ; WX 600 ; N yen ; B 48 0 551 571 ; -C 166 ; WX 600 ; N brokenbar ; B 279 -126 321 613 ; -C 167 ; WX 600 ; N section ; B 70 -63 530 613 ; -C 168 ; WX 600 ; N dieresis ; B 156 521 445 600 ; -C 169 ; WX 600 ; N copyright ; B 0 -13 597 584 ; -C 170 ; WX 600 ; N ordfeminine ; B 0 355 319 640 ; -C 171 ; WX 600 ; N guillemotleft ; B 0 0 490 424 ; -C 172 ; WX 600 ; N logicalnot ; B 12 33 530 306 ; -C 173 ; WX 600 ; N hyphen ; B 91 253 509 312 ; -C 174 ; WX 600 ; N registered ; B 0 -13 597 584 ; -C 175 ; WX 600 ; N overscore ; B -13 654 613 696 ; -C 176 ; WX 600 ; N degree ; B 165 457 436 728 ; -C 177 ; WX 600 ; N plusminus ; B 70 0 530 603 ; -C 178 ; WX 600 ; N twosuperior ; B 167 301 412 627 ; -C 179 ; WX 600 ; N threesuperior ; B 173 293 424 627 ; -C 180 ; WX 600 ; N acute ; B 216 499 383 649 ; -C 181 ; WX 600 ; N mu1 ; B 44 -188 543 423 ; -C 182 ; WX 600 ; N paragraph ; B 83 -63 521 613 ; -C 183 ; WX 600 ; N periodcentered ; B 225 245 375 377 ; -C 184 ; WX 600 ; N cedilla ; B 216 -163 373 15 ; -C 185 ; WX 600 ; N onesuperior ; B 183 301 417 626 ; -C 186 ; WX 600 ; N ordmasculine ; B 144 355 454 640 ; -C 187 ; WX 600 ; N guillemotright ; B 62 0 552 424 ; -C 188 ; WX 600 ; N onequarter ; B 0 0 595 626 ; -C 189 ; WX 600 ; N onehalf ; B 0 0 606 626 ; -C 190 ; WX 600 ; N threequarters ; B 0 0 592 627 ; -C 191 ; WX 600 ; N questiondown ; B 0 -191 355 433 ; -C 192 ; WX 600 ; N Agrave ; B 8 0 593 779 ; -C 193 ; WX 600 ; N Aacute ; B 8 0 593 779 ; -C 194 ; WX 600 ; N Acircumflex ; B 8 0 593 771 ; -C 195 ; WX 600 ; N Atilde ; B 8 0 593 720 ; -C 196 ; WX 600 ; N Adieresis ; B 8 0 593 730 ; -C 197 ; WX 600 ; N Aring ; B 8 0 593 783 ; -C 198 ; WX 600 ; N AE ; B 9 0 592 571 ; -C 199 ; WX 600 ; N Ccedilla ; B 62 -163 537 584 ; -C 200 ; WX 600 ; N Egrave ; B 43 0 523 779 ; -C 201 ; WX 600 ; N Eacute ; B 43 0 523 779 ; -C 202 ; WX 600 ; N Ecircumflex ; B 43 0 523 770 ; -C 203 ; WX 600 ; N Edieresis ; B 43 0 523 730 ; -C 204 ; WX 600 ; N Igrave ; B 112 0 489 779 ; -C 205 ; WX 600 ; N Iacute ; B 112 0 489 779 ; -C 206 ; WX 600 ; N Icircumflex ; B 112 0 489 770 ; -C 207 ; WX 600 ; N Idieresis ; B 112 0 489 730 ; -C 208 ; WX 600 ; N Eth ; B -1 0 523 571 ; -C 209 ; WX 600 ; N Ntilde ; B 22 0 563 720 ; -C 210 ; WX 600 ; N Ograve ; B 0 -16 500 779 ; -C 211 ; WX 600 ; N Oacute ; B 0 -16 500 779 ; -C 212 ; WX 600 ; N Ocircumflex ; B 0 -16 500 770 ; -C 213 ; WX 600 ; N Otilde ; B 0 -16 500 720 ; -C 214 ; WX 600 ; N Odieresis ; B 0 -16 500 730 ; -C 215 ; WX 600 ; N multiply ; B 132 117 469 454 ; -C 216 ; WX 600 ; N Oslash ; B 39 -41 561 611 ; -C 217 ; WX 600 ; N Ugrave ; B 41 -16 561 779 ; -C 218 ; WX 600 ; N Uacute ; B 41 -16 561 779 ; -C 219 ; WX 600 ; N Ucircumflex ; B 41 -16 561 770 ; -C 220 ; WX 600 ; N Udieresis ; B 41 -16 561 730 ; -C 221 ; WX 600 ; N Yacute ; B 48 0 551 775 ; -C 222 ; WX 600 ; N Thorn ; B 87 0 544 571 ; -C 223 ; WX 600 ; N germandbls ; B 43 -16 503 613 ; -C 224 ; WX 600 ; N agrave ; B 70 -16 542 648 ; -C 225 ; WX 600 ; N aacute ; B 70 -16 542 648 ; -C 226 ; WX 600 ; N acircumflex ; B 70 -16 542 640 ; -C 227 ; WX 600 ; N atilde ; B 70 -16 542 589 ; -C 228 ; WX 600 ; N adieresis ; B 70 -16 542 600 ; -C 229 ; WX 600 ; N aring ; B 70 -16 542 666 ; -C 230 ; WX 600 ; N ae ; B 8 -16 582 438 ; -C 231 ; WX 600 ; N ccedilla ; B 83 -163 537 438 ; -C 232 ; WX 600 ; N egrave ; B 63 -16 523 649 ; -C 233 ; WX 600 ; N eacute ; B 63 -16 523 649 ; -C 234 ; WX 600 ; N ecircumflex ; B 63 -16 523 640 ; -C 235 ; WX 600 ; N edieresis ; B 63 -16 523 600 ; -C 236 ; WX 600 ; N igrave ; B 91 0 511 645 ; -C 237 ; WX 600 ; N iacute ; B 91 0 511 648 ; -C 238 ; WX 600 ; N icircumflex ; B 91 0 511 640 ; -C 239 ; WX 600 ; N idieresis ; B 91 0 511 600 ; -C 240 ; WX 600 ; N eth ; B 63 -15 522 610 ; -C 241 ; WX 600 ; N ntilde ; B 53 0 542 589 ; -C 242 ; WX 600 ; N ograve ; B 71 -16 529 649 ; -C 243 ; WX 600 ; N oacute ; B 71 -16 529 649 ; -C 244 ; WX 600 ; N ocircumflex ; B 71 -16 529 640 ; -C 245 ; WX 600 ; N otilde ; B 71 -16 529 589 ; -C 246 ; WX 600 ; N odieresis ; B 71 -16 529 600 ; -C 247 ; WX 600 ; N divide ; B 70 54 530 517 ; -C 248 ; WX 600 ; N oslash ; B 55 -42 548 462 ; -C 249 ; WX 600 ; N ugrave ; B 44 -16 543 649 ; -C 250 ; WX 600 ; N uacute ; B 44 -16 543 649 ; -C 251 ; WX 600 ; N ucircumflex ; B 44 -16 543 640 ; -C 252 ; WX 600 ; N udieresis ; B 44 -16 543 600 ; -C 253 ; WX 600 ; N yacute ; B 73 -188 574 649 ; -C 254 ; WX 600 ; N thorn ; B 22 -188 542 613 ; -C 255 ; WX 600 ; N ydieresis ; B 73 -188 574 600 ; -C -1 ; WX 0 ; N .null ; B 240 -15 360 627 ; -C -1 ; WX 600 ; N nonmarkingreturn ; B 240 -15 360 627 ; -C -1 ; WX 600 ; N notequal ; B 49 -35 551 607 ; -C -1 ; WX 600 ; N infinity ; B 53 194 547 413 ; -C -1 ; WX 600 ; N lessequal ; B 48 88 528 685 ; -C -1 ; WX 600 ; N greaterequal ; B 72 88 552 685 ; -C -1 ; WX 600 ; N partialdiff ; B 86 -15 488 613 ; -C -1 ; WX 600 ; N summation ; B 21 -188 538 613 ; -C -1 ; WX 600 ; N product ; B 26 -188 574 613 ; -C -1 ; WX 600 ; N pi1 ; B 82 0 518 423 ; -C -1 ; WX 600 ; N integral ; B 110 -128 490 573 ; -C -1 ; WX 600 ; N Ohm ; B 30 0 570 581 ; -C -1 ; WX 600 ; N radical ; B 67 -38 554 783 ; -C -1 ; WX 600 ; N approxequal ; B 91 128 509 441 ; -C -1 ; WX 600 ; N increment ; B 41 0 555 563 ; -C -1 ; WX 600 ; N lozenge ; B 76 0 525 694 ; -C -1 ; WX 600 ; N fraction ; B 50 141 550 478 ; -C -1 ; WX 600 ; N fi ; B 7 0 590 633 ; -C -1 ; WX 600 ; N fl ; B 9 0 595 613 ; -C -1 ; WX 600 ; N dotlessi ; B 91 0 511 423 ; -C -1 ; WX 600 ; N macron ; B 154 525 446 567 ; -C -1 ; WX 600 ; N breve ; B 153 497 447 634 ; -C -1 ; WX 600 ; N dotaccent ; B 250 510 350 610 ; -C -1 ; WX 600 ; N ring ; B 211 492 388 666 ; -C -1 ; WX 600 ; N hungarumlaut ; B 154 498 447 648 ; -C -1 ; WX 600 ; N ogonek ; B 229 -144 373 13 ; -C -1 ; WX 600 ; N caron ; B 154 492 446 634 ; -C -1 ; WX 600 ; N Lslash ; B 42 0 542 571 ; -C -1 ; WX 600 ; N lslash ; B 91 0 510 613 ; -C -1 ; WX 600 ; N minus ; B 70 265 530 306 ; -C -1 ; WX 600 ; N franc ; B 78 0 557 571 ; -C -1 ; WX 600 ; N Gbreve ; B 63 -16 565 763 ; -C -1 ; WX 600 ; N gbreve ; B 61 -188 562 634 ; -C -1 ; WX 600 ; N Idot ; B 112 0 489 739 ; -C -1 ; WX 600 ; N Scedilla ; B 90 -163 510 584 ; -C -1 ; WX 600 ; N scedilla ; B 101 -163 499 438 ; -C -1 ; WX 600 ; N Cacute ; B 62 -16 537 778 ; -C -1 ; WX 600 ; N cacute ; B 83 -16 537 649 ; -C -1 ; WX 600 ; N Ccaron ; B 62 -16 537 763 ; -C -1 ; WX 600 ; N ccaron ; B 83 -16 537 634 ; -C -1 ; WX 600 ; N dmacron ; B 62 -16 583 613 ; -C -1 ; WX 600 ; N middot ; B 346 284 446 384 ; -C -1 ; WX 600 ; N Abreve ; B 8 0 593 763 ; -C -1 ; WX 600 ; N abreve ; B 70 -16 542 634 ; -C -1 ; WX 600 ; N Aogonek ; B 8 -127 623 571 ; -C -1 ; WX 600 ; N aogonek ; B 70 -127 584 438 ; -C -1 ; WX 600 ; N Dcaron ; B 77 0 558 763 ; -C -1 ; WX 600 ; N dcaron ; B 62 -16 600 613 ; -C -1 ; WX 600 ; N Dslash ; B -1 0 523 571 ; -C -1 ; WX 600 ; N Eogonek ; B 43 -130 569 571 ; -C -1 ; WX 600 ; N eogonek ; B 63 -142 523 438 ; -C -1 ; WX 600 ; N Ecaron ; B 43 0 523 763 ; -C -1 ; WX 600 ; N ecaron ; B 63 -16 523 634 ; -C -1 ; WX 600 ; N Lacute ; B 63 0 543 778 ; -C -1 ; WX 600 ; N lacute ; B 91 0 510 799 ; -C -1 ; WX 600 ; N Lcaron ; B 63 0 543 571 ; -C -1 ; WX 600 ; N lcaron ; B 91 0 510 613 ; -C -1 ; WX 600 ; N Ldot ; B 63 0 543 571 ; -C -1 ; WX 600 ; N ldot ; B 91 0 510 613 ; -C -1 ; WX 600 ; N Nacute ; B 22 0 563 778 ; -C -1 ; WX 600 ; N nacute ; B 53 0 542 649 ; -C -1 ; WX 600 ; N Ncaron ; B 22 0 563 763 ; -C -1 ; WX 600 ; N ncaron ; B 53 0 542 634 ; -C -1 ; WX 600 ; N Odblacute ; B 0 -16 500 777 ; -C -1 ; WX 600 ; N odblacute ; B 71 -16 529 648 ; -C -1 ; WX 600 ; N Racute ; B 43 0 593 778 ; -C -1 ; WX 600 ; N racute ; B 83 0 544 649 ; -C -1 ; WX 600 ; N Rcaron ; B 43 0 593 763 ; -C -1 ; WX 600 ; N rcaron ; B 83 0 544 634 ; -C -1 ; WX 600 ; N Sacute ; B 90 -16 510 778 ; -C -1 ; WX 600 ; N sacute ; B 101 -16 499 649 ; -C -1 ; WX 600 ; N Tcedilla ; B 70 -215 529 571 ; -C -1 ; WX 600 ; N tcedilla ; B 71 -215 529 571 ; -C -1 ; WX 600 ; N Tcaron ; B 70 0 529 763 ; -C -1 ; WX 600 ; N tcaron ; B 71 -16 529 613 ; -C -1 ; WX 600 ; N Uring ; B 41 -16 561 795 ; -C -1 ; WX 600 ; N uring ; B 44 -16 543 666 ; -C -1 ; WX 600 ; N Udblacute ; B 41 -16 561 777 ; -C -1 ; WX 600 ; N udblacute ; B 44 -16 543 648 ; -C -1 ; WX 600 ; N Zacute ; B 104 0 499 778 ; -C -1 ; WX 600 ; N zacute ; B 116 0 491 649 ; -C -1 ; WX 600 ; N Zdot ; B 104 0 499 739 ; -C -1 ; WX 600 ; N zdot ; B 116 0 491 610 ; -C -1 ; WX 600 ; N Gamma ; B 62 0 542 571 ; -C -1 ; WX 600 ; N Theta ; B 50 -16 550 584 ; -C -1 ; WX 600 ; N Phi ; B 44 0 556 571 ; -C -1 ; WX 600 ; N alpha ; B 48 -16 555 438 ; -C -1 ; WX 600 ; N delta ; B 88 -16 514 613 ; -C -1 ; WX 600 ; N epsilon ; B 138 -16 478 438 ; -C -1 ; WX 600 ; N sigma ; B 74 -16 586 438 ; -C -1 ; WX 600 ; N tau ; B 102 -16 454 423 ; -C -1 ; WX 600 ; N phi ; B 60 -188 543 438 ; -C -1 ; WX 600 ; N underscoredbl ; B -13 -274 613 -145 ; -C -1 ; WX 600 ; N exclamdbl ; B 134 -15 467 627 ; -C -1 ; WX 600 ; N nsuperior ; B 138 245 448 522 ; -C -1 ; WX 600 ; N peseta ; B 7 -7 593 571 ; -C -1 ; WX 600 ; N arrowleft ; B 1 50 599 277 ; -C -1 ; WX 600 ; N arrowup ; B 186 -136 414 424 ; -C -1 ; WX 600 ; N arrowright ; B 1 50 599 277 ; -C -1 ; WX 600 ; N arrowdown ; B 186 -136 414 424 ; -C -1 ; WX 600 ; N arrowboth ; B 1 50 599 278 ; -C -1 ; WX 600 ; N arrowupdn ; B 186 -135 414 463 ; -C -1 ; WX 600 ; N arrowupdnbse ; B 186 -196 414 463 ; -C -1 ; WX 600 ; N orthogonal ; B 1 0 599 597 ; -C -1 ; WX 600 ; N intersection ; B 83 -16 518 584 ; -C -1 ; WX 600 ; N equivalence ; B 49 119 551 455 ; -C -1 ; WX 600 ; N house ; B 75 0 525 563 ; -C -1 ; WX 600 ; N revlogicalnot ; B 70 33 588 306 ; -C -1 ; WX 600 ; N integraltp ; B 264 -300 475 833 ; -C -1 ; WX 600 ; N integralbt ; B 125 -300 336 833 ; -C -1 ; WX 600 ; N SF100000 ; B 0 220 600 292 ; -C -1 ; WX 600 ; N SF110000 ; B 264 -300 336 833 ; -C -1 ; WX 600 ; N SF010000 ; B 264 -300 600 292 ; -C -1 ; WX 600 ; N SF030000 ; B 0 -300 336 292 ; -C -1 ; WX 600 ; N SF020000 ; B 264 220 600 833 ; -C -1 ; WX 600 ; N SF040000 ; B 0 220 336 833 ; -C -1 ; WX 600 ; N SF080000 ; B 264 -300 600 833 ; -C -1 ; WX 600 ; N SF090000 ; B 0 -300 336 833 ; -C -1 ; WX 600 ; N SF060000 ; B 0 -300 600 292 ; -C -1 ; WX 600 ; N SF070000 ; B 0 220 600 833 ; -C -1 ; WX 600 ; N SF050000 ; B 0 -300 600 833 ; -C -1 ; WX 600 ; N SF430000 ; B 0 142 600 370 ; -C -1 ; WX 600 ; N SF240000 ; B 186 -300 414 833 ; -C -1 ; WX 600 ; N SF510000 ; B 264 -300 600 370 ; -C -1 ; WX 600 ; N SF520000 ; B 186 -300 600 292 ; -C -1 ; WX 600 ; N SF390000 ; B 186 -300 600 370 ; -C -1 ; WX 600 ; N SF220000 ; B 0 -300 336 370 ; -C -1 ; WX 600 ; N SF210000 ; B 0 -300 414 292 ; -C -1 ; WX 600 ; N SF250000 ; B 0 -300 414 370 ; -C -1 ; WX 600 ; N SF500000 ; B 264 142 600 833 ; -C -1 ; WX 600 ; N SF490000 ; B 186 220 600 833 ; -C -1 ; WX 600 ; N SF380000 ; B 186 142 600 833 ; -C -1 ; WX 600 ; N SF280000 ; B 0 142 336 833 ; -C -1 ; WX 600 ; N SF270000 ; B 0 220 414 833 ; -C -1 ; WX 600 ; N SF260000 ; B 0 142 414 833 ; -C -1 ; WX 600 ; N SF360000 ; B 264 -300 600 833 ; -C -1 ; WX 600 ; N SF370000 ; B 186 -300 600 833 ; -C -1 ; WX 600 ; N SF420000 ; B 186 -300 600 833 ; -C -1 ; WX 600 ; N SF190000 ; B 0 -300 336 833 ; -C -1 ; WX 600 ; N SF200000 ; B 0 -300 414 833 ; -C -1 ; WX 600 ; N SF230000 ; B 0 -300 414 833 ; -C -1 ; WX 600 ; N SF470000 ; B 0 -300 600 370 ; -C -1 ; WX 600 ; N SF480000 ; B 0 -300 600 292 ; -C -1 ; WX 600 ; N SF410000 ; B 0 -300 600 370 ; -C -1 ; WX 600 ; N SF450000 ; B 0 142 600 833 ; -C -1 ; WX 600 ; N SF460000 ; B 0 220 600 833 ; -C -1 ; WX 600 ; N SF400000 ; B 0 142 600 833 ; -C -1 ; WX 600 ; N SF540000 ; B 0 -300 600 833 ; -C -1 ; WX 600 ; N SF530000 ; B 0 -300 600 833 ; -C -1 ; WX 600 ; N SF440000 ; B 0 -300 600 833 ; -C -1 ; WX 600 ; N upblock ; B 0 255 600 833 ; -C -1 ; WX 600 ; N dnblock ; B 0 -300 600 255 ; -C -1 ; WX 600 ; N block ; B 0 -300 600 833 ; -C -1 ; WX 600 ; N lfblock ; B 0 -300 300 833 ; -C -1 ; WX 600 ; N rtblock ; B 300 -300 600 833 ; -C -1 ; WX 600 ; N ltshade ; B 0 -300 600 833 ; -C -1 ; WX 600 ; N shade ; B 0 -300 600 833 ; -C -1 ; WX 600 ; N dkshade ; B 0 -300 600 833 ; -C -1 ; WX 600 ; N filledbox ; B 1 0 599 598 ; -C -1 ; WX 600 ; N filledrect ; B 1 193 599 306 ; -C -1 ; WX 600 ; N triagup ; B 7 0 592 585 ; -C -1 ; WX 600 ; N triagrt ; B 1 -13 599 584 ; -C -1 ; WX 600 ; N triagdn ; B 7 -13 592 572 ; -C -1 ; WX 600 ; N triaglf ; B 1 -13 599 584 ; -C -1 ; WX 600 ; N circle ; B 85 67 515 497 ; -C -1 ; WX 600 ; N invbullet ; B 61 0 539 479 ; -C -1 ; WX 600 ; N invcircle ; B 19 0 583 564 ; -C -1 ; WX 600 ; N smileface ; B 1 -13 599 584 ; -C -1 ; WX 600 ; N invsmileface ; B 1 -13 599 584 ; -C -1 ; WX 600 ; N sun ; B 1 -69 599 529 ; -C -1 ; WX 600 ; N female ; B 157 39 444 563 ; -C -1 ; WX 600 ; N male ; B 90 122 511 563 ; -C -1 ; WX 600 ; N spade ; B 63 0 537 601 ; -C -1 ; WX 600 ; N club ; B 1 0 599 597 ; -C -1 ; WX 600 ; N heart ; B 53 -11 547 559 ; -C -1 ; WX 600 ; N diamond ; B 78 -12 523 597 ; -C -1 ; WX 600 ; N musicalnote ; B 132 14 440 563 ; -C -1 ; WX 600 ; N musicalnotedbl ; B 44 -21 528 566 ; -C -1 ; WX 600 ; N IJ ; B 4 -16 596 571 ; -C -1 ; WX 600 ; N ij ; B 9 -188 498 633 ; -C -1 ; WX 600 ; N napostrophe ; B 0 0 542 613 ; -C -1 ; WX 600 ; N minute ; B 250 320 401 613 ; -C -1 ; WX 600 ; N second ; B 143 320 503 613 ; -C -1 ; WX 600 ; N afii61248 ; B 91 -12 510 623 ; -C -1 ; WX 600 ; N afii61289 ; B 157 -16 387 584 ; -C -1 ; WX 600 ; N H22073 ; B 1 0 599 598 ; -C -1 ; WX 600 ; N H18543 ; B 176 187 424 435 ; -C -1 ; WX 600 ; N H18551 ; B 176 187 424 435 ; -C -1 ; WX 600 ; N H18533 ; B 85 67 515 497 ; -C -1 ; WX 600 ; N openbullet ; B 179 190 421 432 ; -C -1 ; WX 600 ; N Amacron ; B 8 0 593 696 ; -C -1 ; WX 600 ; N amacron ; B 70 -16 542 567 ; -C -1 ; WX 600 ; N Ccircumflex ; B 62 -16 537 769 ; -C -1 ; WX 600 ; N ccircumflex ; B 83 -16 537 640 ; -C -1 ; WX 600 ; N Cdot ; B 62 -16 537 739 ; -C -1 ; WX 600 ; N cdot ; B 83 -16 537 610 ; -C -1 ; WX 600 ; N Emacron ; B 43 0 523 696 ; -C -1 ; WX 600 ; N emacron ; B 63 -16 523 567 ; -C -1 ; WX 600 ; N Ebreve ; B 43 0 523 763 ; -C -1 ; WX 600 ; N ebreve ; B 63 -16 523 634 ; -C -1 ; WX 600 ; N Edot ; B 43 0 523 739 ; -C -1 ; WX 600 ; N edot ; B 63 -16 523 610 ; -C -1 ; WX 600 ; N Gcircumflex ; B 63 -16 565 769 ; -C -1 ; WX 600 ; N gcircumflex ; B 61 -188 562 640 ; -C -1 ; WX 600 ; N Gdot ; B 63 -16 565 739 ; -C -1 ; WX 600 ; N gdot ; B 61 -188 562 610 ; -C -1 ; WX 600 ; N Gcedilla ; B 63 -163 565 584 ; -C -1 ; WX 600 ; N gcedilla ; B 61 -188 562 661 ; -C -1 ; WX 600 ; N Hcircumflex ; B 52 0 554 769 ; -C -1 ; WX 600 ; N hcircumflex ; B 42 0 553 769 ; -C -1 ; WX 600 ; N Hbar ; B 52 0 554 571 ; -C -1 ; WX 600 ; N hbar ; B 30 0 554 613 ; -C -1 ; WX 600 ; N Itilde ; B 112 0 489 719 ; -C -1 ; WX 600 ; N itilde ; B 91 0 512 589 ; -C -1 ; WX 600 ; N Imacron ; B 112 0 489 696 ; -C -1 ; WX 600 ; N imacron ; B 91 0 512 567 ; -C -1 ; WX 600 ; N Ibreve ; B 112 0 489 763 ; -C -1 ; WX 600 ; N ibreve ; B 91 0 512 634 ; -C -1 ; WX 600 ; N Iogonek ; B 112 -142 489 571 ; -C -1 ; WX 600 ; N iogonek ; B 92 -142 511 633 ; -C -1 ; WX 600 ; N Jcircumflex ; B 83 -16 585 769 ; -C -1 ; WX 600 ; N jcircumflex ; B 88 -188 432 640 ; -C -1 ; WX 600 ; N Kcedilla ; B 43 -163 575 571 ; -C -1 ; WX 600 ; N kcedilla ; B 93 -163 572 613 ; -C -1 ; WX 600 ; N kgreenlandic ; B 71 0 528 423 ; -C -1 ; WX 600 ; N Lcedilla ; B 63 -163 543 571 ; -C -1 ; WX 600 ; N lcedilla ; B 91 -163 510 613 ; -C -1 ; WX 600 ; N Ncedilla ; B 22 -163 563 571 ; -C -1 ; WX 600 ; N ncedilla ; B 53 -163 542 438 ; -C -1 ; WX 600 ; N Eng ; B 63 -16 541 585 ; -C -1 ; WX 600 ; N eng ; B 53 -188 480 438 ; -C -1 ; WX 600 ; N Omacron ; B 0 -16 500 696 ; -C -1 ; WX 600 ; N omacron ; B 71 -16 529 567 ; -C -1 ; WX 600 ; N Obreve ; B 0 -16 500 763 ; -C -1 ; WX 600 ; N obreve ; B 71 -16 529 634 ; -C -1 ; WX 600 ; N Rcedilla ; B 43 -163 593 571 ; -C -1 ; WX 600 ; N rcedilla ; B 83 -163 544 433 ; -C -1 ; WX 600 ; N Scircumflex ; B 90 -16 510 769 ; -C -1 ; WX 600 ; N scircumflex ; B 101 -16 499 640 ; -C -1 ; WX 600 ; N Tbar ; B 70 0 529 571 ; -C -1 ; WX 600 ; N tbar ; B 60 -16 529 571 ; -C -1 ; WX 600 ; N Utilde ; B 41 -16 561 733 ; -C -1 ; WX 600 ; N utilde ; B 44 -16 543 589 ; -C -1 ; WX 600 ; N Umacron ; B 41 -16 561 696 ; -C -1 ; WX 600 ; N umacron ; B 44 -16 543 567 ; -C -1 ; WX 600 ; N Ubreve ; B 41 -16 561 763 ; -C -1 ; WX 600 ; N ubreve ; B 44 -16 543 634 ; -C -1 ; WX 600 ; N Uogonek ; B 41 -142 561 571 ; -C -1 ; WX 600 ; N uogonek ; B 44 -142 577 423 ; -C -1 ; WX 600 ; N Wcircumflex ; B 18 0 580 769 ; -C -1 ; WX 600 ; N wcircumflex ; B 27 0 572 640 ; -C -1 ; WX 600 ; N Ycircumflex ; B 48 0 551 769 ; -C -1 ; WX 600 ; N ycircumflex ; B 73 -188 574 640 ; -C -1 ; WX 600 ; N longs ; B 105 0 544 613 ; -C -1 ; WX 600 ; N Aringacute ; B 8 0 593 951 ; -C -1 ; WX 600 ; N aringacute ; B 70 -16 542 834 ; -C -1 ; WX 600 ; N AEacute ; B 9 0 592 778 ; -C -1 ; WX 600 ; N aeacute ; B 8 -16 582 649 ; -C -1 ; WX 600 ; N Oslashacute ; B 39 -41 561 778 ; -C -1 ; WX 600 ; N oslashacute ; B 55 -42 548 649 ; -C -1 ; WX 600 ; N anoteleia ; B 225 245 375 377 ; -C -1 ; WX 600 ; N Wgrave ; B 18 0 580 778 ; -C -1 ; WX 600 ; N wgrave ; B 27 0 572 649 ; -C -1 ; WX 600 ; N Wacute ; B 18 0 580 778 ; -C -1 ; WX 600 ; N wacute ; B 27 0 572 649 ; -C -1 ; WX 600 ; N Wdieresis ; B 18 0 580 729 ; -C -1 ; WX 600 ; N wdieresis ; B 27 0 572 600 ; -C -1 ; WX 600 ; N Ygrave ; B 48 0 551 778 ; -C -1 ; WX 600 ; N ygrave ; B 73 -188 574 649 ; -C -1 ; WX 600 ; N quotereversed ; B 249 319 455 613 ; -C -1 ; WX 600 ; N radicalex ; B 154 525 446 567 ; -C -1 ; WX 600 ; N afii08941 ; B 66 0 522 587 ; -C -1 ; WX 600 ; N estimated ; B 44 -17 561 535 ; -C -1 ; WX 600 ; N oneeighth ; B 6 -7 593 626 ; -C -1 ; WX 600 ; N threeeighths ; B 8 -7 592 627 ; -C -1 ; WX 600 ; N fiveeighths ; B 5 -7 592 620 ; -C -1 ; WX 600 ; N seveneighths ; B 13 -7 592 620 ; -C -1 ; WX 600 ; N commaaccent ; B 254 -215 346 -53 ; -C -1 ; WX 600 ; N undercommaaccent ; B 229 -163 373 -49 ; -C -1 ; WX 600 ; N tonos ; B 216 499 383 649 ; -C -1 ; WX 600 ; N dieresistonos ; B 129 499 471 649 ; -C -1 ; WX 600 ; N Alphatonos ; B 31 0 617 571 ; -C -1 ; WX 600 ; N Epsilontonos ; B -2 0 565 571 ; -C -1 ; WX 600 ; N Etatonos ; B 9 0 586 571 ; -C -1 ; WX 600 ; N Iotatonos ; B 32 0 513 571 ; -C -1 ; WX 600 ; N Omicrontonos ; B -5 -16 566 584 ; -C -1 ; WX 600 ; N Upsilontonos ; B 21 0 575 571 ; -C -1 ; WX 600 ; N Omegatonos ; B -21 0 587 584 ; -C -1 ; WX 600 ; N iotadieresistonos ; B 118 -16 460 649 ; -C -1 ; WX 600 ; N Alpha ; B 8 0 593 571 ; -C -1 ; WX 600 ; N Beta ; B 42 0 543 571 ; -C -1 ; WX 600 ; N Delta ; B 49 0 550 571 ; -C -1 ; WX 600 ; N Epsilon ; B 43 0 523 571 ; -C -1 ; WX 600 ; N Zeta ; B 104 0 499 571 ; -C -1 ; WX 600 ; N Eta ; B 52 0 554 571 ; -C -1 ; WX 600 ; N Iota ; B 112 0 489 571 ; -C -1 ; WX 600 ; N Kappa ; B 43 0 575 571 ; -C -1 ; WX 600 ; N Lambda ; B 7 0 592 571 ; -C -1 ; WX 600 ; N Mu ; B 12 0 594 571 ; -C -1 ; WX 600 ; N Nu ; B 22 0 563 571 ; -C -1 ; WX 600 ; N Xi ; B 72 0 528 571 ; -C -1 ; WX 600 ; N Omicron ; B 0 -16 500 584 ; -C -1 ; WX 600 ; N Pi ; B 49 0 551 571 ; -C -1 ; WX 600 ; N Rho ; B 87 0 544 571 ; -C -1 ; WX 600 ; N Sigma ; B 96 0 489 571 ; -C -1 ; WX 600 ; N Tau ; B 70 0 529 571 ; -C -1 ; WX 600 ; N Upsilon ; B 48 0 551 571 ; -C -1 ; WX 600 ; N Chi ; B 39 0 563 571 ; -C -1 ; WX 600 ; N Psi ; B 14 0 586 571 ; -C -1 ; WX 600 ; N Omega ; B 29 0 570 584 ; -C -1 ; WX 600 ; N Iotadieresis ; B 112 0 489 729 ; -C -1 ; WX 600 ; N Upsilondieresis ; B 48 0 551 729 ; -C -1 ; WX 600 ; N alphatonos ; B 48 -16 555 649 ; -C -1 ; WX 600 ; N epsilontonos ; B 138 -16 478 649 ; -C -1 ; WX 600 ; N etatonos ; B 68 -188 496 649 ; -C -1 ; WX 600 ; N iotatonos ; B 216 -16 429 649 ; -C -1 ; WX 600 ; N upsilondieresistonos ; B 42 -16 558 649 ; -C -1 ; WX 600 ; N beta ; B 127 -188 507 613 ; -C -1 ; WX 600 ; N gamma ; B 34 -188 594 423 ; -C -1 ; WX 600 ; N zeta ; B 167 -188 492 613 ; -C -1 ; WX 600 ; N eta ; B 68 -188 496 438 ; -C -1 ; WX 600 ; N theta ; B 87 -16 513 613 ; -C -1 ; WX 600 ; N iota ; B 257 -16 429 438 ; -C -1 ; WX 600 ; N kappa ; B 77 0 551 423 ; -C -1 ; WX 600 ; N lambda ; B 32 0 585 613 ; -C -1 ; WX 600 ; N mu ; B 41 -188 557 423 ; -C -1 ; WX 600 ; N nu ; B 36 0 499 438 ; -C -1 ; WX 600 ; N xi ; B 159 -188 491 613 ; -C -1 ; WX 600 ; N omicron ; B 71 -16 529 438 ; -C -1 ; WX 600 ; N rho ; B 99 -188 542 438 ; -C -1 ; WX 600 ; N sigma1 ; B 101 -188 536 438 ; -C -1 ; WX 600 ; N upsilon ; B 42 -16 558 423 ; -C -1 ; WX 600 ; N chi ; B 75 -188 550 438 ; -C -1 ; WX 600 ; N psi ; B 34 -188 566 613 ; -C -1 ; WX 600 ; N omega ; B 57 -16 543 438 ; -C -1 ; WX 600 ; N iotadieresis ; B 145 -16 434 579 ; -C -1 ; WX 600 ; N upsilondieresis ; B 42 -16 558 579 ; -C -1 ; WX 600 ; N omicrontonos ; B 71 -16 529 649 ; -C -1 ; WX 600 ; N upsilontonos ; B 42 -16 558 649 ; -C -1 ; WX 600 ; N omegatonos ; B 57 -16 543 649 ; -C -1 ; WX 600 ; N afii10023 ; B 43 0 523 730 ; -C -1 ; WX 600 ; N afii10051 ; B 8 -16 569 571 ; -C -1 ; WX 600 ; N afii10053 ; B 62 -16 537 584 ; -C -1 ; WX 600 ; N afii10054 ; B 90 -16 510 584 ; -C -1 ; WX 600 ; N afii10055 ; B 112 0 489 571 ; -C -1 ; WX 600 ; N afii10056 ; B 112 0 489 730 ; -C -1 ; WX 600 ; N afii10057 ; B 83 -16 585 571 ; -C -1 ; WX 600 ; N afii10058 ; B 17 -16 580 571 ; -C -1 ; WX 600 ; N afii10059 ; B 0 0 600 571 ; -C -1 ; WX 600 ; N afii10060 ; B 8 0 588 571 ; -C -1 ; WX 600 ; N afii10062 ; B 21 -17 591 763 ; -C -1 ; WX 600 ; N afii10017 ; B 8 0 593 571 ; -C -1 ; WX 600 ; N afii10018 ; B 42 0 543 571 ; -C -1 ; WX 600 ; N afii10019 ; B 42 0 543 571 ; -C -1 ; WX 600 ; N afii10020 ; B 62 0 542 571 ; -C -1 ; WX 600 ; N afii10021 ; B 36 -140 563 571 ; -C -1 ; WX 600 ; N afii10022 ; B 43 0 523 571 ; -C -1 ; WX 600 ; N afii10024 ; B -2 0 603 571 ; -C -1 ; WX 600 ; N afii10025 ; B 56 -16 534 584 ; -C -1 ; WX 600 ; N afii10026 ; B 20 0 581 571 ; -C -1 ; WX 600 ; N afii10027 ; B 20 0 581 763 ; -C -1 ; WX 600 ; N afii10028 ; B 58 0 587 572 ; -C -1 ; WX 600 ; N afii10029 ; B 17 -16 564 571 ; -C -1 ; WX 600 ; N afii10030 ; B 12 0 594 571 ; -C -1 ; WX 600 ; N afii10031 ; B 52 0 554 571 ; -C -1 ; WX 600 ; N afii10032 ; B 0 -16 500 584 ; -C -1 ; WX 600 ; N afii10033 ; B 49 0 551 571 ; -C -1 ; WX 600 ; N afii10034 ; B 87 0 544 571 ; -C -1 ; WX 600 ; N afii10035 ; B 62 -16 537 584 ; -C -1 ; WX 600 ; N afii10036 ; B 70 0 529 571 ; -C -1 ; WX 600 ; N afii10037 ; B 21 -17 591 571 ; -C -1 ; WX 600 ; N afii10038 ; B 48 0 552 572 ; -C -1 ; WX 600 ; N afii10039 ; B 39 0 563 571 ; -C -1 ; WX 600 ; N afii10040 ; B 43 -140 559 571 ; -C -1 ; WX 600 ; N afii10041 ; B 20 0 547 571 ; -C -1 ; WX 600 ; N afii10042 ; B 2 0 593 571 ; -C -1 ; WX 600 ; N afii10043 ; B 2 -140 605 571 ; -C -1 ; WX 600 ; N afii10044 ; B 1 0 584 571 ; -C -1 ; WX 600 ; N afii10045 ; B 1 0 597 571 ; -C -1 ; WX 600 ; N afii10046 ; B 42 0 543 571 ; -C -1 ; WX 600 ; N afii10047 ; B 63 -16 538 584 ; -C -1 ; WX 600 ; N afii10048 ; B 11 -16 594 584 ; -C -1 ; WX 600 ; N afii10049 ; B 7 0 557 571 ; -C -1 ; WX 600 ; N afii10065 ; B 70 -16 542 438 ; -C -1 ; WX 600 ; N afii10066 ; B 63 -16 543 601 ; -C -1 ; WX 600 ; N afii10067 ; B 60 0 520 423 ; -C -1 ; WX 600 ; N afii10068 ; B 74 0 531 423 ; -C -1 ; WX 600 ; N afii10069 ; B 44 -103 556 423 ; -C -1 ; WX 600 ; N afii10070 ; B 63 -16 523 438 ; -C -1 ; WX 600 ; N afii10072 ; B 10 0 590 423 ; -C -1 ; WX 600 ; N afii10073 ; B 70 -16 534 438 ; -C -1 ; WX 600 ; N afii10074 ; B 28 0 572 423 ; -C -1 ; WX 600 ; N afii10075 ; B 28 0 572 614 ; -C -1 ; WX 600 ; N afii10076 ; B 59 0 572 423 ; -C -1 ; WX 600 ; N afii10077 ; B 25 -16 556 423 ; -C -1 ; WX 600 ; N afii10078 ; B 15 0 585 423 ; -C -1 ; WX 600 ; N afii10079 ; B 52 0 548 423 ; -C -1 ; WX 600 ; N afii10080 ; B 71 -16 529 438 ; -C -1 ; WX 600 ; N afii10081 ; B 52 0 548 423 ; -C -1 ; WX 600 ; N afii10082 ; B 22 -188 542 438 ; -C -1 ; WX 600 ; N afii10083 ; B 83 -16 537 438 ; -C -1 ; WX 600 ; N afii10084 ; B 81 0 519 423 ; -C -1 ; WX 600 ; N afii10085 ; B 29 -149 583 423 ; -C -1 ; WX 600 ; N afii10086 ; B 58 -156 542 601 ; -C -1 ; WX 600 ; N afii10087 ; B 49 0 552 423 ; -C -1 ; WX 600 ; N afii10088 ; B 38 -103 556 423 ; -C -1 ; WX 600 ; N afii10089 ; B 34 0 546 423 ; -C -1 ; WX 600 ; N afii10090 ; B 16 0 584 423 ; -C -1 ; WX 600 ; N afii10091 ; B 16 -103 600 423 ; -C -1 ; WX 600 ; N afii10092 ; B 37 0 568 423 ; -C -1 ; WX 600 ; N afii10093 ; B 12 0 597 423 ; -C -1 ; WX 600 ; N afii10094 ; B 81 0 485 423 ; -C -1 ; WX 600 ; N afii10095 ; B 63 -16 517 438 ; -C -1 ; WX 600 ; N afii10096 ; B 18 -16 582 438 ; -C -1 ; WX 600 ; N afii10097 ; B 64 0 531 423 ; -C -1 ; WX 600 ; N afii10071 ; B 63 -16 523 600 ; -C -1 ; WX 600 ; N afii10099 ; B 69 -188 519 613 ; -C -1 ; WX 600 ; N afii10100 ; B 74 0 531 649 ; -C -1 ; WX 600 ; N afii10101 ; B 83 -16 537 438 ; -C -1 ; WX 600 ; N afii10102 ; B 101 -16 499 438 ; -C -1 ; WX 600 ; N afii10103 ; B 92 0 511 633 ; -C -1 ; WX 600 ; N afii10104 ; B 91 0 511 600 ; -C -1 ; WX 600 ; N afii10105 ; B 88 -188 402 633 ; -C -1 ; WX 600 ; N afii10106 ; B 25 -16 572 423 ; -C -1 ; WX 600 ; N afii10107 ; B -9 0 609 423 ; -C -1 ; WX 600 ; N afii10108 ; B 30 0 554 613 ; -C -1 ; WX 600 ; N afii10110 ; B 29 -149 583 614 ; -C -1 ; WX 600 ; N afii10193 ; B 52 -140 548 423 ; -C -1 ; WX 600 ; N afii10050 ; B 62 0 542 703 ; -C -1 ; WX 600 ; N afii10098 ; B 74 0 531 554 ; -C -1 ; WX 600 ; N afii00208 ; B 21 266 580 307 ; -C -1 ; WX 600 ; N afii61352 ; B 24 0 572 571 ; -C -1 ; WX 600 ; N pi ; B 51 0 549 423 ; -C -1 ; WX 600 ; N sheva ; B 268 -261 333 -82 ; -C -1 ; WX 600 ; N hatafsegol ; B 161 -261 438 -82 ; -C -1 ; WX 600 ; N hatafpatah ; B 161 -261 431 -82 ; -C -1 ; WX 600 ; N hatafqamats ; B 161 -261 431 -82 ; -C -1 ; WX 600 ; N hiriq ; B 268 -147 333 -83 ; -C -1 ; WX 600 ; N tsere ; B 214 -147 386 -82 ; -C -1 ; WX 600 ; N segol ; B 214 -261 386 -83 ; -C -1 ; WX 600 ; N patah ; B 199 -130 400 -83 ; -C -1 ; WX 600 ; N qamats ; B 199 -215 400 -83 ; -C -1 ; WX 600 ; N holam ; B 268 559 333 628 ; -C -1 ; WX 600 ; N qubuts ; B 162 -261 438 -82 ; -C -1 ; WX 600 ; N dagesh ; B 268 222 333 290 ; -C -1 ; WX 600 ; N meteg ; B 276 -261 324 -82 ; -C -1 ; WX 600 ; N maqaf ; B 88 437 512 478 ; -C -1 ; WX 600 ; N rafe ; B 199 560 400 607 ; -C -1 ; WX 600 ; N paseq ; B 279 -5 320 484 ; -C -1 ; WX 600 ; N shindot ; B 443 560 510 625 ; -C -1 ; WX 600 ; N sindot ; B 90 560 155 627 ; -C -1 ; WX 600 ; N sofpasuq ; B 225 -6 375 486 ; -C -1 ; WX 600 ; N alef ; B 102 -6 502 492 ; -C -1 ; WX 600 ; N bet ; B 77 0 522 478 ; -C -1 ; WX 600 ; N gimel ; B 135 -5 446 478 ; -C -1 ; WX 600 ; N dalet ; B 80 -5 522 478 ; -C -1 ; WX 600 ; N he ; B 78 -5 499 478 ; -C -1 ; WX 600 ; N vav ; B 183 -5 338 478 ; -C -1 ; WX 600 ; N zayin ; B 161 -5 445 478 ; -C -1 ; WX 600 ; N het ; B 71 -5 529 478 ; -C -1 ; WX 600 ; N tet ; B 51 -5 499 483 ; -C -1 ; WX 600 ; N yod ; B 181 263 343 478 ; -C -1 ; WX 600 ; N finalkaf ; B 73 -109 519 478 ; -C -1 ; WX 600 ; N kaf ; B 88 0 496 478 ; -C -1 ; WX 600 ; N lamed ; B 94 0 463 629 ; -C -1 ; WX 600 ; N finalmem ; B 53 0 486 478 ; -C -1 ; WX 600 ; N mem ; B 65 -5 491 483 ; -C -1 ; WX 600 ; N finalnun ; B 183 -109 438 478 ; -C -1 ; WX 600 ; N nun ; B 139 0 374 478 ; -C -1 ; WX 600 ; N samekh ; B 39 -5 486 478 ; -C -1 ; WX 600 ; N ayin ; B 94 0 480 478 ; -C -1 ; WX 600 ; N finalpe ; B 118 -109 540 478 ; -C -1 ; WX 600 ; N pe ; B 122 0 468 478 ; -C -1 ; WX 600 ; N finaltsadi ; B 108 -109 474 478 ; -C -1 ; WX 600 ; N tsadi ; B 79 0 466 478 ; -C -1 ; WX 600 ; N qof ; B 96 -204 497 478 ; -C -1 ; WX 600 ; N resh ; B 84 -5 465 478 ; -C -1 ; WX 600 ; N shin ; B 100 0 500 483 ; -C -1 ; WX 600 ; N tav ; B 78 -5 486 478 ; -C -1 ; WX 600 ; N doublevav ; B 60 -5 479 478 ; -C -1 ; WX 600 ; N vavyod ; B 65 -5 479 478 ; -C -1 ; WX 600 ; N doubleyod ; B 65 263 479 478 ; -C -1 ; WX 600 ; N geresh ; B 218 246 382 483 ; -C -1 ; WX 600 ; N gershayim ; B 121 246 479 483 ; -C -1 ; WX 600 ; N newsheqelsign ; B 44 -5 556 481 ; -C -1 ; WX 600 ; N vavshindot ; B 113 -5 338 630 ; -C -1 ; WX 600 ; N finalkafsheva ; B 73 -109 519 478 ; -C -1 ; WX 600 ; N finalkafqamats ; B 73 -109 519 478 ; -C -1 ; WX 600 ; N lamedholam ; B 0 0 463 629 ; -C -1 ; WX 600 ; N lamedholamdagesh ; B 0 0 463 629 ; -C -1 ; WX 600 ; N altayin ; B 94 0 480 478 ; -C -1 ; WX 600 ; N shinshindot ; B 100 0 503 628 ; -C -1 ; WX 600 ; N shinsindot ; B 90 0 500 628 ; -C -1 ; WX 600 ; N shindageshshindot ; B 100 0 503 628 ; -C -1 ; WX 600 ; N shindageshsindot ; B 90 0 500 628 ; -C -1 ; WX 600 ; N alefpatah ; B 102 -130 502 492 ; -C -1 ; WX 600 ; N alefqamats ; B 102 -215 502 492 ; -C -1 ; WX 600 ; N alefmapiq ; B 102 -6 502 492 ; -C -1 ; WX 600 ; N betdagesh ; B 77 0 522 478 ; -C -1 ; WX 600 ; N gimeldagesh ; B 135 -5 446 478 ; -C -1 ; WX 600 ; N daletdagesh ; B 80 -5 522 478 ; -C -1 ; WX 600 ; N hedagesh ; B 78 -5 499 478 ; -C -1 ; WX 600 ; N vavdagesh ; B 174 -5 338 478 ; -C -1 ; WX 600 ; N zayindagesh ; B 152 -5 445 478 ; -C -1 ; WX 600 ; N tetdagesh ; B 51 -5 499 483 ; -C -1 ; WX 600 ; N yoddagesh ; B 181 263 343 478 ; -C -1 ; WX 600 ; N finalkafdagesh ; B 73 -109 519 478 ; -C -1 ; WX 600 ; N kafdagesh ; B 88 0 496 478 ; -C -1 ; WX 600 ; N lameddagesh ; B 94 0 463 629 ; -C -1 ; WX 600 ; N memdagesh ; B 65 -5 491 483 ; -C -1 ; WX 600 ; N nundagesh ; B 139 0 374 478 ; -C -1 ; WX 600 ; N samekhdagesh ; B 39 -5 486 478 ; -C -1 ; WX 600 ; N finalpedagesh ; B 118 -109 540 478 ; -C -1 ; WX 600 ; N pedagesh ; B 122 0 468 478 ; -C -1 ; WX 600 ; N tsadidagesh ; B 79 0 466 478 ; -C -1 ; WX 600 ; N qofdagesh ; B 96 -204 497 478 ; -C -1 ; WX 600 ; N reshdagesh ; B 84 -5 465 478 ; -C -1 ; WX 600 ; N shindagesh ; B 100 0 500 483 ; -C -1 ; WX 600 ; N tavdages ; B 78 -5 486 478 ; -C -1 ; WX 600 ; N vavholam ; B 183 -5 342 628 ; -C -1 ; WX 600 ; N betrafe ; B 77 0 522 607 ; -C -1 ; WX 600 ; N kafrafe ; B 88 0 496 607 ; -C -1 ; WX 600 ; N perafe ; B 122 0 468 607 ; -C -1 ; WX 600 ; N aleflamed ; B 84 -6 502 629 ; -C -1 ; WX 600 ; N zerowidthnonjoiner ; B 283 -134 318 629 ; -C -1 ; WX 600 ; N zerowidthjoiner ; B 193 -134 407 690 ; -C -1 ; WX 600 ; N lefttorightmark ; B 172 -134 458 690 ; -C -1 ; WX 600 ; N righttoleftmark ; B 143 -134 429 690 ; -C -1 ; WX 600 ; N afii57388 ; B 222 -6 377 243 ; -C -1 ; WX 600 ; N afii57403 ; B 222 0 377 512 ; -C -1 ; WX 600 ; N afii57407 ; B 123 -18 478 583 ; -C -1 ; WX 600 ; N afii57409 ; B 250 66 470 331 ; -C -1 ; WX 600 ; N afii57440 ; B 0 0 600 60 ; -C -1 ; WX 600 ; N afii57451 ; B 232 615 367 771 ; -C -1 ; WX 600 ; N afii57452 ; B 199 616 378 823 ; -C -1 ; WX 600 ; N afii57453 ; B 232 -241 367 -85 ; -C -1 ; WX 600 ; N afii57454 ; B 232 615 367 693 ; -C -1 ; WX 600 ; N afii57455 ; B 205 615 368 821 ; -C -1 ; WX 600 ; N afii57456 ; B 232 -165 367 -86 ; -C -1 ; WX 600 ; N afii57457 ; B 224 628 366 767 ; -C -1 ; WX 600 ; N afii57458 ; B 232 638 354 780 ; -C -1 ; WX 600 ; N afii57392 ; B 231 189 369 393 ; -C -1 ; WX 600 ; N afii57393 ; B 174 -2 365 565 ; -C -1 ; WX 600 ; N afii57394 ; B 156 -2 421 567 ; -C -1 ; WX 600 ; N afii57395 ; B 119 -2 485 567 ; -C -1 ; WX 600 ; N afii57396 ; B 187 0 431 564 ; -C -1 ; WX 600 ; N afii57397 ; B 166 58 430 411 ; -C -1 ; WX 600 ; N afii57398 ; B 152 0 430 564 ; -C -1 ; WX 600 ; N afii57399 ; B 129 -3 471 568 ; -C -1 ; WX 600 ; N afii57400 ; B 128 -2 471 569 ; -C -1 ; WX 600 ; N afii57401 ; B 144 -3 429 567 ; -C -1 ; WX 600 ; N afii57381 ; B 73 -82 527 678 ; -C -1 ; WX 600 ; N afii57461 ; B 222 -124 377 125 ; -C -1 ; WX 600 ; N afii63167 ; B 112 1 487 360 ; -C -1 ; WX 600 ; N afii57459 ; B 286 653 318 881 ; -C -1 ; WX 600 ; N afii57543 ; B 227 601 361 783 ; -C -1 ; WX 600 ; N afii57534 ; B 244 -4 454 333 ; -C -1 ; WX 600 ; N afii57494 ; B 131 641 435 724 ; -C -1 ; WX 600 ; N afii62843 ; B 144 0 472 553 ; -C -1 ; WX 600 ; N afii62844 ; B 133 0 455 567 ; -C -1 ; WX 600 ; N afii62845 ; B 159 0 450 569 ; -C -1 ; WX 600 ; N afii64240 ; B 0 -200 572 581 ; -C -1 ; WX 600 ; N afii64241 ; B 0 -274 582 333 ; -C -1 ; WX 600 ; N afii63954 ; B 0 -207 580 533 ; -C -1 ; WX 600 ; N afii57382 ; B 0 -142 600 488 ; -C -1 ; WX 600 ; N afii64242 ; B 0 -43 600 462 ; -C -1 ; WX 600 ; N afii62881 ; B 224 628 366 898 ; -C -1 ; WX 600 ; N afii57504 ; B 251 -274 385 -92 ; -C -1 ; WX 600 ; N afii57369 ; B 250 -346 397 -92 ; -C -1 ; WX 600 ; N afii57370 ; B 251 -424 394 -92 ; -C -1 ; WX 600 ; N afii57371 ; B 204 601 360 882 ; -C -1 ; WX 600 ; N afii57372 ; B 205 601 361 960 ; -C -1 ; WX 600 ; N afii57373 ; B 208 601 360 954 ; -C -1 ; WX 600 ; N afii57374 ; B 178 601 359 1021 ; -C -1 ; WX 600 ; N afii57375 ; B 165 601 360 1014 ; -C -1 ; WX 600 ; N afii57391 ; B 0 0 600 60 ; -C -1 ; WX 600 ; N afii57471 ; B 201 622 396 787 ; -C -1 ; WX 600 ; N afii57460 ; B 173 29 368 763 ; -C -1 ; WX 600 ; N afii52258 ; B 172 0 600 763 ; -C -1 ; WX 600 ; N afii57506 ; B 18 -274 578 333 ; -C -1 ; WX 600 ; N afii62958 ; B 18 -274 600 328 ; -C -1 ; WX 600 ; N afii62956 ; B 0 -274 582 333 ; -C -1 ; WX 600 ; N afii52957 ; B 0 -274 600 329 ; -C -1 ; WX 600 ; N afii57505 ; B 5 -3 590 683 ; -C -1 ; WX 600 ; N afii62889 ; B 3 -33 600 608 ; -C -1 ; WX 600 ; N afii62887 ; B 0 0 589 672 ; -C -1 ; WX 600 ; N afii62888 ; B 0 0 600 632 ; -C -1 ; WX 600 ; N afii57507 ; B 133 -274 591 263 ; -C -1 ; WX 600 ; N afii62961 ; B 77 -274 601 323 ; -C -1 ; WX 600 ; N afii62959 ; B 0 -274 585 319 ; -C -1 ; WX 600 ; N afii62960 ; B 0 -274 600 323 ; -C -1 ; WX 600 ; N afii57508 ; B 70 -205 468 613 ; -C -1 ; WX 600 ; N afii62962 ; B 49 -206 600 598 ; -C -1 ; WX 600 ; N afii57567 ; B 1 -6 600 563 ; -C -1 ; WX 600 ; N afii62964 ; B 1 -6 600 564 ; -C -1 ; WX 600 ; N afii52305 ; B 0 0 600 566 ; -C -1 ; WX 600 ; N afii52306 ; B 0 0 600 566 ; -C -1 ; WX 600 ; N afii57509 ; B 5 -5 600 605 ; -C -1 ; WX 600 ; N afii62967 ; B 5 -4 600 613 ; -C -1 ; WX 600 ; N afii62965 ; B 0 0 600 609 ; -C -1 ; WX 600 ; N afii62966 ; B 0 0 600 611 ; -C -1 ; WX 600 ; N afii57555 ; B 83 -119 523 325 ; -C -1 ; WX 600 ; N afii52364 ; B 55 -274 600 60 ; -C -1 ; WX 600 ; N afii63753 ; B 117 -274 537 332 ; -C -1 ; WX 600 ; N afii63754 ; B 74 -274 526 308 ; -C -1 ; WX 600 ; N afii63759 ; B 117 -274 587 567 ; -C -1 ; WX 600 ; N afii63763 ; B 117 -274 583 623 ; -C -1 ; WX 600 ; N afii63795 ; B 77 -151 523 524 ; -C -1 ; WX 600 ; N afii62891 ; B 77 -274 523 524 ; -C -1 ; WX 600 ; N afii63808 ; B 93 -274 555 574 ; -C -1 ; WX 600 ; N afii62938 ; B 93 -274 555 574 ; -C -1 ; WX 600 ; N afii63810 ; B 93 -274 555 574 ; -C -1 ; WX 600 ; N afii62942 ; B 156 -274 454 582 ; -C -1 ; WX 600 ; N afii62947 ; B 70 -151 517 528 ; -C -1 ; WX 600 ; N afii63813 ; B 70 -274 517 528 ; -C -1 ; WX 600 ; N afii63823 ; B 117 -274 537 562 ; -C -1 ; WX 600 ; N afii63824 ; B 74 -151 521 489 ; -C -1 ; WX 600 ; N afii63833 ; B 117 -274 563 332 ; -C -1 ; WX 600 ; N afii63844 ; B 74 -274 543 308 ; -C -1 ; WX 600 ; N afii62882 ; B 189 627 368 951 ; -C -1 ; WX 600 ; N afii62883 ; B 229 612 371 910 ; -C -1 ; WX 600 ; N afii62884 ; B 222 626 364 821 ; -C -1 ; WX 600 ; N afii62885 ; B 207 626 370 951 ; -C -1 ; WX 600 ; N afii62886 ; B 224 612 366 831 ; -C -1 ; WX 600 ; N afii63846 ; B 0 -208 600 306 ; -C -1 ; WX 600 ; N afii63849 ; B 14 -196 600 445 ; -C -1 ; WX 600 ; N afii63850 ; B 21 -274 600 166 ; -C -1 ; WX 600 ; N afii63851 ; B 21 -274 600 166 ; -C -1 ; WX 600 ; N afii63852 ; B 0 -208 600 530 ; -C -1 ; WX 600 ; N afii63855 ; B 14 -187 600 520 ; -C -1 ; WX 600 ; N afii63856 ; B 21 -274 600 356 ; -C -1 ; WX 600 ; N afii63761 ; B 21 -274 600 357 ; -C -1 ; WX 600 ; N afii63882 ; B 21 -274 600 356 ; -C -1 ; WX 600 ; N afii63825 ; B 21 -274 600 357 ; -C -1 ; WX 600 ; N afii63885 ; B 0 -211 600 306 ; -C -1 ; WX 600 ; N afii63888 ; B 14 -255 600 484 ; -C -1 ; WX 600 ; N afii63896 ; B 0 -218 584 472 ; -C -1 ; WX 600 ; N afii63897 ; B 0 -125 584 472 ; -C -1 ; WX 600 ; N afii63898 ; B 0 -120 584 486 ; -C -1 ; WX 600 ; N afii63899 ; B 0 -206 541 406 ; -C -1 ; WX 600 ; N afii63900 ; B 0 -234 580 333 ; -C -1 ; WX 600 ; N afii63901 ; B 0 -208 584 668 ; -C -1 ; WX 600 ; N afii63902 ; B 0 0 584 668 ; -C -1 ; WX 600 ; N afii63903 ; B 0 0 584 668 ; -C -1 ; WX 600 ; N afii63904 ; B 0 0 551 585 ; -C -1 ; WX 600 ; N afii63905 ; B 0 -207 595 539 ; -C -1 ; WX 600 ; N afii63906 ; B 0 0 550 684 ; -C -1 ; WX 600 ; N afii63908 ; B 0 -3 600 462 ; -C -1 ; WX 600 ; N afii63910 ; B 0 -3 600 462 ; -C -1 ; WX 600 ; N afii63912 ; B 0 -3 600 619 ; -C -1 ; WX 600 ; N afii62927 ; B 0 0 600 512 ; -C -1 ; WX 600 ; N afii63941 ; B 0 -200 584 580 ; -C -1 ; WX 600 ; N afii62939 ; B 0 0 584 580 ; -C -1 ; WX 600 ; N afii63943 ; B 0 0 584 580 ; -C -1 ; WX 600 ; N afii62943 ; B 0 -51 583 569 ; -C -1 ; WX 600 ; N afii62946 ; B 0 -207 561 572 ; -C -1 ; WX 600 ; N afii63946 ; B 0 -158 557 428 ; -C -1 ; WX 600 ; N afii62951 ; B 0 0 557 428 ; -C -1 ; WX 600 ; N afii63948 ; B 0 0 557 444 ; -C -1 ; WX 600 ; N afii62953 ; B 0 0 547 432 ; -C -1 ; WX 600 ; N afii63950 ; B 0 -208 584 664 ; -C -1 ; WX 600 ; N afii63951 ; B 0 0 584 664 ; -C -1 ; WX 600 ; N afii63952 ; B 0 0 584 664 ; -C -1 ; WX 600 ; N afii63953 ; B 0 0 553 624 ; -C -1 ; WX 600 ; N afii63956 ; B 0 -3 600 587 ; -C -1 ; WX 600 ; N afii63958 ; B 0 -182 593 472 ; -C -1 ; WX 600 ; N afii63959 ; B 0 -54 593 472 ; -C -1 ; WX 600 ; N afii63960 ; B 0 -54 593 476 ; -C -1 ; WX 600 ; N afii63961 ; B 0 -203 586 406 ; -C -1 ; WX 600 ; N afii64046 ; B 0 0 600 705 ; -C -1 ; WX 600 ; N afii64058 ; B 201 0 600 771 ; -C -1 ; WX 600 ; N afii64059 ; B 201 29 336 771 ; -C -1 ; WX 600 ; N afii64060 ; B 295 -127 460 613 ; -C -1 ; WX 600 ; N afii64061 ; B 147 -127 312 613 ; -C -1 ; WX 600 ; N afii62945 ; B 0 0 572 581 ; -C -1 ; WX 600 ; N afii64184 ; B 10 0 575 643 ; -C -1 ; WX 600 ; N afii52399 ; B 250 66 470 331 ; -C -1 ; WX 600 ; N afii52400 ; B 130 29 434 700 ; -C -1 ; WX 600 ; N afii62753 ; B 99 0 600 696 ; -C -1 ; WX 600 ; N afii57411 ; B 199 29 333 783 ; -C -1 ; WX 600 ; N afii62754 ; B 199 0 600 783 ; -C -1 ; WX 600 ; N afii57412 ; B 96 -200 455 513 ; -C -1 ; WX 600 ; N afii62755 ; B 94 -200 600 513 ; -C -1 ; WX 600 ; N afii57413 ; B 217 -236 351 567 ; -C -1 ; WX 600 ; N afii62756 ; B 246 -261 600 562 ; -C -1 ; WX 600 ; N afii57414 ; B 83 -119 523 500 ; -C -1 ; WX 600 ; N afii62759 ; B 55 -274 600 335 ; -C -1 ; WX 600 ; N afii62757 ; B 0 0 580 553 ; -C -1 ; WX 600 ; N afii62758 ; B 0 0 600 551 ; -C -1 ; WX 600 ; N afii57415 ; B 250 29 306 567 ; -C -1 ; WX 600 ; N afii62760 ; B 246 0 600 562 ; -C -1 ; WX 600 ; N afii57416 ; B 18 -210 578 333 ; -C -1 ; WX 600 ; N afii62763 ; B 18 -221 600 328 ; -C -1 ; WX 600 ; N afii62761 ; B 0 -200 580 333 ; -C -1 ; WX 600 ; N afii62762 ; B 0 -217 600 329 ; -C -1 ; WX 600 ; N afii57417 ; B 223 -4 454 527 ; -C -1 ; WX 600 ; N afii62764 ; B 189 0 600 585 ; -C -1 ; WX 600 ; N afii57418 ; B 18 0 578 440 ; -C -1 ; WX 600 ; N afii62767 ; B 18 0 600 440 ; -C -1 ; WX 600 ; N afii62765 ; B 0 0 586 535 ; -C -1 ; WX 600 ; N afii62766 ; B 0 0 600 525 ; -C -1 ; WX 600 ; N afii57419 ; B 18 0 578 532 ; -C -1 ; WX 600 ; N afii62770 ; B 18 0 600 529 ; -C -1 ; WX 600 ; N afii62768 ; B 0 0 595 638 ; -C -1 ; WX 600 ; N afii62769 ; B 0 0 600 606 ; -C -1 ; WX 600 ; N afii57420 ; B 133 -274 591 263 ; -C -1 ; WX 600 ; N afii62773 ; B 77 -274 600 323 ; -C -1 ; WX 600 ; N afii62771 ; B 0 -200 585 319 ; -C -1 ; WX 600 ; N afii62772 ; B 0 -200 600 323 ; -C -1 ; WX 600 ; N afii57421 ; B 133 -274 591 263 ; -C -1 ; WX 600 ; N afii62776 ; B 77 -274 600 323 ; -C -1 ; WX 600 ; N afii62774 ; B 0 0 585 319 ; -C -1 ; WX 600 ; N afii62775 ; B 0 0 600 323 ; -C -1 ; WX 600 ; N afii57422 ; B 133 -274 591 498 ; -C -1 ; WX 600 ; N afii62779 ; B 77 -274 600 492 ; -C -1 ; WX 600 ; N afii62777 ; B 0 0 585 498 ; -C -1 ; WX 600 ; N afii62778 ; B 0 0 600 524 ; -C -1 ; WX 600 ; N afii57423 ; B 202 -6 491 397 ; -C -1 ; WX 600 ; N afii62780 ; B 165 0 600 415 ; -C -1 ; WX 600 ; N afii57424 ; B 202 -6 491 587 ; -C -1 ; WX 600 ; N afii62781 ; B 165 0 600 586 ; -C -1 ; WX 600 ; N afii57425 ; B 70 -205 468 324 ; -C -1 ; WX 600 ; N afii62782 ; B 49 -206 600 328 ; -C -1 ; WX 600 ; N afii57426 ; B 70 -205 468 516 ; -C -1 ; WX 600 ; N afii62783 ; B 49 -206 600 521 ; -C -1 ; WX 600 ; N afii57427 ; B 3 -181 560 329 ; -C -1 ; WX 600 ; N afii62786 ; B 3 -181 600 328 ; -C -1 ; WX 600 ; N afii62784 ; B 0 0 554 328 ; -C -1 ; WX 600 ; N afii62785 ; B 0 0 600 322 ; -C -1 ; WX 600 ; N afii57428 ; B 3 -181 560 574 ; -C -1 ; WX 600 ; N afii62789 ; B 3 -181 600 574 ; -C -1 ; WX 600 ; N afii62787 ; B 0 0 554 569 ; -C -1 ; WX 600 ; N afii62788 ; B 0 0 600 568 ; -C -1 ; WX 600 ; N afii57429 ; B 0 -188 595 305 ; -C -1 ; WX 600 ; N afii62792 ; B 0 -188 600 305 ; -C -1 ; WX 600 ; N afii62790 ; B 0 -1 573 302 ; -C -1 ; WX 600 ; N afii62791 ; B 0 -1 600 302 ; -C -1 ; WX 600 ; N afii57430 ; B 0 -188 595 478 ; -C -1 ; WX 600 ; N afii62795 ; B 0 -188 600 478 ; -C -1 ; WX 600 ; N afii62793 ; B 0 -1 573 481 ; -C -1 ; WX 600 ; N afii62794 ; B 0 -1 600 481 ; -C -1 ; WX 600 ; N afii57431 ; B 6 0 573 563 ; -C -1 ; WX 600 ; N afii62798 ; B 5 0 600 563 ; -C -1 ; WX 600 ; N afii62796 ; B 0 0 573 563 ; -C -1 ; WX 600 ; N afii62797 ; B 0 0 600 563 ; -C -1 ; WX 600 ; N afii57432 ; B 6 0 573 563 ; -C -1 ; WX 600 ; N afii62801 ; B 5 0 600 563 ; -C -1 ; WX 600 ; N afii62799 ; B 0 0 573 563 ; -C -1 ; WX 600 ; N afii62800 ; B 0 0 600 563 ; -C -1 ; WX 600 ; N afii57433 ; B 138 -274 596 331 ; -C -1 ; WX 600 ; N afii62804 ; B 139 -274 600 312 ; -C -1 ; WX 600 ; N afii62802 ; B 0 0 458 334 ; -C -1 ; WX 600 ; N afii62803 ; B 0 0 600 312 ; -C -1 ; WX 600 ; N afii57434 ; B 138 -274 596 548 ; -C -1 ; WX 600 ; N afii62807 ; B 139 -274 600 548 ; -C -1 ; WX 600 ; N afii62805 ; B 0 0 458 552 ; -C -1 ; WX 600 ; N afii62806 ; B 0 0 600 549 ; -C -1 ; WX 600 ; N afii57441 ; B 5 -3 590 586 ; -C -1 ; WX 600 ; N afii62810 ; B 3 -33 600 514 ; -C -1 ; WX 600 ; N afii62808 ; B 0 0 589 578 ; -C -1 ; WX 600 ; N afii62809 ; B 0 0 600 534 ; -C -1 ; WX 600 ; N afii57442 ; B 81 -187 563 520 ; -C -1 ; WX 600 ; N afii62813 ; B 104 -174 600 458 ; -C -1 ; WX 600 ; N afii62811 ; B 0 0 589 583 ; -C -1 ; WX 600 ; N afii62812 ; B 0 0 600 540 ; -C -1 ; WX 600 ; N afii57443 ; B 88 -9 590 575 ; -C -1 ; WX 600 ; N afii62816 ; B 27 -16 600 564 ; -C -1 ; WX 600 ; N afii57410 ; B 0 0 600 566 ; -C -1 ; WX 600 ; N afii62815 ; B 0 0 600 566 ; -C -1 ; WX 600 ; N afii57444 ; B 129 -98 552 567 ; -C -1 ; WX 600 ; N afii62819 ; B 55 -157 600 567 ; -C -1 ; WX 600 ; N afii62817 ; B 0 0 561 572 ; -C -1 ; WX 600 ; N afii62818 ; B 0 0 600 567 ; -C -1 ; WX 600 ; N afii57445 ; B 212 -274 600 289 ; -C -1 ; WX 600 ; N afii62822 ; B 212 -274 600 289 ; -C -1 ; WX 600 ; N afii62820 ; B 0 -4 576 313 ; -C -1 ; WX 600 ; N afii62821 ; B 0 -3 600 313 ; -C -1 ; WX 600 ; N afii57446 ; B 124 -188 560 476 ; -C -1 ; WX 600 ; N afii62825 ; B 69 -206 600 470 ; -C -1 ; WX 600 ; N afii62823 ; B 0 0 580 534 ; -C -1 ; WX 600 ; N afii62824 ; B 0 0 600 514 ; -C -1 ; WX 600 ; N afii57447 ; B 244 -4 454 333 ; -C -1 ; WX 600 ; N afii62828 ; B 189 0 600 417 ; -C -1 ; WX 600 ; N afii57470 ; B 0 0 437 324 ; -C -1 ; WX 600 ; N afii62827 ; B 0 -207 600 316 ; -C -1 ; WX 600 ; N afii57448 ; B 96 -200 455 275 ; -C -1 ; WX 600 ; N afii62829 ; B 94 -200 600 275 ; -C -1 ; WX 600 ; N afii57449 ; B 83 -119 523 325 ; -C -1 ; WX 600 ; N afii62830 ; B 55 -274 600 60 ; -C -1 ; WX 600 ; N afii57450 ; B 83 -274 523 325 ; -C -1 ; WX 600 ; N afii62833 ; B 58 -274 600 61 ; -C -1 ; WX 600 ; N afii62831 ; B 0 -223 580 333 ; -C -1 ; WX 600 ; N afii62832 ; B 0 -223 600 329 ; -C -1 ; WX 600 ; N afii62834 ; B 50 0 462 655 ; -C -1 ; WX 600 ; N afii62835 ; B 75 -40 600 632 ; -C -1 ; WX 600 ; N afii62836 ; B 63 0 462 750 ; -C -1 ; WX 600 ; N afii62837 ; B 79 -40 600 692 ; -C -1 ; WX 600 ; N afii62838 ; B 76 -274 462 567 ; -C -1 ; WX 600 ; N afii62839 ; B 105 -274 600 567 ; -C -1 ; WX 600 ; N afii62840 ; B 76 0 462 567 ; -C -1 ; WX 600 ; N afii62841 ; B 105 -40 600 567 ; -C -1 ; WX 600 ; N glyph1021 ; B 262 417 370 524 ; -C -1 ; WX 600 ; N afii57543-2 ; B 227 511 361 693 ; -C -1 ; WX 600 ; N afii57454-2 ; B 232 512 367 590 ; -C -1 ; WX 600 ; N afii57451-2 ; B 232 512 367 668 ; -C -1 ; WX 600 ; N glyph1025 ; B 47 0 462 849 ; -C -1 ; WX 600 ; N glyph1026 ; B 37 0 462 927 ; -C -1 ; WX 600 ; N afii57471-2 ; B 201 519 396 685 ; -C -1 ; WX 600 ; N afii57458-2 ; B 232 541 354 683 ; -C -1 ; WX 600 ; N afii57457-2 ; B 224 525 366 665 ; -C -1 ; WX 600 ; N afii57494-2 ; B 131 539 435 621 ; -C -1 ; WX 600 ; N afii57459-2 ; B 286 550 318 778 ; -C -1 ; WX 600 ; N afii57455-2 ; B 205 512 368 718 ; -C -1 ; WX 600 ; N afii57452-2 ; B 199 513 378 720 ; -C -1 ; WX 600 ; N glyph1034 ; B 45 0 462 920 ; -C -1 ; WX 600 ; N glyph1035 ; B 16 0 462 988 ; -C -1 ; WX 600 ; N glyph1036 ; B 2 0 462 980 ; -C -1 ; WX 600 ; N afii62884-2 ; B 222 523 364 718 ; -C -1 ; WX 600 ; N afii62881-2 ; B 224 525 366 796 ; -C -1 ; WX 600 ; N afii62886-2 ; B 224 509 366 729 ; -C -1 ; WX 600 ; N afii62883-2 ; B 229 510 371 807 ; -C -1 ; WX 600 ; N afii62885-2 ; B 207 523 370 848 ; -C -1 ; WX 600 ; N afii62882-2 ; B 189 524 368 849 ; -C -1 ; WX 600 ; N afii57504-2 ; B 232 -504 366 -322 ; -C -1 ; WX 600 ; N afii57456-2 ; B 212 -384 346 -306 ; -C -1 ; WX 600 ; N afii57453-2 ; B 212 -461 347 -305 ; -C -1 ; WX 600 ; N glyph1046 ; B 76 -346 462 567 ; -C -1 ; WX 600 ; N glyph1047 ; B 76 -424 462 567 ; -C -1 ; WX 600 ; N afii57543-3 ; B 239 382 373 564 ; -C -1 ; WX 600 ; N afii57454-3 ; B 245 383 379 461 ; -C -1 ; WX 600 ; N afii57451-3 ; B 245 383 379 539 ; -C -1 ; WX 600 ; N glyph1051 ; B 57 -40 600 791 ; -C -1 ; WX 600 ; N glyph1052 ; B 52 -40 600 869 ; -C -1 ; WX 600 ; N afii57471-3 ; B 213 390 409 555 ; -C -1 ; WX 600 ; N afii57458-3 ; B 244 406 366 548 ; -C -1 ; WX 600 ; N afii57457-3 ; B 236 396 378 535 ; -C -1 ; WX 600 ; N afii57494-3 ; B 144 409 447 492 ; -C -1 ; WX 600 ; N afii57459-3 ; B 298 421 331 649 ; -C -1 ; WX 600 ; N afii57455-3 ; B 217 383 380 589 ; -C -1 ; WX 600 ; N afii57452-3 ; B 211 384 390 591 ; -C -1 ; WX 600 ; N glyph1060 ; B 62 -40 600 863 ; -C -1 ; WX 600 ; N glyph1061 ; B 32 -40 600 930 ; -C -1 ; WX 600 ; N glyph1062 ; B 19 -40 600 923 ; -C -1 ; WX 600 ; N afii62884-3 ; B 234 394 376 589 ; -C -1 ; WX 600 ; N afii62881-3 ; B 236 396 378 667 ; -C -1 ; WX 600 ; N afii62886-3 ; B 236 380 378 599 ; -C -1 ; WX 600 ; N afii62883-3 ; B 241 380 383 678 ; -C -1 ; WX 600 ; N afii62885-3 ; B 219 394 382 719 ; -C -1 ; WX 600 ; N afii62882-3 ; B 201 395 380 719 ; -C -1 ; WX 600 ; N afii57504-3 ; B 222 -680 356 -498 ; -C -1 ; WX 600 ; N afii57456-3 ; B 202 -560 336 -482 ; -C -1 ; WX 600 ; N afii57453-3 ; B 202 -637 337 -480 ; -C -1 ; WX 600 ; N glyph1072 ; B 105 -346 600 567 ; -C -1 ; WX 600 ; N glyph1073 ; B 105 -424 600 567 ; -C -1 ; WX 600 ; N afii57543-4 ; B 95 580 229 762 ; -C -1 ; WX 600 ; N afii57454-4 ; B 101 581 235 659 ; -C -1 ; WX 600 ; N afii57451-4 ; B 100 581 235 737 ; -C -1 ; WX 600 ; N glyph1077 ; B 177 29 333 833 ; -C -1 ; WX 600 ; N glyph1078 ; B 182 29 333 911 ; -C -1 ; WX 600 ; N afii57471-4 ; B 69 587 265 753 ; -C -1 ; WX 600 ; N afii57458-4 ; B 100 604 222 746 ; -C -1 ; WX 600 ; N afii57457-4 ; B 92 594 234 733 ; -C -1 ; WX 600 ; N afii57494-4 ; B 0 607 304 689 ; -C -1 ; WX 600 ; N afii57459-4 ; B 154 619 187 847 ; -C -1 ; WX 600 ; N afii57455-4 ; B 73 581 236 787 ; -C -1 ; WX 600 ; N afii57452-4 ; B 67 582 246 789 ; -C -1 ; WX 600 ; N glyph1086 ; B 187 29 333 920 ; -C -1 ; WX 600 ; N glyph1087 ; B 133 29 333 948 ; -C -1 ; WX 600 ; N glyph1088 ; B 116 29 333 947 ; -C -1 ; WX 600 ; N afii62884-4 ; B 90 592 232 787 ; -C -1 ; WX 600 ; N afii62881-4 ; B 92 594 234 864 ; -C -1 ; WX 600 ; N afii62886-4 ; B 92 578 234 797 ; -C -1 ; WX 600 ; N afii62883-4 ; B 97 578 239 875 ; -C -1 ; WX 600 ; N afii62885-4 ; B 75 592 238 917 ; -C -1 ; WX 600 ; N afii62882-4 ; B 57 593 236 917 ; -C -1 ; WX 600 ; N afii57504-4 ; B 190 -274 324 -92 ; -C -1 ; WX 600 ; N afii57456-4 ; B 170 -165 305 -86 ; -C -1 ; WX 600 ; N afii57453-4 ; B 170 -241 305 -85 ; -C -1 ; WX 600 ; N glyph1098 ; B 218 -310 364 567 ; -C -1 ; WX 600 ; N glyph1099 ; B 218 -388 360 567 ; -C -1 ; WX 600 ; N glyph1100 ; B 217 329 426 440 ; -C -1 ; WX 600 ; N glyph1101 ; B 200 322 410 532 ; -C -1 ; WX 600 ; N glyph1102 ; B 234 -274 443 -64 ; -C -1 ; WX 600 ; N glyph1103 ; B 0 -207 580 333 ; -C -1 ; WX 600 ; N glyph1104 ; B 18 0 578 333 ; -C -1 ; WX 600 ; N glyph1105 ; B 18 0 600 328 ; -C -1 ; WX 600 ; N glyph1106 ; B 0 0 580 333 ; -C -1 ; WX 600 ; N glyph1107 ; B 0 0 600 329 ; -C -1 ; WX 600 ; N glyph1108 ; B 5 -3 590 391 ; -C -1 ; WX 600 ; N glyph1109 ; B 3 -33 600 316 ; -C -1 ; WX 600 ; N glyph1110 ; B 0 0 589 391 ; -C -1 ; WX 600 ; N glyph1111 ; B 0 0 600 346 ; -C -1 ; WX 600 ; N glyph1112 ; B 117 -274 537 332 ; -C -1 ; WX 600 ; N glyph1113 ; B 74 -151 521 308 ; -C -1 ; WX 600 ; N glyph1114 ; B 77 -151 523 347 ; -C -1 ; WX 600 ; N glyph1115 ; B 0 -208 600 306 ; -C -1 ; WX 600 ; N glyph1116 ; B 14 -187 600 301 ; -C -1 ; WX 600 ; N glyph1117 ; B 21 -274 600 166 ; -C -1 ; WX 600 ; N glyph1118 ; B 0 0 584 472 ; -C -1 ; WX 600 ; N glyph1119 ; B 0 0 541 406 ; -C -1 ; WX 600 ; N glyph1120 ; B 160 0 600 834 ; -C -1 ; WX 600 ; N glyph1121 ; B 160 0 600 913 ; -C -1 ; WX 600 ; N glyph1122 ; B 168 0 600 925 ; -C -1 ; WX 600 ; N glyph1123 ; B 119 0 600 948 ; -C -1 ; WX 600 ; N glyph1124 ; B 106 0 600 947 ; -C -1 ; WX 600 ; N glyph1125 ; B 246 -323 600 562 ; -C -1 ; WX 600 ; N glyph1126 ; B 246 -401 600 562 ; -C -1 ; WX 600 ; N uniFFFC ; B 0 0 600 431 ; -C -1 ; WX 600 ; N Ohorn ; B 51 -16 600 584 ; -C -1 ; WX 600 ; N ohorn ; B 71 -16 571 438 ; -C -1 ; WX 600 ; N Uhorn ; B 41 -16 600 649 ; -C -1 ; WX 600 ; N uhorn ; B 44 -16 574 437 ; -C -1 ; WX 600 ; N _d_1133 ; B 219 682 416 785 ; -C -1 ; WX 600 ; N _d_1134 ; B 200 682 396 785 ; -C -1 ; WX 600 ; N _d_1135 ; B 199 632 366 783 ; -C -1 ; WX 600 ; N f006 ; B 221 682 417 785 ; -C -1 ; WX 600 ; N f007 ; B 224 682 421 785 ; -C -1 ; WX 600 ; N f009 ; B 219 632 386 783 ; -C -1 ; WX 600 ; N combininghookabove ; B 216 638 374 763 ; -C -1 ; WX 600 ; N f010 ; B 221 699 363 783 ; -C -1 ; WX 600 ; N f013 ; B 208 643 366 783 ; -C -1 ; WX 600 ; N f011 ; B 215 699 357 783 ; -C -1 ; WX 600 ; N f01c ; B 146 671 458 772 ; -C -1 ; WX 600 ; N f015 ; B 143 682 454 783 ; -C -1 ; WX 600 ; N combiningtildeaccent ; B 137 682 448 783 ; -C -1 ; WX 600 ; N _d_1146 ; B 171 593 436 675 ; -C -1 ; WX 600 ; N _d_1147 ; B 158 591 420 676 ; -C -1 ; WX 600 ; N f02c ; B 436 -158 536 -58 ; -C -1 ; WX 600 ; N dongsign ; B 98 112 495 613 ; -C -1 ; WX 600 ; N onethird ; B 0 -8 600 626 ; -C -1 ; WX 600 ; N twothirds ; B 0 -8 600 627 ; -C -1 ; WX 600 ; N f008 ; B 203 499 370 649 ; -C -1 ; WX 600 ; N _d_1153 ; B 217 499 384 649 ; -C -1 ; WX 600 ; N _d_1154 ; B 206 499 373 649 ; -C -1 ; WX 600 ; N f00f ; B 220 499 387 649 ; -C -1 ; WX 600 ; N f012 ; B 214 499 372 624 ; -C -1 ; WX 600 ; N f014 ; B 214 499 372 624 ; -C -1 ; WX 600 ; N f016 ; B 146 671 458 772 ; -C -1 ; WX 600 ; N f017 ; B 146 671 458 772 ; -C -1 ; WX 600 ; N f018 ; B 146 671 458 772 ; -C -1 ; WX 600 ; N f019 ; B 145 489 456 589 ; -C -1 ; WX 600 ; N f01a ; B 145 489 456 589 ; -C -1 ; WX 600 ; N f01b ; B 145 489 456 589 ; -C -1 ; WX 600 ; N f01e ; B 250 -158 350 -58 ; -C -1 ; WX 600 ; N f01f ; B 250 -158 350 -58 ; -C -1 ; WX 600 ; N f020 ; B 250 -158 350 -58 ; -C -1 ; WX 600 ; N f021 ; B 250 -158 350 -58 ; -C -1 ; WX 600 ; N f022 ; B 250 -158 350 -58 ; -C -1 ; WX 600 ; N combininggraveaccent ; B 221 632 388 783 ; -C -1 ; WX 600 ; N combiningacuteaccent ; B 207 632 374 783 ; -C -1 ; WX 600 ; N f01d ; B 145 489 456 589 ; -C -1 ; WX 600 ; N combiningdotbelow ; B 250 -158 350 -58 ; -C -1 ; WX 600 ; N f023 ; B 250 -158 350 -58 ; -C -1 ; WX 600 ; N f029 ; B 250 -158 350 -58 ; -C -1 ; WX 600 ; N f02a ; B 250 -158 350 -58 ; -C -1 ; WX 600 ; N f02b ; B 250 -158 350 -58 ; -C -1 ; WX 600 ; N f024 ; B 250 -158 350 -58 ; -C -1 ; WX 600 ; N f025 ; B 250 -158 350 -58 ; -C -1 ; WX 600 ; N f026 ; B 250 -158 350 -58 ; -C -1 ; WX 600 ; N f027 ; B 250 -158 350 -58 ; -C -1 ; WX 600 ; N f028 ; B 250 -158 350 -58 ; -C -1 ; WX 600 ; N f02d ; B 157 682 469 783 ; -C -1 ; WX 600 ; N f02e ; B 146 671 458 772 ; -C -1 ; WX 600 ; N f02f ; B 157 682 469 783 ; -C -1 ; WX 600 ; N f030 ; B 146 671 458 772 ; -C -1 ; WX 600 ; N Adotbelow ; B 8 -158 593 571 ; -C -1 ; WX 600 ; N adotbelow ; B 70 -158 542 438 ; -C -1 ; WX 600 ; N Ahookabove ; B 8 0 593 763 ; -C -1 ; WX 600 ; N ahookabove ; B 70 -16 542 624 ; -C -1 ; WX 600 ; N Acircumflexacute ; B 8 0 593 785 ; -C -1 ; WX 600 ; N acircumflexacute ; B 70 -16 542 783 ; -C -1 ; WX 600 ; N Acircumflexgrave ; B 8 0 593 785 ; -C -1 ; WX 600 ; N acircumflexgrave ; B 70 -16 542 783 ; -C -1 ; WX 600 ; N Acircumflexhookabove ; B 8 0 593 783 ; -C -1 ; WX 600 ; N acircumflexhookabove ; B 70 -16 542 783 ; -C -1 ; WX 600 ; N Acircumflextilde ; B 8 0 593 783 ; -C -1 ; WX 600 ; N acircumflextilde ; B 70 -16 542 783 ; -C -1 ; WX 600 ; N Acircumflexdotbelow ; B 8 -158 593 676 ; -C -1 ; WX 600 ; N acircumflexdotbelow ; B 70 -158 542 640 ; -C -1 ; WX 600 ; N Abreveacute ; B 8 0 593 785 ; -C -1 ; WX 600 ; N abreveacute ; B 70 -16 542 783 ; -C -1 ; WX 600 ; N Abrevegrave ; B 8 0 593 785 ; -C -1 ; WX 600 ; N abrevegrave ; B 70 -16 542 783 ; -C -1 ; WX 600 ; N Abrevehookabove ; B 8 0 593 783 ; -C -1 ; WX 600 ; N abrevehookabove ; B 70 -16 542 783 ; -C -1 ; WX 600 ; N Abrevetilde ; B 8 0 593 783 ; -C -1 ; WX 600 ; N abrevetilde ; B 70 -16 542 783 ; -C -1 ; WX 600 ; N Abrevedotbelow ; B 8 -158 593 675 ; -C -1 ; WX 600 ; N abrevedotbelow ; B 70 -158 542 634 ; -C -1 ; WX 600 ; N Edotbelow ; B 43 -158 523 571 ; -C -1 ; WX 600 ; N edotbelow ; B 63 -158 523 438 ; -C -1 ; WX 600 ; N Ehookabove ; B 43 0 523 763 ; -C -1 ; WX 600 ; N ehookabove ; B 63 -16 523 624 ; -C -1 ; WX 600 ; N Etilde ; B 43 0 523 720 ; -C -1 ; WX 600 ; N etilde ; B 63 -16 523 589 ; -C -1 ; WX 600 ; N Ecircumflexacute ; B 43 0 523 785 ; -C -1 ; WX 600 ; N ecircumflexacute ; B 63 -16 523 783 ; -C -1 ; WX 600 ; N Ecircumflexgrave ; B 43 0 523 785 ; -C -1 ; WX 600 ; N ecircumflexgrave ; B 63 -16 523 783 ; -C -1 ; WX 600 ; N Ecircumflexhookabove ; B 43 0 523 783 ; -C -1 ; WX 600 ; N ecircumflexhookabove ; B 63 -16 523 783 ; -C -1 ; WX 600 ; N Ecircumflextilde ; B 43 0 523 783 ; -C -1 ; WX 600 ; N ecircumflextilde ; B 63 -16 523 783 ; -C -1 ; WX 600 ; N Ecircumflexdotbelow ; B 43 -158 523 676 ; -C -1 ; WX 600 ; N ecircumflexdotbelow ; B 63 -158 523 640 ; -C -1 ; WX 600 ; N Ihookabove ; B 112 0 489 763 ; -C -1 ; WX 600 ; N ihookabove ; B 91 0 511 624 ; -C -1 ; WX 600 ; N Idotbelow ; B 112 -158 489 571 ; -C -1 ; WX 600 ; N idotbelow ; B 92 -158 511 633 ; -C -1 ; WX 600 ; N Odotbelow ; B 0 -158 500 584 ; -C -1 ; WX 600 ; N odotbelow ; B 71 -158 529 438 ; -C -1 ; WX 600 ; N Ohookabove ; B 0 -16 500 763 ; -C -1 ; WX 600 ; N ohookabove ; B 71 -16 529 624 ; -C -1 ; WX 600 ; N Ocircumflexacute ; B 0 -16 500 785 ; -C -1 ; WX 600 ; N ocircumflexacute ; B 71 -16 529 783 ; -C -1 ; WX 600 ; N Ocircumflexgrave ; B 0 -16 500 785 ; -C -1 ; WX 600 ; N ocircumflexgrave ; B 71 -16 529 783 ; -C -1 ; WX 600 ; N Ocircumflexhookabove ; B 0 -16 500 783 ; -C -1 ; WX 600 ; N ocircumflexhookabove ; B 71 -16 529 783 ; -C -1 ; WX 600 ; N Ocircumflextilde ; B 0 -16 500 783 ; -C -1 ; WX 600 ; N ocircumflextilde ; B 71 -16 529 783 ; -C -1 ; WX 600 ; N Ocircumflexdotbelow ; B 0 -158 500 676 ; -C -1 ; WX 600 ; N ocircumflexdotbelow ; B 71 -158 529 640 ; -C -1 ; WX 600 ; N Ohornacute ; B 51 -16 600 779 ; -C -1 ; WX 600 ; N ohornacute ; B 71 -16 571 649 ; -C -1 ; WX 600 ; N Ohorngrave ; B 51 -16 600 779 ; -C -1 ; WX 600 ; N ohorngrave ; B 71 -16 571 649 ; -C -1 ; WX 600 ; N Ohornhookabove ; B 51 -16 600 763 ; -C -1 ; WX 600 ; N ohornhookabove ; B 71 -16 571 624 ; -C -1 ; WX 600 ; N Ohorntilde ; B 51 -16 600 720 ; -C -1 ; WX 600 ; N ohorntilde ; B 71 -16 571 589 ; -C -1 ; WX 600 ; N Ohorndotbelow ; B 51 -158 600 584 ; -C -1 ; WX 600 ; N ohorndotbelow ; B 71 -158 571 438 ; -C -1 ; WX 600 ; N Udotbelow ; B 41 -158 561 571 ; -C -1 ; WX 600 ; N udotbelow ; B 44 -158 543 423 ; -C -1 ; WX 600 ; N Uhookabove ; B 41 -16 561 763 ; -C -1 ; WX 600 ; N uhookabove ; B 44 -16 543 624 ; -C -1 ; WX 600 ; N Uhornacute ; B 41 -16 600 779 ; -C -1 ; WX 600 ; N uhornacute ; B 44 -16 574 649 ; -C -1 ; WX 600 ; N Uhorngrave ; B 41 -16 600 779 ; -C -1 ; WX 600 ; N uhorngrave ; B 44 -16 574 649 ; -C -1 ; WX 600 ; N Uhornhookabove ; B 41 -16 600 763 ; -C -1 ; WX 600 ; N uhornhookabove ; B 44 -16 574 624 ; -C -1 ; WX 600 ; N Uhorntilde ; B 41 -16 600 720 ; -C -1 ; WX 600 ; N uhorntilde ; B 44 -16 574 589 ; -C -1 ; WX 600 ; N Uhorndotbelow ; B 41 -158 600 649 ; -C -1 ; WX 600 ; N uhorndotbelow ; B 44 -158 574 437 ; -C -1 ; WX 600 ; N Ydotbelow ; B 48 -158 551 571 ; -C -1 ; WX 600 ; N ydotbelow ; B 73 -188 574 423 ; -C -1 ; WX 600 ; N Yhookabove ; B 48 0 551 763 ; -C -1 ; WX 600 ; N yhookabove ; B 73 -188 574 624 ; -C -1 ; WX 600 ; N Ytilde ; B 48 0 551 720 ; -C -1 ; WX 600 ; N ytilde ; B 73 -188 574 589 ; -C -1 ; WX 600 ; N uni01CD ; B 8 0 593 763 ; -C -1 ; WX 600 ; N uni01CE ; B 70 -16 542 634 ; -C -1 ; WX 600 ; N uni01CF ; B 112 0 489 763 ; -C -1 ; WX 600 ; N uni01D0 ; B 91 0 511 634 ; -C -1 ; WX 600 ; N uni01D1 ; B 0 -16 500 763 ; -C -1 ; WX 600 ; N uni01D2 ; B 71 -16 529 634 ; -C -1 ; WX 600 ; N uni01D3 ; B 41 -16 561 763 ; -C -1 ; WX 600 ; N uni01D4 ; B 44 -16 543 634 ; -C -1 ; WX 600 ; N uni01D5 ; B 41 -16 561 782 ; -C -1 ; WX 600 ; N uni01D6 ; B 44 -16 543 703 ; -C -1 ; WX 600 ; N uni01D7 ; B 41 -16 561 783 ; -C -1 ; WX 600 ; N uni01D8 ; B 44 -16 543 771 ; -C -1 ; WX 600 ; N uni01D9 ; B 41 -16 561 783 ; -C -1 ; WX 600 ; N uni01DA ; B 44 -16 543 761 ; -C -1 ; WX 600 ; N uni01DB ; B 41 -16 561 783 ; -C -1 ; WX 600 ; N uni01DC ; B 44 -16 543 771 ; -C -1 ; WX 600 ; N _d_1290 ; B 148 624 453 782 ; -C -1 ; WX 600 ; N _d_1291 ; B 135 624 466 783 ; -C -1 ; WX 600 ; N _d_1292 ; B 120 624 481 783 ; -C -1 ; WX 600 ; N _d_1293 ; B 135 624 466 783 ; -C -1 ; WX 600 ; N uni0492 ; B 62 0 542 571 ; -C -1 ; WX 600 ; N uni0493 ; B 74 0 531 423 ; -C -1 ; WX 600 ; N uni0496 ; B -2 -140 596 571 ; -C -1 ; WX 600 ; N uni0497 ; B 10 -103 597 423 ; -C -1 ; WX 600 ; N uni049a ; B 58 -140 595 572 ; -C -1 ; WX 600 ; N uni049b ; B 59 -103 580 423 ; -C -1 ; WX 600 ; N uni049c ; B 58 0 587 572 ; -C -1 ; WX 600 ; N uni049d ; B 59 0 572 423 ; -C -1 ; WX 600 ; N uni04a2 ; B 52 -140 569 571 ; -C -1 ; WX 600 ; N uni04a3 ; B 52 -103 563 423 ; -C -1 ; WX 600 ; N uni04ae ; B 48 0 551 571 ; -C -1 ; WX 600 ; N uni04af ; B 73 -188 574 423 ; -C -1 ; WX 600 ; N uni04b0 ; B 48 0 551 571 ; -C -1 ; WX 600 ; N uni04b1 ; B 73 -188 574 423 ; -C -1 ; WX 600 ; N uni04b2 ; B 39 -140 577 571 ; -C -1 ; WX 600 ; N uni04b3 ; B 49 -103 551 423 ; -C -1 ; WX 600 ; N uni04b8 ; B 20 0 547 571 ; -C -1 ; WX 600 ; N uni04b9 ; B 34 0 546 423 ; -C -1 ; WX 600 ; N uni04ba ; B 52 0 580 571 ; -C -1 ; WX 600 ; N uni04bb ; B 53 0 565 423 ; -C -1 ; WX 600 ; N uni018f ; B 32 -16 555 584 ; -C -1 ; WX 600 ; N uni0259 ; B 63 -16 523 438 ; -C -1 ; WX 600 ; N uni04e8 ; B 51 -16 551 584 ; -C -1 ; WX 600 ; N uni04e9 ; B 71 -16 529 438 ; -EndCharMetrics -EndFontMetrics +StartFontMetrics 4.1 +FontName CourierNewPSMT +FullName Courier New +Notice Typeface The Monotype Corporation plc. Data The Monotype Corporation plc/Type Solutions Inc. 1990-1994. All Rights Reserved +EncodingScheme FontSpecific +FamilyName Courier New +Weight Regular +Version Version 2.90 +Characters 1318 +ItalicAngle 0.0 +Ascender 833 +Descender -300 +UnderlineThickness 41 +UnderlinePosition -233 +IsFixedPitch true +FontBBox -20 -680 638 1021 +StartCharMetrics 1353 +C 0 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 1 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 2 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 3 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 4 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 5 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 6 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 7 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 8 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 9 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 10 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 11 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 12 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 13 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 14 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 15 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 16 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 17 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 18 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 19 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 20 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 21 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 22 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 23 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 24 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 25 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 26 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 27 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 28 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 29 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 30 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 31 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 32 ; WX 600 ; N space ; B 240 -15 360 627 ; +C 33 ; WX 600 ; N exclam ; B 240 -15 360 627 ; +C 34 ; WX 600 ; N quotedbl ; B 130 332 469 603 ; +C 35 ; WX 600 ; N numbersign ; B 91 -63 508 657 ; +C 36 ; WX 600 ; N dollar ; B 111 -93 488 665 ; +C 37 ; WX 600 ; N percent ; B 91 -12 510 623 ; +C 38 ; WX 600 ; N ampersand ; B 124 -16 499 526 ; +C 39 ; WX 600 ; N quotesingle ; B 235 320 365 613 ; +C 40 ; WX 600 ; N parenleft ; B 295 -127 460 613 ; +C 41 ; WX 600 ; N parenright ; B 147 -127 312 613 ; +C 42 ; WX 600 ; N asterisk ; B 0 253 375 613 ; +C 43 ; WX 600 ; N plus ; B 70 33 530 538 ; +C 44 ; WX 600 ; N comma ; B 146 -146 352 147 ; +C 45 ; WX 600 ; N hyphen ; B 91 253 509 312 ; +C 46 ; WX 600 ; N period ; B 225 -15 375 118 ; +C 47 ; WX 600 ; N slash ; B 112 -83 489 678 ; +C 48 ; WX 600 ; N zero ; B 112 -15 488 627 ; +C 49 ; WX 600 ; N one ; B 111 0 488 621 ; +C 50 ; WX 600 ; N two ; B 83 0 480 627 ; +C 51 ; WX 600 ; N three ; B 95 -15 500 627 ; +C 52 ; WX 600 ; N four ; B 104 0 480 613 ; +C 53 ; WX 600 ; N five ; B 96 -15 500 613 ; +C 54 ; WX 600 ; N six ; B 134 -15 513 627 ; +C 55 ; WX 600 ; N seven ; B 103 -1 479 613 ; +C 56 ; WX 600 ; N eight ; B 113 -15 488 627 ; +C 57 ; WX 600 ; N nine ; B 134 -15 511 627 ; +C 58 ; WX 600 ; N colon ; B 225 -15 375 423 ; +C 59 ; WX 600 ; N semicolon ; B 152 -104 375 423 ; +C 60 ; WX 600 ; N less ; B 0 32 480 538 ; +C 61 ; WX 600 ; N equal ; B 49 192 551 381 ; +C 62 ; WX 600 ; N greater ; B 0 32 480 538 ; +C 63 ; WX 600 ; N question ; B 0 -15 355 586 ; +C 64 ; WX 600 ; N at ; B 105 -63 480 633 ; +C 65 ; WX 600 ; N A ; B 8 0 593 571 ; +C 66 ; WX 600 ; N B ; B 42 0 543 571 ; +C 67 ; WX 600 ; N C ; B 62 -16 537 584 ; +C 68 ; WX 600 ; N D ; B 77 0 558 571 ; +C 69 ; WX 600 ; N E ; B 43 0 523 571 ; +C 70 ; WX 600 ; N F ; B 78 0 557 571 ; +C 71 ; WX 600 ; N G ; B 63 -16 565 584 ; +C 72 ; WX 600 ; N H ; B 52 0 554 571 ; +C 73 ; WX 600 ; N I ; B 112 0 489 571 ; +C 74 ; WX 600 ; N J ; B 83 -16 585 571 ; +C 75 ; WX 600 ; N K ; B 43 0 575 571 ; +C 76 ; WX 600 ; N L ; B 63 0 543 571 ; +C 77 ; WX 600 ; N M ; B 12 0 594 571 ; +C 78 ; WX 600 ; N N ; B 22 0 563 571 ; +C 79 ; WX 600 ; N O ; B 0 -16 500 584 ; +C 80 ; WX 600 ; N P ; B 87 0 544 571 ; +C 81 ; WX 600 ; N Q ; B 51 -117 551 584 ; +C 82 ; WX 600 ; N R ; B 43 0 593 571 ; +C 83 ; WX 600 ; N S ; B 90 -16 510 584 ; +C 84 ; WX 600 ; N T ; B 70 0 529 571 ; +C 85 ; WX 600 ; N U ; B 41 -16 561 571 ; +C 86 ; WX 600 ; N V ; B 8 0 593 571 ; +C 87 ; WX 600 ; N W ; B 18 0 580 571 ; +C 88 ; WX 600 ; N X ; B 39 0 563 571 ; +C 89 ; WX 600 ; N Y ; B 48 0 551 571 ; +C 90 ; WX 600 ; N Z ; B 104 0 499 571 ; +C 91 ; WX 600 ; N bracketleft ; B 0 -126 168 613 ; +C 92 ; WX 600 ; N backslash ; B 0 -85 377 675 ; +C 93 ; WX 600 ; N bracketright ; B 0 -126 168 613 ; +C 94 ; WX 600 ; N asciicircum ; B 111 359 489 625 ; +C 95 ; WX 600 ; N underscore ; B 38 -274 638 -233 ; +C 96 ; WX 600 ; N grave ; B 217 499 384 649 ; +C 97 ; WX 600 ; N a ; B 70 -16 542 438 ; +C 98 ; WX 600 ; N b ; B 22 -16 542 613 ; +C 99 ; WX 600 ; N c ; B 83 -16 537 438 ; +C 100 ; WX 600 ; N d ; B 62 -16 583 613 ; +C 101 ; WX 600 ; N e ; B 63 -16 523 438 ; +C 102 ; WX 600 ; N f ; B 105 0 544 613 ; +C 103 ; WX 600 ; N g ; B 61 -188 562 438 ; +C 104 ; WX 600 ; N h ; B 42 0 553 613 ; +C 105 ; WX 600 ; N i ; B 92 0 511 633 ; +C 106 ; WX 600 ; N j ; B 88 -188 402 633 ; +C 107 ; WX 600 ; N k ; B 93 0 572 613 ; +C 108 ; WX 600 ; N l ; B 91 0 510 613 ; +C 109 ; WX 600 ; N m ; B 10 0 593 438 ; +C 110 ; WX 600 ; N n ; B 53 0 542 438 ; +C 111 ; WX 600 ; N o ; B 71 -16 529 438 ; +C 112 ; WX 600 ; N p ; B 22 -188 542 438 ; +C 113 ; WX 600 ; N q ; B 63 -188 583 438 ; +C 114 ; WX 600 ; N r ; B 83 0 544 433 ; +C 115 ; WX 600 ; N s ; B 101 -16 499 438 ; +C 116 ; WX 600 ; N t ; B 71 -16 529 571 ; +C 117 ; WX 600 ; N u ; B 44 -16 543 423 ; +C 118 ; WX 600 ; N v ; B 29 0 571 423 ; +C 119 ; WX 600 ; N w ; B 27 0 572 423 ; +C 120 ; WX 600 ; N x ; B 49 0 552 423 ; +C 121 ; WX 600 ; N y ; B 73 -188 574 423 ; +C 122 ; WX 600 ; N z ; B 116 0 491 423 ; +C 123 ; WX 600 ; N braceleft ; B 0 -126 206 613 ; +C 124 ; WX 600 ; N bar ; B 279 -126 321 613 ; +C 125 ; WX 600 ; N braceright ; B 0 -127 206 613 ; +C 126 ; WX 600 ; N asciitilde ; B 91 211 509 359 ; +C 127 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 128 ; WX 600 ; N Euro ; B 3 -16 539 584 ; +C 129 ; WX 600 ; N afii10052 ; B 62 0 542 778 ; +C 130 ; WX 600 ; N quotesinglbase ; B 0 -159 206 135 ; +C 131 ; WX 600 ; N florin ; B 86 -94 519 628 ; +C 132 ; WX 600 ; N quotedblbase ; B 0 -127 405 125 ; +C 133 ; WX 600 ; N ellipsis ; B 49 -15 551 85 ; +C 134 ; WX 600 ; N dagger ; B 123 -63 478 613 ; +C 135 ; WX 600 ; N daggerdbl ; B 123 -63 478 613 ; +C 136 ; WX 600 ; N circumflex ; B 154 498 446 640 ; +C 137 ; WX 600 ; N perthousand ; B 30 -10 567 625 ; +C 138 ; WX 600 ; N Scaron ; B 90 -16 510 760 ; +C 139 ; WX 600 ; N guilsinglleft ; B 52 0 313 424 ; +C 140 ; WX 600 ; N OE ; B 8 0 592 571 ; +C 141 ; WX 600 ; N afii10061 ; B 58 0 587 778 ; +C 142 ; WX 600 ; N Zcaron ; B 104 0 499 760 ; +C 143 ; WX 600 ; N afii10145 ; B 49 -140 551 571 ; +C 144 ; WX 600 ; N quotedblbase ; B 0 -127 405 125 ; +C 145 ; WX 600 ; N quoteleft ; B 249 319 455 613 ; +C 146 ; WX 600 ; N quoteright ; B 0 319 206 613 ; +C 147 ; WX 600 ; N quotedblleft ; B 87 360 493 613 ; +C 148 ; WX 600 ; N quotedblright ; B 107 360 512 613 ; +C 149 ; WX 600 ; N bullet ; B 179 190 421 432 ; +C 150 ; WX 600 ; N endash ; B 71 265 529 306 ; +C 151 ; WX 600 ; N emdash ; B -7 266 607 307 ; +C 152 ; WX 600 ; N tilde ; B 145 489 456 589 ; +C 153 ; WX 600 ; N trademark ; B 2 297 598 571 ; +C 154 ; WX 600 ; N scaron ; B 101 -16 499 634 ; +C 155 ; WX 600 ; N guilsinglright ; B 291 0 552 424 ; +C 156 ; WX 600 ; N oe ; B 9 -16 583 438 ; +C 157 ; WX 600 ; N afii10109 ; B 59 0 572 649 ; +C 158 ; WX 600 ; N zcaron ; B 116 0 491 634 ; +C 159 ; WX 600 ; N Ydieresis ; B 48 0 551 730 ; +C 160 ; WX 600 ; N space ; B 240 -15 360 627 ; +C 161 ; WX 600 ; N exclamdown ; B 240 -190 360 429 ; +C 162 ; WX 600 ; N cent ; B 111 0 471 652 ; +C 163 ; WX 600 ; N sterling ; B 61 0 523 587 ; +C 164 ; WX 600 ; N currency ; B 101 97 499 496 ; +C 165 ; WX 600 ; N yen ; B 48 0 551 571 ; +C 166 ; WX 600 ; N brokenbar ; B 279 -126 321 613 ; +C 167 ; WX 600 ; N section ; B 70 -63 530 613 ; +C 168 ; WX 600 ; N dieresis ; B 156 521 445 600 ; +C 169 ; WX 600 ; N copyright ; B 0 -13 597 584 ; +C 170 ; WX 600 ; N ordfeminine ; B 0 355 319 640 ; +C 171 ; WX 600 ; N guillemotleft ; B 0 0 490 424 ; +C 172 ; WX 600 ; N logicalnot ; B 12 33 530 306 ; +C 173 ; WX 600 ; N hyphen ; B 91 253 509 312 ; +C 174 ; WX 600 ; N registered ; B 0 -13 597 584 ; +C 175 ; WX 600 ; N overscore ; B -13 654 613 696 ; +C 176 ; WX 600 ; N degree ; B 165 457 436 728 ; +C 177 ; WX 600 ; N plusminus ; B 70 0 530 603 ; +C 178 ; WX 600 ; N twosuperior ; B 167 301 412 627 ; +C 179 ; WX 600 ; N threesuperior ; B 173 293 424 627 ; +C 180 ; WX 600 ; N acute ; B 216 499 383 649 ; +C 181 ; WX 600 ; N mu1 ; B 44 -188 543 423 ; +C 182 ; WX 600 ; N paragraph ; B 83 -63 521 613 ; +C 183 ; WX 600 ; N periodcentered ; B 225 245 375 377 ; +C 184 ; WX 600 ; N cedilla ; B 216 -163 373 15 ; +C 185 ; WX 600 ; N onesuperior ; B 183 301 417 626 ; +C 186 ; WX 600 ; N ordmasculine ; B 144 355 454 640 ; +C 187 ; WX 600 ; N guillemotright ; B 62 0 552 424 ; +C 188 ; WX 600 ; N onequarter ; B 0 0 595 626 ; +C 189 ; WX 600 ; N onehalf ; B 0 0 606 626 ; +C 190 ; WX 600 ; N threequarters ; B 0 0 592 627 ; +C 191 ; WX 600 ; N questiondown ; B 0 -191 355 433 ; +C 192 ; WX 600 ; N Agrave ; B 8 0 593 779 ; +C 193 ; WX 600 ; N Aacute ; B 8 0 593 779 ; +C 194 ; WX 600 ; N Acircumflex ; B 8 0 593 771 ; +C 195 ; WX 600 ; N Atilde ; B 8 0 593 720 ; +C 196 ; WX 600 ; N Adieresis ; B 8 0 593 730 ; +C 197 ; WX 600 ; N Aring ; B 8 0 593 783 ; +C 198 ; WX 600 ; N AE ; B 9 0 592 571 ; +C 199 ; WX 600 ; N Ccedilla ; B 62 -163 537 584 ; +C 200 ; WX 600 ; N Egrave ; B 43 0 523 779 ; +C 201 ; WX 600 ; N Eacute ; B 43 0 523 779 ; +C 202 ; WX 600 ; N Ecircumflex ; B 43 0 523 770 ; +C 203 ; WX 600 ; N Edieresis ; B 43 0 523 730 ; +C 204 ; WX 600 ; N Igrave ; B 112 0 489 779 ; +C 205 ; WX 600 ; N Iacute ; B 112 0 489 779 ; +C 206 ; WX 600 ; N Icircumflex ; B 112 0 489 770 ; +C 207 ; WX 600 ; N Idieresis ; B 112 0 489 730 ; +C 208 ; WX 600 ; N Eth ; B -1 0 523 571 ; +C 209 ; WX 600 ; N Ntilde ; B 22 0 563 720 ; +C 210 ; WX 600 ; N Ograve ; B 0 -16 500 779 ; +C 211 ; WX 600 ; N Oacute ; B 0 -16 500 779 ; +C 212 ; WX 600 ; N Ocircumflex ; B 0 -16 500 770 ; +C 213 ; WX 600 ; N Otilde ; B 0 -16 500 720 ; +C 214 ; WX 600 ; N Odieresis ; B 0 -16 500 730 ; +C 215 ; WX 600 ; N multiply ; B 132 117 469 454 ; +C 216 ; WX 600 ; N Oslash ; B 39 -41 561 611 ; +C 217 ; WX 600 ; N Ugrave ; B 41 -16 561 779 ; +C 218 ; WX 600 ; N Uacute ; B 41 -16 561 779 ; +C 219 ; WX 600 ; N Ucircumflex ; B 41 -16 561 770 ; +C 220 ; WX 600 ; N Udieresis ; B 41 -16 561 730 ; +C 221 ; WX 600 ; N Yacute ; B 48 0 551 775 ; +C 222 ; WX 600 ; N Thorn ; B 87 0 544 571 ; +C 223 ; WX 600 ; N germandbls ; B 43 -16 503 613 ; +C 224 ; WX 600 ; N agrave ; B 70 -16 542 648 ; +C 225 ; WX 600 ; N aacute ; B 70 -16 542 648 ; +C 226 ; WX 600 ; N acircumflex ; B 70 -16 542 640 ; +C 227 ; WX 600 ; N atilde ; B 70 -16 542 589 ; +C 228 ; WX 600 ; N adieresis ; B 70 -16 542 600 ; +C 229 ; WX 600 ; N aring ; B 70 -16 542 666 ; +C 230 ; WX 600 ; N ae ; B 8 -16 582 438 ; +C 231 ; WX 600 ; N ccedilla ; B 83 -163 537 438 ; +C 232 ; WX 600 ; N egrave ; B 63 -16 523 649 ; +C 233 ; WX 600 ; N eacute ; B 63 -16 523 649 ; +C 234 ; WX 600 ; N ecircumflex ; B 63 -16 523 640 ; +C 235 ; WX 600 ; N edieresis ; B 63 -16 523 600 ; +C 236 ; WX 600 ; N igrave ; B 91 0 511 645 ; +C 237 ; WX 600 ; N iacute ; B 91 0 511 648 ; +C 238 ; WX 600 ; N icircumflex ; B 91 0 511 640 ; +C 239 ; WX 600 ; N idieresis ; B 91 0 511 600 ; +C 240 ; WX 600 ; N eth ; B 63 -15 522 610 ; +C 241 ; WX 600 ; N ntilde ; B 53 0 542 589 ; +C 242 ; WX 600 ; N ograve ; B 71 -16 529 649 ; +C 243 ; WX 600 ; N oacute ; B 71 -16 529 649 ; +C 244 ; WX 600 ; N ocircumflex ; B 71 -16 529 640 ; +C 245 ; WX 600 ; N otilde ; B 71 -16 529 589 ; +C 246 ; WX 600 ; N odieresis ; B 71 -16 529 600 ; +C 247 ; WX 600 ; N divide ; B 70 54 530 517 ; +C 248 ; WX 600 ; N oslash ; B 55 -42 548 462 ; +C 249 ; WX 600 ; N ugrave ; B 44 -16 543 649 ; +C 250 ; WX 600 ; N uacute ; B 44 -16 543 649 ; +C 251 ; WX 600 ; N ucircumflex ; B 44 -16 543 640 ; +C 252 ; WX 600 ; N udieresis ; B 44 -16 543 600 ; +C 253 ; WX 600 ; N yacute ; B 73 -188 574 649 ; +C 254 ; WX 600 ; N thorn ; B 22 -188 542 613 ; +C 255 ; WX 600 ; N ydieresis ; B 73 -188 574 600 ; +C -1 ; WX 0 ; N .null ; B 240 -15 360 627 ; +C -1 ; WX 600 ; N nonmarkingreturn ; B 240 -15 360 627 ; +C -1 ; WX 600 ; N notequal ; B 49 -35 551 607 ; +C -1 ; WX 600 ; N infinity ; B 53 194 547 413 ; +C -1 ; WX 600 ; N lessequal ; B 48 88 528 685 ; +C -1 ; WX 600 ; N greaterequal ; B 72 88 552 685 ; +C -1 ; WX 600 ; N partialdiff ; B 86 -15 488 613 ; +C -1 ; WX 600 ; N summation ; B 21 -188 538 613 ; +C -1 ; WX 600 ; N product ; B 26 -188 574 613 ; +C -1 ; WX 600 ; N pi1 ; B 82 0 518 423 ; +C -1 ; WX 600 ; N integral ; B 110 -128 490 573 ; +C -1 ; WX 600 ; N Ohm ; B 30 0 570 581 ; +C -1 ; WX 600 ; N radical ; B 67 -38 554 783 ; +C -1 ; WX 600 ; N approxequal ; B 91 128 509 441 ; +C -1 ; WX 600 ; N increment ; B 41 0 555 563 ; +C -1 ; WX 600 ; N lozenge ; B 76 0 525 694 ; +C -1 ; WX 600 ; N fraction ; B 50 141 550 478 ; +C -1 ; WX 600 ; N fi ; B 7 0 590 633 ; +C -1 ; WX 600 ; N fl ; B 9 0 595 613 ; +C -1 ; WX 600 ; N dotlessi ; B 91 0 511 423 ; +C -1 ; WX 600 ; N macron ; B 154 525 446 567 ; +C -1 ; WX 600 ; N breve ; B 153 497 447 634 ; +C -1 ; WX 600 ; N dotaccent ; B 250 510 350 610 ; +C -1 ; WX 600 ; N ring ; B 211 492 388 666 ; +C -1 ; WX 600 ; N hungarumlaut ; B 154 498 447 648 ; +C -1 ; WX 600 ; N ogonek ; B 229 -144 373 13 ; +C -1 ; WX 600 ; N caron ; B 154 492 446 634 ; +C -1 ; WX 600 ; N Lslash ; B 42 0 542 571 ; +C -1 ; WX 600 ; N lslash ; B 91 0 510 613 ; +C -1 ; WX 600 ; N minus ; B 70 265 530 306 ; +C -1 ; WX 600 ; N franc ; B 78 0 557 571 ; +C -1 ; WX 600 ; N Gbreve ; B 63 -16 565 763 ; +C -1 ; WX 600 ; N gbreve ; B 61 -188 562 634 ; +C -1 ; WX 600 ; N Idot ; B 112 0 489 739 ; +C -1 ; WX 600 ; N Scedilla ; B 90 -163 510 584 ; +C -1 ; WX 600 ; N scedilla ; B 101 -163 499 438 ; +C -1 ; WX 600 ; N Cacute ; B 62 -16 537 778 ; +C -1 ; WX 600 ; N cacute ; B 83 -16 537 649 ; +C -1 ; WX 600 ; N Ccaron ; B 62 -16 537 763 ; +C -1 ; WX 600 ; N ccaron ; B 83 -16 537 634 ; +C -1 ; WX 600 ; N dmacron ; B 62 -16 583 613 ; +C -1 ; WX 600 ; N middot ; B 346 284 446 384 ; +C -1 ; WX 600 ; N Abreve ; B 8 0 593 763 ; +C -1 ; WX 600 ; N abreve ; B 70 -16 542 634 ; +C -1 ; WX 600 ; N Aogonek ; B 8 -127 623 571 ; +C -1 ; WX 600 ; N aogonek ; B 70 -127 584 438 ; +C -1 ; WX 600 ; N Dcaron ; B 77 0 558 763 ; +C -1 ; WX 600 ; N dcaron ; B 62 -16 600 613 ; +C -1 ; WX 600 ; N Dslash ; B -1 0 523 571 ; +C -1 ; WX 600 ; N Eogonek ; B 43 -130 569 571 ; +C -1 ; WX 600 ; N eogonek ; B 63 -142 523 438 ; +C -1 ; WX 600 ; N Ecaron ; B 43 0 523 763 ; +C -1 ; WX 600 ; N ecaron ; B 63 -16 523 634 ; +C -1 ; WX 600 ; N Lacute ; B 63 0 543 778 ; +C -1 ; WX 600 ; N lacute ; B 91 0 510 799 ; +C -1 ; WX 600 ; N Lcaron ; B 63 0 543 571 ; +C -1 ; WX 600 ; N lcaron ; B 91 0 510 613 ; +C -1 ; WX 600 ; N Ldot ; B 63 0 543 571 ; +C -1 ; WX 600 ; N ldot ; B 91 0 510 613 ; +C -1 ; WX 600 ; N Nacute ; B 22 0 563 778 ; +C -1 ; WX 600 ; N nacute ; B 53 0 542 649 ; +C -1 ; WX 600 ; N Ncaron ; B 22 0 563 763 ; +C -1 ; WX 600 ; N ncaron ; B 53 0 542 634 ; +C -1 ; WX 600 ; N Odblacute ; B 0 -16 500 777 ; +C -1 ; WX 600 ; N odblacute ; B 71 -16 529 648 ; +C -1 ; WX 600 ; N Racute ; B 43 0 593 778 ; +C -1 ; WX 600 ; N racute ; B 83 0 544 649 ; +C -1 ; WX 600 ; N Rcaron ; B 43 0 593 763 ; +C -1 ; WX 600 ; N rcaron ; B 83 0 544 634 ; +C -1 ; WX 600 ; N Sacute ; B 90 -16 510 778 ; +C -1 ; WX 600 ; N sacute ; B 101 -16 499 649 ; +C -1 ; WX 600 ; N Tcedilla ; B 70 -215 529 571 ; +C -1 ; WX 600 ; N tcedilla ; B 71 -215 529 571 ; +C -1 ; WX 600 ; N Tcaron ; B 70 0 529 763 ; +C -1 ; WX 600 ; N tcaron ; B 71 -16 529 613 ; +C -1 ; WX 600 ; N Uring ; B 41 -16 561 795 ; +C -1 ; WX 600 ; N uring ; B 44 -16 543 666 ; +C -1 ; WX 600 ; N Udblacute ; B 41 -16 561 777 ; +C -1 ; WX 600 ; N udblacute ; B 44 -16 543 648 ; +C -1 ; WX 600 ; N Zacute ; B 104 0 499 778 ; +C -1 ; WX 600 ; N zacute ; B 116 0 491 649 ; +C -1 ; WX 600 ; N Zdot ; B 104 0 499 739 ; +C -1 ; WX 600 ; N zdot ; B 116 0 491 610 ; +C -1 ; WX 600 ; N Gamma ; B 62 0 542 571 ; +C -1 ; WX 600 ; N Theta ; B 50 -16 550 584 ; +C -1 ; WX 600 ; N Phi ; B 44 0 556 571 ; +C -1 ; WX 600 ; N alpha ; B 48 -16 555 438 ; +C -1 ; WX 600 ; N delta ; B 88 -16 514 613 ; +C -1 ; WX 600 ; N epsilon ; B 138 -16 478 438 ; +C -1 ; WX 600 ; N sigma ; B 74 -16 586 438 ; +C -1 ; WX 600 ; N tau ; B 102 -16 454 423 ; +C -1 ; WX 600 ; N phi ; B 60 -188 543 438 ; +C -1 ; WX 600 ; N underscoredbl ; B -13 -274 613 -145 ; +C -1 ; WX 600 ; N exclamdbl ; B 134 -15 467 627 ; +C -1 ; WX 600 ; N nsuperior ; B 138 245 448 522 ; +C -1 ; WX 600 ; N peseta ; B 7 -7 593 571 ; +C -1 ; WX 600 ; N arrowleft ; B 1 50 599 277 ; +C -1 ; WX 600 ; N arrowup ; B 186 -136 414 424 ; +C -1 ; WX 600 ; N arrowright ; B 1 50 599 277 ; +C -1 ; WX 600 ; N arrowdown ; B 186 -136 414 424 ; +C -1 ; WX 600 ; N arrowboth ; B 1 50 599 278 ; +C -1 ; WX 600 ; N arrowupdn ; B 186 -135 414 463 ; +C -1 ; WX 600 ; N arrowupdnbse ; B 186 -196 414 463 ; +C -1 ; WX 600 ; N orthogonal ; B 1 0 599 597 ; +C -1 ; WX 600 ; N intersection ; B 83 -16 518 584 ; +C -1 ; WX 600 ; N equivalence ; B 49 119 551 455 ; +C -1 ; WX 600 ; N house ; B 75 0 525 563 ; +C -1 ; WX 600 ; N revlogicalnot ; B 70 33 588 306 ; +C -1 ; WX 600 ; N integraltp ; B 264 -300 475 833 ; +C -1 ; WX 600 ; N integralbt ; B 125 -300 336 833 ; +C -1 ; WX 600 ; N SF100000 ; B 0 220 600 292 ; +C -1 ; WX 600 ; N SF110000 ; B 264 -300 336 833 ; +C -1 ; WX 600 ; N SF010000 ; B 264 -300 600 292 ; +C -1 ; WX 600 ; N SF030000 ; B 0 -300 336 292 ; +C -1 ; WX 600 ; N SF020000 ; B 264 220 600 833 ; +C -1 ; WX 600 ; N SF040000 ; B 0 220 336 833 ; +C -1 ; WX 600 ; N SF080000 ; B 264 -300 600 833 ; +C -1 ; WX 600 ; N SF090000 ; B 0 -300 336 833 ; +C -1 ; WX 600 ; N SF060000 ; B 0 -300 600 292 ; +C -1 ; WX 600 ; N SF070000 ; B 0 220 600 833 ; +C -1 ; WX 600 ; N SF050000 ; B 0 -300 600 833 ; +C -1 ; WX 600 ; N SF430000 ; B 0 142 600 370 ; +C -1 ; WX 600 ; N SF240000 ; B 186 -300 414 833 ; +C -1 ; WX 600 ; N SF510000 ; B 264 -300 600 370 ; +C -1 ; WX 600 ; N SF520000 ; B 186 -300 600 292 ; +C -1 ; WX 600 ; N SF390000 ; B 186 -300 600 370 ; +C -1 ; WX 600 ; N SF220000 ; B 0 -300 336 370 ; +C -1 ; WX 600 ; N SF210000 ; B 0 -300 414 292 ; +C -1 ; WX 600 ; N SF250000 ; B 0 -300 414 370 ; +C -1 ; WX 600 ; N SF500000 ; B 264 142 600 833 ; +C -1 ; WX 600 ; N SF490000 ; B 186 220 600 833 ; +C -1 ; WX 600 ; N SF380000 ; B 186 142 600 833 ; +C -1 ; WX 600 ; N SF280000 ; B 0 142 336 833 ; +C -1 ; WX 600 ; N SF270000 ; B 0 220 414 833 ; +C -1 ; WX 600 ; N SF260000 ; B 0 142 414 833 ; +C -1 ; WX 600 ; N SF360000 ; B 264 -300 600 833 ; +C -1 ; WX 600 ; N SF370000 ; B 186 -300 600 833 ; +C -1 ; WX 600 ; N SF420000 ; B 186 -300 600 833 ; +C -1 ; WX 600 ; N SF190000 ; B 0 -300 336 833 ; +C -1 ; WX 600 ; N SF200000 ; B 0 -300 414 833 ; +C -1 ; WX 600 ; N SF230000 ; B 0 -300 414 833 ; +C -1 ; WX 600 ; N SF470000 ; B 0 -300 600 370 ; +C -1 ; WX 600 ; N SF480000 ; B 0 -300 600 292 ; +C -1 ; WX 600 ; N SF410000 ; B 0 -300 600 370 ; +C -1 ; WX 600 ; N SF450000 ; B 0 142 600 833 ; +C -1 ; WX 600 ; N SF460000 ; B 0 220 600 833 ; +C -1 ; WX 600 ; N SF400000 ; B 0 142 600 833 ; +C -1 ; WX 600 ; N SF540000 ; B 0 -300 600 833 ; +C -1 ; WX 600 ; N SF530000 ; B 0 -300 600 833 ; +C -1 ; WX 600 ; N SF440000 ; B 0 -300 600 833 ; +C -1 ; WX 600 ; N upblock ; B 0 255 600 833 ; +C -1 ; WX 600 ; N dnblock ; B 0 -300 600 255 ; +C -1 ; WX 600 ; N block ; B 0 -300 600 833 ; +C -1 ; WX 600 ; N lfblock ; B 0 -300 300 833 ; +C -1 ; WX 600 ; N rtblock ; B 300 -300 600 833 ; +C -1 ; WX 600 ; N ltshade ; B 0 -300 600 833 ; +C -1 ; WX 600 ; N shade ; B 0 -300 600 833 ; +C -1 ; WX 600 ; N dkshade ; B 0 -300 600 833 ; +C -1 ; WX 600 ; N filledbox ; B 1 0 599 598 ; +C -1 ; WX 600 ; N filledrect ; B 1 193 599 306 ; +C -1 ; WX 600 ; N triagup ; B 7 0 592 585 ; +C -1 ; WX 600 ; N triagrt ; B 1 -13 599 584 ; +C -1 ; WX 600 ; N triagdn ; B 7 -13 592 572 ; +C -1 ; WX 600 ; N triaglf ; B 1 -13 599 584 ; +C -1 ; WX 600 ; N circle ; B 85 67 515 497 ; +C -1 ; WX 600 ; N invbullet ; B 61 0 539 479 ; +C -1 ; WX 600 ; N invcircle ; B 19 0 583 564 ; +C -1 ; WX 600 ; N smileface ; B 1 -13 599 584 ; +C -1 ; WX 600 ; N invsmileface ; B 1 -13 599 584 ; +C -1 ; WX 600 ; N sun ; B 1 -69 599 529 ; +C -1 ; WX 600 ; N female ; B 157 39 444 563 ; +C -1 ; WX 600 ; N male ; B 90 122 511 563 ; +C -1 ; WX 600 ; N spade ; B 63 0 537 601 ; +C -1 ; WX 600 ; N club ; B 1 0 599 597 ; +C -1 ; WX 600 ; N heart ; B 53 -11 547 559 ; +C -1 ; WX 600 ; N diamond ; B 78 -12 523 597 ; +C -1 ; WX 600 ; N musicalnote ; B 132 14 440 563 ; +C -1 ; WX 600 ; N musicalnotedbl ; B 44 -21 528 566 ; +C -1 ; WX 600 ; N IJ ; B 4 -16 596 571 ; +C -1 ; WX 600 ; N ij ; B 9 -188 498 633 ; +C -1 ; WX 600 ; N napostrophe ; B 0 0 542 613 ; +C -1 ; WX 600 ; N minute ; B 250 320 401 613 ; +C -1 ; WX 600 ; N second ; B 143 320 503 613 ; +C -1 ; WX 600 ; N afii61248 ; B 91 -12 510 623 ; +C -1 ; WX 600 ; N afii61289 ; B 157 -16 387 584 ; +C -1 ; WX 600 ; N H22073 ; B 1 0 599 598 ; +C -1 ; WX 600 ; N H18543 ; B 176 187 424 435 ; +C -1 ; WX 600 ; N H18551 ; B 176 187 424 435 ; +C -1 ; WX 600 ; N H18533 ; B 85 67 515 497 ; +C -1 ; WX 600 ; N openbullet ; B 179 190 421 432 ; +C -1 ; WX 600 ; N Amacron ; B 8 0 593 696 ; +C -1 ; WX 600 ; N amacron ; B 70 -16 542 567 ; +C -1 ; WX 600 ; N Ccircumflex ; B 62 -16 537 769 ; +C -1 ; WX 600 ; N ccircumflex ; B 83 -16 537 640 ; +C -1 ; WX 600 ; N Cdot ; B 62 -16 537 739 ; +C -1 ; WX 600 ; N cdot ; B 83 -16 537 610 ; +C -1 ; WX 600 ; N Emacron ; B 43 0 523 696 ; +C -1 ; WX 600 ; N emacron ; B 63 -16 523 567 ; +C -1 ; WX 600 ; N Ebreve ; B 43 0 523 763 ; +C -1 ; WX 600 ; N ebreve ; B 63 -16 523 634 ; +C -1 ; WX 600 ; N Edot ; B 43 0 523 739 ; +C -1 ; WX 600 ; N edot ; B 63 -16 523 610 ; +C -1 ; WX 600 ; N Gcircumflex ; B 63 -16 565 769 ; +C -1 ; WX 600 ; N gcircumflex ; B 61 -188 562 640 ; +C -1 ; WX 600 ; N Gdot ; B 63 -16 565 739 ; +C -1 ; WX 600 ; N gdot ; B 61 -188 562 610 ; +C -1 ; WX 600 ; N Gcedilla ; B 63 -163 565 584 ; +C -1 ; WX 600 ; N gcedilla ; B 61 -188 562 661 ; +C -1 ; WX 600 ; N Hcircumflex ; B 52 0 554 769 ; +C -1 ; WX 600 ; N hcircumflex ; B 42 0 553 769 ; +C -1 ; WX 600 ; N Hbar ; B 52 0 554 571 ; +C -1 ; WX 600 ; N hbar ; B 30 0 554 613 ; +C -1 ; WX 600 ; N Itilde ; B 112 0 489 719 ; +C -1 ; WX 600 ; N itilde ; B 91 0 512 589 ; +C -1 ; WX 600 ; N Imacron ; B 112 0 489 696 ; +C -1 ; WX 600 ; N imacron ; B 91 0 512 567 ; +C -1 ; WX 600 ; N Ibreve ; B 112 0 489 763 ; +C -1 ; WX 600 ; N ibreve ; B 91 0 512 634 ; +C -1 ; WX 600 ; N Iogonek ; B 112 -142 489 571 ; +C -1 ; WX 600 ; N iogonek ; B 92 -142 511 633 ; +C -1 ; WX 600 ; N Jcircumflex ; B 83 -16 585 769 ; +C -1 ; WX 600 ; N jcircumflex ; B 88 -188 432 640 ; +C -1 ; WX 600 ; N Kcedilla ; B 43 -163 575 571 ; +C -1 ; WX 600 ; N kcedilla ; B 93 -163 572 613 ; +C -1 ; WX 600 ; N kgreenlandic ; B 71 0 528 423 ; +C -1 ; WX 600 ; N Lcedilla ; B 63 -163 543 571 ; +C -1 ; WX 600 ; N lcedilla ; B 91 -163 510 613 ; +C -1 ; WX 600 ; N Ncedilla ; B 22 -163 563 571 ; +C -1 ; WX 600 ; N ncedilla ; B 53 -163 542 438 ; +C -1 ; WX 600 ; N Eng ; B 63 -16 541 585 ; +C -1 ; WX 600 ; N eng ; B 53 -188 480 438 ; +C -1 ; WX 600 ; N Omacron ; B 0 -16 500 696 ; +C -1 ; WX 600 ; N omacron ; B 71 -16 529 567 ; +C -1 ; WX 600 ; N Obreve ; B 0 -16 500 763 ; +C -1 ; WX 600 ; N obreve ; B 71 -16 529 634 ; +C -1 ; WX 600 ; N Rcedilla ; B 43 -163 593 571 ; +C -1 ; WX 600 ; N rcedilla ; B 83 -163 544 433 ; +C -1 ; WX 600 ; N Scircumflex ; B 90 -16 510 769 ; +C -1 ; WX 600 ; N scircumflex ; B 101 -16 499 640 ; +C -1 ; WX 600 ; N Tbar ; B 70 0 529 571 ; +C -1 ; WX 600 ; N tbar ; B 60 -16 529 571 ; +C -1 ; WX 600 ; N Utilde ; B 41 -16 561 733 ; +C -1 ; WX 600 ; N utilde ; B 44 -16 543 589 ; +C -1 ; WX 600 ; N Umacron ; B 41 -16 561 696 ; +C -1 ; WX 600 ; N umacron ; B 44 -16 543 567 ; +C -1 ; WX 600 ; N Ubreve ; B 41 -16 561 763 ; +C -1 ; WX 600 ; N ubreve ; B 44 -16 543 634 ; +C -1 ; WX 600 ; N Uogonek ; B 41 -142 561 571 ; +C -1 ; WX 600 ; N uogonek ; B 44 -142 577 423 ; +C -1 ; WX 600 ; N Wcircumflex ; B 18 0 580 769 ; +C -1 ; WX 600 ; N wcircumflex ; B 27 0 572 640 ; +C -1 ; WX 600 ; N Ycircumflex ; B 48 0 551 769 ; +C -1 ; WX 600 ; N ycircumflex ; B 73 -188 574 640 ; +C -1 ; WX 600 ; N longs ; B 105 0 544 613 ; +C -1 ; WX 600 ; N Aringacute ; B 8 0 593 951 ; +C -1 ; WX 600 ; N aringacute ; B 70 -16 542 834 ; +C -1 ; WX 600 ; N AEacute ; B 9 0 592 778 ; +C -1 ; WX 600 ; N aeacute ; B 8 -16 582 649 ; +C -1 ; WX 600 ; N Oslashacute ; B 39 -41 561 778 ; +C -1 ; WX 600 ; N oslashacute ; B 55 -42 548 649 ; +C -1 ; WX 600 ; N anoteleia ; B 225 245 375 377 ; +C -1 ; WX 600 ; N Wgrave ; B 18 0 580 778 ; +C -1 ; WX 600 ; N wgrave ; B 27 0 572 649 ; +C -1 ; WX 600 ; N Wacute ; B 18 0 580 778 ; +C -1 ; WX 600 ; N wacute ; B 27 0 572 649 ; +C -1 ; WX 600 ; N Wdieresis ; B 18 0 580 729 ; +C -1 ; WX 600 ; N wdieresis ; B 27 0 572 600 ; +C -1 ; WX 600 ; N Ygrave ; B 48 0 551 778 ; +C -1 ; WX 600 ; N ygrave ; B 73 -188 574 649 ; +C -1 ; WX 600 ; N quotereversed ; B 249 319 455 613 ; +C -1 ; WX 600 ; N radicalex ; B 154 525 446 567 ; +C -1 ; WX 600 ; N afii08941 ; B 66 0 522 587 ; +C -1 ; WX 600 ; N estimated ; B 44 -17 561 535 ; +C -1 ; WX 600 ; N oneeighth ; B 6 -7 593 626 ; +C -1 ; WX 600 ; N threeeighths ; B 8 -7 592 627 ; +C -1 ; WX 600 ; N fiveeighths ; B 5 -7 592 620 ; +C -1 ; WX 600 ; N seveneighths ; B 13 -7 592 620 ; +C -1 ; WX 600 ; N commaaccent ; B 254 -215 346 -53 ; +C -1 ; WX 600 ; N undercommaaccent ; B 229 -163 373 -49 ; +C -1 ; WX 600 ; N tonos ; B 216 499 383 649 ; +C -1 ; WX 600 ; N dieresistonos ; B 129 499 471 649 ; +C -1 ; WX 600 ; N Alphatonos ; B 31 0 617 571 ; +C -1 ; WX 600 ; N Epsilontonos ; B -2 0 565 571 ; +C -1 ; WX 600 ; N Etatonos ; B 9 0 586 571 ; +C -1 ; WX 600 ; N Iotatonos ; B 32 0 513 571 ; +C -1 ; WX 600 ; N Omicrontonos ; B -5 -16 566 584 ; +C -1 ; WX 600 ; N Upsilontonos ; B 21 0 575 571 ; +C -1 ; WX 600 ; N Omegatonos ; B -21 0 587 584 ; +C -1 ; WX 600 ; N iotadieresistonos ; B 118 -16 460 649 ; +C -1 ; WX 600 ; N Alpha ; B 8 0 593 571 ; +C -1 ; WX 600 ; N Beta ; B 42 0 543 571 ; +C -1 ; WX 600 ; N Delta ; B 49 0 550 571 ; +C -1 ; WX 600 ; N Epsilon ; B 43 0 523 571 ; +C -1 ; WX 600 ; N Zeta ; B 104 0 499 571 ; +C -1 ; WX 600 ; N Eta ; B 52 0 554 571 ; +C -1 ; WX 600 ; N Iota ; B 112 0 489 571 ; +C -1 ; WX 600 ; N Kappa ; B 43 0 575 571 ; +C -1 ; WX 600 ; N Lambda ; B 7 0 592 571 ; +C -1 ; WX 600 ; N Mu ; B 12 0 594 571 ; +C -1 ; WX 600 ; N Nu ; B 22 0 563 571 ; +C -1 ; WX 600 ; N Xi ; B 72 0 528 571 ; +C -1 ; WX 600 ; N Omicron ; B 0 -16 500 584 ; +C -1 ; WX 600 ; N Pi ; B 49 0 551 571 ; +C -1 ; WX 600 ; N Rho ; B 87 0 544 571 ; +C -1 ; WX 600 ; N Sigma ; B 96 0 489 571 ; +C -1 ; WX 600 ; N Tau ; B 70 0 529 571 ; +C -1 ; WX 600 ; N Upsilon ; B 48 0 551 571 ; +C -1 ; WX 600 ; N Chi ; B 39 0 563 571 ; +C -1 ; WX 600 ; N Psi ; B 14 0 586 571 ; +C -1 ; WX 600 ; N Omega ; B 29 0 570 584 ; +C -1 ; WX 600 ; N Iotadieresis ; B 112 0 489 729 ; +C -1 ; WX 600 ; N Upsilondieresis ; B 48 0 551 729 ; +C -1 ; WX 600 ; N alphatonos ; B 48 -16 555 649 ; +C -1 ; WX 600 ; N epsilontonos ; B 138 -16 478 649 ; +C -1 ; WX 600 ; N etatonos ; B 68 -188 496 649 ; +C -1 ; WX 600 ; N iotatonos ; B 216 -16 429 649 ; +C -1 ; WX 600 ; N upsilondieresistonos ; B 42 -16 558 649 ; +C -1 ; WX 600 ; N beta ; B 127 -188 507 613 ; +C -1 ; WX 600 ; N gamma ; B 34 -188 594 423 ; +C -1 ; WX 600 ; N zeta ; B 167 -188 492 613 ; +C -1 ; WX 600 ; N eta ; B 68 -188 496 438 ; +C -1 ; WX 600 ; N theta ; B 87 -16 513 613 ; +C -1 ; WX 600 ; N iota ; B 257 -16 429 438 ; +C -1 ; WX 600 ; N kappa ; B 77 0 551 423 ; +C -1 ; WX 600 ; N lambda ; B 32 0 585 613 ; +C -1 ; WX 600 ; N mu ; B 41 -188 557 423 ; +C -1 ; WX 600 ; N nu ; B 36 0 499 438 ; +C -1 ; WX 600 ; N xi ; B 159 -188 491 613 ; +C -1 ; WX 600 ; N omicron ; B 71 -16 529 438 ; +C -1 ; WX 600 ; N rho ; B 99 -188 542 438 ; +C -1 ; WX 600 ; N sigma1 ; B 101 -188 536 438 ; +C -1 ; WX 600 ; N upsilon ; B 42 -16 558 423 ; +C -1 ; WX 600 ; N chi ; B 75 -188 550 438 ; +C -1 ; WX 600 ; N psi ; B 34 -188 566 613 ; +C -1 ; WX 600 ; N omega ; B 57 -16 543 438 ; +C -1 ; WX 600 ; N iotadieresis ; B 145 -16 434 579 ; +C -1 ; WX 600 ; N upsilondieresis ; B 42 -16 558 579 ; +C -1 ; WX 600 ; N omicrontonos ; B 71 -16 529 649 ; +C -1 ; WX 600 ; N upsilontonos ; B 42 -16 558 649 ; +C -1 ; WX 600 ; N omegatonos ; B 57 -16 543 649 ; +C -1 ; WX 600 ; N afii10023 ; B 43 0 523 730 ; +C -1 ; WX 600 ; N afii10051 ; B 8 -16 569 571 ; +C -1 ; WX 600 ; N afii10053 ; B 62 -16 537 584 ; +C -1 ; WX 600 ; N afii10054 ; B 90 -16 510 584 ; +C -1 ; WX 600 ; N afii10055 ; B 112 0 489 571 ; +C -1 ; WX 600 ; N afii10056 ; B 112 0 489 730 ; +C -1 ; WX 600 ; N afii10057 ; B 83 -16 585 571 ; +C -1 ; WX 600 ; N afii10058 ; B 17 -16 580 571 ; +C -1 ; WX 600 ; N afii10059 ; B 0 0 600 571 ; +C -1 ; WX 600 ; N afii10060 ; B 8 0 588 571 ; +C -1 ; WX 600 ; N afii10062 ; B 21 -17 591 763 ; +C -1 ; WX 600 ; N afii10017 ; B 8 0 593 571 ; +C -1 ; WX 600 ; N afii10018 ; B 42 0 543 571 ; +C -1 ; WX 600 ; N afii10019 ; B 42 0 543 571 ; +C -1 ; WX 600 ; N afii10020 ; B 62 0 542 571 ; +C -1 ; WX 600 ; N afii10021 ; B 36 -140 563 571 ; +C -1 ; WX 600 ; N afii10022 ; B 43 0 523 571 ; +C -1 ; WX 600 ; N afii10024 ; B -2 0 603 571 ; +C -1 ; WX 600 ; N afii10025 ; B 56 -16 534 584 ; +C -1 ; WX 600 ; N afii10026 ; B 20 0 581 571 ; +C -1 ; WX 600 ; N afii10027 ; B 20 0 581 763 ; +C -1 ; WX 600 ; N afii10028 ; B 58 0 587 572 ; +C -1 ; WX 600 ; N afii10029 ; B 17 -16 564 571 ; +C -1 ; WX 600 ; N afii10030 ; B 12 0 594 571 ; +C -1 ; WX 600 ; N afii10031 ; B 52 0 554 571 ; +C -1 ; WX 600 ; N afii10032 ; B 0 -16 500 584 ; +C -1 ; WX 600 ; N afii10033 ; B 49 0 551 571 ; +C -1 ; WX 600 ; N afii10034 ; B 87 0 544 571 ; +C -1 ; WX 600 ; N afii10035 ; B 62 -16 537 584 ; +C -1 ; WX 600 ; N afii10036 ; B 70 0 529 571 ; +C -1 ; WX 600 ; N afii10037 ; B 21 -17 591 571 ; +C -1 ; WX 600 ; N afii10038 ; B 48 0 552 572 ; +C -1 ; WX 600 ; N afii10039 ; B 39 0 563 571 ; +C -1 ; WX 600 ; N afii10040 ; B 43 -140 559 571 ; +C -1 ; WX 600 ; N afii10041 ; B 20 0 547 571 ; +C -1 ; WX 600 ; N afii10042 ; B 2 0 593 571 ; +C -1 ; WX 600 ; N afii10043 ; B 2 -140 605 571 ; +C -1 ; WX 600 ; N afii10044 ; B 1 0 584 571 ; +C -1 ; WX 600 ; N afii10045 ; B 1 0 597 571 ; +C -1 ; WX 600 ; N afii10046 ; B 42 0 543 571 ; +C -1 ; WX 600 ; N afii10047 ; B 63 -16 538 584 ; +C -1 ; WX 600 ; N afii10048 ; B 11 -16 594 584 ; +C -1 ; WX 600 ; N afii10049 ; B 7 0 557 571 ; +C -1 ; WX 600 ; N afii10065 ; B 70 -16 542 438 ; +C -1 ; WX 600 ; N afii10066 ; B 63 -16 543 601 ; +C -1 ; WX 600 ; N afii10067 ; B 60 0 520 423 ; +C -1 ; WX 600 ; N afii10068 ; B 74 0 531 423 ; +C -1 ; WX 600 ; N afii10069 ; B 44 -103 556 423 ; +C -1 ; WX 600 ; N afii10070 ; B 63 -16 523 438 ; +C -1 ; WX 600 ; N afii10072 ; B 10 0 590 423 ; +C -1 ; WX 600 ; N afii10073 ; B 70 -16 534 438 ; +C -1 ; WX 600 ; N afii10074 ; B 28 0 572 423 ; +C -1 ; WX 600 ; N afii10075 ; B 28 0 572 614 ; +C -1 ; WX 600 ; N afii10076 ; B 59 0 572 423 ; +C -1 ; WX 600 ; N afii10077 ; B 25 -16 556 423 ; +C -1 ; WX 600 ; N afii10078 ; B 15 0 585 423 ; +C -1 ; WX 600 ; N afii10079 ; B 52 0 548 423 ; +C -1 ; WX 600 ; N afii10080 ; B 71 -16 529 438 ; +C -1 ; WX 600 ; N afii10081 ; B 52 0 548 423 ; +C -1 ; WX 600 ; N afii10082 ; B 22 -188 542 438 ; +C -1 ; WX 600 ; N afii10083 ; B 83 -16 537 438 ; +C -1 ; WX 600 ; N afii10084 ; B 81 0 519 423 ; +C -1 ; WX 600 ; N afii10085 ; B 29 -149 583 423 ; +C -1 ; WX 600 ; N afii10086 ; B 58 -156 542 601 ; +C -1 ; WX 600 ; N afii10087 ; B 49 0 552 423 ; +C -1 ; WX 600 ; N afii10088 ; B 38 -103 556 423 ; +C -1 ; WX 600 ; N afii10089 ; B 34 0 546 423 ; +C -1 ; WX 600 ; N afii10090 ; B 16 0 584 423 ; +C -1 ; WX 600 ; N afii10091 ; B 16 -103 600 423 ; +C -1 ; WX 600 ; N afii10092 ; B 37 0 568 423 ; +C -1 ; WX 600 ; N afii10093 ; B 12 0 597 423 ; +C -1 ; WX 600 ; N afii10094 ; B 81 0 485 423 ; +C -1 ; WX 600 ; N afii10095 ; B 63 -16 517 438 ; +C -1 ; WX 600 ; N afii10096 ; B 18 -16 582 438 ; +C -1 ; WX 600 ; N afii10097 ; B 64 0 531 423 ; +C -1 ; WX 600 ; N afii10071 ; B 63 -16 523 600 ; +C -1 ; WX 600 ; N afii10099 ; B 69 -188 519 613 ; +C -1 ; WX 600 ; N afii10100 ; B 74 0 531 649 ; +C -1 ; WX 600 ; N afii10101 ; B 83 -16 537 438 ; +C -1 ; WX 600 ; N afii10102 ; B 101 -16 499 438 ; +C -1 ; WX 600 ; N afii10103 ; B 92 0 511 633 ; +C -1 ; WX 600 ; N afii10104 ; B 91 0 511 600 ; +C -1 ; WX 600 ; N afii10105 ; B 88 -188 402 633 ; +C -1 ; WX 600 ; N afii10106 ; B 25 -16 572 423 ; +C -1 ; WX 600 ; N afii10107 ; B -9 0 609 423 ; +C -1 ; WX 600 ; N afii10108 ; B 30 0 554 613 ; +C -1 ; WX 600 ; N afii10110 ; B 29 -149 583 614 ; +C -1 ; WX 600 ; N afii10193 ; B 52 -140 548 423 ; +C -1 ; WX 600 ; N afii10050 ; B 62 0 542 703 ; +C -1 ; WX 600 ; N afii10098 ; B 74 0 531 554 ; +C -1 ; WX 600 ; N afii00208 ; B 21 266 580 307 ; +C -1 ; WX 600 ; N afii61352 ; B 24 0 572 571 ; +C -1 ; WX 600 ; N pi ; B 51 0 549 423 ; +C -1 ; WX 600 ; N sheva ; B 268 -261 333 -82 ; +C -1 ; WX 600 ; N hatafsegol ; B 161 -261 438 -82 ; +C -1 ; WX 600 ; N hatafpatah ; B 161 -261 431 -82 ; +C -1 ; WX 600 ; N hatafqamats ; B 161 -261 431 -82 ; +C -1 ; WX 600 ; N hiriq ; B 268 -147 333 -83 ; +C -1 ; WX 600 ; N tsere ; B 214 -147 386 -82 ; +C -1 ; WX 600 ; N segol ; B 214 -261 386 -83 ; +C -1 ; WX 600 ; N patah ; B 199 -130 400 -83 ; +C -1 ; WX 600 ; N qamats ; B 199 -215 400 -83 ; +C -1 ; WX 600 ; N holam ; B 268 559 333 628 ; +C -1 ; WX 600 ; N qubuts ; B 162 -261 438 -82 ; +C -1 ; WX 600 ; N dagesh ; B 268 222 333 290 ; +C -1 ; WX 600 ; N meteg ; B 276 -261 324 -82 ; +C -1 ; WX 600 ; N maqaf ; B 88 437 512 478 ; +C -1 ; WX 600 ; N rafe ; B 199 560 400 607 ; +C -1 ; WX 600 ; N paseq ; B 279 -5 320 484 ; +C -1 ; WX 600 ; N shindot ; B 443 560 510 625 ; +C -1 ; WX 600 ; N sindot ; B 90 560 155 627 ; +C -1 ; WX 600 ; N sofpasuq ; B 225 -6 375 486 ; +C -1 ; WX 600 ; N alef ; B 102 -6 502 492 ; +C -1 ; WX 600 ; N bet ; B 77 0 522 478 ; +C -1 ; WX 600 ; N gimel ; B 135 -5 446 478 ; +C -1 ; WX 600 ; N dalet ; B 80 -5 522 478 ; +C -1 ; WX 600 ; N he ; B 78 -5 499 478 ; +C -1 ; WX 600 ; N vav ; B 183 -5 338 478 ; +C -1 ; WX 600 ; N zayin ; B 161 -5 445 478 ; +C -1 ; WX 600 ; N het ; B 71 -5 529 478 ; +C -1 ; WX 600 ; N tet ; B 51 -5 499 483 ; +C -1 ; WX 600 ; N yod ; B 181 263 343 478 ; +C -1 ; WX 600 ; N finalkaf ; B 73 -109 519 478 ; +C -1 ; WX 600 ; N kaf ; B 88 0 496 478 ; +C -1 ; WX 600 ; N lamed ; B 94 0 463 629 ; +C -1 ; WX 600 ; N finalmem ; B 53 0 486 478 ; +C -1 ; WX 600 ; N mem ; B 65 -5 491 483 ; +C -1 ; WX 600 ; N finalnun ; B 183 -109 438 478 ; +C -1 ; WX 600 ; N nun ; B 139 0 374 478 ; +C -1 ; WX 600 ; N samekh ; B 39 -5 486 478 ; +C -1 ; WX 600 ; N ayin ; B 94 0 480 478 ; +C -1 ; WX 600 ; N finalpe ; B 118 -109 540 478 ; +C -1 ; WX 600 ; N pe ; B 122 0 468 478 ; +C -1 ; WX 600 ; N finaltsadi ; B 108 -109 474 478 ; +C -1 ; WX 600 ; N tsadi ; B 79 0 466 478 ; +C -1 ; WX 600 ; N qof ; B 96 -204 497 478 ; +C -1 ; WX 600 ; N resh ; B 84 -5 465 478 ; +C -1 ; WX 600 ; N shin ; B 100 0 500 483 ; +C -1 ; WX 600 ; N tav ; B 78 -5 486 478 ; +C -1 ; WX 600 ; N doublevav ; B 60 -5 479 478 ; +C -1 ; WX 600 ; N vavyod ; B 65 -5 479 478 ; +C -1 ; WX 600 ; N doubleyod ; B 65 263 479 478 ; +C -1 ; WX 600 ; N geresh ; B 218 246 382 483 ; +C -1 ; WX 600 ; N gershayim ; B 121 246 479 483 ; +C -1 ; WX 600 ; N newsheqelsign ; B 44 -5 556 481 ; +C -1 ; WX 600 ; N vavshindot ; B 113 -5 338 630 ; +C -1 ; WX 600 ; N finalkafsheva ; B 73 -109 519 478 ; +C -1 ; WX 600 ; N finalkafqamats ; B 73 -109 519 478 ; +C -1 ; WX 600 ; N lamedholam ; B 0 0 463 629 ; +C -1 ; WX 600 ; N lamedholamdagesh ; B 0 0 463 629 ; +C -1 ; WX 600 ; N altayin ; B 94 0 480 478 ; +C -1 ; WX 600 ; N shinshindot ; B 100 0 503 628 ; +C -1 ; WX 600 ; N shinsindot ; B 90 0 500 628 ; +C -1 ; WX 600 ; N shindageshshindot ; B 100 0 503 628 ; +C -1 ; WX 600 ; N shindageshsindot ; B 90 0 500 628 ; +C -1 ; WX 600 ; N alefpatah ; B 102 -130 502 492 ; +C -1 ; WX 600 ; N alefqamats ; B 102 -215 502 492 ; +C -1 ; WX 600 ; N alefmapiq ; B 102 -6 502 492 ; +C -1 ; WX 600 ; N betdagesh ; B 77 0 522 478 ; +C -1 ; WX 600 ; N gimeldagesh ; B 135 -5 446 478 ; +C -1 ; WX 600 ; N daletdagesh ; B 80 -5 522 478 ; +C -1 ; WX 600 ; N hedagesh ; B 78 -5 499 478 ; +C -1 ; WX 600 ; N vavdagesh ; B 174 -5 338 478 ; +C -1 ; WX 600 ; N zayindagesh ; B 152 -5 445 478 ; +C -1 ; WX 600 ; N tetdagesh ; B 51 -5 499 483 ; +C -1 ; WX 600 ; N yoddagesh ; B 181 263 343 478 ; +C -1 ; WX 600 ; N finalkafdagesh ; B 73 -109 519 478 ; +C -1 ; WX 600 ; N kafdagesh ; B 88 0 496 478 ; +C -1 ; WX 600 ; N lameddagesh ; B 94 0 463 629 ; +C -1 ; WX 600 ; N memdagesh ; B 65 -5 491 483 ; +C -1 ; WX 600 ; N nundagesh ; B 139 0 374 478 ; +C -1 ; WX 600 ; N samekhdagesh ; B 39 -5 486 478 ; +C -1 ; WX 600 ; N finalpedagesh ; B 118 -109 540 478 ; +C -1 ; WX 600 ; N pedagesh ; B 122 0 468 478 ; +C -1 ; WX 600 ; N tsadidagesh ; B 79 0 466 478 ; +C -1 ; WX 600 ; N qofdagesh ; B 96 -204 497 478 ; +C -1 ; WX 600 ; N reshdagesh ; B 84 -5 465 478 ; +C -1 ; WX 600 ; N shindagesh ; B 100 0 500 483 ; +C -1 ; WX 600 ; N tavdages ; B 78 -5 486 478 ; +C -1 ; WX 600 ; N vavholam ; B 183 -5 342 628 ; +C -1 ; WX 600 ; N betrafe ; B 77 0 522 607 ; +C -1 ; WX 600 ; N kafrafe ; B 88 0 496 607 ; +C -1 ; WX 600 ; N perafe ; B 122 0 468 607 ; +C -1 ; WX 600 ; N aleflamed ; B 84 -6 502 629 ; +C -1 ; WX 600 ; N zerowidthnonjoiner ; B 283 -134 318 629 ; +C -1 ; WX 600 ; N zerowidthjoiner ; B 193 -134 407 690 ; +C -1 ; WX 600 ; N lefttorightmark ; B 172 -134 458 690 ; +C -1 ; WX 600 ; N righttoleftmark ; B 143 -134 429 690 ; +C -1 ; WX 600 ; N afii57388 ; B 222 -6 377 243 ; +C -1 ; WX 600 ; N afii57403 ; B 222 0 377 512 ; +C -1 ; WX 600 ; N afii57407 ; B 123 -18 478 583 ; +C -1 ; WX 600 ; N afii57409 ; B 250 66 470 331 ; +C -1 ; WX 600 ; N afii57440 ; B 0 0 600 60 ; +C -1 ; WX 600 ; N afii57451 ; B 232 615 367 771 ; +C -1 ; WX 600 ; N afii57452 ; B 199 616 378 823 ; +C -1 ; WX 600 ; N afii57453 ; B 232 -241 367 -85 ; +C -1 ; WX 600 ; N afii57454 ; B 232 615 367 693 ; +C -1 ; WX 600 ; N afii57455 ; B 205 615 368 821 ; +C -1 ; WX 600 ; N afii57456 ; B 232 -165 367 -86 ; +C -1 ; WX 600 ; N afii57457 ; B 224 628 366 767 ; +C -1 ; WX 600 ; N afii57458 ; B 232 638 354 780 ; +C -1 ; WX 600 ; N afii57392 ; B 231 189 369 393 ; +C -1 ; WX 600 ; N afii57393 ; B 174 -2 365 565 ; +C -1 ; WX 600 ; N afii57394 ; B 156 -2 421 567 ; +C -1 ; WX 600 ; N afii57395 ; B 119 -2 485 567 ; +C -1 ; WX 600 ; N afii57396 ; B 187 0 431 564 ; +C -1 ; WX 600 ; N afii57397 ; B 166 58 430 411 ; +C -1 ; WX 600 ; N afii57398 ; B 152 0 430 564 ; +C -1 ; WX 600 ; N afii57399 ; B 129 -3 471 568 ; +C -1 ; WX 600 ; N afii57400 ; B 128 -2 471 569 ; +C -1 ; WX 600 ; N afii57401 ; B 144 -3 429 567 ; +C -1 ; WX 600 ; N afii57381 ; B 73 -82 527 678 ; +C -1 ; WX 600 ; N afii57461 ; B 222 -124 377 125 ; +C -1 ; WX 600 ; N afii63167 ; B 112 1 487 360 ; +C -1 ; WX 600 ; N afii57459 ; B 286 653 318 881 ; +C -1 ; WX 600 ; N afii57543 ; B 227 601 361 783 ; +C -1 ; WX 600 ; N afii57534 ; B 244 -4 454 333 ; +C -1 ; WX 600 ; N afii57494 ; B 131 641 435 724 ; +C -1 ; WX 600 ; N afii62843 ; B 144 0 472 553 ; +C -1 ; WX 600 ; N afii62844 ; B 133 0 455 567 ; +C -1 ; WX 600 ; N afii62845 ; B 159 0 450 569 ; +C -1 ; WX 600 ; N afii64240 ; B 0 -200 572 581 ; +C -1 ; WX 600 ; N afii64241 ; B 0 -274 582 333 ; +C -1 ; WX 600 ; N afii63954 ; B 0 -207 580 533 ; +C -1 ; WX 600 ; N afii57382 ; B 0 -142 600 488 ; +C -1 ; WX 600 ; N afii64242 ; B 0 -43 600 462 ; +C -1 ; WX 600 ; N afii62881 ; B 224 628 366 898 ; +C -1 ; WX 600 ; N afii57504 ; B 251 -274 385 -92 ; +C -1 ; WX 600 ; N afii57369 ; B 250 -346 397 -92 ; +C -1 ; WX 600 ; N afii57370 ; B 251 -424 394 -92 ; +C -1 ; WX 600 ; N afii57371 ; B 204 601 360 882 ; +C -1 ; WX 600 ; N afii57372 ; B 205 601 361 960 ; +C -1 ; WX 600 ; N afii57373 ; B 208 601 360 954 ; +C -1 ; WX 600 ; N afii57374 ; B 178 601 359 1021 ; +C -1 ; WX 600 ; N afii57375 ; B 165 601 360 1014 ; +C -1 ; WX 600 ; N afii57391 ; B 0 0 600 60 ; +C -1 ; WX 600 ; N afii57471 ; B 201 622 396 787 ; +C -1 ; WX 600 ; N afii57460 ; B 173 29 368 763 ; +C -1 ; WX 600 ; N afii52258 ; B 172 0 600 763 ; +C -1 ; WX 600 ; N afii57506 ; B 18 -274 578 333 ; +C -1 ; WX 600 ; N afii62958 ; B 18 -274 600 328 ; +C -1 ; WX 600 ; N afii62956 ; B 0 -274 582 333 ; +C -1 ; WX 600 ; N afii52957 ; B 0 -274 600 329 ; +C -1 ; WX 600 ; N afii57505 ; B 5 -3 590 683 ; +C -1 ; WX 600 ; N afii62889 ; B 3 -33 600 608 ; +C -1 ; WX 600 ; N afii62887 ; B 0 0 589 672 ; +C -1 ; WX 600 ; N afii62888 ; B 0 0 600 632 ; +C -1 ; WX 600 ; N afii57507 ; B 133 -274 591 263 ; +C -1 ; WX 600 ; N afii62961 ; B 77 -274 601 323 ; +C -1 ; WX 600 ; N afii62959 ; B 0 -274 585 319 ; +C -1 ; WX 600 ; N afii62960 ; B 0 -274 600 323 ; +C -1 ; WX 600 ; N afii57508 ; B 70 -205 468 613 ; +C -1 ; WX 600 ; N afii62962 ; B 49 -206 600 598 ; +C -1 ; WX 600 ; N afii57567 ; B 1 -6 600 563 ; +C -1 ; WX 600 ; N afii62964 ; B 1 -6 600 564 ; +C -1 ; WX 600 ; N afii52305 ; B 0 0 600 566 ; +C -1 ; WX 600 ; N afii52306 ; B 0 0 600 566 ; +C -1 ; WX 600 ; N afii57509 ; B 5 -5 600 605 ; +C -1 ; WX 600 ; N afii62967 ; B 5 -4 600 613 ; +C -1 ; WX 600 ; N afii62965 ; B 0 0 600 609 ; +C -1 ; WX 600 ; N afii62966 ; B 0 0 600 611 ; +C -1 ; WX 600 ; N afii57555 ; B 83 -119 523 325 ; +C -1 ; WX 600 ; N afii52364 ; B 55 -274 600 60 ; +C -1 ; WX 600 ; N afii63753 ; B 117 -274 537 332 ; +C -1 ; WX 600 ; N afii63754 ; B 74 -274 526 308 ; +C -1 ; WX 600 ; N afii63759 ; B 117 -274 587 567 ; +C -1 ; WX 600 ; N afii63763 ; B 117 -274 583 623 ; +C -1 ; WX 600 ; N afii63795 ; B 77 -151 523 524 ; +C -1 ; WX 600 ; N afii62891 ; B 77 -274 523 524 ; +C -1 ; WX 600 ; N afii63808 ; B 93 -274 555 574 ; +C -1 ; WX 600 ; N afii62938 ; B 93 -274 555 574 ; +C -1 ; WX 600 ; N afii63810 ; B 93 -274 555 574 ; +C -1 ; WX 600 ; N afii62942 ; B 156 -274 454 582 ; +C -1 ; WX 600 ; N afii62947 ; B 70 -151 517 528 ; +C -1 ; WX 600 ; N afii63813 ; B 70 -274 517 528 ; +C -1 ; WX 600 ; N afii63823 ; B 117 -274 537 562 ; +C -1 ; WX 600 ; N afii63824 ; B 74 -151 521 489 ; +C -1 ; WX 600 ; N afii63833 ; B 117 -274 563 332 ; +C -1 ; WX 600 ; N afii63844 ; B 74 -274 543 308 ; +C -1 ; WX 600 ; N afii62882 ; B 189 627 368 951 ; +C -1 ; WX 600 ; N afii62883 ; B 229 612 371 910 ; +C -1 ; WX 600 ; N afii62884 ; B 222 626 364 821 ; +C -1 ; WX 600 ; N afii62885 ; B 207 626 370 951 ; +C -1 ; WX 600 ; N afii62886 ; B 224 612 366 831 ; +C -1 ; WX 600 ; N afii63846 ; B 0 -208 600 306 ; +C -1 ; WX 600 ; N afii63849 ; B 14 -196 600 445 ; +C -1 ; WX 600 ; N afii63850 ; B 21 -274 600 166 ; +C -1 ; WX 600 ; N afii63851 ; B 21 -274 600 166 ; +C -1 ; WX 600 ; N afii63852 ; B 0 -208 600 530 ; +C -1 ; WX 600 ; N afii63855 ; B 14 -187 600 520 ; +C -1 ; WX 600 ; N afii63856 ; B 21 -274 600 356 ; +C -1 ; WX 600 ; N afii63761 ; B 21 -274 600 357 ; +C -1 ; WX 600 ; N afii63882 ; B 21 -274 600 356 ; +C -1 ; WX 600 ; N afii63825 ; B 21 -274 600 357 ; +C -1 ; WX 600 ; N afii63885 ; B 0 -211 600 306 ; +C -1 ; WX 600 ; N afii63888 ; B 14 -255 600 484 ; +C -1 ; WX 600 ; N afii63896 ; B 0 -218 584 472 ; +C -1 ; WX 600 ; N afii63897 ; B 0 -125 584 472 ; +C -1 ; WX 600 ; N afii63898 ; B 0 -120 584 486 ; +C -1 ; WX 600 ; N afii63899 ; B 0 -206 541 406 ; +C -1 ; WX 600 ; N afii63900 ; B 0 -234 580 333 ; +C -1 ; WX 600 ; N afii63901 ; B 0 -208 584 668 ; +C -1 ; WX 600 ; N afii63902 ; B 0 0 584 668 ; +C -1 ; WX 600 ; N afii63903 ; B 0 0 584 668 ; +C -1 ; WX 600 ; N afii63904 ; B 0 0 551 585 ; +C -1 ; WX 600 ; N afii63905 ; B 0 -207 595 539 ; +C -1 ; WX 600 ; N afii63906 ; B 0 0 550 684 ; +C -1 ; WX 600 ; N afii63908 ; B 0 -3 600 462 ; +C -1 ; WX 600 ; N afii63910 ; B 0 -3 600 462 ; +C -1 ; WX 600 ; N afii63912 ; B 0 -3 600 619 ; +C -1 ; WX 600 ; N afii62927 ; B 0 0 600 512 ; +C -1 ; WX 600 ; N afii63941 ; B 0 -200 584 580 ; +C -1 ; WX 600 ; N afii62939 ; B 0 0 584 580 ; +C -1 ; WX 600 ; N afii63943 ; B 0 0 584 580 ; +C -1 ; WX 600 ; N afii62943 ; B 0 -51 583 569 ; +C -1 ; WX 600 ; N afii62946 ; B 0 -207 561 572 ; +C -1 ; WX 600 ; N afii63946 ; B 0 -158 557 428 ; +C -1 ; WX 600 ; N afii62951 ; B 0 0 557 428 ; +C -1 ; WX 600 ; N afii63948 ; B 0 0 557 444 ; +C -1 ; WX 600 ; N afii62953 ; B 0 0 547 432 ; +C -1 ; WX 600 ; N afii63950 ; B 0 -208 584 664 ; +C -1 ; WX 600 ; N afii63951 ; B 0 0 584 664 ; +C -1 ; WX 600 ; N afii63952 ; B 0 0 584 664 ; +C -1 ; WX 600 ; N afii63953 ; B 0 0 553 624 ; +C -1 ; WX 600 ; N afii63956 ; B 0 -3 600 587 ; +C -1 ; WX 600 ; N afii63958 ; B 0 -182 593 472 ; +C -1 ; WX 600 ; N afii63959 ; B 0 -54 593 472 ; +C -1 ; WX 600 ; N afii63960 ; B 0 -54 593 476 ; +C -1 ; WX 600 ; N afii63961 ; B 0 -203 586 406 ; +C -1 ; WX 600 ; N afii64046 ; B 0 0 600 705 ; +C -1 ; WX 600 ; N afii64058 ; B 201 0 600 771 ; +C -1 ; WX 600 ; N afii64059 ; B 201 29 336 771 ; +C -1 ; WX 600 ; N afii64060 ; B 295 -127 460 613 ; +C -1 ; WX 600 ; N afii64061 ; B 147 -127 312 613 ; +C -1 ; WX 600 ; N afii62945 ; B 0 0 572 581 ; +C -1 ; WX 600 ; N afii64184 ; B 10 0 575 643 ; +C -1 ; WX 600 ; N afii52399 ; B 250 66 470 331 ; +C -1 ; WX 600 ; N afii52400 ; B 130 29 434 700 ; +C -1 ; WX 600 ; N afii62753 ; B 99 0 600 696 ; +C -1 ; WX 600 ; N afii57411 ; B 199 29 333 783 ; +C -1 ; WX 600 ; N afii62754 ; B 199 0 600 783 ; +C -1 ; WX 600 ; N afii57412 ; B 96 -200 455 513 ; +C -1 ; WX 600 ; N afii62755 ; B 94 -200 600 513 ; +C -1 ; WX 600 ; N afii57413 ; B 217 -236 351 567 ; +C -1 ; WX 600 ; N afii62756 ; B 246 -261 600 562 ; +C -1 ; WX 600 ; N afii57414 ; B 83 -119 523 500 ; +C -1 ; WX 600 ; N afii62759 ; B 55 -274 600 335 ; +C -1 ; WX 600 ; N afii62757 ; B 0 0 580 553 ; +C -1 ; WX 600 ; N afii62758 ; B 0 0 600 551 ; +C -1 ; WX 600 ; N afii57415 ; B 250 29 306 567 ; +C -1 ; WX 600 ; N afii62760 ; B 246 0 600 562 ; +C -1 ; WX 600 ; N afii57416 ; B 18 -210 578 333 ; +C -1 ; WX 600 ; N afii62763 ; B 18 -221 600 328 ; +C -1 ; WX 600 ; N afii62761 ; B 0 -200 580 333 ; +C -1 ; WX 600 ; N afii62762 ; B 0 -217 600 329 ; +C -1 ; WX 600 ; N afii57417 ; B 223 -4 454 527 ; +C -1 ; WX 600 ; N afii62764 ; B 189 0 600 585 ; +C -1 ; WX 600 ; N afii57418 ; B 18 0 578 440 ; +C -1 ; WX 600 ; N afii62767 ; B 18 0 600 440 ; +C -1 ; WX 600 ; N afii62765 ; B 0 0 586 535 ; +C -1 ; WX 600 ; N afii62766 ; B 0 0 600 525 ; +C -1 ; WX 600 ; N afii57419 ; B 18 0 578 532 ; +C -1 ; WX 600 ; N afii62770 ; B 18 0 600 529 ; +C -1 ; WX 600 ; N afii62768 ; B 0 0 595 638 ; +C -1 ; WX 600 ; N afii62769 ; B 0 0 600 606 ; +C -1 ; WX 600 ; N afii57420 ; B 133 -274 591 263 ; +C -1 ; WX 600 ; N afii62773 ; B 77 -274 600 323 ; +C -1 ; WX 600 ; N afii62771 ; B 0 -200 585 319 ; +C -1 ; WX 600 ; N afii62772 ; B 0 -200 600 323 ; +C -1 ; WX 600 ; N afii57421 ; B 133 -274 591 263 ; +C -1 ; WX 600 ; N afii62776 ; B 77 -274 600 323 ; +C -1 ; WX 600 ; N afii62774 ; B 0 0 585 319 ; +C -1 ; WX 600 ; N afii62775 ; B 0 0 600 323 ; +C -1 ; WX 600 ; N afii57422 ; B 133 -274 591 498 ; +C -1 ; WX 600 ; N afii62779 ; B 77 -274 600 492 ; +C -1 ; WX 600 ; N afii62777 ; B 0 0 585 498 ; +C -1 ; WX 600 ; N afii62778 ; B 0 0 600 524 ; +C -1 ; WX 600 ; N afii57423 ; B 202 -6 491 397 ; +C -1 ; WX 600 ; N afii62780 ; B 165 0 600 415 ; +C -1 ; WX 600 ; N afii57424 ; B 202 -6 491 587 ; +C -1 ; WX 600 ; N afii62781 ; B 165 0 600 586 ; +C -1 ; WX 600 ; N afii57425 ; B 70 -205 468 324 ; +C -1 ; WX 600 ; N afii62782 ; B 49 -206 600 328 ; +C -1 ; WX 600 ; N afii57426 ; B 70 -205 468 516 ; +C -1 ; WX 600 ; N afii62783 ; B 49 -206 600 521 ; +C -1 ; WX 600 ; N afii57427 ; B 3 -181 560 329 ; +C -1 ; WX 600 ; N afii62786 ; B 3 -181 600 328 ; +C -1 ; WX 600 ; N afii62784 ; B 0 0 554 328 ; +C -1 ; WX 600 ; N afii62785 ; B 0 0 600 322 ; +C -1 ; WX 600 ; N afii57428 ; B 3 -181 560 574 ; +C -1 ; WX 600 ; N afii62789 ; B 3 -181 600 574 ; +C -1 ; WX 600 ; N afii62787 ; B 0 0 554 569 ; +C -1 ; WX 600 ; N afii62788 ; B 0 0 600 568 ; +C -1 ; WX 600 ; N afii57429 ; B 0 -188 595 305 ; +C -1 ; WX 600 ; N afii62792 ; B 0 -188 600 305 ; +C -1 ; WX 600 ; N afii62790 ; B 0 -1 573 302 ; +C -1 ; WX 600 ; N afii62791 ; B 0 -1 600 302 ; +C -1 ; WX 600 ; N afii57430 ; B 0 -188 595 478 ; +C -1 ; WX 600 ; N afii62795 ; B 0 -188 600 478 ; +C -1 ; WX 600 ; N afii62793 ; B 0 -1 573 481 ; +C -1 ; WX 600 ; N afii62794 ; B 0 -1 600 481 ; +C -1 ; WX 600 ; N afii57431 ; B 6 0 573 563 ; +C -1 ; WX 600 ; N afii62798 ; B 5 0 600 563 ; +C -1 ; WX 600 ; N afii62796 ; B 0 0 573 563 ; +C -1 ; WX 600 ; N afii62797 ; B 0 0 600 563 ; +C -1 ; WX 600 ; N afii57432 ; B 6 0 573 563 ; +C -1 ; WX 600 ; N afii62801 ; B 5 0 600 563 ; +C -1 ; WX 600 ; N afii62799 ; B 0 0 573 563 ; +C -1 ; WX 600 ; N afii62800 ; B 0 0 600 563 ; +C -1 ; WX 600 ; N afii57433 ; B 138 -274 596 331 ; +C -1 ; WX 600 ; N afii62804 ; B 139 -274 600 312 ; +C -1 ; WX 600 ; N afii62802 ; B 0 0 458 334 ; +C -1 ; WX 600 ; N afii62803 ; B 0 0 600 312 ; +C -1 ; WX 600 ; N afii57434 ; B 138 -274 596 548 ; +C -1 ; WX 600 ; N afii62807 ; B 139 -274 600 548 ; +C -1 ; WX 600 ; N afii62805 ; B 0 0 458 552 ; +C -1 ; WX 600 ; N afii62806 ; B 0 0 600 549 ; +C -1 ; WX 600 ; N afii57441 ; B 5 -3 590 586 ; +C -1 ; WX 600 ; N afii62810 ; B 3 -33 600 514 ; +C -1 ; WX 600 ; N afii62808 ; B 0 0 589 578 ; +C -1 ; WX 600 ; N afii62809 ; B 0 0 600 534 ; +C -1 ; WX 600 ; N afii57442 ; B 81 -187 563 520 ; +C -1 ; WX 600 ; N afii62813 ; B 104 -174 600 458 ; +C -1 ; WX 600 ; N afii62811 ; B 0 0 589 583 ; +C -1 ; WX 600 ; N afii62812 ; B 0 0 600 540 ; +C -1 ; WX 600 ; N afii57443 ; B 88 -9 590 575 ; +C -1 ; WX 600 ; N afii62816 ; B 27 -16 600 564 ; +C -1 ; WX 600 ; N afii57410 ; B 0 0 600 566 ; +C -1 ; WX 600 ; N afii62815 ; B 0 0 600 566 ; +C -1 ; WX 600 ; N afii57444 ; B 129 -98 552 567 ; +C -1 ; WX 600 ; N afii62819 ; B 55 -157 600 567 ; +C -1 ; WX 600 ; N afii62817 ; B 0 0 561 572 ; +C -1 ; WX 600 ; N afii62818 ; B 0 0 600 567 ; +C -1 ; WX 600 ; N afii57445 ; B 212 -274 600 289 ; +C -1 ; WX 600 ; N afii62822 ; B 212 -274 600 289 ; +C -1 ; WX 600 ; N afii62820 ; B 0 -4 576 313 ; +C -1 ; WX 600 ; N afii62821 ; B 0 -3 600 313 ; +C -1 ; WX 600 ; N afii57446 ; B 124 -188 560 476 ; +C -1 ; WX 600 ; N afii62825 ; B 69 -206 600 470 ; +C -1 ; WX 600 ; N afii62823 ; B 0 0 580 534 ; +C -1 ; WX 600 ; N afii62824 ; B 0 0 600 514 ; +C -1 ; WX 600 ; N afii57447 ; B 244 -4 454 333 ; +C -1 ; WX 600 ; N afii62828 ; B 189 0 600 417 ; +C -1 ; WX 600 ; N afii57470 ; B 0 0 437 324 ; +C -1 ; WX 600 ; N afii62827 ; B 0 -207 600 316 ; +C -1 ; WX 600 ; N afii57448 ; B 96 -200 455 275 ; +C -1 ; WX 600 ; N afii62829 ; B 94 -200 600 275 ; +C -1 ; WX 600 ; N afii57449 ; B 83 -119 523 325 ; +C -1 ; WX 600 ; N afii62830 ; B 55 -274 600 60 ; +C -1 ; WX 600 ; N afii57450 ; B 83 -274 523 325 ; +C -1 ; WX 600 ; N afii62833 ; B 58 -274 600 61 ; +C -1 ; WX 600 ; N afii62831 ; B 0 -223 580 333 ; +C -1 ; WX 600 ; N afii62832 ; B 0 -223 600 329 ; +C -1 ; WX 600 ; N afii62834 ; B 50 0 462 655 ; +C -1 ; WX 600 ; N afii62835 ; B 75 -40 600 632 ; +C -1 ; WX 600 ; N afii62836 ; B 63 0 462 750 ; +C -1 ; WX 600 ; N afii62837 ; B 79 -40 600 692 ; +C -1 ; WX 600 ; N afii62838 ; B 76 -274 462 567 ; +C -1 ; WX 600 ; N afii62839 ; B 105 -274 600 567 ; +C -1 ; WX 600 ; N afii62840 ; B 76 0 462 567 ; +C -1 ; WX 600 ; N afii62841 ; B 105 -40 600 567 ; +C -1 ; WX 600 ; N glyph1021 ; B 262 417 370 524 ; +C -1 ; WX 600 ; N afii57543-2 ; B 227 511 361 693 ; +C -1 ; WX 600 ; N afii57454-2 ; B 232 512 367 590 ; +C -1 ; WX 600 ; N afii57451-2 ; B 232 512 367 668 ; +C -1 ; WX 600 ; N glyph1025 ; B 47 0 462 849 ; +C -1 ; WX 600 ; N glyph1026 ; B 37 0 462 927 ; +C -1 ; WX 600 ; N afii57471-2 ; B 201 519 396 685 ; +C -1 ; WX 600 ; N afii57458-2 ; B 232 541 354 683 ; +C -1 ; WX 600 ; N afii57457-2 ; B 224 525 366 665 ; +C -1 ; WX 600 ; N afii57494-2 ; B 131 539 435 621 ; +C -1 ; WX 600 ; N afii57459-2 ; B 286 550 318 778 ; +C -1 ; WX 600 ; N afii57455-2 ; B 205 512 368 718 ; +C -1 ; WX 600 ; N afii57452-2 ; B 199 513 378 720 ; +C -1 ; WX 600 ; N glyph1034 ; B 45 0 462 920 ; +C -1 ; WX 600 ; N glyph1035 ; B 16 0 462 988 ; +C -1 ; WX 600 ; N glyph1036 ; B 2 0 462 980 ; +C -1 ; WX 600 ; N afii62884-2 ; B 222 523 364 718 ; +C -1 ; WX 600 ; N afii62881-2 ; B 224 525 366 796 ; +C -1 ; WX 600 ; N afii62886-2 ; B 224 509 366 729 ; +C -1 ; WX 600 ; N afii62883-2 ; B 229 510 371 807 ; +C -1 ; WX 600 ; N afii62885-2 ; B 207 523 370 848 ; +C -1 ; WX 600 ; N afii62882-2 ; B 189 524 368 849 ; +C -1 ; WX 600 ; N afii57504-2 ; B 232 -504 366 -322 ; +C -1 ; WX 600 ; N afii57456-2 ; B 212 -384 346 -306 ; +C -1 ; WX 600 ; N afii57453-2 ; B 212 -461 347 -305 ; +C -1 ; WX 600 ; N glyph1046 ; B 76 -346 462 567 ; +C -1 ; WX 600 ; N glyph1047 ; B 76 -424 462 567 ; +C -1 ; WX 600 ; N afii57543-3 ; B 239 382 373 564 ; +C -1 ; WX 600 ; N afii57454-3 ; B 245 383 379 461 ; +C -1 ; WX 600 ; N afii57451-3 ; B 245 383 379 539 ; +C -1 ; WX 600 ; N glyph1051 ; B 57 -40 600 791 ; +C -1 ; WX 600 ; N glyph1052 ; B 52 -40 600 869 ; +C -1 ; WX 600 ; N afii57471-3 ; B 213 390 409 555 ; +C -1 ; WX 600 ; N afii57458-3 ; B 244 406 366 548 ; +C -1 ; WX 600 ; N afii57457-3 ; B 236 396 378 535 ; +C -1 ; WX 600 ; N afii57494-3 ; B 144 409 447 492 ; +C -1 ; WX 600 ; N afii57459-3 ; B 298 421 331 649 ; +C -1 ; WX 600 ; N afii57455-3 ; B 217 383 380 589 ; +C -1 ; WX 600 ; N afii57452-3 ; B 211 384 390 591 ; +C -1 ; WX 600 ; N glyph1060 ; B 62 -40 600 863 ; +C -1 ; WX 600 ; N glyph1061 ; B 32 -40 600 930 ; +C -1 ; WX 600 ; N glyph1062 ; B 19 -40 600 923 ; +C -1 ; WX 600 ; N afii62884-3 ; B 234 394 376 589 ; +C -1 ; WX 600 ; N afii62881-3 ; B 236 396 378 667 ; +C -1 ; WX 600 ; N afii62886-3 ; B 236 380 378 599 ; +C -1 ; WX 600 ; N afii62883-3 ; B 241 380 383 678 ; +C -1 ; WX 600 ; N afii62885-3 ; B 219 394 382 719 ; +C -1 ; WX 600 ; N afii62882-3 ; B 201 395 380 719 ; +C -1 ; WX 600 ; N afii57504-3 ; B 222 -680 356 -498 ; +C -1 ; WX 600 ; N afii57456-3 ; B 202 -560 336 -482 ; +C -1 ; WX 600 ; N afii57453-3 ; B 202 -637 337 -480 ; +C -1 ; WX 600 ; N glyph1072 ; B 105 -346 600 567 ; +C -1 ; WX 600 ; N glyph1073 ; B 105 -424 600 567 ; +C -1 ; WX 600 ; N afii57543-4 ; B 95 580 229 762 ; +C -1 ; WX 600 ; N afii57454-4 ; B 101 581 235 659 ; +C -1 ; WX 600 ; N afii57451-4 ; B 100 581 235 737 ; +C -1 ; WX 600 ; N glyph1077 ; B 177 29 333 833 ; +C -1 ; WX 600 ; N glyph1078 ; B 182 29 333 911 ; +C -1 ; WX 600 ; N afii57471-4 ; B 69 587 265 753 ; +C -1 ; WX 600 ; N afii57458-4 ; B 100 604 222 746 ; +C -1 ; WX 600 ; N afii57457-4 ; B 92 594 234 733 ; +C -1 ; WX 600 ; N afii57494-4 ; B 0 607 304 689 ; +C -1 ; WX 600 ; N afii57459-4 ; B 154 619 187 847 ; +C -1 ; WX 600 ; N afii57455-4 ; B 73 581 236 787 ; +C -1 ; WX 600 ; N afii57452-4 ; B 67 582 246 789 ; +C -1 ; WX 600 ; N glyph1086 ; B 187 29 333 920 ; +C -1 ; WX 600 ; N glyph1087 ; B 133 29 333 948 ; +C -1 ; WX 600 ; N glyph1088 ; B 116 29 333 947 ; +C -1 ; WX 600 ; N afii62884-4 ; B 90 592 232 787 ; +C -1 ; WX 600 ; N afii62881-4 ; B 92 594 234 864 ; +C -1 ; WX 600 ; N afii62886-4 ; B 92 578 234 797 ; +C -1 ; WX 600 ; N afii62883-4 ; B 97 578 239 875 ; +C -1 ; WX 600 ; N afii62885-4 ; B 75 592 238 917 ; +C -1 ; WX 600 ; N afii62882-4 ; B 57 593 236 917 ; +C -1 ; WX 600 ; N afii57504-4 ; B 190 -274 324 -92 ; +C -1 ; WX 600 ; N afii57456-4 ; B 170 -165 305 -86 ; +C -1 ; WX 600 ; N afii57453-4 ; B 170 -241 305 -85 ; +C -1 ; WX 600 ; N glyph1098 ; B 218 -310 364 567 ; +C -1 ; WX 600 ; N glyph1099 ; B 218 -388 360 567 ; +C -1 ; WX 600 ; N glyph1100 ; B 217 329 426 440 ; +C -1 ; WX 600 ; N glyph1101 ; B 200 322 410 532 ; +C -1 ; WX 600 ; N glyph1102 ; B 234 -274 443 -64 ; +C -1 ; WX 600 ; N glyph1103 ; B 0 -207 580 333 ; +C -1 ; WX 600 ; N glyph1104 ; B 18 0 578 333 ; +C -1 ; WX 600 ; N glyph1105 ; B 18 0 600 328 ; +C -1 ; WX 600 ; N glyph1106 ; B 0 0 580 333 ; +C -1 ; WX 600 ; N glyph1107 ; B 0 0 600 329 ; +C -1 ; WX 600 ; N glyph1108 ; B 5 -3 590 391 ; +C -1 ; WX 600 ; N glyph1109 ; B 3 -33 600 316 ; +C -1 ; WX 600 ; N glyph1110 ; B 0 0 589 391 ; +C -1 ; WX 600 ; N glyph1111 ; B 0 0 600 346 ; +C -1 ; WX 600 ; N glyph1112 ; B 117 -274 537 332 ; +C -1 ; WX 600 ; N glyph1113 ; B 74 -151 521 308 ; +C -1 ; WX 600 ; N glyph1114 ; B 77 -151 523 347 ; +C -1 ; WX 600 ; N glyph1115 ; B 0 -208 600 306 ; +C -1 ; WX 600 ; N glyph1116 ; B 14 -187 600 301 ; +C -1 ; WX 600 ; N glyph1117 ; B 21 -274 600 166 ; +C -1 ; WX 600 ; N glyph1118 ; B 0 0 584 472 ; +C -1 ; WX 600 ; N glyph1119 ; B 0 0 541 406 ; +C -1 ; WX 600 ; N glyph1120 ; B 160 0 600 834 ; +C -1 ; WX 600 ; N glyph1121 ; B 160 0 600 913 ; +C -1 ; WX 600 ; N glyph1122 ; B 168 0 600 925 ; +C -1 ; WX 600 ; N glyph1123 ; B 119 0 600 948 ; +C -1 ; WX 600 ; N glyph1124 ; B 106 0 600 947 ; +C -1 ; WX 600 ; N glyph1125 ; B 246 -323 600 562 ; +C -1 ; WX 600 ; N glyph1126 ; B 246 -401 600 562 ; +C -1 ; WX 600 ; N uniFFFC ; B 0 0 600 431 ; +C -1 ; WX 600 ; N Ohorn ; B 51 -16 600 584 ; +C -1 ; WX 600 ; N ohorn ; B 71 -16 571 438 ; +C -1 ; WX 600 ; N Uhorn ; B 41 -16 600 649 ; +C -1 ; WX 600 ; N uhorn ; B 44 -16 574 437 ; +C -1 ; WX 600 ; N _d_1133 ; B 219 682 416 785 ; +C -1 ; WX 600 ; N _d_1134 ; B 200 682 396 785 ; +C -1 ; WX 600 ; N _d_1135 ; B 199 632 366 783 ; +C -1 ; WX 600 ; N f006 ; B 221 682 417 785 ; +C -1 ; WX 600 ; N f007 ; B 224 682 421 785 ; +C -1 ; WX 600 ; N f009 ; B 219 632 386 783 ; +C -1 ; WX 600 ; N combininghookabove ; B 216 638 374 763 ; +C -1 ; WX 600 ; N f010 ; B 221 699 363 783 ; +C -1 ; WX 600 ; N f013 ; B 208 643 366 783 ; +C -1 ; WX 600 ; N f011 ; B 215 699 357 783 ; +C -1 ; WX 600 ; N f01c ; B 146 671 458 772 ; +C -1 ; WX 600 ; N f015 ; B 143 682 454 783 ; +C -1 ; WX 600 ; N combiningtildeaccent ; B 137 682 448 783 ; +C -1 ; WX 600 ; N _d_1146 ; B 171 593 436 675 ; +C -1 ; WX 600 ; N _d_1147 ; B 158 591 420 676 ; +C -1 ; WX 600 ; N f02c ; B 436 -158 536 -58 ; +C -1 ; WX 600 ; N dongsign ; B 98 112 495 613 ; +C -1 ; WX 600 ; N onethird ; B 0 -8 600 626 ; +C -1 ; WX 600 ; N twothirds ; B 0 -8 600 627 ; +C -1 ; WX 600 ; N f008 ; B 203 499 370 649 ; +C -1 ; WX 600 ; N _d_1153 ; B 217 499 384 649 ; +C -1 ; WX 600 ; N _d_1154 ; B 206 499 373 649 ; +C -1 ; WX 600 ; N f00f ; B 220 499 387 649 ; +C -1 ; WX 600 ; N f012 ; B 214 499 372 624 ; +C -1 ; WX 600 ; N f014 ; B 214 499 372 624 ; +C -1 ; WX 600 ; N f016 ; B 146 671 458 772 ; +C -1 ; WX 600 ; N f017 ; B 146 671 458 772 ; +C -1 ; WX 600 ; N f018 ; B 146 671 458 772 ; +C -1 ; WX 600 ; N f019 ; B 145 489 456 589 ; +C -1 ; WX 600 ; N f01a ; B 145 489 456 589 ; +C -1 ; WX 600 ; N f01b ; B 145 489 456 589 ; +C -1 ; WX 600 ; N f01e ; B 250 -158 350 -58 ; +C -1 ; WX 600 ; N f01f ; B 250 -158 350 -58 ; +C -1 ; WX 600 ; N f020 ; B 250 -158 350 -58 ; +C -1 ; WX 600 ; N f021 ; B 250 -158 350 -58 ; +C -1 ; WX 600 ; N f022 ; B 250 -158 350 -58 ; +C -1 ; WX 600 ; N combininggraveaccent ; B 221 632 388 783 ; +C -1 ; WX 600 ; N combiningacuteaccent ; B 207 632 374 783 ; +C -1 ; WX 600 ; N f01d ; B 145 489 456 589 ; +C -1 ; WX 600 ; N combiningdotbelow ; B 250 -158 350 -58 ; +C -1 ; WX 600 ; N f023 ; B 250 -158 350 -58 ; +C -1 ; WX 600 ; N f029 ; B 250 -158 350 -58 ; +C -1 ; WX 600 ; N f02a ; B 250 -158 350 -58 ; +C -1 ; WX 600 ; N f02b ; B 250 -158 350 -58 ; +C -1 ; WX 600 ; N f024 ; B 250 -158 350 -58 ; +C -1 ; WX 600 ; N f025 ; B 250 -158 350 -58 ; +C -1 ; WX 600 ; N f026 ; B 250 -158 350 -58 ; +C -1 ; WX 600 ; N f027 ; B 250 -158 350 -58 ; +C -1 ; WX 600 ; N f028 ; B 250 -158 350 -58 ; +C -1 ; WX 600 ; N f02d ; B 157 682 469 783 ; +C -1 ; WX 600 ; N f02e ; B 146 671 458 772 ; +C -1 ; WX 600 ; N f02f ; B 157 682 469 783 ; +C -1 ; WX 600 ; N f030 ; B 146 671 458 772 ; +C -1 ; WX 600 ; N Adotbelow ; B 8 -158 593 571 ; +C -1 ; WX 600 ; N adotbelow ; B 70 -158 542 438 ; +C -1 ; WX 600 ; N Ahookabove ; B 8 0 593 763 ; +C -1 ; WX 600 ; N ahookabove ; B 70 -16 542 624 ; +C -1 ; WX 600 ; N Acircumflexacute ; B 8 0 593 785 ; +C -1 ; WX 600 ; N acircumflexacute ; B 70 -16 542 783 ; +C -1 ; WX 600 ; N Acircumflexgrave ; B 8 0 593 785 ; +C -1 ; WX 600 ; N acircumflexgrave ; B 70 -16 542 783 ; +C -1 ; WX 600 ; N Acircumflexhookabove ; B 8 0 593 783 ; +C -1 ; WX 600 ; N acircumflexhookabove ; B 70 -16 542 783 ; +C -1 ; WX 600 ; N Acircumflextilde ; B 8 0 593 783 ; +C -1 ; WX 600 ; N acircumflextilde ; B 70 -16 542 783 ; +C -1 ; WX 600 ; N Acircumflexdotbelow ; B 8 -158 593 676 ; +C -1 ; WX 600 ; N acircumflexdotbelow ; B 70 -158 542 640 ; +C -1 ; WX 600 ; N Abreveacute ; B 8 0 593 785 ; +C -1 ; WX 600 ; N abreveacute ; B 70 -16 542 783 ; +C -1 ; WX 600 ; N Abrevegrave ; B 8 0 593 785 ; +C -1 ; WX 600 ; N abrevegrave ; B 70 -16 542 783 ; +C -1 ; WX 600 ; N Abrevehookabove ; B 8 0 593 783 ; +C -1 ; WX 600 ; N abrevehookabove ; B 70 -16 542 783 ; +C -1 ; WX 600 ; N Abrevetilde ; B 8 0 593 783 ; +C -1 ; WX 600 ; N abrevetilde ; B 70 -16 542 783 ; +C -1 ; WX 600 ; N Abrevedotbelow ; B 8 -158 593 675 ; +C -1 ; WX 600 ; N abrevedotbelow ; B 70 -158 542 634 ; +C -1 ; WX 600 ; N Edotbelow ; B 43 -158 523 571 ; +C -1 ; WX 600 ; N edotbelow ; B 63 -158 523 438 ; +C -1 ; WX 600 ; N Ehookabove ; B 43 0 523 763 ; +C -1 ; WX 600 ; N ehookabove ; B 63 -16 523 624 ; +C -1 ; WX 600 ; N Etilde ; B 43 0 523 720 ; +C -1 ; WX 600 ; N etilde ; B 63 -16 523 589 ; +C -1 ; WX 600 ; N Ecircumflexacute ; B 43 0 523 785 ; +C -1 ; WX 600 ; N ecircumflexacute ; B 63 -16 523 783 ; +C -1 ; WX 600 ; N Ecircumflexgrave ; B 43 0 523 785 ; +C -1 ; WX 600 ; N ecircumflexgrave ; B 63 -16 523 783 ; +C -1 ; WX 600 ; N Ecircumflexhookabove ; B 43 0 523 783 ; +C -1 ; WX 600 ; N ecircumflexhookabove ; B 63 -16 523 783 ; +C -1 ; WX 600 ; N Ecircumflextilde ; B 43 0 523 783 ; +C -1 ; WX 600 ; N ecircumflextilde ; B 63 -16 523 783 ; +C -1 ; WX 600 ; N Ecircumflexdotbelow ; B 43 -158 523 676 ; +C -1 ; WX 600 ; N ecircumflexdotbelow ; B 63 -158 523 640 ; +C -1 ; WX 600 ; N Ihookabove ; B 112 0 489 763 ; +C -1 ; WX 600 ; N ihookabove ; B 91 0 511 624 ; +C -1 ; WX 600 ; N Idotbelow ; B 112 -158 489 571 ; +C -1 ; WX 600 ; N idotbelow ; B 92 -158 511 633 ; +C -1 ; WX 600 ; N Odotbelow ; B 0 -158 500 584 ; +C -1 ; WX 600 ; N odotbelow ; B 71 -158 529 438 ; +C -1 ; WX 600 ; N Ohookabove ; B 0 -16 500 763 ; +C -1 ; WX 600 ; N ohookabove ; B 71 -16 529 624 ; +C -1 ; WX 600 ; N Ocircumflexacute ; B 0 -16 500 785 ; +C -1 ; WX 600 ; N ocircumflexacute ; B 71 -16 529 783 ; +C -1 ; WX 600 ; N Ocircumflexgrave ; B 0 -16 500 785 ; +C -1 ; WX 600 ; N ocircumflexgrave ; B 71 -16 529 783 ; +C -1 ; WX 600 ; N Ocircumflexhookabove ; B 0 -16 500 783 ; +C -1 ; WX 600 ; N ocircumflexhookabove ; B 71 -16 529 783 ; +C -1 ; WX 600 ; N Ocircumflextilde ; B 0 -16 500 783 ; +C -1 ; WX 600 ; N ocircumflextilde ; B 71 -16 529 783 ; +C -1 ; WX 600 ; N Ocircumflexdotbelow ; B 0 -158 500 676 ; +C -1 ; WX 600 ; N ocircumflexdotbelow ; B 71 -158 529 640 ; +C -1 ; WX 600 ; N Ohornacute ; B 51 -16 600 779 ; +C -1 ; WX 600 ; N ohornacute ; B 71 -16 571 649 ; +C -1 ; WX 600 ; N Ohorngrave ; B 51 -16 600 779 ; +C -1 ; WX 600 ; N ohorngrave ; B 71 -16 571 649 ; +C -1 ; WX 600 ; N Ohornhookabove ; B 51 -16 600 763 ; +C -1 ; WX 600 ; N ohornhookabove ; B 71 -16 571 624 ; +C -1 ; WX 600 ; N Ohorntilde ; B 51 -16 600 720 ; +C -1 ; WX 600 ; N ohorntilde ; B 71 -16 571 589 ; +C -1 ; WX 600 ; N Ohorndotbelow ; B 51 -158 600 584 ; +C -1 ; WX 600 ; N ohorndotbelow ; B 71 -158 571 438 ; +C -1 ; WX 600 ; N Udotbelow ; B 41 -158 561 571 ; +C -1 ; WX 600 ; N udotbelow ; B 44 -158 543 423 ; +C -1 ; WX 600 ; N Uhookabove ; B 41 -16 561 763 ; +C -1 ; WX 600 ; N uhookabove ; B 44 -16 543 624 ; +C -1 ; WX 600 ; N Uhornacute ; B 41 -16 600 779 ; +C -1 ; WX 600 ; N uhornacute ; B 44 -16 574 649 ; +C -1 ; WX 600 ; N Uhorngrave ; B 41 -16 600 779 ; +C -1 ; WX 600 ; N uhorngrave ; B 44 -16 574 649 ; +C -1 ; WX 600 ; N Uhornhookabove ; B 41 -16 600 763 ; +C -1 ; WX 600 ; N uhornhookabove ; B 44 -16 574 624 ; +C -1 ; WX 600 ; N Uhorntilde ; B 41 -16 600 720 ; +C -1 ; WX 600 ; N uhorntilde ; B 44 -16 574 589 ; +C -1 ; WX 600 ; N Uhorndotbelow ; B 41 -158 600 649 ; +C -1 ; WX 600 ; N uhorndotbelow ; B 44 -158 574 437 ; +C -1 ; WX 600 ; N Ydotbelow ; B 48 -158 551 571 ; +C -1 ; WX 600 ; N ydotbelow ; B 73 -188 574 423 ; +C -1 ; WX 600 ; N Yhookabove ; B 48 0 551 763 ; +C -1 ; WX 600 ; N yhookabove ; B 73 -188 574 624 ; +C -1 ; WX 600 ; N Ytilde ; B 48 0 551 720 ; +C -1 ; WX 600 ; N ytilde ; B 73 -188 574 589 ; +C -1 ; WX 600 ; N uni01CD ; B 8 0 593 763 ; +C -1 ; WX 600 ; N uni01CE ; B 70 -16 542 634 ; +C -1 ; WX 600 ; N uni01CF ; B 112 0 489 763 ; +C -1 ; WX 600 ; N uni01D0 ; B 91 0 511 634 ; +C -1 ; WX 600 ; N uni01D1 ; B 0 -16 500 763 ; +C -1 ; WX 600 ; N uni01D2 ; B 71 -16 529 634 ; +C -1 ; WX 600 ; N uni01D3 ; B 41 -16 561 763 ; +C -1 ; WX 600 ; N uni01D4 ; B 44 -16 543 634 ; +C -1 ; WX 600 ; N uni01D5 ; B 41 -16 561 782 ; +C -1 ; WX 600 ; N uni01D6 ; B 44 -16 543 703 ; +C -1 ; WX 600 ; N uni01D7 ; B 41 -16 561 783 ; +C -1 ; WX 600 ; N uni01D8 ; B 44 -16 543 771 ; +C -1 ; WX 600 ; N uni01D9 ; B 41 -16 561 783 ; +C -1 ; WX 600 ; N uni01DA ; B 44 -16 543 761 ; +C -1 ; WX 600 ; N uni01DB ; B 41 -16 561 783 ; +C -1 ; WX 600 ; N uni01DC ; B 44 -16 543 771 ; +C -1 ; WX 600 ; N _d_1290 ; B 148 624 453 782 ; +C -1 ; WX 600 ; N _d_1291 ; B 135 624 466 783 ; +C -1 ; WX 600 ; N _d_1292 ; B 120 624 481 783 ; +C -1 ; WX 600 ; N _d_1293 ; B 135 624 466 783 ; +C -1 ; WX 600 ; N uni0492 ; B 62 0 542 571 ; +C -1 ; WX 600 ; N uni0493 ; B 74 0 531 423 ; +C -1 ; WX 600 ; N uni0496 ; B -2 -140 596 571 ; +C -1 ; WX 600 ; N uni0497 ; B 10 -103 597 423 ; +C -1 ; WX 600 ; N uni049a ; B 58 -140 595 572 ; +C -1 ; WX 600 ; N uni049b ; B 59 -103 580 423 ; +C -1 ; WX 600 ; N uni049c ; B 58 0 587 572 ; +C -1 ; WX 600 ; N uni049d ; B 59 0 572 423 ; +C -1 ; WX 600 ; N uni04a2 ; B 52 -140 569 571 ; +C -1 ; WX 600 ; N uni04a3 ; B 52 -103 563 423 ; +C -1 ; WX 600 ; N uni04ae ; B 48 0 551 571 ; +C -1 ; WX 600 ; N uni04af ; B 73 -188 574 423 ; +C -1 ; WX 600 ; N uni04b0 ; B 48 0 551 571 ; +C -1 ; WX 600 ; N uni04b1 ; B 73 -188 574 423 ; +C -1 ; WX 600 ; N uni04b2 ; B 39 -140 577 571 ; +C -1 ; WX 600 ; N uni04b3 ; B 49 -103 551 423 ; +C -1 ; WX 600 ; N uni04b8 ; B 20 0 547 571 ; +C -1 ; WX 600 ; N uni04b9 ; B 34 0 546 423 ; +C -1 ; WX 600 ; N uni04ba ; B 52 0 580 571 ; +C -1 ; WX 600 ; N uni04bb ; B 53 0 565 423 ; +C -1 ; WX 600 ; N uni018f ; B 32 -16 555 584 ; +C -1 ; WX 600 ; N uni0259 ; B 63 -16 523 438 ; +C -1 ; WX 600 ; N uni04e8 ; B 51 -16 551 584 ; +C -1 ; WX 600 ; N uni04e9 ; B 71 -16 529 438 ; +EndCharMetrics +EndFontMetrics diff --git a/gulliver/thirdparty/html2ps_pdf/fonts/cour.ttf b/thirdparty/html2ps_pdf/fonts/cour.ttf similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/fonts/cour.ttf rename to thirdparty/html2ps_pdf/fonts/cour.ttf diff --git a/gulliver/thirdparty/html2ps_pdf/fonts/courbd.afm b/thirdparty/html2ps_pdf/fonts/courbd.afm similarity index 97% rename from gulliver/thirdparty/html2ps_pdf/fonts/courbd.afm rename to thirdparty/html2ps_pdf/fonts/courbd.afm index b27b73ed3..238331fe4 100644 --- a/gulliver/thirdparty/html2ps_pdf/fonts/courbd.afm +++ b/thirdparty/html2ps_pdf/fonts/courbd.afm @@ -1,1372 +1,1372 @@ -StartFontMetrics 4.1 -FontName CourierNewPS-BoldMT -FullName Courier New Bold -Notice Typeface The Monotype Corporation plc. Data The Monotype Corporation plc/Type Solutions Inc. 1990-1992. All Rights Reserved -EncodingScheme FontSpecific -FamilyName Courier New -Weight Bold -Version Version 2.90 -Characters 1318 -ItalicAngle 0.0 -Ascender 833 -Descender -300 -UnderlineThickness 100 -UnderlinePosition -233 -IsFixedPitch true -FontBBox -46 -710 702 1221 -StartCharMetrics 1353 -C 0 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 1 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 2 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 3 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 4 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 5 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 6 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 7 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 8 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 9 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 10 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 11 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 12 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 13 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 14 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 15 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 16 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 17 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 18 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 19 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 20 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 21 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 22 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 23 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 24 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 25 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 26 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 27 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 28 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 29 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 30 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 31 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 32 ; WX 600 ; N space ; B 217 -15 377 648 ; -C 33 ; WX 600 ; N exclam ; B 217 -15 377 648 ; -C 34 ; WX 600 ; N quotedbl ; B 129 332 466 604 ; -C 35 ; WX 600 ; N numbersign ; B 60 -94 538 686 ; -C 36 ; WX 600 ; N dollar ; B 81 -125 519 695 ; -C 37 ; WX 600 ; N percent ; B 77 -15 525 627 ; -C 38 ; WX 600 ; N ampersand ; B 110 -15 548 558 ; -C 39 ; WX 600 ; N quotesingle ; B 235 318 364 611 ; -C 40 ; WX 600 ; N parenleft ; B 264 -156 489 642 ; -C 41 ; WX 600 ; N parenright ; B 118 -156 343 642 ; -C 42 ; WX 600 ; N asterisk ; B 81 212 517 632 ; -C 43 ; WX 600 ; N plus ; B 40 0 560 568 ; -C 44 ; WX 600 ; N comma ; B 204 -161 410 135 ; -C 45 ; WX 600 ; N hyphen ; B 92 238 510 330 ; -C 46 ; WX 600 ; N period ; B 226 -16 376 117 ; -C 47 ; WX 600 ; N slash ; B 83 -115 518 706 ; -C 48 ; WX 600 ; N zero ; B 82 -15 519 648 ; -C 49 ; WX 600 ; N one ; B 83 0 519 648 ; -C 50 ; WX 600 ; N two ; B 54 0 510 648 ; -C 51 ; WX 600 ; N three ; B 66 -15 531 648 ; -C 52 ; WX 600 ; N four ; B 75 0 509 632 ; -C 53 ; WX 600 ; N five ; B 64 -15 531 632 ; -C 54 ; WX 600 ; N six ; B 105 -15 542 648 ; -C 55 ; WX 600 ; N seven ; B 74 -1 509 632 ; -C 56 ; WX 600 ; N eight ; B 83 -15 519 648 ; -C 57 ; WX 600 ; N nine ; B 105 -15 542 648 ; -C 58 ; WX 600 ; N colon ; B 225 -18 376 443 ; -C 59 ; WX 600 ; N semicolon ; B 197 -106 422 441 ; -C 60 ; WX 600 ; N less ; B -13 2 560 568 ; -C 61 ; WX 600 ; N equal ; B 20 141 582 429 ; -C 62 ; WX 600 ; N greater ; B 41 2 614 568 ; -C 63 ; WX 600 ; N question ; B 103 -14 519 607 ; -C 64 ; WX 600 ; N at ; B 88 -83 498 648 ; -C 65 ; WX 600 ; N A ; B -22 0 623 592 ; -C 66 ; WX 600 ; N B ; B 13 0 574 592 ; -C 67 ; WX 600 ; N C ; B 31 -15 566 607 ; -C 68 ; WX 600 ; N D ; B 14 0 552 592 ; -C 69 ; WX 600 ; N E ; B 15 0 553 592 ; -C 70 ; WX 600 ; N F ; B 49 0 587 592 ; -C 71 ; WX 600 ; N G ; B 32 -15 595 607 ; -C 72 ; WX 600 ; N H ; B 22 0 583 592 ; -C 73 ; WX 600 ; N I ; B 82 0 518 592 ; -C 74 ; WX 600 ; N J ; B 54 -15 614 592 ; -C 75 ; WX 600 ; N K ; B 13 0 605 592 ; -C 76 ; WX 600 ; N L ; B 33 0 574 592 ; -C 77 ; WX 600 ; N M ; B -19 0 624 592 ; -C 78 ; WX 600 ; N N ; B -8 0 593 592 ; -C 79 ; WX 600 ; N O ; B 20 -15 581 607 ; -C 80 ; WX 600 ; N P ; B 60 0 577 592 ; -C 81 ; WX 600 ; N Q ; B 20 -148 581 607 ; -C 82 ; WX 600 ; N R ; B 14 0 621 592 ; -C 83 ; WX 600 ; N S ; B 62 -15 540 607 ; -C 84 ; WX 600 ; N T ; B 40 0 559 592 ; -C 85 ; WX 600 ; N U ; B 11 -15 591 592 ; -C 86 ; WX 600 ; N V ; B -23 0 623 592 ; -C 87 ; WX 600 ; N W ; B -11 0 612 592 ; -C 88 ; WX 600 ; N X ; B 11 0 592 592 ; -C 89 ; WX 600 ; N Y ; B 21 0 581 592 ; -C 90 ; WX 600 ; N Z ; B 74 0 529 592 ; -C 91 ; WX 600 ; N bracketleft ; B 249 -156 477 632 ; -C 92 ; WX 600 ; N backslash ; B 83 -112 518 706 ; -C 93 ; WX 600 ; N bracketright ; B 124 -156 351 632 ; -C 94 ; WX 600 ; N asciicircum ; B 82 331 518 662 ; -C 95 ; WX 600 ; N underscore ; B -40 -300 644 -200 ; -C 96 ; WX 600 ; N grave ; B 205 501 396 667 ; -C 97 ; WX 600 ; N a ; B 43 -17 574 457 ; -C 98 ; WX 600 ; N b ; B -10 -16 573 633 ; -C 99 ; WX 600 ; N c ; B 56 -17 568 457 ; -C 100 ; WX 600 ; N d ; B 30 -16 614 633 ; -C 101 ; WX 600 ; N e ; B 32 -16 552 457 ; -C 102 ; WX 600 ; N f ; B 73 0 572 633 ; -C 103 ; WX 600 ; N g ; B 32 -209 594 458 ; -C 104 ; WX 600 ; N h ; B 13 0 584 633 ; -C 105 ; WX 600 ; N i ; B 63 0 537 633 ; -C 106 ; WX 600 ; N j ; B 86 -209 460 633 ; -C 107 ; WX 600 ; N k ; B 34 0 575 633 ; -C 108 ; WX 600 ; N l ; B 63 0 537 633 ; -C 109 ; WX 600 ; N m ; B -17 0 625 457 ; -C 110 ; WX 600 ; N n ; B 25 0 574 457 ; -C 111 ; WX 600 ; N o ; B 42 -16 560 457 ; -C 112 ; WX 600 ; N p ; B -8 -209 573 457 ; -C 113 ; WX 600 ; N q ; B 35 -209 616 457 ; -C 114 ; WX 600 ; N r ; B 53 0 573 457 ; -C 115 ; WX 600 ; N s ; B 74 -16 529 457 ; -C 116 ; WX 600 ; N t ; B 72 -16 591 601 ; -C 117 ; WX 600 ; N u ; B 15 -16 575 443 ; -C 118 ; WX 600 ; N v ; B 0 0 604 443 ; -C 119 ; WX 600 ; N w ; B -2 0 602 443 ; -C 120 ; WX 600 ; N x ; B 21 0 582 443 ; -C 121 ; WX 600 ; N y ; B 21 -209 582 443 ; -C 122 ; WX 600 ; N z ; B 86 0 522 443 ; -C 123 ; WX 600 ; N braceleft ; B 168 -156 433 632 ; -C 124 ; WX 600 ; N bar ; B 250 -156 351 632 ; -C 125 ; WX 600 ; N braceright ; B 165 -156 430 632 ; -C 126 ; WX 600 ; N asciitilde ; B 61 180 540 388 ; -C 127 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 128 ; WX 600 ; N Euro ; B 0 -15 566 607 ; -C 129 ; WX 600 ; N afii10052 ; B 33 0 574 822 ; -C 130 ; WX 600 ; N quotesinglbase ; B 145 -156 351 135 ; -C 131 ; WX 600 ; N florin ; B 58 -125 549 648 ; -C 132 ; WX 600 ; N quotedblbase ; B 102 -130 521 131 ; -C 133 ; WX 600 ; N ellipsis ; B 50 -15 550 87 ; -C 134 ; WX 600 ; N dagger ; B 92 -94 507 632 ; -C 135 ; WX 600 ; N daggerdbl ; B 93 -94 507 632 ; -C 136 ; WX 600 ; N circumflex ; B 140 498 459 656 ; -C 137 ; WX 600 ; N perthousand ; B 20 3 583 627 ; -C 138 ; WX 600 ; N Scaron ; B 62 -15 540 807 ; -C 139 ; WX 600 ; N guilsinglleft ; B 133 20 422 420 ; -C 140 ; WX 600 ; N OE ; B -21 0 622 592 ; -C 141 ; WX 600 ; N afii10061 ; B 40 0 601 822 ; -C 142 ; WX 600 ; N Zcaron ; B 74 0 529 807 ; -C 143 ; WX 600 ; N afii10145 ; B 19 -115 581 592 ; -C 144 ; WX 600 ; N quotedblbase ; B 102 -130 521 131 ; -C 145 ; WX 600 ; N quoteleft ; B 249 316 456 612 ; -C 146 ; WX 600 ; N quoteright ; B 145 316 351 612 ; -C 147 ; WX 600 ; N quotedblleft ; B 79 355 499 616 ; -C 148 ; WX 600 ; N quotedblright ; B 102 355 521 616 ; -C 149 ; WX 600 ; N bullet ; B 151 158 451 461 ; -C 150 ; WX 600 ; N endash ; B 40 233 559 333 ; -C 151 ; WX 600 ; N emdash ; B -30 233 630 333 ; -C 152 ; WX 600 ; N tilde ; B 131 489 469 616 ; -C 153 ; WX 600 ; N trademark ; B -42 296 602 651 ; -C 154 ; WX 600 ; N scaron ; B 74 -16 529 651 ; -C 155 ; WX 600 ; N guilsinglright ; B 185 20 474 420 ; -C 156 ; WX 600 ; N oe ; B -21 -16 613 456 ; -C 157 ; WX 600 ; N afii10109 ; B 47 0 576 667 ; -C 158 ; WX 600 ; N zcaron ; B 86 0 522 651 ; -C 159 ; WX 600 ; N Ydieresis ; B 21 0 581 783 ; -C 160 ; WX 600 ; N space ; B 217 -15 377 648 ; -C 161 ; WX 600 ; N exclamdown ; B 217 -207 377 433 ; -C 162 ; WX 600 ; N cent ; B 83 -31 501 685 ; -C 163 ; WX 600 ; N sterling ; B 30 0 552 606 ; -C 164 ; WX 600 ; N currency ; B 71 66 530 526 ; -C 165 ; WX 600 ; N yen ; B 21 0 581 592 ; -C 166 ; WX 600 ; N brokenbar ; B 250 -156 351 632 ; -C 167 ; WX 600 ; N section ; B 48 -85 554 636 ; -C 168 ; WX 600 ; N dieresis ; B 143 521 458 627 ; -C 169 ; WX 600 ; N copyright ; B -3 -14 603 592 ; -C 170 ; WX 600 ; N ordfeminine ; B 133 364 479 648 ; -C 171 ; WX 600 ; N guillemotleft ; B 35 18 555 419 ; -C 172 ; WX 600 ; N logicalnot ; B -19 0 560 334 ; -C 173 ; WX 600 ; N hyphen ; B 92 238 510 330 ; -C 174 ; WX 600 ; N registered ; B -3 -14 603 592 ; -C 175 ; WX 600 ; N overscore ; B -40 664 644 764 ; -C 176 ; WX 600 ; N degree ; B 144 417 456 728 ; -C 177 ; WX 600 ; N plusminus ; B 40 0 560 705 ; -C 178 ; WX 600 ; N twosuperior ; B 149 311 430 648 ; -C 179 ; WX 600 ; N threesuperior ; B 156 304 442 648 ; -C 180 ; WX 600 ; N acute ; B 205 500 396 667 ; -C 181 ; WX 600 ; N mu1 ; B 14 -209 574 443 ; -C 182 ; WX 600 ; N paragraph ; B 61 -87 543 632 ; -C 183 ; WX 600 ; N periodcentered ; B 225 246 375 378 ; -C 184 ; WX 600 ; N cedilla ; B 200 -179 392 36 ; -C 185 ; WX 600 ; N onesuperior ; B 166 311 435 649 ; -C 186 ; WX 600 ; N ordmasculine ; B 132 364 469 648 ; -C 187 ; WX 600 ; N guillemotright ; B 51 24 571 425 ; -C 188 ; WX 600 ; N onequarter ; B 1 0 600 649 ; -C 189 ; WX 600 ; N onehalf ; B -46 0 636 649 ; -C 190 ; WX 600 ; N threequarters ; B 0 0 594 649 ; -C 191 ; WX 600 ; N questiondown ; B 82 -210 498 431 ; -C 192 ; WX 600 ; N Agrave ; B -22 0 623 822 ; -C 193 ; WX 600 ; N Aacute ; B -22 0 623 822 ; -C 194 ; WX 600 ; N Acircumflex ; B -22 0 623 812 ; -C 195 ; WX 600 ; N Atilde ; B -22 0 623 771 ; -C 196 ; WX 600 ; N Adieresis ; B -22 0 623 783 ; -C 197 ; WX 600 ; N Aring ; B -22 0 623 833 ; -C 198 ; WX 600 ; N AE ; B -21 0 623 592 ; -C 199 ; WX 600 ; N Ccedilla ; B 31 -188 566 607 ; -C 200 ; WX 600 ; N Egrave ; B 15 0 553 822 ; -C 201 ; WX 600 ; N Eacute ; B 15 0 553 822 ; -C 202 ; WX 600 ; N Ecircumflex ; B 15 0 553 812 ; -C 203 ; WX 600 ; N Edieresis ; B 15 0 553 783 ; -C 204 ; WX 600 ; N Igrave ; B 82 0 518 822 ; -C 205 ; WX 600 ; N Iacute ; B 82 0 518 822 ; -C 206 ; WX 600 ; N Icircumflex ; B 82 0 518 812 ; -C 207 ; WX 600 ; N Idieresis ; B 82 0 518 783 ; -C 208 ; WX 600 ; N Eth ; B -18 0 553 592 ; -C 209 ; WX 600 ; N Ntilde ; B -8 0 593 771 ; -C 210 ; WX 600 ; N Ograve ; B 20 -15 581 822 ; -C 211 ; WX 600 ; N Oacute ; B 20 -15 581 822 ; -C 212 ; WX 600 ; N Ocircumflex ; B 20 -15 581 812 ; -C 213 ; WX 600 ; N Otilde ; B 20 -15 581 771 ; -C 214 ; WX 600 ; N Odieresis ; B 20 -15 581 783 ; -C 215 ; WX 600 ; N multiply ; B 100 83 501 485 ; -C 216 ; WX 600 ; N Oslash ; B 11 -71 591 642 ; -C 217 ; WX 600 ; N Ugrave ; B 11 -15 591 822 ; -C 218 ; WX 600 ; N Uacute ; B 11 -15 591 822 ; -C 219 ; WX 600 ; N Ucircumflex ; B 11 -15 591 812 ; -C 220 ; WX 600 ; N Udieresis ; B 11 -15 591 783 ; -C 221 ; WX 600 ; N Yacute ; B 21 0 581 822 ; -C 222 ; WX 600 ; N Thorn ; B 60 0 577 592 ; -C 223 ; WX 600 ; N germandbls ; B 12 -16 531 633 ; -C 224 ; WX 600 ; N agrave ; B 43 -17 574 667 ; -C 225 ; WX 600 ; N aacute ; B 43 -17 574 667 ; -C 226 ; WX 600 ; N acircumflex ; B 43 -17 574 656 ; -C 227 ; WX 600 ; N atilde ; B 43 -17 574 616 ; -C 228 ; WX 600 ; N adieresis ; B 43 -17 574 627 ; -C 229 ; WX 600 ; N aring ; B 43 -17 574 682 ; -C 230 ; WX 600 ; N ae ; B -21 -16 612 456 ; -C 231 ; WX 600 ; N ccedilla ; B 56 -179 568 457 ; -C 232 ; WX 600 ; N egrave ; B 32 -16 552 667 ; -C 233 ; WX 600 ; N eacute ; B 32 -16 552 667 ; -C 234 ; WX 600 ; N ecircumflex ; B 32 -16 552 656 ; -C 235 ; WX 600 ; N edieresis ; B 32 -16 552 627 ; -C 236 ; WX 600 ; N igrave ; B 63 0 537 667 ; -C 237 ; WX 600 ; N iacute ; B 63 0 537 667 ; -C 238 ; WX 600 ; N icircumflex ; B 63 0 537 656 ; -C 239 ; WX 600 ; N idieresis ; B 63 0 537 627 ; -C 240 ; WX 600 ; N eth ; B 44 -17 540 632 ; -C 241 ; WX 600 ; N ntilde ; B 25 0 574 616 ; -C 242 ; WX 600 ; N ograve ; B 42 -16 560 667 ; -C 243 ; WX 600 ; N oacute ; B 42 -16 560 667 ; -C 244 ; WX 600 ; N ocircumflex ; B 42 -16 560 656 ; -C 245 ; WX 600 ; N otilde ; B 42 -16 560 616 ; -C 246 ; WX 600 ; N odieresis ; B 42 -16 560 627 ; -C 247 ; WX 600 ; N divide ; B 40 5 560 565 ; -C 248 ; WX 600 ; N oslash ; B 22 -72 574 495 ; -C 249 ; WX 600 ; N ugrave ; B 15 -16 575 667 ; -C 250 ; WX 600 ; N uacute ; B 15 -16 575 667 ; -C 251 ; WX 600 ; N ucircumflex ; B 15 -16 575 656 ; -C 252 ; WX 600 ; N udieresis ; B 15 -16 575 627 ; -C 253 ; WX 600 ; N yacute ; B 21 -209 582 667 ; -C 254 ; WX 600 ; N thorn ; B -8 -209 573 633 ; -C 255 ; WX 600 ; N ydieresis ; B 21 -209 582 627 ; -C -1 ; WX 0 ; N .null ; B 217 -15 377 648 ; -C -1 ; WX 600 ; N nonmarkingreturn ; B 217 -15 377 648 ; -C -1 ; WX 600 ; N notequal ; B 20 -67 582 637 ; -C -1 ; WX 600 ; N infinity ; B 44 186 556 422 ; -C -1 ; WX 600 ; N lessequal ; B -13 40 560 745 ; -C -1 ; WX 600 ; N greaterequal ; B 41 40 614 745 ; -C -1 ; WX 600 ; N partialdiff ; B 46 -15 560 633 ; -C -1 ; WX 600 ; N summation ; B 33 -188 551 613 ; -C -1 ; WX 600 ; N product ; B 12 -188 589 613 ; -C -1 ; WX 600 ; N pi1 ; B 36 0 564 443 ; -C -1 ; WX 600 ; N integral ; B 3 -190 583 826 ; -C -1 ; WX 600 ; N Ohm ; B 17 0 583 607 ; -C -1 ; WX 600 ; N radical ; B 67 -38 575 913 ; -C -1 ; WX 600 ; N approxequal ; B 61 74 540 494 ; -C -1 ; WX 600 ; N increment ; B 34 0 567 583 ; -C -1 ; WX 600 ; N lozenge ; B 76 0 525 694 ; -C -1 ; WX 600 ; N fraction ; B 76 155 524 473 ; -C -1 ; WX 600 ; N fi ; B -19 0 624 633 ; -C -1 ; WX 600 ; N fl ; B -20 0 624 633 ; -C -1 ; WX 600 ; N dotlessi ; B 63 0 537 443 ; -C -1 ; WX 600 ; N macron ; B 142 525 458 590 ; -C -1 ; WX 600 ; N breve ; B 142 501 458 654 ; -C -1 ; WX 600 ; N dotaccent ; B 237 511 363 638 ; -C -1 ; WX 600 ; N ring ; B 204 493 396 682 ; -C -1 ; WX 600 ; N hungarumlaut ; B 141 501 459 668 ; -C -1 ; WX 600 ; N ogonek ; B 210 -157 390 36 ; -C -1 ; WX 600 ; N caron ; B 140 493 459 651 ; -C -1 ; WX 600 ; N Lslash ; B 12 0 573 592 ; -C -1 ; WX 600 ; N lslash ; B 63 0 540 633 ; -C -1 ; WX 600 ; N minus ; B 40 234 560 334 ; -C -1 ; WX 600 ; N franc ; B 49 0 587 592 ; -C -1 ; WX 600 ; N Gbreve ; B 32 -15 595 810 ; -C -1 ; WX 600 ; N gbreve ; B 32 -209 594 654 ; -C -1 ; WX 600 ; N Idot ; B 82 0 518 793 ; -C -1 ; WX 600 ; N Scedilla ; B 62 -189 540 607 ; -C -1 ; WX 600 ; N scedilla ; B 74 -179 529 457 ; -C -1 ; WX 600 ; N Cacute ; B 31 -15 566 822 ; -C -1 ; WX 600 ; N cacute ; B 56 -17 568 667 ; -C -1 ; WX 600 ; N Ccaron ; B 31 -15 566 807 ; -C -1 ; WX 600 ; N ccaron ; B 56 -17 568 651 ; -C -1 ; WX 600 ; N dmacron ; B 30 -16 614 633 ; -C -1 ; WX 600 ; N middot ; B 346 300 472 427 ; -C -1 ; WX 600 ; N Abreve ; B -22 0 623 810 ; -C -1 ; WX 600 ; N abreve ; B 43 -17 574 654 ; -C -1 ; WX 600 ; N Aogonek ; B -22 -129 653 592 ; -C -1 ; WX 600 ; N aogonek ; B 43 -125 616 457 ; -C -1 ; WX 600 ; N Dcaron ; B 14 0 552 807 ; -C -1 ; WX 600 ; N dcaron ; B 30 -16 702 633 ; -C -1 ; WX 600 ; N Dslash ; B -18 0 553 592 ; -C -1 ; WX 600 ; N Eogonek ; B 15 -130 594 592 ; -C -1 ; WX 600 ; N eogonek ; B 32 -143 552 457 ; -C -1 ; WX 600 ; N Ecaron ; B 15 0 553 807 ; -C -1 ; WX 600 ; N ecaron ; B 32 -16 552 651 ; -C -1 ; WX 600 ; N Lacute ; B 33 0 574 822 ; -C -1 ; WX 600 ; N lacute ; B 63 0 537 835 ; -C -1 ; WX 600 ; N Lcaron ; B 33 0 574 592 ; -C -1 ; WX 600 ; N lcaron ; B 63 0 537 633 ; -C -1 ; WX 600 ; N Ldot ; B 33 0 574 592 ; -C -1 ; WX 600 ; N ldot ; B 63 0 545 633 ; -C -1 ; WX 600 ; N Nacute ; B -8 0 593 822 ; -C -1 ; WX 600 ; N nacute ; B 25 0 574 667 ; -C -1 ; WX 600 ; N Ncaron ; B -8 0 593 807 ; -C -1 ; WX 600 ; N ncaron ; B 25 0 574 651 ; -C -1 ; WX 600 ; N Odblacute ; B 20 -15 581 824 ; -C -1 ; WX 600 ; N odblacute ; B 42 -16 560 668 ; -C -1 ; WX 600 ; N Racute ; B 14 0 621 822 ; -C -1 ; WX 600 ; N racute ; B 53 0 573 667 ; -C -1 ; WX 600 ; N Rcaron ; B 14 0 621 807 ; -C -1 ; WX 600 ; N rcaron ; B 53 0 573 651 ; -C -1 ; WX 600 ; N Sacute ; B 62 -15 540 822 ; -C -1 ; WX 600 ; N sacute ; B 74 -16 529 667 ; -C -1 ; WX 600 ; N Tcedilla ; B 40 -271 559 592 ; -C -1 ; WX 600 ; N tcedilla ; B 72 -250 591 601 ; -C -1 ; WX 600 ; N Tcaron ; B 40 0 559 807 ; -C -1 ; WX 600 ; N tcaron ; B 72 -16 667 633 ; -C -1 ; WX 600 ; N Uring ; B 11 -15 591 833 ; -C -1 ; WX 600 ; N uring ; B 15 -16 575 682 ; -C -1 ; WX 600 ; N Udblacute ; B 11 -15 591 824 ; -C -1 ; WX 600 ; N udblacute ; B 15 -16 575 668 ; -C -1 ; WX 600 ; N Zacute ; B 74 0 529 822 ; -C -1 ; WX 600 ; N zacute ; B 86 0 522 667 ; -C -1 ; WX 600 ; N Zdot ; B 74 0 529 793 ; -C -1 ; WX 600 ; N zdot ; B 86 0 522 638 ; -C -1 ; WX 600 ; N Gamma ; B 30 0 571 592 ; -C -1 ; WX 600 ; N Theta ; B 20 -15 581 607 ; -C -1 ; WX 600 ; N Phi ; B 39 0 561 592 ; -C -1 ; WX 600 ; N alpha ; B 40 -16 577 457 ; -C -1 ; WX 600 ; N delta ; B 74 -16 526 633 ; -C -1 ; WX 600 ; N epsilon ; B 102 -16 505 457 ; -C -1 ; WX 600 ; N sigma ; B 58 -16 582 443 ; -C -1 ; WX 600 ; N tau ; B 93 -16 470 443 ; -C -1 ; WX 600 ; N phi ; B 44 -222 556 443 ; -C -1 ; WX 600 ; N underscoredbl ; B -40 -359 644 -88 ; -C -1 ; WX 600 ; N exclamdbl ; B 76 -15 519 648 ; -C -1 ; WX 600 ; N nsuperior ; B 134 253 466 527 ; -C -1 ; WX 600 ; N peseta ; B 1 -8 597 592 ; -C -1 ; WX 600 ; N arrowleft ; B 1 50 599 277 ; -C -1 ; WX 600 ; N arrowup ; B 186 -136 414 424 ; -C -1 ; WX 600 ; N arrowright ; B 1 50 599 277 ; -C -1 ; WX 600 ; N arrowdown ; B 186 -136 414 424 ; -C -1 ; WX 600 ; N arrowboth ; B 1 50 599 278 ; -C -1 ; WX 600 ; N arrowupdn ; B 186 -135 414 463 ; -C -1 ; WX 600 ; N arrowupdnbse ; B 186 -196 414 463 ; -C -1 ; WX 600 ; N orthogonal ; B 1 0 599 597 ; -C -1 ; WX 600 ; N intersection ; B 54 -15 546 648 ; -C -1 ; WX 600 ; N equivalence ; B 20 46 582 523 ; -C -1 ; WX 600 ; N house ; B 44 0 556 639 ; -C -1 ; WX 600 ; N revlogicalnot ; B -19 0 560 334 ; -C -1 ; WX 600 ; N integraltp ; B 265 -251 475 848 ; -C -1 ; WX 600 ; N integralbt ; B 125 -251 335 848 ; -C -1 ; WX 600 ; N SF100000 ; B -7 219 607 292 ; -C -1 ; WX 600 ; N SF110000 ; B 264 -255 336 766 ; -C -1 ; WX 600 ; N SF010000 ; B 264 -255 607 292 ; -C -1 ; WX 600 ; N SF030000 ; B -7 -255 336 292 ; -C -1 ; WX 600 ; N SF020000 ; B 264 219 607 766 ; -C -1 ; WX 600 ; N SF040000 ; B -7 219 336 766 ; -C -1 ; WX 600 ; N SF080000 ; B 264 -255 607 766 ; -C -1 ; WX 600 ; N SF090000 ; B -7 -255 336 766 ; -C -1 ; WX 600 ; N SF060000 ; B -7 -255 607 292 ; -C -1 ; WX 600 ; N SF070000 ; B -7 219 607 766 ; -C -1 ; WX 600 ; N SF050000 ; B -7 -255 607 766 ; -C -1 ; WX 600 ; N SF430000 ; B -7 141 607 370 ; -C -1 ; WX 600 ; N SF240000 ; B 186 -255 414 766 ; -C -1 ; WX 600 ; N SF510000 ; B 264 -255 607 370 ; -C -1 ; WX 600 ; N SF520000 ; B 186 -255 607 292 ; -C -1 ; WX 600 ; N SF390000 ; B 186 -255 607 370 ; -C -1 ; WX 600 ; N SF220000 ; B -7 -255 336 370 ; -C -1 ; WX 600 ; N SF210000 ; B -7 -255 414 292 ; -C -1 ; WX 600 ; N SF250000 ; B -7 -255 414 370 ; -C -1 ; WX 600 ; N SF500000 ; B 264 141 607 766 ; -C -1 ; WX 600 ; N SF490000 ; B 186 219 607 766 ; -C -1 ; WX 600 ; N SF380000 ; B 186 141 607 766 ; -C -1 ; WX 600 ; N SF280000 ; B -7 141 336 766 ; -C -1 ; WX 600 ; N SF270000 ; B -7 219 414 766 ; -C -1 ; WX 600 ; N SF260000 ; B -7 141 414 766 ; -C -1 ; WX 600 ; N SF360000 ; B 264 -255 607 766 ; -C -1 ; WX 600 ; N SF370000 ; B 186 -255 607 766 ; -C -1 ; WX 600 ; N SF420000 ; B 186 -255 607 766 ; -C -1 ; WX 600 ; N SF190000 ; B -7 -255 336 766 ; -C -1 ; WX 600 ; N SF200000 ; B -7 -255 414 766 ; -C -1 ; WX 600 ; N SF230000 ; B -7 -255 414 766 ; -C -1 ; WX 600 ; N SF470000 ; B -7 -255 607 370 ; -C -1 ; WX 600 ; N SF480000 ; B -7 -255 607 292 ; -C -1 ; WX 600 ; N SF410000 ; B -7 -255 607 370 ; -C -1 ; WX 600 ; N SF450000 ; B -7 141 607 766 ; -C -1 ; WX 600 ; N SF460000 ; B -7 219 607 766 ; -C -1 ; WX 600 ; N SF400000 ; B -7 141 607 766 ; -C -1 ; WX 600 ; N SF540000 ; B -7 -255 607 766 ; -C -1 ; WX 600 ; N SF530000 ; B -7 -255 607 766 ; -C -1 ; WX 600 ; N SF440000 ; B -7 -255 607 766 ; -C -1 ; WX 600 ; N upblock ; B -7 255 607 766 ; -C -1 ; WX 600 ; N dnblock ; B -7 -255 607 255 ; -C -1 ; WX 600 ; N block ; B -7 -255 607 766 ; -C -1 ; WX 600 ; N lfblock ; B -7 -255 300 766 ; -C -1 ; WX 600 ; N rtblock ; B 300 -255 608 766 ; -C -1 ; WX 600 ; N ltshade ; B 44 -207 607 766 ; -C -1 ; WX 600 ; N shade ; B -7 -207 607 766 ; -C -1 ; WX 600 ; N dkshade ; B -7 -258 607 766 ; -C -1 ; WX 600 ; N filledbox ; B 1 0 599 598 ; -C -1 ; WX 600 ; N filledrect ; B 1 193 599 306 ; -C -1 ; WX 600 ; N triagup ; B 7 0 592 585 ; -C -1 ; WX 600 ; N triagrt ; B 1 -13 599 584 ; -C -1 ; WX 600 ; N triagdn ; B 7 -13 592 572 ; -C -1 ; WX 600 ; N triaglf ; B 1 -13 599 584 ; -C -1 ; WX 600 ; N circle ; B 85 67 515 497 ; -C -1 ; WX 600 ; N invbullet ; B 61 0 539 479 ; -C -1 ; WX 600 ; N invcircle ; B 19 0 583 564 ; -C -1 ; WX 600 ; N smileface ; B -3 -14 603 592 ; -C -1 ; WX 600 ; N invsmileface ; B -3 -14 603 592 ; -C -1 ; WX 600 ; N sun ; B 1 -69 599 529 ; -C -1 ; WX 600 ; N female ; B 157 39 444 563 ; -C -1 ; WX 600 ; N male ; B 90 122 511 563 ; -C -1 ; WX 600 ; N spade ; B 63 0 537 601 ; -C -1 ; WX 600 ; N club ; B 1 0 599 597 ; -C -1 ; WX 600 ; N heart ; B 53 -11 547 559 ; -C -1 ; WX 600 ; N diamond ; B 78 -12 523 597 ; -C -1 ; WX 600 ; N musicalnote ; B 132 14 440 563 ; -C -1 ; WX 600 ; N musicalnotedbl ; B 44 -21 528 566 ; -C -1 ; WX 600 ; N IJ ; B 6 -15 598 592 ; -C -1 ; WX 600 ; N ij ; B -20 -209 563 633 ; -C -1 ; WX 600 ; N napostrophe ; B -20 0 580 612 ; -C -1 ; WX 600 ; N minute ; B 255 318 405 611 ; -C -1 ; WX 600 ; N second ; B 255 318 583 611 ; -C -1 ; WX 600 ; N afii61248 ; B 77 -15 525 627 ; -C -1 ; WX 600 ; N afii61289 ; B 98 -16 457 607 ; -C -1 ; WX 600 ; N H22073 ; B 1 0 599 598 ; -C -1 ; WX 600 ; N H18543 ; B 146 156 453 463 ; -C -1 ; WX 600 ; N H18551 ; B 146 156 453 463 ; -C -1 ; WX 600 ; N H18533 ; B 85 67 515 497 ; -C -1 ; WX 600 ; N openbullet ; B 151 158 451 461 ; -C -1 ; WX 600 ; N Amacron ; B -22 0 623 746 ; -C -1 ; WX 600 ; N amacron ; B 43 -17 574 590 ; -C -1 ; WX 600 ; N Ccircumflex ; B 31 -15 566 812 ; -C -1 ; WX 600 ; N ccircumflex ; B 56 -17 568 656 ; -C -1 ; WX 600 ; N Cdot ; B 31 -15 566 793 ; -C -1 ; WX 600 ; N cdot ; B 56 -17 568 638 ; -C -1 ; WX 600 ; N Emacron ; B 15 0 553 746 ; -C -1 ; WX 600 ; N emacron ; B 32 -16 552 590 ; -C -1 ; WX 600 ; N Ebreve ; B 15 0 553 810 ; -C -1 ; WX 600 ; N ebreve ; B 32 -16 552 654 ; -C -1 ; WX 600 ; N Edot ; B 15 0 553 793 ; -C -1 ; WX 600 ; N edot ; B 32 -16 552 638 ; -C -1 ; WX 600 ; N Gcircumflex ; B 32 -15 595 812 ; -C -1 ; WX 600 ; N gcircumflex ; B 32 -209 594 656 ; -C -1 ; WX 600 ; N Gdot ; B 32 -15 595 793 ; -C -1 ; WX 600 ; N gdot ; B 32 -209 594 638 ; -C -1 ; WX 600 ; N Gcedilla ; B 32 -196 595 607 ; -C -1 ; WX 600 ; N gcedilla ; B 32 -209 594 702 ; -C -1 ; WX 600 ; N Hcircumflex ; B 22 0 583 812 ; -C -1 ; WX 600 ; N hcircumflex ; B 13 0 584 812 ; -C -1 ; WX 600 ; N Hbar ; B 22 0 583 592 ; -C -1 ; WX 600 ; N hbar ; B 5 0 584 633 ; -C -1 ; WX 600 ; N Itilde ; B 82 0 518 771 ; -C -1 ; WX 600 ; N itilde ; B 63 0 537 616 ; -C -1 ; WX 600 ; N Imacron ; B 82 0 518 746 ; -C -1 ; WX 600 ; N imacron ; B 63 0 537 590 ; -C -1 ; WX 600 ; N Ibreve ; B 82 0 518 810 ; -C -1 ; WX 600 ; N ibreve ; B 63 0 537 654 ; -C -1 ; WX 600 ; N Iogonek ; B 82 -140 518 592 ; -C -1 ; WX 600 ; N iogonek ; B 63 -140 537 633 ; -C -1 ; WX 600 ; N Jcircumflex ; B 54 -15 614 812 ; -C -1 ; WX 600 ; N jcircumflex ; B 86 -209 460 656 ; -C -1 ; WX 600 ; N Kcedilla ; B 13 -196 605 592 ; -C -1 ; WX 600 ; N kcedilla ; B 34 -196 575 633 ; -C -1 ; WX 600 ; N kgreenlandic ; B 24 0 591 443 ; -C -1 ; WX 600 ; N Lcedilla ; B 33 -196 574 592 ; -C -1 ; WX 600 ; N lcedilla ; B 63 -196 537 633 ; -C -1 ; WX 600 ; N Ncedilla ; B -8 -196 593 592 ; -C -1 ; WX 600 ; N ncedilla ; B 25 -196 574 457 ; -C -1 ; WX 600 ; N Eng ; B 12 -15 549 607 ; -C -1 ; WX 600 ; N eng ; B 38 -209 525 457 ; -C -1 ; WX 600 ; N Omacron ; B 20 -15 581 746 ; -C -1 ; WX 600 ; N omacron ; B 42 -16 560 590 ; -C -1 ; WX 600 ; N Obreve ; B 20 -15 581 810 ; -C -1 ; WX 600 ; N obreve ; B 42 -16 560 654 ; -C -1 ; WX 600 ; N Rcedilla ; B 14 -196 621 592 ; -C -1 ; WX 600 ; N rcedilla ; B 53 -196 573 457 ; -C -1 ; WX 600 ; N Scircumflex ; B 62 -15 540 812 ; -C -1 ; WX 600 ; N scircumflex ; B 74 -16 529 656 ; -C -1 ; WX 600 ; N Tbar ; B 40 0 559 592 ; -C -1 ; WX 600 ; N tbar ; B 61 -16 591 601 ; -C -1 ; WX 600 ; N Utilde ; B 11 -15 591 771 ; -C -1 ; WX 600 ; N utilde ; B 15 -16 575 616 ; -C -1 ; WX 600 ; N Umacron ; B 11 -15 591 746 ; -C -1 ; WX 600 ; N umacron ; B 15 -16 575 590 ; -C -1 ; WX 600 ; N Ubreve ; B 11 -15 591 810 ; -C -1 ; WX 600 ; N ubreve ; B 15 -16 575 654 ; -C -1 ; WX 600 ; N Uogonek ; B 11 -140 591 592 ; -C -1 ; WX 600 ; N uogonek ; B 15 -140 597 443 ; -C -1 ; WX 600 ; N Wcircumflex ; B -11 0 612 812 ; -C -1 ; WX 600 ; N wcircumflex ; B -2 0 602 656 ; -C -1 ; WX 600 ; N Ycircumflex ; B 21 0 581 812 ; -C -1 ; WX 600 ; N ycircumflex ; B 21 -209 582 656 ; -C -1 ; WX 600 ; N longs ; B 73 0 572 633 ; -C -1 ; WX 600 ; N Aringacute ; B -22 0 623 1016 ; -C -1 ; WX 600 ; N aringacute ; B 43 -17 574 865 ; -C -1 ; WX 600 ; N AEacute ; B -21 0 623 822 ; -C -1 ; WX 600 ; N aeacute ; B -21 -16 612 667 ; -C -1 ; WX 600 ; N Oslashacute ; B 11 -71 591 822 ; -C -1 ; WX 600 ; N oslashacute ; B 22 -72 574 667 ; -C -1 ; WX 600 ; N anoteleia ; B 225 323 375 457 ; -C -1 ; WX 600 ; N Wgrave ; B -11 0 612 822 ; -C -1 ; WX 600 ; N wgrave ; B -2 0 602 667 ; -C -1 ; WX 600 ; N Wacute ; B -11 0 612 822 ; -C -1 ; WX 600 ; N wacute ; B -2 0 602 667 ; -C -1 ; WX 600 ; N Wdieresis ; B -11 0 612 783 ; -C -1 ; WX 600 ; N wdieresis ; B -2 0 602 627 ; -C -1 ; WX 600 ; N Ygrave ; B 21 0 581 822 ; -C -1 ; WX 600 ; N ygrave ; B 21 -209 582 667 ; -C -1 ; WX 600 ; N quotereversed ; B 249 316 456 612 ; -C -1 ; WX 600 ; N radicalex ; B 112 525 488 590 ; -C -1 ; WX 600 ; N afii08941 ; B 32 0 552 607 ; -C -1 ; WX 600 ; N estimated ; B 44 -17 561 535 ; -C -1 ; WX 600 ; N oneeighth ; B -23 -7 612 649 ; -C -1 ; WX 600 ; N threeeighths ; B -9 -7 612 648 ; -C -1 ; WX 600 ; N fiveeighths ; B -10 -7 612 640 ; -C -1 ; WX 600 ; N seveneighths ; B -4 -7 612 640 ; -C -1 ; WX 600 ; N commaaccent ; B 246 -250 354 -59 ; -C -1 ; WX 600 ; N undercommaaccent ; B 208 -196 392 -47 ; -C -1 ; WX 600 ; N tonos ; B 203 500 393 667 ; -C -1 ; WX 600 ; N dieresistonos ; B 103 482 492 685 ; -C -1 ; WX 600 ; N Alphatonos ; B -23 0 623 592 ; -C -1 ; WX 600 ; N Epsilontonos ; B -1 0 569 592 ; -C -1 ; WX 600 ; N Etatonos ; B -1 0 587 592 ; -C -1 ; WX 600 ; N Iotatonos ; B -1 0 543 592 ; -C -1 ; WX 600 ; N Omicrontonos ; B -1 -15 583 607 ; -C -1 ; WX 600 ; N Upsilontonos ; B -1 0 604 592 ; -C -1 ; WX 600 ; N Omegatonos ; B -1 0 577 607 ; -C -1 ; WX 600 ; N iotadieresistonos ; B 94 -16 483 709 ; -C -1 ; WX 600 ; N Alpha ; B -22 0 623 592 ; -C -1 ; WX 600 ; N Beta ; B 13 0 574 592 ; -C -1 ; WX 600 ; N Delta ; B 6 0 594 592 ; -C -1 ; WX 600 ; N Epsilon ; B 15 0 553 592 ; -C -1 ; WX 600 ; N Zeta ; B 74 0 529 592 ; -C -1 ; WX 600 ; N Eta ; B 22 0 583 592 ; -C -1 ; WX 600 ; N Iota ; B 82 0 518 592 ; -C -1 ; WX 600 ; N Kappa ; B 13 0 605 592 ; -C -1 ; WX 600 ; N Lambda ; B -21 0 625 592 ; -C -1 ; WX 600 ; N Mu ; B -19 0 624 592 ; -C -1 ; WX 600 ; N Nu ; B -8 0 593 592 ; -C -1 ; WX 600 ; N Xi ; B 51 0 549 592 ; -C -1 ; WX 600 ; N Omicron ; B 20 -15 581 607 ; -C -1 ; WX 600 ; N Pi ; B 20 0 581 592 ; -C -1 ; WX 600 ; N Rho ; B 60 0 577 592 ; -C -1 ; WX 600 ; N Sigma ; B 36 0 540 592 ; -C -1 ; WX 600 ; N Tau ; B 40 0 559 592 ; -C -1 ; WX 600 ; N Upsilon ; B 21 0 581 592 ; -C -1 ; WX 600 ; N Chi ; B 11 0 592 592 ; -C -1 ; WX 600 ; N Psi ; B -3 0 604 592 ; -C -1 ; WX 600 ; N Omega ; B 14 0 587 607 ; -C -1 ; WX 600 ; N Iotadieresis ; B 82 0 518 769 ; -C -1 ; WX 600 ; N Upsilondieresis ; B 21 0 581 769 ; -C -1 ; WX 600 ; N alphatonos ; B 40 -16 577 667 ; -C -1 ; WX 600 ; N epsilontonos ; B 102 -16 505 667 ; -C -1 ; WX 600 ; N etatonos ; B 56 -222 507 667 ; -C -1 ; WX 600 ; N iotatonos ; B 215 -16 432 667 ; -C -1 ; WX 600 ; N upsilondieresistonos ; B 38 -16 563 709 ; -C -1 ; WX 600 ; N beta ; B 113 -222 519 633 ; -C -1 ; WX 600 ; N gamma ; B 21 -222 582 443 ; -C -1 ; WX 600 ; N zeta ; B 151 -222 511 633 ; -C -1 ; WX 600 ; N eta ; B 56 -222 507 457 ; -C -1 ; WX 600 ; N theta ; B 68 -16 531 633 ; -C -1 ; WX 600 ; N iota ; B 223 -16 432 443 ; -C -1 ; WX 600 ; N kappa ; B 61 0 563 443 ; -C -1 ; WX 600 ; N lambda ; B 23 0 586 633 ; -C -1 ; WX 600 ; N mu ; B 14 -209 574 443 ; -C -1 ; WX 600 ; N nu ; B 33 0 514 457 ; -C -1 ; WX 600 ; N xi ; B 141 -222 500 633 ; -C -1 ; WX 600 ; N omicron ; B 42 -16 560 457 ; -C -1 ; WX 600 ; N rho ; B 83 -222 547 457 ; -C -1 ; WX 600 ; N sigma1 ; B 83 -209 532 457 ; -C -1 ; WX 600 ; N upsilon ; B 38 -16 563 443 ; -C -1 ; WX 600 ; N chi ; B 31 -222 584 457 ; -C -1 ; WX 600 ; N psi ; B 35 -222 565 633 ; -C -1 ; WX 600 ; N omega ; B 47 -16 553 457 ; -C -1 ; WX 600 ; N iotadieresis ; B 126 -16 441 627 ; -C -1 ; WX 600 ; N upsilondieresis ; B 38 -16 563 627 ; -C -1 ; WX 600 ; N omicrontonos ; B 42 -16 560 667 ; -C -1 ; WX 600 ; N upsilontonos ; B 38 -16 563 667 ; -C -1 ; WX 600 ; N omegatonos ; B 47 -16 553 667 ; -C -1 ; WX 600 ; N afii10023 ; B 15 0 553 783 ; -C -1 ; WX 600 ; N afii10051 ; B 0 -15 587 592 ; -C -1 ; WX 600 ; N afii10053 ; B 31 -15 566 607 ; -C -1 ; WX 600 ; N afii10054 ; B 62 -15 540 607 ; -C -1 ; WX 600 ; N afii10055 ; B 82 0 518 592 ; -C -1 ; WX 600 ; N afii10056 ; B 82 0 518 783 ; -C -1 ; WX 600 ; N afii10057 ; B 54 -15 614 592 ; -C -1 ; WX 600 ; N afii10058 ; B 1 -16 600 592 ; -C -1 ; WX 600 ; N afii10059 ; B -17 0 622 592 ; -C -1 ; WX 600 ; N afii10060 ; B 5 0 602 592 ; -C -1 ; WX 600 ; N afii10062 ; B 5 -16 607 810 ; -C -1 ; WX 600 ; N afii10017 ; B -22 0 623 592 ; -C -1 ; WX 600 ; N afii10018 ; B 13 0 574 592 ; -C -1 ; WX 600 ; N afii10019 ; B 13 0 574 592 ; -C -1 ; WX 600 ; N afii10020 ; B 33 0 574 592 ; -C -1 ; WX 600 ; N afii10021 ; B 20 -130 581 592 ; -C -1 ; WX 600 ; N afii10022 ; B 15 0 553 592 ; -C -1 ; WX 600 ; N afii10024 ; B 4 0 596 592 ; -C -1 ; WX 600 ; N afii10025 ; B -5 -16 546 644 ; -C -1 ; WX 600 ; N afii10026 ; B -3 0 603 592 ; -C -1 ; WX 600 ; N afii10027 ; B -3 0 603 810 ; -C -1 ; WX 600 ; N afii10028 ; B 40 0 601 592 ; -C -1 ; WX 600 ; N afii10029 ; B 2 -16 581 592 ; -C -1 ; WX 600 ; N afii10030 ; B -19 0 624 592 ; -C -1 ; WX 600 ; N afii10031 ; B 22 0 583 592 ; -C -1 ; WX 600 ; N afii10032 ; B 20 -15 581 607 ; -C -1 ; WX 600 ; N afii10033 ; B 22 0 583 592 ; -C -1 ; WX 600 ; N afii10034 ; B 60 0 577 592 ; -C -1 ; WX 600 ; N afii10035 ; B 31 -15 566 607 ; -C -1 ; WX 600 ; N afii10036 ; B 40 0 559 592 ; -C -1 ; WX 600 ; N afii10037 ; B 5 -16 607 592 ; -C -1 ; WX 600 ; N afii10038 ; B 21 0 579 592 ; -C -1 ; WX 600 ; N afii10039 ; B 11 0 592 592 ; -C -1 ; WX 600 ; N afii10040 ; B 6 -130 594 592 ; -C -1 ; WX 600 ; N afii10041 ; B 17 0 578 592 ; -C -1 ; WX 600 ; N afii10042 ; B -11 0 611 592 ; -C -1 ; WX 600 ; N afii10043 ; B -22 -130 626 592 ; -C -1 ; WX 600 ; N afii10044 ; B -16 0 600 592 ; -C -1 ; WX 600 ; N afii10045 ; B -20 0 632 592 ; -C -1 ; WX 600 ; N afii10046 ; B 13 0 574 592 ; -C -1 ; WX 600 ; N afii10047 ; B 34 -15 569 607 ; -C -1 ; WX 600 ; N afii10048 ; B -18 -15 618 607 ; -C -1 ; WX 600 ; N afii10049 ; B -21 0 586 592 ; -C -1 ; WX 600 ; N afii10065 ; B 43 -17 574 457 ; -C -1 ; WX 600 ; N afii10066 ; B 53 -13 546 646 ; -C -1 ; WX 600 ; N afii10067 ; B 13 0 547 443 ; -C -1 ; WX 600 ; N afii10068 ; B 33 0 574 443 ; -C -1 ; WX 600 ; N afii10069 ; B 34 -118 566 443 ; -C -1 ; WX 600 ; N afii10070 ; B 32 -16 552 457 ; -C -1 ; WX 600 ; N afii10072 ; B 6 0 594 443 ; -C -1 ; WX 600 ; N afii10073 ; B 35 -13 543 491 ; -C -1 ; WX 600 ; N afii10074 ; B 8 0 591 443 ; -C -1 ; WX 600 ; N afii10075 ; B 8 0 591 654 ; -C -1 ; WX 600 ; N afii10076 ; B 47 0 576 443 ; -C -1 ; WX 600 ; N afii10077 ; B 4 -13 561 443 ; -C -1 ; WX 600 ; N afii10078 ; B 1 0 599 443 ; -C -1 ; WX 600 ; N afii10079 ; B 22 0 583 443 ; -C -1 ; WX 600 ; N afii10080 ; B 42 -16 560 457 ; -C -1 ; WX 600 ; N afii10081 ; B 19 0 581 443 ; -C -1 ; WX 600 ; N afii10082 ; B -8 -209 573 457 ; -C -1 ; WX 600 ; N afii10083 ; B 56 -17 568 457 ; -C -1 ; WX 600 ; N afii10084 ; B 40 0 559 443 ; -C -1 ; WX 600 ; N afii10085 ; B 21 -134 591 443 ; -C -1 ; WX 600 ; N afii10086 ; B 46 -140 554 618 ; -C -1 ; WX 600 ; N afii10087 ; B 21 0 582 443 ; -C -1 ; WX 600 ; N afii10088 ; B 6 -118 594 443 ; -C -1 ; WX 600 ; N afii10089 ; B 31 0 564 443 ; -C -1 ; WX 600 ; N afii10090 ; B -11 0 611 443 ; -C -1 ; WX 600 ; N afii10091 ; B -22 -118 626 443 ; -C -1 ; WX 600 ; N afii10092 ; B 6 0 593 443 ; -C -1 ; WX 600 ; N afii10093 ; B -3 0 603 443 ; -C -1 ; WX 600 ; N afii10094 ; B 13 0 547 443 ; -C -1 ; WX 600 ; N afii10095 ; B 32 -16 544 457 ; -C -1 ; WX 600 ; N afii10096 ; B -14 -16 612 457 ; -C -1 ; WX 600 ; N afii10097 ; B 25 0 579 443 ; -C -1 ; WX 600 ; N afii10071 ; B 32 -16 552 627 ; -C -1 ; WX 600 ; N afii10099 ; B 13 -209 511 633 ; -C -1 ; WX 600 ; N afii10100 ; B 33 0 574 667 ; -C -1 ; WX 600 ; N afii10101 ; B 56 -16 568 457 ; -C -1 ; WX 600 ; N afii10102 ; B 74 -16 529 457 ; -C -1 ; WX 600 ; N afii10103 ; B 63 0 537 633 ; -C -1 ; WX 600 ; N afii10104 ; B 63 0 537 627 ; -C -1 ; WX 600 ; N afii10105 ; B 86 -209 460 633 ; -C -1 ; WX 600 ; N afii10106 ; B -4 -13 584 443 ; -C -1 ; WX 600 ; N afii10107 ; B -18 0 619 443 ; -C -1 ; WX 600 ; N afii10108 ; B 13 0 584 633 ; -C -1 ; WX 600 ; N afii10110 ; B 21 -134 591 654 ; -C -1 ; WX 600 ; N afii10193 ; B 19 -115 581 443 ; -C -1 ; WX 600 ; N afii10050 ; B 33 0 574 714 ; -C -1 ; WX 600 ; N afii10098 ; B 33 0 574 565 ; -C -1 ; WX 600 ; N afii00208 ; B 18 233 577 333 ; -C -1 ; WX 600 ; N afii61352 ; B 14 0 595 592 ; -C -1 ; WX 600 ; N pi ; B 43 0 557 443 ; -C -1 ; WX 600 ; N sheva ; B 268 -261 333 -82 ; -C -1 ; WX 600 ; N hatafsegol ; B 161 -261 438 -82 ; -C -1 ; WX 600 ; N hatafpatah ; B 161 -261 431 -82 ; -C -1 ; WX 600 ; N hatafqamats ; B 161 -261 431 -82 ; -C -1 ; WX 600 ; N hiriq ; B 268 -147 333 -83 ; -C -1 ; WX 600 ; N tsere ; B 214 -147 386 -83 ; -C -1 ; WX 600 ; N segol ; B 214 -261 386 -83 ; -C -1 ; WX 600 ; N patah ; B 199 -130 400 -83 ; -C -1 ; WX 600 ; N qamats ; B 199 -215 400 -83 ; -C -1 ; WX 600 ; N holam ; B 268 592 333 657 ; -C -1 ; WX 600 ; N qubuts ; B 162 -261 438 -82 ; -C -1 ; WX 600 ; N dagesh ; B 268 238 333 303 ; -C -1 ; WX 600 ; N meteg ; B 276 -261 324 -82 ; -C -1 ; WX 600 ; N maqaf ; B 47 410 553 510 ; -C -1 ; WX 600 ; N rafe ; B 199 592 400 640 ; -C -1 ; WX 600 ; N paseq ; B 250 -5 350 515 ; -C -1 ; WX 600 ; N shindot ; B 445 592 510 657 ; -C -1 ; WX 600 ; N sindot ; B 90 592 155 657 ; -C -1 ; WX 600 ; N sofpasuq ; B 225 -5 375 483 ; -C -1 ; WX 600 ; N alef ; B 70 -11 530 518 ; -C -1 ; WX 600 ; N bet ; B 45 0 543 510 ; -C -1 ; WX 600 ; N gimel ; B 103 -8 461 510 ; -C -1 ; WX 600 ; N dalet ; B 40 -5 547 510 ; -C -1 ; WX 600 ; N he ; B 63 -5 528 510 ; -C -1 ; WX 600 ; N vav ; B 153 -5 367 510 ; -C -1 ; WX 600 ; N zayin ; B 125 -5 476 510 ; -C -1 ; WX 600 ; N het ; B 38 -5 563 510 ; -C -1 ; WX 600 ; N tet ; B 16 -5 514 514 ; -C -1 ; WX 600 ; N yod ; B 152 251 375 510 ; -C -1 ; WX 600 ; N finalkaf ; B 41 -124 546 510 ; -C -1 ; WX 600 ; N kaf ; B 57 0 528 510 ; -C -1 ; WX 600 ; N lamed ; B 72 0 500 659 ; -C -1 ; WX 600 ; N finalmem ; B 21 0 514 510 ; -C -1 ; WX 600 ; N mem ; B 37 -5 521 516 ; -C -1 ; WX 600 ; N finalnun ; B 137 -124 448 510 ; -C -1 ; WX 600 ; N nun ; B 99 0 391 510 ; -C -1 ; WX 600 ; N samekh ; B 10 -6 516 510 ; -C -1 ; WX 600 ; N ayin ; B 65 0 510 510 ; -C -1 ; WX 600 ; N finalpe ; B 93 -124 573 510 ; -C -1 ; WX 600 ; N pe ; B 95 0 500 510 ; -C -1 ; WX 600 ; N finaltsadi ; B 68 -124 510 510 ; -C -1 ; WX 600 ; N tsadi ; B 56 0 509 510 ; -C -1 ; WX 600 ; N qof ; B 64 -202 527 510 ; -C -1 ; WX 600 ; N resh ; B 51 -5 490 510 ; -C -1 ; WX 600 ; N shin ; B 51 0 549 515 ; -C -1 ; WX 600 ; N tav ; B 55 -5 519 510 ; -C -1 ; WX 600 ; N doublevav ; B 41 -5 514 510 ; -C -1 ; WX 600 ; N vavyod ; B 30 -5 514 510 ; -C -1 ; WX 600 ; N doubleyod ; B 30 251 519 510 ; -C -1 ; WX 600 ; N geresh ; B 200 229 400 515 ; -C -1 ; WX 600 ; N gershayim ; B 102 229 498 515 ; -C -1 ; WX 600 ; N newsheqelsign ; B 28 -5 572 515 ; -C -1 ; WX 600 ; N vavshindot ; B 77 -5 367 657 ; -C -1 ; WX 600 ; N finalkafsheva ; B 41 -124 546 510 ; -C -1 ; WX 600 ; N finalkafqamats ; B 41 -124 546 510 ; -C -1 ; WX 600 ; N lamedholam ; B -31 0 500 659 ; -C -1 ; WX 600 ; N lamedholamdagesh ; B -31 0 500 659 ; -C -1 ; WX 600 ; N altayin ; B 65 0 510 510 ; -C -1 ; WX 600 ; N shinshindot ; B 51 0 549 657 ; -C -1 ; WX 600 ; N shinsindot ; B 51 0 549 657 ; -C -1 ; WX 600 ; N shindageshshindot ; B 51 0 549 657 ; -C -1 ; WX 600 ; N shindageshsindot ; B 51 0 549 657 ; -C -1 ; WX 600 ; N alefpatah ; B 70 -130 530 518 ; -C -1 ; WX 600 ; N alefqamats ; B 70 -215 530 518 ; -C -1 ; WX 600 ; N alefmapiq ; B 70 -11 530 518 ; -C -1 ; WX 600 ; N betdagesh ; B 45 0 543 510 ; -C -1 ; WX 600 ; N gimeldagesh ; B 103 -8 461 510 ; -C -1 ; WX 600 ; N daletdagesh ; B 40 -5 547 510 ; -C -1 ; WX 600 ; N hedagesh ; B 63 -5 528 510 ; -C -1 ; WX 600 ; N vavdagesh ; B 153 -5 367 510 ; -C -1 ; WX 600 ; N zayindagesh ; B 125 -5 476 510 ; -C -1 ; WX 600 ; N tetdagesh ; B 16 -5 514 514 ; -C -1 ; WX 600 ; N yoddagesh ; B 152 251 375 510 ; -C -1 ; WX 600 ; N finalkafdagesh ; B 41 -124 546 510 ; -C -1 ; WX 600 ; N kafdagesh ; B 57 0 528 510 ; -C -1 ; WX 600 ; N lameddagesh ; B 72 0 500 659 ; -C -1 ; WX 600 ; N memdagesh ; B 37 -5 521 516 ; -C -1 ; WX 600 ; N nundagesh ; B 99 0 391 510 ; -C -1 ; WX 600 ; N samekhdagesh ; B 10 -6 516 510 ; -C -1 ; WX 600 ; N finalpedagesh ; B 88 -124 578 510 ; -C -1 ; WX 600 ; N pedagesh ; B 90 0 505 510 ; -C -1 ; WX 600 ; N tsadidagesh ; B 56 0 509 510 ; -C -1 ; WX 600 ; N qofdagesh ; B 64 -202 527 510 ; -C -1 ; WX 600 ; N reshdagesh ; B 51 -5 490 510 ; -C -1 ; WX 600 ; N shindagesh ; B 51 0 549 515 ; -C -1 ; WX 600 ; N tavdages ; B 55 -5 519 510 ; -C -1 ; WX 600 ; N vavholam ; B 153 -5 367 657 ; -C -1 ; WX 600 ; N betrafe ; B 45 0 543 640 ; -C -1 ; WX 600 ; N kafrafe ; B 57 0 528 640 ; -C -1 ; WX 600 ; N perafe ; B 95 0 500 640 ; -C -1 ; WX 600 ; N aleflamed ; B 49 -11 536 659 ; -C -1 ; WX 600 ; N zerowidthnonjoiner ; B 283 -134 318 629 ; -C -1 ; WX 600 ; N zerowidthjoiner ; B 193 -134 407 690 ; -C -1 ; WX 600 ; N lefttorightmark ; B 172 -134 458 690 ; -C -1 ; WX 600 ; N righttoleftmark ; B 143 -134 429 690 ; -C -1 ; WX 600 ; N afii57388 ; B 218 -8 382 249 ; -C -1 ; WX 600 ; N afii57403 ; B 218 -18 382 525 ; -C -1 ; WX 600 ; N afii57407 ; B 82 -15 498 607 ; -C -1 ; WX 600 ; N afii57409 ; B 218 77 467 382 ; -C -1 ; WX 600 ; N afii57440 ; B 0 0 600 110 ; -C -1 ; WX 600 ; N afii57451 ; B 228 771 372 957 ; -C -1 ; WX 600 ; N afii57452 ; B 176 768 385 1004 ; -C -1 ; WX 600 ; N afii57453 ; B 228 -284 372 -98 ; -C -1 ; WX 600 ; N afii57454 ; B 228 771 372 871 ; -C -1 ; WX 600 ; N afii57455 ; B 190 774 381 1000 ; -C -1 ; WX 600 ; N afii57456 ; B 228 -197 372 -98 ; -C -1 ; WX 600 ; N afii57457 ; B 195 778 395 954 ; -C -1 ; WX 600 ; N afii57458 ; B 229 791 371 953 ; -C -1 ; WX 600 ; N afii57392 ; B 203 175 397 460 ; -C -1 ; WX 600 ; N afii57393 ; B 160 0 392 638 ; -C -1 ; WX 600 ; N afii57394 ; B 133 -8 441 650 ; -C -1 ; WX 600 ; N afii57395 ; B 101 -4 510 649 ; -C -1 ; WX 600 ; N afii57396 ; B 160 -2 463 632 ; -C -1 ; WX 600 ; N afii57397 ; B 140 29 455 432 ; -C -1 ; WX 600 ; N afii57398 ; B 115 2 445 662 ; -C -1 ; WX 600 ; N afii57399 ; B 103 0 498 666 ; -C -1 ; WX 600 ; N afii57400 ; B 103 -10 498 656 ; -C -1 ; WX 600 ; N afii57401 ; B 114 -40 449 592 ; -C -1 ; WX 600 ; N afii57381 ; B 57 -115 543 706 ; -C -1 ; WX 600 ; N afii57461 ; B 218 -130 382 126 ; -C -1 ; WX 600 ; N afii63167 ; B 82 -1 518 419 ; -C -1 ; WX 600 ; N afii57459 ; B 275 769 323 1099 ; -C -1 ; WX 600 ; N afii57543 ; B 220 767 374 976 ; -C -1 ; WX 600 ; N afii57534 ; B 225 0 474 387 ; -C -1 ; WX 600 ; N afii57494 ; B 138 858 462 961 ; -C -1 ; WX 600 ; N afii62843 ; B 118 -2 486 641 ; -C -1 ; WX 600 ; N afii62844 ; B 110 -26 481 618 ; -C -1 ; WX 600 ; N afii62845 ; B 131 -28 474 593 ; -C -1 ; WX 600 ; N afii64240 ; B 0 -243 596 642 ; -C -1 ; WX 600 ; N afii64241 ; B 0 -296 592 412 ; -C -1 ; WX 600 ; N afii63954 ; B 0 -207 592 645 ; -C -1 ; WX 600 ; N afii57382 ; B 0 -126 600 481 ; -C -1 ; WX 600 ; N afii64242 ; B 0 -150 600 512 ; -C -1 ; WX 600 ; N afii62881 ; B 195 778 395 1131 ; -C -1 ; WX 600 ; N afii57504 ; B 242 -295 396 -87 ; -C -1 ; WX 600 ; N afii57369 ; B 242 -376 398 -85 ; -C -1 ; WX 600 ; N afii57370 ; B 242 -464 398 -86 ; -C -1 ; WX 600 ; N afii57371 ; B 219 766 374 1117 ; -C -1 ; WX 600 ; N afii57372 ; B 219 767 373 1205 ; -C -1 ; WX 600 ; N afii57373 ; B 211 766 375 1172 ; -C -1 ; WX 600 ; N afii57374 ; B 167 766 375 1221 ; -C -1 ; WX 600 ; N afii57375 ; B 151 766 375 1217 ; -C -1 ; WX 600 ; N afii57391 ; B 0 0 600 110 ; -C -1 ; WX 600 ; N afii57471 ; B 190 628 407 818 ; -C -1 ; WX 600 ; N afii57460 ; B 177 -20 394 818 ; -C -1 ; WX 600 ; N afii52258 ; B 161 0 600 818 ; -C -1 ; WX 600 ; N afii57506 ; B 5 -300 554 415 ; -C -1 ; WX 600 ; N afii62958 ; B 0 -300 600 397 ; -C -1 ; WX 600 ; N afii62956 ; B 0 -300 569 412 ; -C -1 ; WX 600 ; N afii52957 ; B 0 -288 600 417 ; -C -1 ; WX 600 ; N afii57505 ; B 2 0 596 792 ; -C -1 ; WX 600 ; N afii62889 ; B 0 -16 605 719 ; -C -1 ; WX 600 ; N afii62887 ; B 0 0 599 778 ; -C -1 ; WX 600 ; N afii62888 ; B 0 0 600 731 ; -C -1 ; WX 600 ; N afii57507 ; B 108 -300 600 312 ; -C -1 ; WX 600 ; N afii62961 ; B 80 -300 601 374 ; -C -1 ; WX 600 ; N afii62959 ; B 0 -281 600 370 ; -C -1 ; WX 600 ; N afii62960 ; B 0 -284 600 373 ; -C -1 ; WX 600 ; N afii57508 ; B 66 -205 531 749 ; -C -1 ; WX 600 ; N afii62962 ; B 50 -206 600 740 ; -C -1 ; WX 600 ; N afii57567 ; B 0 -7 594 613 ; -C -1 ; WX 600 ; N afii62964 ; B 0 -4 600 636 ; -C -1 ; WX 600 ; N afii52305 ; B 0 0 600 638 ; -C -1 ; WX 600 ; N afii52306 ; B 0 0 600 636 ; -C -1 ; WX 600 ; N afii57509 ; B 1 -8 600 659 ; -C -1 ; WX 600 ; N afii62967 ; B 0 -7 600 663 ; -C -1 ; WX 600 ; N afii62965 ; B 0 0 600 663 ; -C -1 ; WX 600 ; N afii62966 ; B 0 0 600 665 ; -C -1 ; WX 600 ; N afii57555 ; B 27 -119 517 376 ; -C -1 ; WX 600 ; N afii52364 ; B 30 -279 600 110 ; -C -1 ; WX 600 ; N afii63753 ; B 83 -298 551 392 ; -C -1 ; WX 600 ; N afii63754 ; B 51 -300 547 381 ; -C -1 ; WX 600 ; N afii63759 ; B 83 -298 598 619 ; -C -1 ; WX 600 ; N afii63763 ; B 83 -298 598 754 ; -C -1 ; WX 600 ; N afii63795 ; B 50 -178 546 626 ; -C -1 ; WX 600 ; N afii62891 ; B 50 -300 546 627 ; -C -1 ; WX 600 ; N afii63808 ; B 84 -300 600 638 ; -C -1 ; WX 600 ; N afii62938 ; B 84 -300 600 638 ; -C -1 ; WX 600 ; N afii63810 ; B 84 -300 600 638 ; -C -1 ; WX 600 ; N afii62942 ; B 122 -300 458 630 ; -C -1 ; WX 600 ; N afii62947 ; B 44 -170 541 601 ; -C -1 ; WX 600 ; N afii63813 ; B 44 -300 542 601 ; -C -1 ; WX 600 ; N afii63823 ; B 83 -298 551 627 ; -C -1 ; WX 600 ; N afii63824 ; B 51 -177 547 609 ; -C -1 ; WX 600 ; N afii63833 ; B 83 -298 594 392 ; -C -1 ; WX 600 ; N afii63844 ; B 51 -300 548 381 ; -C -1 ; WX 600 ; N afii62882 ; B 186 778 395 1169 ; -C -1 ; WX 600 ; N afii62883 ; B 195 772 395 1134 ; -C -1 ; WX 600 ; N afii62884 ; B 195 778 395 1049 ; -C -1 ; WX 600 ; N afii62885 ; B 173 778 395 1159 ; -C -1 ; WX 600 ; N afii62886 ; B 195 773 395 1053 ; -C -1 ; WX 600 ; N afii63846 ; B 0 -289 600 388 ; -C -1 ; WX 600 ; N afii63849 ; B 0 -291 600 523 ; -C -1 ; WX 600 ; N afii63850 ; B 1 -300 600 211 ; -C -1 ; WX 600 ; N afii63851 ; B 1 -295 600 210 ; -C -1 ; WX 600 ; N afii63852 ; B 0 -210 600 602 ; -C -1 ; WX 600 ; N afii63855 ; B 0 -189 600 620 ; -C -1 ; WX 600 ; N afii63856 ; B 1 -280 600 450 ; -C -1 ; WX 600 ; N afii63761 ; B 21 -295 620 450 ; -C -1 ; WX 600 ; N afii63882 ; B 1 -280 600 459 ; -C -1 ; WX 600 ; N afii63825 ; B 21 -295 620 459 ; -C -1 ; WX 600 ; N afii63885 ; B 0 -295 601 388 ; -C -1 ; WX 600 ; N afii63888 ; B 0 -295 601 524 ; -C -1 ; WX 600 ; N afii63896 ; B 0 -295 592 523 ; -C -1 ; WX 600 ; N afii63897 ; B 0 -201 591 522 ; -C -1 ; WX 600 ; N afii63898 ; B 0 -201 591 584 ; -C -1 ; WX 600 ; N afii63899 ; B 0 -243 558 463 ; -C -1 ; WX 600 ; N afii63900 ; B 0 -250 592 412 ; -C -1 ; WX 600 ; N afii63901 ; B 0 -201 601 741 ; -C -1 ; WX 600 ; N afii63902 ; B 0 0 601 741 ; -C -1 ; WX 600 ; N afii63903 ; B 0 0 601 741 ; -C -1 ; WX 600 ; N afii63904 ; B 0 0 573 684 ; -C -1 ; WX 600 ; N afii63905 ; B 0 -207 592 624 ; -C -1 ; WX 600 ; N afii63906 ; B 0 0 572 819 ; -C -1 ; WX 600 ; N afii63908 ; B 0 -1 600 512 ; -C -1 ; WX 600 ; N afii63910 ; B 0 -1 600 512 ; -C -1 ; WX 600 ; N afii63912 ; B 0 -1 600 709 ; -C -1 ; WX 600 ; N afii62927 ; B 0 -4 598 581 ; -C -1 ; WX 600 ; N afii63941 ; B 0 -240 600 641 ; -C -1 ; WX 600 ; N afii62939 ; B 0 0 600 641 ; -C -1 ; WX 600 ; N afii63943 ; B 0 0 600 641 ; -C -1 ; WX 600 ; N afii62943 ; B 0 -55 598 636 ; -C -1 ; WX 600 ; N afii62946 ; B 0 -207 586 645 ; -C -1 ; WX 600 ; N afii63946 ; B 0 -200 577 482 ; -C -1 ; WX 600 ; N afii62951 ; B 0 0 577 482 ; -C -1 ; WX 600 ; N afii63948 ; B 0 0 577 542 ; -C -1 ; WX 600 ; N afii62953 ; B 0 -7 563 483 ; -C -1 ; WX 600 ; N afii63950 ; B 0 -201 591 743 ; -C -1 ; WX 600 ; N afii63951 ; B 0 0 591 743 ; -C -1 ; WX 600 ; N afii63952 ; B 0 0 591 743 ; -C -1 ; WX 600 ; N afii63953 ; B 0 0 576 680 ; -C -1 ; WX 600 ; N afii63956 ; B 0 -1 600 627 ; -C -1 ; WX 600 ; N afii63958 ; B 0 -262 600 522 ; -C -1 ; WX 600 ; N afii63959 ; B 0 -140 601 522 ; -C -1 ; WX 600 ; N afii63960 ; B 0 -140 601 721 ; -C -1 ; WX 600 ; N afii63961 ; B 0 -252 601 463 ; -C -1 ; WX 600 ; N afii64046 ; B 0 -4 598 790 ; -C -1 ; WX 600 ; N afii64058 ; B 200 0 600 831 ; -C -1 ; WX 600 ; N afii64059 ; B 207 -20 350 831 ; -C -1 ; WX 600 ; N afii64060 ; B 264 -156 489 642 ; -C -1 ; WX 600 ; N afii64061 ; B 118 -156 343 642 ; -C -1 ; WX 600 ; N afii62945 ; B 0 0 596 642 ; -C -1 ; WX 600 ; N afii64184 ; B 0 0 600 695 ; -C -1 ; WX 600 ; N afii52399 ; B 218 77 467 382 ; -C -1 ; WX 600 ; N afii52400 ; B 138 -20 462 798 ; -C -1 ; WX 600 ; N afii62753 ; B 110 0 600 798 ; -C -1 ; WX 600 ; N afii57411 ; B 191 -20 345 831 ; -C -1 ; WX 600 ; N afii62754 ; B 184 0 600 831 ; -C -1 ; WX 600 ; N afii57412 ; B 97 -195 505 608 ; -C -1 ; WX 600 ; N afii62755 ; B 99 -195 600 608 ; -C -1 ; WX 600 ; N afii57413 ; B 202 -300 356 634 ; -C -1 ; WX 600 ; N afii62756 ; B 224 -296 600 630 ; -C -1 ; WX 600 ; N afii57414 ; B 27 -119 517 583 ; -C -1 ; WX 600 ; N afii62759 ; B 30 -279 600 383 ; -C -1 ; WX 600 ; N afii62757 ; B 0 0 569 651 ; -C -1 ; WX 600 ; N afii62758 ; B 0 0 600 664 ; -C -1 ; WX 600 ; N afii57415 ; B 234 -20 339 634 ; -C -1 ; WX 600 ; N afii62760 ; B 224 0 600 630 ; -C -1 ; WX 600 ; N afii57416 ; B 5 -260 554 415 ; -C -1 ; WX 600 ; N afii62763 ; B 0 -260 600 397 ; -C -1 ; WX 600 ; N afii62761 ; B 0 -224 569 412 ; -C -1 ; WX 600 ; N afii62762 ; B 0 -261 600 417 ; -C -1 ; WX 600 ; N afii57417 ; B 179 0 474 601 ; -C -1 ; WX 600 ; N afii62764 ; B 154 0 600 700 ; -C -1 ; WX 600 ; N afii57418 ; B 5 0 554 529 ; -C -1 ; WX 600 ; N afii62767 ; B 0 0 600 529 ; -C -1 ; WX 600 ; N afii62765 ; B 0 0 600 627 ; -C -1 ; WX 600 ; N afii62766 ; B 0 0 600 610 ; -C -1 ; WX 600 ; N afii57419 ; B 5 0 554 722 ; -C -1 ; WX 600 ; N afii62770 ; B 0 0 600 722 ; -C -1 ; WX 600 ; N afii62768 ; B 0 0 599 752 ; -C -1 ; WX 600 ; N afii62769 ; B 0 0 600 740 ; -C -1 ; WX 600 ; N afii57420 ; B 108 -300 600 312 ; -C -1 ; WX 600 ; N afii62773 ; B 78 -300 599 374 ; -C -1 ; WX 600 ; N afii62771 ; B 0 -157 600 370 ; -C -1 ; WX 600 ; N afii62772 ; B 0 -244 600 373 ; -C -1 ; WX 600 ; N afii57421 ; B 108 -300 600 312 ; -C -1 ; WX 600 ; N afii62776 ; B 78 -300 599 374 ; -C -1 ; WX 600 ; N afii62774 ; B 0 0 600 370 ; -C -1 ; WX 600 ; N afii62775 ; B 0 0 600 373 ; -C -1 ; WX 600 ; N afii57422 ; B 108 -300 600 607 ; -C -1 ; WX 600 ; N afii62779 ; B 78 -300 599 595 ; -C -1 ; WX 600 ; N afii62777 ; B 0 0 600 560 ; -C -1 ; WX 600 ; N afii62778 ; B 0 0 600 626 ; -C -1 ; WX 600 ; N afii57423 ; B 182 -5 519 451 ; -C -1 ; WX 600 ; N afii62780 ; B 143 0 600 506 ; -C -1 ; WX 600 ; N afii57424 ; B 182 -5 519 681 ; -C -1 ; WX 600 ; N afii62781 ; B 143 0 600 684 ; -C -1 ; WX 600 ; N afii57425 ; B 66 -205 512 394 ; -C -1 ; WX 600 ; N afii62782 ; B 50 -206 600 387 ; -C -1 ; WX 600 ; N afii57426 ; B 66 -205 512 634 ; -C -1 ; WX 600 ; N afii62783 ; B 50 -206 600 634 ; -C -1 ; WX 600 ; N afii57427 ; B 0 -182 585 398 ; -C -1 ; WX 600 ; N afii62786 ; B 0 -182 600 406 ; -C -1 ; WX 600 ; N afii62784 ; B 0 0 575 396 ; -C -1 ; WX 600 ; N afii62785 ; B 0 0 600 394 ; -C -1 ; WX 600 ; N afii57428 ; B 0 -182 585 688 ; -C -1 ; WX 600 ; N afii62789 ; B 0 -182 600 688 ; -C -1 ; WX 600 ; N afii62787 ; B 0 0 575 688 ; -C -1 ; WX 600 ; N afii62788 ; B 0 0 600 698 ; -C -1 ; WX 600 ; N afii57429 ; B 1 -188 571 355 ; -C -1 ; WX 600 ; N afii62792 ; B 1 -188 600 355 ; -C -1 ; WX 600 ; N afii62790 ; B 0 0 578 353 ; -C -1 ; WX 600 ; N afii62791 ; B 0 0 600 353 ; -C -1 ; WX 600 ; N afii57430 ; B 1 -188 571 574 ; -C -1 ; WX 600 ; N afii62795 ; B 1 -188 600 574 ; -C -1 ; WX 600 ; N afii62793 ; B 0 0 578 566 ; -C -1 ; WX 600 ; N afii62794 ; B 0 0 600 566 ; -C -1 ; WX 600 ; N afii57431 ; B 0 0 577 628 ; -C -1 ; WX 600 ; N afii62798 ; B 0 0 600 628 ; -C -1 ; WX 600 ; N afii62796 ; B 0 0 577 628 ; -C -1 ; WX 600 ; N afii62797 ; B 0 0 600 628 ; -C -1 ; WX 600 ; N afii57432 ; B 0 0 577 628 ; -C -1 ; WX 600 ; N afii62801 ; B 0 0 600 628 ; -C -1 ; WX 600 ; N afii62799 ; B 0 0 577 628 ; -C -1 ; WX 600 ; N afii62800 ; B 0 0 600 628 ; -C -1 ; WX 600 ; N afii57433 ; B 85 -300 595 371 ; -C -1 ; WX 600 ; N afii62804 ; B 107 -300 600 356 ; -C -1 ; WX 600 ; N afii62802 ; B 0 0 485 376 ; -C -1 ; WX 600 ; N afii62803 ; B 0 0 600 356 ; -C -1 ; WX 600 ; N afii57434 ; B 85 -300 595 640 ; -C -1 ; WX 600 ; N afii62807 ; B 107 -300 600 587 ; -C -1 ; WX 600 ; N afii62805 ; B 0 0 485 630 ; -C -1 ; WX 600 ; N afii62806 ; B 0 0 600 594 ; -C -1 ; WX 600 ; N afii57441 ; B 2 0 594 661 ; -C -1 ; WX 600 ; N afii62810 ; B 0 -16 600 616 ; -C -1 ; WX 600 ; N afii62808 ; B 0 0 592 661 ; -C -1 ; WX 600 ; N afii62809 ; B 0 0 600 615 ; -C -1 ; WX 600 ; N afii57442 ; B 53 -188 585 599 ; -C -1 ; WX 600 ; N afii62813 ; B 70 -174 600 536 ; -C -1 ; WX 600 ; N afii62811 ; B 0 0 592 634 ; -C -1 ; WX 600 ; N afii62812 ; B 0 0 600 623 ; -C -1 ; WX 600 ; N afii57443 ; B 4 -18 560 635 ; -C -1 ; WX 600 ; N afii62816 ; B 4 -18 600 633 ; -C -1 ; WX 600 ; N afii57410 ; B 0 0 600 638 ; -C -1 ; WX 600 ; N afii62815 ; B 0 0 600 636 ; -C -1 ; WX 600 ; N afii57444 ; B 67 -96 549 636 ; -C -1 ; WX 600 ; N afii62819 ; B 19 -157 600 630 ; -C -1 ; WX 600 ; N afii62817 ; B 0 0 587 645 ; -C -1 ; WX 600 ; N afii62818 ; B 0 0 600 633 ; -C -1 ; WX 600 ; N afii57445 ; B 169 -300 600 342 ; -C -1 ; WX 600 ; N afii62822 ; B 169 -300 600 342 ; -C -1 ; WX 600 ; N afii62820 ; B 0 -6 560 364 ; -C -1 ; WX 600 ; N afii62821 ; B 0 -6 600 364 ; -C -1 ; WX 600 ; N afii57446 ; B 63 -193 547 542 ; -C -1 ; WX 600 ; N afii62825 ; B 42 -210 600 548 ; -C -1 ; WX 600 ; N afii62823 ; B 0 0 569 647 ; -C -1 ; WX 600 ; N afii62824 ; B 0 0 600 631 ; -C -1 ; WX 600 ; N afii57447 ; B 225 0 474 387 ; -C -1 ; WX 600 ; N afii62828 ; B 154 0 600 506 ; -C -1 ; WX 600 ; N afii57470 ; B 0 -8 461 375 ; -C -1 ; WX 600 ; N afii62827 ; B 0 -208 600 366 ; -C -1 ; WX 600 ; N afii57448 ; B 97 -195 505 330 ; -C -1 ; WX 600 ; N afii62829 ; B 99 -195 600 337 ; -C -1 ; WX 600 ; N afii57449 ; B 27 -119 517 376 ; -C -1 ; WX 600 ; N afii62830 ; B 30 -279 600 110 ; -C -1 ; WX 600 ; N afii57450 ; B 27 -297 517 376 ; -C -1 ; WX 600 ; N afii62833 ; B 47 -300 600 110 ; -C -1 ; WX 600 ; N afii62831 ; B 0 -287 575 412 ; -C -1 ; WX 600 ; N afii62832 ; B 0 -295 600 417 ; -C -1 ; WX 600 ; N afii62834 ; B 30 0 494 726 ; -C -1 ; WX 600 ; N afii62835 ; B 33 -42 600 694 ; -C -1 ; WX 600 ; N afii62836 ; B 53 0 494 796 ; -C -1 ; WX 600 ; N afii62837 ; B 62 -42 600 807 ; -C -1 ; WX 600 ; N afii62838 ; B 53 -295 494 640 ; -C -1 ; WX 600 ; N afii62839 ; B 74 -300 600 678 ; -C -1 ; WX 600 ; N afii62840 ; B 53 0 494 640 ; -C -1 ; WX 600 ; N afii62841 ; B 74 -42 600 678 ; -C -1 ; WX 600 ; N glyph1021 ; B 240 477 390 626 ; -C -1 ; WX 600 ; N afii57543-2 ; B 220 660 374 868 ; -C -1 ; WX 600 ; N afii57454-2 ; B 228 664 372 763 ; -C -1 ; WX 600 ; N afii57451-2 ; B 228 660 372 846 ; -C -1 ; WX 600 ; N glyph1025 ; B 43 0 494 887 ; -C -1 ; WX 600 ; N glyph1026 ; B 58 0 494 997 ; -C -1 ; WX 600 ; N afii57471-2 ; B 190 521 407 710 ; -C -1 ; WX 600 ; N afii57458-2 ; B 229 684 371 846 ; -C -1 ; WX 600 ; N afii57457-2 ; B 195 671 395 846 ; -C -1 ; WX 600 ; N afii57494-2 ; B 138 751 462 854 ; -C -1 ; WX 600 ; N afii57459-2 ; B 275 663 323 993 ; -C -1 ; WX 600 ; N afii57455-2 ; B 190 667 381 893 ; -C -1 ; WX 600 ; N afii57452-2 ; B 176 660 385 897 ; -C -1 ; WX 600 ; N glyph1034 ; B 58 0 494 964 ; -C -1 ; WX 600 ; N glyph1035 ; B 13 0 494 1013 ; -C -1 ; WX 600 ; N glyph1036 ; B 0 0 494 1009 ; -C -1 ; WX 600 ; N afii62884-2 ; B 195 671 395 942 ; -C -1 ; WX 600 ; N afii62881-2 ; B 195 671 395 1023 ; -C -1 ; WX 600 ; N afii62886-2 ; B 195 666 395 946 ; -C -1 ; WX 600 ; N afii62883-2 ; B 195 665 395 1027 ; -C -1 ; WX 600 ; N afii62885-2 ; B 173 671 395 1052 ; -C -1 ; WX 600 ; N afii62882-2 ; B 186 671 395 1062 ; -C -1 ; WX 600 ; N afii57504-2 ; B 193 -535 348 -326 ; -C -1 ; WX 600 ; N afii57456-2 ; B 179 -437 323 -337 ; -C -1 ; WX 600 ; N afii57453-2 ; B 179 -523 323 -337 ; -C -1 ; WX 600 ; N glyph1046 ; B 53 -376 494 640 ; -C -1 ; WX 600 ; N glyph1047 ; B 53 -464 494 640 ; -C -1 ; WX 600 ; N afii57543-3 ; B 229 464 383 673 ; -C -1 ; WX 600 ; N afii57454-3 ; B 219 469 363 568 ; -C -1 ; WX 600 ; N afii57451-3 ; B 219 465 363 651 ; -C -1 ; WX 600 ; N glyph1051 ; B 67 -42 600 924 ; -C -1 ; WX 600 ; N glyph1052 ; B 66 -42 600 1012 ; -C -1 ; WX 600 ; N afii57471-3 ; B 181 326 398 515 ; -C -1 ; WX 600 ; N afii57458-3 ; B 220 488 362 650 ; -C -1 ; WX 600 ; N afii57457-3 ; B 186 476 386 651 ; -C -1 ; WX 600 ; N afii57494-3 ; B 129 556 453 658 ; -C -1 ; WX 600 ; N afii57459-3 ; B 267 467 314 798 ; -C -1 ; WX 600 ; N afii57455-3 ; B 181 472 372 698 ; -C -1 ; WX 600 ; N afii57452-3 ; B 167 465 376 702 ; -C -1 ; WX 600 ; N glyph1060 ; B 59 -42 600 979 ; -C -1 ; WX 600 ; N glyph1061 ; B 13 -42 600 1028 ; -C -1 ; WX 600 ; N glyph1062 ; B -2 -42 600 1024 ; -C -1 ; WX 600 ; N afii62884-3 ; B 186 476 386 747 ; -C -1 ; WX 600 ; N afii62881-3 ; B 186 476 386 828 ; -C -1 ; WX 600 ; N afii62886-3 ; B 186 470 386 750 ; -C -1 ; WX 600 ; N afii62883-3 ; B 186 470 386 832 ; -C -1 ; WX 600 ; N afii62885-3 ; B 165 476 386 856 ; -C -1 ; WX 600 ; N afii62882-3 ; B 177 476 386 866 ; -C -1 ; WX 600 ; N afii57504-3 ; B 193 -710 348 -502 ; -C -1 ; WX 600 ; N afii57456-3 ; B 179 -612 323 -513 ; -C -1 ; WX 600 ; N afii57453-3 ; B 179 -699 323 -513 ; -C -1 ; WX 600 ; N glyph1072 ; B 74 -376 600 678 ; -C -1 ; WX 600 ; N glyph1073 ; B 74 -464 600 678 ; -C -1 ; WX 600 ; N afii57543-4 ; B 88 596 242 805 ; -C -1 ; WX 600 ; N afii57454-4 ; B 96 601 240 700 ; -C -1 ; WX 600 ; N afii57451-4 ; B 96 600 240 786 ; -C -1 ; WX 600 ; N glyph1077 ; B 178 -20 347 921 ; -C -1 ; WX 600 ; N glyph1078 ; B 178 -20 347 1008 ; -C -1 ; WX 600 ; N afii57471-4 ; B 58 458 275 647 ; -C -1 ; WX 600 ; N afii57458-4 ; B 97 620 239 782 ; -C -1 ; WX 600 ; N afii57457-4 ; B 63 607 263 783 ; -C -1 ; WX 600 ; N afii57494-4 ; B 6 688 330 790 ; -C -1 ; WX 600 ; N afii57459-4 ; B 145 598 192 928 ; -C -1 ; WX 600 ; N afii57455-4 ; B 58 604 249 830 ; -C -1 ; WX 600 ; N afii57452-4 ; B 44 597 253 833 ; -C -1 ; WX 600 ; N glyph1086 ; B 184 -20 347 1004 ; -C -1 ; WX 600 ; N glyph1087 ; B 140 -20 348 1054 ; -C -1 ; WX 600 ; N glyph1088 ; B 124 -20 347 1052 ; -C -1 ; WX 600 ; N afii62884-4 ; B 63 607 263 878 ; -C -1 ; WX 600 ; N afii62881-4 ; B 63 607 263 960 ; -C -1 ; WX 600 ; N afii62886-4 ; B 63 602 263 882 ; -C -1 ; WX 600 ; N afii62883-4 ; B 63 602 263 963 ; -C -1 ; WX 600 ; N afii62885-4 ; B 42 607 263 988 ; -C -1 ; WX 600 ; N afii62882-4 ; B 54 607 263 998 ; -C -1 ; WX 600 ; N afii57504-4 ; B 130 -295 284 -87 ; -C -1 ; WX 600 ; N afii57456-4 ; B 116 -209 260 -110 ; -C -1 ; WX 600 ; N afii57453-4 ; B 116 -296 260 -110 ; -C -1 ; WX 600 ; N glyph1098 ; B 202 -376 358 634 ; -C -1 ; WX 600 ; N glyph1099 ; B 202 -464 358 634 ; -C -1 ; WX 600 ; N glyph1100 ; B 141 372 435 529 ; -C -1 ; WX 600 ; N glyph1101 ; B 123 429 417 722 ; -C -1 ; WX 600 ; N glyph1102 ; B 164 -300 391 -64 ; -C -1 ; WX 600 ; N glyph1103 ; B 0 -207 592 412 ; -C -1 ; WX 600 ; N glyph1104 ; B 5 0 554 415 ; -C -1 ; WX 600 ; N glyph1105 ; B 0 0 600 397 ; -C -1 ; WX 600 ; N glyph1106 ; B 0 0 569 412 ; -C -1 ; WX 600 ; N glyph1107 ; B 0 0 600 417 ; -C -1 ; WX 600 ; N glyph1108 ; B 2 0 594 445 ; -C -1 ; WX 600 ; N glyph1109 ; B 0 -16 600 397 ; -C -1 ; WX 600 ; N glyph1110 ; B 0 0 592 441 ; -C -1 ; WX 600 ; N glyph1111 ; B 0 0 600 396 ; -C -1 ; WX 600 ; N glyph1112 ; B 83 -298 551 392 ; -C -1 ; WX 600 ; N glyph1113 ; B 51 -177 547 381 ; -C -1 ; WX 600 ; N glyph1114 ; B 50 -178 546 396 ; -C -1 ; WX 600 ; N glyph1115 ; B 0 -210 600 388 ; -C -1 ; WX 600 ; N glyph1116 ; B 0 -189 600 351 ; -C -1 ; WX 600 ; N glyph1117 ; B 1 -280 600 211 ; -C -1 ; WX 600 ; N glyph1118 ; B 0 0 591 522 ; -C -1 ; WX 600 ; N glyph1119 ; B 0 0 558 463 ; -C -1 ; WX 600 ; N glyph1120 ; B 164 0 600 926 ; -C -1 ; WX 600 ; N glyph1121 ; B 164 0 600 1013 ; -C -1 ; WX 600 ; N glyph1122 ; B 170 0 600 1009 ; -C -1 ; WX 600 ; N glyph1123 ; B 125 0 600 1058 ; -C -1 ; WX 600 ; N glyph1124 ; B 109 0 600 1054 ; -C -1 ; WX 600 ; N glyph1125 ; B 224 -376 600 630 ; -C -1 ; WX 600 ; N glyph1126 ; B 224 -464 600 630 ; -C -1 ; WX 600 ; N uniFFFC ; B 0 0 600 431 ; -C -1 ; WX 600 ; N Ohorn ; B 20 -15 641 628 ; -C -1 ; WX 600 ; N ohorn ; B 42 -16 602 490 ; -C -1 ; WX 600 ; N Uhorn ; B 11 -15 678 714 ; -C -1 ; WX 600 ; N uhorn ; B 15 -16 645 465 ; -C -1 ; WX 600 ; N _d_1133 ; B 195 728 428 827 ; -C -1 ; WX 600 ; N _d_1134 ; B 171 728 403 827 ; -C -1 ; WX 600 ; N _d_1135 ; B 195 683 401 829 ; -C -1 ; WX 600 ; N f006 ; B 200 728 428 827 ; -C -1 ; WX 600 ; N f007 ; B 200 728 428 827 ; -C -1 ; WX 600 ; N f009 ; B 195 683 401 829 ; -C -1 ; WX 600 ; N combininghookabove ; B 176 691 402 827 ; -C -1 ; WX 600 ; N f010 ; B 195 740 399 827 ; -C -1 ; WX 600 ; N f013 ; B 190 691 417 827 ; -C -1 ; WX 600 ; N f011 ; B 195 740 399 827 ; -C -1 ; WX 600 ; N f01c ; B 146 700 484 827 ; -C -1 ; WX 600 ; N f015 ; B 134 726 446 827 ; -C -1 ; WX 600 ; N combiningtildeaccent ; B 146 700 485 827 ; -C -1 ; WX 600 ; N _d_1146 ; B 171 630 436 712 ; -C -1 ; WX 600 ; N _d_1147 ; B 171 630 433 715 ; -C -1 ; WX 600 ; N f02c ; B 433 -186 560 -59 ; -C -1 ; WX 600 ; N dongsign ; B 88 119 508 633 ; -C -1 ; WX 600 ; N onethird ; B -46 -9 646 649 ; -C -1 ; WX 600 ; N twothirds ; B -46 -9 646 648 ; -C -1 ; WX 600 ; N f008 ; B 194 499 400 645 ; -C -1 ; WX 600 ; N _d_1153 ; B 209 499 415 645 ; -C -1 ; WX 600 ; N _d_1154 ; B 176 498 382 644 ; -C -1 ; WX 600 ; N f00f ; B 195 498 401 644 ; -C -1 ; WX 600 ; N f012 ; B 177 500 403 636 ; -C -1 ; WX 600 ; N f014 ; B 177 500 403 636 ; -C -1 ; WX 600 ; N f016 ; B 131 700 470 827 ; -C -1 ; WX 600 ; N f017 ; B 131 700 470 827 ; -C -1 ; WX 600 ; N f018 ; B 146 700 484 827 ; -C -1 ; WX 600 ; N f019 ; B 121 489 459 616 ; -C -1 ; WX 600 ; N f01a ; B 136 489 474 616 ; -C -1 ; WX 600 ; N f01b ; B 121 489 459 616 ; -C -1 ; WX 600 ; N f01e ; B 238 -186 364 -59 ; -C -1 ; WX 600 ; N f01f ; B 238 -186 364 -59 ; -C -1 ; WX 600 ; N f020 ; B 238 -186 364 -59 ; -C -1 ; WX 600 ; N f021 ; B 238 -186 364 -59 ; -C -1 ; WX 600 ; N f022 ; B 238 -186 364 -59 ; -C -1 ; WX 600 ; N combininggraveaccent ; B 195 683 401 829 ; -C -1 ; WX 600 ; N combiningacuteaccent ; B 195 683 401 829 ; -C -1 ; WX 600 ; N f01d ; B 121 489 459 616 ; -C -1 ; WX 600 ; N combiningdotbelow ; B 238 -186 364 -59 ; -C -1 ; WX 600 ; N f023 ; B 238 -186 364 -59 ; -C -1 ; WX 600 ; N f029 ; B 238 -186 364 -59 ; -C -1 ; WX 600 ; N f02a ; B 238 -186 364 -59 ; -C -1 ; WX 600 ; N f02b ; B 238 -186 364 -59 ; -C -1 ; WX 600 ; N f024 ; B 238 -186 364 -59 ; -C -1 ; WX 600 ; N f025 ; B 238 -186 364 -59 ; -C -1 ; WX 600 ; N f026 ; B 238 -186 364 -59 ; -C -1 ; WX 600 ; N f027 ; B 238 -186 364 -59 ; -C -1 ; WX 600 ; N f028 ; B 238 -186 364 -59 ; -C -1 ; WX 600 ; N f02d ; B 164 726 475 827 ; -C -1 ; WX 600 ; N f02e ; B 136 700 475 827 ; -C -1 ; WX 600 ; N f02f ; B 164 726 475 827 ; -C -1 ; WX 600 ; N f030 ; B 146 700 484 827 ; -C -1 ; WX 600 ; N Adotbelow ; B -22 -186 623 592 ; -C -1 ; WX 600 ; N adotbelow ; B 43 -186 574 457 ; -C -1 ; WX 600 ; N Ahookabove ; B -22 0 623 827 ; -C -1 ; WX 600 ; N ahookabove ; B 43 -17 574 636 ; -C -1 ; WX 600 ; N Acircumflexacute ; B -22 0 623 827 ; -C -1 ; WX 600 ; N acircumflexacute ; B 43 -17 574 829 ; -C -1 ; WX 600 ; N Acircumflexgrave ; B -22 0 623 827 ; -C -1 ; WX 600 ; N acircumflexgrave ; B 43 -17 574 829 ; -C -1 ; WX 600 ; N Acircumflexhookabove ; B -22 0 623 827 ; -C -1 ; WX 600 ; N acircumflexhookabove ; B 43 -17 574 827 ; -C -1 ; WX 600 ; N Acircumflextilde ; B -22 0 623 827 ; -C -1 ; WX 600 ; N acircumflextilde ; B 43 -17 574 827 ; -C -1 ; WX 600 ; N Acircumflexdotbelow ; B -22 -186 623 715 ; -C -1 ; WX 600 ; N acircumflexdotbelow ; B 43 -186 574 656 ; -C -1 ; WX 600 ; N Abreveacute ; B -22 0 623 827 ; -C -1 ; WX 600 ; N abreveacute ; B 43 -17 574 829 ; -C -1 ; WX 600 ; N Abrevegrave ; B -22 0 623 827 ; -C -1 ; WX 600 ; N abrevegrave ; B 43 -17 574 829 ; -C -1 ; WX 600 ; N Abrevehookabove ; B -22 0 623 827 ; -C -1 ; WX 600 ; N abrevehookabove ; B 43 -17 574 827 ; -C -1 ; WX 600 ; N Abrevetilde ; B -22 0 623 827 ; -C -1 ; WX 600 ; N abrevetilde ; B 43 -17 574 827 ; -C -1 ; WX 600 ; N Abrevedotbelow ; B -22 -186 623 712 ; -C -1 ; WX 600 ; N abrevedotbelow ; B 43 -186 574 654 ; -C -1 ; WX 600 ; N Edotbelow ; B 15 -186 553 592 ; -C -1 ; WX 600 ; N edotbelow ; B 32 -186 552 457 ; -C -1 ; WX 600 ; N Ehookabove ; B 15 0 553 827 ; -C -1 ; WX 600 ; N ehookabove ; B 32 -16 552 636 ; -C -1 ; WX 600 ; N Etilde ; B 15 0 553 771 ; -C -1 ; WX 600 ; N etilde ; B 32 -16 552 616 ; -C -1 ; WX 600 ; N Ecircumflexacute ; B 15 0 553 827 ; -C -1 ; WX 600 ; N ecircumflexacute ; B 32 -16 552 829 ; -C -1 ; WX 600 ; N Ecircumflexgrave ; B 15 0 553 827 ; -C -1 ; WX 600 ; N ecircumflexgrave ; B 32 -16 552 829 ; -C -1 ; WX 600 ; N Ecircumflexhookabove ; B 15 0 553 827 ; -C -1 ; WX 600 ; N ecircumflexhookabove ; B 32 -16 552 827 ; -C -1 ; WX 600 ; N Ecircumflextilde ; B 15 0 553 827 ; -C -1 ; WX 600 ; N ecircumflextilde ; B 32 -16 552 827 ; -C -1 ; WX 600 ; N Ecircumflexdotbelow ; B 15 -186 553 715 ; -C -1 ; WX 600 ; N ecircumflexdotbelow ; B 32 -186 552 656 ; -C -1 ; WX 600 ; N Ihookabove ; B 82 0 518 827 ; -C -1 ; WX 600 ; N ihookabove ; B 63 0 537 636 ; -C -1 ; WX 600 ; N Idotbelow ; B 82 -186 518 592 ; -C -1 ; WX 600 ; N idotbelow ; B 63 -186 537 633 ; -C -1 ; WX 600 ; N Odotbelow ; B 20 -186 581 607 ; -C -1 ; WX 600 ; N odotbelow ; B 42 -186 560 457 ; -C -1 ; WX 600 ; N Ohookabove ; B 20 -15 581 827 ; -C -1 ; WX 600 ; N ohookabove ; B 42 -16 560 636 ; -C -1 ; WX 600 ; N Ocircumflexacute ; B 20 -15 581 827 ; -C -1 ; WX 600 ; N ocircumflexacute ; B 42 -16 560 829 ; -C -1 ; WX 600 ; N Ocircumflexgrave ; B 20 -15 581 827 ; -C -1 ; WX 600 ; N ocircumflexgrave ; B 42 -16 560 829 ; -C -1 ; WX 600 ; N Ocircumflexhookabove ; B 20 -15 581 827 ; -C -1 ; WX 600 ; N ocircumflexhookabove ; B 42 -16 560 827 ; -C -1 ; WX 600 ; N Ocircumflextilde ; B 20 -15 581 827 ; -C -1 ; WX 600 ; N ocircumflextilde ; B 42 -16 560 827 ; -C -1 ; WX 600 ; N Ocircumflexdotbelow ; B 20 -186 581 715 ; -C -1 ; WX 600 ; N ocircumflexdotbelow ; B 42 -186 560 656 ; -C -1 ; WX 600 ; N Ohornacute ; B 20 -15 641 822 ; -C -1 ; WX 600 ; N ohornacute ; B 42 -16 602 667 ; -C -1 ; WX 600 ; N Ohorngrave ; B 20 -15 641 822 ; -C -1 ; WX 600 ; N ohorngrave ; B 42 -16 602 667 ; -C -1 ; WX 600 ; N Ohornhookabove ; B 20 -15 641 827 ; -C -1 ; WX 600 ; N ohornhookabove ; B 42 -16 602 636 ; -C -1 ; WX 600 ; N Ohorntilde ; B 20 -15 641 771 ; -C -1 ; WX 600 ; N ohorntilde ; B 42 -16 602 616 ; -C -1 ; WX 600 ; N Ohorndotbelow ; B 20 -186 641 628 ; -C -1 ; WX 600 ; N ohorndotbelow ; B 42 -186 602 490 ; -C -1 ; WX 600 ; N Udotbelow ; B 11 -186 591 592 ; -C -1 ; WX 600 ; N udotbelow ; B 15 -186 575 443 ; -C -1 ; WX 600 ; N Uhookabove ; B 11 -15 591 827 ; -C -1 ; WX 600 ; N uhookabove ; B 15 -16 575 636 ; -C -1 ; WX 600 ; N Uhornacute ; B 11 -15 678 822 ; -C -1 ; WX 600 ; N uhornacute ; B 15 -16 645 667 ; -C -1 ; WX 600 ; N Uhorngrave ; B 11 -15 678 822 ; -C -1 ; WX 600 ; N uhorngrave ; B 15 -16 645 667 ; -C -1 ; WX 600 ; N Uhornhookabove ; B 11 -15 678 827 ; -C -1 ; WX 600 ; N uhornhookabove ; B 15 -16 645 636 ; -C -1 ; WX 600 ; N Uhorntilde ; B 11 -15 678 771 ; -C -1 ; WX 600 ; N uhorntilde ; B 15 -16 645 616 ; -C -1 ; WX 600 ; N Uhorndotbelow ; B 11 -186 678 714 ; -C -1 ; WX 600 ; N uhorndotbelow ; B 15 -186 645 465 ; -C -1 ; WX 600 ; N Ydotbelow ; B 21 -186 581 592 ; -C -1 ; WX 600 ; N ydotbelow ; B 21 -209 582 443 ; -C -1 ; WX 600 ; N Yhookabove ; B 21 0 581 827 ; -C -1 ; WX 600 ; N yhookabove ; B 21 -209 582 636 ; -C -1 ; WX 600 ; N Ytilde ; B 21 0 581 771 ; -C -1 ; WX 600 ; N ytilde ; B 21 -209 582 616 ; -C -1 ; WX 600 ; N uni01CD ; B -22 0 623 807 ; -C -1 ; WX 600 ; N uni01CE ; B 43 -17 574 651 ; -C -1 ; WX 600 ; N uni01CF ; B 82 0 518 807 ; -C -1 ; WX 600 ; N uni01D0 ; B 63 0 537 651 ; -C -1 ; WX 600 ; N uni01D1 ; B 20 -15 581 807 ; -C -1 ; WX 600 ; N uni01D2 ; B 42 -16 560 651 ; -C -1 ; WX 600 ; N uni01D3 ; B 11 -15 591 807 ; -C -1 ; WX 600 ; N uni01D4 ; B 15 -16 575 651 ; -C -1 ; WX 600 ; N uni01D5 ; B 11 -15 591 833 ; -C -1 ; WX 600 ; N uni01D6 ; B 15 -16 575 746 ; -C -1 ; WX 600 ; N uni01D7 ; B 11 -15 591 833 ; -C -1 ; WX 600 ; N uni01D8 ; B 15 -16 575 808 ; -C -1 ; WX 600 ; N uni01D9 ; B 11 -15 591 832 ; -C -1 ; WX 600 ; N uni01DA ; B 15 -16 575 808 ; -C -1 ; WX 600 ; N uni01DB ; B 11 -15 591 833 ; -C -1 ; WX 600 ; N uni01DC ; B 15 -16 575 822 ; -C -1 ; WX 600 ; N _d_1290 ; B 133 646 469 833 ; -C -1 ; WX 600 ; N _d_1291 ; B 108 646 493 833 ; -C -1 ; WX 600 ; N _d_1292 ; B 104 646 498 832 ; -C -1 ; WX 600 ; N _d_1293 ; B 108 646 493 833 ; -C -1 ; WX 600 ; N uni0492 ; B 33 0 574 592 ; -C -1 ; WX 600 ; N uni0493 ; B 33 0 574 443 ; -C -1 ; WX 600 ; N uni0496 ; B 4 -130 594 592 ; -C -1 ; WX 600 ; N uni0497 ; B 6 -118 594 443 ; -C -1 ; WX 600 ; N uni049a ; B 40 -130 594 592 ; -C -1 ; WX 600 ; N uni049b ; B 47 -118 594 443 ; -C -1 ; WX 600 ; N uni049c ; B 40 0 601 592 ; -C -1 ; WX 600 ; N uni049d ; B 47 0 576 443 ; -C -1 ; WX 600 ; N uni04a2 ; B 22 -130 594 592 ; -C -1 ; WX 600 ; N uni04a3 ; B 22 -118 594 443 ; -C -1 ; WX 600 ; N uni04ae ; B 21 0 581 592 ; -C -1 ; WX 600 ; N uni04af ; B 21 -209 582 443 ; -C -1 ; WX 600 ; N uni04b0 ; B 21 0 581 592 ; -C -1 ; WX 600 ; N uni04b1 ; B 21 -209 582 443 ; -C -1 ; WX 600 ; N uni04b2 ; B 11 -130 594 593 ; -C -1 ; WX 600 ; N uni04b3 ; B 21 -118 594 443 ; -C -1 ; WX 600 ; N uni04b8 ; B 17 0 578 592 ; -C -1 ; WX 600 ; N uni04b9 ; B 31 0 564 443 ; -C -1 ; WX 600 ; N uni04ba ; B 22 0 583 592 ; -C -1 ; WX 600 ; N uni04bb ; B 25 0 558 443 ; -C -1 ; WX 600 ; N uni018f ; B 31 -15 566 607 ; -C -1 ; WX 600 ; N uni0259 ; B 32 -16 552 457 ; -C -1 ; WX 600 ; N uni04e8 ; B 20 -15 581 607 ; -C -1 ; WX 600 ; N uni04e9 ; B 42 -16 560 457 ; -EndCharMetrics -EndFontMetrics +StartFontMetrics 4.1 +FontName CourierNewPS-BoldMT +FullName Courier New Bold +Notice Typeface The Monotype Corporation plc. Data The Monotype Corporation plc/Type Solutions Inc. 1990-1992. All Rights Reserved +EncodingScheme FontSpecific +FamilyName Courier New +Weight Bold +Version Version 2.90 +Characters 1318 +ItalicAngle 0.0 +Ascender 833 +Descender -300 +UnderlineThickness 100 +UnderlinePosition -233 +IsFixedPitch true +FontBBox -46 -710 702 1221 +StartCharMetrics 1353 +C 0 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 1 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 2 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 3 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 4 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 5 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 6 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 7 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 8 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 9 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 10 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 11 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 12 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 13 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 14 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 15 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 16 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 17 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 18 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 19 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 20 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 21 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 22 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 23 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 24 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 25 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 26 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 27 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 28 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 29 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 30 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 31 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 32 ; WX 600 ; N space ; B 217 -15 377 648 ; +C 33 ; WX 600 ; N exclam ; B 217 -15 377 648 ; +C 34 ; WX 600 ; N quotedbl ; B 129 332 466 604 ; +C 35 ; WX 600 ; N numbersign ; B 60 -94 538 686 ; +C 36 ; WX 600 ; N dollar ; B 81 -125 519 695 ; +C 37 ; WX 600 ; N percent ; B 77 -15 525 627 ; +C 38 ; WX 600 ; N ampersand ; B 110 -15 548 558 ; +C 39 ; WX 600 ; N quotesingle ; B 235 318 364 611 ; +C 40 ; WX 600 ; N parenleft ; B 264 -156 489 642 ; +C 41 ; WX 600 ; N parenright ; B 118 -156 343 642 ; +C 42 ; WX 600 ; N asterisk ; B 81 212 517 632 ; +C 43 ; WX 600 ; N plus ; B 40 0 560 568 ; +C 44 ; WX 600 ; N comma ; B 204 -161 410 135 ; +C 45 ; WX 600 ; N hyphen ; B 92 238 510 330 ; +C 46 ; WX 600 ; N period ; B 226 -16 376 117 ; +C 47 ; WX 600 ; N slash ; B 83 -115 518 706 ; +C 48 ; WX 600 ; N zero ; B 82 -15 519 648 ; +C 49 ; WX 600 ; N one ; B 83 0 519 648 ; +C 50 ; WX 600 ; N two ; B 54 0 510 648 ; +C 51 ; WX 600 ; N three ; B 66 -15 531 648 ; +C 52 ; WX 600 ; N four ; B 75 0 509 632 ; +C 53 ; WX 600 ; N five ; B 64 -15 531 632 ; +C 54 ; WX 600 ; N six ; B 105 -15 542 648 ; +C 55 ; WX 600 ; N seven ; B 74 -1 509 632 ; +C 56 ; WX 600 ; N eight ; B 83 -15 519 648 ; +C 57 ; WX 600 ; N nine ; B 105 -15 542 648 ; +C 58 ; WX 600 ; N colon ; B 225 -18 376 443 ; +C 59 ; WX 600 ; N semicolon ; B 197 -106 422 441 ; +C 60 ; WX 600 ; N less ; B -13 2 560 568 ; +C 61 ; WX 600 ; N equal ; B 20 141 582 429 ; +C 62 ; WX 600 ; N greater ; B 41 2 614 568 ; +C 63 ; WX 600 ; N question ; B 103 -14 519 607 ; +C 64 ; WX 600 ; N at ; B 88 -83 498 648 ; +C 65 ; WX 600 ; N A ; B -22 0 623 592 ; +C 66 ; WX 600 ; N B ; B 13 0 574 592 ; +C 67 ; WX 600 ; N C ; B 31 -15 566 607 ; +C 68 ; WX 600 ; N D ; B 14 0 552 592 ; +C 69 ; WX 600 ; N E ; B 15 0 553 592 ; +C 70 ; WX 600 ; N F ; B 49 0 587 592 ; +C 71 ; WX 600 ; N G ; B 32 -15 595 607 ; +C 72 ; WX 600 ; N H ; B 22 0 583 592 ; +C 73 ; WX 600 ; N I ; B 82 0 518 592 ; +C 74 ; WX 600 ; N J ; B 54 -15 614 592 ; +C 75 ; WX 600 ; N K ; B 13 0 605 592 ; +C 76 ; WX 600 ; N L ; B 33 0 574 592 ; +C 77 ; WX 600 ; N M ; B -19 0 624 592 ; +C 78 ; WX 600 ; N N ; B -8 0 593 592 ; +C 79 ; WX 600 ; N O ; B 20 -15 581 607 ; +C 80 ; WX 600 ; N P ; B 60 0 577 592 ; +C 81 ; WX 600 ; N Q ; B 20 -148 581 607 ; +C 82 ; WX 600 ; N R ; B 14 0 621 592 ; +C 83 ; WX 600 ; N S ; B 62 -15 540 607 ; +C 84 ; WX 600 ; N T ; B 40 0 559 592 ; +C 85 ; WX 600 ; N U ; B 11 -15 591 592 ; +C 86 ; WX 600 ; N V ; B -23 0 623 592 ; +C 87 ; WX 600 ; N W ; B -11 0 612 592 ; +C 88 ; WX 600 ; N X ; B 11 0 592 592 ; +C 89 ; WX 600 ; N Y ; B 21 0 581 592 ; +C 90 ; WX 600 ; N Z ; B 74 0 529 592 ; +C 91 ; WX 600 ; N bracketleft ; B 249 -156 477 632 ; +C 92 ; WX 600 ; N backslash ; B 83 -112 518 706 ; +C 93 ; WX 600 ; N bracketright ; B 124 -156 351 632 ; +C 94 ; WX 600 ; N asciicircum ; B 82 331 518 662 ; +C 95 ; WX 600 ; N underscore ; B -40 -300 644 -200 ; +C 96 ; WX 600 ; N grave ; B 205 501 396 667 ; +C 97 ; WX 600 ; N a ; B 43 -17 574 457 ; +C 98 ; WX 600 ; N b ; B -10 -16 573 633 ; +C 99 ; WX 600 ; N c ; B 56 -17 568 457 ; +C 100 ; WX 600 ; N d ; B 30 -16 614 633 ; +C 101 ; WX 600 ; N e ; B 32 -16 552 457 ; +C 102 ; WX 600 ; N f ; B 73 0 572 633 ; +C 103 ; WX 600 ; N g ; B 32 -209 594 458 ; +C 104 ; WX 600 ; N h ; B 13 0 584 633 ; +C 105 ; WX 600 ; N i ; B 63 0 537 633 ; +C 106 ; WX 600 ; N j ; B 86 -209 460 633 ; +C 107 ; WX 600 ; N k ; B 34 0 575 633 ; +C 108 ; WX 600 ; N l ; B 63 0 537 633 ; +C 109 ; WX 600 ; N m ; B -17 0 625 457 ; +C 110 ; WX 600 ; N n ; B 25 0 574 457 ; +C 111 ; WX 600 ; N o ; B 42 -16 560 457 ; +C 112 ; WX 600 ; N p ; B -8 -209 573 457 ; +C 113 ; WX 600 ; N q ; B 35 -209 616 457 ; +C 114 ; WX 600 ; N r ; B 53 0 573 457 ; +C 115 ; WX 600 ; N s ; B 74 -16 529 457 ; +C 116 ; WX 600 ; N t ; B 72 -16 591 601 ; +C 117 ; WX 600 ; N u ; B 15 -16 575 443 ; +C 118 ; WX 600 ; N v ; B 0 0 604 443 ; +C 119 ; WX 600 ; N w ; B -2 0 602 443 ; +C 120 ; WX 600 ; N x ; B 21 0 582 443 ; +C 121 ; WX 600 ; N y ; B 21 -209 582 443 ; +C 122 ; WX 600 ; N z ; B 86 0 522 443 ; +C 123 ; WX 600 ; N braceleft ; B 168 -156 433 632 ; +C 124 ; WX 600 ; N bar ; B 250 -156 351 632 ; +C 125 ; WX 600 ; N braceright ; B 165 -156 430 632 ; +C 126 ; WX 600 ; N asciitilde ; B 61 180 540 388 ; +C 127 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 128 ; WX 600 ; N Euro ; B 0 -15 566 607 ; +C 129 ; WX 600 ; N afii10052 ; B 33 0 574 822 ; +C 130 ; WX 600 ; N quotesinglbase ; B 145 -156 351 135 ; +C 131 ; WX 600 ; N florin ; B 58 -125 549 648 ; +C 132 ; WX 600 ; N quotedblbase ; B 102 -130 521 131 ; +C 133 ; WX 600 ; N ellipsis ; B 50 -15 550 87 ; +C 134 ; WX 600 ; N dagger ; B 92 -94 507 632 ; +C 135 ; WX 600 ; N daggerdbl ; B 93 -94 507 632 ; +C 136 ; WX 600 ; N circumflex ; B 140 498 459 656 ; +C 137 ; WX 600 ; N perthousand ; B 20 3 583 627 ; +C 138 ; WX 600 ; N Scaron ; B 62 -15 540 807 ; +C 139 ; WX 600 ; N guilsinglleft ; B 133 20 422 420 ; +C 140 ; WX 600 ; N OE ; B -21 0 622 592 ; +C 141 ; WX 600 ; N afii10061 ; B 40 0 601 822 ; +C 142 ; WX 600 ; N Zcaron ; B 74 0 529 807 ; +C 143 ; WX 600 ; N afii10145 ; B 19 -115 581 592 ; +C 144 ; WX 600 ; N quotedblbase ; B 102 -130 521 131 ; +C 145 ; WX 600 ; N quoteleft ; B 249 316 456 612 ; +C 146 ; WX 600 ; N quoteright ; B 145 316 351 612 ; +C 147 ; WX 600 ; N quotedblleft ; B 79 355 499 616 ; +C 148 ; WX 600 ; N quotedblright ; B 102 355 521 616 ; +C 149 ; WX 600 ; N bullet ; B 151 158 451 461 ; +C 150 ; WX 600 ; N endash ; B 40 233 559 333 ; +C 151 ; WX 600 ; N emdash ; B -30 233 630 333 ; +C 152 ; WX 600 ; N tilde ; B 131 489 469 616 ; +C 153 ; WX 600 ; N trademark ; B -42 296 602 651 ; +C 154 ; WX 600 ; N scaron ; B 74 -16 529 651 ; +C 155 ; WX 600 ; N guilsinglright ; B 185 20 474 420 ; +C 156 ; WX 600 ; N oe ; B -21 -16 613 456 ; +C 157 ; WX 600 ; N afii10109 ; B 47 0 576 667 ; +C 158 ; WX 600 ; N zcaron ; B 86 0 522 651 ; +C 159 ; WX 600 ; N Ydieresis ; B 21 0 581 783 ; +C 160 ; WX 600 ; N space ; B 217 -15 377 648 ; +C 161 ; WX 600 ; N exclamdown ; B 217 -207 377 433 ; +C 162 ; WX 600 ; N cent ; B 83 -31 501 685 ; +C 163 ; WX 600 ; N sterling ; B 30 0 552 606 ; +C 164 ; WX 600 ; N currency ; B 71 66 530 526 ; +C 165 ; WX 600 ; N yen ; B 21 0 581 592 ; +C 166 ; WX 600 ; N brokenbar ; B 250 -156 351 632 ; +C 167 ; WX 600 ; N section ; B 48 -85 554 636 ; +C 168 ; WX 600 ; N dieresis ; B 143 521 458 627 ; +C 169 ; WX 600 ; N copyright ; B -3 -14 603 592 ; +C 170 ; WX 600 ; N ordfeminine ; B 133 364 479 648 ; +C 171 ; WX 600 ; N guillemotleft ; B 35 18 555 419 ; +C 172 ; WX 600 ; N logicalnot ; B -19 0 560 334 ; +C 173 ; WX 600 ; N hyphen ; B 92 238 510 330 ; +C 174 ; WX 600 ; N registered ; B -3 -14 603 592 ; +C 175 ; WX 600 ; N overscore ; B -40 664 644 764 ; +C 176 ; WX 600 ; N degree ; B 144 417 456 728 ; +C 177 ; WX 600 ; N plusminus ; B 40 0 560 705 ; +C 178 ; WX 600 ; N twosuperior ; B 149 311 430 648 ; +C 179 ; WX 600 ; N threesuperior ; B 156 304 442 648 ; +C 180 ; WX 600 ; N acute ; B 205 500 396 667 ; +C 181 ; WX 600 ; N mu1 ; B 14 -209 574 443 ; +C 182 ; WX 600 ; N paragraph ; B 61 -87 543 632 ; +C 183 ; WX 600 ; N periodcentered ; B 225 246 375 378 ; +C 184 ; WX 600 ; N cedilla ; B 200 -179 392 36 ; +C 185 ; WX 600 ; N onesuperior ; B 166 311 435 649 ; +C 186 ; WX 600 ; N ordmasculine ; B 132 364 469 648 ; +C 187 ; WX 600 ; N guillemotright ; B 51 24 571 425 ; +C 188 ; WX 600 ; N onequarter ; B 1 0 600 649 ; +C 189 ; WX 600 ; N onehalf ; B -46 0 636 649 ; +C 190 ; WX 600 ; N threequarters ; B 0 0 594 649 ; +C 191 ; WX 600 ; N questiondown ; B 82 -210 498 431 ; +C 192 ; WX 600 ; N Agrave ; B -22 0 623 822 ; +C 193 ; WX 600 ; N Aacute ; B -22 0 623 822 ; +C 194 ; WX 600 ; N Acircumflex ; B -22 0 623 812 ; +C 195 ; WX 600 ; N Atilde ; B -22 0 623 771 ; +C 196 ; WX 600 ; N Adieresis ; B -22 0 623 783 ; +C 197 ; WX 600 ; N Aring ; B -22 0 623 833 ; +C 198 ; WX 600 ; N AE ; B -21 0 623 592 ; +C 199 ; WX 600 ; N Ccedilla ; B 31 -188 566 607 ; +C 200 ; WX 600 ; N Egrave ; B 15 0 553 822 ; +C 201 ; WX 600 ; N Eacute ; B 15 0 553 822 ; +C 202 ; WX 600 ; N Ecircumflex ; B 15 0 553 812 ; +C 203 ; WX 600 ; N Edieresis ; B 15 0 553 783 ; +C 204 ; WX 600 ; N Igrave ; B 82 0 518 822 ; +C 205 ; WX 600 ; N Iacute ; B 82 0 518 822 ; +C 206 ; WX 600 ; N Icircumflex ; B 82 0 518 812 ; +C 207 ; WX 600 ; N Idieresis ; B 82 0 518 783 ; +C 208 ; WX 600 ; N Eth ; B -18 0 553 592 ; +C 209 ; WX 600 ; N Ntilde ; B -8 0 593 771 ; +C 210 ; WX 600 ; N Ograve ; B 20 -15 581 822 ; +C 211 ; WX 600 ; N Oacute ; B 20 -15 581 822 ; +C 212 ; WX 600 ; N Ocircumflex ; B 20 -15 581 812 ; +C 213 ; WX 600 ; N Otilde ; B 20 -15 581 771 ; +C 214 ; WX 600 ; N Odieresis ; B 20 -15 581 783 ; +C 215 ; WX 600 ; N multiply ; B 100 83 501 485 ; +C 216 ; WX 600 ; N Oslash ; B 11 -71 591 642 ; +C 217 ; WX 600 ; N Ugrave ; B 11 -15 591 822 ; +C 218 ; WX 600 ; N Uacute ; B 11 -15 591 822 ; +C 219 ; WX 600 ; N Ucircumflex ; B 11 -15 591 812 ; +C 220 ; WX 600 ; N Udieresis ; B 11 -15 591 783 ; +C 221 ; WX 600 ; N Yacute ; B 21 0 581 822 ; +C 222 ; WX 600 ; N Thorn ; B 60 0 577 592 ; +C 223 ; WX 600 ; N germandbls ; B 12 -16 531 633 ; +C 224 ; WX 600 ; N agrave ; B 43 -17 574 667 ; +C 225 ; WX 600 ; N aacute ; B 43 -17 574 667 ; +C 226 ; WX 600 ; N acircumflex ; B 43 -17 574 656 ; +C 227 ; WX 600 ; N atilde ; B 43 -17 574 616 ; +C 228 ; WX 600 ; N adieresis ; B 43 -17 574 627 ; +C 229 ; WX 600 ; N aring ; B 43 -17 574 682 ; +C 230 ; WX 600 ; N ae ; B -21 -16 612 456 ; +C 231 ; WX 600 ; N ccedilla ; B 56 -179 568 457 ; +C 232 ; WX 600 ; N egrave ; B 32 -16 552 667 ; +C 233 ; WX 600 ; N eacute ; B 32 -16 552 667 ; +C 234 ; WX 600 ; N ecircumflex ; B 32 -16 552 656 ; +C 235 ; WX 600 ; N edieresis ; B 32 -16 552 627 ; +C 236 ; WX 600 ; N igrave ; B 63 0 537 667 ; +C 237 ; WX 600 ; N iacute ; B 63 0 537 667 ; +C 238 ; WX 600 ; N icircumflex ; B 63 0 537 656 ; +C 239 ; WX 600 ; N idieresis ; B 63 0 537 627 ; +C 240 ; WX 600 ; N eth ; B 44 -17 540 632 ; +C 241 ; WX 600 ; N ntilde ; B 25 0 574 616 ; +C 242 ; WX 600 ; N ograve ; B 42 -16 560 667 ; +C 243 ; WX 600 ; N oacute ; B 42 -16 560 667 ; +C 244 ; WX 600 ; N ocircumflex ; B 42 -16 560 656 ; +C 245 ; WX 600 ; N otilde ; B 42 -16 560 616 ; +C 246 ; WX 600 ; N odieresis ; B 42 -16 560 627 ; +C 247 ; WX 600 ; N divide ; B 40 5 560 565 ; +C 248 ; WX 600 ; N oslash ; B 22 -72 574 495 ; +C 249 ; WX 600 ; N ugrave ; B 15 -16 575 667 ; +C 250 ; WX 600 ; N uacute ; B 15 -16 575 667 ; +C 251 ; WX 600 ; N ucircumflex ; B 15 -16 575 656 ; +C 252 ; WX 600 ; N udieresis ; B 15 -16 575 627 ; +C 253 ; WX 600 ; N yacute ; B 21 -209 582 667 ; +C 254 ; WX 600 ; N thorn ; B -8 -209 573 633 ; +C 255 ; WX 600 ; N ydieresis ; B 21 -209 582 627 ; +C -1 ; WX 0 ; N .null ; B 217 -15 377 648 ; +C -1 ; WX 600 ; N nonmarkingreturn ; B 217 -15 377 648 ; +C -1 ; WX 600 ; N notequal ; B 20 -67 582 637 ; +C -1 ; WX 600 ; N infinity ; B 44 186 556 422 ; +C -1 ; WX 600 ; N lessequal ; B -13 40 560 745 ; +C -1 ; WX 600 ; N greaterequal ; B 41 40 614 745 ; +C -1 ; WX 600 ; N partialdiff ; B 46 -15 560 633 ; +C -1 ; WX 600 ; N summation ; B 33 -188 551 613 ; +C -1 ; WX 600 ; N product ; B 12 -188 589 613 ; +C -1 ; WX 600 ; N pi1 ; B 36 0 564 443 ; +C -1 ; WX 600 ; N integral ; B 3 -190 583 826 ; +C -1 ; WX 600 ; N Ohm ; B 17 0 583 607 ; +C -1 ; WX 600 ; N radical ; B 67 -38 575 913 ; +C -1 ; WX 600 ; N approxequal ; B 61 74 540 494 ; +C -1 ; WX 600 ; N increment ; B 34 0 567 583 ; +C -1 ; WX 600 ; N lozenge ; B 76 0 525 694 ; +C -1 ; WX 600 ; N fraction ; B 76 155 524 473 ; +C -1 ; WX 600 ; N fi ; B -19 0 624 633 ; +C -1 ; WX 600 ; N fl ; B -20 0 624 633 ; +C -1 ; WX 600 ; N dotlessi ; B 63 0 537 443 ; +C -1 ; WX 600 ; N macron ; B 142 525 458 590 ; +C -1 ; WX 600 ; N breve ; B 142 501 458 654 ; +C -1 ; WX 600 ; N dotaccent ; B 237 511 363 638 ; +C -1 ; WX 600 ; N ring ; B 204 493 396 682 ; +C -1 ; WX 600 ; N hungarumlaut ; B 141 501 459 668 ; +C -1 ; WX 600 ; N ogonek ; B 210 -157 390 36 ; +C -1 ; WX 600 ; N caron ; B 140 493 459 651 ; +C -1 ; WX 600 ; N Lslash ; B 12 0 573 592 ; +C -1 ; WX 600 ; N lslash ; B 63 0 540 633 ; +C -1 ; WX 600 ; N minus ; B 40 234 560 334 ; +C -1 ; WX 600 ; N franc ; B 49 0 587 592 ; +C -1 ; WX 600 ; N Gbreve ; B 32 -15 595 810 ; +C -1 ; WX 600 ; N gbreve ; B 32 -209 594 654 ; +C -1 ; WX 600 ; N Idot ; B 82 0 518 793 ; +C -1 ; WX 600 ; N Scedilla ; B 62 -189 540 607 ; +C -1 ; WX 600 ; N scedilla ; B 74 -179 529 457 ; +C -1 ; WX 600 ; N Cacute ; B 31 -15 566 822 ; +C -1 ; WX 600 ; N cacute ; B 56 -17 568 667 ; +C -1 ; WX 600 ; N Ccaron ; B 31 -15 566 807 ; +C -1 ; WX 600 ; N ccaron ; B 56 -17 568 651 ; +C -1 ; WX 600 ; N dmacron ; B 30 -16 614 633 ; +C -1 ; WX 600 ; N middot ; B 346 300 472 427 ; +C -1 ; WX 600 ; N Abreve ; B -22 0 623 810 ; +C -1 ; WX 600 ; N abreve ; B 43 -17 574 654 ; +C -1 ; WX 600 ; N Aogonek ; B -22 -129 653 592 ; +C -1 ; WX 600 ; N aogonek ; B 43 -125 616 457 ; +C -1 ; WX 600 ; N Dcaron ; B 14 0 552 807 ; +C -1 ; WX 600 ; N dcaron ; B 30 -16 702 633 ; +C -1 ; WX 600 ; N Dslash ; B -18 0 553 592 ; +C -1 ; WX 600 ; N Eogonek ; B 15 -130 594 592 ; +C -1 ; WX 600 ; N eogonek ; B 32 -143 552 457 ; +C -1 ; WX 600 ; N Ecaron ; B 15 0 553 807 ; +C -1 ; WX 600 ; N ecaron ; B 32 -16 552 651 ; +C -1 ; WX 600 ; N Lacute ; B 33 0 574 822 ; +C -1 ; WX 600 ; N lacute ; B 63 0 537 835 ; +C -1 ; WX 600 ; N Lcaron ; B 33 0 574 592 ; +C -1 ; WX 600 ; N lcaron ; B 63 0 537 633 ; +C -1 ; WX 600 ; N Ldot ; B 33 0 574 592 ; +C -1 ; WX 600 ; N ldot ; B 63 0 545 633 ; +C -1 ; WX 600 ; N Nacute ; B -8 0 593 822 ; +C -1 ; WX 600 ; N nacute ; B 25 0 574 667 ; +C -1 ; WX 600 ; N Ncaron ; B -8 0 593 807 ; +C -1 ; WX 600 ; N ncaron ; B 25 0 574 651 ; +C -1 ; WX 600 ; N Odblacute ; B 20 -15 581 824 ; +C -1 ; WX 600 ; N odblacute ; B 42 -16 560 668 ; +C -1 ; WX 600 ; N Racute ; B 14 0 621 822 ; +C -1 ; WX 600 ; N racute ; B 53 0 573 667 ; +C -1 ; WX 600 ; N Rcaron ; B 14 0 621 807 ; +C -1 ; WX 600 ; N rcaron ; B 53 0 573 651 ; +C -1 ; WX 600 ; N Sacute ; B 62 -15 540 822 ; +C -1 ; WX 600 ; N sacute ; B 74 -16 529 667 ; +C -1 ; WX 600 ; N Tcedilla ; B 40 -271 559 592 ; +C -1 ; WX 600 ; N tcedilla ; B 72 -250 591 601 ; +C -1 ; WX 600 ; N Tcaron ; B 40 0 559 807 ; +C -1 ; WX 600 ; N tcaron ; B 72 -16 667 633 ; +C -1 ; WX 600 ; N Uring ; B 11 -15 591 833 ; +C -1 ; WX 600 ; N uring ; B 15 -16 575 682 ; +C -1 ; WX 600 ; N Udblacute ; B 11 -15 591 824 ; +C -1 ; WX 600 ; N udblacute ; B 15 -16 575 668 ; +C -1 ; WX 600 ; N Zacute ; B 74 0 529 822 ; +C -1 ; WX 600 ; N zacute ; B 86 0 522 667 ; +C -1 ; WX 600 ; N Zdot ; B 74 0 529 793 ; +C -1 ; WX 600 ; N zdot ; B 86 0 522 638 ; +C -1 ; WX 600 ; N Gamma ; B 30 0 571 592 ; +C -1 ; WX 600 ; N Theta ; B 20 -15 581 607 ; +C -1 ; WX 600 ; N Phi ; B 39 0 561 592 ; +C -1 ; WX 600 ; N alpha ; B 40 -16 577 457 ; +C -1 ; WX 600 ; N delta ; B 74 -16 526 633 ; +C -1 ; WX 600 ; N epsilon ; B 102 -16 505 457 ; +C -1 ; WX 600 ; N sigma ; B 58 -16 582 443 ; +C -1 ; WX 600 ; N tau ; B 93 -16 470 443 ; +C -1 ; WX 600 ; N phi ; B 44 -222 556 443 ; +C -1 ; WX 600 ; N underscoredbl ; B -40 -359 644 -88 ; +C -1 ; WX 600 ; N exclamdbl ; B 76 -15 519 648 ; +C -1 ; WX 600 ; N nsuperior ; B 134 253 466 527 ; +C -1 ; WX 600 ; N peseta ; B 1 -8 597 592 ; +C -1 ; WX 600 ; N arrowleft ; B 1 50 599 277 ; +C -1 ; WX 600 ; N arrowup ; B 186 -136 414 424 ; +C -1 ; WX 600 ; N arrowright ; B 1 50 599 277 ; +C -1 ; WX 600 ; N arrowdown ; B 186 -136 414 424 ; +C -1 ; WX 600 ; N arrowboth ; B 1 50 599 278 ; +C -1 ; WX 600 ; N arrowupdn ; B 186 -135 414 463 ; +C -1 ; WX 600 ; N arrowupdnbse ; B 186 -196 414 463 ; +C -1 ; WX 600 ; N orthogonal ; B 1 0 599 597 ; +C -1 ; WX 600 ; N intersection ; B 54 -15 546 648 ; +C -1 ; WX 600 ; N equivalence ; B 20 46 582 523 ; +C -1 ; WX 600 ; N house ; B 44 0 556 639 ; +C -1 ; WX 600 ; N revlogicalnot ; B -19 0 560 334 ; +C -1 ; WX 600 ; N integraltp ; B 265 -251 475 848 ; +C -1 ; WX 600 ; N integralbt ; B 125 -251 335 848 ; +C -1 ; WX 600 ; N SF100000 ; B -7 219 607 292 ; +C -1 ; WX 600 ; N SF110000 ; B 264 -255 336 766 ; +C -1 ; WX 600 ; N SF010000 ; B 264 -255 607 292 ; +C -1 ; WX 600 ; N SF030000 ; B -7 -255 336 292 ; +C -1 ; WX 600 ; N SF020000 ; B 264 219 607 766 ; +C -1 ; WX 600 ; N SF040000 ; B -7 219 336 766 ; +C -1 ; WX 600 ; N SF080000 ; B 264 -255 607 766 ; +C -1 ; WX 600 ; N SF090000 ; B -7 -255 336 766 ; +C -1 ; WX 600 ; N SF060000 ; B -7 -255 607 292 ; +C -1 ; WX 600 ; N SF070000 ; B -7 219 607 766 ; +C -1 ; WX 600 ; N SF050000 ; B -7 -255 607 766 ; +C -1 ; WX 600 ; N SF430000 ; B -7 141 607 370 ; +C -1 ; WX 600 ; N SF240000 ; B 186 -255 414 766 ; +C -1 ; WX 600 ; N SF510000 ; B 264 -255 607 370 ; +C -1 ; WX 600 ; N SF520000 ; B 186 -255 607 292 ; +C -1 ; WX 600 ; N SF390000 ; B 186 -255 607 370 ; +C -1 ; WX 600 ; N SF220000 ; B -7 -255 336 370 ; +C -1 ; WX 600 ; N SF210000 ; B -7 -255 414 292 ; +C -1 ; WX 600 ; N SF250000 ; B -7 -255 414 370 ; +C -1 ; WX 600 ; N SF500000 ; B 264 141 607 766 ; +C -1 ; WX 600 ; N SF490000 ; B 186 219 607 766 ; +C -1 ; WX 600 ; N SF380000 ; B 186 141 607 766 ; +C -1 ; WX 600 ; N SF280000 ; B -7 141 336 766 ; +C -1 ; WX 600 ; N SF270000 ; B -7 219 414 766 ; +C -1 ; WX 600 ; N SF260000 ; B -7 141 414 766 ; +C -1 ; WX 600 ; N SF360000 ; B 264 -255 607 766 ; +C -1 ; WX 600 ; N SF370000 ; B 186 -255 607 766 ; +C -1 ; WX 600 ; N SF420000 ; B 186 -255 607 766 ; +C -1 ; WX 600 ; N SF190000 ; B -7 -255 336 766 ; +C -1 ; WX 600 ; N SF200000 ; B -7 -255 414 766 ; +C -1 ; WX 600 ; N SF230000 ; B -7 -255 414 766 ; +C -1 ; WX 600 ; N SF470000 ; B -7 -255 607 370 ; +C -1 ; WX 600 ; N SF480000 ; B -7 -255 607 292 ; +C -1 ; WX 600 ; N SF410000 ; B -7 -255 607 370 ; +C -1 ; WX 600 ; N SF450000 ; B -7 141 607 766 ; +C -1 ; WX 600 ; N SF460000 ; B -7 219 607 766 ; +C -1 ; WX 600 ; N SF400000 ; B -7 141 607 766 ; +C -1 ; WX 600 ; N SF540000 ; B -7 -255 607 766 ; +C -1 ; WX 600 ; N SF530000 ; B -7 -255 607 766 ; +C -1 ; WX 600 ; N SF440000 ; B -7 -255 607 766 ; +C -1 ; WX 600 ; N upblock ; B -7 255 607 766 ; +C -1 ; WX 600 ; N dnblock ; B -7 -255 607 255 ; +C -1 ; WX 600 ; N block ; B -7 -255 607 766 ; +C -1 ; WX 600 ; N lfblock ; B -7 -255 300 766 ; +C -1 ; WX 600 ; N rtblock ; B 300 -255 608 766 ; +C -1 ; WX 600 ; N ltshade ; B 44 -207 607 766 ; +C -1 ; WX 600 ; N shade ; B -7 -207 607 766 ; +C -1 ; WX 600 ; N dkshade ; B -7 -258 607 766 ; +C -1 ; WX 600 ; N filledbox ; B 1 0 599 598 ; +C -1 ; WX 600 ; N filledrect ; B 1 193 599 306 ; +C -1 ; WX 600 ; N triagup ; B 7 0 592 585 ; +C -1 ; WX 600 ; N triagrt ; B 1 -13 599 584 ; +C -1 ; WX 600 ; N triagdn ; B 7 -13 592 572 ; +C -1 ; WX 600 ; N triaglf ; B 1 -13 599 584 ; +C -1 ; WX 600 ; N circle ; B 85 67 515 497 ; +C -1 ; WX 600 ; N invbullet ; B 61 0 539 479 ; +C -1 ; WX 600 ; N invcircle ; B 19 0 583 564 ; +C -1 ; WX 600 ; N smileface ; B -3 -14 603 592 ; +C -1 ; WX 600 ; N invsmileface ; B -3 -14 603 592 ; +C -1 ; WX 600 ; N sun ; B 1 -69 599 529 ; +C -1 ; WX 600 ; N female ; B 157 39 444 563 ; +C -1 ; WX 600 ; N male ; B 90 122 511 563 ; +C -1 ; WX 600 ; N spade ; B 63 0 537 601 ; +C -1 ; WX 600 ; N club ; B 1 0 599 597 ; +C -1 ; WX 600 ; N heart ; B 53 -11 547 559 ; +C -1 ; WX 600 ; N diamond ; B 78 -12 523 597 ; +C -1 ; WX 600 ; N musicalnote ; B 132 14 440 563 ; +C -1 ; WX 600 ; N musicalnotedbl ; B 44 -21 528 566 ; +C -1 ; WX 600 ; N IJ ; B 6 -15 598 592 ; +C -1 ; WX 600 ; N ij ; B -20 -209 563 633 ; +C -1 ; WX 600 ; N napostrophe ; B -20 0 580 612 ; +C -1 ; WX 600 ; N minute ; B 255 318 405 611 ; +C -1 ; WX 600 ; N second ; B 255 318 583 611 ; +C -1 ; WX 600 ; N afii61248 ; B 77 -15 525 627 ; +C -1 ; WX 600 ; N afii61289 ; B 98 -16 457 607 ; +C -1 ; WX 600 ; N H22073 ; B 1 0 599 598 ; +C -1 ; WX 600 ; N H18543 ; B 146 156 453 463 ; +C -1 ; WX 600 ; N H18551 ; B 146 156 453 463 ; +C -1 ; WX 600 ; N H18533 ; B 85 67 515 497 ; +C -1 ; WX 600 ; N openbullet ; B 151 158 451 461 ; +C -1 ; WX 600 ; N Amacron ; B -22 0 623 746 ; +C -1 ; WX 600 ; N amacron ; B 43 -17 574 590 ; +C -1 ; WX 600 ; N Ccircumflex ; B 31 -15 566 812 ; +C -1 ; WX 600 ; N ccircumflex ; B 56 -17 568 656 ; +C -1 ; WX 600 ; N Cdot ; B 31 -15 566 793 ; +C -1 ; WX 600 ; N cdot ; B 56 -17 568 638 ; +C -1 ; WX 600 ; N Emacron ; B 15 0 553 746 ; +C -1 ; WX 600 ; N emacron ; B 32 -16 552 590 ; +C -1 ; WX 600 ; N Ebreve ; B 15 0 553 810 ; +C -1 ; WX 600 ; N ebreve ; B 32 -16 552 654 ; +C -1 ; WX 600 ; N Edot ; B 15 0 553 793 ; +C -1 ; WX 600 ; N edot ; B 32 -16 552 638 ; +C -1 ; WX 600 ; N Gcircumflex ; B 32 -15 595 812 ; +C -1 ; WX 600 ; N gcircumflex ; B 32 -209 594 656 ; +C -1 ; WX 600 ; N Gdot ; B 32 -15 595 793 ; +C -1 ; WX 600 ; N gdot ; B 32 -209 594 638 ; +C -1 ; WX 600 ; N Gcedilla ; B 32 -196 595 607 ; +C -1 ; WX 600 ; N gcedilla ; B 32 -209 594 702 ; +C -1 ; WX 600 ; N Hcircumflex ; B 22 0 583 812 ; +C -1 ; WX 600 ; N hcircumflex ; B 13 0 584 812 ; +C -1 ; WX 600 ; N Hbar ; B 22 0 583 592 ; +C -1 ; WX 600 ; N hbar ; B 5 0 584 633 ; +C -1 ; WX 600 ; N Itilde ; B 82 0 518 771 ; +C -1 ; WX 600 ; N itilde ; B 63 0 537 616 ; +C -1 ; WX 600 ; N Imacron ; B 82 0 518 746 ; +C -1 ; WX 600 ; N imacron ; B 63 0 537 590 ; +C -1 ; WX 600 ; N Ibreve ; B 82 0 518 810 ; +C -1 ; WX 600 ; N ibreve ; B 63 0 537 654 ; +C -1 ; WX 600 ; N Iogonek ; B 82 -140 518 592 ; +C -1 ; WX 600 ; N iogonek ; B 63 -140 537 633 ; +C -1 ; WX 600 ; N Jcircumflex ; B 54 -15 614 812 ; +C -1 ; WX 600 ; N jcircumflex ; B 86 -209 460 656 ; +C -1 ; WX 600 ; N Kcedilla ; B 13 -196 605 592 ; +C -1 ; WX 600 ; N kcedilla ; B 34 -196 575 633 ; +C -1 ; WX 600 ; N kgreenlandic ; B 24 0 591 443 ; +C -1 ; WX 600 ; N Lcedilla ; B 33 -196 574 592 ; +C -1 ; WX 600 ; N lcedilla ; B 63 -196 537 633 ; +C -1 ; WX 600 ; N Ncedilla ; B -8 -196 593 592 ; +C -1 ; WX 600 ; N ncedilla ; B 25 -196 574 457 ; +C -1 ; WX 600 ; N Eng ; B 12 -15 549 607 ; +C -1 ; WX 600 ; N eng ; B 38 -209 525 457 ; +C -1 ; WX 600 ; N Omacron ; B 20 -15 581 746 ; +C -1 ; WX 600 ; N omacron ; B 42 -16 560 590 ; +C -1 ; WX 600 ; N Obreve ; B 20 -15 581 810 ; +C -1 ; WX 600 ; N obreve ; B 42 -16 560 654 ; +C -1 ; WX 600 ; N Rcedilla ; B 14 -196 621 592 ; +C -1 ; WX 600 ; N rcedilla ; B 53 -196 573 457 ; +C -1 ; WX 600 ; N Scircumflex ; B 62 -15 540 812 ; +C -1 ; WX 600 ; N scircumflex ; B 74 -16 529 656 ; +C -1 ; WX 600 ; N Tbar ; B 40 0 559 592 ; +C -1 ; WX 600 ; N tbar ; B 61 -16 591 601 ; +C -1 ; WX 600 ; N Utilde ; B 11 -15 591 771 ; +C -1 ; WX 600 ; N utilde ; B 15 -16 575 616 ; +C -1 ; WX 600 ; N Umacron ; B 11 -15 591 746 ; +C -1 ; WX 600 ; N umacron ; B 15 -16 575 590 ; +C -1 ; WX 600 ; N Ubreve ; B 11 -15 591 810 ; +C -1 ; WX 600 ; N ubreve ; B 15 -16 575 654 ; +C -1 ; WX 600 ; N Uogonek ; B 11 -140 591 592 ; +C -1 ; WX 600 ; N uogonek ; B 15 -140 597 443 ; +C -1 ; WX 600 ; N Wcircumflex ; B -11 0 612 812 ; +C -1 ; WX 600 ; N wcircumflex ; B -2 0 602 656 ; +C -1 ; WX 600 ; N Ycircumflex ; B 21 0 581 812 ; +C -1 ; WX 600 ; N ycircumflex ; B 21 -209 582 656 ; +C -1 ; WX 600 ; N longs ; B 73 0 572 633 ; +C -1 ; WX 600 ; N Aringacute ; B -22 0 623 1016 ; +C -1 ; WX 600 ; N aringacute ; B 43 -17 574 865 ; +C -1 ; WX 600 ; N AEacute ; B -21 0 623 822 ; +C -1 ; WX 600 ; N aeacute ; B -21 -16 612 667 ; +C -1 ; WX 600 ; N Oslashacute ; B 11 -71 591 822 ; +C -1 ; WX 600 ; N oslashacute ; B 22 -72 574 667 ; +C -1 ; WX 600 ; N anoteleia ; B 225 323 375 457 ; +C -1 ; WX 600 ; N Wgrave ; B -11 0 612 822 ; +C -1 ; WX 600 ; N wgrave ; B -2 0 602 667 ; +C -1 ; WX 600 ; N Wacute ; B -11 0 612 822 ; +C -1 ; WX 600 ; N wacute ; B -2 0 602 667 ; +C -1 ; WX 600 ; N Wdieresis ; B -11 0 612 783 ; +C -1 ; WX 600 ; N wdieresis ; B -2 0 602 627 ; +C -1 ; WX 600 ; N Ygrave ; B 21 0 581 822 ; +C -1 ; WX 600 ; N ygrave ; B 21 -209 582 667 ; +C -1 ; WX 600 ; N quotereversed ; B 249 316 456 612 ; +C -1 ; WX 600 ; N radicalex ; B 112 525 488 590 ; +C -1 ; WX 600 ; N afii08941 ; B 32 0 552 607 ; +C -1 ; WX 600 ; N estimated ; B 44 -17 561 535 ; +C -1 ; WX 600 ; N oneeighth ; B -23 -7 612 649 ; +C -1 ; WX 600 ; N threeeighths ; B -9 -7 612 648 ; +C -1 ; WX 600 ; N fiveeighths ; B -10 -7 612 640 ; +C -1 ; WX 600 ; N seveneighths ; B -4 -7 612 640 ; +C -1 ; WX 600 ; N commaaccent ; B 246 -250 354 -59 ; +C -1 ; WX 600 ; N undercommaaccent ; B 208 -196 392 -47 ; +C -1 ; WX 600 ; N tonos ; B 203 500 393 667 ; +C -1 ; WX 600 ; N dieresistonos ; B 103 482 492 685 ; +C -1 ; WX 600 ; N Alphatonos ; B -23 0 623 592 ; +C -1 ; WX 600 ; N Epsilontonos ; B -1 0 569 592 ; +C -1 ; WX 600 ; N Etatonos ; B -1 0 587 592 ; +C -1 ; WX 600 ; N Iotatonos ; B -1 0 543 592 ; +C -1 ; WX 600 ; N Omicrontonos ; B -1 -15 583 607 ; +C -1 ; WX 600 ; N Upsilontonos ; B -1 0 604 592 ; +C -1 ; WX 600 ; N Omegatonos ; B -1 0 577 607 ; +C -1 ; WX 600 ; N iotadieresistonos ; B 94 -16 483 709 ; +C -1 ; WX 600 ; N Alpha ; B -22 0 623 592 ; +C -1 ; WX 600 ; N Beta ; B 13 0 574 592 ; +C -1 ; WX 600 ; N Delta ; B 6 0 594 592 ; +C -1 ; WX 600 ; N Epsilon ; B 15 0 553 592 ; +C -1 ; WX 600 ; N Zeta ; B 74 0 529 592 ; +C -1 ; WX 600 ; N Eta ; B 22 0 583 592 ; +C -1 ; WX 600 ; N Iota ; B 82 0 518 592 ; +C -1 ; WX 600 ; N Kappa ; B 13 0 605 592 ; +C -1 ; WX 600 ; N Lambda ; B -21 0 625 592 ; +C -1 ; WX 600 ; N Mu ; B -19 0 624 592 ; +C -1 ; WX 600 ; N Nu ; B -8 0 593 592 ; +C -1 ; WX 600 ; N Xi ; B 51 0 549 592 ; +C -1 ; WX 600 ; N Omicron ; B 20 -15 581 607 ; +C -1 ; WX 600 ; N Pi ; B 20 0 581 592 ; +C -1 ; WX 600 ; N Rho ; B 60 0 577 592 ; +C -1 ; WX 600 ; N Sigma ; B 36 0 540 592 ; +C -1 ; WX 600 ; N Tau ; B 40 0 559 592 ; +C -1 ; WX 600 ; N Upsilon ; B 21 0 581 592 ; +C -1 ; WX 600 ; N Chi ; B 11 0 592 592 ; +C -1 ; WX 600 ; N Psi ; B -3 0 604 592 ; +C -1 ; WX 600 ; N Omega ; B 14 0 587 607 ; +C -1 ; WX 600 ; N Iotadieresis ; B 82 0 518 769 ; +C -1 ; WX 600 ; N Upsilondieresis ; B 21 0 581 769 ; +C -1 ; WX 600 ; N alphatonos ; B 40 -16 577 667 ; +C -1 ; WX 600 ; N epsilontonos ; B 102 -16 505 667 ; +C -1 ; WX 600 ; N etatonos ; B 56 -222 507 667 ; +C -1 ; WX 600 ; N iotatonos ; B 215 -16 432 667 ; +C -1 ; WX 600 ; N upsilondieresistonos ; B 38 -16 563 709 ; +C -1 ; WX 600 ; N beta ; B 113 -222 519 633 ; +C -1 ; WX 600 ; N gamma ; B 21 -222 582 443 ; +C -1 ; WX 600 ; N zeta ; B 151 -222 511 633 ; +C -1 ; WX 600 ; N eta ; B 56 -222 507 457 ; +C -1 ; WX 600 ; N theta ; B 68 -16 531 633 ; +C -1 ; WX 600 ; N iota ; B 223 -16 432 443 ; +C -1 ; WX 600 ; N kappa ; B 61 0 563 443 ; +C -1 ; WX 600 ; N lambda ; B 23 0 586 633 ; +C -1 ; WX 600 ; N mu ; B 14 -209 574 443 ; +C -1 ; WX 600 ; N nu ; B 33 0 514 457 ; +C -1 ; WX 600 ; N xi ; B 141 -222 500 633 ; +C -1 ; WX 600 ; N omicron ; B 42 -16 560 457 ; +C -1 ; WX 600 ; N rho ; B 83 -222 547 457 ; +C -1 ; WX 600 ; N sigma1 ; B 83 -209 532 457 ; +C -1 ; WX 600 ; N upsilon ; B 38 -16 563 443 ; +C -1 ; WX 600 ; N chi ; B 31 -222 584 457 ; +C -1 ; WX 600 ; N psi ; B 35 -222 565 633 ; +C -1 ; WX 600 ; N omega ; B 47 -16 553 457 ; +C -1 ; WX 600 ; N iotadieresis ; B 126 -16 441 627 ; +C -1 ; WX 600 ; N upsilondieresis ; B 38 -16 563 627 ; +C -1 ; WX 600 ; N omicrontonos ; B 42 -16 560 667 ; +C -1 ; WX 600 ; N upsilontonos ; B 38 -16 563 667 ; +C -1 ; WX 600 ; N omegatonos ; B 47 -16 553 667 ; +C -1 ; WX 600 ; N afii10023 ; B 15 0 553 783 ; +C -1 ; WX 600 ; N afii10051 ; B 0 -15 587 592 ; +C -1 ; WX 600 ; N afii10053 ; B 31 -15 566 607 ; +C -1 ; WX 600 ; N afii10054 ; B 62 -15 540 607 ; +C -1 ; WX 600 ; N afii10055 ; B 82 0 518 592 ; +C -1 ; WX 600 ; N afii10056 ; B 82 0 518 783 ; +C -1 ; WX 600 ; N afii10057 ; B 54 -15 614 592 ; +C -1 ; WX 600 ; N afii10058 ; B 1 -16 600 592 ; +C -1 ; WX 600 ; N afii10059 ; B -17 0 622 592 ; +C -1 ; WX 600 ; N afii10060 ; B 5 0 602 592 ; +C -1 ; WX 600 ; N afii10062 ; B 5 -16 607 810 ; +C -1 ; WX 600 ; N afii10017 ; B -22 0 623 592 ; +C -1 ; WX 600 ; N afii10018 ; B 13 0 574 592 ; +C -1 ; WX 600 ; N afii10019 ; B 13 0 574 592 ; +C -1 ; WX 600 ; N afii10020 ; B 33 0 574 592 ; +C -1 ; WX 600 ; N afii10021 ; B 20 -130 581 592 ; +C -1 ; WX 600 ; N afii10022 ; B 15 0 553 592 ; +C -1 ; WX 600 ; N afii10024 ; B 4 0 596 592 ; +C -1 ; WX 600 ; N afii10025 ; B -5 -16 546 644 ; +C -1 ; WX 600 ; N afii10026 ; B -3 0 603 592 ; +C -1 ; WX 600 ; N afii10027 ; B -3 0 603 810 ; +C -1 ; WX 600 ; N afii10028 ; B 40 0 601 592 ; +C -1 ; WX 600 ; N afii10029 ; B 2 -16 581 592 ; +C -1 ; WX 600 ; N afii10030 ; B -19 0 624 592 ; +C -1 ; WX 600 ; N afii10031 ; B 22 0 583 592 ; +C -1 ; WX 600 ; N afii10032 ; B 20 -15 581 607 ; +C -1 ; WX 600 ; N afii10033 ; B 22 0 583 592 ; +C -1 ; WX 600 ; N afii10034 ; B 60 0 577 592 ; +C -1 ; WX 600 ; N afii10035 ; B 31 -15 566 607 ; +C -1 ; WX 600 ; N afii10036 ; B 40 0 559 592 ; +C -1 ; WX 600 ; N afii10037 ; B 5 -16 607 592 ; +C -1 ; WX 600 ; N afii10038 ; B 21 0 579 592 ; +C -1 ; WX 600 ; N afii10039 ; B 11 0 592 592 ; +C -1 ; WX 600 ; N afii10040 ; B 6 -130 594 592 ; +C -1 ; WX 600 ; N afii10041 ; B 17 0 578 592 ; +C -1 ; WX 600 ; N afii10042 ; B -11 0 611 592 ; +C -1 ; WX 600 ; N afii10043 ; B -22 -130 626 592 ; +C -1 ; WX 600 ; N afii10044 ; B -16 0 600 592 ; +C -1 ; WX 600 ; N afii10045 ; B -20 0 632 592 ; +C -1 ; WX 600 ; N afii10046 ; B 13 0 574 592 ; +C -1 ; WX 600 ; N afii10047 ; B 34 -15 569 607 ; +C -1 ; WX 600 ; N afii10048 ; B -18 -15 618 607 ; +C -1 ; WX 600 ; N afii10049 ; B -21 0 586 592 ; +C -1 ; WX 600 ; N afii10065 ; B 43 -17 574 457 ; +C -1 ; WX 600 ; N afii10066 ; B 53 -13 546 646 ; +C -1 ; WX 600 ; N afii10067 ; B 13 0 547 443 ; +C -1 ; WX 600 ; N afii10068 ; B 33 0 574 443 ; +C -1 ; WX 600 ; N afii10069 ; B 34 -118 566 443 ; +C -1 ; WX 600 ; N afii10070 ; B 32 -16 552 457 ; +C -1 ; WX 600 ; N afii10072 ; B 6 0 594 443 ; +C -1 ; WX 600 ; N afii10073 ; B 35 -13 543 491 ; +C -1 ; WX 600 ; N afii10074 ; B 8 0 591 443 ; +C -1 ; WX 600 ; N afii10075 ; B 8 0 591 654 ; +C -1 ; WX 600 ; N afii10076 ; B 47 0 576 443 ; +C -1 ; WX 600 ; N afii10077 ; B 4 -13 561 443 ; +C -1 ; WX 600 ; N afii10078 ; B 1 0 599 443 ; +C -1 ; WX 600 ; N afii10079 ; B 22 0 583 443 ; +C -1 ; WX 600 ; N afii10080 ; B 42 -16 560 457 ; +C -1 ; WX 600 ; N afii10081 ; B 19 0 581 443 ; +C -1 ; WX 600 ; N afii10082 ; B -8 -209 573 457 ; +C -1 ; WX 600 ; N afii10083 ; B 56 -17 568 457 ; +C -1 ; WX 600 ; N afii10084 ; B 40 0 559 443 ; +C -1 ; WX 600 ; N afii10085 ; B 21 -134 591 443 ; +C -1 ; WX 600 ; N afii10086 ; B 46 -140 554 618 ; +C -1 ; WX 600 ; N afii10087 ; B 21 0 582 443 ; +C -1 ; WX 600 ; N afii10088 ; B 6 -118 594 443 ; +C -1 ; WX 600 ; N afii10089 ; B 31 0 564 443 ; +C -1 ; WX 600 ; N afii10090 ; B -11 0 611 443 ; +C -1 ; WX 600 ; N afii10091 ; B -22 -118 626 443 ; +C -1 ; WX 600 ; N afii10092 ; B 6 0 593 443 ; +C -1 ; WX 600 ; N afii10093 ; B -3 0 603 443 ; +C -1 ; WX 600 ; N afii10094 ; B 13 0 547 443 ; +C -1 ; WX 600 ; N afii10095 ; B 32 -16 544 457 ; +C -1 ; WX 600 ; N afii10096 ; B -14 -16 612 457 ; +C -1 ; WX 600 ; N afii10097 ; B 25 0 579 443 ; +C -1 ; WX 600 ; N afii10071 ; B 32 -16 552 627 ; +C -1 ; WX 600 ; N afii10099 ; B 13 -209 511 633 ; +C -1 ; WX 600 ; N afii10100 ; B 33 0 574 667 ; +C -1 ; WX 600 ; N afii10101 ; B 56 -16 568 457 ; +C -1 ; WX 600 ; N afii10102 ; B 74 -16 529 457 ; +C -1 ; WX 600 ; N afii10103 ; B 63 0 537 633 ; +C -1 ; WX 600 ; N afii10104 ; B 63 0 537 627 ; +C -1 ; WX 600 ; N afii10105 ; B 86 -209 460 633 ; +C -1 ; WX 600 ; N afii10106 ; B -4 -13 584 443 ; +C -1 ; WX 600 ; N afii10107 ; B -18 0 619 443 ; +C -1 ; WX 600 ; N afii10108 ; B 13 0 584 633 ; +C -1 ; WX 600 ; N afii10110 ; B 21 -134 591 654 ; +C -1 ; WX 600 ; N afii10193 ; B 19 -115 581 443 ; +C -1 ; WX 600 ; N afii10050 ; B 33 0 574 714 ; +C -1 ; WX 600 ; N afii10098 ; B 33 0 574 565 ; +C -1 ; WX 600 ; N afii00208 ; B 18 233 577 333 ; +C -1 ; WX 600 ; N afii61352 ; B 14 0 595 592 ; +C -1 ; WX 600 ; N pi ; B 43 0 557 443 ; +C -1 ; WX 600 ; N sheva ; B 268 -261 333 -82 ; +C -1 ; WX 600 ; N hatafsegol ; B 161 -261 438 -82 ; +C -1 ; WX 600 ; N hatafpatah ; B 161 -261 431 -82 ; +C -1 ; WX 600 ; N hatafqamats ; B 161 -261 431 -82 ; +C -1 ; WX 600 ; N hiriq ; B 268 -147 333 -83 ; +C -1 ; WX 600 ; N tsere ; B 214 -147 386 -83 ; +C -1 ; WX 600 ; N segol ; B 214 -261 386 -83 ; +C -1 ; WX 600 ; N patah ; B 199 -130 400 -83 ; +C -1 ; WX 600 ; N qamats ; B 199 -215 400 -83 ; +C -1 ; WX 600 ; N holam ; B 268 592 333 657 ; +C -1 ; WX 600 ; N qubuts ; B 162 -261 438 -82 ; +C -1 ; WX 600 ; N dagesh ; B 268 238 333 303 ; +C -1 ; WX 600 ; N meteg ; B 276 -261 324 -82 ; +C -1 ; WX 600 ; N maqaf ; B 47 410 553 510 ; +C -1 ; WX 600 ; N rafe ; B 199 592 400 640 ; +C -1 ; WX 600 ; N paseq ; B 250 -5 350 515 ; +C -1 ; WX 600 ; N shindot ; B 445 592 510 657 ; +C -1 ; WX 600 ; N sindot ; B 90 592 155 657 ; +C -1 ; WX 600 ; N sofpasuq ; B 225 -5 375 483 ; +C -1 ; WX 600 ; N alef ; B 70 -11 530 518 ; +C -1 ; WX 600 ; N bet ; B 45 0 543 510 ; +C -1 ; WX 600 ; N gimel ; B 103 -8 461 510 ; +C -1 ; WX 600 ; N dalet ; B 40 -5 547 510 ; +C -1 ; WX 600 ; N he ; B 63 -5 528 510 ; +C -1 ; WX 600 ; N vav ; B 153 -5 367 510 ; +C -1 ; WX 600 ; N zayin ; B 125 -5 476 510 ; +C -1 ; WX 600 ; N het ; B 38 -5 563 510 ; +C -1 ; WX 600 ; N tet ; B 16 -5 514 514 ; +C -1 ; WX 600 ; N yod ; B 152 251 375 510 ; +C -1 ; WX 600 ; N finalkaf ; B 41 -124 546 510 ; +C -1 ; WX 600 ; N kaf ; B 57 0 528 510 ; +C -1 ; WX 600 ; N lamed ; B 72 0 500 659 ; +C -1 ; WX 600 ; N finalmem ; B 21 0 514 510 ; +C -1 ; WX 600 ; N mem ; B 37 -5 521 516 ; +C -1 ; WX 600 ; N finalnun ; B 137 -124 448 510 ; +C -1 ; WX 600 ; N nun ; B 99 0 391 510 ; +C -1 ; WX 600 ; N samekh ; B 10 -6 516 510 ; +C -1 ; WX 600 ; N ayin ; B 65 0 510 510 ; +C -1 ; WX 600 ; N finalpe ; B 93 -124 573 510 ; +C -1 ; WX 600 ; N pe ; B 95 0 500 510 ; +C -1 ; WX 600 ; N finaltsadi ; B 68 -124 510 510 ; +C -1 ; WX 600 ; N tsadi ; B 56 0 509 510 ; +C -1 ; WX 600 ; N qof ; B 64 -202 527 510 ; +C -1 ; WX 600 ; N resh ; B 51 -5 490 510 ; +C -1 ; WX 600 ; N shin ; B 51 0 549 515 ; +C -1 ; WX 600 ; N tav ; B 55 -5 519 510 ; +C -1 ; WX 600 ; N doublevav ; B 41 -5 514 510 ; +C -1 ; WX 600 ; N vavyod ; B 30 -5 514 510 ; +C -1 ; WX 600 ; N doubleyod ; B 30 251 519 510 ; +C -1 ; WX 600 ; N geresh ; B 200 229 400 515 ; +C -1 ; WX 600 ; N gershayim ; B 102 229 498 515 ; +C -1 ; WX 600 ; N newsheqelsign ; B 28 -5 572 515 ; +C -1 ; WX 600 ; N vavshindot ; B 77 -5 367 657 ; +C -1 ; WX 600 ; N finalkafsheva ; B 41 -124 546 510 ; +C -1 ; WX 600 ; N finalkafqamats ; B 41 -124 546 510 ; +C -1 ; WX 600 ; N lamedholam ; B -31 0 500 659 ; +C -1 ; WX 600 ; N lamedholamdagesh ; B -31 0 500 659 ; +C -1 ; WX 600 ; N altayin ; B 65 0 510 510 ; +C -1 ; WX 600 ; N shinshindot ; B 51 0 549 657 ; +C -1 ; WX 600 ; N shinsindot ; B 51 0 549 657 ; +C -1 ; WX 600 ; N shindageshshindot ; B 51 0 549 657 ; +C -1 ; WX 600 ; N shindageshsindot ; B 51 0 549 657 ; +C -1 ; WX 600 ; N alefpatah ; B 70 -130 530 518 ; +C -1 ; WX 600 ; N alefqamats ; B 70 -215 530 518 ; +C -1 ; WX 600 ; N alefmapiq ; B 70 -11 530 518 ; +C -1 ; WX 600 ; N betdagesh ; B 45 0 543 510 ; +C -1 ; WX 600 ; N gimeldagesh ; B 103 -8 461 510 ; +C -1 ; WX 600 ; N daletdagesh ; B 40 -5 547 510 ; +C -1 ; WX 600 ; N hedagesh ; B 63 -5 528 510 ; +C -1 ; WX 600 ; N vavdagesh ; B 153 -5 367 510 ; +C -1 ; WX 600 ; N zayindagesh ; B 125 -5 476 510 ; +C -1 ; WX 600 ; N tetdagesh ; B 16 -5 514 514 ; +C -1 ; WX 600 ; N yoddagesh ; B 152 251 375 510 ; +C -1 ; WX 600 ; N finalkafdagesh ; B 41 -124 546 510 ; +C -1 ; WX 600 ; N kafdagesh ; B 57 0 528 510 ; +C -1 ; WX 600 ; N lameddagesh ; B 72 0 500 659 ; +C -1 ; WX 600 ; N memdagesh ; B 37 -5 521 516 ; +C -1 ; WX 600 ; N nundagesh ; B 99 0 391 510 ; +C -1 ; WX 600 ; N samekhdagesh ; B 10 -6 516 510 ; +C -1 ; WX 600 ; N finalpedagesh ; B 88 -124 578 510 ; +C -1 ; WX 600 ; N pedagesh ; B 90 0 505 510 ; +C -1 ; WX 600 ; N tsadidagesh ; B 56 0 509 510 ; +C -1 ; WX 600 ; N qofdagesh ; B 64 -202 527 510 ; +C -1 ; WX 600 ; N reshdagesh ; B 51 -5 490 510 ; +C -1 ; WX 600 ; N shindagesh ; B 51 0 549 515 ; +C -1 ; WX 600 ; N tavdages ; B 55 -5 519 510 ; +C -1 ; WX 600 ; N vavholam ; B 153 -5 367 657 ; +C -1 ; WX 600 ; N betrafe ; B 45 0 543 640 ; +C -1 ; WX 600 ; N kafrafe ; B 57 0 528 640 ; +C -1 ; WX 600 ; N perafe ; B 95 0 500 640 ; +C -1 ; WX 600 ; N aleflamed ; B 49 -11 536 659 ; +C -1 ; WX 600 ; N zerowidthnonjoiner ; B 283 -134 318 629 ; +C -1 ; WX 600 ; N zerowidthjoiner ; B 193 -134 407 690 ; +C -1 ; WX 600 ; N lefttorightmark ; B 172 -134 458 690 ; +C -1 ; WX 600 ; N righttoleftmark ; B 143 -134 429 690 ; +C -1 ; WX 600 ; N afii57388 ; B 218 -8 382 249 ; +C -1 ; WX 600 ; N afii57403 ; B 218 -18 382 525 ; +C -1 ; WX 600 ; N afii57407 ; B 82 -15 498 607 ; +C -1 ; WX 600 ; N afii57409 ; B 218 77 467 382 ; +C -1 ; WX 600 ; N afii57440 ; B 0 0 600 110 ; +C -1 ; WX 600 ; N afii57451 ; B 228 771 372 957 ; +C -1 ; WX 600 ; N afii57452 ; B 176 768 385 1004 ; +C -1 ; WX 600 ; N afii57453 ; B 228 -284 372 -98 ; +C -1 ; WX 600 ; N afii57454 ; B 228 771 372 871 ; +C -1 ; WX 600 ; N afii57455 ; B 190 774 381 1000 ; +C -1 ; WX 600 ; N afii57456 ; B 228 -197 372 -98 ; +C -1 ; WX 600 ; N afii57457 ; B 195 778 395 954 ; +C -1 ; WX 600 ; N afii57458 ; B 229 791 371 953 ; +C -1 ; WX 600 ; N afii57392 ; B 203 175 397 460 ; +C -1 ; WX 600 ; N afii57393 ; B 160 0 392 638 ; +C -1 ; WX 600 ; N afii57394 ; B 133 -8 441 650 ; +C -1 ; WX 600 ; N afii57395 ; B 101 -4 510 649 ; +C -1 ; WX 600 ; N afii57396 ; B 160 -2 463 632 ; +C -1 ; WX 600 ; N afii57397 ; B 140 29 455 432 ; +C -1 ; WX 600 ; N afii57398 ; B 115 2 445 662 ; +C -1 ; WX 600 ; N afii57399 ; B 103 0 498 666 ; +C -1 ; WX 600 ; N afii57400 ; B 103 -10 498 656 ; +C -1 ; WX 600 ; N afii57401 ; B 114 -40 449 592 ; +C -1 ; WX 600 ; N afii57381 ; B 57 -115 543 706 ; +C -1 ; WX 600 ; N afii57461 ; B 218 -130 382 126 ; +C -1 ; WX 600 ; N afii63167 ; B 82 -1 518 419 ; +C -1 ; WX 600 ; N afii57459 ; B 275 769 323 1099 ; +C -1 ; WX 600 ; N afii57543 ; B 220 767 374 976 ; +C -1 ; WX 600 ; N afii57534 ; B 225 0 474 387 ; +C -1 ; WX 600 ; N afii57494 ; B 138 858 462 961 ; +C -1 ; WX 600 ; N afii62843 ; B 118 -2 486 641 ; +C -1 ; WX 600 ; N afii62844 ; B 110 -26 481 618 ; +C -1 ; WX 600 ; N afii62845 ; B 131 -28 474 593 ; +C -1 ; WX 600 ; N afii64240 ; B 0 -243 596 642 ; +C -1 ; WX 600 ; N afii64241 ; B 0 -296 592 412 ; +C -1 ; WX 600 ; N afii63954 ; B 0 -207 592 645 ; +C -1 ; WX 600 ; N afii57382 ; B 0 -126 600 481 ; +C -1 ; WX 600 ; N afii64242 ; B 0 -150 600 512 ; +C -1 ; WX 600 ; N afii62881 ; B 195 778 395 1131 ; +C -1 ; WX 600 ; N afii57504 ; B 242 -295 396 -87 ; +C -1 ; WX 600 ; N afii57369 ; B 242 -376 398 -85 ; +C -1 ; WX 600 ; N afii57370 ; B 242 -464 398 -86 ; +C -1 ; WX 600 ; N afii57371 ; B 219 766 374 1117 ; +C -1 ; WX 600 ; N afii57372 ; B 219 767 373 1205 ; +C -1 ; WX 600 ; N afii57373 ; B 211 766 375 1172 ; +C -1 ; WX 600 ; N afii57374 ; B 167 766 375 1221 ; +C -1 ; WX 600 ; N afii57375 ; B 151 766 375 1217 ; +C -1 ; WX 600 ; N afii57391 ; B 0 0 600 110 ; +C -1 ; WX 600 ; N afii57471 ; B 190 628 407 818 ; +C -1 ; WX 600 ; N afii57460 ; B 177 -20 394 818 ; +C -1 ; WX 600 ; N afii52258 ; B 161 0 600 818 ; +C -1 ; WX 600 ; N afii57506 ; B 5 -300 554 415 ; +C -1 ; WX 600 ; N afii62958 ; B 0 -300 600 397 ; +C -1 ; WX 600 ; N afii62956 ; B 0 -300 569 412 ; +C -1 ; WX 600 ; N afii52957 ; B 0 -288 600 417 ; +C -1 ; WX 600 ; N afii57505 ; B 2 0 596 792 ; +C -1 ; WX 600 ; N afii62889 ; B 0 -16 605 719 ; +C -1 ; WX 600 ; N afii62887 ; B 0 0 599 778 ; +C -1 ; WX 600 ; N afii62888 ; B 0 0 600 731 ; +C -1 ; WX 600 ; N afii57507 ; B 108 -300 600 312 ; +C -1 ; WX 600 ; N afii62961 ; B 80 -300 601 374 ; +C -1 ; WX 600 ; N afii62959 ; B 0 -281 600 370 ; +C -1 ; WX 600 ; N afii62960 ; B 0 -284 600 373 ; +C -1 ; WX 600 ; N afii57508 ; B 66 -205 531 749 ; +C -1 ; WX 600 ; N afii62962 ; B 50 -206 600 740 ; +C -1 ; WX 600 ; N afii57567 ; B 0 -7 594 613 ; +C -1 ; WX 600 ; N afii62964 ; B 0 -4 600 636 ; +C -1 ; WX 600 ; N afii52305 ; B 0 0 600 638 ; +C -1 ; WX 600 ; N afii52306 ; B 0 0 600 636 ; +C -1 ; WX 600 ; N afii57509 ; B 1 -8 600 659 ; +C -1 ; WX 600 ; N afii62967 ; B 0 -7 600 663 ; +C -1 ; WX 600 ; N afii62965 ; B 0 0 600 663 ; +C -1 ; WX 600 ; N afii62966 ; B 0 0 600 665 ; +C -1 ; WX 600 ; N afii57555 ; B 27 -119 517 376 ; +C -1 ; WX 600 ; N afii52364 ; B 30 -279 600 110 ; +C -1 ; WX 600 ; N afii63753 ; B 83 -298 551 392 ; +C -1 ; WX 600 ; N afii63754 ; B 51 -300 547 381 ; +C -1 ; WX 600 ; N afii63759 ; B 83 -298 598 619 ; +C -1 ; WX 600 ; N afii63763 ; B 83 -298 598 754 ; +C -1 ; WX 600 ; N afii63795 ; B 50 -178 546 626 ; +C -1 ; WX 600 ; N afii62891 ; B 50 -300 546 627 ; +C -1 ; WX 600 ; N afii63808 ; B 84 -300 600 638 ; +C -1 ; WX 600 ; N afii62938 ; B 84 -300 600 638 ; +C -1 ; WX 600 ; N afii63810 ; B 84 -300 600 638 ; +C -1 ; WX 600 ; N afii62942 ; B 122 -300 458 630 ; +C -1 ; WX 600 ; N afii62947 ; B 44 -170 541 601 ; +C -1 ; WX 600 ; N afii63813 ; B 44 -300 542 601 ; +C -1 ; WX 600 ; N afii63823 ; B 83 -298 551 627 ; +C -1 ; WX 600 ; N afii63824 ; B 51 -177 547 609 ; +C -1 ; WX 600 ; N afii63833 ; B 83 -298 594 392 ; +C -1 ; WX 600 ; N afii63844 ; B 51 -300 548 381 ; +C -1 ; WX 600 ; N afii62882 ; B 186 778 395 1169 ; +C -1 ; WX 600 ; N afii62883 ; B 195 772 395 1134 ; +C -1 ; WX 600 ; N afii62884 ; B 195 778 395 1049 ; +C -1 ; WX 600 ; N afii62885 ; B 173 778 395 1159 ; +C -1 ; WX 600 ; N afii62886 ; B 195 773 395 1053 ; +C -1 ; WX 600 ; N afii63846 ; B 0 -289 600 388 ; +C -1 ; WX 600 ; N afii63849 ; B 0 -291 600 523 ; +C -1 ; WX 600 ; N afii63850 ; B 1 -300 600 211 ; +C -1 ; WX 600 ; N afii63851 ; B 1 -295 600 210 ; +C -1 ; WX 600 ; N afii63852 ; B 0 -210 600 602 ; +C -1 ; WX 600 ; N afii63855 ; B 0 -189 600 620 ; +C -1 ; WX 600 ; N afii63856 ; B 1 -280 600 450 ; +C -1 ; WX 600 ; N afii63761 ; B 21 -295 620 450 ; +C -1 ; WX 600 ; N afii63882 ; B 1 -280 600 459 ; +C -1 ; WX 600 ; N afii63825 ; B 21 -295 620 459 ; +C -1 ; WX 600 ; N afii63885 ; B 0 -295 601 388 ; +C -1 ; WX 600 ; N afii63888 ; B 0 -295 601 524 ; +C -1 ; WX 600 ; N afii63896 ; B 0 -295 592 523 ; +C -1 ; WX 600 ; N afii63897 ; B 0 -201 591 522 ; +C -1 ; WX 600 ; N afii63898 ; B 0 -201 591 584 ; +C -1 ; WX 600 ; N afii63899 ; B 0 -243 558 463 ; +C -1 ; WX 600 ; N afii63900 ; B 0 -250 592 412 ; +C -1 ; WX 600 ; N afii63901 ; B 0 -201 601 741 ; +C -1 ; WX 600 ; N afii63902 ; B 0 0 601 741 ; +C -1 ; WX 600 ; N afii63903 ; B 0 0 601 741 ; +C -1 ; WX 600 ; N afii63904 ; B 0 0 573 684 ; +C -1 ; WX 600 ; N afii63905 ; B 0 -207 592 624 ; +C -1 ; WX 600 ; N afii63906 ; B 0 0 572 819 ; +C -1 ; WX 600 ; N afii63908 ; B 0 -1 600 512 ; +C -1 ; WX 600 ; N afii63910 ; B 0 -1 600 512 ; +C -1 ; WX 600 ; N afii63912 ; B 0 -1 600 709 ; +C -1 ; WX 600 ; N afii62927 ; B 0 -4 598 581 ; +C -1 ; WX 600 ; N afii63941 ; B 0 -240 600 641 ; +C -1 ; WX 600 ; N afii62939 ; B 0 0 600 641 ; +C -1 ; WX 600 ; N afii63943 ; B 0 0 600 641 ; +C -1 ; WX 600 ; N afii62943 ; B 0 -55 598 636 ; +C -1 ; WX 600 ; N afii62946 ; B 0 -207 586 645 ; +C -1 ; WX 600 ; N afii63946 ; B 0 -200 577 482 ; +C -1 ; WX 600 ; N afii62951 ; B 0 0 577 482 ; +C -1 ; WX 600 ; N afii63948 ; B 0 0 577 542 ; +C -1 ; WX 600 ; N afii62953 ; B 0 -7 563 483 ; +C -1 ; WX 600 ; N afii63950 ; B 0 -201 591 743 ; +C -1 ; WX 600 ; N afii63951 ; B 0 0 591 743 ; +C -1 ; WX 600 ; N afii63952 ; B 0 0 591 743 ; +C -1 ; WX 600 ; N afii63953 ; B 0 0 576 680 ; +C -1 ; WX 600 ; N afii63956 ; B 0 -1 600 627 ; +C -1 ; WX 600 ; N afii63958 ; B 0 -262 600 522 ; +C -1 ; WX 600 ; N afii63959 ; B 0 -140 601 522 ; +C -1 ; WX 600 ; N afii63960 ; B 0 -140 601 721 ; +C -1 ; WX 600 ; N afii63961 ; B 0 -252 601 463 ; +C -1 ; WX 600 ; N afii64046 ; B 0 -4 598 790 ; +C -1 ; WX 600 ; N afii64058 ; B 200 0 600 831 ; +C -1 ; WX 600 ; N afii64059 ; B 207 -20 350 831 ; +C -1 ; WX 600 ; N afii64060 ; B 264 -156 489 642 ; +C -1 ; WX 600 ; N afii64061 ; B 118 -156 343 642 ; +C -1 ; WX 600 ; N afii62945 ; B 0 0 596 642 ; +C -1 ; WX 600 ; N afii64184 ; B 0 0 600 695 ; +C -1 ; WX 600 ; N afii52399 ; B 218 77 467 382 ; +C -1 ; WX 600 ; N afii52400 ; B 138 -20 462 798 ; +C -1 ; WX 600 ; N afii62753 ; B 110 0 600 798 ; +C -1 ; WX 600 ; N afii57411 ; B 191 -20 345 831 ; +C -1 ; WX 600 ; N afii62754 ; B 184 0 600 831 ; +C -1 ; WX 600 ; N afii57412 ; B 97 -195 505 608 ; +C -1 ; WX 600 ; N afii62755 ; B 99 -195 600 608 ; +C -1 ; WX 600 ; N afii57413 ; B 202 -300 356 634 ; +C -1 ; WX 600 ; N afii62756 ; B 224 -296 600 630 ; +C -1 ; WX 600 ; N afii57414 ; B 27 -119 517 583 ; +C -1 ; WX 600 ; N afii62759 ; B 30 -279 600 383 ; +C -1 ; WX 600 ; N afii62757 ; B 0 0 569 651 ; +C -1 ; WX 600 ; N afii62758 ; B 0 0 600 664 ; +C -1 ; WX 600 ; N afii57415 ; B 234 -20 339 634 ; +C -1 ; WX 600 ; N afii62760 ; B 224 0 600 630 ; +C -1 ; WX 600 ; N afii57416 ; B 5 -260 554 415 ; +C -1 ; WX 600 ; N afii62763 ; B 0 -260 600 397 ; +C -1 ; WX 600 ; N afii62761 ; B 0 -224 569 412 ; +C -1 ; WX 600 ; N afii62762 ; B 0 -261 600 417 ; +C -1 ; WX 600 ; N afii57417 ; B 179 0 474 601 ; +C -1 ; WX 600 ; N afii62764 ; B 154 0 600 700 ; +C -1 ; WX 600 ; N afii57418 ; B 5 0 554 529 ; +C -1 ; WX 600 ; N afii62767 ; B 0 0 600 529 ; +C -1 ; WX 600 ; N afii62765 ; B 0 0 600 627 ; +C -1 ; WX 600 ; N afii62766 ; B 0 0 600 610 ; +C -1 ; WX 600 ; N afii57419 ; B 5 0 554 722 ; +C -1 ; WX 600 ; N afii62770 ; B 0 0 600 722 ; +C -1 ; WX 600 ; N afii62768 ; B 0 0 599 752 ; +C -1 ; WX 600 ; N afii62769 ; B 0 0 600 740 ; +C -1 ; WX 600 ; N afii57420 ; B 108 -300 600 312 ; +C -1 ; WX 600 ; N afii62773 ; B 78 -300 599 374 ; +C -1 ; WX 600 ; N afii62771 ; B 0 -157 600 370 ; +C -1 ; WX 600 ; N afii62772 ; B 0 -244 600 373 ; +C -1 ; WX 600 ; N afii57421 ; B 108 -300 600 312 ; +C -1 ; WX 600 ; N afii62776 ; B 78 -300 599 374 ; +C -1 ; WX 600 ; N afii62774 ; B 0 0 600 370 ; +C -1 ; WX 600 ; N afii62775 ; B 0 0 600 373 ; +C -1 ; WX 600 ; N afii57422 ; B 108 -300 600 607 ; +C -1 ; WX 600 ; N afii62779 ; B 78 -300 599 595 ; +C -1 ; WX 600 ; N afii62777 ; B 0 0 600 560 ; +C -1 ; WX 600 ; N afii62778 ; B 0 0 600 626 ; +C -1 ; WX 600 ; N afii57423 ; B 182 -5 519 451 ; +C -1 ; WX 600 ; N afii62780 ; B 143 0 600 506 ; +C -1 ; WX 600 ; N afii57424 ; B 182 -5 519 681 ; +C -1 ; WX 600 ; N afii62781 ; B 143 0 600 684 ; +C -1 ; WX 600 ; N afii57425 ; B 66 -205 512 394 ; +C -1 ; WX 600 ; N afii62782 ; B 50 -206 600 387 ; +C -1 ; WX 600 ; N afii57426 ; B 66 -205 512 634 ; +C -1 ; WX 600 ; N afii62783 ; B 50 -206 600 634 ; +C -1 ; WX 600 ; N afii57427 ; B 0 -182 585 398 ; +C -1 ; WX 600 ; N afii62786 ; B 0 -182 600 406 ; +C -1 ; WX 600 ; N afii62784 ; B 0 0 575 396 ; +C -1 ; WX 600 ; N afii62785 ; B 0 0 600 394 ; +C -1 ; WX 600 ; N afii57428 ; B 0 -182 585 688 ; +C -1 ; WX 600 ; N afii62789 ; B 0 -182 600 688 ; +C -1 ; WX 600 ; N afii62787 ; B 0 0 575 688 ; +C -1 ; WX 600 ; N afii62788 ; B 0 0 600 698 ; +C -1 ; WX 600 ; N afii57429 ; B 1 -188 571 355 ; +C -1 ; WX 600 ; N afii62792 ; B 1 -188 600 355 ; +C -1 ; WX 600 ; N afii62790 ; B 0 0 578 353 ; +C -1 ; WX 600 ; N afii62791 ; B 0 0 600 353 ; +C -1 ; WX 600 ; N afii57430 ; B 1 -188 571 574 ; +C -1 ; WX 600 ; N afii62795 ; B 1 -188 600 574 ; +C -1 ; WX 600 ; N afii62793 ; B 0 0 578 566 ; +C -1 ; WX 600 ; N afii62794 ; B 0 0 600 566 ; +C -1 ; WX 600 ; N afii57431 ; B 0 0 577 628 ; +C -1 ; WX 600 ; N afii62798 ; B 0 0 600 628 ; +C -1 ; WX 600 ; N afii62796 ; B 0 0 577 628 ; +C -1 ; WX 600 ; N afii62797 ; B 0 0 600 628 ; +C -1 ; WX 600 ; N afii57432 ; B 0 0 577 628 ; +C -1 ; WX 600 ; N afii62801 ; B 0 0 600 628 ; +C -1 ; WX 600 ; N afii62799 ; B 0 0 577 628 ; +C -1 ; WX 600 ; N afii62800 ; B 0 0 600 628 ; +C -1 ; WX 600 ; N afii57433 ; B 85 -300 595 371 ; +C -1 ; WX 600 ; N afii62804 ; B 107 -300 600 356 ; +C -1 ; WX 600 ; N afii62802 ; B 0 0 485 376 ; +C -1 ; WX 600 ; N afii62803 ; B 0 0 600 356 ; +C -1 ; WX 600 ; N afii57434 ; B 85 -300 595 640 ; +C -1 ; WX 600 ; N afii62807 ; B 107 -300 600 587 ; +C -1 ; WX 600 ; N afii62805 ; B 0 0 485 630 ; +C -1 ; WX 600 ; N afii62806 ; B 0 0 600 594 ; +C -1 ; WX 600 ; N afii57441 ; B 2 0 594 661 ; +C -1 ; WX 600 ; N afii62810 ; B 0 -16 600 616 ; +C -1 ; WX 600 ; N afii62808 ; B 0 0 592 661 ; +C -1 ; WX 600 ; N afii62809 ; B 0 0 600 615 ; +C -1 ; WX 600 ; N afii57442 ; B 53 -188 585 599 ; +C -1 ; WX 600 ; N afii62813 ; B 70 -174 600 536 ; +C -1 ; WX 600 ; N afii62811 ; B 0 0 592 634 ; +C -1 ; WX 600 ; N afii62812 ; B 0 0 600 623 ; +C -1 ; WX 600 ; N afii57443 ; B 4 -18 560 635 ; +C -1 ; WX 600 ; N afii62816 ; B 4 -18 600 633 ; +C -1 ; WX 600 ; N afii57410 ; B 0 0 600 638 ; +C -1 ; WX 600 ; N afii62815 ; B 0 0 600 636 ; +C -1 ; WX 600 ; N afii57444 ; B 67 -96 549 636 ; +C -1 ; WX 600 ; N afii62819 ; B 19 -157 600 630 ; +C -1 ; WX 600 ; N afii62817 ; B 0 0 587 645 ; +C -1 ; WX 600 ; N afii62818 ; B 0 0 600 633 ; +C -1 ; WX 600 ; N afii57445 ; B 169 -300 600 342 ; +C -1 ; WX 600 ; N afii62822 ; B 169 -300 600 342 ; +C -1 ; WX 600 ; N afii62820 ; B 0 -6 560 364 ; +C -1 ; WX 600 ; N afii62821 ; B 0 -6 600 364 ; +C -1 ; WX 600 ; N afii57446 ; B 63 -193 547 542 ; +C -1 ; WX 600 ; N afii62825 ; B 42 -210 600 548 ; +C -1 ; WX 600 ; N afii62823 ; B 0 0 569 647 ; +C -1 ; WX 600 ; N afii62824 ; B 0 0 600 631 ; +C -1 ; WX 600 ; N afii57447 ; B 225 0 474 387 ; +C -1 ; WX 600 ; N afii62828 ; B 154 0 600 506 ; +C -1 ; WX 600 ; N afii57470 ; B 0 -8 461 375 ; +C -1 ; WX 600 ; N afii62827 ; B 0 -208 600 366 ; +C -1 ; WX 600 ; N afii57448 ; B 97 -195 505 330 ; +C -1 ; WX 600 ; N afii62829 ; B 99 -195 600 337 ; +C -1 ; WX 600 ; N afii57449 ; B 27 -119 517 376 ; +C -1 ; WX 600 ; N afii62830 ; B 30 -279 600 110 ; +C -1 ; WX 600 ; N afii57450 ; B 27 -297 517 376 ; +C -1 ; WX 600 ; N afii62833 ; B 47 -300 600 110 ; +C -1 ; WX 600 ; N afii62831 ; B 0 -287 575 412 ; +C -1 ; WX 600 ; N afii62832 ; B 0 -295 600 417 ; +C -1 ; WX 600 ; N afii62834 ; B 30 0 494 726 ; +C -1 ; WX 600 ; N afii62835 ; B 33 -42 600 694 ; +C -1 ; WX 600 ; N afii62836 ; B 53 0 494 796 ; +C -1 ; WX 600 ; N afii62837 ; B 62 -42 600 807 ; +C -1 ; WX 600 ; N afii62838 ; B 53 -295 494 640 ; +C -1 ; WX 600 ; N afii62839 ; B 74 -300 600 678 ; +C -1 ; WX 600 ; N afii62840 ; B 53 0 494 640 ; +C -1 ; WX 600 ; N afii62841 ; B 74 -42 600 678 ; +C -1 ; WX 600 ; N glyph1021 ; B 240 477 390 626 ; +C -1 ; WX 600 ; N afii57543-2 ; B 220 660 374 868 ; +C -1 ; WX 600 ; N afii57454-2 ; B 228 664 372 763 ; +C -1 ; WX 600 ; N afii57451-2 ; B 228 660 372 846 ; +C -1 ; WX 600 ; N glyph1025 ; B 43 0 494 887 ; +C -1 ; WX 600 ; N glyph1026 ; B 58 0 494 997 ; +C -1 ; WX 600 ; N afii57471-2 ; B 190 521 407 710 ; +C -1 ; WX 600 ; N afii57458-2 ; B 229 684 371 846 ; +C -1 ; WX 600 ; N afii57457-2 ; B 195 671 395 846 ; +C -1 ; WX 600 ; N afii57494-2 ; B 138 751 462 854 ; +C -1 ; WX 600 ; N afii57459-2 ; B 275 663 323 993 ; +C -1 ; WX 600 ; N afii57455-2 ; B 190 667 381 893 ; +C -1 ; WX 600 ; N afii57452-2 ; B 176 660 385 897 ; +C -1 ; WX 600 ; N glyph1034 ; B 58 0 494 964 ; +C -1 ; WX 600 ; N glyph1035 ; B 13 0 494 1013 ; +C -1 ; WX 600 ; N glyph1036 ; B 0 0 494 1009 ; +C -1 ; WX 600 ; N afii62884-2 ; B 195 671 395 942 ; +C -1 ; WX 600 ; N afii62881-2 ; B 195 671 395 1023 ; +C -1 ; WX 600 ; N afii62886-2 ; B 195 666 395 946 ; +C -1 ; WX 600 ; N afii62883-2 ; B 195 665 395 1027 ; +C -1 ; WX 600 ; N afii62885-2 ; B 173 671 395 1052 ; +C -1 ; WX 600 ; N afii62882-2 ; B 186 671 395 1062 ; +C -1 ; WX 600 ; N afii57504-2 ; B 193 -535 348 -326 ; +C -1 ; WX 600 ; N afii57456-2 ; B 179 -437 323 -337 ; +C -1 ; WX 600 ; N afii57453-2 ; B 179 -523 323 -337 ; +C -1 ; WX 600 ; N glyph1046 ; B 53 -376 494 640 ; +C -1 ; WX 600 ; N glyph1047 ; B 53 -464 494 640 ; +C -1 ; WX 600 ; N afii57543-3 ; B 229 464 383 673 ; +C -1 ; WX 600 ; N afii57454-3 ; B 219 469 363 568 ; +C -1 ; WX 600 ; N afii57451-3 ; B 219 465 363 651 ; +C -1 ; WX 600 ; N glyph1051 ; B 67 -42 600 924 ; +C -1 ; WX 600 ; N glyph1052 ; B 66 -42 600 1012 ; +C -1 ; WX 600 ; N afii57471-3 ; B 181 326 398 515 ; +C -1 ; WX 600 ; N afii57458-3 ; B 220 488 362 650 ; +C -1 ; WX 600 ; N afii57457-3 ; B 186 476 386 651 ; +C -1 ; WX 600 ; N afii57494-3 ; B 129 556 453 658 ; +C -1 ; WX 600 ; N afii57459-3 ; B 267 467 314 798 ; +C -1 ; WX 600 ; N afii57455-3 ; B 181 472 372 698 ; +C -1 ; WX 600 ; N afii57452-3 ; B 167 465 376 702 ; +C -1 ; WX 600 ; N glyph1060 ; B 59 -42 600 979 ; +C -1 ; WX 600 ; N glyph1061 ; B 13 -42 600 1028 ; +C -1 ; WX 600 ; N glyph1062 ; B -2 -42 600 1024 ; +C -1 ; WX 600 ; N afii62884-3 ; B 186 476 386 747 ; +C -1 ; WX 600 ; N afii62881-3 ; B 186 476 386 828 ; +C -1 ; WX 600 ; N afii62886-3 ; B 186 470 386 750 ; +C -1 ; WX 600 ; N afii62883-3 ; B 186 470 386 832 ; +C -1 ; WX 600 ; N afii62885-3 ; B 165 476 386 856 ; +C -1 ; WX 600 ; N afii62882-3 ; B 177 476 386 866 ; +C -1 ; WX 600 ; N afii57504-3 ; B 193 -710 348 -502 ; +C -1 ; WX 600 ; N afii57456-3 ; B 179 -612 323 -513 ; +C -1 ; WX 600 ; N afii57453-3 ; B 179 -699 323 -513 ; +C -1 ; WX 600 ; N glyph1072 ; B 74 -376 600 678 ; +C -1 ; WX 600 ; N glyph1073 ; B 74 -464 600 678 ; +C -1 ; WX 600 ; N afii57543-4 ; B 88 596 242 805 ; +C -1 ; WX 600 ; N afii57454-4 ; B 96 601 240 700 ; +C -1 ; WX 600 ; N afii57451-4 ; B 96 600 240 786 ; +C -1 ; WX 600 ; N glyph1077 ; B 178 -20 347 921 ; +C -1 ; WX 600 ; N glyph1078 ; B 178 -20 347 1008 ; +C -1 ; WX 600 ; N afii57471-4 ; B 58 458 275 647 ; +C -1 ; WX 600 ; N afii57458-4 ; B 97 620 239 782 ; +C -1 ; WX 600 ; N afii57457-4 ; B 63 607 263 783 ; +C -1 ; WX 600 ; N afii57494-4 ; B 6 688 330 790 ; +C -1 ; WX 600 ; N afii57459-4 ; B 145 598 192 928 ; +C -1 ; WX 600 ; N afii57455-4 ; B 58 604 249 830 ; +C -1 ; WX 600 ; N afii57452-4 ; B 44 597 253 833 ; +C -1 ; WX 600 ; N glyph1086 ; B 184 -20 347 1004 ; +C -1 ; WX 600 ; N glyph1087 ; B 140 -20 348 1054 ; +C -1 ; WX 600 ; N glyph1088 ; B 124 -20 347 1052 ; +C -1 ; WX 600 ; N afii62884-4 ; B 63 607 263 878 ; +C -1 ; WX 600 ; N afii62881-4 ; B 63 607 263 960 ; +C -1 ; WX 600 ; N afii62886-4 ; B 63 602 263 882 ; +C -1 ; WX 600 ; N afii62883-4 ; B 63 602 263 963 ; +C -1 ; WX 600 ; N afii62885-4 ; B 42 607 263 988 ; +C -1 ; WX 600 ; N afii62882-4 ; B 54 607 263 998 ; +C -1 ; WX 600 ; N afii57504-4 ; B 130 -295 284 -87 ; +C -1 ; WX 600 ; N afii57456-4 ; B 116 -209 260 -110 ; +C -1 ; WX 600 ; N afii57453-4 ; B 116 -296 260 -110 ; +C -1 ; WX 600 ; N glyph1098 ; B 202 -376 358 634 ; +C -1 ; WX 600 ; N glyph1099 ; B 202 -464 358 634 ; +C -1 ; WX 600 ; N glyph1100 ; B 141 372 435 529 ; +C -1 ; WX 600 ; N glyph1101 ; B 123 429 417 722 ; +C -1 ; WX 600 ; N glyph1102 ; B 164 -300 391 -64 ; +C -1 ; WX 600 ; N glyph1103 ; B 0 -207 592 412 ; +C -1 ; WX 600 ; N glyph1104 ; B 5 0 554 415 ; +C -1 ; WX 600 ; N glyph1105 ; B 0 0 600 397 ; +C -1 ; WX 600 ; N glyph1106 ; B 0 0 569 412 ; +C -1 ; WX 600 ; N glyph1107 ; B 0 0 600 417 ; +C -1 ; WX 600 ; N glyph1108 ; B 2 0 594 445 ; +C -1 ; WX 600 ; N glyph1109 ; B 0 -16 600 397 ; +C -1 ; WX 600 ; N glyph1110 ; B 0 0 592 441 ; +C -1 ; WX 600 ; N glyph1111 ; B 0 0 600 396 ; +C -1 ; WX 600 ; N glyph1112 ; B 83 -298 551 392 ; +C -1 ; WX 600 ; N glyph1113 ; B 51 -177 547 381 ; +C -1 ; WX 600 ; N glyph1114 ; B 50 -178 546 396 ; +C -1 ; WX 600 ; N glyph1115 ; B 0 -210 600 388 ; +C -1 ; WX 600 ; N glyph1116 ; B 0 -189 600 351 ; +C -1 ; WX 600 ; N glyph1117 ; B 1 -280 600 211 ; +C -1 ; WX 600 ; N glyph1118 ; B 0 0 591 522 ; +C -1 ; WX 600 ; N glyph1119 ; B 0 0 558 463 ; +C -1 ; WX 600 ; N glyph1120 ; B 164 0 600 926 ; +C -1 ; WX 600 ; N glyph1121 ; B 164 0 600 1013 ; +C -1 ; WX 600 ; N glyph1122 ; B 170 0 600 1009 ; +C -1 ; WX 600 ; N glyph1123 ; B 125 0 600 1058 ; +C -1 ; WX 600 ; N glyph1124 ; B 109 0 600 1054 ; +C -1 ; WX 600 ; N glyph1125 ; B 224 -376 600 630 ; +C -1 ; WX 600 ; N glyph1126 ; B 224 -464 600 630 ; +C -1 ; WX 600 ; N uniFFFC ; B 0 0 600 431 ; +C -1 ; WX 600 ; N Ohorn ; B 20 -15 641 628 ; +C -1 ; WX 600 ; N ohorn ; B 42 -16 602 490 ; +C -1 ; WX 600 ; N Uhorn ; B 11 -15 678 714 ; +C -1 ; WX 600 ; N uhorn ; B 15 -16 645 465 ; +C -1 ; WX 600 ; N _d_1133 ; B 195 728 428 827 ; +C -1 ; WX 600 ; N _d_1134 ; B 171 728 403 827 ; +C -1 ; WX 600 ; N _d_1135 ; B 195 683 401 829 ; +C -1 ; WX 600 ; N f006 ; B 200 728 428 827 ; +C -1 ; WX 600 ; N f007 ; B 200 728 428 827 ; +C -1 ; WX 600 ; N f009 ; B 195 683 401 829 ; +C -1 ; WX 600 ; N combininghookabove ; B 176 691 402 827 ; +C -1 ; WX 600 ; N f010 ; B 195 740 399 827 ; +C -1 ; WX 600 ; N f013 ; B 190 691 417 827 ; +C -1 ; WX 600 ; N f011 ; B 195 740 399 827 ; +C -1 ; WX 600 ; N f01c ; B 146 700 484 827 ; +C -1 ; WX 600 ; N f015 ; B 134 726 446 827 ; +C -1 ; WX 600 ; N combiningtildeaccent ; B 146 700 485 827 ; +C -1 ; WX 600 ; N _d_1146 ; B 171 630 436 712 ; +C -1 ; WX 600 ; N _d_1147 ; B 171 630 433 715 ; +C -1 ; WX 600 ; N f02c ; B 433 -186 560 -59 ; +C -1 ; WX 600 ; N dongsign ; B 88 119 508 633 ; +C -1 ; WX 600 ; N onethird ; B -46 -9 646 649 ; +C -1 ; WX 600 ; N twothirds ; B -46 -9 646 648 ; +C -1 ; WX 600 ; N f008 ; B 194 499 400 645 ; +C -1 ; WX 600 ; N _d_1153 ; B 209 499 415 645 ; +C -1 ; WX 600 ; N _d_1154 ; B 176 498 382 644 ; +C -1 ; WX 600 ; N f00f ; B 195 498 401 644 ; +C -1 ; WX 600 ; N f012 ; B 177 500 403 636 ; +C -1 ; WX 600 ; N f014 ; B 177 500 403 636 ; +C -1 ; WX 600 ; N f016 ; B 131 700 470 827 ; +C -1 ; WX 600 ; N f017 ; B 131 700 470 827 ; +C -1 ; WX 600 ; N f018 ; B 146 700 484 827 ; +C -1 ; WX 600 ; N f019 ; B 121 489 459 616 ; +C -1 ; WX 600 ; N f01a ; B 136 489 474 616 ; +C -1 ; WX 600 ; N f01b ; B 121 489 459 616 ; +C -1 ; WX 600 ; N f01e ; B 238 -186 364 -59 ; +C -1 ; WX 600 ; N f01f ; B 238 -186 364 -59 ; +C -1 ; WX 600 ; N f020 ; B 238 -186 364 -59 ; +C -1 ; WX 600 ; N f021 ; B 238 -186 364 -59 ; +C -1 ; WX 600 ; N f022 ; B 238 -186 364 -59 ; +C -1 ; WX 600 ; N combininggraveaccent ; B 195 683 401 829 ; +C -1 ; WX 600 ; N combiningacuteaccent ; B 195 683 401 829 ; +C -1 ; WX 600 ; N f01d ; B 121 489 459 616 ; +C -1 ; WX 600 ; N combiningdotbelow ; B 238 -186 364 -59 ; +C -1 ; WX 600 ; N f023 ; B 238 -186 364 -59 ; +C -1 ; WX 600 ; N f029 ; B 238 -186 364 -59 ; +C -1 ; WX 600 ; N f02a ; B 238 -186 364 -59 ; +C -1 ; WX 600 ; N f02b ; B 238 -186 364 -59 ; +C -1 ; WX 600 ; N f024 ; B 238 -186 364 -59 ; +C -1 ; WX 600 ; N f025 ; B 238 -186 364 -59 ; +C -1 ; WX 600 ; N f026 ; B 238 -186 364 -59 ; +C -1 ; WX 600 ; N f027 ; B 238 -186 364 -59 ; +C -1 ; WX 600 ; N f028 ; B 238 -186 364 -59 ; +C -1 ; WX 600 ; N f02d ; B 164 726 475 827 ; +C -1 ; WX 600 ; N f02e ; B 136 700 475 827 ; +C -1 ; WX 600 ; N f02f ; B 164 726 475 827 ; +C -1 ; WX 600 ; N f030 ; B 146 700 484 827 ; +C -1 ; WX 600 ; N Adotbelow ; B -22 -186 623 592 ; +C -1 ; WX 600 ; N adotbelow ; B 43 -186 574 457 ; +C -1 ; WX 600 ; N Ahookabove ; B -22 0 623 827 ; +C -1 ; WX 600 ; N ahookabove ; B 43 -17 574 636 ; +C -1 ; WX 600 ; N Acircumflexacute ; B -22 0 623 827 ; +C -1 ; WX 600 ; N acircumflexacute ; B 43 -17 574 829 ; +C -1 ; WX 600 ; N Acircumflexgrave ; B -22 0 623 827 ; +C -1 ; WX 600 ; N acircumflexgrave ; B 43 -17 574 829 ; +C -1 ; WX 600 ; N Acircumflexhookabove ; B -22 0 623 827 ; +C -1 ; WX 600 ; N acircumflexhookabove ; B 43 -17 574 827 ; +C -1 ; WX 600 ; N Acircumflextilde ; B -22 0 623 827 ; +C -1 ; WX 600 ; N acircumflextilde ; B 43 -17 574 827 ; +C -1 ; WX 600 ; N Acircumflexdotbelow ; B -22 -186 623 715 ; +C -1 ; WX 600 ; N acircumflexdotbelow ; B 43 -186 574 656 ; +C -1 ; WX 600 ; N Abreveacute ; B -22 0 623 827 ; +C -1 ; WX 600 ; N abreveacute ; B 43 -17 574 829 ; +C -1 ; WX 600 ; N Abrevegrave ; B -22 0 623 827 ; +C -1 ; WX 600 ; N abrevegrave ; B 43 -17 574 829 ; +C -1 ; WX 600 ; N Abrevehookabove ; B -22 0 623 827 ; +C -1 ; WX 600 ; N abrevehookabove ; B 43 -17 574 827 ; +C -1 ; WX 600 ; N Abrevetilde ; B -22 0 623 827 ; +C -1 ; WX 600 ; N abrevetilde ; B 43 -17 574 827 ; +C -1 ; WX 600 ; N Abrevedotbelow ; B -22 -186 623 712 ; +C -1 ; WX 600 ; N abrevedotbelow ; B 43 -186 574 654 ; +C -1 ; WX 600 ; N Edotbelow ; B 15 -186 553 592 ; +C -1 ; WX 600 ; N edotbelow ; B 32 -186 552 457 ; +C -1 ; WX 600 ; N Ehookabove ; B 15 0 553 827 ; +C -1 ; WX 600 ; N ehookabove ; B 32 -16 552 636 ; +C -1 ; WX 600 ; N Etilde ; B 15 0 553 771 ; +C -1 ; WX 600 ; N etilde ; B 32 -16 552 616 ; +C -1 ; WX 600 ; N Ecircumflexacute ; B 15 0 553 827 ; +C -1 ; WX 600 ; N ecircumflexacute ; B 32 -16 552 829 ; +C -1 ; WX 600 ; N Ecircumflexgrave ; B 15 0 553 827 ; +C -1 ; WX 600 ; N ecircumflexgrave ; B 32 -16 552 829 ; +C -1 ; WX 600 ; N Ecircumflexhookabove ; B 15 0 553 827 ; +C -1 ; WX 600 ; N ecircumflexhookabove ; B 32 -16 552 827 ; +C -1 ; WX 600 ; N Ecircumflextilde ; B 15 0 553 827 ; +C -1 ; WX 600 ; N ecircumflextilde ; B 32 -16 552 827 ; +C -1 ; WX 600 ; N Ecircumflexdotbelow ; B 15 -186 553 715 ; +C -1 ; WX 600 ; N ecircumflexdotbelow ; B 32 -186 552 656 ; +C -1 ; WX 600 ; N Ihookabove ; B 82 0 518 827 ; +C -1 ; WX 600 ; N ihookabove ; B 63 0 537 636 ; +C -1 ; WX 600 ; N Idotbelow ; B 82 -186 518 592 ; +C -1 ; WX 600 ; N idotbelow ; B 63 -186 537 633 ; +C -1 ; WX 600 ; N Odotbelow ; B 20 -186 581 607 ; +C -1 ; WX 600 ; N odotbelow ; B 42 -186 560 457 ; +C -1 ; WX 600 ; N Ohookabove ; B 20 -15 581 827 ; +C -1 ; WX 600 ; N ohookabove ; B 42 -16 560 636 ; +C -1 ; WX 600 ; N Ocircumflexacute ; B 20 -15 581 827 ; +C -1 ; WX 600 ; N ocircumflexacute ; B 42 -16 560 829 ; +C -1 ; WX 600 ; N Ocircumflexgrave ; B 20 -15 581 827 ; +C -1 ; WX 600 ; N ocircumflexgrave ; B 42 -16 560 829 ; +C -1 ; WX 600 ; N Ocircumflexhookabove ; B 20 -15 581 827 ; +C -1 ; WX 600 ; N ocircumflexhookabove ; B 42 -16 560 827 ; +C -1 ; WX 600 ; N Ocircumflextilde ; B 20 -15 581 827 ; +C -1 ; WX 600 ; N ocircumflextilde ; B 42 -16 560 827 ; +C -1 ; WX 600 ; N Ocircumflexdotbelow ; B 20 -186 581 715 ; +C -1 ; WX 600 ; N ocircumflexdotbelow ; B 42 -186 560 656 ; +C -1 ; WX 600 ; N Ohornacute ; B 20 -15 641 822 ; +C -1 ; WX 600 ; N ohornacute ; B 42 -16 602 667 ; +C -1 ; WX 600 ; N Ohorngrave ; B 20 -15 641 822 ; +C -1 ; WX 600 ; N ohorngrave ; B 42 -16 602 667 ; +C -1 ; WX 600 ; N Ohornhookabove ; B 20 -15 641 827 ; +C -1 ; WX 600 ; N ohornhookabove ; B 42 -16 602 636 ; +C -1 ; WX 600 ; N Ohorntilde ; B 20 -15 641 771 ; +C -1 ; WX 600 ; N ohorntilde ; B 42 -16 602 616 ; +C -1 ; WX 600 ; N Ohorndotbelow ; B 20 -186 641 628 ; +C -1 ; WX 600 ; N ohorndotbelow ; B 42 -186 602 490 ; +C -1 ; WX 600 ; N Udotbelow ; B 11 -186 591 592 ; +C -1 ; WX 600 ; N udotbelow ; B 15 -186 575 443 ; +C -1 ; WX 600 ; N Uhookabove ; B 11 -15 591 827 ; +C -1 ; WX 600 ; N uhookabove ; B 15 -16 575 636 ; +C -1 ; WX 600 ; N Uhornacute ; B 11 -15 678 822 ; +C -1 ; WX 600 ; N uhornacute ; B 15 -16 645 667 ; +C -1 ; WX 600 ; N Uhorngrave ; B 11 -15 678 822 ; +C -1 ; WX 600 ; N uhorngrave ; B 15 -16 645 667 ; +C -1 ; WX 600 ; N Uhornhookabove ; B 11 -15 678 827 ; +C -1 ; WX 600 ; N uhornhookabove ; B 15 -16 645 636 ; +C -1 ; WX 600 ; N Uhorntilde ; B 11 -15 678 771 ; +C -1 ; WX 600 ; N uhorntilde ; B 15 -16 645 616 ; +C -1 ; WX 600 ; N Uhorndotbelow ; B 11 -186 678 714 ; +C -1 ; WX 600 ; N uhorndotbelow ; B 15 -186 645 465 ; +C -1 ; WX 600 ; N Ydotbelow ; B 21 -186 581 592 ; +C -1 ; WX 600 ; N ydotbelow ; B 21 -209 582 443 ; +C -1 ; WX 600 ; N Yhookabove ; B 21 0 581 827 ; +C -1 ; WX 600 ; N yhookabove ; B 21 -209 582 636 ; +C -1 ; WX 600 ; N Ytilde ; B 21 0 581 771 ; +C -1 ; WX 600 ; N ytilde ; B 21 -209 582 616 ; +C -1 ; WX 600 ; N uni01CD ; B -22 0 623 807 ; +C -1 ; WX 600 ; N uni01CE ; B 43 -17 574 651 ; +C -1 ; WX 600 ; N uni01CF ; B 82 0 518 807 ; +C -1 ; WX 600 ; N uni01D0 ; B 63 0 537 651 ; +C -1 ; WX 600 ; N uni01D1 ; B 20 -15 581 807 ; +C -1 ; WX 600 ; N uni01D2 ; B 42 -16 560 651 ; +C -1 ; WX 600 ; N uni01D3 ; B 11 -15 591 807 ; +C -1 ; WX 600 ; N uni01D4 ; B 15 -16 575 651 ; +C -1 ; WX 600 ; N uni01D5 ; B 11 -15 591 833 ; +C -1 ; WX 600 ; N uni01D6 ; B 15 -16 575 746 ; +C -1 ; WX 600 ; N uni01D7 ; B 11 -15 591 833 ; +C -1 ; WX 600 ; N uni01D8 ; B 15 -16 575 808 ; +C -1 ; WX 600 ; N uni01D9 ; B 11 -15 591 832 ; +C -1 ; WX 600 ; N uni01DA ; B 15 -16 575 808 ; +C -1 ; WX 600 ; N uni01DB ; B 11 -15 591 833 ; +C -1 ; WX 600 ; N uni01DC ; B 15 -16 575 822 ; +C -1 ; WX 600 ; N _d_1290 ; B 133 646 469 833 ; +C -1 ; WX 600 ; N _d_1291 ; B 108 646 493 833 ; +C -1 ; WX 600 ; N _d_1292 ; B 104 646 498 832 ; +C -1 ; WX 600 ; N _d_1293 ; B 108 646 493 833 ; +C -1 ; WX 600 ; N uni0492 ; B 33 0 574 592 ; +C -1 ; WX 600 ; N uni0493 ; B 33 0 574 443 ; +C -1 ; WX 600 ; N uni0496 ; B 4 -130 594 592 ; +C -1 ; WX 600 ; N uni0497 ; B 6 -118 594 443 ; +C -1 ; WX 600 ; N uni049a ; B 40 -130 594 592 ; +C -1 ; WX 600 ; N uni049b ; B 47 -118 594 443 ; +C -1 ; WX 600 ; N uni049c ; B 40 0 601 592 ; +C -1 ; WX 600 ; N uni049d ; B 47 0 576 443 ; +C -1 ; WX 600 ; N uni04a2 ; B 22 -130 594 592 ; +C -1 ; WX 600 ; N uni04a3 ; B 22 -118 594 443 ; +C -1 ; WX 600 ; N uni04ae ; B 21 0 581 592 ; +C -1 ; WX 600 ; N uni04af ; B 21 -209 582 443 ; +C -1 ; WX 600 ; N uni04b0 ; B 21 0 581 592 ; +C -1 ; WX 600 ; N uni04b1 ; B 21 -209 582 443 ; +C -1 ; WX 600 ; N uni04b2 ; B 11 -130 594 593 ; +C -1 ; WX 600 ; N uni04b3 ; B 21 -118 594 443 ; +C -1 ; WX 600 ; N uni04b8 ; B 17 0 578 592 ; +C -1 ; WX 600 ; N uni04b9 ; B 31 0 564 443 ; +C -1 ; WX 600 ; N uni04ba ; B 22 0 583 592 ; +C -1 ; WX 600 ; N uni04bb ; B 25 0 558 443 ; +C -1 ; WX 600 ; N uni018f ; B 31 -15 566 607 ; +C -1 ; WX 600 ; N uni0259 ; B 32 -16 552 457 ; +C -1 ; WX 600 ; N uni04e8 ; B 20 -15 581 607 ; +C -1 ; WX 600 ; N uni04e9 ; B 42 -16 560 457 ; +EndCharMetrics +EndFontMetrics diff --git a/gulliver/thirdparty/html2ps_pdf/fonts/courbd.ttf b/thirdparty/html2ps_pdf/fonts/courbd.ttf similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/fonts/courbd.ttf rename to thirdparty/html2ps_pdf/fonts/courbd.ttf diff --git a/gulliver/thirdparty/html2ps_pdf/fonts/courbi.afm b/thirdparty/html2ps_pdf/fonts/courbi.afm similarity index 97% rename from gulliver/thirdparty/html2ps_pdf/fonts/courbi.afm rename to thirdparty/html2ps_pdf/fonts/courbi.afm index dbc294b1b..58cfe287c 100644 --- a/gulliver/thirdparty/html2ps_pdf/fonts/courbi.afm +++ b/thirdparty/html2ps_pdf/fonts/courbi.afm @@ -1,994 +1,994 @@ -StartFontMetrics 4.1 -FontName CourierNewPS-BoldItalicMT -FullName Courier New Bold Italic -Notice Typeface The Monotype Corporation plc. Data The Monotype Corporation plc/Type Solutions Inc. 1990-1992. All Rights Reserved -EncodingScheme FontSpecific -FamilyName Courier New -Weight Bold Italic -Version Version 2.90 -Characters 940 -ItalicAngle -12.0 -Ascender 833 -Descender -300 -UnderlineThickness 100 -UnderlinePosition -233 -IsFixedPitch true -FontBBox -103 -377 836 1004 -StartCharMetrics 975 -C 0 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 1 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 2 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 3 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 4 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 5 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 6 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 7 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 8 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 9 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 10 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 11 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 12 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 13 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 14 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 15 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 16 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 17 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 18 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 19 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 20 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 21 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 22 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 23 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 24 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 25 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 26 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 27 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 28 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 29 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 30 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 31 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 32 ; WX 600 ; N space ; B 244 -15 500 648 ; -C 33 ; WX 600 ; N exclam ; B 244 -15 500 648 ; -C 34 ; WX 600 ; N quotedbl ; B 240 332 595 604 ; -C 35 ; WX 600 ; N numbersign ; B 99 -94 625 686 ; -C 36 ; WX 600 ; N dollar ; B 98 -125 612 695 ; -C 37 ; WX 600 ; N percent ; B 129 -15 604 627 ; -C 38 ; WX 600 ; N ampersand ; B 136 -15 597 558 ; -C 39 ; WX 600 ; N quotesingle ; B 344 318 494 611 ; -C 40 ; WX 600 ; N parenleft ; B 305 -156 616 642 ; -C 41 ; WX 600 ; N parenright ; B 94 -156 406 642 ; -C 42 ; WX 600 ; N asterisk ; B 178 212 616 632 ; -C 43 ; WX 600 ; N plus ; B 100 0 622 568 ; -C 44 ; WX 600 ; N comma ; B 175 -161 439 135 ; -C 45 ; WX 600 ; N hyphen ; B 142 238 580 330 ; -C 46 ; WX 600 ; N period ; B 235 -16 389 117 ; -C 47 ; WX 600 ; N slash ; B 67 -115 659 706 ; -C 48 ; WX 600 ; N zero ; B 131 -15 605 648 ; -C 49 ; WX 600 ; N one ; B 92 0 530 648 ; -C 50 ; WX 600 ; N two ; B 54 0 609 648 ; -C 51 ; WX 600 ; N three ; B 80 -15 612 648 ; -C 52 ; WX 600 ; N four ; B 104 0 581 632 ; -C 53 ; WX 600 ; N five ; B 82 -15 614 632 ; -C 54 ; WX 600 ; N six ; B 157 -15 666 648 ; -C 55 ; WX 600 ; N seven ; B 186 -1 643 632 ; -C 56 ; WX 600 ; N eight ; B 114 -15 611 648 ; -C 57 ; WX 600 ; N nine ; B 116 -15 620 648 ; -C 58 ; WX 600 ; N colon ; B 235 -18 457 443 ; -C 59 ; WX 600 ; N semicolon ; B 132 -106 456 441 ; -C 60 ; WX 600 ; N less ; B 48 2 671 568 ; -C 61 ; WX 600 ; N equal ; B 60 141 664 429 ; -C 62 ; WX 600 ; N greater ; B 51 2 674 568 ; -C 63 ; WX 600 ; N question ; B 198 -14 611 607 ; -C 64 ; WX 600 ; N at ; B 122 -83 580 648 ; -C 65 ; WX 600 ; N A ; B -13 0 635 592 ; -C 66 ; WX 600 ; N B ; B 22 0 624 592 ; -C 67 ; WX 600 ; N C ; B 79 -15 667 607 ; -C 68 ; WX 600 ; N D ; B 59 0 661 592 ; -C 69 ; WX 600 ; N E ; B 24 0 657 592 ; -C 70 ; WX 600 ; N F ; B 58 0 712 592 ; -C 71 ; WX 600 ; N G ; B 78 -15 668 607 ; -C 72 ; WX 600 ; N H ; B 31 0 679 592 ; -C 73 ; WX 600 ; N I ; B 92 0 634 592 ; -C 74 ; WX 600 ; N J ; B 65 -15 730 592 ; -C 75 ; WX 600 ; N K ; B 23 0 699 592 ; -C 76 ; WX 600 ; N L ; B 42 0 620 592 ; -C 77 ; WX 600 ; N M ; B -9 0 730 592 ; -C 78 ; WX 600 ; N N ; B 22 0 709 592 ; -C 79 ; WX 600 ; N O ; B 75 -15 652 607 ; -C 80 ; WX 600 ; N P ; B 22 0 620 592 ; -C 81 ; WX 600 ; N Q ; B 75 -148 651 607 ; -C 82 ; WX 600 ; N R ; B 24 0 633 592 ; -C 83 ; WX 600 ; N S ; B 72 -15 634 607 ; -C 84 ; WX 600 ; N T ; B 120 0 684 592 ; -C 85 ; WX 600 ; N U ; B 111 -15 707 592 ; -C 86 ; WX 600 ; N V ; B 91 0 739 592 ; -C 87 ; WX 600 ; N W ; B 95 0 728 592 ; -C 88 ; WX 600 ; N X ; B 21 0 697 592 ; -C 89 ; WX 600 ; N Y ; B 126 0 697 592 ; -C 90 ; WX 600 ; N Z ; B 74 0 634 592 ; -C 91 ; WX 600 ; N bracketleft ; B 216 -156 601 632 ; -C 92 ; WX 600 ; N backslash ; B 222 -112 504 706 ; -C 93 ; WX 600 ; N bracketright ; B 101 -156 485 632 ; -C 94 ; WX 600 ; N asciicircum ; B 162 331 600 662 ; -C 95 ; WX 600 ; N underscore ; B -94 -300 592 -200 ; -C 96 ; WX 600 ; N grave ; B 271 501 435 662 ; -C 97 ; WX 600 ; N a ; B 66 -16 585 457 ; -C 98 ; WX 600 ; N b ; B 0 -16 624 633 ; -C 99 ; WX 600 ; N c ; B 95 -17 627 457 ; -C 100 ; WX 600 ; N d ; B 70 -16 665 633 ; -C 101 ; WX 600 ; N e ; B 74 -16 602 457 ; -C 102 ; WX 600 ; N f ; B 82 0 694 633 ; -C 103 ; WX 600 ; N g ; B 74 -209 679 458 ; -C 104 ; WX 600 ; N h ; B 33 0 596 633 ; -C 105 ; WX 600 ; N i ; B 72 0 549 633 ; -C 106 ; WX 600 ; N j ; B 51 -209 554 633 ; -C 107 ; WX 600 ; N k ; B 43 0 616 633 ; -C 108 ; WX 600 ; N l ; B 73 0 549 633 ; -C 109 ; WX 600 ; N m ; B -7 0 637 457 ; -C 110 ; WX 600 ; N n ; B 34 0 585 457 ; -C 111 ; WX 600 ; N o ; B 83 -16 610 457 ; -C 112 ; WX 600 ; N p ; B -43 -209 626 457 ; -C 113 ; WX 600 ; N q ; B 79 -209 701 457 ; -C 114 ; WX 600 ; N r ; B 63 0 653 457 ; -C 115 ; WX 600 ; N s ; B 83 -16 592 457 ; -C 116 ; WX 600 ; N t ; B 143 -16 601 601 ; -C 117 ; WX 600 ; N u ; B 97 -16 606 443 ; -C 118 ; WX 600 ; N v ; B 83 0 688 443 ; -C 119 ; WX 600 ; N w ; B 81 0 687 443 ; -C 120 ; WX 600 ; N x ; B 31 0 645 443 ; -C 121 ; WX 600 ; N y ; B -14 -209 667 443 ; -C 122 ; WX 600 ; N z ; B 86 0 605 443 ; -C 123 ; WX 600 ; N braceleft ; B 218 -156 558 632 ; -C 124 ; WX 600 ; N bar ; B 250 -156 351 632 ; -C 125 ; WX 600 ; N braceright ; B 141 -156 483 632 ; -C 126 ; WX 600 ; N asciitilde ; B 116 180 606 388 ; -C 127 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 128 ; WX 600 ; N Euro ; B 9 -15 667 607 ; -C 129 ; WX 600 ; N afii10052 ; B 31 0 701 816 ; -C 130 ; WX 600 ; N quotesinglbase ; B 175 -156 438 135 ; -C 131 ; WX 600 ; N florin ; B 44 -125 674 648 ; -C 132 ; WX 600 ; N quotedblbase ; B 80 -130 549 131 ; -C 133 ; WX 600 ; N ellipsis ; B 56 -15 559 87 ; -C 134 ; WX 600 ; N dagger ; B 175 -94 592 632 ; -C 135 ; WX 600 ; N daggerdbl ; B 123 -94 589 632 ; -C 136 ; WX 600 ; N circumflex ; B 248 498 563 649 ; -C 137 ; WX 600 ; N perthousand ; B 125 3 613 627 ; -C 138 ; WX 600 ; N Scaron ; B 72 -15 634 801 ; -C 139 ; WX 600 ; N guilsinglleft ; B 174 20 502 420 ; -C 140 ; WX 600 ; N OE ; B 41 0 733 592 ; -C 141 ; WX 600 ; N afii10061 ; B 48 0 671 816 ; -C 142 ; WX 600 ; N Zcaron ; B 74 0 634 801 ; -C 143 ; WX 600 ; N afii10145 ; B 44 -130 692 592 ; -C 144 ; WX 600 ; N quotedblbase ; B 80 -130 549 131 ; -C 145 ; WX 600 ; N quoteleft ; B 338 316 488 612 ; -C 146 ; WX 600 ; N quoteright ; B 247 316 511 612 ; -C 147 ; WX 600 ; N quotedblleft ; B 210 355 581 616 ; -C 148 ; WX 600 ; N quotedblright ; B 183 355 652 616 ; -C 149 ; WX 600 ; N bullet ; B 213 158 521 461 ; -C 150 ; WX 600 ; N endash ; B 99 233 620 333 ; -C 151 ; WX 600 ; N emdash ; B 29 233 691 333 ; -C 152 ; WX 600 ; N tilde ; B 240 489 579 610 ; -C 153 ; WX 600 ; N trademark ; B -42 296 602 651 ; -C 154 ; WX 600 ; N scaron ; B 83 -16 592 645 ; -C 155 ; WX 600 ; N guilsinglright ; B 202 20 522 420 ; -C 156 ; WX 600 ; N oe ; B 19 -16 665 456 ; -C 157 ; WX 600 ; N afii10109 ; B 61 0 620 661 ; -C 158 ; WX 600 ; N zcaron ; B 86 0 605 645 ; -C 159 ; WX 600 ; N Ydieresis ; B 126 0 697 777 ; -C 160 ; WX 600 ; N space ; B 244 -15 500 648 ; -C 161 ; WX 600 ; N exclamdown ; B 190 -207 440 433 ; -C 162 ; WX 600 ; N cent ; B 145 -31 596 685 ; -C 163 ; WX 600 ; N sterling ; B 63 0 574 606 ; -C 164 ; WX 600 ; N currency ; B 95 66 630 526 ; -C 165 ; WX 600 ; N yen ; B 135 0 697 589 ; -C 166 ; WX 600 ; N brokenbar ; B 250 -156 351 632 ; -C 167 ; WX 600 ; N section ; B 74 -85 646 636 ; -C 168 ; WX 600 ; N dieresis ; B 259 521 570 622 ; -C 169 ; WX 600 ; N copyright ; B 56 -14 662 592 ; -C 170 ; WX 600 ; N ordfeminine ; B 148 364 486 648 ; -C 171 ; WX 600 ; N guillemotleft ; B 79 18 638 419 ; -C 172 ; WX 600 ; N logicalnot ; B 40 -1 634 333 ; -C 173 ; WX 600 ; N hyphen ; B 142 238 580 330 ; -C 174 ; WX 600 ; N registered ; B 56 -14 662 592 ; -C 175 ; WX 600 ; N overscore ; B 95 660 780 760 ; -C 176 ; WX 600 ; N degree ; B 262 417 574 728 ; -C 177 ; WX 600 ; N plusminus ; B 41 0 622 705 ; -C 178 ; WX 600 ; N twosuperior ; B 148 311 489 648 ; -C 179 ; WX 600 ; N threesuperior ; B 165 304 491 648 ; -C 180 ; WX 600 ; N acute ; B 376 500 583 661 ; -C 181 ; WX 600 ; N mu1 ; B 64 -209 607 443 ; -C 182 ; WX 600 ; N paragraph ; B 133 -87 669 632 ; -C 183 ; WX 600 ; N periodcentered ; B 290 246 443 378 ; -C 184 ; WX 600 ; N cedilla ; B 175 -179 368 30 ; -C 185 ; WX 600 ; N onesuperior ; B 171 311 442 650 ; -C 186 ; WX 600 ; N ordmasculine ; B 159 364 501 648 ; -C 187 ; WX 600 ; N guillemotright ; B 65 24 617 425 ; -C 188 ; WX 600 ; N onequarter ; B 48 0 644 650 ; -C 189 ; WX 600 ; N onehalf ; B 48 0 672 650 ; -C 190 ; WX 600 ; N threequarters ; B 50 0 655 648 ; -C 191 ; WX 600 ; N questiondown ; B 74 -210 485 431 ; -C 192 ; WX 600 ; N Agrave ; B -13 0 635 818 ; -C 193 ; WX 600 ; N Aacute ; B -13 0 635 816 ; -C 194 ; WX 600 ; N Acircumflex ; B -13 0 635 805 ; -C 195 ; WX 600 ; N Atilde ; B -13 0 635 766 ; -C 196 ; WX 600 ; N Adieresis ; B -13 0 635 777 ; -C 197 ; WX 600 ; N Aring ; B -13 0 635 826 ; -C 198 ; WX 600 ; N AE ; B -12 0 728 592 ; -C 199 ; WX 600 ; N Ccedilla ; B 79 -179 667 607 ; -C 200 ; WX 600 ; N Egrave ; B 24 0 657 818 ; -C 201 ; WX 600 ; N Eacute ; B 24 0 657 816 ; -C 202 ; WX 600 ; N Ecircumflex ; B 24 0 657 805 ; -C 203 ; WX 600 ; N Edieresis ; B 24 0 657 777 ; -C 204 ; WX 600 ; N Igrave ; B 92 0 634 818 ; -C 205 ; WX 600 ; N Iacute ; B 92 0 634 816 ; -C 206 ; WX 600 ; N Icircumflex ; B 92 0 634 805 ; -C 207 ; WX 600 ; N Idieresis ; B 92 0 634 777 ; -C 208 ; WX 600 ; N Eth ; B 23 0 621 592 ; -C 209 ; WX 600 ; N Ntilde ; B 22 0 709 766 ; -C 210 ; WX 600 ; N Ograve ; B 75 -15 652 818 ; -C 211 ; WX 600 ; N Oacute ; B 75 -15 652 816 ; -C 212 ; WX 600 ; N Ocircumflex ; B 75 -15 652 805 ; -C 213 ; WX 600 ; N Otilde ; B 75 -15 652 766 ; -C 214 ; WX 600 ; N Odieresis ; B 75 -15 652 777 ; -C 215 ; WX 600 ; N multiply ; B 205 80 637 485 ; -C 216 ; WX 600 ; N Oslash ; B 5 -71 718 642 ; -C 217 ; WX 600 ; N Ugrave ; B 111 -15 707 818 ; -C 218 ; WX 600 ; N Uacute ; B 111 -15 707 816 ; -C 219 ; WX 600 ; N Ucircumflex ; B 111 -15 707 805 ; -C 220 ; WX 600 ; N Udieresis ; B 111 -15 707 777 ; -C 221 ; WX 600 ; N Yacute ; B 126 0 697 816 ; -C 222 ; WX 600 ; N Thorn ; B 69 0 643 592 ; -C 223 ; WX 600 ; N germandbls ; B 22 -16 572 633 ; -C 224 ; WX 600 ; N agrave ; B 66 -16 585 662 ; -C 225 ; WX 600 ; N aacute ; B 66 -16 585 661 ; -C 226 ; WX 600 ; N acircumflex ; B 66 -16 585 649 ; -C 227 ; WX 600 ; N atilde ; B 66 -16 585 610 ; -C 228 ; WX 600 ; N adieresis ; B 66 -16 585 622 ; -C 229 ; WX 600 ; N aring ; B 66 -16 585 676 ; -C 230 ; WX 600 ; N ae ; B 8 -16 665 456 ; -C 231 ; WX 600 ; N ccedilla ; B 95 -179 627 457 ; -C 232 ; WX 600 ; N egrave ; B 74 -16 602 662 ; -C 233 ; WX 600 ; N eacute ; B 74 -16 602 661 ; -C 234 ; WX 600 ; N ecircumflex ; B 74 -16 602 649 ; -C 235 ; WX 600 ; N edieresis ; B 74 -16 602 622 ; -C 236 ; WX 600 ; N igrave ; B 72 0 549 662 ; -C 237 ; WX 600 ; N iacute ; B 72 0 549 661 ; -C 238 ; WX 600 ; N icircumflex ; B 72 0 549 649 ; -C 239 ; WX 600 ; N idieresis ; B 72 0 549 622 ; -C 240 ; WX 600 ; N eth ; B 85 -16 628 630 ; -C 241 ; WX 600 ; N ntilde ; B 34 0 585 610 ; -C 242 ; WX 600 ; N ograve ; B 83 -16 610 662 ; -C 243 ; WX 600 ; N oacute ; B 83 -16 610 661 ; -C 244 ; WX 600 ; N ocircumflex ; B 83 -16 610 649 ; -C 245 ; WX 600 ; N otilde ; B 83 -16 610 610 ; -C 246 ; WX 600 ; N odieresis ; B 83 -16 610 622 ; -C 247 ; WX 600 ; N divide ; B 100 3 622 564 ; -C 248 ; WX 600 ; N oslash ; B 17 -72 669 495 ; -C 249 ; WX 600 ; N ugrave ; B 97 -16 606 662 ; -C 250 ; WX 600 ; N uacute ; B 97 -16 606 661 ; -C 251 ; WX 600 ; N ucircumflex ; B 97 -16 606 649 ; -C 252 ; WX 600 ; N udieresis ; B 97 -16 606 622 ; -C 253 ; WX 600 ; N yacute ; B -14 -209 667 661 ; -C 254 ; WX 600 ; N thorn ; B -43 -209 625 633 ; -C 255 ; WX 600 ; N ydieresis ; B -14 -209 667 622 ; -C -1 ; WX 0 ; N .null ; B 244 -15 500 648 ; -C -1 ; WX 600 ; N nonmarkingreturn ; B 244 -15 500 648 ; -C -1 ; WX 600 ; N notequal ; B 60 -67 664 637 ; -C -1 ; WX 600 ; N infinity ; B 103 186 615 422 ; -C -1 ; WX 600 ; N lessequal ; B 10 40 671 745 ; -C -1 ; WX 600 ; N greaterequal ; B 23 40 665 745 ; -C -1 ; WX 600 ; N partialdiff ; B 46 -15 560 633 ; -C -1 ; WX 600 ; N summation ; B 33 -188 551 613 ; -C -1 ; WX 600 ; N product ; B 12 -188 589 613 ; -C -1 ; WX 600 ; N pi1 ; B 47 0 648 443 ; -C -1 ; WX 600 ; N integral ; B -8 -190 736 826 ; -C -1 ; WX 600 ; N Ohm ; B 17 0 583 607 ; -C -1 ; WX 600 ; N radical ; B 67 -38 575 913 ; -C -1 ; WX 600 ; N approxequal ; B 69 74 653 494 ; -C -1 ; WX 600 ; N increment ; B 16 0 569 583 ; -C -1 ; WX 600 ; N lozenge ; B 76 0 525 694 ; -C -1 ; WX 600 ; N fraction ; B 97 149 560 467 ; -C -1 ; WX 600 ; N fi ; B 1 0 649 633 ; -C -1 ; WX 600 ; N fl ; B 0 0 664 633 ; -C -1 ; WX 600 ; N dotlessi ; B 72 0 549 443 ; -C -1 ; WX 600 ; N macron ; B 255 525 567 584 ; -C -1 ; WX 600 ; N breve ; B 271 501 585 648 ; -C -1 ; WX 600 ; N dotaccent ; B 353 511 477 632 ; -C -1 ; WX 600 ; N ring ; B 318 493 508 676 ; -C -1 ; WX 600 ; N hungarumlaut ; B 250 501 584 662 ; -C -1 ; WX 600 ; N ogonek ; B 229 -157 398 30 ; -C -1 ; WX 600 ; N caron ; B 266 493 581 645 ; -C -1 ; WX 600 ; N Lslash ; B 42 0 618 592 ; -C -1 ; WX 600 ; N lslash ; B 72 0 560 633 ; -C -1 ; WX 600 ; N minus ; B 100 234 622 334 ; -C -1 ; WX 600 ; N franc ; B 58 0 712 592 ; -C -1 ; WX 600 ; N Gbreve ; B 78 -15 668 804 ; -C -1 ; WX 600 ; N gbreve ; B 74 -209 679 648 ; -C -1 ; WX 600 ; N Idot ; B 92 0 634 789 ; -C -1 ; WX 600 ; N Scedilla ; B 72 -179 634 607 ; -C -1 ; WX 600 ; N scedilla ; B 83 -179 592 457 ; -C -1 ; WX 600 ; N Cacute ; B 79 -15 667 816 ; -C -1 ; WX 600 ; N cacute ; B 95 -17 627 661 ; -C -1 ; WX 600 ; N Ccaron ; B 79 -15 667 801 ; -C -1 ; WX 600 ; N ccaron ; B 95 -17 627 645 ; -C -1 ; WX 600 ; N dmacron ; B 70 -13 696 636 ; -C -1 ; WX 600 ; N middot ; B 418 299 542 420 ; -C -1 ; WX 600 ; N Abreve ; B -13 0 635 804 ; -C -1 ; WX 600 ; N abreve ; B 66 -16 600 648 ; -C -1 ; WX 600 ; N Aogonek ; B -13 -129 635 592 ; -C -1 ; WX 600 ; N aogonek ; B 66 -126 588 457 ; -C -1 ; WX 600 ; N Dcaron ; B 59 0 661 801 ; -C -1 ; WX 600 ; N dcaron ; B 70 -16 836 633 ; -C -1 ; WX 600 ; N Dslash ; B 23 0 621 592 ; -C -1 ; WX 600 ; N Eogonek ; B 24 -130 657 592 ; -C -1 ; WX 600 ; N eogonek ; B 74 -141 602 457 ; -C -1 ; WX 600 ; N Ecaron ; B 24 0 657 801 ; -C -1 ; WX 600 ; N ecaron ; B 74 -16 602 645 ; -C -1 ; WX 600 ; N Lacute ; B 42 0 620 816 ; -C -1 ; WX 600 ; N lacute ; B 73 0 588 830 ; -C -1 ; WX 600 ; N Lcaron ; B 42 0 685 592 ; -C -1 ; WX 600 ; N lcaron ; B 73 0 657 633 ; -C -1 ; WX 600 ; N Ldot ; B 42 0 620 592 ; -C -1 ; WX 600 ; N ldot ; B 73 0 589 633 ; -C -1 ; WX 600 ; N Nacute ; B 22 0 709 816 ; -C -1 ; WX 600 ; N nacute ; B 34 0 585 661 ; -C -1 ; WX 600 ; N Ncaron ; B 22 0 709 801 ; -C -1 ; WX 600 ; N ncaron ; B 34 0 615 645 ; -C -1 ; WX 600 ; N Odblacute ; B 75 -15 695 818 ; -C -1 ; WX 600 ; N odblacute ; B 83 -16 655 662 ; -C -1 ; WX 600 ; N Racute ; B 24 0 633 816 ; -C -1 ; WX 600 ; N racute ; B 63 0 653 661 ; -C -1 ; WX 600 ; N Rcaron ; B 24 0 633 801 ; -C -1 ; WX 600 ; N rcaron ; B 63 0 653 645 ; -C -1 ; WX 600 ; N Sacute ; B 72 -15 634 816 ; -C -1 ; WX 600 ; N sacute ; B 83 -16 592 661 ; -C -1 ; WX 600 ; N Tcedilla ; B 120 -271 684 592 ; -C -1 ; WX 600 ; N tcedilla ; B 143 -250 601 601 ; -C -1 ; WX 600 ; N Tcaron ; B 120 0 684 801 ; -C -1 ; WX 600 ; N tcaron ; B 143 -16 751 633 ; -C -1 ; WX 600 ; N Uring ; B 111 -15 707 826 ; -C -1 ; WX 600 ; N uring ; B 97 -16 606 676 ; -C -1 ; WX 600 ; N Udblacute ; B 111 -15 707 818 ; -C -1 ; WX 600 ; N udblacute ; B 97 -16 636 662 ; -C -1 ; WX 600 ; N Zacute ; B 74 0 634 816 ; -C -1 ; WX 600 ; N zacute ; B 86 0 605 661 ; -C -1 ; WX 600 ; N Zdot ; B 74 0 634 788 ; -C -1 ; WX 600 ; N zdot ; B 86 0 605 632 ; -C -1 ; WX 600 ; N Gamma ; B 54 0 703 592 ; -C -1 ; WX 600 ; N Theta ; B 75 -15 652 607 ; -C -1 ; WX 600 ; N Phi ; B 99 0 628 592 ; -C -1 ; WX 600 ; N alpha ; B 86 -16 639 457 ; -C -1 ; WX 600 ; N delta ; B 121 -16 603 633 ; -C -1 ; WX 600 ; N epsilon ; B 118 -16 589 457 ; -C -1 ; WX 600 ; N sigma ; B 90 -16 673 443 ; -C -1 ; WX 600 ; N tau ; B 174 -16 558 443 ; -C -1 ; WX 600 ; N phi ; B 85 -225 614 457 ; -C -1 ; WX 600 ; N underscoredbl ; B -103 -377 621 -100 ; -C -1 ; WX 600 ; N exclamdbl ; B 103 -15 641 648 ; -C -1 ; WX 600 ; N nsuperior ; B 193 253 527 527 ; -C -1 ; WX 600 ; N peseta ; B 12 -8 634 592 ; -C -1 ; WX 600 ; N arrowleft ; B 1 50 599 277 ; -C -1 ; WX 600 ; N arrowup ; B 186 -136 414 424 ; -C -1 ; WX 600 ; N arrowright ; B 1 50 599 277 ; -C -1 ; WX 600 ; N arrowdown ; B 186 -136 414 424 ; -C -1 ; WX 600 ; N arrowboth ; B 1 50 599 278 ; -C -1 ; WX 600 ; N arrowupdn ; B 186 -135 414 463 ; -C -1 ; WX 600 ; N arrowupdnbse ; B 186 -196 414 463 ; -C -1 ; WX 600 ; N orthogonal ; B 1 0 599 597 ; -C -1 ; WX 600 ; N intersection ; B 62 -15 642 648 ; -C -1 ; WX 600 ; N equivalence ; B 39 46 683 523 ; -C -1 ; WX 600 ; N house ; B 44 0 556 639 ; -C -1 ; WX 600 ; N revlogicalnot ; B -9 0 621 334 ; -C -1 ; WX 600 ; N integraltp ; B 211 -251 645 848 ; -C -1 ; WX 600 ; N integralbt ; B 82 -251 516 848 ; -C -1 ; WX 600 ; N SF100000 ; B -7 219 607 292 ; -C -1 ; WX 600 ; N SF110000 ; B 264 -255 336 766 ; -C -1 ; WX 600 ; N SF010000 ; B 264 -255 607 292 ; -C -1 ; WX 600 ; N SF030000 ; B -7 -255 336 292 ; -C -1 ; WX 600 ; N SF020000 ; B 264 219 607 766 ; -C -1 ; WX 600 ; N SF040000 ; B -7 219 336 766 ; -C -1 ; WX 600 ; N SF080000 ; B 264 -255 607 766 ; -C -1 ; WX 600 ; N SF090000 ; B -7 -255 336 766 ; -C -1 ; WX 600 ; N SF060000 ; B -7 -255 607 292 ; -C -1 ; WX 600 ; N SF070000 ; B -7 219 607 766 ; -C -1 ; WX 600 ; N SF050000 ; B -7 -255 607 766 ; -C -1 ; WX 600 ; N SF430000 ; B -7 141 607 370 ; -C -1 ; WX 600 ; N SF240000 ; B 186 -255 414 766 ; -C -1 ; WX 600 ; N SF510000 ; B 264 -255 607 370 ; -C -1 ; WX 600 ; N SF520000 ; B 186 -255 607 292 ; -C -1 ; WX 600 ; N SF390000 ; B 186 -255 607 370 ; -C -1 ; WX 600 ; N SF220000 ; B -7 -255 336 370 ; -C -1 ; WX 600 ; N SF210000 ; B -7 -255 414 292 ; -C -1 ; WX 600 ; N SF250000 ; B -7 -255 414 370 ; -C -1 ; WX 600 ; N SF500000 ; B 264 141 607 766 ; -C -1 ; WX 600 ; N SF490000 ; B 186 219 607 766 ; -C -1 ; WX 600 ; N SF380000 ; B 186 141 607 766 ; -C -1 ; WX 600 ; N SF280000 ; B -7 141 336 766 ; -C -1 ; WX 600 ; N SF270000 ; B -7 219 414 766 ; -C -1 ; WX 600 ; N SF260000 ; B -7 141 414 766 ; -C -1 ; WX 600 ; N SF360000 ; B 264 -255 607 766 ; -C -1 ; WX 600 ; N SF370000 ; B 186 -255 607 766 ; -C -1 ; WX 600 ; N SF420000 ; B 186 -255 607 766 ; -C -1 ; WX 600 ; N SF190000 ; B -7 -255 336 766 ; -C -1 ; WX 600 ; N SF200000 ; B -7 -255 414 766 ; -C -1 ; WX 600 ; N SF230000 ; B -7 -255 414 766 ; -C -1 ; WX 600 ; N SF470000 ; B -7 -255 607 370 ; -C -1 ; WX 600 ; N SF480000 ; B -7 -255 607 292 ; -C -1 ; WX 600 ; N SF410000 ; B -7 -255 607 370 ; -C -1 ; WX 600 ; N SF450000 ; B -7 141 607 766 ; -C -1 ; WX 600 ; N SF460000 ; B -7 219 607 766 ; -C -1 ; WX 600 ; N SF400000 ; B -7 141 607 766 ; -C -1 ; WX 600 ; N SF540000 ; B -7 -255 607 766 ; -C -1 ; WX 600 ; N SF530000 ; B -7 -255 607 766 ; -C -1 ; WX 600 ; N SF440000 ; B -7 -255 607 766 ; -C -1 ; WX 600 ; N upblock ; B -7 255 607 766 ; -C -1 ; WX 600 ; N dnblock ; B -7 -255 607 255 ; -C -1 ; WX 600 ; N block ; B -7 -255 607 766 ; -C -1 ; WX 600 ; N lfblock ; B -7 -255 300 766 ; -C -1 ; WX 600 ; N rtblock ; B 300 -255 608 766 ; -C -1 ; WX 600 ; N ltshade ; B 44 -207 607 766 ; -C -1 ; WX 600 ; N shade ; B -7 -207 607 766 ; -C -1 ; WX 600 ; N dkshade ; B -7 -258 607 766 ; -C -1 ; WX 600 ; N filledbox ; B 1 0 599 598 ; -C -1 ; WX 600 ; N filledrect ; B 1 193 599 306 ; -C -1 ; WX 600 ; N triagup ; B 7 0 592 585 ; -C -1 ; WX 600 ; N triagrt ; B 1 -13 599 584 ; -C -1 ; WX 600 ; N triagdn ; B 7 -13 592 572 ; -C -1 ; WX 600 ; N triaglf ; B 1 -13 599 584 ; -C -1 ; WX 600 ; N circle ; B 85 67 515 497 ; -C -1 ; WX 600 ; N invbullet ; B 61 0 539 479 ; -C -1 ; WX 600 ; N invcircle ; B 19 0 583 564 ; -C -1 ; WX 600 ; N smileface ; B -3 -14 603 592 ; -C -1 ; WX 600 ; N invsmileface ; B -3 -14 603 592 ; -C -1 ; WX 600 ; N sun ; B 1 -69 599 529 ; -C -1 ; WX 600 ; N female ; B 157 39 444 563 ; -C -1 ; WX 600 ; N male ; B 90 122 511 563 ; -C -1 ; WX 600 ; N spade ; B 63 0 537 601 ; -C -1 ; WX 600 ; N club ; B 1 0 599 597 ; -C -1 ; WX 600 ; N heart ; B 53 -11 547 559 ; -C -1 ; WX 600 ; N diamond ; B 78 -12 523 597 ; -C -1 ; WX 600 ; N musicalnote ; B 132 14 440 563 ; -C -1 ; WX 600 ; N musicalnotedbl ; B 44 -21 528 566 ; -C -1 ; WX 600 ; N IJ ; B 24 -15 723 592 ; -C -1 ; WX 600 ; N ij ; B -38 -209 675 633 ; -C -1 ; WX 600 ; N napostrophe ; B 29 0 593 612 ; -C -1 ; WX 600 ; N minute ; B 344 318 494 611 ; -C -1 ; WX 600 ; N second ; B 240 332 595 604 ; -C -1 ; WX 600 ; N afii61248 ; B 129 -15 604 627 ; -C -1 ; WX 600 ; N afii61289 ; B 112 -16 558 607 ; -C -1 ; WX 600 ; N H22073 ; B 1 0 599 598 ; -C -1 ; WX 600 ; N H18543 ; B 214 156 521 463 ; -C -1 ; WX 600 ; N H18551 ; B 214 156 521 463 ; -C -1 ; WX 600 ; N H18533 ; B 85 67 515 497 ; -C -1 ; WX 600 ; N openbullet ; B 213 158 521 461 ; -C -1 ; WX 600 ; N Amacron ; B -13 0 635 740 ; -C -1 ; WX 600 ; N amacron ; B 66 -16 585 584 ; -C -1 ; WX 600 ; N Ccircumflex ; B 79 -15 667 805 ; -C -1 ; WX 600 ; N ccircumflex ; B 95 -17 627 649 ; -C -1 ; WX 600 ; N Cdot ; B 79 -15 667 788 ; -C -1 ; WX 600 ; N cdot ; B 95 -17 627 632 ; -C -1 ; WX 600 ; N Emacron ; B 24 0 657 740 ; -C -1 ; WX 600 ; N emacron ; B 74 -16 602 584 ; -C -1 ; WX 600 ; N Ebreve ; B 24 0 657 804 ; -C -1 ; WX 600 ; N ebreve ; B 74 -16 602 648 ; -C -1 ; WX 600 ; N Edot ; B 24 0 657 788 ; -C -1 ; WX 600 ; N edot ; B 74 -16 602 632 ; -C -1 ; WX 600 ; N Gcircumflex ; B 78 -15 668 805 ; -C -1 ; WX 600 ; N gcircumflex ; B 74 -209 679 649 ; -C -1 ; WX 600 ; N Gdot ; B 78 -15 668 788 ; -C -1 ; WX 600 ; N gdot ; B 74 -209 679 632 ; -C -1 ; WX 600 ; N Gcedilla ; B 78 -190 668 607 ; -C -1 ; WX 600 ; N gcedilla ; B 74 -209 679 702 ; -C -1 ; WX 600 ; N Hcircumflex ; B 31 0 679 805 ; -C -1 ; WX 600 ; N hcircumflex ; B 33 0 603 805 ; -C -1 ; WX 600 ; N Hbar ; B 31 0 679 592 ; -C -1 ; WX 600 ; N hbar ; B 33 0 596 633 ; -C -1 ; WX 600 ; N Itilde ; B 92 0 634 766 ; -C -1 ; WX 600 ; N itilde ; B 72 0 578 610 ; -C -1 ; WX 600 ; N Imacron ; B 92 0 634 740 ; -C -1 ; WX 600 ; N imacron ; B 72 0 549 584 ; -C -1 ; WX 600 ; N Ibreve ; B 92 0 634 804 ; -C -1 ; WX 600 ; N ibreve ; B 72 0 557 648 ; -C -1 ; WX 600 ; N Iogonek ; B 92 -139 634 592 ; -C -1 ; WX 600 ; N iogonek ; B 72 -139 549 633 ; -C -1 ; WX 600 ; N Jcircumflex ; B 65 -15 730 805 ; -C -1 ; WX 600 ; N jcircumflex ; B 51 -209 554 649 ; -C -1 ; WX 600 ; N Kcedilla ; B 23 -190 699 592 ; -C -1 ; WX 600 ; N kcedilla ; B 43 -190 616 633 ; -C -1 ; WX 600 ; N kgreenlandic ; B 31 0 604 443 ; -C -1 ; WX 600 ; N Lcedilla ; B 42 -190 620 592 ; -C -1 ; WX 600 ; N lcedilla ; B 73 -190 549 633 ; -C -1 ; WX 600 ; N Ncedilla ; B 22 -190 709 592 ; -C -1 ; WX 600 ; N ncedilla ; B 34 -190 585 457 ; -C -1 ; WX 600 ; N Eng ; B 27 -15 638 607 ; -C -1 ; WX 600 ; N eng ; B 49 -209 592 457 ; -C -1 ; WX 600 ; N Omacron ; B 75 -15 652 740 ; -C -1 ; WX 600 ; N omacron ; B 83 -16 610 584 ; -C -1 ; WX 600 ; N Obreve ; B 75 -15 652 804 ; -C -1 ; WX 600 ; N obreve ; B 83 -16 610 648 ; -C -1 ; WX 600 ; N Rcedilla ; B 24 -190 633 592 ; -C -1 ; WX 600 ; N rcedilla ; B 63 -190 653 457 ; -C -1 ; WX 600 ; N Scircumflex ; B 72 -15 634 805 ; -C -1 ; WX 600 ; N scircumflex ; B 83 -16 592 649 ; -C -1 ; WX 600 ; N Tbar ; B 120 0 684 592 ; -C -1 ; WX 600 ; N tbar ; B 95 -15 601 601 ; -C -1 ; WX 600 ; N Utilde ; B 111 -15 707 766 ; -C -1 ; WX 600 ; N utilde ; B 97 -16 606 610 ; -C -1 ; WX 600 ; N Umacron ; B 111 -15 707 740 ; -C -1 ; WX 600 ; N umacron ; B 97 -16 606 584 ; -C -1 ; WX 600 ; N Ubreve ; B 111 -15 707 804 ; -C -1 ; WX 600 ; N ubreve ; B 97 -16 606 648 ; -C -1 ; WX 600 ; N Uogonek ; B 111 -139 707 592 ; -C -1 ; WX 600 ; N uogonek ; B 97 -139 606 443 ; -C -1 ; WX 600 ; N Wcircumflex ; B 95 0 728 805 ; -C -1 ; WX 600 ; N wcircumflex ; B 81 0 687 649 ; -C -1 ; WX 600 ; N Ycircumflex ; B 126 0 697 805 ; -C -1 ; WX 600 ; N ycircumflex ; B -14 -209 667 649 ; -C -1 ; WX 600 ; N longs ; B 82 0 694 633 ; -C -1 ; WX 600 ; N Aringacute ; B -13 0 635 1004 ; -C -1 ; WX 600 ; N aringacute ; B 66 -16 585 854 ; -C -1 ; WX 600 ; N AEacute ; B -12 0 728 816 ; -C -1 ; WX 600 ; N aeacute ; B 8 -16 665 661 ; -C -1 ; WX 600 ; N Oslashacute ; B 5 -71 718 816 ; -C -1 ; WX 600 ; N oslashacute ; B 17 -72 669 661 ; -C -1 ; WX 600 ; N anoteleia ; B 306 323 459 457 ; -C -1 ; WX 600 ; N Wgrave ; B 95 0 728 817 ; -C -1 ; WX 600 ; N wgrave ; B 81 0 687 661 ; -C -1 ; WX 600 ; N Wacute ; B 95 0 728 816 ; -C -1 ; WX 600 ; N wacute ; B 81 0 687 661 ; -C -1 ; WX 600 ; N Wdieresis ; B 95 0 728 777 ; -C -1 ; WX 600 ; N wdieresis ; B 81 0 687 622 ; -C -1 ; WX 600 ; N Ygrave ; B 126 0 697 817 ; -C -1 ; WX 600 ; N ygrave ; B -14 -209 667 661 ; -C -1 ; WX 600 ; N quotereversed ; B 338 316 488 612 ; -C -1 ; WX 600 ; N radicalex ; B 232 525 603 584 ; -C -1 ; WX 600 ; N afii08941 ; B 63 0 574 607 ; -C -1 ; WX 600 ; N estimated ; B 44 -17 561 535 ; -C -1 ; WX 600 ; N oneeighth ; B 48 -7 660 650 ; -C -1 ; WX 600 ; N threeeighths ; B 47 -7 660 648 ; -C -1 ; WX 600 ; N fiveeighths ; B 47 -7 660 640 ; -C -1 ; WX 600 ; N seveneighths ; B 110 -7 681 640 ; -C -1 ; WX 600 ; N commaaccent ; B 199 -250 333 -59 ; -C -1 ; WX 600 ; N undercommaaccent ; B 188 -190 368 -47 ; -C -1 ; WX 600 ; N tonos ; B 329 500 536 661 ; -C -1 ; WX 600 ; N dieresistonos ; B 196 500 627 661 ; -C -1 ; WX 600 ; N Alphatonos ; B -13 0 635 592 ; -C -1 ; WX 600 ; N Epsilontonos ; B 42 0 675 592 ; -C -1 ; WX 600 ; N Etatonos ; B 32 0 679 592 ; -C -1 ; WX 600 ; N Iotatonos ; B 99 0 670 592 ; -C -1 ; WX 600 ; N Omicrontonos ; B 89 -15 653 607 ; -C -1 ; WX 600 ; N Upsilontonos ; B 90 0 720 592 ; -C -1 ; WX 600 ; N Omegatonos ; B 85 0 634 607 ; -C -1 ; WX 600 ; N iotadieresistonos ; B 163 -16 594 661 ; -C -1 ; WX 600 ; N Alpha ; B -13 0 635 592 ; -C -1 ; WX 600 ; N Beta ; B 22 0 624 592 ; -C -1 ; WX 600 ; N Delta ; B 6 0 595 592 ; -C -1 ; WX 600 ; N Epsilon ; B 24 0 657 592 ; -C -1 ; WX 600 ; N Zeta ; B 74 0 634 592 ; -C -1 ; WX 600 ; N Eta ; B 31 0 679 592 ; -C -1 ; WX 600 ; N Iota ; B 92 0 634 592 ; -C -1 ; WX 600 ; N Kappa ; B 23 0 699 592 ; -C -1 ; WX 600 ; N Lambda ; B -8 0 640 592 ; -C -1 ; WX 600 ; N Mu ; B -9 0 730 592 ; -C -1 ; WX 600 ; N Nu ; B 22 0 709 592 ; -C -1 ; WX 600 ; N Xi ; B 55 0 677 592 ; -C -1 ; WX 600 ; N Omicron ; B 75 -15 652 607 ; -C -1 ; WX 600 ; N Pi ; B 32 0 679 592 ; -C -1 ; WX 600 ; N Rho ; B 22 0 620 592 ; -C -1 ; WX 600 ; N Sigma ; B 43 0 674 592 ; -C -1 ; WX 600 ; N Tau ; B 120 0 684 592 ; -C -1 ; WX 600 ; N Upsilon ; B 126 0 697 592 ; -C -1 ; WX 600 ; N Chi ; B 21 0 697 592 ; -C -1 ; WX 600 ; N Psi ; B 113 0 723 592 ; -C -1 ; WX 600 ; N Omega ; B 19 0 665 607 ; -C -1 ; WX 600 ; N Iotadieresis ; B 92 0 634 777 ; -C -1 ; WX 600 ; N Upsilondieresis ; B 126 0 697 777 ; -C -1 ; WX 600 ; N alphatonos ; B 86 -16 639 661 ; -C -1 ; WX 600 ; N epsilontonos ; B 118 -16 589 661 ; -C -1 ; WX 600 ; N etatonos ; B 71 -225 584 661 ; -C -1 ; WX 600 ; N iotatonos ; B 262 -16 515 661 ; -C -1 ; WX 600 ; N upsilondieresistonos ; B 116 -16 642 661 ; -C -1 ; WX 600 ; N beta ; B 75 -225 566 633 ; -C -1 ; WX 600 ; N gamma ; B 106 -225 645 443 ; -C -1 ; WX 600 ; N zeta ; B 174 -225 603 633 ; -C -1 ; WX 600 ; N eta ; B 71 -225 577 457 ; -C -1 ; WX 600 ; N theta ; B 130 -16 607 633 ; -C -1 ; WX 600 ; N iota ; B 262 -16 463 457 ; -C -1 ; WX 600 ; N kappa ; B 73 0 645 443 ; -C -1 ; WX 600 ; N lambda ; B 39 0 602 633 ; -C -1 ; WX 600 ; N mu ; B 64 -209 607 443 ; -C -1 ; WX 600 ; N nu ; B 109 0 580 457 ; -C -1 ; WX 600 ; N xi ; B 168 -225 582 633 ; -C -1 ; WX 600 ; N omicron ; B 83 -16 610 457 ; -C -1 ; WX 600 ; N rho ; B 47 -225 592 457 ; -C -1 ; WX 600 ; N sigma1 ; B 117 -225 610 457 ; -C -1 ; WX 600 ; N upsilon ; B 116 -16 642 443 ; -C -1 ; WX 600 ; N chi ; B 34 -225 604 457 ; -C -1 ; WX 600 ; N psi ; B 120 -225 653 633 ; -C -1 ; WX 600 ; N omega ; B 85 -16 603 457 ; -C -1 ; WX 600 ; N iotadieresis ; B 258 -16 569 622 ; -C -1 ; WX 600 ; N upsilondieresis ; B 116 -16 642 622 ; -C -1 ; WX 600 ; N omicrontonos ; B 83 -16 610 661 ; -C -1 ; WX 600 ; N upsilontonos ; B 116 -16 642 661 ; -C -1 ; WX 600 ; N omegatonos ; B 85 -16 603 661 ; -C -1 ; WX 600 ; N afii10023 ; B 24 0 657 768 ; -C -1 ; WX 600 ; N afii10051 ; B 87 -16 621 592 ; -C -1 ; WX 600 ; N afii10053 ; B 80 -15 667 607 ; -C -1 ; WX 600 ; N afii10054 ; B 72 -15 634 607 ; -C -1 ; WX 600 ; N afii10055 ; B 92 0 634 592 ; -C -1 ; WX 600 ; N afii10056 ; B 92 0 634 768 ; -C -1 ; WX 600 ; N afii10057 ; B 65 -15 730 592 ; -C -1 ; WX 600 ; N afii10058 ; B -15 -16 628 592 ; -C -1 ; WX 600 ; N afii10059 ; B 17 0 660 592 ; -C -1 ; WX 600 ; N afii10060 ; B 82 0 609 592 ; -C -1 ; WX 600 ; N afii10062 ; B 63 -16 718 804 ; -C -1 ; WX 600 ; N afii10017 ; B -13 0 635 592 ; -C -1 ; WX 600 ; N afii10018 ; B 23 0 654 592 ; -C -1 ; WX 600 ; N afii10019 ; B 22 0 624 592 ; -C -1 ; WX 600 ; N afii10020 ; B 31 0 701 592 ; -C -1 ; WX 600 ; N afii10021 ; B 0 -130 679 592 ; -C -1 ; WX 600 ; N afii10022 ; B 24 0 657 592 ; -C -1 ; WX 600 ; N afii10024 ; B 5 0 705 592 ; -C -1 ; WX 600 ; N afii10025 ; B 12 -16 618 638 ; -C -1 ; WX 600 ; N afii10026 ; B 21 0 686 592 ; -C -1 ; WX 600 ; N afii10027 ; B 21 0 686 804 ; -C -1 ; WX 600 ; N afii10028 ; B 48 0 671 592 ; -C -1 ; WX 600 ; N afii10029 ; B -2 -16 681 592 ; -C -1 ; WX 600 ; N afii10030 ; B -9 0 730 592 ; -C -1 ; WX 600 ; N afii10031 ; B 31 0 679 592 ; -C -1 ; WX 600 ; N afii10032 ; B 75 -15 652 607 ; -C -1 ; WX 600 ; N afii10033 ; B 32 0 679 592 ; -C -1 ; WX 600 ; N afii10034 ; B 22 0 620 592 ; -C -1 ; WX 600 ; N afii10035 ; B 79 -15 667 607 ; -C -1 ; WX 600 ; N afii10036 ; B 120 0 684 592 ; -C -1 ; WX 600 ; N afii10037 ; B 63 -16 718 592 ; -C -1 ; WX 600 ; N afii10038 ; B 81 0 644 592 ; -C -1 ; WX 600 ; N afii10039 ; B 21 0 697 592 ; -C -1 ; WX 600 ; N afii10040 ; B 32 -130 679 592 ; -C -1 ; WX 600 ; N afii10041 ; B 116 0 676 592 ; -C -1 ; WX 600 ; N afii10042 ; B 4 0 718 592 ; -C -1 ; WX 600 ; N afii10043 ; B 4 -130 718 592 ; -C -1 ; WX 600 ; N afii10044 ; B 44 0 652 592 ; -C -1 ; WX 600 ; N afii10045 ; B -3 0 696 592 ; -C -1 ; WX 600 ; N afii10046 ; B 33 0 619 592 ; -C -1 ; WX 600 ; N afii10047 ; B 39 -15 615 636 ; -C -1 ; WX 600 ; N afii10048 ; B -6 -15 695 607 ; -C -1 ; WX 600 ; N afii10049 ; B 32 0 656 592 ; -C -1 ; WX 600 ; N afii10065 ; B 66 -16 585 457 ; -C -1 ; WX 600 ; N afii10066 ; B 92 -15 620 666 ; -C -1 ; WX 600 ; N afii10067 ; B 28 0 614 443 ; -C -1 ; WX 600 ; N afii10068 ; B 39 0 656 443 ; -C -1 ; WX 600 ; N afii10069 ; B 14 -120 636 443 ; -C -1 ; WX 600 ; N afii10070 ; B 74 -16 602 457 ; -C -1 ; WX 600 ; N afii10072 ; B 17 0 655 443 ; -C -1 ; WX 600 ; N afii10073 ; B 48 -13 588 482 ; -C -1 ; WX 600 ; N afii10074 ; B 40 0 654 443 ; -C -1 ; WX 600 ; N afii10075 ; B 40 0 654 648 ; -C -1 ; WX 600 ; N afii10076 ; B 61 0 620 443 ; -C -1 ; WX 600 ; N afii10077 ; B 32 -13 635 443 ; -C -1 ; WX 600 ; N afii10078 ; B 4 0 685 443 ; -C -1 ; WX 600 ; N afii10079 ; B 14 0 649 443 ; -C -1 ; WX 600 ; N afii10080 ; B 83 -16 610 457 ; -C -1 ; WX 600 ; N afii10081 ; B 19 0 633 443 ; -C -1 ; WX 600 ; N afii10082 ; B -43 -209 626 457 ; -C -1 ; WX 600 ; N afii10083 ; B 95 -17 627 457 ; -C -1 ; WX 600 ; N afii10084 ; B 76 0 640 443 ; -C -1 ; WX 600 ; N afii10085 ; B 46 -134 666 443 ; -C -1 ; WX 600 ; N afii10086 ; B 87 -140 610 617 ; -C -1 ; WX 600 ; N afii10087 ; B 31 0 645 443 ; -C -1 ; WX 600 ; N afii10088 ; B 42 -119 664 443 ; -C -1 ; WX 600 ; N afii10089 ; B 102 0 633 443 ; -C -1 ; WX 600 ; N afii10090 ; B 4 0 688 443 ; -C -1 ; WX 600 ; N afii10091 ; B 4 -118 688 443 ; -C -1 ; WX 600 ; N afii10092 ; B 54 0 585 443 ; -C -1 ; WX 600 ; N afii10093 ; B -1 0 680 443 ; -C -1 ; WX 600 ; N afii10094 ; B 28 0 589 443 ; -C -1 ; WX 600 ; N afii10095 ; B 33 -16 596 483 ; -C -1 ; WX 600 ; N afii10096 ; B 23 -17 669 457 ; -C -1 ; WX 600 ; N afii10097 ; B 28 0 642 443 ; -C -1 ; WX 600 ; N afii10071 ; B 74 -16 602 622 ; -C -1 ; WX 600 ; N afii10099 ; B 33 -209 577 633 ; -C -1 ; WX 600 ; N afii10100 ; B 39 0 656 661 ; -C -1 ; WX 600 ; N afii10101 ; B 95 -16 627 457 ; -C -1 ; WX 600 ; N afii10102 ; B 83 -16 592 457 ; -C -1 ; WX 600 ; N afii10103 ; B 72 0 549 633 ; -C -1 ; WX 600 ; N afii10104 ; B 72 0 549 622 ; -C -1 ; WX 600 ; N afii10105 ; B 51 -209 554 633 ; -C -1 ; WX 600 ; N afii10106 ; B 0 -13 624 443 ; -C -1 ; WX 600 ; N afii10107 ; B 28 0 636 443 ; -C -1 ; WX 600 ; N afii10108 ; B 33 0 596 633 ; -C -1 ; WX 600 ; N afii10110 ; B 46 -134 666 648 ; -C -1 ; WX 600 ; N afii10193 ; B 38 -118 673 443 ; -C -1 ; WX 600 ; N afii10050 ; B 31 0 690 714 ; -C -1 ; WX 600 ; N afii10098 ; B 39 0 637 566 ; -C -1 ; WX 600 ; N afii00208 ; B 99 233 620 333 ; -C -1 ; WX 600 ; N afii61352 ; B 25 0 682 592 ; -C -1 ; WX 600 ; N pi ; B 62 0 640 443 ; -C -1 ; WX 600 ; N sheva ; B 216 -261 310 -82 ; -C -1 ; WX 600 ; N hatafsegol ; B 136 -261 416 -82 ; -C -1 ; WX 600 ; N hatafpatah ; B 137 -261 408 -82 ; -C -1 ; WX 600 ; N hatafqamats ; B 137 -261 408 -82 ; -C -1 ; WX 600 ; N hiriq ; B 242 -147 310 -83 ; -C -1 ; WX 600 ; N tsere ; B 188 -147 362 -83 ; -C -1 ; WX 600 ; N segol ; B 188 -261 362 -83 ; -C -1 ; WX 600 ; N patah ; B 176 -130 378 -83 ; -C -1 ; WX 600 ; N qamats ; B 176 -215 378 -83 ; -C -1 ; WX 600 ; N holam ; B 399 592 466 657 ; -C -1 ; WX 600 ; N qubuts ; B 136 -261 391 -82 ; -C -1 ; WX 600 ; N dagesh ; B 324 238 391 303 ; -C -1 ; WX 600 ; N meteg ; B 225 -261 302 -82 ; -C -1 ; WX 600 ; N maqaf ; B 143 410 652 510 ; -C -1 ; WX 600 ; N rafe ; B 329 592 532 640 ; -C -1 ; WX 600 ; N paseq ; B 259 -5 449 515 ; -C -1 ; WX 600 ; N shindot ; B 577 592 644 657 ; -C -1 ; WX 600 ; N sindot ; B 222 592 289 657 ; -C -1 ; WX 600 ; N sofpasuq ; B 236 -5 470 483 ; -C -1 ; WX 600 ; N alef ; B 70 -11 639 518 ; -C -1 ; WX 600 ; N bet ; B 55 0 555 510 ; -C -1 ; WX 600 ; N gimel ; B 110 -8 474 510 ; -C -1 ; WX 600 ; N dalet ; B 136 -5 646 510 ; -C -1 ; WX 600 ; N he ; B 85 -5 607 510 ; -C -1 ; WX 600 ; N vav ; B 250 -5 476 510 ; -C -1 ; WX 600 ; N zayin ; B 221 -5 575 510 ; -C -1 ; WX 600 ; N het ; B 134 -5 662 510 ; -C -1 ; WX 600 ; N tet ; B 112 -5 602 514 ; -C -1 ; WX 600 ; N yod ; B 248 251 483 510 ; -C -1 ; WX 600 ; N finalkaf ; B 137 -124 646 510 ; -C -1 ; WX 600 ; N kaf ; B 66 0 594 510 ; -C -1 ; WX 600 ; N lamed ; B 160 0 609 659 ; -C -1 ; WX 600 ; N finalmem ; B 100 0 594 510 ; -C -1 ; WX 600 ; N mem ; B 122 -5 603 516 ; -C -1 ; WX 600 ; N finalnun ; B 228 -124 462 510 ; -C -1 ; WX 600 ; N nun ; B 108 0 500 510 ; -C -1 ; WX 600 ; N samekh ; B 106 -6 597 510 ; -C -1 ; WX 600 ; N ayin ; B 74 0 618 510 ; -C -1 ; WX 600 ; N finalpe ; B 152 -124 575 510 ; -C -1 ; WX 600 ; N pe ; B 104 0 580 510 ; -C -1 ; WX 600 ; N finaltsadi ; B 143 -124 618 510 ; -C -1 ; WX 600 ; N tsadi ; B 152 0 617 510 ; -C -1 ; WX 600 ; N qof ; B 46 -202 635 510 ; -C -1 ; WX 600 ; N resh ; B 147 -5 569 510 ; -C -1 ; WX 600 ; N shin ; B 79 0 657 515 ; -C -1 ; WX 600 ; N tav ; B 64 -5 599 510 ; -C -1 ; WX 600 ; N doublevav ; B 137 -5 622 510 ; -C -1 ; WX 600 ; N vavyod ; B 126 -5 622 510 ; -C -1 ; WX 600 ; N doubleyod ; B 126 251 627 510 ; -C -1 ; WX 600 ; N geresh ; B 257 229 500 515 ; -C -1 ; WX 600 ; N gershayim ; B 159 229 599 515 ; -C -1 ; WX 600 ; N newsheqelsign ; B 38 -5 671 515 ; -C -1 ; WX 600 ; N vavshindot ; B 208 -5 476 657 ; -C -1 ; WX 600 ; N finalkafsheva ; B 137 -124 646 511 ; -C -1 ; WX 600 ; N finalkafqamats ; B 126 -124 646 511 ; -C -1 ; WX 600 ; N lamedholam ; B 100 0 609 659 ; -C -1 ; WX 600 ; N lamedholamdagesh ; B 100 0 609 659 ; -C -1 ; WX 600 ; N altayin ; B 74 0 618 510 ; -C -1 ; WX 600 ; N shinshindot ; B 79 0 659 657 ; -C -1 ; WX 600 ; N shinsindot ; B 79 0 658 657 ; -C -1 ; WX 600 ; N shindageshshindot ; B 79 0 664 657 ; -C -1 ; WX 600 ; N shindageshsindot ; B 79 0 658 657 ; -C -1 ; WX 600 ; N alefpatah ; B 70 -130 639 518 ; -C -1 ; WX 600 ; N alefqamats ; B 70 -215 639 518 ; -C -1 ; WX 600 ; N alefmapiq ; B 70 -11 639 518 ; -C -1 ; WX 600 ; N betdagesh ; B 55 0 556 511 ; -C -1 ; WX 600 ; N gimeldagesh ; B 110 -8 474 511 ; -C -1 ; WX 600 ; N daletdagesh ; B 136 -5 646 511 ; -C -1 ; WX 600 ; N hedagesh ; B 85 -5 608 511 ; -C -1 ; WX 600 ; N vavdagesh ; B 220 -5 476 511 ; -C -1 ; WX 600 ; N zayindagesh ; B 203 -5 575 511 ; -C -1 ; WX 600 ; N tetdagesh ; B 112 -5 602 515 ; -C -1 ; WX 600 ; N yoddagesh ; B 235 251 483 510 ; -C -1 ; WX 600 ; N finalkafdagesh ; B 137 -124 646 511 ; -C -1 ; WX 600 ; N kafdagesh ; B 66 0 594 511 ; -C -1 ; WX 600 ; N lameddagesh ; B 160 0 609 659 ; -C -1 ; WX 600 ; N memdagesh ; B 122 -5 604 516 ; -C -1 ; WX 600 ; N nundagesh ; B 108 0 500 511 ; -C -1 ; WX 600 ; N samekhdagesh ; B 106 -6 597 511 ; -C -1 ; WX 600 ; N finalpedagesh ; B 147 -124 580 510 ; -C -1 ; WX 600 ; N pedagesh ; B 100 0 585 510 ; -C -1 ; WX 600 ; N tsadidagesh ; B 152 0 618 511 ; -C -1 ; WX 600 ; N qofdagesh ; B 46 -202 636 511 ; -C -1 ; WX 600 ; N reshdagesh ; B 147 -5 570 511 ; -C -1 ; WX 600 ; N shindagesh ; B 79 0 657 515 ; -C -1 ; WX 600 ; N tavdages ; B 64 -5 599 511 ; -C -1 ; WX 600 ; N vavholam ; B 250 -5 476 657 ; -C -1 ; WX 600 ; N betrafe ; B 55 0 556 640 ; -C -1 ; WX 600 ; N kafrafe ; B 66 0 594 640 ; -C -1 ; WX 600 ; N perafe ; B 104 0 581 640 ; -C -1 ; WX 600 ; N aleflamed ; B 76 -11 645 659 ; -C -1 ; WX 600 ; N zerowidthnonjoiner ; B 283 -134 318 629 ; -C -1 ; WX 600 ; N zerowidthjoiner ; B 193 -134 407 690 ; -C -1 ; WX 600 ; N lefttorightmark ; B 172 -134 458 690 ; -C -1 ; WX 600 ; N righttoleftmark ; B 143 -134 429 690 ; -C -1 ; WX 600 ; N uniFFFC ; B 0 0 600 431 ; -C -1 ; WX 600 ; N Ohorn ; B 75 -15 742 626 ; -C -1 ; WX 600 ; N ohorn ; B 83 -16 683 467 ; -C -1 ; WX 600 ; N Uhorn ; B 111 -15 816 714 ; -C -1 ; WX 600 ; N uhorn ; B 97 -16 725 463 ; -C -1 ; WX 600 ; N f00b ; B 310 723 536 824 ; -C -1 ; WX 600 ; N f00c ; B 290 723 516 824 ; -C -1 ; WX 600 ; N f00e ; B 294 678 500 824 ; -C -1 ; WX 600 ; N f006 ; B 313 724 545 824 ; -C -1 ; WX 600 ; N f007 ; B 330 724 562 824 ; -C -1 ; WX 600 ; N f009 ; B 353 680 559 826 ; -C -1 ; WX 600 ; N combininghookabove ; B 335 645 566 776 ; -C -1 ; WX 600 ; N f010 ; B 340 737 547 824 ; -C -1 ; WX 600 ; N f013 ; B 335 693 566 824 ; -C -1 ; WX 600 ; N f011 ; B 334 737 542 824 ; -C -1 ; WX 600 ; N f01c ; B 287 698 631 824 ; -C -1 ; WX 600 ; N f015 ; B 266 724 591 824 ; -C -1 ; WX 600 ; N combiningtildeaccent ; B 269 698 613 824 ; -C -1 ; WX 600 ; N _d_767 ; B 316 624 583 706 ; -C -1 ; WX 600 ; N _d_768 ; B 291 624 559 709 ; -C -1 ; WX 600 ; N f02c ; B 437 -179 560 -58 ; -C -1 ; WX 600 ; N dongsign ; B 117 119 620 633 ; -C -1 ; WX 600 ; N onethird ; B 36 -8 667 650 ; -C -1 ; WX 600 ; N twothirds ; B 14 -8 667 648 ; -C -1 ; WX 600 ; N f008 ; B 277 498 483 644 ; -C -1 ; WX 600 ; N f00a ; B 292 498 498 644 ; -C -1 ; WX 600 ; N f00d ; B 303 498 509 644 ; -C -1 ; WX 600 ; N f00f ; B 303 498 509 644 ; -C -1 ; WX 600 ; N f012 ; B 299 500 531 631 ; -C -1 ; WX 600 ; N f014 ; B 299 500 531 631 ; -C -1 ; WX 600 ; N f016 ; B 277 698 622 824 ; -C -1 ; WX 600 ; N f017 ; B 287 698 631 824 ; -C -1 ; WX 600 ; N f018 ; B 287 698 631 824 ; -C -1 ; WX 600 ; N f019 ; B 240 489 579 610 ; -C -1 ; WX 600 ; N f01a ; B 240 489 579 610 ; -C -1 ; WX 600 ; N f01b ; B 240 489 579 610 ; -C -1 ; WX 600 ; N f01e ; B 212 -179 335 -58 ; -C -1 ; WX 600 ; N f01f ; B 212 -179 335 -58 ; -C -1 ; WX 600 ; N f020 ; B 212 -179 335 -58 ; -C -1 ; WX 600 ; N f021 ; B 212 -179 335 -58 ; -C -1 ; WX 600 ; N f022 ; B 212 -179 335 -58 ; -C -1 ; WX 600 ; N combininggraveaccent ; B 313 678 520 824 ; -C -1 ; WX 600 ; N combiningacuteaccent ; B 340 680 546 826 ; -C -1 ; WX 600 ; N f01d ; B 240 489 579 610 ; -C -1 ; WX 600 ; N combiningdotbelow ; B 212 -179 335 -58 ; -C -1 ; WX 600 ; N f023 ; B 212 -179 335 -58 ; -C -1 ; WX 600 ; N f029 ; B 212 -179 335 -58 ; -C -1 ; WX 600 ; N f02a ; B 212 -179 335 -58 ; -C -1 ; WX 600 ; N f02b ; B 212 -179 335 -58 ; -C -1 ; WX 600 ; N f024 ; B 212 -179 335 -58 ; -C -1 ; WX 600 ; N f025 ; B 212 -179 335 -58 ; -C -1 ; WX 600 ; N f026 ; B 212 -179 335 -58 ; -C -1 ; WX 600 ; N f027 ; B 212 -179 335 -58 ; -C -1 ; WX 600 ; N f028 ; B 212 -179 335 -58 ; -C -1 ; WX 600 ; N f02d ; B 286 724 610 824 ; -C -1 ; WX 600 ; N f02e ; B 267 698 612 824 ; -C -1 ; WX 600 ; N f02f ; B 315 724 640 824 ; -C -1 ; WX 600 ; N f030 ; B 287 698 631 824 ; -C -1 ; WX 600 ; N Adotbelow ; B -13 -179 635 592 ; -C -1 ; WX 600 ; N adotbelow ; B 66 -179 585 457 ; -C -1 ; WX 600 ; N Ahookabove ; B -13 0 635 776 ; -C -1 ; WX 600 ; N ahookabove ; B 66 -16 585 631 ; -C -1 ; WX 600 ; N Acircumflexacute ; B -13 0 635 824 ; -C -1 ; WX 600 ; N acircumflexacute ; B 66 -16 585 826 ; -C -1 ; WX 600 ; N Acircumflexgrave ; B -13 0 635 824 ; -C -1 ; WX 600 ; N acircumflexgrave ; B 66 -16 585 824 ; -C -1 ; WX 600 ; N Acircumflexhookabove ; B -13 0 635 824 ; -C -1 ; WX 600 ; N acircumflexhookabove ; B 66 -16 585 824 ; -C -1 ; WX 600 ; N Acircumflextilde ; B -13 0 635 824 ; -C -1 ; WX 600 ; N acircumflextilde ; B 66 -16 631 824 ; -C -1 ; WX 600 ; N Acircumflexdotbelow ; B -13 -179 635 709 ; -C -1 ; WX 600 ; N acircumflexdotbelow ; B 66 -179 585 649 ; -C -1 ; WX 600 ; N Abreveacute ; B -13 0 635 824 ; -C -1 ; WX 600 ; N abreveacute ; B 66 -16 600 826 ; -C -1 ; WX 600 ; N Abrevegrave ; B -13 0 635 824 ; -C -1 ; WX 600 ; N abrevegrave ; B 66 -16 600 824 ; -C -1 ; WX 600 ; N Abrevehookabove ; B -13 0 635 824 ; -C -1 ; WX 600 ; N abrevehookabove ; B 66 -16 600 824 ; -C -1 ; WX 600 ; N Abrevetilde ; B -13 0 635 824 ; -C -1 ; WX 600 ; N abrevetilde ; B 66 -16 631 824 ; -C -1 ; WX 600 ; N Abrevedotbelow ; B -13 -179 635 706 ; -C -1 ; WX 600 ; N abrevedotbelow ; B 66 -179 600 648 ; -C -1 ; WX 600 ; N Edotbelow ; B 24 -179 657 592 ; -C -1 ; WX 600 ; N edotbelow ; B 74 -179 602 457 ; -C -1 ; WX 600 ; N Ehookabove ; B 24 0 657 776 ; -C -1 ; WX 600 ; N ehookabove ; B 74 -16 602 631 ; -C -1 ; WX 600 ; N Etilde ; B 24 0 657 766 ; -C -1 ; WX 600 ; N etilde ; B 74 -16 602 610 ; -C -1 ; WX 600 ; N Ecircumflexacute ; B 24 0 657 824 ; -C -1 ; WX 600 ; N ecircumflexacute ; B 74 -16 602 826 ; -C -1 ; WX 600 ; N Ecircumflexgrave ; B 24 0 657 824 ; -C -1 ; WX 600 ; N ecircumflexgrave ; B 74 -16 602 824 ; -C -1 ; WX 600 ; N Ecircumflexhookabove ; B 24 0 657 824 ; -C -1 ; WX 600 ; N ecircumflexhookabove ; B 74 -16 602 824 ; -C -1 ; WX 600 ; N Ecircumflextilde ; B 24 0 657 824 ; -C -1 ; WX 600 ; N ecircumflextilde ; B 74 -16 631 824 ; -C -1 ; WX 600 ; N Ecircumflexdotbelow ; B 24 -179 657 709 ; -C -1 ; WX 600 ; N ecircumflexdotbelow ; B 74 -179 602 649 ; -C -1 ; WX 600 ; N Ihookabove ; B 92 0 634 776 ; -C -1 ; WX 600 ; N ihookabove ; B 72 0 549 631 ; -C -1 ; WX 600 ; N Idotbelow ; B 92 -179 634 592 ; -C -1 ; WX 600 ; N idotbelow ; B 72 -179 549 633 ; -C -1 ; WX 600 ; N Odotbelow ; B 75 -179 652 607 ; -C -1 ; WX 600 ; N odotbelow ; B 83 -179 610 457 ; -C -1 ; WX 600 ; N Ohookabove ; B 75 -15 652 776 ; -C -1 ; WX 600 ; N ohookabove ; B 83 -16 610 631 ; -C -1 ; WX 600 ; N Ocircumflexacute ; B 75 -15 652 824 ; -C -1 ; WX 600 ; N ocircumflexacute ; B 83 -16 610 826 ; -C -1 ; WX 600 ; N Ocircumflexgrave ; B 75 -15 652 824 ; -C -1 ; WX 600 ; N ocircumflexgrave ; B 83 -16 610 824 ; -C -1 ; WX 600 ; N Ocircumflexhookabove ; B 75 -15 652 824 ; -C -1 ; WX 600 ; N ocircumflexhookabove ; B 83 -16 610 824 ; -C -1 ; WX 600 ; N Ocircumflextilde ; B 75 -15 652 824 ; -C -1 ; WX 600 ; N ocircumflextilde ; B 83 -16 631 824 ; -C -1 ; WX 600 ; N Ocircumflexdotbelow ; B 75 -179 652 709 ; -C -1 ; WX 600 ; N ocircumflexdotbelow ; B 83 -179 610 649 ; -C -1 ; WX 600 ; N Ohornacute ; B 75 -15 742 816 ; -C -1 ; WX 600 ; N ohornacute ; B 83 -16 683 661 ; -C -1 ; WX 600 ; N Ohorngrave ; B 75 -15 742 818 ; -C -1 ; WX 600 ; N ohorngrave ; B 83 -16 683 662 ; -C -1 ; WX 600 ; N Ohornhookabove ; B 75 -15 742 776 ; -C -1 ; WX 600 ; N ohornhookabove ; B 83 -16 683 631 ; -C -1 ; WX 600 ; N Ohorntilde ; B 75 -15 742 766 ; -C -1 ; WX 600 ; N ohorntilde ; B 83 -16 683 610 ; -C -1 ; WX 600 ; N Ohorndotbelow ; B 75 -179 742 626 ; -C -1 ; WX 600 ; N ohorndotbelow ; B 83 -179 683 467 ; -C -1 ; WX 600 ; N Udotbelow ; B 111 -179 707 592 ; -C -1 ; WX 600 ; N udotbelow ; B 97 -179 606 443 ; -C -1 ; WX 600 ; N Uhookabove ; B 111 -15 707 776 ; -C -1 ; WX 600 ; N uhookabove ; B 97 -16 606 631 ; -C -1 ; WX 600 ; N Uhornacute ; B 111 -15 816 816 ; -C -1 ; WX 600 ; N uhornacute ; B 97 -16 725 661 ; -C -1 ; WX 600 ; N Uhorngrave ; B 111 -15 816 818 ; -C -1 ; WX 600 ; N uhorngrave ; B 97 -16 725 662 ; -C -1 ; WX 600 ; N Uhornhookabove ; B 111 -15 816 776 ; -C -1 ; WX 600 ; N uhornhookabove ; B 97 -16 725 631 ; -C -1 ; WX 600 ; N Uhorntilde ; B 111 -15 816 766 ; -C -1 ; WX 600 ; N uhorntilde ; B 97 -16 725 610 ; -C -1 ; WX 600 ; N Uhorndotbelow ; B 111 -179 816 714 ; -C -1 ; WX 600 ; N uhorndotbelow ; B 97 -179 725 463 ; -C -1 ; WX 600 ; N Ydotbelow ; B 126 -179 697 592 ; -C -1 ; WX 600 ; N ydotbelow ; B -14 -209 667 443 ; -C -1 ; WX 600 ; N Yhookabove ; B 126 0 697 776 ; -C -1 ; WX 600 ; N yhookabove ; B -14 -209 667 631 ; -C -1 ; WX 600 ; N Ytilde ; B 126 0 697 766 ; -C -1 ; WX 600 ; N ytilde ; B -14 -209 667 610 ; -C -1 ; WX 600 ; N uni01CD ; B -13 0 635 801 ; -C -1 ; WX 600 ; N uni01CE ; B 66 -16 585 645 ; -C -1 ; WX 600 ; N uni01CF ; B 92 0 634 801 ; -C -1 ; WX 600 ; N uni01D0 ; B 72 0 565 645 ; -C -1 ; WX 600 ; N uni01D1 ; B 75 -15 652 801 ; -C -1 ; WX 600 ; N uni01D2 ; B 83 -16 610 645 ; -C -1 ; WX 600 ; N uni01D3 ; B 111 -15 707 801 ; -C -1 ; WX 600 ; N uni01D4 ; B 97 -16 606 645 ; -C -1 ; WX 600 ; N uni01D5 ; B 111 -15 707 824 ; -C -1 ; WX 600 ; N uni01D6 ; B 97 -16 606 740 ; -C -1 ; WX 600 ; N uni01D7 ; B 111 -15 707 824 ; -C -1 ; WX 600 ; N uni01D8 ; B 97 -16 606 802 ; -C -1 ; WX 600 ; N uni01D9 ; B 111 -15 707 824 ; -C -1 ; WX 600 ; N uni01DA ; B 97 -16 606 787 ; -C -1 ; WX 600 ; N uni01DB ; B 111 -15 707 824 ; -C -1 ; WX 600 ; N uni01DC ; B 97 -16 606 817 ; -C -1 ; WX 600 ; N _d_911 ; B 263 646 624 824 ; -C -1 ; WX 600 ; N _d_912 ; B 253 646 629 824 ; -C -1 ; WX 600 ; N _d_913 ; B 253 646 629 824 ; -C -1 ; WX 600 ; N _d_914 ; B 253 646 629 824 ; -C -1 ; WX 600 ; N _d_915 ; B 233 521 544 622 ; -C -1 ; WX 600 ; N uni0492 ; B 54 0 703 592 ; -C -1 ; WX 600 ; N uni0493 ; B 39 0 656 443 ; -C -1 ; WX 600 ; N uni0496 ; B 5 -130 705 592 ; -C -1 ; WX 600 ; N uni0497 ; B 17 -119 655 443 ; -C -1 ; WX 600 ; N uni049a ; B 48 -130 671 592 ; -C -1 ; WX 600 ; N uni049b ; B 61 -119 620 443 ; -C -1 ; WX 600 ; N uni049c ; B 33 0 676 592 ; -C -1 ; WX 600 ; N uni049d ; B 61 0 620 443 ; -C -1 ; WX 600 ; N uni04a2 ; B 31 -130 679 592 ; -C -1 ; WX 600 ; N uni04a3 ; B 14 -119 649 443 ; -C -1 ; WX 600 ; N uni04ae ; B 126 0 697 592 ; -C -1 ; WX 600 ; N uni04af ; B 86 -209 667 443 ; -C -1 ; WX 600 ; N uni04b0 ; B 135 0 697 589 ; -C -1 ; WX 600 ; N uni04b1 ; B 86 -209 667 443 ; -C -1 ; WX 600 ; N uni04b2 ; B 21 -130 697 592 ; -C -1 ; WX 600 ; N uni04b3 ; B 31 -119 645 443 ; -C -1 ; WX 600 ; N uni04b8 ; B 116 0 676 592 ; -C -1 ; WX 600 ; N uni04b9 ; B 102 0 633 443 ; -C -1 ; WX 600 ; N uni04ba ; B 31 0 591 592 ; -C -1 ; WX 600 ; N uni04bb ; B 34 0 565 443 ; -C -1 ; WX 600 ; N uni018f ; B 80 -15 615 636 ; -C -1 ; WX 600 ; N uni0259 ; B 74 -16 602 457 ; -C -1 ; WX 600 ; N uni04e8 ; B 75 -15 652 607 ; -C -1 ; WX 600 ; N uni04e9 ; B 83 -16 610 457 ; -EndCharMetrics -EndFontMetrics +StartFontMetrics 4.1 +FontName CourierNewPS-BoldItalicMT +FullName Courier New Bold Italic +Notice Typeface The Monotype Corporation plc. Data The Monotype Corporation plc/Type Solutions Inc. 1990-1992. All Rights Reserved +EncodingScheme FontSpecific +FamilyName Courier New +Weight Bold Italic +Version Version 2.90 +Characters 940 +ItalicAngle -12.0 +Ascender 833 +Descender -300 +UnderlineThickness 100 +UnderlinePosition -233 +IsFixedPitch true +FontBBox -103 -377 836 1004 +StartCharMetrics 975 +C 0 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 1 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 2 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 3 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 4 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 5 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 6 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 7 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 8 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 9 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 10 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 11 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 12 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 13 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 14 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 15 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 16 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 17 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 18 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 19 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 20 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 21 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 22 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 23 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 24 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 25 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 26 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 27 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 28 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 29 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 30 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 31 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 32 ; WX 600 ; N space ; B 244 -15 500 648 ; +C 33 ; WX 600 ; N exclam ; B 244 -15 500 648 ; +C 34 ; WX 600 ; N quotedbl ; B 240 332 595 604 ; +C 35 ; WX 600 ; N numbersign ; B 99 -94 625 686 ; +C 36 ; WX 600 ; N dollar ; B 98 -125 612 695 ; +C 37 ; WX 600 ; N percent ; B 129 -15 604 627 ; +C 38 ; WX 600 ; N ampersand ; B 136 -15 597 558 ; +C 39 ; WX 600 ; N quotesingle ; B 344 318 494 611 ; +C 40 ; WX 600 ; N parenleft ; B 305 -156 616 642 ; +C 41 ; WX 600 ; N parenright ; B 94 -156 406 642 ; +C 42 ; WX 600 ; N asterisk ; B 178 212 616 632 ; +C 43 ; WX 600 ; N plus ; B 100 0 622 568 ; +C 44 ; WX 600 ; N comma ; B 175 -161 439 135 ; +C 45 ; WX 600 ; N hyphen ; B 142 238 580 330 ; +C 46 ; WX 600 ; N period ; B 235 -16 389 117 ; +C 47 ; WX 600 ; N slash ; B 67 -115 659 706 ; +C 48 ; WX 600 ; N zero ; B 131 -15 605 648 ; +C 49 ; WX 600 ; N one ; B 92 0 530 648 ; +C 50 ; WX 600 ; N two ; B 54 0 609 648 ; +C 51 ; WX 600 ; N three ; B 80 -15 612 648 ; +C 52 ; WX 600 ; N four ; B 104 0 581 632 ; +C 53 ; WX 600 ; N five ; B 82 -15 614 632 ; +C 54 ; WX 600 ; N six ; B 157 -15 666 648 ; +C 55 ; WX 600 ; N seven ; B 186 -1 643 632 ; +C 56 ; WX 600 ; N eight ; B 114 -15 611 648 ; +C 57 ; WX 600 ; N nine ; B 116 -15 620 648 ; +C 58 ; WX 600 ; N colon ; B 235 -18 457 443 ; +C 59 ; WX 600 ; N semicolon ; B 132 -106 456 441 ; +C 60 ; WX 600 ; N less ; B 48 2 671 568 ; +C 61 ; WX 600 ; N equal ; B 60 141 664 429 ; +C 62 ; WX 600 ; N greater ; B 51 2 674 568 ; +C 63 ; WX 600 ; N question ; B 198 -14 611 607 ; +C 64 ; WX 600 ; N at ; B 122 -83 580 648 ; +C 65 ; WX 600 ; N A ; B -13 0 635 592 ; +C 66 ; WX 600 ; N B ; B 22 0 624 592 ; +C 67 ; WX 600 ; N C ; B 79 -15 667 607 ; +C 68 ; WX 600 ; N D ; B 59 0 661 592 ; +C 69 ; WX 600 ; N E ; B 24 0 657 592 ; +C 70 ; WX 600 ; N F ; B 58 0 712 592 ; +C 71 ; WX 600 ; N G ; B 78 -15 668 607 ; +C 72 ; WX 600 ; N H ; B 31 0 679 592 ; +C 73 ; WX 600 ; N I ; B 92 0 634 592 ; +C 74 ; WX 600 ; N J ; B 65 -15 730 592 ; +C 75 ; WX 600 ; N K ; B 23 0 699 592 ; +C 76 ; WX 600 ; N L ; B 42 0 620 592 ; +C 77 ; WX 600 ; N M ; B -9 0 730 592 ; +C 78 ; WX 600 ; N N ; B 22 0 709 592 ; +C 79 ; WX 600 ; N O ; B 75 -15 652 607 ; +C 80 ; WX 600 ; N P ; B 22 0 620 592 ; +C 81 ; WX 600 ; N Q ; B 75 -148 651 607 ; +C 82 ; WX 600 ; N R ; B 24 0 633 592 ; +C 83 ; WX 600 ; N S ; B 72 -15 634 607 ; +C 84 ; WX 600 ; N T ; B 120 0 684 592 ; +C 85 ; WX 600 ; N U ; B 111 -15 707 592 ; +C 86 ; WX 600 ; N V ; B 91 0 739 592 ; +C 87 ; WX 600 ; N W ; B 95 0 728 592 ; +C 88 ; WX 600 ; N X ; B 21 0 697 592 ; +C 89 ; WX 600 ; N Y ; B 126 0 697 592 ; +C 90 ; WX 600 ; N Z ; B 74 0 634 592 ; +C 91 ; WX 600 ; N bracketleft ; B 216 -156 601 632 ; +C 92 ; WX 600 ; N backslash ; B 222 -112 504 706 ; +C 93 ; WX 600 ; N bracketright ; B 101 -156 485 632 ; +C 94 ; WX 600 ; N asciicircum ; B 162 331 600 662 ; +C 95 ; WX 600 ; N underscore ; B -94 -300 592 -200 ; +C 96 ; WX 600 ; N grave ; B 271 501 435 662 ; +C 97 ; WX 600 ; N a ; B 66 -16 585 457 ; +C 98 ; WX 600 ; N b ; B 0 -16 624 633 ; +C 99 ; WX 600 ; N c ; B 95 -17 627 457 ; +C 100 ; WX 600 ; N d ; B 70 -16 665 633 ; +C 101 ; WX 600 ; N e ; B 74 -16 602 457 ; +C 102 ; WX 600 ; N f ; B 82 0 694 633 ; +C 103 ; WX 600 ; N g ; B 74 -209 679 458 ; +C 104 ; WX 600 ; N h ; B 33 0 596 633 ; +C 105 ; WX 600 ; N i ; B 72 0 549 633 ; +C 106 ; WX 600 ; N j ; B 51 -209 554 633 ; +C 107 ; WX 600 ; N k ; B 43 0 616 633 ; +C 108 ; WX 600 ; N l ; B 73 0 549 633 ; +C 109 ; WX 600 ; N m ; B -7 0 637 457 ; +C 110 ; WX 600 ; N n ; B 34 0 585 457 ; +C 111 ; WX 600 ; N o ; B 83 -16 610 457 ; +C 112 ; WX 600 ; N p ; B -43 -209 626 457 ; +C 113 ; WX 600 ; N q ; B 79 -209 701 457 ; +C 114 ; WX 600 ; N r ; B 63 0 653 457 ; +C 115 ; WX 600 ; N s ; B 83 -16 592 457 ; +C 116 ; WX 600 ; N t ; B 143 -16 601 601 ; +C 117 ; WX 600 ; N u ; B 97 -16 606 443 ; +C 118 ; WX 600 ; N v ; B 83 0 688 443 ; +C 119 ; WX 600 ; N w ; B 81 0 687 443 ; +C 120 ; WX 600 ; N x ; B 31 0 645 443 ; +C 121 ; WX 600 ; N y ; B -14 -209 667 443 ; +C 122 ; WX 600 ; N z ; B 86 0 605 443 ; +C 123 ; WX 600 ; N braceleft ; B 218 -156 558 632 ; +C 124 ; WX 600 ; N bar ; B 250 -156 351 632 ; +C 125 ; WX 600 ; N braceright ; B 141 -156 483 632 ; +C 126 ; WX 600 ; N asciitilde ; B 116 180 606 388 ; +C 127 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 128 ; WX 600 ; N Euro ; B 9 -15 667 607 ; +C 129 ; WX 600 ; N afii10052 ; B 31 0 701 816 ; +C 130 ; WX 600 ; N quotesinglbase ; B 175 -156 438 135 ; +C 131 ; WX 600 ; N florin ; B 44 -125 674 648 ; +C 132 ; WX 600 ; N quotedblbase ; B 80 -130 549 131 ; +C 133 ; WX 600 ; N ellipsis ; B 56 -15 559 87 ; +C 134 ; WX 600 ; N dagger ; B 175 -94 592 632 ; +C 135 ; WX 600 ; N daggerdbl ; B 123 -94 589 632 ; +C 136 ; WX 600 ; N circumflex ; B 248 498 563 649 ; +C 137 ; WX 600 ; N perthousand ; B 125 3 613 627 ; +C 138 ; WX 600 ; N Scaron ; B 72 -15 634 801 ; +C 139 ; WX 600 ; N guilsinglleft ; B 174 20 502 420 ; +C 140 ; WX 600 ; N OE ; B 41 0 733 592 ; +C 141 ; WX 600 ; N afii10061 ; B 48 0 671 816 ; +C 142 ; WX 600 ; N Zcaron ; B 74 0 634 801 ; +C 143 ; WX 600 ; N afii10145 ; B 44 -130 692 592 ; +C 144 ; WX 600 ; N quotedblbase ; B 80 -130 549 131 ; +C 145 ; WX 600 ; N quoteleft ; B 338 316 488 612 ; +C 146 ; WX 600 ; N quoteright ; B 247 316 511 612 ; +C 147 ; WX 600 ; N quotedblleft ; B 210 355 581 616 ; +C 148 ; WX 600 ; N quotedblright ; B 183 355 652 616 ; +C 149 ; WX 600 ; N bullet ; B 213 158 521 461 ; +C 150 ; WX 600 ; N endash ; B 99 233 620 333 ; +C 151 ; WX 600 ; N emdash ; B 29 233 691 333 ; +C 152 ; WX 600 ; N tilde ; B 240 489 579 610 ; +C 153 ; WX 600 ; N trademark ; B -42 296 602 651 ; +C 154 ; WX 600 ; N scaron ; B 83 -16 592 645 ; +C 155 ; WX 600 ; N guilsinglright ; B 202 20 522 420 ; +C 156 ; WX 600 ; N oe ; B 19 -16 665 456 ; +C 157 ; WX 600 ; N afii10109 ; B 61 0 620 661 ; +C 158 ; WX 600 ; N zcaron ; B 86 0 605 645 ; +C 159 ; WX 600 ; N Ydieresis ; B 126 0 697 777 ; +C 160 ; WX 600 ; N space ; B 244 -15 500 648 ; +C 161 ; WX 600 ; N exclamdown ; B 190 -207 440 433 ; +C 162 ; WX 600 ; N cent ; B 145 -31 596 685 ; +C 163 ; WX 600 ; N sterling ; B 63 0 574 606 ; +C 164 ; WX 600 ; N currency ; B 95 66 630 526 ; +C 165 ; WX 600 ; N yen ; B 135 0 697 589 ; +C 166 ; WX 600 ; N brokenbar ; B 250 -156 351 632 ; +C 167 ; WX 600 ; N section ; B 74 -85 646 636 ; +C 168 ; WX 600 ; N dieresis ; B 259 521 570 622 ; +C 169 ; WX 600 ; N copyright ; B 56 -14 662 592 ; +C 170 ; WX 600 ; N ordfeminine ; B 148 364 486 648 ; +C 171 ; WX 600 ; N guillemotleft ; B 79 18 638 419 ; +C 172 ; WX 600 ; N logicalnot ; B 40 -1 634 333 ; +C 173 ; WX 600 ; N hyphen ; B 142 238 580 330 ; +C 174 ; WX 600 ; N registered ; B 56 -14 662 592 ; +C 175 ; WX 600 ; N overscore ; B 95 660 780 760 ; +C 176 ; WX 600 ; N degree ; B 262 417 574 728 ; +C 177 ; WX 600 ; N plusminus ; B 41 0 622 705 ; +C 178 ; WX 600 ; N twosuperior ; B 148 311 489 648 ; +C 179 ; WX 600 ; N threesuperior ; B 165 304 491 648 ; +C 180 ; WX 600 ; N acute ; B 376 500 583 661 ; +C 181 ; WX 600 ; N mu1 ; B 64 -209 607 443 ; +C 182 ; WX 600 ; N paragraph ; B 133 -87 669 632 ; +C 183 ; WX 600 ; N periodcentered ; B 290 246 443 378 ; +C 184 ; WX 600 ; N cedilla ; B 175 -179 368 30 ; +C 185 ; WX 600 ; N onesuperior ; B 171 311 442 650 ; +C 186 ; WX 600 ; N ordmasculine ; B 159 364 501 648 ; +C 187 ; WX 600 ; N guillemotright ; B 65 24 617 425 ; +C 188 ; WX 600 ; N onequarter ; B 48 0 644 650 ; +C 189 ; WX 600 ; N onehalf ; B 48 0 672 650 ; +C 190 ; WX 600 ; N threequarters ; B 50 0 655 648 ; +C 191 ; WX 600 ; N questiondown ; B 74 -210 485 431 ; +C 192 ; WX 600 ; N Agrave ; B -13 0 635 818 ; +C 193 ; WX 600 ; N Aacute ; B -13 0 635 816 ; +C 194 ; WX 600 ; N Acircumflex ; B -13 0 635 805 ; +C 195 ; WX 600 ; N Atilde ; B -13 0 635 766 ; +C 196 ; WX 600 ; N Adieresis ; B -13 0 635 777 ; +C 197 ; WX 600 ; N Aring ; B -13 0 635 826 ; +C 198 ; WX 600 ; N AE ; B -12 0 728 592 ; +C 199 ; WX 600 ; N Ccedilla ; B 79 -179 667 607 ; +C 200 ; WX 600 ; N Egrave ; B 24 0 657 818 ; +C 201 ; WX 600 ; N Eacute ; B 24 0 657 816 ; +C 202 ; WX 600 ; N Ecircumflex ; B 24 0 657 805 ; +C 203 ; WX 600 ; N Edieresis ; B 24 0 657 777 ; +C 204 ; WX 600 ; N Igrave ; B 92 0 634 818 ; +C 205 ; WX 600 ; N Iacute ; B 92 0 634 816 ; +C 206 ; WX 600 ; N Icircumflex ; B 92 0 634 805 ; +C 207 ; WX 600 ; N Idieresis ; B 92 0 634 777 ; +C 208 ; WX 600 ; N Eth ; B 23 0 621 592 ; +C 209 ; WX 600 ; N Ntilde ; B 22 0 709 766 ; +C 210 ; WX 600 ; N Ograve ; B 75 -15 652 818 ; +C 211 ; WX 600 ; N Oacute ; B 75 -15 652 816 ; +C 212 ; WX 600 ; N Ocircumflex ; B 75 -15 652 805 ; +C 213 ; WX 600 ; N Otilde ; B 75 -15 652 766 ; +C 214 ; WX 600 ; N Odieresis ; B 75 -15 652 777 ; +C 215 ; WX 600 ; N multiply ; B 205 80 637 485 ; +C 216 ; WX 600 ; N Oslash ; B 5 -71 718 642 ; +C 217 ; WX 600 ; N Ugrave ; B 111 -15 707 818 ; +C 218 ; WX 600 ; N Uacute ; B 111 -15 707 816 ; +C 219 ; WX 600 ; N Ucircumflex ; B 111 -15 707 805 ; +C 220 ; WX 600 ; N Udieresis ; B 111 -15 707 777 ; +C 221 ; WX 600 ; N Yacute ; B 126 0 697 816 ; +C 222 ; WX 600 ; N Thorn ; B 69 0 643 592 ; +C 223 ; WX 600 ; N germandbls ; B 22 -16 572 633 ; +C 224 ; WX 600 ; N agrave ; B 66 -16 585 662 ; +C 225 ; WX 600 ; N aacute ; B 66 -16 585 661 ; +C 226 ; WX 600 ; N acircumflex ; B 66 -16 585 649 ; +C 227 ; WX 600 ; N atilde ; B 66 -16 585 610 ; +C 228 ; WX 600 ; N adieresis ; B 66 -16 585 622 ; +C 229 ; WX 600 ; N aring ; B 66 -16 585 676 ; +C 230 ; WX 600 ; N ae ; B 8 -16 665 456 ; +C 231 ; WX 600 ; N ccedilla ; B 95 -179 627 457 ; +C 232 ; WX 600 ; N egrave ; B 74 -16 602 662 ; +C 233 ; WX 600 ; N eacute ; B 74 -16 602 661 ; +C 234 ; WX 600 ; N ecircumflex ; B 74 -16 602 649 ; +C 235 ; WX 600 ; N edieresis ; B 74 -16 602 622 ; +C 236 ; WX 600 ; N igrave ; B 72 0 549 662 ; +C 237 ; WX 600 ; N iacute ; B 72 0 549 661 ; +C 238 ; WX 600 ; N icircumflex ; B 72 0 549 649 ; +C 239 ; WX 600 ; N idieresis ; B 72 0 549 622 ; +C 240 ; WX 600 ; N eth ; B 85 -16 628 630 ; +C 241 ; WX 600 ; N ntilde ; B 34 0 585 610 ; +C 242 ; WX 600 ; N ograve ; B 83 -16 610 662 ; +C 243 ; WX 600 ; N oacute ; B 83 -16 610 661 ; +C 244 ; WX 600 ; N ocircumflex ; B 83 -16 610 649 ; +C 245 ; WX 600 ; N otilde ; B 83 -16 610 610 ; +C 246 ; WX 600 ; N odieresis ; B 83 -16 610 622 ; +C 247 ; WX 600 ; N divide ; B 100 3 622 564 ; +C 248 ; WX 600 ; N oslash ; B 17 -72 669 495 ; +C 249 ; WX 600 ; N ugrave ; B 97 -16 606 662 ; +C 250 ; WX 600 ; N uacute ; B 97 -16 606 661 ; +C 251 ; WX 600 ; N ucircumflex ; B 97 -16 606 649 ; +C 252 ; WX 600 ; N udieresis ; B 97 -16 606 622 ; +C 253 ; WX 600 ; N yacute ; B -14 -209 667 661 ; +C 254 ; WX 600 ; N thorn ; B -43 -209 625 633 ; +C 255 ; WX 600 ; N ydieresis ; B -14 -209 667 622 ; +C -1 ; WX 0 ; N .null ; B 244 -15 500 648 ; +C -1 ; WX 600 ; N nonmarkingreturn ; B 244 -15 500 648 ; +C -1 ; WX 600 ; N notequal ; B 60 -67 664 637 ; +C -1 ; WX 600 ; N infinity ; B 103 186 615 422 ; +C -1 ; WX 600 ; N lessequal ; B 10 40 671 745 ; +C -1 ; WX 600 ; N greaterequal ; B 23 40 665 745 ; +C -1 ; WX 600 ; N partialdiff ; B 46 -15 560 633 ; +C -1 ; WX 600 ; N summation ; B 33 -188 551 613 ; +C -1 ; WX 600 ; N product ; B 12 -188 589 613 ; +C -1 ; WX 600 ; N pi1 ; B 47 0 648 443 ; +C -1 ; WX 600 ; N integral ; B -8 -190 736 826 ; +C -1 ; WX 600 ; N Ohm ; B 17 0 583 607 ; +C -1 ; WX 600 ; N radical ; B 67 -38 575 913 ; +C -1 ; WX 600 ; N approxequal ; B 69 74 653 494 ; +C -1 ; WX 600 ; N increment ; B 16 0 569 583 ; +C -1 ; WX 600 ; N lozenge ; B 76 0 525 694 ; +C -1 ; WX 600 ; N fraction ; B 97 149 560 467 ; +C -1 ; WX 600 ; N fi ; B 1 0 649 633 ; +C -1 ; WX 600 ; N fl ; B 0 0 664 633 ; +C -1 ; WX 600 ; N dotlessi ; B 72 0 549 443 ; +C -1 ; WX 600 ; N macron ; B 255 525 567 584 ; +C -1 ; WX 600 ; N breve ; B 271 501 585 648 ; +C -1 ; WX 600 ; N dotaccent ; B 353 511 477 632 ; +C -1 ; WX 600 ; N ring ; B 318 493 508 676 ; +C -1 ; WX 600 ; N hungarumlaut ; B 250 501 584 662 ; +C -1 ; WX 600 ; N ogonek ; B 229 -157 398 30 ; +C -1 ; WX 600 ; N caron ; B 266 493 581 645 ; +C -1 ; WX 600 ; N Lslash ; B 42 0 618 592 ; +C -1 ; WX 600 ; N lslash ; B 72 0 560 633 ; +C -1 ; WX 600 ; N minus ; B 100 234 622 334 ; +C -1 ; WX 600 ; N franc ; B 58 0 712 592 ; +C -1 ; WX 600 ; N Gbreve ; B 78 -15 668 804 ; +C -1 ; WX 600 ; N gbreve ; B 74 -209 679 648 ; +C -1 ; WX 600 ; N Idot ; B 92 0 634 789 ; +C -1 ; WX 600 ; N Scedilla ; B 72 -179 634 607 ; +C -1 ; WX 600 ; N scedilla ; B 83 -179 592 457 ; +C -1 ; WX 600 ; N Cacute ; B 79 -15 667 816 ; +C -1 ; WX 600 ; N cacute ; B 95 -17 627 661 ; +C -1 ; WX 600 ; N Ccaron ; B 79 -15 667 801 ; +C -1 ; WX 600 ; N ccaron ; B 95 -17 627 645 ; +C -1 ; WX 600 ; N dmacron ; B 70 -13 696 636 ; +C -1 ; WX 600 ; N middot ; B 418 299 542 420 ; +C -1 ; WX 600 ; N Abreve ; B -13 0 635 804 ; +C -1 ; WX 600 ; N abreve ; B 66 -16 600 648 ; +C -1 ; WX 600 ; N Aogonek ; B -13 -129 635 592 ; +C -1 ; WX 600 ; N aogonek ; B 66 -126 588 457 ; +C -1 ; WX 600 ; N Dcaron ; B 59 0 661 801 ; +C -1 ; WX 600 ; N dcaron ; B 70 -16 836 633 ; +C -1 ; WX 600 ; N Dslash ; B 23 0 621 592 ; +C -1 ; WX 600 ; N Eogonek ; B 24 -130 657 592 ; +C -1 ; WX 600 ; N eogonek ; B 74 -141 602 457 ; +C -1 ; WX 600 ; N Ecaron ; B 24 0 657 801 ; +C -1 ; WX 600 ; N ecaron ; B 74 -16 602 645 ; +C -1 ; WX 600 ; N Lacute ; B 42 0 620 816 ; +C -1 ; WX 600 ; N lacute ; B 73 0 588 830 ; +C -1 ; WX 600 ; N Lcaron ; B 42 0 685 592 ; +C -1 ; WX 600 ; N lcaron ; B 73 0 657 633 ; +C -1 ; WX 600 ; N Ldot ; B 42 0 620 592 ; +C -1 ; WX 600 ; N ldot ; B 73 0 589 633 ; +C -1 ; WX 600 ; N Nacute ; B 22 0 709 816 ; +C -1 ; WX 600 ; N nacute ; B 34 0 585 661 ; +C -1 ; WX 600 ; N Ncaron ; B 22 0 709 801 ; +C -1 ; WX 600 ; N ncaron ; B 34 0 615 645 ; +C -1 ; WX 600 ; N Odblacute ; B 75 -15 695 818 ; +C -1 ; WX 600 ; N odblacute ; B 83 -16 655 662 ; +C -1 ; WX 600 ; N Racute ; B 24 0 633 816 ; +C -1 ; WX 600 ; N racute ; B 63 0 653 661 ; +C -1 ; WX 600 ; N Rcaron ; B 24 0 633 801 ; +C -1 ; WX 600 ; N rcaron ; B 63 0 653 645 ; +C -1 ; WX 600 ; N Sacute ; B 72 -15 634 816 ; +C -1 ; WX 600 ; N sacute ; B 83 -16 592 661 ; +C -1 ; WX 600 ; N Tcedilla ; B 120 -271 684 592 ; +C -1 ; WX 600 ; N tcedilla ; B 143 -250 601 601 ; +C -1 ; WX 600 ; N Tcaron ; B 120 0 684 801 ; +C -1 ; WX 600 ; N tcaron ; B 143 -16 751 633 ; +C -1 ; WX 600 ; N Uring ; B 111 -15 707 826 ; +C -1 ; WX 600 ; N uring ; B 97 -16 606 676 ; +C -1 ; WX 600 ; N Udblacute ; B 111 -15 707 818 ; +C -1 ; WX 600 ; N udblacute ; B 97 -16 636 662 ; +C -1 ; WX 600 ; N Zacute ; B 74 0 634 816 ; +C -1 ; WX 600 ; N zacute ; B 86 0 605 661 ; +C -1 ; WX 600 ; N Zdot ; B 74 0 634 788 ; +C -1 ; WX 600 ; N zdot ; B 86 0 605 632 ; +C -1 ; WX 600 ; N Gamma ; B 54 0 703 592 ; +C -1 ; WX 600 ; N Theta ; B 75 -15 652 607 ; +C -1 ; WX 600 ; N Phi ; B 99 0 628 592 ; +C -1 ; WX 600 ; N alpha ; B 86 -16 639 457 ; +C -1 ; WX 600 ; N delta ; B 121 -16 603 633 ; +C -1 ; WX 600 ; N epsilon ; B 118 -16 589 457 ; +C -1 ; WX 600 ; N sigma ; B 90 -16 673 443 ; +C -1 ; WX 600 ; N tau ; B 174 -16 558 443 ; +C -1 ; WX 600 ; N phi ; B 85 -225 614 457 ; +C -1 ; WX 600 ; N underscoredbl ; B -103 -377 621 -100 ; +C -1 ; WX 600 ; N exclamdbl ; B 103 -15 641 648 ; +C -1 ; WX 600 ; N nsuperior ; B 193 253 527 527 ; +C -1 ; WX 600 ; N peseta ; B 12 -8 634 592 ; +C -1 ; WX 600 ; N arrowleft ; B 1 50 599 277 ; +C -1 ; WX 600 ; N arrowup ; B 186 -136 414 424 ; +C -1 ; WX 600 ; N arrowright ; B 1 50 599 277 ; +C -1 ; WX 600 ; N arrowdown ; B 186 -136 414 424 ; +C -1 ; WX 600 ; N arrowboth ; B 1 50 599 278 ; +C -1 ; WX 600 ; N arrowupdn ; B 186 -135 414 463 ; +C -1 ; WX 600 ; N arrowupdnbse ; B 186 -196 414 463 ; +C -1 ; WX 600 ; N orthogonal ; B 1 0 599 597 ; +C -1 ; WX 600 ; N intersection ; B 62 -15 642 648 ; +C -1 ; WX 600 ; N equivalence ; B 39 46 683 523 ; +C -1 ; WX 600 ; N house ; B 44 0 556 639 ; +C -1 ; WX 600 ; N revlogicalnot ; B -9 0 621 334 ; +C -1 ; WX 600 ; N integraltp ; B 211 -251 645 848 ; +C -1 ; WX 600 ; N integralbt ; B 82 -251 516 848 ; +C -1 ; WX 600 ; N SF100000 ; B -7 219 607 292 ; +C -1 ; WX 600 ; N SF110000 ; B 264 -255 336 766 ; +C -1 ; WX 600 ; N SF010000 ; B 264 -255 607 292 ; +C -1 ; WX 600 ; N SF030000 ; B -7 -255 336 292 ; +C -1 ; WX 600 ; N SF020000 ; B 264 219 607 766 ; +C -1 ; WX 600 ; N SF040000 ; B -7 219 336 766 ; +C -1 ; WX 600 ; N SF080000 ; B 264 -255 607 766 ; +C -1 ; WX 600 ; N SF090000 ; B -7 -255 336 766 ; +C -1 ; WX 600 ; N SF060000 ; B -7 -255 607 292 ; +C -1 ; WX 600 ; N SF070000 ; B -7 219 607 766 ; +C -1 ; WX 600 ; N SF050000 ; B -7 -255 607 766 ; +C -1 ; WX 600 ; N SF430000 ; B -7 141 607 370 ; +C -1 ; WX 600 ; N SF240000 ; B 186 -255 414 766 ; +C -1 ; WX 600 ; N SF510000 ; B 264 -255 607 370 ; +C -1 ; WX 600 ; N SF520000 ; B 186 -255 607 292 ; +C -1 ; WX 600 ; N SF390000 ; B 186 -255 607 370 ; +C -1 ; WX 600 ; N SF220000 ; B -7 -255 336 370 ; +C -1 ; WX 600 ; N SF210000 ; B -7 -255 414 292 ; +C -1 ; WX 600 ; N SF250000 ; B -7 -255 414 370 ; +C -1 ; WX 600 ; N SF500000 ; B 264 141 607 766 ; +C -1 ; WX 600 ; N SF490000 ; B 186 219 607 766 ; +C -1 ; WX 600 ; N SF380000 ; B 186 141 607 766 ; +C -1 ; WX 600 ; N SF280000 ; B -7 141 336 766 ; +C -1 ; WX 600 ; N SF270000 ; B -7 219 414 766 ; +C -1 ; WX 600 ; N SF260000 ; B -7 141 414 766 ; +C -1 ; WX 600 ; N SF360000 ; B 264 -255 607 766 ; +C -1 ; WX 600 ; N SF370000 ; B 186 -255 607 766 ; +C -1 ; WX 600 ; N SF420000 ; B 186 -255 607 766 ; +C -1 ; WX 600 ; N SF190000 ; B -7 -255 336 766 ; +C -1 ; WX 600 ; N SF200000 ; B -7 -255 414 766 ; +C -1 ; WX 600 ; N SF230000 ; B -7 -255 414 766 ; +C -1 ; WX 600 ; N SF470000 ; B -7 -255 607 370 ; +C -1 ; WX 600 ; N SF480000 ; B -7 -255 607 292 ; +C -1 ; WX 600 ; N SF410000 ; B -7 -255 607 370 ; +C -1 ; WX 600 ; N SF450000 ; B -7 141 607 766 ; +C -1 ; WX 600 ; N SF460000 ; B -7 219 607 766 ; +C -1 ; WX 600 ; N SF400000 ; B -7 141 607 766 ; +C -1 ; WX 600 ; N SF540000 ; B -7 -255 607 766 ; +C -1 ; WX 600 ; N SF530000 ; B -7 -255 607 766 ; +C -1 ; WX 600 ; N SF440000 ; B -7 -255 607 766 ; +C -1 ; WX 600 ; N upblock ; B -7 255 607 766 ; +C -1 ; WX 600 ; N dnblock ; B -7 -255 607 255 ; +C -1 ; WX 600 ; N block ; B -7 -255 607 766 ; +C -1 ; WX 600 ; N lfblock ; B -7 -255 300 766 ; +C -1 ; WX 600 ; N rtblock ; B 300 -255 608 766 ; +C -1 ; WX 600 ; N ltshade ; B 44 -207 607 766 ; +C -1 ; WX 600 ; N shade ; B -7 -207 607 766 ; +C -1 ; WX 600 ; N dkshade ; B -7 -258 607 766 ; +C -1 ; WX 600 ; N filledbox ; B 1 0 599 598 ; +C -1 ; WX 600 ; N filledrect ; B 1 193 599 306 ; +C -1 ; WX 600 ; N triagup ; B 7 0 592 585 ; +C -1 ; WX 600 ; N triagrt ; B 1 -13 599 584 ; +C -1 ; WX 600 ; N triagdn ; B 7 -13 592 572 ; +C -1 ; WX 600 ; N triaglf ; B 1 -13 599 584 ; +C -1 ; WX 600 ; N circle ; B 85 67 515 497 ; +C -1 ; WX 600 ; N invbullet ; B 61 0 539 479 ; +C -1 ; WX 600 ; N invcircle ; B 19 0 583 564 ; +C -1 ; WX 600 ; N smileface ; B -3 -14 603 592 ; +C -1 ; WX 600 ; N invsmileface ; B -3 -14 603 592 ; +C -1 ; WX 600 ; N sun ; B 1 -69 599 529 ; +C -1 ; WX 600 ; N female ; B 157 39 444 563 ; +C -1 ; WX 600 ; N male ; B 90 122 511 563 ; +C -1 ; WX 600 ; N spade ; B 63 0 537 601 ; +C -1 ; WX 600 ; N club ; B 1 0 599 597 ; +C -1 ; WX 600 ; N heart ; B 53 -11 547 559 ; +C -1 ; WX 600 ; N diamond ; B 78 -12 523 597 ; +C -1 ; WX 600 ; N musicalnote ; B 132 14 440 563 ; +C -1 ; WX 600 ; N musicalnotedbl ; B 44 -21 528 566 ; +C -1 ; WX 600 ; N IJ ; B 24 -15 723 592 ; +C -1 ; WX 600 ; N ij ; B -38 -209 675 633 ; +C -1 ; WX 600 ; N napostrophe ; B 29 0 593 612 ; +C -1 ; WX 600 ; N minute ; B 344 318 494 611 ; +C -1 ; WX 600 ; N second ; B 240 332 595 604 ; +C -1 ; WX 600 ; N afii61248 ; B 129 -15 604 627 ; +C -1 ; WX 600 ; N afii61289 ; B 112 -16 558 607 ; +C -1 ; WX 600 ; N H22073 ; B 1 0 599 598 ; +C -1 ; WX 600 ; N H18543 ; B 214 156 521 463 ; +C -1 ; WX 600 ; N H18551 ; B 214 156 521 463 ; +C -1 ; WX 600 ; N H18533 ; B 85 67 515 497 ; +C -1 ; WX 600 ; N openbullet ; B 213 158 521 461 ; +C -1 ; WX 600 ; N Amacron ; B -13 0 635 740 ; +C -1 ; WX 600 ; N amacron ; B 66 -16 585 584 ; +C -1 ; WX 600 ; N Ccircumflex ; B 79 -15 667 805 ; +C -1 ; WX 600 ; N ccircumflex ; B 95 -17 627 649 ; +C -1 ; WX 600 ; N Cdot ; B 79 -15 667 788 ; +C -1 ; WX 600 ; N cdot ; B 95 -17 627 632 ; +C -1 ; WX 600 ; N Emacron ; B 24 0 657 740 ; +C -1 ; WX 600 ; N emacron ; B 74 -16 602 584 ; +C -1 ; WX 600 ; N Ebreve ; B 24 0 657 804 ; +C -1 ; WX 600 ; N ebreve ; B 74 -16 602 648 ; +C -1 ; WX 600 ; N Edot ; B 24 0 657 788 ; +C -1 ; WX 600 ; N edot ; B 74 -16 602 632 ; +C -1 ; WX 600 ; N Gcircumflex ; B 78 -15 668 805 ; +C -1 ; WX 600 ; N gcircumflex ; B 74 -209 679 649 ; +C -1 ; WX 600 ; N Gdot ; B 78 -15 668 788 ; +C -1 ; WX 600 ; N gdot ; B 74 -209 679 632 ; +C -1 ; WX 600 ; N Gcedilla ; B 78 -190 668 607 ; +C -1 ; WX 600 ; N gcedilla ; B 74 -209 679 702 ; +C -1 ; WX 600 ; N Hcircumflex ; B 31 0 679 805 ; +C -1 ; WX 600 ; N hcircumflex ; B 33 0 603 805 ; +C -1 ; WX 600 ; N Hbar ; B 31 0 679 592 ; +C -1 ; WX 600 ; N hbar ; B 33 0 596 633 ; +C -1 ; WX 600 ; N Itilde ; B 92 0 634 766 ; +C -1 ; WX 600 ; N itilde ; B 72 0 578 610 ; +C -1 ; WX 600 ; N Imacron ; B 92 0 634 740 ; +C -1 ; WX 600 ; N imacron ; B 72 0 549 584 ; +C -1 ; WX 600 ; N Ibreve ; B 92 0 634 804 ; +C -1 ; WX 600 ; N ibreve ; B 72 0 557 648 ; +C -1 ; WX 600 ; N Iogonek ; B 92 -139 634 592 ; +C -1 ; WX 600 ; N iogonek ; B 72 -139 549 633 ; +C -1 ; WX 600 ; N Jcircumflex ; B 65 -15 730 805 ; +C -1 ; WX 600 ; N jcircumflex ; B 51 -209 554 649 ; +C -1 ; WX 600 ; N Kcedilla ; B 23 -190 699 592 ; +C -1 ; WX 600 ; N kcedilla ; B 43 -190 616 633 ; +C -1 ; WX 600 ; N kgreenlandic ; B 31 0 604 443 ; +C -1 ; WX 600 ; N Lcedilla ; B 42 -190 620 592 ; +C -1 ; WX 600 ; N lcedilla ; B 73 -190 549 633 ; +C -1 ; WX 600 ; N Ncedilla ; B 22 -190 709 592 ; +C -1 ; WX 600 ; N ncedilla ; B 34 -190 585 457 ; +C -1 ; WX 600 ; N Eng ; B 27 -15 638 607 ; +C -1 ; WX 600 ; N eng ; B 49 -209 592 457 ; +C -1 ; WX 600 ; N Omacron ; B 75 -15 652 740 ; +C -1 ; WX 600 ; N omacron ; B 83 -16 610 584 ; +C -1 ; WX 600 ; N Obreve ; B 75 -15 652 804 ; +C -1 ; WX 600 ; N obreve ; B 83 -16 610 648 ; +C -1 ; WX 600 ; N Rcedilla ; B 24 -190 633 592 ; +C -1 ; WX 600 ; N rcedilla ; B 63 -190 653 457 ; +C -1 ; WX 600 ; N Scircumflex ; B 72 -15 634 805 ; +C -1 ; WX 600 ; N scircumflex ; B 83 -16 592 649 ; +C -1 ; WX 600 ; N Tbar ; B 120 0 684 592 ; +C -1 ; WX 600 ; N tbar ; B 95 -15 601 601 ; +C -1 ; WX 600 ; N Utilde ; B 111 -15 707 766 ; +C -1 ; WX 600 ; N utilde ; B 97 -16 606 610 ; +C -1 ; WX 600 ; N Umacron ; B 111 -15 707 740 ; +C -1 ; WX 600 ; N umacron ; B 97 -16 606 584 ; +C -1 ; WX 600 ; N Ubreve ; B 111 -15 707 804 ; +C -1 ; WX 600 ; N ubreve ; B 97 -16 606 648 ; +C -1 ; WX 600 ; N Uogonek ; B 111 -139 707 592 ; +C -1 ; WX 600 ; N uogonek ; B 97 -139 606 443 ; +C -1 ; WX 600 ; N Wcircumflex ; B 95 0 728 805 ; +C -1 ; WX 600 ; N wcircumflex ; B 81 0 687 649 ; +C -1 ; WX 600 ; N Ycircumflex ; B 126 0 697 805 ; +C -1 ; WX 600 ; N ycircumflex ; B -14 -209 667 649 ; +C -1 ; WX 600 ; N longs ; B 82 0 694 633 ; +C -1 ; WX 600 ; N Aringacute ; B -13 0 635 1004 ; +C -1 ; WX 600 ; N aringacute ; B 66 -16 585 854 ; +C -1 ; WX 600 ; N AEacute ; B -12 0 728 816 ; +C -1 ; WX 600 ; N aeacute ; B 8 -16 665 661 ; +C -1 ; WX 600 ; N Oslashacute ; B 5 -71 718 816 ; +C -1 ; WX 600 ; N oslashacute ; B 17 -72 669 661 ; +C -1 ; WX 600 ; N anoteleia ; B 306 323 459 457 ; +C -1 ; WX 600 ; N Wgrave ; B 95 0 728 817 ; +C -1 ; WX 600 ; N wgrave ; B 81 0 687 661 ; +C -1 ; WX 600 ; N Wacute ; B 95 0 728 816 ; +C -1 ; WX 600 ; N wacute ; B 81 0 687 661 ; +C -1 ; WX 600 ; N Wdieresis ; B 95 0 728 777 ; +C -1 ; WX 600 ; N wdieresis ; B 81 0 687 622 ; +C -1 ; WX 600 ; N Ygrave ; B 126 0 697 817 ; +C -1 ; WX 600 ; N ygrave ; B -14 -209 667 661 ; +C -1 ; WX 600 ; N quotereversed ; B 338 316 488 612 ; +C -1 ; WX 600 ; N radicalex ; B 232 525 603 584 ; +C -1 ; WX 600 ; N afii08941 ; B 63 0 574 607 ; +C -1 ; WX 600 ; N estimated ; B 44 -17 561 535 ; +C -1 ; WX 600 ; N oneeighth ; B 48 -7 660 650 ; +C -1 ; WX 600 ; N threeeighths ; B 47 -7 660 648 ; +C -1 ; WX 600 ; N fiveeighths ; B 47 -7 660 640 ; +C -1 ; WX 600 ; N seveneighths ; B 110 -7 681 640 ; +C -1 ; WX 600 ; N commaaccent ; B 199 -250 333 -59 ; +C -1 ; WX 600 ; N undercommaaccent ; B 188 -190 368 -47 ; +C -1 ; WX 600 ; N tonos ; B 329 500 536 661 ; +C -1 ; WX 600 ; N dieresistonos ; B 196 500 627 661 ; +C -1 ; WX 600 ; N Alphatonos ; B -13 0 635 592 ; +C -1 ; WX 600 ; N Epsilontonos ; B 42 0 675 592 ; +C -1 ; WX 600 ; N Etatonos ; B 32 0 679 592 ; +C -1 ; WX 600 ; N Iotatonos ; B 99 0 670 592 ; +C -1 ; WX 600 ; N Omicrontonos ; B 89 -15 653 607 ; +C -1 ; WX 600 ; N Upsilontonos ; B 90 0 720 592 ; +C -1 ; WX 600 ; N Omegatonos ; B 85 0 634 607 ; +C -1 ; WX 600 ; N iotadieresistonos ; B 163 -16 594 661 ; +C -1 ; WX 600 ; N Alpha ; B -13 0 635 592 ; +C -1 ; WX 600 ; N Beta ; B 22 0 624 592 ; +C -1 ; WX 600 ; N Delta ; B 6 0 595 592 ; +C -1 ; WX 600 ; N Epsilon ; B 24 0 657 592 ; +C -1 ; WX 600 ; N Zeta ; B 74 0 634 592 ; +C -1 ; WX 600 ; N Eta ; B 31 0 679 592 ; +C -1 ; WX 600 ; N Iota ; B 92 0 634 592 ; +C -1 ; WX 600 ; N Kappa ; B 23 0 699 592 ; +C -1 ; WX 600 ; N Lambda ; B -8 0 640 592 ; +C -1 ; WX 600 ; N Mu ; B -9 0 730 592 ; +C -1 ; WX 600 ; N Nu ; B 22 0 709 592 ; +C -1 ; WX 600 ; N Xi ; B 55 0 677 592 ; +C -1 ; WX 600 ; N Omicron ; B 75 -15 652 607 ; +C -1 ; WX 600 ; N Pi ; B 32 0 679 592 ; +C -1 ; WX 600 ; N Rho ; B 22 0 620 592 ; +C -1 ; WX 600 ; N Sigma ; B 43 0 674 592 ; +C -1 ; WX 600 ; N Tau ; B 120 0 684 592 ; +C -1 ; WX 600 ; N Upsilon ; B 126 0 697 592 ; +C -1 ; WX 600 ; N Chi ; B 21 0 697 592 ; +C -1 ; WX 600 ; N Psi ; B 113 0 723 592 ; +C -1 ; WX 600 ; N Omega ; B 19 0 665 607 ; +C -1 ; WX 600 ; N Iotadieresis ; B 92 0 634 777 ; +C -1 ; WX 600 ; N Upsilondieresis ; B 126 0 697 777 ; +C -1 ; WX 600 ; N alphatonos ; B 86 -16 639 661 ; +C -1 ; WX 600 ; N epsilontonos ; B 118 -16 589 661 ; +C -1 ; WX 600 ; N etatonos ; B 71 -225 584 661 ; +C -1 ; WX 600 ; N iotatonos ; B 262 -16 515 661 ; +C -1 ; WX 600 ; N upsilondieresistonos ; B 116 -16 642 661 ; +C -1 ; WX 600 ; N beta ; B 75 -225 566 633 ; +C -1 ; WX 600 ; N gamma ; B 106 -225 645 443 ; +C -1 ; WX 600 ; N zeta ; B 174 -225 603 633 ; +C -1 ; WX 600 ; N eta ; B 71 -225 577 457 ; +C -1 ; WX 600 ; N theta ; B 130 -16 607 633 ; +C -1 ; WX 600 ; N iota ; B 262 -16 463 457 ; +C -1 ; WX 600 ; N kappa ; B 73 0 645 443 ; +C -1 ; WX 600 ; N lambda ; B 39 0 602 633 ; +C -1 ; WX 600 ; N mu ; B 64 -209 607 443 ; +C -1 ; WX 600 ; N nu ; B 109 0 580 457 ; +C -1 ; WX 600 ; N xi ; B 168 -225 582 633 ; +C -1 ; WX 600 ; N omicron ; B 83 -16 610 457 ; +C -1 ; WX 600 ; N rho ; B 47 -225 592 457 ; +C -1 ; WX 600 ; N sigma1 ; B 117 -225 610 457 ; +C -1 ; WX 600 ; N upsilon ; B 116 -16 642 443 ; +C -1 ; WX 600 ; N chi ; B 34 -225 604 457 ; +C -1 ; WX 600 ; N psi ; B 120 -225 653 633 ; +C -1 ; WX 600 ; N omega ; B 85 -16 603 457 ; +C -1 ; WX 600 ; N iotadieresis ; B 258 -16 569 622 ; +C -1 ; WX 600 ; N upsilondieresis ; B 116 -16 642 622 ; +C -1 ; WX 600 ; N omicrontonos ; B 83 -16 610 661 ; +C -1 ; WX 600 ; N upsilontonos ; B 116 -16 642 661 ; +C -1 ; WX 600 ; N omegatonos ; B 85 -16 603 661 ; +C -1 ; WX 600 ; N afii10023 ; B 24 0 657 768 ; +C -1 ; WX 600 ; N afii10051 ; B 87 -16 621 592 ; +C -1 ; WX 600 ; N afii10053 ; B 80 -15 667 607 ; +C -1 ; WX 600 ; N afii10054 ; B 72 -15 634 607 ; +C -1 ; WX 600 ; N afii10055 ; B 92 0 634 592 ; +C -1 ; WX 600 ; N afii10056 ; B 92 0 634 768 ; +C -1 ; WX 600 ; N afii10057 ; B 65 -15 730 592 ; +C -1 ; WX 600 ; N afii10058 ; B -15 -16 628 592 ; +C -1 ; WX 600 ; N afii10059 ; B 17 0 660 592 ; +C -1 ; WX 600 ; N afii10060 ; B 82 0 609 592 ; +C -1 ; WX 600 ; N afii10062 ; B 63 -16 718 804 ; +C -1 ; WX 600 ; N afii10017 ; B -13 0 635 592 ; +C -1 ; WX 600 ; N afii10018 ; B 23 0 654 592 ; +C -1 ; WX 600 ; N afii10019 ; B 22 0 624 592 ; +C -1 ; WX 600 ; N afii10020 ; B 31 0 701 592 ; +C -1 ; WX 600 ; N afii10021 ; B 0 -130 679 592 ; +C -1 ; WX 600 ; N afii10022 ; B 24 0 657 592 ; +C -1 ; WX 600 ; N afii10024 ; B 5 0 705 592 ; +C -1 ; WX 600 ; N afii10025 ; B 12 -16 618 638 ; +C -1 ; WX 600 ; N afii10026 ; B 21 0 686 592 ; +C -1 ; WX 600 ; N afii10027 ; B 21 0 686 804 ; +C -1 ; WX 600 ; N afii10028 ; B 48 0 671 592 ; +C -1 ; WX 600 ; N afii10029 ; B -2 -16 681 592 ; +C -1 ; WX 600 ; N afii10030 ; B -9 0 730 592 ; +C -1 ; WX 600 ; N afii10031 ; B 31 0 679 592 ; +C -1 ; WX 600 ; N afii10032 ; B 75 -15 652 607 ; +C -1 ; WX 600 ; N afii10033 ; B 32 0 679 592 ; +C -1 ; WX 600 ; N afii10034 ; B 22 0 620 592 ; +C -1 ; WX 600 ; N afii10035 ; B 79 -15 667 607 ; +C -1 ; WX 600 ; N afii10036 ; B 120 0 684 592 ; +C -1 ; WX 600 ; N afii10037 ; B 63 -16 718 592 ; +C -1 ; WX 600 ; N afii10038 ; B 81 0 644 592 ; +C -1 ; WX 600 ; N afii10039 ; B 21 0 697 592 ; +C -1 ; WX 600 ; N afii10040 ; B 32 -130 679 592 ; +C -1 ; WX 600 ; N afii10041 ; B 116 0 676 592 ; +C -1 ; WX 600 ; N afii10042 ; B 4 0 718 592 ; +C -1 ; WX 600 ; N afii10043 ; B 4 -130 718 592 ; +C -1 ; WX 600 ; N afii10044 ; B 44 0 652 592 ; +C -1 ; WX 600 ; N afii10045 ; B -3 0 696 592 ; +C -1 ; WX 600 ; N afii10046 ; B 33 0 619 592 ; +C -1 ; WX 600 ; N afii10047 ; B 39 -15 615 636 ; +C -1 ; WX 600 ; N afii10048 ; B -6 -15 695 607 ; +C -1 ; WX 600 ; N afii10049 ; B 32 0 656 592 ; +C -1 ; WX 600 ; N afii10065 ; B 66 -16 585 457 ; +C -1 ; WX 600 ; N afii10066 ; B 92 -15 620 666 ; +C -1 ; WX 600 ; N afii10067 ; B 28 0 614 443 ; +C -1 ; WX 600 ; N afii10068 ; B 39 0 656 443 ; +C -1 ; WX 600 ; N afii10069 ; B 14 -120 636 443 ; +C -1 ; WX 600 ; N afii10070 ; B 74 -16 602 457 ; +C -1 ; WX 600 ; N afii10072 ; B 17 0 655 443 ; +C -1 ; WX 600 ; N afii10073 ; B 48 -13 588 482 ; +C -1 ; WX 600 ; N afii10074 ; B 40 0 654 443 ; +C -1 ; WX 600 ; N afii10075 ; B 40 0 654 648 ; +C -1 ; WX 600 ; N afii10076 ; B 61 0 620 443 ; +C -1 ; WX 600 ; N afii10077 ; B 32 -13 635 443 ; +C -1 ; WX 600 ; N afii10078 ; B 4 0 685 443 ; +C -1 ; WX 600 ; N afii10079 ; B 14 0 649 443 ; +C -1 ; WX 600 ; N afii10080 ; B 83 -16 610 457 ; +C -1 ; WX 600 ; N afii10081 ; B 19 0 633 443 ; +C -1 ; WX 600 ; N afii10082 ; B -43 -209 626 457 ; +C -1 ; WX 600 ; N afii10083 ; B 95 -17 627 457 ; +C -1 ; WX 600 ; N afii10084 ; B 76 0 640 443 ; +C -1 ; WX 600 ; N afii10085 ; B 46 -134 666 443 ; +C -1 ; WX 600 ; N afii10086 ; B 87 -140 610 617 ; +C -1 ; WX 600 ; N afii10087 ; B 31 0 645 443 ; +C -1 ; WX 600 ; N afii10088 ; B 42 -119 664 443 ; +C -1 ; WX 600 ; N afii10089 ; B 102 0 633 443 ; +C -1 ; WX 600 ; N afii10090 ; B 4 0 688 443 ; +C -1 ; WX 600 ; N afii10091 ; B 4 -118 688 443 ; +C -1 ; WX 600 ; N afii10092 ; B 54 0 585 443 ; +C -1 ; WX 600 ; N afii10093 ; B -1 0 680 443 ; +C -1 ; WX 600 ; N afii10094 ; B 28 0 589 443 ; +C -1 ; WX 600 ; N afii10095 ; B 33 -16 596 483 ; +C -1 ; WX 600 ; N afii10096 ; B 23 -17 669 457 ; +C -1 ; WX 600 ; N afii10097 ; B 28 0 642 443 ; +C -1 ; WX 600 ; N afii10071 ; B 74 -16 602 622 ; +C -1 ; WX 600 ; N afii10099 ; B 33 -209 577 633 ; +C -1 ; WX 600 ; N afii10100 ; B 39 0 656 661 ; +C -1 ; WX 600 ; N afii10101 ; B 95 -16 627 457 ; +C -1 ; WX 600 ; N afii10102 ; B 83 -16 592 457 ; +C -1 ; WX 600 ; N afii10103 ; B 72 0 549 633 ; +C -1 ; WX 600 ; N afii10104 ; B 72 0 549 622 ; +C -1 ; WX 600 ; N afii10105 ; B 51 -209 554 633 ; +C -1 ; WX 600 ; N afii10106 ; B 0 -13 624 443 ; +C -1 ; WX 600 ; N afii10107 ; B 28 0 636 443 ; +C -1 ; WX 600 ; N afii10108 ; B 33 0 596 633 ; +C -1 ; WX 600 ; N afii10110 ; B 46 -134 666 648 ; +C -1 ; WX 600 ; N afii10193 ; B 38 -118 673 443 ; +C -1 ; WX 600 ; N afii10050 ; B 31 0 690 714 ; +C -1 ; WX 600 ; N afii10098 ; B 39 0 637 566 ; +C -1 ; WX 600 ; N afii00208 ; B 99 233 620 333 ; +C -1 ; WX 600 ; N afii61352 ; B 25 0 682 592 ; +C -1 ; WX 600 ; N pi ; B 62 0 640 443 ; +C -1 ; WX 600 ; N sheva ; B 216 -261 310 -82 ; +C -1 ; WX 600 ; N hatafsegol ; B 136 -261 416 -82 ; +C -1 ; WX 600 ; N hatafpatah ; B 137 -261 408 -82 ; +C -1 ; WX 600 ; N hatafqamats ; B 137 -261 408 -82 ; +C -1 ; WX 600 ; N hiriq ; B 242 -147 310 -83 ; +C -1 ; WX 600 ; N tsere ; B 188 -147 362 -83 ; +C -1 ; WX 600 ; N segol ; B 188 -261 362 -83 ; +C -1 ; WX 600 ; N patah ; B 176 -130 378 -83 ; +C -1 ; WX 600 ; N qamats ; B 176 -215 378 -83 ; +C -1 ; WX 600 ; N holam ; B 399 592 466 657 ; +C -1 ; WX 600 ; N qubuts ; B 136 -261 391 -82 ; +C -1 ; WX 600 ; N dagesh ; B 324 238 391 303 ; +C -1 ; WX 600 ; N meteg ; B 225 -261 302 -82 ; +C -1 ; WX 600 ; N maqaf ; B 143 410 652 510 ; +C -1 ; WX 600 ; N rafe ; B 329 592 532 640 ; +C -1 ; WX 600 ; N paseq ; B 259 -5 449 515 ; +C -1 ; WX 600 ; N shindot ; B 577 592 644 657 ; +C -1 ; WX 600 ; N sindot ; B 222 592 289 657 ; +C -1 ; WX 600 ; N sofpasuq ; B 236 -5 470 483 ; +C -1 ; WX 600 ; N alef ; B 70 -11 639 518 ; +C -1 ; WX 600 ; N bet ; B 55 0 555 510 ; +C -1 ; WX 600 ; N gimel ; B 110 -8 474 510 ; +C -1 ; WX 600 ; N dalet ; B 136 -5 646 510 ; +C -1 ; WX 600 ; N he ; B 85 -5 607 510 ; +C -1 ; WX 600 ; N vav ; B 250 -5 476 510 ; +C -1 ; WX 600 ; N zayin ; B 221 -5 575 510 ; +C -1 ; WX 600 ; N het ; B 134 -5 662 510 ; +C -1 ; WX 600 ; N tet ; B 112 -5 602 514 ; +C -1 ; WX 600 ; N yod ; B 248 251 483 510 ; +C -1 ; WX 600 ; N finalkaf ; B 137 -124 646 510 ; +C -1 ; WX 600 ; N kaf ; B 66 0 594 510 ; +C -1 ; WX 600 ; N lamed ; B 160 0 609 659 ; +C -1 ; WX 600 ; N finalmem ; B 100 0 594 510 ; +C -1 ; WX 600 ; N mem ; B 122 -5 603 516 ; +C -1 ; WX 600 ; N finalnun ; B 228 -124 462 510 ; +C -1 ; WX 600 ; N nun ; B 108 0 500 510 ; +C -1 ; WX 600 ; N samekh ; B 106 -6 597 510 ; +C -1 ; WX 600 ; N ayin ; B 74 0 618 510 ; +C -1 ; WX 600 ; N finalpe ; B 152 -124 575 510 ; +C -1 ; WX 600 ; N pe ; B 104 0 580 510 ; +C -1 ; WX 600 ; N finaltsadi ; B 143 -124 618 510 ; +C -1 ; WX 600 ; N tsadi ; B 152 0 617 510 ; +C -1 ; WX 600 ; N qof ; B 46 -202 635 510 ; +C -1 ; WX 600 ; N resh ; B 147 -5 569 510 ; +C -1 ; WX 600 ; N shin ; B 79 0 657 515 ; +C -1 ; WX 600 ; N tav ; B 64 -5 599 510 ; +C -1 ; WX 600 ; N doublevav ; B 137 -5 622 510 ; +C -1 ; WX 600 ; N vavyod ; B 126 -5 622 510 ; +C -1 ; WX 600 ; N doubleyod ; B 126 251 627 510 ; +C -1 ; WX 600 ; N geresh ; B 257 229 500 515 ; +C -1 ; WX 600 ; N gershayim ; B 159 229 599 515 ; +C -1 ; WX 600 ; N newsheqelsign ; B 38 -5 671 515 ; +C -1 ; WX 600 ; N vavshindot ; B 208 -5 476 657 ; +C -1 ; WX 600 ; N finalkafsheva ; B 137 -124 646 511 ; +C -1 ; WX 600 ; N finalkafqamats ; B 126 -124 646 511 ; +C -1 ; WX 600 ; N lamedholam ; B 100 0 609 659 ; +C -1 ; WX 600 ; N lamedholamdagesh ; B 100 0 609 659 ; +C -1 ; WX 600 ; N altayin ; B 74 0 618 510 ; +C -1 ; WX 600 ; N shinshindot ; B 79 0 659 657 ; +C -1 ; WX 600 ; N shinsindot ; B 79 0 658 657 ; +C -1 ; WX 600 ; N shindageshshindot ; B 79 0 664 657 ; +C -1 ; WX 600 ; N shindageshsindot ; B 79 0 658 657 ; +C -1 ; WX 600 ; N alefpatah ; B 70 -130 639 518 ; +C -1 ; WX 600 ; N alefqamats ; B 70 -215 639 518 ; +C -1 ; WX 600 ; N alefmapiq ; B 70 -11 639 518 ; +C -1 ; WX 600 ; N betdagesh ; B 55 0 556 511 ; +C -1 ; WX 600 ; N gimeldagesh ; B 110 -8 474 511 ; +C -1 ; WX 600 ; N daletdagesh ; B 136 -5 646 511 ; +C -1 ; WX 600 ; N hedagesh ; B 85 -5 608 511 ; +C -1 ; WX 600 ; N vavdagesh ; B 220 -5 476 511 ; +C -1 ; WX 600 ; N zayindagesh ; B 203 -5 575 511 ; +C -1 ; WX 600 ; N tetdagesh ; B 112 -5 602 515 ; +C -1 ; WX 600 ; N yoddagesh ; B 235 251 483 510 ; +C -1 ; WX 600 ; N finalkafdagesh ; B 137 -124 646 511 ; +C -1 ; WX 600 ; N kafdagesh ; B 66 0 594 511 ; +C -1 ; WX 600 ; N lameddagesh ; B 160 0 609 659 ; +C -1 ; WX 600 ; N memdagesh ; B 122 -5 604 516 ; +C -1 ; WX 600 ; N nundagesh ; B 108 0 500 511 ; +C -1 ; WX 600 ; N samekhdagesh ; B 106 -6 597 511 ; +C -1 ; WX 600 ; N finalpedagesh ; B 147 -124 580 510 ; +C -1 ; WX 600 ; N pedagesh ; B 100 0 585 510 ; +C -1 ; WX 600 ; N tsadidagesh ; B 152 0 618 511 ; +C -1 ; WX 600 ; N qofdagesh ; B 46 -202 636 511 ; +C -1 ; WX 600 ; N reshdagesh ; B 147 -5 570 511 ; +C -1 ; WX 600 ; N shindagesh ; B 79 0 657 515 ; +C -1 ; WX 600 ; N tavdages ; B 64 -5 599 511 ; +C -1 ; WX 600 ; N vavholam ; B 250 -5 476 657 ; +C -1 ; WX 600 ; N betrafe ; B 55 0 556 640 ; +C -1 ; WX 600 ; N kafrafe ; B 66 0 594 640 ; +C -1 ; WX 600 ; N perafe ; B 104 0 581 640 ; +C -1 ; WX 600 ; N aleflamed ; B 76 -11 645 659 ; +C -1 ; WX 600 ; N zerowidthnonjoiner ; B 283 -134 318 629 ; +C -1 ; WX 600 ; N zerowidthjoiner ; B 193 -134 407 690 ; +C -1 ; WX 600 ; N lefttorightmark ; B 172 -134 458 690 ; +C -1 ; WX 600 ; N righttoleftmark ; B 143 -134 429 690 ; +C -1 ; WX 600 ; N uniFFFC ; B 0 0 600 431 ; +C -1 ; WX 600 ; N Ohorn ; B 75 -15 742 626 ; +C -1 ; WX 600 ; N ohorn ; B 83 -16 683 467 ; +C -1 ; WX 600 ; N Uhorn ; B 111 -15 816 714 ; +C -1 ; WX 600 ; N uhorn ; B 97 -16 725 463 ; +C -1 ; WX 600 ; N f00b ; B 310 723 536 824 ; +C -1 ; WX 600 ; N f00c ; B 290 723 516 824 ; +C -1 ; WX 600 ; N f00e ; B 294 678 500 824 ; +C -1 ; WX 600 ; N f006 ; B 313 724 545 824 ; +C -1 ; WX 600 ; N f007 ; B 330 724 562 824 ; +C -1 ; WX 600 ; N f009 ; B 353 680 559 826 ; +C -1 ; WX 600 ; N combininghookabove ; B 335 645 566 776 ; +C -1 ; WX 600 ; N f010 ; B 340 737 547 824 ; +C -1 ; WX 600 ; N f013 ; B 335 693 566 824 ; +C -1 ; WX 600 ; N f011 ; B 334 737 542 824 ; +C -1 ; WX 600 ; N f01c ; B 287 698 631 824 ; +C -1 ; WX 600 ; N f015 ; B 266 724 591 824 ; +C -1 ; WX 600 ; N combiningtildeaccent ; B 269 698 613 824 ; +C -1 ; WX 600 ; N _d_767 ; B 316 624 583 706 ; +C -1 ; WX 600 ; N _d_768 ; B 291 624 559 709 ; +C -1 ; WX 600 ; N f02c ; B 437 -179 560 -58 ; +C -1 ; WX 600 ; N dongsign ; B 117 119 620 633 ; +C -1 ; WX 600 ; N onethird ; B 36 -8 667 650 ; +C -1 ; WX 600 ; N twothirds ; B 14 -8 667 648 ; +C -1 ; WX 600 ; N f008 ; B 277 498 483 644 ; +C -1 ; WX 600 ; N f00a ; B 292 498 498 644 ; +C -1 ; WX 600 ; N f00d ; B 303 498 509 644 ; +C -1 ; WX 600 ; N f00f ; B 303 498 509 644 ; +C -1 ; WX 600 ; N f012 ; B 299 500 531 631 ; +C -1 ; WX 600 ; N f014 ; B 299 500 531 631 ; +C -1 ; WX 600 ; N f016 ; B 277 698 622 824 ; +C -1 ; WX 600 ; N f017 ; B 287 698 631 824 ; +C -1 ; WX 600 ; N f018 ; B 287 698 631 824 ; +C -1 ; WX 600 ; N f019 ; B 240 489 579 610 ; +C -1 ; WX 600 ; N f01a ; B 240 489 579 610 ; +C -1 ; WX 600 ; N f01b ; B 240 489 579 610 ; +C -1 ; WX 600 ; N f01e ; B 212 -179 335 -58 ; +C -1 ; WX 600 ; N f01f ; B 212 -179 335 -58 ; +C -1 ; WX 600 ; N f020 ; B 212 -179 335 -58 ; +C -1 ; WX 600 ; N f021 ; B 212 -179 335 -58 ; +C -1 ; WX 600 ; N f022 ; B 212 -179 335 -58 ; +C -1 ; WX 600 ; N combininggraveaccent ; B 313 678 520 824 ; +C -1 ; WX 600 ; N combiningacuteaccent ; B 340 680 546 826 ; +C -1 ; WX 600 ; N f01d ; B 240 489 579 610 ; +C -1 ; WX 600 ; N combiningdotbelow ; B 212 -179 335 -58 ; +C -1 ; WX 600 ; N f023 ; B 212 -179 335 -58 ; +C -1 ; WX 600 ; N f029 ; B 212 -179 335 -58 ; +C -1 ; WX 600 ; N f02a ; B 212 -179 335 -58 ; +C -1 ; WX 600 ; N f02b ; B 212 -179 335 -58 ; +C -1 ; WX 600 ; N f024 ; B 212 -179 335 -58 ; +C -1 ; WX 600 ; N f025 ; B 212 -179 335 -58 ; +C -1 ; WX 600 ; N f026 ; B 212 -179 335 -58 ; +C -1 ; WX 600 ; N f027 ; B 212 -179 335 -58 ; +C -1 ; WX 600 ; N f028 ; B 212 -179 335 -58 ; +C -1 ; WX 600 ; N f02d ; B 286 724 610 824 ; +C -1 ; WX 600 ; N f02e ; B 267 698 612 824 ; +C -1 ; WX 600 ; N f02f ; B 315 724 640 824 ; +C -1 ; WX 600 ; N f030 ; B 287 698 631 824 ; +C -1 ; WX 600 ; N Adotbelow ; B -13 -179 635 592 ; +C -1 ; WX 600 ; N adotbelow ; B 66 -179 585 457 ; +C -1 ; WX 600 ; N Ahookabove ; B -13 0 635 776 ; +C -1 ; WX 600 ; N ahookabove ; B 66 -16 585 631 ; +C -1 ; WX 600 ; N Acircumflexacute ; B -13 0 635 824 ; +C -1 ; WX 600 ; N acircumflexacute ; B 66 -16 585 826 ; +C -1 ; WX 600 ; N Acircumflexgrave ; B -13 0 635 824 ; +C -1 ; WX 600 ; N acircumflexgrave ; B 66 -16 585 824 ; +C -1 ; WX 600 ; N Acircumflexhookabove ; B -13 0 635 824 ; +C -1 ; WX 600 ; N acircumflexhookabove ; B 66 -16 585 824 ; +C -1 ; WX 600 ; N Acircumflextilde ; B -13 0 635 824 ; +C -1 ; WX 600 ; N acircumflextilde ; B 66 -16 631 824 ; +C -1 ; WX 600 ; N Acircumflexdotbelow ; B -13 -179 635 709 ; +C -1 ; WX 600 ; N acircumflexdotbelow ; B 66 -179 585 649 ; +C -1 ; WX 600 ; N Abreveacute ; B -13 0 635 824 ; +C -1 ; WX 600 ; N abreveacute ; B 66 -16 600 826 ; +C -1 ; WX 600 ; N Abrevegrave ; B -13 0 635 824 ; +C -1 ; WX 600 ; N abrevegrave ; B 66 -16 600 824 ; +C -1 ; WX 600 ; N Abrevehookabove ; B -13 0 635 824 ; +C -1 ; WX 600 ; N abrevehookabove ; B 66 -16 600 824 ; +C -1 ; WX 600 ; N Abrevetilde ; B -13 0 635 824 ; +C -1 ; WX 600 ; N abrevetilde ; B 66 -16 631 824 ; +C -1 ; WX 600 ; N Abrevedotbelow ; B -13 -179 635 706 ; +C -1 ; WX 600 ; N abrevedotbelow ; B 66 -179 600 648 ; +C -1 ; WX 600 ; N Edotbelow ; B 24 -179 657 592 ; +C -1 ; WX 600 ; N edotbelow ; B 74 -179 602 457 ; +C -1 ; WX 600 ; N Ehookabove ; B 24 0 657 776 ; +C -1 ; WX 600 ; N ehookabove ; B 74 -16 602 631 ; +C -1 ; WX 600 ; N Etilde ; B 24 0 657 766 ; +C -1 ; WX 600 ; N etilde ; B 74 -16 602 610 ; +C -1 ; WX 600 ; N Ecircumflexacute ; B 24 0 657 824 ; +C -1 ; WX 600 ; N ecircumflexacute ; B 74 -16 602 826 ; +C -1 ; WX 600 ; N Ecircumflexgrave ; B 24 0 657 824 ; +C -1 ; WX 600 ; N ecircumflexgrave ; B 74 -16 602 824 ; +C -1 ; WX 600 ; N Ecircumflexhookabove ; B 24 0 657 824 ; +C -1 ; WX 600 ; N ecircumflexhookabove ; B 74 -16 602 824 ; +C -1 ; WX 600 ; N Ecircumflextilde ; B 24 0 657 824 ; +C -1 ; WX 600 ; N ecircumflextilde ; B 74 -16 631 824 ; +C -1 ; WX 600 ; N Ecircumflexdotbelow ; B 24 -179 657 709 ; +C -1 ; WX 600 ; N ecircumflexdotbelow ; B 74 -179 602 649 ; +C -1 ; WX 600 ; N Ihookabove ; B 92 0 634 776 ; +C -1 ; WX 600 ; N ihookabove ; B 72 0 549 631 ; +C -1 ; WX 600 ; N Idotbelow ; B 92 -179 634 592 ; +C -1 ; WX 600 ; N idotbelow ; B 72 -179 549 633 ; +C -1 ; WX 600 ; N Odotbelow ; B 75 -179 652 607 ; +C -1 ; WX 600 ; N odotbelow ; B 83 -179 610 457 ; +C -1 ; WX 600 ; N Ohookabove ; B 75 -15 652 776 ; +C -1 ; WX 600 ; N ohookabove ; B 83 -16 610 631 ; +C -1 ; WX 600 ; N Ocircumflexacute ; B 75 -15 652 824 ; +C -1 ; WX 600 ; N ocircumflexacute ; B 83 -16 610 826 ; +C -1 ; WX 600 ; N Ocircumflexgrave ; B 75 -15 652 824 ; +C -1 ; WX 600 ; N ocircumflexgrave ; B 83 -16 610 824 ; +C -1 ; WX 600 ; N Ocircumflexhookabove ; B 75 -15 652 824 ; +C -1 ; WX 600 ; N ocircumflexhookabove ; B 83 -16 610 824 ; +C -1 ; WX 600 ; N Ocircumflextilde ; B 75 -15 652 824 ; +C -1 ; WX 600 ; N ocircumflextilde ; B 83 -16 631 824 ; +C -1 ; WX 600 ; N Ocircumflexdotbelow ; B 75 -179 652 709 ; +C -1 ; WX 600 ; N ocircumflexdotbelow ; B 83 -179 610 649 ; +C -1 ; WX 600 ; N Ohornacute ; B 75 -15 742 816 ; +C -1 ; WX 600 ; N ohornacute ; B 83 -16 683 661 ; +C -1 ; WX 600 ; N Ohorngrave ; B 75 -15 742 818 ; +C -1 ; WX 600 ; N ohorngrave ; B 83 -16 683 662 ; +C -1 ; WX 600 ; N Ohornhookabove ; B 75 -15 742 776 ; +C -1 ; WX 600 ; N ohornhookabove ; B 83 -16 683 631 ; +C -1 ; WX 600 ; N Ohorntilde ; B 75 -15 742 766 ; +C -1 ; WX 600 ; N ohorntilde ; B 83 -16 683 610 ; +C -1 ; WX 600 ; N Ohorndotbelow ; B 75 -179 742 626 ; +C -1 ; WX 600 ; N ohorndotbelow ; B 83 -179 683 467 ; +C -1 ; WX 600 ; N Udotbelow ; B 111 -179 707 592 ; +C -1 ; WX 600 ; N udotbelow ; B 97 -179 606 443 ; +C -1 ; WX 600 ; N Uhookabove ; B 111 -15 707 776 ; +C -1 ; WX 600 ; N uhookabove ; B 97 -16 606 631 ; +C -1 ; WX 600 ; N Uhornacute ; B 111 -15 816 816 ; +C -1 ; WX 600 ; N uhornacute ; B 97 -16 725 661 ; +C -1 ; WX 600 ; N Uhorngrave ; B 111 -15 816 818 ; +C -1 ; WX 600 ; N uhorngrave ; B 97 -16 725 662 ; +C -1 ; WX 600 ; N Uhornhookabove ; B 111 -15 816 776 ; +C -1 ; WX 600 ; N uhornhookabove ; B 97 -16 725 631 ; +C -1 ; WX 600 ; N Uhorntilde ; B 111 -15 816 766 ; +C -1 ; WX 600 ; N uhorntilde ; B 97 -16 725 610 ; +C -1 ; WX 600 ; N Uhorndotbelow ; B 111 -179 816 714 ; +C -1 ; WX 600 ; N uhorndotbelow ; B 97 -179 725 463 ; +C -1 ; WX 600 ; N Ydotbelow ; B 126 -179 697 592 ; +C -1 ; WX 600 ; N ydotbelow ; B -14 -209 667 443 ; +C -1 ; WX 600 ; N Yhookabove ; B 126 0 697 776 ; +C -1 ; WX 600 ; N yhookabove ; B -14 -209 667 631 ; +C -1 ; WX 600 ; N Ytilde ; B 126 0 697 766 ; +C -1 ; WX 600 ; N ytilde ; B -14 -209 667 610 ; +C -1 ; WX 600 ; N uni01CD ; B -13 0 635 801 ; +C -1 ; WX 600 ; N uni01CE ; B 66 -16 585 645 ; +C -1 ; WX 600 ; N uni01CF ; B 92 0 634 801 ; +C -1 ; WX 600 ; N uni01D0 ; B 72 0 565 645 ; +C -1 ; WX 600 ; N uni01D1 ; B 75 -15 652 801 ; +C -1 ; WX 600 ; N uni01D2 ; B 83 -16 610 645 ; +C -1 ; WX 600 ; N uni01D3 ; B 111 -15 707 801 ; +C -1 ; WX 600 ; N uni01D4 ; B 97 -16 606 645 ; +C -1 ; WX 600 ; N uni01D5 ; B 111 -15 707 824 ; +C -1 ; WX 600 ; N uni01D6 ; B 97 -16 606 740 ; +C -1 ; WX 600 ; N uni01D7 ; B 111 -15 707 824 ; +C -1 ; WX 600 ; N uni01D8 ; B 97 -16 606 802 ; +C -1 ; WX 600 ; N uni01D9 ; B 111 -15 707 824 ; +C -1 ; WX 600 ; N uni01DA ; B 97 -16 606 787 ; +C -1 ; WX 600 ; N uni01DB ; B 111 -15 707 824 ; +C -1 ; WX 600 ; N uni01DC ; B 97 -16 606 817 ; +C -1 ; WX 600 ; N _d_911 ; B 263 646 624 824 ; +C -1 ; WX 600 ; N _d_912 ; B 253 646 629 824 ; +C -1 ; WX 600 ; N _d_913 ; B 253 646 629 824 ; +C -1 ; WX 600 ; N _d_914 ; B 253 646 629 824 ; +C -1 ; WX 600 ; N _d_915 ; B 233 521 544 622 ; +C -1 ; WX 600 ; N uni0492 ; B 54 0 703 592 ; +C -1 ; WX 600 ; N uni0493 ; B 39 0 656 443 ; +C -1 ; WX 600 ; N uni0496 ; B 5 -130 705 592 ; +C -1 ; WX 600 ; N uni0497 ; B 17 -119 655 443 ; +C -1 ; WX 600 ; N uni049a ; B 48 -130 671 592 ; +C -1 ; WX 600 ; N uni049b ; B 61 -119 620 443 ; +C -1 ; WX 600 ; N uni049c ; B 33 0 676 592 ; +C -1 ; WX 600 ; N uni049d ; B 61 0 620 443 ; +C -1 ; WX 600 ; N uni04a2 ; B 31 -130 679 592 ; +C -1 ; WX 600 ; N uni04a3 ; B 14 -119 649 443 ; +C -1 ; WX 600 ; N uni04ae ; B 126 0 697 592 ; +C -1 ; WX 600 ; N uni04af ; B 86 -209 667 443 ; +C -1 ; WX 600 ; N uni04b0 ; B 135 0 697 589 ; +C -1 ; WX 600 ; N uni04b1 ; B 86 -209 667 443 ; +C -1 ; WX 600 ; N uni04b2 ; B 21 -130 697 592 ; +C -1 ; WX 600 ; N uni04b3 ; B 31 -119 645 443 ; +C -1 ; WX 600 ; N uni04b8 ; B 116 0 676 592 ; +C -1 ; WX 600 ; N uni04b9 ; B 102 0 633 443 ; +C -1 ; WX 600 ; N uni04ba ; B 31 0 591 592 ; +C -1 ; WX 600 ; N uni04bb ; B 34 0 565 443 ; +C -1 ; WX 600 ; N uni018f ; B 80 -15 615 636 ; +C -1 ; WX 600 ; N uni0259 ; B 74 -16 602 457 ; +C -1 ; WX 600 ; N uni04e8 ; B 75 -15 652 607 ; +C -1 ; WX 600 ; N uni04e9 ; B 83 -16 610 457 ; +EndCharMetrics +EndFontMetrics diff --git a/gulliver/thirdparty/html2ps_pdf/fonts/courbi.ttf b/thirdparty/html2ps_pdf/fonts/courbi.ttf similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/fonts/courbi.ttf rename to thirdparty/html2ps_pdf/fonts/courbi.ttf diff --git a/gulliver/thirdparty/html2ps_pdf/fonts/couri.afm b/thirdparty/html2ps_pdf/fonts/couri.afm similarity index 97% rename from gulliver/thirdparty/html2ps_pdf/fonts/couri.afm rename to thirdparty/html2ps_pdf/fonts/couri.afm index 324cf2260..becb3ec62 100644 --- a/gulliver/thirdparty/html2ps_pdf/fonts/couri.afm +++ b/thirdparty/html2ps_pdf/fonts/couri.afm @@ -1,997 +1,997 @@ -StartFontMetrics 4.1 -FontName CourierNewPS-ItalicMT -FullName Courier New Italic -Notice Typeface The Monotype Corporation plc. Data The Monotype Corporation plc/Type Solutions Inc. 1990-1992. All Rights Reserved -EncodingScheme FontSpecific -FamilyName Courier New -Weight Italic -Version Version 2.90 -Characters 943 -ItalicAngle -12.0 -Ascender 833 -Descender -300 -UnderlineThickness 41 -UnderlinePosition -233 -IsFixedPitch true -FontBBox -67 -274 800 1000 -StartCharMetrics 978 -C 0 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 1 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 2 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 3 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 4 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 5 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 6 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 7 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 8 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 9 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 10 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 11 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 12 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 13 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 14 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 15 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 16 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 17 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 18 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 19 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 20 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 21 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 22 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 23 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 24 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 25 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 26 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 27 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 28 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 29 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 30 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 31 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 32 ; WX 600 ; N space ; B 247 -15 466 627 ; -C 33 ; WX 600 ; N exclam ; B 247 -15 466 627 ; -C 34 ; WX 600 ; N quotedbl ; B 242 320 602 613 ; -C 35 ; WX 600 ; N numbersign ; B 136 -63 590 657 ; -C 36 ; WX 600 ; N dollar ; B 129 -93 584 665 ; -C 37 ; WX 600 ; N percent ; B 172 -12 618 623 ; -C 38 ; WX 600 ; N ampersand ; B 152 -16 550 526 ; -C 39 ; WX 600 ; N quotesingle ; B 345 320 495 613 ; -C 40 ; WX 600 ; N parenleft ; B 336 -126 587 613 ; -C 41 ; WX 600 ; N parenright ; B 124 -127 374 613 ; -C 42 ; WX 600 ; N asterisk ; B 210 253 586 613 ; -C 43 ; WX 600 ; N plus ; B 130 33 591 538 ; -C 44 ; WX 600 ; N comma ; B 179 -146 442 147 ; -C 45 ; WX 600 ; N hyphen ; B 145 253 576 312 ; -C 46 ; WX 600 ; N period ; B 234 -15 388 118 ; -C 47 ; WX 600 ; N slash ; B 99 -83 630 678 ; -C 48 ; WX 600 ; N zero ; B 156 -15 574 627 ; -C 49 ; WX 600 ; N one ; B 115 0 493 621 ; -C 50 ; WX 600 ; N two ; B 83 0 579 627 ; -C 51 ; WX 600 ; N three ; B 110 -15 582 627 ; -C 52 ; WX 600 ; N four ; B 141 0 548 613 ; -C 53 ; WX 600 ; N five ; B 113 -15 586 613 ; -C 54 ; WX 600 ; N six ; B 187 -15 637 627 ; -C 55 ; WX 600 ; N seven ; B 215 -1 610 613 ; -C 56 ; WX 600 ; N eight ; B 144 -15 578 627 ; -C 57 ; WX 600 ; N nine ; B 140 -15 589 627 ; -C 58 ; WX 600 ; N colon ; B 234 -15 452 423 ; -C 59 ; WX 600 ; N semicolon ; B 185 -104 502 423 ; -C 60 ; WX 600 ; N less ; B 108 32 638 538 ; -C 61 ; WX 600 ; N equal ; B 94 192 628 381 ; -C 62 ; WX 600 ; N greater ; B 83 32 613 538 ; -C 63 ; WX 600 ; N question ; B 232 -15 582 586 ; -C 64 ; WX 600 ; N at ; B 139 -63 564 633 ; -C 65 ; WX 600 ; N A ; B 33 0 619 571 ; -C 66 ; WX 600 ; N B ; B 46 0 593 571 ; -C 67 ; WX 600 ; N C ; B 114 -16 645 584 ; -C 68 ; WX 600 ; N D ; B 75 0 625 571 ; -C 69 ; WX 600 ; N E ; B 47 0 623 571 ; -C 70 ; WX 600 ; N F ; B 91 0 687 571 ; -C 71 ; WX 600 ; N G ; B 108 -16 640 584 ; -C 72 ; WX 600 ; N H ; B 57 0 672 572 ; -C 73 ; WX 600 ; N I ; B 116 0 606 571 ; -C 74 ; WX 600 ; N J ; B 100 -16 703 571 ; -C 75 ; WX 600 ; N K ; B 68 0 691 571 ; -C 76 ; WX 600 ; N L ; B 66 0 588 571 ; -C 77 ; WX 600 ; N M ; B 16 0 702 571 ; -C 78 ; WX 600 ; N N ; B 47 0 681 571 ; -C 79 ; WX 600 ; N O ; B 103 -16 619 584 ; -C 80 ; WX 600 ; N P ; B 106 0 648 571 ; -C 81 ; WX 600 ; N Q ; B 103 -117 619 584 ; -C 82 ; WX 600 ; N R ; B 47 0 598 571 ; -C 83 ; WX 600 ; N S ; B 95 -16 605 584 ; -C 84 ; WX 600 ; N T ; B 149 0 651 571 ; -C 85 ; WX 600 ; N U ; B 137 -16 678 571 ; -C 86 ; WX 600 ; N V ; B 125 0 710 571 ; -C 87 ; WX 600 ; N W ; B 121 0 698 571 ; -C 88 ; WX 600 ; N X ; B 43 0 667 571 ; -C 89 ; WX 600 ; N Y ; B 150 0 668 571 ; -C 90 ; WX 600 ; N Z ; B 104 0 598 571 ; -C 91 ; WX 600 ; N bracketleft ; B 253 -126 574 613 ; -C 92 ; WX 600 ; N backslash ; B 250 -85 475 675 ; -C 93 ; WX 600 ; N bracketright ; B 131 -126 453 613 ; -C 94 ; WX 600 ; N asciicircum ; B 192 359 570 625 ; -C 95 ; WX 600 ; N underscore ; B -67 -274 561 -233 ; -C 96 ; WX 600 ; N grave ; B 282 499 427 649 ; -C 97 ; WX 600 ; N a ; B 92 -16 547 438 ; -C 98 ; WX 600 ; N b ; B 26 -16 593 613 ; -C 99 ; WX 600 ; N c ; B 122 -16 598 438 ; -C 100 ; WX 600 ; N d ; B 101 -16 631 613 ; -C 101 ; WX 600 ; N e ; B 104 -16 573 438 ; -C 102 ; WX 600 ; N f ; B 109 0 667 613 ; -C 103 ; WX 600 ; N g ; B 104 -188 648 438 ; -C 104 ; WX 600 ; N h ; B 55 0 559 613 ; -C 105 ; WX 600 ; N i ; B 96 0 515 633 ; -C 106 ; WX 600 ; N j ; B 52 -188 493 633 ; -C 107 ; WX 600 ; N k ; B 68 0 586 613 ; -C 108 ; WX 600 ; N l ; B 96 0 515 613 ; -C 109 ; WX 600 ; N m ; B 14 0 604 438 ; -C 110 ; WX 600 ; N n ; B 57 0 547 438 ; -C 111 ; WX 600 ; N o ; B 111 -16 579 438 ; -C 112 ; WX 600 ; N p ; B -14 -188 595 438 ; -C 113 ; WX 600 ; N q ; B 105 -188 669 438 ; -C 114 ; WX 600 ; N r ; B 87 0 623 433 ; -C 115 ; WX 600 ; N s ; B 105 -16 563 438 ; -C 116 ; WX 600 ; N t ; B 158 -16 554 571 ; -C 117 ; WX 600 ; N u ; B 129 -16 571 423 ; -C 118 ; WX 600 ; N v ; B 114 0 657 423 ; -C 119 ; WX 600 ; N w ; B 113 0 658 423 ; -C 120 ; WX 600 ; N x ; B 53 0 616 423 ; -C 121 ; WX 600 ; N y ; B 15 -188 636 423 ; -C 122 ; WX 600 ; N z ; B 116 0 569 423 ; -C 123 ; WX 600 ; N braceleft ; B 249 -127 529 613 ; -C 124 ; WX 600 ; N bar ; B 279 -126 321 613 ; -C 125 ; WX 600 ; N braceright ; B 174 -127 455 613 ; -C 126 ; WX 600 ; N asciitilde ; B 147 211 575 359 ; -C 127 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 128 ; WX 600 ; N Euro ; B 17 -16 634 584 ; -C 129 ; WX 600 ; N afii10052 ; B 47 0 671 796 ; -C 130 ; WX 600 ; N quotesinglbase ; B 118 -159 381 135 ; -C 131 ; WX 600 ; N florin ; B 74 -94 646 628 ; -C 132 ; WX 600 ; N quotedblbase ; B 87 -127 542 125 ; -C 133 ; WX 600 ; N ellipsis ; B 56 -15 559 85 ; -C 134 ; WX 600 ; N dagger ; B 208 -63 563 613 ; -C 135 ; WX 600 ; N daggerdbl ; B 154 -63 563 613 ; -C 136 ; WX 600 ; N circumflex ; B 260 498 552 640 ; -C 137 ; WX 600 ; N perthousand ; B 138 -10 598 625 ; -C 138 ; WX 600 ; N Scaron ; B 95 -16 614 778 ; -C 139 ; WX 600 ; N guilsinglleft ; B 191 0 493 424 ; -C 140 ; WX 600 ; N OE ; B 61 0 693 571 ; -C 141 ; WX 600 ; N afii10061 ; B 69 0 665 796 ; -C 142 ; WX 600 ; N Zcaron ; B 104 0 615 778 ; -C 143 ; WX 600 ; N afii10145 ; B 58 -125 679 571 ; -C 144 ; WX 600 ; N quotedblbase ; B 87 -127 542 125 ; -C 145 ; WX 600 ; N quoteleft ; B 378 319 530 613 ; -C 146 ; WX 600 ; N quoteright ; B 216 319 479 613 ; -C 147 ; WX 600 ; N quotedblleft ; B 218 360 575 613 ; -C 148 ; WX 600 ; N quotedblright ; B 188 360 643 613 ; -C 149 ; WX 600 ; N bullet ; B 243 190 489 432 ; -C 150 ; WX 600 ; N endash ; B 131 265 591 306 ; -C 151 ; WX 600 ; N emdash ; B 54 266 669 307 ; -C 152 ; WX 600 ; N tilde ; B 251 489 568 589 ; -C 153 ; WX 600 ; N trademark ; B 68 308 702 651 ; -C 154 ; WX 600 ; N scaron ; B 105 -16 572 634 ; -C 155 ; WX 600 ; N guilsinglright ; B 201 0 503 424 ; -C 156 ; WX 600 ; N oe ; B 47 -16 635 438 ; -C 157 ; WX 600 ; N afii10109 ; B 67 0 620 649 ; -C 158 ; WX 600 ; N zcaron ; B 116 0 572 634 ; -C 159 ; WX 600 ; N Ydieresis ; B 150 0 668 730 ; -C 160 ; WX 600 ; N space ; B 247 -15 466 627 ; -C 161 ; WX 600 ; N exclamdown ; B 227 -190 441 429 ; -C 162 ; WX 600 ; N cent ; B 174 0 566 652 ; -C 163 ; WX 600 ; N sterling ; B 87 0 543 587 ; -C 164 ; WX 600 ; N currency ; B 125 97 601 496 ; -C 165 ; WX 600 ; N yen ; B 161 0 668 571 ; -C 166 ; WX 600 ; N brokenbar ; B 279 -126 321 613 ; -C 167 ; WX 600 ; N section ; B 100 -63 617 613 ; -C 168 ; WX 600 ; N dieresis ; B 270 521 560 600 ; -C 169 ; WX 600 ; N copyright ; B 60 -13 657 584 ; -C 170 ; WX 600 ; N ordfeminine ; B 155 355 464 640 ; -C 171 ; WX 600 ; N guillemotleft ; B 93 0 624 424 ; -C 172 ; WX 600 ; N logicalnot ; B 72 33 599 306 ; -C 173 ; WX 600 ; N hyphen ; B 145 253 576 312 ; -C 174 ; WX 600 ; N registered ; B 60 -13 657 584 ; -C 175 ; WX 600 ; N overscore ; B 121 672 749 713 ; -C 176 ; WX 600 ; N degree ; B 165 457 436 728 ; -C 177 ; WX 600 ; N plusminus ; B 72 0 591 585 ; -C 178 ; WX 600 ; N twosuperior ; B 165 301 470 627 ; -C 179 ; WX 600 ; N threesuperior ; B 181 293 471 627 ; -C 180 ; WX 600 ; N acute ; B 385 499 576 649 ; -C 181 ; WX 600 ; N mu1 ; B 91 -188 571 423 ; -C 182 ; WX 600 ; N paragraph ; B 156 -63 646 613 ; -C 183 ; WX 600 ; N periodcentered ; B 290 245 442 377 ; -C 184 ; WX 600 ; N cedilla ; B 188 -163 351 15 ; -C 185 ; WX 600 ; N onesuperior ; B 185 301 420 626 ; -C 186 ; WX 600 ; N ordmasculine ; B 169 355 487 640 ; -C 187 ; WX 600 ; N guillemotright ; B 90 0 621 424 ; -C 188 ; WX 600 ; N onequarter ; B 54 0 632 626 ; -C 189 ; WX 600 ; N onehalf ; B 59 0 650 626 ; -C 190 ; WX 600 ; N threequarters ; B 57 0 661 627 ; -C 191 ; WX 600 ; N questiondown ; B 104 -191 455 433 ; -C 192 ; WX 600 ; N Agrave ; B 12 0 598 779 ; -C 193 ; WX 600 ; N Aacute ; B 12 0 598 779 ; -C 194 ; WX 600 ; N Acircumflex ; B 12 0 598 771 ; -C 195 ; WX 600 ; N Atilde ; B 12 0 598 720 ; -C 196 ; WX 600 ; N Adieresis ; B 12 0 598 730 ; -C 197 ; WX 600 ; N Aring ; B 33 0 619 783 ; -C 198 ; WX 600 ; N AE ; B 13 0 693 571 ; -C 199 ; WX 600 ; N Ccedilla ; B 114 -163 645 584 ; -C 200 ; WX 600 ; N Egrave ; B 47 0 623 779 ; -C 201 ; WX 600 ; N Eacute ; B 47 0 623 779 ; -C 202 ; WX 600 ; N Ecircumflex ; B 47 0 623 770 ; -C 203 ; WX 600 ; N Edieresis ; B 47 0 623 730 ; -C 204 ; WX 600 ; N Igrave ; B 116 0 606 779 ; -C 205 ; WX 600 ; N Iacute ; B 116 0 609 779 ; -C 206 ; WX 600 ; N Icircumflex ; B 116 0 606 770 ; -C 207 ; WX 600 ; N Idieresis ; B 116 0 606 730 ; -C 208 ; WX 600 ; N Eth ; B 46 0 596 571 ; -C 209 ; WX 600 ; N Ntilde ; B 47 0 681 733 ; -C 210 ; WX 600 ; N Ograve ; B 103 -16 619 779 ; -C 211 ; WX 600 ; N Oacute ; B 103 -16 619 779 ; -C 212 ; WX 600 ; N Ocircumflex ; B 103 -16 619 770 ; -C 213 ; WX 600 ; N Otilde ; B 103 -16 619 720 ; -C 214 ; WX 600 ; N Odieresis ; B 103 -16 619 730 ; -C 215 ; WX 600 ; N multiply ; B 208 116 572 454 ; -C 216 ; WX 600 ; N Oslash ; B 34 -41 687 611 ; -C 217 ; WX 600 ; N Ugrave ; B 137 -16 678 779 ; -C 218 ; WX 600 ; N Uacute ; B 137 -16 678 779 ; -C 219 ; WX 600 ; N Ucircumflex ; B 137 -16 678 770 ; -C 220 ; WX 600 ; N Udieresis ; B 137 -16 678 730 ; -C 221 ; WX 600 ; N Yacute ; B 150 0 668 792 ; -C 222 ; WX 600 ; N Thorn ; B 91 0 609 571 ; -C 223 ; WX 600 ; N germandbls ; B 47 -16 543 613 ; -C 224 ; WX 600 ; N agrave ; B 92 -16 547 648 ; -C 225 ; WX 600 ; N aacute ; B 92 -16 559 649 ; -C 226 ; WX 600 ; N acircumflex ; B 92 -16 552 640 ; -C 227 ; WX 600 ; N atilde ; B 92 -16 569 589 ; -C 228 ; WX 600 ; N adieresis ; B 92 -16 547 600 ; -C 229 ; WX 600 ; N aring ; B 92 -16 547 666 ; -C 230 ; WX 600 ; N ae ; B 36 -16 635 438 ; -C 231 ; WX 600 ; N ccedilla ; B 122 -163 598 438 ; -C 232 ; WX 600 ; N egrave ; B 104 -16 573 653 ; -C 233 ; WX 600 ; N eacute ; B 104 -16 573 652 ; -C 234 ; WX 600 ; N ecircumflex ; B 104 -16 573 640 ; -C 235 ; WX 600 ; N edieresis ; B 104 -16 573 600 ; -C 236 ; WX 600 ; N igrave ; B 95 0 514 645 ; -C 237 ; WX 600 ; N iacute ; B 95 0 514 648 ; -C 238 ; WX 600 ; N icircumflex ; B 95 0 540 640 ; -C 239 ; WX 600 ; N idieresis ; B 95 0 523 600 ; -C 240 ; WX 600 ; N eth ; B 103 -15 598 610 ; -C 241 ; WX 600 ; N ntilde ; B 57 0 568 589 ; -C 242 ; WX 600 ; N ograve ; B 111 -16 579 649 ; -C 243 ; WX 600 ; N oacute ; B 111 -16 579 649 ; -C 244 ; WX 600 ; N ocircumflex ; B 111 -16 579 640 ; -C 245 ; WX 600 ; N otilde ; B 111 -16 579 589 ; -C 246 ; WX 600 ; N odieresis ; B 111 -16 579 600 ; -C 247 ; WX 600 ; N divide ; B 130 52 591 519 ; -C 248 ; WX 600 ; N oslash ; B 50 -42 642 462 ; -C 249 ; WX 600 ; N ugrave ; B 129 -16 571 649 ; -C 250 ; WX 600 ; N uacute ; B 129 -16 571 649 ; -C 251 ; WX 600 ; N ucircumflex ; B 129 -16 571 640 ; -C 252 ; WX 600 ; N udieresis ; B 129 -16 571 600 ; -C 253 ; WX 600 ; N yacute ; B 15 -188 636 649 ; -C 254 ; WX 600 ; N thorn ; B -14 -188 597 613 ; -C 255 ; WX 600 ; N ydieresis ; B 15 -188 636 600 ; -C -1 ; WX 0 ; N .null ; B 247 -15 466 627 ; -C -1 ; WX 600 ; N nonmarkingreturn ; B 247 -15 466 627 ; -C -1 ; WX 600 ; N notequal ; B 94 -35 628 608 ; -C -1 ; WX 600 ; N infinity ; B 112 194 605 413 ; -C -1 ; WX 600 ; N lessequal ; B 84 118 650 697 ; -C -1 ; WX 600 ; N greaterequal ; B 56 118 615 697 ; -C -1 ; WX 600 ; N partialdiff ; B 86 -15 488 613 ; -C -1 ; WX 600 ; N summation ; B 21 -188 538 613 ; -C -1 ; WX 600 ; N product ; B 26 -188 574 613 ; -C -1 ; WX 600 ; N pi1 ; B 85 0 604 423 ; -C -1 ; WX 600 ; N integral ; B -18 -183 788 818 ; -C -1 ; WX 600 ; N Ohm ; B 79 0 619 581 ; -C -1 ; WX 600 ; N radical ; B 67 -38 575 913 ; -C -1 ; WX 600 ; N approxequal ; B 124 141 599 430 ; -C -1 ; WX 600 ; N increment ; B 40 0 555 563 ; -C -1 ; WX 600 ; N lozenge ; B 76 0 525 694 ; -C -1 ; WX 600 ; N fraction ; B 84 141 647 478 ; -C -1 ; WX 600 ; N fi ; B 26 0 636 633 ; -C -1 ; WX 600 ; N fl ; B 26 0 631 613 ; -C -1 ; WX 600 ; N dotlessi ; B 95 0 514 423 ; -C -1 ; WX 600 ; N macron ; B 266 525 559 567 ; -C -1 ; WX 600 ; N breve ; B 277 497 573 634 ; -C -1 ; WX 600 ; N dotaccent ; B 363 510 465 610 ; -C -1 ; WX 600 ; N ring ; B 323 492 504 666 ; -C -1 ; WX 600 ; N hungarumlaut ; B 257 498 575 648 ; -C -1 ; WX 600 ; N ogonek ; B 269 -144 407 13 ; -C -1 ; WX 600 ; N caron ; B 280 492 572 634 ; -C -1 ; WX 600 ; N Lslash ; B 65 0 588 571 ; -C -1 ; WX 600 ; N lslash ; B 96 0 528 613 ; -C -1 ; WX 600 ; N minus ; B 130 265 591 306 ; -C -1 ; WX 600 ; N franc ; B 91 0 687 571 ; -C -1 ; WX 600 ; N Gbreve ; B 108 -16 640 781 ; -C -1 ; WX 600 ; N gbreve ; B 104 -188 648 634 ; -C -1 ; WX 600 ; N Idot ; B 116 0 606 757 ; -C -1 ; WX 600 ; N Scedilla ; B 95 -163 605 584 ; -C -1 ; WX 600 ; N scedilla ; B 105 -163 563 438 ; -C -1 ; WX 600 ; N Cacute ; B 114 -16 645 795 ; -C -1 ; WX 600 ; N cacute ; B 122 -16 598 649 ; -C -1 ; WX 600 ; N Ccaron ; B 114 -16 645 781 ; -C -1 ; WX 600 ; N ccaron ; B 122 -16 598 634 ; -C -1 ; WX 600 ; N dmacron ; B 101 -16 684 613 ; -C -1 ; WX 600 ; N middot ; B 405 275 507 375 ; -C -1 ; WX 600 ; N Abreve ; B 33 0 619 781 ; -C -1 ; WX 600 ; N abreve ; B 92 -16 570 634 ; -C -1 ; WX 600 ; N Aogonek ; B 12 -125 625 571 ; -C -1 ; WX 600 ; N aogonek ; B 92 -126 569 438 ; -C -1 ; WX 600 ; N Dcaron ; B 75 0 625 781 ; -C -1 ; WX 600 ; N dcaron ; B 101 -16 800 613 ; -C -1 ; WX 600 ; N Dslash ; B 46 0 596 571 ; -C -1 ; WX 600 ; N Eogonek ; B 47 -126 623 571 ; -C -1 ; WX 600 ; N eogonek ; B 104 -141 573 438 ; -C -1 ; WX 600 ; N Ecaron ; B 47 0 623 781 ; -C -1 ; WX 600 ; N ecaron ; B 104 -16 573 634 ; -C -1 ; WX 600 ; N Lacute ; B 66 0 588 795 ; -C -1 ; WX 600 ; N lacute ; B 96 0 564 799 ; -C -1 ; WX 600 ; N Lcaron ; B 66 0 623 571 ; -C -1 ; WX 600 ; N lcaron ; B 96 0 626 613 ; -C -1 ; WX 600 ; N Ldot ; B 66 0 588 571 ; -C -1 ; WX 600 ; N ldot ; B 96 0 548 613 ; -C -1 ; WX 600 ; N Nacute ; B 47 0 681 795 ; -C -1 ; WX 600 ; N nacute ; B 57 0 549 649 ; -C -1 ; WX 600 ; N Ncaron ; B 47 0 681 781 ; -C -1 ; WX 600 ; N ncaron ; B 57 0 582 634 ; -C -1 ; WX 600 ; N Odblacute ; B 103 -16 683 795 ; -C -1 ; WX 600 ; N odblacute ; B 111 -16 643 648 ; -C -1 ; WX 600 ; N Racute ; B 47 0 598 795 ; -C -1 ; WX 600 ; N racute ; B 87 0 623 649 ; -C -1 ; WX 600 ; N Rcaron ; B 47 0 598 781 ; -C -1 ; WX 600 ; N rcaron ; B 87 0 623 634 ; -C -1 ; WX 600 ; N Sacute ; B 95 -16 605 795 ; -C -1 ; WX 600 ; N sacute ; B 105 -16 563 649 ; -C -1 ; WX 600 ; N Tcedilla ; B 149 -250 651 571 ; -C -1 ; WX 600 ; N tcedilla ; B 158 -256 554 571 ; -C -1 ; WX 600 ; N Tcaron ; B 149 0 651 781 ; -C -1 ; WX 600 ; N tcaron ; B 158 -16 730 613 ; -C -1 ; WX 600 ; N Uring ; B 137 -16 678 795 ; -C -1 ; WX 600 ; N uring ; B 129 -16 571 666 ; -C -1 ; WX 600 ; N Udblacute ; B 137 -16 678 795 ; -C -1 ; WX 600 ; N udblacute ; B 129 -16 625 648 ; -C -1 ; WX 600 ; N Zacute ; B 104 0 598 795 ; -C -1 ; WX 600 ; N zacute ; B 116 0 569 649 ; -C -1 ; WX 600 ; N Zdot ; B 104 0 598 757 ; -C -1 ; WX 600 ; N zdot ; B 116 0 569 610 ; -C -1 ; WX 600 ; N Gamma ; B 47 0 671 571 ; -C -1 ; WX 600 ; N Theta ; B 103 -16 619 584 ; -C -1 ; WX 600 ; N Phi ; B 103 0 624 571 ; -C -1 ; WX 600 ; N alpha ; B 93 -16 633 438 ; -C -1 ; WX 600 ; N delta ; B 128 -16 590 613 ; -C -1 ; WX 600 ; N epsilon ; B 151 -16 562 438 ; -C -1 ; WX 600 ; N sigma ; B 100 -16 657 438 ; -C -1 ; WX 600 ; N tau ; B 199 -16 547 423 ; -C -1 ; WX 600 ; N phi ; B 103 -188 598 438 ; -C -1 ; WX 600 ; N underscoredbl ; B -67 -274 561 -127 ; -C -1 ; WX 600 ; N exclamdbl ; B 134 -15 578 627 ; -C -1 ; WX 600 ; N nsuperior ; B 194 245 510 522 ; -C -1 ; WX 600 ; N peseta ; B 11 -7 624 571 ; -C -1 ; WX 600 ; N arrowleft ; B 1 50 599 277 ; -C -1 ; WX 600 ; N arrowup ; B 186 -136 414 424 ; -C -1 ; WX 600 ; N arrowright ; B 1 50 599 277 ; -C -1 ; WX 600 ; N arrowdown ; B 186 -136 414 424 ; -C -1 ; WX 600 ; N arrowboth ; B 1 50 599 278 ; -C -1 ; WX 600 ; N arrowupdn ; B 186 -135 414 463 ; -C -1 ; WX 600 ; N arrowupdnbse ; B 186 -196 414 463 ; -C -1 ; WX 600 ; N orthogonal ; B 1 0 599 597 ; -C -1 ; WX 600 ; N intersection ; B 83 -16 603 584 ; -C -1 ; WX 600 ; N equivalence ; B 78 119 644 455 ; -C -1 ; WX 600 ; N house ; B 75 0 525 563 ; -C -1 ; WX 600 ; N revlogicalnot ; B 82 33 649 306 ; -C -1 ; WX 600 ; N integraltp ; B 211 -251 645 848 ; -C -1 ; WX 600 ; N integralbt ; B 82 -251 516 848 ; -C -1 ; WX 600 ; N SF100000 ; B -7 219 607 292 ; -C -1 ; WX 600 ; N SF110000 ; B 264 -255 336 766 ; -C -1 ; WX 600 ; N SF010000 ; B 264 -255 607 292 ; -C -1 ; WX 600 ; N SF030000 ; B -7 -255 336 292 ; -C -1 ; WX 600 ; N SF020000 ; B 264 219 607 766 ; -C -1 ; WX 600 ; N SF040000 ; B -7 219 336 766 ; -C -1 ; WX 600 ; N SF080000 ; B 264 -255 607 766 ; -C -1 ; WX 600 ; N SF090000 ; B -7 -255 336 766 ; -C -1 ; WX 600 ; N SF060000 ; B -7 -255 607 292 ; -C -1 ; WX 600 ; N SF070000 ; B -7 219 607 766 ; -C -1 ; WX 600 ; N SF050000 ; B -7 -255 607 766 ; -C -1 ; WX 600 ; N SF430000 ; B -7 141 607 370 ; -C -1 ; WX 600 ; N SF240000 ; B 186 -255 414 766 ; -C -1 ; WX 600 ; N SF510000 ; B 264 -255 607 370 ; -C -1 ; WX 600 ; N SF520000 ; B 186 -255 607 292 ; -C -1 ; WX 600 ; N SF390000 ; B 186 -255 607 370 ; -C -1 ; WX 600 ; N SF220000 ; B -7 -255 336 370 ; -C -1 ; WX 600 ; N SF210000 ; B -7 -255 414 292 ; -C -1 ; WX 600 ; N SF250000 ; B -7 -255 414 370 ; -C -1 ; WX 600 ; N SF500000 ; B 264 141 607 766 ; -C -1 ; WX 600 ; N SF490000 ; B 186 219 607 766 ; -C -1 ; WX 600 ; N SF380000 ; B 186 141 607 766 ; -C -1 ; WX 600 ; N SF280000 ; B -7 141 336 766 ; -C -1 ; WX 600 ; N SF270000 ; B -7 219 414 766 ; -C -1 ; WX 600 ; N SF260000 ; B -7 141 414 766 ; -C -1 ; WX 600 ; N SF360000 ; B 264 -255 607 766 ; -C -1 ; WX 600 ; N SF370000 ; B 186 -255 607 766 ; -C -1 ; WX 600 ; N SF420000 ; B 186 -255 607 766 ; -C -1 ; WX 600 ; N SF190000 ; B -7 -255 336 766 ; -C -1 ; WX 600 ; N SF200000 ; B -7 -255 414 766 ; -C -1 ; WX 600 ; N SF230000 ; B -7 -255 414 766 ; -C -1 ; WX 600 ; N SF470000 ; B -7 -255 607 370 ; -C -1 ; WX 600 ; N SF480000 ; B -7 -255 607 292 ; -C -1 ; WX 600 ; N SF410000 ; B -7 -255 607 370 ; -C -1 ; WX 600 ; N SF450000 ; B -7 141 607 766 ; -C -1 ; WX 600 ; N SF460000 ; B -7 219 607 766 ; -C -1 ; WX 600 ; N SF400000 ; B -7 141 607 766 ; -C -1 ; WX 600 ; N SF540000 ; B -7 -255 607 766 ; -C -1 ; WX 600 ; N SF530000 ; B -7 -255 607 766 ; -C -1 ; WX 600 ; N SF440000 ; B -7 -255 607 766 ; -C -1 ; WX 600 ; N upblock ; B -7 255 607 766 ; -C -1 ; WX 600 ; N dnblock ; B -7 -255 607 255 ; -C -1 ; WX 600 ; N block ; B -7 -255 607 766 ; -C -1 ; WX 600 ; N lfblock ; B -7 -255 300 766 ; -C -1 ; WX 600 ; N rtblock ; B 300 -255 608 766 ; -C -1 ; WX 600 ; N ltshade ; B 44 -207 607 766 ; -C -1 ; WX 600 ; N shade ; B -7 -207 607 766 ; -C -1 ; WX 600 ; N dkshade ; B -7 -258 607 766 ; -C -1 ; WX 600 ; N filledbox ; B 1 0 599 598 ; -C -1 ; WX 600 ; N filledrect ; B 1 193 599 306 ; -C -1 ; WX 600 ; N triagup ; B 7 0 592 585 ; -C -1 ; WX 600 ; N triagrt ; B 1 -13 599 584 ; -C -1 ; WX 600 ; N triagdn ; B 7 -13 592 572 ; -C -1 ; WX 600 ; N triaglf ; B 1 -13 599 584 ; -C -1 ; WX 600 ; N circle ; B 85 67 515 497 ; -C -1 ; WX 600 ; N invbullet ; B 61 0 539 479 ; -C -1 ; WX 600 ; N invcircle ; B 19 0 583 564 ; -C -1 ; WX 600 ; N smileface ; B 1 -13 599 584 ; -C -1 ; WX 600 ; N invsmileface ; B 1 -13 599 584 ; -C -1 ; WX 600 ; N sun ; B 1 -69 599 529 ; -C -1 ; WX 600 ; N female ; B 157 39 444 563 ; -C -1 ; WX 600 ; N male ; B 90 122 511 563 ; -C -1 ; WX 600 ; N spade ; B 63 0 537 601 ; -C -1 ; WX 600 ; N club ; B 1 0 599 597 ; -C -1 ; WX 600 ; N heart ; B 53 -11 547 559 ; -C -1 ; WX 600 ; N diamond ; B 78 -12 523 597 ; -C -1 ; WX 600 ; N musicalnote ; B 132 14 440 563 ; -C -1 ; WX 600 ; N musicalnotedbl ; B 44 -21 528 566 ; -C -1 ; WX 600 ; N IJ ; B 4 -16 753 571 ; -C -1 ; WX 600 ; N ij ; B 8 -188 611 633 ; -C -1 ; WX 600 ; N napostrophe ; B 52 0 600 613 ; -C -1 ; WX 600 ; N minute ; B 345 320 495 613 ; -C -1 ; WX 600 ; N second ; B 242 320 602 613 ; -C -1 ; WX 600 ; N afii61248 ; B 172 -12 618 623 ; -C -1 ; WX 600 ; N afii61289 ; B 185 -16 489 584 ; -C -1 ; WX 600 ; N H22073 ; B 1 0 599 598 ; -C -1 ; WX 600 ; N H18543 ; B 242 187 490 435 ; -C -1 ; WX 600 ; N H18551 ; B 242 187 490 435 ; -C -1 ; WX 600 ; N H18533 ; B 85 67 515 497 ; -C -1 ; WX 600 ; N openbullet ; B 243 190 489 432 ; -C -1 ; WX 600 ; N Amacron ; B 33 0 619 713 ; -C -1 ; WX 600 ; N amacron ; B 92 -16 573 567 ; -C -1 ; WX 600 ; N Ccircumflex ; B 114 -16 645 786 ; -C -1 ; WX 600 ; N ccircumflex ; B 122 -16 598 640 ; -C -1 ; WX 600 ; N Cdot ; B 114 -16 645 757 ; -C -1 ; WX 600 ; N cdot ; B 122 -16 598 610 ; -C -1 ; WX 600 ; N Emacron ; B 47 0 623 713 ; -C -1 ; WX 600 ; N emacron ; B 104 -16 573 567 ; -C -1 ; WX 600 ; N Ebreve ; B 47 0 623 781 ; -C -1 ; WX 600 ; N ebreve ; B 104 -16 573 634 ; -C -1 ; WX 600 ; N Edot ; B 47 0 623 757 ; -C -1 ; WX 600 ; N edot ; B 104 -16 573 610 ; -C -1 ; WX 600 ; N Gcircumflex ; B 108 -16 640 786 ; -C -1 ; WX 600 ; N gcircumflex ; B 104 -188 648 640 ; -C -1 ; WX 600 ; N Gdot ; B 108 -16 640 757 ; -C -1 ; WX 600 ; N gdot ; B 104 -188 648 610 ; -C -1 ; WX 600 ; N Gcedilla ; B 108 -163 640 584 ; -C -1 ; WX 600 ; N gcedilla ; B 104 -188 648 690 ; -C -1 ; WX 600 ; N Hcircumflex ; B 57 0 672 788 ; -C -1 ; WX 600 ; N hcircumflex ; B 55 0 601 770 ; -C -1 ; WX 600 ; N Hbar ; B 56 0 651 571 ; -C -1 ; WX 600 ; N hbar ; B 55 0 559 613 ; -C -1 ; WX 600 ; N Itilde ; B 116 0 606 736 ; -C -1 ; WX 600 ; N itilde ; B 95 0 543 589 ; -C -1 ; WX 600 ; N Imacron ; B 116 0 606 714 ; -C -1 ; WX 600 ; N imacron ; B 95 0 533 567 ; -C -1 ; WX 600 ; N Ibreve ; B 116 0 608 781 ; -C -1 ; WX 600 ; N ibreve ; B 95 0 548 634 ; -C -1 ; WX 600 ; N Iogonek ; B 116 -141 606 571 ; -C -1 ; WX 600 ; N iogonek ; B 96 -141 515 633 ; -C -1 ; WX 600 ; N Jcircumflex ; B 100 -16 703 786 ; -C -1 ; WX 600 ; N jcircumflex ; B 52 -188 556 640 ; -C -1 ; WX 600 ; N Kcedilla ; B 68 -163 691 571 ; -C -1 ; WX 600 ; N kcedilla ; B 68 -163 586 613 ; -C -1 ; WX 600 ; N kgreenlandic ; B 93 0 598 423 ; -C -1 ; WX 600 ; N Lcedilla ; B 66 -163 588 571 ; -C -1 ; WX 600 ; N lcedilla ; B 96 -163 515 613 ; -C -1 ; WX 600 ; N Ncedilla ; B 47 -163 681 571 ; -C -1 ; WX 600 ; N ncedilla ; B 57 -163 547 438 ; -C -1 ; WX 600 ; N Eng ; B 63 -16 616 584 ; -C -1 ; WX 600 ; N eng ; B 70 -188 561 438 ; -C -1 ; WX 600 ; N Omacron ; B 103 -16 624 713 ; -C -1 ; WX 600 ; N omacron ; B 111 -16 579 567 ; -C -1 ; WX 600 ; N Obreve ; B 103 -16 638 781 ; -C -1 ; WX 600 ; N obreve ; B 111 -16 579 634 ; -C -1 ; WX 600 ; N Rcedilla ; B 47 -163 598 571 ; -C -1 ; WX 600 ; N rcedilla ; B 87 -163 623 433 ; -C -1 ; WX 600 ; N Scircumflex ; B 95 -16 605 786 ; -C -1 ; WX 600 ; N scircumflex ; B 105 -16 563 640 ; -C -1 ; WX 600 ; N Tbar ; B 149 0 651 571 ; -C -1 ; WX 600 ; N tbar ; B 117 -16 553 571 ; -C -1 ; WX 600 ; N Utilde ; B 137 -16 678 736 ; -C -1 ; WX 600 ; N utilde ; B 129 -16 574 589 ; -C -1 ; WX 600 ; N Umacron ; B 137 -16 678 713 ; -C -1 ; WX 600 ; N umacron ; B 129 -16 571 567 ; -C -1 ; WX 600 ; N Ubreve ; B 137 -16 678 780 ; -C -1 ; WX 600 ; N ubreve ; B 129 -16 573 634 ; -C -1 ; WX 600 ; N Uogonek ; B 137 -141 678 571 ; -C -1 ; WX 600 ; N uogonek ; B 129 -141 571 423 ; -C -1 ; WX 600 ; N Wcircumflex ; B 121 0 698 786 ; -C -1 ; WX 600 ; N wcircumflex ; B 113 0 658 640 ; -C -1 ; WX 600 ; N Ycircumflex ; B 150 0 668 786 ; -C -1 ; WX 600 ; N ycircumflex ; B 15 -188 636 640 ; -C -1 ; WX 600 ; N longs ; B 109 0 667 613 ; -C -1 ; WX 600 ; N Aringacute ; B 33 0 619 1000 ; -C -1 ; WX 600 ; N aringacute ; B 92 -16 588 873 ; -C -1 ; WX 600 ; N AEacute ; B 13 0 693 795 ; -C -1 ; WX 600 ; N aeacute ; B 36 -16 635 649 ; -C -1 ; WX 600 ; N Oslashacute ; B 34 -41 687 795 ; -C -1 ; WX 600 ; N oslashacute ; B 50 -42 642 649 ; -C -1 ; WX 600 ; N anoteleia ; B 302 305 455 438 ; -C -1 ; WX 600 ; N Wgrave ; B 121 0 698 795 ; -C -1 ; WX 600 ; N wgrave ; B 113 0 658 649 ; -C -1 ; WX 600 ; N Wacute ; B 121 0 698 795 ; -C -1 ; WX 600 ; N wacute ; B 113 0 658 649 ; -C -1 ; WX 600 ; N Wdieresis ; B 121 0 698 747 ; -C -1 ; WX 600 ; N wdieresis ; B 113 0 658 600 ; -C -1 ; WX 600 ; N Ygrave ; B 150 0 668 795 ; -C -1 ; WX 600 ; N ygrave ; B 15 -188 636 649 ; -C -1 ; WX 600 ; N quotereversed ; B 378 319 529 613 ; -C -1 ; WX 600 ; N radicalex ; B 240 525 592 567 ; -C -1 ; WX 600 ; N afii08941 ; B 87 0 543 587 ; -C -1 ; WX 600 ; N estimated ; B 44 -17 561 535 ; -C -1 ; WX 600 ; N oneeighth ; B 61 -7 653 626 ; -C -1 ; WX 600 ; N threeeighths ; B 58 -7 652 627 ; -C -1 ; WX 600 ; N fiveeighths ; B 60 -7 652 620 ; -C -1 ; WX 600 ; N seveneighths ; B 63 -7 648 620 ; -C -1 ; WX 600 ; N commaaccent ; B 199 -250 333 -59 ; -C -1 ; WX 600 ; N undercommaaccent ; B 201 -163 352 -51 ; -C -1 ; WX 600 ; N tonos ; B 344 499 535 649 ; -C -1 ; WX 600 ; N dieresistonos ; B 234 499 579 649 ; -C -1 ; WX 600 ; N Alphatonos ; B 33 0 619 571 ; -C -1 ; WX 600 ; N Epsilontonos ; B 54 0 684 571 ; -C -1 ; WX 600 ; N Etatonos ; B 45 0 673 571 ; -C -1 ; WX 600 ; N Iotatonos ; B 80 0 636 571 ; -C -1 ; WX 600 ; N Omicrontonos ; B 71 -16 646 584 ; -C -1 ; WX 600 ; N Upsilontonos ; B 54 0 736 571 ; -C -1 ; WX 600 ; N Omegatonos ; B 44 0 664 584 ; -C -1 ; WX 600 ; N iotadieresistonos ; B 227 -16 572 649 ; -C -1 ; WX 600 ; N Alpha ; B 33 0 619 571 ; -C -1 ; WX 600 ; N Beta ; B 46 0 593 571 ; -C -1 ; WX 600 ; N Delta ; B 54 0 552 571 ; -C -1 ; WX 600 ; N Epsilon ; B 47 0 623 571 ; -C -1 ; WX 600 ; N Zeta ; B 104 0 598 571 ; -C -1 ; WX 600 ; N Eta ; B 57 0 672 572 ; -C -1 ; WX 600 ; N Iota ; B 116 0 606 571 ; -C -1 ; WX 600 ; N Kappa ; B 68 0 691 571 ; -C -1 ; WX 600 ; N Lambda ; B 28 0 614 571 ; -C -1 ; WX 600 ; N Mu ; B 16 0 702 571 ; -C -1 ; WX 600 ; N Nu ; B 47 0 681 571 ; -C -1 ; WX 600 ; N Xi ; B 77 0 651 571 ; -C -1 ; WX 600 ; N Omicron ; B 103 -16 619 584 ; -C -1 ; WX 600 ; N Pi ; B 56 0 660 571 ; -C -1 ; WX 600 ; N Rho ; B 106 0 648 571 ; -C -1 ; WX 600 ; N Sigma ; B 96 0 615 571 ; -C -1 ; WX 600 ; N Tau ; B 149 0 651 571 ; -C -1 ; WX 600 ; N Upsilon ; B 150 0 668 571 ; -C -1 ; WX 600 ; N Chi ; B 43 0 667 571 ; -C -1 ; WX 600 ; N Psi ; B 133 0 706 571 ; -C -1 ; WX 600 ; N Omega ; B 34 0 648 584 ; -C -1 ; WX 600 ; N Iotadieresis ; B 116 0 606 729 ; -C -1 ; WX 600 ; N Upsilondieresis ; B 150 0 668 729 ; -C -1 ; WX 600 ; N alphatonos ; B 93 -16 633 649 ; -C -1 ; WX 600 ; N epsilontonos ; B 151 -16 562 649 ; -C -1 ; WX 600 ; N etatonos ; B 67 -188 557 649 ; -C -1 ; WX 600 ; N iotatonos ; B 265 -16 514 649 ; -C -1 ; WX 600 ; N upsilondieresistonos ; B 125 -16 639 627 ; -C -1 ; WX 600 ; N beta ; B 95 -188 556 613 ; -C -1 ; WX 600 ; N gamma ; B 120 -188 657 423 ; -C -1 ; WX 600 ; N zeta ; B 191 -188 588 613 ; -C -1 ; WX 600 ; N eta ; B 67 -188 557 438 ; -C -1 ; WX 600 ; N theta ; B 140 -16 590 613 ; -C -1 ; WX 600 ; N iota ; B 265 -16 429 438 ; -C -1 ; WX 600 ; N kappa ; B 94 0 589 423 ; -C -1 ; WX 600 ; N lambda ; B 42 0 594 613 ; -C -1 ; WX 600 ; N mu ; B 86 -188 564 423 ; -C -1 ; WX 600 ; N nu ; B 119 0 560 438 ; -C -1 ; WX 600 ; N xi ; B 179 -188 572 613 ; -C -1 ; WX 600 ; N omicron ; B 111 -16 579 438 ; -C -1 ; WX 600 ; N rho ; B 59 -188 587 438 ; -C -1 ; WX 600 ; N sigma1 ; B 135 -188 625 438 ; -C -1 ; WX 600 ; N upsilon ; B 125 -16 639 423 ; -C -1 ; WX 600 ; N chi ; B 94 -188 561 438 ; -C -1 ; WX 600 ; N psi ; B 124 -188 653 613 ; -C -1 ; WX 600 ; N omega ; B 92 -16 593 438 ; -C -1 ; WX 600 ; N iotadieresis ; B 249 -16 539 578 ; -C -1 ; WX 600 ; N upsilondieresis ; B 125 -16 639 600 ; -C -1 ; WX 600 ; N omicrontonos ; B 111 -16 579 649 ; -C -1 ; WX 600 ; N upsilontonos ; B 125 -16 639 649 ; -C -1 ; WX 600 ; N omegatonos ; B 92 -16 593 649 ; -C -1 ; WX 600 ; N afii10023 ; B 47 0 623 730 ; -C -1 ; WX 600 ; N afii10051 ; B 94 -16 610 571 ; -C -1 ; WX 600 ; N afii10053 ; B 110 -16 639 584 ; -C -1 ; WX 600 ; N afii10054 ; B 95 -16 605 584 ; -C -1 ; WX 600 ; N afii10055 ; B 116 0 606 571 ; -C -1 ; WX 600 ; N afii10056 ; B 116 0 606 730 ; -C -1 ; WX 600 ; N afii10057 ; B 100 -16 703 571 ; -C -1 ; WX 600 ; N afii10058 ; B 20 -16 617 571 ; -C -1 ; WX 600 ; N afii10059 ; B 6 0 615 571 ; -C -1 ; WX 600 ; N afii10060 ; B 94 0 598 571 ; -C -1 ; WX 600 ; N afii10062 ; B 84 -16 707 781 ; -C -1 ; WX 600 ; N afii10017 ; B 33 0 619 571 ; -C -1 ; WX 600 ; N afii10018 ; B 46 0 603 571 ; -C -1 ; WX 600 ; N afii10019 ; B 46 0 593 571 ; -C -1 ; WX 600 ; N afii10020 ; B 47 0 671 571 ; -C -1 ; WX 600 ; N afii10021 ; B 0 -140 669 571 ; -C -1 ; WX 600 ; N afii10022 ; B 47 0 623 571 ; -C -1 ; WX 600 ; N afii10024 ; B 1 0 694 572 ; -C -1 ; WX 600 ; N afii10025 ; B 67 -16 605 584 ; -C -1 ; WX 600 ; N afii10026 ; B 32 0 693 571 ; -C -1 ; WX 600 ; N afii10027 ; B 32 0 693 781 ; -C -1 ; WX 600 ; N afii10028 ; B 69 0 665 572 ; -C -1 ; WX 600 ; N afii10029 ; B 16 -16 669 571 ; -C -1 ; WX 600 ; N afii10030 ; B 16 0 702 571 ; -C -1 ; WX 600 ; N afii10031 ; B 57 0 672 572 ; -C -1 ; WX 600 ; N afii10032 ; B 103 -16 619 584 ; -C -1 ; WX 600 ; N afii10033 ; B 56 0 660 571 ; -C -1 ; WX 600 ; N afii10034 ; B 106 0 648 571 ; -C -1 ; WX 600 ; N afii10035 ; B 114 -16 645 584 ; -C -1 ; WX 600 ; N afii10036 ; B 149 0 651 571 ; -C -1 ; WX 600 ; N afii10037 ; B 84 -16 707 571 ; -C -1 ; WX 600 ; N afii10038 ; B 104 0 617 572 ; -C -1 ; WX 600 ; N afii10039 ; B 43 0 667 571 ; -C -1 ; WX 600 ; N afii10040 ; B 39 -125 660 571 ; -C -1 ; WX 600 ; N afii10041 ; B 129 0 656 571 ; -C -1 ; WX 600 ; N afii10042 ; B 5 0 709 571 ; -C -1 ; WX 600 ; N afii10043 ; B 5 -125 709 571 ; -C -1 ; WX 600 ; N afii10044 ; B 93 0 583 571 ; -C -1 ; WX 600 ; N afii10045 ; B 0 0 710 571 ; -C -1 ; WX 600 ; N afii10046 ; B 46 0 580 571 ; -C -1 ; WX 600 ; N afii10047 ; B 78 -16 604 584 ; -C -1 ; WX 600 ; N afii10048 ; B 10 -16 650 584 ; -C -1 ; WX 600 ; N afii10049 ; B 38 0 654 571 ; -C -1 ; WX 600 ; N afii10065 ; B 92 -16 547 438 ; -C -1 ; WX 600 ; N afii10066 ; B 103 -13 600 606 ; -C -1 ; WX 600 ; N afii10067 ; B 46 0 550 423 ; -C -1 ; WX 600 ; N afii10068 ; B 47 0 639 423 ; -C -1 ; WX 600 ; N afii10069 ; B 18 -103 623 423 ; -C -1 ; WX 600 ; N afii10070 ; B 104 -16 573 438 ; -C -1 ; WX 600 ; N afii10072 ; B 14 0 655 423 ; -C -1 ; WX 600 ; N afii10073 ; B 83 -13 572 438 ; -C -1 ; WX 600 ; N afii10074 ; B 40 0 656 423 ; -C -1 ; WX 600 ; N afii10075 ; B 40 0 656 634 ; -C -1 ; WX 600 ; N afii10076 ; B 67 0 620 423 ; -C -1 ; WX 600 ; N afii10077 ; B 15 -13 623 423 ; -C -1 ; WX 600 ; N afii10078 ; B 16 0 669 423 ; -C -1 ; WX 600 ; N afii10079 ; B 56 0 631 423 ; -C -1 ; WX 600 ; N afii10080 ; B 111 -16 579 438 ; -C -1 ; WX 600 ; N afii10081 ; B 56 0 627 423 ; -C -1 ; WX 600 ; N afii10082 ; B -14 -188 595 438 ; -C -1 ; WX 600 ; N afii10083 ; B 122 -16 598 438 ; -C -1 ; WX 600 ; N afii10084 ; B 118 0 619 423 ; -C -1 ; WX 600 ; N afii10085 ; B 63 -149 667 423 ; -C -1 ; WX 600 ; N afii10086 ; B 93 -157 593 601 ; -C -1 ; WX 600 ; N afii10087 ; B 53 0 616 423 ; -C -1 ; WX 600 ; N afii10088 ; B 56 -125 627 423 ; -C -1 ; WX 600 ; N afii10089 ; B 115 0 629 423 ; -C -1 ; WX 600 ; N afii10090 ; B 5 0 677 423 ; -C -1 ; WX 600 ; N afii10091 ; B 5 -125 677 423 ; -C -1 ; WX 600 ; N afii10092 ; B 70 0 563 423 ; -C -1 ; WX 600 ; N afii10093 ; B 15 0 677 423 ; -C -1 ; WX 600 ; N afii10094 ; B 46 0 550 423 ; -C -1 ; WX 600 ; N afii10095 ; B 78 -16 581 438 ; -C -1 ; WX 600 ; N afii10096 ; B 17 -17 621 438 ; -C -1 ; WX 600 ; N afii10097 ; B 36 0 633 423 ; -C -1 ; WX 600 ; N afii10071 ; B 104 -16 573 600 ; -C -1 ; WX 600 ; N afii10099 ; B 55 -188 546 613 ; -C -1 ; WX 600 ; N afii10100 ; B 47 0 639 649 ; -C -1 ; WX 600 ; N afii10101 ; B 122 -16 598 438 ; -C -1 ; WX 600 ; N afii10102 ; B 105 -16 563 438 ; -C -1 ; WX 600 ; N afii10103 ; B 96 0 515 633 ; -C -1 ; WX 600 ; N afii10104 ; B 95 0 523 600 ; -C -1 ; WX 600 ; N afii10105 ; B 52 -188 493 633 ; -C -1 ; WX 600 ; N afii10106 ; B 28 -13 600 423 ; -C -1 ; WX 600 ; N afii10107 ; B 14 0 586 423 ; -C -1 ; WX 600 ; N afii10108 ; B 55 0 559 613 ; -C -1 ; WX 600 ; N afii10110 ; B 63 -149 667 634 ; -C -1 ; WX 600 ; N afii10193 ; B 56 -125 627 423 ; -C -1 ; WX 600 ; N afii10050 ; B 47 0 671 682 ; -C -1 ; WX 600 ; N afii10098 ; B 47 0 639 533 ; -C -1 ; WX 600 ; N afii00208 ; B 82 266 641 307 ; -C -1 ; WX 600 ; N afii61352 ; B 31 0 664 571 ; -C -1 ; WX 600 ; N pi ; B 63 0 633 423 ; -C -1 ; WX 600 ; N f000 ; B 54 0 308 319 ; -C -1 ; WX 600 ; N f003 ; B 96 422 229 613 ; -C -1 ; WX 600 ; N sheva ; B 218 -261 310 -82 ; -C -1 ; WX 600 ; N hatafsegol ; B 136 -261 415 -82 ; -C -1 ; WX 600 ; N hatafpatah ; B 137 -261 408 -82 ; -C -1 ; WX 600 ; N hatafqamats ; B 137 -261 408 -82 ; -C -1 ; WX 600 ; N hiriq ; B 242 -147 309 -83 ; -C -1 ; WX 600 ; N tsere ; B 189 -147 362 -83 ; -C -1 ; WX 600 ; N segol ; B 189 -261 362 -82 ; -C -1 ; WX 600 ; N patah ; B 176 -130 378 -83 ; -C -1 ; WX 600 ; N qamats ; B 176 -215 378 -83 ; -C -1 ; WX 600 ; N holam ; B 390 559 459 628 ; -C -1 ; WX 600 ; N qubuts ; B 136 -261 391 -82 ; -C -1 ; WX 600 ; N dagesh ; B 320 222 388 290 ; -C -1 ; WX 600 ; N meteg ; B 225 -261 302 -82 ; -C -1 ; WX 600 ; N maqaf ; B 181 437 613 478 ; -C -1 ; WX 600 ; N rafe ; B 322 560 525 607 ; -C -1 ; WX 600 ; N paseq ; B 282 -5 419 484 ; -C -1 ; WX 600 ; N shindot ; B 573 560 640 625 ; -C -1 ; WX 600 ; N sindot ; B 215 560 282 626 ; -C -1 ; WX 600 ; N sofpasuq ; B 236 -6 471 486 ; -C -1 ; WX 600 ; N alef ; B 102 -6 604 492 ; -C -1 ; WX 600 ; N bet ; B 81 0 527 478 ; -C -1 ; WX 600 ; N gimel ; B 138 -5 450 478 ; -C -1 ; WX 600 ; N dalet ; B 172 -5 624 478 ; -C -1 ; WX 600 ; N he ; B 101 -5 576 478 ; -C -1 ; WX 600 ; N vav ; B 280 -5 440 478 ; -C -1 ; WX 600 ; N zayin ; B 257 -5 547 478 ; -C -1 ; WX 600 ; N het ; B 164 -5 630 478 ; -C -1 ; WX 600 ; N tet ; B 147 -5 584 483 ; -C -1 ; WX 600 ; N yod ; B 278 263 445 478 ; -C -1 ; WX 600 ; N finalkaf ; B 169 -109 617 478 ; -C -1 ; WX 600 ; N kaf ; B 92 0 558 478 ; -C -1 ; WX 600 ; N lamed ; B 187 0 565 629 ; -C -1 ; WX 600 ; N finalmem ; B 131 0 564 478 ; -C -1 ; WX 600 ; N mem ; B 146 -5 569 483 ; -C -1 ; WX 600 ; N finalnun ; B 275 -109 445 478 ; -C -1 ; WX 600 ; N nun ; B 143 0 475 478 ; -C -1 ; WX 600 ; N samekh ; B 135 -5 564 478 ; -C -1 ; WX 600 ; N ayin ; B 101 0 582 478 ; -C -1 ; WX 600 ; N finalpe ; B 175 -109 538 478 ; -C -1 ; WX 600 ; N pe ; B 126 0 545 478 ; -C -1 ; WX 600 ; N finaltsadi ; B 188 -109 575 478 ; -C -1 ; WX 600 ; N tsadi ; B 175 0 567 478 ; -C -1 ; WX 600 ; N qof ; B 81 -204 598 478 ; -C -1 ; WX 600 ; N resh ; B 181 -5 542 478 ; -C -1 ; WX 600 ; N shin ; B 124 0 602 483 ; -C -1 ; WX 600 ; N tav ; B 82 -5 563 478 ; -C -1 ; WX 600 ; N doublevav ; B 156 -5 580 478 ; -C -1 ; WX 600 ; N vavyod ; B 162 -5 580 478 ; -C -1 ; WX 600 ; N doubleyod ; B 162 263 580 478 ; -C -1 ; WX 600 ; N geresh ; B 276 246 479 483 ; -C -1 ; WX 600 ; N gershayim ; B 178 246 577 483 ; -C -1 ; WX 600 ; N newsheqelsign ; B 43 -5 654 481 ; -C -1 ; WX 600 ; N vavshindot ; B 239 -5 440 630 ; -C -1 ; WX 600 ; N finalkafsheva ; B 166 -109 621 479 ; -C -1 ; WX 600 ; N finalkafqamats ; B 158 -109 621 479 ; -C -1 ; WX 600 ; N lamedholam ; B 99 0 565 630 ; -C -1 ; WX 600 ; N lamedholamdagesh ; B 109 0 565 629 ; -C -1 ; WX 600 ; N _b_712 ; B 101 0 582 478 ; -C -1 ; WX 600 ; N shinshindot ; B 124 0 630 628 ; -C -1 ; WX 600 ; N shinsindot ; B 124 0 602 628 ; -C -1 ; WX 600 ; N shindageshshindot ; B 124 0 630 628 ; -C -1 ; WX 600 ; N shindageshsindot ; B 124 0 602 628 ; -C -1 ; WX 600 ; N alefpatah ; B 102 -130 604 493 ; -C -1 ; WX 600 ; N alefqamats ; B 102 -215 604 493 ; -C -1 ; WX 600 ; N alefmapiq ; B 102 -6 604 492 ; -C -1 ; WX 600 ; N betdagesh ; B 77 0 527 479 ; -C -1 ; WX 600 ; N gimeldagesh ; B 134 -5 451 479 ; -C -1 ; WX 600 ; N daletdagesh ; B 172 -5 625 479 ; -C -1 ; WX 600 ; N hedagesh ; B 101 -5 576 479 ; -C -1 ; WX 600 ; N vavdagesh ; B 227 -5 440 479 ; -C -1 ; WX 600 ; N zayindagesh ; B 205 -5 543 479 ; -C -1 ; WX 600 ; N tetdagesh ; B 147 -5 584 483 ; -C -1 ; WX 600 ; N yoddagesh ; B 259 263 445 478 ; -C -1 ; WX 600 ; N finalkafdagesh ; B 166 -109 621 479 ; -C -1 ; WX 600 ; N kafdagesh ; B 92 0 559 479 ; -C -1 ; WX 600 ; N lameddagesh ; B 187 0 565 630 ; -C -1 ; WX 600 ; N memdagesh ; B 146 -5 569 484 ; -C -1 ; WX 600 ; N nundagesh ; B 139 0 476 479 ; -C -1 ; WX 600 ; N samekhdagesh ; B 135 -5 564 478 ; -C -1 ; WX 600 ; N finalpedagesh ; B 175 -109 538 478 ; -C -1 ; WX 600 ; N pedagesh ; B 126 0 545 478 ; -C -1 ; WX 600 ; N tsadidagesh ; B 175 0 567 478 ; -C -1 ; WX 600 ; N qofdagesh ; B 81 -204 598 478 ; -C -1 ; WX 600 ; N reshdagesh ; B 181 -5 542 479 ; -C -1 ; WX 600 ; N shindagesh ; B 124 0 602 483 ; -C -1 ; WX 600 ; N tavdages ; B 82 -5 563 479 ; -C -1 ; WX 600 ; N vavholam ; B 276 -5 469 628 ; -C -1 ; WX 600 ; N betrafe ; B 77 0 527 608 ; -C -1 ; WX 600 ; N kafrafe ; B 92 0 558 607 ; -C -1 ; WX 600 ; N perafe ; B 126 0 545 608 ; -C -1 ; WX 600 ; N aleflamed ; B 102 -6 604 629 ; -C -1 ; WX 600 ; N zerowidthnonjoiner ; B 283 -134 318 629 ; -C -1 ; WX 600 ; N zerowidthjoiner ; B 193 -134 407 690 ; -C -1 ; WX 600 ; N lefttorightmark ; B 172 -134 458 690 ; -C -1 ; WX 600 ; N righttoleftmark ; B 143 -134 429 690 ; -C -1 ; WX 600 ; N uniFFFC ; B 0 0 600 431 ; -C -1 ; WX 600 ; N Ohorn ; B 103 -16 681 584 ; -C -1 ; WX 600 ; N ohorn ; B 111 -16 641 438 ; -C -1 ; WX 600 ; N Uhorn ; B 137 -16 762 648 ; -C -1 ; WX 600 ; N uhorn ; B 129 -16 659 429 ; -C -1 ; WX 600 ; N f00b ; B 372 679 568 783 ; -C -1 ; WX 600 ; N f00c ; B 324 679 521 783 ; -C -1 ; WX 600 ; N f00e ; B 308 632 475 783 ; -C -1 ; WX 600 ; N f006 ; B 346 679 542 783 ; -C -1 ; WX 600 ; N f007 ; B 392 682 589 785 ; -C -1 ; WX 600 ; N f009 ; B 355 632 522 783 ; -C -1 ; WX 600 ; N combininghookabove ; B 352 655 509 783 ; -C -1 ; WX 600 ; N f010 ; B 373 696 514 783 ; -C -1 ; WX 600 ; N f013 ; B 352 638 509 783 ; -C -1 ; WX 600 ; N f011 ; B 375 696 516 783 ; -C -1 ; WX 600 ; N f01c ; B 305 682 629 783 ; -C -1 ; WX 600 ; N f015 ; B 292 682 617 783 ; -C -1 ; WX 600 ; N combiningtildeaccent ; B 288 682 613 783 ; -C -1 ; WX 600 ; N _d_769 ; B 288 598 554 680 ; -C -1 ; WX 600 ; N _d_770 ; B 291 598 557 680 ; -C -1 ; WX 600 ; N f02c ; B 406 -158 508 -58 ; -C -1 ; WX 600 ; N dongsign ; B 122 112 605 613 ; -C -1 ; WX 600 ; N onethird ; B 59 -7 669 626 ; -C -1 ; WX 600 ; N twothirds ; B 39 -7 669 627 ; -C -1 ; WX 600 ; N f008 ; B 299 499 466 649 ; -C -1 ; WX 600 ; N f00a ; B 368 499 535 649 ; -C -1 ; WX 600 ; N f00d ; B 297 499 464 649 ; -C -1 ; WX 600 ; N f00f ; B 312 499 479 649 ; -C -1 ; WX 600 ; N f012 ; B 328 499 485 626 ; -C -1 ; WX 600 ; N f014 ; B 328 499 485 626 ; -C -1 ; WX 600 ; N f016 ; B 305 682 629 783 ; -C -1 ; WX 600 ; N f017 ; B 305 682 629 783 ; -C -1 ; WX 600 ; N f018 ; B 305 682 629 783 ; -C -1 ; WX 600 ; N f019 ; B 251 489 569 589 ; -C -1 ; WX 600 ; N f01a ; B 251 489 568 589 ; -C -1 ; WX 600 ; N f01b ; B 251 489 568 589 ; -C -1 ; WX 600 ; N f01e ; B 235 -158 337 -58 ; -C -1 ; WX 600 ; N f01f ; B 235 -158 337 -58 ; -C -1 ; WX 600 ; N f020 ; B 235 -158 337 -58 ; -C -1 ; WX 600 ; N f021 ; B 259 -158 361 -58 ; -C -1 ; WX 600 ; N f022 ; B 235 -158 337 -58 ; -C -1 ; WX 600 ; N combininggraveaccent ; B 361 632 528 783 ; -C -1 ; WX 600 ; N combiningacuteaccent ; B 332 632 499 783 ; -C -1 ; WX 600 ; N f01d ; B 186 489 503 589 ; -C -1 ; WX 600 ; N combiningdotbelow ; B 235 -158 337 -58 ; -C -1 ; WX 600 ; N f023 ; B 235 -158 337 -58 ; -C -1 ; WX 600 ; N f029 ; B 235 -158 337 -58 ; -C -1 ; WX 600 ; N f02a ; B 235 -158 337 -58 ; -C -1 ; WX 600 ; N f02b ; B 235 -158 337 -58 ; -C -1 ; WX 600 ; N f024 ; B 235 -158 337 -58 ; -C -1 ; WX 600 ; N f025 ; B 235 -158 337 -58 ; -C -1 ; WX 600 ; N f026 ; B 235 -158 337 -58 ; -C -1 ; WX 600 ; N f027 ; B 235 -158 337 -58 ; -C -1 ; WX 600 ; N f028 ; B 235 -158 337 -58 ; -C -1 ; WX 600 ; N f02d ; B 292 682 617 783 ; -C -1 ; WX 600 ; N f02e ; B 290 682 615 783 ; -C -1 ; WX 600 ; N f02f ; B 316 682 641 783 ; -C -1 ; WX 600 ; N f030 ; B 305 682 629 783 ; -C -1 ; WX 600 ; N Adotbelow ; B 33 -158 619 571 ; -C -1 ; WX 600 ; N adotbelow ; B 92 -158 547 438 ; -C -1 ; WX 600 ; N Ahookabove ; B 33 0 619 783 ; -C -1 ; WX 600 ; N ahookabove ; B 92 -16 547 626 ; -C -1 ; WX 600 ; N Acircumflexacute ; B 33 0 619 783 ; -C -1 ; WX 600 ; N acircumflexacute ; B 92 -16 552 783 ; -C -1 ; WX 600 ; N Acircumflexgrave ; B 33 0 619 783 ; -C -1 ; WX 600 ; N acircumflexgrave ; B 92 -16 552 783 ; -C -1 ; WX 600 ; N Acircumflexhookabove ; B 33 0 619 783 ; -C -1 ; WX 600 ; N acircumflexhookabove ; B 92 -16 552 783 ; -C -1 ; WX 600 ; N Acircumflextilde ; B 33 0 631 783 ; -C -1 ; WX 600 ; N acircumflextilde ; B 92 -16 615 783 ; -C -1 ; WX 600 ; N Acircumflexdotbelow ; B 33 -158 619 680 ; -C -1 ; WX 600 ; N acircumflexdotbelow ; B 92 -158 552 640 ; -C -1 ; WX 600 ; N Abreveacute ; B 33 0 619 783 ; -C -1 ; WX 600 ; N abreveacute ; B 92 -16 570 783 ; -C -1 ; WX 600 ; N Abrevegrave ; B 33 0 619 783 ; -C -1 ; WX 600 ; N abrevegrave ; B 92 -16 570 783 ; -C -1 ; WX 600 ; N Abrevehookabove ; B 33 0 619 783 ; -C -1 ; WX 600 ; N abrevehookabove ; B 92 -16 570 783 ; -C -1 ; WX 600 ; N Abrevetilde ; B 33 0 619 795 ; -C -1 ; WX 600 ; N abrevetilde ; B 92 -16 610 783 ; -C -1 ; WX 600 ; N Abrevedotbelow ; B 33 -158 619 680 ; -C -1 ; WX 600 ; N abrevedotbelow ; B 92 -158 570 634 ; -C -1 ; WX 600 ; N Edotbelow ; B 47 -158 623 571 ; -C -1 ; WX 600 ; N edotbelow ; B 104 -158 573 438 ; -C -1 ; WX 600 ; N Ehookabove ; B 47 0 623 783 ; -C -1 ; WX 600 ; N ehookabove ; B 104 -16 573 626 ; -C -1 ; WX 600 ; N Etilde ; B 47 0 623 733 ; -C -1 ; WX 600 ; N etilde ; B 104 -16 573 589 ; -C -1 ; WX 600 ; N Ecircumflexacute ; B 47 0 623 783 ; -C -1 ; WX 600 ; N ecircumflexacute ; B 104 -16 573 783 ; -C -1 ; WX 600 ; N Ecircumflexgrave ; B 47 0 623 783 ; -C -1 ; WX 600 ; N ecircumflexgrave ; B 104 -16 573 783 ; -C -1 ; WX 600 ; N Ecircumflexhookabove ; B 47 0 623 783 ; -C -1 ; WX 600 ; N ecircumflexhookabove ; B 104 -16 573 783 ; -C -1 ; WX 600 ; N Ecircumflextilde ; B 47 0 623 783 ; -C -1 ; WX 600 ; N ecircumflextilde ; B 104 -16 615 783 ; -C -1 ; WX 600 ; N Ecircumflexdotbelow ; B 47 -158 623 680 ; -C -1 ; WX 600 ; N ecircumflexdotbelow ; B 104 -158 573 640 ; -C -1 ; WX 600 ; N Ihookabove ; B 116 0 606 783 ; -C -1 ; WX 600 ; N ihookabove ; B 95 0 514 626 ; -C -1 ; WX 600 ; N Idotbelow ; B 116 -158 606 571 ; -C -1 ; WX 600 ; N idotbelow ; B 96 -158 515 633 ; -C -1 ; WX 600 ; N Odotbelow ; B 103 -158 619 584 ; -C -1 ; WX 600 ; N odotbelow ; B 111 -158 579 438 ; -C -1 ; WX 600 ; N Ohookabove ; B 103 -16 619 783 ; -C -1 ; WX 600 ; N ohookabove ; B 111 -16 579 626 ; -C -1 ; WX 600 ; N Ocircumflexacute ; B 103 -16 619 783 ; -C -1 ; WX 600 ; N ocircumflexacute ; B 111 -16 579 783 ; -C -1 ; WX 600 ; N Ocircumflexgrave ; B 103 -16 619 783 ; -C -1 ; WX 600 ; N ocircumflexgrave ; B 111 -16 579 783 ; -C -1 ; WX 600 ; N Ocircumflexhookabove ; B 103 -16 619 783 ; -C -1 ; WX 600 ; N ocircumflexhookabove ; B 111 -16 579 783 ; -C -1 ; WX 600 ; N Ocircumflextilde ; B 103 -16 626 783 ; -C -1 ; WX 600 ; N ocircumflextilde ; B 111 -16 615 783 ; -C -1 ; WX 600 ; N Ocircumflexdotbelow ; B 103 -158 619 680 ; -C -1 ; WX 600 ; N ocircumflexdotbelow ; B 111 -158 579 640 ; -C -1 ; WX 600 ; N Ohornacute ; B 103 -16 681 779 ; -C -1 ; WX 600 ; N ohornacute ; B 111 -16 641 649 ; -C -1 ; WX 600 ; N Ohorngrave ; B 103 -16 681 779 ; -C -1 ; WX 600 ; N ohorngrave ; B 111 -16 641 649 ; -C -1 ; WX 600 ; N Ohornhookabove ; B 103 -16 681 783 ; -C -1 ; WX 600 ; N ohornhookabove ; B 111 -16 641 626 ; -C -1 ; WX 600 ; N Ohorntilde ; B 103 -16 681 733 ; -C -1 ; WX 600 ; N ohorntilde ; B 111 -16 641 589 ; -C -1 ; WX 600 ; N Ohorndotbelow ; B 103 -158 681 584 ; -C -1 ; WX 600 ; N ohorndotbelow ; B 111 -158 641 438 ; -C -1 ; WX 600 ; N Udotbelow ; B 137 -158 678 571 ; -C -1 ; WX 600 ; N udotbelow ; B 129 -158 571 423 ; -C -1 ; WX 600 ; N Uhookabove ; B 137 -16 678 783 ; -C -1 ; WX 600 ; N uhookabove ; B 129 -16 571 626 ; -C -1 ; WX 600 ; N Uhornacute ; B 137 -16 762 779 ; -C -1 ; WX 600 ; N uhornacute ; B 129 -16 659 649 ; -C -1 ; WX 600 ; N Uhorngrave ; B 137 -16 762 779 ; -C -1 ; WX 600 ; N uhorngrave ; B 129 -16 659 649 ; -C -1 ; WX 600 ; N Uhornhookabove ; B 137 -16 762 783 ; -C -1 ; WX 600 ; N uhornhookabove ; B 129 -16 659 626 ; -C -1 ; WX 600 ; N Uhorntilde ; B 137 -16 762 733 ; -C -1 ; WX 600 ; N uhorntilde ; B 129 -16 659 589 ; -C -1 ; WX 600 ; N Uhorndotbelow ; B 137 -158 762 648 ; -C -1 ; WX 600 ; N uhorndotbelow ; B 129 -158 659 429 ; -C -1 ; WX 600 ; N Ydotbelow ; B 150 -158 668 571 ; -C -1 ; WX 600 ; N ydotbelow ; B 15 -188 636 423 ; -C -1 ; WX 600 ; N Yhookabove ; B 150 0 668 783 ; -C -1 ; WX 600 ; N yhookabove ; B 15 -188 636 626 ; -C -1 ; WX 600 ; N Ytilde ; B 150 0 668 733 ; -C -1 ; WX 600 ; N ytilde ; B 15 -188 636 589 ; -C -1 ; WX 600 ; N uni01CD ; B 33 0 619 781 ; -C -1 ; WX 600 ; N uni01CE ; B 92 -16 567 634 ; -C -1 ; WX 600 ; N _b_899 ; B 116 0 606 781 ; -C -1 ; WX 600 ; N uni01D0 ; B 95 0 562 634 ; -C -1 ; WX 600 ; N uni01D1 ; B 103 -16 619 781 ; -C -1 ; WX 600 ; N uni01D2 ; B 111 -16 579 634 ; -C -1 ; WX 600 ; N uni01D3 ; B 137 -16 678 781 ; -C -1 ; WX 600 ; N uni01D4 ; B 129 -16 571 634 ; -C -1 ; WX 600 ; N uni01D5 ; B 137 -16 678 782 ; -C -1 ; WX 600 ; N uni01D6 ; B 129 -16 574 703 ; -C -1 ; WX 600 ; N uni01D7 ; B 137 -16 678 783 ; -C -1 ; WX 600 ; N uni01D8 ; B 129 -16 575 771 ; -C -1 ; WX 600 ; N uni01D9 ; B 137 -16 678 782 ; -C -1 ; WX 600 ; N uni01DA ; B 129 -16 578 771 ; -C -1 ; WX 600 ; N uni01DB ; B 137 -16 678 783 ; -C -1 ; WX 600 ; N uni01DC ; B 129 -16 571 771 ; -C -1 ; WX 600 ; N _d_913 ; B 268 624 598 782 ; -C -1 ; WX 600 ; N _d_914 ; B 277 624 613 783 ; -C -1 ; WX 600 ; N _d_915 ; B 277 624 613 782 ; -C -1 ; WX 600 ; N _d_916 ; B 277 624 613 783 ; -C -1 ; WX 600 ; N _d_917 ; B 281 662 574 703 ; -C -1 ; WX 600 ; N _d_918 ; B 256 521 547 600 ; -C -1 ; WX 600 ; N uni0492 ; B 47 0 671 571 ; -C -1 ; WX 600 ; N uni0493 ; B 47 0 639 423 ; -C -1 ; WX 600 ; N uni0496 ; B 1 -125 694 572 ; -C -1 ; WX 600 ; N uni0497 ; B 14 -125 655 423 ; -C -1 ; WX 600 ; N uni049a ; B 69 -125 665 572 ; -C -1 ; WX 600 ; N uni049b ; B 67 -125 620 423 ; -C -1 ; WX 600 ; N uni049c ; B 69 0 665 572 ; -C -1 ; WX 600 ; N uni049d ; B 67 0 620 423 ; -C -1 ; WX 600 ; N uni04a2 ; B 56 -125 672 572 ; -C -1 ; WX 600 ; N uni04a3 ; B 56 -125 631 423 ; -C -1 ; WX 600 ; N uni04ae ; B 150 0 668 571 ; -C -1 ; WX 600 ; N uni04af ; B 124 -188 636 423 ; -C -1 ; WX 600 ; N uni04b0 ; B 165 0 668 571 ; -C -1 ; WX 600 ; N uni04b1 ; B 118 -188 636 423 ; -C -1 ; WX 600 ; N uni04b2 ; B 43 -125 667 571 ; -C -1 ; WX 600 ; N uni04b3 ; B 53 -125 616 423 ; -C -1 ; WX 600 ; N uni04b8 ; B 129 0 656 571 ; -C -1 ; WX 600 ; N uni04b9 ; B 115 0 629 423 ; -C -1 ; WX 600 ; N uni04ba ; B 56 0 583 571 ; -C -1 ; WX 600 ; N uni04bb ; B 57 0 571 423 ; -C -1 ; WX 600 ; N uni018f ; B 78 -16 626 584 ; -C -1 ; WX 600 ; N uni0259 ; B 104 -16 573 438 ; -C -1 ; WX 600 ; N uni04e8 ; B 103 -16 619 584 ; -C -1 ; WX 600 ; N uni04e9 ; B 111 -16 579 438 ; -EndCharMetrics -EndFontMetrics +StartFontMetrics 4.1 +FontName CourierNewPS-ItalicMT +FullName Courier New Italic +Notice Typeface The Monotype Corporation plc. Data The Monotype Corporation plc/Type Solutions Inc. 1990-1992. All Rights Reserved +EncodingScheme FontSpecific +FamilyName Courier New +Weight Italic +Version Version 2.90 +Characters 943 +ItalicAngle -12.0 +Ascender 833 +Descender -300 +UnderlineThickness 41 +UnderlinePosition -233 +IsFixedPitch true +FontBBox -67 -274 800 1000 +StartCharMetrics 978 +C 0 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 1 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 2 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 3 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 4 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 5 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 6 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 7 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 8 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 9 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 10 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 11 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 12 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 13 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 14 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 15 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 16 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 17 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 18 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 19 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 20 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 21 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 22 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 23 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 24 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 25 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 26 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 27 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 28 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 29 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 30 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 31 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 32 ; WX 600 ; N space ; B 247 -15 466 627 ; +C 33 ; WX 600 ; N exclam ; B 247 -15 466 627 ; +C 34 ; WX 600 ; N quotedbl ; B 242 320 602 613 ; +C 35 ; WX 600 ; N numbersign ; B 136 -63 590 657 ; +C 36 ; WX 600 ; N dollar ; B 129 -93 584 665 ; +C 37 ; WX 600 ; N percent ; B 172 -12 618 623 ; +C 38 ; WX 600 ; N ampersand ; B 152 -16 550 526 ; +C 39 ; WX 600 ; N quotesingle ; B 345 320 495 613 ; +C 40 ; WX 600 ; N parenleft ; B 336 -126 587 613 ; +C 41 ; WX 600 ; N parenright ; B 124 -127 374 613 ; +C 42 ; WX 600 ; N asterisk ; B 210 253 586 613 ; +C 43 ; WX 600 ; N plus ; B 130 33 591 538 ; +C 44 ; WX 600 ; N comma ; B 179 -146 442 147 ; +C 45 ; WX 600 ; N hyphen ; B 145 253 576 312 ; +C 46 ; WX 600 ; N period ; B 234 -15 388 118 ; +C 47 ; WX 600 ; N slash ; B 99 -83 630 678 ; +C 48 ; WX 600 ; N zero ; B 156 -15 574 627 ; +C 49 ; WX 600 ; N one ; B 115 0 493 621 ; +C 50 ; WX 600 ; N two ; B 83 0 579 627 ; +C 51 ; WX 600 ; N three ; B 110 -15 582 627 ; +C 52 ; WX 600 ; N four ; B 141 0 548 613 ; +C 53 ; WX 600 ; N five ; B 113 -15 586 613 ; +C 54 ; WX 600 ; N six ; B 187 -15 637 627 ; +C 55 ; WX 600 ; N seven ; B 215 -1 610 613 ; +C 56 ; WX 600 ; N eight ; B 144 -15 578 627 ; +C 57 ; WX 600 ; N nine ; B 140 -15 589 627 ; +C 58 ; WX 600 ; N colon ; B 234 -15 452 423 ; +C 59 ; WX 600 ; N semicolon ; B 185 -104 502 423 ; +C 60 ; WX 600 ; N less ; B 108 32 638 538 ; +C 61 ; WX 600 ; N equal ; B 94 192 628 381 ; +C 62 ; WX 600 ; N greater ; B 83 32 613 538 ; +C 63 ; WX 600 ; N question ; B 232 -15 582 586 ; +C 64 ; WX 600 ; N at ; B 139 -63 564 633 ; +C 65 ; WX 600 ; N A ; B 33 0 619 571 ; +C 66 ; WX 600 ; N B ; B 46 0 593 571 ; +C 67 ; WX 600 ; N C ; B 114 -16 645 584 ; +C 68 ; WX 600 ; N D ; B 75 0 625 571 ; +C 69 ; WX 600 ; N E ; B 47 0 623 571 ; +C 70 ; WX 600 ; N F ; B 91 0 687 571 ; +C 71 ; WX 600 ; N G ; B 108 -16 640 584 ; +C 72 ; WX 600 ; N H ; B 57 0 672 572 ; +C 73 ; WX 600 ; N I ; B 116 0 606 571 ; +C 74 ; WX 600 ; N J ; B 100 -16 703 571 ; +C 75 ; WX 600 ; N K ; B 68 0 691 571 ; +C 76 ; WX 600 ; N L ; B 66 0 588 571 ; +C 77 ; WX 600 ; N M ; B 16 0 702 571 ; +C 78 ; WX 600 ; N N ; B 47 0 681 571 ; +C 79 ; WX 600 ; N O ; B 103 -16 619 584 ; +C 80 ; WX 600 ; N P ; B 106 0 648 571 ; +C 81 ; WX 600 ; N Q ; B 103 -117 619 584 ; +C 82 ; WX 600 ; N R ; B 47 0 598 571 ; +C 83 ; WX 600 ; N S ; B 95 -16 605 584 ; +C 84 ; WX 600 ; N T ; B 149 0 651 571 ; +C 85 ; WX 600 ; N U ; B 137 -16 678 571 ; +C 86 ; WX 600 ; N V ; B 125 0 710 571 ; +C 87 ; WX 600 ; N W ; B 121 0 698 571 ; +C 88 ; WX 600 ; N X ; B 43 0 667 571 ; +C 89 ; WX 600 ; N Y ; B 150 0 668 571 ; +C 90 ; WX 600 ; N Z ; B 104 0 598 571 ; +C 91 ; WX 600 ; N bracketleft ; B 253 -126 574 613 ; +C 92 ; WX 600 ; N backslash ; B 250 -85 475 675 ; +C 93 ; WX 600 ; N bracketright ; B 131 -126 453 613 ; +C 94 ; WX 600 ; N asciicircum ; B 192 359 570 625 ; +C 95 ; WX 600 ; N underscore ; B -67 -274 561 -233 ; +C 96 ; WX 600 ; N grave ; B 282 499 427 649 ; +C 97 ; WX 600 ; N a ; B 92 -16 547 438 ; +C 98 ; WX 600 ; N b ; B 26 -16 593 613 ; +C 99 ; WX 600 ; N c ; B 122 -16 598 438 ; +C 100 ; WX 600 ; N d ; B 101 -16 631 613 ; +C 101 ; WX 600 ; N e ; B 104 -16 573 438 ; +C 102 ; WX 600 ; N f ; B 109 0 667 613 ; +C 103 ; WX 600 ; N g ; B 104 -188 648 438 ; +C 104 ; WX 600 ; N h ; B 55 0 559 613 ; +C 105 ; WX 600 ; N i ; B 96 0 515 633 ; +C 106 ; WX 600 ; N j ; B 52 -188 493 633 ; +C 107 ; WX 600 ; N k ; B 68 0 586 613 ; +C 108 ; WX 600 ; N l ; B 96 0 515 613 ; +C 109 ; WX 600 ; N m ; B 14 0 604 438 ; +C 110 ; WX 600 ; N n ; B 57 0 547 438 ; +C 111 ; WX 600 ; N o ; B 111 -16 579 438 ; +C 112 ; WX 600 ; N p ; B -14 -188 595 438 ; +C 113 ; WX 600 ; N q ; B 105 -188 669 438 ; +C 114 ; WX 600 ; N r ; B 87 0 623 433 ; +C 115 ; WX 600 ; N s ; B 105 -16 563 438 ; +C 116 ; WX 600 ; N t ; B 158 -16 554 571 ; +C 117 ; WX 600 ; N u ; B 129 -16 571 423 ; +C 118 ; WX 600 ; N v ; B 114 0 657 423 ; +C 119 ; WX 600 ; N w ; B 113 0 658 423 ; +C 120 ; WX 600 ; N x ; B 53 0 616 423 ; +C 121 ; WX 600 ; N y ; B 15 -188 636 423 ; +C 122 ; WX 600 ; N z ; B 116 0 569 423 ; +C 123 ; WX 600 ; N braceleft ; B 249 -127 529 613 ; +C 124 ; WX 600 ; N bar ; B 279 -126 321 613 ; +C 125 ; WX 600 ; N braceright ; B 174 -127 455 613 ; +C 126 ; WX 600 ; N asciitilde ; B 147 211 575 359 ; +C 127 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 128 ; WX 600 ; N Euro ; B 17 -16 634 584 ; +C 129 ; WX 600 ; N afii10052 ; B 47 0 671 796 ; +C 130 ; WX 600 ; N quotesinglbase ; B 118 -159 381 135 ; +C 131 ; WX 600 ; N florin ; B 74 -94 646 628 ; +C 132 ; WX 600 ; N quotedblbase ; B 87 -127 542 125 ; +C 133 ; WX 600 ; N ellipsis ; B 56 -15 559 85 ; +C 134 ; WX 600 ; N dagger ; B 208 -63 563 613 ; +C 135 ; WX 600 ; N daggerdbl ; B 154 -63 563 613 ; +C 136 ; WX 600 ; N circumflex ; B 260 498 552 640 ; +C 137 ; WX 600 ; N perthousand ; B 138 -10 598 625 ; +C 138 ; WX 600 ; N Scaron ; B 95 -16 614 778 ; +C 139 ; WX 600 ; N guilsinglleft ; B 191 0 493 424 ; +C 140 ; WX 600 ; N OE ; B 61 0 693 571 ; +C 141 ; WX 600 ; N afii10061 ; B 69 0 665 796 ; +C 142 ; WX 600 ; N Zcaron ; B 104 0 615 778 ; +C 143 ; WX 600 ; N afii10145 ; B 58 -125 679 571 ; +C 144 ; WX 600 ; N quotedblbase ; B 87 -127 542 125 ; +C 145 ; WX 600 ; N quoteleft ; B 378 319 530 613 ; +C 146 ; WX 600 ; N quoteright ; B 216 319 479 613 ; +C 147 ; WX 600 ; N quotedblleft ; B 218 360 575 613 ; +C 148 ; WX 600 ; N quotedblright ; B 188 360 643 613 ; +C 149 ; WX 600 ; N bullet ; B 243 190 489 432 ; +C 150 ; WX 600 ; N endash ; B 131 265 591 306 ; +C 151 ; WX 600 ; N emdash ; B 54 266 669 307 ; +C 152 ; WX 600 ; N tilde ; B 251 489 568 589 ; +C 153 ; WX 600 ; N trademark ; B 68 308 702 651 ; +C 154 ; WX 600 ; N scaron ; B 105 -16 572 634 ; +C 155 ; WX 600 ; N guilsinglright ; B 201 0 503 424 ; +C 156 ; WX 600 ; N oe ; B 47 -16 635 438 ; +C 157 ; WX 600 ; N afii10109 ; B 67 0 620 649 ; +C 158 ; WX 600 ; N zcaron ; B 116 0 572 634 ; +C 159 ; WX 600 ; N Ydieresis ; B 150 0 668 730 ; +C 160 ; WX 600 ; N space ; B 247 -15 466 627 ; +C 161 ; WX 600 ; N exclamdown ; B 227 -190 441 429 ; +C 162 ; WX 600 ; N cent ; B 174 0 566 652 ; +C 163 ; WX 600 ; N sterling ; B 87 0 543 587 ; +C 164 ; WX 600 ; N currency ; B 125 97 601 496 ; +C 165 ; WX 600 ; N yen ; B 161 0 668 571 ; +C 166 ; WX 600 ; N brokenbar ; B 279 -126 321 613 ; +C 167 ; WX 600 ; N section ; B 100 -63 617 613 ; +C 168 ; WX 600 ; N dieresis ; B 270 521 560 600 ; +C 169 ; WX 600 ; N copyright ; B 60 -13 657 584 ; +C 170 ; WX 600 ; N ordfeminine ; B 155 355 464 640 ; +C 171 ; WX 600 ; N guillemotleft ; B 93 0 624 424 ; +C 172 ; WX 600 ; N logicalnot ; B 72 33 599 306 ; +C 173 ; WX 600 ; N hyphen ; B 145 253 576 312 ; +C 174 ; WX 600 ; N registered ; B 60 -13 657 584 ; +C 175 ; WX 600 ; N overscore ; B 121 672 749 713 ; +C 176 ; WX 600 ; N degree ; B 165 457 436 728 ; +C 177 ; WX 600 ; N plusminus ; B 72 0 591 585 ; +C 178 ; WX 600 ; N twosuperior ; B 165 301 470 627 ; +C 179 ; WX 600 ; N threesuperior ; B 181 293 471 627 ; +C 180 ; WX 600 ; N acute ; B 385 499 576 649 ; +C 181 ; WX 600 ; N mu1 ; B 91 -188 571 423 ; +C 182 ; WX 600 ; N paragraph ; B 156 -63 646 613 ; +C 183 ; WX 600 ; N periodcentered ; B 290 245 442 377 ; +C 184 ; WX 600 ; N cedilla ; B 188 -163 351 15 ; +C 185 ; WX 600 ; N onesuperior ; B 185 301 420 626 ; +C 186 ; WX 600 ; N ordmasculine ; B 169 355 487 640 ; +C 187 ; WX 600 ; N guillemotright ; B 90 0 621 424 ; +C 188 ; WX 600 ; N onequarter ; B 54 0 632 626 ; +C 189 ; WX 600 ; N onehalf ; B 59 0 650 626 ; +C 190 ; WX 600 ; N threequarters ; B 57 0 661 627 ; +C 191 ; WX 600 ; N questiondown ; B 104 -191 455 433 ; +C 192 ; WX 600 ; N Agrave ; B 12 0 598 779 ; +C 193 ; WX 600 ; N Aacute ; B 12 0 598 779 ; +C 194 ; WX 600 ; N Acircumflex ; B 12 0 598 771 ; +C 195 ; WX 600 ; N Atilde ; B 12 0 598 720 ; +C 196 ; WX 600 ; N Adieresis ; B 12 0 598 730 ; +C 197 ; WX 600 ; N Aring ; B 33 0 619 783 ; +C 198 ; WX 600 ; N AE ; B 13 0 693 571 ; +C 199 ; WX 600 ; N Ccedilla ; B 114 -163 645 584 ; +C 200 ; WX 600 ; N Egrave ; B 47 0 623 779 ; +C 201 ; WX 600 ; N Eacute ; B 47 0 623 779 ; +C 202 ; WX 600 ; N Ecircumflex ; B 47 0 623 770 ; +C 203 ; WX 600 ; N Edieresis ; B 47 0 623 730 ; +C 204 ; WX 600 ; N Igrave ; B 116 0 606 779 ; +C 205 ; WX 600 ; N Iacute ; B 116 0 609 779 ; +C 206 ; WX 600 ; N Icircumflex ; B 116 0 606 770 ; +C 207 ; WX 600 ; N Idieresis ; B 116 0 606 730 ; +C 208 ; WX 600 ; N Eth ; B 46 0 596 571 ; +C 209 ; WX 600 ; N Ntilde ; B 47 0 681 733 ; +C 210 ; WX 600 ; N Ograve ; B 103 -16 619 779 ; +C 211 ; WX 600 ; N Oacute ; B 103 -16 619 779 ; +C 212 ; WX 600 ; N Ocircumflex ; B 103 -16 619 770 ; +C 213 ; WX 600 ; N Otilde ; B 103 -16 619 720 ; +C 214 ; WX 600 ; N Odieresis ; B 103 -16 619 730 ; +C 215 ; WX 600 ; N multiply ; B 208 116 572 454 ; +C 216 ; WX 600 ; N Oslash ; B 34 -41 687 611 ; +C 217 ; WX 600 ; N Ugrave ; B 137 -16 678 779 ; +C 218 ; WX 600 ; N Uacute ; B 137 -16 678 779 ; +C 219 ; WX 600 ; N Ucircumflex ; B 137 -16 678 770 ; +C 220 ; WX 600 ; N Udieresis ; B 137 -16 678 730 ; +C 221 ; WX 600 ; N Yacute ; B 150 0 668 792 ; +C 222 ; WX 600 ; N Thorn ; B 91 0 609 571 ; +C 223 ; WX 600 ; N germandbls ; B 47 -16 543 613 ; +C 224 ; WX 600 ; N agrave ; B 92 -16 547 648 ; +C 225 ; WX 600 ; N aacute ; B 92 -16 559 649 ; +C 226 ; WX 600 ; N acircumflex ; B 92 -16 552 640 ; +C 227 ; WX 600 ; N atilde ; B 92 -16 569 589 ; +C 228 ; WX 600 ; N adieresis ; B 92 -16 547 600 ; +C 229 ; WX 600 ; N aring ; B 92 -16 547 666 ; +C 230 ; WX 600 ; N ae ; B 36 -16 635 438 ; +C 231 ; WX 600 ; N ccedilla ; B 122 -163 598 438 ; +C 232 ; WX 600 ; N egrave ; B 104 -16 573 653 ; +C 233 ; WX 600 ; N eacute ; B 104 -16 573 652 ; +C 234 ; WX 600 ; N ecircumflex ; B 104 -16 573 640 ; +C 235 ; WX 600 ; N edieresis ; B 104 -16 573 600 ; +C 236 ; WX 600 ; N igrave ; B 95 0 514 645 ; +C 237 ; WX 600 ; N iacute ; B 95 0 514 648 ; +C 238 ; WX 600 ; N icircumflex ; B 95 0 540 640 ; +C 239 ; WX 600 ; N idieresis ; B 95 0 523 600 ; +C 240 ; WX 600 ; N eth ; B 103 -15 598 610 ; +C 241 ; WX 600 ; N ntilde ; B 57 0 568 589 ; +C 242 ; WX 600 ; N ograve ; B 111 -16 579 649 ; +C 243 ; WX 600 ; N oacute ; B 111 -16 579 649 ; +C 244 ; WX 600 ; N ocircumflex ; B 111 -16 579 640 ; +C 245 ; WX 600 ; N otilde ; B 111 -16 579 589 ; +C 246 ; WX 600 ; N odieresis ; B 111 -16 579 600 ; +C 247 ; WX 600 ; N divide ; B 130 52 591 519 ; +C 248 ; WX 600 ; N oslash ; B 50 -42 642 462 ; +C 249 ; WX 600 ; N ugrave ; B 129 -16 571 649 ; +C 250 ; WX 600 ; N uacute ; B 129 -16 571 649 ; +C 251 ; WX 600 ; N ucircumflex ; B 129 -16 571 640 ; +C 252 ; WX 600 ; N udieresis ; B 129 -16 571 600 ; +C 253 ; WX 600 ; N yacute ; B 15 -188 636 649 ; +C 254 ; WX 600 ; N thorn ; B -14 -188 597 613 ; +C 255 ; WX 600 ; N ydieresis ; B 15 -188 636 600 ; +C -1 ; WX 0 ; N .null ; B 247 -15 466 627 ; +C -1 ; WX 600 ; N nonmarkingreturn ; B 247 -15 466 627 ; +C -1 ; WX 600 ; N notequal ; B 94 -35 628 608 ; +C -1 ; WX 600 ; N infinity ; B 112 194 605 413 ; +C -1 ; WX 600 ; N lessequal ; B 84 118 650 697 ; +C -1 ; WX 600 ; N greaterequal ; B 56 118 615 697 ; +C -1 ; WX 600 ; N partialdiff ; B 86 -15 488 613 ; +C -1 ; WX 600 ; N summation ; B 21 -188 538 613 ; +C -1 ; WX 600 ; N product ; B 26 -188 574 613 ; +C -1 ; WX 600 ; N pi1 ; B 85 0 604 423 ; +C -1 ; WX 600 ; N integral ; B -18 -183 788 818 ; +C -1 ; WX 600 ; N Ohm ; B 79 0 619 581 ; +C -1 ; WX 600 ; N radical ; B 67 -38 575 913 ; +C -1 ; WX 600 ; N approxequal ; B 124 141 599 430 ; +C -1 ; WX 600 ; N increment ; B 40 0 555 563 ; +C -1 ; WX 600 ; N lozenge ; B 76 0 525 694 ; +C -1 ; WX 600 ; N fraction ; B 84 141 647 478 ; +C -1 ; WX 600 ; N fi ; B 26 0 636 633 ; +C -1 ; WX 600 ; N fl ; B 26 0 631 613 ; +C -1 ; WX 600 ; N dotlessi ; B 95 0 514 423 ; +C -1 ; WX 600 ; N macron ; B 266 525 559 567 ; +C -1 ; WX 600 ; N breve ; B 277 497 573 634 ; +C -1 ; WX 600 ; N dotaccent ; B 363 510 465 610 ; +C -1 ; WX 600 ; N ring ; B 323 492 504 666 ; +C -1 ; WX 600 ; N hungarumlaut ; B 257 498 575 648 ; +C -1 ; WX 600 ; N ogonek ; B 269 -144 407 13 ; +C -1 ; WX 600 ; N caron ; B 280 492 572 634 ; +C -1 ; WX 600 ; N Lslash ; B 65 0 588 571 ; +C -1 ; WX 600 ; N lslash ; B 96 0 528 613 ; +C -1 ; WX 600 ; N minus ; B 130 265 591 306 ; +C -1 ; WX 600 ; N franc ; B 91 0 687 571 ; +C -1 ; WX 600 ; N Gbreve ; B 108 -16 640 781 ; +C -1 ; WX 600 ; N gbreve ; B 104 -188 648 634 ; +C -1 ; WX 600 ; N Idot ; B 116 0 606 757 ; +C -1 ; WX 600 ; N Scedilla ; B 95 -163 605 584 ; +C -1 ; WX 600 ; N scedilla ; B 105 -163 563 438 ; +C -1 ; WX 600 ; N Cacute ; B 114 -16 645 795 ; +C -1 ; WX 600 ; N cacute ; B 122 -16 598 649 ; +C -1 ; WX 600 ; N Ccaron ; B 114 -16 645 781 ; +C -1 ; WX 600 ; N ccaron ; B 122 -16 598 634 ; +C -1 ; WX 600 ; N dmacron ; B 101 -16 684 613 ; +C -1 ; WX 600 ; N middot ; B 405 275 507 375 ; +C -1 ; WX 600 ; N Abreve ; B 33 0 619 781 ; +C -1 ; WX 600 ; N abreve ; B 92 -16 570 634 ; +C -1 ; WX 600 ; N Aogonek ; B 12 -125 625 571 ; +C -1 ; WX 600 ; N aogonek ; B 92 -126 569 438 ; +C -1 ; WX 600 ; N Dcaron ; B 75 0 625 781 ; +C -1 ; WX 600 ; N dcaron ; B 101 -16 800 613 ; +C -1 ; WX 600 ; N Dslash ; B 46 0 596 571 ; +C -1 ; WX 600 ; N Eogonek ; B 47 -126 623 571 ; +C -1 ; WX 600 ; N eogonek ; B 104 -141 573 438 ; +C -1 ; WX 600 ; N Ecaron ; B 47 0 623 781 ; +C -1 ; WX 600 ; N ecaron ; B 104 -16 573 634 ; +C -1 ; WX 600 ; N Lacute ; B 66 0 588 795 ; +C -1 ; WX 600 ; N lacute ; B 96 0 564 799 ; +C -1 ; WX 600 ; N Lcaron ; B 66 0 623 571 ; +C -1 ; WX 600 ; N lcaron ; B 96 0 626 613 ; +C -1 ; WX 600 ; N Ldot ; B 66 0 588 571 ; +C -1 ; WX 600 ; N ldot ; B 96 0 548 613 ; +C -1 ; WX 600 ; N Nacute ; B 47 0 681 795 ; +C -1 ; WX 600 ; N nacute ; B 57 0 549 649 ; +C -1 ; WX 600 ; N Ncaron ; B 47 0 681 781 ; +C -1 ; WX 600 ; N ncaron ; B 57 0 582 634 ; +C -1 ; WX 600 ; N Odblacute ; B 103 -16 683 795 ; +C -1 ; WX 600 ; N odblacute ; B 111 -16 643 648 ; +C -1 ; WX 600 ; N Racute ; B 47 0 598 795 ; +C -1 ; WX 600 ; N racute ; B 87 0 623 649 ; +C -1 ; WX 600 ; N Rcaron ; B 47 0 598 781 ; +C -1 ; WX 600 ; N rcaron ; B 87 0 623 634 ; +C -1 ; WX 600 ; N Sacute ; B 95 -16 605 795 ; +C -1 ; WX 600 ; N sacute ; B 105 -16 563 649 ; +C -1 ; WX 600 ; N Tcedilla ; B 149 -250 651 571 ; +C -1 ; WX 600 ; N tcedilla ; B 158 -256 554 571 ; +C -1 ; WX 600 ; N Tcaron ; B 149 0 651 781 ; +C -1 ; WX 600 ; N tcaron ; B 158 -16 730 613 ; +C -1 ; WX 600 ; N Uring ; B 137 -16 678 795 ; +C -1 ; WX 600 ; N uring ; B 129 -16 571 666 ; +C -1 ; WX 600 ; N Udblacute ; B 137 -16 678 795 ; +C -1 ; WX 600 ; N udblacute ; B 129 -16 625 648 ; +C -1 ; WX 600 ; N Zacute ; B 104 0 598 795 ; +C -1 ; WX 600 ; N zacute ; B 116 0 569 649 ; +C -1 ; WX 600 ; N Zdot ; B 104 0 598 757 ; +C -1 ; WX 600 ; N zdot ; B 116 0 569 610 ; +C -1 ; WX 600 ; N Gamma ; B 47 0 671 571 ; +C -1 ; WX 600 ; N Theta ; B 103 -16 619 584 ; +C -1 ; WX 600 ; N Phi ; B 103 0 624 571 ; +C -1 ; WX 600 ; N alpha ; B 93 -16 633 438 ; +C -1 ; WX 600 ; N delta ; B 128 -16 590 613 ; +C -1 ; WX 600 ; N epsilon ; B 151 -16 562 438 ; +C -1 ; WX 600 ; N sigma ; B 100 -16 657 438 ; +C -1 ; WX 600 ; N tau ; B 199 -16 547 423 ; +C -1 ; WX 600 ; N phi ; B 103 -188 598 438 ; +C -1 ; WX 600 ; N underscoredbl ; B -67 -274 561 -127 ; +C -1 ; WX 600 ; N exclamdbl ; B 134 -15 578 627 ; +C -1 ; WX 600 ; N nsuperior ; B 194 245 510 522 ; +C -1 ; WX 600 ; N peseta ; B 11 -7 624 571 ; +C -1 ; WX 600 ; N arrowleft ; B 1 50 599 277 ; +C -1 ; WX 600 ; N arrowup ; B 186 -136 414 424 ; +C -1 ; WX 600 ; N arrowright ; B 1 50 599 277 ; +C -1 ; WX 600 ; N arrowdown ; B 186 -136 414 424 ; +C -1 ; WX 600 ; N arrowboth ; B 1 50 599 278 ; +C -1 ; WX 600 ; N arrowupdn ; B 186 -135 414 463 ; +C -1 ; WX 600 ; N arrowupdnbse ; B 186 -196 414 463 ; +C -1 ; WX 600 ; N orthogonal ; B 1 0 599 597 ; +C -1 ; WX 600 ; N intersection ; B 83 -16 603 584 ; +C -1 ; WX 600 ; N equivalence ; B 78 119 644 455 ; +C -1 ; WX 600 ; N house ; B 75 0 525 563 ; +C -1 ; WX 600 ; N revlogicalnot ; B 82 33 649 306 ; +C -1 ; WX 600 ; N integraltp ; B 211 -251 645 848 ; +C -1 ; WX 600 ; N integralbt ; B 82 -251 516 848 ; +C -1 ; WX 600 ; N SF100000 ; B -7 219 607 292 ; +C -1 ; WX 600 ; N SF110000 ; B 264 -255 336 766 ; +C -1 ; WX 600 ; N SF010000 ; B 264 -255 607 292 ; +C -1 ; WX 600 ; N SF030000 ; B -7 -255 336 292 ; +C -1 ; WX 600 ; N SF020000 ; B 264 219 607 766 ; +C -1 ; WX 600 ; N SF040000 ; B -7 219 336 766 ; +C -1 ; WX 600 ; N SF080000 ; B 264 -255 607 766 ; +C -1 ; WX 600 ; N SF090000 ; B -7 -255 336 766 ; +C -1 ; WX 600 ; N SF060000 ; B -7 -255 607 292 ; +C -1 ; WX 600 ; N SF070000 ; B -7 219 607 766 ; +C -1 ; WX 600 ; N SF050000 ; B -7 -255 607 766 ; +C -1 ; WX 600 ; N SF430000 ; B -7 141 607 370 ; +C -1 ; WX 600 ; N SF240000 ; B 186 -255 414 766 ; +C -1 ; WX 600 ; N SF510000 ; B 264 -255 607 370 ; +C -1 ; WX 600 ; N SF520000 ; B 186 -255 607 292 ; +C -1 ; WX 600 ; N SF390000 ; B 186 -255 607 370 ; +C -1 ; WX 600 ; N SF220000 ; B -7 -255 336 370 ; +C -1 ; WX 600 ; N SF210000 ; B -7 -255 414 292 ; +C -1 ; WX 600 ; N SF250000 ; B -7 -255 414 370 ; +C -1 ; WX 600 ; N SF500000 ; B 264 141 607 766 ; +C -1 ; WX 600 ; N SF490000 ; B 186 219 607 766 ; +C -1 ; WX 600 ; N SF380000 ; B 186 141 607 766 ; +C -1 ; WX 600 ; N SF280000 ; B -7 141 336 766 ; +C -1 ; WX 600 ; N SF270000 ; B -7 219 414 766 ; +C -1 ; WX 600 ; N SF260000 ; B -7 141 414 766 ; +C -1 ; WX 600 ; N SF360000 ; B 264 -255 607 766 ; +C -1 ; WX 600 ; N SF370000 ; B 186 -255 607 766 ; +C -1 ; WX 600 ; N SF420000 ; B 186 -255 607 766 ; +C -1 ; WX 600 ; N SF190000 ; B -7 -255 336 766 ; +C -1 ; WX 600 ; N SF200000 ; B -7 -255 414 766 ; +C -1 ; WX 600 ; N SF230000 ; B -7 -255 414 766 ; +C -1 ; WX 600 ; N SF470000 ; B -7 -255 607 370 ; +C -1 ; WX 600 ; N SF480000 ; B -7 -255 607 292 ; +C -1 ; WX 600 ; N SF410000 ; B -7 -255 607 370 ; +C -1 ; WX 600 ; N SF450000 ; B -7 141 607 766 ; +C -1 ; WX 600 ; N SF460000 ; B -7 219 607 766 ; +C -1 ; WX 600 ; N SF400000 ; B -7 141 607 766 ; +C -1 ; WX 600 ; N SF540000 ; B -7 -255 607 766 ; +C -1 ; WX 600 ; N SF530000 ; B -7 -255 607 766 ; +C -1 ; WX 600 ; N SF440000 ; B -7 -255 607 766 ; +C -1 ; WX 600 ; N upblock ; B -7 255 607 766 ; +C -1 ; WX 600 ; N dnblock ; B -7 -255 607 255 ; +C -1 ; WX 600 ; N block ; B -7 -255 607 766 ; +C -1 ; WX 600 ; N lfblock ; B -7 -255 300 766 ; +C -1 ; WX 600 ; N rtblock ; B 300 -255 608 766 ; +C -1 ; WX 600 ; N ltshade ; B 44 -207 607 766 ; +C -1 ; WX 600 ; N shade ; B -7 -207 607 766 ; +C -1 ; WX 600 ; N dkshade ; B -7 -258 607 766 ; +C -1 ; WX 600 ; N filledbox ; B 1 0 599 598 ; +C -1 ; WX 600 ; N filledrect ; B 1 193 599 306 ; +C -1 ; WX 600 ; N triagup ; B 7 0 592 585 ; +C -1 ; WX 600 ; N triagrt ; B 1 -13 599 584 ; +C -1 ; WX 600 ; N triagdn ; B 7 -13 592 572 ; +C -1 ; WX 600 ; N triaglf ; B 1 -13 599 584 ; +C -1 ; WX 600 ; N circle ; B 85 67 515 497 ; +C -1 ; WX 600 ; N invbullet ; B 61 0 539 479 ; +C -1 ; WX 600 ; N invcircle ; B 19 0 583 564 ; +C -1 ; WX 600 ; N smileface ; B 1 -13 599 584 ; +C -1 ; WX 600 ; N invsmileface ; B 1 -13 599 584 ; +C -1 ; WX 600 ; N sun ; B 1 -69 599 529 ; +C -1 ; WX 600 ; N female ; B 157 39 444 563 ; +C -1 ; WX 600 ; N male ; B 90 122 511 563 ; +C -1 ; WX 600 ; N spade ; B 63 0 537 601 ; +C -1 ; WX 600 ; N club ; B 1 0 599 597 ; +C -1 ; WX 600 ; N heart ; B 53 -11 547 559 ; +C -1 ; WX 600 ; N diamond ; B 78 -12 523 597 ; +C -1 ; WX 600 ; N musicalnote ; B 132 14 440 563 ; +C -1 ; WX 600 ; N musicalnotedbl ; B 44 -21 528 566 ; +C -1 ; WX 600 ; N IJ ; B 4 -16 753 571 ; +C -1 ; WX 600 ; N ij ; B 8 -188 611 633 ; +C -1 ; WX 600 ; N napostrophe ; B 52 0 600 613 ; +C -1 ; WX 600 ; N minute ; B 345 320 495 613 ; +C -1 ; WX 600 ; N second ; B 242 320 602 613 ; +C -1 ; WX 600 ; N afii61248 ; B 172 -12 618 623 ; +C -1 ; WX 600 ; N afii61289 ; B 185 -16 489 584 ; +C -1 ; WX 600 ; N H22073 ; B 1 0 599 598 ; +C -1 ; WX 600 ; N H18543 ; B 242 187 490 435 ; +C -1 ; WX 600 ; N H18551 ; B 242 187 490 435 ; +C -1 ; WX 600 ; N H18533 ; B 85 67 515 497 ; +C -1 ; WX 600 ; N openbullet ; B 243 190 489 432 ; +C -1 ; WX 600 ; N Amacron ; B 33 0 619 713 ; +C -1 ; WX 600 ; N amacron ; B 92 -16 573 567 ; +C -1 ; WX 600 ; N Ccircumflex ; B 114 -16 645 786 ; +C -1 ; WX 600 ; N ccircumflex ; B 122 -16 598 640 ; +C -1 ; WX 600 ; N Cdot ; B 114 -16 645 757 ; +C -1 ; WX 600 ; N cdot ; B 122 -16 598 610 ; +C -1 ; WX 600 ; N Emacron ; B 47 0 623 713 ; +C -1 ; WX 600 ; N emacron ; B 104 -16 573 567 ; +C -1 ; WX 600 ; N Ebreve ; B 47 0 623 781 ; +C -1 ; WX 600 ; N ebreve ; B 104 -16 573 634 ; +C -1 ; WX 600 ; N Edot ; B 47 0 623 757 ; +C -1 ; WX 600 ; N edot ; B 104 -16 573 610 ; +C -1 ; WX 600 ; N Gcircumflex ; B 108 -16 640 786 ; +C -1 ; WX 600 ; N gcircumflex ; B 104 -188 648 640 ; +C -1 ; WX 600 ; N Gdot ; B 108 -16 640 757 ; +C -1 ; WX 600 ; N gdot ; B 104 -188 648 610 ; +C -1 ; WX 600 ; N Gcedilla ; B 108 -163 640 584 ; +C -1 ; WX 600 ; N gcedilla ; B 104 -188 648 690 ; +C -1 ; WX 600 ; N Hcircumflex ; B 57 0 672 788 ; +C -1 ; WX 600 ; N hcircumflex ; B 55 0 601 770 ; +C -1 ; WX 600 ; N Hbar ; B 56 0 651 571 ; +C -1 ; WX 600 ; N hbar ; B 55 0 559 613 ; +C -1 ; WX 600 ; N Itilde ; B 116 0 606 736 ; +C -1 ; WX 600 ; N itilde ; B 95 0 543 589 ; +C -1 ; WX 600 ; N Imacron ; B 116 0 606 714 ; +C -1 ; WX 600 ; N imacron ; B 95 0 533 567 ; +C -1 ; WX 600 ; N Ibreve ; B 116 0 608 781 ; +C -1 ; WX 600 ; N ibreve ; B 95 0 548 634 ; +C -1 ; WX 600 ; N Iogonek ; B 116 -141 606 571 ; +C -1 ; WX 600 ; N iogonek ; B 96 -141 515 633 ; +C -1 ; WX 600 ; N Jcircumflex ; B 100 -16 703 786 ; +C -1 ; WX 600 ; N jcircumflex ; B 52 -188 556 640 ; +C -1 ; WX 600 ; N Kcedilla ; B 68 -163 691 571 ; +C -1 ; WX 600 ; N kcedilla ; B 68 -163 586 613 ; +C -1 ; WX 600 ; N kgreenlandic ; B 93 0 598 423 ; +C -1 ; WX 600 ; N Lcedilla ; B 66 -163 588 571 ; +C -1 ; WX 600 ; N lcedilla ; B 96 -163 515 613 ; +C -1 ; WX 600 ; N Ncedilla ; B 47 -163 681 571 ; +C -1 ; WX 600 ; N ncedilla ; B 57 -163 547 438 ; +C -1 ; WX 600 ; N Eng ; B 63 -16 616 584 ; +C -1 ; WX 600 ; N eng ; B 70 -188 561 438 ; +C -1 ; WX 600 ; N Omacron ; B 103 -16 624 713 ; +C -1 ; WX 600 ; N omacron ; B 111 -16 579 567 ; +C -1 ; WX 600 ; N Obreve ; B 103 -16 638 781 ; +C -1 ; WX 600 ; N obreve ; B 111 -16 579 634 ; +C -1 ; WX 600 ; N Rcedilla ; B 47 -163 598 571 ; +C -1 ; WX 600 ; N rcedilla ; B 87 -163 623 433 ; +C -1 ; WX 600 ; N Scircumflex ; B 95 -16 605 786 ; +C -1 ; WX 600 ; N scircumflex ; B 105 -16 563 640 ; +C -1 ; WX 600 ; N Tbar ; B 149 0 651 571 ; +C -1 ; WX 600 ; N tbar ; B 117 -16 553 571 ; +C -1 ; WX 600 ; N Utilde ; B 137 -16 678 736 ; +C -1 ; WX 600 ; N utilde ; B 129 -16 574 589 ; +C -1 ; WX 600 ; N Umacron ; B 137 -16 678 713 ; +C -1 ; WX 600 ; N umacron ; B 129 -16 571 567 ; +C -1 ; WX 600 ; N Ubreve ; B 137 -16 678 780 ; +C -1 ; WX 600 ; N ubreve ; B 129 -16 573 634 ; +C -1 ; WX 600 ; N Uogonek ; B 137 -141 678 571 ; +C -1 ; WX 600 ; N uogonek ; B 129 -141 571 423 ; +C -1 ; WX 600 ; N Wcircumflex ; B 121 0 698 786 ; +C -1 ; WX 600 ; N wcircumflex ; B 113 0 658 640 ; +C -1 ; WX 600 ; N Ycircumflex ; B 150 0 668 786 ; +C -1 ; WX 600 ; N ycircumflex ; B 15 -188 636 640 ; +C -1 ; WX 600 ; N longs ; B 109 0 667 613 ; +C -1 ; WX 600 ; N Aringacute ; B 33 0 619 1000 ; +C -1 ; WX 600 ; N aringacute ; B 92 -16 588 873 ; +C -1 ; WX 600 ; N AEacute ; B 13 0 693 795 ; +C -1 ; WX 600 ; N aeacute ; B 36 -16 635 649 ; +C -1 ; WX 600 ; N Oslashacute ; B 34 -41 687 795 ; +C -1 ; WX 600 ; N oslashacute ; B 50 -42 642 649 ; +C -1 ; WX 600 ; N anoteleia ; B 302 305 455 438 ; +C -1 ; WX 600 ; N Wgrave ; B 121 0 698 795 ; +C -1 ; WX 600 ; N wgrave ; B 113 0 658 649 ; +C -1 ; WX 600 ; N Wacute ; B 121 0 698 795 ; +C -1 ; WX 600 ; N wacute ; B 113 0 658 649 ; +C -1 ; WX 600 ; N Wdieresis ; B 121 0 698 747 ; +C -1 ; WX 600 ; N wdieresis ; B 113 0 658 600 ; +C -1 ; WX 600 ; N Ygrave ; B 150 0 668 795 ; +C -1 ; WX 600 ; N ygrave ; B 15 -188 636 649 ; +C -1 ; WX 600 ; N quotereversed ; B 378 319 529 613 ; +C -1 ; WX 600 ; N radicalex ; B 240 525 592 567 ; +C -1 ; WX 600 ; N afii08941 ; B 87 0 543 587 ; +C -1 ; WX 600 ; N estimated ; B 44 -17 561 535 ; +C -1 ; WX 600 ; N oneeighth ; B 61 -7 653 626 ; +C -1 ; WX 600 ; N threeeighths ; B 58 -7 652 627 ; +C -1 ; WX 600 ; N fiveeighths ; B 60 -7 652 620 ; +C -1 ; WX 600 ; N seveneighths ; B 63 -7 648 620 ; +C -1 ; WX 600 ; N commaaccent ; B 199 -250 333 -59 ; +C -1 ; WX 600 ; N undercommaaccent ; B 201 -163 352 -51 ; +C -1 ; WX 600 ; N tonos ; B 344 499 535 649 ; +C -1 ; WX 600 ; N dieresistonos ; B 234 499 579 649 ; +C -1 ; WX 600 ; N Alphatonos ; B 33 0 619 571 ; +C -1 ; WX 600 ; N Epsilontonos ; B 54 0 684 571 ; +C -1 ; WX 600 ; N Etatonos ; B 45 0 673 571 ; +C -1 ; WX 600 ; N Iotatonos ; B 80 0 636 571 ; +C -1 ; WX 600 ; N Omicrontonos ; B 71 -16 646 584 ; +C -1 ; WX 600 ; N Upsilontonos ; B 54 0 736 571 ; +C -1 ; WX 600 ; N Omegatonos ; B 44 0 664 584 ; +C -1 ; WX 600 ; N iotadieresistonos ; B 227 -16 572 649 ; +C -1 ; WX 600 ; N Alpha ; B 33 0 619 571 ; +C -1 ; WX 600 ; N Beta ; B 46 0 593 571 ; +C -1 ; WX 600 ; N Delta ; B 54 0 552 571 ; +C -1 ; WX 600 ; N Epsilon ; B 47 0 623 571 ; +C -1 ; WX 600 ; N Zeta ; B 104 0 598 571 ; +C -1 ; WX 600 ; N Eta ; B 57 0 672 572 ; +C -1 ; WX 600 ; N Iota ; B 116 0 606 571 ; +C -1 ; WX 600 ; N Kappa ; B 68 0 691 571 ; +C -1 ; WX 600 ; N Lambda ; B 28 0 614 571 ; +C -1 ; WX 600 ; N Mu ; B 16 0 702 571 ; +C -1 ; WX 600 ; N Nu ; B 47 0 681 571 ; +C -1 ; WX 600 ; N Xi ; B 77 0 651 571 ; +C -1 ; WX 600 ; N Omicron ; B 103 -16 619 584 ; +C -1 ; WX 600 ; N Pi ; B 56 0 660 571 ; +C -1 ; WX 600 ; N Rho ; B 106 0 648 571 ; +C -1 ; WX 600 ; N Sigma ; B 96 0 615 571 ; +C -1 ; WX 600 ; N Tau ; B 149 0 651 571 ; +C -1 ; WX 600 ; N Upsilon ; B 150 0 668 571 ; +C -1 ; WX 600 ; N Chi ; B 43 0 667 571 ; +C -1 ; WX 600 ; N Psi ; B 133 0 706 571 ; +C -1 ; WX 600 ; N Omega ; B 34 0 648 584 ; +C -1 ; WX 600 ; N Iotadieresis ; B 116 0 606 729 ; +C -1 ; WX 600 ; N Upsilondieresis ; B 150 0 668 729 ; +C -1 ; WX 600 ; N alphatonos ; B 93 -16 633 649 ; +C -1 ; WX 600 ; N epsilontonos ; B 151 -16 562 649 ; +C -1 ; WX 600 ; N etatonos ; B 67 -188 557 649 ; +C -1 ; WX 600 ; N iotatonos ; B 265 -16 514 649 ; +C -1 ; WX 600 ; N upsilondieresistonos ; B 125 -16 639 627 ; +C -1 ; WX 600 ; N beta ; B 95 -188 556 613 ; +C -1 ; WX 600 ; N gamma ; B 120 -188 657 423 ; +C -1 ; WX 600 ; N zeta ; B 191 -188 588 613 ; +C -1 ; WX 600 ; N eta ; B 67 -188 557 438 ; +C -1 ; WX 600 ; N theta ; B 140 -16 590 613 ; +C -1 ; WX 600 ; N iota ; B 265 -16 429 438 ; +C -1 ; WX 600 ; N kappa ; B 94 0 589 423 ; +C -1 ; WX 600 ; N lambda ; B 42 0 594 613 ; +C -1 ; WX 600 ; N mu ; B 86 -188 564 423 ; +C -1 ; WX 600 ; N nu ; B 119 0 560 438 ; +C -1 ; WX 600 ; N xi ; B 179 -188 572 613 ; +C -1 ; WX 600 ; N omicron ; B 111 -16 579 438 ; +C -1 ; WX 600 ; N rho ; B 59 -188 587 438 ; +C -1 ; WX 600 ; N sigma1 ; B 135 -188 625 438 ; +C -1 ; WX 600 ; N upsilon ; B 125 -16 639 423 ; +C -1 ; WX 600 ; N chi ; B 94 -188 561 438 ; +C -1 ; WX 600 ; N psi ; B 124 -188 653 613 ; +C -1 ; WX 600 ; N omega ; B 92 -16 593 438 ; +C -1 ; WX 600 ; N iotadieresis ; B 249 -16 539 578 ; +C -1 ; WX 600 ; N upsilondieresis ; B 125 -16 639 600 ; +C -1 ; WX 600 ; N omicrontonos ; B 111 -16 579 649 ; +C -1 ; WX 600 ; N upsilontonos ; B 125 -16 639 649 ; +C -1 ; WX 600 ; N omegatonos ; B 92 -16 593 649 ; +C -1 ; WX 600 ; N afii10023 ; B 47 0 623 730 ; +C -1 ; WX 600 ; N afii10051 ; B 94 -16 610 571 ; +C -1 ; WX 600 ; N afii10053 ; B 110 -16 639 584 ; +C -1 ; WX 600 ; N afii10054 ; B 95 -16 605 584 ; +C -1 ; WX 600 ; N afii10055 ; B 116 0 606 571 ; +C -1 ; WX 600 ; N afii10056 ; B 116 0 606 730 ; +C -1 ; WX 600 ; N afii10057 ; B 100 -16 703 571 ; +C -1 ; WX 600 ; N afii10058 ; B 20 -16 617 571 ; +C -1 ; WX 600 ; N afii10059 ; B 6 0 615 571 ; +C -1 ; WX 600 ; N afii10060 ; B 94 0 598 571 ; +C -1 ; WX 600 ; N afii10062 ; B 84 -16 707 781 ; +C -1 ; WX 600 ; N afii10017 ; B 33 0 619 571 ; +C -1 ; WX 600 ; N afii10018 ; B 46 0 603 571 ; +C -1 ; WX 600 ; N afii10019 ; B 46 0 593 571 ; +C -1 ; WX 600 ; N afii10020 ; B 47 0 671 571 ; +C -1 ; WX 600 ; N afii10021 ; B 0 -140 669 571 ; +C -1 ; WX 600 ; N afii10022 ; B 47 0 623 571 ; +C -1 ; WX 600 ; N afii10024 ; B 1 0 694 572 ; +C -1 ; WX 600 ; N afii10025 ; B 67 -16 605 584 ; +C -1 ; WX 600 ; N afii10026 ; B 32 0 693 571 ; +C -1 ; WX 600 ; N afii10027 ; B 32 0 693 781 ; +C -1 ; WX 600 ; N afii10028 ; B 69 0 665 572 ; +C -1 ; WX 600 ; N afii10029 ; B 16 -16 669 571 ; +C -1 ; WX 600 ; N afii10030 ; B 16 0 702 571 ; +C -1 ; WX 600 ; N afii10031 ; B 57 0 672 572 ; +C -1 ; WX 600 ; N afii10032 ; B 103 -16 619 584 ; +C -1 ; WX 600 ; N afii10033 ; B 56 0 660 571 ; +C -1 ; WX 600 ; N afii10034 ; B 106 0 648 571 ; +C -1 ; WX 600 ; N afii10035 ; B 114 -16 645 584 ; +C -1 ; WX 600 ; N afii10036 ; B 149 0 651 571 ; +C -1 ; WX 600 ; N afii10037 ; B 84 -16 707 571 ; +C -1 ; WX 600 ; N afii10038 ; B 104 0 617 572 ; +C -1 ; WX 600 ; N afii10039 ; B 43 0 667 571 ; +C -1 ; WX 600 ; N afii10040 ; B 39 -125 660 571 ; +C -1 ; WX 600 ; N afii10041 ; B 129 0 656 571 ; +C -1 ; WX 600 ; N afii10042 ; B 5 0 709 571 ; +C -1 ; WX 600 ; N afii10043 ; B 5 -125 709 571 ; +C -1 ; WX 600 ; N afii10044 ; B 93 0 583 571 ; +C -1 ; WX 600 ; N afii10045 ; B 0 0 710 571 ; +C -1 ; WX 600 ; N afii10046 ; B 46 0 580 571 ; +C -1 ; WX 600 ; N afii10047 ; B 78 -16 604 584 ; +C -1 ; WX 600 ; N afii10048 ; B 10 -16 650 584 ; +C -1 ; WX 600 ; N afii10049 ; B 38 0 654 571 ; +C -1 ; WX 600 ; N afii10065 ; B 92 -16 547 438 ; +C -1 ; WX 600 ; N afii10066 ; B 103 -13 600 606 ; +C -1 ; WX 600 ; N afii10067 ; B 46 0 550 423 ; +C -1 ; WX 600 ; N afii10068 ; B 47 0 639 423 ; +C -1 ; WX 600 ; N afii10069 ; B 18 -103 623 423 ; +C -1 ; WX 600 ; N afii10070 ; B 104 -16 573 438 ; +C -1 ; WX 600 ; N afii10072 ; B 14 0 655 423 ; +C -1 ; WX 600 ; N afii10073 ; B 83 -13 572 438 ; +C -1 ; WX 600 ; N afii10074 ; B 40 0 656 423 ; +C -1 ; WX 600 ; N afii10075 ; B 40 0 656 634 ; +C -1 ; WX 600 ; N afii10076 ; B 67 0 620 423 ; +C -1 ; WX 600 ; N afii10077 ; B 15 -13 623 423 ; +C -1 ; WX 600 ; N afii10078 ; B 16 0 669 423 ; +C -1 ; WX 600 ; N afii10079 ; B 56 0 631 423 ; +C -1 ; WX 600 ; N afii10080 ; B 111 -16 579 438 ; +C -1 ; WX 600 ; N afii10081 ; B 56 0 627 423 ; +C -1 ; WX 600 ; N afii10082 ; B -14 -188 595 438 ; +C -1 ; WX 600 ; N afii10083 ; B 122 -16 598 438 ; +C -1 ; WX 600 ; N afii10084 ; B 118 0 619 423 ; +C -1 ; WX 600 ; N afii10085 ; B 63 -149 667 423 ; +C -1 ; WX 600 ; N afii10086 ; B 93 -157 593 601 ; +C -1 ; WX 600 ; N afii10087 ; B 53 0 616 423 ; +C -1 ; WX 600 ; N afii10088 ; B 56 -125 627 423 ; +C -1 ; WX 600 ; N afii10089 ; B 115 0 629 423 ; +C -1 ; WX 600 ; N afii10090 ; B 5 0 677 423 ; +C -1 ; WX 600 ; N afii10091 ; B 5 -125 677 423 ; +C -1 ; WX 600 ; N afii10092 ; B 70 0 563 423 ; +C -1 ; WX 600 ; N afii10093 ; B 15 0 677 423 ; +C -1 ; WX 600 ; N afii10094 ; B 46 0 550 423 ; +C -1 ; WX 600 ; N afii10095 ; B 78 -16 581 438 ; +C -1 ; WX 600 ; N afii10096 ; B 17 -17 621 438 ; +C -1 ; WX 600 ; N afii10097 ; B 36 0 633 423 ; +C -1 ; WX 600 ; N afii10071 ; B 104 -16 573 600 ; +C -1 ; WX 600 ; N afii10099 ; B 55 -188 546 613 ; +C -1 ; WX 600 ; N afii10100 ; B 47 0 639 649 ; +C -1 ; WX 600 ; N afii10101 ; B 122 -16 598 438 ; +C -1 ; WX 600 ; N afii10102 ; B 105 -16 563 438 ; +C -1 ; WX 600 ; N afii10103 ; B 96 0 515 633 ; +C -1 ; WX 600 ; N afii10104 ; B 95 0 523 600 ; +C -1 ; WX 600 ; N afii10105 ; B 52 -188 493 633 ; +C -1 ; WX 600 ; N afii10106 ; B 28 -13 600 423 ; +C -1 ; WX 600 ; N afii10107 ; B 14 0 586 423 ; +C -1 ; WX 600 ; N afii10108 ; B 55 0 559 613 ; +C -1 ; WX 600 ; N afii10110 ; B 63 -149 667 634 ; +C -1 ; WX 600 ; N afii10193 ; B 56 -125 627 423 ; +C -1 ; WX 600 ; N afii10050 ; B 47 0 671 682 ; +C -1 ; WX 600 ; N afii10098 ; B 47 0 639 533 ; +C -1 ; WX 600 ; N afii00208 ; B 82 266 641 307 ; +C -1 ; WX 600 ; N afii61352 ; B 31 0 664 571 ; +C -1 ; WX 600 ; N pi ; B 63 0 633 423 ; +C -1 ; WX 600 ; N f000 ; B 54 0 308 319 ; +C -1 ; WX 600 ; N f003 ; B 96 422 229 613 ; +C -1 ; WX 600 ; N sheva ; B 218 -261 310 -82 ; +C -1 ; WX 600 ; N hatafsegol ; B 136 -261 415 -82 ; +C -1 ; WX 600 ; N hatafpatah ; B 137 -261 408 -82 ; +C -1 ; WX 600 ; N hatafqamats ; B 137 -261 408 -82 ; +C -1 ; WX 600 ; N hiriq ; B 242 -147 309 -83 ; +C -1 ; WX 600 ; N tsere ; B 189 -147 362 -83 ; +C -1 ; WX 600 ; N segol ; B 189 -261 362 -82 ; +C -1 ; WX 600 ; N patah ; B 176 -130 378 -83 ; +C -1 ; WX 600 ; N qamats ; B 176 -215 378 -83 ; +C -1 ; WX 600 ; N holam ; B 390 559 459 628 ; +C -1 ; WX 600 ; N qubuts ; B 136 -261 391 -82 ; +C -1 ; WX 600 ; N dagesh ; B 320 222 388 290 ; +C -1 ; WX 600 ; N meteg ; B 225 -261 302 -82 ; +C -1 ; WX 600 ; N maqaf ; B 181 437 613 478 ; +C -1 ; WX 600 ; N rafe ; B 322 560 525 607 ; +C -1 ; WX 600 ; N paseq ; B 282 -5 419 484 ; +C -1 ; WX 600 ; N shindot ; B 573 560 640 625 ; +C -1 ; WX 600 ; N sindot ; B 215 560 282 626 ; +C -1 ; WX 600 ; N sofpasuq ; B 236 -6 471 486 ; +C -1 ; WX 600 ; N alef ; B 102 -6 604 492 ; +C -1 ; WX 600 ; N bet ; B 81 0 527 478 ; +C -1 ; WX 600 ; N gimel ; B 138 -5 450 478 ; +C -1 ; WX 600 ; N dalet ; B 172 -5 624 478 ; +C -1 ; WX 600 ; N he ; B 101 -5 576 478 ; +C -1 ; WX 600 ; N vav ; B 280 -5 440 478 ; +C -1 ; WX 600 ; N zayin ; B 257 -5 547 478 ; +C -1 ; WX 600 ; N het ; B 164 -5 630 478 ; +C -1 ; WX 600 ; N tet ; B 147 -5 584 483 ; +C -1 ; WX 600 ; N yod ; B 278 263 445 478 ; +C -1 ; WX 600 ; N finalkaf ; B 169 -109 617 478 ; +C -1 ; WX 600 ; N kaf ; B 92 0 558 478 ; +C -1 ; WX 600 ; N lamed ; B 187 0 565 629 ; +C -1 ; WX 600 ; N finalmem ; B 131 0 564 478 ; +C -1 ; WX 600 ; N mem ; B 146 -5 569 483 ; +C -1 ; WX 600 ; N finalnun ; B 275 -109 445 478 ; +C -1 ; WX 600 ; N nun ; B 143 0 475 478 ; +C -1 ; WX 600 ; N samekh ; B 135 -5 564 478 ; +C -1 ; WX 600 ; N ayin ; B 101 0 582 478 ; +C -1 ; WX 600 ; N finalpe ; B 175 -109 538 478 ; +C -1 ; WX 600 ; N pe ; B 126 0 545 478 ; +C -1 ; WX 600 ; N finaltsadi ; B 188 -109 575 478 ; +C -1 ; WX 600 ; N tsadi ; B 175 0 567 478 ; +C -1 ; WX 600 ; N qof ; B 81 -204 598 478 ; +C -1 ; WX 600 ; N resh ; B 181 -5 542 478 ; +C -1 ; WX 600 ; N shin ; B 124 0 602 483 ; +C -1 ; WX 600 ; N tav ; B 82 -5 563 478 ; +C -1 ; WX 600 ; N doublevav ; B 156 -5 580 478 ; +C -1 ; WX 600 ; N vavyod ; B 162 -5 580 478 ; +C -1 ; WX 600 ; N doubleyod ; B 162 263 580 478 ; +C -1 ; WX 600 ; N geresh ; B 276 246 479 483 ; +C -1 ; WX 600 ; N gershayim ; B 178 246 577 483 ; +C -1 ; WX 600 ; N newsheqelsign ; B 43 -5 654 481 ; +C -1 ; WX 600 ; N vavshindot ; B 239 -5 440 630 ; +C -1 ; WX 600 ; N finalkafsheva ; B 166 -109 621 479 ; +C -1 ; WX 600 ; N finalkafqamats ; B 158 -109 621 479 ; +C -1 ; WX 600 ; N lamedholam ; B 99 0 565 630 ; +C -1 ; WX 600 ; N lamedholamdagesh ; B 109 0 565 629 ; +C -1 ; WX 600 ; N _b_712 ; B 101 0 582 478 ; +C -1 ; WX 600 ; N shinshindot ; B 124 0 630 628 ; +C -1 ; WX 600 ; N shinsindot ; B 124 0 602 628 ; +C -1 ; WX 600 ; N shindageshshindot ; B 124 0 630 628 ; +C -1 ; WX 600 ; N shindageshsindot ; B 124 0 602 628 ; +C -1 ; WX 600 ; N alefpatah ; B 102 -130 604 493 ; +C -1 ; WX 600 ; N alefqamats ; B 102 -215 604 493 ; +C -1 ; WX 600 ; N alefmapiq ; B 102 -6 604 492 ; +C -1 ; WX 600 ; N betdagesh ; B 77 0 527 479 ; +C -1 ; WX 600 ; N gimeldagesh ; B 134 -5 451 479 ; +C -1 ; WX 600 ; N daletdagesh ; B 172 -5 625 479 ; +C -1 ; WX 600 ; N hedagesh ; B 101 -5 576 479 ; +C -1 ; WX 600 ; N vavdagesh ; B 227 -5 440 479 ; +C -1 ; WX 600 ; N zayindagesh ; B 205 -5 543 479 ; +C -1 ; WX 600 ; N tetdagesh ; B 147 -5 584 483 ; +C -1 ; WX 600 ; N yoddagesh ; B 259 263 445 478 ; +C -1 ; WX 600 ; N finalkafdagesh ; B 166 -109 621 479 ; +C -1 ; WX 600 ; N kafdagesh ; B 92 0 559 479 ; +C -1 ; WX 600 ; N lameddagesh ; B 187 0 565 630 ; +C -1 ; WX 600 ; N memdagesh ; B 146 -5 569 484 ; +C -1 ; WX 600 ; N nundagesh ; B 139 0 476 479 ; +C -1 ; WX 600 ; N samekhdagesh ; B 135 -5 564 478 ; +C -1 ; WX 600 ; N finalpedagesh ; B 175 -109 538 478 ; +C -1 ; WX 600 ; N pedagesh ; B 126 0 545 478 ; +C -1 ; WX 600 ; N tsadidagesh ; B 175 0 567 478 ; +C -1 ; WX 600 ; N qofdagesh ; B 81 -204 598 478 ; +C -1 ; WX 600 ; N reshdagesh ; B 181 -5 542 479 ; +C -1 ; WX 600 ; N shindagesh ; B 124 0 602 483 ; +C -1 ; WX 600 ; N tavdages ; B 82 -5 563 479 ; +C -1 ; WX 600 ; N vavholam ; B 276 -5 469 628 ; +C -1 ; WX 600 ; N betrafe ; B 77 0 527 608 ; +C -1 ; WX 600 ; N kafrafe ; B 92 0 558 607 ; +C -1 ; WX 600 ; N perafe ; B 126 0 545 608 ; +C -1 ; WX 600 ; N aleflamed ; B 102 -6 604 629 ; +C -1 ; WX 600 ; N zerowidthnonjoiner ; B 283 -134 318 629 ; +C -1 ; WX 600 ; N zerowidthjoiner ; B 193 -134 407 690 ; +C -1 ; WX 600 ; N lefttorightmark ; B 172 -134 458 690 ; +C -1 ; WX 600 ; N righttoleftmark ; B 143 -134 429 690 ; +C -1 ; WX 600 ; N uniFFFC ; B 0 0 600 431 ; +C -1 ; WX 600 ; N Ohorn ; B 103 -16 681 584 ; +C -1 ; WX 600 ; N ohorn ; B 111 -16 641 438 ; +C -1 ; WX 600 ; N Uhorn ; B 137 -16 762 648 ; +C -1 ; WX 600 ; N uhorn ; B 129 -16 659 429 ; +C -1 ; WX 600 ; N f00b ; B 372 679 568 783 ; +C -1 ; WX 600 ; N f00c ; B 324 679 521 783 ; +C -1 ; WX 600 ; N f00e ; B 308 632 475 783 ; +C -1 ; WX 600 ; N f006 ; B 346 679 542 783 ; +C -1 ; WX 600 ; N f007 ; B 392 682 589 785 ; +C -1 ; WX 600 ; N f009 ; B 355 632 522 783 ; +C -1 ; WX 600 ; N combininghookabove ; B 352 655 509 783 ; +C -1 ; WX 600 ; N f010 ; B 373 696 514 783 ; +C -1 ; WX 600 ; N f013 ; B 352 638 509 783 ; +C -1 ; WX 600 ; N f011 ; B 375 696 516 783 ; +C -1 ; WX 600 ; N f01c ; B 305 682 629 783 ; +C -1 ; WX 600 ; N f015 ; B 292 682 617 783 ; +C -1 ; WX 600 ; N combiningtildeaccent ; B 288 682 613 783 ; +C -1 ; WX 600 ; N _d_769 ; B 288 598 554 680 ; +C -1 ; WX 600 ; N _d_770 ; B 291 598 557 680 ; +C -1 ; WX 600 ; N f02c ; B 406 -158 508 -58 ; +C -1 ; WX 600 ; N dongsign ; B 122 112 605 613 ; +C -1 ; WX 600 ; N onethird ; B 59 -7 669 626 ; +C -1 ; WX 600 ; N twothirds ; B 39 -7 669 627 ; +C -1 ; WX 600 ; N f008 ; B 299 499 466 649 ; +C -1 ; WX 600 ; N f00a ; B 368 499 535 649 ; +C -1 ; WX 600 ; N f00d ; B 297 499 464 649 ; +C -1 ; WX 600 ; N f00f ; B 312 499 479 649 ; +C -1 ; WX 600 ; N f012 ; B 328 499 485 626 ; +C -1 ; WX 600 ; N f014 ; B 328 499 485 626 ; +C -1 ; WX 600 ; N f016 ; B 305 682 629 783 ; +C -1 ; WX 600 ; N f017 ; B 305 682 629 783 ; +C -1 ; WX 600 ; N f018 ; B 305 682 629 783 ; +C -1 ; WX 600 ; N f019 ; B 251 489 569 589 ; +C -1 ; WX 600 ; N f01a ; B 251 489 568 589 ; +C -1 ; WX 600 ; N f01b ; B 251 489 568 589 ; +C -1 ; WX 600 ; N f01e ; B 235 -158 337 -58 ; +C -1 ; WX 600 ; N f01f ; B 235 -158 337 -58 ; +C -1 ; WX 600 ; N f020 ; B 235 -158 337 -58 ; +C -1 ; WX 600 ; N f021 ; B 259 -158 361 -58 ; +C -1 ; WX 600 ; N f022 ; B 235 -158 337 -58 ; +C -1 ; WX 600 ; N combininggraveaccent ; B 361 632 528 783 ; +C -1 ; WX 600 ; N combiningacuteaccent ; B 332 632 499 783 ; +C -1 ; WX 600 ; N f01d ; B 186 489 503 589 ; +C -1 ; WX 600 ; N combiningdotbelow ; B 235 -158 337 -58 ; +C -1 ; WX 600 ; N f023 ; B 235 -158 337 -58 ; +C -1 ; WX 600 ; N f029 ; B 235 -158 337 -58 ; +C -1 ; WX 600 ; N f02a ; B 235 -158 337 -58 ; +C -1 ; WX 600 ; N f02b ; B 235 -158 337 -58 ; +C -1 ; WX 600 ; N f024 ; B 235 -158 337 -58 ; +C -1 ; WX 600 ; N f025 ; B 235 -158 337 -58 ; +C -1 ; WX 600 ; N f026 ; B 235 -158 337 -58 ; +C -1 ; WX 600 ; N f027 ; B 235 -158 337 -58 ; +C -1 ; WX 600 ; N f028 ; B 235 -158 337 -58 ; +C -1 ; WX 600 ; N f02d ; B 292 682 617 783 ; +C -1 ; WX 600 ; N f02e ; B 290 682 615 783 ; +C -1 ; WX 600 ; N f02f ; B 316 682 641 783 ; +C -1 ; WX 600 ; N f030 ; B 305 682 629 783 ; +C -1 ; WX 600 ; N Adotbelow ; B 33 -158 619 571 ; +C -1 ; WX 600 ; N adotbelow ; B 92 -158 547 438 ; +C -1 ; WX 600 ; N Ahookabove ; B 33 0 619 783 ; +C -1 ; WX 600 ; N ahookabove ; B 92 -16 547 626 ; +C -1 ; WX 600 ; N Acircumflexacute ; B 33 0 619 783 ; +C -1 ; WX 600 ; N acircumflexacute ; B 92 -16 552 783 ; +C -1 ; WX 600 ; N Acircumflexgrave ; B 33 0 619 783 ; +C -1 ; WX 600 ; N acircumflexgrave ; B 92 -16 552 783 ; +C -1 ; WX 600 ; N Acircumflexhookabove ; B 33 0 619 783 ; +C -1 ; WX 600 ; N acircumflexhookabove ; B 92 -16 552 783 ; +C -1 ; WX 600 ; N Acircumflextilde ; B 33 0 631 783 ; +C -1 ; WX 600 ; N acircumflextilde ; B 92 -16 615 783 ; +C -1 ; WX 600 ; N Acircumflexdotbelow ; B 33 -158 619 680 ; +C -1 ; WX 600 ; N acircumflexdotbelow ; B 92 -158 552 640 ; +C -1 ; WX 600 ; N Abreveacute ; B 33 0 619 783 ; +C -1 ; WX 600 ; N abreveacute ; B 92 -16 570 783 ; +C -1 ; WX 600 ; N Abrevegrave ; B 33 0 619 783 ; +C -1 ; WX 600 ; N abrevegrave ; B 92 -16 570 783 ; +C -1 ; WX 600 ; N Abrevehookabove ; B 33 0 619 783 ; +C -1 ; WX 600 ; N abrevehookabove ; B 92 -16 570 783 ; +C -1 ; WX 600 ; N Abrevetilde ; B 33 0 619 795 ; +C -1 ; WX 600 ; N abrevetilde ; B 92 -16 610 783 ; +C -1 ; WX 600 ; N Abrevedotbelow ; B 33 -158 619 680 ; +C -1 ; WX 600 ; N abrevedotbelow ; B 92 -158 570 634 ; +C -1 ; WX 600 ; N Edotbelow ; B 47 -158 623 571 ; +C -1 ; WX 600 ; N edotbelow ; B 104 -158 573 438 ; +C -1 ; WX 600 ; N Ehookabove ; B 47 0 623 783 ; +C -1 ; WX 600 ; N ehookabove ; B 104 -16 573 626 ; +C -1 ; WX 600 ; N Etilde ; B 47 0 623 733 ; +C -1 ; WX 600 ; N etilde ; B 104 -16 573 589 ; +C -1 ; WX 600 ; N Ecircumflexacute ; B 47 0 623 783 ; +C -1 ; WX 600 ; N ecircumflexacute ; B 104 -16 573 783 ; +C -1 ; WX 600 ; N Ecircumflexgrave ; B 47 0 623 783 ; +C -1 ; WX 600 ; N ecircumflexgrave ; B 104 -16 573 783 ; +C -1 ; WX 600 ; N Ecircumflexhookabove ; B 47 0 623 783 ; +C -1 ; WX 600 ; N ecircumflexhookabove ; B 104 -16 573 783 ; +C -1 ; WX 600 ; N Ecircumflextilde ; B 47 0 623 783 ; +C -1 ; WX 600 ; N ecircumflextilde ; B 104 -16 615 783 ; +C -1 ; WX 600 ; N Ecircumflexdotbelow ; B 47 -158 623 680 ; +C -1 ; WX 600 ; N ecircumflexdotbelow ; B 104 -158 573 640 ; +C -1 ; WX 600 ; N Ihookabove ; B 116 0 606 783 ; +C -1 ; WX 600 ; N ihookabove ; B 95 0 514 626 ; +C -1 ; WX 600 ; N Idotbelow ; B 116 -158 606 571 ; +C -1 ; WX 600 ; N idotbelow ; B 96 -158 515 633 ; +C -1 ; WX 600 ; N Odotbelow ; B 103 -158 619 584 ; +C -1 ; WX 600 ; N odotbelow ; B 111 -158 579 438 ; +C -1 ; WX 600 ; N Ohookabove ; B 103 -16 619 783 ; +C -1 ; WX 600 ; N ohookabove ; B 111 -16 579 626 ; +C -1 ; WX 600 ; N Ocircumflexacute ; B 103 -16 619 783 ; +C -1 ; WX 600 ; N ocircumflexacute ; B 111 -16 579 783 ; +C -1 ; WX 600 ; N Ocircumflexgrave ; B 103 -16 619 783 ; +C -1 ; WX 600 ; N ocircumflexgrave ; B 111 -16 579 783 ; +C -1 ; WX 600 ; N Ocircumflexhookabove ; B 103 -16 619 783 ; +C -1 ; WX 600 ; N ocircumflexhookabove ; B 111 -16 579 783 ; +C -1 ; WX 600 ; N Ocircumflextilde ; B 103 -16 626 783 ; +C -1 ; WX 600 ; N ocircumflextilde ; B 111 -16 615 783 ; +C -1 ; WX 600 ; N Ocircumflexdotbelow ; B 103 -158 619 680 ; +C -1 ; WX 600 ; N ocircumflexdotbelow ; B 111 -158 579 640 ; +C -1 ; WX 600 ; N Ohornacute ; B 103 -16 681 779 ; +C -1 ; WX 600 ; N ohornacute ; B 111 -16 641 649 ; +C -1 ; WX 600 ; N Ohorngrave ; B 103 -16 681 779 ; +C -1 ; WX 600 ; N ohorngrave ; B 111 -16 641 649 ; +C -1 ; WX 600 ; N Ohornhookabove ; B 103 -16 681 783 ; +C -1 ; WX 600 ; N ohornhookabove ; B 111 -16 641 626 ; +C -1 ; WX 600 ; N Ohorntilde ; B 103 -16 681 733 ; +C -1 ; WX 600 ; N ohorntilde ; B 111 -16 641 589 ; +C -1 ; WX 600 ; N Ohorndotbelow ; B 103 -158 681 584 ; +C -1 ; WX 600 ; N ohorndotbelow ; B 111 -158 641 438 ; +C -1 ; WX 600 ; N Udotbelow ; B 137 -158 678 571 ; +C -1 ; WX 600 ; N udotbelow ; B 129 -158 571 423 ; +C -1 ; WX 600 ; N Uhookabove ; B 137 -16 678 783 ; +C -1 ; WX 600 ; N uhookabove ; B 129 -16 571 626 ; +C -1 ; WX 600 ; N Uhornacute ; B 137 -16 762 779 ; +C -1 ; WX 600 ; N uhornacute ; B 129 -16 659 649 ; +C -1 ; WX 600 ; N Uhorngrave ; B 137 -16 762 779 ; +C -1 ; WX 600 ; N uhorngrave ; B 129 -16 659 649 ; +C -1 ; WX 600 ; N Uhornhookabove ; B 137 -16 762 783 ; +C -1 ; WX 600 ; N uhornhookabove ; B 129 -16 659 626 ; +C -1 ; WX 600 ; N Uhorntilde ; B 137 -16 762 733 ; +C -1 ; WX 600 ; N uhorntilde ; B 129 -16 659 589 ; +C -1 ; WX 600 ; N Uhorndotbelow ; B 137 -158 762 648 ; +C -1 ; WX 600 ; N uhorndotbelow ; B 129 -158 659 429 ; +C -1 ; WX 600 ; N Ydotbelow ; B 150 -158 668 571 ; +C -1 ; WX 600 ; N ydotbelow ; B 15 -188 636 423 ; +C -1 ; WX 600 ; N Yhookabove ; B 150 0 668 783 ; +C -1 ; WX 600 ; N yhookabove ; B 15 -188 636 626 ; +C -1 ; WX 600 ; N Ytilde ; B 150 0 668 733 ; +C -1 ; WX 600 ; N ytilde ; B 15 -188 636 589 ; +C -1 ; WX 600 ; N uni01CD ; B 33 0 619 781 ; +C -1 ; WX 600 ; N uni01CE ; B 92 -16 567 634 ; +C -1 ; WX 600 ; N _b_899 ; B 116 0 606 781 ; +C -1 ; WX 600 ; N uni01D0 ; B 95 0 562 634 ; +C -1 ; WX 600 ; N uni01D1 ; B 103 -16 619 781 ; +C -1 ; WX 600 ; N uni01D2 ; B 111 -16 579 634 ; +C -1 ; WX 600 ; N uni01D3 ; B 137 -16 678 781 ; +C -1 ; WX 600 ; N uni01D4 ; B 129 -16 571 634 ; +C -1 ; WX 600 ; N uni01D5 ; B 137 -16 678 782 ; +C -1 ; WX 600 ; N uni01D6 ; B 129 -16 574 703 ; +C -1 ; WX 600 ; N uni01D7 ; B 137 -16 678 783 ; +C -1 ; WX 600 ; N uni01D8 ; B 129 -16 575 771 ; +C -1 ; WX 600 ; N uni01D9 ; B 137 -16 678 782 ; +C -1 ; WX 600 ; N uni01DA ; B 129 -16 578 771 ; +C -1 ; WX 600 ; N uni01DB ; B 137 -16 678 783 ; +C -1 ; WX 600 ; N uni01DC ; B 129 -16 571 771 ; +C -1 ; WX 600 ; N _d_913 ; B 268 624 598 782 ; +C -1 ; WX 600 ; N _d_914 ; B 277 624 613 783 ; +C -1 ; WX 600 ; N _d_915 ; B 277 624 613 782 ; +C -1 ; WX 600 ; N _d_916 ; B 277 624 613 783 ; +C -1 ; WX 600 ; N _d_917 ; B 281 662 574 703 ; +C -1 ; WX 600 ; N _d_918 ; B 256 521 547 600 ; +C -1 ; WX 600 ; N uni0492 ; B 47 0 671 571 ; +C -1 ; WX 600 ; N uni0493 ; B 47 0 639 423 ; +C -1 ; WX 600 ; N uni0496 ; B 1 -125 694 572 ; +C -1 ; WX 600 ; N uni0497 ; B 14 -125 655 423 ; +C -1 ; WX 600 ; N uni049a ; B 69 -125 665 572 ; +C -1 ; WX 600 ; N uni049b ; B 67 -125 620 423 ; +C -1 ; WX 600 ; N uni049c ; B 69 0 665 572 ; +C -1 ; WX 600 ; N uni049d ; B 67 0 620 423 ; +C -1 ; WX 600 ; N uni04a2 ; B 56 -125 672 572 ; +C -1 ; WX 600 ; N uni04a3 ; B 56 -125 631 423 ; +C -1 ; WX 600 ; N uni04ae ; B 150 0 668 571 ; +C -1 ; WX 600 ; N uni04af ; B 124 -188 636 423 ; +C -1 ; WX 600 ; N uni04b0 ; B 165 0 668 571 ; +C -1 ; WX 600 ; N uni04b1 ; B 118 -188 636 423 ; +C -1 ; WX 600 ; N uni04b2 ; B 43 -125 667 571 ; +C -1 ; WX 600 ; N uni04b3 ; B 53 -125 616 423 ; +C -1 ; WX 600 ; N uni04b8 ; B 129 0 656 571 ; +C -1 ; WX 600 ; N uni04b9 ; B 115 0 629 423 ; +C -1 ; WX 600 ; N uni04ba ; B 56 0 583 571 ; +C -1 ; WX 600 ; N uni04bb ; B 57 0 571 423 ; +C -1 ; WX 600 ; N uni018f ; B 78 -16 626 584 ; +C -1 ; WX 600 ; N uni0259 ; B 104 -16 573 438 ; +C -1 ; WX 600 ; N uni04e8 ; B 103 -16 619 584 ; +C -1 ; WX 600 ; N uni04e9 ; B 111 -16 579 438 ; +EndCharMetrics +EndFontMetrics diff --git a/gulliver/thirdparty/html2ps_pdf/fonts/couri.ttf b/thirdparty/html2ps_pdf/fonts/couri.ttf similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/fonts/couri.ttf rename to thirdparty/html2ps_pdf/fonts/couri.ttf diff --git a/gulliver/thirdparty/html2ps_pdf/fonts/georgia.ttf b/thirdparty/html2ps_pdf/fonts/georgia.ttf similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/fonts/georgia.ttf rename to thirdparty/html2ps_pdf/fonts/georgia.ttf diff --git a/gulliver/thirdparty/html2ps_pdf/fonts/georgiab.ttf b/thirdparty/html2ps_pdf/fonts/georgiab.ttf similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/fonts/georgiab.ttf rename to thirdparty/html2ps_pdf/fonts/georgiab.ttf diff --git a/gulliver/thirdparty/html2ps_pdf/fonts/georgiai.ttf b/thirdparty/html2ps_pdf/fonts/georgiai.ttf similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/fonts/georgiai.ttf rename to thirdparty/html2ps_pdf/fonts/georgiai.ttf diff --git a/gulliver/thirdparty/html2ps_pdf/fonts/georgiaz.ttf b/thirdparty/html2ps_pdf/fonts/georgiaz.ttf similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/fonts/georgiaz.ttf rename to thirdparty/html2ps_pdf/fonts/georgiaz.ttf diff --git a/gulliver/thirdparty/html2ps_pdf/fonts/print_glyphs.ps b/thirdparty/html2ps_pdf/fonts/print_glyphs.ps similarity index 96% rename from gulliver/thirdparty/html2ps_pdf/fonts/print_glyphs.ps rename to thirdparty/html2ps_pdf/fonts/print_glyphs.ps index efb46882e..15f7e365b 100644 --- a/gulliver/thirdparty/html2ps_pdf/fonts/print_glyphs.ps +++ b/thirdparty/html2ps_pdf/fonts/print_glyphs.ps @@ -1,129 +1,129 @@ -%!PS-Adobe -% print_glyphs.ps -% Copyright (C) Thomas Merz and PDFlib GmbH 1994-2005 -% -% This PostScript program prints all glyphs in a font along -% with their names in alphabetical ordering. -% It requires a PostScript Level 2 or PostScript 3 interpreter. -% It also works with Acrobat Distiller. -% -% Usage: -% - The font must either be resident in the printer, or be -% downloaded ahead of this program (as a single job). -% Alternatively, the font can be configure in Distiller. -% - At the end of this file, enter a line with the font name, e.g.: -% /Times-Roman ShowGlyphs -% (Omit the percent character, but leave the leading slash '/') - -/$sort 20 dict def - -/Insert { % node string ==> - - exch dup 0 get type (nulltype) eq { % ifelse - exch [ exch 1 array 1 array ] 0 exch put - }{ % else - aload pop aload pop 4 2 roll 2 copy gt { % ifelse - pop 3 -1 roll pop Insert - }{ %else - pop exch pop Insert - } ifelse - } ifelse -} def - -/PrefixWalk { - $sort begin - cvx /!bt exch def bpwalk - end -} def - -$sort begin -/bpwalk { - dup 0 get type /nulltype eq { pop }{ % ifelse - aload pop aload pop exch bpwalk exch !bt bpwalk - } ifelse -} bind def - -end % $sort - -/DictSort { % dict ==> array - dup length array /a exch def - $sort begin - /tree 1 array def - { pop 50 string cvs tree exch Insert } forall - /ndx 0 def - tree { a ndx 3 -1 roll put /ndx ndx 1 add def } PrefixWalk - a -} bind def - -/ShowGlyphs { % font name ==> - - /buffer 100 string def - /FontName 100 string def - /fs 20 def % font size - /ts 7 def % font size of caption - /ls fs 1.75 mul def % line spacing - - dup FontName cvs pop - findfont fs scalefont /F exch def - - clippath pathbbox - 20 sub /top exch def - 20 sub /right exch def - 20 add /bottom exch def - 40 add /left exch def - - /textfont /Helvetica-Narrow findfont ts scalefont def - /x left def - /y top fs sub def - - /Helvetica-Bold findfont fs scalefont setfont - x y moveto - /y y ls sub def - - % Check the interpreter's language level... - /languagelevel where { pop languagelevel }{ 1 } ifelse - - % ...and quit if Level 1 - 2 lt { - (Error: this program doesn't work on PostScript Level 1 printers!)show - showpage - stop -} if - - FontName show % print font name - - % Try to find the dictionary with the character names - F /CharStrings known { - F /CharStrings get - }{ - (: Couldn't find character names (CharStrings dictionary)!) show - showpage - quit - } ifelse - - DictSort % sort the character names - - { % forall - /GlyphName exch def % remember the character name - - x y moveto F setfont % the actual character... - GlyphName cvn glyphshow - - x y ts 2 mul sub moveto % ...and its glyph name - textfont setfont GlyphName buffer cvs show - - /x x fs 2 mul add def - x right gt { /x left def /y y fs 2 mul sub def } if - y bottom lt { - /y top fs sub def /x left def - showpage - x y moveto - /y y ls sub def - /Helvetica-Bold findfont fs scalefont setfont - FontName show % print font name - } if - } forall - y top ls sub ne x left ne or { showpage } if - -} bind def - -% Example: -/Times-Roman ShowGlyphs +%!PS-Adobe +% print_glyphs.ps +% Copyright (C) Thomas Merz and PDFlib GmbH 1994-2005 +% +% This PostScript program prints all glyphs in a font along +% with their names in alphabetical ordering. +% It requires a PostScript Level 2 or PostScript 3 interpreter. +% It also works with Acrobat Distiller. +% +% Usage: +% - The font must either be resident in the printer, or be +% downloaded ahead of this program (as a single job). +% Alternatively, the font can be configure in Distiller. +% - At the end of this file, enter a line with the font name, e.g.: +% /Times-Roman ShowGlyphs +% (Omit the percent character, but leave the leading slash '/') + +/$sort 20 dict def + +/Insert { % node string ==> - + exch dup 0 get type (nulltype) eq { % ifelse + exch [ exch 1 array 1 array ] 0 exch put + }{ % else + aload pop aload pop 4 2 roll 2 copy gt { % ifelse + pop 3 -1 roll pop Insert + }{ %else + pop exch pop Insert + } ifelse + } ifelse +} def + +/PrefixWalk { + $sort begin + cvx /!bt exch def bpwalk + end +} def + +$sort begin +/bpwalk { + dup 0 get type /nulltype eq { pop }{ % ifelse + aload pop aload pop exch bpwalk exch !bt bpwalk + } ifelse +} bind def + +end % $sort + +/DictSort { % dict ==> array + dup length array /a exch def + $sort begin + /tree 1 array def + { pop 50 string cvs tree exch Insert } forall + /ndx 0 def + tree { a ndx 3 -1 roll put /ndx ndx 1 add def } PrefixWalk + a +} bind def + +/ShowGlyphs { % font name ==> - + /buffer 100 string def + /FontName 100 string def + /fs 20 def % font size + /ts 7 def % font size of caption + /ls fs 1.75 mul def % line spacing + + dup FontName cvs pop + findfont fs scalefont /F exch def + + clippath pathbbox + 20 sub /top exch def + 20 sub /right exch def + 20 add /bottom exch def + 40 add /left exch def + + /textfont /Helvetica-Narrow findfont ts scalefont def + /x left def + /y top fs sub def + + /Helvetica-Bold findfont fs scalefont setfont + x y moveto + /y y ls sub def + + % Check the interpreter's language level... + /languagelevel where { pop languagelevel }{ 1 } ifelse + + % ...and quit if Level 1 + 2 lt { + (Error: this program doesn't work on PostScript Level 1 printers!)show + showpage + stop +} if + + FontName show % print font name + + % Try to find the dictionary with the character names + F /CharStrings known { + F /CharStrings get + }{ + (: Couldn't find character names (CharStrings dictionary)!) show + showpage + quit + } ifelse + + DictSort % sort the character names + + { % forall + /GlyphName exch def % remember the character name + + x y moveto F setfont % the actual character... + GlyphName cvn glyphshow + + x y ts 2 mul sub moveto % ...and its glyph name + textfont setfont GlyphName buffer cvs show + + /x x fs 2 mul add def + x right gt { /x left def /y y fs 2 mul sub def } if + y bottom lt { + /y top fs sub def /x left def + showpage + x y moveto + /y y ls sub def + /Helvetica-Bold findfont fs scalefont setfont + FontName show % print font name + } if + } forall + y top ls sub ne x left ne or { showpage } if + +} bind def + +% Example: +/Times-Roman ShowGlyphs diff --git a/gulliver/thirdparty/html2ps_pdf/fonts/symbol.afm b/thirdparty/html2ps_pdf/fonts/symbol.afm similarity index 97% rename from gulliver/thirdparty/html2ps_pdf/fonts/symbol.afm rename to thirdparty/html2ps_pdf/fonts/symbol.afm index d4ed55b63..f026f8d7c 100644 --- a/gulliver/thirdparty/html2ps_pdf/fonts/symbol.afm +++ b/thirdparty/html2ps_pdf/fonts/symbol.afm @@ -1,278 +1,278 @@ -StartFontMetrics 4.1 -FontName SymbolMT -FullName Symbol -Notice Typeface The Monotype Corporation plc. Data The Monotype Corporation plc/Type Solutions Inc. 1990-1992. All Rights Reserved -EncodingScheme FontSpecific -FamilyName Symbol -Weight Regular -Version Version 1.60 -Characters 192 -ItalicAngle 0.0 -Ascender 1005 -Descender -220 -UnderlineThickness 49 -UnderlinePosition -109 -IsFixedPitch false -FontBBox 0 -220 1113 1005 -StartCharMetrics 259 -C 0 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 1 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 2 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 3 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 4 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 5 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 6 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 7 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 8 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 9 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 10 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 11 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 12 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 13 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 14 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 15 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 16 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 17 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 18 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 19 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 20 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 21 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 22 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 23 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 24 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 25 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 26 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 27 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 28 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 29 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 30 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 31 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 32 ; WX 250 ; N space ; B 0 -14 110 677 ; -C 33 ; WX 333 ; N exclam ; B 0 -14 110 677 ; -C 34 ; WX 713 ; N universal ; B 0 0 617 662 ; -C 35 ; WX 500 ; N numbersign ; B 0 -14 464 677 ; -C 36 ; WX 549 ; N existential ; B 0 0 423 662 ; -C 37 ; WX 833 ; N percent ; B 0 -27 763 677 ; -C 38 ; WX 778 ; N ampersand ; B 0 -15 711 677 ; -C 39 ; WX 439 ; N suchthat ; B 0 -16 376 461 ; -C 40 ; WX 333 ; N parenleft ; B 0 -216 270 694 ; -C 41 ; WX 333 ; N parenright ; B 22 -216 292 694 ; -C 42 ; WX 500 ; N asteriskmath ; B 0 128 359 534 ; -C 43 ; WX 549 ; N plus ; B 0 0 513 513 ; -C 44 ; WX 250 ; N comma ; B 0 -167 146 98 ; -C 45 ; WX 549 ; N minus ; B 0 233 513 281 ; -C 46 ; WX 250 ; N period ; B 0 -14 108 95 ; -C 47 ; WX 278 ; N slash ; B 0 -14 279 694 ; -C 48 ; WX 500 ; N zero ; B 0 -14 428 676 ; -C 49 ; WX 500 ; N one ; B 0 0 261 676 ; -C 50 ; WX 500 ; N two ; B 0 0 437 676 ; -C 51 ; WX 500 ; N three ; B 0 -14 376 676 ; -C 52 ; WX 500 ; N four ; B 0 0 450 676 ; -C 53 ; WX 500 ; N five ; B 0 -14 386 662 ; -C 54 ; WX 500 ; N six ; B 0 -14 418 676 ; -C 55 ; WX 500 ; N seven ; B 0 -14 418 662 ; -C 56 ; WX 500 ; N eight ; B 0 -14 382 676 ; -C 57 ; WX 500 ; N nine ; B 0 -14 417 676 ; -C 58 ; WX 278 ; N colon ; B 0 -14 110 461 ; -C 59 ; WX 278 ; N semicolon ; B 0 -167 146 460 ; -C 60 ; WX 549 ; N less ; B 0 0 491 513 ; -C 61 ; WX 549 ; N equal ; B 0 140 513 371 ; -C 62 ; WX 549 ; N greater ; B 29 0 521 513 ; -C 63 ; WX 444 ; N question ; B 0 -13 359 677 ; -C 64 ; WX 549 ; N congruent ; B 0 0 513 510 ; -C 65 ; WX 722 ; N Alpha ; B 0 0 703 677 ; -C 66 ; WX 667 ; N Beta ; B 0 0 596 662 ; -C 67 ; WX 722 ; N Chi ; B 0 0 703 662 ; -C 68 ; WX 612 ; N Delta ; B 0 0 586 677 ; -C 69 ; WX 611 ; N Epsilon ; B 0 0 567 662 ; -C 70 ; WX 763 ; N Phi ; B 0 0 692 662 ; -C 71 ; WX 603 ; N Gamma ; B 0 0 560 662 ; -C 72 ; WX 722 ; N Eta ; B 0 0 685 662 ; -C 73 ; WX 333 ; N Iota ; B 0 0 284 662 ; -C 74 ; WX 631 ; N theta1 ; B 0 -15 547 694 ; -C 75 ; WX 722 ; N Kappa ; B 0 0 714 662 ; -C 76 ; WX 686 ; N Lambda ; B 0 0 667 677 ; -C 77 ; WX 889 ; N Mu ; B 0 0 852 662 ; -C 78 ; WX 722 ; N Nu ; B 0 -11 721 662 ; -C 79 ; WX 722 ; N Omicron ; B 0 -15 648 677 ; -C 80 ; WX 768 ; N Pi ; B 0 0 734 662 ; -C 81 ; WX 741 ; N Theta ; B 0 -15 668 677 ; -C 82 ; WX 556 ; N Rho ; B 0 0 504 662 ; -C 83 ; WX 592 ; N Sigma ; B 0 0 528 662 ; -C 84 ; WX 611 ; N Tau ; B 0 0 556 662 ; -C 85 ; WX 690 ; N Upsilon ; B 0 0 670 662 ; -C 86 ; WX 439 ; N sigma1 ; B 0 -216 378 460 ; -C 87 ; WX 768 ; N Omega ; B 0 0 713 677 ; -C 88 ; WX 645 ; N Xi ; B 0 0 581 662 ; -C 89 ; WX 795 ; N Psi ; B 0 0 759 670 ; -C 90 ; WX 611 ; N Zeta ; B 0 0 570 662 ; -C 91 ; WX 333 ; N bracketleft ; B 0 -198 215 677 ; -C 92 ; WX 863 ; N therefore ; B 0 0 510 497 ; -C 93 ; WX 333 ; N bracketright ; B 36 -198 251 677 ; -C 94 ; WX 658 ; N perpendicular ; B 0 0 622 662 ; -C 95 ; WX 500 ; N underscore ; B 0 -216 517 -175 ; -C 96 ; WX 500 ; N radicalex ; B 0 876 496 913 ; -C 97 ; WX 631 ; N alpha ; B 0 -16 564 460 ; -C 98 ; WX 549 ; N beta ; B 0 -216 446 694 ; -C 99 ; WX 549 ; N chi ; B 0 -216 478 456 ; -C 100 ; WX 494 ; N delta ; B 0 -15 427 694 ; -C 101 ; WX 439 ; N epsilon ; B 0 -15 373 461 ; -C 102 ; WX 521 ; N phi ; B 0 -216 453 694 ; -C 103 ; WX 411 ; N gamma ; B 0 -216 412 456 ; -C 104 ; WX 603 ; N eta ; B 0 -216 503 460 ; -C 105 ; WX 329 ; N iota ; B 0 -15 261 460 ; -C 106 ; WX 603 ; N phi1 ; B 0 -216 536 460 ; -C 107 ; WX 549 ; N kappa ; B 0 0 534 460 ; -C 108 ; WX 549 ; N lambda ; B 0 -10 501 694 ; -C 109 ; WX 576 ; N mu ; B 0 -216 499 447 ; -C 110 ; WX 521 ; N nu ; B 0 -14 469 461 ; -C 111 ; WX 549 ; N omicron ; B 0 -15 463 460 ; -C 112 ; WX 549 ; N pi ; B 0 -15 485 447 ; -C 113 ; WX 521 ; N theta ; B 0 -15 436 694 ; -C 114 ; WX 549 ; N rho ; B 0 -216 454 461 ; -C 115 ; WX 603 ; N sigma ; B 0 -15 545 447 ; -C 116 ; WX 439 ; N tau ; B 0 -15 376 447 ; -C 117 ; WX 576 ; N upsilon ; B 0 -15 487 460 ; -C 118 ; WX 713 ; N omega1 ; B 0 -15 647 447 ; -C 119 ; WX 686 ; N omega ; B 0 -15 607 460 ; -C 120 ; WX 493 ; N xi ; B 0 -216 422 694 ; -C 121 ; WX 686 ; N psi ; B 0 -216 639 461 ; -C 122 ; WX 494 ; N zeta ; B 0 -220 424 691 ; -C 123 ; WX 480 ; N braceleft ; B 0 -216 272 694 ; -C 124 ; WX 200 ; N bar ; B 0 -216 41 694 ; -C 125 ; WX 480 ; N braceright ; B 104 -216 377 694 ; -C 126 ; WX 549 ; N similar ; B 0 176 499 336 ; -C 127 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 128 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 129 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 130 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 131 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 132 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 133 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 134 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 135 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 136 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 137 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 138 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 139 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 140 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 141 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 142 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 143 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 144 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 145 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 146 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 147 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 148 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 149 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 150 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 151 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 152 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 153 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 154 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 155 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 156 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 157 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 158 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 159 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 160 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 161 ; WX 620 ; N Upsilon1 ; B 0 0 603 677 ; -C 162 ; WX 247 ; N minute ; B 0 392 130 677 ; -C 163 ; WX 549 ; N lessequal ; B 0 0 491 621 ; -C 164 ; WX 167 ; N fraction ; B 0 -26 500 676 ; -C 165 ; WX 713 ; N infinity ; B 0 52 661 461 ; -C 166 ; WX 500 ; N florin ; B 0 -216 499 694 ; -C 167 ; WX 753 ; N club ; B 0 0 572 552 ; -C 168 ; WX 753 ; N diamond ; B 0 -15 456 564 ; -C 169 ; WX 753 ; N heart ; B 0 -15 511 542 ; -C 170 ; WX 753 ; N spade ; B 0 0 513 576 ; -C 171 ; WX 1042 ; N arrowboth ; B 0 -14 1002 499 ; -C 172 ; WX 987 ; N arrowleft ; B 0 -14 914 499 ; -C 173 ; WX 603 ; N arrowup ; B 0 -14 512 900 ; -C 174 ; WX 987 ; N arrowright ; B 37 -14 950 499 ; -C 175 ; WX 603 ; N arrowdown ; B 45 -14 558 900 ; -C 176 ; WX 400 ; N degree ; B 0 377 301 677 ; -C 177 ; WX 549 ; N plusminus ; B 0 0 513 620 ; -C 178 ; WX 411 ; N second ; B 0 392 309 677 ; -C 179 ; WX 549 ; N greaterequal ; B 29 0 521 621 ; -C 180 ; WX 549 ; N multiply ; B 0 41 431 471 ; -C 181 ; WX 713 ; N proportional ; B 0 52 613 461 ; -C 182 ; WX 494 ; N partialdiff ; B 0 -15 455 694 ; -C 183 ; WX 460 ; N bullet ; B 0 103 357 460 ; -C 184 ; WX 549 ; N divide ; B 0 45 513 466 ; -C 185 ; WX 549 ; N notequal ; B 0 0 513 513 ; -C 186 ; WX 549 ; N equivalence ; B 0 87 514 423 ; -C 187 ; WX 549 ; N approxequal ; B 0 81 499 431 ; -C 188 ; WX 1000 ; N ellipsis ; B 0 -14 775 95 ; -C 189 ; WX 603 ; N arrowvertex ; B 0 -119 47 1005 ; -C 190 ; WX 1000 ; N arrowhorizex ; B 0 219 1113 266 ; -C 191 ; WX 658 ; N carriagereturn ; B 0 -15 578 621 ; -C 192 ; WX 823 ; N aleph ; B 0 -15 604 677 ; -C 193 ; WX 686 ; N Ifraktur ; B 0 -15 599 677 ; -C 194 ; WX 795 ; N Rfraktur ; B 0 -21 702 686 ; -C 195 ; WX 987 ; N weierstrass ; B 0 -216 653 517 ; -C 196 ; WX 768 ; N circlemultiply ; B 0 -15 692 677 ; -C 197 ; WX 768 ; N circleplus ; B 0 -15 692 677 ; -C 198 ; WX 823 ; N emptyset ; B 0 -23 737 713 ; -C 199 ; WX 768 ; N intersection ; B 0 0 692 499 ; -C 200 ; WX 768 ; N union ; B 38 0 730 499 ; -C 201 ; WX 713 ; N propersuperset ; B 0 0 657 447 ; -C 202 ; WX 713 ; N reflexsuperset ; B 0 -143 657 447 ; -C 203 ; WX 713 ; N notsubset ; B 0 -76 657 525 ; -C 204 ; WX 713 ; N propersubset ; B 29 0 686 447 ; -C 205 ; WX 713 ; N reflexsubset ; B 28 -143 686 447 ; -C 206 ; WX 713 ; N element ; B 0 0 455 447 ; -C 207 ; WX 713 ; N notelement ; B 0 -70 455 525 ; -C 208 ; WX 768 ; N angle ; B 0 0 688 677 ; -C 209 ; WX 713 ; N gradient ; B 0 -15 642 662 ; -C 210 ; WX 790 ; N registerserif ; B 0 -16 693 678 ; -C 211 ; WX 790 ; N copyrightserif ; B 0 -16 693 678 ; -C 212 ; WX 890 ; N trademarkserif ; B 0 289 839 662 ; -C 213 ; WX 823 ; N product ; B 0 -100 778 740 ; -C 214 ; WX 549 ; N radical ; B 0 -38 508 913 ; -C 215 ; WX 250 ; N dotmath ; B 0 202 108 310 ; -C 216 ; WX 713 ; N logicalnot ; B 0 0 644 276 ; -C 217 ; WX 603 ; N logicaland ; B 0 0 557 447 ; -C 218 ; WX 603 ; N logicalor ; B 23 0 581 447 ; -C 219 ; WX 1042 ; N arrowdblboth ; B 0 -14 1002 498 ; -C 220 ; WX 987 ; N arrowdblleft ; B 0 -14 913 498 ; -C 221 ; WX 603 ; N arrowdblup ; B 0 -14 512 899 ; -C 222 ; WX 987 ; N arrowdblright ; B 37 -14 950 498 ; -C 223 ; WX 603 ; N arrowdbldown ; B 45 -14 557 899 ; -C 224 ; WX 494 ; N lozenge ; B 0 0 449 694 ; -C 225 ; WX 329 ; N angleleft ; B 0 -184 267 694 ; -C 226 ; WX 790 ; N registersans ; B 0 -16 693 678 ; -C 227 ; WX 790 ; N copyrightsans ; B 0 -16 693 678 ; -C 228 ; WX 786 ; N trademarksans ; B 0 290 717 662 ; -C 229 ; WX 713 ; N summation ; B 0 -100 672 741 ; -C 230 ; WX 384 ; N parenlefttp ; B 41 -81 437 926 ; -C 231 ; WX 384 ; N parenleftex ; B 41 -81 88 926 ; -C 232 ; WX 384 ; N parenleftbt ; B 41 -81 437 926 ; -C 233 ; WX 384 ; N bracketlefttp ; B 0 -81 343 926 ; -C 234 ; WX 384 ; N bracketleftex ; B 0 -81 47 926 ; -C 235 ; WX 384 ; N bracketleftbt ; B 0 -81 343 926 ; -C 236 ; WX 494 ; N bracelefttp ; B 0 -82 239 926 ; -C 237 ; WX 494 ; N braceleftmid ; B 0 -81 239 926 ; -C 238 ; WX 494 ; N braceleftbt ; B 205 -82 444 926 ; -C 239 ; WX 494 ; N braceex ; B 0 -81 47 926 ; -C 240 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C 241 ; WX 329 ; N angleright ; B 30 -184 297 694 ; -C 242 ; WX 274 ; N integral ; B 0 -107 273 910 ; -C 243 ; WX 686 ; N integraltp ; B 0 -82 382 926 ; -C 244 ; WX 686 ; N integralex ; B 0 -89 84 970 ; -C 245 ; WX 686 ; N integralbt ; B 33 -82 415 926 ; -C 246 ; WX 384 ; N parenrighttp ; B 54 -81 451 926 ; -C 247 ; WX 384 ; N parenrightex ; B 403 -81 451 926 ; -C 248 ; WX 384 ; N parenrightbt ; B 54 -81 451 926 ; -C 249 ; WX 384 ; N bracketrighttp ; B 17 -81 360 926 ; -C 250 ; WX 384 ; N bracketrightex ; B 0 -81 47 926 ; -C 251 ; WX 384 ; N bracketrightbt ; B 17 -81 360 926 ; -C 252 ; WX 494 ; N bracerighttp ; B 14 -82 253 926 ; -C 253 ; WX 494 ; N bracerightmid ; B 205 -81 444 926 ; -C 254 ; WX 494 ; N bracerightbt ; B 14 -82 253 926 ; -C 255 ; WX 600 ; N .notdef ; B 125 0 625 625 ; -C -1 ; WX 0 ; N .null ; B 0 -14 110 677 ; -C -1 ; WX 122 ; N _d_2 ; B 0 -14 110 677 ; -C -1 ; WX 790 ; N dummy ; B 0 -15 674 779 ; -EndCharMetrics -EndFontMetrics +StartFontMetrics 4.1 +FontName SymbolMT +FullName Symbol +Notice Typeface The Monotype Corporation plc. Data The Monotype Corporation plc/Type Solutions Inc. 1990-1992. All Rights Reserved +EncodingScheme FontSpecific +FamilyName Symbol +Weight Regular +Version Version 1.60 +Characters 192 +ItalicAngle 0.0 +Ascender 1005 +Descender -220 +UnderlineThickness 49 +UnderlinePosition -109 +IsFixedPitch false +FontBBox 0 -220 1113 1005 +StartCharMetrics 259 +C 0 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 1 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 2 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 3 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 4 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 5 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 6 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 7 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 8 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 9 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 10 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 11 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 12 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 13 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 14 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 15 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 16 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 17 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 18 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 19 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 20 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 21 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 22 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 23 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 24 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 25 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 26 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 27 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 28 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 29 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 30 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 31 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 32 ; WX 250 ; N space ; B 0 -14 110 677 ; +C 33 ; WX 333 ; N exclam ; B 0 -14 110 677 ; +C 34 ; WX 713 ; N universal ; B 0 0 617 662 ; +C 35 ; WX 500 ; N numbersign ; B 0 -14 464 677 ; +C 36 ; WX 549 ; N existential ; B 0 0 423 662 ; +C 37 ; WX 833 ; N percent ; B 0 -27 763 677 ; +C 38 ; WX 778 ; N ampersand ; B 0 -15 711 677 ; +C 39 ; WX 439 ; N suchthat ; B 0 -16 376 461 ; +C 40 ; WX 333 ; N parenleft ; B 0 -216 270 694 ; +C 41 ; WX 333 ; N parenright ; B 22 -216 292 694 ; +C 42 ; WX 500 ; N asteriskmath ; B 0 128 359 534 ; +C 43 ; WX 549 ; N plus ; B 0 0 513 513 ; +C 44 ; WX 250 ; N comma ; B 0 -167 146 98 ; +C 45 ; WX 549 ; N minus ; B 0 233 513 281 ; +C 46 ; WX 250 ; N period ; B 0 -14 108 95 ; +C 47 ; WX 278 ; N slash ; B 0 -14 279 694 ; +C 48 ; WX 500 ; N zero ; B 0 -14 428 676 ; +C 49 ; WX 500 ; N one ; B 0 0 261 676 ; +C 50 ; WX 500 ; N two ; B 0 0 437 676 ; +C 51 ; WX 500 ; N three ; B 0 -14 376 676 ; +C 52 ; WX 500 ; N four ; B 0 0 450 676 ; +C 53 ; WX 500 ; N five ; B 0 -14 386 662 ; +C 54 ; WX 500 ; N six ; B 0 -14 418 676 ; +C 55 ; WX 500 ; N seven ; B 0 -14 418 662 ; +C 56 ; WX 500 ; N eight ; B 0 -14 382 676 ; +C 57 ; WX 500 ; N nine ; B 0 -14 417 676 ; +C 58 ; WX 278 ; N colon ; B 0 -14 110 461 ; +C 59 ; WX 278 ; N semicolon ; B 0 -167 146 460 ; +C 60 ; WX 549 ; N less ; B 0 0 491 513 ; +C 61 ; WX 549 ; N equal ; B 0 140 513 371 ; +C 62 ; WX 549 ; N greater ; B 29 0 521 513 ; +C 63 ; WX 444 ; N question ; B 0 -13 359 677 ; +C 64 ; WX 549 ; N congruent ; B 0 0 513 510 ; +C 65 ; WX 722 ; N Alpha ; B 0 0 703 677 ; +C 66 ; WX 667 ; N Beta ; B 0 0 596 662 ; +C 67 ; WX 722 ; N Chi ; B 0 0 703 662 ; +C 68 ; WX 612 ; N Delta ; B 0 0 586 677 ; +C 69 ; WX 611 ; N Epsilon ; B 0 0 567 662 ; +C 70 ; WX 763 ; N Phi ; B 0 0 692 662 ; +C 71 ; WX 603 ; N Gamma ; B 0 0 560 662 ; +C 72 ; WX 722 ; N Eta ; B 0 0 685 662 ; +C 73 ; WX 333 ; N Iota ; B 0 0 284 662 ; +C 74 ; WX 631 ; N theta1 ; B 0 -15 547 694 ; +C 75 ; WX 722 ; N Kappa ; B 0 0 714 662 ; +C 76 ; WX 686 ; N Lambda ; B 0 0 667 677 ; +C 77 ; WX 889 ; N Mu ; B 0 0 852 662 ; +C 78 ; WX 722 ; N Nu ; B 0 -11 721 662 ; +C 79 ; WX 722 ; N Omicron ; B 0 -15 648 677 ; +C 80 ; WX 768 ; N Pi ; B 0 0 734 662 ; +C 81 ; WX 741 ; N Theta ; B 0 -15 668 677 ; +C 82 ; WX 556 ; N Rho ; B 0 0 504 662 ; +C 83 ; WX 592 ; N Sigma ; B 0 0 528 662 ; +C 84 ; WX 611 ; N Tau ; B 0 0 556 662 ; +C 85 ; WX 690 ; N Upsilon ; B 0 0 670 662 ; +C 86 ; WX 439 ; N sigma1 ; B 0 -216 378 460 ; +C 87 ; WX 768 ; N Omega ; B 0 0 713 677 ; +C 88 ; WX 645 ; N Xi ; B 0 0 581 662 ; +C 89 ; WX 795 ; N Psi ; B 0 0 759 670 ; +C 90 ; WX 611 ; N Zeta ; B 0 0 570 662 ; +C 91 ; WX 333 ; N bracketleft ; B 0 -198 215 677 ; +C 92 ; WX 863 ; N therefore ; B 0 0 510 497 ; +C 93 ; WX 333 ; N bracketright ; B 36 -198 251 677 ; +C 94 ; WX 658 ; N perpendicular ; B 0 0 622 662 ; +C 95 ; WX 500 ; N underscore ; B 0 -216 517 -175 ; +C 96 ; WX 500 ; N radicalex ; B 0 876 496 913 ; +C 97 ; WX 631 ; N alpha ; B 0 -16 564 460 ; +C 98 ; WX 549 ; N beta ; B 0 -216 446 694 ; +C 99 ; WX 549 ; N chi ; B 0 -216 478 456 ; +C 100 ; WX 494 ; N delta ; B 0 -15 427 694 ; +C 101 ; WX 439 ; N epsilon ; B 0 -15 373 461 ; +C 102 ; WX 521 ; N phi ; B 0 -216 453 694 ; +C 103 ; WX 411 ; N gamma ; B 0 -216 412 456 ; +C 104 ; WX 603 ; N eta ; B 0 -216 503 460 ; +C 105 ; WX 329 ; N iota ; B 0 -15 261 460 ; +C 106 ; WX 603 ; N phi1 ; B 0 -216 536 460 ; +C 107 ; WX 549 ; N kappa ; B 0 0 534 460 ; +C 108 ; WX 549 ; N lambda ; B 0 -10 501 694 ; +C 109 ; WX 576 ; N mu ; B 0 -216 499 447 ; +C 110 ; WX 521 ; N nu ; B 0 -14 469 461 ; +C 111 ; WX 549 ; N omicron ; B 0 -15 463 460 ; +C 112 ; WX 549 ; N pi ; B 0 -15 485 447 ; +C 113 ; WX 521 ; N theta ; B 0 -15 436 694 ; +C 114 ; WX 549 ; N rho ; B 0 -216 454 461 ; +C 115 ; WX 603 ; N sigma ; B 0 -15 545 447 ; +C 116 ; WX 439 ; N tau ; B 0 -15 376 447 ; +C 117 ; WX 576 ; N upsilon ; B 0 -15 487 460 ; +C 118 ; WX 713 ; N omega1 ; B 0 -15 647 447 ; +C 119 ; WX 686 ; N omega ; B 0 -15 607 460 ; +C 120 ; WX 493 ; N xi ; B 0 -216 422 694 ; +C 121 ; WX 686 ; N psi ; B 0 -216 639 461 ; +C 122 ; WX 494 ; N zeta ; B 0 -220 424 691 ; +C 123 ; WX 480 ; N braceleft ; B 0 -216 272 694 ; +C 124 ; WX 200 ; N bar ; B 0 -216 41 694 ; +C 125 ; WX 480 ; N braceright ; B 104 -216 377 694 ; +C 126 ; WX 549 ; N similar ; B 0 176 499 336 ; +C 127 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 128 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 129 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 130 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 131 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 132 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 133 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 134 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 135 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 136 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 137 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 138 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 139 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 140 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 141 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 142 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 143 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 144 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 145 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 146 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 147 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 148 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 149 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 150 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 151 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 152 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 153 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 154 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 155 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 156 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 157 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 158 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 159 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 160 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 161 ; WX 620 ; N Upsilon1 ; B 0 0 603 677 ; +C 162 ; WX 247 ; N minute ; B 0 392 130 677 ; +C 163 ; WX 549 ; N lessequal ; B 0 0 491 621 ; +C 164 ; WX 167 ; N fraction ; B 0 -26 500 676 ; +C 165 ; WX 713 ; N infinity ; B 0 52 661 461 ; +C 166 ; WX 500 ; N florin ; B 0 -216 499 694 ; +C 167 ; WX 753 ; N club ; B 0 0 572 552 ; +C 168 ; WX 753 ; N diamond ; B 0 -15 456 564 ; +C 169 ; WX 753 ; N heart ; B 0 -15 511 542 ; +C 170 ; WX 753 ; N spade ; B 0 0 513 576 ; +C 171 ; WX 1042 ; N arrowboth ; B 0 -14 1002 499 ; +C 172 ; WX 987 ; N arrowleft ; B 0 -14 914 499 ; +C 173 ; WX 603 ; N arrowup ; B 0 -14 512 900 ; +C 174 ; WX 987 ; N arrowright ; B 37 -14 950 499 ; +C 175 ; WX 603 ; N arrowdown ; B 45 -14 558 900 ; +C 176 ; WX 400 ; N degree ; B 0 377 301 677 ; +C 177 ; WX 549 ; N plusminus ; B 0 0 513 620 ; +C 178 ; WX 411 ; N second ; B 0 392 309 677 ; +C 179 ; WX 549 ; N greaterequal ; B 29 0 521 621 ; +C 180 ; WX 549 ; N multiply ; B 0 41 431 471 ; +C 181 ; WX 713 ; N proportional ; B 0 52 613 461 ; +C 182 ; WX 494 ; N partialdiff ; B 0 -15 455 694 ; +C 183 ; WX 460 ; N bullet ; B 0 103 357 460 ; +C 184 ; WX 549 ; N divide ; B 0 45 513 466 ; +C 185 ; WX 549 ; N notequal ; B 0 0 513 513 ; +C 186 ; WX 549 ; N equivalence ; B 0 87 514 423 ; +C 187 ; WX 549 ; N approxequal ; B 0 81 499 431 ; +C 188 ; WX 1000 ; N ellipsis ; B 0 -14 775 95 ; +C 189 ; WX 603 ; N arrowvertex ; B 0 -119 47 1005 ; +C 190 ; WX 1000 ; N arrowhorizex ; B 0 219 1113 266 ; +C 191 ; WX 658 ; N carriagereturn ; B 0 -15 578 621 ; +C 192 ; WX 823 ; N aleph ; B 0 -15 604 677 ; +C 193 ; WX 686 ; N Ifraktur ; B 0 -15 599 677 ; +C 194 ; WX 795 ; N Rfraktur ; B 0 -21 702 686 ; +C 195 ; WX 987 ; N weierstrass ; B 0 -216 653 517 ; +C 196 ; WX 768 ; N circlemultiply ; B 0 -15 692 677 ; +C 197 ; WX 768 ; N circleplus ; B 0 -15 692 677 ; +C 198 ; WX 823 ; N emptyset ; B 0 -23 737 713 ; +C 199 ; WX 768 ; N intersection ; B 0 0 692 499 ; +C 200 ; WX 768 ; N union ; B 38 0 730 499 ; +C 201 ; WX 713 ; N propersuperset ; B 0 0 657 447 ; +C 202 ; WX 713 ; N reflexsuperset ; B 0 -143 657 447 ; +C 203 ; WX 713 ; N notsubset ; B 0 -76 657 525 ; +C 204 ; WX 713 ; N propersubset ; B 29 0 686 447 ; +C 205 ; WX 713 ; N reflexsubset ; B 28 -143 686 447 ; +C 206 ; WX 713 ; N element ; B 0 0 455 447 ; +C 207 ; WX 713 ; N notelement ; B 0 -70 455 525 ; +C 208 ; WX 768 ; N angle ; B 0 0 688 677 ; +C 209 ; WX 713 ; N gradient ; B 0 -15 642 662 ; +C 210 ; WX 790 ; N registerserif ; B 0 -16 693 678 ; +C 211 ; WX 790 ; N copyrightserif ; B 0 -16 693 678 ; +C 212 ; WX 890 ; N trademarkserif ; B 0 289 839 662 ; +C 213 ; WX 823 ; N product ; B 0 -100 778 740 ; +C 214 ; WX 549 ; N radical ; B 0 -38 508 913 ; +C 215 ; WX 250 ; N dotmath ; B 0 202 108 310 ; +C 216 ; WX 713 ; N logicalnot ; B 0 0 644 276 ; +C 217 ; WX 603 ; N logicaland ; B 0 0 557 447 ; +C 218 ; WX 603 ; N logicalor ; B 23 0 581 447 ; +C 219 ; WX 1042 ; N arrowdblboth ; B 0 -14 1002 498 ; +C 220 ; WX 987 ; N arrowdblleft ; B 0 -14 913 498 ; +C 221 ; WX 603 ; N arrowdblup ; B 0 -14 512 899 ; +C 222 ; WX 987 ; N arrowdblright ; B 37 -14 950 498 ; +C 223 ; WX 603 ; N arrowdbldown ; B 45 -14 557 899 ; +C 224 ; WX 494 ; N lozenge ; B 0 0 449 694 ; +C 225 ; WX 329 ; N angleleft ; B 0 -184 267 694 ; +C 226 ; WX 790 ; N registersans ; B 0 -16 693 678 ; +C 227 ; WX 790 ; N copyrightsans ; B 0 -16 693 678 ; +C 228 ; WX 786 ; N trademarksans ; B 0 290 717 662 ; +C 229 ; WX 713 ; N summation ; B 0 -100 672 741 ; +C 230 ; WX 384 ; N parenlefttp ; B 41 -81 437 926 ; +C 231 ; WX 384 ; N parenleftex ; B 41 -81 88 926 ; +C 232 ; WX 384 ; N parenleftbt ; B 41 -81 437 926 ; +C 233 ; WX 384 ; N bracketlefttp ; B 0 -81 343 926 ; +C 234 ; WX 384 ; N bracketleftex ; B 0 -81 47 926 ; +C 235 ; WX 384 ; N bracketleftbt ; B 0 -81 343 926 ; +C 236 ; WX 494 ; N bracelefttp ; B 0 -82 239 926 ; +C 237 ; WX 494 ; N braceleftmid ; B 0 -81 239 926 ; +C 238 ; WX 494 ; N braceleftbt ; B 205 -82 444 926 ; +C 239 ; WX 494 ; N braceex ; B 0 -81 47 926 ; +C 240 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C 241 ; WX 329 ; N angleright ; B 30 -184 297 694 ; +C 242 ; WX 274 ; N integral ; B 0 -107 273 910 ; +C 243 ; WX 686 ; N integraltp ; B 0 -82 382 926 ; +C 244 ; WX 686 ; N integralex ; B 0 -89 84 970 ; +C 245 ; WX 686 ; N integralbt ; B 33 -82 415 926 ; +C 246 ; WX 384 ; N parenrighttp ; B 54 -81 451 926 ; +C 247 ; WX 384 ; N parenrightex ; B 403 -81 451 926 ; +C 248 ; WX 384 ; N parenrightbt ; B 54 -81 451 926 ; +C 249 ; WX 384 ; N bracketrighttp ; B 17 -81 360 926 ; +C 250 ; WX 384 ; N bracketrightex ; B 0 -81 47 926 ; +C 251 ; WX 384 ; N bracketrightbt ; B 17 -81 360 926 ; +C 252 ; WX 494 ; N bracerighttp ; B 14 -82 253 926 ; +C 253 ; WX 494 ; N bracerightmid ; B 205 -81 444 926 ; +C 254 ; WX 494 ; N bracerightbt ; B 14 -82 253 926 ; +C 255 ; WX 600 ; N .notdef ; B 125 0 625 625 ; +C -1 ; WX 0 ; N .null ; B 0 -14 110 677 ; +C -1 ; WX 122 ; N _d_2 ; B 0 -14 110 677 ; +C -1 ; WX 790 ; N dummy ; B 0 -15 674 779 ; +EndCharMetrics +EndFontMetrics diff --git a/gulliver/thirdparty/html2ps_pdf/fonts/symbol.ttf b/thirdparty/html2ps_pdf/fonts/symbol.ttf similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/fonts/symbol.ttf rename to thirdparty/html2ps_pdf/fonts/symbol.ttf diff --git a/gulliver/thirdparty/html2ps_pdf/fonts/times.afm b/thirdparty/html2ps_pdf/fonts/times.afm similarity index 97% rename from gulliver/thirdparty/html2ps_pdf/fonts/times.afm rename to thirdparty/html2ps_pdf/fonts/times.afm index d81e8c87d..4aaf52826 100644 --- a/gulliver/thirdparty/html2ps_pdf/fonts/times.afm +++ b/thirdparty/html2ps_pdf/fonts/times.afm @@ -1,2599 +1,2599 @@ -StartFontMetrics 4.1 -FontName TimesNewRomanPSMT -FullName Times New Roman -Notice Typeface The Monotype Corporation plc. Data The Monotype Corporation plc/Type Solutions Inc. 1990-1992. All Rights Reserved -EncodingScheme FontSpecific -FamilyName Times New Roman -Weight Regular -Version Version 3.00 -Characters 1674 -ItalicAngle 0.0 -Ascender 891 -Descender -216 -UnderlineThickness 49 -UnderlinePosition -109 -IsFixedPitch false -FontBBox -568 -307 2000 1007 -StartCharMetrics 1709 -C 0 ; WX 778 ; N .notdef ; B 139 0 639 625 ; -C 1 ; WX 778 ; N .notdef ; B 139 0 639 625 ; -C 2 ; WX 778 ; N .notdef ; B 139 0 639 625 ; -C 3 ; WX 778 ; N .notdef ; B 139 0 639 625 ; -C 4 ; WX 778 ; N .notdef ; B 139 0 639 625 ; -C 5 ; WX 778 ; N .notdef ; B 139 0 639 625 ; -C 6 ; WX 778 ; N .notdef ; B 139 0 639 625 ; -C 7 ; WX 778 ; N .notdef ; B 139 0 639 625 ; -C 8 ; WX 778 ; N .notdef ; B 139 0 639 625 ; -C 9 ; WX 778 ; N .notdef ; B 139 0 639 625 ; -C 10 ; WX 778 ; N .notdef ; B 139 0 639 625 ; -C 11 ; WX 778 ; N .notdef ; B 139 0 639 625 ; -C 12 ; WX 778 ; N .notdef ; B 139 0 639 625 ; -C 13 ; WX 778 ; N .notdef ; B 139 0 639 625 ; -C 14 ; WX 778 ; N .notdef ; B 139 0 639 625 ; -C 15 ; WX 778 ; N .notdef ; B 139 0 639 625 ; -C 16 ; WX 778 ; N .notdef ; B 139 0 639 625 ; -C 17 ; WX 778 ; N .notdef ; B 139 0 639 625 ; -C 18 ; WX 778 ; N .notdef ; B 139 0 639 625 ; -C 19 ; WX 778 ; N .notdef ; B 139 0 639 625 ; -C 20 ; WX 778 ; N .notdef ; B 139 0 639 625 ; -C 21 ; WX 778 ; N .notdef ; B 139 0 639 625 ; -C 22 ; WX 778 ; N .notdef ; B 139 0 639 625 ; -C 23 ; WX 778 ; N .notdef ; B 139 0 639 625 ; -C 24 ; WX 778 ; N .notdef ; B 139 0 639 625 ; -C 25 ; WX 778 ; N .notdef ; B 139 0 639 625 ; -C 26 ; WX 778 ; N .notdef ; B 139 0 639 625 ; -C 27 ; WX 778 ; N .notdef ; B 139 0 639 625 ; -C 28 ; WX 778 ; N .notdef ; B 139 0 639 625 ; -C 29 ; WX 778 ; N .notdef ; B 139 0 639 625 ; -C 30 ; WX 778 ; N .notdef ; B 139 0 639 625 ; -C 31 ; WX 778 ; N .notdef ; B 139 0 639 625 ; -C 32 ; WX 250 ; N space ; B 111 -14 222 677 ; -C 33 ; WX 333 ; N exclam ; B 111 -14 222 677 ; -C 34 ; WX 408 ; N quotedbl ; B 65 392 342 677 ; -C 35 ; WX 500 ; N numbersign ; B 18 -14 482 677 ; -C 36 ; WX 500 ; N dollar ; B 53 -76 450 718 ; -C 37 ; WX 833 ; N percent ; B 35 -27 798 677 ; -C 38 ; WX 778 ; N ampersand ; B 37 -15 748 677 ; -C 39 ; WX 180 ; N quotesingle ; B 40 392 138 677 ; -C 40 ; WX 333 ; N parenleft ; B 41 -214 311 694 ; -C 41 ; WX 333 ; N parenright ; B 22 -214 292 694 ; -C 42 ; WX 500 ; N asterisk ; B 71 289 430 694 ; -C 43 ; WX 564 ; N plus ; B 18 69 544 595 ; -C 44 ; WX 250 ; N comma ; B 54 -167 199 98 ; -C 45 ; WX 333 ; N hyphen ; B 41 188 293 261 ; -C 46 ; WX 250 ; N period ; B 71 -14 179 95 ; -C 47 ; WX 278 ; N slash ; B 1 -14 280 694 ; -C 48 ; WX 500 ; N zero ; B 36 -12 464 676 ; -C 49 ; WX 500 ; N one ; B 117 0 378 676 ; -C 50 ; WX 500 ; N two ; B 21 0 458 676 ; -C 51 ; WX 500 ; N three ; B 41 -12 417 676 ; -C 52 ; WX 500 ; N four ; B 16 0 465 676 ; -C 53 ; WX 500 ; N five ; B 48 -12 434 662 ; -C 54 ; WX 500 ; N six ; B 43 -12 461 676 ; -C 55 ; WX 500 ; N seven ; B 37 -14 456 662 ; -C 56 ; WX 500 ; N eight ; B 61 -12 442 676 ; -C 57 ; WX 500 ; N nine ; B 40 -14 457 676 ; -C 58 ; WX 278 ; N colon ; B 86 -14 195 461 ; -C 59 ; WX 278 ; N semicolon ; B 69 -167 215 461 ; -C 60 ; WX 564 ; N less ; B 19 91 544 572 ; -C 61 ; WX 564 ; N equal ; B 18 232 545 431 ; -C 62 ; WX 564 ; N greater ; B 18 91 543 572 ; -C 63 ; WX 444 ; N question ; B 45 -13 404 677 ; -C 64 ; WX 921 ; N at ; B 47 -216 896 694 ; -C 65 ; WX 722 ; N A ; B 8 0 711 677 ; -C 66 ; WX 667 ; N B ; B 17 0 612 662 ; -C 67 ; WX 667 ; N C ; B 36 -15 632 677 ; -C 68 ; WX 722 ; N D ; B 17 0 684 662 ; -C 69 ; WX 611 ; N E ; B 21 0 588 662 ; -C 70 ; WX 556 ; N F ; B 16 0 515 662 ; -C 71 ; WX 722 ; N G ; B 35 -15 708 677 ; -C 72 ; WX 722 ; N H ; B 17 0 702 662 ; -C 73 ; WX 333 ; N I ; B 25 0 309 662 ; -C 74 ; WX 389 ; N J ; B 21 -15 383 662 ; -C 75 ; WX 722 ; N K ; B 17 0 730 662 ; -C 76 ; WX 611 ; N L ; B 20 0 589 662 ; -C 77 ; WX 889 ; N M ; B 17 0 868 662 ; -C 78 ; WX 722 ; N N ; B -13 -11 708 662 ; -C 79 ; WX 722 ; N O ; B 35 -15 684 677 ; -C 80 ; WX 556 ; N P ; B 17 0 521 662 ; -C 81 ; WX 722 ; N Q ; B 35 -196 684 677 ; -C 82 ; WX 667 ; N R ; B 17 0 676 662 ; -C 83 ; WX 556 ; N S ; B 63 -15 502 677 ; -C 84 ; WX 611 ; N T ; B 30 0 586 662 ; -C 85 ; WX 722 ; N U ; B 5 -16 711 662 ; -C 86 ; WX 722 ; N V ; B 9 -15 710 662 ; -C 87 ; WX 944 ; N W ; B 13 -15 936 662 ; -C 88 ; WX 722 ; N X ; B 7 0 710 662 ; -C 89 ; WX 722 ; N Y ; B 9 0 708 662 ; -C 90 ; WX 611 ; N Z ; B 13 0 583 662 ; -C 91 ; WX 333 ; N bracketleft ; B 82 -198 297 677 ; -C 92 ; WX 278 ; N backslash ; B 1 -14 280 694 ; -C 93 ; WX 333 ; N bracketright ; B 37 -199 251 677 ; -C 94 ; WX 469 ; N asciicircum ; B 18 326 451 676 ; -C 95 ; WX 500 ; N underscore ; B -8 -216 509 -175 ; -C 96 ; WX 333 ; N grave ; B 58 510 218 679 ; -C 97 ; WX 444 ; N a ; B 36 -9 442 460 ; -C 98 ; WX 500 ; N b ; B -2 -14 465 694 ; -C 99 ; WX 444 ; N c ; B 34 -14 411 460 ; -C 100 ; WX 500 ; N d ; B 33 -14 502 694 ; -C 101 ; WX 444 ; N e ; B 37 -14 416 461 ; -C 102 ; WX 333 ; N f ; B 39 0 435 693 ; -C 103 ; WX 500 ; N g ; B 30 -216 482 460 ; -C 104 ; WX 500 ; N h ; B 6 0 494 694 ; -C 105 ; WX 278 ; N i ; B 29 0 253 694 ; -C 106 ; WX 278 ; N j ; B -77 -216 195 695 ; -C 107 ; WX 500 ; N k ; B 8 0 506 694 ; -C 108 ; WX 278 ; N l ; B 30 0 257 694 ; -C 109 ; WX 778 ; N m ; B 8 0 773 460 ; -C 110 ; WX 500 ; N n ; B 6 0 496 460 ; -C 111 ; WX 500 ; N o ; B 34 -14 465 460 ; -C 112 ; WX 500 ; N p ; B -3 -214 466 460 ; -C 113 ; WX 500 ; N q ; B 33 -214 500 460 ; -C 114 ; WX 333 ; N r ; B 6 0 339 460 ; -C 115 ; WX 389 ; N s ; B 49 -14 354 460 ; -C 116 ; WX 278 ; N t ; B 10 -7 279 594 ; -C 117 ; WX 500 ; N u ; B 1 -14 499 447 ; -C 118 ; WX 500 ; N v ; B 8 -14 491 447 ; -C 119 ; WX 722 ; N w ; B 6 -14 713 447 ; -C 120 ; WX 500 ; N x ; B 13 0 488 447 ; -C 121 ; WX 500 ; N y ; B 6 -216 494 447 ; -C 122 ; WX 444 ; N z ; B 20 0 428 447 ; -C 123 ; WX 480 ; N braceleft ; B 138 -216 411 694 ; -C 124 ; WX 200 ; N bar ; B 79 -216 119 694 ; -C 125 ; WX 480 ; N braceright ; B 86 -216 359 694 ; -C 126 ; WX 541 ; N asciitilde ; B 21 194 542 331 ; -C 127 ; WX 778 ; N .notdef ; B 139 0 639 625 ; -C 128 ; WX 500 ; N Euro ; B -11 -12 482 676 ; -C 129 ; WX 578 ; N afii10052 ; B 18 0 552 896 ; -C 130 ; WX 333 ; N quotesinglbase ; B 99 -167 245 98 ; -C 131 ; WX 500 ; N florin ; B 1 -210 488 677 ; -C 132 ; WX 444 ; N quotedblbase ; B 33 -154 416 98 ; -C 133 ; WX 1000 ; N ellipsis ; B 112 -14 888 95 ; -C 134 ; WX 500 ; N dagger ; B 49 -206 451 685 ; -C 135 ; WX 500 ; N daggerdbl ; B 68 -216 432 694 ; -C 136 ; WX 333 ; N circumflex ; B 29 515 304 676 ; -C 137 ; WX 1000 ; N perthousand ; B 32 -27 967 677 ; -C 138 ; WX 556 ; N Scaron ; B 63 -15 502 875 ; -C 139 ; WX 333 ; N guilsinglleft ; B 58 -4 275 456 ; -C 140 ; WX 889 ; N OE ; B 37 -8 861 668 ; -C 141 ; WX 667 ; N afii10061 ; B 18 0 664 877 ; -C 142 ; WX 611 ; N Zcaron ; B 13 0 583 875 ; -C 143 ; WX 722 ; N afii10145 ; B 18 -190 704 662 ; -C 144 ; WX 444 ; N quotedblbase ; B 33 -154 416 98 ; -C 145 ; WX 333 ; N quoteleft ; B 90 424 239 677 ; -C 146 ; WX 333 ; N quoteright ; B 94 424 243 677 ; -C 147 ; WX 444 ; N quotedblleft ; B 33 425 416 677 ; -C 148 ; WX 444 ; N quotedblright ; B 33 425 416 677 ; -C 149 ; WX 350 ; N bullet ; B 55 208 300 453 ; -C 150 ; WX 500 ; N endash ; B -9 221 508 257 ; -C 151 ; WX 1000 ; N emdash ; B -9 221 1009 257 ; -C 152 ; WX 333 ; N tilde ; B 11 534 323 662 ; -C 153 ; WX 980 ; N trademark ; B 15 268 963 662 ; -C 154 ; WX 389 ; N scaron ; B 49 -14 354 676 ; -C 155 ; WX 333 ; N guilsinglright ; B 56 -4 277 456 ; -C 156 ; WX 722 ; N oe ; B 33 -14 691 461 ; -C 157 ; WX 486 ; N afii10109 ; B 22 0 480 679 ; -C 158 ; WX 444 ; N zcaron ; B 20 0 428 676 ; -C 159 ; WX 722 ; N Ydieresis ; B 9 0 708 834 ; -C 160 ; WX 250 ; N space ; B 111 -14 222 677 ; -C 161 ; WX 333 ; N exclamdown ; B 111 -216 222 476 ; -C 162 ; WX 500 ; N cent ; B 63 -185 439 647 ; -C 163 ; WX 500 ; N sterling ; B 30 -12 477 676 ; -C 164 ; WX 500 ; N currency ; B 13 97 486 567 ; -C 165 ; WX 500 ; N yen ; B 1 0 500 662 ; -C 166 ; WX 200 ; N brokenbar ; B 79 -216 119 694 ; -C 167 ; WX 500 ; N section ; B 76 -195 424 676 ; -C 168 ; WX 333 ; N dieresis ; B 28 547 306 653 ; -C 169 ; WX 760 ; N copyright ; B 34 -15 727 677 ; -C 170 ; WX 276 ; N ordfeminine ; B -3 382 274 676 ; -C 171 ; WX 500 ; N guillemotleft ; B 31 -4 469 456 ; -C 172 ; WX 564 ; N logicalnot ; B 18 230 545 429 ; -C 173 ; WX 333 ; N hyphen ; B 41 188 293 261 ; -C 174 ; WX 760 ; N registered ; B 34 -15 727 677 ; -C 175 ; WX 500 ; N overscore ; B -8 714 509 755 ; -C 176 ; WX 400 ; N degree ; B 48 376 348 677 ; -C 177 ; WX 549 ; N plusminus ; B 11 69 538 595 ; -C 178 ; WX 300 ; N twosuperior ; B 10 324 281 676 ; -C 179 ; WX 300 ; N threesuperior ; B 21 317 255 676 ; -C 180 ; WX 333 ; N acute ; B 115 510 276 679 ; -C 181 ; WX 576 ; N mu1 ; B 65 -216 534 447 ; -C 182 ; WX 453 ; N paragraph ; B -7 -216 455 662 ; -C 183 ; WX 250 ; N periodcentered ; B 71 277 179 385 ; -C 184 ; WX 333 ; N cedilla ; B 91 -190 242 8 ; -C 185 ; WX 300 ; N onesuperior ; B 66 324 233 676 ; -C 186 ; WX 310 ; N ordmasculine ; B 14 384 298 676 ; -C 187 ; WX 500 ; N guillemotright ; B 31 -4 469 456 ; -C 188 ; WX 750 ; N onequarter ; B 65 -26 733 676 ; -C 189 ; WX 750 ; N onehalf ; B 65 -26 729 676 ; -C 190 ; WX 750 ; N threequarters ; B 21 -26 733 676 ; -C 191 ; WX 444 ; N questiondown ; B 43 -216 402 476 ; -C 192 ; WX 722 ; N Agrave ; B 8 0 711 877 ; -C 193 ; WX 722 ; N Aacute ; B 8 0 711 877 ; -C 194 ; WX 722 ; N Acircumflex ; B 8 0 711 875 ; -C 195 ; WX 722 ; N Atilde ; B 8 0 711 842 ; -C 196 ; WX 722 ; N Adieresis ; B 8 0 711 834 ; -C 197 ; WX 722 ; N Aring ; B 8 0 711 831 ; -C 198 ; WX 889 ; N AE ; B -12 0 861 662 ; -C 199 ; WX 667 ; N Ccedilla ; B 36 -190 632 677 ; -C 200 ; WX 611 ; N Egrave ; B 21 0 588 877 ; -C 201 ; WX 611 ; N Eacute ; B 21 0 588 877 ; -C 202 ; WX 611 ; N Ecircumflex ; B 21 0 588 875 ; -C 203 ; WX 611 ; N Edieresis ; B 21 0 588 834 ; -C 204 ; WX 333 ; N Igrave ; B 25 0 309 877 ; -C 205 ; WX 333 ; N Iacute ; B 25 0 309 877 ; -C 206 ; WX 333 ; N Icircumflex ; B 25 0 309 875 ; -C 207 ; WX 333 ; N Idieresis ; B 25 0 309 834 ; -C 208 ; WX 722 ; N Eth ; B 17 0 684 662 ; -C 209 ; WX 722 ; N Ntilde ; B -13 -11 708 842 ; -C 210 ; WX 722 ; N Ograve ; B 35 -15 684 877 ; -C 211 ; WX 722 ; N Oacute ; B 35 -15 684 877 ; -C 212 ; WX 722 ; N Ocircumflex ; B 35 -15 684 875 ; -C 213 ; WX 722 ; N Otilde ; B 35 -15 684 842 ; -C 214 ; WX 722 ; N Odieresis ; B 35 -15 684 834 ; -C 215 ; WX 564 ; N multiply ; B 81 132 481 533 ; -C 216 ; WX 722 ; N Oslash ; B 36 -23 684 684 ; -C 217 ; WX 722 ; N Ugrave ; B 5 -16 711 877 ; -C 218 ; WX 722 ; N Uacute ; B 5 -16 711 877 ; -C 219 ; WX 722 ; N Ucircumflex ; B 5 -16 711 875 ; -C 220 ; WX 722 ; N Udieresis ; B 5 -16 711 834 ; -C 221 ; WX 722 ; N Yacute ; B 9 0 708 877 ; -C 222 ; WX 556 ; N Thorn ; B 18 0 518 662 ; -C 223 ; WX 500 ; N germandbls ; B 17 -6 468 694 ; -C 224 ; WX 444 ; N agrave ; B 36 -9 442 679 ; -C 225 ; WX 444 ; N aacute ; B 36 -9 442 679 ; -C 226 ; WX 444 ; N acircumflex ; B 36 -9 442 676 ; -C 227 ; WX 444 ; N atilde ; B 36 -9 442 662 ; -C 228 ; WX 444 ; N adieresis ; B 36 -9 442 653 ; -C 229 ; WX 444 ; N aring ; B 36 -9 442 696 ; -C 230 ; WX 667 ; N ae ; B 36 -14 637 461 ; -C 231 ; WX 444 ; N ccedilla ; B 34 -190 411 460 ; -C 232 ; WX 444 ; N egrave ; B 37 -14 416 679 ; -C 233 ; WX 444 ; N eacute ; B 37 -14 416 679 ; -C 234 ; WX 444 ; N ecircumflex ; B 37 -14 416 676 ; -C 235 ; WX 444 ; N edieresis ; B 37 -14 416 652 ; -C 236 ; WX 278 ; N igrave ; B 29 0 253 679 ; -C 237 ; WX 278 ; N iacute ; B 29 0 253 679 ; -C 238 ; WX 278 ; N icircumflex ; B 6 0 281 676 ; -C 239 ; WX 278 ; N idieresis ; B 1 0 279 652 ; -C 240 ; WX 500 ; N eth ; B 33 -14 463 694 ; -C 241 ; WX 500 ; N ntilde ; B 6 0 496 662 ; -C 242 ; WX 500 ; N ograve ; B 34 -14 465 679 ; -C 243 ; WX 500 ; N oacute ; B 34 -14 465 679 ; -C 244 ; WX 500 ; N ocircumflex ; B 34 -14 465 676 ; -C 245 ; WX 500 ; N otilde ; B 34 -14 465 662 ; -C 246 ; WX 500 ; N odieresis ; B 34 -14 465 652 ; -C 247 ; WX 549 ; N divide ; B 11 136 538 525 ; -C 248 ; WX 500 ; N oslash ; B 19 -33 481 478 ; -C 249 ; WX 500 ; N ugrave ; B 1 -14 499 679 ; -C 250 ; WX 500 ; N uacute ; B 1 -14 499 679 ; -C 251 ; WX 500 ; N ucircumflex ; B 1 -14 499 676 ; -C 252 ; WX 500 ; N udieresis ; B 1 -14 499 652 ; -C 253 ; WX 500 ; N yacute ; B 6 -216 494 679 ; -C 254 ; WX 500 ; N thorn ; B -3 -213 466 694 ; -C 255 ; WX 500 ; N ydieresis ; B 6 -216 494 653 ; -C -1 ; WX 0 ; N .null ; B 111 -14 222 677 ; -C -1 ; WX 250 ; N nonmarkingreturn ; B 111 -14 222 677 ; -C -1 ; WX 549 ; N notequal ; B 12 -132 537 660 ; -C -1 ; WX 713 ; N infinity ; B 24 52 685 461 ; -C -1 ; WX 549 ; N lessequal ; B 12 -80 537 605 ; -C -1 ; WX 549 ; N greaterequal ; B 12 -80 537 605 ; -C -1 ; WX 494 ; N partialdiff ; B 29 -15 484 694 ; -C -1 ; WX 713 ; N summation ; B 21 -216 693 693 ; -C -1 ; WX 823 ; N product ; B 22 -216 801 693 ; -C -1 ; WX 549 ; N pi1 ; B 30 -14 500 447 ; -C -1 ; WX 274 ; N integral ; B -1 -107 272 910 ; -C -1 ; WX 768 ; N Ohm ; B 35 0 734 675 ; -C -1 ; WX 549 ; N radical ; B 42 -38 550 913 ; -C -1 ; WX 549 ; N approxequal ; B 15 133 535 508 ; -C -1 ; WX 612 ; N increment ; B 14 0 600 677 ; -C -1 ; WX 494 ; N lozenge ; B 23 0 472 694 ; -C -1 ; WX 167 ; N fraction ; B -167 -26 333 676 ; -C -1 ; WX 556 ; N fi ; B 12 0 530 694 ; -C -1 ; WX 556 ; N fl ; B 11 0 531 694 ; -C -1 ; WX 278 ; N dotlessi ; B 29 0 253 460 ; -C -1 ; WX 333 ; N macron ; B 11 598 323 661 ; -C -1 ; WX 333 ; N breve ; B 27 526 306 663 ; -C -1 ; WX 333 ; N dotaccent ; B 114 546 220 653 ; -C -1 ; WX 333 ; N ring ; B 73 508 260 695 ; -C -1 ; WX 333 ; N hungarumlaut ; B 38 510 314 679 ; -C -1 ; WX 333 ; N ogonek ; B 72 -177 297 8 ; -C -1 ; WX 333 ; N caron ; B 29 515 304 676 ; -C -1 ; WX 611 ; N Lslash ; B 11 0 585 662 ; -C -1 ; WX 278 ; N lslash ; B 15 0 269 694 ; -C -1 ; WX 564 ; N minus ; B 18 313 544 353 ; -C -1 ; WX 500 ; N franc ; B 16 0 463 662 ; -C -1 ; WX 722 ; N Gbreve ; B 35 -15 708 857 ; -C -1 ; WX 500 ; N gbreve ; B 30 -216 482 663 ; -C -1 ; WX 333 ; N Idot ; B 25 0 309 834 ; -C -1 ; WX 556 ; N Scedilla ; B 63 -190 502 677 ; -C -1 ; WX 389 ; N scedilla ; B 49 -190 354 460 ; -C -1 ; WX 667 ; N Cacute ; B 36 -15 632 877 ; -C -1 ; WX 444 ; N cacute ; B 34 -14 411 679 ; -C -1 ; WX 667 ; N Ccaron ; B 36 -15 632 875 ; -C -1 ; WX 444 ; N ccaron ; B 34 -14 411 676 ; -C -1 ; WX 500 ; N dmacron ; B 19 -14 488 694 ; -C -1 ; WX 333 ; N middot ; B 242 292 344 395 ; -C -1 ; WX 722 ; N Abreve ; B 8 0 711 859 ; -C -1 ; WX 444 ; N abreve ; B 36 -9 442 663 ; -C -1 ; WX 722 ; N Aogonek ; B 8 -177 726 677 ; -C -1 ; WX 444 ; N aogonek ; B 36 -177 504 460 ; -C -1 ; WX 722 ; N Dcaron ; B 17 0 684 875 ; -C -1 ; WX 646 ; N dcaron ; B 33 -14 638 694 ; -C -1 ; WX 722 ; N Dslash ; B 17 0 684 662 ; -C -1 ; WX 611 ; N Eogonek ; B 21 -177 588 662 ; -C -1 ; WX 444 ; N eogonek ; B 37 -177 463 461 ; -C -1 ; WX 611 ; N Ecaron ; B 21 0 588 875 ; -C -1 ; WX 444 ; N ecaron ; B 37 -14 416 676 ; -C -1 ; WX 611 ; N Lacute ; B 20 0 589 877 ; -C -1 ; WX 278 ; N lacute ; B 30 0 257 877 ; -C -1 ; WX 611 ; N Lcaron ; B 20 0 589 677 ; -C -1 ; WX 406 ; N lcaron ; B 29 0 397 694 ; -C -1 ; WX 611 ; N Ldot ; B 20 0 589 662 ; -C -1 ; WX 344 ; N ldot ; B 30 0 350 694 ; -C -1 ; WX 722 ; N Nacute ; B -13 -11 708 877 ; -C -1 ; WX 500 ; N nacute ; B 6 0 496 679 ; -C -1 ; WX 722 ; N Ncaron ; B -13 -11 708 875 ; -C -1 ; WX 500 ; N ncaron ; B 6 0 496 676 ; -C -1 ; WX 722 ; N Odblacute ; B 35 -15 684 877 ; -C -1 ; WX 500 ; N odblacute ; B 34 -14 465 679 ; -C -1 ; WX 667 ; N Racute ; B 17 0 676 877 ; -C -1 ; WX 333 ; N racute ; B 6 0 339 679 ; -C -1 ; WX 667 ; N Rcaron ; B 17 0 676 875 ; -C -1 ; WX 333 ; N rcaron ; B 6 0 339 676 ; -C -1 ; WX 556 ; N Sacute ; B 63 -15 502 877 ; -C -1 ; WX 389 ; N sacute ; B 49 -14 354 679 ; -C -1 ; WX 611 ; N Tcedilla ; B 30 -226 586 662 ; -C -1 ; WX 278 ; N tcedilla ; B 10 -226 279 594 ; -C -1 ; WX 611 ; N Tcaron ; B 30 0 586 875 ; -C -1 ; WX 427 ; N tcaron ; B 9 -7 418 694 ; -C -1 ; WX 722 ; N Uring ; B 5 -16 711 886 ; -C -1 ; WX 500 ; N uring ; B 1 -14 499 695 ; -C -1 ; WX 722 ; N Udblacute ; B 5 -16 711 877 ; -C -1 ; WX 500 ; N udblacute ; B 1 -14 499 679 ; -C -1 ; WX 611 ; N Zacute ; B 13 0 583 877 ; -C -1 ; WX 444 ; N zacute ; B 20 0 428 679 ; -C -1 ; WX 611 ; N Zdot ; B 13 0 583 834 ; -C -1 ; WX 444 ; N zdot ; B 20 0 428 653 ; -C -1 ; WX 578 ; N Gamma ; B 18 0 552 662 ; -C -1 ; WX 722 ; N Theta ; B 37 -15 686 677 ; -C -1 ; WX 731 ; N Phi ; B 35 0 696 662 ; -C -1 ; WX 524 ; N alpha ; B 42 -14 517 460 ; -C -1 ; WX 471 ; N delta ; B 34 -14 437 693 ; -C -1 ; WX 420 ; N epsilon ; B 35 -14 403 460 ; -C -1 ; WX 539 ; N sigma ; B 34 -14 519 447 ; -C -1 ; WX 402 ; N tau ; B 6 -14 382 447 ; -C -1 ; WX 577 ; N phi ; B 34 -214 543 460 ; -C -1 ; WX 500 ; N underscoredbl ; B -8 -216 509 -98 ; -C -1 ; WX 573 ; N exclamdbl ; B 111 -14 461 677 ; -C -1 ; WX 315 ; N nsuperior ; B 1 278 313 557 ; -C -1 ; WX 969 ; N peseta ; B 21 -13 956 662 ; -C -1 ; WX 1000 ; N arrowleft ; B 39 77 961 428 ; -C -1 ; WX 500 ; N arrowup ; B 75 -209 426 654 ; -C -1 ; WX 1000 ; N arrowright ; B 39 77 961 428 ; -C -1 ; WX 500 ; N arrowdown ; B 75 -209 426 654 ; -C -1 ; WX 1000 ; N arrowboth ; B 39 77 961 429 ; -C -1 ; WX 500 ; N arrowupdn ; B 74 -208 425 714 ; -C -1 ; WX 500 ; N arrowupdnbse ; B 74 -303 425 714 ; -C -1 ; WX 979 ; N orthogonal ; B 177 0 802 625 ; -C -1 ; WX 722 ; N intersection ; B 94 0 625 676 ; -C -1 ; WX 564 ; N equivalence ; B 19 152 545 511 ; -C -1 ; WX 600 ; N house ; B 75 0 525 563 ; -C -1 ; WX 564 ; N revlogicalnot ; B 19 230 546 429 ; -C -1 ; WX 604 ; N integraltp ; B 267 -251 477 848 ; -C -1 ; WX 604 ; N integralbt ; B 127 -251 337 848 ; -C -1 ; WX 708 ; N SF100000 ; B -11 261 719 346 ; -C -1 ; WX 708 ; N SF110000 ; B 219 -303 304 910 ; -C -1 ; WX 708 ; N SF010000 ; B 312 -303 720 346 ; -C -1 ; WX 708 ; N SF030000 ; B -11 -303 396 346 ; -C -1 ; WX 708 ; N SF020000 ; B 312 261 720 910 ; -C -1 ; WX 708 ; N SF040000 ; B -11 261 396 910 ; -C -1 ; WX 708 ; N SF080000 ; B 312 -303 720 910 ; -C -1 ; WX 708 ; N SF090000 ; B -11 -303 396 910 ; -C -1 ; WX 708 ; N SF060000 ; B -11 -303 719 346 ; -C -1 ; WX 708 ; N SF070000 ; B -11 261 719 910 ; -C -1 ; WX 708 ; N SF050000 ; B -11 -303 719 910 ; -C -1 ; WX 708 ; N SF430000 ; B -11 168 719 439 ; -C -1 ; WX 708 ; N SF240000 ; B 219 -303 490 910 ; -C -1 ; WX 708 ; N SF510000 ; B 312 -303 720 439 ; -C -1 ; WX 708 ; N SF520000 ; B 219 -303 720 346 ; -C -1 ; WX 708 ; N SF390000 ; B 219 -303 719 439 ; -C -1 ; WX 708 ; N SF220000 ; B -11 -303 396 439 ; -C -1 ; WX 708 ; N SF210000 ; B -11 -303 489 346 ; -C -1 ; WX 708 ; N SF250000 ; B -11 -303 489 439 ; -C -1 ; WX 708 ; N SF500000 ; B 312 168 720 910 ; -C -1 ; WX 708 ; N SF490000 ; B 219 261 720 910 ; -C -1 ; WX 708 ; N SF380000 ; B 219 168 719 910 ; -C -1 ; WX 708 ; N SF280000 ; B -11 168 396 910 ; -C -1 ; WX 708 ; N SF270000 ; B -11 261 489 910 ; -C -1 ; WX 708 ; N SF260000 ; B -11 168 489 910 ; -C -1 ; WX 708 ; N SF360000 ; B 312 -303 720 910 ; -C -1 ; WX 708 ; N SF370000 ; B 219 -303 720 910 ; -C -1 ; WX 708 ; N SF420000 ; B 219 -303 720 910 ; -C -1 ; WX 708 ; N SF190000 ; B -11 -303 396 910 ; -C -1 ; WX 708 ; N SF200000 ; B -11 -303 489 910 ; -C -1 ; WX 708 ; N SF230000 ; B -11 -303 489 910 ; -C -1 ; WX 708 ; N SF470000 ; B -11 -303 719 439 ; -C -1 ; WX 708 ; N SF480000 ; B -11 -303 719 346 ; -C -1 ; WX 708 ; N SF410000 ; B -11 -303 719 439 ; -C -1 ; WX 708 ; N SF450000 ; B -11 168 719 910 ; -C -1 ; WX 708 ; N SF460000 ; B -11 261 719 910 ; -C -1 ; WX 708 ; N SF400000 ; B -11 168 719 910 ; -C -1 ; WX 708 ; N SF540000 ; B -11 -303 719 910 ; -C -1 ; WX 708 ; N SF530000 ; B -11 -303 719 910 ; -C -1 ; WX 708 ; N SF440000 ; B -11 -303 719 910 ; -C -1 ; WX 708 ; N upblock ; B -11 303 719 910 ; -C -1 ; WX 708 ; N dnblock ; B -11 -303 719 303 ; -C -1 ; WX 708 ; N block ; B -11 -303 719 910 ; -C -1 ; WX 708 ; N lfblock ; B -11 -303 354 910 ; -C -1 ; WX 708 ; N rtblock ; B 354 -303 720 910 ; -C -1 ; WX 708 ; N ltshade ; B 50 -246 719 910 ; -C -1 ; WX 708 ; N shade ; B -11 -246 719 910 ; -C -1 ; WX 729 ; N dkshade ; B 0 -307 729 910 ; -C -1 ; WX 604 ; N filledbox ; B 71 0 532 461 ; -C -1 ; WX 1000 ; N filledrect ; B 0 155 1000 343 ; -C -1 ; WX 990 ; N triagup ; B 148 0 842 693 ; -C -1 ; WX 990 ; N triagrt ; B 141 -15 849 692 ; -C -1 ; WX 990 ; N triagdn ; B 148 -15 842 678 ; -C -1 ; WX 990 ; N triaglf ; B 141 -15 849 692 ; -C -1 ; WX 604 ; N circle ; B 87 67 517 497 ; -C -1 ; WX 604 ; N invbullet ; B 63 0 541 479 ; -C -1 ; WX 604 ; N invcircle ; B 21 0 584 564 ; -C -1 ; WX 1021 ; N smileface ; B 199 -58 822 564 ; -C -1 ; WX 1052 ; N invsmileface ; B 215 -58 838 564 ; -C -1 ; WX 917 ; N sun ; B 8 -109 909 792 ; -C -1 ; WX 750 ; N female ; B 119 -214 630 736 ; -C -1 ; WX 750 ; N male ; B 54 -128 691 791 ; -C -1 ; WX 531 ; N spade ; B 28 0 503 601 ; -C -1 ; WX 656 ; N club ; B 27 0 629 601 ; -C -1 ; WX 594 ; N heart ; B 31 -12 563 601 ; -C -1 ; WX 510 ; N diamond ; B 31 -12 479 601 ; -C -1 ; WX 500 ; N musicalnote ; B 18 -18 482 666 ; -C -1 ; WX 750 ; N musicalnotedbl ; B 42 -63 649 742 ; -C -1 ; WX 708 ; N IJ ; B 25 -15 706 662 ; -C -1 ; WX 552 ; N ij ; B 29 -216 472 695 ; -C -1 ; WX 604 ; N napostrophe ; B 1 0 601 677 ; -C -1 ; WX 219 ; N minute ; B 67 392 197 677 ; -C -1 ; WX 417 ; N second ; B 79 392 376 677 ; -C -1 ; WX 833 ; N afii61248 ; B 25 -27 808 677 ; -C -1 ; WX 479 ; N afii61289 ; B 49 -14 436 677 ; -C -1 ; WX 604 ; N H22073 ; B 71 0 532 461 ; -C -1 ; WX 354 ; N H18543 ; B 64 217 290 444 ; -C -1 ; WX 354 ; N H18551 ; B 64 217 290 444 ; -C -1 ; WX 604 ; N H18533 ; B 87 67 517 497 ; -C -1 ; WX 354 ; N openbullet ; B 55 208 300 453 ; -C -1 ; WX 722 ; N Amacron ; B 8 0 711 799 ; -C -1 ; WX 444 ; N amacron ; B 36 -9 442 609 ; -C -1 ; WX 667 ; N Ccircumflex ; B 36 -15 632 890 ; -C -1 ; WX 444 ; N ccircumflex ; B 34 -14 411 676 ; -C -1 ; WX 667 ; N Cdot ; B 36 -15 632 834 ; -C -1 ; WX 444 ; N cdot ; B 34 -14 411 653 ; -C -1 ; WX 611 ; N Emacron ; B 21 0 588 799 ; -C -1 ; WX 444 ; N emacron ; B 37 -14 416 609 ; -C -1 ; WX 611 ; N Ebreve ; B 21 0 588 864 ; -C -1 ; WX 444 ; N ebreve ; B 37 -14 416 663 ; -C -1 ; WX 611 ; N Edot ; B 21 0 588 834 ; -C -1 ; WX 444 ; N edot ; B 37 -14 416 653 ; -C -1 ; WX 722 ; N Gcircumflex ; B 35 -15 708 890 ; -C -1 ; WX 500 ; N gcircumflex ; B 30 -216 482 676 ; -C -1 ; WX 722 ; N Gdot ; B 35 -15 708 834 ; -C -1 ; WX 500 ; N gdot ; B 30 -216 482 653 ; -C -1 ; WX 722 ; N Gcedilla ; B 35 -190 708 677 ; -C -1 ; WX 500 ; N gcedilla ; B 30 -216 482 729 ; -C -1 ; WX 722 ; N Hcircumflex ; B 17 0 702 890 ; -C -1 ; WX 500 ; N hcircumflex ; B 6 0 494 890 ; -C -1 ; WX 722 ; N Hbar ; B 17 0 702 662 ; -C -1 ; WX 500 ; N hbar ; B 6 0 494 694 ; -C -1 ; WX 333 ; N Itilde ; B 11 0 323 854 ; -C -1 ; WX 278 ; N itilde ; B -17 0 296 662 ; -C -1 ; WX 333 ; N Imacron ; B 11 0 323 799 ; -C -1 ; WX 278 ; N imacron ; B -21 0 291 609 ; -C -1 ; WX 333 ; N Ibreve ; B 25 0 309 864 ; -C -1 ; WX 278 ; N ibreve ; B -1 0 278 663 ; -C -1 ; WX 333 ; N Iogonek ; B 25 -177 333 662 ; -C -1 ; WX 278 ; N iogonek ; B 29 -177 317 694 ; -C -1 ; WX 389 ; N Jcircumflex ; B 21 -15 383 890 ; -C -1 ; WX 278 ; N jcircumflex ; B -77 -216 276 676 ; -C -1 ; WX 722 ; N Kcedilla ; B 17 -191 730 662 ; -C -1 ; WX 500 ; N kcedilla ; B 8 -191 506 694 ; -C -1 ; WX 500 ; N kgreenlandic ; B 8 0 506 447 ; -C -1 ; WX 611 ; N Lcedilla ; B 20 -191 589 662 ; -C -1 ; WX 278 ; N lcedilla ; B 30 -191 257 694 ; -C -1 ; WX 722 ; N Ncedilla ; B -13 -191 708 662 ; -C -1 ; WX 500 ; N ncedilla ; B 6 -191 496 460 ; -C -1 ; WX 702 ; N Eng ; B 19 -15 656 677 ; -C -1 ; WX 495 ; N eng ; B 6 -216 427 460 ; -C -1 ; WX 722 ; N Omacron ; B 35 -15 684 799 ; -C -1 ; WX 500 ; N omacron ; B 34 -14 465 609 ; -C -1 ; WX 722 ; N Obreve ; B 35 -15 684 864 ; -C -1 ; WX 500 ; N obreve ; B 34 -14 465 663 ; -C -1 ; WX 667 ; N Rcedilla ; B 17 -191 676 662 ; -C -1 ; WX 333 ; N rcedilla ; B 6 -191 339 460 ; -C -1 ; WX 556 ; N Scircumflex ; B 63 -15 502 890 ; -C -1 ; WX 389 ; N scircumflex ; B 49 -14 354 676 ; -C -1 ; WX 611 ; N Tbar ; B 29 0 584 662 ; -C -1 ; WX 278 ; N tbar ; B 8 -7 277 594 ; -C -1 ; WX 722 ; N Utilde ; B 5 -16 711 856 ; -C -1 ; WX 500 ; N utilde ; B 1 -14 499 662 ; -C -1 ; WX 722 ; N Umacron ; B 6 -16 712 799 ; -C -1 ; WX 500 ; N umacron ; B 1 -14 499 609 ; -C -1 ; WX 722 ; N Ubreve ; B 6 -16 712 864 ; -C -1 ; WX 500 ; N ubreve ; B 1 -14 499 663 ; -C -1 ; WX 722 ; N Uogonek ; B 5 -177 711 662 ; -C -1 ; WX 500 ; N uogonek ; B 1 -177 544 447 ; -C -1 ; WX 944 ; N Wcircumflex ; B 13 -15 936 890 ; -C -1 ; WX 722 ; N wcircumflex ; B 6 -14 713 676 ; -C -1 ; WX 722 ; N Ycircumflex ; B 9 0 708 890 ; -C -1 ; WX 500 ; N ycircumflex ; B 6 -216 494 676 ; -C -1 ; WX 278 ; N longs ; B 11 0 404 693 ; -C -1 ; WX 722 ; N Aringacute ; B 8 0 711 1007 ; -C -1 ; WX 444 ; N aringacute ; B 36 -9 442 896 ; -C -1 ; WX 889 ; N AEacute ; B -12 0 861 896 ; -C -1 ; WX 667 ; N aeacute ; B 36 -14 637 679 ; -C -1 ; WX 722 ; N Oslashacute ; B 36 -23 684 896 ; -C -1 ; WX 500 ; N oslashacute ; B 19 -33 481 679 ; -C -1 ; WX 278 ; N anoteleia ; B 87 353 195 461 ; -C -1 ; WX 944 ; N Wgrave ; B 13 -15 936 896 ; -C -1 ; WX 722 ; N wgrave ; B 6 -14 713 679 ; -C -1 ; WX 944 ; N Wacute ; B 13 -15 936 896 ; -C -1 ; WX 722 ; N wacute ; B 6 -14 713 679 ; -C -1 ; WX 944 ; N Wdieresis ; B 13 -15 936 834 ; -C -1 ; WX 722 ; N wdieresis ; B 6 -14 713 653 ; -C -1 ; WX 722 ; N Ygrave ; B 9 0 708 896 ; -C -1 ; WX 500 ; N ygrave ; B 6 -216 494 679 ; -C -1 ; WX 333 ; N quotereversed ; B 90 424 239 677 ; -C -1 ; WX 333 ; N radicalex ; B -18 546 352 609 ; -C -1 ; WX 500 ; N afii08941 ; B 30 -12 477 676 ; -C -1 ; WX 600 ; N estimated ; B 44 -17 561 535 ; -C -1 ; WX 750 ; N oneeighth ; B 65 -26 719 676 ; -C -1 ; WX 750 ; N threeeighths ; B 21 -26 719 676 ; -C -1 ; WX 750 ; N fiveeighths ; B 24 -26 719 676 ; -C -1 ; WX 750 ; N seveneighths ; B 18 -26 719 676 ; -C -1 ; WX 333 ; N commaaccent ; B 95 -227 211 -43 ; -C -1 ; WX 333 ; N undercommaaccent ; B 91 -191 242 -29 ; -C -1 ; WX 333 ; N tonos ; B 115 510 276 679 ; -C -1 ; WX 333 ; N dieresistonos ; B -11 510 344 679 ; -C -1 ; WX 722 ; N Alphatonos ; B 8 0 711 679 ; -C -1 ; WX 694 ; N Epsilontonos ; B -80 0 670 679 ; -C -1 ; WX 808 ; N Etatonos ; B -80 0 788 679 ; -C -1 ; WX 411 ; N Iotatonos ; B -80 0 387 679 ; -C -1 ; WX 722 ; N Omicrontonos ; B -36 -15 684 679 ; -C -1 ; WX 816 ; N Upsilontonos ; B -80 0 802 679 ; -C -1 ; WX 743 ; N Omegatonos ; B -38 0 714 679 ; -C -1 ; WX 269 ; N iotadieresistonos ; B -39 -14 316 679 ; -C -1 ; WX 722 ; N Alpha ; B 8 0 711 677 ; -C -1 ; WX 667 ; N Beta ; B 17 0 612 662 ; -C -1 ; WX 643 ; N Delta ; B 24 0 618 677 ; -C -1 ; WX 611 ; N Epsilon ; B 21 0 588 662 ; -C -1 ; WX 611 ; N Zeta ; B 13 0 583 662 ; -C -1 ; WX 722 ; N Eta ; B 17 0 702 662 ; -C -1 ; WX 333 ; N Iota ; B 25 0 309 662 ; -C -1 ; WX 722 ; N Kappa ; B 17 0 730 662 ; -C -1 ; WX 725 ; N Lambda ; B 14 0 715 677 ; -C -1 ; WX 889 ; N Mu ; B 17 0 868 662 ; -C -1 ; WX 722 ; N Nu ; B -13 -11 708 662 ; -C -1 ; WX 643 ; N Xi ; B 39 0 604 662 ; -C -1 ; WX 722 ; N Omicron ; B 35 -15 684 677 ; -C -1 ; WX 722 ; N Pi ; B 18 0 704 662 ; -C -1 ; WX 556 ; N Rho ; B 17 0 521 662 ; -C -1 ; WX 582 ; N Sigma ; B 16 0 556 662 ; -C -1 ; WX 611 ; N Tau ; B 30 0 586 662 ; -C -1 ; WX 722 ; N Upsilon ; B 9 0 708 662 ; -C -1 ; WX 722 ; N Chi ; B 7 0 710 662 ; -C -1 ; WX 738 ; N Psi ; B 12 0 727 670 ; -C -1 ; WX 743 ; N Omega ; B 29 0 714 677 ; -C -1 ; WX 333 ; N Iotadieresis ; B 25 0 309 834 ; -C -1 ; WX 722 ; N Upsilondieresis ; B 9 0 708 834 ; -C -1 ; WX 524 ; N alphatonos ; B 42 -14 517 679 ; -C -1 ; WX 420 ; N epsilontonos ; B 35 -14 403 679 ; -C -1 ; WX 523 ; N etatonos ; B 5 -214 470 679 ; -C -1 ; WX 269 ; N iotatonos ; B 18 -14 273 679 ; -C -1 ; WX 495 ; N upsilondieresistonos ; B -3 -14 457 679 ; -C -1 ; WX 509 ; N beta ; B 54 -214 476 693 ; -C -1 ; WX 442 ; N gamma ; B 0 -216 433 454 ; -C -1 ; WX 414 ; N zeta ; B 34 -216 406 691 ; -C -1 ; WX 523 ; N eta ; B 5 -214 470 460 ; -C -1 ; WX 479 ; N theta ; B 40 -14 440 693 ; -C -1 ; WX 269 ; N iota ; B 18 -14 273 460 ; -C -1 ; WX 504 ; N kappa ; B 10 0 509 460 ; -C -1 ; WX 485 ; N lambda ; B 12 -7 490 693 ; -C -1 ; WX 536 ; N mu ; B 57 -216 536 447 ; -C -1 ; WX 452 ; N nu ; B -22 -14 435 460 ; -C -1 ; WX 446 ; N xi ; B 34 -216 437 693 ; -C -1 ; WX 500 ; N omicron ; B 34 -14 465 460 ; -C -1 ; WX 499 ; N rho ; B 43 -214 465 460 ; -C -1 ; WX 396 ; N sigma1 ; B 34 -216 382 460 ; -C -1 ; WX 495 ; N upsilon ; B -3 -14 457 460 ; -C -1 ; WX 444 ; N chi ; B 12 -216 474 454 ; -C -1 ; WX 626 ; N psi ; B 14 -214 612 454 ; -C -1 ; WX 658 ; N omega ; B 37 -14 621 460 ; -C -1 ; WX 269 ; N iotadieresis ; B -5 -14 273 616 ; -C -1 ; WX 495 ; N upsilondieresis ; B -3 -14 457 616 ; -C -1 ; WX 500 ; N omicrontonos ; B 34 -14 465 679 ; -C -1 ; WX 495 ; N upsilontonos ; B -3 -14 457 679 ; -C -1 ; WX 658 ; N omegatonos ; B 37 -14 621 679 ; -C -1 ; WX 611 ; N afii10023 ; B 21 0 588 834 ; -C -1 ; WX 752 ; N afii10051 ; B 27 -8 715 662 ; -C -1 ; WX 660 ; N afii10053 ; B 37 -15 631 677 ; -C -1 ; WX 556 ; N afii10054 ; B 63 -15 502 677 ; -C -1 ; WX 333 ; N afii10055 ; B 25 0 309 662 ; -C -1 ; WX 333 ; N afii10056 ; B 25 0 309 834 ; -C -1 ; WX 389 ; N afii10057 ; B 21 -15 383 662 ; -C -1 ; WX 872 ; N afii10058 ; B 6 -8 838 662 ; -C -1 ; WX 872 ; N afii10059 ; B 19 0 839 662 ; -C -1 ; WX 741 ; N afii10060 ; B 26 0 729 662 ; -C -1 ; WX 708 ; N afii10062 ; B 13 -15 692 881 ; -C -1 ; WX 722 ; N afii10017 ; B 8 0 711 677 ; -C -1 ; WX 574 ; N afii10018 ; B 18 0 541 662 ; -C -1 ; WX 667 ; N afii10019 ; B 17 0 612 662 ; -C -1 ; WX 578 ; N afii10020 ; B 18 0 552 662 ; -C -1 ; WX 682 ; N afii10021 ; B 13 -190 664 662 ; -C -1 ; WX 611 ; N afii10022 ; B 21 0 588 662 ; -C -1 ; WX 896 ; N afii10024 ; B 9 0 887 670 ; -C -1 ; WX 501 ; N afii10025 ; B 21 -15 459 677 ; -C -1 ; WX 722 ; N afii10026 ; B 18 0 704 662 ; -C -1 ; WX 722 ; N afii10027 ; B 18 0 704 881 ; -C -1 ; WX 667 ; N afii10028 ; B 18 0 664 670 ; -C -1 ; WX 678 ; N afii10029 ; B 9 -8 660 662 ; -C -1 ; WX 889 ; N afii10030 ; B 17 0 868 662 ; -C -1 ; WX 722 ; N afii10031 ; B 17 0 702 662 ; -C -1 ; WX 722 ; N afii10032 ; B 35 -15 684 677 ; -C -1 ; WX 722 ; N afii10033 ; B 18 0 704 662 ; -C -1 ; WX 556 ; N afii10034 ; B 17 0 521 662 ; -C -1 ; WX 667 ; N afii10035 ; B 36 -15 632 677 ; -C -1 ; WX 611 ; N afii10036 ; B 30 0 586 662 ; -C -1 ; WX 708 ; N afii10037 ; B 13 -15 692 662 ; -C -1 ; WX 790 ; N afii10038 ; B 37 0 753 662 ; -C -1 ; WX 722 ; N afii10039 ; B 7 0 710 662 ; -C -1 ; WX 722 ; N afii10040 ; B 18 -190 704 662 ; -C -1 ; WX 650 ; N afii10041 ; B -3 0 632 662 ; -C -1 ; WX 1009 ; N afii10042 ; B 28 0 981 662 ; -C -1 ; WX 1009 ; N afii10043 ; B 28 -190 981 662 ; -C -1 ; WX 706 ; N afii10044 ; B 26 0 673 662 ; -C -1 ; WX 872 ; N afii10045 ; B 18 0 853 662 ; -C -1 ; WX 574 ; N afii10046 ; B 18 0 541 662 ; -C -1 ; WX 660 ; N afii10047 ; B 29 -15 624 677 ; -C -1 ; WX 1028 ; N afii10048 ; B 19 -15 991 677 ; -C -1 ; WX 667 ; N afii10049 ; B -9 0 650 662 ; -C -1 ; WX 444 ; N afii10065 ; B 36 -9 442 460 ; -C -1 ; WX 509 ; N afii10066 ; B 38 -14 482 694 ; -C -1 ; WX 472 ; N afii10067 ; B 23 0 438 447 ; -C -1 ; WX 410 ; N afii10068 ; B 15 0 404 447 ; -C -1 ; WX 509 ; N afii10069 ; B 13 -124 487 447 ; -C -1 ; WX 444 ; N afii10070 ; B 37 -14 416 461 ; -C -1 ; WX 691 ; N afii10072 ; B 11 0 680 453 ; -C -1 ; WX 395 ; N afii10073 ; B 12 -14 363 460 ; -C -1 ; WX 535 ; N afii10074 ; B 22 0 513 447 ; -C -1 ; WX 535 ; N afii10075 ; B 22 0 513 665 ; -C -1 ; WX 486 ; N afii10076 ; B 22 0 480 453 ; -C -1 ; WX 499 ; N afii10077 ; B 6 -8 477 447 ; -C -1 ; WX 633 ; N afii10078 ; B 22 0 611 447 ; -C -1 ; WX 535 ; N afii10079 ; B 22 0 513 447 ; -C -1 ; WX 500 ; N afii10080 ; B 34 -14 465 460 ; -C -1 ; WX 535 ; N afii10081 ; B 22 0 513 447 ; -C -1 ; WX 500 ; N afii10082 ; B -3 -214 466 460 ; -C -1 ; WX 444 ; N afii10083 ; B 34 -14 411 460 ; -C -1 ; WX 437 ; N afii10084 ; B 6 0 431 447 ; -C -1 ; WX 500 ; N afii10085 ; B 6 -216 494 447 ; -C -1 ; WX 648 ; N afii10086 ; B 42 -214 605 694 ; -C -1 ; WX 500 ; N afii10087 ; B 13 0 488 447 ; -C -1 ; WX 535 ; N afii10088 ; B 22 -124 513 447 ; -C -1 ; WX 503 ; N afii10089 ; B 15 0 481 447 ; -C -1 ; WX 770 ; N afii10090 ; B 22 0 748 447 ; -C -1 ; WX 770 ; N afii10091 ; B 22 -124 748 447 ; -C -1 ; WX 517 ; N afii10092 ; B 6 0 487 447 ; -C -1 ; WX 672 ; N afii10093 ; B 22 0 649 447 ; -C -1 ; WX 456 ; N afii10094 ; B 22 0 426 447 ; -C -1 ; WX 429 ; N afii10095 ; B 13 -14 395 460 ; -C -1 ; WX 747 ; N afii10096 ; B 22 -14 713 460 ; -C -1 ; WX 460 ; N afii10097 ; B 0 0 438 447 ; -C -1 ; WX 444 ; N afii10071 ; B 37 -14 416 652 ; -C -1 ; WX 483 ; N afii10099 ; B 8 -216 426 694 ; -C -1 ; WX 410 ; N afii10100 ; B 15 0 404 679 ; -C -1 ; WX 429 ; N afii10101 ; B 34 -14 416 460 ; -C -1 ; WX 389 ; N afii10102 ; B 49 -14 354 460 ; -C -1 ; WX 278 ; N afii10103 ; B 29 0 253 694 ; -C -1 ; WX 278 ; N afii10104 ; B 1 0 279 653 ; -C -1 ; WX 278 ; N afii10105 ; B -77 -216 195 695 ; -C -1 ; WX 727 ; N afii10106 ; B 6 -8 697 447 ; -C -1 ; WX 723 ; N afii10107 ; B 22 0 692 447 ; -C -1 ; WX 500 ; N afii10108 ; B 6 0 494 694 ; -C -1 ; WX 500 ; N afii10110 ; B 6 -216 494 665 ; -C -1 ; WX 535 ; N afii10193 ; B 22 -124 513 447 ; -C -1 ; WX 450 ; N afii10050 ; B 18 0 432 782 ; -C -1 ; WX 351 ; N afii10098 ; B 15 0 345 530 ; -C -1 ; WX 1000 ; N afii00208 ; B 32 224 969 294 ; -C -1 ; WX 954 ; N afii61352 ; B 8 -15 920 669 ; -C -1 ; WX 505 ; N pi ; B 6 -14 486 447 ; -C -1 ; WX 333 ; N sheva ; B 125 -215 208 -25 ; -C -1 ; WX 333 ; N hatafsegol ; B 14 -215 319 -24 ; -C -1 ; WX 333 ; N hatafpatah ; B 24 -215 309 -24 ; -C -1 ; WX 333 ; N hatafqamats ; B 9 -216 325 -24 ; -C -1 ; WX 333 ; N hiriq ; B 126 -153 207 -72 ; -C -1 ; WX 333 ; N tsere ; B 70 -153 263 -72 ; -C -1 ; WX 333 ; N segol ; B 70 -215 263 -24 ; -C -1 ; WX 333 ; N patah ; B 70 -130 263 -80 ; -C -1 ; WX 333 ; N qamats ; B 70 -215 263 -52 ; -C -1 ; WX 333 ; N holam ; B 126 587 207 668 ; -C -1 ; WX 333 ; N qubuts ; B 14 -215 319 -24 ; -C -1 ; WX 333 ; N dagesh ; B 126 211 207 292 ; -C -1 ; WX 333 ; N meteg ; B 141 -215 191 -53 ; -C -1 ; WX 356 ; N maqaf ; B 42 408 314 516 ; -C -1 ; WX 333 ; N rafe ; B 70 596 263 646 ; -C -1 ; WX 291 ; N paseq ; B 109 -49 181 564 ; -C -1 ; WX 343 ; N shindot ; B 335 587 417 668 ; -C -1 ; WX 343 ; N sindot ; B -73 587 8 668 ; -C -1 ; WX 278 ; N sofpasuq ; B 86 -14 195 525 ; -C -1 ; WX 481 ; N alef ; B 46 -9 447 554 ; -C -1 ; WX 455 ; N bet ; B 25 0 434 550 ; -C -1 ; WX 335 ; N gimel ; B 16 -6 316 554 ; -C -1 ; WX 419 ; N dalet ; B 33 -12 386 550 ; -C -1 ; WX 471 ; N he ; B 38 -13 428 550 ; -C -1 ; WX 279 ; N vav ; B 33 -9 222 554 ; -C -1 ; WX 286 ; N zayin ; B 38 -12 253 554 ; -C -1 ; WX 477 ; N het ; B 43 -12 434 550 ; -C -1 ; WX 476 ; N tet ; B 33 0 427 554 ; -C -1 ; WX 267 ; N yod ; B 33 233 223 554 ; -C -1 ; WX 452 ; N finalkaf ; B 33 -173 403 550 ; -C -1 ; WX 433 ; N kaf ; B 25 0 387 550 ; -C -1 ; WX 432 ; N lamed ; B 7 -11 389 746 ; -C -1 ; WX 507 ; N finalmem ; B 49 0 453 550 ; -C -1 ; WX 485 ; N mem ; B 38 0 439 554 ; -C -1 ; WX 274 ; N finalnun ; B 33 -173 231 554 ; -C -1 ; WX 305 ; N nun ; B 16 0 262 554 ; -C -1 ; WX 475 ; N samekh ; B 46 -11 429 550 ; -C -1 ; WX 454 ; N ayin ; B 33 -14 421 554 ; -C -1 ; WX 454 ; N finalpe ; B 33 -173 406 550 ; -C -1 ; WX 440 ; N pe ; B 43 0 395 550 ; -C -1 ; WX 482 ; N finaltsadi ; B 33 -173 450 554 ; -C -1 ; WX 460 ; N tsadi ; B 30 0 422 554 ; -C -1 ; WX 474 ; N qof ; B 51 -173 427 550 ; -C -1 ; WX 469 ; N resh ; B 33 -9 414 550 ; -C -1 ; WX 610 ; N shin ; B 33 0 578 554 ; -C -1 ; WX 500 ; N tav ; B 16 -8 446 550 ; -C -1 ; WX 557 ; N doublevav ; B 33 -9 500 554 ; -C -1 ; WX 545 ; N vavyod ; B 33 -9 488 554 ; -C -1 ; WX 533 ; N doubleyod ; B 33 233 490 554 ; -C -1 ; WX 209 ; N geresh ; B 52 304 162 535 ; -C -1 ; WX 372 ; N gershayim ; B 52 304 324 535 ; -C -1 ; WX 776 ; N newsheqelsign ; B 73 0 704 516 ; -C -1 ; WX 279 ; N vavshindot ; B -48 -9 222 668 ; -C -1 ; WX 452 ; N finalkafsheva ; B 33 -173 403 550 ; -C -1 ; WX 452 ; N finalkafqamats ; B 33 -173 403 550 ; -C -1 ; WX 432 ; N lamedholam ; B -81 -11 389 746 ; -C -1 ; WX 432 ; N lamedholamdagesh ; B -81 -11 389 746 ; -C -1 ; WX 454 ; N altayin ; B 25 0 421 554 ; -C -1 ; WX 610 ; N shinshindot ; B 33 0 578 668 ; -C -1 ; WX 610 ; N shinsindot ; B 33 0 578 668 ; -C -1 ; WX 610 ; N shindageshshindot ; B 33 0 578 668 ; -C -1 ; WX 610 ; N shindageshsindot ; B 33 0 578 668 ; -C -1 ; WX 481 ; N alefpatah ; B 46 -130 447 554 ; -C -1 ; WX 481 ; N alefqamats ; B 46 -215 447 554 ; -C -1 ; WX 481 ; N alefmapiq ; B 46 -9 447 554 ; -C -1 ; WX 455 ; N betdagesh ; B 25 0 434 550 ; -C -1 ; WX 335 ; N gimeldagesh ; B 16 -6 316 554 ; -C -1 ; WX 419 ; N daletdagesh ; B 33 -12 386 550 ; -C -1 ; WX 471 ; N hedagesh ; B 38 -13 428 550 ; -C -1 ; WX 279 ; N vavdagesh ; B 33 -9 222 554 ; -C -1 ; WX 309 ; N zayindagesh ; B 6 -12 276 554 ; -C -1 ; WX 476 ; N tetdagesh ; B 33 0 427 554 ; -C -1 ; WX 267 ; N yoddagesh ; B 33 233 223 554 ; -C -1 ; WX 452 ; N finalkafdagesh ; B 33 -173 403 550 ; -C -1 ; WX 433 ; N kafdagesh ; B 25 0 387 550 ; -C -1 ; WX 432 ; N lameddagesh ; B 7 -11 389 746 ; -C -1 ; WX 485 ; N memdagesh ; B 38 0 439 554 ; -C -1 ; WX 305 ; N nundagesh ; B 16 0 262 554 ; -C -1 ; WX 475 ; N samekhdagesh ; B 46 -11 429 550 ; -C -1 ; WX 454 ; N finalpedagesh ; B 33 -173 406 550 ; -C -1 ; WX 440 ; N pedagesh ; B 43 0 395 550 ; -C -1 ; WX 460 ; N tsadidagesh ; B 30 0 422 554 ; -C -1 ; WX 474 ; N qofdagesh ; B 51 -173 427 550 ; -C -1 ; WX 469 ; N reshdagesh ; B 33 -9 414 550 ; -C -1 ; WX 610 ; N shindagesh ; B 33 0 578 554 ; -C -1 ; WX 500 ; N tavdages ; B 16 -8 446 550 ; -C -1 ; WX 279 ; N vavholam ; B 33 -9 222 668 ; -C -1 ; WX 455 ; N betrafe ; B 25 0 434 646 ; -C -1 ; WX 433 ; N kafrafe ; B 25 0 387 646 ; -C -1 ; WX 440 ; N perafe ; B 43 0 395 646 ; -C -1 ; WX 502 ; N aleflamed ; B 7 -9 468 746 ; -C -1 ; WX 0 ; N zerowidthnonjoiner ; B -18 -134 18 629 ; -C -1 ; WX 0 ; N zerowidthjoiner ; B -107 -134 107 690 ; -C -1 ; WX 0 ; N lefttorightmark ; B -18 -134 210 690 ; -C -1 ; WX 0 ; N righttoleftmark ; B -210 -134 17 690 ; -C -1 ; WX 319 ; N afii57388 ; B 83 137 241 443 ; -C -1 ; WX 319 ; N afii57403 ; B 78 136 235 609 ; -C -1 ; WX 356 ; N afii57407 ; B 33 137 326 711 ; -C -1 ; WX 413 ; N afii57409 ; B 59 72 363 400 ; -C -1 ; WX 207 ; N afii57440 ; B -34 143 207 228 ; -C -1 ; WX 201 ; N afii57451 ; B 34 605 201 780 ; -C -1 ; WX 237 ; N afii57452 ; B 34 605 237 794 ; -C -1 ; WX 201 ; N afii57453 ; B 34 -130 201 44 ; -C -1 ; WX 201 ; N afii57454 ; B 34 673 201 774 ; -C -1 ; WX 209 ; N afii57455 ; B 35 605 209 817 ; -C -1 ; WX 201 ; N afii57456 ; B 34 -21 201 80 ; -C -1 ; WX 211 ; N afii57457 ; B 34 605 211 762 ; -C -1 ; WX 165 ; N afii57458 ; B 34 605 165 756 ; -C -1 ; WX 526 ; N afii57392 ; B 186 219 344 452 ; -C -1 ; WX 526 ; N afii57393 ; B 147 143 327 716 ; -C -1 ; WX 526 ; N afii57394 ; B 89 143 391 723 ; -C -1 ; WX 526 ; N afii57395 ; B 63 143 471 723 ; -C -1 ; WX 526 ; N afii57396 ; B 146 143 397 713 ; -C -1 ; WX 526 ; N afii57397 ; B 93 247 438 622 ; -C -1 ; WX 526 ; N afii57398 ; B 85 156 410 710 ; -C -1 ; WX 526 ; N afii57399 ; B 63 143 459 710 ; -C -1 ; WX 526 ; N afii57400 ; B 75 149 472 716 ; -C -1 ; WX 526 ; N afii57401 ; B 107 143 413 725 ; -C -1 ; WX 526 ; N afii57381 ; B 65 84 463 777 ; -C -1 ; WX 319 ; N afii57461 ; B 94 23 230 267 ; -C -1 ; WX 526 ; N afii63167 ; B 87 403 424 744 ; -C -1 ; WX 750 ; N afii57459 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57543 ; B 125 0 625 625 ; -C -1 ; WX 282 ; N afii57534 ; B 26 130 262 430 ; -C -1 ; WX 750 ; N afii57494 ; B 125 0 625 625 ; -C -1 ; WX 526 ; N afii62843 ; B 77 147 455 720 ; -C -1 ; WX 526 ; N afii62844 ; B 74 159 441 708 ; -C -1 ; WX 526 ; N afii62845 ; B 99 147 435 717 ; -C -1 ; WX 750 ; N afii64240 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii64241 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63954 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57382 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii64242 ; B 125 0 625 625 ; -C -1 ; WX 211 ; N afii62881 ; B 34 605 211 917 ; -C -1 ; WX 750 ; N afii57504 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57369 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57370 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57371 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57372 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57373 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57374 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57375 ; B 125 0 625 625 ; -C -1 ; WX 638 ; N afii57391 ; B -34 143 638 228 ; -C -1 ; WX 750 ; N afii57471 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57460 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii52258 ; B 125 0 625 625 ; -C -1 ; WX 713 ; N afii57506 ; B 28 -175 713 469 ; -C -1 ; WX 713 ; N afii62958 ; B 28 -175 713 469 ; -C -1 ; WX 244 ; N afii62956 ; B -34 -175 244 456 ; -C -1 ; WX 244 ; N afii52957 ; B -34 -175 244 456 ; -C -1 ; WX 750 ; N afii57505 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62889 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62887 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62888 ; B 125 0 625 625 ; -C -1 ; WX 563 ; N afii57507 ; B 26 -212 516 432 ; -C -1 ; WX 526 ; N afii62961 ; B 26 -212 526 426 ; -C -1 ; WX 530 ; N afii62959 ; B -34 -175 530 427 ; -C -1 ; WX 530 ; N afii62960 ; B -34 -175 530 427 ; -C -1 ; WX 489 ; N afii57508 ; B 36 -91 489 723 ; -C -1 ; WX 489 ; N afii62962 ; B 36 -91 489 723 ; -C -1 ; WX 812 ; N afii57567 ; B 10 143 812 734 ; -C -1 ; WX 933 ; N afii62964 ; B 10 143 933 734 ; -C -1 ; WX 394 ; N afii52305 ; B -34 143 394 734 ; -C -1 ; WX 515 ; N afii52306 ; B -34 143 515 734 ; -C -1 ; WX 812 ; N afii57509 ; B 10 143 812 867 ; -C -1 ; WX 933 ; N afii62967 ; B 10 143 933 867 ; -C -1 ; WX 394 ; N afii62965 ; B -34 143 394 876 ; -C -1 ; WX 515 ; N afii62966 ; B -34 143 515 876 ; -C -1 ; WX 638 ; N afii57555 ; B 24 -43 606 462 ; -C -1 ; WX 588 ; N afii52364 ; B 18 -110 588 252 ; -C -1 ; WX 750 ; N afii63753 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63754 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63759 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63763 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63795 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62891 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63808 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62938 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63810 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62942 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62947 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63813 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63823 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63824 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63833 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63844 ; B 125 0 625 625 ; -C -1 ; WX 226 ; N afii62882 ; B 23 605 226 933 ; -C -1 ; WX 211 ; N afii62883 ; B 34 605 211 905 ; -C -1 ; WX 211 ; N afii62884 ; B 34 605 211 840 ; -C -1 ; WX 211 ; N afii62885 ; B 31 606 211 897 ; -C -1 ; WX 211 ; N afii62886 ; B 34 605 211 853 ; -C -1 ; WX 750 ; N afii63846 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63849 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N uni202A ; B 125 0 625 625 ; -C -1 ; WX 750 ; N uni202B ; B 125 0 625 625 ; -C -1 ; WX 750 ; N uni202D ; B 125 0 625 625 ; -C -1 ; WX 750 ; N uni202E ; B 125 0 625 625 ; -C -1 ; WX 750 ; N uni202C ; B 125 0 625 625 ; -C -1 ; WX 750 ; N uni206E ; B 125 0 625 625 ; -C -1 ; WX 750 ; N _b_852 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N uni206A ; B 125 0 625 625 ; -C -1 ; WX 750 ; N uni206B ; B 125 0 625 625 ; -C -1 ; WX 750 ; N _b_855 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N uni206D ; B 125 0 625 625 ; -C -1 ; WX 750 ; N uniF00A ; B 125 0 625 625 ; -C -1 ; WX 750 ; N uniF00B ; B 125 0 625 625 ; -C -1 ; WX 750 ; N uniF00C ; B 125 0 625 625 ; -C -1 ; WX 750 ; N uniF00D ; B 125 0 625 625 ; -C -1 ; WX 750 ; N uniF00E ; B 125 0 625 625 ; -C -1 ; WX 1000 ; N uniFFFC ; B 0 0 1000 719 ; -C -1 ; WX 750 ; N afii63904 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63905 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63906 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63908 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63910 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63912 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62927 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63941 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62939 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63943 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62943 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62946 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63946 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62951 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63948 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62953 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63950 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63951 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63952 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63953 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63956 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63958 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63959 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63960 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63961 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii64046 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii64058 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii64059 ; B 125 0 625 625 ; -C -1 ; WX 319 ; N afii64060 ; B 62 -209 273 785 ; -C -1 ; WX 319 ; N afii64061 ; B 45 -209 257 785 ; -C -1 ; WX 750 ; N afii62945 ; B 125 0 625 625 ; -C -1 ; WX 616 ; N afii64184 ; B 10 143 603 766 ; -C -1 ; WX 413 ; N afii52399 ; B 59 72 363 400 ; -C -1 ; WX 207 ; N afii52400 ; B 7 130 206 827 ; -C -1 ; WX 229 ; N afii62753 ; B -18 143 229 827 ; -C -1 ; WX 207 ; N afii57411 ; B 42 130 179 880 ; -C -1 ; WX 229 ; N afii62754 ; B 8 143 229 880 ; -C -1 ; WX 432 ; N afii57412 ; B 24 -77 432 555 ; -C -1 ; WX 432 ; N afii62755 ; B 24 -77 432 555 ; -C -1 ; WX 207 ; N afii57413 ; B 22 -94 165 740 ; -C -1 ; WX 229 ; N afii62756 ; B 9 -94 229 740 ; -C -1 ; WX 638 ; N afii57414 ; B 24 -43 606 555 ; -C -1 ; WX 588 ; N afii62759 ; B 18 -110 588 491 ; -C -1 ; WX 244 ; N afii62757 ; B -34 143 244 668 ; -C -1 ; WX 244 ; N afii62758 ; B -34 143 244 668 ; -C -1 ; WX 207 ; N afii57415 ; B 72 130 165 740 ; -C -1 ; WX 229 ; N afii62760 ; B 9 143 229 740 ; -C -1 ; WX 713 ; N afii57416 ; B 28 -46 713 469 ; -C -1 ; WX 713 ; N afii62763 ; B 28 -46 713 469 ; -C -1 ; WX 244 ; N afii62761 ; B -34 -46 244 456 ; -C -1 ; WX 244 ; N afii62762 ; B -34 -46 244 456 ; -C -1 ; WX 282 ; N afii57417 ; B 0 130 271 641 ; -C -1 ; WX 375 ; N afii62764 ; B -4 143 375 768 ; -C -1 ; WX 713 ; N afii57418 ; B 28 143 713 628 ; -C -1 ; WX 713 ; N afii62767 ; B 28 143 713 628 ; -C -1 ; WX 244 ; N afii62765 ; B -34 143 244 667 ; -C -1 ; WX 244 ; N afii62766 ; B -34 143 244 667 ; -C -1 ; WX 713 ; N afii57419 ; B 28 143 713 715 ; -C -1 ; WX 713 ; N afii62770 ; B 28 143 713 715 ; -C -1 ; WX 244 ; N afii62768 ; B -34 143 244 754 ; -C -1 ; WX 244 ; N afii62769 ; B -34 143 244 754 ; -C -1 ; WX 563 ; N afii57420 ; B 26 -212 516 432 ; -C -1 ; WX 526 ; N afii62773 ; B 26 -212 526 426 ; -C -1 ; WX 530 ; N afii62771 ; B -34 -33 530 427 ; -C -1 ; WX 530 ; N afii62772 ; B -34 -33 530 427 ; -C -1 ; WX 563 ; N afii57421 ; B 26 -212 516 432 ; -C -1 ; WX 526 ; N afii62776 ; B 26 -212 526 426 ; -C -1 ; WX 530 ; N afii62774 ; B -34 143 530 427 ; -C -1 ; WX 530 ; N afii62775 ; B -34 143 530 427 ; -C -1 ; WX 563 ; N afii57422 ; B 26 -212 516 639 ; -C -1 ; WX 526 ; N afii62779 ; B 26 -212 526 639 ; -C -1 ; WX 530 ; N afii62777 ; B -34 143 530 639 ; -C -1 ; WX 530 ; N afii62778 ; B -34 143 530 639 ; -C -1 ; WX 337 ; N afii57423 ; B 46 143 337 552 ; -C -1 ; WX 337 ; N afii62780 ; B 46 143 337 552 ; -C -1 ; WX 337 ; N afii57424 ; B 46 143 337 759 ; -C -1 ; WX 337 ; N afii62781 ; B 46 143 337 759 ; -C -1 ; WX 489 ; N afii57425 ; B 36 -91 489 430 ; -C -1 ; WX 489 ; N afii62782 ; B 36 -91 489 430 ; -C -1 ; WX 489 ; N afii57426 ; B 36 -91 489 639 ; -C -1 ; WX 489 ; N afii62783 ; B 36 -91 489 639 ; -C -1 ; WX 821 ; N afii57427 ; B 30 -72 821 417 ; -C -1 ; WX 821 ; N afii62786 ; B 30 -72 821 417 ; -C -1 ; WX 531 ; N afii62784 ; B -34 143 531 401 ; -C -1 ; WX 531 ; N afii62785 ; B -34 143 531 401 ; -C -1 ; WX 821 ; N afii57428 ; B 30 -72 821 715 ; -C -1 ; WX 821 ; N afii62789 ; B 30 -72 821 715 ; -C -1 ; WX 531 ; N afii62787 ; B -34 143 531 715 ; -C -1 ; WX 531 ; N afii62788 ; B -34 143 531 715 ; -C -1 ; WX 1098 ; N afii57429 ; B 30 -72 1098 417 ; -C -1 ; WX 1098 ; N afii62792 ; B 30 -72 1098 417 ; -C -1 ; WX 846 ; N afii62790 ; B -34 143 846 405 ; -C -1 ; WX 846 ; N afii62791 ; B -34 143 846 405 ; -C -1 ; WX 1098 ; N afii57430 ; B 30 -72 1098 590 ; -C -1 ; WX 1098 ; N afii62795 ; B 30 -72 1098 590 ; -C -1 ; WX 846 ; N afii62793 ; B -34 143 846 590 ; -C -1 ; WX 846 ; N afii62794 ; B -34 143 846 590 ; -C -1 ; WX 582 ; N afii57431 ; B -34 143 582 793 ; -C -1 ; WX 582 ; N afii62798 ; B -34 143 582 793 ; -C -1 ; WX 582 ; N afii62796 ; B -34 143 582 793 ; -C -1 ; WX 582 ; N afii62797 ; B -34 143 582 793 ; -C -1 ; WX 582 ; N afii57432 ; B -34 143 582 793 ; -C -1 ; WX 582 ; N afii62801 ; B -34 143 582 793 ; -C -1 ; WX 582 ; N afii62799 ; B -34 143 582 793 ; -C -1 ; WX 582 ; N afii62800 ; B -34 143 582 793 ; -C -1 ; WX 544 ; N afii57433 ; B 21 -212 516 534 ; -C -1 ; WX 450 ; N afii62804 ; B 26 -212 486 431 ; -C -1 ; WX 526 ; N afii62802 ; B -34 143 470 472 ; -C -1 ; WX 394 ; N afii62803 ; B -34 143 394 418 ; -C -1 ; WX 544 ; N afii57434 ; B 21 -212 516 737 ; -C -1 ; WX 450 ; N afii62807 ; B 26 -212 486 639 ; -C -1 ; WX 526 ; N afii62805 ; B -34 143 470 639 ; -C -1 ; WX 394 ; N afii62806 ; B -34 143 394 639 ; -C -1 ; WX 789 ; N afii57441 ; B 19 143 789 681 ; -C -1 ; WX 789 ; N afii62810 ; B 19 143 789 681 ; -C -1 ; WX 268 ; N afii62808 ; B -34 143 268 726 ; -C -1 ; WX 263 ; N afii62809 ; B -34 143 263 707 ; -C -1 ; WX 582 ; N afii57442 ; B 34 -75 582 683 ; -C -1 ; WX 582 ; N afii62813 ; B 34 -75 582 683 ; -C -1 ; WX 268 ; N afii62811 ; B -34 143 268 740 ; -C -1 ; WX 263 ; N afii62812 ; B -34 143 263 727 ; -C -1 ; WX 601 ; N afii57443 ; B 22 143 601 775 ; -C -1 ; WX 601 ; N afii62816 ; B 22 143 601 775 ; -C -1 ; WX 394 ; N afii57410 ; B -34 143 394 734 ; -C -1 ; WX 394 ; N afii62815 ; B -34 143 394 734 ; -C -1 ; WX 506 ; N afii57444 ; B 35 7 506 775 ; -C -1 ; WX 506 ; N afii62819 ; B 35 7 506 775 ; -C -1 ; WX 207 ; N afii62817 ; B -34 143 207 775 ; -C -1 ; WX 207 ; N afii62818 ; B -34 143 207 775 ; -C -1 ; WX 338 ; N afii57445 ; B 17 -212 338 357 ; -C -1 ; WX 338 ; N afii62822 ; B 17 -212 338 357 ; -C -1 ; WX 394 ; N afii62820 ; B -34 143 394 411 ; -C -1 ; WX 394 ; N afii62821 ; B -34 143 394 411 ; -C -1 ; WX 526 ; N afii57446 ; B 34 -72 526 558 ; -C -1 ; WX 526 ; N afii62825 ; B 34 -72 526 558 ; -C -1 ; WX 244 ; N afii62823 ; B -34 143 244 636 ; -C -1 ; WX 244 ; N afii62824 ; B -34 143 244 636 ; -C -1 ; WX 282 ; N afii57447 ; B 26 130 262 430 ; -C -1 ; WX 375 ; N afii62828 ; B -4 143 375 583 ; -C -1 ; WX 450 ; N afii57470 ; B -34 125 385 555 ; -C -1 ; WX 394 ; N afii62827 ; B -34 -62 394 429 ; -C -1 ; WX 432 ; N afii57448 ; B 24 -77 432 385 ; -C -1 ; WX 432 ; N afii62829 ; B 24 -77 432 385 ; -C -1 ; WX 638 ; N afii57449 ; B 24 -43 606 462 ; -C -1 ; WX 588 ; N afii62830 ; B 18 -110 588 252 ; -C -1 ; WX 638 ; N afii57450 ; B 24 -208 606 462 ; -C -1 ; WX 588 ; N afii62833 ; B 18 -212 588 252 ; -C -1 ; WX 244 ; N afii62831 ; B -34 -69 244 456 ; -C -1 ; WX 244 ; N afii62832 ; B -34 -69 244 456 ; -C -1 ; WX 544 ; N afii62834 ; B 31 79 507 827 ; -C -1 ; WX 601 ; N afii62835 ; B 31 118 601 827 ; -C -1 ; WX 544 ; N afii62836 ; B 19 79 507 880 ; -C -1 ; WX 601 ; N afii62837 ; B 23 118 601 880 ; -C -1 ; WX 544 ; N afii62838 ; B 41 -111 507 724 ; -C -1 ; WX 601 ; N afii62839 ; B 32 -111 601 733 ; -C -1 ; WX 544 ; N afii62840 ; B 41 79 507 724 ; -C -1 ; WX 601 ; N afii62841 ; B 32 118 601 733 ; -C -1 ; WX 750 ; N glyph1021 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57543-2 ; B 125 0 625 625 ; -C -1 ; WX 201 ; N afii57454-2 ; B 34 673 201 774 ; -C -1 ; WX 201 ; N afii57451-2 ; B 34 605 201 780 ; -C -1 ; WX 750 ; N glyph1025 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1026 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57471-2 ; B 125 0 625 625 ; -C -1 ; WX 165 ; N afii57458-2 ; B 34 605 165 756 ; -C -1 ; WX 211 ; N afii57457-2 ; B 34 605 211 762 ; -C -1 ; WX 750 ; N afii57494-2 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57459-2 ; B 125 0 625 625 ; -C -1 ; WX 209 ; N afii57455-2 ; B 35 605 209 817 ; -C -1 ; WX 237 ; N afii57452-2 ; B 34 605 237 794 ; -C -1 ; WX 750 ; N glyph1034 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1035 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1036 ; B 125 0 625 625 ; -C -1 ; WX 211 ; N afii62884-2 ; B 34 605 211 840 ; -C -1 ; WX 211 ; N afii62881-2 ; B 34 605 211 917 ; -C -1 ; WX 211 ; N afii62886-2 ; B 34 605 211 853 ; -C -1 ; WX 211 ; N afii62883-2 ; B 34 605 211 905 ; -C -1 ; WX 211 ; N afii62885-2 ; B 31 606 211 897 ; -C -1 ; WX 226 ; N afii62882-2 ; B 23 605 226 933 ; -C -1 ; WX 750 ; N afii57504-2 ; B 125 0 625 625 ; -C -1 ; WX 201 ; N afii57456-2 ; B 34 -21 201 80 ; -C -1 ; WX 201 ; N afii57453-2 ; B 34 -130 201 44 ; -C -1 ; WX 750 ; N glyph1046 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1047 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57543-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57454-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57451-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1051 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1052 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57471-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57458-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57457-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57494-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57459-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57455-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57452-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1060 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1061 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1062 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62884-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62881-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62886-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62883-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62885-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62882-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57504-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57456-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57453-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1072 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1073 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57543-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57454-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57451-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1077 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1078 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57471-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57458-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57457-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57494-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57459-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57455-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57452-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1086 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1087 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1088 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62884-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62881-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62886-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62883-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62885-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62882-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57504-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57456-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57453-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1098 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1099 ; B 125 0 625 625 ; -C -1 ; WX 319 ; N glyph1100 ; B 99 137 223 714 ; -C -1 ; WX 319 ; N glyph1101 ; B 97 137 226 267 ; -C -1 ; WX 319 ; N glyph1102 ; B 97 137 225 542 ; -C -1 ; WX 750 ; N glyph1103 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1104 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1105 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1106 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1107 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1108 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1109 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1110 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1111 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1112 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1113 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1114 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1115 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1116 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1117 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1118 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1119 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1120 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1121 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1122 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1123 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1124 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1125 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1126 ; B 125 0 625 625 ; -C -1 ; WX 125 ; N afii57440-2 ; B -34 143 125 228 ; -C -1 ; WX 1000 ; N afii57440-3 ; B -34 143 1000 228 ; -C -1 ; WX 2000 ; N afii57440-4 ; B -34 143 2000 228 ; -C -1 ; WX 722 ; N Ohorn ; B 69 -15 717 758 ; -C -1 ; WX 529 ; N ohorn ; B 34 -14 536 478 ; -C -1 ; WX 776 ; N Uhorn ; B 5 -16 810 774 ; -C -1 ; WX 542 ; N uhorn ; B 1 -14 544 478 ; -C -1 ; WX 0 ; N glyph1134 ; B -275 818 -142 891 ; -C -1 ; WX 0 ; N glyph1135 ; B -490 818 -306 891 ; -C -1 ; WX 0 ; N glyph1136 ; B -366 728 -205 891 ; -C -1 ; WX 0 ; N uniF006 ; B -218 818 -84 891 ; -C -1 ; WX 0 ; N uniF007 ; B -391 818 -209 891 ; -C -1 ; WX 0 ; N uniF009 ; B -271 728 -111 891 ; -C -1 ; WX 0 ; N combininghookabove ; B -202 728 -64 891 ; -C -1 ; WX 0 ; N uniF010 ; B -229 810 -105 891 ; -C -1 ; WX 0 ; N uniF013 ; B -286 728 -147 891 ; -C -1 ; WX 0 ; N uniF011 ; B -426 810 -302 891 ; -C -1 ; WX 0 ; N uniF01C ; B -309 755 4 884 ; -C -1 ; WX 0 ; N uniF015 ; B -496 814 -214 891 ; -C -1 ; WX 0 ; N combiningtildeaccent ; B -376 726 -63 854 ; -C -1 ; WX 0 ; N glyph1147 ; B -125 728 125 808 ; -C -1 ; WX 0 ; N glyph1148 ; B -124 729 124 799 ; -C -1 ; WX 0 ; N uniF02C ; B -173 -167 -64 -59 ; -C -1 ; WX 513 ; N dongsign ; B 79 140 422 694 ; -C -1 ; WX 750 ; N onethird ; B 66 -27 707 676 ; -C -1 ; WX 750 ; N twothirds ; B 10 -27 707 676 ; -C -1 ; WX 0 ; N uniF008 ; B -195 510 -35 673 ; -C -1 ; WX 0 ; N glyph1154 ; B -271 510 -111 673 ; -C -1 ; WX 0 ; N glyph1155 ; B -255 510 -94 673 ; -C -1 ; WX 0 ; N uniF00F ; B -317 510 -156 673 ; -C -1 ; WX 0 ; N uniF012 ; B -202 510 -64 674 ; -C -1 ; WX 0 ; N uniF014 ; B -284 510 -146 674 ; -C -1 ; WX 0 ; N uniF016 ; B -520 755 -207 884 ; -C -1 ; WX 0 ; N uniF017 ; B -520 755 -207 884 ; -C -1 ; WX 0 ; N uniF018 ; B -568 755 -255 884 ; -C -1 ; WX 0 ; N uniF019 ; B -376 534 -63 662 ; -C -1 ; WX 0 ; N uniF01A ; B -432 534 -119 662 ; -C -1 ; WX 0 ; N uniF01B ; B -466 534 -153 662 ; -C -1 ; WX 0 ; N uniF01E ; B -356 -167 -248 -59 ; -C -1 ; WX 0 ; N uniF01F ; B -412 -167 -304 -59 ; -C -1 ; WX 0 ; N uniF020 ; B -418 -167 -310 -59 ; -C -1 ; WX 0 ; N uniF021 ; B -415 -167 -307 -59 ; -C -1 ; WX 0 ; N uniF022 ; B -467 -167 -358 -59 ; -C -1 ; WX 0 ; N combininggraveaccent ; B -240 728 -80 891 ; -C -1 ; WX 0 ; N combiningacuteaccent ; B -195 728 -35 891 ; -C -1 ; WX 0 ; N uniF01D ; B -304 534 8 662 ; -C -1 ; WX 0 ; N combiningdotbelow ; B -445 -167 -336 -59 ; -C -1 ; WX 0 ; N uniF023 ; B -280 -167 -171 -59 ; -C -1 ; WX 0 ; N uniF029 ; B -215 -167 -107 -59 ; -C -1 ; WX 0 ; N uniF02A ; B -202 -167 -94 -59 ; -C -1 ; WX 0 ; N uniF02B ; B -405 -167 -296 -59 ; -C -1 ; WX 0 ; N uniF024 ; B -265 -167 -157 -59 ; -C -1 ; WX 0 ; N uniF025 ; B -309 -167 -201 -59 ; -C -1 ; WX 0 ; N uniF026 ; B -338 -167 -230 -59 ; -C -1 ; WX 0 ; N uniF027 ; B -301 -167 -193 -59 ; -C -1 ; WX 0 ; N uniF028 ; B -338 -167 -230 -59 ; -C -1 ; WX 0 ; N uniF02D ; B -433 813 -151 891 ; -C -1 ; WX 0 ; N uniF02E ; B -452 755 -139 884 ; -C -1 ; WX 0 ; N uniF02F ; B -496 813 -214 891 ; -C -1 ; WX 0 ; N uniF030 ; B -520 755 -207 884 ; -C -1 ; WX 278 ; N uniF031 ; B 29 0 253 460 ; -C -1 ; WX 722 ; N Adotbelow ; B 8 -167 711 677 ; -C -1 ; WX 444 ; N adotbelow ; B 36 -167 442 460 ; -C -1 ; WX 722 ; N Ahookabove ; B 8 0 711 891 ; -C -1 ; WX 444 ; N ahookabove ; B 36 -9 442 674 ; -C -1 ; WX 722 ; N Acircumflexacute ; B 8 0 711 891 ; -C -1 ; WX 444 ; N acircumflexacute ; B 36 -9 442 891 ; -C -1 ; WX 722 ; N Acircumflexgrave ; B 8 0 711 891 ; -C -1 ; WX 444 ; N acircumflexgrave ; B 36 -9 442 891 ; -C -1 ; WX 722 ; N Acircumflexhookabove ; B 8 0 711 891 ; -C -1 ; WX 444 ; N acircumflexhookabove ; B 36 -9 442 891 ; -C -1 ; WX 722 ; N Acircumflextilde ; B 8 0 711 891 ; -C -1 ; WX 444 ; N acircumflextilde ; B 36 -9 442 854 ; -C -1 ; WX 722 ; N Acircumflexdotbelow ; B 8 -167 711 799 ; -C -1 ; WX 444 ; N acircumflexdotbelow ; B 36 -167 442 676 ; -C -1 ; WX 722 ; N Abreveacute ; B 8 0 711 891 ; -C -1 ; WX 444 ; N abreveacute ; B 36 -9 442 891 ; -C -1 ; WX 722 ; N Abrevegrave ; B 8 0 711 891 ; -C -1 ; WX 444 ; N abrevegrave ; B 36 -9 442 891 ; -C -1 ; WX 722 ; N Abrevehookabove ; B 8 0 711 891 ; -C -1 ; WX 444 ; N abrevehookabove ; B 36 -9 442 891 ; -C -1 ; WX 722 ; N Abrevetilde ; B 8 0 711 891 ; -C -1 ; WX 444 ; N abrevetilde ; B 36 -9 442 854 ; -C -1 ; WX 722 ; N Abrevedotbelow ; B 8 -167 711 808 ; -C -1 ; WX 444 ; N abrevedotbelow ; B 36 -167 442 663 ; -C -1 ; WX 611 ; N Edotbelow ; B 21 -167 588 662 ; -C -1 ; WX 444 ; N edotbelow ; B 37 -167 416 461 ; -C -1 ; WX 611 ; N Ehookabove ; B 21 0 588 891 ; -C -1 ; WX 444 ; N ehookabove ; B 37 -14 416 674 ; -C -1 ; WX 611 ; N Etilde ; B 21 0 588 842 ; -C -1 ; WX 444 ; N etilde ; B 37 -14 416 662 ; -C -1 ; WX 611 ; N Ecircumflexacute ; B 21 0 588 891 ; -C -1 ; WX 444 ; N ecircumflexacute ; B 37 -14 416 891 ; -C -1 ; WX 611 ; N Ecircumflexgrave ; B 21 0 588 891 ; -C -1 ; WX 444 ; N ecircumflexgrave ; B 37 -14 416 891 ; -C -1 ; WX 611 ; N Ecircumflexhookabove ; B 21 0 588 891 ; -C -1 ; WX 444 ; N ecircumflexhookabove ; B 37 -14 416 891 ; -C -1 ; WX 611 ; N Ecircumflextilde ; B 21 0 588 891 ; -C -1 ; WX 444 ; N ecircumflextilde ; B 37 -14 416 854 ; -C -1 ; WX 611 ; N Ecircumflexdotbelow ; B 21 -167 588 799 ; -C -1 ; WX 444 ; N ecircumflexdotbelow ; B 37 -167 416 676 ; -C -1 ; WX 333 ; N Ihookabove ; B 25 0 309 891 ; -C -1 ; WX 278 ; N ihookabove ; B 29 0 253 674 ; -C -1 ; WX 333 ; N Idotbelow ; B 25 -167 309 662 ; -C -1 ; WX 278 ; N idotbelow ; B 29 -167 253 694 ; -C -1 ; WX 722 ; N Odotbelow ; B 35 -167 684 677 ; -C -1 ; WX 500 ; N odotbelow ; B 34 -167 465 460 ; -C -1 ; WX 722 ; N Ohookabove ; B 35 -15 684 891 ; -C -1 ; WX 500 ; N ohookabove ; B 34 -14 465 674 ; -C -1 ; WX 722 ; N Ocircumflexacute ; B 35 -15 684 891 ; -C -1 ; WX 500 ; N ocircumflexacute ; B 34 -14 465 891 ; -C -1 ; WX 722 ; N Ocircumflexgrave ; B 35 -15 684 891 ; -C -1 ; WX 500 ; N ocircumflexgrave ; B 34 -14 465 891 ; -C -1 ; WX 722 ; N Ocircumflexhookabove ; B 35 -15 684 891 ; -C -1 ; WX 500 ; N ocircumflexhookabove ; B 34 -14 465 891 ; -C -1 ; WX 722 ; N Ocircumflextilde ; B 35 -15 684 891 ; -C -1 ; WX 500 ; N ocircumflextilde ; B 34 -14 465 854 ; -C -1 ; WX 722 ; N Ocircumflexdotbelow ; B 35 -167 684 799 ; -C -1 ; WX 500 ; N ocircumflexdotbelow ; B 34 -167 465 676 ; -C -1 ; WX 722 ; N Ohornacute ; B 69 -15 717 877 ; -C -1 ; WX 529 ; N ohornacute ; B 34 -14 536 679 ; -C -1 ; WX 722 ; N Ohorngrave ; B 69 -15 717 877 ; -C -1 ; WX 529 ; N ohorngrave ; B 34 -14 536 679 ; -C -1 ; WX 722 ; N Ohornhookabove ; B 69 -15 717 891 ; -C -1 ; WX 529 ; N ohornhookabove ; B 34 -14 536 674 ; -C -1 ; WX 722 ; N Ohorntilde ; B 69 -15 717 842 ; -C -1 ; WX 529 ; N ohorntilde ; B 34 -14 536 662 ; -C -1 ; WX 722 ; N Ohorndotbelow ; B 69 -167 717 758 ; -C -1 ; WX 529 ; N ohorndotbelow ; B 34 -167 536 478 ; -C -1 ; WX 722 ; N Udotbelow ; B 5 -167 711 662 ; -C -1 ; WX 500 ; N udotbelow ; B 1 -167 499 447 ; -C -1 ; WX 722 ; N Uhookabove ; B 5 -16 711 891 ; -C -1 ; WX 500 ; N uhookabove ; B 1 -14 499 674 ; -C -1 ; WX 776 ; N Uhornacute ; B 5 -16 810 877 ; -C -1 ; WX 542 ; N uhornacute ; B 1 -14 544 679 ; -C -1 ; WX 776 ; N Uhorngrave ; B 5 -16 810 877 ; -C -1 ; WX 542 ; N uhorngrave ; B 1 -14 544 679 ; -C -1 ; WX 776 ; N Uhornhookabove ; B 5 -16 810 891 ; -C -1 ; WX 542 ; N uhornhookabove ; B 1 -14 544 674 ; -C -1 ; WX 776 ; N Uhorntilde ; B 5 -16 810 842 ; -C -1 ; WX 542 ; N uhorntilde ; B 1 -14 544 662 ; -C -1 ; WX 776 ; N Uhorndotbelow ; B 5 -167 810 774 ; -C -1 ; WX 542 ; N uhorndotbelow ; B 1 -167 544 478 ; -C -1 ; WX 722 ; N Ydotbelow ; B 9 -167 708 662 ; -C -1 ; WX 500 ; N ydotbelow ; B 6 -216 494 447 ; -C -1 ; WX 722 ; N Yhookabove ; B 9 0 708 891 ; -C -1 ; WX 500 ; N yhookabove ; B 6 -216 494 674 ; -C -1 ; WX 722 ; N Ytilde ; B 9 0 708 842 ; -C -1 ; WX 500 ; N ytilde ; B 6 -216 494 662 ; -C -1 ; WX 722 ; N uni01CD ; B 8 0 711 875 ; -C -1 ; WX 444 ; N uni01CE ; B 36 -9 442 676 ; -C -1 ; WX 333 ; N uni01CF ; B 25 0 309 875 ; -C -1 ; WX 278 ; N uni01D0 ; B 3 0 278 676 ; -C -1 ; WX 722 ; N uni01D1 ; B 35 -15 684 875 ; -C -1 ; WX 500 ; N uni01D2 ; B 34 -14 465 676 ; -C -1 ; WX 722 ; N uni01D3 ; B 5 -16 711 875 ; -C -1 ; WX 500 ; N uni01D4 ; B 1 -14 499 676 ; -C -1 ; WX 722 ; N uni01D5 ; B 5 -16 711 891 ; -C -1 ; WX 500 ; N uni01D6 ; B 1 -14 499 747 ; -C -1 ; WX 722 ; N uni01D7 ; B 5 -16 711 891 ; -C -1 ; WX 500 ; N uni01D8 ; B 1 -14 499 823 ; -C -1 ; WX 722 ; N uni01D9 ; B 5 -16 711 891 ; -C -1 ; WX 500 ; N uni01DA ; B 1 -14 499 816 ; -C -1 ; WX 722 ; N uni01DB ; B 5 -16 711 891 ; -C -1 ; WX 500 ; N uni01DC ; B 1 -14 499 823 ; -C -1 ; WX 0 ; N glyph1292 ; B -121 706 121 891 ; -C -1 ; WX 0 ; N glyph1293 ; B -121 706 121 891 ; -C -1 ; WX 0 ; N glyph1294 ; B -121 706 121 891 ; -C -1 ; WX 0 ; N glyph1295 ; B -121 706 121 891 ; -C -1 ; WX 578 ; N uni0492 ; B 17 0 552 662 ; -C -1 ; WX 410 ; N uni0493 ; B 15 0 404 447 ; -C -1 ; WX 896 ; N uni0496 ; B 9 -190 886 670 ; -C -1 ; WX 691 ; N uni0497 ; B 11 -124 680 453 ; -C -1 ; WX 667 ; N uni049A ; B 18 -190 663 670 ; -C -1 ; WX 486 ; N uni049B ; B 22 -124 480 453 ; -C -1 ; WX 667 ; N uni049C ; B 18 0 664 670 ; -C -1 ; WX 486 ; N uni049D ; B 22 0 480 453 ; -C -1 ; WX 722 ; N uni04A2 ; B 17 -190 703 662 ; -C -1 ; WX 535 ; N uni04A3 ; B 22 -124 513 447 ; -C -1 ; WX 722 ; N uni04AE ; B 9 0 708 662 ; -C -1 ; WX 500 ; N uni04AF ; B 1 -214 500 447 ; -C -1 ; WX 722 ; N uni04B0 ; B 9 0 708 662 ; -C -1 ; WX 500 ; N uni04B1 ; B 1 -214 500 447 ; -C -1 ; WX 722 ; N uni04B2 ; B 7 -190 710 662 ; -C -1 ; WX 500 ; N uni04B3 ; B 13 -124 493 447 ; -C -1 ; WX 650 ; N uni04B8 ; B -3 0 632 662 ; -C -1 ; WX 503 ; N uni04B9 ; B 15 0 481 447 ; -C -1 ; WX 650 ; N uni04BA ; B 18 0 653 662 ; -C -1 ; WX 500 ; N uni04BB ; B 6 0 494 694 ; -C -1 ; WX 722 ; N uni018F ; B 21 -15 684 677 ; -C -1 ; WX 444 ; N uni0259 ; B 37 -14 416 461 ; -C -1 ; WX 722 ; N uni04E8 ; B 35 -15 684 677 ; -C -1 ; WX 500 ; N uni04E9 ; B 34 -14 465 460 ; -C -1 ; WX 713 ; N glyph1320 ; B 28 143 713 469 ; -C -1 ; WX 244 ; N glyph1321 ; B -34 143 244 456 ; -C -1 ; WX 268 ; N glyph1322 ; B -34 143 268 544 ; -C -1 ; WX 263 ; N glyph1323 ; B -34 143 263 494 ; -C -1 ; WX 582 ; N glyph1324 ; B 34 -75 582 445 ; -C -1 ; WX 244 ; N glyph1325 ; B 77 -46 194 66 ; -C -1 ; WX 244 ; N glyph1326 ; B 8 -88 236 68 ; -C -1 ; WX 244 ; N glyph1327 ; B 13 -175 242 68 ; -C -1 ; WX 244 ; N glyph1328 ; B 8 -175 236 68 ; -C -1 ; WX 244 ; N glyph1329 ; B 52 -166 191 68 ; -C -1 ; WX 244 ; N glyph1330 ; B -3 -210 248 68 ; -C -1 ; WX 269 ; N glyph1331 ; B -24 519 269 828 ; -C -1 ; WX 207 ; N glyph1332 ; B 7 732 210 891 ; -C -1 ; WX 207 ; N glyph1333 ; B -5 746 179 890 ; -C -1 ; WX 333 ; N glyph1334 ; B 80 605 240 717 ; -C -1 ; WX 333 ; N glyph1335 ; B 80 605 240 717 ; -C -1 ; WX 207 ; N uni0653 ; B 7 692 206 747 ; -C -1 ; WX 207 ; N uni0654 ; B 42 733 179 880 ; -C -1 ; WX 207 ; N uni0655 ; B 42 -79 179 68 ; -C -1 ; WX 0 ; N uni0670 ; B -24 519 24 809 ; -C -1 ; WX 207 ; N uni0671 ; B 7 130 210 891 ; -C -1 ; WX 229 ; N uniFB51 ; B -32 143 229 891 ; -C -1 ; WX 207 ; N uni0672 ; B -5 130 179 890 ; -C -1 ; WX 229 ; N glyph1343 ; B -25 143 229 890 ; -C -1 ; WX 207 ; N uni0673 ; B 14 -84 198 740 ; -C -1 ; WX 229 ; N glyph1345 ; B -5 -84 229 740 ; -C -1 ; WX 207 ; N uni0675 ; B 72 130 296 740 ; -C -1 ; WX 229 ; N glyph47 ; B 9 143 276 740 ; -C -1 ; WX 432 ; N uni0676 ; B 24 -77 511 597 ; -C -1 ; WX 432 ; N glyph1349 ; B 24 -77 511 597 ; -C -1 ; WX 432 ; N uni0677 ; B 24 -77 511 616 ; -C -1 ; WX 432 ; N glyph1351 ; B 24 -77 511 616 ; -C -1 ; WX 638 ; N uni0678 ; B 24 -43 667 685 ; -C -1 ; WX 588 ; N glyph ; B 18 -110 588 440 ; -C -1 ; WX 713 ; N uni0679 ; B 28 143 713 828 ; -C -1 ; WX 713 ; N uniFB67 ; B 28 143 713 828 ; -C -1 ; WX 244 ; N uniFB68 ; B -34 143 269 828 ; -C -1 ; WX 244 ; N uniFB69 ; B -34 143 269 828 ; -C -1 ; WX 713 ; N uni067A ; B 28 143 713 752 ; -C -1 ; WX 713 ; N uniFB5F ; B 28 143 713 752 ; -C -1 ; WX 244 ; N uniFB60 ; B -34 143 244 752 ; -C -1 ; WX 244 ; N uniFB61 ; B -34 143 244 752 ; -C -1 ; WX 713 ; N uni067B ; B 28 -166 713 469 ; -C -1 ; WX 713 ; N uniFB53 ; B 28 -166 713 469 ; -C -1 ; WX 244 ; N uniFB54 ; B -34 -166 244 456 ; -C -1 ; WX 244 ; N uniFB55 ; B -34 -166 244 456 ; -C -1 ; WX 713 ; N uni067C ; B 28 31 713 628 ; -C -1 ; WX 713 ; N glyph1367 ; B 28 31 713 628 ; -C -1 ; WX 244 ; N glyph1368 ; B -34 31 244 667 ; -C -1 ; WX 244 ; N glyph1369 ; B -34 31 244 667 ; -C -1 ; WX 713 ; N uni067D ; B 28 143 713 752 ; -C -1 ; WX 713 ; N glyph1371 ; B 28 143 713 752 ; -C -1 ; WX 244 ; N glyph1372 ; B -34 143 244 752 ; -C -1 ; WX 244 ; N glyph1373 ; B -34 143 244 752 ; -C -1 ; WX 713 ; N uni067F ; B 28 143 713 752 ; -C -1 ; WX 713 ; N uniFB63 ; B 28 143 713 752 ; -C -1 ; WX 244 ; N uniFB64 ; B -34 143 244 752 ; -C -1 ; WX 244 ; N uniFB65 ; B -34 143 244 752 ; -C -1 ; WX 713 ; N uni0680 ; B 28 -210 713 469 ; -C -1 ; WX 713 ; N uniFB5B ; B 28 -210 713 469 ; -C -1 ; WX 244 ; N uniFB5C ; B -34 -210 248 456 ; -C -1 ; WX 244 ; N uniFB5D ; B -34 -210 248 456 ; -C -1 ; WX 563 ; N uni0681 ; B 26 -212 516 685 ; -C -1 ; WX 526 ; N glyph1383 ; B 26 -212 526 685 ; -C -1 ; WX 530 ; N glyph1384 ; B -34 143 530 685 ; -C -1 ; WX 530 ; N glyph1385 ; B -34 143 530 685 ; -C -1 ; WX 563 ; N uni0682 ; B 26 -212 516 752 ; -C -1 ; WX 526 ; N glyph1387 ; B 26 -212 526 752 ; -C -1 ; WX 530 ; N glyph1388 ; B -34 143 530 752 ; -C -1 ; WX 530 ; N glyph1389 ; B -34 143 530 752 ; -C -1 ; WX 563 ; N uni0683 ; B 26 -212 516 432 ; -C -1 ; WX 526 ; N uniFB77 ; B 26 -212 526 426 ; -C -1 ; WX 530 ; N uniFB78 ; B -34 -88 530 427 ; -C -1 ; WX 530 ; N uniFB79 ; B -34 -88 530 427 ; -C -1 ; WX 563 ; N uni0684 ; B 26 -212 516 432 ; -C -1 ; WX 526 ; N uniFB73 ; B 26 -212 526 426 ; -C -1 ; WX 530 ; N uniFB74 ; B -34 -166 530 427 ; -C -1 ; WX 530 ; N uniFB75 ; B -34 -166 530 427 ; -C -1 ; WX 563 ; N uni0685 ; B 26 -212 516 752 ; -C -1 ; WX 526 ; N glyph1399 ; B 26 -212 526 752 ; -C -1 ; WX 530 ; N glyph1400 ; B -34 143 530 752 ; -C -1 ; WX 530 ; N glyph1401 ; B -34 143 530 752 ; -C -1 ; WX 563 ; N uni0687 ; B 26 -212 516 432 ; -C -1 ; WX 526 ; N uniFB7f ; B 26 -212 526 426 ; -C -1 ; WX 530 ; N uniFB80 ; B -34 -210 530 427 ; -C -1 ; WX 530 ; N uniFB81 ; B -34 -210 530 427 ; -C -1 ; WX 337 ; N uni0688 ; B 24 143 337 891 ; -C -1 ; WX 337 ; N uniFB89 ; B 24 143 337 891 ; -C -1 ; WX 337 ; N uni0689 ; B 46 31 337 552 ; -C -1 ; WX 337 ; N glyph1409 ; B 46 31 337 552 ; -C -1 ; WX 337 ; N uni068A ; B 46 -46 337 552 ; -C -1 ; WX 337 ; N glyph1411 ; B 46 -46 337 552 ; -C -1 ; WX 337 ; N uni068B ; B 24 -46 337 891 ; -C -1 ; WX 337 ; N glyph1413 ; B 24 -46 337 891 ; -C -1 ; WX 337 ; N uni068C ; B 46 143 337 752 ; -C -1 ; WX 337 ; N uniFB85 ; B 46 143 337 752 ; -C -1 ; WX 337 ; N uni068D ; B 46 -88 337 552 ; -C -1 ; WX 337 ; N uniFB83 ; B 46 -88 337 552 ; -C -1 ; WX 337 ; N uni068E ; B 46 143 337 850 ; -C -1 ; WX 337 ; N uniFB87 ; B 46 143 337 850 ; -C -1 ; WX 337 ; N uni068F ; B 27 143 337 850 ; -C -1 ; WX 337 ; N glyph1421 ; B 27 143 337 850 ; -C -1 ; WX 337 ; N uni0690 ; B 36 143 337 850 ; -C -1 ; WX 337 ; N glyph1423 ; B 36 143 337 850 ; -C -1 ; WX 489 ; N uni0691 ; B 36 -91 489 828 ; -C -1 ; WX 489 ; N uniFB8D ; B 36 -91 489 828 ; -C -1 ; WX 489 ; N uni0692 ; B 36 -91 489 634 ; -C -1 ; WX 489 ; N glyph1426 ; B 36 -91 489 634 ; -C -1 ; WX 489 ; N uni0693 ; B 36 -127 489 430 ; -C -1 ; WX 489 ; N glyph1429 ; B 36 -127 489 430 ; -C -1 ; WX 489 ; N uni0694 ; B 36 -144 507 430 ; -C -1 ; WX 489 ; N glyph1431 ; B 36 -144 507 430 ; -C -1 ; WX 489 ; N uni0695 ; B 36 -196 489 430 ; -C -1 ; WX 489 ; N glyph1433 ; B 36 -196 489 430 ; -C -1 ; WX 489 ; N uni0696 ; B 36 -144 507 430 ; -C -1 ; WX 489 ; N glyph1435 ; B 36 -144 507 430 ; -C -1 ; WX 489 ; N uni0697 ; B 36 -91 489 636 ; -C -1 ; WX 489 ; N glyph1437 ; B 36 -91 489 636 ; -C -1 ; WX 489 ; N uni0699 ; B 36 -91 489 758 ; -C -1 ; WX 489 ; N glyph1439 ; B 36 -91 489 758 ; -C -1 ; WX 821 ; N uni069A ; B 30 -72 821 593 ; -C -1 ; WX 821 ; N glyph1441 ; B 30 -72 821 593 ; -C -1 ; WX 531 ; N glyph1442 ; B -34 -46 531 593 ; -C -1 ; WX 531 ; N glyph1443 ; B -34 -46 531 593 ; -C -1 ; WX 821 ; N uni069B ; B 30 -175 822 417 ; -C -1 ; WX 821 ; N glyph1445 ; B 30 -175 822 417 ; -C -1 ; WX 531 ; N glyph1446 ; B -34 -175 531 401 ; -C -1 ; WX 531 ; N glyph1447 ; B -34 -175 531 401 ; -C -1 ; WX 821 ; N uni069C ; B 30 -175 822 723 ; -C -1 ; WX 821 ; N glyph1449 ; B 30 -175 822 723 ; -C -1 ; WX 531 ; N glyph1450 ; B -34 -175 531 723 ; -C -1 ; WX 531 ; N glyph1451 ; B -34 -175 531 723 ; -C -1 ; WX 1098 ; N uni069D ; B 30 -88 1098 417 ; -C -1 ; WX 1098 ; N glyph1453 ; B 30 -88 1098 417 ; -C -1 ; WX 846 ; N glyph1454 ; B -34 -88 846 405 ; -C -1 ; WX 846 ; N glyph1455 ; B -34 -88 846 405 ; -C -1 ; WX 1098 ; N uni069E ; B 30 -72 1098 723 ; -C -1 ; WX 1098 ; N glyph1457 ; B 30 -72 1098 723 ; -C -1 ; WX 846 ; N glyph1458 ; B -34 143 846 723 ; -C -1 ; WX 846 ; N glyph1459 ; B -34 143 846 723 ; -C -1 ; WX 582 ; N uni069F ; B -34 143 582 793 ; -C -1 ; WX 582 ; N glyph1461 ; B -34 143 582 793 ; -C -1 ; WX 544 ; N uni06A0 ; B 21 -212 516 850 ; -C -1 ; WX 450 ; N glyph1463 ; B 26 -212 486 723 ; -C -1 ; WX 526 ; N glyph1464 ; B -34 143 470 771 ; -C -1 ; WX 394 ; N glyph1465 ; B -34 143 394 723 ; -C -1 ; WX 789 ; N uni06A1 ; B 19 143 789 478 ; -C -1 ; WX 789 ; N uni06A2 ; B 19 -46 789 478 ; -C -1 ; WX 789 ; N glyph1468 ; B 19 -46 789 478 ; -C -1 ; WX 268 ; N glyph1469 ; B -34 -46 268 544 ; -C -1 ; WX 263 ; N glyph1470 ; B -34 -46 263 494 ; -C -1 ; WX 789 ; N uni06A3 ; B 19 -46 789 642 ; -C -1 ; WX 789 ; N glyph1472 ; B 19 -46 789 642 ; -C -1 ; WX 268 ; N glyph1473 ; B -34 -46 268 691 ; -C -1 ; WX 263 ; N glyph1474 ; B -34 -46 263 691 ; -C -1 ; WX 789 ; N uni06A4 ; B 19 143 789 771 ; -C -1 ; WX 789 ; N uniFB6B ; B 19 143 789 771 ; -C -1 ; WX 268 ; N uniFB6C ; B -34 143 268 820 ; -C -1 ; WX 263 ; N uniFB6D ; B -34 143 263 820 ; -C -1 ; WX 789 ; N uni06A5 ; B 19 -175 822 478 ; -C -1 ; WX 789 ; N glyph1480 ; B 19 -175 822 478 ; -C -1 ; WX 268 ; N glyph1481 ; B -34 -175 268 544 ; -C -1 ; WX 263 ; N glyph1482 ; B -34 -175 263 494 ; -C -1 ; WX 789 ; N uni06A6 ; B 19 143 789 801 ; -C -1 ; WX 789 ; N uniFB6F ; B 19 143 789 801 ; -C -1 ; WX 268 ; N uniFB70 ; B -34 143 268 840 ; -C -1 ; WX 263 ; N uniFB71 ; B -34 143 263 840 ; -C -1 ; WX 582 ; N uni06A7 ; B 34 -75 582 627 ; -C -1 ; WX 582 ; N glyph1488 ; B 34 -75 582 627 ; -C -1 ; WX 582 ; N uni06A8 ; B 34 -75 582 723 ; -C -1 ; WX 582 ; N glyph1490 ; B 34 -75 582 723 ; -C -1 ; WX 812 ; N uni06AA ; B 10 143 812 673 ; -C -1 ; WX 933 ; N glyph1492 ; B 10 143 933 673 ; -C -1 ; WX 394 ; N glyph1493 ; B -34 143 394 613 ; -C -1 ; WX 515 ; N glyph1494 ; B -34 143 515 613 ; -C -1 ; WX 812 ; N uni06AB ; B 10 143 812 734 ; -C -1 ; WX 933 ; N glyph1496 ; B 10 143 933 734 ; -C -1 ; WX 394 ; N glyph1497 ; B -34 143 394 734 ; -C -1 ; WX 515 ; N glyph1498 ; B -34 143 515 734 ; -C -1 ; WX 601 ; N uni06AC ; B 22 143 601 775 ; -C -1 ; WX 601 ; N glyph1500 ; B 22 143 601 775 ; -C -1 ; WX 394 ; N glyph1501 ; B -34 143 394 843 ; -C -1 ; WX 394 ; N glyph1502 ; B -34 143 394 843 ; -C -1 ; WX 601 ; N uni06AD ; B 22 143 601 879 ; -C -1 ; WX 601 ; N uniFBD4 ; B 22 143 601 879 ; -C -1 ; WX 394 ; N uniFBD5 ; B -34 143 394 852 ; -C -1 ; WX 394 ; N uniFBD6 ; B -34 143 394 852 ; -C -1 ; WX 601 ; N uni06AE ; B 22 -175 601 775 ; -C -1 ; WX 601 ; N glyph1508 ; B 22 -175 601 775 ; -C -1 ; WX 394 ; N glyph1509 ; B -34 -175 394 734 ; -C -1 ; WX 394 ; N glyph1510 ; B -34 -175 394 734 ; -C -1 ; WX 812 ; N uni06B0 ; B 10 143 812 867 ; -C -1 ; WX 933 ; N glyph1512 ; B 10 143 933 867 ; -C -1 ; WX 394 ; N glyph1513 ; B -34 143 394 876 ; -C -1 ; WX 515 ; N glyph1514 ; B -34 143 515 876 ; -C -1 ; WX 812 ; N uni06B1 ; B 10 143 812 891 ; -C -1 ; WX 933 ; N uniFB9B ; B 10 143 933 891 ; -C -1 ; WX 394 ; N uniFB9C ; B -34 143 394 891 ; -C -1 ; WX 515 ; N uniFB9D ; B -34 143 515 891 ; -C -1 ; WX 812 ; N uni06B2 ; B 10 -88 812 867 ; -C -1 ; WX 933 ; N glyph1520 ; B 10 -88 933 867 ; -C -1 ; WX 394 ; N glyph1521 ; B -34 -88 394 876 ; -C -1 ; WX 515 ; N glyph1522 ; B -34 -88 515 876 ; -C -1 ; WX 812 ; N uni06B3 ; B 10 -166 812 867 ; -C -1 ; WX 933 ; N uniFB97 ; B 10 -166 933 867 ; -C -1 ; WX 394 ; N uniFB98 ; B -34 -166 394 876 ; -C -1 ; WX 515 ; N uniFB99 ; B -34 -166 515 876 ; -C -1 ; WX 812 ; N uni06B4 ; B 10 143 812 891 ; -C -1 ; WX 933 ; N glyph1528 ; B 10 143 933 891 ; -C -1 ; WX 394 ; N glyph1529 ; B -34 143 394 891 ; -C -1 ; WX 515 ; N glyph1530 ; B -34 143 515 891 ; -C -1 ; WX 506 ; N uni06B5 ; B 35 7 506 891 ; -C -1 ; WX 506 ; N glyph1532 ; B 35 7 506 891 ; -C -1 ; WX 207 ; N glyph1533 ; B -34 143 207 891 ; -C -1 ; WX 207 ; N glyph1534 ; B -34 143 207 891 ; -C -1 ; WX 506 ; N uni06B6 ; B 35 7 506 891 ; -C -1 ; WX 506 ; N glyph1536 ; B 35 7 506 891 ; -C -1 ; WX 207 ; N glyph1537 ; B -34 143 207 891 ; -C -1 ; WX 207 ; N glyph1538 ; B -34 143 207 891 ; -C -1 ; WX 506 ; N uni06B7 ; B 35 7 506 891 ; -C -1 ; WX 506 ; N glyph1540 ; B 35 7 506 891 ; -C -1 ; WX 207 ; N glyph1541 ; B -34 143 207 891 ; -C -1 ; WX 207 ; N glyph1542 ; B -34 143 207 891 ; -C -1 ; WX 506 ; N uni06B8 ; B 35 -205 506 775 ; -C -1 ; WX 506 ; N glyph1544 ; B 35 -205 506 775 ; -C -1 ; WX 207 ; N glyph1545 ; B -34 -175 217 775 ; -C -1 ; WX 207 ; N glyph1546 ; B -34 -175 217 775 ; -C -1 ; WX 526 ; N uni06B9 ; B 34 -210 526 558 ; -C -1 ; WX 526 ; N glyph1548 ; B 34 -210 526 558 ; -C -1 ; WX 244 ; N glyph1549 ; B -34 -46 244 636 ; -C -1 ; WX 244 ; N glyph1550 ; B -34 -46 244 636 ; -C -1 ; WX 526 ; N uni06BA ; B 34 -72 526 417 ; -C -1 ; WX 526 ; N uniFB9F ; B 34 -72 526 417 ; -C -1 ; WX 526 ; N uni06BB ; B 34 -72 526 789 ; -C -1 ; WX 526 ; N uniFBA1 ; B 34 -72 526 789 ; -C -1 ; WX 526 ; N uni06BC ; B 34 -184 526 558 ; -C -1 ; WX 526 ; N glyph1556 ; B 34 -184 526 558 ; -C -1 ; WX 244 ; N glyph1557 ; B -34 31 244 636 ; -C -1 ; WX 244 ; N glyph1558 ; B -34 31 244 636 ; -C -1 ; WX 526 ; N uni06BD ; B 34 -72 526 723 ; -C -1 ; WX 526 ; N glyph1560 ; B 34 -72 526 723 ; -C -1 ; WX 563 ; N uni06BF ; B 26 -212 516 639 ; -C -1 ; WX 526 ; N glyph1562 ; B 26 -212 526 639 ; -C -1 ; WX 530 ; N glyph1563 ; B -34 -175 530 639 ; -C -1 ; WX 530 ; N glyph1564 ; B -34 -175 530 639 ; -C -1 ; WX 282 ; N uni06C0 ; B 26 130 262 636 ; -C -1 ; WX 375 ; N uniFBA5 ; B -4 143 375 733 ; -C -1 ; WX 388 ; N uni06C1 ; B 13 71 388 328 ; -C -1 ; WX 388 ; N uni06C2 ; B 13 71 388 538 ; -C -1 ; WX 388 ; N uni06C3 ; B 13 71 388 557 ; -C -1 ; WX 432 ; N uni06C4 ; B 24 -77 432 385 ; -C -1 ; WX 432 ; N glyph1571 ; B 24 -77 432 385 ; -C -1 ; WX 432 ; N uni06C5 ; B 24 -77 432 385 ; -C -1 ; WX 432 ; N uniFBE1 ; B 24 -77 432 385 ; -C -1 ; WX 432 ; N uni06C6 ; B 24 -77 436 585 ; -C -1 ; WX 432 ; N uniFBDA ; B 24 -77 436 585 ; -C -1 ; WX 432 ; N uni06C7 ; B 24 -77 432 665 ; -C -1 ; WX 432 ; N uniFBD8 ; B 24 -77 432 665 ; -C -1 ; WX 432 ; N uni06C8 ; B 24 -77 432 741 ; -C -1 ; WX 432 ; N uniFBDC ; B 24 -77 432 741 ; -C -1 ; WX 432 ; N uni06C9 ; B 24 -77 436 585 ; -C -1 ; WX 432 ; N uniFBE3 ; B 24 -77 436 585 ; -C -1 ; WX 432 ; N uni06CA ; B 24 -77 432 623 ; -C -1 ; WX 432 ; N glyph1583 ; B 24 -77 432 623 ; -C -1 ; WX 432 ; N uni06CB ; B 24 -77 437 710 ; -C -1 ; WX 432 ; N uniFBDF ; B 24 -77 437 710 ; -C -1 ; WX 638 ; N uni06CD ; B -34 -43 606 462 ; -C -1 ; WX 588 ; N glyph1587 ; B -34 -110 588 252 ; -C -1 ; WX 638 ; N uni06CE ; B 24 -43 606 522 ; -C -1 ; WX 588 ; N glyph1589 ; B 18 -110 588 424 ; -C -1 ; WX 244 ; N glyph1590 ; B -34 -69 244 620 ; -C -1 ; WX 244 ; N glyph1591 ; B -34 -69 244 620 ; -C -1 ; WX 432 ; N uni06CF ; B 24 -77 432 586 ; -C -1 ; WX 432 ; N glyph1593 ; B 24 -77 432 586 ; -C -1 ; WX 638 ; N uni06D0 ; B 24 -182 606 462 ; -C -1 ; WX 588 ; N uniFBE5 ; B 18 -212 588 252 ; -C -1 ; WX 244 ; N uniFBE6 ; B -34 -166 244 456 ; -C -1 ; WX 244 ; N uniFBE7 ; B -34 -166 244 456 ; -C -1 ; WX 638 ; N uni06D1 ; B 24 -168 606 462 ; -C -1 ; WX 588 ; N glyph1599 ; B 18 -212 588 252 ; -C -1 ; WX 812 ; N uni06D2 ; B 34 -25 812 373 ; -C -1 ; WX 812 ; N uniFBAF ; B 34 -208 812 228 ; -C -1 ; WX 812 ; N uni06D3 ; B 34 -25 812 489 ; -C -1 ; WX 812 ; N uniFBB1 ; B 34 -208 812 450 ; -C -1 ; WX 207 ; N uni06D4 ; B 20 143 188 228 ; -C -1 ; WX 0 ; N uni06D6 ; B -230 519 231 886 ; -C -1 ; WX 0 ; N uni06D7 ; B -171 519 194 886 ; -C -1 ; WX 0 ; N uni06D8 ; B -102 519 102 646 ; -C -1 ; WX 0 ; N uni06D9 ; B -111 519 111 826 ; -C -1 ; WX 0 ; N uni06DA ; B -116 519 116 825 ; -C -1 ; WX 0 ; N uni06DB ; B -54 519 54 634 ; -C -1 ; WX 0 ; N uni06DC ; B -188 519 188 752 ; -C -1 ; WX 1123 ; N uni06DD ; B 24 -188 1099 886 ; -C -1 ; WX 1084 ; N uni06DE ; B 24 -152 1060 884 ; -C -1 ; WX 0 ; N uni06DF ; B -37 519 37 592 ; -C -1 ; WX 0 ; N uni06E0 ; B -36 519 36 591 ; -C -1 ; WX 0 ; N uni06E1 ; B -134 519 134 654 ; -C -1 ; WX 0 ; N uni06E2 ; B -76 519 77 790 ; -C -1 ; WX 0 ; N uni06E3 ; B -188 -179 188 54 ; -C -1 ; WX 0 ; N uni06E4 ; B -47 519 47 545 ; -C -1 ; WX 194 ; N uni06E5 ; B 0 519 194 738 ; -C -1 ; WX 370 ; N uni06E6 ; B -1 519 370 708 ; -C -1 ; WX 0 ; N uni06E7 ; B -187 519 185 708 ; -C -1 ; WX 0 ; N uni06E8 ; B -117 519 117 819 ; -C -1 ; WX 600 ; N uni06E9 ; B 24 0 576 818 ; -C -1 ; WX 0 ; N uni06EA ; B -82 -165 82 -1 ; -C -1 ; WX 0 ; N uni06EB ; B -82 519 82 683 ; -C -1 ; WX 0 ; N uni06ED ; B -76 -179 77 92 ; -C -1 ; WX 821 ; N uni06FA ; B 30 -72 821 723 ; -C -1 ; WX 821 ; N glyph1629 ; B 30 -72 821 723 ; -C -1 ; WX 531 ; N glyph1630 ; B -34 -46 531 723 ; -C -1 ; WX 531 ; N glyph1631 ; B -34 -46 531 723 ; -C -1 ; WX 1098 ; N uni06FB ; B 30 -72 1098 590 ; -C -1 ; WX 1098 ; N glyph1633 ; B 30 -72 1098 590 ; -C -1 ; WX 846 ; N glyph1634 ; B -34 -46 846 590 ; -C -1 ; WX 846 ; N glyph1635 ; B -34 -46 846 590 ; -C -1 ; WX 544 ; N uni06FC ; B 21 -212 516 737 ; -C -1 ; WX 450 ; N glyph1637 ; B 26 -212 486 639 ; -C -1 ; WX 526 ; N glyph1638 ; B -34 -46 470 639 ; -C -1 ; WX 394 ; N glyph1639 ; B -34 -46 394 639 ; -C -1 ; WX 413 ; N uni06FD ; B 59 -145 363 400 ; -C -1 ; WX 338 ; N uni06FE ; B 17 -212 338 357 ; -C -1 ; WX 282 ; N uniFBA6 ; B 26 130 262 430 ; -C -1 ; WX 244 ; N uniFBA8 ; B -34 -132 244 456 ; -C -1 ; WX 320 ; N uniFBA9 ; B -34 -205 320 365 ; -C -1 ; WX 244 ; N glyph1645 ; B 23 -68 222 49 ; -C -1 ; WX 244 ; N glyph1646 ; B 29 -151 226 -20 ; -C -1 ; WX 244 ; N glyph1647 ; B 9 -136 236 59 ; -C -1 ; WX 244 ; N glyph1648 ; B 86 -64 162 34 ; -C -1 ; WX 244 ; N glyph1649 ; B 53 -70 197 27 ; -C -1 ; WX 812 ; N glyph1650 ; B 10 143 812 852 ; -C -1 ; WX 933 ; N glyph1651 ; B 10 143 933 852 ; -C -1 ; WX 267 ; N uniFB1D ; B 33 79 223 554 ; -C -1 ; WX 0 ; N uniFB1E ; B -137 596 142 732 ; -C -1 ; WX 342 ; N glyph1654 ; B 0 140 342 191 ; -C -1 ; WX 533 ; N uniFB1F ; B 33 140 490 554 ; -C -1 ; WX 544 ; N glyph1656 ; B -5 79 507 890 ; -C -1 ; WX 601 ; N glyph1657 ; B -5 118 601 890 ; -C -1 ; WX 544 ; N glyph1658 ; B 41 -107 507 724 ; -C -1 ; WX 601 ; N glyph1659 ; B 32 -107 601 733 ; -C -1 ; WX 544 ; N glyph1660 ; B 41 79 507 782 ; -C -1 ; WX 601 ; N glyph1661 ; B 32 118 601 782 ; -C -1 ; WX 544 ; N glyph1662 ; B 41 79 514 891 ; -C -1 ; WX 601 ; N glyph1663 ; B 32 118 601 891 ; -C -1 ; WX 544 ; N glyph1664 ; B 41 79 507 891 ; -C -1 ; WX 601 ; N glyph1665 ; B 32 118 601 891 ; -C -1 ; WX 544 ; N glyph1666 ; B 41 79 507 891 ; -C -1 ; WX 601 ; N glyph1667 ; B 32 118 601 891 ; -C -1 ; WX 544 ; N glyph1668 ; B 41 -159 507 724 ; -C -1 ; WX 601 ; N glyph1669 ; B 32 -159 601 733 ; -C -1 ; WX 526 ; N glyph1670 ; B 55 143 485 713 ; -C -1 ; WX 526 ; N glyph1671 ; B 84 107 461 713 ; -C -1 ; WX 544 ; N glyph1672 ; B 7 79 507 891 ; -C -1 ; WX 601 ; N glyph1673 ; B 7 118 601 891 ; -EndCharMetrics -StartKernData -StartKernPairs 867 -KPX space A -55 -KPX space T -18 -KPX space V -18 -KPX space W -18 -KPX space Y -37 -KPX space Alphatonos -55 -KPX space Alpha -55 -KPX space Delta -55 -KPX space Lambda -55 -KPX space Tau -18 -KPX space Upsilon -37 -KPX space Upsilondieresis -37 -KPX one one -37 -KPX A space -55 -KPX A T -111 -KPX A V -129 -KPX A W -80 -KPX A Y -92 -KPX A v -74 -KPX A w -92 -KPX A y -92 -KPX A quoteright -111 -KPX F comma -80 -KPX F period -80 -KPX F A -74 -KPX L space -37 -KPX L T -92 -KPX L V -92 -KPX L W -74 -KPX L Y -100 -KPX L y -55 -KPX L quoteright -92 -KPX P space -37 -KPX P comma -111 -KPX P period -111 -KPX P A -92 -KPX R T -60 -KPX R V -80 -KPX R W -55 -KPX R Y -55 -KPX R y -40 -KPX T space -18 -KPX T comma -74 -KPX T hyphen -92 -KPX T period -74 -KPX T colon -50 -KPX T semicolon -55 -KPX T A -80 -KPX T O -18 -KPX T a -70 -KPX T c -70 -KPX T e -70 -KPX T i -35 -KPX T o -70 -KPX T r -35 -KPX T s -70 -KPX T u -35 -KPX T w -70 -KPX T y -70 -KPX V space -18 -KPX V comma -129 -KPX V hyphen -92 -KPX V period -129 -KPX V colon -74 -KPX V semicolon -74 -KPX V A -129 -KPX V a -111 -KPX V e -111 -KPX V i -60 -KPX V o -129 -KPX V r -60 -KPX V u -60 -KPX V y -111 -KPX W space -18 -KPX W comma -92 -KPX W hyphen -55 -KPX W period -92 -KPX W colon -37 -KPX W semicolon -37 -KPX W A -111 -KPX W a -80 -KPX W e -80 -KPX W i -40 -KPX W o -80 -KPX W r -40 -KPX W u -40 -KPX W y -60 -KPX Y space -37 -KPX Y comma -129 -KPX Y hyphen -111 -KPX Y period -129 -KPX Y colon -92 -KPX Y semicolon -92 -KPX Y A -111 -KPX Y a -100 -KPX Y e -100 -KPX Y i -55 -KPX Y o -100 -KPX Y p -92 -KPX Y q -111 -KPX Y u -111 -KPX Y v -100 -KPX f f -18 -KPX f quoteright 55 -KPX r comma -40 -KPX r hyphen -20 -KPX r period -55 -KPX r g -18 -KPX r quoteright 37 -KPX v comma -65 -KPX v period -65 -KPX w comma -65 -KPX w period -65 -KPX y comma -65 -KPX y period -65 -KPX quoteleft quoteleft -74 -KPX quoteright space -74 -KPX quoteright s -55 -KPX quoteright t -18 -KPX quoteright quoteright -74 -KPX quotesinglbase afii10051 -100 -KPX quotesinglbase afii10060 -100 -KPX quotesinglbase afii10036 -100 -KPX quotesinglbase afii10041 -188 -KPX quotesinglbase afii10044 -100 -KPX quotedblbase afii10051 -100 -KPX quotedblbase afii10060 -100 -KPX quotedblbase afii10036 -100 -KPX quotedblbase afii10041 -188 -KPX quotedblbase afii10044 -100 -KPX Gamma comma -120 -KPX Gamma period -120 -KPX Gamma iotadieresistonos 37 -KPX Gamma Alpha -155 -KPX Gamma Delta -118 -KPX Gamma Lambda -155 -KPX Gamma iota -35 -KPX Theta Alpha -48 -KPX Theta Delta -25 -KPX Theta Lambda -48 -KPX Theta Upsilon -50 -KPX Theta Upsilondieresis -50 -KPX Phi Alpha -48 -KPX Phi Upsilon -75 -KPX Phi Upsilondieresis -75 -KPX Alphatonos space -55 -KPX Alphatonos Theta -41 -KPX Alphatonos Phi -41 -KPX Alphatonos Omicron -41 -KPX Alphatonos Tau -110 -KPX Alphatonos Upsilon -152 -KPX Alphatonos Upsilondieresis -152 -KPX Alphatonos gamma -69 -KPX Alphatonos nu -74 -KPX Alphatonos chi -69 -KPX Omicrontonos Alpha -48 -KPX Omicrontonos Delta -25 -KPX Omicrontonos Lambda -48 -KPX Omicrontonos Upsilon -50 -KPX Omicrontonos Upsilondieresis -50 -KPX Upsilontonos Theta -89 -KPX Upsilontonos Phi -114 -KPX Upsilontonos alpha -100 -KPX Upsilontonos delta -83 -KPX Upsilontonos sigma -112 -KPX Upsilontonos phi -100 -KPX Upsilontonos Alpha -164 -KPX Upsilontonos Delta -125 -KPX Upsilontonos Lambda -164 -KPX Upsilontonos Omicron -89 -KPX Upsilontonos Omega -89 -KPX Upsilontonos alphatonos -100 -KPX Upsilontonos etatonos -55 -KPX Upsilontonos iotatonos -55 -KPX Upsilontonos eta -55 -KPX Upsilontonos iota -55 -KPX Upsilontonos kappa -79 -KPX Upsilontonos mu -79 -KPX Upsilontonos omicron -100 -KPX Upsilontonos iotadieresis -55 -KPX Upsilontonos omicrontonos -100 -KPX Omegatonos Upsilon -50 -KPX Alpha space -55 -KPX Alpha quoteright -110 -KPX Alpha Theta -41 -KPX Alpha Phi -41 -KPX Alpha Omicron -41 -KPX Alpha Tau -110 -KPX Alpha Upsilon -152 -KPX Alpha Upsilondieresis -152 -KPX Alpha gamma -69 -KPX Alpha nu -74 -KPX Alpha chi -69 -KPX Delta space -55 -KPX Delta Omicron -18 -KPX Delta Tau -69 -KPX Delta Upsilon -93 -KPX Delta Upsilondieresis -93 -KPX Kappa Theta -69 -KPX Kappa Phi -69 -KPX Kappa alpha -37 -KPX Kappa delta -37 -KPX Kappa sigma -37 -KPX Kappa phi -37 -KPX Kappa Omicron -69 -KPX Kappa Tau -44 -KPX Kappa alphatonos -37 -KPX Kappa zeta -37 -KPX Kappa theta -37 -KPX Kappa xi -37 -KPX Kappa omega -37 -KPX Kappa omegatonos -37 -KPX Lambda space -26 -KPX Lambda Theta -41 -KPX Lambda Omicron -41 -KPX Lambda Tau -110 -KPX Lambda Upsilon -152 -KPX Lambda Upsilondieresis -152 -KPX Omicron Alpha -48 -KPX Omicron Delta -25 -KPX Omicron Lambda -48 -KPX Omicron Upsilon -50 -KPX Omicron Upsilondieresis -50 -KPX Rho comma -110 -KPX Rho period -110 -KPX Rho Alpha -91 -KPX Rho Delta -78 -KPX Rho Lambda -91 -KPX Sigma tau -18 -KPX Tau space -18 -KPX Tau comma -74 -KPX Tau hyphen -91 -KPX Tau period -74 -KPX Tau colon -49 -KPX Tau semicolon -49 -KPX Tau Theta -18 -KPX Tau Phi -18 -KPX Tau alpha -69 -KPX Tau delta -69 -KPX Tau epsilon -69 -KPX Tau sigma -69 -KPX Tau phi -69 -KPX Tau iotadieresistonos 37 -KPX Tau Alpha -80 -KPX Tau Delta -84 -KPX Tau Lambda -108 -KPX Tau Omicron -18 -KPX Tau Omega -18 -KPX Tau alphatonos -69 -KPX Tau epsilontonos -69 -KPX Tau gamma -50 -KPX Tau eta -37 -KPX Tau iota -35 -KPX Tau mu -37 -KPX Tau nu -35 -KPX Tau omicron -69 -KPX Tau chi -35 -KPX Tau psi -37 -KPX Tau upsilondieresis -37 -KPX Tau omicrontonos -69 -KPX Tau upsilontonos -37 -KPX Upsilon space -37 -KPX Upsilon comma -128 -KPX Upsilon hyphen -110 -KPX Upsilon period -124 -KPX Upsilon colon -91 -KPX Upsilon semicolon -91 -KPX Upsilon Theta -89 -KPX Upsilon Phi -114 -KPX Upsilon alpha -100 -KPX Upsilon delta -83 -KPX Upsilon sigma -112 -KPX Upsilon phi -100 -KPX Upsilon Alpha -164 -KPX Upsilon Delta -125 -KPX Upsilon Lambda -164 -KPX Upsilon Omicron -89 -KPX Upsilon Omega -89 -KPX Upsilon alphatonos -100 -KPX Upsilon etatonos -55 -KPX Upsilon iotatonos -55 -KPX Upsilon gamma -101 -KPX Upsilon eta -55 -KPX Upsilon iota -55 -KPX Upsilon kappa -79 -KPX Upsilon mu -79 -KPX Upsilon omicron -100 -KPX Upsilon iotadieresis -55 -KPX Upsilon omicrontonos -100 -KPX Chi omega -32 -KPX Chi omegatonos -32 -KPX Psi alpha -64 -KPX Psi delta -64 -KPX Psi sigma -64 -KPX Psi phi -64 -KPX Psi alphatonos -64 -KPX Psi theta -18 -KPX Psi omicron -64 -KPX Psi omega -64 -KPX Psi omicrontonos -64 -KPX Psi omegatonos -64 -KPX Omega Upsilon -50 -KPX Omega Upsilondieresis -50 -KPX Upsilondieresis space -37 -KPX Upsilondieresis Theta -89 -KPX Upsilondieresis Phi -89 -KPX Upsilondieresis alpha -100 -KPX Upsilondieresis delta -83 -KPX Upsilondieresis sigma -112 -KPX Upsilondieresis phi -100 -KPX Upsilondieresis Alpha -164 -KPX Upsilondieresis Delta -125 -KPX Upsilondieresis Lambda -164 -KPX Upsilondieresis Omicron -89 -KPX Upsilondieresis Omega -89 -KPX Upsilondieresis alphatonos -100 -KPX Upsilondieresis etatonos -55 -KPX Upsilondieresis iotatonos -55 -KPX Upsilondieresis eta -55 -KPX Upsilondieresis iota -55 -KPX Upsilondieresis kappa -79 -KPX Upsilondieresis mu -79 -KPX Upsilondieresis omicron -100 -KPX Upsilondieresis iotadieresis -55 -KPX Upsilondieresis omicrontonos -100 -KPX gamma epsilon -17 -KPX zeta alpha -36 -KPX zeta delta -36 -KPX zeta sigma -36 -KPX zeta tau -73 -KPX zeta phi -36 -KPX zeta alphatonos -36 -KPX zeta etatonos -39 -KPX zeta gamma -36 -KPX zeta eta -39 -KPX zeta theta -36 -KPX zeta iota -59 -KPX zeta kappa -29 -KPX zeta nu -36 -KPX zeta omicron -37 -KPX zeta omega -36 -KPX zeta omicrontonos -36 -KPX zeta omegatonos -36 -KPX kappa alpha -9 -KPX kappa delta -22 -KPX kappa sigma -22 -KPX kappa phi -9 -KPX kappa alphatonos -9 -KPX kappa xi -22 -KPX kappa omicron -22 -KPX kappa sigma1 -22 -KPX kappa omega -9 -KPX kappa omicrontonos -22 -KPX kappa omegatonos -9 -KPX lambda etatonos -9 -KPX lambda upsilondieresistonos -18 -KPX lambda eta -9 -KPX lambda iota -12 -KPX lambda kappa -9 -KPX lambda nu -19 -KPX lambda upsilon -18 -KPX lambda upsilondieresis -18 -KPX lambda upsilontonos -18 -KPX xi alpha -37 -KPX xi delta -37 -KPX xi sigma -37 -KPX xi phi -37 -KPX xi alphatonos -37 -KPX xi zeta -37 -KPX xi xi -37 -KPX xi omicron -37 -KPX xi sigma1 -37 -KPX xi omicrontonos -37 -KPX chi alpha -22 -KPX chi delta -22 -KPX chi sigma -22 -KPX chi phi -22 -KPX chi alphatonos -22 -KPX chi omicron -22 -KPX chi sigma1 -22 -KPX chi omega -22 -KPX chi omicrontonos -22 -KPX chi omegatonos -22 -KPX afii10052 comma -138 -KPX afii10052 period -138 -KPX afii10052 guillemotleft -63 -KPX afii10052 guillemotright -25 -KPX afii10052 emdash -25 -KPX afii10058 quoteright -50 -KPX afii10059 quoteright -50 -KPX afii10017 quoteright -88 -KPX afii10017 afii10025 -25 -KPX afii10017 afii10032 -50 -KPX afii10017 afii10035 -50 -KPX afii10017 afii10036 -88 -KPX afii10017 afii10037 -88 -KPX afii10017 afii10038 -63 -KPX afii10017 afii10041 -152 -KPX afii10017 afii10047 -25 -KPX afii10017 afii10065 -13 -KPX afii10017 afii10066 -51 -KPX afii10017 afii10070 -25 -KPX afii10017 afii10080 -51 -KPX afii10017 afii10083 -25 -KPX afii10017 afii10084 -50 -KPX afii10017 afii10085 -50 -KPX afii10017 afii10086 -38 -KPX afii10018 afii10017 -13 -KPX afii10018 afii10021 -38 -KPX afii10018 afii10024 -25 -KPX afii10018 afii10029 -25 -KPX afii10018 afii10032 -7 -KPX afii10018 afii10035 -7 -KPX afii10018 afii10036 -13 -KPX afii10018 afii10037 -35 -KPX afii10018 afii10038 -15 -KPX afii10018 afii10039 -25 -KPX afii10018 afii10041 -50 -KPX afii10018 afii10044 -38 -KPX afii10018 afii10049 -33 -KPX afii10018 afii10069 -25 -KPX afii10018 afii10077 -13 -KPX afii10018 afii10085 -25 -KPX afii10019 afii10017 -63 -KPX afii10019 afii10021 -38 -KPX afii10019 afii10024 -25 -KPX afii10019 afii10029 -38 -KPX afii10019 afii10036 -13 -KPX afii10019 afii10037 -81 -KPX afii10019 afii10039 -25 -KPX afii10019 afii10041 -50 -KPX afii10019 afii10044 -53 -KPX afii10019 afii10049 -50 -KPX afii10019 afii10069 -25 -KPX afii10019 afii10085 -13 -KPX afii10019 afii10087 -13 -KPX afii10019 afii10089 -25 -KPX afii10020 comma -113 -KPX afii10020 period -113 -KPX afii10020 guillemotleft -63 -KPX afii10020 guillemotright -25 -KPX afii10020 emdash -25 -KPX afii10020 afii10017 -109 -KPX afii10020 afii10021 -88 -KPX afii10020 afii10025 25 -KPX afii10020 afii10029 -75 -KPX afii10020 afii10030 -13 -KPX afii10020 afii10032 -25 -KPX afii10020 afii10035 -13 -KPX afii10020 afii10049 -75 -KPX afii10020 afii10065 -25 -KPX afii10020 afii10067 -38 -KPX afii10020 afii10069 -75 -KPX afii10020 afii10070 -76 -KPX afii10020 afii10074 -38 -KPX afii10020 afii10077 -75 -KPX afii10020 afii10078 -38 -KPX afii10020 afii10079 -38 -KPX afii10020 afii10080 -88 -KPX afii10020 afii10082 -63 -KPX afii10020 afii10085 -38 -KPX afii10020 afii10093 -63 -KPX afii10020 afii10094 -63 -KPX afii10020 afii10096 -50 -KPX afii10020 afii10097 -75 -KPX afii10021 afii10025 25 -KPX afii10021 afii10037 12 -KPX afii10021 afii10047 25 -KPX afii10021 afii10070 12 -KPX afii10021 afii10073 25 -KPX afii10022 afii10025 12 -KPX afii10022 afii10029 -13 -KPX afii10024 afii10025 -25 -KPX afii10024 afii10032 -25 -KPX afii10024 afii10035 -25 -KPX afii10024 afii10036 -17 -KPX afii10024 afii10037 -14 -KPX afii10024 afii10044 -10 -KPX afii10024 afii10065 -25 -KPX afii10024 afii10066 -50 -KPX afii10024 afii10070 -51 -KPX afii10024 afii10080 -51 -KPX afii10024 afii10085 -49 -KPX afii10025 afii10021 -61 -KPX afii10025 afii10024 -13 -KPX afii10025 afii10029 -44 -KPX afii10025 afii10037 -25 -KPX afii10025 afii10041 -38 -KPX afii10025 afii10049 -38 -KPX afii10025 afii10069 -25 -KPX afii10025 afii10077 -13 -KPX afii10028 afii10032 -25 -KPX afii10028 afii10035 -25 -KPX afii10028 afii10037 -20 -KPX afii10028 afii10038 -44 -KPX afii10028 afii10041 -13 -KPX afii10028 afii10047 12 -KPX afii10028 afii10065 -13 -KPX afii10028 afii10070 -38 -KPX afii10028 afii10073 -13 -KPX afii10028 afii10080 -50 -KPX afii10028 afii10083 -25 -KPX afii10028 afii10084 -38 -KPX afii10028 afii10085 -75 -KPX afii10028 afii10095 -13 -KPX afii10029 afii10038 -13 -KPX afii10029 afii10066 -13 -KPX afii10029 afii10070 -7 -KPX afii10029 afii10080 -25 -KPX afii10029 afii10085 -25 -KPX afii10030 afii10038 -13 -KPX afii10030 afii10070 -13 -KPX afii10030 afii10080 -25 -KPX afii10030 afii10085 -25 -KPX afii10030 afii10089 -38 -KPX afii10032 afii10017 -50 -KPX afii10032 afii10021 -50 -KPX afii10032 afii10024 -25 -KPX afii10032 afii10029 -50 -KPX afii10032 afii10035 12 -KPX afii10032 afii10037 -56 -KPX afii10032 afii10038 12 -KPX afii10032 afii10039 -78 -KPX afii10032 afii10041 -25 -KPX afii10032 afii10049 -72 -KPX afii10032 afii10069 -13 -KPX afii10034 comma -125 -KPX afii10034 period -125 -KPX afii10034 colon 37 -KPX afii10034 semicolon 37 -KPX afii10034 guillemotright 25 -KPX afii10034 afii10017 -128 -KPX afii10034 afii10021 -75 -KPX afii10034 afii10024 -35 -KPX afii10034 afii10025 12 -KPX afii10034 afii10029 -75 -KPX afii10034 afii10032 12 -KPX afii10034 afii10035 12 -KPX afii10034 afii10036 12 -KPX afii10034 afii10037 -25 -KPX afii10034 afii10038 -17 -KPX afii10034 afii10039 -71 -KPX afii10034 afii10049 -63 -KPX afii10034 afii10069 -38 -KPX afii10034 afii10070 -13 -KPX afii10034 afii10080 -25 -KPX afii10034 afii10095 25 -KPX afii10034 afii10097 -38 -KPX afii10035 afii10017 -50 -KPX afii10035 afii10021 -50 -KPX afii10035 afii10029 -25 -KPX afii10035 afii10037 -13 -KPX afii10035 afii10039 -26 -KPX afii10035 afii10041 -25 -KPX afii10035 afii10044 -13 -KPX afii10035 afii10066 12 -KPX afii10035 afii10070 12 -KPX afii10035 afii10083 12 -KPX afii10035 afii10084 -13 -KPX afii10035 afii10085 -25 -KPX afii10035 afii10089 -13 -KPX afii10035 afii10095 12 -KPX afii10036 comma -100 -KPX afii10036 period -100 -KPX afii10036 guillemotleft -50 -KPX afii10036 guillemotright -26 -KPX afii10036 afii10017 -50 -KPX afii10036 afii10021 -63 -KPX afii10036 afii10029 -50 -KPX afii10036 afii10030 -13 -KPX afii10036 afii10032 -13 -KPX afii10036 afii10038 -22 -KPX afii10036 afii10049 -38 -KPX afii10036 afii10065 -25 -KPX afii10036 afii10067 -50 -KPX afii10036 afii10070 -38 -KPX afii10036 afii10074 -25 -KPX afii10036 afii10076 -25 -KPX afii10036 afii10077 -50 -KPX afii10036 afii10078 -25 -KPX afii10036 afii10080 -75 -KPX afii10036 afii10081 -38 -KPX afii10036 afii10082 -38 -KPX afii10036 afii10083 -38 -KPX afii10036 afii10085 -50 -KPX afii10036 afii10087 -50 -KPX afii10036 afii10091 -38 -KPX afii10036 afii10093 -50 -KPX afii10036 afii10094 -63 -KPX afii10036 afii10096 -50 -KPX afii10036 afii10097 -38 -KPX afii10037 comma -163 -KPX afii10037 period -163 -KPX afii10037 colon -38 -KPX afii10037 semicolon -38 -KPX afii10037 guillemotleft -88 -KPX afii10037 guillemotright -63 -KPX afii10037 emdash -25 -KPX afii10037 afii10017 -191 -KPX afii10037 afii10021 -101 -KPX afii10037 afii10025 -13 -KPX afii10037 afii10029 -113 -KPX afii10037 afii10032 -50 -KPX afii10037 afii10038 -74 -KPX afii10037 afii10047 -13 -KPX afii10037 afii10049 -113 -KPX afii10037 afii10066 -63 -KPX afii10037 afii10067 -113 -KPX afii10037 afii10068 -88 -KPX afii10037 afii10069 -140 -KPX afii10037 afii10070 -120 -KPX afii10037 afii10072 -88 -KPX afii10037 afii10073 -88 -KPX afii10037 afii10074 -88 -KPX afii10037 afii10075 -50 -KPX afii10037 afii10076 -88 -KPX afii10037 afii10077 -113 -KPX afii10037 afii10078 -88 -KPX afii10037 afii10079 -88 -KPX afii10037 afii10080 -113 -KPX afii10037 afii10081 -88 -KPX afii10037 afii10082 -88 -KPX afii10037 afii10083 -120 -KPX afii10037 afii10087 -100 -KPX afii10037 afii10088 -88 -KPX afii10037 afii10090 -88 -KPX afii10037 afii10091 -88 -KPX afii10037 afii10096 -88 -KPX afii10037 afii10097 -113 -KPX afii10038 afii10017 -63 -KPX afii10038 afii10021 -88 -KPX afii10038 afii10029 -75 -KPX afii10038 afii10032 12 -KPX afii10038 afii10036 -25 -KPX afii10038 afii10037 -76 -KPX afii10038 afii10041 -63 -KPX afii10038 afii10049 -88 -KPX afii10038 afii10077 -50 -KPX afii10039 afii10025 -25 -KPX afii10039 afii10032 -51 -KPX afii10039 afii10035 -38 -KPX afii10039 afii10038 -88 -KPX afii10039 afii10047 -13 -KPX afii10039 afii10080 -63 -KPX afii10039 afii10085 -88 -KPX afii10040 afii10032 -13 -KPX afii10040 afii10080 -13 -KPX afii10043 afii10085 12 -KPX afii10044 quoteright -63 -KPX afii10044 afii10049 -60 -KPX afii10046 quoteright -63 -KPX afii10046 afii10017 -43 -KPX afii10046 afii10021 -73 -KPX afii10046 afii10024 -63 -KPX afii10046 afii10025 -38 -KPX afii10046 afii10029 -40 -KPX afii10046 afii10030 -40 -KPX afii10046 afii10032 -25 -KPX afii10046 afii10035 -25 -KPX afii10046 afii10036 -75 -KPX afii10046 afii10039 -72 -KPX afii10046 afii10041 -112 -KPX afii10046 afii10047 -13 -KPX afii10046 afii10049 -53 -KPX afii10047 afii10021 -84 -KPX afii10047 afii10024 -25 -KPX afii10047 afii10025 12 -KPX afii10047 afii10029 -63 -KPX afii10047 afii10032 12 -KPX afii10047 afii10038 5 -KPX afii10047 afii10039 -51 -KPX afii10047 afii10049 -54 -KPX afii10047 afii10069 -25 -KPX afii10047 afii10077 -13 -KPX afii10048 afii10017 -38 -KPX afii10048 afii10021 -75 -KPX afii10048 afii10024 -70 -KPX afii10048 afii10029 -50 -KPX afii10048 afii10032 12 -KPX afii10048 afii10036 -25 -KPX afii10048 afii10039 -91 -KPX afii10048 afii10041 -38 -KPX afii10048 afii10069 -25 -KPX afii10048 afii10072 12 -KPX afii10048 afii10077 -13 -KPX afii10065 afii10077 9 -KPX afii10065 afii10081 -13 -KPX afii10065 afii10084 -26 -KPX afii10065 afii10085 -51 -KPX afii10065 afii10089 -40 -KPX afii10066 afii10069 -25 -KPX afii10066 afii10070 -13 -KPX afii10066 afii10072 -25 -KPX afii10066 afii10077 -25 -KPX afii10066 afii10078 -10 -KPX afii10066 afii10085 -38 -KPX afii10066 afii10087 -38 -KPX afii10066 afii10089 -38 -KPX afii10066 afii10092 -25 -KPX afii10066 afii10097 -25 -KPX afii10067 afii10065 -13 -KPX afii10067 afii10066 -13 -KPX afii10067 afii10069 -25 -KPX afii10067 afii10070 -6 -KPX afii10067 afii10072 -29 -KPX afii10067 afii10077 -13 -KPX afii10067 afii10078 -17 -KPX afii10067 afii10080 -7 -KPX afii10067 afii10083 -6 -KPX afii10067 afii10084 -25 -KPX afii10067 afii10085 -34 -KPX afii10067 afii10086 -13 -KPX afii10067 afii10089 -38 -KPX afii10067 afii10092 -25 -KPX afii10067 afii10097 -13 -KPX afii10068 comma -113 -KPX afii10068 period -113 -KPX afii10068 afii10069 -50 -KPX afii10068 afii10070 -13 -KPX afii10068 afii10077 -51 -KPX afii10068 afii10078 -13 -KPX afii10068 afii10080 -25 -KPX afii10068 afii10097 -25 -KPX afii10069 afii10073 12 -KPX afii10069 afii10095 25 -KPX afii10070 e 12 -KPX afii10070 afii10065 12 -KPX afii10070 afii10069 -13 -KPX afii10070 afii10073 12 -KPX afii10070 afii10083 25 -KPX afii10070 afii10085 -25 -KPX afii10070 afii10086 12 -KPX afii10070 afii10087 -13 -KPX afii10070 afii10089 -25 -KPX afii10072 afii10066 -13 -KPX afii10072 afii10070 -13 -KPX afii10072 afii10073 12 -KPX afii10072 afii10080 -25 -KPX afii10072 afii10083 -18 -KPX afii10072 afii10089 -25 -KPX afii10072 afii10092 -13 -KPX afii10073 afii10069 -18 -KPX afii10073 afii10072 -18 -KPX afii10073 afii10073 12 -KPX afii10073 afii10078 -14 -KPX afii10073 afii10080 -6 -KPX afii10073 afii10085 -21 -KPX afii10073 afii10086 -7 -KPX afii10073 afii10089 -20 -KPX afii10073 afii10092 -17 -KPX afii10076 guillemotleft -26 -KPX afii10076 afii10065 -15 -KPX afii10076 afii10066 -25 -KPX afii10076 afii10070 -25 -KPX afii10076 afii10073 -13 -KPX afii10076 afii10080 -51 -KPX afii10076 afii10083 -25 -KPX afii10076 afii10084 -13 -KPX afii10076 afii10085 -14 -KPX afii10076 afii10086 -25 -KPX afii10076 afii10089 -39 -KPX afii10076 afii10095 -13 -KPX afii10078 afii10065 -7 -KPX afii10078 afii10095 12 -KPX afii10080 afii10069 -29 -KPX afii10080 afii10070 12 -KPX afii10080 afii10072 -25 -KPX afii10080 afii10077 -13 -KPX afii10080 afii10078 -19 -KPX afii10080 afii10083 25 -KPX afii10080 afii10084 -13 -KPX afii10080 afii10085 -38 -KPX afii10080 afii10087 -25 -KPX afii10080 afii10089 -26 -KPX afii10080 afii10095 12 -KPX afii10080 afii10097 -19 -KPX afii10082 afii10069 -13 -KPX afii10082 afii10073 12 -KPX afii10082 afii10077 -13 -KPX afii10082 afii10078 -15 -KPX afii10082 afii10084 -13 -KPX afii10082 afii10085 -13 -KPX afii10082 afii10089 -25 -KPX afii10082 afii10095 25 -KPX afii10083 afii10065 12 -KPX afii10083 afii10066 12 -KPX afii10083 afii10070 12 -KPX afii10083 afii10073 25 -KPX afii10083 afii10085 -13 -KPX afii10083 afii10086 12 -KPX afii10083 afii10087 -13 -KPX afii10083 afii10089 -20 -KPX afii10083 afii10095 12 -KPX afii10084 comma -75 -KPX afii10084 period -75 -KPX afii10084 afii10065 12 -KPX afii10084 afii10069 -13 -KPX afii10084 afii10072 12 -KPX afii10084 afii10073 12 -KPX afii10084 afii10077 -25 -KPX afii10084 afii10080 -13 -KPX afii10084 afii10082 12 -KPX afii10084 afii10083 12 -KPX afii10084 afii10085 -13 -KPX afii10084 afii10095 25 -KPX afii10084 afii10097 -13 -KPX afii10085 comma -100 -KPX afii10085 period -100 -KPX afii10085 colon -13 -KPX afii10085 semicolon -13 -KPX afii10085 guillemotright 25 -KPX afii10085 afii10065 -13 -KPX afii10085 afii10066 -13 -KPX afii10085 afii10069 -63 -KPX afii10085 afii10070 -13 -KPX afii10085 afii10072 -13 -KPX afii10085 afii10077 -44 -KPX afii10085 afii10078 -13 -KPX afii10085 afii10080 -25 -KPX afii10085 afii10086 -25 -KPX afii10085 afii10097 -25 -KPX afii10086 afii10069 -25 -KPX afii10086 afii10077 -25 -KPX afii10086 afii10085 -25 -KPX afii10086 afii10086 -6 -KPX afii10086 afii10089 -27 -KPX afii10086 afii10097 -13 -KPX afii10087 afii10065 -13 -KPX afii10087 afii10066 -38 -KPX afii10087 afii10070 -25 -KPX afii10087 afii10073 -13 -KPX afii10087 afii10080 -38 -KPX afii10087 afii10083 -29 -KPX afii10087 afii10084 -25 -KPX afii10087 afii10085 -38 -KPX afii10087 afii10086 -38 -KPX afii10087 afii10089 -50 -KPX afii10087 afii10092 -38 -KPX afii10087 afii10095 -13 -KPX afii10088 afii10073 12 -KPX afii10094 afii10084 -38 -KPX afii10094 afii10089 -76 -KPX afii10095 afii10069 -52 -KPX afii10095 afii10072 -37 -KPX afii10095 afii10077 -18 -KPX afii10095 afii10078 -9 -KPX afii10095 afii10086 -6 -KPX afii10095 afii10087 -39 -KPX afii10095 afii10097 -13 -KPX afii10096 afii10069 -51 -KPX afii10096 afii10072 -25 -KPX afii10096 afii10077 -25 -KPX afii10096 afii10078 -13 -KPX afii10096 afii10084 -13 -KPX afii10096 afii10086 -6 -KPX afii10096 afii10087 -39 -KPX afii10096 afii10089 -38 -KPX afii10110 comma -100 -KPX afii10110 period -100 -KPX afii10110 guillemotright 12 -KPX afii10050 comma -99 -KPX afii10050 period -99 -KPX afii10050 colon -25 -KPX afii10050 semicolon -25 -KPX afii10050 guillemotleft -88 -KPX afii10050 guillemotright -38 -KPX afii10050 emdash -25 -EndKernPairs -EndKernData -EndFontMetrics +StartFontMetrics 4.1 +FontName TimesNewRomanPSMT +FullName Times New Roman +Notice Typeface The Monotype Corporation plc. Data The Monotype Corporation plc/Type Solutions Inc. 1990-1992. All Rights Reserved +EncodingScheme FontSpecific +FamilyName Times New Roman +Weight Regular +Version Version 3.00 +Characters 1674 +ItalicAngle 0.0 +Ascender 891 +Descender -216 +UnderlineThickness 49 +UnderlinePosition -109 +IsFixedPitch false +FontBBox -568 -307 2000 1007 +StartCharMetrics 1709 +C 0 ; WX 778 ; N .notdef ; B 139 0 639 625 ; +C 1 ; WX 778 ; N .notdef ; B 139 0 639 625 ; +C 2 ; WX 778 ; N .notdef ; B 139 0 639 625 ; +C 3 ; WX 778 ; N .notdef ; B 139 0 639 625 ; +C 4 ; WX 778 ; N .notdef ; B 139 0 639 625 ; +C 5 ; WX 778 ; N .notdef ; B 139 0 639 625 ; +C 6 ; WX 778 ; N .notdef ; B 139 0 639 625 ; +C 7 ; WX 778 ; N .notdef ; B 139 0 639 625 ; +C 8 ; WX 778 ; N .notdef ; B 139 0 639 625 ; +C 9 ; WX 778 ; N .notdef ; B 139 0 639 625 ; +C 10 ; WX 778 ; N .notdef ; B 139 0 639 625 ; +C 11 ; WX 778 ; N .notdef ; B 139 0 639 625 ; +C 12 ; WX 778 ; N .notdef ; B 139 0 639 625 ; +C 13 ; WX 778 ; N .notdef ; B 139 0 639 625 ; +C 14 ; WX 778 ; N .notdef ; B 139 0 639 625 ; +C 15 ; WX 778 ; N .notdef ; B 139 0 639 625 ; +C 16 ; WX 778 ; N .notdef ; B 139 0 639 625 ; +C 17 ; WX 778 ; N .notdef ; B 139 0 639 625 ; +C 18 ; WX 778 ; N .notdef ; B 139 0 639 625 ; +C 19 ; WX 778 ; N .notdef ; B 139 0 639 625 ; +C 20 ; WX 778 ; N .notdef ; B 139 0 639 625 ; +C 21 ; WX 778 ; N .notdef ; B 139 0 639 625 ; +C 22 ; WX 778 ; N .notdef ; B 139 0 639 625 ; +C 23 ; WX 778 ; N .notdef ; B 139 0 639 625 ; +C 24 ; WX 778 ; N .notdef ; B 139 0 639 625 ; +C 25 ; WX 778 ; N .notdef ; B 139 0 639 625 ; +C 26 ; WX 778 ; N .notdef ; B 139 0 639 625 ; +C 27 ; WX 778 ; N .notdef ; B 139 0 639 625 ; +C 28 ; WX 778 ; N .notdef ; B 139 0 639 625 ; +C 29 ; WX 778 ; N .notdef ; B 139 0 639 625 ; +C 30 ; WX 778 ; N .notdef ; B 139 0 639 625 ; +C 31 ; WX 778 ; N .notdef ; B 139 0 639 625 ; +C 32 ; WX 250 ; N space ; B 111 -14 222 677 ; +C 33 ; WX 333 ; N exclam ; B 111 -14 222 677 ; +C 34 ; WX 408 ; N quotedbl ; B 65 392 342 677 ; +C 35 ; WX 500 ; N numbersign ; B 18 -14 482 677 ; +C 36 ; WX 500 ; N dollar ; B 53 -76 450 718 ; +C 37 ; WX 833 ; N percent ; B 35 -27 798 677 ; +C 38 ; WX 778 ; N ampersand ; B 37 -15 748 677 ; +C 39 ; WX 180 ; N quotesingle ; B 40 392 138 677 ; +C 40 ; WX 333 ; N parenleft ; B 41 -214 311 694 ; +C 41 ; WX 333 ; N parenright ; B 22 -214 292 694 ; +C 42 ; WX 500 ; N asterisk ; B 71 289 430 694 ; +C 43 ; WX 564 ; N plus ; B 18 69 544 595 ; +C 44 ; WX 250 ; N comma ; B 54 -167 199 98 ; +C 45 ; WX 333 ; N hyphen ; B 41 188 293 261 ; +C 46 ; WX 250 ; N period ; B 71 -14 179 95 ; +C 47 ; WX 278 ; N slash ; B 1 -14 280 694 ; +C 48 ; WX 500 ; N zero ; B 36 -12 464 676 ; +C 49 ; WX 500 ; N one ; B 117 0 378 676 ; +C 50 ; WX 500 ; N two ; B 21 0 458 676 ; +C 51 ; WX 500 ; N three ; B 41 -12 417 676 ; +C 52 ; WX 500 ; N four ; B 16 0 465 676 ; +C 53 ; WX 500 ; N five ; B 48 -12 434 662 ; +C 54 ; WX 500 ; N six ; B 43 -12 461 676 ; +C 55 ; WX 500 ; N seven ; B 37 -14 456 662 ; +C 56 ; WX 500 ; N eight ; B 61 -12 442 676 ; +C 57 ; WX 500 ; N nine ; B 40 -14 457 676 ; +C 58 ; WX 278 ; N colon ; B 86 -14 195 461 ; +C 59 ; WX 278 ; N semicolon ; B 69 -167 215 461 ; +C 60 ; WX 564 ; N less ; B 19 91 544 572 ; +C 61 ; WX 564 ; N equal ; B 18 232 545 431 ; +C 62 ; WX 564 ; N greater ; B 18 91 543 572 ; +C 63 ; WX 444 ; N question ; B 45 -13 404 677 ; +C 64 ; WX 921 ; N at ; B 47 -216 896 694 ; +C 65 ; WX 722 ; N A ; B 8 0 711 677 ; +C 66 ; WX 667 ; N B ; B 17 0 612 662 ; +C 67 ; WX 667 ; N C ; B 36 -15 632 677 ; +C 68 ; WX 722 ; N D ; B 17 0 684 662 ; +C 69 ; WX 611 ; N E ; B 21 0 588 662 ; +C 70 ; WX 556 ; N F ; B 16 0 515 662 ; +C 71 ; WX 722 ; N G ; B 35 -15 708 677 ; +C 72 ; WX 722 ; N H ; B 17 0 702 662 ; +C 73 ; WX 333 ; N I ; B 25 0 309 662 ; +C 74 ; WX 389 ; N J ; B 21 -15 383 662 ; +C 75 ; WX 722 ; N K ; B 17 0 730 662 ; +C 76 ; WX 611 ; N L ; B 20 0 589 662 ; +C 77 ; WX 889 ; N M ; B 17 0 868 662 ; +C 78 ; WX 722 ; N N ; B -13 -11 708 662 ; +C 79 ; WX 722 ; N O ; B 35 -15 684 677 ; +C 80 ; WX 556 ; N P ; B 17 0 521 662 ; +C 81 ; WX 722 ; N Q ; B 35 -196 684 677 ; +C 82 ; WX 667 ; N R ; B 17 0 676 662 ; +C 83 ; WX 556 ; N S ; B 63 -15 502 677 ; +C 84 ; WX 611 ; N T ; B 30 0 586 662 ; +C 85 ; WX 722 ; N U ; B 5 -16 711 662 ; +C 86 ; WX 722 ; N V ; B 9 -15 710 662 ; +C 87 ; WX 944 ; N W ; B 13 -15 936 662 ; +C 88 ; WX 722 ; N X ; B 7 0 710 662 ; +C 89 ; WX 722 ; N Y ; B 9 0 708 662 ; +C 90 ; WX 611 ; N Z ; B 13 0 583 662 ; +C 91 ; WX 333 ; N bracketleft ; B 82 -198 297 677 ; +C 92 ; WX 278 ; N backslash ; B 1 -14 280 694 ; +C 93 ; WX 333 ; N bracketright ; B 37 -199 251 677 ; +C 94 ; WX 469 ; N asciicircum ; B 18 326 451 676 ; +C 95 ; WX 500 ; N underscore ; B -8 -216 509 -175 ; +C 96 ; WX 333 ; N grave ; B 58 510 218 679 ; +C 97 ; WX 444 ; N a ; B 36 -9 442 460 ; +C 98 ; WX 500 ; N b ; B -2 -14 465 694 ; +C 99 ; WX 444 ; N c ; B 34 -14 411 460 ; +C 100 ; WX 500 ; N d ; B 33 -14 502 694 ; +C 101 ; WX 444 ; N e ; B 37 -14 416 461 ; +C 102 ; WX 333 ; N f ; B 39 0 435 693 ; +C 103 ; WX 500 ; N g ; B 30 -216 482 460 ; +C 104 ; WX 500 ; N h ; B 6 0 494 694 ; +C 105 ; WX 278 ; N i ; B 29 0 253 694 ; +C 106 ; WX 278 ; N j ; B -77 -216 195 695 ; +C 107 ; WX 500 ; N k ; B 8 0 506 694 ; +C 108 ; WX 278 ; N l ; B 30 0 257 694 ; +C 109 ; WX 778 ; N m ; B 8 0 773 460 ; +C 110 ; WX 500 ; N n ; B 6 0 496 460 ; +C 111 ; WX 500 ; N o ; B 34 -14 465 460 ; +C 112 ; WX 500 ; N p ; B -3 -214 466 460 ; +C 113 ; WX 500 ; N q ; B 33 -214 500 460 ; +C 114 ; WX 333 ; N r ; B 6 0 339 460 ; +C 115 ; WX 389 ; N s ; B 49 -14 354 460 ; +C 116 ; WX 278 ; N t ; B 10 -7 279 594 ; +C 117 ; WX 500 ; N u ; B 1 -14 499 447 ; +C 118 ; WX 500 ; N v ; B 8 -14 491 447 ; +C 119 ; WX 722 ; N w ; B 6 -14 713 447 ; +C 120 ; WX 500 ; N x ; B 13 0 488 447 ; +C 121 ; WX 500 ; N y ; B 6 -216 494 447 ; +C 122 ; WX 444 ; N z ; B 20 0 428 447 ; +C 123 ; WX 480 ; N braceleft ; B 138 -216 411 694 ; +C 124 ; WX 200 ; N bar ; B 79 -216 119 694 ; +C 125 ; WX 480 ; N braceright ; B 86 -216 359 694 ; +C 126 ; WX 541 ; N asciitilde ; B 21 194 542 331 ; +C 127 ; WX 778 ; N .notdef ; B 139 0 639 625 ; +C 128 ; WX 500 ; N Euro ; B -11 -12 482 676 ; +C 129 ; WX 578 ; N afii10052 ; B 18 0 552 896 ; +C 130 ; WX 333 ; N quotesinglbase ; B 99 -167 245 98 ; +C 131 ; WX 500 ; N florin ; B 1 -210 488 677 ; +C 132 ; WX 444 ; N quotedblbase ; B 33 -154 416 98 ; +C 133 ; WX 1000 ; N ellipsis ; B 112 -14 888 95 ; +C 134 ; WX 500 ; N dagger ; B 49 -206 451 685 ; +C 135 ; WX 500 ; N daggerdbl ; B 68 -216 432 694 ; +C 136 ; WX 333 ; N circumflex ; B 29 515 304 676 ; +C 137 ; WX 1000 ; N perthousand ; B 32 -27 967 677 ; +C 138 ; WX 556 ; N Scaron ; B 63 -15 502 875 ; +C 139 ; WX 333 ; N guilsinglleft ; B 58 -4 275 456 ; +C 140 ; WX 889 ; N OE ; B 37 -8 861 668 ; +C 141 ; WX 667 ; N afii10061 ; B 18 0 664 877 ; +C 142 ; WX 611 ; N Zcaron ; B 13 0 583 875 ; +C 143 ; WX 722 ; N afii10145 ; B 18 -190 704 662 ; +C 144 ; WX 444 ; N quotedblbase ; B 33 -154 416 98 ; +C 145 ; WX 333 ; N quoteleft ; B 90 424 239 677 ; +C 146 ; WX 333 ; N quoteright ; B 94 424 243 677 ; +C 147 ; WX 444 ; N quotedblleft ; B 33 425 416 677 ; +C 148 ; WX 444 ; N quotedblright ; B 33 425 416 677 ; +C 149 ; WX 350 ; N bullet ; B 55 208 300 453 ; +C 150 ; WX 500 ; N endash ; B -9 221 508 257 ; +C 151 ; WX 1000 ; N emdash ; B -9 221 1009 257 ; +C 152 ; WX 333 ; N tilde ; B 11 534 323 662 ; +C 153 ; WX 980 ; N trademark ; B 15 268 963 662 ; +C 154 ; WX 389 ; N scaron ; B 49 -14 354 676 ; +C 155 ; WX 333 ; N guilsinglright ; B 56 -4 277 456 ; +C 156 ; WX 722 ; N oe ; B 33 -14 691 461 ; +C 157 ; WX 486 ; N afii10109 ; B 22 0 480 679 ; +C 158 ; WX 444 ; N zcaron ; B 20 0 428 676 ; +C 159 ; WX 722 ; N Ydieresis ; B 9 0 708 834 ; +C 160 ; WX 250 ; N space ; B 111 -14 222 677 ; +C 161 ; WX 333 ; N exclamdown ; B 111 -216 222 476 ; +C 162 ; WX 500 ; N cent ; B 63 -185 439 647 ; +C 163 ; WX 500 ; N sterling ; B 30 -12 477 676 ; +C 164 ; WX 500 ; N currency ; B 13 97 486 567 ; +C 165 ; WX 500 ; N yen ; B 1 0 500 662 ; +C 166 ; WX 200 ; N brokenbar ; B 79 -216 119 694 ; +C 167 ; WX 500 ; N section ; B 76 -195 424 676 ; +C 168 ; WX 333 ; N dieresis ; B 28 547 306 653 ; +C 169 ; WX 760 ; N copyright ; B 34 -15 727 677 ; +C 170 ; WX 276 ; N ordfeminine ; B -3 382 274 676 ; +C 171 ; WX 500 ; N guillemotleft ; B 31 -4 469 456 ; +C 172 ; WX 564 ; N logicalnot ; B 18 230 545 429 ; +C 173 ; WX 333 ; N hyphen ; B 41 188 293 261 ; +C 174 ; WX 760 ; N registered ; B 34 -15 727 677 ; +C 175 ; WX 500 ; N overscore ; B -8 714 509 755 ; +C 176 ; WX 400 ; N degree ; B 48 376 348 677 ; +C 177 ; WX 549 ; N plusminus ; B 11 69 538 595 ; +C 178 ; WX 300 ; N twosuperior ; B 10 324 281 676 ; +C 179 ; WX 300 ; N threesuperior ; B 21 317 255 676 ; +C 180 ; WX 333 ; N acute ; B 115 510 276 679 ; +C 181 ; WX 576 ; N mu1 ; B 65 -216 534 447 ; +C 182 ; WX 453 ; N paragraph ; B -7 -216 455 662 ; +C 183 ; WX 250 ; N periodcentered ; B 71 277 179 385 ; +C 184 ; WX 333 ; N cedilla ; B 91 -190 242 8 ; +C 185 ; WX 300 ; N onesuperior ; B 66 324 233 676 ; +C 186 ; WX 310 ; N ordmasculine ; B 14 384 298 676 ; +C 187 ; WX 500 ; N guillemotright ; B 31 -4 469 456 ; +C 188 ; WX 750 ; N onequarter ; B 65 -26 733 676 ; +C 189 ; WX 750 ; N onehalf ; B 65 -26 729 676 ; +C 190 ; WX 750 ; N threequarters ; B 21 -26 733 676 ; +C 191 ; WX 444 ; N questiondown ; B 43 -216 402 476 ; +C 192 ; WX 722 ; N Agrave ; B 8 0 711 877 ; +C 193 ; WX 722 ; N Aacute ; B 8 0 711 877 ; +C 194 ; WX 722 ; N Acircumflex ; B 8 0 711 875 ; +C 195 ; WX 722 ; N Atilde ; B 8 0 711 842 ; +C 196 ; WX 722 ; N Adieresis ; B 8 0 711 834 ; +C 197 ; WX 722 ; N Aring ; B 8 0 711 831 ; +C 198 ; WX 889 ; N AE ; B -12 0 861 662 ; +C 199 ; WX 667 ; N Ccedilla ; B 36 -190 632 677 ; +C 200 ; WX 611 ; N Egrave ; B 21 0 588 877 ; +C 201 ; WX 611 ; N Eacute ; B 21 0 588 877 ; +C 202 ; WX 611 ; N Ecircumflex ; B 21 0 588 875 ; +C 203 ; WX 611 ; N Edieresis ; B 21 0 588 834 ; +C 204 ; WX 333 ; N Igrave ; B 25 0 309 877 ; +C 205 ; WX 333 ; N Iacute ; B 25 0 309 877 ; +C 206 ; WX 333 ; N Icircumflex ; B 25 0 309 875 ; +C 207 ; WX 333 ; N Idieresis ; B 25 0 309 834 ; +C 208 ; WX 722 ; N Eth ; B 17 0 684 662 ; +C 209 ; WX 722 ; N Ntilde ; B -13 -11 708 842 ; +C 210 ; WX 722 ; N Ograve ; B 35 -15 684 877 ; +C 211 ; WX 722 ; N Oacute ; B 35 -15 684 877 ; +C 212 ; WX 722 ; N Ocircumflex ; B 35 -15 684 875 ; +C 213 ; WX 722 ; N Otilde ; B 35 -15 684 842 ; +C 214 ; WX 722 ; N Odieresis ; B 35 -15 684 834 ; +C 215 ; WX 564 ; N multiply ; B 81 132 481 533 ; +C 216 ; WX 722 ; N Oslash ; B 36 -23 684 684 ; +C 217 ; WX 722 ; N Ugrave ; B 5 -16 711 877 ; +C 218 ; WX 722 ; N Uacute ; B 5 -16 711 877 ; +C 219 ; WX 722 ; N Ucircumflex ; B 5 -16 711 875 ; +C 220 ; WX 722 ; N Udieresis ; B 5 -16 711 834 ; +C 221 ; WX 722 ; N Yacute ; B 9 0 708 877 ; +C 222 ; WX 556 ; N Thorn ; B 18 0 518 662 ; +C 223 ; WX 500 ; N germandbls ; B 17 -6 468 694 ; +C 224 ; WX 444 ; N agrave ; B 36 -9 442 679 ; +C 225 ; WX 444 ; N aacute ; B 36 -9 442 679 ; +C 226 ; WX 444 ; N acircumflex ; B 36 -9 442 676 ; +C 227 ; WX 444 ; N atilde ; B 36 -9 442 662 ; +C 228 ; WX 444 ; N adieresis ; B 36 -9 442 653 ; +C 229 ; WX 444 ; N aring ; B 36 -9 442 696 ; +C 230 ; WX 667 ; N ae ; B 36 -14 637 461 ; +C 231 ; WX 444 ; N ccedilla ; B 34 -190 411 460 ; +C 232 ; WX 444 ; N egrave ; B 37 -14 416 679 ; +C 233 ; WX 444 ; N eacute ; B 37 -14 416 679 ; +C 234 ; WX 444 ; N ecircumflex ; B 37 -14 416 676 ; +C 235 ; WX 444 ; N edieresis ; B 37 -14 416 652 ; +C 236 ; WX 278 ; N igrave ; B 29 0 253 679 ; +C 237 ; WX 278 ; N iacute ; B 29 0 253 679 ; +C 238 ; WX 278 ; N icircumflex ; B 6 0 281 676 ; +C 239 ; WX 278 ; N idieresis ; B 1 0 279 652 ; +C 240 ; WX 500 ; N eth ; B 33 -14 463 694 ; +C 241 ; WX 500 ; N ntilde ; B 6 0 496 662 ; +C 242 ; WX 500 ; N ograve ; B 34 -14 465 679 ; +C 243 ; WX 500 ; N oacute ; B 34 -14 465 679 ; +C 244 ; WX 500 ; N ocircumflex ; B 34 -14 465 676 ; +C 245 ; WX 500 ; N otilde ; B 34 -14 465 662 ; +C 246 ; WX 500 ; N odieresis ; B 34 -14 465 652 ; +C 247 ; WX 549 ; N divide ; B 11 136 538 525 ; +C 248 ; WX 500 ; N oslash ; B 19 -33 481 478 ; +C 249 ; WX 500 ; N ugrave ; B 1 -14 499 679 ; +C 250 ; WX 500 ; N uacute ; B 1 -14 499 679 ; +C 251 ; WX 500 ; N ucircumflex ; B 1 -14 499 676 ; +C 252 ; WX 500 ; N udieresis ; B 1 -14 499 652 ; +C 253 ; WX 500 ; N yacute ; B 6 -216 494 679 ; +C 254 ; WX 500 ; N thorn ; B -3 -213 466 694 ; +C 255 ; WX 500 ; N ydieresis ; B 6 -216 494 653 ; +C -1 ; WX 0 ; N .null ; B 111 -14 222 677 ; +C -1 ; WX 250 ; N nonmarkingreturn ; B 111 -14 222 677 ; +C -1 ; WX 549 ; N notequal ; B 12 -132 537 660 ; +C -1 ; WX 713 ; N infinity ; B 24 52 685 461 ; +C -1 ; WX 549 ; N lessequal ; B 12 -80 537 605 ; +C -1 ; WX 549 ; N greaterequal ; B 12 -80 537 605 ; +C -1 ; WX 494 ; N partialdiff ; B 29 -15 484 694 ; +C -1 ; WX 713 ; N summation ; B 21 -216 693 693 ; +C -1 ; WX 823 ; N product ; B 22 -216 801 693 ; +C -1 ; WX 549 ; N pi1 ; B 30 -14 500 447 ; +C -1 ; WX 274 ; N integral ; B -1 -107 272 910 ; +C -1 ; WX 768 ; N Ohm ; B 35 0 734 675 ; +C -1 ; WX 549 ; N radical ; B 42 -38 550 913 ; +C -1 ; WX 549 ; N approxequal ; B 15 133 535 508 ; +C -1 ; WX 612 ; N increment ; B 14 0 600 677 ; +C -1 ; WX 494 ; N lozenge ; B 23 0 472 694 ; +C -1 ; WX 167 ; N fraction ; B -167 -26 333 676 ; +C -1 ; WX 556 ; N fi ; B 12 0 530 694 ; +C -1 ; WX 556 ; N fl ; B 11 0 531 694 ; +C -1 ; WX 278 ; N dotlessi ; B 29 0 253 460 ; +C -1 ; WX 333 ; N macron ; B 11 598 323 661 ; +C -1 ; WX 333 ; N breve ; B 27 526 306 663 ; +C -1 ; WX 333 ; N dotaccent ; B 114 546 220 653 ; +C -1 ; WX 333 ; N ring ; B 73 508 260 695 ; +C -1 ; WX 333 ; N hungarumlaut ; B 38 510 314 679 ; +C -1 ; WX 333 ; N ogonek ; B 72 -177 297 8 ; +C -1 ; WX 333 ; N caron ; B 29 515 304 676 ; +C -1 ; WX 611 ; N Lslash ; B 11 0 585 662 ; +C -1 ; WX 278 ; N lslash ; B 15 0 269 694 ; +C -1 ; WX 564 ; N minus ; B 18 313 544 353 ; +C -1 ; WX 500 ; N franc ; B 16 0 463 662 ; +C -1 ; WX 722 ; N Gbreve ; B 35 -15 708 857 ; +C -1 ; WX 500 ; N gbreve ; B 30 -216 482 663 ; +C -1 ; WX 333 ; N Idot ; B 25 0 309 834 ; +C -1 ; WX 556 ; N Scedilla ; B 63 -190 502 677 ; +C -1 ; WX 389 ; N scedilla ; B 49 -190 354 460 ; +C -1 ; WX 667 ; N Cacute ; B 36 -15 632 877 ; +C -1 ; WX 444 ; N cacute ; B 34 -14 411 679 ; +C -1 ; WX 667 ; N Ccaron ; B 36 -15 632 875 ; +C -1 ; WX 444 ; N ccaron ; B 34 -14 411 676 ; +C -1 ; WX 500 ; N dmacron ; B 19 -14 488 694 ; +C -1 ; WX 333 ; N middot ; B 242 292 344 395 ; +C -1 ; WX 722 ; N Abreve ; B 8 0 711 859 ; +C -1 ; WX 444 ; N abreve ; B 36 -9 442 663 ; +C -1 ; WX 722 ; N Aogonek ; B 8 -177 726 677 ; +C -1 ; WX 444 ; N aogonek ; B 36 -177 504 460 ; +C -1 ; WX 722 ; N Dcaron ; B 17 0 684 875 ; +C -1 ; WX 646 ; N dcaron ; B 33 -14 638 694 ; +C -1 ; WX 722 ; N Dslash ; B 17 0 684 662 ; +C -1 ; WX 611 ; N Eogonek ; B 21 -177 588 662 ; +C -1 ; WX 444 ; N eogonek ; B 37 -177 463 461 ; +C -1 ; WX 611 ; N Ecaron ; B 21 0 588 875 ; +C -1 ; WX 444 ; N ecaron ; B 37 -14 416 676 ; +C -1 ; WX 611 ; N Lacute ; B 20 0 589 877 ; +C -1 ; WX 278 ; N lacute ; B 30 0 257 877 ; +C -1 ; WX 611 ; N Lcaron ; B 20 0 589 677 ; +C -1 ; WX 406 ; N lcaron ; B 29 0 397 694 ; +C -1 ; WX 611 ; N Ldot ; B 20 0 589 662 ; +C -1 ; WX 344 ; N ldot ; B 30 0 350 694 ; +C -1 ; WX 722 ; N Nacute ; B -13 -11 708 877 ; +C -1 ; WX 500 ; N nacute ; B 6 0 496 679 ; +C -1 ; WX 722 ; N Ncaron ; B -13 -11 708 875 ; +C -1 ; WX 500 ; N ncaron ; B 6 0 496 676 ; +C -1 ; WX 722 ; N Odblacute ; B 35 -15 684 877 ; +C -1 ; WX 500 ; N odblacute ; B 34 -14 465 679 ; +C -1 ; WX 667 ; N Racute ; B 17 0 676 877 ; +C -1 ; WX 333 ; N racute ; B 6 0 339 679 ; +C -1 ; WX 667 ; N Rcaron ; B 17 0 676 875 ; +C -1 ; WX 333 ; N rcaron ; B 6 0 339 676 ; +C -1 ; WX 556 ; N Sacute ; B 63 -15 502 877 ; +C -1 ; WX 389 ; N sacute ; B 49 -14 354 679 ; +C -1 ; WX 611 ; N Tcedilla ; B 30 -226 586 662 ; +C -1 ; WX 278 ; N tcedilla ; B 10 -226 279 594 ; +C -1 ; WX 611 ; N Tcaron ; B 30 0 586 875 ; +C -1 ; WX 427 ; N tcaron ; B 9 -7 418 694 ; +C -1 ; WX 722 ; N Uring ; B 5 -16 711 886 ; +C -1 ; WX 500 ; N uring ; B 1 -14 499 695 ; +C -1 ; WX 722 ; N Udblacute ; B 5 -16 711 877 ; +C -1 ; WX 500 ; N udblacute ; B 1 -14 499 679 ; +C -1 ; WX 611 ; N Zacute ; B 13 0 583 877 ; +C -1 ; WX 444 ; N zacute ; B 20 0 428 679 ; +C -1 ; WX 611 ; N Zdot ; B 13 0 583 834 ; +C -1 ; WX 444 ; N zdot ; B 20 0 428 653 ; +C -1 ; WX 578 ; N Gamma ; B 18 0 552 662 ; +C -1 ; WX 722 ; N Theta ; B 37 -15 686 677 ; +C -1 ; WX 731 ; N Phi ; B 35 0 696 662 ; +C -1 ; WX 524 ; N alpha ; B 42 -14 517 460 ; +C -1 ; WX 471 ; N delta ; B 34 -14 437 693 ; +C -1 ; WX 420 ; N epsilon ; B 35 -14 403 460 ; +C -1 ; WX 539 ; N sigma ; B 34 -14 519 447 ; +C -1 ; WX 402 ; N tau ; B 6 -14 382 447 ; +C -1 ; WX 577 ; N phi ; B 34 -214 543 460 ; +C -1 ; WX 500 ; N underscoredbl ; B -8 -216 509 -98 ; +C -1 ; WX 573 ; N exclamdbl ; B 111 -14 461 677 ; +C -1 ; WX 315 ; N nsuperior ; B 1 278 313 557 ; +C -1 ; WX 969 ; N peseta ; B 21 -13 956 662 ; +C -1 ; WX 1000 ; N arrowleft ; B 39 77 961 428 ; +C -1 ; WX 500 ; N arrowup ; B 75 -209 426 654 ; +C -1 ; WX 1000 ; N arrowright ; B 39 77 961 428 ; +C -1 ; WX 500 ; N arrowdown ; B 75 -209 426 654 ; +C -1 ; WX 1000 ; N arrowboth ; B 39 77 961 429 ; +C -1 ; WX 500 ; N arrowupdn ; B 74 -208 425 714 ; +C -1 ; WX 500 ; N arrowupdnbse ; B 74 -303 425 714 ; +C -1 ; WX 979 ; N orthogonal ; B 177 0 802 625 ; +C -1 ; WX 722 ; N intersection ; B 94 0 625 676 ; +C -1 ; WX 564 ; N equivalence ; B 19 152 545 511 ; +C -1 ; WX 600 ; N house ; B 75 0 525 563 ; +C -1 ; WX 564 ; N revlogicalnot ; B 19 230 546 429 ; +C -1 ; WX 604 ; N integraltp ; B 267 -251 477 848 ; +C -1 ; WX 604 ; N integralbt ; B 127 -251 337 848 ; +C -1 ; WX 708 ; N SF100000 ; B -11 261 719 346 ; +C -1 ; WX 708 ; N SF110000 ; B 219 -303 304 910 ; +C -1 ; WX 708 ; N SF010000 ; B 312 -303 720 346 ; +C -1 ; WX 708 ; N SF030000 ; B -11 -303 396 346 ; +C -1 ; WX 708 ; N SF020000 ; B 312 261 720 910 ; +C -1 ; WX 708 ; N SF040000 ; B -11 261 396 910 ; +C -1 ; WX 708 ; N SF080000 ; B 312 -303 720 910 ; +C -1 ; WX 708 ; N SF090000 ; B -11 -303 396 910 ; +C -1 ; WX 708 ; N SF060000 ; B -11 -303 719 346 ; +C -1 ; WX 708 ; N SF070000 ; B -11 261 719 910 ; +C -1 ; WX 708 ; N SF050000 ; B -11 -303 719 910 ; +C -1 ; WX 708 ; N SF430000 ; B -11 168 719 439 ; +C -1 ; WX 708 ; N SF240000 ; B 219 -303 490 910 ; +C -1 ; WX 708 ; N SF510000 ; B 312 -303 720 439 ; +C -1 ; WX 708 ; N SF520000 ; B 219 -303 720 346 ; +C -1 ; WX 708 ; N SF390000 ; B 219 -303 719 439 ; +C -1 ; WX 708 ; N SF220000 ; B -11 -303 396 439 ; +C -1 ; WX 708 ; N SF210000 ; B -11 -303 489 346 ; +C -1 ; WX 708 ; N SF250000 ; B -11 -303 489 439 ; +C -1 ; WX 708 ; N SF500000 ; B 312 168 720 910 ; +C -1 ; WX 708 ; N SF490000 ; B 219 261 720 910 ; +C -1 ; WX 708 ; N SF380000 ; B 219 168 719 910 ; +C -1 ; WX 708 ; N SF280000 ; B -11 168 396 910 ; +C -1 ; WX 708 ; N SF270000 ; B -11 261 489 910 ; +C -1 ; WX 708 ; N SF260000 ; B -11 168 489 910 ; +C -1 ; WX 708 ; N SF360000 ; B 312 -303 720 910 ; +C -1 ; WX 708 ; N SF370000 ; B 219 -303 720 910 ; +C -1 ; WX 708 ; N SF420000 ; B 219 -303 720 910 ; +C -1 ; WX 708 ; N SF190000 ; B -11 -303 396 910 ; +C -1 ; WX 708 ; N SF200000 ; B -11 -303 489 910 ; +C -1 ; WX 708 ; N SF230000 ; B -11 -303 489 910 ; +C -1 ; WX 708 ; N SF470000 ; B -11 -303 719 439 ; +C -1 ; WX 708 ; N SF480000 ; B -11 -303 719 346 ; +C -1 ; WX 708 ; N SF410000 ; B -11 -303 719 439 ; +C -1 ; WX 708 ; N SF450000 ; B -11 168 719 910 ; +C -1 ; WX 708 ; N SF460000 ; B -11 261 719 910 ; +C -1 ; WX 708 ; N SF400000 ; B -11 168 719 910 ; +C -1 ; WX 708 ; N SF540000 ; B -11 -303 719 910 ; +C -1 ; WX 708 ; N SF530000 ; B -11 -303 719 910 ; +C -1 ; WX 708 ; N SF440000 ; B -11 -303 719 910 ; +C -1 ; WX 708 ; N upblock ; B -11 303 719 910 ; +C -1 ; WX 708 ; N dnblock ; B -11 -303 719 303 ; +C -1 ; WX 708 ; N block ; B -11 -303 719 910 ; +C -1 ; WX 708 ; N lfblock ; B -11 -303 354 910 ; +C -1 ; WX 708 ; N rtblock ; B 354 -303 720 910 ; +C -1 ; WX 708 ; N ltshade ; B 50 -246 719 910 ; +C -1 ; WX 708 ; N shade ; B -11 -246 719 910 ; +C -1 ; WX 729 ; N dkshade ; B 0 -307 729 910 ; +C -1 ; WX 604 ; N filledbox ; B 71 0 532 461 ; +C -1 ; WX 1000 ; N filledrect ; B 0 155 1000 343 ; +C -1 ; WX 990 ; N triagup ; B 148 0 842 693 ; +C -1 ; WX 990 ; N triagrt ; B 141 -15 849 692 ; +C -1 ; WX 990 ; N triagdn ; B 148 -15 842 678 ; +C -1 ; WX 990 ; N triaglf ; B 141 -15 849 692 ; +C -1 ; WX 604 ; N circle ; B 87 67 517 497 ; +C -1 ; WX 604 ; N invbullet ; B 63 0 541 479 ; +C -1 ; WX 604 ; N invcircle ; B 21 0 584 564 ; +C -1 ; WX 1021 ; N smileface ; B 199 -58 822 564 ; +C -1 ; WX 1052 ; N invsmileface ; B 215 -58 838 564 ; +C -1 ; WX 917 ; N sun ; B 8 -109 909 792 ; +C -1 ; WX 750 ; N female ; B 119 -214 630 736 ; +C -1 ; WX 750 ; N male ; B 54 -128 691 791 ; +C -1 ; WX 531 ; N spade ; B 28 0 503 601 ; +C -1 ; WX 656 ; N club ; B 27 0 629 601 ; +C -1 ; WX 594 ; N heart ; B 31 -12 563 601 ; +C -1 ; WX 510 ; N diamond ; B 31 -12 479 601 ; +C -1 ; WX 500 ; N musicalnote ; B 18 -18 482 666 ; +C -1 ; WX 750 ; N musicalnotedbl ; B 42 -63 649 742 ; +C -1 ; WX 708 ; N IJ ; B 25 -15 706 662 ; +C -1 ; WX 552 ; N ij ; B 29 -216 472 695 ; +C -1 ; WX 604 ; N napostrophe ; B 1 0 601 677 ; +C -1 ; WX 219 ; N minute ; B 67 392 197 677 ; +C -1 ; WX 417 ; N second ; B 79 392 376 677 ; +C -1 ; WX 833 ; N afii61248 ; B 25 -27 808 677 ; +C -1 ; WX 479 ; N afii61289 ; B 49 -14 436 677 ; +C -1 ; WX 604 ; N H22073 ; B 71 0 532 461 ; +C -1 ; WX 354 ; N H18543 ; B 64 217 290 444 ; +C -1 ; WX 354 ; N H18551 ; B 64 217 290 444 ; +C -1 ; WX 604 ; N H18533 ; B 87 67 517 497 ; +C -1 ; WX 354 ; N openbullet ; B 55 208 300 453 ; +C -1 ; WX 722 ; N Amacron ; B 8 0 711 799 ; +C -1 ; WX 444 ; N amacron ; B 36 -9 442 609 ; +C -1 ; WX 667 ; N Ccircumflex ; B 36 -15 632 890 ; +C -1 ; WX 444 ; N ccircumflex ; B 34 -14 411 676 ; +C -1 ; WX 667 ; N Cdot ; B 36 -15 632 834 ; +C -1 ; WX 444 ; N cdot ; B 34 -14 411 653 ; +C -1 ; WX 611 ; N Emacron ; B 21 0 588 799 ; +C -1 ; WX 444 ; N emacron ; B 37 -14 416 609 ; +C -1 ; WX 611 ; N Ebreve ; B 21 0 588 864 ; +C -1 ; WX 444 ; N ebreve ; B 37 -14 416 663 ; +C -1 ; WX 611 ; N Edot ; B 21 0 588 834 ; +C -1 ; WX 444 ; N edot ; B 37 -14 416 653 ; +C -1 ; WX 722 ; N Gcircumflex ; B 35 -15 708 890 ; +C -1 ; WX 500 ; N gcircumflex ; B 30 -216 482 676 ; +C -1 ; WX 722 ; N Gdot ; B 35 -15 708 834 ; +C -1 ; WX 500 ; N gdot ; B 30 -216 482 653 ; +C -1 ; WX 722 ; N Gcedilla ; B 35 -190 708 677 ; +C -1 ; WX 500 ; N gcedilla ; B 30 -216 482 729 ; +C -1 ; WX 722 ; N Hcircumflex ; B 17 0 702 890 ; +C -1 ; WX 500 ; N hcircumflex ; B 6 0 494 890 ; +C -1 ; WX 722 ; N Hbar ; B 17 0 702 662 ; +C -1 ; WX 500 ; N hbar ; B 6 0 494 694 ; +C -1 ; WX 333 ; N Itilde ; B 11 0 323 854 ; +C -1 ; WX 278 ; N itilde ; B -17 0 296 662 ; +C -1 ; WX 333 ; N Imacron ; B 11 0 323 799 ; +C -1 ; WX 278 ; N imacron ; B -21 0 291 609 ; +C -1 ; WX 333 ; N Ibreve ; B 25 0 309 864 ; +C -1 ; WX 278 ; N ibreve ; B -1 0 278 663 ; +C -1 ; WX 333 ; N Iogonek ; B 25 -177 333 662 ; +C -1 ; WX 278 ; N iogonek ; B 29 -177 317 694 ; +C -1 ; WX 389 ; N Jcircumflex ; B 21 -15 383 890 ; +C -1 ; WX 278 ; N jcircumflex ; B -77 -216 276 676 ; +C -1 ; WX 722 ; N Kcedilla ; B 17 -191 730 662 ; +C -1 ; WX 500 ; N kcedilla ; B 8 -191 506 694 ; +C -1 ; WX 500 ; N kgreenlandic ; B 8 0 506 447 ; +C -1 ; WX 611 ; N Lcedilla ; B 20 -191 589 662 ; +C -1 ; WX 278 ; N lcedilla ; B 30 -191 257 694 ; +C -1 ; WX 722 ; N Ncedilla ; B -13 -191 708 662 ; +C -1 ; WX 500 ; N ncedilla ; B 6 -191 496 460 ; +C -1 ; WX 702 ; N Eng ; B 19 -15 656 677 ; +C -1 ; WX 495 ; N eng ; B 6 -216 427 460 ; +C -1 ; WX 722 ; N Omacron ; B 35 -15 684 799 ; +C -1 ; WX 500 ; N omacron ; B 34 -14 465 609 ; +C -1 ; WX 722 ; N Obreve ; B 35 -15 684 864 ; +C -1 ; WX 500 ; N obreve ; B 34 -14 465 663 ; +C -1 ; WX 667 ; N Rcedilla ; B 17 -191 676 662 ; +C -1 ; WX 333 ; N rcedilla ; B 6 -191 339 460 ; +C -1 ; WX 556 ; N Scircumflex ; B 63 -15 502 890 ; +C -1 ; WX 389 ; N scircumflex ; B 49 -14 354 676 ; +C -1 ; WX 611 ; N Tbar ; B 29 0 584 662 ; +C -1 ; WX 278 ; N tbar ; B 8 -7 277 594 ; +C -1 ; WX 722 ; N Utilde ; B 5 -16 711 856 ; +C -1 ; WX 500 ; N utilde ; B 1 -14 499 662 ; +C -1 ; WX 722 ; N Umacron ; B 6 -16 712 799 ; +C -1 ; WX 500 ; N umacron ; B 1 -14 499 609 ; +C -1 ; WX 722 ; N Ubreve ; B 6 -16 712 864 ; +C -1 ; WX 500 ; N ubreve ; B 1 -14 499 663 ; +C -1 ; WX 722 ; N Uogonek ; B 5 -177 711 662 ; +C -1 ; WX 500 ; N uogonek ; B 1 -177 544 447 ; +C -1 ; WX 944 ; N Wcircumflex ; B 13 -15 936 890 ; +C -1 ; WX 722 ; N wcircumflex ; B 6 -14 713 676 ; +C -1 ; WX 722 ; N Ycircumflex ; B 9 0 708 890 ; +C -1 ; WX 500 ; N ycircumflex ; B 6 -216 494 676 ; +C -1 ; WX 278 ; N longs ; B 11 0 404 693 ; +C -1 ; WX 722 ; N Aringacute ; B 8 0 711 1007 ; +C -1 ; WX 444 ; N aringacute ; B 36 -9 442 896 ; +C -1 ; WX 889 ; N AEacute ; B -12 0 861 896 ; +C -1 ; WX 667 ; N aeacute ; B 36 -14 637 679 ; +C -1 ; WX 722 ; N Oslashacute ; B 36 -23 684 896 ; +C -1 ; WX 500 ; N oslashacute ; B 19 -33 481 679 ; +C -1 ; WX 278 ; N anoteleia ; B 87 353 195 461 ; +C -1 ; WX 944 ; N Wgrave ; B 13 -15 936 896 ; +C -1 ; WX 722 ; N wgrave ; B 6 -14 713 679 ; +C -1 ; WX 944 ; N Wacute ; B 13 -15 936 896 ; +C -1 ; WX 722 ; N wacute ; B 6 -14 713 679 ; +C -1 ; WX 944 ; N Wdieresis ; B 13 -15 936 834 ; +C -1 ; WX 722 ; N wdieresis ; B 6 -14 713 653 ; +C -1 ; WX 722 ; N Ygrave ; B 9 0 708 896 ; +C -1 ; WX 500 ; N ygrave ; B 6 -216 494 679 ; +C -1 ; WX 333 ; N quotereversed ; B 90 424 239 677 ; +C -1 ; WX 333 ; N radicalex ; B -18 546 352 609 ; +C -1 ; WX 500 ; N afii08941 ; B 30 -12 477 676 ; +C -1 ; WX 600 ; N estimated ; B 44 -17 561 535 ; +C -1 ; WX 750 ; N oneeighth ; B 65 -26 719 676 ; +C -1 ; WX 750 ; N threeeighths ; B 21 -26 719 676 ; +C -1 ; WX 750 ; N fiveeighths ; B 24 -26 719 676 ; +C -1 ; WX 750 ; N seveneighths ; B 18 -26 719 676 ; +C -1 ; WX 333 ; N commaaccent ; B 95 -227 211 -43 ; +C -1 ; WX 333 ; N undercommaaccent ; B 91 -191 242 -29 ; +C -1 ; WX 333 ; N tonos ; B 115 510 276 679 ; +C -1 ; WX 333 ; N dieresistonos ; B -11 510 344 679 ; +C -1 ; WX 722 ; N Alphatonos ; B 8 0 711 679 ; +C -1 ; WX 694 ; N Epsilontonos ; B -80 0 670 679 ; +C -1 ; WX 808 ; N Etatonos ; B -80 0 788 679 ; +C -1 ; WX 411 ; N Iotatonos ; B -80 0 387 679 ; +C -1 ; WX 722 ; N Omicrontonos ; B -36 -15 684 679 ; +C -1 ; WX 816 ; N Upsilontonos ; B -80 0 802 679 ; +C -1 ; WX 743 ; N Omegatonos ; B -38 0 714 679 ; +C -1 ; WX 269 ; N iotadieresistonos ; B -39 -14 316 679 ; +C -1 ; WX 722 ; N Alpha ; B 8 0 711 677 ; +C -1 ; WX 667 ; N Beta ; B 17 0 612 662 ; +C -1 ; WX 643 ; N Delta ; B 24 0 618 677 ; +C -1 ; WX 611 ; N Epsilon ; B 21 0 588 662 ; +C -1 ; WX 611 ; N Zeta ; B 13 0 583 662 ; +C -1 ; WX 722 ; N Eta ; B 17 0 702 662 ; +C -1 ; WX 333 ; N Iota ; B 25 0 309 662 ; +C -1 ; WX 722 ; N Kappa ; B 17 0 730 662 ; +C -1 ; WX 725 ; N Lambda ; B 14 0 715 677 ; +C -1 ; WX 889 ; N Mu ; B 17 0 868 662 ; +C -1 ; WX 722 ; N Nu ; B -13 -11 708 662 ; +C -1 ; WX 643 ; N Xi ; B 39 0 604 662 ; +C -1 ; WX 722 ; N Omicron ; B 35 -15 684 677 ; +C -1 ; WX 722 ; N Pi ; B 18 0 704 662 ; +C -1 ; WX 556 ; N Rho ; B 17 0 521 662 ; +C -1 ; WX 582 ; N Sigma ; B 16 0 556 662 ; +C -1 ; WX 611 ; N Tau ; B 30 0 586 662 ; +C -1 ; WX 722 ; N Upsilon ; B 9 0 708 662 ; +C -1 ; WX 722 ; N Chi ; B 7 0 710 662 ; +C -1 ; WX 738 ; N Psi ; B 12 0 727 670 ; +C -1 ; WX 743 ; N Omega ; B 29 0 714 677 ; +C -1 ; WX 333 ; N Iotadieresis ; B 25 0 309 834 ; +C -1 ; WX 722 ; N Upsilondieresis ; B 9 0 708 834 ; +C -1 ; WX 524 ; N alphatonos ; B 42 -14 517 679 ; +C -1 ; WX 420 ; N epsilontonos ; B 35 -14 403 679 ; +C -1 ; WX 523 ; N etatonos ; B 5 -214 470 679 ; +C -1 ; WX 269 ; N iotatonos ; B 18 -14 273 679 ; +C -1 ; WX 495 ; N upsilondieresistonos ; B -3 -14 457 679 ; +C -1 ; WX 509 ; N beta ; B 54 -214 476 693 ; +C -1 ; WX 442 ; N gamma ; B 0 -216 433 454 ; +C -1 ; WX 414 ; N zeta ; B 34 -216 406 691 ; +C -1 ; WX 523 ; N eta ; B 5 -214 470 460 ; +C -1 ; WX 479 ; N theta ; B 40 -14 440 693 ; +C -1 ; WX 269 ; N iota ; B 18 -14 273 460 ; +C -1 ; WX 504 ; N kappa ; B 10 0 509 460 ; +C -1 ; WX 485 ; N lambda ; B 12 -7 490 693 ; +C -1 ; WX 536 ; N mu ; B 57 -216 536 447 ; +C -1 ; WX 452 ; N nu ; B -22 -14 435 460 ; +C -1 ; WX 446 ; N xi ; B 34 -216 437 693 ; +C -1 ; WX 500 ; N omicron ; B 34 -14 465 460 ; +C -1 ; WX 499 ; N rho ; B 43 -214 465 460 ; +C -1 ; WX 396 ; N sigma1 ; B 34 -216 382 460 ; +C -1 ; WX 495 ; N upsilon ; B -3 -14 457 460 ; +C -1 ; WX 444 ; N chi ; B 12 -216 474 454 ; +C -1 ; WX 626 ; N psi ; B 14 -214 612 454 ; +C -1 ; WX 658 ; N omega ; B 37 -14 621 460 ; +C -1 ; WX 269 ; N iotadieresis ; B -5 -14 273 616 ; +C -1 ; WX 495 ; N upsilondieresis ; B -3 -14 457 616 ; +C -1 ; WX 500 ; N omicrontonos ; B 34 -14 465 679 ; +C -1 ; WX 495 ; N upsilontonos ; B -3 -14 457 679 ; +C -1 ; WX 658 ; N omegatonos ; B 37 -14 621 679 ; +C -1 ; WX 611 ; N afii10023 ; B 21 0 588 834 ; +C -1 ; WX 752 ; N afii10051 ; B 27 -8 715 662 ; +C -1 ; WX 660 ; N afii10053 ; B 37 -15 631 677 ; +C -1 ; WX 556 ; N afii10054 ; B 63 -15 502 677 ; +C -1 ; WX 333 ; N afii10055 ; B 25 0 309 662 ; +C -1 ; WX 333 ; N afii10056 ; B 25 0 309 834 ; +C -1 ; WX 389 ; N afii10057 ; B 21 -15 383 662 ; +C -1 ; WX 872 ; N afii10058 ; B 6 -8 838 662 ; +C -1 ; WX 872 ; N afii10059 ; B 19 0 839 662 ; +C -1 ; WX 741 ; N afii10060 ; B 26 0 729 662 ; +C -1 ; WX 708 ; N afii10062 ; B 13 -15 692 881 ; +C -1 ; WX 722 ; N afii10017 ; B 8 0 711 677 ; +C -1 ; WX 574 ; N afii10018 ; B 18 0 541 662 ; +C -1 ; WX 667 ; N afii10019 ; B 17 0 612 662 ; +C -1 ; WX 578 ; N afii10020 ; B 18 0 552 662 ; +C -1 ; WX 682 ; N afii10021 ; B 13 -190 664 662 ; +C -1 ; WX 611 ; N afii10022 ; B 21 0 588 662 ; +C -1 ; WX 896 ; N afii10024 ; B 9 0 887 670 ; +C -1 ; WX 501 ; N afii10025 ; B 21 -15 459 677 ; +C -1 ; WX 722 ; N afii10026 ; B 18 0 704 662 ; +C -1 ; WX 722 ; N afii10027 ; B 18 0 704 881 ; +C -1 ; WX 667 ; N afii10028 ; B 18 0 664 670 ; +C -1 ; WX 678 ; N afii10029 ; B 9 -8 660 662 ; +C -1 ; WX 889 ; N afii10030 ; B 17 0 868 662 ; +C -1 ; WX 722 ; N afii10031 ; B 17 0 702 662 ; +C -1 ; WX 722 ; N afii10032 ; B 35 -15 684 677 ; +C -1 ; WX 722 ; N afii10033 ; B 18 0 704 662 ; +C -1 ; WX 556 ; N afii10034 ; B 17 0 521 662 ; +C -1 ; WX 667 ; N afii10035 ; B 36 -15 632 677 ; +C -1 ; WX 611 ; N afii10036 ; B 30 0 586 662 ; +C -1 ; WX 708 ; N afii10037 ; B 13 -15 692 662 ; +C -1 ; WX 790 ; N afii10038 ; B 37 0 753 662 ; +C -1 ; WX 722 ; N afii10039 ; B 7 0 710 662 ; +C -1 ; WX 722 ; N afii10040 ; B 18 -190 704 662 ; +C -1 ; WX 650 ; N afii10041 ; B -3 0 632 662 ; +C -1 ; WX 1009 ; N afii10042 ; B 28 0 981 662 ; +C -1 ; WX 1009 ; N afii10043 ; B 28 -190 981 662 ; +C -1 ; WX 706 ; N afii10044 ; B 26 0 673 662 ; +C -1 ; WX 872 ; N afii10045 ; B 18 0 853 662 ; +C -1 ; WX 574 ; N afii10046 ; B 18 0 541 662 ; +C -1 ; WX 660 ; N afii10047 ; B 29 -15 624 677 ; +C -1 ; WX 1028 ; N afii10048 ; B 19 -15 991 677 ; +C -1 ; WX 667 ; N afii10049 ; B -9 0 650 662 ; +C -1 ; WX 444 ; N afii10065 ; B 36 -9 442 460 ; +C -1 ; WX 509 ; N afii10066 ; B 38 -14 482 694 ; +C -1 ; WX 472 ; N afii10067 ; B 23 0 438 447 ; +C -1 ; WX 410 ; N afii10068 ; B 15 0 404 447 ; +C -1 ; WX 509 ; N afii10069 ; B 13 -124 487 447 ; +C -1 ; WX 444 ; N afii10070 ; B 37 -14 416 461 ; +C -1 ; WX 691 ; N afii10072 ; B 11 0 680 453 ; +C -1 ; WX 395 ; N afii10073 ; B 12 -14 363 460 ; +C -1 ; WX 535 ; N afii10074 ; B 22 0 513 447 ; +C -1 ; WX 535 ; N afii10075 ; B 22 0 513 665 ; +C -1 ; WX 486 ; N afii10076 ; B 22 0 480 453 ; +C -1 ; WX 499 ; N afii10077 ; B 6 -8 477 447 ; +C -1 ; WX 633 ; N afii10078 ; B 22 0 611 447 ; +C -1 ; WX 535 ; N afii10079 ; B 22 0 513 447 ; +C -1 ; WX 500 ; N afii10080 ; B 34 -14 465 460 ; +C -1 ; WX 535 ; N afii10081 ; B 22 0 513 447 ; +C -1 ; WX 500 ; N afii10082 ; B -3 -214 466 460 ; +C -1 ; WX 444 ; N afii10083 ; B 34 -14 411 460 ; +C -1 ; WX 437 ; N afii10084 ; B 6 0 431 447 ; +C -1 ; WX 500 ; N afii10085 ; B 6 -216 494 447 ; +C -1 ; WX 648 ; N afii10086 ; B 42 -214 605 694 ; +C -1 ; WX 500 ; N afii10087 ; B 13 0 488 447 ; +C -1 ; WX 535 ; N afii10088 ; B 22 -124 513 447 ; +C -1 ; WX 503 ; N afii10089 ; B 15 0 481 447 ; +C -1 ; WX 770 ; N afii10090 ; B 22 0 748 447 ; +C -1 ; WX 770 ; N afii10091 ; B 22 -124 748 447 ; +C -1 ; WX 517 ; N afii10092 ; B 6 0 487 447 ; +C -1 ; WX 672 ; N afii10093 ; B 22 0 649 447 ; +C -1 ; WX 456 ; N afii10094 ; B 22 0 426 447 ; +C -1 ; WX 429 ; N afii10095 ; B 13 -14 395 460 ; +C -1 ; WX 747 ; N afii10096 ; B 22 -14 713 460 ; +C -1 ; WX 460 ; N afii10097 ; B 0 0 438 447 ; +C -1 ; WX 444 ; N afii10071 ; B 37 -14 416 652 ; +C -1 ; WX 483 ; N afii10099 ; B 8 -216 426 694 ; +C -1 ; WX 410 ; N afii10100 ; B 15 0 404 679 ; +C -1 ; WX 429 ; N afii10101 ; B 34 -14 416 460 ; +C -1 ; WX 389 ; N afii10102 ; B 49 -14 354 460 ; +C -1 ; WX 278 ; N afii10103 ; B 29 0 253 694 ; +C -1 ; WX 278 ; N afii10104 ; B 1 0 279 653 ; +C -1 ; WX 278 ; N afii10105 ; B -77 -216 195 695 ; +C -1 ; WX 727 ; N afii10106 ; B 6 -8 697 447 ; +C -1 ; WX 723 ; N afii10107 ; B 22 0 692 447 ; +C -1 ; WX 500 ; N afii10108 ; B 6 0 494 694 ; +C -1 ; WX 500 ; N afii10110 ; B 6 -216 494 665 ; +C -1 ; WX 535 ; N afii10193 ; B 22 -124 513 447 ; +C -1 ; WX 450 ; N afii10050 ; B 18 0 432 782 ; +C -1 ; WX 351 ; N afii10098 ; B 15 0 345 530 ; +C -1 ; WX 1000 ; N afii00208 ; B 32 224 969 294 ; +C -1 ; WX 954 ; N afii61352 ; B 8 -15 920 669 ; +C -1 ; WX 505 ; N pi ; B 6 -14 486 447 ; +C -1 ; WX 333 ; N sheva ; B 125 -215 208 -25 ; +C -1 ; WX 333 ; N hatafsegol ; B 14 -215 319 -24 ; +C -1 ; WX 333 ; N hatafpatah ; B 24 -215 309 -24 ; +C -1 ; WX 333 ; N hatafqamats ; B 9 -216 325 -24 ; +C -1 ; WX 333 ; N hiriq ; B 126 -153 207 -72 ; +C -1 ; WX 333 ; N tsere ; B 70 -153 263 -72 ; +C -1 ; WX 333 ; N segol ; B 70 -215 263 -24 ; +C -1 ; WX 333 ; N patah ; B 70 -130 263 -80 ; +C -1 ; WX 333 ; N qamats ; B 70 -215 263 -52 ; +C -1 ; WX 333 ; N holam ; B 126 587 207 668 ; +C -1 ; WX 333 ; N qubuts ; B 14 -215 319 -24 ; +C -1 ; WX 333 ; N dagesh ; B 126 211 207 292 ; +C -1 ; WX 333 ; N meteg ; B 141 -215 191 -53 ; +C -1 ; WX 356 ; N maqaf ; B 42 408 314 516 ; +C -1 ; WX 333 ; N rafe ; B 70 596 263 646 ; +C -1 ; WX 291 ; N paseq ; B 109 -49 181 564 ; +C -1 ; WX 343 ; N shindot ; B 335 587 417 668 ; +C -1 ; WX 343 ; N sindot ; B -73 587 8 668 ; +C -1 ; WX 278 ; N sofpasuq ; B 86 -14 195 525 ; +C -1 ; WX 481 ; N alef ; B 46 -9 447 554 ; +C -1 ; WX 455 ; N bet ; B 25 0 434 550 ; +C -1 ; WX 335 ; N gimel ; B 16 -6 316 554 ; +C -1 ; WX 419 ; N dalet ; B 33 -12 386 550 ; +C -1 ; WX 471 ; N he ; B 38 -13 428 550 ; +C -1 ; WX 279 ; N vav ; B 33 -9 222 554 ; +C -1 ; WX 286 ; N zayin ; B 38 -12 253 554 ; +C -1 ; WX 477 ; N het ; B 43 -12 434 550 ; +C -1 ; WX 476 ; N tet ; B 33 0 427 554 ; +C -1 ; WX 267 ; N yod ; B 33 233 223 554 ; +C -1 ; WX 452 ; N finalkaf ; B 33 -173 403 550 ; +C -1 ; WX 433 ; N kaf ; B 25 0 387 550 ; +C -1 ; WX 432 ; N lamed ; B 7 -11 389 746 ; +C -1 ; WX 507 ; N finalmem ; B 49 0 453 550 ; +C -1 ; WX 485 ; N mem ; B 38 0 439 554 ; +C -1 ; WX 274 ; N finalnun ; B 33 -173 231 554 ; +C -1 ; WX 305 ; N nun ; B 16 0 262 554 ; +C -1 ; WX 475 ; N samekh ; B 46 -11 429 550 ; +C -1 ; WX 454 ; N ayin ; B 33 -14 421 554 ; +C -1 ; WX 454 ; N finalpe ; B 33 -173 406 550 ; +C -1 ; WX 440 ; N pe ; B 43 0 395 550 ; +C -1 ; WX 482 ; N finaltsadi ; B 33 -173 450 554 ; +C -1 ; WX 460 ; N tsadi ; B 30 0 422 554 ; +C -1 ; WX 474 ; N qof ; B 51 -173 427 550 ; +C -1 ; WX 469 ; N resh ; B 33 -9 414 550 ; +C -1 ; WX 610 ; N shin ; B 33 0 578 554 ; +C -1 ; WX 500 ; N tav ; B 16 -8 446 550 ; +C -1 ; WX 557 ; N doublevav ; B 33 -9 500 554 ; +C -1 ; WX 545 ; N vavyod ; B 33 -9 488 554 ; +C -1 ; WX 533 ; N doubleyod ; B 33 233 490 554 ; +C -1 ; WX 209 ; N geresh ; B 52 304 162 535 ; +C -1 ; WX 372 ; N gershayim ; B 52 304 324 535 ; +C -1 ; WX 776 ; N newsheqelsign ; B 73 0 704 516 ; +C -1 ; WX 279 ; N vavshindot ; B -48 -9 222 668 ; +C -1 ; WX 452 ; N finalkafsheva ; B 33 -173 403 550 ; +C -1 ; WX 452 ; N finalkafqamats ; B 33 -173 403 550 ; +C -1 ; WX 432 ; N lamedholam ; B -81 -11 389 746 ; +C -1 ; WX 432 ; N lamedholamdagesh ; B -81 -11 389 746 ; +C -1 ; WX 454 ; N altayin ; B 25 0 421 554 ; +C -1 ; WX 610 ; N shinshindot ; B 33 0 578 668 ; +C -1 ; WX 610 ; N shinsindot ; B 33 0 578 668 ; +C -1 ; WX 610 ; N shindageshshindot ; B 33 0 578 668 ; +C -1 ; WX 610 ; N shindageshsindot ; B 33 0 578 668 ; +C -1 ; WX 481 ; N alefpatah ; B 46 -130 447 554 ; +C -1 ; WX 481 ; N alefqamats ; B 46 -215 447 554 ; +C -1 ; WX 481 ; N alefmapiq ; B 46 -9 447 554 ; +C -1 ; WX 455 ; N betdagesh ; B 25 0 434 550 ; +C -1 ; WX 335 ; N gimeldagesh ; B 16 -6 316 554 ; +C -1 ; WX 419 ; N daletdagesh ; B 33 -12 386 550 ; +C -1 ; WX 471 ; N hedagesh ; B 38 -13 428 550 ; +C -1 ; WX 279 ; N vavdagesh ; B 33 -9 222 554 ; +C -1 ; WX 309 ; N zayindagesh ; B 6 -12 276 554 ; +C -1 ; WX 476 ; N tetdagesh ; B 33 0 427 554 ; +C -1 ; WX 267 ; N yoddagesh ; B 33 233 223 554 ; +C -1 ; WX 452 ; N finalkafdagesh ; B 33 -173 403 550 ; +C -1 ; WX 433 ; N kafdagesh ; B 25 0 387 550 ; +C -1 ; WX 432 ; N lameddagesh ; B 7 -11 389 746 ; +C -1 ; WX 485 ; N memdagesh ; B 38 0 439 554 ; +C -1 ; WX 305 ; N nundagesh ; B 16 0 262 554 ; +C -1 ; WX 475 ; N samekhdagesh ; B 46 -11 429 550 ; +C -1 ; WX 454 ; N finalpedagesh ; B 33 -173 406 550 ; +C -1 ; WX 440 ; N pedagesh ; B 43 0 395 550 ; +C -1 ; WX 460 ; N tsadidagesh ; B 30 0 422 554 ; +C -1 ; WX 474 ; N qofdagesh ; B 51 -173 427 550 ; +C -1 ; WX 469 ; N reshdagesh ; B 33 -9 414 550 ; +C -1 ; WX 610 ; N shindagesh ; B 33 0 578 554 ; +C -1 ; WX 500 ; N tavdages ; B 16 -8 446 550 ; +C -1 ; WX 279 ; N vavholam ; B 33 -9 222 668 ; +C -1 ; WX 455 ; N betrafe ; B 25 0 434 646 ; +C -1 ; WX 433 ; N kafrafe ; B 25 0 387 646 ; +C -1 ; WX 440 ; N perafe ; B 43 0 395 646 ; +C -1 ; WX 502 ; N aleflamed ; B 7 -9 468 746 ; +C -1 ; WX 0 ; N zerowidthnonjoiner ; B -18 -134 18 629 ; +C -1 ; WX 0 ; N zerowidthjoiner ; B -107 -134 107 690 ; +C -1 ; WX 0 ; N lefttorightmark ; B -18 -134 210 690 ; +C -1 ; WX 0 ; N righttoleftmark ; B -210 -134 17 690 ; +C -1 ; WX 319 ; N afii57388 ; B 83 137 241 443 ; +C -1 ; WX 319 ; N afii57403 ; B 78 136 235 609 ; +C -1 ; WX 356 ; N afii57407 ; B 33 137 326 711 ; +C -1 ; WX 413 ; N afii57409 ; B 59 72 363 400 ; +C -1 ; WX 207 ; N afii57440 ; B -34 143 207 228 ; +C -1 ; WX 201 ; N afii57451 ; B 34 605 201 780 ; +C -1 ; WX 237 ; N afii57452 ; B 34 605 237 794 ; +C -1 ; WX 201 ; N afii57453 ; B 34 -130 201 44 ; +C -1 ; WX 201 ; N afii57454 ; B 34 673 201 774 ; +C -1 ; WX 209 ; N afii57455 ; B 35 605 209 817 ; +C -1 ; WX 201 ; N afii57456 ; B 34 -21 201 80 ; +C -1 ; WX 211 ; N afii57457 ; B 34 605 211 762 ; +C -1 ; WX 165 ; N afii57458 ; B 34 605 165 756 ; +C -1 ; WX 526 ; N afii57392 ; B 186 219 344 452 ; +C -1 ; WX 526 ; N afii57393 ; B 147 143 327 716 ; +C -1 ; WX 526 ; N afii57394 ; B 89 143 391 723 ; +C -1 ; WX 526 ; N afii57395 ; B 63 143 471 723 ; +C -1 ; WX 526 ; N afii57396 ; B 146 143 397 713 ; +C -1 ; WX 526 ; N afii57397 ; B 93 247 438 622 ; +C -1 ; WX 526 ; N afii57398 ; B 85 156 410 710 ; +C -1 ; WX 526 ; N afii57399 ; B 63 143 459 710 ; +C -1 ; WX 526 ; N afii57400 ; B 75 149 472 716 ; +C -1 ; WX 526 ; N afii57401 ; B 107 143 413 725 ; +C -1 ; WX 526 ; N afii57381 ; B 65 84 463 777 ; +C -1 ; WX 319 ; N afii57461 ; B 94 23 230 267 ; +C -1 ; WX 526 ; N afii63167 ; B 87 403 424 744 ; +C -1 ; WX 750 ; N afii57459 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57543 ; B 125 0 625 625 ; +C -1 ; WX 282 ; N afii57534 ; B 26 130 262 430 ; +C -1 ; WX 750 ; N afii57494 ; B 125 0 625 625 ; +C -1 ; WX 526 ; N afii62843 ; B 77 147 455 720 ; +C -1 ; WX 526 ; N afii62844 ; B 74 159 441 708 ; +C -1 ; WX 526 ; N afii62845 ; B 99 147 435 717 ; +C -1 ; WX 750 ; N afii64240 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii64241 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63954 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57382 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii64242 ; B 125 0 625 625 ; +C -1 ; WX 211 ; N afii62881 ; B 34 605 211 917 ; +C -1 ; WX 750 ; N afii57504 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57369 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57370 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57371 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57372 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57373 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57374 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57375 ; B 125 0 625 625 ; +C -1 ; WX 638 ; N afii57391 ; B -34 143 638 228 ; +C -1 ; WX 750 ; N afii57471 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57460 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii52258 ; B 125 0 625 625 ; +C -1 ; WX 713 ; N afii57506 ; B 28 -175 713 469 ; +C -1 ; WX 713 ; N afii62958 ; B 28 -175 713 469 ; +C -1 ; WX 244 ; N afii62956 ; B -34 -175 244 456 ; +C -1 ; WX 244 ; N afii52957 ; B -34 -175 244 456 ; +C -1 ; WX 750 ; N afii57505 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62889 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62887 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62888 ; B 125 0 625 625 ; +C -1 ; WX 563 ; N afii57507 ; B 26 -212 516 432 ; +C -1 ; WX 526 ; N afii62961 ; B 26 -212 526 426 ; +C -1 ; WX 530 ; N afii62959 ; B -34 -175 530 427 ; +C -1 ; WX 530 ; N afii62960 ; B -34 -175 530 427 ; +C -1 ; WX 489 ; N afii57508 ; B 36 -91 489 723 ; +C -1 ; WX 489 ; N afii62962 ; B 36 -91 489 723 ; +C -1 ; WX 812 ; N afii57567 ; B 10 143 812 734 ; +C -1 ; WX 933 ; N afii62964 ; B 10 143 933 734 ; +C -1 ; WX 394 ; N afii52305 ; B -34 143 394 734 ; +C -1 ; WX 515 ; N afii52306 ; B -34 143 515 734 ; +C -1 ; WX 812 ; N afii57509 ; B 10 143 812 867 ; +C -1 ; WX 933 ; N afii62967 ; B 10 143 933 867 ; +C -1 ; WX 394 ; N afii62965 ; B -34 143 394 876 ; +C -1 ; WX 515 ; N afii62966 ; B -34 143 515 876 ; +C -1 ; WX 638 ; N afii57555 ; B 24 -43 606 462 ; +C -1 ; WX 588 ; N afii52364 ; B 18 -110 588 252 ; +C -1 ; WX 750 ; N afii63753 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63754 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63759 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63763 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63795 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62891 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63808 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62938 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63810 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62942 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62947 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63813 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63823 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63824 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63833 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63844 ; B 125 0 625 625 ; +C -1 ; WX 226 ; N afii62882 ; B 23 605 226 933 ; +C -1 ; WX 211 ; N afii62883 ; B 34 605 211 905 ; +C -1 ; WX 211 ; N afii62884 ; B 34 605 211 840 ; +C -1 ; WX 211 ; N afii62885 ; B 31 606 211 897 ; +C -1 ; WX 211 ; N afii62886 ; B 34 605 211 853 ; +C -1 ; WX 750 ; N afii63846 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63849 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N uni202A ; B 125 0 625 625 ; +C -1 ; WX 750 ; N uni202B ; B 125 0 625 625 ; +C -1 ; WX 750 ; N uni202D ; B 125 0 625 625 ; +C -1 ; WX 750 ; N uni202E ; B 125 0 625 625 ; +C -1 ; WX 750 ; N uni202C ; B 125 0 625 625 ; +C -1 ; WX 750 ; N uni206E ; B 125 0 625 625 ; +C -1 ; WX 750 ; N _b_852 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N uni206A ; B 125 0 625 625 ; +C -1 ; WX 750 ; N uni206B ; B 125 0 625 625 ; +C -1 ; WX 750 ; N _b_855 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N uni206D ; B 125 0 625 625 ; +C -1 ; WX 750 ; N uniF00A ; B 125 0 625 625 ; +C -1 ; WX 750 ; N uniF00B ; B 125 0 625 625 ; +C -1 ; WX 750 ; N uniF00C ; B 125 0 625 625 ; +C -1 ; WX 750 ; N uniF00D ; B 125 0 625 625 ; +C -1 ; WX 750 ; N uniF00E ; B 125 0 625 625 ; +C -1 ; WX 1000 ; N uniFFFC ; B 0 0 1000 719 ; +C -1 ; WX 750 ; N afii63904 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63905 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63906 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63908 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63910 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63912 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62927 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63941 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62939 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63943 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62943 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62946 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63946 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62951 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63948 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62953 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63950 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63951 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63952 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63953 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63956 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63958 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63959 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63960 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63961 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii64046 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii64058 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii64059 ; B 125 0 625 625 ; +C -1 ; WX 319 ; N afii64060 ; B 62 -209 273 785 ; +C -1 ; WX 319 ; N afii64061 ; B 45 -209 257 785 ; +C -1 ; WX 750 ; N afii62945 ; B 125 0 625 625 ; +C -1 ; WX 616 ; N afii64184 ; B 10 143 603 766 ; +C -1 ; WX 413 ; N afii52399 ; B 59 72 363 400 ; +C -1 ; WX 207 ; N afii52400 ; B 7 130 206 827 ; +C -1 ; WX 229 ; N afii62753 ; B -18 143 229 827 ; +C -1 ; WX 207 ; N afii57411 ; B 42 130 179 880 ; +C -1 ; WX 229 ; N afii62754 ; B 8 143 229 880 ; +C -1 ; WX 432 ; N afii57412 ; B 24 -77 432 555 ; +C -1 ; WX 432 ; N afii62755 ; B 24 -77 432 555 ; +C -1 ; WX 207 ; N afii57413 ; B 22 -94 165 740 ; +C -1 ; WX 229 ; N afii62756 ; B 9 -94 229 740 ; +C -1 ; WX 638 ; N afii57414 ; B 24 -43 606 555 ; +C -1 ; WX 588 ; N afii62759 ; B 18 -110 588 491 ; +C -1 ; WX 244 ; N afii62757 ; B -34 143 244 668 ; +C -1 ; WX 244 ; N afii62758 ; B -34 143 244 668 ; +C -1 ; WX 207 ; N afii57415 ; B 72 130 165 740 ; +C -1 ; WX 229 ; N afii62760 ; B 9 143 229 740 ; +C -1 ; WX 713 ; N afii57416 ; B 28 -46 713 469 ; +C -1 ; WX 713 ; N afii62763 ; B 28 -46 713 469 ; +C -1 ; WX 244 ; N afii62761 ; B -34 -46 244 456 ; +C -1 ; WX 244 ; N afii62762 ; B -34 -46 244 456 ; +C -1 ; WX 282 ; N afii57417 ; B 0 130 271 641 ; +C -1 ; WX 375 ; N afii62764 ; B -4 143 375 768 ; +C -1 ; WX 713 ; N afii57418 ; B 28 143 713 628 ; +C -1 ; WX 713 ; N afii62767 ; B 28 143 713 628 ; +C -1 ; WX 244 ; N afii62765 ; B -34 143 244 667 ; +C -1 ; WX 244 ; N afii62766 ; B -34 143 244 667 ; +C -1 ; WX 713 ; N afii57419 ; B 28 143 713 715 ; +C -1 ; WX 713 ; N afii62770 ; B 28 143 713 715 ; +C -1 ; WX 244 ; N afii62768 ; B -34 143 244 754 ; +C -1 ; WX 244 ; N afii62769 ; B -34 143 244 754 ; +C -1 ; WX 563 ; N afii57420 ; B 26 -212 516 432 ; +C -1 ; WX 526 ; N afii62773 ; B 26 -212 526 426 ; +C -1 ; WX 530 ; N afii62771 ; B -34 -33 530 427 ; +C -1 ; WX 530 ; N afii62772 ; B -34 -33 530 427 ; +C -1 ; WX 563 ; N afii57421 ; B 26 -212 516 432 ; +C -1 ; WX 526 ; N afii62776 ; B 26 -212 526 426 ; +C -1 ; WX 530 ; N afii62774 ; B -34 143 530 427 ; +C -1 ; WX 530 ; N afii62775 ; B -34 143 530 427 ; +C -1 ; WX 563 ; N afii57422 ; B 26 -212 516 639 ; +C -1 ; WX 526 ; N afii62779 ; B 26 -212 526 639 ; +C -1 ; WX 530 ; N afii62777 ; B -34 143 530 639 ; +C -1 ; WX 530 ; N afii62778 ; B -34 143 530 639 ; +C -1 ; WX 337 ; N afii57423 ; B 46 143 337 552 ; +C -1 ; WX 337 ; N afii62780 ; B 46 143 337 552 ; +C -1 ; WX 337 ; N afii57424 ; B 46 143 337 759 ; +C -1 ; WX 337 ; N afii62781 ; B 46 143 337 759 ; +C -1 ; WX 489 ; N afii57425 ; B 36 -91 489 430 ; +C -1 ; WX 489 ; N afii62782 ; B 36 -91 489 430 ; +C -1 ; WX 489 ; N afii57426 ; B 36 -91 489 639 ; +C -1 ; WX 489 ; N afii62783 ; B 36 -91 489 639 ; +C -1 ; WX 821 ; N afii57427 ; B 30 -72 821 417 ; +C -1 ; WX 821 ; N afii62786 ; B 30 -72 821 417 ; +C -1 ; WX 531 ; N afii62784 ; B -34 143 531 401 ; +C -1 ; WX 531 ; N afii62785 ; B -34 143 531 401 ; +C -1 ; WX 821 ; N afii57428 ; B 30 -72 821 715 ; +C -1 ; WX 821 ; N afii62789 ; B 30 -72 821 715 ; +C -1 ; WX 531 ; N afii62787 ; B -34 143 531 715 ; +C -1 ; WX 531 ; N afii62788 ; B -34 143 531 715 ; +C -1 ; WX 1098 ; N afii57429 ; B 30 -72 1098 417 ; +C -1 ; WX 1098 ; N afii62792 ; B 30 -72 1098 417 ; +C -1 ; WX 846 ; N afii62790 ; B -34 143 846 405 ; +C -1 ; WX 846 ; N afii62791 ; B -34 143 846 405 ; +C -1 ; WX 1098 ; N afii57430 ; B 30 -72 1098 590 ; +C -1 ; WX 1098 ; N afii62795 ; B 30 -72 1098 590 ; +C -1 ; WX 846 ; N afii62793 ; B -34 143 846 590 ; +C -1 ; WX 846 ; N afii62794 ; B -34 143 846 590 ; +C -1 ; WX 582 ; N afii57431 ; B -34 143 582 793 ; +C -1 ; WX 582 ; N afii62798 ; B -34 143 582 793 ; +C -1 ; WX 582 ; N afii62796 ; B -34 143 582 793 ; +C -1 ; WX 582 ; N afii62797 ; B -34 143 582 793 ; +C -1 ; WX 582 ; N afii57432 ; B -34 143 582 793 ; +C -1 ; WX 582 ; N afii62801 ; B -34 143 582 793 ; +C -1 ; WX 582 ; N afii62799 ; B -34 143 582 793 ; +C -1 ; WX 582 ; N afii62800 ; B -34 143 582 793 ; +C -1 ; WX 544 ; N afii57433 ; B 21 -212 516 534 ; +C -1 ; WX 450 ; N afii62804 ; B 26 -212 486 431 ; +C -1 ; WX 526 ; N afii62802 ; B -34 143 470 472 ; +C -1 ; WX 394 ; N afii62803 ; B -34 143 394 418 ; +C -1 ; WX 544 ; N afii57434 ; B 21 -212 516 737 ; +C -1 ; WX 450 ; N afii62807 ; B 26 -212 486 639 ; +C -1 ; WX 526 ; N afii62805 ; B -34 143 470 639 ; +C -1 ; WX 394 ; N afii62806 ; B -34 143 394 639 ; +C -1 ; WX 789 ; N afii57441 ; B 19 143 789 681 ; +C -1 ; WX 789 ; N afii62810 ; B 19 143 789 681 ; +C -1 ; WX 268 ; N afii62808 ; B -34 143 268 726 ; +C -1 ; WX 263 ; N afii62809 ; B -34 143 263 707 ; +C -1 ; WX 582 ; N afii57442 ; B 34 -75 582 683 ; +C -1 ; WX 582 ; N afii62813 ; B 34 -75 582 683 ; +C -1 ; WX 268 ; N afii62811 ; B -34 143 268 740 ; +C -1 ; WX 263 ; N afii62812 ; B -34 143 263 727 ; +C -1 ; WX 601 ; N afii57443 ; B 22 143 601 775 ; +C -1 ; WX 601 ; N afii62816 ; B 22 143 601 775 ; +C -1 ; WX 394 ; N afii57410 ; B -34 143 394 734 ; +C -1 ; WX 394 ; N afii62815 ; B -34 143 394 734 ; +C -1 ; WX 506 ; N afii57444 ; B 35 7 506 775 ; +C -1 ; WX 506 ; N afii62819 ; B 35 7 506 775 ; +C -1 ; WX 207 ; N afii62817 ; B -34 143 207 775 ; +C -1 ; WX 207 ; N afii62818 ; B -34 143 207 775 ; +C -1 ; WX 338 ; N afii57445 ; B 17 -212 338 357 ; +C -1 ; WX 338 ; N afii62822 ; B 17 -212 338 357 ; +C -1 ; WX 394 ; N afii62820 ; B -34 143 394 411 ; +C -1 ; WX 394 ; N afii62821 ; B -34 143 394 411 ; +C -1 ; WX 526 ; N afii57446 ; B 34 -72 526 558 ; +C -1 ; WX 526 ; N afii62825 ; B 34 -72 526 558 ; +C -1 ; WX 244 ; N afii62823 ; B -34 143 244 636 ; +C -1 ; WX 244 ; N afii62824 ; B -34 143 244 636 ; +C -1 ; WX 282 ; N afii57447 ; B 26 130 262 430 ; +C -1 ; WX 375 ; N afii62828 ; B -4 143 375 583 ; +C -1 ; WX 450 ; N afii57470 ; B -34 125 385 555 ; +C -1 ; WX 394 ; N afii62827 ; B -34 -62 394 429 ; +C -1 ; WX 432 ; N afii57448 ; B 24 -77 432 385 ; +C -1 ; WX 432 ; N afii62829 ; B 24 -77 432 385 ; +C -1 ; WX 638 ; N afii57449 ; B 24 -43 606 462 ; +C -1 ; WX 588 ; N afii62830 ; B 18 -110 588 252 ; +C -1 ; WX 638 ; N afii57450 ; B 24 -208 606 462 ; +C -1 ; WX 588 ; N afii62833 ; B 18 -212 588 252 ; +C -1 ; WX 244 ; N afii62831 ; B -34 -69 244 456 ; +C -1 ; WX 244 ; N afii62832 ; B -34 -69 244 456 ; +C -1 ; WX 544 ; N afii62834 ; B 31 79 507 827 ; +C -1 ; WX 601 ; N afii62835 ; B 31 118 601 827 ; +C -1 ; WX 544 ; N afii62836 ; B 19 79 507 880 ; +C -1 ; WX 601 ; N afii62837 ; B 23 118 601 880 ; +C -1 ; WX 544 ; N afii62838 ; B 41 -111 507 724 ; +C -1 ; WX 601 ; N afii62839 ; B 32 -111 601 733 ; +C -1 ; WX 544 ; N afii62840 ; B 41 79 507 724 ; +C -1 ; WX 601 ; N afii62841 ; B 32 118 601 733 ; +C -1 ; WX 750 ; N glyph1021 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57543-2 ; B 125 0 625 625 ; +C -1 ; WX 201 ; N afii57454-2 ; B 34 673 201 774 ; +C -1 ; WX 201 ; N afii57451-2 ; B 34 605 201 780 ; +C -1 ; WX 750 ; N glyph1025 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1026 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57471-2 ; B 125 0 625 625 ; +C -1 ; WX 165 ; N afii57458-2 ; B 34 605 165 756 ; +C -1 ; WX 211 ; N afii57457-2 ; B 34 605 211 762 ; +C -1 ; WX 750 ; N afii57494-2 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57459-2 ; B 125 0 625 625 ; +C -1 ; WX 209 ; N afii57455-2 ; B 35 605 209 817 ; +C -1 ; WX 237 ; N afii57452-2 ; B 34 605 237 794 ; +C -1 ; WX 750 ; N glyph1034 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1035 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1036 ; B 125 0 625 625 ; +C -1 ; WX 211 ; N afii62884-2 ; B 34 605 211 840 ; +C -1 ; WX 211 ; N afii62881-2 ; B 34 605 211 917 ; +C -1 ; WX 211 ; N afii62886-2 ; B 34 605 211 853 ; +C -1 ; WX 211 ; N afii62883-2 ; B 34 605 211 905 ; +C -1 ; WX 211 ; N afii62885-2 ; B 31 606 211 897 ; +C -1 ; WX 226 ; N afii62882-2 ; B 23 605 226 933 ; +C -1 ; WX 750 ; N afii57504-2 ; B 125 0 625 625 ; +C -1 ; WX 201 ; N afii57456-2 ; B 34 -21 201 80 ; +C -1 ; WX 201 ; N afii57453-2 ; B 34 -130 201 44 ; +C -1 ; WX 750 ; N glyph1046 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1047 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57543-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57454-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57451-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1051 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1052 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57471-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57458-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57457-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57494-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57459-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57455-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57452-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1060 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1061 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1062 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62884-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62881-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62886-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62883-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62885-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62882-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57504-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57456-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57453-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1072 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1073 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57543-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57454-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57451-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1077 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1078 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57471-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57458-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57457-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57494-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57459-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57455-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57452-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1086 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1087 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1088 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62884-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62881-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62886-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62883-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62885-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62882-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57504-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57456-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57453-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1098 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1099 ; B 125 0 625 625 ; +C -1 ; WX 319 ; N glyph1100 ; B 99 137 223 714 ; +C -1 ; WX 319 ; N glyph1101 ; B 97 137 226 267 ; +C -1 ; WX 319 ; N glyph1102 ; B 97 137 225 542 ; +C -1 ; WX 750 ; N glyph1103 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1104 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1105 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1106 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1107 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1108 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1109 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1110 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1111 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1112 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1113 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1114 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1115 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1116 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1117 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1118 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1119 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1120 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1121 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1122 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1123 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1124 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1125 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1126 ; B 125 0 625 625 ; +C -1 ; WX 125 ; N afii57440-2 ; B -34 143 125 228 ; +C -1 ; WX 1000 ; N afii57440-3 ; B -34 143 1000 228 ; +C -1 ; WX 2000 ; N afii57440-4 ; B -34 143 2000 228 ; +C -1 ; WX 722 ; N Ohorn ; B 69 -15 717 758 ; +C -1 ; WX 529 ; N ohorn ; B 34 -14 536 478 ; +C -1 ; WX 776 ; N Uhorn ; B 5 -16 810 774 ; +C -1 ; WX 542 ; N uhorn ; B 1 -14 544 478 ; +C -1 ; WX 0 ; N glyph1134 ; B -275 818 -142 891 ; +C -1 ; WX 0 ; N glyph1135 ; B -490 818 -306 891 ; +C -1 ; WX 0 ; N glyph1136 ; B -366 728 -205 891 ; +C -1 ; WX 0 ; N uniF006 ; B -218 818 -84 891 ; +C -1 ; WX 0 ; N uniF007 ; B -391 818 -209 891 ; +C -1 ; WX 0 ; N uniF009 ; B -271 728 -111 891 ; +C -1 ; WX 0 ; N combininghookabove ; B -202 728 -64 891 ; +C -1 ; WX 0 ; N uniF010 ; B -229 810 -105 891 ; +C -1 ; WX 0 ; N uniF013 ; B -286 728 -147 891 ; +C -1 ; WX 0 ; N uniF011 ; B -426 810 -302 891 ; +C -1 ; WX 0 ; N uniF01C ; B -309 755 4 884 ; +C -1 ; WX 0 ; N uniF015 ; B -496 814 -214 891 ; +C -1 ; WX 0 ; N combiningtildeaccent ; B -376 726 -63 854 ; +C -1 ; WX 0 ; N glyph1147 ; B -125 728 125 808 ; +C -1 ; WX 0 ; N glyph1148 ; B -124 729 124 799 ; +C -1 ; WX 0 ; N uniF02C ; B -173 -167 -64 -59 ; +C -1 ; WX 513 ; N dongsign ; B 79 140 422 694 ; +C -1 ; WX 750 ; N onethird ; B 66 -27 707 676 ; +C -1 ; WX 750 ; N twothirds ; B 10 -27 707 676 ; +C -1 ; WX 0 ; N uniF008 ; B -195 510 -35 673 ; +C -1 ; WX 0 ; N glyph1154 ; B -271 510 -111 673 ; +C -1 ; WX 0 ; N glyph1155 ; B -255 510 -94 673 ; +C -1 ; WX 0 ; N uniF00F ; B -317 510 -156 673 ; +C -1 ; WX 0 ; N uniF012 ; B -202 510 -64 674 ; +C -1 ; WX 0 ; N uniF014 ; B -284 510 -146 674 ; +C -1 ; WX 0 ; N uniF016 ; B -520 755 -207 884 ; +C -1 ; WX 0 ; N uniF017 ; B -520 755 -207 884 ; +C -1 ; WX 0 ; N uniF018 ; B -568 755 -255 884 ; +C -1 ; WX 0 ; N uniF019 ; B -376 534 -63 662 ; +C -1 ; WX 0 ; N uniF01A ; B -432 534 -119 662 ; +C -1 ; WX 0 ; N uniF01B ; B -466 534 -153 662 ; +C -1 ; WX 0 ; N uniF01E ; B -356 -167 -248 -59 ; +C -1 ; WX 0 ; N uniF01F ; B -412 -167 -304 -59 ; +C -1 ; WX 0 ; N uniF020 ; B -418 -167 -310 -59 ; +C -1 ; WX 0 ; N uniF021 ; B -415 -167 -307 -59 ; +C -1 ; WX 0 ; N uniF022 ; B -467 -167 -358 -59 ; +C -1 ; WX 0 ; N combininggraveaccent ; B -240 728 -80 891 ; +C -1 ; WX 0 ; N combiningacuteaccent ; B -195 728 -35 891 ; +C -1 ; WX 0 ; N uniF01D ; B -304 534 8 662 ; +C -1 ; WX 0 ; N combiningdotbelow ; B -445 -167 -336 -59 ; +C -1 ; WX 0 ; N uniF023 ; B -280 -167 -171 -59 ; +C -1 ; WX 0 ; N uniF029 ; B -215 -167 -107 -59 ; +C -1 ; WX 0 ; N uniF02A ; B -202 -167 -94 -59 ; +C -1 ; WX 0 ; N uniF02B ; B -405 -167 -296 -59 ; +C -1 ; WX 0 ; N uniF024 ; B -265 -167 -157 -59 ; +C -1 ; WX 0 ; N uniF025 ; B -309 -167 -201 -59 ; +C -1 ; WX 0 ; N uniF026 ; B -338 -167 -230 -59 ; +C -1 ; WX 0 ; N uniF027 ; B -301 -167 -193 -59 ; +C -1 ; WX 0 ; N uniF028 ; B -338 -167 -230 -59 ; +C -1 ; WX 0 ; N uniF02D ; B -433 813 -151 891 ; +C -1 ; WX 0 ; N uniF02E ; B -452 755 -139 884 ; +C -1 ; WX 0 ; N uniF02F ; B -496 813 -214 891 ; +C -1 ; WX 0 ; N uniF030 ; B -520 755 -207 884 ; +C -1 ; WX 278 ; N uniF031 ; B 29 0 253 460 ; +C -1 ; WX 722 ; N Adotbelow ; B 8 -167 711 677 ; +C -1 ; WX 444 ; N adotbelow ; B 36 -167 442 460 ; +C -1 ; WX 722 ; N Ahookabove ; B 8 0 711 891 ; +C -1 ; WX 444 ; N ahookabove ; B 36 -9 442 674 ; +C -1 ; WX 722 ; N Acircumflexacute ; B 8 0 711 891 ; +C -1 ; WX 444 ; N acircumflexacute ; B 36 -9 442 891 ; +C -1 ; WX 722 ; N Acircumflexgrave ; B 8 0 711 891 ; +C -1 ; WX 444 ; N acircumflexgrave ; B 36 -9 442 891 ; +C -1 ; WX 722 ; N Acircumflexhookabove ; B 8 0 711 891 ; +C -1 ; WX 444 ; N acircumflexhookabove ; B 36 -9 442 891 ; +C -1 ; WX 722 ; N Acircumflextilde ; B 8 0 711 891 ; +C -1 ; WX 444 ; N acircumflextilde ; B 36 -9 442 854 ; +C -1 ; WX 722 ; N Acircumflexdotbelow ; B 8 -167 711 799 ; +C -1 ; WX 444 ; N acircumflexdotbelow ; B 36 -167 442 676 ; +C -1 ; WX 722 ; N Abreveacute ; B 8 0 711 891 ; +C -1 ; WX 444 ; N abreveacute ; B 36 -9 442 891 ; +C -1 ; WX 722 ; N Abrevegrave ; B 8 0 711 891 ; +C -1 ; WX 444 ; N abrevegrave ; B 36 -9 442 891 ; +C -1 ; WX 722 ; N Abrevehookabove ; B 8 0 711 891 ; +C -1 ; WX 444 ; N abrevehookabove ; B 36 -9 442 891 ; +C -1 ; WX 722 ; N Abrevetilde ; B 8 0 711 891 ; +C -1 ; WX 444 ; N abrevetilde ; B 36 -9 442 854 ; +C -1 ; WX 722 ; N Abrevedotbelow ; B 8 -167 711 808 ; +C -1 ; WX 444 ; N abrevedotbelow ; B 36 -167 442 663 ; +C -1 ; WX 611 ; N Edotbelow ; B 21 -167 588 662 ; +C -1 ; WX 444 ; N edotbelow ; B 37 -167 416 461 ; +C -1 ; WX 611 ; N Ehookabove ; B 21 0 588 891 ; +C -1 ; WX 444 ; N ehookabove ; B 37 -14 416 674 ; +C -1 ; WX 611 ; N Etilde ; B 21 0 588 842 ; +C -1 ; WX 444 ; N etilde ; B 37 -14 416 662 ; +C -1 ; WX 611 ; N Ecircumflexacute ; B 21 0 588 891 ; +C -1 ; WX 444 ; N ecircumflexacute ; B 37 -14 416 891 ; +C -1 ; WX 611 ; N Ecircumflexgrave ; B 21 0 588 891 ; +C -1 ; WX 444 ; N ecircumflexgrave ; B 37 -14 416 891 ; +C -1 ; WX 611 ; N Ecircumflexhookabove ; B 21 0 588 891 ; +C -1 ; WX 444 ; N ecircumflexhookabove ; B 37 -14 416 891 ; +C -1 ; WX 611 ; N Ecircumflextilde ; B 21 0 588 891 ; +C -1 ; WX 444 ; N ecircumflextilde ; B 37 -14 416 854 ; +C -1 ; WX 611 ; N Ecircumflexdotbelow ; B 21 -167 588 799 ; +C -1 ; WX 444 ; N ecircumflexdotbelow ; B 37 -167 416 676 ; +C -1 ; WX 333 ; N Ihookabove ; B 25 0 309 891 ; +C -1 ; WX 278 ; N ihookabove ; B 29 0 253 674 ; +C -1 ; WX 333 ; N Idotbelow ; B 25 -167 309 662 ; +C -1 ; WX 278 ; N idotbelow ; B 29 -167 253 694 ; +C -1 ; WX 722 ; N Odotbelow ; B 35 -167 684 677 ; +C -1 ; WX 500 ; N odotbelow ; B 34 -167 465 460 ; +C -1 ; WX 722 ; N Ohookabove ; B 35 -15 684 891 ; +C -1 ; WX 500 ; N ohookabove ; B 34 -14 465 674 ; +C -1 ; WX 722 ; N Ocircumflexacute ; B 35 -15 684 891 ; +C -1 ; WX 500 ; N ocircumflexacute ; B 34 -14 465 891 ; +C -1 ; WX 722 ; N Ocircumflexgrave ; B 35 -15 684 891 ; +C -1 ; WX 500 ; N ocircumflexgrave ; B 34 -14 465 891 ; +C -1 ; WX 722 ; N Ocircumflexhookabove ; B 35 -15 684 891 ; +C -1 ; WX 500 ; N ocircumflexhookabove ; B 34 -14 465 891 ; +C -1 ; WX 722 ; N Ocircumflextilde ; B 35 -15 684 891 ; +C -1 ; WX 500 ; N ocircumflextilde ; B 34 -14 465 854 ; +C -1 ; WX 722 ; N Ocircumflexdotbelow ; B 35 -167 684 799 ; +C -1 ; WX 500 ; N ocircumflexdotbelow ; B 34 -167 465 676 ; +C -1 ; WX 722 ; N Ohornacute ; B 69 -15 717 877 ; +C -1 ; WX 529 ; N ohornacute ; B 34 -14 536 679 ; +C -1 ; WX 722 ; N Ohorngrave ; B 69 -15 717 877 ; +C -1 ; WX 529 ; N ohorngrave ; B 34 -14 536 679 ; +C -1 ; WX 722 ; N Ohornhookabove ; B 69 -15 717 891 ; +C -1 ; WX 529 ; N ohornhookabove ; B 34 -14 536 674 ; +C -1 ; WX 722 ; N Ohorntilde ; B 69 -15 717 842 ; +C -1 ; WX 529 ; N ohorntilde ; B 34 -14 536 662 ; +C -1 ; WX 722 ; N Ohorndotbelow ; B 69 -167 717 758 ; +C -1 ; WX 529 ; N ohorndotbelow ; B 34 -167 536 478 ; +C -1 ; WX 722 ; N Udotbelow ; B 5 -167 711 662 ; +C -1 ; WX 500 ; N udotbelow ; B 1 -167 499 447 ; +C -1 ; WX 722 ; N Uhookabove ; B 5 -16 711 891 ; +C -1 ; WX 500 ; N uhookabove ; B 1 -14 499 674 ; +C -1 ; WX 776 ; N Uhornacute ; B 5 -16 810 877 ; +C -1 ; WX 542 ; N uhornacute ; B 1 -14 544 679 ; +C -1 ; WX 776 ; N Uhorngrave ; B 5 -16 810 877 ; +C -1 ; WX 542 ; N uhorngrave ; B 1 -14 544 679 ; +C -1 ; WX 776 ; N Uhornhookabove ; B 5 -16 810 891 ; +C -1 ; WX 542 ; N uhornhookabove ; B 1 -14 544 674 ; +C -1 ; WX 776 ; N Uhorntilde ; B 5 -16 810 842 ; +C -1 ; WX 542 ; N uhorntilde ; B 1 -14 544 662 ; +C -1 ; WX 776 ; N Uhorndotbelow ; B 5 -167 810 774 ; +C -1 ; WX 542 ; N uhorndotbelow ; B 1 -167 544 478 ; +C -1 ; WX 722 ; N Ydotbelow ; B 9 -167 708 662 ; +C -1 ; WX 500 ; N ydotbelow ; B 6 -216 494 447 ; +C -1 ; WX 722 ; N Yhookabove ; B 9 0 708 891 ; +C -1 ; WX 500 ; N yhookabove ; B 6 -216 494 674 ; +C -1 ; WX 722 ; N Ytilde ; B 9 0 708 842 ; +C -1 ; WX 500 ; N ytilde ; B 6 -216 494 662 ; +C -1 ; WX 722 ; N uni01CD ; B 8 0 711 875 ; +C -1 ; WX 444 ; N uni01CE ; B 36 -9 442 676 ; +C -1 ; WX 333 ; N uni01CF ; B 25 0 309 875 ; +C -1 ; WX 278 ; N uni01D0 ; B 3 0 278 676 ; +C -1 ; WX 722 ; N uni01D1 ; B 35 -15 684 875 ; +C -1 ; WX 500 ; N uni01D2 ; B 34 -14 465 676 ; +C -1 ; WX 722 ; N uni01D3 ; B 5 -16 711 875 ; +C -1 ; WX 500 ; N uni01D4 ; B 1 -14 499 676 ; +C -1 ; WX 722 ; N uni01D5 ; B 5 -16 711 891 ; +C -1 ; WX 500 ; N uni01D6 ; B 1 -14 499 747 ; +C -1 ; WX 722 ; N uni01D7 ; B 5 -16 711 891 ; +C -1 ; WX 500 ; N uni01D8 ; B 1 -14 499 823 ; +C -1 ; WX 722 ; N uni01D9 ; B 5 -16 711 891 ; +C -1 ; WX 500 ; N uni01DA ; B 1 -14 499 816 ; +C -1 ; WX 722 ; N uni01DB ; B 5 -16 711 891 ; +C -1 ; WX 500 ; N uni01DC ; B 1 -14 499 823 ; +C -1 ; WX 0 ; N glyph1292 ; B -121 706 121 891 ; +C -1 ; WX 0 ; N glyph1293 ; B -121 706 121 891 ; +C -1 ; WX 0 ; N glyph1294 ; B -121 706 121 891 ; +C -1 ; WX 0 ; N glyph1295 ; B -121 706 121 891 ; +C -1 ; WX 578 ; N uni0492 ; B 17 0 552 662 ; +C -1 ; WX 410 ; N uni0493 ; B 15 0 404 447 ; +C -1 ; WX 896 ; N uni0496 ; B 9 -190 886 670 ; +C -1 ; WX 691 ; N uni0497 ; B 11 -124 680 453 ; +C -1 ; WX 667 ; N uni049A ; B 18 -190 663 670 ; +C -1 ; WX 486 ; N uni049B ; B 22 -124 480 453 ; +C -1 ; WX 667 ; N uni049C ; B 18 0 664 670 ; +C -1 ; WX 486 ; N uni049D ; B 22 0 480 453 ; +C -1 ; WX 722 ; N uni04A2 ; B 17 -190 703 662 ; +C -1 ; WX 535 ; N uni04A3 ; B 22 -124 513 447 ; +C -1 ; WX 722 ; N uni04AE ; B 9 0 708 662 ; +C -1 ; WX 500 ; N uni04AF ; B 1 -214 500 447 ; +C -1 ; WX 722 ; N uni04B0 ; B 9 0 708 662 ; +C -1 ; WX 500 ; N uni04B1 ; B 1 -214 500 447 ; +C -1 ; WX 722 ; N uni04B2 ; B 7 -190 710 662 ; +C -1 ; WX 500 ; N uni04B3 ; B 13 -124 493 447 ; +C -1 ; WX 650 ; N uni04B8 ; B -3 0 632 662 ; +C -1 ; WX 503 ; N uni04B9 ; B 15 0 481 447 ; +C -1 ; WX 650 ; N uni04BA ; B 18 0 653 662 ; +C -1 ; WX 500 ; N uni04BB ; B 6 0 494 694 ; +C -1 ; WX 722 ; N uni018F ; B 21 -15 684 677 ; +C -1 ; WX 444 ; N uni0259 ; B 37 -14 416 461 ; +C -1 ; WX 722 ; N uni04E8 ; B 35 -15 684 677 ; +C -1 ; WX 500 ; N uni04E9 ; B 34 -14 465 460 ; +C -1 ; WX 713 ; N glyph1320 ; B 28 143 713 469 ; +C -1 ; WX 244 ; N glyph1321 ; B -34 143 244 456 ; +C -1 ; WX 268 ; N glyph1322 ; B -34 143 268 544 ; +C -1 ; WX 263 ; N glyph1323 ; B -34 143 263 494 ; +C -1 ; WX 582 ; N glyph1324 ; B 34 -75 582 445 ; +C -1 ; WX 244 ; N glyph1325 ; B 77 -46 194 66 ; +C -1 ; WX 244 ; N glyph1326 ; B 8 -88 236 68 ; +C -1 ; WX 244 ; N glyph1327 ; B 13 -175 242 68 ; +C -1 ; WX 244 ; N glyph1328 ; B 8 -175 236 68 ; +C -1 ; WX 244 ; N glyph1329 ; B 52 -166 191 68 ; +C -1 ; WX 244 ; N glyph1330 ; B -3 -210 248 68 ; +C -1 ; WX 269 ; N glyph1331 ; B -24 519 269 828 ; +C -1 ; WX 207 ; N glyph1332 ; B 7 732 210 891 ; +C -1 ; WX 207 ; N glyph1333 ; B -5 746 179 890 ; +C -1 ; WX 333 ; N glyph1334 ; B 80 605 240 717 ; +C -1 ; WX 333 ; N glyph1335 ; B 80 605 240 717 ; +C -1 ; WX 207 ; N uni0653 ; B 7 692 206 747 ; +C -1 ; WX 207 ; N uni0654 ; B 42 733 179 880 ; +C -1 ; WX 207 ; N uni0655 ; B 42 -79 179 68 ; +C -1 ; WX 0 ; N uni0670 ; B -24 519 24 809 ; +C -1 ; WX 207 ; N uni0671 ; B 7 130 210 891 ; +C -1 ; WX 229 ; N uniFB51 ; B -32 143 229 891 ; +C -1 ; WX 207 ; N uni0672 ; B -5 130 179 890 ; +C -1 ; WX 229 ; N glyph1343 ; B -25 143 229 890 ; +C -1 ; WX 207 ; N uni0673 ; B 14 -84 198 740 ; +C -1 ; WX 229 ; N glyph1345 ; B -5 -84 229 740 ; +C -1 ; WX 207 ; N uni0675 ; B 72 130 296 740 ; +C -1 ; WX 229 ; N glyph47 ; B 9 143 276 740 ; +C -1 ; WX 432 ; N uni0676 ; B 24 -77 511 597 ; +C -1 ; WX 432 ; N glyph1349 ; B 24 -77 511 597 ; +C -1 ; WX 432 ; N uni0677 ; B 24 -77 511 616 ; +C -1 ; WX 432 ; N glyph1351 ; B 24 -77 511 616 ; +C -1 ; WX 638 ; N uni0678 ; B 24 -43 667 685 ; +C -1 ; WX 588 ; N glyph ; B 18 -110 588 440 ; +C -1 ; WX 713 ; N uni0679 ; B 28 143 713 828 ; +C -1 ; WX 713 ; N uniFB67 ; B 28 143 713 828 ; +C -1 ; WX 244 ; N uniFB68 ; B -34 143 269 828 ; +C -1 ; WX 244 ; N uniFB69 ; B -34 143 269 828 ; +C -1 ; WX 713 ; N uni067A ; B 28 143 713 752 ; +C -1 ; WX 713 ; N uniFB5F ; B 28 143 713 752 ; +C -1 ; WX 244 ; N uniFB60 ; B -34 143 244 752 ; +C -1 ; WX 244 ; N uniFB61 ; B -34 143 244 752 ; +C -1 ; WX 713 ; N uni067B ; B 28 -166 713 469 ; +C -1 ; WX 713 ; N uniFB53 ; B 28 -166 713 469 ; +C -1 ; WX 244 ; N uniFB54 ; B -34 -166 244 456 ; +C -1 ; WX 244 ; N uniFB55 ; B -34 -166 244 456 ; +C -1 ; WX 713 ; N uni067C ; B 28 31 713 628 ; +C -1 ; WX 713 ; N glyph1367 ; B 28 31 713 628 ; +C -1 ; WX 244 ; N glyph1368 ; B -34 31 244 667 ; +C -1 ; WX 244 ; N glyph1369 ; B -34 31 244 667 ; +C -1 ; WX 713 ; N uni067D ; B 28 143 713 752 ; +C -1 ; WX 713 ; N glyph1371 ; B 28 143 713 752 ; +C -1 ; WX 244 ; N glyph1372 ; B -34 143 244 752 ; +C -1 ; WX 244 ; N glyph1373 ; B -34 143 244 752 ; +C -1 ; WX 713 ; N uni067F ; B 28 143 713 752 ; +C -1 ; WX 713 ; N uniFB63 ; B 28 143 713 752 ; +C -1 ; WX 244 ; N uniFB64 ; B -34 143 244 752 ; +C -1 ; WX 244 ; N uniFB65 ; B -34 143 244 752 ; +C -1 ; WX 713 ; N uni0680 ; B 28 -210 713 469 ; +C -1 ; WX 713 ; N uniFB5B ; B 28 -210 713 469 ; +C -1 ; WX 244 ; N uniFB5C ; B -34 -210 248 456 ; +C -1 ; WX 244 ; N uniFB5D ; B -34 -210 248 456 ; +C -1 ; WX 563 ; N uni0681 ; B 26 -212 516 685 ; +C -1 ; WX 526 ; N glyph1383 ; B 26 -212 526 685 ; +C -1 ; WX 530 ; N glyph1384 ; B -34 143 530 685 ; +C -1 ; WX 530 ; N glyph1385 ; B -34 143 530 685 ; +C -1 ; WX 563 ; N uni0682 ; B 26 -212 516 752 ; +C -1 ; WX 526 ; N glyph1387 ; B 26 -212 526 752 ; +C -1 ; WX 530 ; N glyph1388 ; B -34 143 530 752 ; +C -1 ; WX 530 ; N glyph1389 ; B -34 143 530 752 ; +C -1 ; WX 563 ; N uni0683 ; B 26 -212 516 432 ; +C -1 ; WX 526 ; N uniFB77 ; B 26 -212 526 426 ; +C -1 ; WX 530 ; N uniFB78 ; B -34 -88 530 427 ; +C -1 ; WX 530 ; N uniFB79 ; B -34 -88 530 427 ; +C -1 ; WX 563 ; N uni0684 ; B 26 -212 516 432 ; +C -1 ; WX 526 ; N uniFB73 ; B 26 -212 526 426 ; +C -1 ; WX 530 ; N uniFB74 ; B -34 -166 530 427 ; +C -1 ; WX 530 ; N uniFB75 ; B -34 -166 530 427 ; +C -1 ; WX 563 ; N uni0685 ; B 26 -212 516 752 ; +C -1 ; WX 526 ; N glyph1399 ; B 26 -212 526 752 ; +C -1 ; WX 530 ; N glyph1400 ; B -34 143 530 752 ; +C -1 ; WX 530 ; N glyph1401 ; B -34 143 530 752 ; +C -1 ; WX 563 ; N uni0687 ; B 26 -212 516 432 ; +C -1 ; WX 526 ; N uniFB7f ; B 26 -212 526 426 ; +C -1 ; WX 530 ; N uniFB80 ; B -34 -210 530 427 ; +C -1 ; WX 530 ; N uniFB81 ; B -34 -210 530 427 ; +C -1 ; WX 337 ; N uni0688 ; B 24 143 337 891 ; +C -1 ; WX 337 ; N uniFB89 ; B 24 143 337 891 ; +C -1 ; WX 337 ; N uni0689 ; B 46 31 337 552 ; +C -1 ; WX 337 ; N glyph1409 ; B 46 31 337 552 ; +C -1 ; WX 337 ; N uni068A ; B 46 -46 337 552 ; +C -1 ; WX 337 ; N glyph1411 ; B 46 -46 337 552 ; +C -1 ; WX 337 ; N uni068B ; B 24 -46 337 891 ; +C -1 ; WX 337 ; N glyph1413 ; B 24 -46 337 891 ; +C -1 ; WX 337 ; N uni068C ; B 46 143 337 752 ; +C -1 ; WX 337 ; N uniFB85 ; B 46 143 337 752 ; +C -1 ; WX 337 ; N uni068D ; B 46 -88 337 552 ; +C -1 ; WX 337 ; N uniFB83 ; B 46 -88 337 552 ; +C -1 ; WX 337 ; N uni068E ; B 46 143 337 850 ; +C -1 ; WX 337 ; N uniFB87 ; B 46 143 337 850 ; +C -1 ; WX 337 ; N uni068F ; B 27 143 337 850 ; +C -1 ; WX 337 ; N glyph1421 ; B 27 143 337 850 ; +C -1 ; WX 337 ; N uni0690 ; B 36 143 337 850 ; +C -1 ; WX 337 ; N glyph1423 ; B 36 143 337 850 ; +C -1 ; WX 489 ; N uni0691 ; B 36 -91 489 828 ; +C -1 ; WX 489 ; N uniFB8D ; B 36 -91 489 828 ; +C -1 ; WX 489 ; N uni0692 ; B 36 -91 489 634 ; +C -1 ; WX 489 ; N glyph1426 ; B 36 -91 489 634 ; +C -1 ; WX 489 ; N uni0693 ; B 36 -127 489 430 ; +C -1 ; WX 489 ; N glyph1429 ; B 36 -127 489 430 ; +C -1 ; WX 489 ; N uni0694 ; B 36 -144 507 430 ; +C -1 ; WX 489 ; N glyph1431 ; B 36 -144 507 430 ; +C -1 ; WX 489 ; N uni0695 ; B 36 -196 489 430 ; +C -1 ; WX 489 ; N glyph1433 ; B 36 -196 489 430 ; +C -1 ; WX 489 ; N uni0696 ; B 36 -144 507 430 ; +C -1 ; WX 489 ; N glyph1435 ; B 36 -144 507 430 ; +C -1 ; WX 489 ; N uni0697 ; B 36 -91 489 636 ; +C -1 ; WX 489 ; N glyph1437 ; B 36 -91 489 636 ; +C -1 ; WX 489 ; N uni0699 ; B 36 -91 489 758 ; +C -1 ; WX 489 ; N glyph1439 ; B 36 -91 489 758 ; +C -1 ; WX 821 ; N uni069A ; B 30 -72 821 593 ; +C -1 ; WX 821 ; N glyph1441 ; B 30 -72 821 593 ; +C -1 ; WX 531 ; N glyph1442 ; B -34 -46 531 593 ; +C -1 ; WX 531 ; N glyph1443 ; B -34 -46 531 593 ; +C -1 ; WX 821 ; N uni069B ; B 30 -175 822 417 ; +C -1 ; WX 821 ; N glyph1445 ; B 30 -175 822 417 ; +C -1 ; WX 531 ; N glyph1446 ; B -34 -175 531 401 ; +C -1 ; WX 531 ; N glyph1447 ; B -34 -175 531 401 ; +C -1 ; WX 821 ; N uni069C ; B 30 -175 822 723 ; +C -1 ; WX 821 ; N glyph1449 ; B 30 -175 822 723 ; +C -1 ; WX 531 ; N glyph1450 ; B -34 -175 531 723 ; +C -1 ; WX 531 ; N glyph1451 ; B -34 -175 531 723 ; +C -1 ; WX 1098 ; N uni069D ; B 30 -88 1098 417 ; +C -1 ; WX 1098 ; N glyph1453 ; B 30 -88 1098 417 ; +C -1 ; WX 846 ; N glyph1454 ; B -34 -88 846 405 ; +C -1 ; WX 846 ; N glyph1455 ; B -34 -88 846 405 ; +C -1 ; WX 1098 ; N uni069E ; B 30 -72 1098 723 ; +C -1 ; WX 1098 ; N glyph1457 ; B 30 -72 1098 723 ; +C -1 ; WX 846 ; N glyph1458 ; B -34 143 846 723 ; +C -1 ; WX 846 ; N glyph1459 ; B -34 143 846 723 ; +C -1 ; WX 582 ; N uni069F ; B -34 143 582 793 ; +C -1 ; WX 582 ; N glyph1461 ; B -34 143 582 793 ; +C -1 ; WX 544 ; N uni06A0 ; B 21 -212 516 850 ; +C -1 ; WX 450 ; N glyph1463 ; B 26 -212 486 723 ; +C -1 ; WX 526 ; N glyph1464 ; B -34 143 470 771 ; +C -1 ; WX 394 ; N glyph1465 ; B -34 143 394 723 ; +C -1 ; WX 789 ; N uni06A1 ; B 19 143 789 478 ; +C -1 ; WX 789 ; N uni06A2 ; B 19 -46 789 478 ; +C -1 ; WX 789 ; N glyph1468 ; B 19 -46 789 478 ; +C -1 ; WX 268 ; N glyph1469 ; B -34 -46 268 544 ; +C -1 ; WX 263 ; N glyph1470 ; B -34 -46 263 494 ; +C -1 ; WX 789 ; N uni06A3 ; B 19 -46 789 642 ; +C -1 ; WX 789 ; N glyph1472 ; B 19 -46 789 642 ; +C -1 ; WX 268 ; N glyph1473 ; B -34 -46 268 691 ; +C -1 ; WX 263 ; N glyph1474 ; B -34 -46 263 691 ; +C -1 ; WX 789 ; N uni06A4 ; B 19 143 789 771 ; +C -1 ; WX 789 ; N uniFB6B ; B 19 143 789 771 ; +C -1 ; WX 268 ; N uniFB6C ; B -34 143 268 820 ; +C -1 ; WX 263 ; N uniFB6D ; B -34 143 263 820 ; +C -1 ; WX 789 ; N uni06A5 ; B 19 -175 822 478 ; +C -1 ; WX 789 ; N glyph1480 ; B 19 -175 822 478 ; +C -1 ; WX 268 ; N glyph1481 ; B -34 -175 268 544 ; +C -1 ; WX 263 ; N glyph1482 ; B -34 -175 263 494 ; +C -1 ; WX 789 ; N uni06A6 ; B 19 143 789 801 ; +C -1 ; WX 789 ; N uniFB6F ; B 19 143 789 801 ; +C -1 ; WX 268 ; N uniFB70 ; B -34 143 268 840 ; +C -1 ; WX 263 ; N uniFB71 ; B -34 143 263 840 ; +C -1 ; WX 582 ; N uni06A7 ; B 34 -75 582 627 ; +C -1 ; WX 582 ; N glyph1488 ; B 34 -75 582 627 ; +C -1 ; WX 582 ; N uni06A8 ; B 34 -75 582 723 ; +C -1 ; WX 582 ; N glyph1490 ; B 34 -75 582 723 ; +C -1 ; WX 812 ; N uni06AA ; B 10 143 812 673 ; +C -1 ; WX 933 ; N glyph1492 ; B 10 143 933 673 ; +C -1 ; WX 394 ; N glyph1493 ; B -34 143 394 613 ; +C -1 ; WX 515 ; N glyph1494 ; B -34 143 515 613 ; +C -1 ; WX 812 ; N uni06AB ; B 10 143 812 734 ; +C -1 ; WX 933 ; N glyph1496 ; B 10 143 933 734 ; +C -1 ; WX 394 ; N glyph1497 ; B -34 143 394 734 ; +C -1 ; WX 515 ; N glyph1498 ; B -34 143 515 734 ; +C -1 ; WX 601 ; N uni06AC ; B 22 143 601 775 ; +C -1 ; WX 601 ; N glyph1500 ; B 22 143 601 775 ; +C -1 ; WX 394 ; N glyph1501 ; B -34 143 394 843 ; +C -1 ; WX 394 ; N glyph1502 ; B -34 143 394 843 ; +C -1 ; WX 601 ; N uni06AD ; B 22 143 601 879 ; +C -1 ; WX 601 ; N uniFBD4 ; B 22 143 601 879 ; +C -1 ; WX 394 ; N uniFBD5 ; B -34 143 394 852 ; +C -1 ; WX 394 ; N uniFBD6 ; B -34 143 394 852 ; +C -1 ; WX 601 ; N uni06AE ; B 22 -175 601 775 ; +C -1 ; WX 601 ; N glyph1508 ; B 22 -175 601 775 ; +C -1 ; WX 394 ; N glyph1509 ; B -34 -175 394 734 ; +C -1 ; WX 394 ; N glyph1510 ; B -34 -175 394 734 ; +C -1 ; WX 812 ; N uni06B0 ; B 10 143 812 867 ; +C -1 ; WX 933 ; N glyph1512 ; B 10 143 933 867 ; +C -1 ; WX 394 ; N glyph1513 ; B -34 143 394 876 ; +C -1 ; WX 515 ; N glyph1514 ; B -34 143 515 876 ; +C -1 ; WX 812 ; N uni06B1 ; B 10 143 812 891 ; +C -1 ; WX 933 ; N uniFB9B ; B 10 143 933 891 ; +C -1 ; WX 394 ; N uniFB9C ; B -34 143 394 891 ; +C -1 ; WX 515 ; N uniFB9D ; B -34 143 515 891 ; +C -1 ; WX 812 ; N uni06B2 ; B 10 -88 812 867 ; +C -1 ; WX 933 ; N glyph1520 ; B 10 -88 933 867 ; +C -1 ; WX 394 ; N glyph1521 ; B -34 -88 394 876 ; +C -1 ; WX 515 ; N glyph1522 ; B -34 -88 515 876 ; +C -1 ; WX 812 ; N uni06B3 ; B 10 -166 812 867 ; +C -1 ; WX 933 ; N uniFB97 ; B 10 -166 933 867 ; +C -1 ; WX 394 ; N uniFB98 ; B -34 -166 394 876 ; +C -1 ; WX 515 ; N uniFB99 ; B -34 -166 515 876 ; +C -1 ; WX 812 ; N uni06B4 ; B 10 143 812 891 ; +C -1 ; WX 933 ; N glyph1528 ; B 10 143 933 891 ; +C -1 ; WX 394 ; N glyph1529 ; B -34 143 394 891 ; +C -1 ; WX 515 ; N glyph1530 ; B -34 143 515 891 ; +C -1 ; WX 506 ; N uni06B5 ; B 35 7 506 891 ; +C -1 ; WX 506 ; N glyph1532 ; B 35 7 506 891 ; +C -1 ; WX 207 ; N glyph1533 ; B -34 143 207 891 ; +C -1 ; WX 207 ; N glyph1534 ; B -34 143 207 891 ; +C -1 ; WX 506 ; N uni06B6 ; B 35 7 506 891 ; +C -1 ; WX 506 ; N glyph1536 ; B 35 7 506 891 ; +C -1 ; WX 207 ; N glyph1537 ; B -34 143 207 891 ; +C -1 ; WX 207 ; N glyph1538 ; B -34 143 207 891 ; +C -1 ; WX 506 ; N uni06B7 ; B 35 7 506 891 ; +C -1 ; WX 506 ; N glyph1540 ; B 35 7 506 891 ; +C -1 ; WX 207 ; N glyph1541 ; B -34 143 207 891 ; +C -1 ; WX 207 ; N glyph1542 ; B -34 143 207 891 ; +C -1 ; WX 506 ; N uni06B8 ; B 35 -205 506 775 ; +C -1 ; WX 506 ; N glyph1544 ; B 35 -205 506 775 ; +C -1 ; WX 207 ; N glyph1545 ; B -34 -175 217 775 ; +C -1 ; WX 207 ; N glyph1546 ; B -34 -175 217 775 ; +C -1 ; WX 526 ; N uni06B9 ; B 34 -210 526 558 ; +C -1 ; WX 526 ; N glyph1548 ; B 34 -210 526 558 ; +C -1 ; WX 244 ; N glyph1549 ; B -34 -46 244 636 ; +C -1 ; WX 244 ; N glyph1550 ; B -34 -46 244 636 ; +C -1 ; WX 526 ; N uni06BA ; B 34 -72 526 417 ; +C -1 ; WX 526 ; N uniFB9F ; B 34 -72 526 417 ; +C -1 ; WX 526 ; N uni06BB ; B 34 -72 526 789 ; +C -1 ; WX 526 ; N uniFBA1 ; B 34 -72 526 789 ; +C -1 ; WX 526 ; N uni06BC ; B 34 -184 526 558 ; +C -1 ; WX 526 ; N glyph1556 ; B 34 -184 526 558 ; +C -1 ; WX 244 ; N glyph1557 ; B -34 31 244 636 ; +C -1 ; WX 244 ; N glyph1558 ; B -34 31 244 636 ; +C -1 ; WX 526 ; N uni06BD ; B 34 -72 526 723 ; +C -1 ; WX 526 ; N glyph1560 ; B 34 -72 526 723 ; +C -1 ; WX 563 ; N uni06BF ; B 26 -212 516 639 ; +C -1 ; WX 526 ; N glyph1562 ; B 26 -212 526 639 ; +C -1 ; WX 530 ; N glyph1563 ; B -34 -175 530 639 ; +C -1 ; WX 530 ; N glyph1564 ; B -34 -175 530 639 ; +C -1 ; WX 282 ; N uni06C0 ; B 26 130 262 636 ; +C -1 ; WX 375 ; N uniFBA5 ; B -4 143 375 733 ; +C -1 ; WX 388 ; N uni06C1 ; B 13 71 388 328 ; +C -1 ; WX 388 ; N uni06C2 ; B 13 71 388 538 ; +C -1 ; WX 388 ; N uni06C3 ; B 13 71 388 557 ; +C -1 ; WX 432 ; N uni06C4 ; B 24 -77 432 385 ; +C -1 ; WX 432 ; N glyph1571 ; B 24 -77 432 385 ; +C -1 ; WX 432 ; N uni06C5 ; B 24 -77 432 385 ; +C -1 ; WX 432 ; N uniFBE1 ; B 24 -77 432 385 ; +C -1 ; WX 432 ; N uni06C6 ; B 24 -77 436 585 ; +C -1 ; WX 432 ; N uniFBDA ; B 24 -77 436 585 ; +C -1 ; WX 432 ; N uni06C7 ; B 24 -77 432 665 ; +C -1 ; WX 432 ; N uniFBD8 ; B 24 -77 432 665 ; +C -1 ; WX 432 ; N uni06C8 ; B 24 -77 432 741 ; +C -1 ; WX 432 ; N uniFBDC ; B 24 -77 432 741 ; +C -1 ; WX 432 ; N uni06C9 ; B 24 -77 436 585 ; +C -1 ; WX 432 ; N uniFBE3 ; B 24 -77 436 585 ; +C -1 ; WX 432 ; N uni06CA ; B 24 -77 432 623 ; +C -1 ; WX 432 ; N glyph1583 ; B 24 -77 432 623 ; +C -1 ; WX 432 ; N uni06CB ; B 24 -77 437 710 ; +C -1 ; WX 432 ; N uniFBDF ; B 24 -77 437 710 ; +C -1 ; WX 638 ; N uni06CD ; B -34 -43 606 462 ; +C -1 ; WX 588 ; N glyph1587 ; B -34 -110 588 252 ; +C -1 ; WX 638 ; N uni06CE ; B 24 -43 606 522 ; +C -1 ; WX 588 ; N glyph1589 ; B 18 -110 588 424 ; +C -1 ; WX 244 ; N glyph1590 ; B -34 -69 244 620 ; +C -1 ; WX 244 ; N glyph1591 ; B -34 -69 244 620 ; +C -1 ; WX 432 ; N uni06CF ; B 24 -77 432 586 ; +C -1 ; WX 432 ; N glyph1593 ; B 24 -77 432 586 ; +C -1 ; WX 638 ; N uni06D0 ; B 24 -182 606 462 ; +C -1 ; WX 588 ; N uniFBE5 ; B 18 -212 588 252 ; +C -1 ; WX 244 ; N uniFBE6 ; B -34 -166 244 456 ; +C -1 ; WX 244 ; N uniFBE7 ; B -34 -166 244 456 ; +C -1 ; WX 638 ; N uni06D1 ; B 24 -168 606 462 ; +C -1 ; WX 588 ; N glyph1599 ; B 18 -212 588 252 ; +C -1 ; WX 812 ; N uni06D2 ; B 34 -25 812 373 ; +C -1 ; WX 812 ; N uniFBAF ; B 34 -208 812 228 ; +C -1 ; WX 812 ; N uni06D3 ; B 34 -25 812 489 ; +C -1 ; WX 812 ; N uniFBB1 ; B 34 -208 812 450 ; +C -1 ; WX 207 ; N uni06D4 ; B 20 143 188 228 ; +C -1 ; WX 0 ; N uni06D6 ; B -230 519 231 886 ; +C -1 ; WX 0 ; N uni06D7 ; B -171 519 194 886 ; +C -1 ; WX 0 ; N uni06D8 ; B -102 519 102 646 ; +C -1 ; WX 0 ; N uni06D9 ; B -111 519 111 826 ; +C -1 ; WX 0 ; N uni06DA ; B -116 519 116 825 ; +C -1 ; WX 0 ; N uni06DB ; B -54 519 54 634 ; +C -1 ; WX 0 ; N uni06DC ; B -188 519 188 752 ; +C -1 ; WX 1123 ; N uni06DD ; B 24 -188 1099 886 ; +C -1 ; WX 1084 ; N uni06DE ; B 24 -152 1060 884 ; +C -1 ; WX 0 ; N uni06DF ; B -37 519 37 592 ; +C -1 ; WX 0 ; N uni06E0 ; B -36 519 36 591 ; +C -1 ; WX 0 ; N uni06E1 ; B -134 519 134 654 ; +C -1 ; WX 0 ; N uni06E2 ; B -76 519 77 790 ; +C -1 ; WX 0 ; N uni06E3 ; B -188 -179 188 54 ; +C -1 ; WX 0 ; N uni06E4 ; B -47 519 47 545 ; +C -1 ; WX 194 ; N uni06E5 ; B 0 519 194 738 ; +C -1 ; WX 370 ; N uni06E6 ; B -1 519 370 708 ; +C -1 ; WX 0 ; N uni06E7 ; B -187 519 185 708 ; +C -1 ; WX 0 ; N uni06E8 ; B -117 519 117 819 ; +C -1 ; WX 600 ; N uni06E9 ; B 24 0 576 818 ; +C -1 ; WX 0 ; N uni06EA ; B -82 -165 82 -1 ; +C -1 ; WX 0 ; N uni06EB ; B -82 519 82 683 ; +C -1 ; WX 0 ; N uni06ED ; B -76 -179 77 92 ; +C -1 ; WX 821 ; N uni06FA ; B 30 -72 821 723 ; +C -1 ; WX 821 ; N glyph1629 ; B 30 -72 821 723 ; +C -1 ; WX 531 ; N glyph1630 ; B -34 -46 531 723 ; +C -1 ; WX 531 ; N glyph1631 ; B -34 -46 531 723 ; +C -1 ; WX 1098 ; N uni06FB ; B 30 -72 1098 590 ; +C -1 ; WX 1098 ; N glyph1633 ; B 30 -72 1098 590 ; +C -1 ; WX 846 ; N glyph1634 ; B -34 -46 846 590 ; +C -1 ; WX 846 ; N glyph1635 ; B -34 -46 846 590 ; +C -1 ; WX 544 ; N uni06FC ; B 21 -212 516 737 ; +C -1 ; WX 450 ; N glyph1637 ; B 26 -212 486 639 ; +C -1 ; WX 526 ; N glyph1638 ; B -34 -46 470 639 ; +C -1 ; WX 394 ; N glyph1639 ; B -34 -46 394 639 ; +C -1 ; WX 413 ; N uni06FD ; B 59 -145 363 400 ; +C -1 ; WX 338 ; N uni06FE ; B 17 -212 338 357 ; +C -1 ; WX 282 ; N uniFBA6 ; B 26 130 262 430 ; +C -1 ; WX 244 ; N uniFBA8 ; B -34 -132 244 456 ; +C -1 ; WX 320 ; N uniFBA9 ; B -34 -205 320 365 ; +C -1 ; WX 244 ; N glyph1645 ; B 23 -68 222 49 ; +C -1 ; WX 244 ; N glyph1646 ; B 29 -151 226 -20 ; +C -1 ; WX 244 ; N glyph1647 ; B 9 -136 236 59 ; +C -1 ; WX 244 ; N glyph1648 ; B 86 -64 162 34 ; +C -1 ; WX 244 ; N glyph1649 ; B 53 -70 197 27 ; +C -1 ; WX 812 ; N glyph1650 ; B 10 143 812 852 ; +C -1 ; WX 933 ; N glyph1651 ; B 10 143 933 852 ; +C -1 ; WX 267 ; N uniFB1D ; B 33 79 223 554 ; +C -1 ; WX 0 ; N uniFB1E ; B -137 596 142 732 ; +C -1 ; WX 342 ; N glyph1654 ; B 0 140 342 191 ; +C -1 ; WX 533 ; N uniFB1F ; B 33 140 490 554 ; +C -1 ; WX 544 ; N glyph1656 ; B -5 79 507 890 ; +C -1 ; WX 601 ; N glyph1657 ; B -5 118 601 890 ; +C -1 ; WX 544 ; N glyph1658 ; B 41 -107 507 724 ; +C -1 ; WX 601 ; N glyph1659 ; B 32 -107 601 733 ; +C -1 ; WX 544 ; N glyph1660 ; B 41 79 507 782 ; +C -1 ; WX 601 ; N glyph1661 ; B 32 118 601 782 ; +C -1 ; WX 544 ; N glyph1662 ; B 41 79 514 891 ; +C -1 ; WX 601 ; N glyph1663 ; B 32 118 601 891 ; +C -1 ; WX 544 ; N glyph1664 ; B 41 79 507 891 ; +C -1 ; WX 601 ; N glyph1665 ; B 32 118 601 891 ; +C -1 ; WX 544 ; N glyph1666 ; B 41 79 507 891 ; +C -1 ; WX 601 ; N glyph1667 ; B 32 118 601 891 ; +C -1 ; WX 544 ; N glyph1668 ; B 41 -159 507 724 ; +C -1 ; WX 601 ; N glyph1669 ; B 32 -159 601 733 ; +C -1 ; WX 526 ; N glyph1670 ; B 55 143 485 713 ; +C -1 ; WX 526 ; N glyph1671 ; B 84 107 461 713 ; +C -1 ; WX 544 ; N glyph1672 ; B 7 79 507 891 ; +C -1 ; WX 601 ; N glyph1673 ; B 7 118 601 891 ; +EndCharMetrics +StartKernData +StartKernPairs 867 +KPX space A -55 +KPX space T -18 +KPX space V -18 +KPX space W -18 +KPX space Y -37 +KPX space Alphatonos -55 +KPX space Alpha -55 +KPX space Delta -55 +KPX space Lambda -55 +KPX space Tau -18 +KPX space Upsilon -37 +KPX space Upsilondieresis -37 +KPX one one -37 +KPX A space -55 +KPX A T -111 +KPX A V -129 +KPX A W -80 +KPX A Y -92 +KPX A v -74 +KPX A w -92 +KPX A y -92 +KPX A quoteright -111 +KPX F comma -80 +KPX F period -80 +KPX F A -74 +KPX L space -37 +KPX L T -92 +KPX L V -92 +KPX L W -74 +KPX L Y -100 +KPX L y -55 +KPX L quoteright -92 +KPX P space -37 +KPX P comma -111 +KPX P period -111 +KPX P A -92 +KPX R T -60 +KPX R V -80 +KPX R W -55 +KPX R Y -55 +KPX R y -40 +KPX T space -18 +KPX T comma -74 +KPX T hyphen -92 +KPX T period -74 +KPX T colon -50 +KPX T semicolon -55 +KPX T A -80 +KPX T O -18 +KPX T a -70 +KPX T c -70 +KPX T e -70 +KPX T i -35 +KPX T o -70 +KPX T r -35 +KPX T s -70 +KPX T u -35 +KPX T w -70 +KPX T y -70 +KPX V space -18 +KPX V comma -129 +KPX V hyphen -92 +KPX V period -129 +KPX V colon -74 +KPX V semicolon -74 +KPX V A -129 +KPX V a -111 +KPX V e -111 +KPX V i -60 +KPX V o -129 +KPX V r -60 +KPX V u -60 +KPX V y -111 +KPX W space -18 +KPX W comma -92 +KPX W hyphen -55 +KPX W period -92 +KPX W colon -37 +KPX W semicolon -37 +KPX W A -111 +KPX W a -80 +KPX W e -80 +KPX W i -40 +KPX W o -80 +KPX W r -40 +KPX W u -40 +KPX W y -60 +KPX Y space -37 +KPX Y comma -129 +KPX Y hyphen -111 +KPX Y period -129 +KPX Y colon -92 +KPX Y semicolon -92 +KPX Y A -111 +KPX Y a -100 +KPX Y e -100 +KPX Y i -55 +KPX Y o -100 +KPX Y p -92 +KPX Y q -111 +KPX Y u -111 +KPX Y v -100 +KPX f f -18 +KPX f quoteright 55 +KPX r comma -40 +KPX r hyphen -20 +KPX r period -55 +KPX r g -18 +KPX r quoteright 37 +KPX v comma -65 +KPX v period -65 +KPX w comma -65 +KPX w period -65 +KPX y comma -65 +KPX y period -65 +KPX quoteleft quoteleft -74 +KPX quoteright space -74 +KPX quoteright s -55 +KPX quoteright t -18 +KPX quoteright quoteright -74 +KPX quotesinglbase afii10051 -100 +KPX quotesinglbase afii10060 -100 +KPX quotesinglbase afii10036 -100 +KPX quotesinglbase afii10041 -188 +KPX quotesinglbase afii10044 -100 +KPX quotedblbase afii10051 -100 +KPX quotedblbase afii10060 -100 +KPX quotedblbase afii10036 -100 +KPX quotedblbase afii10041 -188 +KPX quotedblbase afii10044 -100 +KPX Gamma comma -120 +KPX Gamma period -120 +KPX Gamma iotadieresistonos 37 +KPX Gamma Alpha -155 +KPX Gamma Delta -118 +KPX Gamma Lambda -155 +KPX Gamma iota -35 +KPX Theta Alpha -48 +KPX Theta Delta -25 +KPX Theta Lambda -48 +KPX Theta Upsilon -50 +KPX Theta Upsilondieresis -50 +KPX Phi Alpha -48 +KPX Phi Upsilon -75 +KPX Phi Upsilondieresis -75 +KPX Alphatonos space -55 +KPX Alphatonos Theta -41 +KPX Alphatonos Phi -41 +KPX Alphatonos Omicron -41 +KPX Alphatonos Tau -110 +KPX Alphatonos Upsilon -152 +KPX Alphatonos Upsilondieresis -152 +KPX Alphatonos gamma -69 +KPX Alphatonos nu -74 +KPX Alphatonos chi -69 +KPX Omicrontonos Alpha -48 +KPX Omicrontonos Delta -25 +KPX Omicrontonos Lambda -48 +KPX Omicrontonos Upsilon -50 +KPX Omicrontonos Upsilondieresis -50 +KPX Upsilontonos Theta -89 +KPX Upsilontonos Phi -114 +KPX Upsilontonos alpha -100 +KPX Upsilontonos delta -83 +KPX Upsilontonos sigma -112 +KPX Upsilontonos phi -100 +KPX Upsilontonos Alpha -164 +KPX Upsilontonos Delta -125 +KPX Upsilontonos Lambda -164 +KPX Upsilontonos Omicron -89 +KPX Upsilontonos Omega -89 +KPX Upsilontonos alphatonos -100 +KPX Upsilontonos etatonos -55 +KPX Upsilontonos iotatonos -55 +KPX Upsilontonos eta -55 +KPX Upsilontonos iota -55 +KPX Upsilontonos kappa -79 +KPX Upsilontonos mu -79 +KPX Upsilontonos omicron -100 +KPX Upsilontonos iotadieresis -55 +KPX Upsilontonos omicrontonos -100 +KPX Omegatonos Upsilon -50 +KPX Alpha space -55 +KPX Alpha quoteright -110 +KPX Alpha Theta -41 +KPX Alpha Phi -41 +KPX Alpha Omicron -41 +KPX Alpha Tau -110 +KPX Alpha Upsilon -152 +KPX Alpha Upsilondieresis -152 +KPX Alpha gamma -69 +KPX Alpha nu -74 +KPX Alpha chi -69 +KPX Delta space -55 +KPX Delta Omicron -18 +KPX Delta Tau -69 +KPX Delta Upsilon -93 +KPX Delta Upsilondieresis -93 +KPX Kappa Theta -69 +KPX Kappa Phi -69 +KPX Kappa alpha -37 +KPX Kappa delta -37 +KPX Kappa sigma -37 +KPX Kappa phi -37 +KPX Kappa Omicron -69 +KPX Kappa Tau -44 +KPX Kappa alphatonos -37 +KPX Kappa zeta -37 +KPX Kappa theta -37 +KPX Kappa xi -37 +KPX Kappa omega -37 +KPX Kappa omegatonos -37 +KPX Lambda space -26 +KPX Lambda Theta -41 +KPX Lambda Omicron -41 +KPX Lambda Tau -110 +KPX Lambda Upsilon -152 +KPX Lambda Upsilondieresis -152 +KPX Omicron Alpha -48 +KPX Omicron Delta -25 +KPX Omicron Lambda -48 +KPX Omicron Upsilon -50 +KPX Omicron Upsilondieresis -50 +KPX Rho comma -110 +KPX Rho period -110 +KPX Rho Alpha -91 +KPX Rho Delta -78 +KPX Rho Lambda -91 +KPX Sigma tau -18 +KPX Tau space -18 +KPX Tau comma -74 +KPX Tau hyphen -91 +KPX Tau period -74 +KPX Tau colon -49 +KPX Tau semicolon -49 +KPX Tau Theta -18 +KPX Tau Phi -18 +KPX Tau alpha -69 +KPX Tau delta -69 +KPX Tau epsilon -69 +KPX Tau sigma -69 +KPX Tau phi -69 +KPX Tau iotadieresistonos 37 +KPX Tau Alpha -80 +KPX Tau Delta -84 +KPX Tau Lambda -108 +KPX Tau Omicron -18 +KPX Tau Omega -18 +KPX Tau alphatonos -69 +KPX Tau epsilontonos -69 +KPX Tau gamma -50 +KPX Tau eta -37 +KPX Tau iota -35 +KPX Tau mu -37 +KPX Tau nu -35 +KPX Tau omicron -69 +KPX Tau chi -35 +KPX Tau psi -37 +KPX Tau upsilondieresis -37 +KPX Tau omicrontonos -69 +KPX Tau upsilontonos -37 +KPX Upsilon space -37 +KPX Upsilon comma -128 +KPX Upsilon hyphen -110 +KPX Upsilon period -124 +KPX Upsilon colon -91 +KPX Upsilon semicolon -91 +KPX Upsilon Theta -89 +KPX Upsilon Phi -114 +KPX Upsilon alpha -100 +KPX Upsilon delta -83 +KPX Upsilon sigma -112 +KPX Upsilon phi -100 +KPX Upsilon Alpha -164 +KPX Upsilon Delta -125 +KPX Upsilon Lambda -164 +KPX Upsilon Omicron -89 +KPX Upsilon Omega -89 +KPX Upsilon alphatonos -100 +KPX Upsilon etatonos -55 +KPX Upsilon iotatonos -55 +KPX Upsilon gamma -101 +KPX Upsilon eta -55 +KPX Upsilon iota -55 +KPX Upsilon kappa -79 +KPX Upsilon mu -79 +KPX Upsilon omicron -100 +KPX Upsilon iotadieresis -55 +KPX Upsilon omicrontonos -100 +KPX Chi omega -32 +KPX Chi omegatonos -32 +KPX Psi alpha -64 +KPX Psi delta -64 +KPX Psi sigma -64 +KPX Psi phi -64 +KPX Psi alphatonos -64 +KPX Psi theta -18 +KPX Psi omicron -64 +KPX Psi omega -64 +KPX Psi omicrontonos -64 +KPX Psi omegatonos -64 +KPX Omega Upsilon -50 +KPX Omega Upsilondieresis -50 +KPX Upsilondieresis space -37 +KPX Upsilondieresis Theta -89 +KPX Upsilondieresis Phi -89 +KPX Upsilondieresis alpha -100 +KPX Upsilondieresis delta -83 +KPX Upsilondieresis sigma -112 +KPX Upsilondieresis phi -100 +KPX Upsilondieresis Alpha -164 +KPX Upsilondieresis Delta -125 +KPX Upsilondieresis Lambda -164 +KPX Upsilondieresis Omicron -89 +KPX Upsilondieresis Omega -89 +KPX Upsilondieresis alphatonos -100 +KPX Upsilondieresis etatonos -55 +KPX Upsilondieresis iotatonos -55 +KPX Upsilondieresis eta -55 +KPX Upsilondieresis iota -55 +KPX Upsilondieresis kappa -79 +KPX Upsilondieresis mu -79 +KPX Upsilondieresis omicron -100 +KPX Upsilondieresis iotadieresis -55 +KPX Upsilondieresis omicrontonos -100 +KPX gamma epsilon -17 +KPX zeta alpha -36 +KPX zeta delta -36 +KPX zeta sigma -36 +KPX zeta tau -73 +KPX zeta phi -36 +KPX zeta alphatonos -36 +KPX zeta etatonos -39 +KPX zeta gamma -36 +KPX zeta eta -39 +KPX zeta theta -36 +KPX zeta iota -59 +KPX zeta kappa -29 +KPX zeta nu -36 +KPX zeta omicron -37 +KPX zeta omega -36 +KPX zeta omicrontonos -36 +KPX zeta omegatonos -36 +KPX kappa alpha -9 +KPX kappa delta -22 +KPX kappa sigma -22 +KPX kappa phi -9 +KPX kappa alphatonos -9 +KPX kappa xi -22 +KPX kappa omicron -22 +KPX kappa sigma1 -22 +KPX kappa omega -9 +KPX kappa omicrontonos -22 +KPX kappa omegatonos -9 +KPX lambda etatonos -9 +KPX lambda upsilondieresistonos -18 +KPX lambda eta -9 +KPX lambda iota -12 +KPX lambda kappa -9 +KPX lambda nu -19 +KPX lambda upsilon -18 +KPX lambda upsilondieresis -18 +KPX lambda upsilontonos -18 +KPX xi alpha -37 +KPX xi delta -37 +KPX xi sigma -37 +KPX xi phi -37 +KPX xi alphatonos -37 +KPX xi zeta -37 +KPX xi xi -37 +KPX xi omicron -37 +KPX xi sigma1 -37 +KPX xi omicrontonos -37 +KPX chi alpha -22 +KPX chi delta -22 +KPX chi sigma -22 +KPX chi phi -22 +KPX chi alphatonos -22 +KPX chi omicron -22 +KPX chi sigma1 -22 +KPX chi omega -22 +KPX chi omicrontonos -22 +KPX chi omegatonos -22 +KPX afii10052 comma -138 +KPX afii10052 period -138 +KPX afii10052 guillemotleft -63 +KPX afii10052 guillemotright -25 +KPX afii10052 emdash -25 +KPX afii10058 quoteright -50 +KPX afii10059 quoteright -50 +KPX afii10017 quoteright -88 +KPX afii10017 afii10025 -25 +KPX afii10017 afii10032 -50 +KPX afii10017 afii10035 -50 +KPX afii10017 afii10036 -88 +KPX afii10017 afii10037 -88 +KPX afii10017 afii10038 -63 +KPX afii10017 afii10041 -152 +KPX afii10017 afii10047 -25 +KPX afii10017 afii10065 -13 +KPX afii10017 afii10066 -51 +KPX afii10017 afii10070 -25 +KPX afii10017 afii10080 -51 +KPX afii10017 afii10083 -25 +KPX afii10017 afii10084 -50 +KPX afii10017 afii10085 -50 +KPX afii10017 afii10086 -38 +KPX afii10018 afii10017 -13 +KPX afii10018 afii10021 -38 +KPX afii10018 afii10024 -25 +KPX afii10018 afii10029 -25 +KPX afii10018 afii10032 -7 +KPX afii10018 afii10035 -7 +KPX afii10018 afii10036 -13 +KPX afii10018 afii10037 -35 +KPX afii10018 afii10038 -15 +KPX afii10018 afii10039 -25 +KPX afii10018 afii10041 -50 +KPX afii10018 afii10044 -38 +KPX afii10018 afii10049 -33 +KPX afii10018 afii10069 -25 +KPX afii10018 afii10077 -13 +KPX afii10018 afii10085 -25 +KPX afii10019 afii10017 -63 +KPX afii10019 afii10021 -38 +KPX afii10019 afii10024 -25 +KPX afii10019 afii10029 -38 +KPX afii10019 afii10036 -13 +KPX afii10019 afii10037 -81 +KPX afii10019 afii10039 -25 +KPX afii10019 afii10041 -50 +KPX afii10019 afii10044 -53 +KPX afii10019 afii10049 -50 +KPX afii10019 afii10069 -25 +KPX afii10019 afii10085 -13 +KPX afii10019 afii10087 -13 +KPX afii10019 afii10089 -25 +KPX afii10020 comma -113 +KPX afii10020 period -113 +KPX afii10020 guillemotleft -63 +KPX afii10020 guillemotright -25 +KPX afii10020 emdash -25 +KPX afii10020 afii10017 -109 +KPX afii10020 afii10021 -88 +KPX afii10020 afii10025 25 +KPX afii10020 afii10029 -75 +KPX afii10020 afii10030 -13 +KPX afii10020 afii10032 -25 +KPX afii10020 afii10035 -13 +KPX afii10020 afii10049 -75 +KPX afii10020 afii10065 -25 +KPX afii10020 afii10067 -38 +KPX afii10020 afii10069 -75 +KPX afii10020 afii10070 -76 +KPX afii10020 afii10074 -38 +KPX afii10020 afii10077 -75 +KPX afii10020 afii10078 -38 +KPX afii10020 afii10079 -38 +KPX afii10020 afii10080 -88 +KPX afii10020 afii10082 -63 +KPX afii10020 afii10085 -38 +KPX afii10020 afii10093 -63 +KPX afii10020 afii10094 -63 +KPX afii10020 afii10096 -50 +KPX afii10020 afii10097 -75 +KPX afii10021 afii10025 25 +KPX afii10021 afii10037 12 +KPX afii10021 afii10047 25 +KPX afii10021 afii10070 12 +KPX afii10021 afii10073 25 +KPX afii10022 afii10025 12 +KPX afii10022 afii10029 -13 +KPX afii10024 afii10025 -25 +KPX afii10024 afii10032 -25 +KPX afii10024 afii10035 -25 +KPX afii10024 afii10036 -17 +KPX afii10024 afii10037 -14 +KPX afii10024 afii10044 -10 +KPX afii10024 afii10065 -25 +KPX afii10024 afii10066 -50 +KPX afii10024 afii10070 -51 +KPX afii10024 afii10080 -51 +KPX afii10024 afii10085 -49 +KPX afii10025 afii10021 -61 +KPX afii10025 afii10024 -13 +KPX afii10025 afii10029 -44 +KPX afii10025 afii10037 -25 +KPX afii10025 afii10041 -38 +KPX afii10025 afii10049 -38 +KPX afii10025 afii10069 -25 +KPX afii10025 afii10077 -13 +KPX afii10028 afii10032 -25 +KPX afii10028 afii10035 -25 +KPX afii10028 afii10037 -20 +KPX afii10028 afii10038 -44 +KPX afii10028 afii10041 -13 +KPX afii10028 afii10047 12 +KPX afii10028 afii10065 -13 +KPX afii10028 afii10070 -38 +KPX afii10028 afii10073 -13 +KPX afii10028 afii10080 -50 +KPX afii10028 afii10083 -25 +KPX afii10028 afii10084 -38 +KPX afii10028 afii10085 -75 +KPX afii10028 afii10095 -13 +KPX afii10029 afii10038 -13 +KPX afii10029 afii10066 -13 +KPX afii10029 afii10070 -7 +KPX afii10029 afii10080 -25 +KPX afii10029 afii10085 -25 +KPX afii10030 afii10038 -13 +KPX afii10030 afii10070 -13 +KPX afii10030 afii10080 -25 +KPX afii10030 afii10085 -25 +KPX afii10030 afii10089 -38 +KPX afii10032 afii10017 -50 +KPX afii10032 afii10021 -50 +KPX afii10032 afii10024 -25 +KPX afii10032 afii10029 -50 +KPX afii10032 afii10035 12 +KPX afii10032 afii10037 -56 +KPX afii10032 afii10038 12 +KPX afii10032 afii10039 -78 +KPX afii10032 afii10041 -25 +KPX afii10032 afii10049 -72 +KPX afii10032 afii10069 -13 +KPX afii10034 comma -125 +KPX afii10034 period -125 +KPX afii10034 colon 37 +KPX afii10034 semicolon 37 +KPX afii10034 guillemotright 25 +KPX afii10034 afii10017 -128 +KPX afii10034 afii10021 -75 +KPX afii10034 afii10024 -35 +KPX afii10034 afii10025 12 +KPX afii10034 afii10029 -75 +KPX afii10034 afii10032 12 +KPX afii10034 afii10035 12 +KPX afii10034 afii10036 12 +KPX afii10034 afii10037 -25 +KPX afii10034 afii10038 -17 +KPX afii10034 afii10039 -71 +KPX afii10034 afii10049 -63 +KPX afii10034 afii10069 -38 +KPX afii10034 afii10070 -13 +KPX afii10034 afii10080 -25 +KPX afii10034 afii10095 25 +KPX afii10034 afii10097 -38 +KPX afii10035 afii10017 -50 +KPX afii10035 afii10021 -50 +KPX afii10035 afii10029 -25 +KPX afii10035 afii10037 -13 +KPX afii10035 afii10039 -26 +KPX afii10035 afii10041 -25 +KPX afii10035 afii10044 -13 +KPX afii10035 afii10066 12 +KPX afii10035 afii10070 12 +KPX afii10035 afii10083 12 +KPX afii10035 afii10084 -13 +KPX afii10035 afii10085 -25 +KPX afii10035 afii10089 -13 +KPX afii10035 afii10095 12 +KPX afii10036 comma -100 +KPX afii10036 period -100 +KPX afii10036 guillemotleft -50 +KPX afii10036 guillemotright -26 +KPX afii10036 afii10017 -50 +KPX afii10036 afii10021 -63 +KPX afii10036 afii10029 -50 +KPX afii10036 afii10030 -13 +KPX afii10036 afii10032 -13 +KPX afii10036 afii10038 -22 +KPX afii10036 afii10049 -38 +KPX afii10036 afii10065 -25 +KPX afii10036 afii10067 -50 +KPX afii10036 afii10070 -38 +KPX afii10036 afii10074 -25 +KPX afii10036 afii10076 -25 +KPX afii10036 afii10077 -50 +KPX afii10036 afii10078 -25 +KPX afii10036 afii10080 -75 +KPX afii10036 afii10081 -38 +KPX afii10036 afii10082 -38 +KPX afii10036 afii10083 -38 +KPX afii10036 afii10085 -50 +KPX afii10036 afii10087 -50 +KPX afii10036 afii10091 -38 +KPX afii10036 afii10093 -50 +KPX afii10036 afii10094 -63 +KPX afii10036 afii10096 -50 +KPX afii10036 afii10097 -38 +KPX afii10037 comma -163 +KPX afii10037 period -163 +KPX afii10037 colon -38 +KPX afii10037 semicolon -38 +KPX afii10037 guillemotleft -88 +KPX afii10037 guillemotright -63 +KPX afii10037 emdash -25 +KPX afii10037 afii10017 -191 +KPX afii10037 afii10021 -101 +KPX afii10037 afii10025 -13 +KPX afii10037 afii10029 -113 +KPX afii10037 afii10032 -50 +KPX afii10037 afii10038 -74 +KPX afii10037 afii10047 -13 +KPX afii10037 afii10049 -113 +KPX afii10037 afii10066 -63 +KPX afii10037 afii10067 -113 +KPX afii10037 afii10068 -88 +KPX afii10037 afii10069 -140 +KPX afii10037 afii10070 -120 +KPX afii10037 afii10072 -88 +KPX afii10037 afii10073 -88 +KPX afii10037 afii10074 -88 +KPX afii10037 afii10075 -50 +KPX afii10037 afii10076 -88 +KPX afii10037 afii10077 -113 +KPX afii10037 afii10078 -88 +KPX afii10037 afii10079 -88 +KPX afii10037 afii10080 -113 +KPX afii10037 afii10081 -88 +KPX afii10037 afii10082 -88 +KPX afii10037 afii10083 -120 +KPX afii10037 afii10087 -100 +KPX afii10037 afii10088 -88 +KPX afii10037 afii10090 -88 +KPX afii10037 afii10091 -88 +KPX afii10037 afii10096 -88 +KPX afii10037 afii10097 -113 +KPX afii10038 afii10017 -63 +KPX afii10038 afii10021 -88 +KPX afii10038 afii10029 -75 +KPX afii10038 afii10032 12 +KPX afii10038 afii10036 -25 +KPX afii10038 afii10037 -76 +KPX afii10038 afii10041 -63 +KPX afii10038 afii10049 -88 +KPX afii10038 afii10077 -50 +KPX afii10039 afii10025 -25 +KPX afii10039 afii10032 -51 +KPX afii10039 afii10035 -38 +KPX afii10039 afii10038 -88 +KPX afii10039 afii10047 -13 +KPX afii10039 afii10080 -63 +KPX afii10039 afii10085 -88 +KPX afii10040 afii10032 -13 +KPX afii10040 afii10080 -13 +KPX afii10043 afii10085 12 +KPX afii10044 quoteright -63 +KPX afii10044 afii10049 -60 +KPX afii10046 quoteright -63 +KPX afii10046 afii10017 -43 +KPX afii10046 afii10021 -73 +KPX afii10046 afii10024 -63 +KPX afii10046 afii10025 -38 +KPX afii10046 afii10029 -40 +KPX afii10046 afii10030 -40 +KPX afii10046 afii10032 -25 +KPX afii10046 afii10035 -25 +KPX afii10046 afii10036 -75 +KPX afii10046 afii10039 -72 +KPX afii10046 afii10041 -112 +KPX afii10046 afii10047 -13 +KPX afii10046 afii10049 -53 +KPX afii10047 afii10021 -84 +KPX afii10047 afii10024 -25 +KPX afii10047 afii10025 12 +KPX afii10047 afii10029 -63 +KPX afii10047 afii10032 12 +KPX afii10047 afii10038 5 +KPX afii10047 afii10039 -51 +KPX afii10047 afii10049 -54 +KPX afii10047 afii10069 -25 +KPX afii10047 afii10077 -13 +KPX afii10048 afii10017 -38 +KPX afii10048 afii10021 -75 +KPX afii10048 afii10024 -70 +KPX afii10048 afii10029 -50 +KPX afii10048 afii10032 12 +KPX afii10048 afii10036 -25 +KPX afii10048 afii10039 -91 +KPX afii10048 afii10041 -38 +KPX afii10048 afii10069 -25 +KPX afii10048 afii10072 12 +KPX afii10048 afii10077 -13 +KPX afii10065 afii10077 9 +KPX afii10065 afii10081 -13 +KPX afii10065 afii10084 -26 +KPX afii10065 afii10085 -51 +KPX afii10065 afii10089 -40 +KPX afii10066 afii10069 -25 +KPX afii10066 afii10070 -13 +KPX afii10066 afii10072 -25 +KPX afii10066 afii10077 -25 +KPX afii10066 afii10078 -10 +KPX afii10066 afii10085 -38 +KPX afii10066 afii10087 -38 +KPX afii10066 afii10089 -38 +KPX afii10066 afii10092 -25 +KPX afii10066 afii10097 -25 +KPX afii10067 afii10065 -13 +KPX afii10067 afii10066 -13 +KPX afii10067 afii10069 -25 +KPX afii10067 afii10070 -6 +KPX afii10067 afii10072 -29 +KPX afii10067 afii10077 -13 +KPX afii10067 afii10078 -17 +KPX afii10067 afii10080 -7 +KPX afii10067 afii10083 -6 +KPX afii10067 afii10084 -25 +KPX afii10067 afii10085 -34 +KPX afii10067 afii10086 -13 +KPX afii10067 afii10089 -38 +KPX afii10067 afii10092 -25 +KPX afii10067 afii10097 -13 +KPX afii10068 comma -113 +KPX afii10068 period -113 +KPX afii10068 afii10069 -50 +KPX afii10068 afii10070 -13 +KPX afii10068 afii10077 -51 +KPX afii10068 afii10078 -13 +KPX afii10068 afii10080 -25 +KPX afii10068 afii10097 -25 +KPX afii10069 afii10073 12 +KPX afii10069 afii10095 25 +KPX afii10070 e 12 +KPX afii10070 afii10065 12 +KPX afii10070 afii10069 -13 +KPX afii10070 afii10073 12 +KPX afii10070 afii10083 25 +KPX afii10070 afii10085 -25 +KPX afii10070 afii10086 12 +KPX afii10070 afii10087 -13 +KPX afii10070 afii10089 -25 +KPX afii10072 afii10066 -13 +KPX afii10072 afii10070 -13 +KPX afii10072 afii10073 12 +KPX afii10072 afii10080 -25 +KPX afii10072 afii10083 -18 +KPX afii10072 afii10089 -25 +KPX afii10072 afii10092 -13 +KPX afii10073 afii10069 -18 +KPX afii10073 afii10072 -18 +KPX afii10073 afii10073 12 +KPX afii10073 afii10078 -14 +KPX afii10073 afii10080 -6 +KPX afii10073 afii10085 -21 +KPX afii10073 afii10086 -7 +KPX afii10073 afii10089 -20 +KPX afii10073 afii10092 -17 +KPX afii10076 guillemotleft -26 +KPX afii10076 afii10065 -15 +KPX afii10076 afii10066 -25 +KPX afii10076 afii10070 -25 +KPX afii10076 afii10073 -13 +KPX afii10076 afii10080 -51 +KPX afii10076 afii10083 -25 +KPX afii10076 afii10084 -13 +KPX afii10076 afii10085 -14 +KPX afii10076 afii10086 -25 +KPX afii10076 afii10089 -39 +KPX afii10076 afii10095 -13 +KPX afii10078 afii10065 -7 +KPX afii10078 afii10095 12 +KPX afii10080 afii10069 -29 +KPX afii10080 afii10070 12 +KPX afii10080 afii10072 -25 +KPX afii10080 afii10077 -13 +KPX afii10080 afii10078 -19 +KPX afii10080 afii10083 25 +KPX afii10080 afii10084 -13 +KPX afii10080 afii10085 -38 +KPX afii10080 afii10087 -25 +KPX afii10080 afii10089 -26 +KPX afii10080 afii10095 12 +KPX afii10080 afii10097 -19 +KPX afii10082 afii10069 -13 +KPX afii10082 afii10073 12 +KPX afii10082 afii10077 -13 +KPX afii10082 afii10078 -15 +KPX afii10082 afii10084 -13 +KPX afii10082 afii10085 -13 +KPX afii10082 afii10089 -25 +KPX afii10082 afii10095 25 +KPX afii10083 afii10065 12 +KPX afii10083 afii10066 12 +KPX afii10083 afii10070 12 +KPX afii10083 afii10073 25 +KPX afii10083 afii10085 -13 +KPX afii10083 afii10086 12 +KPX afii10083 afii10087 -13 +KPX afii10083 afii10089 -20 +KPX afii10083 afii10095 12 +KPX afii10084 comma -75 +KPX afii10084 period -75 +KPX afii10084 afii10065 12 +KPX afii10084 afii10069 -13 +KPX afii10084 afii10072 12 +KPX afii10084 afii10073 12 +KPX afii10084 afii10077 -25 +KPX afii10084 afii10080 -13 +KPX afii10084 afii10082 12 +KPX afii10084 afii10083 12 +KPX afii10084 afii10085 -13 +KPX afii10084 afii10095 25 +KPX afii10084 afii10097 -13 +KPX afii10085 comma -100 +KPX afii10085 period -100 +KPX afii10085 colon -13 +KPX afii10085 semicolon -13 +KPX afii10085 guillemotright 25 +KPX afii10085 afii10065 -13 +KPX afii10085 afii10066 -13 +KPX afii10085 afii10069 -63 +KPX afii10085 afii10070 -13 +KPX afii10085 afii10072 -13 +KPX afii10085 afii10077 -44 +KPX afii10085 afii10078 -13 +KPX afii10085 afii10080 -25 +KPX afii10085 afii10086 -25 +KPX afii10085 afii10097 -25 +KPX afii10086 afii10069 -25 +KPX afii10086 afii10077 -25 +KPX afii10086 afii10085 -25 +KPX afii10086 afii10086 -6 +KPX afii10086 afii10089 -27 +KPX afii10086 afii10097 -13 +KPX afii10087 afii10065 -13 +KPX afii10087 afii10066 -38 +KPX afii10087 afii10070 -25 +KPX afii10087 afii10073 -13 +KPX afii10087 afii10080 -38 +KPX afii10087 afii10083 -29 +KPX afii10087 afii10084 -25 +KPX afii10087 afii10085 -38 +KPX afii10087 afii10086 -38 +KPX afii10087 afii10089 -50 +KPX afii10087 afii10092 -38 +KPX afii10087 afii10095 -13 +KPX afii10088 afii10073 12 +KPX afii10094 afii10084 -38 +KPX afii10094 afii10089 -76 +KPX afii10095 afii10069 -52 +KPX afii10095 afii10072 -37 +KPX afii10095 afii10077 -18 +KPX afii10095 afii10078 -9 +KPX afii10095 afii10086 -6 +KPX afii10095 afii10087 -39 +KPX afii10095 afii10097 -13 +KPX afii10096 afii10069 -51 +KPX afii10096 afii10072 -25 +KPX afii10096 afii10077 -25 +KPX afii10096 afii10078 -13 +KPX afii10096 afii10084 -13 +KPX afii10096 afii10086 -6 +KPX afii10096 afii10087 -39 +KPX afii10096 afii10089 -38 +KPX afii10110 comma -100 +KPX afii10110 period -100 +KPX afii10110 guillemotright 12 +KPX afii10050 comma -99 +KPX afii10050 period -99 +KPX afii10050 colon -25 +KPX afii10050 semicolon -25 +KPX afii10050 guillemotleft -88 +KPX afii10050 guillemotright -38 +KPX afii10050 emdash -25 +EndKernPairs +EndKernData +EndFontMetrics diff --git a/gulliver/thirdparty/html2ps_pdf/fonts/times.ttf b/thirdparty/html2ps_pdf/fonts/times.ttf similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/fonts/times.ttf rename to thirdparty/html2ps_pdf/fonts/times.ttf diff --git a/gulliver/thirdparty/html2ps_pdf/fonts/timesbd.afm b/thirdparty/html2ps_pdf/fonts/timesbd.afm similarity index 97% rename from gulliver/thirdparty/html2ps_pdf/fonts/timesbd.afm rename to thirdparty/html2ps_pdf/fonts/timesbd.afm index a957e69cf..1029ddd43 100644 --- a/gulliver/thirdparty/html2ps_pdf/fonts/timesbd.afm +++ b/thirdparty/html2ps_pdf/fonts/timesbd.afm @@ -1,2597 +1,2597 @@ -StartFontMetrics 4.1 -FontName TimesNewRomanPS-BoldMT -FullName Times New Roman Bold -Notice Typeface The Monotype Corporation plc. Data The Monotype Corporation plc/Type Solutions Inc. 1990-1992. All Rights Reserved -EncodingScheme FontSpecific -FamilyName Times New Roman -Weight Bold -Version Version 3.00 -Characters 1674 -ItalicAngle 0.0 -Ascender 891 -Descender -216 -UnderlineThickness 95 -UnderlinePosition -109 -IsFixedPitch false -FontBBox -556 -307 2000 1026 -StartCharMetrics 1709 -C 0 ; WX 778 ; N .notdef ; B 139 0 639 625 ; -C 1 ; WX 778 ; N .notdef ; B 139 0 639 625 ; -C 2 ; WX 778 ; N .notdef ; B 139 0 639 625 ; -C 3 ; WX 778 ; N .notdef ; B 139 0 639 625 ; -C 4 ; WX 778 ; N .notdef ; B 139 0 639 625 ; -C 5 ; WX 778 ; N .notdef ; B 139 0 639 625 ; -C 6 ; WX 778 ; N .notdef ; B 139 0 639 625 ; -C 7 ; WX 778 ; N .notdef ; B 139 0 639 625 ; -C 8 ; WX 778 ; N .notdef ; B 139 0 639 625 ; -C 9 ; WX 778 ; N .notdef ; B 139 0 639 625 ; -C 10 ; WX 778 ; N .notdef ; B 139 0 639 625 ; -C 11 ; WX 778 ; N .notdef ; B 139 0 639 625 ; -C 12 ; WX 778 ; N .notdef ; B 139 0 639 625 ; -C 13 ; WX 778 ; N .notdef ; B 139 0 639 625 ; -C 14 ; WX 778 ; N .notdef ; B 139 0 639 625 ; -C 15 ; WX 778 ; N .notdef ; B 139 0 639 625 ; -C 16 ; WX 778 ; N .notdef ; B 139 0 639 625 ; -C 17 ; WX 778 ; N .notdef ; B 139 0 639 625 ; -C 18 ; WX 778 ; N .notdef ; B 139 0 639 625 ; -C 19 ; WX 778 ; N .notdef ; B 139 0 639 625 ; -C 20 ; WX 778 ; N .notdef ; B 139 0 639 625 ; -C 21 ; WX 778 ; N .notdef ; B 139 0 639 625 ; -C 22 ; WX 778 ; N .notdef ; B 139 0 639 625 ; -C 23 ; WX 778 ; N .notdef ; B 139 0 639 625 ; -C 24 ; WX 778 ; N .notdef ; B 139 0 639 625 ; -C 25 ; WX 778 ; N .notdef ; B 139 0 639 625 ; -C 26 ; WX 778 ; N .notdef ; B 139 0 639 625 ; -C 27 ; WX 778 ; N .notdef ; B 139 0 639 625 ; -C 28 ; WX 778 ; N .notdef ; B 139 0 639 625 ; -C 29 ; WX 778 ; N .notdef ; B 139 0 639 625 ; -C 30 ; WX 778 ; N .notdef ; B 139 0 639 625 ; -C 31 ; WX 778 ; N .notdef ; B 139 0 639 625 ; -C 32 ; WX 250 ; N space ; B 85 -13 248 677 ; -C 33 ; WX 333 ; N exclam ; B 85 -13 248 677 ; -C 34 ; WX 555 ; N quotedbl ; B 86 352 466 677 ; -C 35 ; WX 500 ; N numbersign ; B 20 -14 480 676 ; -C 36 ; WX 500 ; N dollar ; B 39 -67 468 680 ; -C 37 ; WX 1000 ; N percent ; B 69 -28 931 677 ; -C 38 ; WX 833 ; N ampersand ; B 40 -15 790 677 ; -C 39 ; WX 278 ; N quotesingle ; B 68 353 212 677 ; -C 40 ; WX 333 ; N parenleft ; B 40 -200 321 677 ; -C 41 ; WX 333 ; N parenright ; B 12 -200 293 677 ; -C 42 ; WX 500 ; N asterisk ; B 56 299 444 677 ; -C 43 ; WX 570 ; N plus ; B 20 66 553 598 ; -C 44 ; WX 250 ; N comma ; B 32 -175 217 150 ; -C 45 ; WX 333 ; N hyphen ; B 24 179 309 280 ; -C 46 ; WX 250 ; N period ; B 44 -12 207 150 ; -C 47 ; WX 278 ; N slash ; B 1 -15 281 677 ; -C 48 ; WX 500 ; N zero ; B 36 -14 463 676 ; -C 49 ; WX 500 ; N one ; B 66 0 423 676 ; -C 50 ; WX 500 ; N two ; B 24 0 451 676 ; -C 51 ; WX 500 ; N three ; B 16 -14 442 676 ; -C 52 ; WX 500 ; N four ; B 25 0 459 676 ; -C 53 ; WX 500 ; N five ; B 34 -14 462 662 ; -C 54 ; WX 500 ; N six ; B 37 -14 470 676 ; -C 55 ; WX 500 ; N seven ; B 34 -14 476 662 ; -C 56 ; WX 500 ; N eight ; B 35 -14 465 673 ; -C 57 ; WX 500 ; N nine ; B 31 -14 464 676 ; -C 58 ; WX 333 ; N colon ; B 85 -12 248 470 ; -C 59 ; WX 333 ; N semicolon ; B 74 -175 259 470 ; -C 60 ; WX 570 ; N less ; B 20 90 553 568 ; -C 61 ; WX 570 ; N equal ; B 20 218 554 441 ; -C 62 ; WX 570 ; N greater ; B 20 90 553 568 ; -C 63 ; WX 500 ; N question ; B 61 -13 444 677 ; -C 64 ; WX 930 ; N at ; B 45 -216 908 677 ; -C 65 ; WX 722 ; N A ; B 8 0 711 676 ; -C 66 ; WX 667 ; N B ; B 21 0 632 662 ; -C 67 ; WX 722 ; N C ; B 40 -15 667 677 ; -C 68 ; WX 722 ; N D ; B 13 0 680 662 ; -C 69 ; WX 667 ; N E ; B 20 0 622 662 ; -C 70 ; WX 611 ; N F ; B 22 0 581 662 ; -C 71 ; WX 778 ; N G ; B 41 -16 768 678 ; -C 72 ; WX 778 ; N H ; B 21 0 760 662 ; -C 73 ; WX 389 ; N I ; B 20 0 366 662 ; -C 74 ; WX 500 ; N J ; B 11 -15 494 662 ; -C 75 ; WX 778 ; N K ; B 22 0 789 662 ; -C 76 ; WX 667 ; N L ; B 19 0 631 662 ; -C 77 ; WX 944 ; N M ; B 20 0 926 662 ; -C 78 ; WX 722 ; N N ; B 14 -15 699 662 ; -C 79 ; WX 778 ; N O ; B 39 -15 742 677 ; -C 80 ; WX 611 ; N P ; B 25 0 581 662 ; -C 81 ; WX 778 ; N Q ; B 39 -181 743 677 ; -C 82 ; WX 722 ; N R ; B 19 0 731 662 ; -C 83 ; WX 556 ; N S ; B 52 -16 516 677 ; -C 84 ; WX 667 ; N T ; B 36 0 631 662 ; -C 85 ; WX 722 ; N U ; B 23 -16 705 662 ; -C 86 ; WX 722 ; N V ; B 8 -15 712 662 ; -C 87 ; WX 1000 ; N W ; B 9 -15 991 662 ; -C 88 ; WX 722 ; N X ; B 7 0 715 662 ; -C 89 ; WX 722 ; N Y ; B 9 0 711 662 ; -C 90 ; WX 667 ; N Z ; B 16 0 649 662 ; -C 91 ; WX 333 ; N bracketleft ; B 104 -183 301 662 ; -C 92 ; WX 278 ; N backslash ; B 1 -15 281 677 ; -C 93 ; WX 333 ; N bracketright ; B 33 -183 229 662 ; -C 94 ; WX 581 ; N asciicircum ; B 72 325 510 676 ; -C 95 ; WX 500 ; N underscore ; B -9 -216 509 -152 ; -C 96 ; WX 333 ; N grave ; B 19 515 222 685 ; -C 97 ; WX 500 ; N a ; B 45 -6 483 470 ; -C 98 ; WX 556 ; N b ; B 21 -14 513 662 ; -C 99 ; WX 444 ; N c ; B 38 -14 421 470 ; -C 100 ; WX 556 ; N d ; B 39 -14 534 662 ; -C 101 ; WX 444 ; N e ; B 39 -14 420 470 ; -C 102 ; WX 333 ; N f ; B 32 0 407 677 ; -C 103 ; WX 500 ; N g ; B 38 -216 482 470 ; -C 104 ; WX 556 ; N h ; B 34 0 527 662 ; -C 105 ; WX 278 ; N i ; B 21 0 267 678 ; -C 106 ; WX 333 ; N j ; B -28 -216 249 677 ; -C 107 ; WX 556 ; N k ; B 33 0 565 662 ; -C 108 ; WX 278 ; N l ; B 21 0 268 662 ; -C 109 ; WX 833 ; N m ; B 37 0 807 470 ; -C 110 ; WX 556 ; N n ; B 34 0 527 470 ; -C 111 ; WX 500 ; N o ; B 36 -14 464 470 ; -C 112 ; WX 556 ; N p ; B 19 -214 513 470 ; -C 113 ; WX 556 ; N q ; B 38 -214 536 470 ; -C 114 ; WX 444 ; N r ; B 37 0 429 470 ; -C 115 ; WX 389 ; N s ; B 40 -14 354 470 ; -C 116 ; WX 333 ; N t ; B 19 -6 323 624 ; -C 117 ; WX 556 ; N u ; B 31 -14 524 457 ; -C 118 ; WX 500 ; N v ; B 9 -14 491 457 ; -C 119 ; WX 722 ; N w ; B 8 -14 712 457 ; -C 120 ; WX 500 ; N x ; B 23 0 484 457 ; -C 121 ; WX 500 ; N y ; B 8 -216 491 457 ; -C 122 ; WX 444 ; N z ; B 10 0 428 457 ; -C 123 ; WX 394 ; N braceleft ; B 81 -203 352 677 ; -C 124 ; WX 220 ; N bar ; B 78 -216 141 677 ; -C 125 ; WX 394 ; N braceright ; B 44 -202 315 678 ; -C 126 ; WX 520 ; N asciitilde ; B 19 188 551 347 ; -C 127 ; WX 778 ; N .notdef ; B 139 0 639 625 ; -C 128 ; WX 500 ; N Euro ; B -11 -14 484 676 ; -C 129 ; WX 636 ; N afii10052 ; B 20 0 604 888 ; -C 130 ; WX 333 ; N quotesinglbase ; B 74 -175 259 150 ; -C 131 ; WX 500 ; N florin ; B 0 -216 500 678 ; -C 132 ; WX 500 ; N quotedblbase ; B 41 -175 460 151 ; -C 133 ; WX 1000 ; N ellipsis ; B 85 -13 915 150 ; -C 134 ; WX 500 ; N dagger ; B 48 -196 451 662 ; -C 135 ; WX 500 ; N daggerdbl ; B 54 -198 446 662 ; -C 136 ; WX 333 ; N circumflex ; B 10 510 324 697 ; -C 137 ; WX 1000 ; N perthousand ; B 29 -28 971 677 ; -C 138 ; WX 556 ; N Scaron ; B 52 -16 516 891 ; -C 139 ; WX 333 ; N guilsinglleft ; B 45 3 287 452 ; -C 140 ; WX 1000 ; N OE ; B 36 -9 952 671 ; -C 141 ; WX 725 ; N afii10061 ; B 21 0 709 888 ; -C 142 ; WX 667 ; N Zcaron ; B 16 0 649 891 ; -C 143 ; WX 778 ; N afii10145 ; B 20 -193 750 662 ; -C 144 ; WX 500 ; N quotedblbase ; B 41 -175 460 151 ; -C 145 ; WX 333 ; N quoteleft ; B 74 352 259 677 ; -C 146 ; WX 333 ; N quoteright ; B 74 352 259 677 ; -C 147 ; WX 500 ; N quotedblleft ; B 40 351 459 677 ; -C 148 ; WX 500 ; N quotedblright ; B 41 351 460 677 ; -C 149 ; WX 350 ; N bullet ; B 38 190 316 470 ; -C 150 ; WX 500 ; N endash ; B -8 202 508 261 ; -C 151 ; WX 1000 ; N emdash ; B -10 201 1009 261 ; -C 152 ; WX 333 ; N tilde ; B 10 532 326 669 ; -C 153 ; WX 1000 ; N trademark ; B -1 268 1005 662 ; -C 154 ; WX 389 ; N scaron ; B 34 -14 354 697 ; -C 155 ; WX 333 ; N guilsinglright ; B 46 3 288 452 ; -C 156 ; WX 722 ; N oe ; B 34 -14 694 470 ; -C 157 ; WX 576 ; N afii10109 ; B 35 0 563 685 ; -C 158 ; WX 444 ; N zcaron ; B 10 0 428 697 ; -C 159 ; WX 722 ; N Ydieresis ; B 9 0 711 857 ; -C 160 ; WX 250 ; N space ; B 85 -13 248 677 ; -C 161 ; WX 333 ; N exclamdown ; B 85 -216 248 475 ; -C 162 ; WX 500 ; N cent ; B 63 -184 445 658 ; -C 163 ; WX 500 ; N sterling ; B 17 -14 479 680 ; -C 164 ; WX 500 ; N currency ; B 10 93 491 567 ; -C 165 ; WX 500 ; N yen ; B 0 0 499 662 ; -C 166 ; WX 220 ; N brokenbar ; B 78 -216 141 677 ; -C 167 ; WX 500 ; N section ; B 45 -216 455 677 ; -C 168 ; WX 333 ; N dieresis ; B 11 538 323 668 ; -C 169 ; WX 747 ; N copyright ; B 29 -15 722 677 ; -C 170 ; WX 300 ; N ordfeminine ; B 22 390 308 676 ; -C 171 ; WX 500 ; N guillemotleft ; B 18 4 482 453 ; -C 172 ; WX 570 ; N logicalnot ; B 20 218 554 440 ; -C 173 ; WX 333 ; N hyphen ; B 24 179 309 280 ; -C 174 ; WX 747 ; N registered ; B 29 -15 722 677 ; -C 175 ; WX 500 ; N overscore ; B -9 714 509 778 ; -C 176 ; WX 400 ; N degree ; B 29 338 367 676 ; -C 177 ; WX 549 ; N plusminus ; B 7 66 542 598 ; -C 178 ; WX 300 ; N twosuperior ; B 12 324 276 676 ; -C 179 ; WX 300 ; N threesuperior ; B 7 317 271 676 ; -C 180 ; WX 333 ; N acute ; B 111 515 315 685 ; -C 181 ; WX 576 ; N mu1 ; B 39 -215 559 457 ; -C 182 ; WX 540 ; N paragraph ; B 0 -216 542 662 ; -C 183 ; WX 250 ; N periodcentered ; B 43 249 207 413 ; -C 184 ; WX 333 ; N cedilla ; B 71 -188 237 6 ; -C 185 ; WX 300 ; N onesuperior ; B 36 324 260 676 ; -C 186 ; WX 330 ; N ordmasculine ; B 27 385 306 676 ; -C 187 ; WX 500 ; N guillemotright ; B 19 4 483 453 ; -C 188 ; WX 750 ; N onequarter ; B 35 -29 730 676 ; -C 189 ; WX 750 ; N onehalf ; B 35 -29 725 676 ; -C 190 ; WX 750 ; N threequarters ; B 6 -29 730 676 ; -C 191 ; WX 500 ; N questiondown ; B 56 -216 439 475 ; -C 192 ; WX 722 ; N Agrave ; B 8 0 711 888 ; -C 193 ; WX 722 ; N Aacute ; B 8 0 711 888 ; -C 194 ; WX 722 ; N Acircumflex ; B 8 0 711 888 ; -C 195 ; WX 722 ; N Atilde ; B 8 0 711 856 ; -C 196 ; WX 722 ; N Adieresis ; B 8 0 711 857 ; -C 197 ; WX 722 ; N Aring ; B 8 0 711 841 ; -C 198 ; WX 1000 ; N AE ; B -11 0 955 662 ; -C 199 ; WX 722 ; N Ccedilla ; B 40 -188 667 677 ; -C 200 ; WX 667 ; N Egrave ; B 20 0 622 888 ; -C 201 ; WX 667 ; N Eacute ; B 20 0 622 888 ; -C 202 ; WX 667 ; N Ecircumflex ; B 20 0 622 888 ; -C 203 ; WX 667 ; N Edieresis ; B 20 0 622 857 ; -C 204 ; WX 389 ; N Igrave ; B 20 0 366 888 ; -C 205 ; WX 389 ; N Iacute ; B 20 0 366 888 ; -C 206 ; WX 389 ; N Icircumflex ; B 20 0 366 888 ; -C 207 ; WX 389 ; N Idieresis ; B 20 0 366 857 ; -C 208 ; WX 722 ; N Eth ; B 17 0 684 662 ; -C 209 ; WX 722 ; N Ntilde ; B 14 -15 699 857 ; -C 210 ; WX 778 ; N Ograve ; B 39 -15 742 888 ; -C 211 ; WX 778 ; N Oacute ; B 39 -15 742 888 ; -C 212 ; WX 778 ; N Ocircumflex ; B 39 -15 742 888 ; -C 213 ; WX 778 ; N Otilde ; B 39 -15 742 857 ; -C 214 ; WX 778 ; N Odieresis ; B 39 -15 742 857 ; -C 215 ; WX 570 ; N multiply ; B 75 120 498 543 ; -C 216 ; WX 778 ; N Oslash ; B 40 -38 742 693 ; -C 217 ; WX 722 ; N Ugrave ; B 23 -16 705 888 ; -C 218 ; WX 722 ; N Uacute ; B 23 -16 705 888 ; -C 219 ; WX 722 ; N Ucircumflex ; B 23 -16 705 888 ; -C 220 ; WX 722 ; N Udieresis ; B 23 -16 705 857 ; -C 221 ; WX 722 ; N Yacute ; B 9 0 711 888 ; -C 222 ; WX 611 ; N Thorn ; B 20 0 577 662 ; -C 223 ; WX 556 ; N germandbls ; B 28 -5 506 677 ; -C 224 ; WX 500 ; N agrave ; B 45 -6 483 685 ; -C 225 ; WX 500 ; N aacute ; B 45 -6 483 685 ; -C 226 ; WX 500 ; N acircumflex ; B 45 -6 483 697 ; -C 227 ; WX 500 ; N atilde ; B 45 -6 483 670 ; -C 228 ; WX 500 ; N adieresis ; B 45 -6 483 668 ; -C 229 ; WX 500 ; N aring ; B 45 -6 483 702 ; -C 230 ; WX 722 ; N ae ; B 44 -14 693 470 ; -C 231 ; WX 444 ; N ccedilla ; B 38 -188 421 470 ; -C 232 ; WX 444 ; N egrave ; B 39 -14 420 685 ; -C 233 ; WX 444 ; N eacute ; B 39 -14 420 685 ; -C 234 ; WX 444 ; N ecircumflex ; B 39 -14 420 697 ; -C 235 ; WX 444 ; N edieresis ; B 39 -14 420 668 ; -C 236 ; WX 278 ; N igrave ; B -7 0 267 685 ; -C 237 ; WX 278 ; N iacute ; B 21 0 289 685 ; -C 238 ; WX 278 ; N icircumflex ; B -17 0 296 697 ; -C 239 ; WX 278 ; N idieresis ; B -15 0 298 668 ; -C 240 ; WX 500 ; N eth ; B 36 -14 464 677 ; -C 241 ; WX 556 ; N ntilde ; B 34 0 527 670 ; -C 242 ; WX 500 ; N ograve ; B 36 -14 464 685 ; -C 243 ; WX 500 ; N oacute ; B 36 -14 464 685 ; -C 244 ; WX 500 ; N ocircumflex ; B 36 -14 464 697 ; -C 245 ; WX 500 ; N otilde ; B 36 -14 464 670 ; -C 246 ; WX 500 ; N odieresis ; B 36 -14 464 668 ; -C 247 ; WX 549 ; N divide ; B 8 121 542 545 ; -C 248 ; WX 500 ; N oslash ; B 33 -14 467 483 ; -C 249 ; WX 556 ; N ugrave ; B 31 -14 524 685 ; -C 250 ; WX 556 ; N uacute ; B 31 -14 524 685 ; -C 251 ; WX 556 ; N ucircumflex ; B 31 -14 524 697 ; -C 252 ; WX 556 ; N udieresis ; B 31 -14 524 668 ; -C 253 ; WX 500 ; N yacute ; B 8 -216 491 685 ; -C 254 ; WX 556 ; N thorn ; B 19 -216 513 677 ; -C 255 ; WX 500 ; N ydieresis ; B 8 -216 491 668 ; -C -1 ; WX 0 ; N .null ; B 85 -13 248 677 ; -C -1 ; WX 250 ; N nonmarkingreturn ; B 85 -13 248 677 ; -C -1 ; WX 549 ; N notequal ; B 7 -143 542 679 ; -C -1 ; WX 713 ; N infinity ; B 26 52 687 461 ; -C -1 ; WX 549 ; N lessequal ; B 7 -90 542 625 ; -C -1 ; WX 549 ; N greaterequal ; B 7 -90 542 625 ; -C -1 ; WX 494 ; N partialdiff ; B 36 -11 472 700 ; -C -1 ; WX 713 ; N summation ; B 21 -216 693 693 ; -C -1 ; WX 823 ; N product ; B 22 -216 801 693 ; -C -1 ; WX 549 ; N pi1 ; B 24 -14 506 457 ; -C -1 ; WX 274 ; N integral ; B -1 -107 272 910 ; -C -1 ; WX 768 ; N Ohm ; B 4 0 766 741 ; -C -1 ; WX 549 ; N radical ; B 42 -38 550 913 ; -C -1 ; WX 549 ; N approxequal ; B 6 119 543 536 ; -C -1 ; WX 612 ; N increment ; B 14 0 600 677 ; -C -1 ; WX 494 ; N lozenge ; B 23 0 472 694 ; -C -1 ; WX 167 ; N fraction ; B -184 -29 351 676 ; -C -1 ; WX 556 ; N fi ; B 29 0 534 677 ; -C -1 ; WX 556 ; N fl ; B 26 0 532 677 ; -C -1 ; WX 278 ; N dotlessi ; B 21 0 267 457 ; -C -1 ; WX 333 ; N macron ; B 10 533 323 612 ; -C -1 ; WX 333 ; N breve ; B 19 521 314 677 ; -C -1 ; WX 333 ; N dotaccent ; B 95 524 239 668 ; -C -1 ; WX 333 ; N ring ; B 64 497 269 702 ; -C -1 ; WX 333 ; N hungarumlaut ; B 55 516 368 685 ; -C -1 ; WX 333 ; N ogonek ; B 50 -226 284 8 ; -C -1 ; WX 333 ; N caron ; B 10 510 324 697 ; -C -1 ; WX 667 ; N Lslash ; B 21 0 630 662 ; -C -1 ; WX 278 ; N lslash ; B 19 0 265 662 ; -C -1 ; WX 570 ; N minus ; B 20 299 553 363 ; -C -1 ; WX 500 ; N franc ; B 10 0 478 662 ; -C -1 ; WX 778 ; N Gbreve ; B 41 -16 768 875 ; -C -1 ; WX 500 ; N gbreve ; B 38 -216 482 677 ; -C -1 ; WX 389 ; N Idot ; B 20 0 366 857 ; -C -1 ; WX 556 ; N Scedilla ; B 52 -188 516 677 ; -C -1 ; WX 389 ; N scedilla ; B 40 -188 354 470 ; -C -1 ; WX 722 ; N Cacute ; B 40 -15 667 888 ; -C -1 ; WX 444 ; N cacute ; B 38 -14 421 685 ; -C -1 ; WX 722 ; N Ccaron ; B 40 -15 667 891 ; -C -1 ; WX 444 ; N ccaron ; B 38 -14 421 697 ; -C -1 ; WX 556 ; N dmacron ; B 39 -14 534 662 ; -C -1 ; WX 333 ; N middot ; B 214 281 343 409 ; -C -1 ; WX 722 ; N Abreve ; B 8 0 711 875 ; -C -1 ; WX 500 ; N abreve ; B 45 -6 483 677 ; -C -1 ; WX 722 ; N Aogonek ; B 8 -226 711 676 ; -C -1 ; WX 500 ; N aogonek ; B 45 -226 499 470 ; -C -1 ; WX 722 ; N Dcaron ; B 13 0 680 891 ; -C -1 ; WX 733 ; N dcaron ; B 41 -14 722 677 ; -C -1 ; WX 722 ; N Dslash ; B 17 0 684 662 ; -C -1 ; WX 667 ; N Eogonek ; B 20 -226 622 662 ; -C -1 ; WX 444 ; N eogonek ; B 39 -226 420 470 ; -C -1 ; WX 667 ; N Ecaron ; B 20 0 622 891 ; -C -1 ; WX 444 ; N ecaron ; B 39 -14 420 697 ; -C -1 ; WX 667 ; N Lacute ; B 19 0 631 888 ; -C -1 ; WX 278 ; N lacute ; B 21 0 280 888 ; -C -1 ; WX 667 ; N Lcaron ; B 19 0 631 677 ; -C -1 ; WX 469 ; N lcaron ; B 21 0 456 677 ; -C -1 ; WX 667 ; N Ldot ; B 19 0 631 662 ; -C -1 ; WX 396 ; N ldot ; B 21 0 406 662 ; -C -1 ; WX 722 ; N Nacute ; B 14 -15 699 888 ; -C -1 ; WX 556 ; N nacute ; B 34 0 527 685 ; -C -1 ; WX 722 ; N Ncaron ; B 14 -15 699 891 ; -C -1 ; WX 556 ; N ncaron ; B 34 0 527 697 ; -C -1 ; WX 778 ; N Odblacute ; B 39 -15 742 888 ; -C -1 ; WX 500 ; N odblacute ; B 36 -14 464 685 ; -C -1 ; WX 722 ; N Racute ; B 19 0 731 888 ; -C -1 ; WX 444 ; N racute ; B 37 0 429 685 ; -C -1 ; WX 722 ; N Rcaron ; B 19 0 731 891 ; -C -1 ; WX 444 ; N rcaron ; B 37 0 429 697 ; -C -1 ; WX 556 ; N Sacute ; B 52 -16 516 888 ; -C -1 ; WX 389 ; N sacute ; B 40 -14 354 685 ; -C -1 ; WX 667 ; N Tcedilla ; B 36 -241 631 662 ; -C -1 ; WX 333 ; N tcedilla ; B 19 -241 323 624 ; -C -1 ; WX 667 ; N Tcaron ; B 36 0 631 891 ; -C -1 ; WX 521 ; N tcaron ; B 18 -6 509 677 ; -C -1 ; WX 722 ; N Uring ; B 23 -16 705 907 ; -C -1 ; WX 556 ; N uring ; B 31 -14 524 702 ; -C -1 ; WX 722 ; N Udblacute ; B 23 -16 705 888 ; -C -1 ; WX 556 ; N udblacute ; B 31 -14 524 685 ; -C -1 ; WX 667 ; N Zacute ; B 16 0 649 888 ; -C -1 ; WX 444 ; N zacute ; B 10 0 428 685 ; -C -1 ; WX 667 ; N Zdot ; B 16 0 649 857 ; -C -1 ; WX 444 ; N zdot ; B 10 0 428 668 ; -C -1 ; WX 636 ; N Gamma ; B 20 0 604 662 ; -C -1 ; WX 778 ; N Theta ; B 38 -15 741 677 ; -C -1 ; WX 829 ; N Phi ; B 38 0 792 662 ; -C -1 ; WX 558 ; N alpha ; B 42 -14 537 470 ; -C -1 ; WX 519 ; N delta ; B 36 -14 478 677 ; -C -1 ; WX 427 ; N epsilon ; B 32 -14 413 470 ; -C -1 ; WX 544 ; N sigma ; B 36 -14 522 457 ; -C -1 ; WX 461 ; N tau ; B 1 -14 439 457 ; -C -1 ; WX 624 ; N phi ; B 39 -214 584 470 ; -C -1 ; WX 500 ; N underscoredbl ; B -9 -216 509 -52 ; -C -1 ; WX 604 ; N exclamdbl ; B 85 -13 518 677 ; -C -1 ; WX 348 ; N nsuperior ; B 21 271 333 555 ; -C -1 ; WX 969 ; N peseta ; B 19 -13 954 662 ; -C -1 ; WX 1000 ; N arrowleft ; B 39 77 961 428 ; -C -1 ; WX 500 ; N arrowup ; B 75 -209 426 654 ; -C -1 ; WX 1000 ; N arrowright ; B 39 77 961 428 ; -C -1 ; WX 500 ; N arrowdown ; B 75 -209 426 654 ; -C -1 ; WX 1000 ; N arrowboth ; B 39 77 961 429 ; -C -1 ; WX 500 ; N arrowupdn ; B 74 -208 425 714 ; -C -1 ; WX 500 ; N arrowupdnbse ; B 74 -303 425 714 ; -C -1 ; WX 979 ; N orthogonal ; B 177 0 802 625 ; -C -1 ; WX 719 ; N intersection ; B 89 0 630 698 ; -C -1 ; WX 570 ; N equivalence ; B 18 138 552 521 ; -C -1 ; WX 600 ; N house ; B 75 0 525 563 ; -C -1 ; WX 570 ; N revlogicalnot ; B 17 218 551 440 ; -C -1 ; WX 604 ; N integraltp ; B 267 -251 477 848 ; -C -1 ; WX 604 ; N integralbt ; B 127 -251 337 848 ; -C -1 ; WX 708 ; N SF100000 ; B -11 261 719 346 ; -C -1 ; WX 708 ; N SF110000 ; B 219 -303 304 910 ; -C -1 ; WX 708 ; N SF010000 ; B 312 -303 720 346 ; -C -1 ; WX 708 ; N SF030000 ; B -11 -303 396 346 ; -C -1 ; WX 708 ; N SF020000 ; B 312 261 720 910 ; -C -1 ; WX 708 ; N SF040000 ; B -11 261 396 910 ; -C -1 ; WX 708 ; N SF080000 ; B 312 -303 720 910 ; -C -1 ; WX 708 ; N SF090000 ; B -11 -303 396 910 ; -C -1 ; WX 708 ; N SF060000 ; B -11 -303 719 346 ; -C -1 ; WX 708 ; N SF070000 ; B -11 261 719 910 ; -C -1 ; WX 708 ; N SF050000 ; B -11 -303 719 910 ; -C -1 ; WX 708 ; N SF430000 ; B -11 168 719 439 ; -C -1 ; WX 708 ; N SF240000 ; B 219 -303 490 910 ; -C -1 ; WX 708 ; N SF510000 ; B 312 -303 720 439 ; -C -1 ; WX 708 ; N SF520000 ; B 219 -303 720 346 ; -C -1 ; WX 708 ; N SF390000 ; B 219 -303 719 439 ; -C -1 ; WX 708 ; N SF220000 ; B -11 -303 396 439 ; -C -1 ; WX 708 ; N SF210000 ; B -11 -303 489 346 ; -C -1 ; WX 708 ; N SF250000 ; B -11 -303 489 439 ; -C -1 ; WX 708 ; N SF500000 ; B 312 168 720 910 ; -C -1 ; WX 708 ; N SF490000 ; B 219 261 720 910 ; -C -1 ; WX 708 ; N SF380000 ; B 219 168 719 910 ; -C -1 ; WX 708 ; N SF280000 ; B -11 168 396 910 ; -C -1 ; WX 708 ; N SF270000 ; B -11 261 489 910 ; -C -1 ; WX 708 ; N SF260000 ; B -11 168 489 910 ; -C -1 ; WX 708 ; N SF360000 ; B 312 -303 720 910 ; -C -1 ; WX 708 ; N SF370000 ; B 219 -303 720 910 ; -C -1 ; WX 708 ; N SF420000 ; B 219 -303 720 910 ; -C -1 ; WX 708 ; N SF190000 ; B -11 -303 396 910 ; -C -1 ; WX 708 ; N SF200000 ; B -11 -303 489 910 ; -C -1 ; WX 708 ; N SF230000 ; B -11 -303 489 910 ; -C -1 ; WX 708 ; N SF470000 ; B -11 -303 719 439 ; -C -1 ; WX 708 ; N SF480000 ; B -11 -303 719 346 ; -C -1 ; WX 708 ; N SF410000 ; B -11 -303 719 439 ; -C -1 ; WX 708 ; N SF450000 ; B -11 168 719 910 ; -C -1 ; WX 708 ; N SF460000 ; B -11 261 719 910 ; -C -1 ; WX 708 ; N SF400000 ; B -11 168 719 910 ; -C -1 ; WX 708 ; N SF540000 ; B -11 -303 719 910 ; -C -1 ; WX 708 ; N SF530000 ; B -11 -303 719 910 ; -C -1 ; WX 708 ; N SF440000 ; B -11 -303 719 910 ; -C -1 ; WX 708 ; N upblock ; B -11 303 719 910 ; -C -1 ; WX 708 ; N dnblock ; B -11 -303 719 303 ; -C -1 ; WX 708 ; N block ; B -11 -303 719 910 ; -C -1 ; WX 708 ; N lfblock ; B -11 -303 354 910 ; -C -1 ; WX 708 ; N rtblock ; B 354 -303 720 910 ; -C -1 ; WX 708 ; N ltshade ; B 50 -246 719 910 ; -C -1 ; WX 708 ; N shade ; B -11 -246 719 910 ; -C -1 ; WX 729 ; N dkshade ; B 0 -307 729 910 ; -C -1 ; WX 604 ; N filledbox ; B 71 0 532 461 ; -C -1 ; WX 1000 ; N filledrect ; B 0 155 1000 343 ; -C -1 ; WX 990 ; N triagup ; B 148 0 842 693 ; -C -1 ; WX 990 ; N triagrt ; B 141 -15 849 692 ; -C -1 ; WX 990 ; N triagdn ; B 148 -15 842 678 ; -C -1 ; WX 990 ; N triaglf ; B 141 -15 849 692 ; -C -1 ; WX 604 ; N circle ; B 87 67 517 497 ; -C -1 ; WX 604 ; N invbullet ; B 63 0 541 479 ; -C -1 ; WX 604 ; N invcircle ; B 21 0 584 564 ; -C -1 ; WX 1021 ; N smileface ; B 199 -58 822 564 ; -C -1 ; WX 1052 ; N invsmileface ; B 215 -58 838 564 ; -C -1 ; WX 917 ; N sun ; B 8 -109 909 792 ; -C -1 ; WX 750 ; N female ; B 119 -214 630 736 ; -C -1 ; WX 750 ; N male ; B 54 -128 691 791 ; -C -1 ; WX 531 ; N spade ; B 28 0 503 601 ; -C -1 ; WX 656 ; N club ; B 27 0 629 601 ; -C -1 ; WX 594 ; N heart ; B 31 -12 563 601 ; -C -1 ; WX 510 ; N diamond ; B 31 -12 479 601 ; -C -1 ; WX 500 ; N musicalnote ; B 18 -18 482 666 ; -C -1 ; WX 750 ; N musicalnotedbl ; B 42 -63 649 742 ; -C -1 ; WX 823 ; N IJ ; B 20 -15 819 662 ; -C -1 ; WX 552 ; N ij ; B 21 -216 480 678 ; -C -1 ; WX 729 ; N napostrophe ; B 74 0 791 677 ; -C -1 ; WX 281 ; N minute ; B 97 353 255 677 ; -C -1 ; WX 552 ; N second ; B 97 353 491 677 ; -C -1 ; WX 833 ; N afii61248 ; B 27 -28 808 677 ; -C -1 ; WX 375 ; N afii61289 ; B 13 -14 358 677 ; -C -1 ; WX 604 ; N H22073 ; B 71 0 532 461 ; -C -1 ; WX 354 ; N H18543 ; B 45 198 310 463 ; -C -1 ; WX 354 ; N H18551 ; B 45 198 310 463 ; -C -1 ; WX 604 ; N H18533 ; B 87 67 517 497 ; -C -1 ; WX 354 ; N openbullet ; B 38 190 316 470 ; -C -1 ; WX 722 ; N Amacron ; B 8 0 711 816 ; -C -1 ; WX 500 ; N amacron ; B 45 -6 483 612 ; -C -1 ; WX 722 ; N Ccircumflex ; B 40 -15 667 912 ; -C -1 ; WX 444 ; N ccircumflex ; B 38 -14 421 697 ; -C -1 ; WX 722 ; N Cdot ; B 40 -15 667 871 ; -C -1 ; WX 444 ; N cdot ; B 38 -14 421 668 ; -C -1 ; WX 667 ; N Emacron ; B 20 0 622 816 ; -C -1 ; WX 444 ; N emacron ; B 39 -14 420 612 ; -C -1 ; WX 667 ; N Ebreve ; B 20 0 622 884 ; -C -1 ; WX 444 ; N ebreve ; B 39 -14 420 677 ; -C -1 ; WX 667 ; N Edot ; B 20 0 622 871 ; -C -1 ; WX 444 ; N edot ; B 39 -14 420 668 ; -C -1 ; WX 778 ; N Gcircumflex ; B 41 -16 768 900 ; -C -1 ; WX 500 ; N gcircumflex ; B 38 -216 482 697 ; -C -1 ; WX 778 ; N Gdot ; B 41 -16 768 871 ; -C -1 ; WX 500 ; N gdot ; B 38 -216 482 668 ; -C -1 ; WX 778 ; N Gcedilla ; B 41 -188 768 678 ; -C -1 ; WX 500 ; N gcedilla ; B 38 -216 482 716 ; -C -1 ; WX 778 ; N Hcircumflex ; B 21 0 760 912 ; -C -1 ; WX 556 ; N hcircumflex ; B 34 0 527 912 ; -C -1 ; WX 778 ; N Hbar ; B 21 0 760 662 ; -C -1 ; WX 556 ; N hbar ; B 34 0 527 662 ; -C -1 ; WX 389 ; N Itilde ; B 20 0 366 864 ; -C -1 ; WX 278 ; N itilde ; B -21 0 295 669 ; -C -1 ; WX 389 ; N Imacron ; B 20 0 366 816 ; -C -1 ; WX 278 ; N imacron ; B -18 0 295 612 ; -C -1 ; WX 389 ; N Ibreve ; B 20 0 366 884 ; -C -1 ; WX 278 ; N ibreve ; B -9 0 287 677 ; -C -1 ; WX 389 ; N Iogonek ; B 21 -226 368 662 ; -C -1 ; WX 278 ; N iogonek ; B 19 -226 271 677 ; -C -1 ; WX 500 ; N Jcircumflex ; B 11 -15 494 912 ; -C -1 ; WX 333 ; N jcircumflex ; B -28 -216 323 697 ; -C -1 ; WX 778 ; N Kcedilla ; B 22 -188 789 662 ; -C -1 ; WX 556 ; N kcedilla ; B 33 -188 565 662 ; -C -1 ; WX 556 ; N kgreenlandic ; B 35 0 567 457 ; -C -1 ; WX 667 ; N Lcedilla ; B 19 -188 631 662 ; -C -1 ; WX 278 ; N lcedilla ; B 21 -188 268 662 ; -C -1 ; WX 722 ; N Ncedilla ; B 14 -188 699 662 ; -C -1 ; WX 556 ; N ncedilla ; B 34 -188 527 470 ; -C -1 ; WX 769 ; N Eng ; B 21 -15 720 677 ; -C -1 ; WX 556 ; N eng ; B 37 -216 480 470 ; -C -1 ; WX 778 ; N Omacron ; B 39 -15 742 816 ; -C -1 ; WX 500 ; N omacron ; B 36 -14 464 612 ; -C -1 ; WX 778 ; N Obreve ; B 39 -15 742 884 ; -C -1 ; WX 500 ; N obreve ; B 36 -14 464 677 ; -C -1 ; WX 722 ; N Rcedilla ; B 19 -188 731 662 ; -C -1 ; WX 444 ; N rcedilla ; B 37 -188 429 470 ; -C -1 ; WX 556 ; N Scircumflex ; B 52 -16 516 912 ; -C -1 ; WX 389 ; N scircumflex ; B 38 -14 354 697 ; -C -1 ; WX 667 ; N Tbar ; B 36 0 631 662 ; -C -1 ; WX 333 ; N tbar ; B 18 -6 323 624 ; -C -1 ; WX 722 ; N Utilde ; B 23 -16 705 864 ; -C -1 ; WX 556 ; N utilde ; B 31 -14 524 669 ; -C -1 ; WX 722 ; N Umacron ; B 23 -16 705 816 ; -C -1 ; WX 556 ; N umacron ; B 31 -14 524 612 ; -C -1 ; WX 722 ; N Ubreve ; B 23 -16 705 884 ; -C -1 ; WX 556 ; N ubreve ; B 31 -14 524 677 ; -C -1 ; WX 722 ; N Uogonek ; B 25 -226 707 662 ; -C -1 ; WX 556 ; N uogonek ; B 33 -226 526 457 ; -C -1 ; WX 1000 ; N Wcircumflex ; B 9 -15 991 912 ; -C -1 ; WX 722 ; N wcircumflex ; B 8 -14 712 697 ; -C -1 ; WX 722 ; N Ycircumflex ; B 9 0 711 912 ; -C -1 ; WX 500 ; N ycircumflex ; B 8 -216 491 697 ; -C -1 ; WX 278 ; N longs ; B 3 0 380 677 ; -C -1 ; WX 722 ; N Aringacute ; B 8 0 711 1026 ; -C -1 ; WX 500 ; N aringacute ; B 45 -6 483 897 ; -C -1 ; WX 1000 ; N AEacute ; B -11 0 955 897 ; -C -1 ; WX 722 ; N aeacute ; B 44 -14 693 685 ; -C -1 ; WX 778 ; N Oslashacute ; B 40 -38 742 897 ; -C -1 ; WX 500 ; N oslashacute ; B 33 -14 467 685 ; -C -1 ; WX 333 ; N anoteleia ; B 85 308 248 470 ; -C -1 ; WX 1000 ; N Wgrave ; B 9 -15 991 897 ; -C -1 ; WX 722 ; N wgrave ; B 8 -14 712 685 ; -C -1 ; WX 1000 ; N Wacute ; B 9 -15 991 897 ; -C -1 ; WX 722 ; N wacute ; B 8 -14 712 685 ; -C -1 ; WX 1000 ; N Wdieresis ; B 9 -15 991 856 ; -C -1 ; WX 722 ; N wdieresis ; B 8 -14 712 668 ; -C -1 ; WX 722 ; N Ygrave ; B 9 0 711 897 ; -C -1 ; WX 500 ; N ygrave ; B 8 -216 491 685 ; -C -1 ; WX 333 ; N quotereversed ; B 74 352 259 677 ; -C -1 ; WX 333 ; N radicalex ; B -20 533 353 612 ; -C -1 ; WX 500 ; N afii08941 ; B 17 -14 479 680 ; -C -1 ; WX 600 ; N estimated ; B 44 -17 561 535 ; -C -1 ; WX 750 ; N oneeighth ; B 35 -29 733 676 ; -C -1 ; WX 750 ; N threeeighths ; B 15 -29 732 676 ; -C -1 ; WX 750 ; N fiveeighths ; B 21 -29 732 676 ; -C -1 ; WX 750 ; N seveneighths ; B 21 -29 732 676 ; -C -1 ; WX 333 ; N commaaccent ; B 59 -241 192 -43 ; -C -1 ; WX 333 ; N undercommaaccent ; B 71 -188 237 -27 ; -C -1 ; WX 333 ; N tonos ; B 111 515 315 685 ; -C -1 ; WX 333 ; N dieresistonos ; B -61 515 394 685 ; -C -1 ; WX 722 ; N Alphatonos ; B 8 0 711 685 ; -C -1 ; WX 799 ; N Epsilontonos ; B -68 0 754 685 ; -C -1 ; WX 909 ; N Etatonos ; B -68 0 891 685 ; -C -1 ; WX 522 ; N Iotatonos ; B -68 0 499 685 ; -C -1 ; WX 778 ; N Omicrontonos ; B -59 -15 741 685 ; -C -1 ; WX 865 ; N Upsilontonos ; B -68 0 854 685 ; -C -1 ; WX 801 ; N Omegatonos ; B -67 0 765 685 ; -C -1 ; WX 310 ; N iotadieresistonos ; B -77 -14 377 685 ; -C -1 ; WX 722 ; N Alpha ; B 8 0 711 676 ; -C -1 ; WX 667 ; N Beta ; B 21 0 632 662 ; -C -1 ; WX 627 ; N Delta ; B 24 0 603 676 ; -C -1 ; WX 667 ; N Epsilon ; B 20 0 622 662 ; -C -1 ; WX 667 ; N Zeta ; B 16 0 649 662 ; -C -1 ; WX 778 ; N Eta ; B 21 0 760 662 ; -C -1 ; WX 389 ; N Iota ; B 20 0 366 662 ; -C -1 ; WX 778 ; N Kappa ; B 22 0 789 662 ; -C -1 ; WX 717 ; N Lambda ; B 4 0 708 676 ; -C -1 ; WX 944 ; N Mu ; B 20 0 926 662 ; -C -1 ; WX 722 ; N Nu ; B 14 -15 699 662 ; -C -1 ; WX 677 ; N Xi ; B 56 0 622 662 ; -C -1 ; WX 778 ; N Omicron ; B 39 -15 742 677 ; -C -1 ; WX 778 ; N Pi ; B 20 0 759 662 ; -C -1 ; WX 611 ; N Rho ; B 25 0 581 662 ; -C -1 ; WX 654 ; N Sigma ; B 6 0 622 662 ; -C -1 ; WX 667 ; N Tau ; B 36 0 631 662 ; -C -1 ; WX 722 ; N Upsilon ; B 9 0 711 662 ; -C -1 ; WX 722 ; N Chi ; B 7 0 715 662 ; -C -1 ; WX 780 ; N Psi ; B 15 0 765 670 ; -C -1 ; WX 801 ; N Omega ; B 37 0 764 677 ; -C -1 ; WX 389 ; N Iotadieresis ; B 20 0 366 856 ; -C -1 ; WX 722 ; N Upsilondieresis ; B 9 0 711 856 ; -C -1 ; WX 558 ; N alphatonos ; B 42 -14 537 685 ; -C -1 ; WX 427 ; N epsilontonos ; B 32 -14 413 685 ; -C -1 ; WX 568 ; N etatonos ; B 9 -214 512 685 ; -C -1 ; WX 310 ; N iotatonos ; B 21 -14 307 685 ; -C -1 ; WX 519 ; N upsilondieresistonos ; B 5 -14 484 685 ; -C -1 ; WX 527 ; N beta ; B 50 -214 488 677 ; -C -1 ; WX 468 ; N gamma ; B 1 -216 461 470 ; -C -1 ; WX 413 ; N zeta ; B 32 -216 408 688 ; -C -1 ; WX 568 ; N eta ; B 9 -214 512 470 ; -C -1 ; WX 522 ; N theta ; B 41 -14 481 677 ; -C -1 ; WX 310 ; N iota ; B 21 -14 307 457 ; -C -1 ; WX 555 ; N kappa ; B 18 0 560 470 ; -C -1 ; WX 491 ; N lambda ; B 14 -6 503 677 ; -C -1 ; WX 567 ; N mu ; B 52 -216 552 457 ; -C -1 ; WX 447 ; N nu ; B -10 -14 425 470 ; -C -1 ; WX 446 ; N xi ; B 30 -216 443 688 ; -C -1 ; WX 500 ; N omicron ; B 36 -14 464 470 ; -C -1 ; WX 535 ; N rho ; B 49 -214 492 470 ; -C -1 ; WX 422 ; N sigma1 ; B 28 -216 410 470 ; -C -1 ; WX 519 ; N upsilon ; B 5 -14 479 470 ; -C -1 ; WX 462 ; N chi ; B 7 -216 472 463 ; -C -1 ; WX 688 ; N psi ; B 16 -214 672 463 ; -C -1 ; WX 731 ; N omega ; B 39 -14 693 470 ; -C -1 ; WX 310 ; N iotadieresis ; B -8 -14 307 668 ; -C -1 ; WX 519 ; N upsilondieresis ; B 5 -14 479 668 ; -C -1 ; WX 500 ; N omicrontonos ; B 36 -14 464 685 ; -C -1 ; WX 519 ; N upsilontonos ; B 5 -14 479 685 ; -C -1 ; WX 731 ; N omegatonos ; B 39 -14 693 685 ; -C -1 ; WX 667 ; N afii10023 ; B 20 0 622 856 ; -C -1 ; WX 800 ; N afii10051 ; B 32 -8 766 662 ; -C -1 ; WX 678 ; N afii10053 ; B 37 -15 631 677 ; -C -1 ; WX 556 ; N afii10054 ; B 52 -16 516 677 ; -C -1 ; WX 389 ; N afii10055 ; B 20 0 366 662 ; -C -1 ; WX 389 ; N afii10056 ; B 20 0 366 856 ; -C -1 ; WX 500 ; N afii10057 ; B 11 -15 494 662 ; -C -1 ; WX 1003 ; N afii10058 ; B 6 -8 971 662 ; -C -1 ; WX 1002 ; N afii10059 ; B 19 0 970 662 ; -C -1 ; WX 800 ; N afii10060 ; B 32 0 775 662 ; -C -1 ; WX 734 ; N afii10062 ; B 9 -15 725 865 ; -C -1 ; WX 722 ; N afii10017 ; B 8 0 711 676 ; -C -1 ; WX 661 ; N afii10018 ; B 17 0 629 662 ; -C -1 ; WX 667 ; N afii10019 ; B 21 0 632 662 ; -C -1 ; WX 636 ; N afii10020 ; B 20 0 604 662 ; -C -1 ; WX 688 ; N afii10021 ; B 0 -193 669 662 ; -C -1 ; WX 667 ; N afii10022 ; B 20 0 622 662 ; -C -1 ; WX 989 ; N afii10024 ; B 15 0 973 670 ; -C -1 ; WX 528 ; N afii10025 ; B 20 -15 493 677 ; -C -1 ; WX 778 ; N afii10026 ; B 16 0 764 662 ; -C -1 ; WX 778 ; N afii10027 ; B 16 0 764 865 ; -C -1 ; WX 725 ; N afii10028 ; B 21 0 709 670 ; -C -1 ; WX 745 ; N afii10029 ; B 6 -8 719 662 ; -C -1 ; WX 944 ; N afii10030 ; B 20 0 926 662 ; -C -1 ; WX 778 ; N afii10031 ; B 21 0 760 662 ; -C -1 ; WX 778 ; N afii10032 ; B 39 -15 742 677 ; -C -1 ; WX 778 ; N afii10033 ; B 20 0 759 662 ; -C -1 ; WX 611 ; N afii10034 ; B 25 0 581 662 ; -C -1 ; WX 722 ; N afii10035 ; B 40 -15 667 677 ; -C -1 ; WX 667 ; N afii10036 ; B 36 0 631 662 ; -C -1 ; WX 734 ; N afii10037 ; B 9 -15 725 662 ; -C -1 ; WX 859 ; N afii10038 ; B 37 0 822 662 ; -C -1 ; WX 722 ; N afii10039 ; B 7 0 715 662 ; -C -1 ; WX 778 ; N afii10040 ; B 20 -193 750 662 ; -C -1 ; WX 734 ; N afii10041 ; B 6 0 713 662 ; -C -1 ; WX 1098 ; N afii10042 ; B 42 0 1056 662 ; -C -1 ; WX 1098 ; N afii10043 ; B 42 -193 1056 662 ; -C -1 ; WX 765 ; N afii10044 ; B 36 0 732 662 ; -C -1 ; WX 982 ; N afii10045 ; B 17 0 962 662 ; -C -1 ; WX 661 ; N afii10046 ; B 17 0 629 662 ; -C -1 ; WX 678 ; N afii10047 ; B 47 -15 641 677 ; -C -1 ; WX 1126 ; N afii10048 ; B 20 -15 1089 677 ; -C -1 ; WX 722 ; N afii10049 ; B -9 0 704 662 ; -C -1 ; WX 500 ; N afii10065 ; B 45 -6 483 470 ; -C -1 ; WX 500 ; N afii10066 ; B 36 -14 464 677 ; -C -1 ; WX 540 ; N afii10067 ; B 36 0 504 457 ; -C -1 ; WX 454 ; N afii10068 ; B 35 0 437 457 ; -C -1 ; WX 506 ; N afii10069 ; B 0 -120 470 457 ; -C -1 ; WX 444 ; N afii10070 ; B 39 -14 420 470 ; -C -1 ; WX 725 ; N afii10072 ; B 6 0 719 464 ; -C -1 ; WX 402 ; N afii10073 ; B 13 -14 375 470 ; -C -1 ; WX 576 ; N afii10074 ; B 34 0 542 457 ; -C -1 ; WX 576 ; N afii10075 ; B 34 0 542 665 ; -C -1 ; WX 576 ; N afii10076 ; B 35 0 563 464 ; -C -1 ; WX 561 ; N afii10077 ; B 6 -8 524 457 ; -C -1 ; WX 681 ; N afii10078 ; B 36 0 644 457 ; -C -1 ; WX 576 ; N afii10079 ; B 34 0 541 457 ; -C -1 ; WX 500 ; N afii10080 ; B 36 -14 464 470 ; -C -1 ; WX 576 ; N afii10081 ; B 34 0 542 457 ; -C -1 ; WX 556 ; N afii10082 ; B 19 -214 513 470 ; -C -1 ; WX 444 ; N afii10083 ; B 38 -14 421 470 ; -C -1 ; WX 491 ; N afii10084 ; B 18 0 473 457 ; -C -1 ; WX 500 ; N afii10085 ; B 8 -216 491 457 ; -C -1 ; WX 692 ; N afii10086 ; B 40 -214 652 662 ; -C -1 ; WX 500 ; N afii10087 ; B 23 0 484 457 ; -C -1 ; WX 576 ; N afii10088 ; B 34 -120 542 457 ; -C -1 ; WX 564 ; N afii10089 ; B 25 0 526 457 ; -C -1 ; WX 844 ; N afii10090 ; B 35 0 810 457 ; -C -1 ; WX 844 ; N afii10091 ; B 35 -120 810 457 ; -C -1 ; WX 583 ; N afii10092 ; B 18 0 552 457 ; -C -1 ; WX 781 ; N afii10093 ; B 38 0 744 457 ; -C -1 ; WX 529 ; N afii10094 ; B 38 0 498 457 ; -C -1 ; WX 432 ; N afii10095 ; B 14 -14 396 470 ; -C -1 ; WX 764 ; N afii10096 ; B 37 -14 729 470 ; -C -1 ; WX 541 ; N afii10097 ; B 17 0 503 457 ; -C -1 ; WX 444 ; N afii10071 ; B 39 -14 420 668 ; -C -1 ; WX 537 ; N afii10099 ; B 36 -216 488 663 ; -C -1 ; WX 454 ; N afii10100 ; B 35 0 437 685 ; -C -1 ; WX 432 ; N afii10101 ; B 36 -14 418 470 ; -C -1 ; WX 389 ; N afii10102 ; B 40 -14 354 470 ; -C -1 ; WX 278 ; N afii10103 ; B 21 0 267 678 ; -C -1 ; WX 278 ; N afii10104 ; B -17 0 295 668 ; -C -1 ; WX 333 ; N afii10105 ; B -28 -216 249 677 ; -C -1 ; WX 780 ; N afii10106 ; B 6 -8 749 457 ; -C -1 ; WX 797 ; N afii10107 ; B 35 0 766 457 ; -C -1 ; WX 556 ; N afii10108 ; B 37 0 530 662 ; -C -1 ; WX 500 ; N afii10110 ; B 8 -216 491 665 ; -C -1 ; WX 576 ; N afii10193 ; B 34 -120 542 457 ; -C -1 ; WX 520 ; N afii10050 ; B 20 0 499 804 ; -C -1 ; WX 389 ; N afii10098 ; B 36 0 372 545 ; -C -1 ; WX 1000 ; N afii00208 ; B 32 224 969 294 ; -C -1 ; WX 1005 ; N afii61352 ; B 6 -15 969 669 ; -C -1 ; WX 548 ; N pi ; B 7 -14 523 457 ; -C -1 ; WX 333 ; N sheva ; B 125 -215 208 -25 ; -C -1 ; WX 333 ; N hatafsegol ; B 14 -215 319 -24 ; -C -1 ; WX 333 ; N hatafpatah ; B 24 -215 309 -24 ; -C -1 ; WX 333 ; N hatafqamats ; B 9 -216 325 -24 ; -C -1 ; WX 333 ; N hiriq ; B 126 -153 207 -72 ; -C -1 ; WX 333 ; N tsere ; B 70 -153 263 -72 ; -C -1 ; WX 333 ; N segol ; B 70 -215 263 -24 ; -C -1 ; WX 333 ; N patah ; B 70 -130 263 -80 ; -C -1 ; WX 333 ; N qamats ; B 70 -215 263 -52 ; -C -1 ; WX 333 ; N holam ; B 126 587 207 668 ; -C -1 ; WX 333 ; N qubuts ; B 14 -215 319 -24 ; -C -1 ; WX 333 ; N dagesh ; B 126 221 207 302 ; -C -1 ; WX 333 ; N meteg ; B 141 -215 191 -53 ; -C -1 ; WX 363 ; N maqaf ; B 43 347 320 516 ; -C -1 ; WX 333 ; N rafe ; B 70 596 263 646 ; -C -1 ; WX 333 ; N paseq ; B 116 -49 217 564 ; -C -1 ; WX 343 ; N shindot ; B 335 587 417 668 ; -C -1 ; WX 343 ; N sindot ; B -73 587 8 668 ; -C -1 ; WX 333 ; N sofpasuq ; B 85 -12 248 525 ; -C -1 ; WX 527 ; N alef ; B 21 -18 494 553 ; -C -1 ; WX 459 ; N bet ; B 19 0 448 549 ; -C -1 ; WX 367 ; N gimel ; B 16 -11 353 553 ; -C -1 ; WX 464 ; N dalet ; B 30 -11 432 549 ; -C -1 ; WX 512 ; N he ; B 30 -11 482 549 ; -C -1 ; WX 298 ; N vav ; B 27 -8 247 553 ; -C -1 ; WX 317 ; N zayin ; B 27 -10 290 553 ; -C -1 ; WX 504 ; N het ; B 33 -11 475 549 ; -C -1 ; WX 529 ; N tet ; B 27 0 486 553 ; -C -1 ; WX 311 ; N yod ; B 27 180 272 553 ; -C -1 ; WX 458 ; N finalkaf ; B 27 -170 425 549 ; -C -1 ; WX 446 ; N kaf ; B 19 0 406 549 ; -C -1 ; WX 435 ; N lamed ; B -16 -10 395 753 ; -C -1 ; WX 511 ; N finalmem ; B 39 0 459 549 ; -C -1 ; WX 533 ; N mem ; B 27 0 493 553 ; -C -1 ; WX 326 ; N finalnun ; B 27 -170 290 553 ; -C -1 ; WX 316 ; N nun ; B 16 0 275 553 ; -C -1 ; WX 478 ; N samekh ; B 35 -13 438 549 ; -C -1 ; WX 507 ; N ayin ; B 19 -32 480 553 ; -C -1 ; WX 493 ; N finalpe ; B 27 -170 455 549 ; -C -1 ; WX 457 ; N pe ; B 21 0 416 549 ; -C -1 ; WX 564 ; N finaltsadi ; B 27 -170 537 553 ; -C -1 ; WX 515 ; N tsadi ; B 27 0 485 553 ; -C -1 ; WX 483 ; N qof ; B 33 -170 442 549 ; -C -1 ; WX 464 ; N resh ; B 27 -8 412 549 ; -C -1 ; WX 688 ; N shin ; B 27 0 661 553 ; -C -1 ; WX 518 ; N tav ; B 11 -8 467 549 ; -C -1 ; WX 597 ; N doublevav ; B 27 -8 545 553 ; -C -1 ; WX 609 ; N vavyod ; B 27 -8 558 553 ; -C -1 ; WX 621 ; N doubleyod ; B 27 180 583 553 ; -C -1 ; WX 255 ; N geresh ; B 68 219 212 535 ; -C -1 ; WX 460 ; N gershayim ; B 68 219 417 535 ; -C -1 ; WX 758 ; N newsheqelsign ; B 65 0 693 516 ; -C -1 ; WX 298 ; N vavshindot ; B -54 -8 247 668 ; -C -1 ; WX 458 ; N finalkafsheva ; B 27 -170 425 549 ; -C -1 ; WX 458 ; N finalkafqamats ; B 27 -170 425 549 ; -C -1 ; WX 435 ; N lamedholam ; B -132 -10 395 753 ; -C -1 ; WX 435 ; N lamedholamdagesh ; B -132 -10 395 753 ; -C -1 ; WX 507 ; N altayin ; B 19 0 480 553 ; -C -1 ; WX 688 ; N shinshindot ; B 27 0 661 668 ; -C -1 ; WX 688 ; N shinsindot ; B 23 0 661 668 ; -C -1 ; WX 688 ; N shindageshshindot ; B 27 0 661 668 ; -C -1 ; WX 688 ; N shindageshsindot ; B 23 0 661 668 ; -C -1 ; WX 527 ; N alefpatah ; B 21 -130 494 553 ; -C -1 ; WX 527 ; N alefqamats ; B 21 -215 494 553 ; -C -1 ; WX 527 ; N alefmapiq ; B 21 -18 494 553 ; -C -1 ; WX 459 ; N betdagesh ; B 19 0 448 549 ; -C -1 ; WX 367 ; N gimeldagesh ; B 16 -11 353 553 ; -C -1 ; WX 464 ; N daletdagesh ; B 30 -11 432 549 ; -C -1 ; WX 512 ; N hedagesh ; B 30 -11 482 549 ; -C -1 ; WX 298 ; N vavdagesh ; B 27 -8 247 553 ; -C -1 ; WX 332 ; N zayindagesh ; B 6 -10 304 553 ; -C -1 ; WX 529 ; N tetdagesh ; B 27 0 486 553 ; -C -1 ; WX 311 ; N yoddagesh ; B 27 180 272 553 ; -C -1 ; WX 458 ; N finalkafdagesh ; B 27 -170 425 549 ; -C -1 ; WX 446 ; N kafdagesh ; B 19 0 406 549 ; -C -1 ; WX 435 ; N lameddagesh ; B -16 -10 395 753 ; -C -1 ; WX 533 ; N memdagesh ; B 27 0 493 553 ; -C -1 ; WX 316 ; N nundagesh ; B 16 0 275 553 ; -C -1 ; WX 478 ; N samekhdagesh ; B 35 -13 438 549 ; -C -1 ; WX 493 ; N finalpedagesh ; B 27 -170 455 549 ; -C -1 ; WX 457 ; N pedagesh ; B 21 0 416 549 ; -C -1 ; WX 515 ; N tsadidagesh ; B 27 0 485 553 ; -C -1 ; WX 483 ; N qofdagesh ; B 33 -170 442 549 ; -C -1 ; WX 464 ; N reshdagesh ; B 27 -8 412 549 ; -C -1 ; WX 688 ; N shindagesh ; B 27 0 661 553 ; -C -1 ; WX 518 ; N tavdages ; B 11 -8 467 549 ; -C -1 ; WX 298 ; N vavholam ; B 27 -8 247 668 ; -C -1 ; WX 459 ; N betrafe ; B 19 0 448 646 ; -C -1 ; WX 446 ; N kafrafe ; B 19 0 406 646 ; -C -1 ; WX 457 ; N perafe ; B 21 0 416 646 ; -C -1 ; WX 527 ; N aleflamed ; B -16 -18 494 753 ; -C -1 ; WX 0 ; N zerowidthnonjoiner ; B -18 -134 18 629 ; -C -1 ; WX 0 ; N zerowidthjoiner ; B -107 -134 107 690 ; -C -1 ; WX 0 ; N lefttorightmark ; B -18 -134 210 690 ; -C -1 ; WX 0 ; N righttoleftmark ; B -210 -134 17 690 ; -C -1 ; WX 319 ; N afii57388 ; B 83 137 241 443 ; -C -1 ; WX 319 ; N afii57403 ; B 78 136 235 609 ; -C -1 ; WX 356 ; N afii57407 ; B 33 137 326 711 ; -C -1 ; WX 469 ; N afii57409 ; B 62 46 422 510 ; -C -1 ; WX 198 ; N afii57440 ; B -34 143 198 276 ; -C -1 ; WX 201 ; N afii57451 ; B 34 683 201 857 ; -C -1 ; WX 237 ; N afii57452 ; B 34 683 237 872 ; -C -1 ; WX 201 ; N afii57453 ; B 34 -133 201 41 ; -C -1 ; WX 201 ; N afii57454 ; B 34 683 201 784 ; -C -1 ; WX 209 ; N afii57455 ; B 35 683 209 895 ; -C -1 ; WX 201 ; N afii57456 ; B 34 -60 201 41 ; -C -1 ; WX 211 ; N afii57457 ; B 34 683 211 840 ; -C -1 ; WX 165 ; N afii57458 ; B 34 683 165 834 ; -C -1 ; WX 562 ; N afii57392 ; B 191 206 360 457 ; -C -1 ; WX 562 ; N afii57393 ; B 164 146 359 719 ; -C -1 ; WX 562 ; N afii57394 ; B 127 143 419 718 ; -C -1 ; WX 562 ; N afii57395 ; B 77 143 476 713 ; -C -1 ; WX 562 ; N afii57396 ; B 147 145 404 710 ; -C -1 ; WX 562 ; N afii57397 ; B 114 231 448 634 ; -C -1 ; WX 562 ; N afii57398 ; B 104 149 426 718 ; -C -1 ; WX 562 ; N afii57399 ; B 76 143 457 717 ; -C -1 ; WX 562 ; N afii57400 ; B 92 149 473 724 ; -C -1 ; WX 562 ; N afii57401 ; B 116 146 427 719 ; -C -1 ; WX 526 ; N afii57381 ; B 65 84 463 777 ; -C -1 ; WX 319 ; N afii57461 ; B 94 23 230 267 ; -C -1 ; WX 526 ; N afii63167 ; B 87 403 424 744 ; -C -1 ; WX 750 ; N afii57459 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57543 ; B 125 0 625 625 ; -C -1 ; WX 343 ; N afii57534 ; B 43 126 304 519 ; -C -1 ; WX 750 ; N afii57494 ; B 125 0 625 625 ; -C -1 ; WX 562 ; N afii62843 ; B 81 143 471 737 ; -C -1 ; WX 562 ; N afii62844 ; B 92 143 461 719 ; -C -1 ; WX 562 ; N afii62845 ; B 108 143 451 729 ; -C -1 ; WX 750 ; N afii64240 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii64241 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63954 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57382 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii64242 ; B 125 0 625 625 ; -C -1 ; WX 211 ; N afii62881 ; B 34 683 211 995 ; -C -1 ; WX 750 ; N afii57504 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57369 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57370 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57371 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57372 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57373 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57374 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57375 ; B 125 0 625 625 ; -C -1 ; WX 612 ; N afii57391 ; B -34 143 612 276 ; -C -1 ; WX 750 ; N afii57471 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57460 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii52258 ; B 125 0 625 625 ; -C -1 ; WX 649 ; N afii57506 ; B 28 -193 649 489 ; -C -1 ; WX 649 ; N afii62958 ; B 28 -193 649 489 ; -C -1 ; WX 271 ; N afii62956 ; B -34 -193 271 492 ; -C -1 ; WX 271 ; N afii52957 ; B -34 -193 271 492 ; -C -1 ; WX 750 ; N afii57505 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62889 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62887 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62888 ; B 125 0 625 625 ; -C -1 ; WX 577 ; N afii57507 ; B 25 -203 563 527 ; -C -1 ; WX 559 ; N afii62961 ; B 23 -201 563 527 ; -C -1 ; WX 523 ; N afii62959 ; B -34 -193 523 501 ; -C -1 ; WX 523 ; N afii62960 ; B -34 -193 523 501 ; -C -1 ; WX 433 ; N afii57508 ; B 5 -72 447 813 ; -C -1 ; WX 433 ; N afii62962 ; B 5 -72 447 813 ; -C -1 ; WX 757 ; N afii57567 ; B 20 143 757 708 ; -C -1 ; WX 879 ; N afii62964 ; B 20 143 879 722 ; -C -1 ; WX 360 ; N afii52305 ; B -34 143 360 708 ; -C -1 ; WX 542 ; N afii52306 ; B -34 143 542 722 ; -C -1 ; WX 757 ; N afii57509 ; B 20 143 757 863 ; -C -1 ; WX 879 ; N afii62967 ; B 20 143 879 876 ; -C -1 ; WX 360 ; N afii62965 ; B -34 143 360 863 ; -C -1 ; WX 542 ; N afii62966 ; B -34 143 542 876 ; -C -1 ; WX 645 ; N afii57555 ; B 74 -60 575 461 ; -C -1 ; WX 554 ; N afii52364 ; B 15 -174 588 282 ; -C -1 ; WX 750 ; N afii63753 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63754 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63759 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63763 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63795 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62891 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63808 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62938 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63810 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62942 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62947 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63813 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63823 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63824 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63833 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63844 ; B 125 0 625 625 ; -C -1 ; WX 226 ; N afii62882 ; B 23 683 226 1010 ; -C -1 ; WX 211 ; N afii62883 ; B 34 678 211 978 ; -C -1 ; WX 211 ; N afii62884 ; B 34 683 211 918 ; -C -1 ; WX 211 ; N afii62885 ; B 31 683 211 974 ; -C -1 ; WX 211 ; N afii62886 ; B 34 683 211 931 ; -C -1 ; WX 750 ; N afii63846 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63849 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N uni202A ; B 125 0 625 625 ; -C -1 ; WX 750 ; N uni202B ; B 125 0 625 625 ; -C -1 ; WX 750 ; N uni202D ; B 125 0 625 625 ; -C -1 ; WX 750 ; N uni202E ; B 125 0 625 625 ; -C -1 ; WX 750 ; N uni202C ; B 125 0 625 625 ; -C -1 ; WX 750 ; N uni206E ; B 125 0 625 625 ; -C -1 ; WX 750 ; N _b_852 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N uni206A ; B 125 0 625 625 ; -C -1 ; WX 750 ; N uni206B ; B 125 0 625 625 ; -C -1 ; WX 750 ; N _b_855 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N uni206D ; B 125 0 625 625 ; -C -1 ; WX 750 ; N uniF00A ; B 125 0 625 625 ; -C -1 ; WX 750 ; N uniF00B ; B 125 0 625 625 ; -C -1 ; WX 750 ; N uniF00C ; B 125 0 625 625 ; -C -1 ; WX 750 ; N uniF00D ; B 125 0 625 625 ; -C -1 ; WX 750 ; N uniF00E ; B 125 0 625 625 ; -C -1 ; WX 1000 ; N uniFFFC ; B 0 0 1000 719 ; -C -1 ; WX 750 ; N afii63904 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63905 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63906 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63908 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63910 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63912 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62927 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63941 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62939 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63943 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62943 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62946 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63946 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62951 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63948 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62953 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63950 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63951 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63952 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63953 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63956 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63958 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63959 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63960 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii63961 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii64046 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii64058 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii64059 ; B 125 0 625 625 ; -C -1 ; WX 319 ; N afii64060 ; B 62 -209 273 785 ; -C -1 ; WX 319 ; N afii64061 ; B 50 -209 262 785 ; -C -1 ; WX 750 ; N afii62945 ; B 125 0 625 625 ; -C -1 ; WX 703 ; N afii64184 ; B 22 91 661 920 ; -C -1 ; WX 469 ; N afii52399 ; B 62 46 422 510 ; -C -1 ; WX 238 ; N afii52400 ; B 0 109 238 831 ; -C -1 ; WX 253 ; N afii62753 ; B -30 143 253 831 ; -C -1 ; WX 217 ; N afii57411 ; B 46 109 182 876 ; -C -1 ; WX 234 ; N afii62754 ; B -3 143 234 876 ; -C -1 ; WX 451 ; N afii57412 ; B 3 -71 451 661 ; -C -1 ; WX 451 ; N afii62755 ; B 3 -71 451 661 ; -C -1 ; WX 217 ; N afii57413 ; B 46 -88 181 736 ; -C -1 ; WX 234 ; N afii62756 ; B 13 -88 234 736 ; -C -1 ; WX 645 ; N afii57414 ; B 74 -60 575 546 ; -C -1 ; WX 577 ; N afii62759 ; B 8 -98 577 524 ; -C -1 ; WX 271 ; N afii62757 ; B -34 143 271 661 ; -C -1 ; WX 271 ; N afii62758 ; B -34 143 271 661 ; -C -1 ; WX 217 ; N afii57415 ; B 66 109 181 736 ; -C -1 ; WX 234 ; N afii62760 ; B 13 143 234 736 ; -C -1 ; WX 649 ; N afii57416 ; B 28 -69 649 489 ; -C -1 ; WX 649 ; N afii62763 ; B 28 -69 649 489 ; -C -1 ; WX 271 ; N afii62761 ; B -34 -69 271 492 ; -C -1 ; WX 271 ; N afii62762 ; B -34 -69 271 492 ; -C -1 ; WX 343 ; N afii57417 ; B 26 126 304 763 ; -C -1 ; WX 415 ; N afii62764 ; B 1 143 415 873 ; -C -1 ; WX 649 ; N afii57418 ; B 28 143 649 656 ; -C -1 ; WX 649 ; N afii62767 ; B 28 143 649 656 ; -C -1 ; WX 271 ; N afii62765 ; B -34 143 271 715 ; -C -1 ; WX 271 ; N afii62766 ; B -34 143 271 715 ; -C -1 ; WX 649 ; N afii57419 ; B 29 144 649 766 ; -C -1 ; WX 649 ; N afii62770 ; B 29 144 649 766 ; -C -1 ; WX 271 ; N afii62768 ; B -34 143 271 828 ; -C -1 ; WX 271 ; N afii62769 ; B -34 143 271 828 ; -C -1 ; WX 577 ; N afii57420 ; B 25 -203 563 527 ; -C -1 ; WX 559 ; N afii62773 ; B 23 -201 563 527 ; -C -1 ; WX 523 ; N afii62771 ; B -34 -74 523 501 ; -C -1 ; WX 523 ; N afii62772 ; B -34 -74 523 501 ; -C -1 ; WX 577 ; N afii57421 ; B 25 -203 563 527 ; -C -1 ; WX 559 ; N afii62776 ; B 23 -201 563 527 ; -C -1 ; WX 523 ; N afii62774 ; B -34 143 523 501 ; -C -1 ; WX 523 ; N afii62775 ; B -34 143 523 501 ; -C -1 ; WX 577 ; N afii57422 ; B 25 -203 563 746 ; -C -1 ; WX 559 ; N afii62779 ; B 23 -201 563 746 ; -C -1 ; WX 523 ; N afii62777 ; B -34 143 523 724 ; -C -1 ; WX 523 ; N afii62778 ; B -34 143 523 724 ; -C -1 ; WX 343 ; N afii57423 ; B 51 143 343 604 ; -C -1 ; WX 343 ; N afii62780 ; B 51 143 343 604 ; -C -1 ; WX 343 ; N afii57424 ; B 51 143 343 845 ; -C -1 ; WX 343 ; N afii62781 ; B 51 143 343 845 ; -C -1 ; WX 433 ; N afii57425 ; B 5 -72 433 461 ; -C -1 ; WX 433 ; N afii62782 ; B 5 -72 433 461 ; -C -1 ; WX 433 ; N afii57426 ; B 5 -72 433 693 ; -C -1 ; WX 433 ; N afii62783 ; B 5 -72 433 693 ; -C -1 ; WX 899 ; N afii57427 ; B 31 -63 899 458 ; -C -1 ; WX 899 ; N afii62786 ; B 31 -63 899 458 ; -C -1 ; WX 608 ; N afii62784 ; B -34 143 608 446 ; -C -1 ; WX 608 ; N afii62785 ; B -34 143 608 446 ; -C -1 ; WX 899 ; N afii57428 ; B 31 -63 899 774 ; -C -1 ; WX 899 ; N afii62789 ; B 31 -63 899 774 ; -C -1 ; WX 608 ; N afii62787 ; B -34 143 608 774 ; -C -1 ; WX 608 ; N afii62788 ; B -34 143 608 774 ; -C -1 ; WX 1063 ; N afii57429 ; B 31 -63 1063 504 ; -C -1 ; WX 1063 ; N afii62792 ; B 31 -63 1063 504 ; -C -1 ; WX 771 ; N afii62790 ; B -34 143 771 504 ; -C -1 ; WX 771 ; N afii62791 ; B -34 143 771 504 ; -C -1 ; WX 1063 ; N afii57430 ; B 31 -63 1063 728 ; -C -1 ; WX 1063 ; N afii62795 ; B 31 -63 1063 728 ; -C -1 ; WX 771 ; N afii62793 ; B -34 143 771 728 ; -C -1 ; WX 771 ; N afii62794 ; B -34 143 771 728 ; -C -1 ; WX 523 ; N afii57431 ; B -34 143 523 813 ; -C -1 ; WX 523 ; N afii62798 ; B -34 143 523 813 ; -C -1 ; WX 523 ; N afii62796 ; B -34 143 523 813 ; -C -1 ; WX 523 ; N afii62797 ; B -34 143 523 813 ; -C -1 ; WX 523 ; N afii57432 ; B -34 143 523 813 ; -C -1 ; WX 523 ; N afii62801 ; B -34 143 523 813 ; -C -1 ; WX 523 ; N afii62799 ; B -34 143 523 813 ; -C -1 ; WX 523 ; N afii62800 ; B -34 143 523 813 ; -C -1 ; WX 541 ; N afii57433 ; B 25 -204 535 595 ; -C -1 ; WX 469 ; N afii62804 ; B 34 -198 516 531 ; -C -1 ; WX 541 ; N afii62802 ; B -34 143 483 571 ; -C -1 ; WX 360 ; N afii62803 ; B -34 143 360 505 ; -C -1 ; WX 541 ; N afii57434 ; B 25 -204 535 822 ; -C -1 ; WX 469 ; N afii62807 ; B 34 -198 516 760 ; -C -1 ; WX 541 ; N afii62805 ; B -34 143 483 800 ; -C -1 ; WX 360 ; N afii62806 ; B -34 143 360 756 ; -C -1 ; WX 758 ; N afii57441 ; B 23 127 758 779 ; -C -1 ; WX 758 ; N afii62810 ; B 23 127 758 779 ; -C -1 ; WX 305 ; N afii62808 ; B -34 143 305 850 ; -C -1 ; WX 324 ; N afii62809 ; B -34 143 324 779 ; -C -1 ; WX 612 ; N afii57442 ; B 19 -130 612 658 ; -C -1 ; WX 612 ; N afii62813 ; B 19 -130 612 658 ; -C -1 ; WX 305 ; N afii62811 ; B -34 143 305 844 ; -C -1 ; WX 324 ; N afii62812 ; B -34 143 324 780 ; -C -1 ; WX 541 ; N afii57443 ; B 20 143 541 774 ; -C -1 ; WX 541 ; N afii62816 ; B 20 143 541 774 ; -C -1 ; WX 360 ; N afii57410 ; B -34 143 360 708 ; -C -1 ; WX 360 ; N afii62815 ; B -34 143 360 708 ; -C -1 ; WX 451 ; N afii57444 ; B 17 -36 451 773 ; -C -1 ; WX 451 ; N afii62819 ; B 17 -36 451 773 ; -C -1 ; WX 234 ; N afii62817 ; B -34 143 234 774 ; -C -1 ; WX 234 ; N afii62818 ; B -34 143 234 774 ; -C -1 ; WX 360 ; N afii57445 ; B 16 -212 360 431 ; -C -1 ; WX 360 ; N afii62822 ; B 16 -212 360 431 ; -C -1 ; WX 415 ; N afii62820 ; B -34 143 415 472 ; -C -1 ; WX 415 ; N afii62821 ; B -34 143 415 472 ; -C -1 ; WX 541 ; N afii57446 ; B 30 -63 541 612 ; -C -1 ; WX 541 ; N afii62825 ; B 30 -63 541 612 ; -C -1 ; WX 271 ; N afii62823 ; B -34 143 274 735 ; -C -1 ; WX 271 ; N afii62824 ; B -34 143 274 735 ; -C -1 ; WX 343 ; N afii57447 ; B 43 126 304 519 ; -C -1 ; WX 415 ; N afii62828 ; B 1 143 415 694 ; -C -1 ; WX 469 ; N afii57470 ; B -34 117 398 627 ; -C -1 ; WX 451 ; N afii62827 ; B -34 -101 451 560 ; -C -1 ; WX 451 ; N afii57448 ; B 3 -71 451 484 ; -C -1 ; WX 451 ; N afii62829 ; B 3 -71 451 484 ; -C -1 ; WX 645 ; N afii57449 ; B 74 -60 575 461 ; -C -1 ; WX 554 ; N afii62830 ; B 15 -174 588 282 ; -C -1 ; WX 645 ; N afii57450 ; B 74 -194 575 461 ; -C -1 ; WX 577 ; N afii62833 ; B 8 -212 577 319 ; -C -1 ; WX 271 ; N afii62831 ; B -34 -81 271 492 ; -C -1 ; WX 271 ; N afii62832 ; B -34 -81 271 492 ; -C -1 ; WX 541 ; N afii62834 ; B 0 72 525 831 ; -C -1 ; WX 596 ; N afii62835 ; B 0 94 596 831 ; -C -1 ; WX 486 ; N afii62836 ; B 17 72 471 876 ; -C -1 ; WX 541 ; N afii62837 ; B 13 94 541 876 ; -C -1 ; WX 486 ; N afii62838 ; B 17 -120 471 739 ; -C -1 ; WX 541 ; N afii62839 ; B 13 -120 541 766 ; -C -1 ; WX 486 ; N afii62840 ; B 17 72 471 739 ; -C -1 ; WX 541 ; N afii62841 ; B 13 94 541 766 ; -C -1 ; WX 750 ; N glyph1021 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57543-2 ; B 125 0 625 625 ; -C -1 ; WX 201 ; N afii57454-2 ; B 34 683 201 784 ; -C -1 ; WX 201 ; N afii57451-2 ; B 34 683 201 857 ; -C -1 ; WX 750 ; N glyph1025 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1026 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57471-2 ; B 125 0 625 625 ; -C -1 ; WX 165 ; N afii57458-2 ; B 34 683 165 834 ; -C -1 ; WX 211 ; N afii57457-2 ; B 34 683 211 840 ; -C -1 ; WX 750 ; N afii57494-2 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57459-2 ; B 125 0 625 625 ; -C -1 ; WX 209 ; N afii57455-2 ; B 35 683 209 895 ; -C -1 ; WX 237 ; N afii57452-2 ; B 34 683 237 872 ; -C -1 ; WX 750 ; N glyph1034 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1035 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1036 ; B 125 0 625 625 ; -C -1 ; WX 211 ; N afii62884-2 ; B 34 683 211 918 ; -C -1 ; WX 211 ; N afii62881-2 ; B 34 683 211 995 ; -C -1 ; WX 211 ; N afii62886-2 ; B 34 683 211 931 ; -C -1 ; WX 211 ; N afii62883-2 ; B 34 678 211 978 ; -C -1 ; WX 211 ; N afii62885-2 ; B 31 683 211 974 ; -C -1 ; WX 226 ; N afii62882-2 ; B 23 683 226 1010 ; -C -1 ; WX 750 ; N afii57504-2 ; B 125 0 625 625 ; -C -1 ; WX 201 ; N afii57456-2 ; B 34 -60 201 41 ; -C -1 ; WX 201 ; N afii57453-2 ; B 34 -133 201 41 ; -C -1 ; WX 750 ; N glyph1046 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1047 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57543-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57454-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57451-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1051 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1052 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57471-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57458-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57457-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57494-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57459-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57455-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57452-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1060 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1061 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1062 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62884-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62881-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62886-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62883-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62885-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62882-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57504-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57456-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57453-3 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1072 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1073 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57543-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57454-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57451-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1077 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1078 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57471-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57458-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57457-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57494-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57459-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57455-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57452-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1086 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1087 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1088 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62884-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62881-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62886-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62883-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62885-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii62882-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57504-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57456-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N afii57453-4 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1098 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1099 ; B 125 0 625 625 ; -C -1 ; WX 319 ; N glyph1100 ; B 99 137 223 714 ; -C -1 ; WX 319 ; N glyph1101 ; B 97 137 226 267 ; -C -1 ; WX 319 ; N glyph1102 ; B 97 137 225 542 ; -C -1 ; WX 750 ; N glyph1103 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1104 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1105 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1106 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1107 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1108 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1109 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1110 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1111 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1112 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1113 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1114 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1115 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1116 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1117 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1118 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1119 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1120 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1121 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1122 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1123 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1124 ; B 125 0 625 625 ; -C -1 ; WX 750 ; N glyph1125 ; B 125 0 625 625 ; -C -1 ; WX 343 ; N glyph1126 ; B 51 143 343 556 ; -C -1 ; WX 125 ; N afii57440-2 ; B -34 143 125 276 ; -C -1 ; WX 1000 ; N afii57440-3 ; B -34 143 1000 276 ; -C -1 ; WX 2000 ; N afii57440-4 ; B -34 143 2000 276 ; -C -1 ; WX 778 ; N Ohorn ; B 39 -15 794 737 ; -C -1 ; WX 554 ; N ohorn ; B 36 -14 583 510 ; -C -1 ; WX 796 ; N Uhorn ; B 23 -16 836 801 ; -C -1 ; WX 600 ; N uhorn ; B 31 -14 621 474 ; -C -1 ; WX 0 ; N glyph1134 ; B -313 814 -142 891 ; -C -1 ; WX 0 ; N glyph1135 ; B -532 814 -312 891 ; -C -1 ; WX 0 ; N glyph1136 ; B -406 728 -208 891 ; -C -1 ; WX 0 ; N uniF006 ; B -252 814 -84 891 ; -C -1 ; WX 0 ; N uniF007 ; B -398 814 -183 891 ; -C -1 ; WX 0 ; N uniF009 ; B -297 728 -97 891 ; -C -1 ; WX 0 ; N combininghookabove ; B -237 724 -16 891 ; -C -1 ; WX 0 ; N uniF010 ; B -287 814 -105 891 ; -C -1 ; WX 0 ; N uniF013 ; B -352 724 -130 891 ; -C -1 ; WX 0 ; N uniF011 ; B -427 814 -245 891 ; -C -1 ; WX 0 ; N uniF01C ; B -342 748 -26 885 ; -C -1 ; WX 0 ; N uniF015 ; B -488 814 -207 891 ; -C -1 ; WX 0 ; N combiningtildeaccent ; B -398 724 -82 861 ; -C -1 ; WX 0 ; N glyph1147 ; B -129 721 124 792 ; -C -1 ; WX 0 ; N glyph1148 ; B -124 720 124 791 ; -C -1 ; WX 0 ; N uniF02C ; B -200 -212 -38 -50 ; -C -1 ; WX 513 ; N dongsign ; B 74 133 452 662 ; -C -1 ; WX 750 ; N onethird ; B 35 -30 714 676 ; -C -1 ; WX 750 ; N twothirds ; B 12 -30 714 676 ; -C -1 ; WX 0 ; N uniF008 ; B -211 515 -12 679 ; -C -1 ; WX 0 ; N glyph1154 ; B -306 515 -106 679 ; -C -1 ; WX 0 ; N glyph1155 ; B -285 515 -86 679 ; -C -1 ; WX 0 ; N uniF00F ; B -398 515 -200 679 ; -C -1 ; WX 0 ; N uniF012 ; B -239 515 -18 682 ; -C -1 ; WX 0 ; N uniF014 ; B -353 515 -131 682 ; -C -1 ; WX 0 ; N uniF016 ; B -510 748 -194 885 ; -C -1 ; WX 0 ; N uniF017 ; B -545 748 -229 885 ; -C -1 ; WX 0 ; N uniF018 ; B -558 748 -242 885 ; -C -1 ; WX 0 ; N uniF019 ; B -388 532 -72 669 ; -C -1 ; WX 0 ; N uniF01A ; B -450 532 -134 669 ; -C -1 ; WX 0 ; N uniF01B ; B -484 532 -168 669 ; -C -1 ; WX 0 ; N uniF01E ; B -410 -212 -248 -50 ; -C -1 ; WX 0 ; N uniF01F ; B -464 -212 -301 -50 ; -C -1 ; WX 0 ; N uniF020 ; B -464 -212 -301 -50 ; -C -1 ; WX 0 ; N uniF021 ; B -444 -212 -282 -50 ; -C -1 ; WX 0 ; N uniF022 ; B -518 -212 -355 -50 ; -C -1 ; WX 0 ; N combininggraveaccent ; B -285 728 -86 891 ; -C -1 ; WX 0 ; N combiningacuteaccent ; B -192 728 8 891 ; -C -1 ; WX 0 ; N uniF01D ; B -309 532 7 669 ; -C -1 ; WX 0 ; N combiningdotbelow ; B -503 -212 -340 -50 ; -C -1 ; WX 0 ; N uniF023 ; B -317 -212 -155 -50 ; -C -1 ; WX 0 ; N uniF029 ; B -276 -212 -113 -50 ; -C -1 ; WX 0 ; N uniF02A ; B -210 -212 -47 -50 ; -C -1 ; WX 0 ; N uniF02B ; B -439 -212 -276 -50 ; -C -1 ; WX 0 ; N uniF024 ; B -291 -212 -128 -50 ; -C -1 ; WX 0 ; N uniF025 ; B -330 -212 -167 -50 ; -C -1 ; WX 0 ; N uniF026 ; B -384 -212 -221 -50 ; -C -1 ; WX 0 ; N uniF027 ; B -379 -212 -216 -50 ; -C -1 ; WX 0 ; N uniF028 ; B -423 -212 -260 -50 ; -C -1 ; WX 0 ; N uniF02D ; B -477 814 -196 891 ; -C -1 ; WX 0 ; N uniF02E ; B -484 748 -168 885 ; -C -1 ; WX 0 ; N uniF02F ; B -526 814 -245 891 ; -C -1 ; WX 0 ; N uniF030 ; B -536 748 -220 885 ; -C -1 ; WX 278 ; N uniF031 ; B 21 0 267 457 ; -C -1 ; WX 722 ; N Adotbelow ; B 8 -212 711 676 ; -C -1 ; WX 500 ; N adotbelow ; B 45 -212 483 470 ; -C -1 ; WX 722 ; N Ahookabove ; B 8 0 711 891 ; -C -1 ; WX 500 ; N ahookabove ; B 45 -6 483 682 ; -C -1 ; WX 722 ; N Acircumflexacute ; B 8 0 711 891 ; -C -1 ; WX 500 ; N acircumflexacute ; B 45 -6 483 891 ; -C -1 ; WX 722 ; N Acircumflexgrave ; B 8 0 711 891 ; -C -1 ; WX 500 ; N acircumflexgrave ; B 45 -6 483 891 ; -C -1 ; WX 722 ; N Acircumflexhookabove ; B 8 0 711 891 ; -C -1 ; WX 500 ; N acircumflexhookabove ; B 45 -6 483 891 ; -C -1 ; WX 722 ; N Acircumflextilde ; B 8 0 711 891 ; -C -1 ; WX 500 ; N acircumflextilde ; B 45 -6 483 861 ; -C -1 ; WX 722 ; N Acircumflexdotbelow ; B 8 -212 711 791 ; -C -1 ; WX 500 ; N acircumflexdotbelow ; B 45 -212 483 697 ; -C -1 ; WX 722 ; N Abreveacute ; B 8 0 711 891 ; -C -1 ; WX 500 ; N abreveacute ; B 45 -6 483 891 ; -C -1 ; WX 722 ; N Abrevegrave ; B 8 0 711 891 ; -C -1 ; WX 500 ; N abrevegrave ; B 45 -6 483 891 ; -C -1 ; WX 722 ; N Abrevehookabove ; B 8 0 711 891 ; -C -1 ; WX 500 ; N abrevehookabove ; B 45 -6 483 891 ; -C -1 ; WX 722 ; N Abrevetilde ; B 8 0 711 891 ; -C -1 ; WX 500 ; N abrevetilde ; B 45 -6 483 861 ; -C -1 ; WX 722 ; N Abrevedotbelow ; B 8 -212 711 792 ; -C -1 ; WX 500 ; N abrevedotbelow ; B 45 -212 483 677 ; -C -1 ; WX 667 ; N Edotbelow ; B 20 -212 622 662 ; -C -1 ; WX 444 ; N edotbelow ; B 39 -212 420 470 ; -C -1 ; WX 667 ; N Ehookabove ; B 20 0 622 891 ; -C -1 ; WX 444 ; N ehookabove ; B 39 -14 420 682 ; -C -1 ; WX 667 ; N Etilde ; B 20 0 622 857 ; -C -1 ; WX 444 ; N etilde ; B 39 -14 420 670 ; -C -1 ; WX 667 ; N Ecircumflexacute ; B 20 0 622 891 ; -C -1 ; WX 444 ; N ecircumflexacute ; B 39 -14 420 891 ; -C -1 ; WX 667 ; N Ecircumflexgrave ; B 20 0 622 891 ; -C -1 ; WX 444 ; N ecircumflexgrave ; B 39 -14 420 891 ; -C -1 ; WX 667 ; N Ecircumflexhookabove ; B 20 0 622 891 ; -C -1 ; WX 444 ; N ecircumflexhookabove ; B 39 -14 420 891 ; -C -1 ; WX 667 ; N Ecircumflextilde ; B 20 0 622 891 ; -C -1 ; WX 444 ; N ecircumflextilde ; B 39 -14 420 861 ; -C -1 ; WX 667 ; N Ecircumflexdotbelow ; B 20 -212 622 791 ; -C -1 ; WX 444 ; N ecircumflexdotbelow ; B 39 -212 420 697 ; -C -1 ; WX 389 ; N Ihookabove ; B 20 0 366 891 ; -C -1 ; WX 278 ; N ihookabove ; B 21 0 267 682 ; -C -1 ; WX 389 ; N Idotbelow ; B 20 -212 366 662 ; -C -1 ; WX 278 ; N idotbelow ; B 21 -212 267 678 ; -C -1 ; WX 778 ; N Odotbelow ; B 39 -212 742 677 ; -C -1 ; WX 500 ; N odotbelow ; B 36 -212 464 470 ; -C -1 ; WX 778 ; N Ohookabove ; B 39 -15 742 891 ; -C -1 ; WX 500 ; N ohookabove ; B 36 -14 464 682 ; -C -1 ; WX 778 ; N Ocircumflexacute ; B 39 -15 742 891 ; -C -1 ; WX 500 ; N ocircumflexacute ; B 36 -14 464 891 ; -C -1 ; WX 778 ; N Ocircumflexgrave ; B 39 -15 742 891 ; -C -1 ; WX 500 ; N ocircumflexgrave ; B 36 -14 464 891 ; -C -1 ; WX 778 ; N Ocircumflexhookabove ; B 39 -15 742 891 ; -C -1 ; WX 500 ; N ocircumflexhookabove ; B 36 -14 464 891 ; -C -1 ; WX 778 ; N Ocircumflextilde ; B 39 -15 742 891 ; -C -1 ; WX 500 ; N ocircumflextilde ; B 36 -14 464 861 ; -C -1 ; WX 778 ; N Ocircumflexdotbelow ; B 39 -212 742 791 ; -C -1 ; WX 500 ; N ocircumflexdotbelow ; B 36 -212 464 697 ; -C -1 ; WX 778 ; N Ohornacute ; B 39 -15 794 888 ; -C -1 ; WX 554 ; N ohornacute ; B 36 -14 583 685 ; -C -1 ; WX 778 ; N Ohorngrave ; B 39 -15 794 888 ; -C -1 ; WX 554 ; N ohorngrave ; B 36 -14 583 685 ; -C -1 ; WX 778 ; N Ohornhookabove ; B 39 -15 794 891 ; -C -1 ; WX 554 ; N ohornhookabove ; B 36 -14 583 682 ; -C -1 ; WX 778 ; N Ohorntilde ; B 39 -15 794 857 ; -C -1 ; WX 554 ; N ohorntilde ; B 36 -14 583 670 ; -C -1 ; WX 778 ; N Ohorndotbelow ; B 39 -212 794 737 ; -C -1 ; WX 554 ; N ohorndotbelow ; B 36 -212 583 510 ; -C -1 ; WX 722 ; N Udotbelow ; B 23 -212 705 662 ; -C -1 ; WX 556 ; N udotbelow ; B 31 -212 524 457 ; -C -1 ; WX 722 ; N Uhookabove ; B 23 -16 705 891 ; -C -1 ; WX 556 ; N uhookabove ; B 31 -14 524 682 ; -C -1 ; WX 796 ; N Uhornacute ; B 23 -16 836 888 ; -C -1 ; WX 600 ; N uhornacute ; B 31 -14 621 685 ; -C -1 ; WX 796 ; N Uhorngrave ; B 23 -16 836 888 ; -C -1 ; WX 600 ; N uhorngrave ; B 31 -14 621 685 ; -C -1 ; WX 796 ; N Uhornhookabove ; B 23 -16 836 891 ; -C -1 ; WX 600 ; N uhornhookabove ; B 31 -14 621 682 ; -C -1 ; WX 796 ; N Uhorntilde ; B 23 -16 836 857 ; -C -1 ; WX 600 ; N uhorntilde ; B 31 -14 621 670 ; -C -1 ; WX 796 ; N Uhorndotbelow ; B 23 -212 836 801 ; -C -1 ; WX 600 ; N uhorndotbelow ; B 31 -212 621 474 ; -C -1 ; WX 722 ; N Ydotbelow ; B 9 -212 711 662 ; -C -1 ; WX 500 ; N ydotbelow ; B 8 -216 491 457 ; -C -1 ; WX 722 ; N Yhookabove ; B 9 0 711 891 ; -C -1 ; WX 500 ; N yhookabove ; B 8 -216 491 682 ; -C -1 ; WX 722 ; N Ytilde ; B 9 0 711 857 ; -C -1 ; WX 500 ; N ytilde ; B 8 -216 491 670 ; -C -1 ; WX 722 ; N uni01CD ; B 8 0 711 896 ; -C -1 ; WX 500 ; N uni01CE ; B 45 -6 483 697 ; -C -1 ; WX 389 ; N uni01CF ; B 20 0 366 896 ; -C -1 ; WX 278 ; N uni01D0 ; B -12 0 302 697 ; -C -1 ; WX 778 ; N uni01D1 ; B 39 -15 742 896 ; -C -1 ; WX 500 ; N uni01D2 ; B 36 -14 464 697 ; -C -1 ; WX 722 ; N uni01D3 ; B 23 -16 705 896 ; -C -1 ; WX 556 ; N uni01D4 ; B 31 -14 524 697 ; -C -1 ; WX 722 ; N uni01D5 ; B 23 -16 705 891 ; -C -1 ; WX 556 ; N uni01D6 ; B 31 -14 524 764 ; -C -1 ; WX 722 ; N uni01D7 ; B 23 -16 705 891 ; -C -1 ; WX 556 ; N uni01D8 ; B 31 -14 524 829 ; -C -1 ; WX 722 ; N uni01D9 ; B 23 -16 705 891 ; -C -1 ; WX 556 ; N uni01DA ; B 31 -14 524 851 ; -C -1 ; WX 722 ; N uni01DB ; B 23 -16 705 891 ; -C -1 ; WX 556 ; N uni01DC ; B 31 -14 524 829 ; -C -1 ; WX 0 ; N glyph1292 ; B -121 706 121 891 ; -C -1 ; WX 0 ; N glyph1293 ; B -121 706 121 891 ; -C -1 ; WX 0 ; N glyph1294 ; B -121 706 121 891 ; -C -1 ; WX 0 ; N glyph1295 ; B -121 706 121 891 ; -C -1 ; WX 636 ; N uni0492 ; B 17 0 604 662 ; -C -1 ; WX 454 ; N uni0493 ; B 17 0 437 457 ; -C -1 ; WX 989 ; N uni0496 ; B 15 -193 973 670 ; -C -1 ; WX 725 ; N uni0497 ; B 6 -120 719 464 ; -C -1 ; WX 725 ; N uni049A ; B 21 -193 709 670 ; -C -1 ; WX 576 ; N uni049B ; B 35 -120 563 464 ; -C -1 ; WX 725 ; N uni049C ; B 21 0 709 670 ; -C -1 ; WX 576 ; N uni049D ; B 35 0 563 464 ; -C -1 ; WX 778 ; N uni04A2 ; B 21 -193 760 662 ; -C -1 ; WX 576 ; N uni04A3 ; B 34 -120 541 457 ; -C -1 ; WX 722 ; N uni04AE ; B 9 0 711 662 ; -C -1 ; WX 500 ; N uni04AF ; B 9 -214 491 457 ; -C -1 ; WX 722 ; N uni04B0 ; B 9 0 711 662 ; -C -1 ; WX 500 ; N uni04B1 ; B 9 -214 491 457 ; -C -1 ; WX 722 ; N uni04B2 ; B 7 -193 715 662 ; -C -1 ; WX 500 ; N uni04B3 ; B 23 -120 484 457 ; -C -1 ; WX 734 ; N uni04B8 ; B 6 0 713 662 ; -C -1 ; WX 564 ; N uni04B9 ; B 25 0 526 457 ; -C -1 ; WX 734 ; N uni04BA ; B 21 0 728 662 ; -C -1 ; WX 556 ; N uni04BB ; B 34 0 527 662 ; -C -1 ; WX 739 ; N uni018F ; B 39 -15 703 677 ; -C -1 ; WX 444 ; N uni0259 ; B 27 -14 409 470 ; -C -1 ; WX 778 ; N uni04E8 ; B 39 -15 742 671 ; -C -1 ; WX 500 ; N uni04E9 ; B 36 -14 464 470 ; -C -1 ; WX 649 ; N glyph1320 ; B 28 143 649 489 ; -C -1 ; WX 271 ; N glyph1321 ; B -34 143 271 492 ; -C -1 ; WX 305 ; N glyph1322 ; B -34 143 305 637 ; -C -1 ; WX 324 ; N glyph1323 ; B -34 143 324 578 ; -C -1 ; WX 612 ; N glyph1324 ; B 19 -130 612 464 ; -C -1 ; WX 271 ; N glyph1325 ; B 49 -63 222 107 ; -C -1 ; WX 271 ; N glyph1326 ; B 11 -81 264 107 ; -C -1 ; WX 271 ; N glyph1327 ; B 11 -193 264 107 ; -C -1 ; WX 271 ; N glyph1328 ; B 8 -193 261 107 ; -C -1 ; WX 271 ; N glyph1329 ; B 33 -171 238 107 ; -C -1 ; WX 271 ; N glyph1330 ; B -22 -210 295 107 ; -C -1 ; WX 0 ; N glyph1331 ; B -133 519 133 837 ; -C -1 ; WX 207 ; N glyph1332 ; B 7 731 210 891 ; -C -1 ; WX 207 ; N glyph1333 ; B -5 746 179 890 ; -C -1 ; WX 333 ; N glyph1334 ; B 70 605 250 717 ; -C -1 ; WX 333 ; N glyph1335 ; B 70 605 250 717 ; -C -1 ; WX 238 ; N uni0653 ; B 0 765 238 831 ; -C -1 ; WX 217 ; N uni0654 ; B 46 750 181 890 ; -C -1 ; WX 217 ; N uni0655 ; B 46 -119 181 21 ; -C -1 ; WX 0 ; N uni0670 ; B -26 519 29 817 ; -C -1 ; WX 217 ; N uni0671 ; B 7 109 210 891 ; -C -1 ; WX 234 ; N uniFB51 ; B -32 143 234 891 ; -C -1 ; WX 217 ; N uni0672 ; B -5 109 181 890 ; -C -1 ; WX 234 ; N glyph1343 ; B -25 143 234 890 ; -C -1 ; WX 217 ; N uni0673 ; B 14 -84 198 736 ; -C -1 ; WX 234 ; N glyph1345 ; B 4 -84 234 736 ; -C -1 ; WX 217 ; N uni0675 ; B 66 109 298 743 ; -C -1 ; WX 234 ; N glyph47 ; B 13 143 269 743 ; -C -1 ; WX 451 ; N uni0676 ; B 3 -71 498 694 ; -C -1 ; WX 451 ; N glyph1349 ; B 3 -71 498 694 ; -C -1 ; WX 451 ; N uni0677 ; B 3 -71 498 729 ; -C -1 ; WX 451 ; N glyph1351 ; B 3 -71 498 729 ; -C -1 ; WX 645 ; N uni0678 ; B 74 -60 645 694 ; -C -1 ; WX 554 ; N glyph ; B 15 -174 588 499 ; -C -1 ; WX 649 ; N uni0679 ; B 28 143 649 837 ; -C -1 ; WX 649 ; N uniFB67 ; B 28 143 649 837 ; -C -1 ; WX 271 ; N uniFB68 ; B -34 143 271 837 ; -C -1 ; WX 271 ; N uniFB69 ; B -34 143 271 837 ; -C -1 ; WX 649 ; N uni067A ; B 28 143 649 766 ; -C -1 ; WX 649 ; N uniFB5F ; B 28 143 649 766 ; -C -1 ; WX 271 ; N uniFB60 ; B -34 143 271 828 ; -C -1 ; WX 271 ; N uniFB61 ; B -34 143 271 828 ; -C -1 ; WX 649 ; N uni067B ; B 28 -171 649 489 ; -C -1 ; WX 649 ; N uniFB53 ; B 28 -171 649 489 ; -C -1 ; WX 271 ; N uniFB54 ; B -34 -171 271 492 ; -C -1 ; WX 271 ; N uniFB55 ; B -34 -171 271 492 ; -C -1 ; WX 649 ; N uni067C ; B 28 31 649 656 ; -C -1 ; WX 649 ; N glyph1367 ; B 28 31 649 656 ; -C -1 ; WX 271 ; N glyph1368 ; B -34 31 271 715 ; -C -1 ; WX 271 ; N glyph1369 ; B -34 31 271 715 ; -C -1 ; WX 649 ; N uni067D ; B 28 143 649 766 ; -C -1 ; WX 649 ; N glyph1371 ; B 28 143 649 766 ; -C -1 ; WX 271 ; N glyph1372 ; B -34 143 271 828 ; -C -1 ; WX 271 ; N glyph1373 ; B -34 143 271 828 ; -C -1 ; WX 649 ; N uni067F ; B 28 143 649 783 ; -C -1 ; WX 649 ; N uniFB63 ; B 28 143 649 783 ; -C -1 ; WX 271 ; N uniFB64 ; B -34 143 295 844 ; -C -1 ; WX 271 ; N uniFB65 ; B -34 143 295 844 ; -C -1 ; WX 649 ; N uni0680 ; B 28 -210 649 489 ; -C -1 ; WX 649 ; N uniFB5B ; B 28 -210 649 489 ; -C -1 ; WX 271 ; N uniFB5C ; B -34 -210 295 492 ; -C -1 ; WX 271 ; N uniFB5D ; B -34 -210 295 492 ; -C -1 ; WX 577 ; N uni0681 ; B 25 -203 563 733 ; -C -1 ; WX 559 ; N glyph1383 ; B 23 -201 563 733 ; -C -1 ; WX 523 ; N glyph1384 ; B -34 143 523 704 ; -C -1 ; WX 523 ; N glyph1385 ; B -34 143 523 704 ; -C -1 ; WX 577 ; N uni0682 ; B 25 -203 563 854 ; -C -1 ; WX 559 ; N glyph1387 ; B 23 -201 563 854 ; -C -1 ; WX 523 ; N glyph1388 ; B -34 143 523 832 ; -C -1 ; WX 523 ; N glyph1389 ; B -34 143 523 832 ; -C -1 ; WX 577 ; N uni0683 ; B 25 -203 563 527 ; -C -1 ; WX 559 ; N uniFB77 ; B 23 -201 563 527 ; -C -1 ; WX 523 ; N uniFB78 ; B -34 -81 523 501 ; -C -1 ; WX 523 ; N uniFB79 ; B -34 -81 523 501 ; -C -1 ; WX 577 ; N uni0684 ; B 25 -203 563 527 ; -C -1 ; WX 559 ; N uniFB73 ; B 23 -201 563 527 ; -C -1 ; WX 523 ; N uniFB74 ; B -34 -171 523 501 ; -C -1 ; WX 523 ; N uniFB75 ; B -34 -171 523 501 ; -C -1 ; WX 577 ; N uni0685 ; B 25 -203 563 876 ; -C -1 ; WX 559 ; N glyph1399 ; B 23 -201 563 876 ; -C -1 ; WX 523 ; N glyph1400 ; B -34 143 523 854 ; -C -1 ; WX 523 ; N glyph1401 ; B -34 143 523 854 ; -C -1 ; WX 577 ; N uni0687 ; B 25 -203 563 527 ; -C -1 ; WX 559 ; N uniFB7f ; B 23 -201 563 527 ; -C -1 ; WX 523 ; N uniFB80 ; B -34 -210 523 501 ; -C -1 ; WX 523 ; N uniFB81 ; B -34 -210 523 501 ; -C -1 ; WX 343 ; N uni0688 ; B 39 143 343 891 ; -C -1 ; WX 343 ; N uniFB89 ; B 39 143 343 891 ; -C -1 ; WX 343 ; N uni0689 ; B 51 31 343 604 ; -C -1 ; WX 343 ; N glyph1409 ; B 51 31 343 604 ; -C -1 ; WX 343 ; N uni068A ; B 51 -63 343 604 ; -C -1 ; WX 343 ; N glyph1411 ; B 51 -63 343 604 ; -C -1 ; WX 343 ; N uni068B ; B 39 -63 343 891 ; -C -1 ; WX 343 ; N glyph1413 ; B 39 -63 343 891 ; -C -1 ; WX 343 ; N uni068C ; B 50 143 343 849 ; -C -1 ; WX 343 ; N uniFB85 ; B 50 143 343 849 ; -C -1 ; WX 343 ; N uni068D ; B 51 -81 343 604 ; -C -1 ; WX 343 ; N uniFB83 ; B 51 -81 343 604 ; -C -1 ; WX 343 ; N uni068E ; B 51 143 343 888 ; -C -1 ; WX 343 ; N uniFB87 ; B 51 143 343 888 ; -C -1 ; WX 343 ; N uni068F ; B 23 143 343 888 ; -C -1 ; WX 343 ; N glyph1421 ; B 23 143 343 888 ; -C -1 ; WX 343 ; N uni0690 ; B 17 143 343 888 ; -C -1 ; WX 343 ; N glyph1423 ; B 17 143 343 888 ; -C -1 ; WX 433 ; N uni0691 ; B 5 -72 433 837 ; -C -1 ; WX 433 ; N uniFB8D ; B 5 -72 433 837 ; -C -1 ; WX 433 ; N uni0692 ; B 5 -72 433 631 ; -C -1 ; WX 433 ; N glyph1426 ; B 5 -72 433 631 ; -C -1 ; WX 433 ; N uni0693 ; B 5 -99 458 461 ; -C -1 ; WX 433 ; N glyph1429 ; B 5 -99 458 461 ; -C -1 ; WX 433 ; N uni0694 ; B 5 -180 505 461 ; -C -1 ; WX 433 ; N glyph1431 ; B 5 -180 505 461 ; -C -1 ; WX 433 ; N uni0695 ; B 5 -196 494 461 ; -C -1 ; WX 433 ; N glyph1433 ; B 5 -196 494 461 ; -C -1 ; WX 433 ; N uni0696 ; B 5 -180 505 461 ; -C -1 ; WX 433 ; N glyph1435 ; B 5 -180 505 461 ; -C -1 ; WX 433 ; N uni0697 ; B 5 -72 447 700 ; -C -1 ; WX 433 ; N glyph1437 ; B 5 -72 447 700 ; -C -1 ; WX 433 ; N uni0699 ; B 5 -72 447 830 ; -C -1 ; WX 433 ; N glyph1439 ; B 5 -72 447 830 ; -C -1 ; WX 899 ; N uni069A ; B 31 -63 899 634 ; -C -1 ; WX 899 ; N glyph1441 ; B 31 -63 899 634 ; -C -1 ; WX 608 ; N glyph1442 ; B -34 -63 608 634 ; -C -1 ; WX 608 ; N glyph1443 ; B -34 -63 608 634 ; -C -1 ; WX 899 ; N uni069B ; B 31 -193 899 458 ; -C -1 ; WX 899 ; N glyph1445 ; B 31 -193 899 458 ; -C -1 ; WX 608 ; N glyph1446 ; B -34 -193 608 446 ; -C -1 ; WX 608 ; N glyph1447 ; B -34 -193 608 446 ; -C -1 ; WX 899 ; N uni069C ; B 31 -193 899 774 ; -C -1 ; WX 899 ; N glyph1449 ; B 31 -193 899 774 ; -C -1 ; WX 608 ; N glyph1450 ; B -34 -193 608 774 ; -C -1 ; WX 608 ; N glyph1451 ; B -34 -193 608 774 ; -C -1 ; WX 1063 ; N uni069D ; B 31 -81 1063 504 ; -C -1 ; WX 1063 ; N glyph1453 ; B 31 -81 1063 504 ; -C -1 ; WX 771 ; N glyph1454 ; B -34 -81 771 504 ; -C -1 ; WX 771 ; N glyph1455 ; B -34 -81 771 504 ; -C -1 ; WX 1063 ; N uni069E ; B 31 -63 1063 820 ; -C -1 ; WX 1063 ; N glyph1457 ; B 31 -63 1063 820 ; -C -1 ; WX 771 ; N glyph1458 ; B -34 143 771 820 ; -C -1 ; WX 771 ; N glyph1459 ; B -34 143 771 820 ; -C -1 ; WX 523 ; N uni069F ; B -34 143 523 858 ; -C -1 ; WX 523 ; N glyph1461 ; B -34 143 523 858 ; -C -1 ; WX 541 ; N uni06A0 ; B 25 -204 535 891 ; -C -1 ; WX 469 ; N glyph1463 ; B 34 -198 516 878 ; -C -1 ; WX 541 ; N glyph1464 ; B -34 143 483 891 ; -C -1 ; WX 360 ; N glyph1465 ; B -34 143 360 852 ; -C -1 ; WX 758 ; N uni06A1 ; B 23 127 758 549 ; -C -1 ; WX 758 ; N uni06A2 ; B 23 -63 758 549 ; -C -1 ; WX 758 ; N glyph1468 ; B 23 -63 758 549 ; -C -1 ; WX 305 ; N glyph1469 ; B -34 -63 305 637 ; -C -1 ; WX 324 ; N glyph1470 ; B -34 -63 324 578 ; -C -1 ; WX 758 ; N uni06A3 ; B 23 -63 758 779 ; -C -1 ; WX 758 ; N glyph1472 ; B 23 -63 758 779 ; -C -1 ; WX 305 ; N glyph1473 ; B -34 -63 305 850 ; -C -1 ; WX 324 ; N glyph1474 ; B -34 -63 324 784 ; -C -1 ; WX 758 ; N uni06A4 ; B 23 127 758 872 ; -C -1 ; WX 758 ; N uniFB6B ; B 23 127 758 872 ; -C -1 ; WX 305 ; N uniFB6C ; B -34 143 305 811 ; -C -1 ; WX 324 ; N uniFB6D ; B -34 143 324 891 ; -C -1 ; WX 758 ; N uni06A5 ; B 23 -193 758 549 ; -C -1 ; WX 758 ; N glyph1480 ; B 23 -193 758 549 ; -C -1 ; WX 305 ; N glyph1481 ; B -34 -193 305 637 ; -C -1 ; WX 324 ; N glyph1482 ; B -34 -193 324 578 ; -C -1 ; WX 758 ; N uni06A6 ; B 23 127 758 883 ; -C -1 ; WX 758 ; N uniFB6F ; B 23 127 758 883 ; -C -1 ; WX 305 ; N uniFB70 ; B -34 143 305 864 ; -C -1 ; WX 324 ; N uniFB71 ; B -34 143 324 891 ; -C -1 ; WX 612 ; N uni06A7 ; B 19 -130 612 683 ; -C -1 ; WX 612 ; N glyph1488 ; B 19 -130 612 683 ; -C -1 ; WX 612 ; N uni06A8 ; B 19 -130 612 771 ; -C -1 ; WX 612 ; N glyph1490 ; B 19 -130 612 771 ; -C -1 ; WX 757 ; N uni06AA ; B 20 143 757 674 ; -C -1 ; WX 879 ; N glyph1492 ; B 20 143 879 674 ; -C -1 ; WX 360 ; N glyph1493 ; B -34 143 360 674 ; -C -1 ; WX 542 ; N glyph1494 ; B -34 143 542 674 ; -C -1 ; WX 757 ; N uni06AB ; B 20 143 760 708 ; -C -1 ; WX 879 ; N glyph1496 ; B 20 143 879 722 ; -C -1 ; WX 360 ; N glyph1497 ; B -34 143 360 708 ; -C -1 ; WX 542 ; N glyph1498 ; B -34 143 542 722 ; -C -1 ; WX 541 ; N uni06AC ; B 20 143 541 891 ; -C -1 ; WX 541 ; N glyph1500 ; B 20 143 541 891 ; -C -1 ; WX 360 ; N glyph1501 ; B -34 143 360 878 ; -C -1 ; WX 360 ; N glyph1502 ; B -34 143 360 878 ; -C -1 ; WX 541 ; N uni06AD ; B 20 143 541 859 ; -C -1 ; WX 541 ; N uniFBD4 ; B 20 143 541 859 ; -C -1 ; WX 360 ; N uniFBD5 ; B -34 143 360 811 ; -C -1 ; WX 360 ; N uniFBD6 ; B -34 143 360 811 ; -C -1 ; WX 541 ; N uni06AE ; B 20 -193 541 774 ; -C -1 ; WX 541 ; N glyph1508 ; B 20 -193 541 774 ; -C -1 ; WX 360 ; N glyph1509 ; B -34 -193 360 708 ; -C -1 ; WX 360 ; N glyph1510 ; B -34 -193 360 708 ; -C -1 ; WX 757 ; N uni06B0 ; B 20 143 760 863 ; -C -1 ; WX 879 ; N glyph1512 ; B 20 143 879 876 ; -C -1 ; WX 360 ; N glyph1513 ; B -34 143 360 863 ; -C -1 ; WX 542 ; N glyph1514 ; B -34 143 542 876 ; -C -1 ; WX 757 ; N uni06B1 ; B 20 143 757 891 ; -C -1 ; WX 879 ; N uniFB9B ; B 20 143 879 891 ; -C -1 ; WX 360 ; N uniFB9C ; B -34 143 360 891 ; -C -1 ; WX 542 ; N uniFB9D ; B -34 143 542 891 ; -C -1 ; WX 757 ; N uni06B2 ; B 20 -81 757 863 ; -C -1 ; WX 879 ; N glyph1520 ; B 20 -81 879 876 ; -C -1 ; WX 360 ; N glyph1521 ; B -34 -81 360 863 ; -C -1 ; WX 542 ; N glyph1522 ; B -34 -81 542 876 ; -C -1 ; WX 757 ; N uni06B3 ; B 20 -171 757 863 ; -C -1 ; WX 879 ; N uniFB97 ; B 20 -171 879 876 ; -C -1 ; WX 360 ; N uniFB98 ; B -34 -171 360 863 ; -C -1 ; WX 542 ; N uniFB99 ; B -34 -171 542 876 ; -C -1 ; WX 757 ; N uni06B4 ; B 20 143 757 891 ; -C -1 ; WX 879 ; N glyph1528 ; B 20 143 879 891 ; -C -1 ; WX 360 ; N glyph1529 ; B -34 143 360 891 ; -C -1 ; WX 542 ; N glyph1530 ; B -34 143 542 891 ; -C -1 ; WX 451 ; N uni06B5 ; B 17 -36 451 891 ; -C -1 ; WX 451 ; N glyph1532 ; B 17 -36 451 891 ; -C -1 ; WX 234 ; N glyph1533 ; B -34 143 234 891 ; -C -1 ; WX 234 ; N glyph1534 ; B -34 143 234 891 ; -C -1 ; WX 451 ; N uni06B6 ; B 17 -36 451 891 ; -C -1 ; WX 451 ; N glyph1536 ; B 17 -36 451 891 ; -C -1 ; WX 234 ; N glyph1537 ; B -39 143 234 891 ; -C -1 ; WX 234 ; N glyph1538 ; B -39 143 234 891 ; -C -1 ; WX 451 ; N uni06B7 ; B 17 -36 451 891 ; -C -1 ; WX 451 ; N glyph1540 ; B 17 -36 451 891 ; -C -1 ; WX 234 ; N glyph1541 ; B -34 143 234 891 ; -C -1 ; WX 234 ; N glyph1542 ; B -34 143 234 891 ; -C -1 ; WX 451 ; N uni06B8 ; B 17 -168 451 773 ; -C -1 ; WX 451 ; N glyph1544 ; B 17 -168 451 773 ; -C -1 ; WX 234 ; N glyph1545 ; B -34 -193 242 774 ; -C -1 ; WX 234 ; N glyph1546 ; B -34 -193 242 774 ; -C -1 ; WX 541 ; N uni06B9 ; B 30 -212 541 612 ; -C -1 ; WX 541 ; N glyph1548 ; B 30 -212 541 612 ; -C -1 ; WX 271 ; N glyph1549 ; B -34 -63 274 735 ; -C -1 ; WX 271 ; N glyph1550 ; B -34 -63 274 735 ; -C -1 ; WX 541 ; N uni06BA ; B 30 -63 541 458 ; -C -1 ; WX 541 ; N uniFB9F ; B 30 -63 541 458 ; -C -1 ; WX 541 ; N uni06BB ; B 30 -63 541 798 ; -C -1 ; WX 541 ; N uniFBA1 ; B 30 -63 541 798 ; -C -1 ; WX 541 ; N uni06BC ; B 30 -175 541 612 ; -C -1 ; WX 541 ; N glyph1556 ; B 30 -175 541 612 ; -C -1 ; WX 271 ; N glyph1557 ; B -34 31 274 735 ; -C -1 ; WX 271 ; N glyph1558 ; B -34 31 274 735 ; -C -1 ; WX 541 ; N uni06BD ; B 30 -63 541 742 ; -C -1 ; WX 541 ; N glyph1560 ; B 30 -63 541 742 ; -C -1 ; WX 577 ; N uni06BF ; B 25 -203 563 746 ; -C -1 ; WX 559 ; N glyph1562 ; B 23 -201 563 746 ; -C -1 ; WX 523 ; N glyph1563 ; B -34 -193 523 724 ; -C -1 ; WX 523 ; N glyph1564 ; B -34 -193 523 724 ; -C -1 ; WX 343 ; N uni06C0 ; B 43 126 304 694 ; -C -1 ; WX 415 ; N uniFBA5 ; B 1 143 415 743 ; -C -1 ; WX 388 ; N uni06C1 ; B 13 68 388 376 ; -C -1 ; WX 388 ; N uni06C2 ; B 13 68 388 597 ; -C -1 ; WX 388 ; N uni06C3 ; B 13 68 388 634 ; -C -1 ; WX 451 ; N uni06C4 ; B 3 -71 451 484 ; -C -1 ; WX 451 ; N glyph1571 ; B 3 -71 451 484 ; -C -1 ; WX 451 ; N uni06C5 ; B 3 -71 451 484 ; -C -1 ; WX 451 ; N uniFBE1 ; B 3 -71 451 484 ; -C -1 ; WX 451 ; N uni06C6 ; B 3 -71 451 667 ; -C -1 ; WX 451 ; N uniFBDA ; B 3 -71 451 667 ; -C -1 ; WX 451 ; N uni06C7 ; B 3 -71 451 778 ; -C -1 ; WX 451 ; N uniFBD8 ; B 3 -71 451 778 ; -C -1 ; WX 451 ; N uni06C8 ; B 3 -71 451 817 ; -C -1 ; WX 451 ; N uniFBDC ; B 3 -71 451 817 ; -C -1 ; WX 451 ; N uni06C9 ; B 3 -71 451 667 ; -C -1 ; WX 451 ; N uniFBE3 ; B 3 -71 451 667 ; -C -1 ; WX 451 ; N uni06CA ; B 3 -71 451 699 ; -C -1 ; WX 451 ; N glyph1583 ; B 3 -71 451 699 ; -C -1 ; WX 451 ; N uni06CB ; B 3 -71 451 816 ; -C -1 ; WX 451 ; N uniFBDF ; B 3 -71 451 816 ; -C -1 ; WX 645 ; N uni06CD ; B 32 -60 575 461 ; -C -1 ; WX 554 ; N glyph1587 ; B -19 -174 554 276 ; -C -1 ; WX 645 ; N uni06CE ; B 74 -60 575 522 ; -C -1 ; WX 554 ; N glyph1589 ; B 15 -174 588 424 ; -C -1 ; WX 271 ; N glyph1590 ; B -34 -81 271 667 ; -C -1 ; WX 271 ; N glyph1591 ; B -34 -81 271 667 ; -C -1 ; WX 451 ; N uni06CF ; B 3 -71 451 724 ; -C -1 ; WX 451 ; N glyph1593 ; B 3 -71 451 724 ; -C -1 ; WX 645 ; N uni06D0 ; B 74 -187 575 461 ; -C -1 ; WX 554 ; N uniFBE5 ; B 5 -212 554 282 ; -C -1 ; WX 271 ; N uniFBE6 ; B -34 -171 271 492 ; -C -1 ; WX 271 ; N uniFBE7 ; B -34 -171 271 492 ; -C -1 ; WX 645 ; N uni06D1 ; B 74 -178 575 461 ; -C -1 ; WX 554 ; N glyph1599 ; B 5 -212 554 282 ; -C -1 ; WX 812 ; N uni06D2 ; B 33 -25 812 469 ; -C -1 ; WX 812 ; N uniFBAF ; B 34 -208 812 276 ; -C -1 ; WX 812 ; N uni06D3 ; B 33 -25 812 597 ; -C -1 ; WX 812 ; N uniFBB1 ; B 34 -208 812 499 ; -C -1 ; WX 207 ; N uni06D4 ; B 20 143 188 276 ; -C -1 ; WX 0 ; N uni06D6 ; B -230 519 231 886 ; -C -1 ; WX 0 ; N uni06D7 ; B -182 519 183 886 ; -C -1 ; WX 0 ; N uni06D8 ; B -107 519 107 675 ; -C -1 ; WX 0 ; N uni06D9 ; B -108 519 108 836 ; -C -1 ; WX 0 ; N uni06DA ; B -128 519 128 866 ; -C -1 ; WX 0 ; N uni06DB ; B -65 519 68 660 ; -C -1 ; WX 0 ; N uni06DC ; B -207 519 207 767 ; -C -1 ; WX 1123 ; N uni06DD ; B 24 -188 1099 886 ; -C -1 ; WX 1084 ; N uni06DE ; B 24 -152 1060 884 ; -C -1 ; WX 0 ; N uni06DF ; B -37 519 37 592 ; -C -1 ; WX 0 ; N uni06E0 ; B -36 519 36 591 ; -C -1 ; WX 0 ; N uni06E1 ; B -133 519 133 689 ; -C -1 ; WX 0 ; N uni06E2 ; B -82 519 82 824 ; -C -1 ; WX 0 ; N uni06E3 ; B -207 -209 207 39 ; -C -1 ; WX 0 ; N uni06E4 ; B -57 519 57 550 ; -C -1 ; WX 213 ; N uni06E5 ; B 0 519 213 783 ; -C -1 ; WX 371 ; N uni06E6 ; B 0 519 371 754 ; -C -1 ; WX 0 ; N uni06E7 ; B -185 519 186 754 ; -C -1 ; WX 0 ; N uni06E8 ; B -122 519 122 840 ; -C -1 ; WX 600 ; N uni06E9 ; B 24 0 576 818 ; -C -1 ; WX 0 ; N uni06EA ; B -82 -165 82 -1 ; -C -1 ; WX 0 ; N uni06EB ; B -82 519 82 683 ; -C -1 ; WX 0 ; N uni06ED ; B -82 -209 82 97 ; -C -1 ; WX 899 ; N uni06FA ; B 31 -63 899 774 ; -C -1 ; WX 899 ; N glyph1629 ; B 31 -63 899 774 ; -C -1 ; WX 608 ; N glyph1630 ; B -34 -63 608 774 ; -C -1 ; WX 608 ; N glyph1631 ; B -34 -63 608 774 ; -C -1 ; WX 1063 ; N uni06FB ; B 31 -63 1063 728 ; -C -1 ; WX 1063 ; N glyph1633 ; B 31 -63 1063 728 ; -C -1 ; WX 771 ; N glyph1634 ; B -34 -63 771 728 ; -C -1 ; WX 771 ; N glyph1635 ; B -34 -63 771 728 ; -C -1 ; WX 541 ; N uni06FC ; B 25 -204 535 822 ; -C -1 ; WX 469 ; N glyph1637 ; B 34 -198 516 760 ; -C -1 ; WX 541 ; N glyph1638 ; B -34 -63 483 800 ; -C -1 ; WX 360 ; N glyph1639 ; B -34 -63 360 756 ; -C -1 ; WX 469 ; N uni06FD ; B 62 -145 422 510 ; -C -1 ; WX 360 ; N uni06FE ; B 16 -212 360 431 ; -C -1 ; WX 343 ; N uniFBA6 ; B 43 126 304 519 ; -C -1 ; WX 271 ; N uniFBA8 ; B -34 -134 271 492 ; -C -1 ; WX 320 ; N uniFBA9 ; B -34 -205 320 395 ; -C -1 ; WX 244 ; N glyph1645 ; B 23 -68 222 49 ; -C -1 ; WX 244 ; N glyph1646 ; B 29 -151 226 -20 ; -C -1 ; WX 244 ; N glyph1647 ; B 9 -136 236 59 ; -C -1 ; WX 244 ; N glyph1648 ; B 86 -64 162 34 ; -C -1 ; WX 244 ; N glyph1649 ; B 53 -70 197 27 ; -C -1 ; WX 757 ; N glyph1650 ; B 20 143 757 811 ; -C -1 ; WX 879 ; N glyph1651 ; B 20 143 879 811 ; -C -1 ; WX 311 ; N uniFB1D ; B 27 40 272 553 ; -C -1 ; WX 0 ; N uniFB1E ; B -148 596 147 752 ; -C -1 ; WX 414 ; N glyph1654 ; B 0 72 414 123 ; -C -1 ; WX 621 ; N uniFB1F ; B 27 72 583 553 ; -C -1 ; WX 486 ; N glyph1656 ; B -5 72 471 890 ; -C -1 ; WX 541 ; N glyph1657 ; B -5 94 541 890 ; -C -1 ; WX 486 ; N glyph1658 ; B 17 -122 471 739 ; -C -1 ; WX 541 ; N glyph1659 ; B 13 -122 541 766 ; -C -1 ; WX 486 ; N glyph1660 ; B 17 72 471 792 ; -C -1 ; WX 541 ; N glyph1661 ; B 13 94 541 792 ; -C -1 ; WX 486 ; N glyph1662 ; B 17 72 484 891 ; -C -1 ; WX 541 ; N glyph1663 ; B 13 94 541 891 ; -C -1 ; WX 486 ; N glyph1664 ; B 17 72 491 891 ; -C -1 ; WX 541 ; N glyph1665 ; B 13 94 541 891 ; -C -1 ; WX 486 ; N glyph1666 ; B 17 72 471 891 ; -C -1 ; WX 541 ; N glyph1667 ; B 13 94 541 891 ; -C -1 ; WX 486 ; N glyph1668 ; B 17 -173 471 739 ; -C -1 ; WX 541 ; N glyph1669 ; B 13 -136 541 766 ; -C -1 ; WX 562 ; N glyph1670 ; B 56 143 505 713 ; -C -1 ; WX 562 ; N glyph1671 ; B 92 89 469 713 ; -C -1 ; WX 486 ; N glyph1672 ; B 7 72 471 891 ; -C -1 ; WX 541 ; N glyph1673 ; B 7 94 541 891 ; -EndCharMetrics -StartKernData -StartKernPairs 865 -KPX space A -55 -KPX space T -18 -KPX space V -18 -KPX space W -18 -KPX space Y -37 -KPX space Alphatonos -55 -KPX space Alpha -55 -KPX space Delta -55 -KPX space Lambda -55 -KPX space Tau -18 -KPX space Upsilon -37 -KPX space Upsilondieresis -37 -KPX one one -55 -KPX A space -55 -KPX A T -74 -KPX A V -129 -KPX A W -111 -KPX A Y -92 -KPX A v -74 -KPX A w -74 -KPX A y -74 -KPX A quoteright -74 -KPX F space -37 -KPX F comma -92 -KPX F period -92 -KPX F A -74 -KPX L space -55 -KPX L T -92 -KPX L V -92 -KPX L W -92 -KPX L Y -92 -KPX L y -55 -KPX L quoteright -92 -KPX P space -55 -KPX P comma -92 -KPX P period -92 -KPX P A -74 -KPX R T -35 -KPX R V -35 -KPX R W -35 -KPX R Y -35 -KPX R y -35 -KPX T space -18 -KPX T comma -74 -KPX T hyphen -92 -KPX T period -74 -KPX T colon -74 -KPX T semicolon -74 -KPX T A -74 -KPX T O -18 -KPX T a -92 -KPX T c -92 -KPX T e -92 -KPX T i -18 -KPX T o -92 -KPX T r -74 -KPX T s -92 -KPX T u -92 -KPX T w -74 -KPX T y -74 -KPX V space -18 -KPX V comma -129 -KPX V hyphen -74 -KPX V period -129 -KPX V colon -92 -KPX V semicolon -92 -KPX V A -129 -KPX V O -20 -KPX V a -92 -KPX V e -92 -KPX V i -37 -KPX V o -92 -KPX V r -74 -KPX V u -92 -KPX V y -92 -KPX W space -18 -KPX W comma -92 -KPX W hyphen -37 -KPX W period -92 -KPX W colon -55 -KPX W semicolon -55 -KPX W A -111 -KPX W a -55 -KPX W e -55 -KPX W i -18 -KPX W o -55 -KPX W r -18 -KPX W u -18 -KPX W y -37 -KPX Y space -37 -KPX Y comma -92 -KPX Y hyphen -92 -KPX Y period -92 -KPX Y colon -92 -KPX Y semicolon -92 -KPX Y A -92 -KPX Y a -111 -KPX Y e -111 -KPX Y i -37 -KPX Y o -111 -KPX Y p -92 -KPX Y q -111 -KPX Y u -92 -KPX Y v -111 -KPX f quoteright 55 -KPX r space -18 -KPX r comma -92 -KPX r hyphen -37 -KPX r period -92 -KPX r c -18 -KPX r e -18 -KPX r o -18 -KPX r q -18 -KPX r quoteright 18 -KPX v comma -55 -KPX v period -55 -KPX w comma -55 -KPX w period -55 -KPX y comma -55 -KPX y period -55 -KPX quoteleft quoteleft -74 -KPX quoteright space -74 -KPX quoteright s -37 -KPX quoteright quoteright -74 -KPX quotesinglbase afii10051 -100 -KPX quotesinglbase afii10060 -100 -KPX quotesinglbase afii10036 -100 -KPX quotesinglbase afii10041 -188 -KPX quotesinglbase afii10044 -100 -KPX quotedblbase afii10051 -100 -KPX quotedblbase afii10060 -100 -KPX quotedblbase afii10036 -100 -KPX quotedblbase afii10041 -188 -KPX quotedblbase afii10044 -100 -KPX Gamma space -37 -KPX Gamma comma -121 -KPX Gamma period -121 -KPX Gamma iotadieresistonos 68 -KPX Gamma Alpha -132 -KPX Gamma Delta -119 -KPX Gamma Lambda -132 -KPX Gamma iota -34 -KPX Theta Alpha -73 -KPX Theta Delta -34 -KPX Theta Lambda -73 -KPX Theta Upsilon -26 -KPX Theta Upsilondieresis -26 -KPX Phi Alpha -87 -KPX Phi Upsilon -13 -KPX Phi Upsilondieresis -13 -KPX delta chi -12 -KPX phi chi -12 -KPX Alphatonos space -55 -KPX Alphatonos Theta -58 -KPX Alphatonos Phi -73 -KPX Alphatonos Omicron -58 -KPX Alphatonos Tau -97 -KPX Alphatonos Upsilon -128 -KPX Alphatonos Upsilondieresis -128 -KPX Alphatonos gamma -63 -KPX Alphatonos nu -74 -KPX Alphatonos chi -39 -KPX Omicrontonos Upsilon -26 -KPX Omicrontonos Upsilondieresis -26 -KPX Upsilontonos alpha -110 -KPX Upsilontonos delta -110 -KPX Upsilontonos sigma -110 -KPX Upsilontonos phi -110 -KPX Upsilontonos iotadieresistonos 53 -KPX Upsilontonos Alpha -134 -KPX Upsilontonos Delta -116 -KPX Upsilontonos Lambda -134 -KPX Upsilontonos alphatonos -110 -KPX Upsilontonos etatonos -43 -KPX Upsilontonos iotatonos -37 -KPX Upsilontonos eta -43 -KPX Upsilontonos iota -43 -KPX Upsilontonos kappa -43 -KPX Upsilontonos mu -97 -KPX Upsilontonos omicron -110 -KPX Upsilontonos omicrontonos -110 -KPX Alpha space -55 -KPX Alpha quoteright -74 -KPX Alpha Theta -58 -KPX Alpha Phi -73 -KPX Alpha Omicron -58 -KPX Alpha Tau -97 -KPX Alpha Upsilon -128 -KPX Alpha Upsilondieresis -128 -KPX Alpha gamma -63 -KPX Alpha nu -74 -KPX Alpha chi -39 -KPX Delta space -55 -KPX Delta Theta -26 -KPX Delta Omicron -24 -KPX Delta Tau -70 -KPX Delta Upsilon -98 -KPX Delta Upsilondieresis -98 -KPX Kappa Theta -43 -KPX Kappa Phi -80 -KPX Kappa alpha -19 -KPX Kappa delta -19 -KPX Kappa sigma -19 -KPX Kappa phi -19 -KPX Kappa Omicron -43 -KPX Kappa alphatonos -19 -KPX Kappa zeta -19 -KPX Kappa theta -19 -KPX Kappa xi -19 -KPX Kappa omicron -19 -KPX Kappa omega -19 -KPX Kappa omicrontonos -19 -KPX Kappa omegatonos -19 -KPX Lambda Theta -58 -KPX Lambda Omicron -58 -KPX Lambda Tau -97 -KPX Lambda Upsilon -128 -KPX Lambda Upsilondieresis -128 -KPX Omicron Alpha -73 -KPX Omicron Delta -34 -KPX Omicron Lambda -73 -KPX Omicron Upsilon -26 -KPX Omicron Upsilondieresis -26 -KPX Rho space -55 -KPX Rho comma -91 -KPX Rho period -91 -KPX Rho Alpha -147 -KPX Rho Delta -102 -KPX Rho Lambda -147 -KPX Sigma tau -48 -KPX Tau space -18 -KPX Tau comma -74 -KPX Tau hyphen -91 -KPX Tau period -74 -KPX Tau colon -74 -KPX Tau semicolon -74 -KPX Tau Theta -18 -KPX Tau Phi -18 -KPX Tau alpha -91 -KPX Tau delta -80 -KPX Tau epsilon -91 -KPX Tau sigma -91 -KPX Tau phi -91 -KPX Tau iotadieresistonos 58 -KPX Tau Alpha -97 -KPX Tau Delta -72 -KPX Tau Lambda -97 -KPX Tau Omicron -18 -KPX Tau Omega -18 -KPX Tau alphatonos -91 -KPX Tau epsilontonos -91 -KPX Tau gamma -74 -KPX Tau eta -52 -KPX Tau iota -18 -KPX Tau mu -52 -KPX Tau nu -74 -KPX Tau omicron -91 -KPX Tau upsilon -53 -KPX Tau chi -74 -KPX Tau psi -52 -KPX Tau upsilondieresis -52 -KPX Tau omicrontonos -91 -KPX Tau upsilontonos -52 -KPX Upsilon comma -91 -KPX Upsilon hyphen -91 -KPX Upsilon period -91 -KPX Upsilon colon -91 -KPX Upsilon semicolon -91 -KPX Upsilon Theta -36 -KPX Upsilon Phi -43 -KPX Upsilon alpha -110 -KPX Upsilon delta -110 -KPX Upsilon sigma -110 -KPX Upsilon phi -110 -KPX Upsilon iotadieresistonos 53 -KPX Upsilon Alpha -134 -KPX Upsilon Delta -116 -KPX Upsilon Lambda -134 -KPX Upsilon Omicron -36 -KPX Upsilon Omega -26 -KPX Upsilon alphatonos -110 -KPX Upsilon etatonos -43 -KPX Upsilon iotatonos -37 -KPX Upsilon gamma -73 -KPX Upsilon eta -43 -KPX Upsilon iota -37 -KPX Upsilon kappa -43 -KPX Upsilon mu -97 -KPX Upsilon omicron -110 -KPX Upsilon omicrontonos -110 -KPX Chi omega -19 -KPX Chi omegatonos -19 -KPX Psi alpha -58 -KPX Psi delta -58 -KPX Psi sigma -58 -KPX Psi phi -58 -KPX Psi alphatonos -58 -KPX Psi theta -19 -KPX Psi omicron -58 -KPX Psi omega -58 -KPX Psi omicrontonos -58 -KPX Psi omegatonos -58 -KPX Omega Upsilon -13 -KPX Omega Upsilondieresis -13 -KPX Upsilondieresis Theta -36 -KPX Upsilondieresis Phi -43 -KPX Upsilondieresis alpha -110 -KPX Upsilondieresis delta -110 -KPX Upsilondieresis sigma -110 -KPX Upsilondieresis phi -110 -KPX Upsilondieresis iotadieresistonos 53 -KPX Upsilondieresis Alpha -134 -KPX Upsilondieresis Delta -116 -KPX Upsilondieresis Lambda -134 -KPX Upsilondieresis Omicron -36 -KPX Upsilondieresis Omega -26 -KPX Upsilondieresis alphatonos -110 -KPX Upsilondieresis etatonos -43 -KPX Upsilondieresis iotatonos -37 -KPX Upsilondieresis eta -43 -KPX Upsilondieresis iota -43 -KPX Upsilondieresis kappa -43 -KPX Upsilondieresis mu -97 -KPX Upsilondieresis omicron -110 -KPX Upsilondieresis omicrontonos -110 -KPX zeta alpha -34 -KPX zeta delta -34 -KPX zeta sigma -34 -KPX zeta tau -68 -KPX zeta phi -34 -KPX zeta alphatonos -34 -KPX zeta etatonos -29 -KPX zeta gamma -58 -KPX zeta eta -29 -KPX zeta theta -34 -KPX zeta iota -24 -KPX zeta kappa -24 -KPX zeta nu -58 -KPX zeta omicron -34 -KPX zeta omega -34 -KPX zeta omicrontonos -34 -KPX zeta omegatonos -34 -KPX kappa alpha -29 -KPX kappa delta -29 -KPX kappa sigma -29 -KPX kappa phi -29 -KPX kappa alphatonos -29 -KPX kappa theta -14 -KPX kappa omicron -29 -KPX kappa sigma1 -29 -KPX kappa omega -29 -KPX kappa omicrontonos -29 -KPX kappa omegatonos -29 -KPX lambda upsilondieresistonos -14 -KPX lambda upsilon -14 -KPX lambda upsilondieresis -14 -KPX lambda upsilontonos -14 -KPX xi alpha -43 -KPX xi delta -43 -KPX xi sigma -43 -KPX xi phi -43 -KPX xi alphatonos -43 -KPX xi etatonos -22 -KPX xi zeta -19 -KPX xi eta -22 -KPX xi omicron -43 -KPX xi omicrontonos -43 -KPX omicron chi -12 -KPX chi alpha -29 -KPX chi delta -29 -KPX chi sigma -29 -KPX chi phi -29 -KPX chi alphatonos -29 -KPX chi xi -30 -KPX chi omicron -29 -KPX chi sigma1 -29 -KPX chi omega -29 -KPX chi omicrontonos -29 -KPX chi omegatonos -29 -KPX omega chi -12 -KPX omicrontonos chi -12 -KPX omegatonos chi -12 -KPX afii10052 comma -138 -KPX afii10052 period -138 -KPX afii10052 guillemotleft -63 -KPX afii10052 guillemotright -25 -KPX afii10052 emdash -25 -KPX afii10058 quoteright -50 -KPX afii10059 quoteright -50 -KPX afii10017 quoteright -88 -KPX afii10017 afii10025 -25 -KPX afii10017 afii10032 -50 -KPX afii10017 afii10033 -25 -KPX afii10017 afii10035 -50 -KPX afii10017 afii10036 -88 -KPX afii10017 afii10037 -88 -KPX afii10017 afii10038 -63 -KPX afii10017 afii10041 -152 -KPX afii10017 afii10047 -25 -KPX afii10017 afii10065 -13 -KPX afii10017 afii10066 -51 -KPX afii10017 afii10070 -25 -KPX afii10017 afii10080 -51 -KPX afii10017 afii10083 -25 -KPX afii10017 afii10084 -50 -KPX afii10017 afii10085 -50 -KPX afii10017 afii10086 -38 -KPX afii10018 afii10017 -13 -KPX afii10018 afii10021 -38 -KPX afii10018 afii10024 -25 -KPX afii10018 afii10029 -25 -KPX afii10018 afii10032 -7 -KPX afii10018 afii10035 -7 -KPX afii10018 afii10036 -13 -KPX afii10018 afii10037 -35 -KPX afii10018 afii10038 -15 -KPX afii10018 afii10039 -25 -KPX afii10018 afii10041 -50 -KPX afii10018 afii10044 -38 -KPX afii10018 afii10049 -33 -KPX afii10018 afii10069 -25 -KPX afii10018 afii10077 -13 -KPX afii10018 afii10085 -25 -KPX afii10019 afii10017 -63 -KPX afii10019 afii10021 -38 -KPX afii10019 afii10024 -25 -KPX afii10019 afii10029 -38 -KPX afii10019 afii10036 -13 -KPX afii10019 afii10037 -81 -KPX afii10019 afii10039 -25 -KPX afii10019 afii10041 -50 -KPX afii10019 afii10044 -53 -KPX afii10019 afii10049 -50 -KPX afii10019 afii10069 -25 -KPX afii10019 afii10085 -13 -KPX afii10019 afii10087 -13 -KPX afii10019 afii10089 -25 -KPX afii10020 comma -113 -KPX afii10020 period -113 -KPX afii10020 guillemotleft -63 -KPX afii10020 guillemotright -25 -KPX afii10020 emdash -25 -KPX afii10020 afii10017 -109 -KPX afii10020 afii10021 -88 -KPX afii10020 afii10025 25 -KPX afii10020 afii10029 -151 -KPX afii10020 afii10030 -13 -KPX afii10020 afii10032 -25 -KPX afii10020 afii10035 -13 -KPX afii10020 afii10049 -75 -KPX afii10020 afii10065 -88 -KPX afii10020 afii10067 -38 -KPX afii10020 afii10069 -75 -KPX afii10020 afii10070 -76 -KPX afii10020 afii10074 -38 -KPX afii10020 afii10077 -113 -KPX afii10020 afii10078 -38 -KPX afii10020 afii10079 -38 -KPX afii10020 afii10080 -88 -KPX afii10020 afii10082 -63 -KPX afii10020 afii10085 -38 -KPX afii10020 afii10093 -63 -KPX afii10020 afii10094 -63 -KPX afii10020 afii10096 -50 -KPX afii10020 afii10097 -75 -KPX afii10021 afii10025 25 -KPX afii10021 afii10037 12 -KPX afii10021 afii10038 -13 -KPX afii10021 afii10047 25 -KPX afii10021 afii10070 12 -KPX afii10021 afii10073 25 -KPX afii10022 afii10025 12 -KPX afii10022 afii10029 -13 -KPX afii10024 afii10025 -25 -KPX afii10024 afii10032 -25 -KPX afii10024 afii10035 -25 -KPX afii10024 afii10036 -17 -KPX afii10024 afii10037 -14 -KPX afii10024 afii10044 -10 -KPX afii10024 afii10065 -25 -KPX afii10024 afii10066 -50 -KPX afii10024 afii10070 -51 -KPX afii10024 afii10080 -75 -KPX afii10024 afii10085 -76 -KPX afii10025 afii10021 -61 -KPX afii10025 afii10024 -13 -KPX afii10025 afii10029 -44 -KPX afii10025 afii10037 -25 -KPX afii10025 afii10041 -38 -KPX afii10025 afii10049 -38 -KPX afii10025 afii10069 -25 -KPX afii10025 afii10077 -13 -KPX afii10028 afii10032 -25 -KPX afii10028 afii10035 -25 -KPX afii10028 afii10037 -20 -KPX afii10028 afii10038 -74 -KPX afii10028 afii10041 -13 -KPX afii10028 afii10047 12 -KPX afii10028 afii10065 -13 -KPX afii10028 afii10070 -38 -KPX afii10028 afii10073 -13 -KPX afii10028 afii10080 -50 -KPX afii10028 afii10083 -25 -KPX afii10028 afii10084 -25 -KPX afii10028 afii10085 -25 -KPX afii10028 afii10095 -13 -KPX afii10029 afii10038 -13 -KPX afii10029 afii10066 -13 -KPX afii10029 afii10070 -7 -KPX afii10029 afii10080 -25 -KPX afii10029 afii10085 -25 -KPX afii10030 afii10038 -13 -KPX afii10030 afii10070 -13 -KPX afii10030 afii10080 -13 -KPX afii10030 afii10085 -13 -KPX afii10030 afii10089 -38 -KPX afii10030 afii10095 12 -KPX afii10032 afii10017 -50 -KPX afii10032 afii10021 -50 -KPX afii10032 afii10024 -25 -KPX afii10032 afii10029 -50 -KPX afii10032 afii10035 12 -KPX afii10032 afii10037 -56 -KPX afii10032 afii10038 12 -KPX afii10032 afii10039 -78 -KPX afii10032 afii10041 -25 -KPX afii10032 afii10049 -50 -KPX afii10032 afii10069 -13 -KPX afii10032 afii10072 12 -KPX afii10034 comma -125 -KPX afii10034 period -125 -KPX afii10034 colon 37 -KPX afii10034 semicolon 37 -KPX afii10034 guillemotright 25 -KPX afii10034 afii10017 -128 -KPX afii10034 afii10021 -107 -KPX afii10034 afii10024 -35 -KPX afii10034 afii10025 12 -KPX afii10034 afii10029 -150 -KPX afii10034 afii10030 -19 -KPX afii10034 afii10032 -6 -KPX afii10034 afii10035 12 -KPX afii10034 afii10036 12 -KPX afii10034 afii10037 -25 -KPX afii10034 afii10038 -17 -KPX afii10034 afii10039 -53 -KPX afii10034 afii10049 -50 -KPX afii10034 afii10069 -38 -KPX afii10034 afii10070 -13 -KPX afii10034 afii10080 -25 -KPX afii10034 afii10095 25 -KPX afii10034 afii10097 -26 -KPX afii10035 afii10017 -50 -KPX afii10035 afii10021 -50 -KPX afii10035 afii10029 -25 -KPX afii10035 afii10037 -13 -KPX afii10035 afii10039 -26 -KPX afii10035 afii10041 -25 -KPX afii10035 afii10044 -13 -KPX afii10035 afii10066 12 -KPX afii10035 afii10070 12 -KPX afii10035 afii10083 12 -KPX afii10035 afii10084 -13 -KPX afii10035 afii10085 -25 -KPX afii10035 afii10089 -13 -KPX afii10035 afii10095 12 -KPX afii10036 comma -100 -KPX afii10036 period -100 -KPX afii10036 guillemotleft -50 -KPX afii10036 guillemotright -26 -KPX afii10036 afii10017 -50 -KPX afii10036 afii10021 -63 -KPX afii10036 afii10029 -50 -KPX afii10036 afii10030 -13 -KPX afii10036 afii10032 -13 -KPX afii10036 afii10038 -22 -KPX afii10036 afii10049 -38 -KPX afii10036 afii10065 -25 -KPX afii10036 afii10067 -50 -KPX afii10036 afii10070 -38 -KPX afii10036 afii10074 -25 -KPX afii10036 afii10076 -25 -KPX afii10036 afii10077 -50 -KPX afii10036 afii10078 -25 -KPX afii10036 afii10080 -45 -KPX afii10036 afii10081 -38 -KPX afii10036 afii10082 -38 -KPX afii10036 afii10083 -38 -KPX afii10036 afii10085 -50 -KPX afii10036 afii10087 -50 -KPX afii10036 afii10091 -38 -KPX afii10036 afii10093 -50 -KPX afii10036 afii10094 -63 -KPX afii10036 afii10096 -50 -KPX afii10036 afii10097 -38 -KPX afii10037 comma -163 -KPX afii10037 period -163 -KPX afii10037 colon -38 -KPX afii10037 semicolon -38 -KPX afii10037 guillemotleft -88 -KPX afii10037 guillemotright -63 -KPX afii10037 emdash -25 -KPX afii10037 afii10017 -191 -KPX afii10037 afii10021 -101 -KPX afii10037 afii10025 -13 -KPX afii10037 afii10029 -132 -KPX afii10037 afii10032 -50 -KPX afii10037 afii10038 -74 -KPX afii10037 afii10047 -13 -KPX afii10037 afii10049 -88 -KPX afii10037 afii10066 -38 -KPX afii10037 afii10067 -82 -KPX afii10037 afii10068 -82 -KPX afii10037 afii10069 -96 -KPX afii10037 afii10070 -108 -KPX afii10037 afii10072 -63 -KPX afii10037 afii10073 -82 -KPX afii10037 afii10074 -82 -KPX afii10037 afii10075 -38 -KPX afii10037 afii10076 -82 -KPX afii10037 afii10077 -113 -KPX afii10037 afii10078 -82 -KPX afii10037 afii10079 -82 -KPX afii10037 afii10080 -108 -KPX afii10037 afii10081 -82 -KPX afii10037 afii10082 -82 -KPX afii10037 afii10083 -108 -KPX afii10037 afii10087 -82 -KPX afii10037 afii10088 -82 -KPX afii10037 afii10090 -82 -KPX afii10037 afii10091 -82 -KPX afii10037 afii10096 -82 -KPX afii10037 afii10097 -96 -KPX afii10038 afii10017 -63 -KPX afii10038 afii10021 -88 -KPX afii10038 afii10029 -75 -KPX afii10038 afii10032 12 -KPX afii10038 afii10036 -25 -KPX afii10038 afii10037 -76 -KPX afii10038 afii10041 -63 -KPX afii10038 afii10049 -50 -KPX afii10038 afii10077 -50 -KPX afii10039 afii10025 -25 -KPX afii10039 afii10032 -51 -KPX afii10039 afii10035 -38 -KPX afii10039 afii10038 -70 -KPX afii10039 afii10047 -13 -KPX afii10039 afii10080 -31 -KPX afii10039 afii10085 -38 -KPX afii10040 afii10032 -13 -KPX afii10043 afii10085 12 -KPX afii10044 quoteright -63 -KPX afii10044 afii10049 -60 -KPX afii10046 quoteright -63 -KPX afii10046 afii10017 -43 -KPX afii10046 afii10021 -73 -KPX afii10046 afii10024 -63 -KPX afii10046 afii10025 -38 -KPX afii10046 afii10029 -40 -KPX afii10046 afii10030 -40 -KPX afii10046 afii10032 -25 -KPX afii10046 afii10035 -25 -KPX afii10046 afii10036 -75 -KPX afii10046 afii10039 -72 -KPX afii10046 afii10041 -112 -KPX afii10046 afii10047 -13 -KPX afii10046 afii10049 -53 -KPX afii10047 afii10021 -84 -KPX afii10047 afii10024 -25 -KPX afii10047 afii10025 12 -KPX afii10047 afii10029 -63 -KPX afii10047 afii10032 12 -KPX afii10047 afii10038 5 -KPX afii10047 afii10039 -51 -KPX afii10047 afii10049 -73 -KPX afii10047 afii10069 -25 -KPX afii10047 afii10077 -13 -KPX afii10048 afii10017 -38 -KPX afii10048 afii10021 -75 -KPX afii10048 afii10024 -70 -KPX afii10048 afii10029 -50 -KPX afii10048 afii10032 12 -KPX afii10048 afii10036 -25 -KPX afii10048 afii10039 -91 -KPX afii10048 afii10041 -38 -KPX afii10048 afii10069 -25 -KPX afii10048 afii10072 12 -KPX afii10048 afii10077 -13 -KPX afii10065 afii10077 9 -KPX afii10065 afii10081 -13 -KPX afii10065 afii10084 -26 -KPX afii10065 afii10085 -51 -KPX afii10065 afii10089 -40 -KPX afii10066 afii10069 -25 -KPX afii10066 afii10070 -13 -KPX afii10066 afii10072 -25 -KPX afii10066 afii10077 -25 -KPX afii10066 afii10078 -20 -KPX afii10066 afii10080 -13 -KPX afii10066 afii10085 -38 -KPX afii10066 afii10087 -38 -KPX afii10066 afii10089 -38 -KPX afii10066 afii10092 -25 -KPX afii10066 afii10097 -25 -KPX afii10067 afii10066 -13 -KPX afii10067 afii10069 -25 -KPX afii10067 afii10072 -29 -KPX afii10067 afii10077 -13 -KPX afii10067 afii10078 -17 -KPX afii10067 afii10080 -7 -KPX afii10067 afii10083 12 -KPX afii10067 afii10084 -25 -KPX afii10067 afii10085 -34 -KPX afii10067 afii10086 -6 -KPX afii10067 afii10089 -38 -KPX afii10067 afii10092 -25 -KPX afii10067 afii10097 -13 -KPX afii10068 comma -113 -KPX afii10068 period -113 -KPX afii10068 afii10069 -50 -KPX afii10068 afii10070 -13 -KPX afii10068 afii10077 -51 -KPX afii10068 afii10078 -13 -KPX afii10068 afii10080 -25 -KPX afii10068 afii10097 -25 -KPX afii10069 afii10073 12 -KPX afii10069 afii10095 25 -KPX afii10070 afii10069 -13 -KPX afii10070 afii10083 12 -KPX afii10070 afii10085 -25 -KPX afii10070 afii10086 12 -KPX afii10070 afii10087 -20 -KPX afii10070 afii10089 -25 -KPX afii10072 afii10066 -13 -KPX afii10072 afii10070 -13 -KPX afii10072 afii10073 12 -KPX afii10072 afii10080 -25 -KPX afii10072 afii10083 -18 -KPX afii10072 afii10089 -25 -KPX afii10072 afii10092 -13 -KPX afii10073 afii10069 -18 -KPX afii10073 afii10072 -18 -KPX afii10073 afii10073 12 -KPX afii10073 afii10078 -14 -KPX afii10073 afii10080 -6 -KPX afii10073 afii10085 -21 -KPX afii10073 afii10086 -7 -KPX afii10073 afii10089 -20 -KPX afii10073 afii10092 -17 -KPX afii10076 guillemotleft -26 -KPX afii10076 afii10065 -15 -KPX afii10076 afii10066 -25 -KPX afii10076 afii10070 -25 -KPX afii10076 afii10073 -13 -KPX afii10076 afii10080 -13 -KPX afii10076 afii10083 -25 -KPX afii10076 afii10085 -14 -KPX afii10076 afii10086 -25 -KPX afii10076 afii10089 -39 -KPX afii10076 afii10095 -13 -KPX afii10078 afii10065 -7 -KPX afii10078 afii10080 -13 -KPX afii10078 afii10095 12 -KPX afii10080 afii10067 -25 -KPX afii10080 afii10069 -29 -KPX afii10080 afii10072 -25 -KPX afii10080 afii10077 -13 -KPX afii10080 afii10078 -19 -KPX afii10080 afii10084 -13 -KPX afii10080 afii10085 -38 -KPX afii10080 afii10087 -25 -KPX afii10080 afii10089 -26 -KPX afii10080 afii10095 12 -KPX afii10080 afii10097 -19 -KPX afii10082 afii10069 -13 -KPX afii10082 afii10073 12 -KPX afii10082 afii10077 -25 -KPX afii10082 afii10078 -15 -KPX afii10082 afii10084 -13 -KPX afii10082 afii10085 -13 -KPX afii10082 afii10089 -25 -KPX afii10083 afii10065 12 -KPX afii10083 afii10066 12 -KPX afii10083 afii10070 12 -KPX afii10083 afii10073 25 -KPX afii10083 afii10085 -13 -KPX afii10083 afii10086 -13 -KPX afii10083 afii10087 -13 -KPX afii10083 afii10089 -20 -KPX afii10083 afii10095 12 -KPX afii10084 comma -75 -KPX afii10084 period -75 -KPX afii10084 afii10065 12 -KPX afii10084 afii10069 -13 -KPX afii10084 afii10072 12 -KPX afii10084 afii10073 12 -KPX afii10084 afii10077 -25 -KPX afii10084 afii10080 -13 -KPX afii10084 afii10082 12 -KPX afii10084 afii10083 12 -KPX afii10084 afii10085 -13 -KPX afii10084 afii10095 25 -KPX afii10084 afii10097 -13 -KPX afii10085 comma -100 -KPX afii10085 period -100 -KPX afii10085 colon -13 -KPX afii10085 semicolon -13 -KPX afii10085 guillemotright 25 -KPX afii10085 afii10065 -13 -KPX afii10085 afii10066 -13 -KPX afii10085 afii10069 -63 -KPX afii10085 afii10070 -31 -KPX afii10085 afii10072 -13 -KPX afii10085 afii10077 -25 -KPX afii10085 afii10078 -13 -KPX afii10085 afii10080 -25 -KPX afii10085 afii10083 -31 -KPX afii10085 afii10086 -25 -KPX afii10085 afii10097 -25 -KPX afii10086 afii10069 -25 -KPX afii10086 afii10077 -25 -KPX afii10086 afii10085 -25 -KPX afii10086 afii10089 -27 -KPX afii10086 afii10097 -13 -KPX afii10087 afii10065 -13 -KPX afii10087 afii10066 -38 -KPX afii10087 afii10070 -25 -KPX afii10087 afii10073 -13 -KPX afii10087 afii10080 -38 -KPX afii10087 afii10083 -29 -KPX afii10087 afii10084 -25 -KPX afii10087 afii10085 -38 -KPX afii10087 afii10086 -38 -KPX afii10087 afii10089 -50 -KPX afii10087 afii10092 -38 -KPX afii10087 afii10095 -13 -KPX afii10088 afii10073 12 -KPX afii10094 afii10084 -38 -KPX afii10094 afii10089 -76 -KPX afii10095 afii10069 -52 -KPX afii10095 afii10072 -56 -KPX afii10095 afii10077 -18 -KPX afii10095 afii10078 -9 -KPX afii10095 afii10086 -6 -KPX afii10095 afii10087 -39 -KPX afii10095 afii10097 -13 -KPX afii10096 afii10069 -57 -KPX afii10096 afii10072 -25 -KPX afii10096 afii10077 -25 -KPX afii10096 afii10078 -13 -KPX afii10096 afii10080 12 -KPX afii10096 afii10084 -13 -KPX afii10096 afii10086 -6 -KPX afii10096 afii10087 -39 -KPX afii10096 afii10089 -38 -KPX afii10110 comma -100 -KPX afii10110 period -100 -KPX afii10110 guillemotright 12 -KPX afii10050 comma -99 -KPX afii10050 period -99 -KPX afii10050 colon -25 -KPX afii10050 semicolon -25 -KPX afii10050 guillemotleft -88 -KPX afii10050 guillemotright -38 -KPX afii10050 emdash -25 -EndKernPairs -EndKernData -EndFontMetrics +StartFontMetrics 4.1 +FontName TimesNewRomanPS-BoldMT +FullName Times New Roman Bold +Notice Typeface The Monotype Corporation plc. Data The Monotype Corporation plc/Type Solutions Inc. 1990-1992. All Rights Reserved +EncodingScheme FontSpecific +FamilyName Times New Roman +Weight Bold +Version Version 3.00 +Characters 1674 +ItalicAngle 0.0 +Ascender 891 +Descender -216 +UnderlineThickness 95 +UnderlinePosition -109 +IsFixedPitch false +FontBBox -556 -307 2000 1026 +StartCharMetrics 1709 +C 0 ; WX 778 ; N .notdef ; B 139 0 639 625 ; +C 1 ; WX 778 ; N .notdef ; B 139 0 639 625 ; +C 2 ; WX 778 ; N .notdef ; B 139 0 639 625 ; +C 3 ; WX 778 ; N .notdef ; B 139 0 639 625 ; +C 4 ; WX 778 ; N .notdef ; B 139 0 639 625 ; +C 5 ; WX 778 ; N .notdef ; B 139 0 639 625 ; +C 6 ; WX 778 ; N .notdef ; B 139 0 639 625 ; +C 7 ; WX 778 ; N .notdef ; B 139 0 639 625 ; +C 8 ; WX 778 ; N .notdef ; B 139 0 639 625 ; +C 9 ; WX 778 ; N .notdef ; B 139 0 639 625 ; +C 10 ; WX 778 ; N .notdef ; B 139 0 639 625 ; +C 11 ; WX 778 ; N .notdef ; B 139 0 639 625 ; +C 12 ; WX 778 ; N .notdef ; B 139 0 639 625 ; +C 13 ; WX 778 ; N .notdef ; B 139 0 639 625 ; +C 14 ; WX 778 ; N .notdef ; B 139 0 639 625 ; +C 15 ; WX 778 ; N .notdef ; B 139 0 639 625 ; +C 16 ; WX 778 ; N .notdef ; B 139 0 639 625 ; +C 17 ; WX 778 ; N .notdef ; B 139 0 639 625 ; +C 18 ; WX 778 ; N .notdef ; B 139 0 639 625 ; +C 19 ; WX 778 ; N .notdef ; B 139 0 639 625 ; +C 20 ; WX 778 ; N .notdef ; B 139 0 639 625 ; +C 21 ; WX 778 ; N .notdef ; B 139 0 639 625 ; +C 22 ; WX 778 ; N .notdef ; B 139 0 639 625 ; +C 23 ; WX 778 ; N .notdef ; B 139 0 639 625 ; +C 24 ; WX 778 ; N .notdef ; B 139 0 639 625 ; +C 25 ; WX 778 ; N .notdef ; B 139 0 639 625 ; +C 26 ; WX 778 ; N .notdef ; B 139 0 639 625 ; +C 27 ; WX 778 ; N .notdef ; B 139 0 639 625 ; +C 28 ; WX 778 ; N .notdef ; B 139 0 639 625 ; +C 29 ; WX 778 ; N .notdef ; B 139 0 639 625 ; +C 30 ; WX 778 ; N .notdef ; B 139 0 639 625 ; +C 31 ; WX 778 ; N .notdef ; B 139 0 639 625 ; +C 32 ; WX 250 ; N space ; B 85 -13 248 677 ; +C 33 ; WX 333 ; N exclam ; B 85 -13 248 677 ; +C 34 ; WX 555 ; N quotedbl ; B 86 352 466 677 ; +C 35 ; WX 500 ; N numbersign ; B 20 -14 480 676 ; +C 36 ; WX 500 ; N dollar ; B 39 -67 468 680 ; +C 37 ; WX 1000 ; N percent ; B 69 -28 931 677 ; +C 38 ; WX 833 ; N ampersand ; B 40 -15 790 677 ; +C 39 ; WX 278 ; N quotesingle ; B 68 353 212 677 ; +C 40 ; WX 333 ; N parenleft ; B 40 -200 321 677 ; +C 41 ; WX 333 ; N parenright ; B 12 -200 293 677 ; +C 42 ; WX 500 ; N asterisk ; B 56 299 444 677 ; +C 43 ; WX 570 ; N plus ; B 20 66 553 598 ; +C 44 ; WX 250 ; N comma ; B 32 -175 217 150 ; +C 45 ; WX 333 ; N hyphen ; B 24 179 309 280 ; +C 46 ; WX 250 ; N period ; B 44 -12 207 150 ; +C 47 ; WX 278 ; N slash ; B 1 -15 281 677 ; +C 48 ; WX 500 ; N zero ; B 36 -14 463 676 ; +C 49 ; WX 500 ; N one ; B 66 0 423 676 ; +C 50 ; WX 500 ; N two ; B 24 0 451 676 ; +C 51 ; WX 500 ; N three ; B 16 -14 442 676 ; +C 52 ; WX 500 ; N four ; B 25 0 459 676 ; +C 53 ; WX 500 ; N five ; B 34 -14 462 662 ; +C 54 ; WX 500 ; N six ; B 37 -14 470 676 ; +C 55 ; WX 500 ; N seven ; B 34 -14 476 662 ; +C 56 ; WX 500 ; N eight ; B 35 -14 465 673 ; +C 57 ; WX 500 ; N nine ; B 31 -14 464 676 ; +C 58 ; WX 333 ; N colon ; B 85 -12 248 470 ; +C 59 ; WX 333 ; N semicolon ; B 74 -175 259 470 ; +C 60 ; WX 570 ; N less ; B 20 90 553 568 ; +C 61 ; WX 570 ; N equal ; B 20 218 554 441 ; +C 62 ; WX 570 ; N greater ; B 20 90 553 568 ; +C 63 ; WX 500 ; N question ; B 61 -13 444 677 ; +C 64 ; WX 930 ; N at ; B 45 -216 908 677 ; +C 65 ; WX 722 ; N A ; B 8 0 711 676 ; +C 66 ; WX 667 ; N B ; B 21 0 632 662 ; +C 67 ; WX 722 ; N C ; B 40 -15 667 677 ; +C 68 ; WX 722 ; N D ; B 13 0 680 662 ; +C 69 ; WX 667 ; N E ; B 20 0 622 662 ; +C 70 ; WX 611 ; N F ; B 22 0 581 662 ; +C 71 ; WX 778 ; N G ; B 41 -16 768 678 ; +C 72 ; WX 778 ; N H ; B 21 0 760 662 ; +C 73 ; WX 389 ; N I ; B 20 0 366 662 ; +C 74 ; WX 500 ; N J ; B 11 -15 494 662 ; +C 75 ; WX 778 ; N K ; B 22 0 789 662 ; +C 76 ; WX 667 ; N L ; B 19 0 631 662 ; +C 77 ; WX 944 ; N M ; B 20 0 926 662 ; +C 78 ; WX 722 ; N N ; B 14 -15 699 662 ; +C 79 ; WX 778 ; N O ; B 39 -15 742 677 ; +C 80 ; WX 611 ; N P ; B 25 0 581 662 ; +C 81 ; WX 778 ; N Q ; B 39 -181 743 677 ; +C 82 ; WX 722 ; N R ; B 19 0 731 662 ; +C 83 ; WX 556 ; N S ; B 52 -16 516 677 ; +C 84 ; WX 667 ; N T ; B 36 0 631 662 ; +C 85 ; WX 722 ; N U ; B 23 -16 705 662 ; +C 86 ; WX 722 ; N V ; B 8 -15 712 662 ; +C 87 ; WX 1000 ; N W ; B 9 -15 991 662 ; +C 88 ; WX 722 ; N X ; B 7 0 715 662 ; +C 89 ; WX 722 ; N Y ; B 9 0 711 662 ; +C 90 ; WX 667 ; N Z ; B 16 0 649 662 ; +C 91 ; WX 333 ; N bracketleft ; B 104 -183 301 662 ; +C 92 ; WX 278 ; N backslash ; B 1 -15 281 677 ; +C 93 ; WX 333 ; N bracketright ; B 33 -183 229 662 ; +C 94 ; WX 581 ; N asciicircum ; B 72 325 510 676 ; +C 95 ; WX 500 ; N underscore ; B -9 -216 509 -152 ; +C 96 ; WX 333 ; N grave ; B 19 515 222 685 ; +C 97 ; WX 500 ; N a ; B 45 -6 483 470 ; +C 98 ; WX 556 ; N b ; B 21 -14 513 662 ; +C 99 ; WX 444 ; N c ; B 38 -14 421 470 ; +C 100 ; WX 556 ; N d ; B 39 -14 534 662 ; +C 101 ; WX 444 ; N e ; B 39 -14 420 470 ; +C 102 ; WX 333 ; N f ; B 32 0 407 677 ; +C 103 ; WX 500 ; N g ; B 38 -216 482 470 ; +C 104 ; WX 556 ; N h ; B 34 0 527 662 ; +C 105 ; WX 278 ; N i ; B 21 0 267 678 ; +C 106 ; WX 333 ; N j ; B -28 -216 249 677 ; +C 107 ; WX 556 ; N k ; B 33 0 565 662 ; +C 108 ; WX 278 ; N l ; B 21 0 268 662 ; +C 109 ; WX 833 ; N m ; B 37 0 807 470 ; +C 110 ; WX 556 ; N n ; B 34 0 527 470 ; +C 111 ; WX 500 ; N o ; B 36 -14 464 470 ; +C 112 ; WX 556 ; N p ; B 19 -214 513 470 ; +C 113 ; WX 556 ; N q ; B 38 -214 536 470 ; +C 114 ; WX 444 ; N r ; B 37 0 429 470 ; +C 115 ; WX 389 ; N s ; B 40 -14 354 470 ; +C 116 ; WX 333 ; N t ; B 19 -6 323 624 ; +C 117 ; WX 556 ; N u ; B 31 -14 524 457 ; +C 118 ; WX 500 ; N v ; B 9 -14 491 457 ; +C 119 ; WX 722 ; N w ; B 8 -14 712 457 ; +C 120 ; WX 500 ; N x ; B 23 0 484 457 ; +C 121 ; WX 500 ; N y ; B 8 -216 491 457 ; +C 122 ; WX 444 ; N z ; B 10 0 428 457 ; +C 123 ; WX 394 ; N braceleft ; B 81 -203 352 677 ; +C 124 ; WX 220 ; N bar ; B 78 -216 141 677 ; +C 125 ; WX 394 ; N braceright ; B 44 -202 315 678 ; +C 126 ; WX 520 ; N asciitilde ; B 19 188 551 347 ; +C 127 ; WX 778 ; N .notdef ; B 139 0 639 625 ; +C 128 ; WX 500 ; N Euro ; B -11 -14 484 676 ; +C 129 ; WX 636 ; N afii10052 ; B 20 0 604 888 ; +C 130 ; WX 333 ; N quotesinglbase ; B 74 -175 259 150 ; +C 131 ; WX 500 ; N florin ; B 0 -216 500 678 ; +C 132 ; WX 500 ; N quotedblbase ; B 41 -175 460 151 ; +C 133 ; WX 1000 ; N ellipsis ; B 85 -13 915 150 ; +C 134 ; WX 500 ; N dagger ; B 48 -196 451 662 ; +C 135 ; WX 500 ; N daggerdbl ; B 54 -198 446 662 ; +C 136 ; WX 333 ; N circumflex ; B 10 510 324 697 ; +C 137 ; WX 1000 ; N perthousand ; B 29 -28 971 677 ; +C 138 ; WX 556 ; N Scaron ; B 52 -16 516 891 ; +C 139 ; WX 333 ; N guilsinglleft ; B 45 3 287 452 ; +C 140 ; WX 1000 ; N OE ; B 36 -9 952 671 ; +C 141 ; WX 725 ; N afii10061 ; B 21 0 709 888 ; +C 142 ; WX 667 ; N Zcaron ; B 16 0 649 891 ; +C 143 ; WX 778 ; N afii10145 ; B 20 -193 750 662 ; +C 144 ; WX 500 ; N quotedblbase ; B 41 -175 460 151 ; +C 145 ; WX 333 ; N quoteleft ; B 74 352 259 677 ; +C 146 ; WX 333 ; N quoteright ; B 74 352 259 677 ; +C 147 ; WX 500 ; N quotedblleft ; B 40 351 459 677 ; +C 148 ; WX 500 ; N quotedblright ; B 41 351 460 677 ; +C 149 ; WX 350 ; N bullet ; B 38 190 316 470 ; +C 150 ; WX 500 ; N endash ; B -8 202 508 261 ; +C 151 ; WX 1000 ; N emdash ; B -10 201 1009 261 ; +C 152 ; WX 333 ; N tilde ; B 10 532 326 669 ; +C 153 ; WX 1000 ; N trademark ; B -1 268 1005 662 ; +C 154 ; WX 389 ; N scaron ; B 34 -14 354 697 ; +C 155 ; WX 333 ; N guilsinglright ; B 46 3 288 452 ; +C 156 ; WX 722 ; N oe ; B 34 -14 694 470 ; +C 157 ; WX 576 ; N afii10109 ; B 35 0 563 685 ; +C 158 ; WX 444 ; N zcaron ; B 10 0 428 697 ; +C 159 ; WX 722 ; N Ydieresis ; B 9 0 711 857 ; +C 160 ; WX 250 ; N space ; B 85 -13 248 677 ; +C 161 ; WX 333 ; N exclamdown ; B 85 -216 248 475 ; +C 162 ; WX 500 ; N cent ; B 63 -184 445 658 ; +C 163 ; WX 500 ; N sterling ; B 17 -14 479 680 ; +C 164 ; WX 500 ; N currency ; B 10 93 491 567 ; +C 165 ; WX 500 ; N yen ; B 0 0 499 662 ; +C 166 ; WX 220 ; N brokenbar ; B 78 -216 141 677 ; +C 167 ; WX 500 ; N section ; B 45 -216 455 677 ; +C 168 ; WX 333 ; N dieresis ; B 11 538 323 668 ; +C 169 ; WX 747 ; N copyright ; B 29 -15 722 677 ; +C 170 ; WX 300 ; N ordfeminine ; B 22 390 308 676 ; +C 171 ; WX 500 ; N guillemotleft ; B 18 4 482 453 ; +C 172 ; WX 570 ; N logicalnot ; B 20 218 554 440 ; +C 173 ; WX 333 ; N hyphen ; B 24 179 309 280 ; +C 174 ; WX 747 ; N registered ; B 29 -15 722 677 ; +C 175 ; WX 500 ; N overscore ; B -9 714 509 778 ; +C 176 ; WX 400 ; N degree ; B 29 338 367 676 ; +C 177 ; WX 549 ; N plusminus ; B 7 66 542 598 ; +C 178 ; WX 300 ; N twosuperior ; B 12 324 276 676 ; +C 179 ; WX 300 ; N threesuperior ; B 7 317 271 676 ; +C 180 ; WX 333 ; N acute ; B 111 515 315 685 ; +C 181 ; WX 576 ; N mu1 ; B 39 -215 559 457 ; +C 182 ; WX 540 ; N paragraph ; B 0 -216 542 662 ; +C 183 ; WX 250 ; N periodcentered ; B 43 249 207 413 ; +C 184 ; WX 333 ; N cedilla ; B 71 -188 237 6 ; +C 185 ; WX 300 ; N onesuperior ; B 36 324 260 676 ; +C 186 ; WX 330 ; N ordmasculine ; B 27 385 306 676 ; +C 187 ; WX 500 ; N guillemotright ; B 19 4 483 453 ; +C 188 ; WX 750 ; N onequarter ; B 35 -29 730 676 ; +C 189 ; WX 750 ; N onehalf ; B 35 -29 725 676 ; +C 190 ; WX 750 ; N threequarters ; B 6 -29 730 676 ; +C 191 ; WX 500 ; N questiondown ; B 56 -216 439 475 ; +C 192 ; WX 722 ; N Agrave ; B 8 0 711 888 ; +C 193 ; WX 722 ; N Aacute ; B 8 0 711 888 ; +C 194 ; WX 722 ; N Acircumflex ; B 8 0 711 888 ; +C 195 ; WX 722 ; N Atilde ; B 8 0 711 856 ; +C 196 ; WX 722 ; N Adieresis ; B 8 0 711 857 ; +C 197 ; WX 722 ; N Aring ; B 8 0 711 841 ; +C 198 ; WX 1000 ; N AE ; B -11 0 955 662 ; +C 199 ; WX 722 ; N Ccedilla ; B 40 -188 667 677 ; +C 200 ; WX 667 ; N Egrave ; B 20 0 622 888 ; +C 201 ; WX 667 ; N Eacute ; B 20 0 622 888 ; +C 202 ; WX 667 ; N Ecircumflex ; B 20 0 622 888 ; +C 203 ; WX 667 ; N Edieresis ; B 20 0 622 857 ; +C 204 ; WX 389 ; N Igrave ; B 20 0 366 888 ; +C 205 ; WX 389 ; N Iacute ; B 20 0 366 888 ; +C 206 ; WX 389 ; N Icircumflex ; B 20 0 366 888 ; +C 207 ; WX 389 ; N Idieresis ; B 20 0 366 857 ; +C 208 ; WX 722 ; N Eth ; B 17 0 684 662 ; +C 209 ; WX 722 ; N Ntilde ; B 14 -15 699 857 ; +C 210 ; WX 778 ; N Ograve ; B 39 -15 742 888 ; +C 211 ; WX 778 ; N Oacute ; B 39 -15 742 888 ; +C 212 ; WX 778 ; N Ocircumflex ; B 39 -15 742 888 ; +C 213 ; WX 778 ; N Otilde ; B 39 -15 742 857 ; +C 214 ; WX 778 ; N Odieresis ; B 39 -15 742 857 ; +C 215 ; WX 570 ; N multiply ; B 75 120 498 543 ; +C 216 ; WX 778 ; N Oslash ; B 40 -38 742 693 ; +C 217 ; WX 722 ; N Ugrave ; B 23 -16 705 888 ; +C 218 ; WX 722 ; N Uacute ; B 23 -16 705 888 ; +C 219 ; WX 722 ; N Ucircumflex ; B 23 -16 705 888 ; +C 220 ; WX 722 ; N Udieresis ; B 23 -16 705 857 ; +C 221 ; WX 722 ; N Yacute ; B 9 0 711 888 ; +C 222 ; WX 611 ; N Thorn ; B 20 0 577 662 ; +C 223 ; WX 556 ; N germandbls ; B 28 -5 506 677 ; +C 224 ; WX 500 ; N agrave ; B 45 -6 483 685 ; +C 225 ; WX 500 ; N aacute ; B 45 -6 483 685 ; +C 226 ; WX 500 ; N acircumflex ; B 45 -6 483 697 ; +C 227 ; WX 500 ; N atilde ; B 45 -6 483 670 ; +C 228 ; WX 500 ; N adieresis ; B 45 -6 483 668 ; +C 229 ; WX 500 ; N aring ; B 45 -6 483 702 ; +C 230 ; WX 722 ; N ae ; B 44 -14 693 470 ; +C 231 ; WX 444 ; N ccedilla ; B 38 -188 421 470 ; +C 232 ; WX 444 ; N egrave ; B 39 -14 420 685 ; +C 233 ; WX 444 ; N eacute ; B 39 -14 420 685 ; +C 234 ; WX 444 ; N ecircumflex ; B 39 -14 420 697 ; +C 235 ; WX 444 ; N edieresis ; B 39 -14 420 668 ; +C 236 ; WX 278 ; N igrave ; B -7 0 267 685 ; +C 237 ; WX 278 ; N iacute ; B 21 0 289 685 ; +C 238 ; WX 278 ; N icircumflex ; B -17 0 296 697 ; +C 239 ; WX 278 ; N idieresis ; B -15 0 298 668 ; +C 240 ; WX 500 ; N eth ; B 36 -14 464 677 ; +C 241 ; WX 556 ; N ntilde ; B 34 0 527 670 ; +C 242 ; WX 500 ; N ograve ; B 36 -14 464 685 ; +C 243 ; WX 500 ; N oacute ; B 36 -14 464 685 ; +C 244 ; WX 500 ; N ocircumflex ; B 36 -14 464 697 ; +C 245 ; WX 500 ; N otilde ; B 36 -14 464 670 ; +C 246 ; WX 500 ; N odieresis ; B 36 -14 464 668 ; +C 247 ; WX 549 ; N divide ; B 8 121 542 545 ; +C 248 ; WX 500 ; N oslash ; B 33 -14 467 483 ; +C 249 ; WX 556 ; N ugrave ; B 31 -14 524 685 ; +C 250 ; WX 556 ; N uacute ; B 31 -14 524 685 ; +C 251 ; WX 556 ; N ucircumflex ; B 31 -14 524 697 ; +C 252 ; WX 556 ; N udieresis ; B 31 -14 524 668 ; +C 253 ; WX 500 ; N yacute ; B 8 -216 491 685 ; +C 254 ; WX 556 ; N thorn ; B 19 -216 513 677 ; +C 255 ; WX 500 ; N ydieresis ; B 8 -216 491 668 ; +C -1 ; WX 0 ; N .null ; B 85 -13 248 677 ; +C -1 ; WX 250 ; N nonmarkingreturn ; B 85 -13 248 677 ; +C -1 ; WX 549 ; N notequal ; B 7 -143 542 679 ; +C -1 ; WX 713 ; N infinity ; B 26 52 687 461 ; +C -1 ; WX 549 ; N lessequal ; B 7 -90 542 625 ; +C -1 ; WX 549 ; N greaterequal ; B 7 -90 542 625 ; +C -1 ; WX 494 ; N partialdiff ; B 36 -11 472 700 ; +C -1 ; WX 713 ; N summation ; B 21 -216 693 693 ; +C -1 ; WX 823 ; N product ; B 22 -216 801 693 ; +C -1 ; WX 549 ; N pi1 ; B 24 -14 506 457 ; +C -1 ; WX 274 ; N integral ; B -1 -107 272 910 ; +C -1 ; WX 768 ; N Ohm ; B 4 0 766 741 ; +C -1 ; WX 549 ; N radical ; B 42 -38 550 913 ; +C -1 ; WX 549 ; N approxequal ; B 6 119 543 536 ; +C -1 ; WX 612 ; N increment ; B 14 0 600 677 ; +C -1 ; WX 494 ; N lozenge ; B 23 0 472 694 ; +C -1 ; WX 167 ; N fraction ; B -184 -29 351 676 ; +C -1 ; WX 556 ; N fi ; B 29 0 534 677 ; +C -1 ; WX 556 ; N fl ; B 26 0 532 677 ; +C -1 ; WX 278 ; N dotlessi ; B 21 0 267 457 ; +C -1 ; WX 333 ; N macron ; B 10 533 323 612 ; +C -1 ; WX 333 ; N breve ; B 19 521 314 677 ; +C -1 ; WX 333 ; N dotaccent ; B 95 524 239 668 ; +C -1 ; WX 333 ; N ring ; B 64 497 269 702 ; +C -1 ; WX 333 ; N hungarumlaut ; B 55 516 368 685 ; +C -1 ; WX 333 ; N ogonek ; B 50 -226 284 8 ; +C -1 ; WX 333 ; N caron ; B 10 510 324 697 ; +C -1 ; WX 667 ; N Lslash ; B 21 0 630 662 ; +C -1 ; WX 278 ; N lslash ; B 19 0 265 662 ; +C -1 ; WX 570 ; N minus ; B 20 299 553 363 ; +C -1 ; WX 500 ; N franc ; B 10 0 478 662 ; +C -1 ; WX 778 ; N Gbreve ; B 41 -16 768 875 ; +C -1 ; WX 500 ; N gbreve ; B 38 -216 482 677 ; +C -1 ; WX 389 ; N Idot ; B 20 0 366 857 ; +C -1 ; WX 556 ; N Scedilla ; B 52 -188 516 677 ; +C -1 ; WX 389 ; N scedilla ; B 40 -188 354 470 ; +C -1 ; WX 722 ; N Cacute ; B 40 -15 667 888 ; +C -1 ; WX 444 ; N cacute ; B 38 -14 421 685 ; +C -1 ; WX 722 ; N Ccaron ; B 40 -15 667 891 ; +C -1 ; WX 444 ; N ccaron ; B 38 -14 421 697 ; +C -1 ; WX 556 ; N dmacron ; B 39 -14 534 662 ; +C -1 ; WX 333 ; N middot ; B 214 281 343 409 ; +C -1 ; WX 722 ; N Abreve ; B 8 0 711 875 ; +C -1 ; WX 500 ; N abreve ; B 45 -6 483 677 ; +C -1 ; WX 722 ; N Aogonek ; B 8 -226 711 676 ; +C -1 ; WX 500 ; N aogonek ; B 45 -226 499 470 ; +C -1 ; WX 722 ; N Dcaron ; B 13 0 680 891 ; +C -1 ; WX 733 ; N dcaron ; B 41 -14 722 677 ; +C -1 ; WX 722 ; N Dslash ; B 17 0 684 662 ; +C -1 ; WX 667 ; N Eogonek ; B 20 -226 622 662 ; +C -1 ; WX 444 ; N eogonek ; B 39 -226 420 470 ; +C -1 ; WX 667 ; N Ecaron ; B 20 0 622 891 ; +C -1 ; WX 444 ; N ecaron ; B 39 -14 420 697 ; +C -1 ; WX 667 ; N Lacute ; B 19 0 631 888 ; +C -1 ; WX 278 ; N lacute ; B 21 0 280 888 ; +C -1 ; WX 667 ; N Lcaron ; B 19 0 631 677 ; +C -1 ; WX 469 ; N lcaron ; B 21 0 456 677 ; +C -1 ; WX 667 ; N Ldot ; B 19 0 631 662 ; +C -1 ; WX 396 ; N ldot ; B 21 0 406 662 ; +C -1 ; WX 722 ; N Nacute ; B 14 -15 699 888 ; +C -1 ; WX 556 ; N nacute ; B 34 0 527 685 ; +C -1 ; WX 722 ; N Ncaron ; B 14 -15 699 891 ; +C -1 ; WX 556 ; N ncaron ; B 34 0 527 697 ; +C -1 ; WX 778 ; N Odblacute ; B 39 -15 742 888 ; +C -1 ; WX 500 ; N odblacute ; B 36 -14 464 685 ; +C -1 ; WX 722 ; N Racute ; B 19 0 731 888 ; +C -1 ; WX 444 ; N racute ; B 37 0 429 685 ; +C -1 ; WX 722 ; N Rcaron ; B 19 0 731 891 ; +C -1 ; WX 444 ; N rcaron ; B 37 0 429 697 ; +C -1 ; WX 556 ; N Sacute ; B 52 -16 516 888 ; +C -1 ; WX 389 ; N sacute ; B 40 -14 354 685 ; +C -1 ; WX 667 ; N Tcedilla ; B 36 -241 631 662 ; +C -1 ; WX 333 ; N tcedilla ; B 19 -241 323 624 ; +C -1 ; WX 667 ; N Tcaron ; B 36 0 631 891 ; +C -1 ; WX 521 ; N tcaron ; B 18 -6 509 677 ; +C -1 ; WX 722 ; N Uring ; B 23 -16 705 907 ; +C -1 ; WX 556 ; N uring ; B 31 -14 524 702 ; +C -1 ; WX 722 ; N Udblacute ; B 23 -16 705 888 ; +C -1 ; WX 556 ; N udblacute ; B 31 -14 524 685 ; +C -1 ; WX 667 ; N Zacute ; B 16 0 649 888 ; +C -1 ; WX 444 ; N zacute ; B 10 0 428 685 ; +C -1 ; WX 667 ; N Zdot ; B 16 0 649 857 ; +C -1 ; WX 444 ; N zdot ; B 10 0 428 668 ; +C -1 ; WX 636 ; N Gamma ; B 20 0 604 662 ; +C -1 ; WX 778 ; N Theta ; B 38 -15 741 677 ; +C -1 ; WX 829 ; N Phi ; B 38 0 792 662 ; +C -1 ; WX 558 ; N alpha ; B 42 -14 537 470 ; +C -1 ; WX 519 ; N delta ; B 36 -14 478 677 ; +C -1 ; WX 427 ; N epsilon ; B 32 -14 413 470 ; +C -1 ; WX 544 ; N sigma ; B 36 -14 522 457 ; +C -1 ; WX 461 ; N tau ; B 1 -14 439 457 ; +C -1 ; WX 624 ; N phi ; B 39 -214 584 470 ; +C -1 ; WX 500 ; N underscoredbl ; B -9 -216 509 -52 ; +C -1 ; WX 604 ; N exclamdbl ; B 85 -13 518 677 ; +C -1 ; WX 348 ; N nsuperior ; B 21 271 333 555 ; +C -1 ; WX 969 ; N peseta ; B 19 -13 954 662 ; +C -1 ; WX 1000 ; N arrowleft ; B 39 77 961 428 ; +C -1 ; WX 500 ; N arrowup ; B 75 -209 426 654 ; +C -1 ; WX 1000 ; N arrowright ; B 39 77 961 428 ; +C -1 ; WX 500 ; N arrowdown ; B 75 -209 426 654 ; +C -1 ; WX 1000 ; N arrowboth ; B 39 77 961 429 ; +C -1 ; WX 500 ; N arrowupdn ; B 74 -208 425 714 ; +C -1 ; WX 500 ; N arrowupdnbse ; B 74 -303 425 714 ; +C -1 ; WX 979 ; N orthogonal ; B 177 0 802 625 ; +C -1 ; WX 719 ; N intersection ; B 89 0 630 698 ; +C -1 ; WX 570 ; N equivalence ; B 18 138 552 521 ; +C -1 ; WX 600 ; N house ; B 75 0 525 563 ; +C -1 ; WX 570 ; N revlogicalnot ; B 17 218 551 440 ; +C -1 ; WX 604 ; N integraltp ; B 267 -251 477 848 ; +C -1 ; WX 604 ; N integralbt ; B 127 -251 337 848 ; +C -1 ; WX 708 ; N SF100000 ; B -11 261 719 346 ; +C -1 ; WX 708 ; N SF110000 ; B 219 -303 304 910 ; +C -1 ; WX 708 ; N SF010000 ; B 312 -303 720 346 ; +C -1 ; WX 708 ; N SF030000 ; B -11 -303 396 346 ; +C -1 ; WX 708 ; N SF020000 ; B 312 261 720 910 ; +C -1 ; WX 708 ; N SF040000 ; B -11 261 396 910 ; +C -1 ; WX 708 ; N SF080000 ; B 312 -303 720 910 ; +C -1 ; WX 708 ; N SF090000 ; B -11 -303 396 910 ; +C -1 ; WX 708 ; N SF060000 ; B -11 -303 719 346 ; +C -1 ; WX 708 ; N SF070000 ; B -11 261 719 910 ; +C -1 ; WX 708 ; N SF050000 ; B -11 -303 719 910 ; +C -1 ; WX 708 ; N SF430000 ; B -11 168 719 439 ; +C -1 ; WX 708 ; N SF240000 ; B 219 -303 490 910 ; +C -1 ; WX 708 ; N SF510000 ; B 312 -303 720 439 ; +C -1 ; WX 708 ; N SF520000 ; B 219 -303 720 346 ; +C -1 ; WX 708 ; N SF390000 ; B 219 -303 719 439 ; +C -1 ; WX 708 ; N SF220000 ; B -11 -303 396 439 ; +C -1 ; WX 708 ; N SF210000 ; B -11 -303 489 346 ; +C -1 ; WX 708 ; N SF250000 ; B -11 -303 489 439 ; +C -1 ; WX 708 ; N SF500000 ; B 312 168 720 910 ; +C -1 ; WX 708 ; N SF490000 ; B 219 261 720 910 ; +C -1 ; WX 708 ; N SF380000 ; B 219 168 719 910 ; +C -1 ; WX 708 ; N SF280000 ; B -11 168 396 910 ; +C -1 ; WX 708 ; N SF270000 ; B -11 261 489 910 ; +C -1 ; WX 708 ; N SF260000 ; B -11 168 489 910 ; +C -1 ; WX 708 ; N SF360000 ; B 312 -303 720 910 ; +C -1 ; WX 708 ; N SF370000 ; B 219 -303 720 910 ; +C -1 ; WX 708 ; N SF420000 ; B 219 -303 720 910 ; +C -1 ; WX 708 ; N SF190000 ; B -11 -303 396 910 ; +C -1 ; WX 708 ; N SF200000 ; B -11 -303 489 910 ; +C -1 ; WX 708 ; N SF230000 ; B -11 -303 489 910 ; +C -1 ; WX 708 ; N SF470000 ; B -11 -303 719 439 ; +C -1 ; WX 708 ; N SF480000 ; B -11 -303 719 346 ; +C -1 ; WX 708 ; N SF410000 ; B -11 -303 719 439 ; +C -1 ; WX 708 ; N SF450000 ; B -11 168 719 910 ; +C -1 ; WX 708 ; N SF460000 ; B -11 261 719 910 ; +C -1 ; WX 708 ; N SF400000 ; B -11 168 719 910 ; +C -1 ; WX 708 ; N SF540000 ; B -11 -303 719 910 ; +C -1 ; WX 708 ; N SF530000 ; B -11 -303 719 910 ; +C -1 ; WX 708 ; N SF440000 ; B -11 -303 719 910 ; +C -1 ; WX 708 ; N upblock ; B -11 303 719 910 ; +C -1 ; WX 708 ; N dnblock ; B -11 -303 719 303 ; +C -1 ; WX 708 ; N block ; B -11 -303 719 910 ; +C -1 ; WX 708 ; N lfblock ; B -11 -303 354 910 ; +C -1 ; WX 708 ; N rtblock ; B 354 -303 720 910 ; +C -1 ; WX 708 ; N ltshade ; B 50 -246 719 910 ; +C -1 ; WX 708 ; N shade ; B -11 -246 719 910 ; +C -1 ; WX 729 ; N dkshade ; B 0 -307 729 910 ; +C -1 ; WX 604 ; N filledbox ; B 71 0 532 461 ; +C -1 ; WX 1000 ; N filledrect ; B 0 155 1000 343 ; +C -1 ; WX 990 ; N triagup ; B 148 0 842 693 ; +C -1 ; WX 990 ; N triagrt ; B 141 -15 849 692 ; +C -1 ; WX 990 ; N triagdn ; B 148 -15 842 678 ; +C -1 ; WX 990 ; N triaglf ; B 141 -15 849 692 ; +C -1 ; WX 604 ; N circle ; B 87 67 517 497 ; +C -1 ; WX 604 ; N invbullet ; B 63 0 541 479 ; +C -1 ; WX 604 ; N invcircle ; B 21 0 584 564 ; +C -1 ; WX 1021 ; N smileface ; B 199 -58 822 564 ; +C -1 ; WX 1052 ; N invsmileface ; B 215 -58 838 564 ; +C -1 ; WX 917 ; N sun ; B 8 -109 909 792 ; +C -1 ; WX 750 ; N female ; B 119 -214 630 736 ; +C -1 ; WX 750 ; N male ; B 54 -128 691 791 ; +C -1 ; WX 531 ; N spade ; B 28 0 503 601 ; +C -1 ; WX 656 ; N club ; B 27 0 629 601 ; +C -1 ; WX 594 ; N heart ; B 31 -12 563 601 ; +C -1 ; WX 510 ; N diamond ; B 31 -12 479 601 ; +C -1 ; WX 500 ; N musicalnote ; B 18 -18 482 666 ; +C -1 ; WX 750 ; N musicalnotedbl ; B 42 -63 649 742 ; +C -1 ; WX 823 ; N IJ ; B 20 -15 819 662 ; +C -1 ; WX 552 ; N ij ; B 21 -216 480 678 ; +C -1 ; WX 729 ; N napostrophe ; B 74 0 791 677 ; +C -1 ; WX 281 ; N minute ; B 97 353 255 677 ; +C -1 ; WX 552 ; N second ; B 97 353 491 677 ; +C -1 ; WX 833 ; N afii61248 ; B 27 -28 808 677 ; +C -1 ; WX 375 ; N afii61289 ; B 13 -14 358 677 ; +C -1 ; WX 604 ; N H22073 ; B 71 0 532 461 ; +C -1 ; WX 354 ; N H18543 ; B 45 198 310 463 ; +C -1 ; WX 354 ; N H18551 ; B 45 198 310 463 ; +C -1 ; WX 604 ; N H18533 ; B 87 67 517 497 ; +C -1 ; WX 354 ; N openbullet ; B 38 190 316 470 ; +C -1 ; WX 722 ; N Amacron ; B 8 0 711 816 ; +C -1 ; WX 500 ; N amacron ; B 45 -6 483 612 ; +C -1 ; WX 722 ; N Ccircumflex ; B 40 -15 667 912 ; +C -1 ; WX 444 ; N ccircumflex ; B 38 -14 421 697 ; +C -1 ; WX 722 ; N Cdot ; B 40 -15 667 871 ; +C -1 ; WX 444 ; N cdot ; B 38 -14 421 668 ; +C -1 ; WX 667 ; N Emacron ; B 20 0 622 816 ; +C -1 ; WX 444 ; N emacron ; B 39 -14 420 612 ; +C -1 ; WX 667 ; N Ebreve ; B 20 0 622 884 ; +C -1 ; WX 444 ; N ebreve ; B 39 -14 420 677 ; +C -1 ; WX 667 ; N Edot ; B 20 0 622 871 ; +C -1 ; WX 444 ; N edot ; B 39 -14 420 668 ; +C -1 ; WX 778 ; N Gcircumflex ; B 41 -16 768 900 ; +C -1 ; WX 500 ; N gcircumflex ; B 38 -216 482 697 ; +C -1 ; WX 778 ; N Gdot ; B 41 -16 768 871 ; +C -1 ; WX 500 ; N gdot ; B 38 -216 482 668 ; +C -1 ; WX 778 ; N Gcedilla ; B 41 -188 768 678 ; +C -1 ; WX 500 ; N gcedilla ; B 38 -216 482 716 ; +C -1 ; WX 778 ; N Hcircumflex ; B 21 0 760 912 ; +C -1 ; WX 556 ; N hcircumflex ; B 34 0 527 912 ; +C -1 ; WX 778 ; N Hbar ; B 21 0 760 662 ; +C -1 ; WX 556 ; N hbar ; B 34 0 527 662 ; +C -1 ; WX 389 ; N Itilde ; B 20 0 366 864 ; +C -1 ; WX 278 ; N itilde ; B -21 0 295 669 ; +C -1 ; WX 389 ; N Imacron ; B 20 0 366 816 ; +C -1 ; WX 278 ; N imacron ; B -18 0 295 612 ; +C -1 ; WX 389 ; N Ibreve ; B 20 0 366 884 ; +C -1 ; WX 278 ; N ibreve ; B -9 0 287 677 ; +C -1 ; WX 389 ; N Iogonek ; B 21 -226 368 662 ; +C -1 ; WX 278 ; N iogonek ; B 19 -226 271 677 ; +C -1 ; WX 500 ; N Jcircumflex ; B 11 -15 494 912 ; +C -1 ; WX 333 ; N jcircumflex ; B -28 -216 323 697 ; +C -1 ; WX 778 ; N Kcedilla ; B 22 -188 789 662 ; +C -1 ; WX 556 ; N kcedilla ; B 33 -188 565 662 ; +C -1 ; WX 556 ; N kgreenlandic ; B 35 0 567 457 ; +C -1 ; WX 667 ; N Lcedilla ; B 19 -188 631 662 ; +C -1 ; WX 278 ; N lcedilla ; B 21 -188 268 662 ; +C -1 ; WX 722 ; N Ncedilla ; B 14 -188 699 662 ; +C -1 ; WX 556 ; N ncedilla ; B 34 -188 527 470 ; +C -1 ; WX 769 ; N Eng ; B 21 -15 720 677 ; +C -1 ; WX 556 ; N eng ; B 37 -216 480 470 ; +C -1 ; WX 778 ; N Omacron ; B 39 -15 742 816 ; +C -1 ; WX 500 ; N omacron ; B 36 -14 464 612 ; +C -1 ; WX 778 ; N Obreve ; B 39 -15 742 884 ; +C -1 ; WX 500 ; N obreve ; B 36 -14 464 677 ; +C -1 ; WX 722 ; N Rcedilla ; B 19 -188 731 662 ; +C -1 ; WX 444 ; N rcedilla ; B 37 -188 429 470 ; +C -1 ; WX 556 ; N Scircumflex ; B 52 -16 516 912 ; +C -1 ; WX 389 ; N scircumflex ; B 38 -14 354 697 ; +C -1 ; WX 667 ; N Tbar ; B 36 0 631 662 ; +C -1 ; WX 333 ; N tbar ; B 18 -6 323 624 ; +C -1 ; WX 722 ; N Utilde ; B 23 -16 705 864 ; +C -1 ; WX 556 ; N utilde ; B 31 -14 524 669 ; +C -1 ; WX 722 ; N Umacron ; B 23 -16 705 816 ; +C -1 ; WX 556 ; N umacron ; B 31 -14 524 612 ; +C -1 ; WX 722 ; N Ubreve ; B 23 -16 705 884 ; +C -1 ; WX 556 ; N ubreve ; B 31 -14 524 677 ; +C -1 ; WX 722 ; N Uogonek ; B 25 -226 707 662 ; +C -1 ; WX 556 ; N uogonek ; B 33 -226 526 457 ; +C -1 ; WX 1000 ; N Wcircumflex ; B 9 -15 991 912 ; +C -1 ; WX 722 ; N wcircumflex ; B 8 -14 712 697 ; +C -1 ; WX 722 ; N Ycircumflex ; B 9 0 711 912 ; +C -1 ; WX 500 ; N ycircumflex ; B 8 -216 491 697 ; +C -1 ; WX 278 ; N longs ; B 3 0 380 677 ; +C -1 ; WX 722 ; N Aringacute ; B 8 0 711 1026 ; +C -1 ; WX 500 ; N aringacute ; B 45 -6 483 897 ; +C -1 ; WX 1000 ; N AEacute ; B -11 0 955 897 ; +C -1 ; WX 722 ; N aeacute ; B 44 -14 693 685 ; +C -1 ; WX 778 ; N Oslashacute ; B 40 -38 742 897 ; +C -1 ; WX 500 ; N oslashacute ; B 33 -14 467 685 ; +C -1 ; WX 333 ; N anoteleia ; B 85 308 248 470 ; +C -1 ; WX 1000 ; N Wgrave ; B 9 -15 991 897 ; +C -1 ; WX 722 ; N wgrave ; B 8 -14 712 685 ; +C -1 ; WX 1000 ; N Wacute ; B 9 -15 991 897 ; +C -1 ; WX 722 ; N wacute ; B 8 -14 712 685 ; +C -1 ; WX 1000 ; N Wdieresis ; B 9 -15 991 856 ; +C -1 ; WX 722 ; N wdieresis ; B 8 -14 712 668 ; +C -1 ; WX 722 ; N Ygrave ; B 9 0 711 897 ; +C -1 ; WX 500 ; N ygrave ; B 8 -216 491 685 ; +C -1 ; WX 333 ; N quotereversed ; B 74 352 259 677 ; +C -1 ; WX 333 ; N radicalex ; B -20 533 353 612 ; +C -1 ; WX 500 ; N afii08941 ; B 17 -14 479 680 ; +C -1 ; WX 600 ; N estimated ; B 44 -17 561 535 ; +C -1 ; WX 750 ; N oneeighth ; B 35 -29 733 676 ; +C -1 ; WX 750 ; N threeeighths ; B 15 -29 732 676 ; +C -1 ; WX 750 ; N fiveeighths ; B 21 -29 732 676 ; +C -1 ; WX 750 ; N seveneighths ; B 21 -29 732 676 ; +C -1 ; WX 333 ; N commaaccent ; B 59 -241 192 -43 ; +C -1 ; WX 333 ; N undercommaaccent ; B 71 -188 237 -27 ; +C -1 ; WX 333 ; N tonos ; B 111 515 315 685 ; +C -1 ; WX 333 ; N dieresistonos ; B -61 515 394 685 ; +C -1 ; WX 722 ; N Alphatonos ; B 8 0 711 685 ; +C -1 ; WX 799 ; N Epsilontonos ; B -68 0 754 685 ; +C -1 ; WX 909 ; N Etatonos ; B -68 0 891 685 ; +C -1 ; WX 522 ; N Iotatonos ; B -68 0 499 685 ; +C -1 ; WX 778 ; N Omicrontonos ; B -59 -15 741 685 ; +C -1 ; WX 865 ; N Upsilontonos ; B -68 0 854 685 ; +C -1 ; WX 801 ; N Omegatonos ; B -67 0 765 685 ; +C -1 ; WX 310 ; N iotadieresistonos ; B -77 -14 377 685 ; +C -1 ; WX 722 ; N Alpha ; B 8 0 711 676 ; +C -1 ; WX 667 ; N Beta ; B 21 0 632 662 ; +C -1 ; WX 627 ; N Delta ; B 24 0 603 676 ; +C -1 ; WX 667 ; N Epsilon ; B 20 0 622 662 ; +C -1 ; WX 667 ; N Zeta ; B 16 0 649 662 ; +C -1 ; WX 778 ; N Eta ; B 21 0 760 662 ; +C -1 ; WX 389 ; N Iota ; B 20 0 366 662 ; +C -1 ; WX 778 ; N Kappa ; B 22 0 789 662 ; +C -1 ; WX 717 ; N Lambda ; B 4 0 708 676 ; +C -1 ; WX 944 ; N Mu ; B 20 0 926 662 ; +C -1 ; WX 722 ; N Nu ; B 14 -15 699 662 ; +C -1 ; WX 677 ; N Xi ; B 56 0 622 662 ; +C -1 ; WX 778 ; N Omicron ; B 39 -15 742 677 ; +C -1 ; WX 778 ; N Pi ; B 20 0 759 662 ; +C -1 ; WX 611 ; N Rho ; B 25 0 581 662 ; +C -1 ; WX 654 ; N Sigma ; B 6 0 622 662 ; +C -1 ; WX 667 ; N Tau ; B 36 0 631 662 ; +C -1 ; WX 722 ; N Upsilon ; B 9 0 711 662 ; +C -1 ; WX 722 ; N Chi ; B 7 0 715 662 ; +C -1 ; WX 780 ; N Psi ; B 15 0 765 670 ; +C -1 ; WX 801 ; N Omega ; B 37 0 764 677 ; +C -1 ; WX 389 ; N Iotadieresis ; B 20 0 366 856 ; +C -1 ; WX 722 ; N Upsilondieresis ; B 9 0 711 856 ; +C -1 ; WX 558 ; N alphatonos ; B 42 -14 537 685 ; +C -1 ; WX 427 ; N epsilontonos ; B 32 -14 413 685 ; +C -1 ; WX 568 ; N etatonos ; B 9 -214 512 685 ; +C -1 ; WX 310 ; N iotatonos ; B 21 -14 307 685 ; +C -1 ; WX 519 ; N upsilondieresistonos ; B 5 -14 484 685 ; +C -1 ; WX 527 ; N beta ; B 50 -214 488 677 ; +C -1 ; WX 468 ; N gamma ; B 1 -216 461 470 ; +C -1 ; WX 413 ; N zeta ; B 32 -216 408 688 ; +C -1 ; WX 568 ; N eta ; B 9 -214 512 470 ; +C -1 ; WX 522 ; N theta ; B 41 -14 481 677 ; +C -1 ; WX 310 ; N iota ; B 21 -14 307 457 ; +C -1 ; WX 555 ; N kappa ; B 18 0 560 470 ; +C -1 ; WX 491 ; N lambda ; B 14 -6 503 677 ; +C -1 ; WX 567 ; N mu ; B 52 -216 552 457 ; +C -1 ; WX 447 ; N nu ; B -10 -14 425 470 ; +C -1 ; WX 446 ; N xi ; B 30 -216 443 688 ; +C -1 ; WX 500 ; N omicron ; B 36 -14 464 470 ; +C -1 ; WX 535 ; N rho ; B 49 -214 492 470 ; +C -1 ; WX 422 ; N sigma1 ; B 28 -216 410 470 ; +C -1 ; WX 519 ; N upsilon ; B 5 -14 479 470 ; +C -1 ; WX 462 ; N chi ; B 7 -216 472 463 ; +C -1 ; WX 688 ; N psi ; B 16 -214 672 463 ; +C -1 ; WX 731 ; N omega ; B 39 -14 693 470 ; +C -1 ; WX 310 ; N iotadieresis ; B -8 -14 307 668 ; +C -1 ; WX 519 ; N upsilondieresis ; B 5 -14 479 668 ; +C -1 ; WX 500 ; N omicrontonos ; B 36 -14 464 685 ; +C -1 ; WX 519 ; N upsilontonos ; B 5 -14 479 685 ; +C -1 ; WX 731 ; N omegatonos ; B 39 -14 693 685 ; +C -1 ; WX 667 ; N afii10023 ; B 20 0 622 856 ; +C -1 ; WX 800 ; N afii10051 ; B 32 -8 766 662 ; +C -1 ; WX 678 ; N afii10053 ; B 37 -15 631 677 ; +C -1 ; WX 556 ; N afii10054 ; B 52 -16 516 677 ; +C -1 ; WX 389 ; N afii10055 ; B 20 0 366 662 ; +C -1 ; WX 389 ; N afii10056 ; B 20 0 366 856 ; +C -1 ; WX 500 ; N afii10057 ; B 11 -15 494 662 ; +C -1 ; WX 1003 ; N afii10058 ; B 6 -8 971 662 ; +C -1 ; WX 1002 ; N afii10059 ; B 19 0 970 662 ; +C -1 ; WX 800 ; N afii10060 ; B 32 0 775 662 ; +C -1 ; WX 734 ; N afii10062 ; B 9 -15 725 865 ; +C -1 ; WX 722 ; N afii10017 ; B 8 0 711 676 ; +C -1 ; WX 661 ; N afii10018 ; B 17 0 629 662 ; +C -1 ; WX 667 ; N afii10019 ; B 21 0 632 662 ; +C -1 ; WX 636 ; N afii10020 ; B 20 0 604 662 ; +C -1 ; WX 688 ; N afii10021 ; B 0 -193 669 662 ; +C -1 ; WX 667 ; N afii10022 ; B 20 0 622 662 ; +C -1 ; WX 989 ; N afii10024 ; B 15 0 973 670 ; +C -1 ; WX 528 ; N afii10025 ; B 20 -15 493 677 ; +C -1 ; WX 778 ; N afii10026 ; B 16 0 764 662 ; +C -1 ; WX 778 ; N afii10027 ; B 16 0 764 865 ; +C -1 ; WX 725 ; N afii10028 ; B 21 0 709 670 ; +C -1 ; WX 745 ; N afii10029 ; B 6 -8 719 662 ; +C -1 ; WX 944 ; N afii10030 ; B 20 0 926 662 ; +C -1 ; WX 778 ; N afii10031 ; B 21 0 760 662 ; +C -1 ; WX 778 ; N afii10032 ; B 39 -15 742 677 ; +C -1 ; WX 778 ; N afii10033 ; B 20 0 759 662 ; +C -1 ; WX 611 ; N afii10034 ; B 25 0 581 662 ; +C -1 ; WX 722 ; N afii10035 ; B 40 -15 667 677 ; +C -1 ; WX 667 ; N afii10036 ; B 36 0 631 662 ; +C -1 ; WX 734 ; N afii10037 ; B 9 -15 725 662 ; +C -1 ; WX 859 ; N afii10038 ; B 37 0 822 662 ; +C -1 ; WX 722 ; N afii10039 ; B 7 0 715 662 ; +C -1 ; WX 778 ; N afii10040 ; B 20 -193 750 662 ; +C -1 ; WX 734 ; N afii10041 ; B 6 0 713 662 ; +C -1 ; WX 1098 ; N afii10042 ; B 42 0 1056 662 ; +C -1 ; WX 1098 ; N afii10043 ; B 42 -193 1056 662 ; +C -1 ; WX 765 ; N afii10044 ; B 36 0 732 662 ; +C -1 ; WX 982 ; N afii10045 ; B 17 0 962 662 ; +C -1 ; WX 661 ; N afii10046 ; B 17 0 629 662 ; +C -1 ; WX 678 ; N afii10047 ; B 47 -15 641 677 ; +C -1 ; WX 1126 ; N afii10048 ; B 20 -15 1089 677 ; +C -1 ; WX 722 ; N afii10049 ; B -9 0 704 662 ; +C -1 ; WX 500 ; N afii10065 ; B 45 -6 483 470 ; +C -1 ; WX 500 ; N afii10066 ; B 36 -14 464 677 ; +C -1 ; WX 540 ; N afii10067 ; B 36 0 504 457 ; +C -1 ; WX 454 ; N afii10068 ; B 35 0 437 457 ; +C -1 ; WX 506 ; N afii10069 ; B 0 -120 470 457 ; +C -1 ; WX 444 ; N afii10070 ; B 39 -14 420 470 ; +C -1 ; WX 725 ; N afii10072 ; B 6 0 719 464 ; +C -1 ; WX 402 ; N afii10073 ; B 13 -14 375 470 ; +C -1 ; WX 576 ; N afii10074 ; B 34 0 542 457 ; +C -1 ; WX 576 ; N afii10075 ; B 34 0 542 665 ; +C -1 ; WX 576 ; N afii10076 ; B 35 0 563 464 ; +C -1 ; WX 561 ; N afii10077 ; B 6 -8 524 457 ; +C -1 ; WX 681 ; N afii10078 ; B 36 0 644 457 ; +C -1 ; WX 576 ; N afii10079 ; B 34 0 541 457 ; +C -1 ; WX 500 ; N afii10080 ; B 36 -14 464 470 ; +C -1 ; WX 576 ; N afii10081 ; B 34 0 542 457 ; +C -1 ; WX 556 ; N afii10082 ; B 19 -214 513 470 ; +C -1 ; WX 444 ; N afii10083 ; B 38 -14 421 470 ; +C -1 ; WX 491 ; N afii10084 ; B 18 0 473 457 ; +C -1 ; WX 500 ; N afii10085 ; B 8 -216 491 457 ; +C -1 ; WX 692 ; N afii10086 ; B 40 -214 652 662 ; +C -1 ; WX 500 ; N afii10087 ; B 23 0 484 457 ; +C -1 ; WX 576 ; N afii10088 ; B 34 -120 542 457 ; +C -1 ; WX 564 ; N afii10089 ; B 25 0 526 457 ; +C -1 ; WX 844 ; N afii10090 ; B 35 0 810 457 ; +C -1 ; WX 844 ; N afii10091 ; B 35 -120 810 457 ; +C -1 ; WX 583 ; N afii10092 ; B 18 0 552 457 ; +C -1 ; WX 781 ; N afii10093 ; B 38 0 744 457 ; +C -1 ; WX 529 ; N afii10094 ; B 38 0 498 457 ; +C -1 ; WX 432 ; N afii10095 ; B 14 -14 396 470 ; +C -1 ; WX 764 ; N afii10096 ; B 37 -14 729 470 ; +C -1 ; WX 541 ; N afii10097 ; B 17 0 503 457 ; +C -1 ; WX 444 ; N afii10071 ; B 39 -14 420 668 ; +C -1 ; WX 537 ; N afii10099 ; B 36 -216 488 663 ; +C -1 ; WX 454 ; N afii10100 ; B 35 0 437 685 ; +C -1 ; WX 432 ; N afii10101 ; B 36 -14 418 470 ; +C -1 ; WX 389 ; N afii10102 ; B 40 -14 354 470 ; +C -1 ; WX 278 ; N afii10103 ; B 21 0 267 678 ; +C -1 ; WX 278 ; N afii10104 ; B -17 0 295 668 ; +C -1 ; WX 333 ; N afii10105 ; B -28 -216 249 677 ; +C -1 ; WX 780 ; N afii10106 ; B 6 -8 749 457 ; +C -1 ; WX 797 ; N afii10107 ; B 35 0 766 457 ; +C -1 ; WX 556 ; N afii10108 ; B 37 0 530 662 ; +C -1 ; WX 500 ; N afii10110 ; B 8 -216 491 665 ; +C -1 ; WX 576 ; N afii10193 ; B 34 -120 542 457 ; +C -1 ; WX 520 ; N afii10050 ; B 20 0 499 804 ; +C -1 ; WX 389 ; N afii10098 ; B 36 0 372 545 ; +C -1 ; WX 1000 ; N afii00208 ; B 32 224 969 294 ; +C -1 ; WX 1005 ; N afii61352 ; B 6 -15 969 669 ; +C -1 ; WX 548 ; N pi ; B 7 -14 523 457 ; +C -1 ; WX 333 ; N sheva ; B 125 -215 208 -25 ; +C -1 ; WX 333 ; N hatafsegol ; B 14 -215 319 -24 ; +C -1 ; WX 333 ; N hatafpatah ; B 24 -215 309 -24 ; +C -1 ; WX 333 ; N hatafqamats ; B 9 -216 325 -24 ; +C -1 ; WX 333 ; N hiriq ; B 126 -153 207 -72 ; +C -1 ; WX 333 ; N tsere ; B 70 -153 263 -72 ; +C -1 ; WX 333 ; N segol ; B 70 -215 263 -24 ; +C -1 ; WX 333 ; N patah ; B 70 -130 263 -80 ; +C -1 ; WX 333 ; N qamats ; B 70 -215 263 -52 ; +C -1 ; WX 333 ; N holam ; B 126 587 207 668 ; +C -1 ; WX 333 ; N qubuts ; B 14 -215 319 -24 ; +C -1 ; WX 333 ; N dagesh ; B 126 221 207 302 ; +C -1 ; WX 333 ; N meteg ; B 141 -215 191 -53 ; +C -1 ; WX 363 ; N maqaf ; B 43 347 320 516 ; +C -1 ; WX 333 ; N rafe ; B 70 596 263 646 ; +C -1 ; WX 333 ; N paseq ; B 116 -49 217 564 ; +C -1 ; WX 343 ; N shindot ; B 335 587 417 668 ; +C -1 ; WX 343 ; N sindot ; B -73 587 8 668 ; +C -1 ; WX 333 ; N sofpasuq ; B 85 -12 248 525 ; +C -1 ; WX 527 ; N alef ; B 21 -18 494 553 ; +C -1 ; WX 459 ; N bet ; B 19 0 448 549 ; +C -1 ; WX 367 ; N gimel ; B 16 -11 353 553 ; +C -1 ; WX 464 ; N dalet ; B 30 -11 432 549 ; +C -1 ; WX 512 ; N he ; B 30 -11 482 549 ; +C -1 ; WX 298 ; N vav ; B 27 -8 247 553 ; +C -1 ; WX 317 ; N zayin ; B 27 -10 290 553 ; +C -1 ; WX 504 ; N het ; B 33 -11 475 549 ; +C -1 ; WX 529 ; N tet ; B 27 0 486 553 ; +C -1 ; WX 311 ; N yod ; B 27 180 272 553 ; +C -1 ; WX 458 ; N finalkaf ; B 27 -170 425 549 ; +C -1 ; WX 446 ; N kaf ; B 19 0 406 549 ; +C -1 ; WX 435 ; N lamed ; B -16 -10 395 753 ; +C -1 ; WX 511 ; N finalmem ; B 39 0 459 549 ; +C -1 ; WX 533 ; N mem ; B 27 0 493 553 ; +C -1 ; WX 326 ; N finalnun ; B 27 -170 290 553 ; +C -1 ; WX 316 ; N nun ; B 16 0 275 553 ; +C -1 ; WX 478 ; N samekh ; B 35 -13 438 549 ; +C -1 ; WX 507 ; N ayin ; B 19 -32 480 553 ; +C -1 ; WX 493 ; N finalpe ; B 27 -170 455 549 ; +C -1 ; WX 457 ; N pe ; B 21 0 416 549 ; +C -1 ; WX 564 ; N finaltsadi ; B 27 -170 537 553 ; +C -1 ; WX 515 ; N tsadi ; B 27 0 485 553 ; +C -1 ; WX 483 ; N qof ; B 33 -170 442 549 ; +C -1 ; WX 464 ; N resh ; B 27 -8 412 549 ; +C -1 ; WX 688 ; N shin ; B 27 0 661 553 ; +C -1 ; WX 518 ; N tav ; B 11 -8 467 549 ; +C -1 ; WX 597 ; N doublevav ; B 27 -8 545 553 ; +C -1 ; WX 609 ; N vavyod ; B 27 -8 558 553 ; +C -1 ; WX 621 ; N doubleyod ; B 27 180 583 553 ; +C -1 ; WX 255 ; N geresh ; B 68 219 212 535 ; +C -1 ; WX 460 ; N gershayim ; B 68 219 417 535 ; +C -1 ; WX 758 ; N newsheqelsign ; B 65 0 693 516 ; +C -1 ; WX 298 ; N vavshindot ; B -54 -8 247 668 ; +C -1 ; WX 458 ; N finalkafsheva ; B 27 -170 425 549 ; +C -1 ; WX 458 ; N finalkafqamats ; B 27 -170 425 549 ; +C -1 ; WX 435 ; N lamedholam ; B -132 -10 395 753 ; +C -1 ; WX 435 ; N lamedholamdagesh ; B -132 -10 395 753 ; +C -1 ; WX 507 ; N altayin ; B 19 0 480 553 ; +C -1 ; WX 688 ; N shinshindot ; B 27 0 661 668 ; +C -1 ; WX 688 ; N shinsindot ; B 23 0 661 668 ; +C -1 ; WX 688 ; N shindageshshindot ; B 27 0 661 668 ; +C -1 ; WX 688 ; N shindageshsindot ; B 23 0 661 668 ; +C -1 ; WX 527 ; N alefpatah ; B 21 -130 494 553 ; +C -1 ; WX 527 ; N alefqamats ; B 21 -215 494 553 ; +C -1 ; WX 527 ; N alefmapiq ; B 21 -18 494 553 ; +C -1 ; WX 459 ; N betdagesh ; B 19 0 448 549 ; +C -1 ; WX 367 ; N gimeldagesh ; B 16 -11 353 553 ; +C -1 ; WX 464 ; N daletdagesh ; B 30 -11 432 549 ; +C -1 ; WX 512 ; N hedagesh ; B 30 -11 482 549 ; +C -1 ; WX 298 ; N vavdagesh ; B 27 -8 247 553 ; +C -1 ; WX 332 ; N zayindagesh ; B 6 -10 304 553 ; +C -1 ; WX 529 ; N tetdagesh ; B 27 0 486 553 ; +C -1 ; WX 311 ; N yoddagesh ; B 27 180 272 553 ; +C -1 ; WX 458 ; N finalkafdagesh ; B 27 -170 425 549 ; +C -1 ; WX 446 ; N kafdagesh ; B 19 0 406 549 ; +C -1 ; WX 435 ; N lameddagesh ; B -16 -10 395 753 ; +C -1 ; WX 533 ; N memdagesh ; B 27 0 493 553 ; +C -1 ; WX 316 ; N nundagesh ; B 16 0 275 553 ; +C -1 ; WX 478 ; N samekhdagesh ; B 35 -13 438 549 ; +C -1 ; WX 493 ; N finalpedagesh ; B 27 -170 455 549 ; +C -1 ; WX 457 ; N pedagesh ; B 21 0 416 549 ; +C -1 ; WX 515 ; N tsadidagesh ; B 27 0 485 553 ; +C -1 ; WX 483 ; N qofdagesh ; B 33 -170 442 549 ; +C -1 ; WX 464 ; N reshdagesh ; B 27 -8 412 549 ; +C -1 ; WX 688 ; N shindagesh ; B 27 0 661 553 ; +C -1 ; WX 518 ; N tavdages ; B 11 -8 467 549 ; +C -1 ; WX 298 ; N vavholam ; B 27 -8 247 668 ; +C -1 ; WX 459 ; N betrafe ; B 19 0 448 646 ; +C -1 ; WX 446 ; N kafrafe ; B 19 0 406 646 ; +C -1 ; WX 457 ; N perafe ; B 21 0 416 646 ; +C -1 ; WX 527 ; N aleflamed ; B -16 -18 494 753 ; +C -1 ; WX 0 ; N zerowidthnonjoiner ; B -18 -134 18 629 ; +C -1 ; WX 0 ; N zerowidthjoiner ; B -107 -134 107 690 ; +C -1 ; WX 0 ; N lefttorightmark ; B -18 -134 210 690 ; +C -1 ; WX 0 ; N righttoleftmark ; B -210 -134 17 690 ; +C -1 ; WX 319 ; N afii57388 ; B 83 137 241 443 ; +C -1 ; WX 319 ; N afii57403 ; B 78 136 235 609 ; +C -1 ; WX 356 ; N afii57407 ; B 33 137 326 711 ; +C -1 ; WX 469 ; N afii57409 ; B 62 46 422 510 ; +C -1 ; WX 198 ; N afii57440 ; B -34 143 198 276 ; +C -1 ; WX 201 ; N afii57451 ; B 34 683 201 857 ; +C -1 ; WX 237 ; N afii57452 ; B 34 683 237 872 ; +C -1 ; WX 201 ; N afii57453 ; B 34 -133 201 41 ; +C -1 ; WX 201 ; N afii57454 ; B 34 683 201 784 ; +C -1 ; WX 209 ; N afii57455 ; B 35 683 209 895 ; +C -1 ; WX 201 ; N afii57456 ; B 34 -60 201 41 ; +C -1 ; WX 211 ; N afii57457 ; B 34 683 211 840 ; +C -1 ; WX 165 ; N afii57458 ; B 34 683 165 834 ; +C -1 ; WX 562 ; N afii57392 ; B 191 206 360 457 ; +C -1 ; WX 562 ; N afii57393 ; B 164 146 359 719 ; +C -1 ; WX 562 ; N afii57394 ; B 127 143 419 718 ; +C -1 ; WX 562 ; N afii57395 ; B 77 143 476 713 ; +C -1 ; WX 562 ; N afii57396 ; B 147 145 404 710 ; +C -1 ; WX 562 ; N afii57397 ; B 114 231 448 634 ; +C -1 ; WX 562 ; N afii57398 ; B 104 149 426 718 ; +C -1 ; WX 562 ; N afii57399 ; B 76 143 457 717 ; +C -1 ; WX 562 ; N afii57400 ; B 92 149 473 724 ; +C -1 ; WX 562 ; N afii57401 ; B 116 146 427 719 ; +C -1 ; WX 526 ; N afii57381 ; B 65 84 463 777 ; +C -1 ; WX 319 ; N afii57461 ; B 94 23 230 267 ; +C -1 ; WX 526 ; N afii63167 ; B 87 403 424 744 ; +C -1 ; WX 750 ; N afii57459 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57543 ; B 125 0 625 625 ; +C -1 ; WX 343 ; N afii57534 ; B 43 126 304 519 ; +C -1 ; WX 750 ; N afii57494 ; B 125 0 625 625 ; +C -1 ; WX 562 ; N afii62843 ; B 81 143 471 737 ; +C -1 ; WX 562 ; N afii62844 ; B 92 143 461 719 ; +C -1 ; WX 562 ; N afii62845 ; B 108 143 451 729 ; +C -1 ; WX 750 ; N afii64240 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii64241 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63954 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57382 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii64242 ; B 125 0 625 625 ; +C -1 ; WX 211 ; N afii62881 ; B 34 683 211 995 ; +C -1 ; WX 750 ; N afii57504 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57369 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57370 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57371 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57372 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57373 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57374 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57375 ; B 125 0 625 625 ; +C -1 ; WX 612 ; N afii57391 ; B -34 143 612 276 ; +C -1 ; WX 750 ; N afii57471 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57460 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii52258 ; B 125 0 625 625 ; +C -1 ; WX 649 ; N afii57506 ; B 28 -193 649 489 ; +C -1 ; WX 649 ; N afii62958 ; B 28 -193 649 489 ; +C -1 ; WX 271 ; N afii62956 ; B -34 -193 271 492 ; +C -1 ; WX 271 ; N afii52957 ; B -34 -193 271 492 ; +C -1 ; WX 750 ; N afii57505 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62889 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62887 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62888 ; B 125 0 625 625 ; +C -1 ; WX 577 ; N afii57507 ; B 25 -203 563 527 ; +C -1 ; WX 559 ; N afii62961 ; B 23 -201 563 527 ; +C -1 ; WX 523 ; N afii62959 ; B -34 -193 523 501 ; +C -1 ; WX 523 ; N afii62960 ; B -34 -193 523 501 ; +C -1 ; WX 433 ; N afii57508 ; B 5 -72 447 813 ; +C -1 ; WX 433 ; N afii62962 ; B 5 -72 447 813 ; +C -1 ; WX 757 ; N afii57567 ; B 20 143 757 708 ; +C -1 ; WX 879 ; N afii62964 ; B 20 143 879 722 ; +C -1 ; WX 360 ; N afii52305 ; B -34 143 360 708 ; +C -1 ; WX 542 ; N afii52306 ; B -34 143 542 722 ; +C -1 ; WX 757 ; N afii57509 ; B 20 143 757 863 ; +C -1 ; WX 879 ; N afii62967 ; B 20 143 879 876 ; +C -1 ; WX 360 ; N afii62965 ; B -34 143 360 863 ; +C -1 ; WX 542 ; N afii62966 ; B -34 143 542 876 ; +C -1 ; WX 645 ; N afii57555 ; B 74 -60 575 461 ; +C -1 ; WX 554 ; N afii52364 ; B 15 -174 588 282 ; +C -1 ; WX 750 ; N afii63753 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63754 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63759 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63763 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63795 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62891 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63808 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62938 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63810 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62942 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62947 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63813 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63823 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63824 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63833 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63844 ; B 125 0 625 625 ; +C -1 ; WX 226 ; N afii62882 ; B 23 683 226 1010 ; +C -1 ; WX 211 ; N afii62883 ; B 34 678 211 978 ; +C -1 ; WX 211 ; N afii62884 ; B 34 683 211 918 ; +C -1 ; WX 211 ; N afii62885 ; B 31 683 211 974 ; +C -1 ; WX 211 ; N afii62886 ; B 34 683 211 931 ; +C -1 ; WX 750 ; N afii63846 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63849 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N uni202A ; B 125 0 625 625 ; +C -1 ; WX 750 ; N uni202B ; B 125 0 625 625 ; +C -1 ; WX 750 ; N uni202D ; B 125 0 625 625 ; +C -1 ; WX 750 ; N uni202E ; B 125 0 625 625 ; +C -1 ; WX 750 ; N uni202C ; B 125 0 625 625 ; +C -1 ; WX 750 ; N uni206E ; B 125 0 625 625 ; +C -1 ; WX 750 ; N _b_852 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N uni206A ; B 125 0 625 625 ; +C -1 ; WX 750 ; N uni206B ; B 125 0 625 625 ; +C -1 ; WX 750 ; N _b_855 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N uni206D ; B 125 0 625 625 ; +C -1 ; WX 750 ; N uniF00A ; B 125 0 625 625 ; +C -1 ; WX 750 ; N uniF00B ; B 125 0 625 625 ; +C -1 ; WX 750 ; N uniF00C ; B 125 0 625 625 ; +C -1 ; WX 750 ; N uniF00D ; B 125 0 625 625 ; +C -1 ; WX 750 ; N uniF00E ; B 125 0 625 625 ; +C -1 ; WX 1000 ; N uniFFFC ; B 0 0 1000 719 ; +C -1 ; WX 750 ; N afii63904 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63905 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63906 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63908 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63910 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63912 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62927 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63941 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62939 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63943 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62943 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62946 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63946 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62951 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63948 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62953 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63950 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63951 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63952 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63953 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63956 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63958 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63959 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63960 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii63961 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii64046 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii64058 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii64059 ; B 125 0 625 625 ; +C -1 ; WX 319 ; N afii64060 ; B 62 -209 273 785 ; +C -1 ; WX 319 ; N afii64061 ; B 50 -209 262 785 ; +C -1 ; WX 750 ; N afii62945 ; B 125 0 625 625 ; +C -1 ; WX 703 ; N afii64184 ; B 22 91 661 920 ; +C -1 ; WX 469 ; N afii52399 ; B 62 46 422 510 ; +C -1 ; WX 238 ; N afii52400 ; B 0 109 238 831 ; +C -1 ; WX 253 ; N afii62753 ; B -30 143 253 831 ; +C -1 ; WX 217 ; N afii57411 ; B 46 109 182 876 ; +C -1 ; WX 234 ; N afii62754 ; B -3 143 234 876 ; +C -1 ; WX 451 ; N afii57412 ; B 3 -71 451 661 ; +C -1 ; WX 451 ; N afii62755 ; B 3 -71 451 661 ; +C -1 ; WX 217 ; N afii57413 ; B 46 -88 181 736 ; +C -1 ; WX 234 ; N afii62756 ; B 13 -88 234 736 ; +C -1 ; WX 645 ; N afii57414 ; B 74 -60 575 546 ; +C -1 ; WX 577 ; N afii62759 ; B 8 -98 577 524 ; +C -1 ; WX 271 ; N afii62757 ; B -34 143 271 661 ; +C -1 ; WX 271 ; N afii62758 ; B -34 143 271 661 ; +C -1 ; WX 217 ; N afii57415 ; B 66 109 181 736 ; +C -1 ; WX 234 ; N afii62760 ; B 13 143 234 736 ; +C -1 ; WX 649 ; N afii57416 ; B 28 -69 649 489 ; +C -1 ; WX 649 ; N afii62763 ; B 28 -69 649 489 ; +C -1 ; WX 271 ; N afii62761 ; B -34 -69 271 492 ; +C -1 ; WX 271 ; N afii62762 ; B -34 -69 271 492 ; +C -1 ; WX 343 ; N afii57417 ; B 26 126 304 763 ; +C -1 ; WX 415 ; N afii62764 ; B 1 143 415 873 ; +C -1 ; WX 649 ; N afii57418 ; B 28 143 649 656 ; +C -1 ; WX 649 ; N afii62767 ; B 28 143 649 656 ; +C -1 ; WX 271 ; N afii62765 ; B -34 143 271 715 ; +C -1 ; WX 271 ; N afii62766 ; B -34 143 271 715 ; +C -1 ; WX 649 ; N afii57419 ; B 29 144 649 766 ; +C -1 ; WX 649 ; N afii62770 ; B 29 144 649 766 ; +C -1 ; WX 271 ; N afii62768 ; B -34 143 271 828 ; +C -1 ; WX 271 ; N afii62769 ; B -34 143 271 828 ; +C -1 ; WX 577 ; N afii57420 ; B 25 -203 563 527 ; +C -1 ; WX 559 ; N afii62773 ; B 23 -201 563 527 ; +C -1 ; WX 523 ; N afii62771 ; B -34 -74 523 501 ; +C -1 ; WX 523 ; N afii62772 ; B -34 -74 523 501 ; +C -1 ; WX 577 ; N afii57421 ; B 25 -203 563 527 ; +C -1 ; WX 559 ; N afii62776 ; B 23 -201 563 527 ; +C -1 ; WX 523 ; N afii62774 ; B -34 143 523 501 ; +C -1 ; WX 523 ; N afii62775 ; B -34 143 523 501 ; +C -1 ; WX 577 ; N afii57422 ; B 25 -203 563 746 ; +C -1 ; WX 559 ; N afii62779 ; B 23 -201 563 746 ; +C -1 ; WX 523 ; N afii62777 ; B -34 143 523 724 ; +C -1 ; WX 523 ; N afii62778 ; B -34 143 523 724 ; +C -1 ; WX 343 ; N afii57423 ; B 51 143 343 604 ; +C -1 ; WX 343 ; N afii62780 ; B 51 143 343 604 ; +C -1 ; WX 343 ; N afii57424 ; B 51 143 343 845 ; +C -1 ; WX 343 ; N afii62781 ; B 51 143 343 845 ; +C -1 ; WX 433 ; N afii57425 ; B 5 -72 433 461 ; +C -1 ; WX 433 ; N afii62782 ; B 5 -72 433 461 ; +C -1 ; WX 433 ; N afii57426 ; B 5 -72 433 693 ; +C -1 ; WX 433 ; N afii62783 ; B 5 -72 433 693 ; +C -1 ; WX 899 ; N afii57427 ; B 31 -63 899 458 ; +C -1 ; WX 899 ; N afii62786 ; B 31 -63 899 458 ; +C -1 ; WX 608 ; N afii62784 ; B -34 143 608 446 ; +C -1 ; WX 608 ; N afii62785 ; B -34 143 608 446 ; +C -1 ; WX 899 ; N afii57428 ; B 31 -63 899 774 ; +C -1 ; WX 899 ; N afii62789 ; B 31 -63 899 774 ; +C -1 ; WX 608 ; N afii62787 ; B -34 143 608 774 ; +C -1 ; WX 608 ; N afii62788 ; B -34 143 608 774 ; +C -1 ; WX 1063 ; N afii57429 ; B 31 -63 1063 504 ; +C -1 ; WX 1063 ; N afii62792 ; B 31 -63 1063 504 ; +C -1 ; WX 771 ; N afii62790 ; B -34 143 771 504 ; +C -1 ; WX 771 ; N afii62791 ; B -34 143 771 504 ; +C -1 ; WX 1063 ; N afii57430 ; B 31 -63 1063 728 ; +C -1 ; WX 1063 ; N afii62795 ; B 31 -63 1063 728 ; +C -1 ; WX 771 ; N afii62793 ; B -34 143 771 728 ; +C -1 ; WX 771 ; N afii62794 ; B -34 143 771 728 ; +C -1 ; WX 523 ; N afii57431 ; B -34 143 523 813 ; +C -1 ; WX 523 ; N afii62798 ; B -34 143 523 813 ; +C -1 ; WX 523 ; N afii62796 ; B -34 143 523 813 ; +C -1 ; WX 523 ; N afii62797 ; B -34 143 523 813 ; +C -1 ; WX 523 ; N afii57432 ; B -34 143 523 813 ; +C -1 ; WX 523 ; N afii62801 ; B -34 143 523 813 ; +C -1 ; WX 523 ; N afii62799 ; B -34 143 523 813 ; +C -1 ; WX 523 ; N afii62800 ; B -34 143 523 813 ; +C -1 ; WX 541 ; N afii57433 ; B 25 -204 535 595 ; +C -1 ; WX 469 ; N afii62804 ; B 34 -198 516 531 ; +C -1 ; WX 541 ; N afii62802 ; B -34 143 483 571 ; +C -1 ; WX 360 ; N afii62803 ; B -34 143 360 505 ; +C -1 ; WX 541 ; N afii57434 ; B 25 -204 535 822 ; +C -1 ; WX 469 ; N afii62807 ; B 34 -198 516 760 ; +C -1 ; WX 541 ; N afii62805 ; B -34 143 483 800 ; +C -1 ; WX 360 ; N afii62806 ; B -34 143 360 756 ; +C -1 ; WX 758 ; N afii57441 ; B 23 127 758 779 ; +C -1 ; WX 758 ; N afii62810 ; B 23 127 758 779 ; +C -1 ; WX 305 ; N afii62808 ; B -34 143 305 850 ; +C -1 ; WX 324 ; N afii62809 ; B -34 143 324 779 ; +C -1 ; WX 612 ; N afii57442 ; B 19 -130 612 658 ; +C -1 ; WX 612 ; N afii62813 ; B 19 -130 612 658 ; +C -1 ; WX 305 ; N afii62811 ; B -34 143 305 844 ; +C -1 ; WX 324 ; N afii62812 ; B -34 143 324 780 ; +C -1 ; WX 541 ; N afii57443 ; B 20 143 541 774 ; +C -1 ; WX 541 ; N afii62816 ; B 20 143 541 774 ; +C -1 ; WX 360 ; N afii57410 ; B -34 143 360 708 ; +C -1 ; WX 360 ; N afii62815 ; B -34 143 360 708 ; +C -1 ; WX 451 ; N afii57444 ; B 17 -36 451 773 ; +C -1 ; WX 451 ; N afii62819 ; B 17 -36 451 773 ; +C -1 ; WX 234 ; N afii62817 ; B -34 143 234 774 ; +C -1 ; WX 234 ; N afii62818 ; B -34 143 234 774 ; +C -1 ; WX 360 ; N afii57445 ; B 16 -212 360 431 ; +C -1 ; WX 360 ; N afii62822 ; B 16 -212 360 431 ; +C -1 ; WX 415 ; N afii62820 ; B -34 143 415 472 ; +C -1 ; WX 415 ; N afii62821 ; B -34 143 415 472 ; +C -1 ; WX 541 ; N afii57446 ; B 30 -63 541 612 ; +C -1 ; WX 541 ; N afii62825 ; B 30 -63 541 612 ; +C -1 ; WX 271 ; N afii62823 ; B -34 143 274 735 ; +C -1 ; WX 271 ; N afii62824 ; B -34 143 274 735 ; +C -1 ; WX 343 ; N afii57447 ; B 43 126 304 519 ; +C -1 ; WX 415 ; N afii62828 ; B 1 143 415 694 ; +C -1 ; WX 469 ; N afii57470 ; B -34 117 398 627 ; +C -1 ; WX 451 ; N afii62827 ; B -34 -101 451 560 ; +C -1 ; WX 451 ; N afii57448 ; B 3 -71 451 484 ; +C -1 ; WX 451 ; N afii62829 ; B 3 -71 451 484 ; +C -1 ; WX 645 ; N afii57449 ; B 74 -60 575 461 ; +C -1 ; WX 554 ; N afii62830 ; B 15 -174 588 282 ; +C -1 ; WX 645 ; N afii57450 ; B 74 -194 575 461 ; +C -1 ; WX 577 ; N afii62833 ; B 8 -212 577 319 ; +C -1 ; WX 271 ; N afii62831 ; B -34 -81 271 492 ; +C -1 ; WX 271 ; N afii62832 ; B -34 -81 271 492 ; +C -1 ; WX 541 ; N afii62834 ; B 0 72 525 831 ; +C -1 ; WX 596 ; N afii62835 ; B 0 94 596 831 ; +C -1 ; WX 486 ; N afii62836 ; B 17 72 471 876 ; +C -1 ; WX 541 ; N afii62837 ; B 13 94 541 876 ; +C -1 ; WX 486 ; N afii62838 ; B 17 -120 471 739 ; +C -1 ; WX 541 ; N afii62839 ; B 13 -120 541 766 ; +C -1 ; WX 486 ; N afii62840 ; B 17 72 471 739 ; +C -1 ; WX 541 ; N afii62841 ; B 13 94 541 766 ; +C -1 ; WX 750 ; N glyph1021 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57543-2 ; B 125 0 625 625 ; +C -1 ; WX 201 ; N afii57454-2 ; B 34 683 201 784 ; +C -1 ; WX 201 ; N afii57451-2 ; B 34 683 201 857 ; +C -1 ; WX 750 ; N glyph1025 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1026 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57471-2 ; B 125 0 625 625 ; +C -1 ; WX 165 ; N afii57458-2 ; B 34 683 165 834 ; +C -1 ; WX 211 ; N afii57457-2 ; B 34 683 211 840 ; +C -1 ; WX 750 ; N afii57494-2 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57459-2 ; B 125 0 625 625 ; +C -1 ; WX 209 ; N afii57455-2 ; B 35 683 209 895 ; +C -1 ; WX 237 ; N afii57452-2 ; B 34 683 237 872 ; +C -1 ; WX 750 ; N glyph1034 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1035 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1036 ; B 125 0 625 625 ; +C -1 ; WX 211 ; N afii62884-2 ; B 34 683 211 918 ; +C -1 ; WX 211 ; N afii62881-2 ; B 34 683 211 995 ; +C -1 ; WX 211 ; N afii62886-2 ; B 34 683 211 931 ; +C -1 ; WX 211 ; N afii62883-2 ; B 34 678 211 978 ; +C -1 ; WX 211 ; N afii62885-2 ; B 31 683 211 974 ; +C -1 ; WX 226 ; N afii62882-2 ; B 23 683 226 1010 ; +C -1 ; WX 750 ; N afii57504-2 ; B 125 0 625 625 ; +C -1 ; WX 201 ; N afii57456-2 ; B 34 -60 201 41 ; +C -1 ; WX 201 ; N afii57453-2 ; B 34 -133 201 41 ; +C -1 ; WX 750 ; N glyph1046 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1047 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57543-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57454-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57451-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1051 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1052 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57471-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57458-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57457-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57494-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57459-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57455-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57452-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1060 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1061 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1062 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62884-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62881-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62886-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62883-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62885-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62882-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57504-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57456-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57453-3 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1072 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1073 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57543-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57454-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57451-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1077 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1078 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57471-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57458-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57457-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57494-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57459-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57455-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57452-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1086 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1087 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1088 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62884-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62881-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62886-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62883-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62885-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii62882-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57504-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57456-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N afii57453-4 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1098 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1099 ; B 125 0 625 625 ; +C -1 ; WX 319 ; N glyph1100 ; B 99 137 223 714 ; +C -1 ; WX 319 ; N glyph1101 ; B 97 137 226 267 ; +C -1 ; WX 319 ; N glyph1102 ; B 97 137 225 542 ; +C -1 ; WX 750 ; N glyph1103 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1104 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1105 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1106 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1107 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1108 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1109 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1110 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1111 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1112 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1113 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1114 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1115 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1116 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1117 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1118 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1119 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1120 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1121 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1122 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1123 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1124 ; B 125 0 625 625 ; +C -1 ; WX 750 ; N glyph1125 ; B 125 0 625 625 ; +C -1 ; WX 343 ; N glyph1126 ; B 51 143 343 556 ; +C -1 ; WX 125 ; N afii57440-2 ; B -34 143 125 276 ; +C -1 ; WX 1000 ; N afii57440-3 ; B -34 143 1000 276 ; +C -1 ; WX 2000 ; N afii57440-4 ; B -34 143 2000 276 ; +C -1 ; WX 778 ; N Ohorn ; B 39 -15 794 737 ; +C -1 ; WX 554 ; N ohorn ; B 36 -14 583 510 ; +C -1 ; WX 796 ; N Uhorn ; B 23 -16 836 801 ; +C -1 ; WX 600 ; N uhorn ; B 31 -14 621 474 ; +C -1 ; WX 0 ; N glyph1134 ; B -313 814 -142 891 ; +C -1 ; WX 0 ; N glyph1135 ; B -532 814 -312 891 ; +C -1 ; WX 0 ; N glyph1136 ; B -406 728 -208 891 ; +C -1 ; WX 0 ; N uniF006 ; B -252 814 -84 891 ; +C -1 ; WX 0 ; N uniF007 ; B -398 814 -183 891 ; +C -1 ; WX 0 ; N uniF009 ; B -297 728 -97 891 ; +C -1 ; WX 0 ; N combininghookabove ; B -237 724 -16 891 ; +C -1 ; WX 0 ; N uniF010 ; B -287 814 -105 891 ; +C -1 ; WX 0 ; N uniF013 ; B -352 724 -130 891 ; +C -1 ; WX 0 ; N uniF011 ; B -427 814 -245 891 ; +C -1 ; WX 0 ; N uniF01C ; B -342 748 -26 885 ; +C -1 ; WX 0 ; N uniF015 ; B -488 814 -207 891 ; +C -1 ; WX 0 ; N combiningtildeaccent ; B -398 724 -82 861 ; +C -1 ; WX 0 ; N glyph1147 ; B -129 721 124 792 ; +C -1 ; WX 0 ; N glyph1148 ; B -124 720 124 791 ; +C -1 ; WX 0 ; N uniF02C ; B -200 -212 -38 -50 ; +C -1 ; WX 513 ; N dongsign ; B 74 133 452 662 ; +C -1 ; WX 750 ; N onethird ; B 35 -30 714 676 ; +C -1 ; WX 750 ; N twothirds ; B 12 -30 714 676 ; +C -1 ; WX 0 ; N uniF008 ; B -211 515 -12 679 ; +C -1 ; WX 0 ; N glyph1154 ; B -306 515 -106 679 ; +C -1 ; WX 0 ; N glyph1155 ; B -285 515 -86 679 ; +C -1 ; WX 0 ; N uniF00F ; B -398 515 -200 679 ; +C -1 ; WX 0 ; N uniF012 ; B -239 515 -18 682 ; +C -1 ; WX 0 ; N uniF014 ; B -353 515 -131 682 ; +C -1 ; WX 0 ; N uniF016 ; B -510 748 -194 885 ; +C -1 ; WX 0 ; N uniF017 ; B -545 748 -229 885 ; +C -1 ; WX 0 ; N uniF018 ; B -558 748 -242 885 ; +C -1 ; WX 0 ; N uniF019 ; B -388 532 -72 669 ; +C -1 ; WX 0 ; N uniF01A ; B -450 532 -134 669 ; +C -1 ; WX 0 ; N uniF01B ; B -484 532 -168 669 ; +C -1 ; WX 0 ; N uniF01E ; B -410 -212 -248 -50 ; +C -1 ; WX 0 ; N uniF01F ; B -464 -212 -301 -50 ; +C -1 ; WX 0 ; N uniF020 ; B -464 -212 -301 -50 ; +C -1 ; WX 0 ; N uniF021 ; B -444 -212 -282 -50 ; +C -1 ; WX 0 ; N uniF022 ; B -518 -212 -355 -50 ; +C -1 ; WX 0 ; N combininggraveaccent ; B -285 728 -86 891 ; +C -1 ; WX 0 ; N combiningacuteaccent ; B -192 728 8 891 ; +C -1 ; WX 0 ; N uniF01D ; B -309 532 7 669 ; +C -1 ; WX 0 ; N combiningdotbelow ; B -503 -212 -340 -50 ; +C -1 ; WX 0 ; N uniF023 ; B -317 -212 -155 -50 ; +C -1 ; WX 0 ; N uniF029 ; B -276 -212 -113 -50 ; +C -1 ; WX 0 ; N uniF02A ; B -210 -212 -47 -50 ; +C -1 ; WX 0 ; N uniF02B ; B -439 -212 -276 -50 ; +C -1 ; WX 0 ; N uniF024 ; B -291 -212 -128 -50 ; +C -1 ; WX 0 ; N uniF025 ; B -330 -212 -167 -50 ; +C -1 ; WX 0 ; N uniF026 ; B -384 -212 -221 -50 ; +C -1 ; WX 0 ; N uniF027 ; B -379 -212 -216 -50 ; +C -1 ; WX 0 ; N uniF028 ; B -423 -212 -260 -50 ; +C -1 ; WX 0 ; N uniF02D ; B -477 814 -196 891 ; +C -1 ; WX 0 ; N uniF02E ; B -484 748 -168 885 ; +C -1 ; WX 0 ; N uniF02F ; B -526 814 -245 891 ; +C -1 ; WX 0 ; N uniF030 ; B -536 748 -220 885 ; +C -1 ; WX 278 ; N uniF031 ; B 21 0 267 457 ; +C -1 ; WX 722 ; N Adotbelow ; B 8 -212 711 676 ; +C -1 ; WX 500 ; N adotbelow ; B 45 -212 483 470 ; +C -1 ; WX 722 ; N Ahookabove ; B 8 0 711 891 ; +C -1 ; WX 500 ; N ahookabove ; B 45 -6 483 682 ; +C -1 ; WX 722 ; N Acircumflexacute ; B 8 0 711 891 ; +C -1 ; WX 500 ; N acircumflexacute ; B 45 -6 483 891 ; +C -1 ; WX 722 ; N Acircumflexgrave ; B 8 0 711 891 ; +C -1 ; WX 500 ; N acircumflexgrave ; B 45 -6 483 891 ; +C -1 ; WX 722 ; N Acircumflexhookabove ; B 8 0 711 891 ; +C -1 ; WX 500 ; N acircumflexhookabove ; B 45 -6 483 891 ; +C -1 ; WX 722 ; N Acircumflextilde ; B 8 0 711 891 ; +C -1 ; WX 500 ; N acircumflextilde ; B 45 -6 483 861 ; +C -1 ; WX 722 ; N Acircumflexdotbelow ; B 8 -212 711 791 ; +C -1 ; WX 500 ; N acircumflexdotbelow ; B 45 -212 483 697 ; +C -1 ; WX 722 ; N Abreveacute ; B 8 0 711 891 ; +C -1 ; WX 500 ; N abreveacute ; B 45 -6 483 891 ; +C -1 ; WX 722 ; N Abrevegrave ; B 8 0 711 891 ; +C -1 ; WX 500 ; N abrevegrave ; B 45 -6 483 891 ; +C -1 ; WX 722 ; N Abrevehookabove ; B 8 0 711 891 ; +C -1 ; WX 500 ; N abrevehookabove ; B 45 -6 483 891 ; +C -1 ; WX 722 ; N Abrevetilde ; B 8 0 711 891 ; +C -1 ; WX 500 ; N abrevetilde ; B 45 -6 483 861 ; +C -1 ; WX 722 ; N Abrevedotbelow ; B 8 -212 711 792 ; +C -1 ; WX 500 ; N abrevedotbelow ; B 45 -212 483 677 ; +C -1 ; WX 667 ; N Edotbelow ; B 20 -212 622 662 ; +C -1 ; WX 444 ; N edotbelow ; B 39 -212 420 470 ; +C -1 ; WX 667 ; N Ehookabove ; B 20 0 622 891 ; +C -1 ; WX 444 ; N ehookabove ; B 39 -14 420 682 ; +C -1 ; WX 667 ; N Etilde ; B 20 0 622 857 ; +C -1 ; WX 444 ; N etilde ; B 39 -14 420 670 ; +C -1 ; WX 667 ; N Ecircumflexacute ; B 20 0 622 891 ; +C -1 ; WX 444 ; N ecircumflexacute ; B 39 -14 420 891 ; +C -1 ; WX 667 ; N Ecircumflexgrave ; B 20 0 622 891 ; +C -1 ; WX 444 ; N ecircumflexgrave ; B 39 -14 420 891 ; +C -1 ; WX 667 ; N Ecircumflexhookabove ; B 20 0 622 891 ; +C -1 ; WX 444 ; N ecircumflexhookabove ; B 39 -14 420 891 ; +C -1 ; WX 667 ; N Ecircumflextilde ; B 20 0 622 891 ; +C -1 ; WX 444 ; N ecircumflextilde ; B 39 -14 420 861 ; +C -1 ; WX 667 ; N Ecircumflexdotbelow ; B 20 -212 622 791 ; +C -1 ; WX 444 ; N ecircumflexdotbelow ; B 39 -212 420 697 ; +C -1 ; WX 389 ; N Ihookabove ; B 20 0 366 891 ; +C -1 ; WX 278 ; N ihookabove ; B 21 0 267 682 ; +C -1 ; WX 389 ; N Idotbelow ; B 20 -212 366 662 ; +C -1 ; WX 278 ; N idotbelow ; B 21 -212 267 678 ; +C -1 ; WX 778 ; N Odotbelow ; B 39 -212 742 677 ; +C -1 ; WX 500 ; N odotbelow ; B 36 -212 464 470 ; +C -1 ; WX 778 ; N Ohookabove ; B 39 -15 742 891 ; +C -1 ; WX 500 ; N ohookabove ; B 36 -14 464 682 ; +C -1 ; WX 778 ; N Ocircumflexacute ; B 39 -15 742 891 ; +C -1 ; WX 500 ; N ocircumflexacute ; B 36 -14 464 891 ; +C -1 ; WX 778 ; N Ocircumflexgrave ; B 39 -15 742 891 ; +C -1 ; WX 500 ; N ocircumflexgrave ; B 36 -14 464 891 ; +C -1 ; WX 778 ; N Ocircumflexhookabove ; B 39 -15 742 891 ; +C -1 ; WX 500 ; N ocircumflexhookabove ; B 36 -14 464 891 ; +C -1 ; WX 778 ; N Ocircumflextilde ; B 39 -15 742 891 ; +C -1 ; WX 500 ; N ocircumflextilde ; B 36 -14 464 861 ; +C -1 ; WX 778 ; N Ocircumflexdotbelow ; B 39 -212 742 791 ; +C -1 ; WX 500 ; N ocircumflexdotbelow ; B 36 -212 464 697 ; +C -1 ; WX 778 ; N Ohornacute ; B 39 -15 794 888 ; +C -1 ; WX 554 ; N ohornacute ; B 36 -14 583 685 ; +C -1 ; WX 778 ; N Ohorngrave ; B 39 -15 794 888 ; +C -1 ; WX 554 ; N ohorngrave ; B 36 -14 583 685 ; +C -1 ; WX 778 ; N Ohornhookabove ; B 39 -15 794 891 ; +C -1 ; WX 554 ; N ohornhookabove ; B 36 -14 583 682 ; +C -1 ; WX 778 ; N Ohorntilde ; B 39 -15 794 857 ; +C -1 ; WX 554 ; N ohorntilde ; B 36 -14 583 670 ; +C -1 ; WX 778 ; N Ohorndotbelow ; B 39 -212 794 737 ; +C -1 ; WX 554 ; N ohorndotbelow ; B 36 -212 583 510 ; +C -1 ; WX 722 ; N Udotbelow ; B 23 -212 705 662 ; +C -1 ; WX 556 ; N udotbelow ; B 31 -212 524 457 ; +C -1 ; WX 722 ; N Uhookabove ; B 23 -16 705 891 ; +C -1 ; WX 556 ; N uhookabove ; B 31 -14 524 682 ; +C -1 ; WX 796 ; N Uhornacute ; B 23 -16 836 888 ; +C -1 ; WX 600 ; N uhornacute ; B 31 -14 621 685 ; +C -1 ; WX 796 ; N Uhorngrave ; B 23 -16 836 888 ; +C -1 ; WX 600 ; N uhorngrave ; B 31 -14 621 685 ; +C -1 ; WX 796 ; N Uhornhookabove ; B 23 -16 836 891 ; +C -1 ; WX 600 ; N uhornhookabove ; B 31 -14 621 682 ; +C -1 ; WX 796 ; N Uhorntilde ; B 23 -16 836 857 ; +C -1 ; WX 600 ; N uhorntilde ; B 31 -14 621 670 ; +C -1 ; WX 796 ; N Uhorndotbelow ; B 23 -212 836 801 ; +C -1 ; WX 600 ; N uhorndotbelow ; B 31 -212 621 474 ; +C -1 ; WX 722 ; N Ydotbelow ; B 9 -212 711 662 ; +C -1 ; WX 500 ; N ydotbelow ; B 8 -216 491 457 ; +C -1 ; WX 722 ; N Yhookabove ; B 9 0 711 891 ; +C -1 ; WX 500 ; N yhookabove ; B 8 -216 491 682 ; +C -1 ; WX 722 ; N Ytilde ; B 9 0 711 857 ; +C -1 ; WX 500 ; N ytilde ; B 8 -216 491 670 ; +C -1 ; WX 722 ; N uni01CD ; B 8 0 711 896 ; +C -1 ; WX 500 ; N uni01CE ; B 45 -6 483 697 ; +C -1 ; WX 389 ; N uni01CF ; B 20 0 366 896 ; +C -1 ; WX 278 ; N uni01D0 ; B -12 0 302 697 ; +C -1 ; WX 778 ; N uni01D1 ; B 39 -15 742 896 ; +C -1 ; WX 500 ; N uni01D2 ; B 36 -14 464 697 ; +C -1 ; WX 722 ; N uni01D3 ; B 23 -16 705 896 ; +C -1 ; WX 556 ; N uni01D4 ; B 31 -14 524 697 ; +C -1 ; WX 722 ; N uni01D5 ; B 23 -16 705 891 ; +C -1 ; WX 556 ; N uni01D6 ; B 31 -14 524 764 ; +C -1 ; WX 722 ; N uni01D7 ; B 23 -16 705 891 ; +C -1 ; WX 556 ; N uni01D8 ; B 31 -14 524 829 ; +C -1 ; WX 722 ; N uni01D9 ; B 23 -16 705 891 ; +C -1 ; WX 556 ; N uni01DA ; B 31 -14 524 851 ; +C -1 ; WX 722 ; N uni01DB ; B 23 -16 705 891 ; +C -1 ; WX 556 ; N uni01DC ; B 31 -14 524 829 ; +C -1 ; WX 0 ; N glyph1292 ; B -121 706 121 891 ; +C -1 ; WX 0 ; N glyph1293 ; B -121 706 121 891 ; +C -1 ; WX 0 ; N glyph1294 ; B -121 706 121 891 ; +C -1 ; WX 0 ; N glyph1295 ; B -121 706 121 891 ; +C -1 ; WX 636 ; N uni0492 ; B 17 0 604 662 ; +C -1 ; WX 454 ; N uni0493 ; B 17 0 437 457 ; +C -1 ; WX 989 ; N uni0496 ; B 15 -193 973 670 ; +C -1 ; WX 725 ; N uni0497 ; B 6 -120 719 464 ; +C -1 ; WX 725 ; N uni049A ; B 21 -193 709 670 ; +C -1 ; WX 576 ; N uni049B ; B 35 -120 563 464 ; +C -1 ; WX 725 ; N uni049C ; B 21 0 709 670 ; +C -1 ; WX 576 ; N uni049D ; B 35 0 563 464 ; +C -1 ; WX 778 ; N uni04A2 ; B 21 -193 760 662 ; +C -1 ; WX 576 ; N uni04A3 ; B 34 -120 541 457 ; +C -1 ; WX 722 ; N uni04AE ; B 9 0 711 662 ; +C -1 ; WX 500 ; N uni04AF ; B 9 -214 491 457 ; +C -1 ; WX 722 ; N uni04B0 ; B 9 0 711 662 ; +C -1 ; WX 500 ; N uni04B1 ; B 9 -214 491 457 ; +C -1 ; WX 722 ; N uni04B2 ; B 7 -193 715 662 ; +C -1 ; WX 500 ; N uni04B3 ; B 23 -120 484 457 ; +C -1 ; WX 734 ; N uni04B8 ; B 6 0 713 662 ; +C -1 ; WX 564 ; N uni04B9 ; B 25 0 526 457 ; +C -1 ; WX 734 ; N uni04BA ; B 21 0 728 662 ; +C -1 ; WX 556 ; N uni04BB ; B 34 0 527 662 ; +C -1 ; WX 739 ; N uni018F ; B 39 -15 703 677 ; +C -1 ; WX 444 ; N uni0259 ; B 27 -14 409 470 ; +C -1 ; WX 778 ; N uni04E8 ; B 39 -15 742 671 ; +C -1 ; WX 500 ; N uni04E9 ; B 36 -14 464 470 ; +C -1 ; WX 649 ; N glyph1320 ; B 28 143 649 489 ; +C -1 ; WX 271 ; N glyph1321 ; B -34 143 271 492 ; +C -1 ; WX 305 ; N glyph1322 ; B -34 143 305 637 ; +C -1 ; WX 324 ; N glyph1323 ; B -34 143 324 578 ; +C -1 ; WX 612 ; N glyph1324 ; B 19 -130 612 464 ; +C -1 ; WX 271 ; N glyph1325 ; B 49 -63 222 107 ; +C -1 ; WX 271 ; N glyph1326 ; B 11 -81 264 107 ; +C -1 ; WX 271 ; N glyph1327 ; B 11 -193 264 107 ; +C -1 ; WX 271 ; N glyph1328 ; B 8 -193 261 107 ; +C -1 ; WX 271 ; N glyph1329 ; B 33 -171 238 107 ; +C -1 ; WX 271 ; N glyph1330 ; B -22 -210 295 107 ; +C -1 ; WX 0 ; N glyph1331 ; B -133 519 133 837 ; +C -1 ; WX 207 ; N glyph1332 ; B 7 731 210 891 ; +C -1 ; WX 207 ; N glyph1333 ; B -5 746 179 890 ; +C -1 ; WX 333 ; N glyph1334 ; B 70 605 250 717 ; +C -1 ; WX 333 ; N glyph1335 ; B 70 605 250 717 ; +C -1 ; WX 238 ; N uni0653 ; B 0 765 238 831 ; +C -1 ; WX 217 ; N uni0654 ; B 46 750 181 890 ; +C -1 ; WX 217 ; N uni0655 ; B 46 -119 181 21 ; +C -1 ; WX 0 ; N uni0670 ; B -26 519 29 817 ; +C -1 ; WX 217 ; N uni0671 ; B 7 109 210 891 ; +C -1 ; WX 234 ; N uniFB51 ; B -32 143 234 891 ; +C -1 ; WX 217 ; N uni0672 ; B -5 109 181 890 ; +C -1 ; WX 234 ; N glyph1343 ; B -25 143 234 890 ; +C -1 ; WX 217 ; N uni0673 ; B 14 -84 198 736 ; +C -1 ; WX 234 ; N glyph1345 ; B 4 -84 234 736 ; +C -1 ; WX 217 ; N uni0675 ; B 66 109 298 743 ; +C -1 ; WX 234 ; N glyph47 ; B 13 143 269 743 ; +C -1 ; WX 451 ; N uni0676 ; B 3 -71 498 694 ; +C -1 ; WX 451 ; N glyph1349 ; B 3 -71 498 694 ; +C -1 ; WX 451 ; N uni0677 ; B 3 -71 498 729 ; +C -1 ; WX 451 ; N glyph1351 ; B 3 -71 498 729 ; +C -1 ; WX 645 ; N uni0678 ; B 74 -60 645 694 ; +C -1 ; WX 554 ; N glyph ; B 15 -174 588 499 ; +C -1 ; WX 649 ; N uni0679 ; B 28 143 649 837 ; +C -1 ; WX 649 ; N uniFB67 ; B 28 143 649 837 ; +C -1 ; WX 271 ; N uniFB68 ; B -34 143 271 837 ; +C -1 ; WX 271 ; N uniFB69 ; B -34 143 271 837 ; +C -1 ; WX 649 ; N uni067A ; B 28 143 649 766 ; +C -1 ; WX 649 ; N uniFB5F ; B 28 143 649 766 ; +C -1 ; WX 271 ; N uniFB60 ; B -34 143 271 828 ; +C -1 ; WX 271 ; N uniFB61 ; B -34 143 271 828 ; +C -1 ; WX 649 ; N uni067B ; B 28 -171 649 489 ; +C -1 ; WX 649 ; N uniFB53 ; B 28 -171 649 489 ; +C -1 ; WX 271 ; N uniFB54 ; B -34 -171 271 492 ; +C -1 ; WX 271 ; N uniFB55 ; B -34 -171 271 492 ; +C -1 ; WX 649 ; N uni067C ; B 28 31 649 656 ; +C -1 ; WX 649 ; N glyph1367 ; B 28 31 649 656 ; +C -1 ; WX 271 ; N glyph1368 ; B -34 31 271 715 ; +C -1 ; WX 271 ; N glyph1369 ; B -34 31 271 715 ; +C -1 ; WX 649 ; N uni067D ; B 28 143 649 766 ; +C -1 ; WX 649 ; N glyph1371 ; B 28 143 649 766 ; +C -1 ; WX 271 ; N glyph1372 ; B -34 143 271 828 ; +C -1 ; WX 271 ; N glyph1373 ; B -34 143 271 828 ; +C -1 ; WX 649 ; N uni067F ; B 28 143 649 783 ; +C -1 ; WX 649 ; N uniFB63 ; B 28 143 649 783 ; +C -1 ; WX 271 ; N uniFB64 ; B -34 143 295 844 ; +C -1 ; WX 271 ; N uniFB65 ; B -34 143 295 844 ; +C -1 ; WX 649 ; N uni0680 ; B 28 -210 649 489 ; +C -1 ; WX 649 ; N uniFB5B ; B 28 -210 649 489 ; +C -1 ; WX 271 ; N uniFB5C ; B -34 -210 295 492 ; +C -1 ; WX 271 ; N uniFB5D ; B -34 -210 295 492 ; +C -1 ; WX 577 ; N uni0681 ; B 25 -203 563 733 ; +C -1 ; WX 559 ; N glyph1383 ; B 23 -201 563 733 ; +C -1 ; WX 523 ; N glyph1384 ; B -34 143 523 704 ; +C -1 ; WX 523 ; N glyph1385 ; B -34 143 523 704 ; +C -1 ; WX 577 ; N uni0682 ; B 25 -203 563 854 ; +C -1 ; WX 559 ; N glyph1387 ; B 23 -201 563 854 ; +C -1 ; WX 523 ; N glyph1388 ; B -34 143 523 832 ; +C -1 ; WX 523 ; N glyph1389 ; B -34 143 523 832 ; +C -1 ; WX 577 ; N uni0683 ; B 25 -203 563 527 ; +C -1 ; WX 559 ; N uniFB77 ; B 23 -201 563 527 ; +C -1 ; WX 523 ; N uniFB78 ; B -34 -81 523 501 ; +C -1 ; WX 523 ; N uniFB79 ; B -34 -81 523 501 ; +C -1 ; WX 577 ; N uni0684 ; B 25 -203 563 527 ; +C -1 ; WX 559 ; N uniFB73 ; B 23 -201 563 527 ; +C -1 ; WX 523 ; N uniFB74 ; B -34 -171 523 501 ; +C -1 ; WX 523 ; N uniFB75 ; B -34 -171 523 501 ; +C -1 ; WX 577 ; N uni0685 ; B 25 -203 563 876 ; +C -1 ; WX 559 ; N glyph1399 ; B 23 -201 563 876 ; +C -1 ; WX 523 ; N glyph1400 ; B -34 143 523 854 ; +C -1 ; WX 523 ; N glyph1401 ; B -34 143 523 854 ; +C -1 ; WX 577 ; N uni0687 ; B 25 -203 563 527 ; +C -1 ; WX 559 ; N uniFB7f ; B 23 -201 563 527 ; +C -1 ; WX 523 ; N uniFB80 ; B -34 -210 523 501 ; +C -1 ; WX 523 ; N uniFB81 ; B -34 -210 523 501 ; +C -1 ; WX 343 ; N uni0688 ; B 39 143 343 891 ; +C -1 ; WX 343 ; N uniFB89 ; B 39 143 343 891 ; +C -1 ; WX 343 ; N uni0689 ; B 51 31 343 604 ; +C -1 ; WX 343 ; N glyph1409 ; B 51 31 343 604 ; +C -1 ; WX 343 ; N uni068A ; B 51 -63 343 604 ; +C -1 ; WX 343 ; N glyph1411 ; B 51 -63 343 604 ; +C -1 ; WX 343 ; N uni068B ; B 39 -63 343 891 ; +C -1 ; WX 343 ; N glyph1413 ; B 39 -63 343 891 ; +C -1 ; WX 343 ; N uni068C ; B 50 143 343 849 ; +C -1 ; WX 343 ; N uniFB85 ; B 50 143 343 849 ; +C -1 ; WX 343 ; N uni068D ; B 51 -81 343 604 ; +C -1 ; WX 343 ; N uniFB83 ; B 51 -81 343 604 ; +C -1 ; WX 343 ; N uni068E ; B 51 143 343 888 ; +C -1 ; WX 343 ; N uniFB87 ; B 51 143 343 888 ; +C -1 ; WX 343 ; N uni068F ; B 23 143 343 888 ; +C -1 ; WX 343 ; N glyph1421 ; B 23 143 343 888 ; +C -1 ; WX 343 ; N uni0690 ; B 17 143 343 888 ; +C -1 ; WX 343 ; N glyph1423 ; B 17 143 343 888 ; +C -1 ; WX 433 ; N uni0691 ; B 5 -72 433 837 ; +C -1 ; WX 433 ; N uniFB8D ; B 5 -72 433 837 ; +C -1 ; WX 433 ; N uni0692 ; B 5 -72 433 631 ; +C -1 ; WX 433 ; N glyph1426 ; B 5 -72 433 631 ; +C -1 ; WX 433 ; N uni0693 ; B 5 -99 458 461 ; +C -1 ; WX 433 ; N glyph1429 ; B 5 -99 458 461 ; +C -1 ; WX 433 ; N uni0694 ; B 5 -180 505 461 ; +C -1 ; WX 433 ; N glyph1431 ; B 5 -180 505 461 ; +C -1 ; WX 433 ; N uni0695 ; B 5 -196 494 461 ; +C -1 ; WX 433 ; N glyph1433 ; B 5 -196 494 461 ; +C -1 ; WX 433 ; N uni0696 ; B 5 -180 505 461 ; +C -1 ; WX 433 ; N glyph1435 ; B 5 -180 505 461 ; +C -1 ; WX 433 ; N uni0697 ; B 5 -72 447 700 ; +C -1 ; WX 433 ; N glyph1437 ; B 5 -72 447 700 ; +C -1 ; WX 433 ; N uni0699 ; B 5 -72 447 830 ; +C -1 ; WX 433 ; N glyph1439 ; B 5 -72 447 830 ; +C -1 ; WX 899 ; N uni069A ; B 31 -63 899 634 ; +C -1 ; WX 899 ; N glyph1441 ; B 31 -63 899 634 ; +C -1 ; WX 608 ; N glyph1442 ; B -34 -63 608 634 ; +C -1 ; WX 608 ; N glyph1443 ; B -34 -63 608 634 ; +C -1 ; WX 899 ; N uni069B ; B 31 -193 899 458 ; +C -1 ; WX 899 ; N glyph1445 ; B 31 -193 899 458 ; +C -1 ; WX 608 ; N glyph1446 ; B -34 -193 608 446 ; +C -1 ; WX 608 ; N glyph1447 ; B -34 -193 608 446 ; +C -1 ; WX 899 ; N uni069C ; B 31 -193 899 774 ; +C -1 ; WX 899 ; N glyph1449 ; B 31 -193 899 774 ; +C -1 ; WX 608 ; N glyph1450 ; B -34 -193 608 774 ; +C -1 ; WX 608 ; N glyph1451 ; B -34 -193 608 774 ; +C -1 ; WX 1063 ; N uni069D ; B 31 -81 1063 504 ; +C -1 ; WX 1063 ; N glyph1453 ; B 31 -81 1063 504 ; +C -1 ; WX 771 ; N glyph1454 ; B -34 -81 771 504 ; +C -1 ; WX 771 ; N glyph1455 ; B -34 -81 771 504 ; +C -1 ; WX 1063 ; N uni069E ; B 31 -63 1063 820 ; +C -1 ; WX 1063 ; N glyph1457 ; B 31 -63 1063 820 ; +C -1 ; WX 771 ; N glyph1458 ; B -34 143 771 820 ; +C -1 ; WX 771 ; N glyph1459 ; B -34 143 771 820 ; +C -1 ; WX 523 ; N uni069F ; B -34 143 523 858 ; +C -1 ; WX 523 ; N glyph1461 ; B -34 143 523 858 ; +C -1 ; WX 541 ; N uni06A0 ; B 25 -204 535 891 ; +C -1 ; WX 469 ; N glyph1463 ; B 34 -198 516 878 ; +C -1 ; WX 541 ; N glyph1464 ; B -34 143 483 891 ; +C -1 ; WX 360 ; N glyph1465 ; B -34 143 360 852 ; +C -1 ; WX 758 ; N uni06A1 ; B 23 127 758 549 ; +C -1 ; WX 758 ; N uni06A2 ; B 23 -63 758 549 ; +C -1 ; WX 758 ; N glyph1468 ; B 23 -63 758 549 ; +C -1 ; WX 305 ; N glyph1469 ; B -34 -63 305 637 ; +C -1 ; WX 324 ; N glyph1470 ; B -34 -63 324 578 ; +C -1 ; WX 758 ; N uni06A3 ; B 23 -63 758 779 ; +C -1 ; WX 758 ; N glyph1472 ; B 23 -63 758 779 ; +C -1 ; WX 305 ; N glyph1473 ; B -34 -63 305 850 ; +C -1 ; WX 324 ; N glyph1474 ; B -34 -63 324 784 ; +C -1 ; WX 758 ; N uni06A4 ; B 23 127 758 872 ; +C -1 ; WX 758 ; N uniFB6B ; B 23 127 758 872 ; +C -1 ; WX 305 ; N uniFB6C ; B -34 143 305 811 ; +C -1 ; WX 324 ; N uniFB6D ; B -34 143 324 891 ; +C -1 ; WX 758 ; N uni06A5 ; B 23 -193 758 549 ; +C -1 ; WX 758 ; N glyph1480 ; B 23 -193 758 549 ; +C -1 ; WX 305 ; N glyph1481 ; B -34 -193 305 637 ; +C -1 ; WX 324 ; N glyph1482 ; B -34 -193 324 578 ; +C -1 ; WX 758 ; N uni06A6 ; B 23 127 758 883 ; +C -1 ; WX 758 ; N uniFB6F ; B 23 127 758 883 ; +C -1 ; WX 305 ; N uniFB70 ; B -34 143 305 864 ; +C -1 ; WX 324 ; N uniFB71 ; B -34 143 324 891 ; +C -1 ; WX 612 ; N uni06A7 ; B 19 -130 612 683 ; +C -1 ; WX 612 ; N glyph1488 ; B 19 -130 612 683 ; +C -1 ; WX 612 ; N uni06A8 ; B 19 -130 612 771 ; +C -1 ; WX 612 ; N glyph1490 ; B 19 -130 612 771 ; +C -1 ; WX 757 ; N uni06AA ; B 20 143 757 674 ; +C -1 ; WX 879 ; N glyph1492 ; B 20 143 879 674 ; +C -1 ; WX 360 ; N glyph1493 ; B -34 143 360 674 ; +C -1 ; WX 542 ; N glyph1494 ; B -34 143 542 674 ; +C -1 ; WX 757 ; N uni06AB ; B 20 143 760 708 ; +C -1 ; WX 879 ; N glyph1496 ; B 20 143 879 722 ; +C -1 ; WX 360 ; N glyph1497 ; B -34 143 360 708 ; +C -1 ; WX 542 ; N glyph1498 ; B -34 143 542 722 ; +C -1 ; WX 541 ; N uni06AC ; B 20 143 541 891 ; +C -1 ; WX 541 ; N glyph1500 ; B 20 143 541 891 ; +C -1 ; WX 360 ; N glyph1501 ; B -34 143 360 878 ; +C -1 ; WX 360 ; N glyph1502 ; B -34 143 360 878 ; +C -1 ; WX 541 ; N uni06AD ; B 20 143 541 859 ; +C -1 ; WX 541 ; N uniFBD4 ; B 20 143 541 859 ; +C -1 ; WX 360 ; N uniFBD5 ; B -34 143 360 811 ; +C -1 ; WX 360 ; N uniFBD6 ; B -34 143 360 811 ; +C -1 ; WX 541 ; N uni06AE ; B 20 -193 541 774 ; +C -1 ; WX 541 ; N glyph1508 ; B 20 -193 541 774 ; +C -1 ; WX 360 ; N glyph1509 ; B -34 -193 360 708 ; +C -1 ; WX 360 ; N glyph1510 ; B -34 -193 360 708 ; +C -1 ; WX 757 ; N uni06B0 ; B 20 143 760 863 ; +C -1 ; WX 879 ; N glyph1512 ; B 20 143 879 876 ; +C -1 ; WX 360 ; N glyph1513 ; B -34 143 360 863 ; +C -1 ; WX 542 ; N glyph1514 ; B -34 143 542 876 ; +C -1 ; WX 757 ; N uni06B1 ; B 20 143 757 891 ; +C -1 ; WX 879 ; N uniFB9B ; B 20 143 879 891 ; +C -1 ; WX 360 ; N uniFB9C ; B -34 143 360 891 ; +C -1 ; WX 542 ; N uniFB9D ; B -34 143 542 891 ; +C -1 ; WX 757 ; N uni06B2 ; B 20 -81 757 863 ; +C -1 ; WX 879 ; N glyph1520 ; B 20 -81 879 876 ; +C -1 ; WX 360 ; N glyph1521 ; B -34 -81 360 863 ; +C -1 ; WX 542 ; N glyph1522 ; B -34 -81 542 876 ; +C -1 ; WX 757 ; N uni06B3 ; B 20 -171 757 863 ; +C -1 ; WX 879 ; N uniFB97 ; B 20 -171 879 876 ; +C -1 ; WX 360 ; N uniFB98 ; B -34 -171 360 863 ; +C -1 ; WX 542 ; N uniFB99 ; B -34 -171 542 876 ; +C -1 ; WX 757 ; N uni06B4 ; B 20 143 757 891 ; +C -1 ; WX 879 ; N glyph1528 ; B 20 143 879 891 ; +C -1 ; WX 360 ; N glyph1529 ; B -34 143 360 891 ; +C -1 ; WX 542 ; N glyph1530 ; B -34 143 542 891 ; +C -1 ; WX 451 ; N uni06B5 ; B 17 -36 451 891 ; +C -1 ; WX 451 ; N glyph1532 ; B 17 -36 451 891 ; +C -1 ; WX 234 ; N glyph1533 ; B -34 143 234 891 ; +C -1 ; WX 234 ; N glyph1534 ; B -34 143 234 891 ; +C -1 ; WX 451 ; N uni06B6 ; B 17 -36 451 891 ; +C -1 ; WX 451 ; N glyph1536 ; B 17 -36 451 891 ; +C -1 ; WX 234 ; N glyph1537 ; B -39 143 234 891 ; +C -1 ; WX 234 ; N glyph1538 ; B -39 143 234 891 ; +C -1 ; WX 451 ; N uni06B7 ; B 17 -36 451 891 ; +C -1 ; WX 451 ; N glyph1540 ; B 17 -36 451 891 ; +C -1 ; WX 234 ; N glyph1541 ; B -34 143 234 891 ; +C -1 ; WX 234 ; N glyph1542 ; B -34 143 234 891 ; +C -1 ; WX 451 ; N uni06B8 ; B 17 -168 451 773 ; +C -1 ; WX 451 ; N glyph1544 ; B 17 -168 451 773 ; +C -1 ; WX 234 ; N glyph1545 ; B -34 -193 242 774 ; +C -1 ; WX 234 ; N glyph1546 ; B -34 -193 242 774 ; +C -1 ; WX 541 ; N uni06B9 ; B 30 -212 541 612 ; +C -1 ; WX 541 ; N glyph1548 ; B 30 -212 541 612 ; +C -1 ; WX 271 ; N glyph1549 ; B -34 -63 274 735 ; +C -1 ; WX 271 ; N glyph1550 ; B -34 -63 274 735 ; +C -1 ; WX 541 ; N uni06BA ; B 30 -63 541 458 ; +C -1 ; WX 541 ; N uniFB9F ; B 30 -63 541 458 ; +C -1 ; WX 541 ; N uni06BB ; B 30 -63 541 798 ; +C -1 ; WX 541 ; N uniFBA1 ; B 30 -63 541 798 ; +C -1 ; WX 541 ; N uni06BC ; B 30 -175 541 612 ; +C -1 ; WX 541 ; N glyph1556 ; B 30 -175 541 612 ; +C -1 ; WX 271 ; N glyph1557 ; B -34 31 274 735 ; +C -1 ; WX 271 ; N glyph1558 ; B -34 31 274 735 ; +C -1 ; WX 541 ; N uni06BD ; B 30 -63 541 742 ; +C -1 ; WX 541 ; N glyph1560 ; B 30 -63 541 742 ; +C -1 ; WX 577 ; N uni06BF ; B 25 -203 563 746 ; +C -1 ; WX 559 ; N glyph1562 ; B 23 -201 563 746 ; +C -1 ; WX 523 ; N glyph1563 ; B -34 -193 523 724 ; +C -1 ; WX 523 ; N glyph1564 ; B -34 -193 523 724 ; +C -1 ; WX 343 ; N uni06C0 ; B 43 126 304 694 ; +C -1 ; WX 415 ; N uniFBA5 ; B 1 143 415 743 ; +C -1 ; WX 388 ; N uni06C1 ; B 13 68 388 376 ; +C -1 ; WX 388 ; N uni06C2 ; B 13 68 388 597 ; +C -1 ; WX 388 ; N uni06C3 ; B 13 68 388 634 ; +C -1 ; WX 451 ; N uni06C4 ; B 3 -71 451 484 ; +C -1 ; WX 451 ; N glyph1571 ; B 3 -71 451 484 ; +C -1 ; WX 451 ; N uni06C5 ; B 3 -71 451 484 ; +C -1 ; WX 451 ; N uniFBE1 ; B 3 -71 451 484 ; +C -1 ; WX 451 ; N uni06C6 ; B 3 -71 451 667 ; +C -1 ; WX 451 ; N uniFBDA ; B 3 -71 451 667 ; +C -1 ; WX 451 ; N uni06C7 ; B 3 -71 451 778 ; +C -1 ; WX 451 ; N uniFBD8 ; B 3 -71 451 778 ; +C -1 ; WX 451 ; N uni06C8 ; B 3 -71 451 817 ; +C -1 ; WX 451 ; N uniFBDC ; B 3 -71 451 817 ; +C -1 ; WX 451 ; N uni06C9 ; B 3 -71 451 667 ; +C -1 ; WX 451 ; N uniFBE3 ; B 3 -71 451 667 ; +C -1 ; WX 451 ; N uni06CA ; B 3 -71 451 699 ; +C -1 ; WX 451 ; N glyph1583 ; B 3 -71 451 699 ; +C -1 ; WX 451 ; N uni06CB ; B 3 -71 451 816 ; +C -1 ; WX 451 ; N uniFBDF ; B 3 -71 451 816 ; +C -1 ; WX 645 ; N uni06CD ; B 32 -60 575 461 ; +C -1 ; WX 554 ; N glyph1587 ; B -19 -174 554 276 ; +C -1 ; WX 645 ; N uni06CE ; B 74 -60 575 522 ; +C -1 ; WX 554 ; N glyph1589 ; B 15 -174 588 424 ; +C -1 ; WX 271 ; N glyph1590 ; B -34 -81 271 667 ; +C -1 ; WX 271 ; N glyph1591 ; B -34 -81 271 667 ; +C -1 ; WX 451 ; N uni06CF ; B 3 -71 451 724 ; +C -1 ; WX 451 ; N glyph1593 ; B 3 -71 451 724 ; +C -1 ; WX 645 ; N uni06D0 ; B 74 -187 575 461 ; +C -1 ; WX 554 ; N uniFBE5 ; B 5 -212 554 282 ; +C -1 ; WX 271 ; N uniFBE6 ; B -34 -171 271 492 ; +C -1 ; WX 271 ; N uniFBE7 ; B -34 -171 271 492 ; +C -1 ; WX 645 ; N uni06D1 ; B 74 -178 575 461 ; +C -1 ; WX 554 ; N glyph1599 ; B 5 -212 554 282 ; +C -1 ; WX 812 ; N uni06D2 ; B 33 -25 812 469 ; +C -1 ; WX 812 ; N uniFBAF ; B 34 -208 812 276 ; +C -1 ; WX 812 ; N uni06D3 ; B 33 -25 812 597 ; +C -1 ; WX 812 ; N uniFBB1 ; B 34 -208 812 499 ; +C -1 ; WX 207 ; N uni06D4 ; B 20 143 188 276 ; +C -1 ; WX 0 ; N uni06D6 ; B -230 519 231 886 ; +C -1 ; WX 0 ; N uni06D7 ; B -182 519 183 886 ; +C -1 ; WX 0 ; N uni06D8 ; B -107 519 107 675 ; +C -1 ; WX 0 ; N uni06D9 ; B -108 519 108 836 ; +C -1 ; WX 0 ; N uni06DA ; B -128 519 128 866 ; +C -1 ; WX 0 ; N uni06DB ; B -65 519 68 660 ; +C -1 ; WX 0 ; N uni06DC ; B -207 519 207 767 ; +C -1 ; WX 1123 ; N uni06DD ; B 24 -188 1099 886 ; +C -1 ; WX 1084 ; N uni06DE ; B 24 -152 1060 884 ; +C -1 ; WX 0 ; N uni06DF ; B -37 519 37 592 ; +C -1 ; WX 0 ; N uni06E0 ; B -36 519 36 591 ; +C -1 ; WX 0 ; N uni06E1 ; B -133 519 133 689 ; +C -1 ; WX 0 ; N uni06E2 ; B -82 519 82 824 ; +C -1 ; WX 0 ; N uni06E3 ; B -207 -209 207 39 ; +C -1 ; WX 0 ; N uni06E4 ; B -57 519 57 550 ; +C -1 ; WX 213 ; N uni06E5 ; B 0 519 213 783 ; +C -1 ; WX 371 ; N uni06E6 ; B 0 519 371 754 ; +C -1 ; WX 0 ; N uni06E7 ; B -185 519 186 754 ; +C -1 ; WX 0 ; N uni06E8 ; B -122 519 122 840 ; +C -1 ; WX 600 ; N uni06E9 ; B 24 0 576 818 ; +C -1 ; WX 0 ; N uni06EA ; B -82 -165 82 -1 ; +C -1 ; WX 0 ; N uni06EB ; B -82 519 82 683 ; +C -1 ; WX 0 ; N uni06ED ; B -82 -209 82 97 ; +C -1 ; WX 899 ; N uni06FA ; B 31 -63 899 774 ; +C -1 ; WX 899 ; N glyph1629 ; B 31 -63 899 774 ; +C -1 ; WX 608 ; N glyph1630 ; B -34 -63 608 774 ; +C -1 ; WX 608 ; N glyph1631 ; B -34 -63 608 774 ; +C -1 ; WX 1063 ; N uni06FB ; B 31 -63 1063 728 ; +C -1 ; WX 1063 ; N glyph1633 ; B 31 -63 1063 728 ; +C -1 ; WX 771 ; N glyph1634 ; B -34 -63 771 728 ; +C -1 ; WX 771 ; N glyph1635 ; B -34 -63 771 728 ; +C -1 ; WX 541 ; N uni06FC ; B 25 -204 535 822 ; +C -1 ; WX 469 ; N glyph1637 ; B 34 -198 516 760 ; +C -1 ; WX 541 ; N glyph1638 ; B -34 -63 483 800 ; +C -1 ; WX 360 ; N glyph1639 ; B -34 -63 360 756 ; +C -1 ; WX 469 ; N uni06FD ; B 62 -145 422 510 ; +C -1 ; WX 360 ; N uni06FE ; B 16 -212 360 431 ; +C -1 ; WX 343 ; N uniFBA6 ; B 43 126 304 519 ; +C -1 ; WX 271 ; N uniFBA8 ; B -34 -134 271 492 ; +C -1 ; WX 320 ; N uniFBA9 ; B -34 -205 320 395 ; +C -1 ; WX 244 ; N glyph1645 ; B 23 -68 222 49 ; +C -1 ; WX 244 ; N glyph1646 ; B 29 -151 226 -20 ; +C -1 ; WX 244 ; N glyph1647 ; B 9 -136 236 59 ; +C -1 ; WX 244 ; N glyph1648 ; B 86 -64 162 34 ; +C -1 ; WX 244 ; N glyph1649 ; B 53 -70 197 27 ; +C -1 ; WX 757 ; N glyph1650 ; B 20 143 757 811 ; +C -1 ; WX 879 ; N glyph1651 ; B 20 143 879 811 ; +C -1 ; WX 311 ; N uniFB1D ; B 27 40 272 553 ; +C -1 ; WX 0 ; N uniFB1E ; B -148 596 147 752 ; +C -1 ; WX 414 ; N glyph1654 ; B 0 72 414 123 ; +C -1 ; WX 621 ; N uniFB1F ; B 27 72 583 553 ; +C -1 ; WX 486 ; N glyph1656 ; B -5 72 471 890 ; +C -1 ; WX 541 ; N glyph1657 ; B -5 94 541 890 ; +C -1 ; WX 486 ; N glyph1658 ; B 17 -122 471 739 ; +C -1 ; WX 541 ; N glyph1659 ; B 13 -122 541 766 ; +C -1 ; WX 486 ; N glyph1660 ; B 17 72 471 792 ; +C -1 ; WX 541 ; N glyph1661 ; B 13 94 541 792 ; +C -1 ; WX 486 ; N glyph1662 ; B 17 72 484 891 ; +C -1 ; WX 541 ; N glyph1663 ; B 13 94 541 891 ; +C -1 ; WX 486 ; N glyph1664 ; B 17 72 491 891 ; +C -1 ; WX 541 ; N glyph1665 ; B 13 94 541 891 ; +C -1 ; WX 486 ; N glyph1666 ; B 17 72 471 891 ; +C -1 ; WX 541 ; N glyph1667 ; B 13 94 541 891 ; +C -1 ; WX 486 ; N glyph1668 ; B 17 -173 471 739 ; +C -1 ; WX 541 ; N glyph1669 ; B 13 -136 541 766 ; +C -1 ; WX 562 ; N glyph1670 ; B 56 143 505 713 ; +C -1 ; WX 562 ; N glyph1671 ; B 92 89 469 713 ; +C -1 ; WX 486 ; N glyph1672 ; B 7 72 471 891 ; +C -1 ; WX 541 ; N glyph1673 ; B 7 94 541 891 ; +EndCharMetrics +StartKernData +StartKernPairs 865 +KPX space A -55 +KPX space T -18 +KPX space V -18 +KPX space W -18 +KPX space Y -37 +KPX space Alphatonos -55 +KPX space Alpha -55 +KPX space Delta -55 +KPX space Lambda -55 +KPX space Tau -18 +KPX space Upsilon -37 +KPX space Upsilondieresis -37 +KPX one one -55 +KPX A space -55 +KPX A T -74 +KPX A V -129 +KPX A W -111 +KPX A Y -92 +KPX A v -74 +KPX A w -74 +KPX A y -74 +KPX A quoteright -74 +KPX F space -37 +KPX F comma -92 +KPX F period -92 +KPX F A -74 +KPX L space -55 +KPX L T -92 +KPX L V -92 +KPX L W -92 +KPX L Y -92 +KPX L y -55 +KPX L quoteright -92 +KPX P space -55 +KPX P comma -92 +KPX P period -92 +KPX P A -74 +KPX R T -35 +KPX R V -35 +KPX R W -35 +KPX R Y -35 +KPX R y -35 +KPX T space -18 +KPX T comma -74 +KPX T hyphen -92 +KPX T period -74 +KPX T colon -74 +KPX T semicolon -74 +KPX T A -74 +KPX T O -18 +KPX T a -92 +KPX T c -92 +KPX T e -92 +KPX T i -18 +KPX T o -92 +KPX T r -74 +KPX T s -92 +KPX T u -92 +KPX T w -74 +KPX T y -74 +KPX V space -18 +KPX V comma -129 +KPX V hyphen -74 +KPX V period -129 +KPX V colon -92 +KPX V semicolon -92 +KPX V A -129 +KPX V O -20 +KPX V a -92 +KPX V e -92 +KPX V i -37 +KPX V o -92 +KPX V r -74 +KPX V u -92 +KPX V y -92 +KPX W space -18 +KPX W comma -92 +KPX W hyphen -37 +KPX W period -92 +KPX W colon -55 +KPX W semicolon -55 +KPX W A -111 +KPX W a -55 +KPX W e -55 +KPX W i -18 +KPX W o -55 +KPX W r -18 +KPX W u -18 +KPX W y -37 +KPX Y space -37 +KPX Y comma -92 +KPX Y hyphen -92 +KPX Y period -92 +KPX Y colon -92 +KPX Y semicolon -92 +KPX Y A -92 +KPX Y a -111 +KPX Y e -111 +KPX Y i -37 +KPX Y o -111 +KPX Y p -92 +KPX Y q -111 +KPX Y u -92 +KPX Y v -111 +KPX f quoteright 55 +KPX r space -18 +KPX r comma -92 +KPX r hyphen -37 +KPX r period -92 +KPX r c -18 +KPX r e -18 +KPX r o -18 +KPX r q -18 +KPX r quoteright 18 +KPX v comma -55 +KPX v period -55 +KPX w comma -55 +KPX w period -55 +KPX y comma -55 +KPX y period -55 +KPX quoteleft quoteleft -74 +KPX quoteright space -74 +KPX quoteright s -37 +KPX quoteright quoteright -74 +KPX quotesinglbase afii10051 -100 +KPX quotesinglbase afii10060 -100 +KPX quotesinglbase afii10036 -100 +KPX quotesinglbase afii10041 -188 +KPX quotesinglbase afii10044 -100 +KPX quotedblbase afii10051 -100 +KPX quotedblbase afii10060 -100 +KPX quotedblbase afii10036 -100 +KPX quotedblbase afii10041 -188 +KPX quotedblbase afii10044 -100 +KPX Gamma space -37 +KPX Gamma comma -121 +KPX Gamma period -121 +KPX Gamma iotadieresistonos 68 +KPX Gamma Alpha -132 +KPX Gamma Delta -119 +KPX Gamma Lambda -132 +KPX Gamma iota -34 +KPX Theta Alpha -73 +KPX Theta Delta -34 +KPX Theta Lambda -73 +KPX Theta Upsilon -26 +KPX Theta Upsilondieresis -26 +KPX Phi Alpha -87 +KPX Phi Upsilon -13 +KPX Phi Upsilondieresis -13 +KPX delta chi -12 +KPX phi chi -12 +KPX Alphatonos space -55 +KPX Alphatonos Theta -58 +KPX Alphatonos Phi -73 +KPX Alphatonos Omicron -58 +KPX Alphatonos Tau -97 +KPX Alphatonos Upsilon -128 +KPX Alphatonos Upsilondieresis -128 +KPX Alphatonos gamma -63 +KPX Alphatonos nu -74 +KPX Alphatonos chi -39 +KPX Omicrontonos Upsilon -26 +KPX Omicrontonos Upsilondieresis -26 +KPX Upsilontonos alpha -110 +KPX Upsilontonos delta -110 +KPX Upsilontonos sigma -110 +KPX Upsilontonos phi -110 +KPX Upsilontonos iotadieresistonos 53 +KPX Upsilontonos Alpha -134 +KPX Upsilontonos Delta -116 +KPX Upsilontonos Lambda -134 +KPX Upsilontonos alphatonos -110 +KPX Upsilontonos etatonos -43 +KPX Upsilontonos iotatonos -37 +KPX Upsilontonos eta -43 +KPX Upsilontonos iota -43 +KPX Upsilontonos kappa -43 +KPX Upsilontonos mu -97 +KPX Upsilontonos omicron -110 +KPX Upsilontonos omicrontonos -110 +KPX Alpha space -55 +KPX Alpha quoteright -74 +KPX Alpha Theta -58 +KPX Alpha Phi -73 +KPX Alpha Omicron -58 +KPX Alpha Tau -97 +KPX Alpha Upsilon -128 +KPX Alpha Upsilondieresis -128 +KPX Alpha gamma -63 +KPX Alpha nu -74 +KPX Alpha chi -39 +KPX Delta space -55 +KPX Delta Theta -26 +KPX Delta Omicron -24 +KPX Delta Tau -70 +KPX Delta Upsilon -98 +KPX Delta Upsilondieresis -98 +KPX Kappa Theta -43 +KPX Kappa Phi -80 +KPX Kappa alpha -19 +KPX Kappa delta -19 +KPX Kappa sigma -19 +KPX Kappa phi -19 +KPX Kappa Omicron -43 +KPX Kappa alphatonos -19 +KPX Kappa zeta -19 +KPX Kappa theta -19 +KPX Kappa xi -19 +KPX Kappa omicron -19 +KPX Kappa omega -19 +KPX Kappa omicrontonos -19 +KPX Kappa omegatonos -19 +KPX Lambda Theta -58 +KPX Lambda Omicron -58 +KPX Lambda Tau -97 +KPX Lambda Upsilon -128 +KPX Lambda Upsilondieresis -128 +KPX Omicron Alpha -73 +KPX Omicron Delta -34 +KPX Omicron Lambda -73 +KPX Omicron Upsilon -26 +KPX Omicron Upsilondieresis -26 +KPX Rho space -55 +KPX Rho comma -91 +KPX Rho period -91 +KPX Rho Alpha -147 +KPX Rho Delta -102 +KPX Rho Lambda -147 +KPX Sigma tau -48 +KPX Tau space -18 +KPX Tau comma -74 +KPX Tau hyphen -91 +KPX Tau period -74 +KPX Tau colon -74 +KPX Tau semicolon -74 +KPX Tau Theta -18 +KPX Tau Phi -18 +KPX Tau alpha -91 +KPX Tau delta -80 +KPX Tau epsilon -91 +KPX Tau sigma -91 +KPX Tau phi -91 +KPX Tau iotadieresistonos 58 +KPX Tau Alpha -97 +KPX Tau Delta -72 +KPX Tau Lambda -97 +KPX Tau Omicron -18 +KPX Tau Omega -18 +KPX Tau alphatonos -91 +KPX Tau epsilontonos -91 +KPX Tau gamma -74 +KPX Tau eta -52 +KPX Tau iota -18 +KPX Tau mu -52 +KPX Tau nu -74 +KPX Tau omicron -91 +KPX Tau upsilon -53 +KPX Tau chi -74 +KPX Tau psi -52 +KPX Tau upsilondieresis -52 +KPX Tau omicrontonos -91 +KPX Tau upsilontonos -52 +KPX Upsilon comma -91 +KPX Upsilon hyphen -91 +KPX Upsilon period -91 +KPX Upsilon colon -91 +KPX Upsilon semicolon -91 +KPX Upsilon Theta -36 +KPX Upsilon Phi -43 +KPX Upsilon alpha -110 +KPX Upsilon delta -110 +KPX Upsilon sigma -110 +KPX Upsilon phi -110 +KPX Upsilon iotadieresistonos 53 +KPX Upsilon Alpha -134 +KPX Upsilon Delta -116 +KPX Upsilon Lambda -134 +KPX Upsilon Omicron -36 +KPX Upsilon Omega -26 +KPX Upsilon alphatonos -110 +KPX Upsilon etatonos -43 +KPX Upsilon iotatonos -37 +KPX Upsilon gamma -73 +KPX Upsilon eta -43 +KPX Upsilon iota -37 +KPX Upsilon kappa -43 +KPX Upsilon mu -97 +KPX Upsilon omicron -110 +KPX Upsilon omicrontonos -110 +KPX Chi omega -19 +KPX Chi omegatonos -19 +KPX Psi alpha -58 +KPX Psi delta -58 +KPX Psi sigma -58 +KPX Psi phi -58 +KPX Psi alphatonos -58 +KPX Psi theta -19 +KPX Psi omicron -58 +KPX Psi omega -58 +KPX Psi omicrontonos -58 +KPX Psi omegatonos -58 +KPX Omega Upsilon -13 +KPX Omega Upsilondieresis -13 +KPX Upsilondieresis Theta -36 +KPX Upsilondieresis Phi -43 +KPX Upsilondieresis alpha -110 +KPX Upsilondieresis delta -110 +KPX Upsilondieresis sigma -110 +KPX Upsilondieresis phi -110 +KPX Upsilondieresis iotadieresistonos 53 +KPX Upsilondieresis Alpha -134 +KPX Upsilondieresis Delta -116 +KPX Upsilondieresis Lambda -134 +KPX Upsilondieresis Omicron -36 +KPX Upsilondieresis Omega -26 +KPX Upsilondieresis alphatonos -110 +KPX Upsilondieresis etatonos -43 +KPX Upsilondieresis iotatonos -37 +KPX Upsilondieresis eta -43 +KPX Upsilondieresis iota -43 +KPX Upsilondieresis kappa -43 +KPX Upsilondieresis mu -97 +KPX Upsilondieresis omicron -110 +KPX Upsilondieresis omicrontonos -110 +KPX zeta alpha -34 +KPX zeta delta -34 +KPX zeta sigma -34 +KPX zeta tau -68 +KPX zeta phi -34 +KPX zeta alphatonos -34 +KPX zeta etatonos -29 +KPX zeta gamma -58 +KPX zeta eta -29 +KPX zeta theta -34 +KPX zeta iota -24 +KPX zeta kappa -24 +KPX zeta nu -58 +KPX zeta omicron -34 +KPX zeta omega -34 +KPX zeta omicrontonos -34 +KPX zeta omegatonos -34 +KPX kappa alpha -29 +KPX kappa delta -29 +KPX kappa sigma -29 +KPX kappa phi -29 +KPX kappa alphatonos -29 +KPX kappa theta -14 +KPX kappa omicron -29 +KPX kappa sigma1 -29 +KPX kappa omega -29 +KPX kappa omicrontonos -29 +KPX kappa omegatonos -29 +KPX lambda upsilondieresistonos -14 +KPX lambda upsilon -14 +KPX lambda upsilondieresis -14 +KPX lambda upsilontonos -14 +KPX xi alpha -43 +KPX xi delta -43 +KPX xi sigma -43 +KPX xi phi -43 +KPX xi alphatonos -43 +KPX xi etatonos -22 +KPX xi zeta -19 +KPX xi eta -22 +KPX xi omicron -43 +KPX xi omicrontonos -43 +KPX omicron chi -12 +KPX chi alpha -29 +KPX chi delta -29 +KPX chi sigma -29 +KPX chi phi -29 +KPX chi alphatonos -29 +KPX chi xi -30 +KPX chi omicron -29 +KPX chi sigma1 -29 +KPX chi omega -29 +KPX chi omicrontonos -29 +KPX chi omegatonos -29 +KPX omega chi -12 +KPX omicrontonos chi -12 +KPX omegatonos chi -12 +KPX afii10052 comma -138 +KPX afii10052 period -138 +KPX afii10052 guillemotleft -63 +KPX afii10052 guillemotright -25 +KPX afii10052 emdash -25 +KPX afii10058 quoteright -50 +KPX afii10059 quoteright -50 +KPX afii10017 quoteright -88 +KPX afii10017 afii10025 -25 +KPX afii10017 afii10032 -50 +KPX afii10017 afii10033 -25 +KPX afii10017 afii10035 -50 +KPX afii10017 afii10036 -88 +KPX afii10017 afii10037 -88 +KPX afii10017 afii10038 -63 +KPX afii10017 afii10041 -152 +KPX afii10017 afii10047 -25 +KPX afii10017 afii10065 -13 +KPX afii10017 afii10066 -51 +KPX afii10017 afii10070 -25 +KPX afii10017 afii10080 -51 +KPX afii10017 afii10083 -25 +KPX afii10017 afii10084 -50 +KPX afii10017 afii10085 -50 +KPX afii10017 afii10086 -38 +KPX afii10018 afii10017 -13 +KPX afii10018 afii10021 -38 +KPX afii10018 afii10024 -25 +KPX afii10018 afii10029 -25 +KPX afii10018 afii10032 -7 +KPX afii10018 afii10035 -7 +KPX afii10018 afii10036 -13 +KPX afii10018 afii10037 -35 +KPX afii10018 afii10038 -15 +KPX afii10018 afii10039 -25 +KPX afii10018 afii10041 -50 +KPX afii10018 afii10044 -38 +KPX afii10018 afii10049 -33 +KPX afii10018 afii10069 -25 +KPX afii10018 afii10077 -13 +KPX afii10018 afii10085 -25 +KPX afii10019 afii10017 -63 +KPX afii10019 afii10021 -38 +KPX afii10019 afii10024 -25 +KPX afii10019 afii10029 -38 +KPX afii10019 afii10036 -13 +KPX afii10019 afii10037 -81 +KPX afii10019 afii10039 -25 +KPX afii10019 afii10041 -50 +KPX afii10019 afii10044 -53 +KPX afii10019 afii10049 -50 +KPX afii10019 afii10069 -25 +KPX afii10019 afii10085 -13 +KPX afii10019 afii10087 -13 +KPX afii10019 afii10089 -25 +KPX afii10020 comma -113 +KPX afii10020 period -113 +KPX afii10020 guillemotleft -63 +KPX afii10020 guillemotright -25 +KPX afii10020 emdash -25 +KPX afii10020 afii10017 -109 +KPX afii10020 afii10021 -88 +KPX afii10020 afii10025 25 +KPX afii10020 afii10029 -151 +KPX afii10020 afii10030 -13 +KPX afii10020 afii10032 -25 +KPX afii10020 afii10035 -13 +KPX afii10020 afii10049 -75 +KPX afii10020 afii10065 -88 +KPX afii10020 afii10067 -38 +KPX afii10020 afii10069 -75 +KPX afii10020 afii10070 -76 +KPX afii10020 afii10074 -38 +KPX afii10020 afii10077 -113 +KPX afii10020 afii10078 -38 +KPX afii10020 afii10079 -38 +KPX afii10020 afii10080 -88 +KPX afii10020 afii10082 -63 +KPX afii10020 afii10085 -38 +KPX afii10020 afii10093 -63 +KPX afii10020 afii10094 -63 +KPX afii10020 afii10096 -50 +KPX afii10020 afii10097 -75 +KPX afii10021 afii10025 25 +KPX afii10021 afii10037 12 +KPX afii10021 afii10038 -13 +KPX afii10021 afii10047 25 +KPX afii10021 afii10070 12 +KPX afii10021 afii10073 25 +KPX afii10022 afii10025 12 +KPX afii10022 afii10029 -13 +KPX afii10024 afii10025 -25 +KPX afii10024 afii10032 -25 +KPX afii10024 afii10035 -25 +KPX afii10024 afii10036 -17 +KPX afii10024 afii10037 -14 +KPX afii10024 afii10044 -10 +KPX afii10024 afii10065 -25 +KPX afii10024 afii10066 -50 +KPX afii10024 afii10070 -51 +KPX afii10024 afii10080 -75 +KPX afii10024 afii10085 -76 +KPX afii10025 afii10021 -61 +KPX afii10025 afii10024 -13 +KPX afii10025 afii10029 -44 +KPX afii10025 afii10037 -25 +KPX afii10025 afii10041 -38 +KPX afii10025 afii10049 -38 +KPX afii10025 afii10069 -25 +KPX afii10025 afii10077 -13 +KPX afii10028 afii10032 -25 +KPX afii10028 afii10035 -25 +KPX afii10028 afii10037 -20 +KPX afii10028 afii10038 -74 +KPX afii10028 afii10041 -13 +KPX afii10028 afii10047 12 +KPX afii10028 afii10065 -13 +KPX afii10028 afii10070 -38 +KPX afii10028 afii10073 -13 +KPX afii10028 afii10080 -50 +KPX afii10028 afii10083 -25 +KPX afii10028 afii10084 -25 +KPX afii10028 afii10085 -25 +KPX afii10028 afii10095 -13 +KPX afii10029 afii10038 -13 +KPX afii10029 afii10066 -13 +KPX afii10029 afii10070 -7 +KPX afii10029 afii10080 -25 +KPX afii10029 afii10085 -25 +KPX afii10030 afii10038 -13 +KPX afii10030 afii10070 -13 +KPX afii10030 afii10080 -13 +KPX afii10030 afii10085 -13 +KPX afii10030 afii10089 -38 +KPX afii10030 afii10095 12 +KPX afii10032 afii10017 -50 +KPX afii10032 afii10021 -50 +KPX afii10032 afii10024 -25 +KPX afii10032 afii10029 -50 +KPX afii10032 afii10035 12 +KPX afii10032 afii10037 -56 +KPX afii10032 afii10038 12 +KPX afii10032 afii10039 -78 +KPX afii10032 afii10041 -25 +KPX afii10032 afii10049 -50 +KPX afii10032 afii10069 -13 +KPX afii10032 afii10072 12 +KPX afii10034 comma -125 +KPX afii10034 period -125 +KPX afii10034 colon 37 +KPX afii10034 semicolon 37 +KPX afii10034 guillemotright 25 +KPX afii10034 afii10017 -128 +KPX afii10034 afii10021 -107 +KPX afii10034 afii10024 -35 +KPX afii10034 afii10025 12 +KPX afii10034 afii10029 -150 +KPX afii10034 afii10030 -19 +KPX afii10034 afii10032 -6 +KPX afii10034 afii10035 12 +KPX afii10034 afii10036 12 +KPX afii10034 afii10037 -25 +KPX afii10034 afii10038 -17 +KPX afii10034 afii10039 -53 +KPX afii10034 afii10049 -50 +KPX afii10034 afii10069 -38 +KPX afii10034 afii10070 -13 +KPX afii10034 afii10080 -25 +KPX afii10034 afii10095 25 +KPX afii10034 afii10097 -26 +KPX afii10035 afii10017 -50 +KPX afii10035 afii10021 -50 +KPX afii10035 afii10029 -25 +KPX afii10035 afii10037 -13 +KPX afii10035 afii10039 -26 +KPX afii10035 afii10041 -25 +KPX afii10035 afii10044 -13 +KPX afii10035 afii10066 12 +KPX afii10035 afii10070 12 +KPX afii10035 afii10083 12 +KPX afii10035 afii10084 -13 +KPX afii10035 afii10085 -25 +KPX afii10035 afii10089 -13 +KPX afii10035 afii10095 12 +KPX afii10036 comma -100 +KPX afii10036 period -100 +KPX afii10036 guillemotleft -50 +KPX afii10036 guillemotright -26 +KPX afii10036 afii10017 -50 +KPX afii10036 afii10021 -63 +KPX afii10036 afii10029 -50 +KPX afii10036 afii10030 -13 +KPX afii10036 afii10032 -13 +KPX afii10036 afii10038 -22 +KPX afii10036 afii10049 -38 +KPX afii10036 afii10065 -25 +KPX afii10036 afii10067 -50 +KPX afii10036 afii10070 -38 +KPX afii10036 afii10074 -25 +KPX afii10036 afii10076 -25 +KPX afii10036 afii10077 -50 +KPX afii10036 afii10078 -25 +KPX afii10036 afii10080 -45 +KPX afii10036 afii10081 -38 +KPX afii10036 afii10082 -38 +KPX afii10036 afii10083 -38 +KPX afii10036 afii10085 -50 +KPX afii10036 afii10087 -50 +KPX afii10036 afii10091 -38 +KPX afii10036 afii10093 -50 +KPX afii10036 afii10094 -63 +KPX afii10036 afii10096 -50 +KPX afii10036 afii10097 -38 +KPX afii10037 comma -163 +KPX afii10037 period -163 +KPX afii10037 colon -38 +KPX afii10037 semicolon -38 +KPX afii10037 guillemotleft -88 +KPX afii10037 guillemotright -63 +KPX afii10037 emdash -25 +KPX afii10037 afii10017 -191 +KPX afii10037 afii10021 -101 +KPX afii10037 afii10025 -13 +KPX afii10037 afii10029 -132 +KPX afii10037 afii10032 -50 +KPX afii10037 afii10038 -74 +KPX afii10037 afii10047 -13 +KPX afii10037 afii10049 -88 +KPX afii10037 afii10066 -38 +KPX afii10037 afii10067 -82 +KPX afii10037 afii10068 -82 +KPX afii10037 afii10069 -96 +KPX afii10037 afii10070 -108 +KPX afii10037 afii10072 -63 +KPX afii10037 afii10073 -82 +KPX afii10037 afii10074 -82 +KPX afii10037 afii10075 -38 +KPX afii10037 afii10076 -82 +KPX afii10037 afii10077 -113 +KPX afii10037 afii10078 -82 +KPX afii10037 afii10079 -82 +KPX afii10037 afii10080 -108 +KPX afii10037 afii10081 -82 +KPX afii10037 afii10082 -82 +KPX afii10037 afii10083 -108 +KPX afii10037 afii10087 -82 +KPX afii10037 afii10088 -82 +KPX afii10037 afii10090 -82 +KPX afii10037 afii10091 -82 +KPX afii10037 afii10096 -82 +KPX afii10037 afii10097 -96 +KPX afii10038 afii10017 -63 +KPX afii10038 afii10021 -88 +KPX afii10038 afii10029 -75 +KPX afii10038 afii10032 12 +KPX afii10038 afii10036 -25 +KPX afii10038 afii10037 -76 +KPX afii10038 afii10041 -63 +KPX afii10038 afii10049 -50 +KPX afii10038 afii10077 -50 +KPX afii10039 afii10025 -25 +KPX afii10039 afii10032 -51 +KPX afii10039 afii10035 -38 +KPX afii10039 afii10038 -70 +KPX afii10039 afii10047 -13 +KPX afii10039 afii10080 -31 +KPX afii10039 afii10085 -38 +KPX afii10040 afii10032 -13 +KPX afii10043 afii10085 12 +KPX afii10044 quoteright -63 +KPX afii10044 afii10049 -60 +KPX afii10046 quoteright -63 +KPX afii10046 afii10017 -43 +KPX afii10046 afii10021 -73 +KPX afii10046 afii10024 -63 +KPX afii10046 afii10025 -38 +KPX afii10046 afii10029 -40 +KPX afii10046 afii10030 -40 +KPX afii10046 afii10032 -25 +KPX afii10046 afii10035 -25 +KPX afii10046 afii10036 -75 +KPX afii10046 afii10039 -72 +KPX afii10046 afii10041 -112 +KPX afii10046 afii10047 -13 +KPX afii10046 afii10049 -53 +KPX afii10047 afii10021 -84 +KPX afii10047 afii10024 -25 +KPX afii10047 afii10025 12 +KPX afii10047 afii10029 -63 +KPX afii10047 afii10032 12 +KPX afii10047 afii10038 5 +KPX afii10047 afii10039 -51 +KPX afii10047 afii10049 -73 +KPX afii10047 afii10069 -25 +KPX afii10047 afii10077 -13 +KPX afii10048 afii10017 -38 +KPX afii10048 afii10021 -75 +KPX afii10048 afii10024 -70 +KPX afii10048 afii10029 -50 +KPX afii10048 afii10032 12 +KPX afii10048 afii10036 -25 +KPX afii10048 afii10039 -91 +KPX afii10048 afii10041 -38 +KPX afii10048 afii10069 -25 +KPX afii10048 afii10072 12 +KPX afii10048 afii10077 -13 +KPX afii10065 afii10077 9 +KPX afii10065 afii10081 -13 +KPX afii10065 afii10084 -26 +KPX afii10065 afii10085 -51 +KPX afii10065 afii10089 -40 +KPX afii10066 afii10069 -25 +KPX afii10066 afii10070 -13 +KPX afii10066 afii10072 -25 +KPX afii10066 afii10077 -25 +KPX afii10066 afii10078 -20 +KPX afii10066 afii10080 -13 +KPX afii10066 afii10085 -38 +KPX afii10066 afii10087 -38 +KPX afii10066 afii10089 -38 +KPX afii10066 afii10092 -25 +KPX afii10066 afii10097 -25 +KPX afii10067 afii10066 -13 +KPX afii10067 afii10069 -25 +KPX afii10067 afii10072 -29 +KPX afii10067 afii10077 -13 +KPX afii10067 afii10078 -17 +KPX afii10067 afii10080 -7 +KPX afii10067 afii10083 12 +KPX afii10067 afii10084 -25 +KPX afii10067 afii10085 -34 +KPX afii10067 afii10086 -6 +KPX afii10067 afii10089 -38 +KPX afii10067 afii10092 -25 +KPX afii10067 afii10097 -13 +KPX afii10068 comma -113 +KPX afii10068 period -113 +KPX afii10068 afii10069 -50 +KPX afii10068 afii10070 -13 +KPX afii10068 afii10077 -51 +KPX afii10068 afii10078 -13 +KPX afii10068 afii10080 -25 +KPX afii10068 afii10097 -25 +KPX afii10069 afii10073 12 +KPX afii10069 afii10095 25 +KPX afii10070 afii10069 -13 +KPX afii10070 afii10083 12 +KPX afii10070 afii10085 -25 +KPX afii10070 afii10086 12 +KPX afii10070 afii10087 -20 +KPX afii10070 afii10089 -25 +KPX afii10072 afii10066 -13 +KPX afii10072 afii10070 -13 +KPX afii10072 afii10073 12 +KPX afii10072 afii10080 -25 +KPX afii10072 afii10083 -18 +KPX afii10072 afii10089 -25 +KPX afii10072 afii10092 -13 +KPX afii10073 afii10069 -18 +KPX afii10073 afii10072 -18 +KPX afii10073 afii10073 12 +KPX afii10073 afii10078 -14 +KPX afii10073 afii10080 -6 +KPX afii10073 afii10085 -21 +KPX afii10073 afii10086 -7 +KPX afii10073 afii10089 -20 +KPX afii10073 afii10092 -17 +KPX afii10076 guillemotleft -26 +KPX afii10076 afii10065 -15 +KPX afii10076 afii10066 -25 +KPX afii10076 afii10070 -25 +KPX afii10076 afii10073 -13 +KPX afii10076 afii10080 -13 +KPX afii10076 afii10083 -25 +KPX afii10076 afii10085 -14 +KPX afii10076 afii10086 -25 +KPX afii10076 afii10089 -39 +KPX afii10076 afii10095 -13 +KPX afii10078 afii10065 -7 +KPX afii10078 afii10080 -13 +KPX afii10078 afii10095 12 +KPX afii10080 afii10067 -25 +KPX afii10080 afii10069 -29 +KPX afii10080 afii10072 -25 +KPX afii10080 afii10077 -13 +KPX afii10080 afii10078 -19 +KPX afii10080 afii10084 -13 +KPX afii10080 afii10085 -38 +KPX afii10080 afii10087 -25 +KPX afii10080 afii10089 -26 +KPX afii10080 afii10095 12 +KPX afii10080 afii10097 -19 +KPX afii10082 afii10069 -13 +KPX afii10082 afii10073 12 +KPX afii10082 afii10077 -25 +KPX afii10082 afii10078 -15 +KPX afii10082 afii10084 -13 +KPX afii10082 afii10085 -13 +KPX afii10082 afii10089 -25 +KPX afii10083 afii10065 12 +KPX afii10083 afii10066 12 +KPX afii10083 afii10070 12 +KPX afii10083 afii10073 25 +KPX afii10083 afii10085 -13 +KPX afii10083 afii10086 -13 +KPX afii10083 afii10087 -13 +KPX afii10083 afii10089 -20 +KPX afii10083 afii10095 12 +KPX afii10084 comma -75 +KPX afii10084 period -75 +KPX afii10084 afii10065 12 +KPX afii10084 afii10069 -13 +KPX afii10084 afii10072 12 +KPX afii10084 afii10073 12 +KPX afii10084 afii10077 -25 +KPX afii10084 afii10080 -13 +KPX afii10084 afii10082 12 +KPX afii10084 afii10083 12 +KPX afii10084 afii10085 -13 +KPX afii10084 afii10095 25 +KPX afii10084 afii10097 -13 +KPX afii10085 comma -100 +KPX afii10085 period -100 +KPX afii10085 colon -13 +KPX afii10085 semicolon -13 +KPX afii10085 guillemotright 25 +KPX afii10085 afii10065 -13 +KPX afii10085 afii10066 -13 +KPX afii10085 afii10069 -63 +KPX afii10085 afii10070 -31 +KPX afii10085 afii10072 -13 +KPX afii10085 afii10077 -25 +KPX afii10085 afii10078 -13 +KPX afii10085 afii10080 -25 +KPX afii10085 afii10083 -31 +KPX afii10085 afii10086 -25 +KPX afii10085 afii10097 -25 +KPX afii10086 afii10069 -25 +KPX afii10086 afii10077 -25 +KPX afii10086 afii10085 -25 +KPX afii10086 afii10089 -27 +KPX afii10086 afii10097 -13 +KPX afii10087 afii10065 -13 +KPX afii10087 afii10066 -38 +KPX afii10087 afii10070 -25 +KPX afii10087 afii10073 -13 +KPX afii10087 afii10080 -38 +KPX afii10087 afii10083 -29 +KPX afii10087 afii10084 -25 +KPX afii10087 afii10085 -38 +KPX afii10087 afii10086 -38 +KPX afii10087 afii10089 -50 +KPX afii10087 afii10092 -38 +KPX afii10087 afii10095 -13 +KPX afii10088 afii10073 12 +KPX afii10094 afii10084 -38 +KPX afii10094 afii10089 -76 +KPX afii10095 afii10069 -52 +KPX afii10095 afii10072 -56 +KPX afii10095 afii10077 -18 +KPX afii10095 afii10078 -9 +KPX afii10095 afii10086 -6 +KPX afii10095 afii10087 -39 +KPX afii10095 afii10097 -13 +KPX afii10096 afii10069 -57 +KPX afii10096 afii10072 -25 +KPX afii10096 afii10077 -25 +KPX afii10096 afii10078 -13 +KPX afii10096 afii10080 12 +KPX afii10096 afii10084 -13 +KPX afii10096 afii10086 -6 +KPX afii10096 afii10087 -39 +KPX afii10096 afii10089 -38 +KPX afii10110 comma -100 +KPX afii10110 period -100 +KPX afii10110 guillemotright 12 +KPX afii10050 comma -99 +KPX afii10050 period -99 +KPX afii10050 colon -25 +KPX afii10050 semicolon -25 +KPX afii10050 guillemotleft -88 +KPX afii10050 guillemotright -38 +KPX afii10050 emdash -25 +EndKernPairs +EndKernData +EndFontMetrics diff --git a/gulliver/thirdparty/html2ps_pdf/fonts/timesbd.ttf b/thirdparty/html2ps_pdf/fonts/timesbd.ttf similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/fonts/timesbd.ttf rename to thirdparty/html2ps_pdf/fonts/timesbd.ttf diff --git a/gulliver/thirdparty/html2ps_pdf/fonts/timesbi.afm b/thirdparty/html2ps_pdf/fonts/timesbi.afm similarity index 97% rename from gulliver/thirdparty/html2ps_pdf/fonts/timesbi.afm rename to thirdparty/html2ps_pdf/fonts/timesbi.afm index 51e36e382..4b01b0e60 100644 --- a/gulliver/thirdparty/html2ps_pdf/fonts/timesbi.afm +++ b/thirdparty/html2ps_pdf/fonts/timesbi.afm @@ -1,1843 +1,1843 @@ -StartFontMetrics 4.1 -FontName TimesNewRomanPS-BoldItalicMT -FullName Times New Roman Bold Italic -Notice Typeface The Monotype Corporation plc. Data The Monotype Corporation plc/Type Solutions Inc. 1990-1992. All Rights Reserved -EncodingScheme FontSpecific -FamilyName Times New Roman -Weight Bold Italic -Version Version 2.90 -Characters 940 -ItalicAngle -17.3 -Ascender 891 -Descender -216 -UnderlineThickness 95 -UnderlinePosition -109 -IsFixedPitch false -FontBBox -547 -307 1206 1032 -StartCharMetrics 975 -C 0 ; WX 778 ; N .notdef ; B 125 0 625 625 ; -C 1 ; WX 778 ; N .notdef ; B 125 0 625 625 ; -C 2 ; WX 778 ; N .notdef ; B 125 0 625 625 ; -C 3 ; WX 778 ; N .notdef ; B 125 0 625 625 ; -C 4 ; WX 778 ; N .notdef ; B 125 0 625 625 ; -C 5 ; WX 778 ; N .notdef ; B 125 0 625 625 ; -C 6 ; WX 778 ; N .notdef ; B 125 0 625 625 ; -C 7 ; WX 778 ; N .notdef ; B 125 0 625 625 ; -C 8 ; WX 778 ; N .notdef ; B 125 0 625 625 ; -C 9 ; WX 778 ; N .notdef ; B 125 0 625 625 ; -C 10 ; WX 778 ; N .notdef ; B 125 0 625 625 ; -C 11 ; WX 778 ; N .notdef ; B 125 0 625 625 ; -C 12 ; WX 778 ; N .notdef ; B 125 0 625 625 ; -C 13 ; WX 778 ; N .notdef ; B 125 0 625 625 ; -C 14 ; WX 778 ; N .notdef ; B 125 0 625 625 ; -C 15 ; WX 778 ; N .notdef ; B 125 0 625 625 ; -C 16 ; WX 778 ; N .notdef ; B 125 0 625 625 ; -C 17 ; WX 778 ; N .notdef ; B 125 0 625 625 ; -C 18 ; WX 778 ; N .notdef ; B 125 0 625 625 ; -C 19 ; WX 778 ; N .notdef ; B 125 0 625 625 ; -C 20 ; WX 778 ; N .notdef ; B 125 0 625 625 ; -C 21 ; WX 778 ; N .notdef ; B 125 0 625 625 ; -C 22 ; WX 778 ; N .notdef ; B 125 0 625 625 ; -C 23 ; WX 778 ; N .notdef ; B 125 0 625 625 ; -C 24 ; WX 778 ; N .notdef ; B 125 0 625 625 ; -C 25 ; WX 778 ; N .notdef ; B 125 0 625 625 ; -C 26 ; WX 778 ; N .notdef ; B 125 0 625 625 ; -C 27 ; WX 778 ; N .notdef ; B 125 0 625 625 ; -C 28 ; WX 778 ; N .notdef ; B 125 0 625 625 ; -C 29 ; WX 778 ; N .notdef ; B 125 0 625 625 ; -C 30 ; WX 778 ; N .notdef ; B 125 0 625 625 ; -C 31 ; WX 778 ; N .notdef ; B 125 0 625 625 ; -C 32 ; WX 250 ; N space ; B 55 -14 352 677 ; -C 33 ; WX 389 ; N exclam ; B 55 -14 352 677 ; -C 34 ; WX 555 ; N quotedbl ; B 165 352 559 677 ; -C 35 ; WX 500 ; N numbersign ; B 20 -14 480 676 ; -C 36 ; WX 500 ; N dollar ; B 39 -76 500 704 ; -C 37 ; WX 833 ; N percent ; B 108 -28 780 677 ; -C 38 ; WX 778 ; N ampersand ; B 46 -15 707 677 ; -C 39 ; WX 278 ; N quotesingle ; B 156 353 314 677 ; -C 40 ; WX 333 ; N parenleft ; B 50 -190 435 677 ; -C 41 ; WX 333 ; N parenright ; B -113 -190 271 677 ; -C 42 ; WX 500 ; N asterisk ; B 120 299 509 677 ; -C 43 ; WX 570 ; N plus ; B 20 66 553 598 ; -C 44 ; WX 250 ; N comma ; B -28 -161 176 149 ; -C 45 ; WX 333 ; N hyphen ; B 6 168 322 270 ; -C 46 ; WX 250 ; N period ; B -13 -14 147 146 ; -C 47 ; WX 278 ; N slash ; B -81 -15 415 676 ; -C 48 ; WX 500 ; N zero ; B 55 -14 499 676 ; -C 49 ; WX 500 ; N one ; B 23 0 445 676 ; -C 50 ; WX 500 ; N two ; B 4 0 483 676 ; -C 51 ; WX 500 ; N three ; B 12 -14 470 676 ; -C 52 ; WX 500 ; N four ; B 18 -14 502 676 ; -C 53 ; WX 500 ; N five ; B 38 -14 504 662 ; -C 54 ; WX 500 ; N six ; B 60 -14 510 681 ; -C 55 ; WX 500 ; N seven ; B 118 -14 554 662 ; -C 56 ; WX 500 ; N eight ; B 37 -14 491 676 ; -C 57 ; WX 500 ; N nine ; B 42 -14 493 681 ; -C 58 ; WX 333 ; N colon ; B 40 -14 289 452 ; -C 59 ; WX 333 ; N semicolon ; B 0 -161 292 452 ; -C 60 ; WX 570 ; N less ; B 20 90 553 568 ; -C 61 ; WX 570 ; N equal ; B 20 218 554 441 ; -C 62 ; WX 570 ; N greater ; B 20 90 553 568 ; -C 63 ; WX 500 ; N question ; B 88 -14 476 677 ; -C 64 ; WX 832 ; N at ; B 45 -216 908 677 ; -C 65 ; WX 667 ; N A ; B -57 0 600 677 ; -C 66 ; WX 667 ; N B ; B -25 0 645 662 ; -C 67 ; WX 667 ; N C ; B 65 -15 721 677 ; -C 68 ; WX 722 ; N D ; B -36 0 702 662 ; -C 69 ; WX 667 ; N E ; B -35 0 680 662 ; -C 70 ; WX 667 ; N F ; B -32 0 690 662 ; -C 71 ; WX 722 ; N G ; B 69 -15 747 677 ; -C 72 ; WX 778 ; N H ; B -32 0 862 662 ; -C 73 ; WX 389 ; N I ; B -35 0 467 662 ; -C 74 ; WX 500 ; N J ; B -8 -15 598 662 ; -C 75 ; WX 667 ; N K ; B -32 0 747 662 ; -C 76 ; WX 611 ; N L ; B -27 0 575 662 ; -C 77 ; WX 889 ; N M ; B -34 0 974 662 ; -C 78 ; WX 722 ; N N ; B -32 -7 811 662 ; -C 79 ; WX 722 ; N O ; B 53 -16 718 678 ; -C 80 ; WX 611 ; N P ; B -30 0 644 662 ; -C 81 ; WX 722 ; N Q ; B 53 -208 718 677 ; -C 82 ; WX 667 ; N R ; B -32 0 639 662 ; -C 83 ; WX 556 ; N S ; B -22 -15 583 677 ; -C 84 ; WX 611 ; N T ; B 80 0 693 662 ; -C 85 ; WX 722 ; N U ; B 94 -15 809 662 ; -C 86 ; WX 667 ; N V ; B 119 -15 776 662 ; -C 87 ; WX 889 ; N W ; B 123 -15 1002 662 ; -C 88 ; WX 667 ; N X ; B -61 0 763 662 ; -C 89 ; WX 611 ; N Y ; B 93 0 717 662 ; -C 90 ; WX 611 ; N Z ; B -27 0 679 662 ; -C 91 ; WX 333 ; N bracketleft ; B -29 -184 429 662 ; -C 92 ; WX 278 ; N backslash ; B 78 -15 203 676 ; -C 93 ; WX 333 ; N bracketright ; B -111 -184 347 662 ; -C 94 ; WX 570 ; N asciicircum ; B 102 325 540 676 ; -C 95 ; WX 500 ; N underscore ; B -10 -216 508 -152 ; -C 96 ; WX 333 ; N grave ; B 119 508 315 677 ; -C 97 ; WX 500 ; N a ; B 20 -14 479 453 ; -C 98 ; WX 500 ; N b ; B 9 -14 469 677 ; -C 99 ; WX 444 ; N c ; B 28 -14 438 453 ; -C 100 ; WX 500 ; N d ; B 20 -14 545 677 ; -C 101 ; WX 444 ; N e ; B 24 -14 442 453 ; -C 102 ; WX 333 ; N f ; B -160 -216 507 677 ; -C 103 ; WX 500 ; N g ; B -52 -216 517 453 ; -C 104 ; WX 556 ; N h ; B 10 -6 501 677 ; -C 105 ; WX 278 ; N i ; B 22 -14 298 677 ; -C 106 ; WX 278 ; N j ; B -159 -216 299 677 ; -C 107 ; WX 500 ; N k ; B 6 -7 513 677 ; -C 108 ; WX 278 ; N l ; B 16 -14 318 677 ; -C 109 ; WX 778 ; N m ; B 11 -5 726 453 ; -C 110 ; WX 556 ; N n ; B 11 -6 501 453 ; -C 111 ; WX 500 ; N o ; B 24 -14 470 453 ; -C 112 ; WX 500 ; N p ; B -122 -214 474 453 ; -C 113 ; WX 500 ; N q ; B 19 -214 483 453 ; -C 114 ; WX 389 ; N r ; B 17 0 402 453 ; -C 115 ; WX 389 ; N s ; B -2 -14 370 453 ; -C 116 ; WX 278 ; N t ; B 21 -14 313 572 ; -C 117 ; WX 556 ; N u ; B 32 -14 516 453 ; -C 118 ; WX 444 ; N v ; B 30 -14 444 453 ; -C 119 ; WX 667 ; N w ; B 28 -14 663 453 ; -C 120 ; WX 500 ; N x ; B -45 -14 508 453 ; -C 121 ; WX 444 ; N y ; B -92 -216 444 453 ; -C 122 ; WX 389 ; N z ; B -12 -85 395 439 ; -C 123 ; WX 348 ; N braceleft ; B 66 -203 480 677 ; -C 124 ; WX 220 ; N bar ; B 78 -216 141 677 ; -C 125 ; WX 348 ; N braceright ; B -69 -202 344 678 ; -C 126 ; WX 570 ; N asciitilde ; B 19 188 551 347 ; -C 127 ; WX 778 ; N .notdef ; B 125 0 625 625 ; -C 128 ; WX 500 ; N Euro ; B 16 -14 599 676 ; -C 129 ; WX 604 ; N afii10052 ; B -32 0 684 882 ; -C 130 ; WX 333 ; N quotesinglbase ; B 14 -161 218 149 ; -C 131 ; WX 500 ; N florin ; B 0 -216 500 678 ; -C 132 ; WX 500 ; N quotedblbase ; B -29 -162 392 150 ; -C 133 ; WX 1000 ; N ellipsis ; B 85 -13 915 150 ; -C 134 ; WX 500 ; N dagger ; B 86 -214 510 678 ; -C 135 ; WX 500 ; N daggerdbl ; B -6 -216 508 677 ; -C 136 ; WX 333 ; N circumflex ; B 74 511 384 677 ; -C 137 ; WX 1000 ; N perthousand ; B 25 -27 982 677 ; -C 138 ; WX 556 ; N Scaron ; B -22 -15 583 877 ; -C 139 ; WX 333 ; N guilsinglleft ; B 59 -5 306 445 ; -C 140 ; WX 944 ; N OE ; B 62 -5 958 667 ; -C 141 ; WX 678 ; N afii10061 ; B -35 0 737 886 ; -C 142 ; WX 611 ; N Zcaron ; B -27 0 679 877 ; -C 143 ; WX 778 ; N afii10145 ; B -33 -191 858 662 ; -C 144 ; WX 500 ; N quotedblbase ; B -29 -162 392 150 ; -C 145 ; WX 333 ; N quoteleft ; B 142 368 346 677 ; -C 146 ; WX 333 ; N quoteright ; B 144 368 348 677 ; -C 147 ; WX 500 ; N quotedblleft ; B 118 366 539 677 ; -C 148 ; WX 500 ; N quotedblright ; B 118 366 539 677 ; -C 149 ; WX 350 ; N bullet ; B 39 190 318 469 ; -C 150 ; WX 500 ; N endash ; B -7 202 509 261 ; -C 151 ; WX 1000 ; N emdash ; B -10 201 1009 261 ; -C 152 ; WX 333 ; N tilde ; B 89 526 398 662 ; -C 153 ; WX 1000 ; N trademark ; B -1 268 1005 662 ; -C 154 ; WX 389 ; N scaron ; B -2 -14 418 677 ; -C 155 ; WX 333 ; N guilsinglright ; B 28 -5 275 445 ; -C 156 ; WX 722 ; N oe ; B 22 -14 717 453 ; -C 157 ; WX 507 ; N afii10109 ; B 12 0 510 677 ; -C 158 ; WX 389 ; N zcaron ; B -12 -85 418 677 ; -C 159 ; WX 611 ; N Ydieresis ; B 93 0 717 851 ; -C 160 ; WX 250 ; N space ; B 55 -14 352 677 ; -C 161 ; WX 389 ; N exclamdown ; B 20 -216 316 476 ; -C 162 ; WX 500 ; N cent ; B 53 -186 462 644 ; -C 163 ; WX 500 ; N sterling ; B 36 -14 525 676 ; -C 164 ; WX 500 ; N currency ; B 10 93 491 567 ; -C 165 ; WX 500 ; N yen ; B -9 0 614 662 ; -C 166 ; WX 220 ; N brokenbar ; B 78 -216 141 677 ; -C 167 ; WX 500 ; N section ; B -14 -216 530 677 ; -C 168 ; WX 333 ; N dieresis ; B 90 528 401 658 ; -C 169 ; WX 747 ; N copyright ; B 29 -15 722 677 ; -C 170 ; WX 266 ; N ordfeminine ; B 68 396 367 676 ; -C 171 ; WX 500 ; N guillemotleft ; B 41 -5 493 445 ; -C 172 ; WX 606 ; N logicalnot ; B 36 218 570 440 ; -C 173 ; WX 333 ; N hyphen ; B 6 168 322 270 ; -C 174 ; WX 747 ; N registered ; B 29 -15 722 677 ; -C 175 ; WX 500 ; N overscore ; B 125 714 644 778 ; -C 176 ; WX 400 ; N degree ; B 88 338 426 676 ; -C 177 ; WX 549 ; N plusminus ; B 7 66 542 598 ; -C 178 ; WX 300 ; N twosuperior ; B 49 324 344 676 ; -C 179 ; WX 300 ; N threesuperior ; B 54 317 336 676 ; -C 180 ; WX 333 ; N acute ; B 196 506 405 677 ; -C 181 ; WX 576 ; N mu1 ; B -63 -216 529 439 ; -C 182 ; WX 500 ; N paragraph ; B 0 -216 542 662 ; -C 183 ; WX 250 ; N periodcentered ; B 76 252 236 413 ; -C 184 ; WX 333 ; N cedilla ; B 5 -184 228 0 ; -C 185 ; WX 300 ; N onesuperior ; B 60 324 323 676 ; -C 186 ; WX 300 ; N ordmasculine ; B 86 396 375 676 ; -C 187 ; WX 500 ; N guillemotright ; B 7 -5 459 445 ; -C 188 ; WX 750 ; N onequarter ; B 59 -29 705 676 ; -C 189 ; WX 750 ; N onehalf ; B 59 -29 693 676 ; -C 190 ; WX 750 ; N threequarters ; B 53 -29 705 676 ; -C 191 ; WX 500 ; N questiondown ; B 4 -216 392 476 ; -C 192 ; WX 667 ; N Agrave ; B -57 0 624 883 ; -C 193 ; WX 667 ; N Aacute ; B -57 0 737 873 ; -C 194 ; WX 667 ; N Acircumflex ; B -57 0 685 875 ; -C 195 ; WX 667 ; N Atilde ; B -57 0 707 861 ; -C 196 ; WX 667 ; N Adieresis ; B -57 0 721 851 ; -C 197 ; WX 667 ; N Aring ; B -57 0 657 844 ; -C 198 ; WX 944 ; N AE ; B -56 0 958 662 ; -C 199 ; WX 667 ; N Ccedilla ; B 65 -184 721 677 ; -C 200 ; WX 667 ; N Egrave ; B -35 0 680 883 ; -C 201 ; WX 667 ; N Eacute ; B -35 0 680 873 ; -C 202 ; WX 667 ; N Ecircumflex ; B -35 0 680 875 ; -C 203 ; WX 667 ; N Edieresis ; B -35 0 680 851 ; -C 204 ; WX 389 ; N Igrave ; B -35 0 467 883 ; -C 205 ; WX 389 ; N Iacute ; B -35 0 504 873 ; -C 206 ; WX 389 ; N Icircumflex ; B -35 0 468 875 ; -C 207 ; WX 389 ; N Idieresis ; B -35 0 486 851 ; -C 208 ; WX 722 ; N Eth ; B -32 0 708 662 ; -C 209 ; WX 722 ; N Ntilde ; B -32 -7 811 842 ; -C 210 ; WX 722 ; N Ograve ; B 53 -16 718 883 ; -C 211 ; WX 722 ; N Oacute ; B 53 -16 718 887 ; -C 212 ; WX 722 ; N Ocircumflex ; B 53 -16 718 863 ; -C 213 ; WX 722 ; N Otilde ; B 53 -16 718 842 ; -C 214 ; WX 722 ; N Odieresis ; B 53 -16 718 839 ; -C 215 ; WX 570 ; N multiply ; B 75 120 498 543 ; -C 216 ; WX 722 ; N Oslash ; B 42 -16 727 677 ; -C 217 ; WX 722 ; N Ugrave ; B 94 -15 809 883 ; -C 218 ; WX 722 ; N Uacute ; B 94 -15 809 887 ; -C 219 ; WX 722 ; N Ucircumflex ; B 94 -15 809 863 ; -C 220 ; WX 722 ; N Udieresis ; B 94 -15 809 839 ; -C 221 ; WX 611 ; N Yacute ; B 93 0 717 873 ; -C 222 ; WX 611 ; N Thorn ; B -31 0 603 662 ; -C 223 ; WX 500 ; N germandbls ; B -170 -216 506 677 ; -C 224 ; WX 500 ; N agrave ; B 20 -14 479 677 ; -C 225 ; WX 500 ; N aacute ; B 20 -14 483 677 ; -C 226 ; WX 500 ; N acircumflex ; B 20 -14 479 677 ; -C 227 ; WX 500 ; N atilde ; B 20 -14 481 662 ; -C 228 ; WX 500 ; N adieresis ; B 20 -14 486 658 ; -C 229 ; WX 500 ; N aring ; B 20 -14 479 696 ; -C 230 ; WX 722 ; N ae ; B 19 -14 716 453 ; -C 231 ; WX 444 ; N ccedilla ; B 28 -184 438 453 ; -C 232 ; WX 444 ; N egrave ; B 24 -14 442 677 ; -C 233 ; WX 444 ; N eacute ; B 24 -14 507 677 ; -C 234 ; WX 444 ; N ecircumflex ; B 24 -14 442 677 ; -C 235 ; WX 444 ; N edieresis ; B 24 -14 460 658 ; -C 236 ; WX 278 ; N igrave ; B 22 -14 271 677 ; -C 237 ; WX 278 ; N iacute ; B 22 -14 361 677 ; -C 238 ; WX 278 ; N icircumflex ; B 22 -14 340 677 ; -C 239 ; WX 278 ; N idieresis ; B 22 -14 359 658 ; -C 240 ; WX 500 ; N eth ; B 25 -14 486 677 ; -C 241 ; WX 556 ; N ntilde ; B 11 -6 501 662 ; -C 242 ; WX 500 ; N ograve ; B 24 -14 470 677 ; -C 243 ; WX 500 ; N oacute ; B 24 -14 501 677 ; -C 244 ; WX 500 ; N ocircumflex ; B 24 -14 470 677 ; -C 245 ; WX 500 ; N otilde ; B 24 -14 481 662 ; -C 246 ; WX 500 ; N odieresis ; B 24 -14 486 658 ; -C 247 ; WX 549 ; N divide ; B 8 121 542 545 ; -C 248 ; WX 500 ; N oslash ; B 15 -14 485 453 ; -C 249 ; WX 556 ; N ugrave ; B 32 -14 516 677 ; -C 250 ; WX 556 ; N uacute ; B 32 -14 516 677 ; -C 251 ; WX 556 ; N ucircumflex ; B 32 -14 516 677 ; -C 252 ; WX 556 ; N udieresis ; B 32 -14 516 658 ; -C 253 ; WX 444 ; N yacute ; B -92 -216 468 677 ; -C 254 ; WX 500 ; N thorn ; B -122 -216 474 677 ; -C 255 ; WX 444 ; N ydieresis ; B -92 -216 444 658 ; -C -1 ; WX 0 ; N .null ; B 55 -14 352 677 ; -C -1 ; WX 250 ; N nonmarkingreturn ; B 55 -14 352 677 ; -C -1 ; WX 549 ; N notequal ; B 7 -143 542 679 ; -C -1 ; WX 713 ; N infinity ; B 26 52 687 461 ; -C -1 ; WX 549 ; N lessequal ; B 7 -90 542 625 ; -C -1 ; WX 549 ; N greaterequal ; B 7 -90 542 625 ; -C -1 ; WX 494 ; N partialdiff ; B 36 -11 472 700 ; -C -1 ; WX 713 ; N summation ; B 21 -216 693 693 ; -C -1 ; WX 823 ; N product ; B 22 -216 801 693 ; -C -1 ; WX 549 ; N pi1 ; B 23 -14 550 439 ; -C -1 ; WX 274 ; N integral ; B -1 -107 272 910 ; -C -1 ; WX 768 ; N Ohm ; B 4 0 766 741 ; -C -1 ; WX 549 ; N radical ; B 42 -38 550 913 ; -C -1 ; WX 549 ; N approxequal ; B 6 119 543 536 ; -C -1 ; WX 612 ; N increment ; B 14 0 600 677 ; -C -1 ; WX 494 ; N lozenge ; B 23 0 472 694 ; -C -1 ; WX 167 ; N fraction ; B -184 -29 351 676 ; -C -1 ; WX 556 ; N fi ; B -179 -216 529 677 ; -C -1 ; WX 556 ; N fl ; B -180 -216 588 677 ; -C -1 ; WX 278 ; N dotlessi ; B 22 -14 257 453 ; -C -1 ; WX 333 ; N macron ; B 82 533 444 612 ; -C -1 ; WX 333 ; N breve ; B 132 507 403 677 ; -C -1 ; WX 333 ; N dotaccent ; B 193 519 337 663 ; -C -1 ; WX 333 ; N ring ; B 164 493 367 696 ; -C -1 ; WX 333 ; N hungarumlaut ; B 140 508 451 677 ; -C -1 ; WX 333 ; N ogonek ; B -86 -199 130 9 ; -C -1 ; WX 333 ; N caron ; B 109 510 418 677 ; -C -1 ; WX 611 ; N Lslash ; B -27 0 575 662 ; -C -1 ; WX 278 ; N lslash ; B 0 -14 318 677 ; -C -1 ; WX 606 ; N minus ; B 35 299 569 363 ; -C -1 ; WX 500 ; N franc ; B -68 0 595 662 ; -C -1 ; WX 722 ; N Gbreve ; B 69 -15 747 885 ; -C -1 ; WX 500 ; N gbreve ; B -52 -216 517 677 ; -C -1 ; WX 389 ; N Idot ; B -35 0 467 871 ; -C -1 ; WX 556 ; N Scedilla ; B -22 -184 583 677 ; -C -1 ; WX 389 ; N scedilla ; B -2 -184 370 453 ; -C -1 ; WX 667 ; N Cacute ; B 65 -15 721 873 ; -C -1 ; WX 444 ; N cacute ; B 28 -14 474 677 ; -C -1 ; WX 667 ; N Ccaron ; B 65 -15 721 877 ; -C -1 ; WX 444 ; N ccaron ; B 28 -14 509 677 ; -C -1 ; WX 500 ; N dmacron ; B 20 -14 588 677 ; -C -1 ; WX 333 ; N middot ; B 242 271 370 399 ; -C -1 ; WX 667 ; N Abreve ; B -57 0 734 885 ; -C -1 ; WX 500 ; N abreve ; B 20 -14 479 677 ; -C -1 ; WX 667 ; N Aogonek ; B -57 -199 623 677 ; -C -1 ; WX 500 ; N aogonek ; B 20 -205 479 453 ; -C -1 ; WX 722 ; N Dcaron ; B -36 0 702 877 ; -C -1 ; WX 749 ; N dcaron ; B 20 -14 751 677 ; -C -1 ; WX 722 ; N Dslash ; B -32 0 708 662 ; -C -1 ; WX 667 ; N Eogonek ; B -35 -199 680 662 ; -C -1 ; WX 444 ; N eogonek ; B 24 -199 442 453 ; -C -1 ; WX 667 ; N Ecaron ; B -35 0 680 877 ; -C -1 ; WX 444 ; N ecaron ; B 24 -14 504 677 ; -C -1 ; WX 611 ; N Lacute ; B -27 0 575 873 ; -C -1 ; WX 278 ; N lacute ; B 16 -14 413 873 ; -C -1 ; WX 611 ; N Lcaron ; B -27 0 666 677 ; -C -1 ; WX 521 ; N lcaron ; B 16 -14 524 677 ; -C -1 ; WX 611 ; N Ldot ; B -27 0 575 662 ; -C -1 ; WX 375 ; N ldot ; B 16 -14 364 677 ; -C -1 ; WX 722 ; N Nacute ; B -32 -7 811 873 ; -C -1 ; WX 556 ; N nacute ; B 11 -6 501 677 ; -C -1 ; WX 722 ; N Ncaron ; B -32 -7 811 877 ; -C -1 ; WX 556 ; N ncaron ; B 11 -6 508 677 ; -C -1 ; WX 722 ; N Odblacute ; B 53 -16 750 885 ; -C -1 ; WX 500 ; N odblacute ; B 24 -14 604 677 ; -C -1 ; WX 667 ; N Racute ; B -32 0 639 873 ; -C -1 ; WX 389 ; N racute ; B 17 0 438 677 ; -C -1 ; WX 667 ; N Rcaron ; B -32 0 639 877 ; -C -1 ; WX 389 ; N rcaron ; B 17 0 420 677 ; -C -1 ; WX 556 ; N Sacute ; B -22 -15 583 873 ; -C -1 ; WX 389 ; N sacute ; B -2 -14 422 677 ; -C -1 ; WX 611 ; N Tcedilla ; B 80 -256 693 662 ; -C -1 ; WX 278 ; N tcedilla ; B -4 -256 313 572 ; -C -1 ; WX 611 ; N Tcaron ; B 80 0 693 877 ; -C -1 ; WX 531 ; N tcaron ; B 20 -14 544 677 ; -C -1 ; WX 722 ; N Uring ; B 94 -15 809 878 ; -C -1 ; WX 556 ; N uring ; B 32 -14 516 696 ; -C -1 ; WX 722 ; N Udblacute ; B 94 -15 809 885 ; -C -1 ; WX 556 ; N udblacute ; B 32 -14 599 677 ; -C -1 ; WX 611 ; N Zacute ; B -27 0 679 873 ; -C -1 ; WX 389 ; N zacute ; B -12 -85 426 677 ; -C -1 ; WX 611 ; N Zdot ; B -27 0 679 843 ; -C -1 ; WX 389 ; N zdot ; B -12 -85 395 663 ; -C -1 ; WX 604 ; N Gamma ; B -32 0 684 662 ; -C -1 ; WX 763 ; N Theta ; B 55 -15 752 677 ; -C -1 ; WX 789 ; N Phi ; B 63 0 771 662 ; -C -1 ; WX 553 ; N alpha ; B 24 -14 537 453 ; -C -1 ; WX 512 ; N delta ; B 18 -14 491 677 ; -C -1 ; WX 410 ; N epsilon ; B 8 -14 414 453 ; -C -1 ; WX 539 ; N sigma ; B 32 -14 564 439 ; -C -1 ; WX 444 ; N tau ; B 25 -14 469 439 ; -C -1 ; WX 585 ; N phi ; B 28 -214 545 453 ; -C -1 ; WX 500 ; N underscoredbl ; B -9 -216 509 -52 ; -C -1 ; WX 659 ; N exclamdbl ; B 57 -14 626 677 ; -C -1 ; WX 348 ; N nsuperior ; B 4 268 319 545 ; -C -1 ; WX 969 ; N peseta ; B 18 -11 957 662 ; -C -1 ; WX 1000 ; N arrowleft ; B 39 77 961 428 ; -C -1 ; WX 500 ; N arrowup ; B 75 -209 426 654 ; -C -1 ; WX 1000 ; N arrowright ; B 39 77 961 428 ; -C -1 ; WX 500 ; N arrowdown ; B 75 -209 426 654 ; -C -1 ; WX 1000 ; N arrowboth ; B 39 77 961 429 ; -C -1 ; WX 500 ; N arrowupdn ; B 74 -208 425 714 ; -C -1 ; WX 500 ; N arrowupdnbse ; B 74 -303 425 714 ; -C -1 ; WX 979 ; N orthogonal ; B 177 0 802 625 ; -C -1 ; WX 719 ; N intersection ; B 89 0 630 698 ; -C -1 ; WX 570 ; N equivalence ; B 18 138 552 521 ; -C -1 ; WX 600 ; N house ; B 75 0 525 563 ; -C -1 ; WX 570 ; N revlogicalnot ; B 37 218 571 440 ; -C -1 ; WX 604 ; N integraltp ; B 267 -251 477 848 ; -C -1 ; WX 604 ; N integralbt ; B 127 -251 337 848 ; -C -1 ; WX 708 ; N SF100000 ; B -11 261 719 346 ; -C -1 ; WX 616 ; N SF110000 ; B 219 -303 304 910 ; -C -1 ; WX 708 ; N SF010000 ; B 312 -303 720 346 ; -C -1 ; WX 708 ; N SF030000 ; B -11 -303 396 346 ; -C -1 ; WX 708 ; N SF020000 ; B 312 261 720 910 ; -C -1 ; WX 708 ; N SF040000 ; B -11 261 396 910 ; -C -1 ; WX 708 ; N SF080000 ; B 312 -303 720 910 ; -C -1 ; WX 708 ; N SF090000 ; B -11 -303 396 910 ; -C -1 ; WX 708 ; N SF060000 ; B -11 -303 719 346 ; -C -1 ; WX 708 ; N SF070000 ; B -11 261 719 910 ; -C -1 ; WX 708 ; N SF050000 ; B -11 -303 719 910 ; -C -1 ; WX 708 ; N SF430000 ; B -11 168 719 439 ; -C -1 ; WX 708 ; N SF240000 ; B 219 -303 490 910 ; -C -1 ; WX 708 ; N SF510000 ; B 312 -303 720 439 ; -C -1 ; WX 708 ; N SF520000 ; B 219 -303 720 346 ; -C -1 ; WX 708 ; N SF390000 ; B 219 -303 719 439 ; -C -1 ; WX 708 ; N SF220000 ; B -11 -303 396 439 ; -C -1 ; WX 708 ; N SF210000 ; B -11 -303 489 346 ; -C -1 ; WX 708 ; N SF250000 ; B -11 -303 489 439 ; -C -1 ; WX 708 ; N SF500000 ; B 312 168 720 910 ; -C -1 ; WX 708 ; N SF490000 ; B 219 261 720 910 ; -C -1 ; WX 708 ; N SF380000 ; B 219 168 719 910 ; -C -1 ; WX 708 ; N SF280000 ; B -11 168 396 910 ; -C -1 ; WX 708 ; N SF270000 ; B -11 261 489 910 ; -C -1 ; WX 708 ; N SF260000 ; B -11 168 489 910 ; -C -1 ; WX 708 ; N SF360000 ; B 312 -303 720 910 ; -C -1 ; WX 708 ; N SF370000 ; B 219 -303 720 910 ; -C -1 ; WX 708 ; N SF420000 ; B 219 -303 720 910 ; -C -1 ; WX 708 ; N SF190000 ; B -11 -303 396 910 ; -C -1 ; WX 708 ; N SF200000 ; B -11 -303 489 910 ; -C -1 ; WX 708 ; N SF230000 ; B -11 -303 489 910 ; -C -1 ; WX 708 ; N SF470000 ; B -11 -303 719 439 ; -C -1 ; WX 708 ; N SF480000 ; B -11 -303 719 346 ; -C -1 ; WX 708 ; N SF410000 ; B -11 -303 719 439 ; -C -1 ; WX 708 ; N SF450000 ; B -11 168 719 910 ; -C -1 ; WX 708 ; N SF460000 ; B -11 261 719 910 ; -C -1 ; WX 708 ; N SF400000 ; B -11 168 719 910 ; -C -1 ; WX 708 ; N SF540000 ; B -11 -303 719 910 ; -C -1 ; WX 708 ; N SF530000 ; B -11 -303 719 910 ; -C -1 ; WX 708 ; N SF440000 ; B -11 -303 719 910 ; -C -1 ; WX 708 ; N upblock ; B -11 303 719 910 ; -C -1 ; WX 708 ; N dnblock ; B -11 -303 719 303 ; -C -1 ; WX 708 ; N block ; B -11 -303 719 910 ; -C -1 ; WX 708 ; N lfblock ; B -11 -303 354 910 ; -C -1 ; WX 708 ; N rtblock ; B 354 -303 720 910 ; -C -1 ; WX 708 ; N ltshade ; B 50 -246 719 910 ; -C -1 ; WX 708 ; N shade ; B -11 -246 719 910 ; -C -1 ; WX 729 ; N dkshade ; B 0 -307 729 910 ; -C -1 ; WX 604 ; N filledbox ; B 71 0 532 461 ; -C -1 ; WX 1000 ; N filledrect ; B 0 155 1000 343 ; -C -1 ; WX 990 ; N triagup ; B 148 0 842 693 ; -C -1 ; WX 990 ; N triagrt ; B 141 -15 849 692 ; -C -1 ; WX 990 ; N triagdn ; B 148 -15 842 678 ; -C -1 ; WX 990 ; N triaglf ; B 141 -15 849 692 ; -C -1 ; WX 604 ; N circle ; B 87 67 517 497 ; -C -1 ; WX 604 ; N invbullet ; B 63 0 541 479 ; -C -1 ; WX 604 ; N invcircle ; B 21 0 584 564 ; -C -1 ; WX 1021 ; N smileface ; B 199 -58 822 564 ; -C -1 ; WX 1052 ; N invsmileface ; B 215 -58 838 564 ; -C -1 ; WX 917 ; N sun ; B 8 -109 909 792 ; -C -1 ; WX 750 ; N female ; B 119 -214 630 736 ; -C -1 ; WX 750 ; N male ; B 54 -128 691 791 ; -C -1 ; WX 531 ; N spade ; B 28 0 503 601 ; -C -1 ; WX 656 ; N club ; B 27 0 629 601 ; -C -1 ; WX 594 ; N heart ; B 31 -12 563 601 ; -C -1 ; WX 510 ; N diamond ; B 31 -12 479 601 ; -C -1 ; WX 500 ; N musicalnote ; B 18 -18 482 666 ; -C -1 ; WX 750 ; N musicalnotedbl ; B 42 -63 649 742 ; -C -1 ; WX 823 ; N IJ ; B -35 -15 927 662 ; -C -1 ; WX 552 ; N ij ; B 39 -216 558 677 ; -C -1 ; WX 719 ; N napostrophe ; B 44 -6 667 677 ; -C -1 ; WX 281 ; N minute ; B 156 353 314 677 ; -C -1 ; WX 552 ; N second ; B 165 352 559 677 ; -C -1 ; WX 833 ; N afii61248 ; B 75 -27 810 677 ; -C -1 ; WX 427 ; N afii61289 ; B 18 -14 439 677 ; -C -1 ; WX 604 ; N H22073 ; B 71 0 532 461 ; -C -1 ; WX 354 ; N H18543 ; B 45 198 310 463 ; -C -1 ; WX 354 ; N H18551 ; B 45 198 310 463 ; -C -1 ; WX 604 ; N H18533 ; B 87 67 517 497 ; -C -1 ; WX 354 ; N openbullet ; B 38 190 316 470 ; -C -1 ; WX 667 ; N Amacron ; B -57 0 747 816 ; -C -1 ; WX 500 ; N amacron ; B 20 -14 527 612 ; -C -1 ; WX 667 ; N Ccircumflex ; B 65 -15 721 894 ; -C -1 ; WX 444 ; N ccircumflex ; B 28 -14 446 677 ; -C -1 ; WX 667 ; N Cdot ; B 65 -15 721 871 ; -C -1 ; WX 444 ; N cdot ; B 28 -14 438 663 ; -C -1 ; WX 667 ; N Emacron ; B -35 0 680 816 ; -C -1 ; WX 444 ; N emacron ; B 24 -14 500 612 ; -C -1 ; WX 667 ; N Ebreve ; B -35 0 680 897 ; -C -1 ; WX 444 ; N ebreve ; B 24 -14 493 677 ; -C -1 ; WX 667 ; N Edot ; B -35 0 680 871 ; -C -1 ; WX 444 ; N edot ; B 24 -14 442 663 ; -C -1 ; WX 722 ; N Gcircumflex ; B 69 -15 747 894 ; -C -1 ; WX 500 ; N gcircumflex ; B -52 -216 517 677 ; -C -1 ; WX 722 ; N Gdot ; B 69 -15 747 871 ; -C -1 ; WX 500 ; N gdot ; B -52 -216 517 663 ; -C -1 ; WX 722 ; N Gcedilla ; B 69 -184 747 677 ; -C -1 ; WX 500 ; N gcedilla ; B -52 -216 517 710 ; -C -1 ; WX 778 ; N Hcircumflex ; B -32 0 862 894 ; -C -1 ; WX 556 ; N hcircumflex ; B 10 -6 574 894 ; -C -1 ; WX 778 ; N Hbar ; B -32 0 862 662 ; -C -1 ; WX 556 ; N hbar ; B 12 -5 503 677 ; -C -1 ; WX 389 ; N Itilde ; B -35 0 490 863 ; -C -1 ; WX 278 ; N itilde ; B 22 -14 371 662 ; -C -1 ; WX 389 ; N Imacron ; B -35 0 516 816 ; -C -1 ; WX 278 ; N imacron ; B 22 -14 396 612 ; -C -1 ; WX 389 ; N Ibreve ; B -35 0 494 897 ; -C -1 ; WX 278 ; N ibreve ; B 22 -14 376 677 ; -C -1 ; WX 389 ; N Iogonek ; B -34 -199 468 662 ; -C -1 ; WX 278 ; N iogonek ; B 11 -199 297 677 ; -C -1 ; WX 500 ; N Jcircumflex ; B -8 -15 598 894 ; -C -1 ; WX 278 ; N jcircumflex ; B -160 -216 349 677 ; -C -1 ; WX 667 ; N Kcedilla ; B -32 -184 747 662 ; -C -1 ; WX 500 ; N kcedilla ; B 6 -184 513 677 ; -C -1 ; WX 500 ; N kgreenlandic ; B 6 -7 513 453 ; -C -1 ; WX 611 ; N Lcedilla ; B -27 -184 575 662 ; -C -1 ; WX 278 ; N lcedilla ; B -79 -184 318 677 ; -C -1 ; WX 722 ; N Ncedilla ; B -32 -184 811 662 ; -C -1 ; WX 556 ; N ncedilla ; B 11 -184 501 453 ; -C -1 ; WX 784 ; N Eng ; B -34 -16 773 677 ; -C -1 ; WX 541 ; N eng ; B 12 -216 496 453 ; -C -1 ; WX 722 ; N Omacron ; B 53 -16 718 816 ; -C -1 ; WX 500 ; N omacron ; B 24 -14 527 612 ; -C -1 ; WX 722 ; N Obreve ; B 53 -16 718 897 ; -C -1 ; WX 500 ; N obreve ; B 24 -14 487 677 ; -C -1 ; WX 667 ; N Rcedilla ; B -32 -184 639 662 ; -C -1 ; WX 389 ; N rcedilla ; B -12 -184 402 453 ; -C -1 ; WX 556 ; N Scircumflex ; B -22 -15 583 894 ; -C -1 ; WX 389 ; N scircumflex ; B -2 -14 412 677 ; -C -1 ; WX 611 ; N Tbar ; B 78 0 691 662 ; -C -1 ; WX 278 ; N tbar ; B 2 -14 312 572 ; -C -1 ; WX 722 ; N Utilde ; B 94 -15 809 863 ; -C -1 ; WX 556 ; N utilde ; B 32 -14 516 662 ; -C -1 ; WX 722 ; N Umacron ; B 94 -15 809 816 ; -C -1 ; WX 556 ; N umacron ; B 32 -14 535 612 ; -C -1 ; WX 722 ; N Ubreve ; B 94 -15 809 897 ; -C -1 ; WX 556 ; N ubreve ; B 32 -14 516 677 ; -C -1 ; WX 722 ; N Uogonek ; B 96 -199 811 662 ; -C -1 ; WX 556 ; N uogonek ; B 34 -199 518 453 ; -C -1 ; WX 889 ; N Wcircumflex ; B 123 -15 1002 894 ; -C -1 ; WX 667 ; N wcircumflex ; B 28 -14 663 677 ; -C -1 ; WX 611 ; N Ycircumflex ; B 93 0 717 894 ; -C -1 ; WX 444 ; N ycircumflex ; B -92 -216 444 677 ; -C -1 ; WX 333 ; N longs ; B -160 -216 507 677 ; -C -1 ; WX 667 ; N Aringacute ; B -57 0 755 1032 ; -C -1 ; WX 500 ; N aringacute ; B 20 -14 542 899 ; -C -1 ; WX 944 ; N AEacute ; B -56 0 958 899 ; -C -1 ; WX 722 ; N aeacute ; B 19 -14 716 677 ; -C -1 ; WX 722 ; N Oslashacute ; B 42 -16 727 899 ; -C -1 ; WX 500 ; N oslashacute ; B 15 -14 488 677 ; -C -1 ; WX 333 ; N anoteleia ; B 128 291 289 452 ; -C -1 ; WX 889 ; N Wgrave ; B 123 -15 1002 897 ; -C -1 ; WX 667 ; N wgrave ; B 28 -14 663 677 ; -C -1 ; WX 889 ; N Wacute ; B 123 -15 1002 899 ; -C -1 ; WX 667 ; N wacute ; B 28 -14 663 677 ; -C -1 ; WX 889 ; N Wdieresis ; B 123 -15 1002 857 ; -C -1 ; WX 667 ; N wdieresis ; B 28 -14 663 658 ; -C -1 ; WX 611 ; N Ygrave ; B 93 0 717 897 ; -C -1 ; WX 444 ; N ygrave ; B -92 -216 444 677 ; -C -1 ; WX 333 ; N quotereversed ; B 174 366 352 678 ; -C -1 ; WX 333 ; N radicalex ; B 51 533 471 612 ; -C -1 ; WX 500 ; N afii08941 ; B 36 -14 525 676 ; -C -1 ; WX 600 ; N estimated ; B 44 -17 561 535 ; -C -1 ; WX 750 ; N oneeighth ; B 59 -29 695 676 ; -C -1 ; WX 750 ; N threeeighths ; B 54 -29 695 676 ; -C -1 ; WX 750 ; N fiveeighths ; B 68 -29 695 676 ; -C -1 ; WX 750 ; N seveneighths ; B 96 -29 695 676 ; -C -1 ; WX 333 ; N commaaccent ; B 21 -256 177 -50 ; -C -1 ; WX 333 ; N undercommaaccent ; B 5 -184 228 -20 ; -C -1 ; WX 333 ; N tonos ; B 196 506 405 677 ; -C -1 ; WX 333 ; N dieresistonos ; B 34 506 486 677 ; -C -1 ; WX 667 ; N Alphatonos ; B -57 0 600 677 ; -C -1 ; WX 777 ; N Epsilontonos ; B 31 0 790 677 ; -C -1 ; WX 895 ; N Etatonos ; B 31 0 978 677 ; -C -1 ; WX 506 ; N Iotatonos ; B 31 0 585 677 ; -C -1 ; WX 731 ; N Omicrontonos ; B 31 -15 729 677 ; -C -1 ; WX 750 ; N Upsilontonos ; B 31 0 854 677 ; -C -1 ; WX 785 ; N Omegatonos ; B 30 0 772 677 ; -C -1 ; WX 278 ; N iotadieresistonos ; B -5 -14 447 677 ; -C -1 ; WX 667 ; N Alpha ; B -57 0 600 677 ; -C -1 ; WX 667 ; N Beta ; B -25 0 645 662 ; -C -1 ; WX 627 ; N Delta ; B -48 0 536 677 ; -C -1 ; WX 667 ; N Epsilon ; B -35 0 680 662 ; -C -1 ; WX 611 ; N Zeta ; B -27 0 679 662 ; -C -1 ; WX 778 ; N Eta ; B -32 0 862 662 ; -C -1 ; WX 389 ; N Iota ; B -35 0 467 662 ; -C -1 ; WX 667 ; N Kappa ; B -32 0 747 662 ; -C -1 ; WX 667 ; N Lambda ; B -64 0 594 677 ; -C -1 ; WX 889 ; N Mu ; B -34 0 974 662 ; -C -1 ; WX 722 ; N Nu ; B -32 -7 811 662 ; -C -1 ; WX 659 ; N Xi ; B -23 0 713 662 ; -C -1 ; WX 722 ; N Omicron ; B 53 -16 718 678 ; -C -1 ; WX 778 ; N Pi ; B -35 0 860 662 ; -C -1 ; WX 611 ; N Rho ; B -30 0 644 662 ; -C -1 ; WX 619 ; N Sigma ; B -52 0 676 662 ; -C -1 ; WX 611 ; N Tau ; B 80 0 693 662 ; -C -1 ; WX 611 ; N Upsilon ; B 93 0 717 662 ; -C -1 ; WX 667 ; N Chi ; B -61 0 763 662 ; -C -1 ; WX 800 ; N Psi ; B 120 0 894 677 ; -C -1 ; WX 746 ; N Omega ; B -9 0 733 677 ; -C -1 ; WX 389 ; N Iotadieresis ; B -35 0 493 851 ; -C -1 ; WX 611 ; N Upsilondieresis ; B 93 0 717 851 ; -C -1 ; WX 553 ; N alphatonos ; B 24 -14 537 677 ; -C -1 ; WX 410 ; N epsilontonos ; B 8 -14 441 677 ; -C -1 ; WX 549 ; N etatonos ; B 24 -214 513 677 ; -C -1 ; WX 278 ; N iotatonos ; B 22 -14 372 677 ; -C -1 ; WX 490 ; N upsilondieresistonos ; B 36 -14 546 677 ; -C -1 ; WX 512 ; N beta ; B -84 -214 531 677 ; -C -1 ; WX 416 ; N gamma ; B 31 -216 410 453 ; -C -1 ; WX 441 ; N zeta ; B 14 -166 539 713 ; -C -1 ; WX 549 ; N eta ; B 24 -214 508 453 ; -C -1 ; WX 519 ; N theta ; B 40 -14 530 677 ; -C -1 ; WX 278 ; N iota ; B 22 -14 257 453 ; -C -1 ; WX 530 ; N kappa ; B 13 -8 545 453 ; -C -1 ; WX 444 ; N lambda ; B -53 -8 418 677 ; -C -1 ; WX 556 ; N mu ; B -62 -216 521 439 ; -C -1 ; WX 444 ; N nu ; B 30 -14 444 453 ; -C -1 ; WX 449 ; N xi ; B 22 -166 509 693 ; -C -1 ; WX 500 ; N omicron ; B 24 -14 470 453 ; -C -1 ; WX 515 ; N rho ; B -78 -214 475 453 ; -C -1 ; WX 446 ; N sigma1 ; B 34 -166 463 453 ; -C -1 ; WX 490 ; N upsilon ; B 36 -14 451 453 ; -C -1 ; WX 465 ; N chi ; B -85 -207 499 453 ; -C -1 ; WX 668 ; N psi ; B 59 -214 702 453 ; -C -1 ; WX 723 ; N omega ; B 29 -14 681 453 ; -C -1 ; WX 278 ; N iotadieresis ; B 22 -14 368 636 ; -C -1 ; WX 490 ; N upsilondieresis ; B 36 -14 474 636 ; -C -1 ; WX 500 ; N omicrontonos ; B 24 -14 488 677 ; -C -1 ; WX 490 ; N upsilontonos ; B 36 -14 483 677 ; -C -1 ; WX 723 ; N omegatonos ; B 29 -14 681 677 ; -C -1 ; WX 667 ; N afii10023 ; B -35 0 680 851 ; -C -1 ; WX 818 ; N afii10051 ; B 71 -8 785 662 ; -C -1 ; WX 657 ; N afii10053 ; B 44 -15 737 677 ; -C -1 ; WX 556 ; N afii10054 ; B -22 -15 583 677 ; -C -1 ; WX 389 ; N afii10055 ; B -35 0 467 662 ; -C -1 ; WX 389 ; N afii10056 ; B -35 0 493 851 ; -C -1 ; WX 500 ; N afii10057 ; B -8 -15 598 662 ; -C -1 ; WX 908 ; N afii10058 ; B -59 -8 850 662 ; -C -1 ; WX 976 ; N afii10059 ; B -32 0 918 662 ; -C -1 ; WX 811 ; N afii10060 ; B 71 0 749 662 ; -C -1 ; WX 696 ; N afii10062 ; B 99 -15 811 861 ; -C -1 ; WX 667 ; N afii10017 ; B -57 0 600 677 ; -C -1 ; WX 635 ; N afii10018 ; B -18 0 657 662 ; -C -1 ; WX 667 ; N afii10019 ; B -25 0 645 662 ; -C -1 ; WX 604 ; N afii10020 ; B -32 0 684 662 ; -C -1 ; WX 683 ; N afii10021 ; B -115 -191 765 662 ; -C -1 ; WX 667 ; N afii10022 ; B -35 0 680 662 ; -C -1 ; WX 918 ; N afii10024 ; B -63 0 976 670 ; -C -1 ; WX 509 ; N afii10025 ; B -25 -15 506 677 ; -C -1 ; WX 778 ; N afii10026 ; B -33 0 851 662 ; -C -1 ; WX 778 ; N afii10027 ; B -33 0 851 861 ; -C -1 ; WX 678 ; N afii10028 ; B -35 0 737 670 ; -C -1 ; WX 686 ; N afii10029 ; B -59 -8 768 662 ; -C -1 ; WX 889 ; N afii10030 ; B -34 0 974 662 ; -C -1 ; WX 778 ; N afii10031 ; B -32 0 862 662 ; -C -1 ; WX 722 ; N afii10032 ; B 53 -16 718 678 ; -C -1 ; WX 778 ; N afii10033 ; B -35 0 860 662 ; -C -1 ; WX 611 ; N afii10034 ; B -30 0 644 662 ; -C -1 ; WX 667 ; N afii10035 ; B 65 -15 721 677 ; -C -1 ; WX 611 ; N afii10036 ; B 80 0 693 662 ; -C -1 ; WX 696 ; N afii10037 ; B 99 -15 811 662 ; -C -1 ; WX 850 ; N afii10038 ; B 72 0 830 662 ; -C -1 ; WX 667 ; N afii10039 ; B -61 0 763 662 ; -C -1 ; WX 778 ; N afii10040 ; B -32 -191 858 662 ; -C -1 ; WX 748 ; N afii10041 ; B 120 0 829 662 ; -C -1 ; WX 1126 ; N afii10042 ; B -33 0 1206 662 ; -C -1 ; WX 1126 ; N afii10043 ; B -33 -191 1206 662 ; -C -1 ; WX 760 ; N afii10044 ; B 107 0 702 662 ; -C -1 ; WX 969 ; N afii10045 ; B -19 0 1043 662 ; -C -1 ; WX 634 ; N afii10046 ; B -19 0 576 662 ; -C -1 ; WX 651 ; N afii10047 ; B 4 -15 636 677 ; -C -1 ; WX 1056 ; N afii10048 ; B -38 -15 1053 677 ; -C -1 ; WX 689 ; N afii10049 ; B -65 0 770 662 ; -C -1 ; WX 500 ; N afii10065 ; B 20 -14 479 453 ; -C -1 ; WX 499 ; N afii10066 ; B 32 -14 513 677 ; -C -1 ; WX 447 ; N afii10067 ; B 25 -14 423 453 ; -C -1 ; WX 369 ; N afii10068 ; B -10 -14 372 453 ; -C -1 ; WX 496 ; N afii10069 ; B 22 -14 471 677 ; -C -1 ; WX 444 ; N afii10070 ; B 24 -14 442 453 ; -C -1 ; WX 952 ; N afii10072 ; B -4 -14 952 453 ; -C -1 ; WX 390 ; N afii10073 ; B -20 -14 362 453 ; -C -1 ; WX 556 ; N afii10074 ; B 32 -14 516 453 ; -C -1 ; WX 556 ; N afii10075 ; B 34 -14 518 652 ; -C -1 ; WX 507 ; N afii10076 ; B 12 0 510 453 ; -C -1 ; WX 513 ; N afii10077 ; B -48 -14 475 439 ; -C -1 ; WX 685 ; N afii10078 ; B -48 -14 646 453 ; -C -1 ; WX 555 ; N afii10079 ; B 13 -5 516 453 ; -C -1 ; WX 500 ; N afii10080 ; B 24 -14 470 453 ; -C -1 ; WX 556 ; N afii10081 ; B 11 -6 501 453 ; -C -1 ; WX 500 ; N afii10082 ; B -122 -214 474 453 ; -C -1 ; WX 444 ; N afii10083 ; B 28 -14 438 453 ; -C -1 ; WX 778 ; N afii10084 ; B 11 -5 726 453 ; -C -1 ; WX 444 ; N afii10085 ; B -92 -216 444 453 ; -C -1 ; WX 716 ; N afii10086 ; B 28 -214 682 677 ; -C -1 ; WX 500 ; N afii10087 ; B -45 -14 508 453 ; -C -1 ; WX 556 ; N afii10088 ; B 34 -187 518 453 ; -C -1 ; WX 525 ; N afii10089 ; B 48 -14 486 453 ; -C -1 ; WX 833 ; N afii10090 ; B 36 -14 796 453 ; -C -1 ; WX 833 ; N afii10091 ; B 36 -186 796 453 ; -C -1 ; WX 527 ; N afii10092 ; B 29 -14 476 439 ; -C -1 ; WX 694 ; N afii10093 ; B 43 -14 659 453 ; -C -1 ; WX 457 ; N afii10094 ; B 43 -14 406 453 ; -C -1 ; WX 415 ; N afii10095 ; B -12 -14 371 453 ; -C -1 ; WX 730 ; N afii10096 ; B 12 -14 700 453 ; -C -1 ; WX 515 ; N afii10097 ; B -62 -14 477 439 ; -C -1 ; WX 444 ; N afii10071 ; B 24 -14 489 658 ; -C -1 ; WX 523 ; N afii10099 ; B 12 -216 494 677 ; -C -1 ; WX 393 ; N afii10100 ; B -18 0 455 677 ; -C -1 ; WX 415 ; N afii10101 ; B 22 -14 458 453 ; -C -1 ; WX 389 ; N afii10102 ; B -2 -14 370 453 ; -C -1 ; WX 278 ; N afii10103 ; B 22 -14 298 677 ; -C -1 ; WX 278 ; N afii10104 ; B 22 -14 368 636 ; -C -1 ; WX 278 ; N afii10105 ; B -159 -216 299 677 ; -C -1 ; WX 659 ; N afii10106 ; B -48 -14 607 453 ; -C -1 ; WX 713 ; N afii10107 ; B 12 -14 662 453 ; -C -1 ; WX 556 ; N afii10108 ; B 12 -5 503 677 ; -C -1 ; WX 444 ; N afii10110 ; B -94 -216 454 652 ; -C -1 ; WX 556 ; N afii10193 ; B 30 -191 518 453 ; -C -1 ; WX 470 ; N afii10050 ; B -34 0 594 795 ; -C -1 ; WX 369 ; N afii10098 ; B 31 -14 432 542 ; -C -1 ; WX 1000 ; N afii00208 ; B 32 224 969 294 ; -C -1 ; WX 915 ; N afii61352 ; B -41 -15 903 669 ; -C -1 ; WX 546 ; N pi ; B 14 -14 571 439 ; -C -1 ; WX 333 ; N sheva ; B 26 -265 107 -72 ; -C -1 ; WX 333 ; N hatafsegol ; B -86 -265 219 -72 ; -C -1 ; WX 333 ; N hatafpatah ; B -76 -265 208 -72 ; -C -1 ; WX 333 ; N hatafqamats ; B -91 -265 224 -72 ; -C -1 ; WX 333 ; N hiriq ; B 26 -153 107 -72 ; -C -1 ; WX 333 ; N tsere ; B -30 -153 163 -72 ; -C -1 ; WX 333 ; N segol ; B -30 -265 163 -72 ; -C -1 ; WX 333 ; N patah ; B -30 -130 163 -80 ; -C -1 ; WX 333 ; N qamats ; B -30 -243 163 -80 ; -C -1 ; WX 333 ; N holam ; B 226 587 307 668 ; -C -1 ; WX 333 ; N qubuts ; B -86 -265 219 -72 ; -C -1 ; WX 333 ; N dagesh ; B 126 211 207 292 ; -C -1 ; WX 333 ; N meteg ; B 41 -242 91 -80 ; -C -1 ; WX 375 ; N maqaf ; B 105 362 382 516 ; -C -1 ; WX 333 ; N rafe ; B 170 596 363 646 ; -C -1 ; WX 333 ; N paseq ; B 30 -49 307 564 ; -C -1 ; WX 343 ; N shindot ; B 436 587 517 668 ; -C -1 ; WX 343 ; N sindot ; B 27 587 108 668 ; -C -1 ; WX 333 ; N sofpasuq ; B 40 -14 310 525 ; -C -1 ; WX 518 ; N alef ; B -29 -6 528 553 ; -C -1 ; WX 467 ; N bet ; B -40 0 448 549 ; -C -1 ; WX 377 ; N gimel ; B -65 -13 339 553 ; -C -1 ; WX 439 ; N dalet ; B 83 -13 472 549 ; -C -1 ; WX 512 ; N he ; B -5 -13 541 549 ; -C -1 ; WX 309 ; N vav ; B 89 -13 302 553 ; -C -1 ; WX 322 ; N zayin ; B 90 -13 341 553 ; -C -1 ; WX 512 ; N het ; B 1 -13 542 549 ; -C -1 ; WX 516 ; N tet ; B 50 0 515 553 ; -C -1 ; WX 280 ; N yod ; B 86 200 293 553 ; -C -1 ; WX 447 ; N finalkaf ; B 82 -170 475 549 ; -C -1 ; WX 440 ; N kaf ; B -37 0 422 549 ; -C -1 ; WX 443 ; N lamed ; B 76 -8 450 741 ; -C -1 ; WX 481 ; N finalmem ; B -15 0 470 549 ; -C -1 ; WX 526 ; N mem ; B -3 0 496 553 ; -C -1 ; WX 305 ; N finalnun ; B 46 -170 319 553 ; -C -1 ; WX 321 ; N nun ; B -52 0 311 553 ; -C -1 ; WX 456 ; N samekh ; B 42 -13 440 549 ; -C -1 ; WX 508 ; N ayin ; B -48 -57 533 553 ; -C -1 ; WX 488 ; N finalpe ; B 62 -170 468 549 ; -C -1 ; WX 454 ; N pe ; B -33 0 434 549 ; -C -1 ; WX 551 ; N finaltsadi ; B 86 -170 572 553 ; -C -1 ; WX 487 ; N tsadi ; B -17 0 509 553 ; -C -1 ; WX 454 ; N qof ; B -37 -170 461 549 ; -C -1 ; WX 469 ; N resh ; B 85 -13 460 549 ; -C -1 ; WX 677 ; N shin ; B 92 0 701 553 ; -C -1 ; WX 503 ; N tav ; B -60 -13 492 549 ; -C -1 ; WX 617 ; N doublevav ; B 89 -13 610 553 ; -C -1 ; WX 589 ; N vavyod ; B 86 -13 582 553 ; -C -1 ; WX 561 ; N doubleyod ; B 86 200 574 553 ; -C -1 ; WX 228 ; N geresh ; B 55 219 245 535 ; -C -1 ; WX 433 ; N gershayim ; B 55 219 450 535 ; -C -1 ; WX 759 ; N newsheqelsign ; B -4 0 777 516 ; -C -1 ; WX 309 ; N vavshindot ; B 27 -13 302 668 ; -C -1 ; WX 447 ; N finalkafsheva ; B 82 -170 475 549 ; -C -1 ; WX 447 ; N finalkafqamats ; B 50 -170 475 549 ; -C -1 ; WX 450 ; N lamedholam ; B -30 -8 450 741 ; -C -1 ; WX 443 ; N lamedholamdagesh ; B -30 -8 450 741 ; -C -1 ; WX 508 ; N altayin ; B -34 0 533 553 ; -C -1 ; WX 677 ; N shinshindot ; B 92 0 701 668 ; -C -1 ; WX 677 ; N shinsindot ; B 92 0 701 668 ; -C -1 ; WX 677 ; N shindageshshindot ; B 92 0 701 668 ; -C -1 ; WX 677 ; N shindageshsindot ; B 92 0 701 668 ; -C -1 ; WX 518 ; N alefpatah ; B -29 -130 528 553 ; -C -1 ; WX 518 ; N alefqamats ; B -29 -243 528 553 ; -C -1 ; WX 518 ; N alefmapiq ; B -29 -6 528 553 ; -C -1 ; WX 467 ; N betdagesh ; B -40 0 448 549 ; -C -1 ; WX 377 ; N gimeldagesh ; B -65 -13 339 553 ; -C -1 ; WX 439 ; N daletdagesh ; B 83 -13 472 549 ; -C -1 ; WX 512 ; N hedagesh ; B -5 -13 541 549 ; -C -1 ; WX 309 ; N vavdagesh ; B 55 -13 302 553 ; -C -1 ; WX 322 ; N zayindagesh ; B 35 -13 341 553 ; -C -1 ; WX 516 ; N tetdagesh ; B 50 0 515 553 ; -C -1 ; WX 280 ; N yoddagesh ; B 48 200 293 553 ; -C -1 ; WX 447 ; N finalkafdagesh ; B 82 -170 475 549 ; -C -1 ; WX 440 ; N kafdagesh ; B -37 0 422 549 ; -C -1 ; WX 443 ; N lameddagesh ; B 76 -8 450 741 ; -C -1 ; WX 526 ; N memdagesh ; B -3 0 496 553 ; -C -1 ; WX 321 ; N nundagesh ; B -52 0 311 553 ; -C -1 ; WX 456 ; N samekhdagesh ; B 42 -13 440 549 ; -C -1 ; WX 488 ; N finalpedagesh ; B 62 -170 468 549 ; -C -1 ; WX 454 ; N pedagesh ; B -33 0 434 549 ; -C -1 ; WX 487 ; N tsadidagesh ; B -17 0 509 553 ; -C -1 ; WX 454 ; N qofdagesh ; B -37 -170 461 549 ; -C -1 ; WX 454 ; N reshdagesh ; B 68 -8 446 550 ; -C -1 ; WX 677 ; N shindagesh ; B 92 0 701 553 ; -C -1 ; WX 503 ; N tavdages ; B -60 -13 492 549 ; -C -1 ; WX 309 ; N vavholam ; B 89 -13 302 668 ; -C -1 ; WX 467 ; N betrafe ; B -40 0 448 646 ; -C -1 ; WX 440 ; N kafrafe ; B -37 0 422 646 ; -C -1 ; WX 454 ; N perafe ; B -33 0 434 646 ; -C -1 ; WX 542 ; N aleflamed ; B -5 -6 552 741 ; -C -1 ; WX 0 ; N zerowidthnonjoiner ; B -18 -134 18 629 ; -C -1 ; WX 0 ; N zerowidthjoiner ; B -107 -134 107 690 ; -C -1 ; WX 0 ; N lefttorightmark ; B -18 -134 210 690 ; -C -1 ; WX 0 ; N righttoleftmark ; B -210 -134 17 690 ; -C -1 ; WX 1000 ; N uniFFFC ; B 0 0 1000 719 ; -C -1 ; WX 722 ; N Ohorn ; B 53 -16 839 721 ; -C -1 ; WX 537 ; N ohorn ; B 24 -14 600 512 ; -C -1 ; WX 775 ; N Uhorn ; B 94 -15 929 801 ; -C -1 ; WX 599 ; N uhorn ; B 34 -14 655 467 ; -C -1 ; WX 0 ; N f00b ; B -148 816 23 891 ; -C -1 ; WX 0 ; N f00c ; B -286 816 -66 891 ; -C -1 ; WX 0 ; N f00e ; B -296 728 -98 891 ; -C -1 ; WX 0 ; N f006 ; B -63 816 105 891 ; -C -1 ; WX 0 ; N f007 ; B -127 816 89 891 ; -C -1 ; WX 0 ; N f009 ; B -166 728 34 891 ; -C -1 ; WX 0 ; N combininghookabove ; B -99 724 130 891 ; -C -1 ; WX 0 ; N f010 ; B -121 810 68 891 ; -C -1 ; WX 0 ; N f013 ; B -222 724 7 891 ; -C -1 ; WX 0 ; N f011 ; B -185 810 4 891 ; -C -1 ; WX 0 ; N f01c ; B -208 748 145 885 ; -C -1 ; WX 0 ; N f015 ; B -236 813 66 891 ; -C -1 ; WX 0 ; N combiningtildeaccent ; B -282 724 70 861 ; -C -1 ; WX 0 ; N _d_767 ; B 40 719 293 799 ; -C -1 ; WX 0 ; N _d_768 ; B 19 718 266 789 ; -C -1 ; WX 0 ; N f02c ; B -194 -212 -32 -50 ; -C -1 ; WX 513 ; N dongsign ; B 9 133 517 662 ; -C -1 ; WX 750 ; N onethird ; B 59 -30 681 676 ; -C -1 ; WX 750 ; N twothirds ; B 49 -30 681 676 ; -C -1 ; WX 0 ; N f008 ; B -125 506 75 670 ; -C -1 ; WX 0 ; N f00a ; B -226 506 -26 670 ; -C -1 ; WX 0 ; N f00d ; B -202 506 -3 670 ; -C -1 ; WX 0 ; N f00f ; B -292 506 -93 670 ; -C -1 ; WX 0 ; N f012 ; B -151 507 78 674 ; -C -1 ; WX 0 ; N f014 ; B -264 507 -34 674 ; -C -1 ; WX 0 ; N f016 ; B -313 748 39 885 ; -C -1 ; WX 0 ; N f017 ; B -388 748 -36 885 ; -C -1 ; WX 0 ; N f018 ; B -416 748 -64 885 ; -C -1 ; WX 0 ; N f019 ; B -328 526 -19 662 ; -C -1 ; WX 0 ; N f01a ; B -337 526 -28 662 ; -C -1 ; WX 0 ; N f01b ; B -386 526 -77 662 ; -C -1 ; WX 0 ; N f01e ; B -499 -212 -336 -50 ; -C -1 ; WX 0 ; N f01f ; B -533 -212 -370 -50 ; -C -1 ; WX 0 ; N f020 ; B -533 -212 -370 -50 ; -C -1 ; WX 0 ; N f021 ; B -499 -212 -336 -50 ; -C -1 ; WX 0 ; N f022 ; B -547 -212 -385 -50 ; -C -1 ; WX 0 ; N combininggraveaccent ; B -186 728 13 891 ; -C -1 ; WX 0 ; N combiningacuteaccent ; B -57 728 143 891 ; -C -1 ; WX 0 ; N f01d ; B -236 526 73 662 ; -C -1 ; WX 0 ; N combiningdotbelow ; B -533 -212 -370 -50 ; -C -1 ; WX 0 ; N f023 ; B -418 -212 -256 -50 ; -C -1 ; WX 0 ; N f029 ; B -361 -212 -198 -50 ; -C -1 ; WX 0 ; N f02a ; B -300 -212 -138 -50 ; -C -1 ; WX 0 ; N f02b ; B -461 -212 -299 -50 ; -C -1 ; WX 0 ; N f024 ; B -370 -212 -207 -50 ; -C -1 ; WX 0 ; N f025 ; B -428 -212 -266 -50 ; -C -1 ; WX 0 ; N f026 ; B -467 -212 -305 -50 ; -C -1 ; WX 0 ; N f027 ; B -467 -212 -305 -50 ; -C -1 ; WX 0 ; N f028 ; B -492 -212 -329 -50 ; -C -1 ; WX 0 ; N f02d ; B -339 813 -36 891 ; -C -1 ; WX 0 ; N f02e ; B -369 748 -17 885 ; -C -1 ; WX 0 ; N f02f ; B -339 813 -36 891 ; -C -1 ; WX 0 ; N f030 ; B -388 748 -36 885 ; -C -1 ; WX 278 ; N f031 ; B 20 -14 255 453 ; -C -1 ; WX 667 ; N Adotbelow ; B -57 -212 600 677 ; -C -1 ; WX 500 ; N adotbelow ; B 20 -212 479 453 ; -C -1 ; WX 667 ; N Ahookabove ; B -57 0 721 891 ; -C -1 ; WX 500 ; N ahookabove ; B 20 -14 479 674 ; -C -1 ; WX 667 ; N Acircumflexacute ; B -57 0 710 891 ; -C -1 ; WX 500 ; N acircumflexacute ; B 20 -14 522 891 ; -C -1 ; WX 667 ; N Acircumflexgrave ; B -57 0 683 891 ; -C -1 ; WX 500 ; N acircumflexgrave ; B 20 -14 479 891 ; -C -1 ; WX 667 ; N Acircumflexhookabove ; B -57 0 698 891 ; -C -1 ; WX 500 ; N acircumflexhookabove ; B 20 -14 522 891 ; -C -1 ; WX 667 ; N Acircumflextilde ; B -57 0 740 891 ; -C -1 ; WX 500 ; N acircumflextilde ; B 20 -14 550 885 ; -C -1 ; WX 667 ; N Acircumflexdotbelow ; B -57 -212 683 789 ; -C -1 ; WX 500 ; N acircumflexdotbelow ; B 20 -212 479 677 ; -C -1 ; WX 667 ; N Abreveacute ; B -57 0 710 891 ; -C -1 ; WX 500 ; N abreveacute ; B 20 -14 493 891 ; -C -1 ; WX 667 ; N Abrevegrave ; B -57 0 709 891 ; -C -1 ; WX 500 ; N abrevegrave ; B 20 -14 479 891 ; -C -1 ; WX 667 ; N Abrevehookabove ; B -57 0 709 891 ; -C -1 ; WX 500 ; N abrevehookabove ; B 20 -14 482 891 ; -C -1 ; WX 667 ; N Abrevetilde ; B -57 0 740 891 ; -C -1 ; WX 500 ; N abrevetilde ; B 20 -14 550 885 ; -C -1 ; WX 667 ; N Abrevedotbelow ; B -57 -212 709 799 ; -C -1 ; WX 500 ; N abrevedotbelow ; B 20 -212 479 677 ; -C -1 ; WX 667 ; N Edotbelow ; B -35 -212 680 662 ; -C -1 ; WX 444 ; N edotbelow ; B 24 -212 442 453 ; -C -1 ; WX 667 ; N Ehookabove ; B -35 0 680 891 ; -C -1 ; WX 444 ; N ehookabove ; B 24 -14 503 674 ; -C -1 ; WX 667 ; N Etilde ; B -35 0 680 842 ; -C -1 ; WX 444 ; N etilde ; B 24 -14 496 662 ; -C -1 ; WX 667 ; N Ecircumflexacute ; B -35 0 680 891 ; -C -1 ; WX 444 ; N ecircumflexacute ; B 24 -14 496 891 ; -C -1 ; WX 667 ; N Ecircumflexgrave ; B -35 0 680 891 ; -C -1 ; WX 444 ; N ecircumflexgrave ; B 24 -14 442 891 ; -C -1 ; WX 667 ; N Ecircumflexhookabove ; B -35 0 680 891 ; -C -1 ; WX 444 ; N ecircumflexhookabove ; B 24 -14 496 891 ; -C -1 ; WX 667 ; N Ecircumflextilde ; B -35 0 680 891 ; -C -1 ; WX 444 ; N ecircumflextilde ; B 24 -14 550 885 ; -C -1 ; WX 667 ; N Ecircumflexdotbelow ; B -35 -212 680 789 ; -C -1 ; WX 444 ; N ecircumflexdotbelow ; B 24 -212 442 677 ; -C -1 ; WX 389 ; N Ihookabove ; B -35 0 477 891 ; -C -1 ; WX 278 ; N ihookabove ; B 20 -14 356 674 ; -C -1 ; WX 389 ; N Idotbelow ; B -35 -212 467 662 ; -C -1 ; WX 278 ; N idotbelow ; B -1 -212 298 677 ; -C -1 ; WX 722 ; N Odotbelow ; B 53 -212 718 678 ; -C -1 ; WX 500 ; N odotbelow ; B 24 -212 470 453 ; -C -1 ; WX 722 ; N Ohookabove ; B 53 -16 718 891 ; -C -1 ; WX 500 ; N ohookabove ; B 24 -14 488 674 ; -C -1 ; WX 722 ; N Ocircumflexacute ; B 53 -16 718 891 ; -C -1 ; WX 500 ; N ocircumflexacute ; B 24 -14 522 891 ; -C -1 ; WX 722 ; N Ocircumflexgrave ; B 53 -16 718 891 ; -C -1 ; WX 500 ; N ocircumflexgrave ; B 24 -14 470 891 ; -C -1 ; WX 722 ; N Ocircumflexhookabove ; B 53 -16 718 891 ; -C -1 ; WX 500 ; N ocircumflexhookabove ; B 24 -14 522 891 ; -C -1 ; WX 722 ; N Ocircumflextilde ; B 53 -16 718 891 ; -C -1 ; WX 500 ; N ocircumflextilde ; B 24 -14 564 885 ; -C -1 ; WX 722 ; N Ocircumflexdotbelow ; B 53 -212 718 789 ; -C -1 ; WX 500 ; N ocircumflexdotbelow ; B 24 -212 470 677 ; -C -1 ; WX 722 ; N Ohornacute ; B 53 -16 839 887 ; -C -1 ; WX 537 ; N ohornacute ; B 24 -14 600 677 ; -C -1 ; WX 722 ; N Ohorngrave ; B 53 -16 839 883 ; -C -1 ; WX 537 ; N ohorngrave ; B 24 -14 600 677 ; -C -1 ; WX 722 ; N Ohornhookabove ; B 53 -16 839 891 ; -C -1 ; WX 537 ; N ohornhookabove ; B 24 -14 600 674 ; -C -1 ; WX 722 ; N Ohorntilde ; B 53 -16 839 842 ; -C -1 ; WX 537 ; N ohorntilde ; B 24 -14 600 662 ; -C -1 ; WX 722 ; N Ohorndotbelow ; B 53 -212 839 721 ; -C -1 ; WX 537 ; N ohorndotbelow ; B 24 -212 600 512 ; -C -1 ; WX 722 ; N Udotbelow ; B 94 -212 809 662 ; -C -1 ; WX 556 ; N udotbelow ; B 32 -212 516 453 ; -C -1 ; WX 722 ; N Uhookabove ; B 94 -15 809 891 ; -C -1 ; WX 556 ; N uhookabove ; B 32 -14 516 674 ; -C -1 ; WX 775 ; N Uhornacute ; B 94 -15 929 887 ; -C -1 ; WX 599 ; N uhornacute ; B 34 -14 655 677 ; -C -1 ; WX 775 ; N Uhorngrave ; B 94 -15 929 883 ; -C -1 ; WX 599 ; N uhorngrave ; B 34 -14 655 677 ; -C -1 ; WX 775 ; N Uhornhookabove ; B 94 -15 929 891 ; -C -1 ; WX 599 ; N uhornhookabove ; B 34 -14 655 674 ; -C -1 ; WX 775 ; N Uhorntilde ; B 94 -15 929 863 ; -C -1 ; WX 599 ; N uhorntilde ; B 34 -14 655 662 ; -C -1 ; WX 775 ; N Uhorndotbelow ; B 94 -212 929 801 ; -C -1 ; WX 599 ; N uhorndotbelow ; B 34 -212 655 467 ; -C -1 ; WX 611 ; N Ydotbelow ; B 93 -212 717 662 ; -C -1 ; WX 444 ; N ydotbelow ; B -92 -216 444 453 ; -C -1 ; WX 611 ; N Yhookabove ; B 93 0 717 891 ; -C -1 ; WX 444 ; N yhookabove ; B -92 -216 444 674 ; -C -1 ; WX 611 ; N Ytilde ; B 93 0 717 842 ; -C -1 ; WX 444 ; N ytilde ; B -92 -216 466 662 ; -C -1 ; WX 667 ; N uni01CD ; B -57 0 750 877 ; -C -1 ; WX 500 ; N uni01CE ; B 20 -14 535 677 ; -C -1 ; WX 389 ; N uni01CF ; B -35 0 511 877 ; -C -1 ; WX 278 ; N uni01D0 ; B 22 -14 399 677 ; -C -1 ; WX 722 ; N uni01D1 ; B 53 -16 718 877 ; -C -1 ; WX 500 ; N uni01D2 ; B 24 -14 526 677 ; -C -1 ; WX 722 ; N uni01D3 ; B 94 -15 809 877 ; -C -1 ; WX 556 ; N uni01D4 ; B 32 -14 521 677 ; -C -1 ; WX 722 ; N uni01D5 ; B 94 -15 809 891 ; -C -1 ; WX 556 ; N uni01D6 ; B 32 -14 554 764 ; -C -1 ; WX 722 ; N uni01D7 ; B 94 -15 809 891 ; -C -1 ; WX 556 ; N uni01D8 ; B 32 -14 521 831 ; -C -1 ; WX 722 ; N uni01D9 ; B 94 -15 809 891 ; -C -1 ; WX 556 ; N uni01DA ; B 32 -14 544 832 ; -C -1 ; WX 722 ; N uni01DB ; B 94 -15 809 891 ; -C -1 ; WX 556 ; N uni01DC ; B 32 -14 516 831 ; -C -1 ; WX 0 ; N _d_912 ; B 93 706 376 891 ; -C -1 ; WX 0 ; N _d_913 ; B 93 706 334 891 ; -C -1 ; WX 0 ; N _d_914 ; B 93 706 358 891 ; -C -1 ; WX 0 ; N _d_915 ; B 93 706 334 891 ; -C -1 ; WX 604 ; N uni0492 ; B -32 0 684 662 ; -C -1 ; WX 369 ; N uni0493 ; B -10 -14 372 453 ; -C -1 ; WX 918 ; N uni0496 ; B -63 -191 976 670 ; -C -1 ; WX 952 ; N uni0497 ; B -4 -187 952 453 ; -C -1 ; WX 678 ; N uni049a ; B -35 -191 737 670 ; -C -1 ; WX 507 ; N uni049b ; B 12 -187 510 453 ; -C -1 ; WX 678 ; N uni049c ; B -35 0 737 670 ; -C -1 ; WX 507 ; N uni049d ; B 12 0 510 453 ; -C -1 ; WX 778 ; N uni04a2 ; B -32 -191 862 662 ; -C -1 ; WX 555 ; N uni04a3 ; B 13 -187 516 453 ; -C -1 ; WX 611 ; N uni04ae ; B 93 0 717 662 ; -C -1 ; WX 500 ; N uni04af ; B 7 -214 544 439 ; -C -1 ; WX 611 ; N uni04b0 ; B 86 0 717 662 ; -C -1 ; WX 500 ; N uni04b1 ; B -25 -214 544 439 ; -C -1 ; WX 667 ; N uni04b2 ; B -61 -191 763 662 ; -C -1 ; WX 500 ; N uni04b3 ; B -45 -187 508 453 ; -C -1 ; WX 748 ; N uni04b8 ; B 120 0 829 662 ; -C -1 ; WX 525 ; N uni04b9 ; B 48 -14 486 453 ; -C -1 ; WX 748 ; N uni04ba ; B -33 0 675 662 ; -C -1 ; WX 556 ; N uni04bb ; B 13 -6 503 453 ; -C -1 ; WX 722 ; N uni018f ; B 53 -15 718 677 ; -C -1 ; WX 444 ; N uni0259 ; B 1 -14 419 453 ; -C -1 ; WX 722 ; N uni04e8 ; B 53 -16 718 678 ; -C -1 ; WX 500 ; N uni04e9 ; B 24 -14 470 453 ; -EndCharMetrics -StartKernData -StartKernPairs 845 -KPX space A -37 -KPX space W -18 -KPX space Y -18 -KPX space Alphatonos -37 -KPX space Upsilontonos -18 -KPX space Alpha -37 -KPX space Delta -37 -KPX space Lambda -37 -KPX space Upsilon -18 -KPX space Upsilondieresis -18 -KPX one one -55 -KPX A space -55 -KPX A T -55 -KPX A V -74 -KPX A W -92 -KPX A Y -55 -KPX A v -74 -KPX A w -74 -KPX A y -74 -KPX A quoteright -74 -KPX F space -18 -KPX F comma -129 -KPX F period -129 -KPX F A -92 -KPX L space -37 -KPX L T -18 -KPX L V -37 -KPX L W -37 -KPX L Y -37 -KPX L y -37 -KPX L quoteright -55 -KPX P space -37 -KPX P comma -129 -KPX P period -129 -KPX P A -74 -KPX R V -18 -KPX R W -18 -KPX R Y -18 -KPX R y -18 -KPX T comma -92 -KPX T hyphen -92 -KPX T period -92 -KPX T colon -74 -KPX T semicolon -74 -KPX T A -55 -KPX T O -18 -KPX T a -92 -KPX T c -92 -KPX T e -92 -KPX T i -37 -KPX T o -92 -KPX T r -37 -KPX T s -92 -KPX T u -37 -KPX T w -37 -KPX T y -37 -KPX V space -18 -KPX V comma -129 -KPX V hyphen -55 -KPX V period -129 -KPX V colon -74 -KPX V semicolon -74 -KPX V A -74 -KPX V a -111 -KPX V e -111 -KPX V i -55 -KPX V o -111 -KPX V r -55 -KPX V u -55 -KPX V y -74 -KPX W space -18 -KPX W comma -74 -KPX W hyphen -37 -KPX W period -74 -KPX W colon -55 -KPX W semicolon -55 -KPX W A -74 -KPX W a -74 -KPX W e -74 -KPX W i -37 -KPX W o -74 -KPX W r -74 -KPX W u -55 -KPX W y -55 -KPX Y space -37 -KPX Y comma -92 -KPX Y hyphen -92 -KPX Y period -74 -KPX Y colon -92 -KPX Y semicolon -92 -KPX Y A -74 -KPX Y a -92 -KPX Y e -111 -KPX Y i -55 -KPX Y o -111 -KPX Y p -74 -KPX Y q -111 -KPX Y u -92 -KPX Y v -92 -KPX f f -18 -KPX f quoteright 55 -KPX r comma -55 -KPX r period -55 -KPX r quoteright 37 -KPX v comma -37 -KPX v period -37 -KPX w comma -37 -KPX w period -37 -KPX y comma -37 -KPX y period -37 -KPX quoteleft quoteleft -74 -KPX quoteright space -74 -KPX quoteright s -74 -KPX quoteright t -37 -KPX quoteright quoteright -74 -KPX quotesinglbase afii10051 -113 -KPX quotesinglbase afii10060 -113 -KPX quotesinglbase afii10036 -113 -KPX quotesinglbase afii10041 -176 -KPX quotesinglbase afii10044 -88 -KPX quotedblbase afii10051 -113 -KPX quotedblbase afii10060 -113 -KPX quotedblbase afii10036 -113 -KPX quotedblbase afii10041 -125 -KPX quotedblbase afii10044 -50 -KPX Gamma space -18 -KPX Gamma comma -128 -KPX Gamma period -128 -KPX Gamma iotadieresistonos 76 -KPX Gamma Alpha -150 -KPX Gamma Delta -131 -KPX Gamma Lambda -150 -KPX Gamma iota -37 -KPX Theta Alpha -44 -KPX Theta Delta -19 -KPX Theta Lambda -44 -KPX Theta Upsilon -51 -KPX Theta Upsilondieresis -51 -KPX Phi Alpha -44 -KPX Phi Upsilon -68 -KPX Phi Upsilondieresis -68 -KPX delta tau -14 -KPX delta lambda -18 -KPX delta chi -31 -KPX delta pi -14 -KPX tau alpha -14 -KPX tau delta -14 -KPX tau sigma -14 -KPX tau phi -14 -KPX tau alphatonos -14 -KPX tau omicron -14 -KPX tau sigma1 -14 -KPX tau omega -14 -KPX tau omicrontonos -14 -KPX tau omegatonos -14 -KPX phi tau -14 -KPX phi lambda -18 -KPX phi chi -31 -KPX Alphatonos space -55 -KPX Alphatonos Theta -25 -KPX Alphatonos Phi -25 -KPX Alphatonos Omicron -25 -KPX Alphatonos Tau -82 -KPX Alphatonos Upsilon -93 -KPX Alphatonos Upsilondieresis -93 -KPX Alphatonos gamma -38 -KPX Alphatonos nu -74 -KPX Alphatonos chi -33 -KPX Omicrontonos Upsilon -51 -KPX Omicrontonos Upsilondieresis -51 -KPX Upsilontonos alpha -91 -KPX Upsilontonos delta -91 -KPX Upsilontonos sigma -91 -KPX Upsilontonos phi -91 -KPX Upsilontonos iotadieresistonos 76 -KPX Upsilontonos Alpha -74 -KPX Upsilontonos Delta -74 -KPX Upsilontonos Lambda -74 -KPX Upsilontonos alphatonos -91 -KPX Upsilontonos etatonos -26 -KPX Upsilontonos iotatonos -26 -KPX Upsilontonos eta -26 -KPX Upsilontonos iota -26 -KPX Upsilontonos kappa -26 -KPX Upsilontonos mu -26 -KPX Upsilontonos omicron -91 -KPX Upsilontonos omicrontonos -91 -KPX Omegatonos Upsilon -46 -KPX Alpha space -55 -KPX Alpha quoteright -74 -KPX Alpha Theta -25 -KPX Alpha Phi -25 -KPX Alpha Omicron -25 -KPX Alpha Tau -82 -KPX Alpha Upsilon -93 -KPX Alpha Upsilondieresis -93 -KPX Alpha gamma -38 -KPX Alpha nu -74 -KPX Alpha chi -33 -KPX Delta space -55 -KPX Delta Theta -19 -KPX Delta Omicron -19 -KPX Delta Tau -68 -KPX Delta Upsilon -93 -KPX Delta Upsilondieresis -93 -KPX Kappa Theta -44 -KPX Kappa Phi -74 -KPX Kappa alpha -31 -KPX Kappa delta -31 -KPX Kappa sigma -31 -KPX Kappa phi -31 -KPX Kappa Omicron -44 -KPX Kappa alphatonos -31 -KPX Kappa zeta -31 -KPX Kappa theta -31 -KPX Kappa xi -31 -KPX Kappa omicron -31 -KPX Kappa omega -31 -KPX Kappa omicrontonos -31 -KPX Kappa omegatonos -31 -KPX Lambda space -55 -KPX Lambda Theta -25 -KPX Lambda Omicron -25 -KPX Lambda Tau -82 -KPX Lambda Upsilon -93 -KPX Lambda Upsilondieresis -93 -KPX Omicron Alphatonos -44 -KPX Omicron Alpha -44 -KPX Omicron Delta -19 -KPX Omicron Lambda -44 -KPX Omicron Upsilon -51 -KPX Omicron Upsilondieresis -51 -KPX Rho space -37 -KPX Rho comma -128 -KPX Rho period -128 -KPX Rho Alpha -145 -KPX Rho Delta -119 -KPX Rho Lambda -145 -KPX Sigma tau -44 -KPX Tau comma -91 -KPX Tau hyphen -91 -KPX Tau period -91 -KPX Tau colon -74 -KPX Tau semicolon -74 -KPX Tau Theta -18 -KPX Tau Phi -18 -KPX Tau alpha -91 -KPX Tau delta -91 -KPX Tau epsilon -91 -KPX Tau sigma -91 -KPX Tau phi -91 -KPX Tau iotadieresistonos 95 -KPX Tau Alpha -79 -KPX Tau Delta -76 -KPX Tau Lambda -79 -KPX Tau Omicron -18 -KPX Tau Omega -18 -KPX Tau alphatonos -91 -KPX Tau epsilontonos -91 -KPX Tau eta -37 -KPX Tau iota -37 -KPX Tau mu -37 -KPX Tau omicron -91 -KPX Tau upsilon -37 -KPX Tau chi -37 -KPX Tau psi -37 -KPX Tau iotadieresis 50 -KPX Tau upsilondieresis -37 -KPX Tau omicrontonos -91 -KPX Tau upsilontonos -37 -KPX Upsilon comma -91 -KPX Upsilon hyphen -91 -KPX Upsilon period -91 -KPX Upsilon colon -91 -KPX Upsilon semicolon -91 -KPX Upsilon Theta -17 -KPX Upsilon Phi -25 -KPX Upsilon alpha -91 -KPX Upsilon delta -91 -KPX Upsilon sigma -91 -KPX Upsilon phi -91 -KPX Upsilon iotadieresistonos 76 -KPX Upsilon Alpha -74 -KPX Upsilon Delta -57 -KPX Upsilon Lambda -74 -KPX Upsilon Omicron -17 -KPX Upsilon alphatonos -91 -KPX Upsilon etatonos -26 -KPX Upsilon iotatonos -26 -KPX Upsilon gamma -68 -KPX Upsilon eta -26 -KPX Upsilon iota -26 -KPX Upsilon kappa -26 -KPX Upsilon mu -26 -KPX Upsilon omicron -91 -KPX Upsilon omicrontonos -91 -KPX Psi alpha -57 -KPX Psi delta -57 -KPX Psi sigma -57 -KPX Psi phi -57 -KPX Psi alphatonos -57 -KPX Psi theta -19 -KPX Psi omicron -57 -KPX Psi omega -57 -KPX Psi omicrontonos -57 -KPX Psi omegatonos -57 -KPX Omega Upsilon -46 -KPX Omega Upsilondieresis -46 -KPX Upsilondieresis Theta -17 -KPX Upsilondieresis Phi -25 -KPX Upsilondieresis alpha -91 -KPX Upsilondieresis delta -91 -KPX Upsilondieresis sigma -91 -KPX Upsilondieresis phi -91 -KPX Upsilondieresis iotadieresistonos 76 -KPX Upsilondieresis Alpha -74 -KPX Upsilondieresis Delta -57 -KPX Upsilondieresis Lambda -74 -KPX Upsilondieresis Omicron -17 -KPX Upsilondieresis alphatonos -91 -KPX Upsilondieresis etatonos -26 -KPX Upsilondieresis iotatonos -26 -KPX Upsilondieresis eta -26 -KPX Upsilondieresis iota -26 -KPX Upsilondieresis kappa -26 -KPX Upsilondieresis mu -26 -KPX Upsilondieresis omicron -91 -KPX Upsilondieresis omicrontonos -91 -KPX zeta alpha -50 -KPX zeta delta -42 -KPX zeta sigma -50 -KPX zeta tau -83 -KPX zeta phi -50 -KPX zeta alphatonos -50 -KPX zeta etatonos -28 -KPX zeta gamma -42 -KPX zeta eta -28 -KPX zeta theta -42 -KPX zeta iota -28 -KPX zeta kappa -28 -KPX zeta nu -42 -KPX zeta omicron -50 -KPX zeta omega -50 -KPX zeta omicrontonos -50 -KPX zeta omegatonos -50 -KPX zeta pi -19 -KPX kappa alpha -19 -KPX kappa delta -19 -KPX kappa sigma -19 -KPX kappa phi -19 -KPX kappa alphatonos -19 -KPX kappa zeta -19 -KPX kappa xi -19 -KPX kappa omicron -19 -KPX kappa sigma1 -19 -KPX kappa omega -19 -KPX kappa omicrontonos -19 -KPX kappa omegatonos -19 -KPX lambda delta -18 -KPX lambda sigma -18 -KPX lambda upsilondieresistonos -15 -KPX lambda zeta -9 -KPX lambda xi -12 -KPX lambda sigma1 -21 -KPX lambda upsilon -15 -KPX lambda upsilondieresis -15 -KPX lambda upsilontonos -15 -KPX xi alpha -25 -KPX xi delta -25 -KPX xi sigma -25 -KPX xi phi -25 -KPX xi alphatonos -25 -KPX xi zeta -25 -KPX xi xi -25 -KPX xi omicron -25 -KPX xi sigma1 -25 -KPX xi omicrontonos -25 -KPX omicron tau -14 -KPX omicron lambda -18 -KPX omicron chi -31 -KPX omicron pi -14 -KPX rho chi -31 -KPX chi alpha -31 -KPX chi delta -31 -KPX chi sigma -31 -KPX chi phi -15 -KPX chi alphatonos -31 -KPX chi zeta -15 -KPX chi omicron -31 -KPX chi sigma1 -15 -KPX chi omega -31 -KPX chi omicrontonos -31 -KPX chi omegatonos -31 -KPX omega tau -14 -KPX omega chi -31 -KPX omega pi -14 -KPX omicrontonos tau -14 -KPX omicrontonos lambda -18 -KPX omicrontonos chi -31 -KPX omicrontonos pi -14 -KPX omegatonos tau -14 -KPX omegatonos chi -31 -KPX omegatonos pi -14 -KPX afii10052 comma -63 -KPX afii10052 period -75 -KPX afii10052 colon 25 -KPX afii10058 quoteright -121 -KPX afii10059 quoteright -88 -KPX afii10017 quoteright -101 -KPX afii10017 afii10021 14 -KPX afii10017 afii10025 -13 -KPX afii10017 afii10032 -38 -KPX afii10017 afii10033 -25 -KPX afii10017 afii10035 -25 -KPX afii10017 afii10036 -38 -KPX afii10017 afii10037 -63 -KPX afii10017 afii10038 -51 -KPX afii10017 afii10041 -63 -KPX afii10017 afii10047 -50 -KPX afii10017 afii10065 -15 -KPX afii10017 afii10066 -15 -KPX afii10017 afii10070 -15 -KPX afii10017 afii10080 -15 -KPX afii10017 afii10083 -15 -KPX afii10017 afii10085 -33 -KPX afii10017 afii10086 -15 -KPX afii10017 afii10095 -15 -KPX afii10018 afii10017 -27 -KPX afii10018 afii10021 12 -KPX afii10018 afii10025 37 -KPX afii10018 afii10037 -40 -KPX afii10018 afii10038 -27 -KPX afii10018 afii10039 -13 -KPX afii10018 afii10041 -27 -KPX afii10018 afii10044 -28 -KPX afii10018 afii10047 -14 -KPX afii10018 afii10069 12 -KPX afii10018 afii10085 -12 -KPX afii10018 afii10097 23 -KPX afii10019 afii10017 -38 -KPX afii10019 afii10021 -53 -KPX afii10019 afii10024 -40 -KPX afii10019 afii10025 -34 -KPX afii10019 afii10032 -47 -KPX afii10019 afii10035 -47 -KPX afii10019 afii10036 -57 -KPX afii10019 afii10037 -85 -KPX afii10019 afii10038 -67 -KPX afii10019 afii10039 -25 -KPX afii10019 afii10041 -60 -KPX afii10019 afii10044 -48 -KPX afii10019 afii10049 -47 -KPX afii10019 afii10069 12 -KPX afii10019 afii10078 -13 -KPX afii10019 afii10084 12 -KPX afii10019 afii10087 -14 -KPX afii10019 afii10089 12 -KPX afii10019 afii10097 12 -KPX afii10020 comma -63 -KPX afii10020 period -75 -KPX afii10020 colon 25 -KPX afii10020 afii10017 -75 -KPX afii10020 afii10021 -75 -KPX afii10020 afii10025 19 -KPX afii10020 afii10029 -69 -KPX afii10020 afii10030 -25 -KPX afii10020 afii10032 -13 -KPX afii10020 afii10049 -13 -KPX afii10020 afii10065 -25 -KPX afii10020 afii10067 -38 -KPX afii10020 afii10069 -18 -KPX afii10020 afii10070 -30 -KPX afii10020 afii10074 -19 -KPX afii10020 afii10077 -53 -KPX afii10020 afii10078 -40 -KPX afii10020 afii10079 -30 -KPX afii10020 afii10080 -52 -KPX afii10020 afii10082 -28 -KPX afii10020 afii10085 -43 -KPX afii10020 afii10093 -53 -KPX afii10020 afii10094 -50 -KPX afii10020 afii10096 -65 -KPX afii10020 afii10097 -40 -KPX afii10021 afii10038 -19 -KPX afii10021 afii10085 25 -KPX afii10022 afii10025 -14 -KPX afii10024 afii10032 -53 -KPX afii10024 afii10035 -53 -KPX afii10024 afii10037 -34 -KPX afii10024 afii10041 -34 -KPX afii10024 afii10080 -13 -KPX afii10024 afii10085 -30 -KPX afii10025 afii10036 12 -KPX afii10025 afii10037 -13 -KPX afii10025 afii10041 -50 -KPX afii10025 afii10069 13 -KPX afii10028 afii10032 -47 -KPX afii10028 afii10035 -47 -KPX afii10028 afii10037 -13 -KPX afii10028 afii10038 -80 -KPX afii10028 afii10047 -13 -KPX afii10028 afii10070 -25 -KPX afii10028 afii10080 -38 -KPX afii10028 afii10083 -25 -KPX afii10028 afii10085 -43 -KPX afii10028 afii10095 -25 -KPX afii10029 afii10085 19 -KPX afii10030 afii10038 -25 -KPX afii10030 afii10065 -14 -KPX afii10030 afii10070 -14 -KPX afii10030 afii10080 -14 -KPX afii10030 afii10083 -14 -KPX afii10032 afii10017 -48 -KPX afii10032 afii10021 -25 -KPX afii10032 afii10024 -38 -KPX afii10032 afii10029 -25 -KPX afii10032 afii10037 -58 -KPX afii10032 afii10038 12 -KPX afii10032 afii10039 -50 -KPX afii10032 afii10041 -38 -KPX afii10032 afii10049 -38 -KPX afii10032 afii10072 19 -KPX afii10032 afii10087 19 -KPX afii10034 comma -88 -KPX afii10034 period -100 -KPX afii10034 colon 25 -KPX afii10034 afii10017 -88 -KPX afii10034 afii10021 -99 -KPX afii10034 afii10024 -52 -KPX afii10034 afii10025 -33 -KPX afii10034 afii10029 -78 -KPX afii10034 afii10030 -25 -KPX afii10034 afii10032 -13 -KPX afii10034 afii10037 -71 -KPX afii10034 afii10038 -27 -KPX afii10034 afii10039 -63 -KPX afii10034 afii10049 -41 -KPX afii10034 afii10065 -38 -KPX afii10034 afii10069 -36 -KPX afii10034 afii10070 -36 -KPX afii10034 afii10080 -36 -KPX afii10034 afii10097 -25 -KPX afii10035 afii10017 -38 -KPX afii10035 afii10029 12 -KPX afii10035 afii10037 -13 -KPX afii10035 afii10039 -13 -KPX afii10035 afii10041 -13 -KPX afii10035 afii10065 7 -KPX afii10035 afii10066 7 -KPX afii10035 afii10070 7 -KPX afii10035 afii10072 7 -KPX afii10035 afii10073 7 -KPX afii10035 afii10080 7 -KPX afii10035 afii10083 7 -KPX afii10035 afii10084 14 -KPX afii10035 afii10086 7 -KPX afii10035 afii10095 7 -KPX afii10036 comma -50 -KPX afii10036 period -63 -KPX afii10036 colon 37 -KPX afii10036 semicolon 12 -KPX afii10036 guillemotleft 25 -KPX afii10036 guillemotright 25 -KPX afii10036 afii10017 -63 -KPX afii10036 afii10021 25 -KPX afii10036 afii10038 -27 -KPX afii10036 afii10047 7 -KPX afii10036 afii10065 -36 -KPX afii10036 afii10067 -36 -KPX afii10036 afii10070 -36 -KPX afii10036 afii10074 -24 -KPX afii10036 afii10076 -36 -KPX afii10036 afii10077 -36 -KPX afii10036 afii10078 -36 -KPX afii10036 afii10080 -36 -KPX afii10036 afii10081 -24 -KPX afii10036 afii10082 -25 -KPX afii10036 afii10083 -36 -KPX afii10036 afii10085 -24 -KPX afii10036 afii10087 -24 -KPX afii10036 afii10091 -24 -KPX afii10036 afii10093 -36 -KPX afii10036 afii10094 -36 -KPX afii10036 afii10096 -36 -KPX afii10036 afii10097 -24 -KPX afii10037 comma -51 -KPX afii10037 period -63 -KPX afii10037 colon 25 -KPX afii10037 guillemotleft 12 -KPX afii10037 guillemotright 25 -KPX afii10037 afii10017 -75 -KPX afii10037 afii10021 -40 -KPX afii10037 afii10029 -65 -KPX afii10037 afii10032 -27 -KPX afii10037 afii10038 -53 -KPX afii10037 afii10049 -53 -KPX afii10037 afii10066 -13 -KPX afii10037 afii10067 -47 -KPX afii10037 afii10068 -50 -KPX afii10037 afii10069 -13 -KPX afii10037 afii10070 -47 -KPX afii10037 afii10072 -50 -KPX afii10037 afii10073 -31 -KPX afii10037 afii10074 -15 -KPX afii10037 afii10075 -13 -KPX afii10037 afii10076 -25 -KPX afii10037 afii10077 -50 -KPX afii10037 afii10078 -50 -KPX afii10037 afii10079 -25 -KPX afii10037 afii10080 -47 -KPX afii10037 afii10081 -28 -KPX afii10037 afii10082 -40 -KPX afii10037 afii10083 -47 -KPX afii10037 afii10087 -22 -KPX afii10037 afii10088 -13 -KPX afii10037 afii10090 -13 -KPX afii10037 afii10091 -13 -KPX afii10037 afii10096 -28 -KPX afii10037 afii10097 -47 -KPX afii10038 afii10017 -50 -KPX afii10038 afii10021 -47 -KPX afii10038 afii10029 -13 -KPX afii10038 afii10030 -6 -KPX afii10038 afii10032 12 -KPX afii10038 afii10036 -13 -KPX afii10038 afii10037 -77 -KPX afii10038 afii10041 -34 -KPX afii10038 afii10049 -13 -KPX afii10038 afii10077 -15 -KPX afii10039 afii10032 -51 -KPX afii10039 afii10035 -38 -KPX afii10039 afii10038 -25 -KPX afii10039 afii10080 -20 -KPX afii10044 quoteright -121 -KPX afii10044 afii10049 -18 -KPX afii10046 quoteright -121 -KPX afii10046 afii10017 -34 -KPX afii10046 afii10021 -13 -KPX afii10046 afii10024 -28 -KPX afii10046 afii10025 -13 -KPX afii10046 afii10030 -20 -KPX afii10046 afii10032 -25 -KPX afii10046 afii10035 -20 -KPX afii10046 afii10036 -51 -KPX afii10046 afii10039 -40 -KPX afii10046 afii10041 -112 -KPX afii10046 afii10047 -38 -KPX afii10046 afii10049 -13 -KPX afii10047 afii10024 -13 -KPX afii10047 afii10025 25 -KPX afii10047 afii10029 -13 -KPX afii10047 afii10039 -38 -KPX afii10047 afii10049 -13 -KPX afii10047 afii10069 14 -KPX afii10047 afii10072 14 -KPX afii10047 afii10077 -7 -KPX afii10047 afii10078 -14 -KPX afii10047 afii10097 14 -KPX afii10048 afii10017 -56 -KPX afii10048 afii10021 -13 -KPX afii10048 afii10024 -25 -KPX afii10048 afii10029 -25 -KPX afii10048 afii10032 -13 -KPX afii10048 afii10036 -13 -KPX afii10048 afii10039 -51 -KPX afii10048 afii10041 -25 -KPX afii10048 afii10069 7 -KPX afii10048 afii10072 7 -KPX afii10065 afii10085 -13 -KPX afii10065 afii10089 -13 -KPX afii10066 afii10072 -13 -KPX afii10066 afii10073 -13 -KPX afii10066 afii10077 -25 -KPX afii10066 afii10078 -38 -KPX afii10066 afii10080 -13 -KPX afii10066 afii10083 -13 -KPX afii10066 afii10085 -13 -KPX afii10066 afii10086 -13 -KPX afii10066 afii10087 -20 -KPX afii10066 afii10089 -13 -KPX afii10066 afii10092 -25 -KPX afii10066 afii10095 -13 -KPX afii10066 afii10097 -25 -KPX afii10067 afii10065 -7 -KPX afii10067 afii10066 -13 -KPX afii10067 afii10069 -19 -KPX afii10067 afii10070 -12 -KPX afii10067 afii10073 -13 -KPX afii10067 afii10080 -13 -KPX afii10067 afii10083 -13 -KPX afii10067 afii10086 -7 -KPX afii10067 afii10092 -13 -KPX afii10067 afii10097 -13 -KPX afii10068 period -13 -KPX afii10068 afii10077 -13 -KPX afii10069 afii10085 -13 -KPX afii10069 afii10092 -13 -KPX afii10069 afii10095 -13 -KPX afii10070 afii10065 -13 -KPX afii10070 afii10066 -13 -KPX afii10070 afii10069 -25 -KPX afii10070 afii10072 -25 -KPX afii10070 afii10073 -13 -KPX afii10070 afii10077 -25 -KPX afii10070 afii10078 -25 -KPX afii10070 afii10080 -13 -KPX afii10070 afii10083 -13 -KPX afii10070 afii10084 -13 -KPX afii10070 afii10086 -25 -KPX afii10070 afii10087 -13 -KPX afii10070 afii10089 -13 -KPX afii10072 afii10065 -13 -KPX afii10072 afii10066 -13 -KPX afii10072 afii10070 -13 -KPX afii10072 afii10073 -13 -KPX afii10072 afii10080 -25 -KPX afii10072 afii10083 -25 -KPX afii10072 afii10089 -13 -KPX afii10072 afii10092 -13 -KPX afii10073 afii10069 -13 -KPX afii10073 afii10072 -13 -KPX afii10073 afii10073 -13 -KPX afii10073 afii10077 -25 -KPX afii10073 afii10078 -25 -KPX afii10073 afii10080 -13 -KPX afii10073 afii10083 -13 -KPX afii10073 afii10085 -7 -KPX afii10073 afii10089 -13 -KPX afii10073 afii10092 -13 -KPX afii10076 guillemotleft -27 -KPX afii10076 afii10065 -25 -KPX afii10076 afii10066 -25 -KPX afii10076 afii10070 -30 -KPX afii10076 afii10073 -13 -KPX afii10076 afii10077 20 -KPX afii10076 afii10080 -38 -KPX afii10076 afii10083 -38 -KPX afii10076 afii10084 -13 -KPX afii10076 afii10086 -25 -KPX afii10076 afii10089 -13 -KPX afii10076 afii10095 -13 -KPX afii10077 afii10085 -13 -KPX afii10077 afii10089 -13 -KPX afii10080 afii10069 -13 -KPX afii10080 afii10072 -25 -KPX afii10080 afii10073 -13 -KPX afii10080 afii10077 -25 -KPX afii10080 afii10078 -38 -KPX afii10080 afii10085 -20 -KPX afii10080 afii10087 -20 -KPX afii10080 afii10089 -26 -KPX afii10080 afii10095 -13 -KPX afii10080 afii10097 -13 -KPX afii10082 afii10069 -13 -KPX afii10082 afii10072 -25 -KPX afii10082 afii10073 -13 -KPX afii10082 afii10077 -38 -KPX afii10082 afii10078 -50 -KPX afii10082 afii10084 -13 -KPX afii10082 afii10085 -13 -KPX afii10082 afii10087 -20 -KPX afii10082 afii10089 -13 -KPX afii10082 afii10095 -13 -KPX afii10082 afii10097 -13 -KPX afii10083 afii10065 -26 -KPX afii10083 afii10066 -13 -KPX afii10083 afii10070 -13 -KPX afii10083 afii10072 -13 -KPX afii10083 afii10073 -13 -KPX afii10083 afii10080 -25 -KPX afii10083 afii10085 -7 -KPX afii10083 afii10086 -25 -KPX afii10083 afii10087 -13 -KPX afii10083 afii10089 -13 -KPX afii10083 afii10092 -13 -KPX afii10084 comma 25 -KPX afii10084 period 12 -KPX afii10084 afii10069 -13 -KPX afii10084 afii10070 -13 -KPX afii10084 afii10073 12 -KPX afii10084 afii10080 -13 -KPX afii10084 afii10085 -25 -KPX afii10084 afii10097 12 -KPX afii10085 comma -50 -KPX afii10085 period -63 -KPX afii10085 colon -13 -KPX afii10085 semicolon -38 -KPX afii10085 afii10069 -3 -KPX afii10085 afii10072 -25 -KPX afii10085 afii10073 -13 -KPX afii10085 afii10077 -27 -KPX afii10085 afii10078 -25 -KPX afii10085 afii10082 -13 -KPX afii10085 afii10087 -13 -KPX afii10085 afii10097 -15 -KPX afii10086 afii10077 -25 -KPX afii10086 afii10078 -38 -KPX afii10086 afii10085 -26 -KPX afii10086 afii10089 -13 -KPX afii10086 afii10097 -13 -KPX afii10087 afii10065 -13 -KPX afii10087 afii10066 -25 -KPX afii10087 afii10073 -13 -KPX afii10087 afii10080 -25 -KPX afii10087 afii10083 -25 -KPX afii10087 afii10086 -25 -KPX afii10087 afii10089 -13 -KPX afii10087 afii10092 -25 -KPX afii10087 afii10095 -13 -KPX afii10088 afii10085 12 -KPX afii10091 afii10085 31 -KPX afii10094 afii10089 -38 -KPX afii10095 afii10066 -13 -KPX afii10095 afii10069 -13 -KPX afii10095 afii10072 -25 -KPX afii10095 afii10073 -13 -KPX afii10095 afii10077 -25 -KPX afii10095 afii10078 -38 -KPX afii10095 afii10080 -13 -KPX afii10095 afii10083 -13 -KPX afii10095 afii10084 -13 -KPX afii10095 afii10086 -13 -KPX afii10095 afii10087 -20 -KPX afii10095 afii10097 -25 -KPX afii10096 afii10066 -13 -KPX afii10096 afii10072 -13 -KPX afii10096 afii10077 -25 -KPX afii10096 afii10078 -38 -KPX afii10096 afii10080 -13 -KPX afii10096 afii10083 -13 -KPX afii10096 afii10087 -28 -KPX afii10096 afii10089 -13 -KPX afii10096 afii10095 -13 -KPX afii10110 comma -50 -KPX afii10110 period -63 -KPX afii10110 colon -13 -KPX afii10110 semicolon -38 -KPX afii10110 guillemotleft 12 -KPX afii10110 guillemotright 12 -KPX afii10050 comma -25 -KPX afii10050 period -38 -KPX afii10050 colon 25 -KPX afii10050 guillemotleft 25 -KPX afii10050 guillemotright 25 -KPX pi omicron -14 -EndKernPairs -EndKernData -EndFontMetrics +StartFontMetrics 4.1 +FontName TimesNewRomanPS-BoldItalicMT +FullName Times New Roman Bold Italic +Notice Typeface The Monotype Corporation plc. Data The Monotype Corporation plc/Type Solutions Inc. 1990-1992. All Rights Reserved +EncodingScheme FontSpecific +FamilyName Times New Roman +Weight Bold Italic +Version Version 2.90 +Characters 940 +ItalicAngle -17.3 +Ascender 891 +Descender -216 +UnderlineThickness 95 +UnderlinePosition -109 +IsFixedPitch false +FontBBox -547 -307 1206 1032 +StartCharMetrics 975 +C 0 ; WX 778 ; N .notdef ; B 125 0 625 625 ; +C 1 ; WX 778 ; N .notdef ; B 125 0 625 625 ; +C 2 ; WX 778 ; N .notdef ; B 125 0 625 625 ; +C 3 ; WX 778 ; N .notdef ; B 125 0 625 625 ; +C 4 ; WX 778 ; N .notdef ; B 125 0 625 625 ; +C 5 ; WX 778 ; N .notdef ; B 125 0 625 625 ; +C 6 ; WX 778 ; N .notdef ; B 125 0 625 625 ; +C 7 ; WX 778 ; N .notdef ; B 125 0 625 625 ; +C 8 ; WX 778 ; N .notdef ; B 125 0 625 625 ; +C 9 ; WX 778 ; N .notdef ; B 125 0 625 625 ; +C 10 ; WX 778 ; N .notdef ; B 125 0 625 625 ; +C 11 ; WX 778 ; N .notdef ; B 125 0 625 625 ; +C 12 ; WX 778 ; N .notdef ; B 125 0 625 625 ; +C 13 ; WX 778 ; N .notdef ; B 125 0 625 625 ; +C 14 ; WX 778 ; N .notdef ; B 125 0 625 625 ; +C 15 ; WX 778 ; N .notdef ; B 125 0 625 625 ; +C 16 ; WX 778 ; N .notdef ; B 125 0 625 625 ; +C 17 ; WX 778 ; N .notdef ; B 125 0 625 625 ; +C 18 ; WX 778 ; N .notdef ; B 125 0 625 625 ; +C 19 ; WX 778 ; N .notdef ; B 125 0 625 625 ; +C 20 ; WX 778 ; N .notdef ; B 125 0 625 625 ; +C 21 ; WX 778 ; N .notdef ; B 125 0 625 625 ; +C 22 ; WX 778 ; N .notdef ; B 125 0 625 625 ; +C 23 ; WX 778 ; N .notdef ; B 125 0 625 625 ; +C 24 ; WX 778 ; N .notdef ; B 125 0 625 625 ; +C 25 ; WX 778 ; N .notdef ; B 125 0 625 625 ; +C 26 ; WX 778 ; N .notdef ; B 125 0 625 625 ; +C 27 ; WX 778 ; N .notdef ; B 125 0 625 625 ; +C 28 ; WX 778 ; N .notdef ; B 125 0 625 625 ; +C 29 ; WX 778 ; N .notdef ; B 125 0 625 625 ; +C 30 ; WX 778 ; N .notdef ; B 125 0 625 625 ; +C 31 ; WX 778 ; N .notdef ; B 125 0 625 625 ; +C 32 ; WX 250 ; N space ; B 55 -14 352 677 ; +C 33 ; WX 389 ; N exclam ; B 55 -14 352 677 ; +C 34 ; WX 555 ; N quotedbl ; B 165 352 559 677 ; +C 35 ; WX 500 ; N numbersign ; B 20 -14 480 676 ; +C 36 ; WX 500 ; N dollar ; B 39 -76 500 704 ; +C 37 ; WX 833 ; N percent ; B 108 -28 780 677 ; +C 38 ; WX 778 ; N ampersand ; B 46 -15 707 677 ; +C 39 ; WX 278 ; N quotesingle ; B 156 353 314 677 ; +C 40 ; WX 333 ; N parenleft ; B 50 -190 435 677 ; +C 41 ; WX 333 ; N parenright ; B -113 -190 271 677 ; +C 42 ; WX 500 ; N asterisk ; B 120 299 509 677 ; +C 43 ; WX 570 ; N plus ; B 20 66 553 598 ; +C 44 ; WX 250 ; N comma ; B -28 -161 176 149 ; +C 45 ; WX 333 ; N hyphen ; B 6 168 322 270 ; +C 46 ; WX 250 ; N period ; B -13 -14 147 146 ; +C 47 ; WX 278 ; N slash ; B -81 -15 415 676 ; +C 48 ; WX 500 ; N zero ; B 55 -14 499 676 ; +C 49 ; WX 500 ; N one ; B 23 0 445 676 ; +C 50 ; WX 500 ; N two ; B 4 0 483 676 ; +C 51 ; WX 500 ; N three ; B 12 -14 470 676 ; +C 52 ; WX 500 ; N four ; B 18 -14 502 676 ; +C 53 ; WX 500 ; N five ; B 38 -14 504 662 ; +C 54 ; WX 500 ; N six ; B 60 -14 510 681 ; +C 55 ; WX 500 ; N seven ; B 118 -14 554 662 ; +C 56 ; WX 500 ; N eight ; B 37 -14 491 676 ; +C 57 ; WX 500 ; N nine ; B 42 -14 493 681 ; +C 58 ; WX 333 ; N colon ; B 40 -14 289 452 ; +C 59 ; WX 333 ; N semicolon ; B 0 -161 292 452 ; +C 60 ; WX 570 ; N less ; B 20 90 553 568 ; +C 61 ; WX 570 ; N equal ; B 20 218 554 441 ; +C 62 ; WX 570 ; N greater ; B 20 90 553 568 ; +C 63 ; WX 500 ; N question ; B 88 -14 476 677 ; +C 64 ; WX 832 ; N at ; B 45 -216 908 677 ; +C 65 ; WX 667 ; N A ; B -57 0 600 677 ; +C 66 ; WX 667 ; N B ; B -25 0 645 662 ; +C 67 ; WX 667 ; N C ; B 65 -15 721 677 ; +C 68 ; WX 722 ; N D ; B -36 0 702 662 ; +C 69 ; WX 667 ; N E ; B -35 0 680 662 ; +C 70 ; WX 667 ; N F ; B -32 0 690 662 ; +C 71 ; WX 722 ; N G ; B 69 -15 747 677 ; +C 72 ; WX 778 ; N H ; B -32 0 862 662 ; +C 73 ; WX 389 ; N I ; B -35 0 467 662 ; +C 74 ; WX 500 ; N J ; B -8 -15 598 662 ; +C 75 ; WX 667 ; N K ; B -32 0 747 662 ; +C 76 ; WX 611 ; N L ; B -27 0 575 662 ; +C 77 ; WX 889 ; N M ; B -34 0 974 662 ; +C 78 ; WX 722 ; N N ; B -32 -7 811 662 ; +C 79 ; WX 722 ; N O ; B 53 -16 718 678 ; +C 80 ; WX 611 ; N P ; B -30 0 644 662 ; +C 81 ; WX 722 ; N Q ; B 53 -208 718 677 ; +C 82 ; WX 667 ; N R ; B -32 0 639 662 ; +C 83 ; WX 556 ; N S ; B -22 -15 583 677 ; +C 84 ; WX 611 ; N T ; B 80 0 693 662 ; +C 85 ; WX 722 ; N U ; B 94 -15 809 662 ; +C 86 ; WX 667 ; N V ; B 119 -15 776 662 ; +C 87 ; WX 889 ; N W ; B 123 -15 1002 662 ; +C 88 ; WX 667 ; N X ; B -61 0 763 662 ; +C 89 ; WX 611 ; N Y ; B 93 0 717 662 ; +C 90 ; WX 611 ; N Z ; B -27 0 679 662 ; +C 91 ; WX 333 ; N bracketleft ; B -29 -184 429 662 ; +C 92 ; WX 278 ; N backslash ; B 78 -15 203 676 ; +C 93 ; WX 333 ; N bracketright ; B -111 -184 347 662 ; +C 94 ; WX 570 ; N asciicircum ; B 102 325 540 676 ; +C 95 ; WX 500 ; N underscore ; B -10 -216 508 -152 ; +C 96 ; WX 333 ; N grave ; B 119 508 315 677 ; +C 97 ; WX 500 ; N a ; B 20 -14 479 453 ; +C 98 ; WX 500 ; N b ; B 9 -14 469 677 ; +C 99 ; WX 444 ; N c ; B 28 -14 438 453 ; +C 100 ; WX 500 ; N d ; B 20 -14 545 677 ; +C 101 ; WX 444 ; N e ; B 24 -14 442 453 ; +C 102 ; WX 333 ; N f ; B -160 -216 507 677 ; +C 103 ; WX 500 ; N g ; B -52 -216 517 453 ; +C 104 ; WX 556 ; N h ; B 10 -6 501 677 ; +C 105 ; WX 278 ; N i ; B 22 -14 298 677 ; +C 106 ; WX 278 ; N j ; B -159 -216 299 677 ; +C 107 ; WX 500 ; N k ; B 6 -7 513 677 ; +C 108 ; WX 278 ; N l ; B 16 -14 318 677 ; +C 109 ; WX 778 ; N m ; B 11 -5 726 453 ; +C 110 ; WX 556 ; N n ; B 11 -6 501 453 ; +C 111 ; WX 500 ; N o ; B 24 -14 470 453 ; +C 112 ; WX 500 ; N p ; B -122 -214 474 453 ; +C 113 ; WX 500 ; N q ; B 19 -214 483 453 ; +C 114 ; WX 389 ; N r ; B 17 0 402 453 ; +C 115 ; WX 389 ; N s ; B -2 -14 370 453 ; +C 116 ; WX 278 ; N t ; B 21 -14 313 572 ; +C 117 ; WX 556 ; N u ; B 32 -14 516 453 ; +C 118 ; WX 444 ; N v ; B 30 -14 444 453 ; +C 119 ; WX 667 ; N w ; B 28 -14 663 453 ; +C 120 ; WX 500 ; N x ; B -45 -14 508 453 ; +C 121 ; WX 444 ; N y ; B -92 -216 444 453 ; +C 122 ; WX 389 ; N z ; B -12 -85 395 439 ; +C 123 ; WX 348 ; N braceleft ; B 66 -203 480 677 ; +C 124 ; WX 220 ; N bar ; B 78 -216 141 677 ; +C 125 ; WX 348 ; N braceright ; B -69 -202 344 678 ; +C 126 ; WX 570 ; N asciitilde ; B 19 188 551 347 ; +C 127 ; WX 778 ; N .notdef ; B 125 0 625 625 ; +C 128 ; WX 500 ; N Euro ; B 16 -14 599 676 ; +C 129 ; WX 604 ; N afii10052 ; B -32 0 684 882 ; +C 130 ; WX 333 ; N quotesinglbase ; B 14 -161 218 149 ; +C 131 ; WX 500 ; N florin ; B 0 -216 500 678 ; +C 132 ; WX 500 ; N quotedblbase ; B -29 -162 392 150 ; +C 133 ; WX 1000 ; N ellipsis ; B 85 -13 915 150 ; +C 134 ; WX 500 ; N dagger ; B 86 -214 510 678 ; +C 135 ; WX 500 ; N daggerdbl ; B -6 -216 508 677 ; +C 136 ; WX 333 ; N circumflex ; B 74 511 384 677 ; +C 137 ; WX 1000 ; N perthousand ; B 25 -27 982 677 ; +C 138 ; WX 556 ; N Scaron ; B -22 -15 583 877 ; +C 139 ; WX 333 ; N guilsinglleft ; B 59 -5 306 445 ; +C 140 ; WX 944 ; N OE ; B 62 -5 958 667 ; +C 141 ; WX 678 ; N afii10061 ; B -35 0 737 886 ; +C 142 ; WX 611 ; N Zcaron ; B -27 0 679 877 ; +C 143 ; WX 778 ; N afii10145 ; B -33 -191 858 662 ; +C 144 ; WX 500 ; N quotedblbase ; B -29 -162 392 150 ; +C 145 ; WX 333 ; N quoteleft ; B 142 368 346 677 ; +C 146 ; WX 333 ; N quoteright ; B 144 368 348 677 ; +C 147 ; WX 500 ; N quotedblleft ; B 118 366 539 677 ; +C 148 ; WX 500 ; N quotedblright ; B 118 366 539 677 ; +C 149 ; WX 350 ; N bullet ; B 39 190 318 469 ; +C 150 ; WX 500 ; N endash ; B -7 202 509 261 ; +C 151 ; WX 1000 ; N emdash ; B -10 201 1009 261 ; +C 152 ; WX 333 ; N tilde ; B 89 526 398 662 ; +C 153 ; WX 1000 ; N trademark ; B -1 268 1005 662 ; +C 154 ; WX 389 ; N scaron ; B -2 -14 418 677 ; +C 155 ; WX 333 ; N guilsinglright ; B 28 -5 275 445 ; +C 156 ; WX 722 ; N oe ; B 22 -14 717 453 ; +C 157 ; WX 507 ; N afii10109 ; B 12 0 510 677 ; +C 158 ; WX 389 ; N zcaron ; B -12 -85 418 677 ; +C 159 ; WX 611 ; N Ydieresis ; B 93 0 717 851 ; +C 160 ; WX 250 ; N space ; B 55 -14 352 677 ; +C 161 ; WX 389 ; N exclamdown ; B 20 -216 316 476 ; +C 162 ; WX 500 ; N cent ; B 53 -186 462 644 ; +C 163 ; WX 500 ; N sterling ; B 36 -14 525 676 ; +C 164 ; WX 500 ; N currency ; B 10 93 491 567 ; +C 165 ; WX 500 ; N yen ; B -9 0 614 662 ; +C 166 ; WX 220 ; N brokenbar ; B 78 -216 141 677 ; +C 167 ; WX 500 ; N section ; B -14 -216 530 677 ; +C 168 ; WX 333 ; N dieresis ; B 90 528 401 658 ; +C 169 ; WX 747 ; N copyright ; B 29 -15 722 677 ; +C 170 ; WX 266 ; N ordfeminine ; B 68 396 367 676 ; +C 171 ; WX 500 ; N guillemotleft ; B 41 -5 493 445 ; +C 172 ; WX 606 ; N logicalnot ; B 36 218 570 440 ; +C 173 ; WX 333 ; N hyphen ; B 6 168 322 270 ; +C 174 ; WX 747 ; N registered ; B 29 -15 722 677 ; +C 175 ; WX 500 ; N overscore ; B 125 714 644 778 ; +C 176 ; WX 400 ; N degree ; B 88 338 426 676 ; +C 177 ; WX 549 ; N plusminus ; B 7 66 542 598 ; +C 178 ; WX 300 ; N twosuperior ; B 49 324 344 676 ; +C 179 ; WX 300 ; N threesuperior ; B 54 317 336 676 ; +C 180 ; WX 333 ; N acute ; B 196 506 405 677 ; +C 181 ; WX 576 ; N mu1 ; B -63 -216 529 439 ; +C 182 ; WX 500 ; N paragraph ; B 0 -216 542 662 ; +C 183 ; WX 250 ; N periodcentered ; B 76 252 236 413 ; +C 184 ; WX 333 ; N cedilla ; B 5 -184 228 0 ; +C 185 ; WX 300 ; N onesuperior ; B 60 324 323 676 ; +C 186 ; WX 300 ; N ordmasculine ; B 86 396 375 676 ; +C 187 ; WX 500 ; N guillemotright ; B 7 -5 459 445 ; +C 188 ; WX 750 ; N onequarter ; B 59 -29 705 676 ; +C 189 ; WX 750 ; N onehalf ; B 59 -29 693 676 ; +C 190 ; WX 750 ; N threequarters ; B 53 -29 705 676 ; +C 191 ; WX 500 ; N questiondown ; B 4 -216 392 476 ; +C 192 ; WX 667 ; N Agrave ; B -57 0 624 883 ; +C 193 ; WX 667 ; N Aacute ; B -57 0 737 873 ; +C 194 ; WX 667 ; N Acircumflex ; B -57 0 685 875 ; +C 195 ; WX 667 ; N Atilde ; B -57 0 707 861 ; +C 196 ; WX 667 ; N Adieresis ; B -57 0 721 851 ; +C 197 ; WX 667 ; N Aring ; B -57 0 657 844 ; +C 198 ; WX 944 ; N AE ; B -56 0 958 662 ; +C 199 ; WX 667 ; N Ccedilla ; B 65 -184 721 677 ; +C 200 ; WX 667 ; N Egrave ; B -35 0 680 883 ; +C 201 ; WX 667 ; N Eacute ; B -35 0 680 873 ; +C 202 ; WX 667 ; N Ecircumflex ; B -35 0 680 875 ; +C 203 ; WX 667 ; N Edieresis ; B -35 0 680 851 ; +C 204 ; WX 389 ; N Igrave ; B -35 0 467 883 ; +C 205 ; WX 389 ; N Iacute ; B -35 0 504 873 ; +C 206 ; WX 389 ; N Icircumflex ; B -35 0 468 875 ; +C 207 ; WX 389 ; N Idieresis ; B -35 0 486 851 ; +C 208 ; WX 722 ; N Eth ; B -32 0 708 662 ; +C 209 ; WX 722 ; N Ntilde ; B -32 -7 811 842 ; +C 210 ; WX 722 ; N Ograve ; B 53 -16 718 883 ; +C 211 ; WX 722 ; N Oacute ; B 53 -16 718 887 ; +C 212 ; WX 722 ; N Ocircumflex ; B 53 -16 718 863 ; +C 213 ; WX 722 ; N Otilde ; B 53 -16 718 842 ; +C 214 ; WX 722 ; N Odieresis ; B 53 -16 718 839 ; +C 215 ; WX 570 ; N multiply ; B 75 120 498 543 ; +C 216 ; WX 722 ; N Oslash ; B 42 -16 727 677 ; +C 217 ; WX 722 ; N Ugrave ; B 94 -15 809 883 ; +C 218 ; WX 722 ; N Uacute ; B 94 -15 809 887 ; +C 219 ; WX 722 ; N Ucircumflex ; B 94 -15 809 863 ; +C 220 ; WX 722 ; N Udieresis ; B 94 -15 809 839 ; +C 221 ; WX 611 ; N Yacute ; B 93 0 717 873 ; +C 222 ; WX 611 ; N Thorn ; B -31 0 603 662 ; +C 223 ; WX 500 ; N germandbls ; B -170 -216 506 677 ; +C 224 ; WX 500 ; N agrave ; B 20 -14 479 677 ; +C 225 ; WX 500 ; N aacute ; B 20 -14 483 677 ; +C 226 ; WX 500 ; N acircumflex ; B 20 -14 479 677 ; +C 227 ; WX 500 ; N atilde ; B 20 -14 481 662 ; +C 228 ; WX 500 ; N adieresis ; B 20 -14 486 658 ; +C 229 ; WX 500 ; N aring ; B 20 -14 479 696 ; +C 230 ; WX 722 ; N ae ; B 19 -14 716 453 ; +C 231 ; WX 444 ; N ccedilla ; B 28 -184 438 453 ; +C 232 ; WX 444 ; N egrave ; B 24 -14 442 677 ; +C 233 ; WX 444 ; N eacute ; B 24 -14 507 677 ; +C 234 ; WX 444 ; N ecircumflex ; B 24 -14 442 677 ; +C 235 ; WX 444 ; N edieresis ; B 24 -14 460 658 ; +C 236 ; WX 278 ; N igrave ; B 22 -14 271 677 ; +C 237 ; WX 278 ; N iacute ; B 22 -14 361 677 ; +C 238 ; WX 278 ; N icircumflex ; B 22 -14 340 677 ; +C 239 ; WX 278 ; N idieresis ; B 22 -14 359 658 ; +C 240 ; WX 500 ; N eth ; B 25 -14 486 677 ; +C 241 ; WX 556 ; N ntilde ; B 11 -6 501 662 ; +C 242 ; WX 500 ; N ograve ; B 24 -14 470 677 ; +C 243 ; WX 500 ; N oacute ; B 24 -14 501 677 ; +C 244 ; WX 500 ; N ocircumflex ; B 24 -14 470 677 ; +C 245 ; WX 500 ; N otilde ; B 24 -14 481 662 ; +C 246 ; WX 500 ; N odieresis ; B 24 -14 486 658 ; +C 247 ; WX 549 ; N divide ; B 8 121 542 545 ; +C 248 ; WX 500 ; N oslash ; B 15 -14 485 453 ; +C 249 ; WX 556 ; N ugrave ; B 32 -14 516 677 ; +C 250 ; WX 556 ; N uacute ; B 32 -14 516 677 ; +C 251 ; WX 556 ; N ucircumflex ; B 32 -14 516 677 ; +C 252 ; WX 556 ; N udieresis ; B 32 -14 516 658 ; +C 253 ; WX 444 ; N yacute ; B -92 -216 468 677 ; +C 254 ; WX 500 ; N thorn ; B -122 -216 474 677 ; +C 255 ; WX 444 ; N ydieresis ; B -92 -216 444 658 ; +C -1 ; WX 0 ; N .null ; B 55 -14 352 677 ; +C -1 ; WX 250 ; N nonmarkingreturn ; B 55 -14 352 677 ; +C -1 ; WX 549 ; N notequal ; B 7 -143 542 679 ; +C -1 ; WX 713 ; N infinity ; B 26 52 687 461 ; +C -1 ; WX 549 ; N lessequal ; B 7 -90 542 625 ; +C -1 ; WX 549 ; N greaterequal ; B 7 -90 542 625 ; +C -1 ; WX 494 ; N partialdiff ; B 36 -11 472 700 ; +C -1 ; WX 713 ; N summation ; B 21 -216 693 693 ; +C -1 ; WX 823 ; N product ; B 22 -216 801 693 ; +C -1 ; WX 549 ; N pi1 ; B 23 -14 550 439 ; +C -1 ; WX 274 ; N integral ; B -1 -107 272 910 ; +C -1 ; WX 768 ; N Ohm ; B 4 0 766 741 ; +C -1 ; WX 549 ; N radical ; B 42 -38 550 913 ; +C -1 ; WX 549 ; N approxequal ; B 6 119 543 536 ; +C -1 ; WX 612 ; N increment ; B 14 0 600 677 ; +C -1 ; WX 494 ; N lozenge ; B 23 0 472 694 ; +C -1 ; WX 167 ; N fraction ; B -184 -29 351 676 ; +C -1 ; WX 556 ; N fi ; B -179 -216 529 677 ; +C -1 ; WX 556 ; N fl ; B -180 -216 588 677 ; +C -1 ; WX 278 ; N dotlessi ; B 22 -14 257 453 ; +C -1 ; WX 333 ; N macron ; B 82 533 444 612 ; +C -1 ; WX 333 ; N breve ; B 132 507 403 677 ; +C -1 ; WX 333 ; N dotaccent ; B 193 519 337 663 ; +C -1 ; WX 333 ; N ring ; B 164 493 367 696 ; +C -1 ; WX 333 ; N hungarumlaut ; B 140 508 451 677 ; +C -1 ; WX 333 ; N ogonek ; B -86 -199 130 9 ; +C -1 ; WX 333 ; N caron ; B 109 510 418 677 ; +C -1 ; WX 611 ; N Lslash ; B -27 0 575 662 ; +C -1 ; WX 278 ; N lslash ; B 0 -14 318 677 ; +C -1 ; WX 606 ; N minus ; B 35 299 569 363 ; +C -1 ; WX 500 ; N franc ; B -68 0 595 662 ; +C -1 ; WX 722 ; N Gbreve ; B 69 -15 747 885 ; +C -1 ; WX 500 ; N gbreve ; B -52 -216 517 677 ; +C -1 ; WX 389 ; N Idot ; B -35 0 467 871 ; +C -1 ; WX 556 ; N Scedilla ; B -22 -184 583 677 ; +C -1 ; WX 389 ; N scedilla ; B -2 -184 370 453 ; +C -1 ; WX 667 ; N Cacute ; B 65 -15 721 873 ; +C -1 ; WX 444 ; N cacute ; B 28 -14 474 677 ; +C -1 ; WX 667 ; N Ccaron ; B 65 -15 721 877 ; +C -1 ; WX 444 ; N ccaron ; B 28 -14 509 677 ; +C -1 ; WX 500 ; N dmacron ; B 20 -14 588 677 ; +C -1 ; WX 333 ; N middot ; B 242 271 370 399 ; +C -1 ; WX 667 ; N Abreve ; B -57 0 734 885 ; +C -1 ; WX 500 ; N abreve ; B 20 -14 479 677 ; +C -1 ; WX 667 ; N Aogonek ; B -57 -199 623 677 ; +C -1 ; WX 500 ; N aogonek ; B 20 -205 479 453 ; +C -1 ; WX 722 ; N Dcaron ; B -36 0 702 877 ; +C -1 ; WX 749 ; N dcaron ; B 20 -14 751 677 ; +C -1 ; WX 722 ; N Dslash ; B -32 0 708 662 ; +C -1 ; WX 667 ; N Eogonek ; B -35 -199 680 662 ; +C -1 ; WX 444 ; N eogonek ; B 24 -199 442 453 ; +C -1 ; WX 667 ; N Ecaron ; B -35 0 680 877 ; +C -1 ; WX 444 ; N ecaron ; B 24 -14 504 677 ; +C -1 ; WX 611 ; N Lacute ; B -27 0 575 873 ; +C -1 ; WX 278 ; N lacute ; B 16 -14 413 873 ; +C -1 ; WX 611 ; N Lcaron ; B -27 0 666 677 ; +C -1 ; WX 521 ; N lcaron ; B 16 -14 524 677 ; +C -1 ; WX 611 ; N Ldot ; B -27 0 575 662 ; +C -1 ; WX 375 ; N ldot ; B 16 -14 364 677 ; +C -1 ; WX 722 ; N Nacute ; B -32 -7 811 873 ; +C -1 ; WX 556 ; N nacute ; B 11 -6 501 677 ; +C -1 ; WX 722 ; N Ncaron ; B -32 -7 811 877 ; +C -1 ; WX 556 ; N ncaron ; B 11 -6 508 677 ; +C -1 ; WX 722 ; N Odblacute ; B 53 -16 750 885 ; +C -1 ; WX 500 ; N odblacute ; B 24 -14 604 677 ; +C -1 ; WX 667 ; N Racute ; B -32 0 639 873 ; +C -1 ; WX 389 ; N racute ; B 17 0 438 677 ; +C -1 ; WX 667 ; N Rcaron ; B -32 0 639 877 ; +C -1 ; WX 389 ; N rcaron ; B 17 0 420 677 ; +C -1 ; WX 556 ; N Sacute ; B -22 -15 583 873 ; +C -1 ; WX 389 ; N sacute ; B -2 -14 422 677 ; +C -1 ; WX 611 ; N Tcedilla ; B 80 -256 693 662 ; +C -1 ; WX 278 ; N tcedilla ; B -4 -256 313 572 ; +C -1 ; WX 611 ; N Tcaron ; B 80 0 693 877 ; +C -1 ; WX 531 ; N tcaron ; B 20 -14 544 677 ; +C -1 ; WX 722 ; N Uring ; B 94 -15 809 878 ; +C -1 ; WX 556 ; N uring ; B 32 -14 516 696 ; +C -1 ; WX 722 ; N Udblacute ; B 94 -15 809 885 ; +C -1 ; WX 556 ; N udblacute ; B 32 -14 599 677 ; +C -1 ; WX 611 ; N Zacute ; B -27 0 679 873 ; +C -1 ; WX 389 ; N zacute ; B -12 -85 426 677 ; +C -1 ; WX 611 ; N Zdot ; B -27 0 679 843 ; +C -1 ; WX 389 ; N zdot ; B -12 -85 395 663 ; +C -1 ; WX 604 ; N Gamma ; B -32 0 684 662 ; +C -1 ; WX 763 ; N Theta ; B 55 -15 752 677 ; +C -1 ; WX 789 ; N Phi ; B 63 0 771 662 ; +C -1 ; WX 553 ; N alpha ; B 24 -14 537 453 ; +C -1 ; WX 512 ; N delta ; B 18 -14 491 677 ; +C -1 ; WX 410 ; N epsilon ; B 8 -14 414 453 ; +C -1 ; WX 539 ; N sigma ; B 32 -14 564 439 ; +C -1 ; WX 444 ; N tau ; B 25 -14 469 439 ; +C -1 ; WX 585 ; N phi ; B 28 -214 545 453 ; +C -1 ; WX 500 ; N underscoredbl ; B -9 -216 509 -52 ; +C -1 ; WX 659 ; N exclamdbl ; B 57 -14 626 677 ; +C -1 ; WX 348 ; N nsuperior ; B 4 268 319 545 ; +C -1 ; WX 969 ; N peseta ; B 18 -11 957 662 ; +C -1 ; WX 1000 ; N arrowleft ; B 39 77 961 428 ; +C -1 ; WX 500 ; N arrowup ; B 75 -209 426 654 ; +C -1 ; WX 1000 ; N arrowright ; B 39 77 961 428 ; +C -1 ; WX 500 ; N arrowdown ; B 75 -209 426 654 ; +C -1 ; WX 1000 ; N arrowboth ; B 39 77 961 429 ; +C -1 ; WX 500 ; N arrowupdn ; B 74 -208 425 714 ; +C -1 ; WX 500 ; N arrowupdnbse ; B 74 -303 425 714 ; +C -1 ; WX 979 ; N orthogonal ; B 177 0 802 625 ; +C -1 ; WX 719 ; N intersection ; B 89 0 630 698 ; +C -1 ; WX 570 ; N equivalence ; B 18 138 552 521 ; +C -1 ; WX 600 ; N house ; B 75 0 525 563 ; +C -1 ; WX 570 ; N revlogicalnot ; B 37 218 571 440 ; +C -1 ; WX 604 ; N integraltp ; B 267 -251 477 848 ; +C -1 ; WX 604 ; N integralbt ; B 127 -251 337 848 ; +C -1 ; WX 708 ; N SF100000 ; B -11 261 719 346 ; +C -1 ; WX 616 ; N SF110000 ; B 219 -303 304 910 ; +C -1 ; WX 708 ; N SF010000 ; B 312 -303 720 346 ; +C -1 ; WX 708 ; N SF030000 ; B -11 -303 396 346 ; +C -1 ; WX 708 ; N SF020000 ; B 312 261 720 910 ; +C -1 ; WX 708 ; N SF040000 ; B -11 261 396 910 ; +C -1 ; WX 708 ; N SF080000 ; B 312 -303 720 910 ; +C -1 ; WX 708 ; N SF090000 ; B -11 -303 396 910 ; +C -1 ; WX 708 ; N SF060000 ; B -11 -303 719 346 ; +C -1 ; WX 708 ; N SF070000 ; B -11 261 719 910 ; +C -1 ; WX 708 ; N SF050000 ; B -11 -303 719 910 ; +C -1 ; WX 708 ; N SF430000 ; B -11 168 719 439 ; +C -1 ; WX 708 ; N SF240000 ; B 219 -303 490 910 ; +C -1 ; WX 708 ; N SF510000 ; B 312 -303 720 439 ; +C -1 ; WX 708 ; N SF520000 ; B 219 -303 720 346 ; +C -1 ; WX 708 ; N SF390000 ; B 219 -303 719 439 ; +C -1 ; WX 708 ; N SF220000 ; B -11 -303 396 439 ; +C -1 ; WX 708 ; N SF210000 ; B -11 -303 489 346 ; +C -1 ; WX 708 ; N SF250000 ; B -11 -303 489 439 ; +C -1 ; WX 708 ; N SF500000 ; B 312 168 720 910 ; +C -1 ; WX 708 ; N SF490000 ; B 219 261 720 910 ; +C -1 ; WX 708 ; N SF380000 ; B 219 168 719 910 ; +C -1 ; WX 708 ; N SF280000 ; B -11 168 396 910 ; +C -1 ; WX 708 ; N SF270000 ; B -11 261 489 910 ; +C -1 ; WX 708 ; N SF260000 ; B -11 168 489 910 ; +C -1 ; WX 708 ; N SF360000 ; B 312 -303 720 910 ; +C -1 ; WX 708 ; N SF370000 ; B 219 -303 720 910 ; +C -1 ; WX 708 ; N SF420000 ; B 219 -303 720 910 ; +C -1 ; WX 708 ; N SF190000 ; B -11 -303 396 910 ; +C -1 ; WX 708 ; N SF200000 ; B -11 -303 489 910 ; +C -1 ; WX 708 ; N SF230000 ; B -11 -303 489 910 ; +C -1 ; WX 708 ; N SF470000 ; B -11 -303 719 439 ; +C -1 ; WX 708 ; N SF480000 ; B -11 -303 719 346 ; +C -1 ; WX 708 ; N SF410000 ; B -11 -303 719 439 ; +C -1 ; WX 708 ; N SF450000 ; B -11 168 719 910 ; +C -1 ; WX 708 ; N SF460000 ; B -11 261 719 910 ; +C -1 ; WX 708 ; N SF400000 ; B -11 168 719 910 ; +C -1 ; WX 708 ; N SF540000 ; B -11 -303 719 910 ; +C -1 ; WX 708 ; N SF530000 ; B -11 -303 719 910 ; +C -1 ; WX 708 ; N SF440000 ; B -11 -303 719 910 ; +C -1 ; WX 708 ; N upblock ; B -11 303 719 910 ; +C -1 ; WX 708 ; N dnblock ; B -11 -303 719 303 ; +C -1 ; WX 708 ; N block ; B -11 -303 719 910 ; +C -1 ; WX 708 ; N lfblock ; B -11 -303 354 910 ; +C -1 ; WX 708 ; N rtblock ; B 354 -303 720 910 ; +C -1 ; WX 708 ; N ltshade ; B 50 -246 719 910 ; +C -1 ; WX 708 ; N shade ; B -11 -246 719 910 ; +C -1 ; WX 729 ; N dkshade ; B 0 -307 729 910 ; +C -1 ; WX 604 ; N filledbox ; B 71 0 532 461 ; +C -1 ; WX 1000 ; N filledrect ; B 0 155 1000 343 ; +C -1 ; WX 990 ; N triagup ; B 148 0 842 693 ; +C -1 ; WX 990 ; N triagrt ; B 141 -15 849 692 ; +C -1 ; WX 990 ; N triagdn ; B 148 -15 842 678 ; +C -1 ; WX 990 ; N triaglf ; B 141 -15 849 692 ; +C -1 ; WX 604 ; N circle ; B 87 67 517 497 ; +C -1 ; WX 604 ; N invbullet ; B 63 0 541 479 ; +C -1 ; WX 604 ; N invcircle ; B 21 0 584 564 ; +C -1 ; WX 1021 ; N smileface ; B 199 -58 822 564 ; +C -1 ; WX 1052 ; N invsmileface ; B 215 -58 838 564 ; +C -1 ; WX 917 ; N sun ; B 8 -109 909 792 ; +C -1 ; WX 750 ; N female ; B 119 -214 630 736 ; +C -1 ; WX 750 ; N male ; B 54 -128 691 791 ; +C -1 ; WX 531 ; N spade ; B 28 0 503 601 ; +C -1 ; WX 656 ; N club ; B 27 0 629 601 ; +C -1 ; WX 594 ; N heart ; B 31 -12 563 601 ; +C -1 ; WX 510 ; N diamond ; B 31 -12 479 601 ; +C -1 ; WX 500 ; N musicalnote ; B 18 -18 482 666 ; +C -1 ; WX 750 ; N musicalnotedbl ; B 42 -63 649 742 ; +C -1 ; WX 823 ; N IJ ; B -35 -15 927 662 ; +C -1 ; WX 552 ; N ij ; B 39 -216 558 677 ; +C -1 ; WX 719 ; N napostrophe ; B 44 -6 667 677 ; +C -1 ; WX 281 ; N minute ; B 156 353 314 677 ; +C -1 ; WX 552 ; N second ; B 165 352 559 677 ; +C -1 ; WX 833 ; N afii61248 ; B 75 -27 810 677 ; +C -1 ; WX 427 ; N afii61289 ; B 18 -14 439 677 ; +C -1 ; WX 604 ; N H22073 ; B 71 0 532 461 ; +C -1 ; WX 354 ; N H18543 ; B 45 198 310 463 ; +C -1 ; WX 354 ; N H18551 ; B 45 198 310 463 ; +C -1 ; WX 604 ; N H18533 ; B 87 67 517 497 ; +C -1 ; WX 354 ; N openbullet ; B 38 190 316 470 ; +C -1 ; WX 667 ; N Amacron ; B -57 0 747 816 ; +C -1 ; WX 500 ; N amacron ; B 20 -14 527 612 ; +C -1 ; WX 667 ; N Ccircumflex ; B 65 -15 721 894 ; +C -1 ; WX 444 ; N ccircumflex ; B 28 -14 446 677 ; +C -1 ; WX 667 ; N Cdot ; B 65 -15 721 871 ; +C -1 ; WX 444 ; N cdot ; B 28 -14 438 663 ; +C -1 ; WX 667 ; N Emacron ; B -35 0 680 816 ; +C -1 ; WX 444 ; N emacron ; B 24 -14 500 612 ; +C -1 ; WX 667 ; N Ebreve ; B -35 0 680 897 ; +C -1 ; WX 444 ; N ebreve ; B 24 -14 493 677 ; +C -1 ; WX 667 ; N Edot ; B -35 0 680 871 ; +C -1 ; WX 444 ; N edot ; B 24 -14 442 663 ; +C -1 ; WX 722 ; N Gcircumflex ; B 69 -15 747 894 ; +C -1 ; WX 500 ; N gcircumflex ; B -52 -216 517 677 ; +C -1 ; WX 722 ; N Gdot ; B 69 -15 747 871 ; +C -1 ; WX 500 ; N gdot ; B -52 -216 517 663 ; +C -1 ; WX 722 ; N Gcedilla ; B 69 -184 747 677 ; +C -1 ; WX 500 ; N gcedilla ; B -52 -216 517 710 ; +C -1 ; WX 778 ; N Hcircumflex ; B -32 0 862 894 ; +C -1 ; WX 556 ; N hcircumflex ; B 10 -6 574 894 ; +C -1 ; WX 778 ; N Hbar ; B -32 0 862 662 ; +C -1 ; WX 556 ; N hbar ; B 12 -5 503 677 ; +C -1 ; WX 389 ; N Itilde ; B -35 0 490 863 ; +C -1 ; WX 278 ; N itilde ; B 22 -14 371 662 ; +C -1 ; WX 389 ; N Imacron ; B -35 0 516 816 ; +C -1 ; WX 278 ; N imacron ; B 22 -14 396 612 ; +C -1 ; WX 389 ; N Ibreve ; B -35 0 494 897 ; +C -1 ; WX 278 ; N ibreve ; B 22 -14 376 677 ; +C -1 ; WX 389 ; N Iogonek ; B -34 -199 468 662 ; +C -1 ; WX 278 ; N iogonek ; B 11 -199 297 677 ; +C -1 ; WX 500 ; N Jcircumflex ; B -8 -15 598 894 ; +C -1 ; WX 278 ; N jcircumflex ; B -160 -216 349 677 ; +C -1 ; WX 667 ; N Kcedilla ; B -32 -184 747 662 ; +C -1 ; WX 500 ; N kcedilla ; B 6 -184 513 677 ; +C -1 ; WX 500 ; N kgreenlandic ; B 6 -7 513 453 ; +C -1 ; WX 611 ; N Lcedilla ; B -27 -184 575 662 ; +C -1 ; WX 278 ; N lcedilla ; B -79 -184 318 677 ; +C -1 ; WX 722 ; N Ncedilla ; B -32 -184 811 662 ; +C -1 ; WX 556 ; N ncedilla ; B 11 -184 501 453 ; +C -1 ; WX 784 ; N Eng ; B -34 -16 773 677 ; +C -1 ; WX 541 ; N eng ; B 12 -216 496 453 ; +C -1 ; WX 722 ; N Omacron ; B 53 -16 718 816 ; +C -1 ; WX 500 ; N omacron ; B 24 -14 527 612 ; +C -1 ; WX 722 ; N Obreve ; B 53 -16 718 897 ; +C -1 ; WX 500 ; N obreve ; B 24 -14 487 677 ; +C -1 ; WX 667 ; N Rcedilla ; B -32 -184 639 662 ; +C -1 ; WX 389 ; N rcedilla ; B -12 -184 402 453 ; +C -1 ; WX 556 ; N Scircumflex ; B -22 -15 583 894 ; +C -1 ; WX 389 ; N scircumflex ; B -2 -14 412 677 ; +C -1 ; WX 611 ; N Tbar ; B 78 0 691 662 ; +C -1 ; WX 278 ; N tbar ; B 2 -14 312 572 ; +C -1 ; WX 722 ; N Utilde ; B 94 -15 809 863 ; +C -1 ; WX 556 ; N utilde ; B 32 -14 516 662 ; +C -1 ; WX 722 ; N Umacron ; B 94 -15 809 816 ; +C -1 ; WX 556 ; N umacron ; B 32 -14 535 612 ; +C -1 ; WX 722 ; N Ubreve ; B 94 -15 809 897 ; +C -1 ; WX 556 ; N ubreve ; B 32 -14 516 677 ; +C -1 ; WX 722 ; N Uogonek ; B 96 -199 811 662 ; +C -1 ; WX 556 ; N uogonek ; B 34 -199 518 453 ; +C -1 ; WX 889 ; N Wcircumflex ; B 123 -15 1002 894 ; +C -1 ; WX 667 ; N wcircumflex ; B 28 -14 663 677 ; +C -1 ; WX 611 ; N Ycircumflex ; B 93 0 717 894 ; +C -1 ; WX 444 ; N ycircumflex ; B -92 -216 444 677 ; +C -1 ; WX 333 ; N longs ; B -160 -216 507 677 ; +C -1 ; WX 667 ; N Aringacute ; B -57 0 755 1032 ; +C -1 ; WX 500 ; N aringacute ; B 20 -14 542 899 ; +C -1 ; WX 944 ; N AEacute ; B -56 0 958 899 ; +C -1 ; WX 722 ; N aeacute ; B 19 -14 716 677 ; +C -1 ; WX 722 ; N Oslashacute ; B 42 -16 727 899 ; +C -1 ; WX 500 ; N oslashacute ; B 15 -14 488 677 ; +C -1 ; WX 333 ; N anoteleia ; B 128 291 289 452 ; +C -1 ; WX 889 ; N Wgrave ; B 123 -15 1002 897 ; +C -1 ; WX 667 ; N wgrave ; B 28 -14 663 677 ; +C -1 ; WX 889 ; N Wacute ; B 123 -15 1002 899 ; +C -1 ; WX 667 ; N wacute ; B 28 -14 663 677 ; +C -1 ; WX 889 ; N Wdieresis ; B 123 -15 1002 857 ; +C -1 ; WX 667 ; N wdieresis ; B 28 -14 663 658 ; +C -1 ; WX 611 ; N Ygrave ; B 93 0 717 897 ; +C -1 ; WX 444 ; N ygrave ; B -92 -216 444 677 ; +C -1 ; WX 333 ; N quotereversed ; B 174 366 352 678 ; +C -1 ; WX 333 ; N radicalex ; B 51 533 471 612 ; +C -1 ; WX 500 ; N afii08941 ; B 36 -14 525 676 ; +C -1 ; WX 600 ; N estimated ; B 44 -17 561 535 ; +C -1 ; WX 750 ; N oneeighth ; B 59 -29 695 676 ; +C -1 ; WX 750 ; N threeeighths ; B 54 -29 695 676 ; +C -1 ; WX 750 ; N fiveeighths ; B 68 -29 695 676 ; +C -1 ; WX 750 ; N seveneighths ; B 96 -29 695 676 ; +C -1 ; WX 333 ; N commaaccent ; B 21 -256 177 -50 ; +C -1 ; WX 333 ; N undercommaaccent ; B 5 -184 228 -20 ; +C -1 ; WX 333 ; N tonos ; B 196 506 405 677 ; +C -1 ; WX 333 ; N dieresistonos ; B 34 506 486 677 ; +C -1 ; WX 667 ; N Alphatonos ; B -57 0 600 677 ; +C -1 ; WX 777 ; N Epsilontonos ; B 31 0 790 677 ; +C -1 ; WX 895 ; N Etatonos ; B 31 0 978 677 ; +C -1 ; WX 506 ; N Iotatonos ; B 31 0 585 677 ; +C -1 ; WX 731 ; N Omicrontonos ; B 31 -15 729 677 ; +C -1 ; WX 750 ; N Upsilontonos ; B 31 0 854 677 ; +C -1 ; WX 785 ; N Omegatonos ; B 30 0 772 677 ; +C -1 ; WX 278 ; N iotadieresistonos ; B -5 -14 447 677 ; +C -1 ; WX 667 ; N Alpha ; B -57 0 600 677 ; +C -1 ; WX 667 ; N Beta ; B -25 0 645 662 ; +C -1 ; WX 627 ; N Delta ; B -48 0 536 677 ; +C -1 ; WX 667 ; N Epsilon ; B -35 0 680 662 ; +C -1 ; WX 611 ; N Zeta ; B -27 0 679 662 ; +C -1 ; WX 778 ; N Eta ; B -32 0 862 662 ; +C -1 ; WX 389 ; N Iota ; B -35 0 467 662 ; +C -1 ; WX 667 ; N Kappa ; B -32 0 747 662 ; +C -1 ; WX 667 ; N Lambda ; B -64 0 594 677 ; +C -1 ; WX 889 ; N Mu ; B -34 0 974 662 ; +C -1 ; WX 722 ; N Nu ; B -32 -7 811 662 ; +C -1 ; WX 659 ; N Xi ; B -23 0 713 662 ; +C -1 ; WX 722 ; N Omicron ; B 53 -16 718 678 ; +C -1 ; WX 778 ; N Pi ; B -35 0 860 662 ; +C -1 ; WX 611 ; N Rho ; B -30 0 644 662 ; +C -1 ; WX 619 ; N Sigma ; B -52 0 676 662 ; +C -1 ; WX 611 ; N Tau ; B 80 0 693 662 ; +C -1 ; WX 611 ; N Upsilon ; B 93 0 717 662 ; +C -1 ; WX 667 ; N Chi ; B -61 0 763 662 ; +C -1 ; WX 800 ; N Psi ; B 120 0 894 677 ; +C -1 ; WX 746 ; N Omega ; B -9 0 733 677 ; +C -1 ; WX 389 ; N Iotadieresis ; B -35 0 493 851 ; +C -1 ; WX 611 ; N Upsilondieresis ; B 93 0 717 851 ; +C -1 ; WX 553 ; N alphatonos ; B 24 -14 537 677 ; +C -1 ; WX 410 ; N epsilontonos ; B 8 -14 441 677 ; +C -1 ; WX 549 ; N etatonos ; B 24 -214 513 677 ; +C -1 ; WX 278 ; N iotatonos ; B 22 -14 372 677 ; +C -1 ; WX 490 ; N upsilondieresistonos ; B 36 -14 546 677 ; +C -1 ; WX 512 ; N beta ; B -84 -214 531 677 ; +C -1 ; WX 416 ; N gamma ; B 31 -216 410 453 ; +C -1 ; WX 441 ; N zeta ; B 14 -166 539 713 ; +C -1 ; WX 549 ; N eta ; B 24 -214 508 453 ; +C -1 ; WX 519 ; N theta ; B 40 -14 530 677 ; +C -1 ; WX 278 ; N iota ; B 22 -14 257 453 ; +C -1 ; WX 530 ; N kappa ; B 13 -8 545 453 ; +C -1 ; WX 444 ; N lambda ; B -53 -8 418 677 ; +C -1 ; WX 556 ; N mu ; B -62 -216 521 439 ; +C -1 ; WX 444 ; N nu ; B 30 -14 444 453 ; +C -1 ; WX 449 ; N xi ; B 22 -166 509 693 ; +C -1 ; WX 500 ; N omicron ; B 24 -14 470 453 ; +C -1 ; WX 515 ; N rho ; B -78 -214 475 453 ; +C -1 ; WX 446 ; N sigma1 ; B 34 -166 463 453 ; +C -1 ; WX 490 ; N upsilon ; B 36 -14 451 453 ; +C -1 ; WX 465 ; N chi ; B -85 -207 499 453 ; +C -1 ; WX 668 ; N psi ; B 59 -214 702 453 ; +C -1 ; WX 723 ; N omega ; B 29 -14 681 453 ; +C -1 ; WX 278 ; N iotadieresis ; B 22 -14 368 636 ; +C -1 ; WX 490 ; N upsilondieresis ; B 36 -14 474 636 ; +C -1 ; WX 500 ; N omicrontonos ; B 24 -14 488 677 ; +C -1 ; WX 490 ; N upsilontonos ; B 36 -14 483 677 ; +C -1 ; WX 723 ; N omegatonos ; B 29 -14 681 677 ; +C -1 ; WX 667 ; N afii10023 ; B -35 0 680 851 ; +C -1 ; WX 818 ; N afii10051 ; B 71 -8 785 662 ; +C -1 ; WX 657 ; N afii10053 ; B 44 -15 737 677 ; +C -1 ; WX 556 ; N afii10054 ; B -22 -15 583 677 ; +C -1 ; WX 389 ; N afii10055 ; B -35 0 467 662 ; +C -1 ; WX 389 ; N afii10056 ; B -35 0 493 851 ; +C -1 ; WX 500 ; N afii10057 ; B -8 -15 598 662 ; +C -1 ; WX 908 ; N afii10058 ; B -59 -8 850 662 ; +C -1 ; WX 976 ; N afii10059 ; B -32 0 918 662 ; +C -1 ; WX 811 ; N afii10060 ; B 71 0 749 662 ; +C -1 ; WX 696 ; N afii10062 ; B 99 -15 811 861 ; +C -1 ; WX 667 ; N afii10017 ; B -57 0 600 677 ; +C -1 ; WX 635 ; N afii10018 ; B -18 0 657 662 ; +C -1 ; WX 667 ; N afii10019 ; B -25 0 645 662 ; +C -1 ; WX 604 ; N afii10020 ; B -32 0 684 662 ; +C -1 ; WX 683 ; N afii10021 ; B -115 -191 765 662 ; +C -1 ; WX 667 ; N afii10022 ; B -35 0 680 662 ; +C -1 ; WX 918 ; N afii10024 ; B -63 0 976 670 ; +C -1 ; WX 509 ; N afii10025 ; B -25 -15 506 677 ; +C -1 ; WX 778 ; N afii10026 ; B -33 0 851 662 ; +C -1 ; WX 778 ; N afii10027 ; B -33 0 851 861 ; +C -1 ; WX 678 ; N afii10028 ; B -35 0 737 670 ; +C -1 ; WX 686 ; N afii10029 ; B -59 -8 768 662 ; +C -1 ; WX 889 ; N afii10030 ; B -34 0 974 662 ; +C -1 ; WX 778 ; N afii10031 ; B -32 0 862 662 ; +C -1 ; WX 722 ; N afii10032 ; B 53 -16 718 678 ; +C -1 ; WX 778 ; N afii10033 ; B -35 0 860 662 ; +C -1 ; WX 611 ; N afii10034 ; B -30 0 644 662 ; +C -1 ; WX 667 ; N afii10035 ; B 65 -15 721 677 ; +C -1 ; WX 611 ; N afii10036 ; B 80 0 693 662 ; +C -1 ; WX 696 ; N afii10037 ; B 99 -15 811 662 ; +C -1 ; WX 850 ; N afii10038 ; B 72 0 830 662 ; +C -1 ; WX 667 ; N afii10039 ; B -61 0 763 662 ; +C -1 ; WX 778 ; N afii10040 ; B -32 -191 858 662 ; +C -1 ; WX 748 ; N afii10041 ; B 120 0 829 662 ; +C -1 ; WX 1126 ; N afii10042 ; B -33 0 1206 662 ; +C -1 ; WX 1126 ; N afii10043 ; B -33 -191 1206 662 ; +C -1 ; WX 760 ; N afii10044 ; B 107 0 702 662 ; +C -1 ; WX 969 ; N afii10045 ; B -19 0 1043 662 ; +C -1 ; WX 634 ; N afii10046 ; B -19 0 576 662 ; +C -1 ; WX 651 ; N afii10047 ; B 4 -15 636 677 ; +C -1 ; WX 1056 ; N afii10048 ; B -38 -15 1053 677 ; +C -1 ; WX 689 ; N afii10049 ; B -65 0 770 662 ; +C -1 ; WX 500 ; N afii10065 ; B 20 -14 479 453 ; +C -1 ; WX 499 ; N afii10066 ; B 32 -14 513 677 ; +C -1 ; WX 447 ; N afii10067 ; B 25 -14 423 453 ; +C -1 ; WX 369 ; N afii10068 ; B -10 -14 372 453 ; +C -1 ; WX 496 ; N afii10069 ; B 22 -14 471 677 ; +C -1 ; WX 444 ; N afii10070 ; B 24 -14 442 453 ; +C -1 ; WX 952 ; N afii10072 ; B -4 -14 952 453 ; +C -1 ; WX 390 ; N afii10073 ; B -20 -14 362 453 ; +C -1 ; WX 556 ; N afii10074 ; B 32 -14 516 453 ; +C -1 ; WX 556 ; N afii10075 ; B 34 -14 518 652 ; +C -1 ; WX 507 ; N afii10076 ; B 12 0 510 453 ; +C -1 ; WX 513 ; N afii10077 ; B -48 -14 475 439 ; +C -1 ; WX 685 ; N afii10078 ; B -48 -14 646 453 ; +C -1 ; WX 555 ; N afii10079 ; B 13 -5 516 453 ; +C -1 ; WX 500 ; N afii10080 ; B 24 -14 470 453 ; +C -1 ; WX 556 ; N afii10081 ; B 11 -6 501 453 ; +C -1 ; WX 500 ; N afii10082 ; B -122 -214 474 453 ; +C -1 ; WX 444 ; N afii10083 ; B 28 -14 438 453 ; +C -1 ; WX 778 ; N afii10084 ; B 11 -5 726 453 ; +C -1 ; WX 444 ; N afii10085 ; B -92 -216 444 453 ; +C -1 ; WX 716 ; N afii10086 ; B 28 -214 682 677 ; +C -1 ; WX 500 ; N afii10087 ; B -45 -14 508 453 ; +C -1 ; WX 556 ; N afii10088 ; B 34 -187 518 453 ; +C -1 ; WX 525 ; N afii10089 ; B 48 -14 486 453 ; +C -1 ; WX 833 ; N afii10090 ; B 36 -14 796 453 ; +C -1 ; WX 833 ; N afii10091 ; B 36 -186 796 453 ; +C -1 ; WX 527 ; N afii10092 ; B 29 -14 476 439 ; +C -1 ; WX 694 ; N afii10093 ; B 43 -14 659 453 ; +C -1 ; WX 457 ; N afii10094 ; B 43 -14 406 453 ; +C -1 ; WX 415 ; N afii10095 ; B -12 -14 371 453 ; +C -1 ; WX 730 ; N afii10096 ; B 12 -14 700 453 ; +C -1 ; WX 515 ; N afii10097 ; B -62 -14 477 439 ; +C -1 ; WX 444 ; N afii10071 ; B 24 -14 489 658 ; +C -1 ; WX 523 ; N afii10099 ; B 12 -216 494 677 ; +C -1 ; WX 393 ; N afii10100 ; B -18 0 455 677 ; +C -1 ; WX 415 ; N afii10101 ; B 22 -14 458 453 ; +C -1 ; WX 389 ; N afii10102 ; B -2 -14 370 453 ; +C -1 ; WX 278 ; N afii10103 ; B 22 -14 298 677 ; +C -1 ; WX 278 ; N afii10104 ; B 22 -14 368 636 ; +C -1 ; WX 278 ; N afii10105 ; B -159 -216 299 677 ; +C -1 ; WX 659 ; N afii10106 ; B -48 -14 607 453 ; +C -1 ; WX 713 ; N afii10107 ; B 12 -14 662 453 ; +C -1 ; WX 556 ; N afii10108 ; B 12 -5 503 677 ; +C -1 ; WX 444 ; N afii10110 ; B -94 -216 454 652 ; +C -1 ; WX 556 ; N afii10193 ; B 30 -191 518 453 ; +C -1 ; WX 470 ; N afii10050 ; B -34 0 594 795 ; +C -1 ; WX 369 ; N afii10098 ; B 31 -14 432 542 ; +C -1 ; WX 1000 ; N afii00208 ; B 32 224 969 294 ; +C -1 ; WX 915 ; N afii61352 ; B -41 -15 903 669 ; +C -1 ; WX 546 ; N pi ; B 14 -14 571 439 ; +C -1 ; WX 333 ; N sheva ; B 26 -265 107 -72 ; +C -1 ; WX 333 ; N hatafsegol ; B -86 -265 219 -72 ; +C -1 ; WX 333 ; N hatafpatah ; B -76 -265 208 -72 ; +C -1 ; WX 333 ; N hatafqamats ; B -91 -265 224 -72 ; +C -1 ; WX 333 ; N hiriq ; B 26 -153 107 -72 ; +C -1 ; WX 333 ; N tsere ; B -30 -153 163 -72 ; +C -1 ; WX 333 ; N segol ; B -30 -265 163 -72 ; +C -1 ; WX 333 ; N patah ; B -30 -130 163 -80 ; +C -1 ; WX 333 ; N qamats ; B -30 -243 163 -80 ; +C -1 ; WX 333 ; N holam ; B 226 587 307 668 ; +C -1 ; WX 333 ; N qubuts ; B -86 -265 219 -72 ; +C -1 ; WX 333 ; N dagesh ; B 126 211 207 292 ; +C -1 ; WX 333 ; N meteg ; B 41 -242 91 -80 ; +C -1 ; WX 375 ; N maqaf ; B 105 362 382 516 ; +C -1 ; WX 333 ; N rafe ; B 170 596 363 646 ; +C -1 ; WX 333 ; N paseq ; B 30 -49 307 564 ; +C -1 ; WX 343 ; N shindot ; B 436 587 517 668 ; +C -1 ; WX 343 ; N sindot ; B 27 587 108 668 ; +C -1 ; WX 333 ; N sofpasuq ; B 40 -14 310 525 ; +C -1 ; WX 518 ; N alef ; B -29 -6 528 553 ; +C -1 ; WX 467 ; N bet ; B -40 0 448 549 ; +C -1 ; WX 377 ; N gimel ; B -65 -13 339 553 ; +C -1 ; WX 439 ; N dalet ; B 83 -13 472 549 ; +C -1 ; WX 512 ; N he ; B -5 -13 541 549 ; +C -1 ; WX 309 ; N vav ; B 89 -13 302 553 ; +C -1 ; WX 322 ; N zayin ; B 90 -13 341 553 ; +C -1 ; WX 512 ; N het ; B 1 -13 542 549 ; +C -1 ; WX 516 ; N tet ; B 50 0 515 553 ; +C -1 ; WX 280 ; N yod ; B 86 200 293 553 ; +C -1 ; WX 447 ; N finalkaf ; B 82 -170 475 549 ; +C -1 ; WX 440 ; N kaf ; B -37 0 422 549 ; +C -1 ; WX 443 ; N lamed ; B 76 -8 450 741 ; +C -1 ; WX 481 ; N finalmem ; B -15 0 470 549 ; +C -1 ; WX 526 ; N mem ; B -3 0 496 553 ; +C -1 ; WX 305 ; N finalnun ; B 46 -170 319 553 ; +C -1 ; WX 321 ; N nun ; B -52 0 311 553 ; +C -1 ; WX 456 ; N samekh ; B 42 -13 440 549 ; +C -1 ; WX 508 ; N ayin ; B -48 -57 533 553 ; +C -1 ; WX 488 ; N finalpe ; B 62 -170 468 549 ; +C -1 ; WX 454 ; N pe ; B -33 0 434 549 ; +C -1 ; WX 551 ; N finaltsadi ; B 86 -170 572 553 ; +C -1 ; WX 487 ; N tsadi ; B -17 0 509 553 ; +C -1 ; WX 454 ; N qof ; B -37 -170 461 549 ; +C -1 ; WX 469 ; N resh ; B 85 -13 460 549 ; +C -1 ; WX 677 ; N shin ; B 92 0 701 553 ; +C -1 ; WX 503 ; N tav ; B -60 -13 492 549 ; +C -1 ; WX 617 ; N doublevav ; B 89 -13 610 553 ; +C -1 ; WX 589 ; N vavyod ; B 86 -13 582 553 ; +C -1 ; WX 561 ; N doubleyod ; B 86 200 574 553 ; +C -1 ; WX 228 ; N geresh ; B 55 219 245 535 ; +C -1 ; WX 433 ; N gershayim ; B 55 219 450 535 ; +C -1 ; WX 759 ; N newsheqelsign ; B -4 0 777 516 ; +C -1 ; WX 309 ; N vavshindot ; B 27 -13 302 668 ; +C -1 ; WX 447 ; N finalkafsheva ; B 82 -170 475 549 ; +C -1 ; WX 447 ; N finalkafqamats ; B 50 -170 475 549 ; +C -1 ; WX 450 ; N lamedholam ; B -30 -8 450 741 ; +C -1 ; WX 443 ; N lamedholamdagesh ; B -30 -8 450 741 ; +C -1 ; WX 508 ; N altayin ; B -34 0 533 553 ; +C -1 ; WX 677 ; N shinshindot ; B 92 0 701 668 ; +C -1 ; WX 677 ; N shinsindot ; B 92 0 701 668 ; +C -1 ; WX 677 ; N shindageshshindot ; B 92 0 701 668 ; +C -1 ; WX 677 ; N shindageshsindot ; B 92 0 701 668 ; +C -1 ; WX 518 ; N alefpatah ; B -29 -130 528 553 ; +C -1 ; WX 518 ; N alefqamats ; B -29 -243 528 553 ; +C -1 ; WX 518 ; N alefmapiq ; B -29 -6 528 553 ; +C -1 ; WX 467 ; N betdagesh ; B -40 0 448 549 ; +C -1 ; WX 377 ; N gimeldagesh ; B -65 -13 339 553 ; +C -1 ; WX 439 ; N daletdagesh ; B 83 -13 472 549 ; +C -1 ; WX 512 ; N hedagesh ; B -5 -13 541 549 ; +C -1 ; WX 309 ; N vavdagesh ; B 55 -13 302 553 ; +C -1 ; WX 322 ; N zayindagesh ; B 35 -13 341 553 ; +C -1 ; WX 516 ; N tetdagesh ; B 50 0 515 553 ; +C -1 ; WX 280 ; N yoddagesh ; B 48 200 293 553 ; +C -1 ; WX 447 ; N finalkafdagesh ; B 82 -170 475 549 ; +C -1 ; WX 440 ; N kafdagesh ; B -37 0 422 549 ; +C -1 ; WX 443 ; N lameddagesh ; B 76 -8 450 741 ; +C -1 ; WX 526 ; N memdagesh ; B -3 0 496 553 ; +C -1 ; WX 321 ; N nundagesh ; B -52 0 311 553 ; +C -1 ; WX 456 ; N samekhdagesh ; B 42 -13 440 549 ; +C -1 ; WX 488 ; N finalpedagesh ; B 62 -170 468 549 ; +C -1 ; WX 454 ; N pedagesh ; B -33 0 434 549 ; +C -1 ; WX 487 ; N tsadidagesh ; B -17 0 509 553 ; +C -1 ; WX 454 ; N qofdagesh ; B -37 -170 461 549 ; +C -1 ; WX 454 ; N reshdagesh ; B 68 -8 446 550 ; +C -1 ; WX 677 ; N shindagesh ; B 92 0 701 553 ; +C -1 ; WX 503 ; N tavdages ; B -60 -13 492 549 ; +C -1 ; WX 309 ; N vavholam ; B 89 -13 302 668 ; +C -1 ; WX 467 ; N betrafe ; B -40 0 448 646 ; +C -1 ; WX 440 ; N kafrafe ; B -37 0 422 646 ; +C -1 ; WX 454 ; N perafe ; B -33 0 434 646 ; +C -1 ; WX 542 ; N aleflamed ; B -5 -6 552 741 ; +C -1 ; WX 0 ; N zerowidthnonjoiner ; B -18 -134 18 629 ; +C -1 ; WX 0 ; N zerowidthjoiner ; B -107 -134 107 690 ; +C -1 ; WX 0 ; N lefttorightmark ; B -18 -134 210 690 ; +C -1 ; WX 0 ; N righttoleftmark ; B -210 -134 17 690 ; +C -1 ; WX 1000 ; N uniFFFC ; B 0 0 1000 719 ; +C -1 ; WX 722 ; N Ohorn ; B 53 -16 839 721 ; +C -1 ; WX 537 ; N ohorn ; B 24 -14 600 512 ; +C -1 ; WX 775 ; N Uhorn ; B 94 -15 929 801 ; +C -1 ; WX 599 ; N uhorn ; B 34 -14 655 467 ; +C -1 ; WX 0 ; N f00b ; B -148 816 23 891 ; +C -1 ; WX 0 ; N f00c ; B -286 816 -66 891 ; +C -1 ; WX 0 ; N f00e ; B -296 728 -98 891 ; +C -1 ; WX 0 ; N f006 ; B -63 816 105 891 ; +C -1 ; WX 0 ; N f007 ; B -127 816 89 891 ; +C -1 ; WX 0 ; N f009 ; B -166 728 34 891 ; +C -1 ; WX 0 ; N combininghookabove ; B -99 724 130 891 ; +C -1 ; WX 0 ; N f010 ; B -121 810 68 891 ; +C -1 ; WX 0 ; N f013 ; B -222 724 7 891 ; +C -1 ; WX 0 ; N f011 ; B -185 810 4 891 ; +C -1 ; WX 0 ; N f01c ; B -208 748 145 885 ; +C -1 ; WX 0 ; N f015 ; B -236 813 66 891 ; +C -1 ; WX 0 ; N combiningtildeaccent ; B -282 724 70 861 ; +C -1 ; WX 0 ; N _d_767 ; B 40 719 293 799 ; +C -1 ; WX 0 ; N _d_768 ; B 19 718 266 789 ; +C -1 ; WX 0 ; N f02c ; B -194 -212 -32 -50 ; +C -1 ; WX 513 ; N dongsign ; B 9 133 517 662 ; +C -1 ; WX 750 ; N onethird ; B 59 -30 681 676 ; +C -1 ; WX 750 ; N twothirds ; B 49 -30 681 676 ; +C -1 ; WX 0 ; N f008 ; B -125 506 75 670 ; +C -1 ; WX 0 ; N f00a ; B -226 506 -26 670 ; +C -1 ; WX 0 ; N f00d ; B -202 506 -3 670 ; +C -1 ; WX 0 ; N f00f ; B -292 506 -93 670 ; +C -1 ; WX 0 ; N f012 ; B -151 507 78 674 ; +C -1 ; WX 0 ; N f014 ; B -264 507 -34 674 ; +C -1 ; WX 0 ; N f016 ; B -313 748 39 885 ; +C -1 ; WX 0 ; N f017 ; B -388 748 -36 885 ; +C -1 ; WX 0 ; N f018 ; B -416 748 -64 885 ; +C -1 ; WX 0 ; N f019 ; B -328 526 -19 662 ; +C -1 ; WX 0 ; N f01a ; B -337 526 -28 662 ; +C -1 ; WX 0 ; N f01b ; B -386 526 -77 662 ; +C -1 ; WX 0 ; N f01e ; B -499 -212 -336 -50 ; +C -1 ; WX 0 ; N f01f ; B -533 -212 -370 -50 ; +C -1 ; WX 0 ; N f020 ; B -533 -212 -370 -50 ; +C -1 ; WX 0 ; N f021 ; B -499 -212 -336 -50 ; +C -1 ; WX 0 ; N f022 ; B -547 -212 -385 -50 ; +C -1 ; WX 0 ; N combininggraveaccent ; B -186 728 13 891 ; +C -1 ; WX 0 ; N combiningacuteaccent ; B -57 728 143 891 ; +C -1 ; WX 0 ; N f01d ; B -236 526 73 662 ; +C -1 ; WX 0 ; N combiningdotbelow ; B -533 -212 -370 -50 ; +C -1 ; WX 0 ; N f023 ; B -418 -212 -256 -50 ; +C -1 ; WX 0 ; N f029 ; B -361 -212 -198 -50 ; +C -1 ; WX 0 ; N f02a ; B -300 -212 -138 -50 ; +C -1 ; WX 0 ; N f02b ; B -461 -212 -299 -50 ; +C -1 ; WX 0 ; N f024 ; B -370 -212 -207 -50 ; +C -1 ; WX 0 ; N f025 ; B -428 -212 -266 -50 ; +C -1 ; WX 0 ; N f026 ; B -467 -212 -305 -50 ; +C -1 ; WX 0 ; N f027 ; B -467 -212 -305 -50 ; +C -1 ; WX 0 ; N f028 ; B -492 -212 -329 -50 ; +C -1 ; WX 0 ; N f02d ; B -339 813 -36 891 ; +C -1 ; WX 0 ; N f02e ; B -369 748 -17 885 ; +C -1 ; WX 0 ; N f02f ; B -339 813 -36 891 ; +C -1 ; WX 0 ; N f030 ; B -388 748 -36 885 ; +C -1 ; WX 278 ; N f031 ; B 20 -14 255 453 ; +C -1 ; WX 667 ; N Adotbelow ; B -57 -212 600 677 ; +C -1 ; WX 500 ; N adotbelow ; B 20 -212 479 453 ; +C -1 ; WX 667 ; N Ahookabove ; B -57 0 721 891 ; +C -1 ; WX 500 ; N ahookabove ; B 20 -14 479 674 ; +C -1 ; WX 667 ; N Acircumflexacute ; B -57 0 710 891 ; +C -1 ; WX 500 ; N acircumflexacute ; B 20 -14 522 891 ; +C -1 ; WX 667 ; N Acircumflexgrave ; B -57 0 683 891 ; +C -1 ; WX 500 ; N acircumflexgrave ; B 20 -14 479 891 ; +C -1 ; WX 667 ; N Acircumflexhookabove ; B -57 0 698 891 ; +C -1 ; WX 500 ; N acircumflexhookabove ; B 20 -14 522 891 ; +C -1 ; WX 667 ; N Acircumflextilde ; B -57 0 740 891 ; +C -1 ; WX 500 ; N acircumflextilde ; B 20 -14 550 885 ; +C -1 ; WX 667 ; N Acircumflexdotbelow ; B -57 -212 683 789 ; +C -1 ; WX 500 ; N acircumflexdotbelow ; B 20 -212 479 677 ; +C -1 ; WX 667 ; N Abreveacute ; B -57 0 710 891 ; +C -1 ; WX 500 ; N abreveacute ; B 20 -14 493 891 ; +C -1 ; WX 667 ; N Abrevegrave ; B -57 0 709 891 ; +C -1 ; WX 500 ; N abrevegrave ; B 20 -14 479 891 ; +C -1 ; WX 667 ; N Abrevehookabove ; B -57 0 709 891 ; +C -1 ; WX 500 ; N abrevehookabove ; B 20 -14 482 891 ; +C -1 ; WX 667 ; N Abrevetilde ; B -57 0 740 891 ; +C -1 ; WX 500 ; N abrevetilde ; B 20 -14 550 885 ; +C -1 ; WX 667 ; N Abrevedotbelow ; B -57 -212 709 799 ; +C -1 ; WX 500 ; N abrevedotbelow ; B 20 -212 479 677 ; +C -1 ; WX 667 ; N Edotbelow ; B -35 -212 680 662 ; +C -1 ; WX 444 ; N edotbelow ; B 24 -212 442 453 ; +C -1 ; WX 667 ; N Ehookabove ; B -35 0 680 891 ; +C -1 ; WX 444 ; N ehookabove ; B 24 -14 503 674 ; +C -1 ; WX 667 ; N Etilde ; B -35 0 680 842 ; +C -1 ; WX 444 ; N etilde ; B 24 -14 496 662 ; +C -1 ; WX 667 ; N Ecircumflexacute ; B -35 0 680 891 ; +C -1 ; WX 444 ; N ecircumflexacute ; B 24 -14 496 891 ; +C -1 ; WX 667 ; N Ecircumflexgrave ; B -35 0 680 891 ; +C -1 ; WX 444 ; N ecircumflexgrave ; B 24 -14 442 891 ; +C -1 ; WX 667 ; N Ecircumflexhookabove ; B -35 0 680 891 ; +C -1 ; WX 444 ; N ecircumflexhookabove ; B 24 -14 496 891 ; +C -1 ; WX 667 ; N Ecircumflextilde ; B -35 0 680 891 ; +C -1 ; WX 444 ; N ecircumflextilde ; B 24 -14 550 885 ; +C -1 ; WX 667 ; N Ecircumflexdotbelow ; B -35 -212 680 789 ; +C -1 ; WX 444 ; N ecircumflexdotbelow ; B 24 -212 442 677 ; +C -1 ; WX 389 ; N Ihookabove ; B -35 0 477 891 ; +C -1 ; WX 278 ; N ihookabove ; B 20 -14 356 674 ; +C -1 ; WX 389 ; N Idotbelow ; B -35 -212 467 662 ; +C -1 ; WX 278 ; N idotbelow ; B -1 -212 298 677 ; +C -1 ; WX 722 ; N Odotbelow ; B 53 -212 718 678 ; +C -1 ; WX 500 ; N odotbelow ; B 24 -212 470 453 ; +C -1 ; WX 722 ; N Ohookabove ; B 53 -16 718 891 ; +C -1 ; WX 500 ; N ohookabove ; B 24 -14 488 674 ; +C -1 ; WX 722 ; N Ocircumflexacute ; B 53 -16 718 891 ; +C -1 ; WX 500 ; N ocircumflexacute ; B 24 -14 522 891 ; +C -1 ; WX 722 ; N Ocircumflexgrave ; B 53 -16 718 891 ; +C -1 ; WX 500 ; N ocircumflexgrave ; B 24 -14 470 891 ; +C -1 ; WX 722 ; N Ocircumflexhookabove ; B 53 -16 718 891 ; +C -1 ; WX 500 ; N ocircumflexhookabove ; B 24 -14 522 891 ; +C -1 ; WX 722 ; N Ocircumflextilde ; B 53 -16 718 891 ; +C -1 ; WX 500 ; N ocircumflextilde ; B 24 -14 564 885 ; +C -1 ; WX 722 ; N Ocircumflexdotbelow ; B 53 -212 718 789 ; +C -1 ; WX 500 ; N ocircumflexdotbelow ; B 24 -212 470 677 ; +C -1 ; WX 722 ; N Ohornacute ; B 53 -16 839 887 ; +C -1 ; WX 537 ; N ohornacute ; B 24 -14 600 677 ; +C -1 ; WX 722 ; N Ohorngrave ; B 53 -16 839 883 ; +C -1 ; WX 537 ; N ohorngrave ; B 24 -14 600 677 ; +C -1 ; WX 722 ; N Ohornhookabove ; B 53 -16 839 891 ; +C -1 ; WX 537 ; N ohornhookabove ; B 24 -14 600 674 ; +C -1 ; WX 722 ; N Ohorntilde ; B 53 -16 839 842 ; +C -1 ; WX 537 ; N ohorntilde ; B 24 -14 600 662 ; +C -1 ; WX 722 ; N Ohorndotbelow ; B 53 -212 839 721 ; +C -1 ; WX 537 ; N ohorndotbelow ; B 24 -212 600 512 ; +C -1 ; WX 722 ; N Udotbelow ; B 94 -212 809 662 ; +C -1 ; WX 556 ; N udotbelow ; B 32 -212 516 453 ; +C -1 ; WX 722 ; N Uhookabove ; B 94 -15 809 891 ; +C -1 ; WX 556 ; N uhookabove ; B 32 -14 516 674 ; +C -1 ; WX 775 ; N Uhornacute ; B 94 -15 929 887 ; +C -1 ; WX 599 ; N uhornacute ; B 34 -14 655 677 ; +C -1 ; WX 775 ; N Uhorngrave ; B 94 -15 929 883 ; +C -1 ; WX 599 ; N uhorngrave ; B 34 -14 655 677 ; +C -1 ; WX 775 ; N Uhornhookabove ; B 94 -15 929 891 ; +C -1 ; WX 599 ; N uhornhookabove ; B 34 -14 655 674 ; +C -1 ; WX 775 ; N Uhorntilde ; B 94 -15 929 863 ; +C -1 ; WX 599 ; N uhorntilde ; B 34 -14 655 662 ; +C -1 ; WX 775 ; N Uhorndotbelow ; B 94 -212 929 801 ; +C -1 ; WX 599 ; N uhorndotbelow ; B 34 -212 655 467 ; +C -1 ; WX 611 ; N Ydotbelow ; B 93 -212 717 662 ; +C -1 ; WX 444 ; N ydotbelow ; B -92 -216 444 453 ; +C -1 ; WX 611 ; N Yhookabove ; B 93 0 717 891 ; +C -1 ; WX 444 ; N yhookabove ; B -92 -216 444 674 ; +C -1 ; WX 611 ; N Ytilde ; B 93 0 717 842 ; +C -1 ; WX 444 ; N ytilde ; B -92 -216 466 662 ; +C -1 ; WX 667 ; N uni01CD ; B -57 0 750 877 ; +C -1 ; WX 500 ; N uni01CE ; B 20 -14 535 677 ; +C -1 ; WX 389 ; N uni01CF ; B -35 0 511 877 ; +C -1 ; WX 278 ; N uni01D0 ; B 22 -14 399 677 ; +C -1 ; WX 722 ; N uni01D1 ; B 53 -16 718 877 ; +C -1 ; WX 500 ; N uni01D2 ; B 24 -14 526 677 ; +C -1 ; WX 722 ; N uni01D3 ; B 94 -15 809 877 ; +C -1 ; WX 556 ; N uni01D4 ; B 32 -14 521 677 ; +C -1 ; WX 722 ; N uni01D5 ; B 94 -15 809 891 ; +C -1 ; WX 556 ; N uni01D6 ; B 32 -14 554 764 ; +C -1 ; WX 722 ; N uni01D7 ; B 94 -15 809 891 ; +C -1 ; WX 556 ; N uni01D8 ; B 32 -14 521 831 ; +C -1 ; WX 722 ; N uni01D9 ; B 94 -15 809 891 ; +C -1 ; WX 556 ; N uni01DA ; B 32 -14 544 832 ; +C -1 ; WX 722 ; N uni01DB ; B 94 -15 809 891 ; +C -1 ; WX 556 ; N uni01DC ; B 32 -14 516 831 ; +C -1 ; WX 0 ; N _d_912 ; B 93 706 376 891 ; +C -1 ; WX 0 ; N _d_913 ; B 93 706 334 891 ; +C -1 ; WX 0 ; N _d_914 ; B 93 706 358 891 ; +C -1 ; WX 0 ; N _d_915 ; B 93 706 334 891 ; +C -1 ; WX 604 ; N uni0492 ; B -32 0 684 662 ; +C -1 ; WX 369 ; N uni0493 ; B -10 -14 372 453 ; +C -1 ; WX 918 ; N uni0496 ; B -63 -191 976 670 ; +C -1 ; WX 952 ; N uni0497 ; B -4 -187 952 453 ; +C -1 ; WX 678 ; N uni049a ; B -35 -191 737 670 ; +C -1 ; WX 507 ; N uni049b ; B 12 -187 510 453 ; +C -1 ; WX 678 ; N uni049c ; B -35 0 737 670 ; +C -1 ; WX 507 ; N uni049d ; B 12 0 510 453 ; +C -1 ; WX 778 ; N uni04a2 ; B -32 -191 862 662 ; +C -1 ; WX 555 ; N uni04a3 ; B 13 -187 516 453 ; +C -1 ; WX 611 ; N uni04ae ; B 93 0 717 662 ; +C -1 ; WX 500 ; N uni04af ; B 7 -214 544 439 ; +C -1 ; WX 611 ; N uni04b0 ; B 86 0 717 662 ; +C -1 ; WX 500 ; N uni04b1 ; B -25 -214 544 439 ; +C -1 ; WX 667 ; N uni04b2 ; B -61 -191 763 662 ; +C -1 ; WX 500 ; N uni04b3 ; B -45 -187 508 453 ; +C -1 ; WX 748 ; N uni04b8 ; B 120 0 829 662 ; +C -1 ; WX 525 ; N uni04b9 ; B 48 -14 486 453 ; +C -1 ; WX 748 ; N uni04ba ; B -33 0 675 662 ; +C -1 ; WX 556 ; N uni04bb ; B 13 -6 503 453 ; +C -1 ; WX 722 ; N uni018f ; B 53 -15 718 677 ; +C -1 ; WX 444 ; N uni0259 ; B 1 -14 419 453 ; +C -1 ; WX 722 ; N uni04e8 ; B 53 -16 718 678 ; +C -1 ; WX 500 ; N uni04e9 ; B 24 -14 470 453 ; +EndCharMetrics +StartKernData +StartKernPairs 845 +KPX space A -37 +KPX space W -18 +KPX space Y -18 +KPX space Alphatonos -37 +KPX space Upsilontonos -18 +KPX space Alpha -37 +KPX space Delta -37 +KPX space Lambda -37 +KPX space Upsilon -18 +KPX space Upsilondieresis -18 +KPX one one -55 +KPX A space -55 +KPX A T -55 +KPX A V -74 +KPX A W -92 +KPX A Y -55 +KPX A v -74 +KPX A w -74 +KPX A y -74 +KPX A quoteright -74 +KPX F space -18 +KPX F comma -129 +KPX F period -129 +KPX F A -92 +KPX L space -37 +KPX L T -18 +KPX L V -37 +KPX L W -37 +KPX L Y -37 +KPX L y -37 +KPX L quoteright -55 +KPX P space -37 +KPX P comma -129 +KPX P period -129 +KPX P A -74 +KPX R V -18 +KPX R W -18 +KPX R Y -18 +KPX R y -18 +KPX T comma -92 +KPX T hyphen -92 +KPX T period -92 +KPX T colon -74 +KPX T semicolon -74 +KPX T A -55 +KPX T O -18 +KPX T a -92 +KPX T c -92 +KPX T e -92 +KPX T i -37 +KPX T o -92 +KPX T r -37 +KPX T s -92 +KPX T u -37 +KPX T w -37 +KPX T y -37 +KPX V space -18 +KPX V comma -129 +KPX V hyphen -55 +KPX V period -129 +KPX V colon -74 +KPX V semicolon -74 +KPX V A -74 +KPX V a -111 +KPX V e -111 +KPX V i -55 +KPX V o -111 +KPX V r -55 +KPX V u -55 +KPX V y -74 +KPX W space -18 +KPX W comma -74 +KPX W hyphen -37 +KPX W period -74 +KPX W colon -55 +KPX W semicolon -55 +KPX W A -74 +KPX W a -74 +KPX W e -74 +KPX W i -37 +KPX W o -74 +KPX W r -74 +KPX W u -55 +KPX W y -55 +KPX Y space -37 +KPX Y comma -92 +KPX Y hyphen -92 +KPX Y period -74 +KPX Y colon -92 +KPX Y semicolon -92 +KPX Y A -74 +KPX Y a -92 +KPX Y e -111 +KPX Y i -55 +KPX Y o -111 +KPX Y p -74 +KPX Y q -111 +KPX Y u -92 +KPX Y v -92 +KPX f f -18 +KPX f quoteright 55 +KPX r comma -55 +KPX r period -55 +KPX r quoteright 37 +KPX v comma -37 +KPX v period -37 +KPX w comma -37 +KPX w period -37 +KPX y comma -37 +KPX y period -37 +KPX quoteleft quoteleft -74 +KPX quoteright space -74 +KPX quoteright s -74 +KPX quoteright t -37 +KPX quoteright quoteright -74 +KPX quotesinglbase afii10051 -113 +KPX quotesinglbase afii10060 -113 +KPX quotesinglbase afii10036 -113 +KPX quotesinglbase afii10041 -176 +KPX quotesinglbase afii10044 -88 +KPX quotedblbase afii10051 -113 +KPX quotedblbase afii10060 -113 +KPX quotedblbase afii10036 -113 +KPX quotedblbase afii10041 -125 +KPX quotedblbase afii10044 -50 +KPX Gamma space -18 +KPX Gamma comma -128 +KPX Gamma period -128 +KPX Gamma iotadieresistonos 76 +KPX Gamma Alpha -150 +KPX Gamma Delta -131 +KPX Gamma Lambda -150 +KPX Gamma iota -37 +KPX Theta Alpha -44 +KPX Theta Delta -19 +KPX Theta Lambda -44 +KPX Theta Upsilon -51 +KPX Theta Upsilondieresis -51 +KPX Phi Alpha -44 +KPX Phi Upsilon -68 +KPX Phi Upsilondieresis -68 +KPX delta tau -14 +KPX delta lambda -18 +KPX delta chi -31 +KPX delta pi -14 +KPX tau alpha -14 +KPX tau delta -14 +KPX tau sigma -14 +KPX tau phi -14 +KPX tau alphatonos -14 +KPX tau omicron -14 +KPX tau sigma1 -14 +KPX tau omega -14 +KPX tau omicrontonos -14 +KPX tau omegatonos -14 +KPX phi tau -14 +KPX phi lambda -18 +KPX phi chi -31 +KPX Alphatonos space -55 +KPX Alphatonos Theta -25 +KPX Alphatonos Phi -25 +KPX Alphatonos Omicron -25 +KPX Alphatonos Tau -82 +KPX Alphatonos Upsilon -93 +KPX Alphatonos Upsilondieresis -93 +KPX Alphatonos gamma -38 +KPX Alphatonos nu -74 +KPX Alphatonos chi -33 +KPX Omicrontonos Upsilon -51 +KPX Omicrontonos Upsilondieresis -51 +KPX Upsilontonos alpha -91 +KPX Upsilontonos delta -91 +KPX Upsilontonos sigma -91 +KPX Upsilontonos phi -91 +KPX Upsilontonos iotadieresistonos 76 +KPX Upsilontonos Alpha -74 +KPX Upsilontonos Delta -74 +KPX Upsilontonos Lambda -74 +KPX Upsilontonos alphatonos -91 +KPX Upsilontonos etatonos -26 +KPX Upsilontonos iotatonos -26 +KPX Upsilontonos eta -26 +KPX Upsilontonos iota -26 +KPX Upsilontonos kappa -26 +KPX Upsilontonos mu -26 +KPX Upsilontonos omicron -91 +KPX Upsilontonos omicrontonos -91 +KPX Omegatonos Upsilon -46 +KPX Alpha space -55 +KPX Alpha quoteright -74 +KPX Alpha Theta -25 +KPX Alpha Phi -25 +KPX Alpha Omicron -25 +KPX Alpha Tau -82 +KPX Alpha Upsilon -93 +KPX Alpha Upsilondieresis -93 +KPX Alpha gamma -38 +KPX Alpha nu -74 +KPX Alpha chi -33 +KPX Delta space -55 +KPX Delta Theta -19 +KPX Delta Omicron -19 +KPX Delta Tau -68 +KPX Delta Upsilon -93 +KPX Delta Upsilondieresis -93 +KPX Kappa Theta -44 +KPX Kappa Phi -74 +KPX Kappa alpha -31 +KPX Kappa delta -31 +KPX Kappa sigma -31 +KPX Kappa phi -31 +KPX Kappa Omicron -44 +KPX Kappa alphatonos -31 +KPX Kappa zeta -31 +KPX Kappa theta -31 +KPX Kappa xi -31 +KPX Kappa omicron -31 +KPX Kappa omega -31 +KPX Kappa omicrontonos -31 +KPX Kappa omegatonos -31 +KPX Lambda space -55 +KPX Lambda Theta -25 +KPX Lambda Omicron -25 +KPX Lambda Tau -82 +KPX Lambda Upsilon -93 +KPX Lambda Upsilondieresis -93 +KPX Omicron Alphatonos -44 +KPX Omicron Alpha -44 +KPX Omicron Delta -19 +KPX Omicron Lambda -44 +KPX Omicron Upsilon -51 +KPX Omicron Upsilondieresis -51 +KPX Rho space -37 +KPX Rho comma -128 +KPX Rho period -128 +KPX Rho Alpha -145 +KPX Rho Delta -119 +KPX Rho Lambda -145 +KPX Sigma tau -44 +KPX Tau comma -91 +KPX Tau hyphen -91 +KPX Tau period -91 +KPX Tau colon -74 +KPX Tau semicolon -74 +KPX Tau Theta -18 +KPX Tau Phi -18 +KPX Tau alpha -91 +KPX Tau delta -91 +KPX Tau epsilon -91 +KPX Tau sigma -91 +KPX Tau phi -91 +KPX Tau iotadieresistonos 95 +KPX Tau Alpha -79 +KPX Tau Delta -76 +KPX Tau Lambda -79 +KPX Tau Omicron -18 +KPX Tau Omega -18 +KPX Tau alphatonos -91 +KPX Tau epsilontonos -91 +KPX Tau eta -37 +KPX Tau iota -37 +KPX Tau mu -37 +KPX Tau omicron -91 +KPX Tau upsilon -37 +KPX Tau chi -37 +KPX Tau psi -37 +KPX Tau iotadieresis 50 +KPX Tau upsilondieresis -37 +KPX Tau omicrontonos -91 +KPX Tau upsilontonos -37 +KPX Upsilon comma -91 +KPX Upsilon hyphen -91 +KPX Upsilon period -91 +KPX Upsilon colon -91 +KPX Upsilon semicolon -91 +KPX Upsilon Theta -17 +KPX Upsilon Phi -25 +KPX Upsilon alpha -91 +KPX Upsilon delta -91 +KPX Upsilon sigma -91 +KPX Upsilon phi -91 +KPX Upsilon iotadieresistonos 76 +KPX Upsilon Alpha -74 +KPX Upsilon Delta -57 +KPX Upsilon Lambda -74 +KPX Upsilon Omicron -17 +KPX Upsilon alphatonos -91 +KPX Upsilon etatonos -26 +KPX Upsilon iotatonos -26 +KPX Upsilon gamma -68 +KPX Upsilon eta -26 +KPX Upsilon iota -26 +KPX Upsilon kappa -26 +KPX Upsilon mu -26 +KPX Upsilon omicron -91 +KPX Upsilon omicrontonos -91 +KPX Psi alpha -57 +KPX Psi delta -57 +KPX Psi sigma -57 +KPX Psi phi -57 +KPX Psi alphatonos -57 +KPX Psi theta -19 +KPX Psi omicron -57 +KPX Psi omega -57 +KPX Psi omicrontonos -57 +KPX Psi omegatonos -57 +KPX Omega Upsilon -46 +KPX Omega Upsilondieresis -46 +KPX Upsilondieresis Theta -17 +KPX Upsilondieresis Phi -25 +KPX Upsilondieresis alpha -91 +KPX Upsilondieresis delta -91 +KPX Upsilondieresis sigma -91 +KPX Upsilondieresis phi -91 +KPX Upsilondieresis iotadieresistonos 76 +KPX Upsilondieresis Alpha -74 +KPX Upsilondieresis Delta -57 +KPX Upsilondieresis Lambda -74 +KPX Upsilondieresis Omicron -17 +KPX Upsilondieresis alphatonos -91 +KPX Upsilondieresis etatonos -26 +KPX Upsilondieresis iotatonos -26 +KPX Upsilondieresis eta -26 +KPX Upsilondieresis iota -26 +KPX Upsilondieresis kappa -26 +KPX Upsilondieresis mu -26 +KPX Upsilondieresis omicron -91 +KPX Upsilondieresis omicrontonos -91 +KPX zeta alpha -50 +KPX zeta delta -42 +KPX zeta sigma -50 +KPX zeta tau -83 +KPX zeta phi -50 +KPX zeta alphatonos -50 +KPX zeta etatonos -28 +KPX zeta gamma -42 +KPX zeta eta -28 +KPX zeta theta -42 +KPX zeta iota -28 +KPX zeta kappa -28 +KPX zeta nu -42 +KPX zeta omicron -50 +KPX zeta omega -50 +KPX zeta omicrontonos -50 +KPX zeta omegatonos -50 +KPX zeta pi -19 +KPX kappa alpha -19 +KPX kappa delta -19 +KPX kappa sigma -19 +KPX kappa phi -19 +KPX kappa alphatonos -19 +KPX kappa zeta -19 +KPX kappa xi -19 +KPX kappa omicron -19 +KPX kappa sigma1 -19 +KPX kappa omega -19 +KPX kappa omicrontonos -19 +KPX kappa omegatonos -19 +KPX lambda delta -18 +KPX lambda sigma -18 +KPX lambda upsilondieresistonos -15 +KPX lambda zeta -9 +KPX lambda xi -12 +KPX lambda sigma1 -21 +KPX lambda upsilon -15 +KPX lambda upsilondieresis -15 +KPX lambda upsilontonos -15 +KPX xi alpha -25 +KPX xi delta -25 +KPX xi sigma -25 +KPX xi phi -25 +KPX xi alphatonos -25 +KPX xi zeta -25 +KPX xi xi -25 +KPX xi omicron -25 +KPX xi sigma1 -25 +KPX xi omicrontonos -25 +KPX omicron tau -14 +KPX omicron lambda -18 +KPX omicron chi -31 +KPX omicron pi -14 +KPX rho chi -31 +KPX chi alpha -31 +KPX chi delta -31 +KPX chi sigma -31 +KPX chi phi -15 +KPX chi alphatonos -31 +KPX chi zeta -15 +KPX chi omicron -31 +KPX chi sigma1 -15 +KPX chi omega -31 +KPX chi omicrontonos -31 +KPX chi omegatonos -31 +KPX omega tau -14 +KPX omega chi -31 +KPX omega pi -14 +KPX omicrontonos tau -14 +KPX omicrontonos lambda -18 +KPX omicrontonos chi -31 +KPX omicrontonos pi -14 +KPX omegatonos tau -14 +KPX omegatonos chi -31 +KPX omegatonos pi -14 +KPX afii10052 comma -63 +KPX afii10052 period -75 +KPX afii10052 colon 25 +KPX afii10058 quoteright -121 +KPX afii10059 quoteright -88 +KPX afii10017 quoteright -101 +KPX afii10017 afii10021 14 +KPX afii10017 afii10025 -13 +KPX afii10017 afii10032 -38 +KPX afii10017 afii10033 -25 +KPX afii10017 afii10035 -25 +KPX afii10017 afii10036 -38 +KPX afii10017 afii10037 -63 +KPX afii10017 afii10038 -51 +KPX afii10017 afii10041 -63 +KPX afii10017 afii10047 -50 +KPX afii10017 afii10065 -15 +KPX afii10017 afii10066 -15 +KPX afii10017 afii10070 -15 +KPX afii10017 afii10080 -15 +KPX afii10017 afii10083 -15 +KPX afii10017 afii10085 -33 +KPX afii10017 afii10086 -15 +KPX afii10017 afii10095 -15 +KPX afii10018 afii10017 -27 +KPX afii10018 afii10021 12 +KPX afii10018 afii10025 37 +KPX afii10018 afii10037 -40 +KPX afii10018 afii10038 -27 +KPX afii10018 afii10039 -13 +KPX afii10018 afii10041 -27 +KPX afii10018 afii10044 -28 +KPX afii10018 afii10047 -14 +KPX afii10018 afii10069 12 +KPX afii10018 afii10085 -12 +KPX afii10018 afii10097 23 +KPX afii10019 afii10017 -38 +KPX afii10019 afii10021 -53 +KPX afii10019 afii10024 -40 +KPX afii10019 afii10025 -34 +KPX afii10019 afii10032 -47 +KPX afii10019 afii10035 -47 +KPX afii10019 afii10036 -57 +KPX afii10019 afii10037 -85 +KPX afii10019 afii10038 -67 +KPX afii10019 afii10039 -25 +KPX afii10019 afii10041 -60 +KPX afii10019 afii10044 -48 +KPX afii10019 afii10049 -47 +KPX afii10019 afii10069 12 +KPX afii10019 afii10078 -13 +KPX afii10019 afii10084 12 +KPX afii10019 afii10087 -14 +KPX afii10019 afii10089 12 +KPX afii10019 afii10097 12 +KPX afii10020 comma -63 +KPX afii10020 period -75 +KPX afii10020 colon 25 +KPX afii10020 afii10017 -75 +KPX afii10020 afii10021 -75 +KPX afii10020 afii10025 19 +KPX afii10020 afii10029 -69 +KPX afii10020 afii10030 -25 +KPX afii10020 afii10032 -13 +KPX afii10020 afii10049 -13 +KPX afii10020 afii10065 -25 +KPX afii10020 afii10067 -38 +KPX afii10020 afii10069 -18 +KPX afii10020 afii10070 -30 +KPX afii10020 afii10074 -19 +KPX afii10020 afii10077 -53 +KPX afii10020 afii10078 -40 +KPX afii10020 afii10079 -30 +KPX afii10020 afii10080 -52 +KPX afii10020 afii10082 -28 +KPX afii10020 afii10085 -43 +KPX afii10020 afii10093 -53 +KPX afii10020 afii10094 -50 +KPX afii10020 afii10096 -65 +KPX afii10020 afii10097 -40 +KPX afii10021 afii10038 -19 +KPX afii10021 afii10085 25 +KPX afii10022 afii10025 -14 +KPX afii10024 afii10032 -53 +KPX afii10024 afii10035 -53 +KPX afii10024 afii10037 -34 +KPX afii10024 afii10041 -34 +KPX afii10024 afii10080 -13 +KPX afii10024 afii10085 -30 +KPX afii10025 afii10036 12 +KPX afii10025 afii10037 -13 +KPX afii10025 afii10041 -50 +KPX afii10025 afii10069 13 +KPX afii10028 afii10032 -47 +KPX afii10028 afii10035 -47 +KPX afii10028 afii10037 -13 +KPX afii10028 afii10038 -80 +KPX afii10028 afii10047 -13 +KPX afii10028 afii10070 -25 +KPX afii10028 afii10080 -38 +KPX afii10028 afii10083 -25 +KPX afii10028 afii10085 -43 +KPX afii10028 afii10095 -25 +KPX afii10029 afii10085 19 +KPX afii10030 afii10038 -25 +KPX afii10030 afii10065 -14 +KPX afii10030 afii10070 -14 +KPX afii10030 afii10080 -14 +KPX afii10030 afii10083 -14 +KPX afii10032 afii10017 -48 +KPX afii10032 afii10021 -25 +KPX afii10032 afii10024 -38 +KPX afii10032 afii10029 -25 +KPX afii10032 afii10037 -58 +KPX afii10032 afii10038 12 +KPX afii10032 afii10039 -50 +KPX afii10032 afii10041 -38 +KPX afii10032 afii10049 -38 +KPX afii10032 afii10072 19 +KPX afii10032 afii10087 19 +KPX afii10034 comma -88 +KPX afii10034 period -100 +KPX afii10034 colon 25 +KPX afii10034 afii10017 -88 +KPX afii10034 afii10021 -99 +KPX afii10034 afii10024 -52 +KPX afii10034 afii10025 -33 +KPX afii10034 afii10029 -78 +KPX afii10034 afii10030 -25 +KPX afii10034 afii10032 -13 +KPX afii10034 afii10037 -71 +KPX afii10034 afii10038 -27 +KPX afii10034 afii10039 -63 +KPX afii10034 afii10049 -41 +KPX afii10034 afii10065 -38 +KPX afii10034 afii10069 -36 +KPX afii10034 afii10070 -36 +KPX afii10034 afii10080 -36 +KPX afii10034 afii10097 -25 +KPX afii10035 afii10017 -38 +KPX afii10035 afii10029 12 +KPX afii10035 afii10037 -13 +KPX afii10035 afii10039 -13 +KPX afii10035 afii10041 -13 +KPX afii10035 afii10065 7 +KPX afii10035 afii10066 7 +KPX afii10035 afii10070 7 +KPX afii10035 afii10072 7 +KPX afii10035 afii10073 7 +KPX afii10035 afii10080 7 +KPX afii10035 afii10083 7 +KPX afii10035 afii10084 14 +KPX afii10035 afii10086 7 +KPX afii10035 afii10095 7 +KPX afii10036 comma -50 +KPX afii10036 period -63 +KPX afii10036 colon 37 +KPX afii10036 semicolon 12 +KPX afii10036 guillemotleft 25 +KPX afii10036 guillemotright 25 +KPX afii10036 afii10017 -63 +KPX afii10036 afii10021 25 +KPX afii10036 afii10038 -27 +KPX afii10036 afii10047 7 +KPX afii10036 afii10065 -36 +KPX afii10036 afii10067 -36 +KPX afii10036 afii10070 -36 +KPX afii10036 afii10074 -24 +KPX afii10036 afii10076 -36 +KPX afii10036 afii10077 -36 +KPX afii10036 afii10078 -36 +KPX afii10036 afii10080 -36 +KPX afii10036 afii10081 -24 +KPX afii10036 afii10082 -25 +KPX afii10036 afii10083 -36 +KPX afii10036 afii10085 -24 +KPX afii10036 afii10087 -24 +KPX afii10036 afii10091 -24 +KPX afii10036 afii10093 -36 +KPX afii10036 afii10094 -36 +KPX afii10036 afii10096 -36 +KPX afii10036 afii10097 -24 +KPX afii10037 comma -51 +KPX afii10037 period -63 +KPX afii10037 colon 25 +KPX afii10037 guillemotleft 12 +KPX afii10037 guillemotright 25 +KPX afii10037 afii10017 -75 +KPX afii10037 afii10021 -40 +KPX afii10037 afii10029 -65 +KPX afii10037 afii10032 -27 +KPX afii10037 afii10038 -53 +KPX afii10037 afii10049 -53 +KPX afii10037 afii10066 -13 +KPX afii10037 afii10067 -47 +KPX afii10037 afii10068 -50 +KPX afii10037 afii10069 -13 +KPX afii10037 afii10070 -47 +KPX afii10037 afii10072 -50 +KPX afii10037 afii10073 -31 +KPX afii10037 afii10074 -15 +KPX afii10037 afii10075 -13 +KPX afii10037 afii10076 -25 +KPX afii10037 afii10077 -50 +KPX afii10037 afii10078 -50 +KPX afii10037 afii10079 -25 +KPX afii10037 afii10080 -47 +KPX afii10037 afii10081 -28 +KPX afii10037 afii10082 -40 +KPX afii10037 afii10083 -47 +KPX afii10037 afii10087 -22 +KPX afii10037 afii10088 -13 +KPX afii10037 afii10090 -13 +KPX afii10037 afii10091 -13 +KPX afii10037 afii10096 -28 +KPX afii10037 afii10097 -47 +KPX afii10038 afii10017 -50 +KPX afii10038 afii10021 -47 +KPX afii10038 afii10029 -13 +KPX afii10038 afii10030 -6 +KPX afii10038 afii10032 12 +KPX afii10038 afii10036 -13 +KPX afii10038 afii10037 -77 +KPX afii10038 afii10041 -34 +KPX afii10038 afii10049 -13 +KPX afii10038 afii10077 -15 +KPX afii10039 afii10032 -51 +KPX afii10039 afii10035 -38 +KPX afii10039 afii10038 -25 +KPX afii10039 afii10080 -20 +KPX afii10044 quoteright -121 +KPX afii10044 afii10049 -18 +KPX afii10046 quoteright -121 +KPX afii10046 afii10017 -34 +KPX afii10046 afii10021 -13 +KPX afii10046 afii10024 -28 +KPX afii10046 afii10025 -13 +KPX afii10046 afii10030 -20 +KPX afii10046 afii10032 -25 +KPX afii10046 afii10035 -20 +KPX afii10046 afii10036 -51 +KPX afii10046 afii10039 -40 +KPX afii10046 afii10041 -112 +KPX afii10046 afii10047 -38 +KPX afii10046 afii10049 -13 +KPX afii10047 afii10024 -13 +KPX afii10047 afii10025 25 +KPX afii10047 afii10029 -13 +KPX afii10047 afii10039 -38 +KPX afii10047 afii10049 -13 +KPX afii10047 afii10069 14 +KPX afii10047 afii10072 14 +KPX afii10047 afii10077 -7 +KPX afii10047 afii10078 -14 +KPX afii10047 afii10097 14 +KPX afii10048 afii10017 -56 +KPX afii10048 afii10021 -13 +KPX afii10048 afii10024 -25 +KPX afii10048 afii10029 -25 +KPX afii10048 afii10032 -13 +KPX afii10048 afii10036 -13 +KPX afii10048 afii10039 -51 +KPX afii10048 afii10041 -25 +KPX afii10048 afii10069 7 +KPX afii10048 afii10072 7 +KPX afii10065 afii10085 -13 +KPX afii10065 afii10089 -13 +KPX afii10066 afii10072 -13 +KPX afii10066 afii10073 -13 +KPX afii10066 afii10077 -25 +KPX afii10066 afii10078 -38 +KPX afii10066 afii10080 -13 +KPX afii10066 afii10083 -13 +KPX afii10066 afii10085 -13 +KPX afii10066 afii10086 -13 +KPX afii10066 afii10087 -20 +KPX afii10066 afii10089 -13 +KPX afii10066 afii10092 -25 +KPX afii10066 afii10095 -13 +KPX afii10066 afii10097 -25 +KPX afii10067 afii10065 -7 +KPX afii10067 afii10066 -13 +KPX afii10067 afii10069 -19 +KPX afii10067 afii10070 -12 +KPX afii10067 afii10073 -13 +KPX afii10067 afii10080 -13 +KPX afii10067 afii10083 -13 +KPX afii10067 afii10086 -7 +KPX afii10067 afii10092 -13 +KPX afii10067 afii10097 -13 +KPX afii10068 period -13 +KPX afii10068 afii10077 -13 +KPX afii10069 afii10085 -13 +KPX afii10069 afii10092 -13 +KPX afii10069 afii10095 -13 +KPX afii10070 afii10065 -13 +KPX afii10070 afii10066 -13 +KPX afii10070 afii10069 -25 +KPX afii10070 afii10072 -25 +KPX afii10070 afii10073 -13 +KPX afii10070 afii10077 -25 +KPX afii10070 afii10078 -25 +KPX afii10070 afii10080 -13 +KPX afii10070 afii10083 -13 +KPX afii10070 afii10084 -13 +KPX afii10070 afii10086 -25 +KPX afii10070 afii10087 -13 +KPX afii10070 afii10089 -13 +KPX afii10072 afii10065 -13 +KPX afii10072 afii10066 -13 +KPX afii10072 afii10070 -13 +KPX afii10072 afii10073 -13 +KPX afii10072 afii10080 -25 +KPX afii10072 afii10083 -25 +KPX afii10072 afii10089 -13 +KPX afii10072 afii10092 -13 +KPX afii10073 afii10069 -13 +KPX afii10073 afii10072 -13 +KPX afii10073 afii10073 -13 +KPX afii10073 afii10077 -25 +KPX afii10073 afii10078 -25 +KPX afii10073 afii10080 -13 +KPX afii10073 afii10083 -13 +KPX afii10073 afii10085 -7 +KPX afii10073 afii10089 -13 +KPX afii10073 afii10092 -13 +KPX afii10076 guillemotleft -27 +KPX afii10076 afii10065 -25 +KPX afii10076 afii10066 -25 +KPX afii10076 afii10070 -30 +KPX afii10076 afii10073 -13 +KPX afii10076 afii10077 20 +KPX afii10076 afii10080 -38 +KPX afii10076 afii10083 -38 +KPX afii10076 afii10084 -13 +KPX afii10076 afii10086 -25 +KPX afii10076 afii10089 -13 +KPX afii10076 afii10095 -13 +KPX afii10077 afii10085 -13 +KPX afii10077 afii10089 -13 +KPX afii10080 afii10069 -13 +KPX afii10080 afii10072 -25 +KPX afii10080 afii10073 -13 +KPX afii10080 afii10077 -25 +KPX afii10080 afii10078 -38 +KPX afii10080 afii10085 -20 +KPX afii10080 afii10087 -20 +KPX afii10080 afii10089 -26 +KPX afii10080 afii10095 -13 +KPX afii10080 afii10097 -13 +KPX afii10082 afii10069 -13 +KPX afii10082 afii10072 -25 +KPX afii10082 afii10073 -13 +KPX afii10082 afii10077 -38 +KPX afii10082 afii10078 -50 +KPX afii10082 afii10084 -13 +KPX afii10082 afii10085 -13 +KPX afii10082 afii10087 -20 +KPX afii10082 afii10089 -13 +KPX afii10082 afii10095 -13 +KPX afii10082 afii10097 -13 +KPX afii10083 afii10065 -26 +KPX afii10083 afii10066 -13 +KPX afii10083 afii10070 -13 +KPX afii10083 afii10072 -13 +KPX afii10083 afii10073 -13 +KPX afii10083 afii10080 -25 +KPX afii10083 afii10085 -7 +KPX afii10083 afii10086 -25 +KPX afii10083 afii10087 -13 +KPX afii10083 afii10089 -13 +KPX afii10083 afii10092 -13 +KPX afii10084 comma 25 +KPX afii10084 period 12 +KPX afii10084 afii10069 -13 +KPX afii10084 afii10070 -13 +KPX afii10084 afii10073 12 +KPX afii10084 afii10080 -13 +KPX afii10084 afii10085 -25 +KPX afii10084 afii10097 12 +KPX afii10085 comma -50 +KPX afii10085 period -63 +KPX afii10085 colon -13 +KPX afii10085 semicolon -38 +KPX afii10085 afii10069 -3 +KPX afii10085 afii10072 -25 +KPX afii10085 afii10073 -13 +KPX afii10085 afii10077 -27 +KPX afii10085 afii10078 -25 +KPX afii10085 afii10082 -13 +KPX afii10085 afii10087 -13 +KPX afii10085 afii10097 -15 +KPX afii10086 afii10077 -25 +KPX afii10086 afii10078 -38 +KPX afii10086 afii10085 -26 +KPX afii10086 afii10089 -13 +KPX afii10086 afii10097 -13 +KPX afii10087 afii10065 -13 +KPX afii10087 afii10066 -25 +KPX afii10087 afii10073 -13 +KPX afii10087 afii10080 -25 +KPX afii10087 afii10083 -25 +KPX afii10087 afii10086 -25 +KPX afii10087 afii10089 -13 +KPX afii10087 afii10092 -25 +KPX afii10087 afii10095 -13 +KPX afii10088 afii10085 12 +KPX afii10091 afii10085 31 +KPX afii10094 afii10089 -38 +KPX afii10095 afii10066 -13 +KPX afii10095 afii10069 -13 +KPX afii10095 afii10072 -25 +KPX afii10095 afii10073 -13 +KPX afii10095 afii10077 -25 +KPX afii10095 afii10078 -38 +KPX afii10095 afii10080 -13 +KPX afii10095 afii10083 -13 +KPX afii10095 afii10084 -13 +KPX afii10095 afii10086 -13 +KPX afii10095 afii10087 -20 +KPX afii10095 afii10097 -25 +KPX afii10096 afii10066 -13 +KPX afii10096 afii10072 -13 +KPX afii10096 afii10077 -25 +KPX afii10096 afii10078 -38 +KPX afii10096 afii10080 -13 +KPX afii10096 afii10083 -13 +KPX afii10096 afii10087 -28 +KPX afii10096 afii10089 -13 +KPX afii10096 afii10095 -13 +KPX afii10110 comma -50 +KPX afii10110 period -63 +KPX afii10110 colon -13 +KPX afii10110 semicolon -38 +KPX afii10110 guillemotleft 12 +KPX afii10110 guillemotright 12 +KPX afii10050 comma -25 +KPX afii10050 period -38 +KPX afii10050 colon 25 +KPX afii10050 guillemotleft 25 +KPX afii10050 guillemotright 25 +KPX pi omicron -14 +EndKernPairs +EndKernData +EndFontMetrics diff --git a/gulliver/thirdparty/html2ps_pdf/fonts/timesbi.ttf b/thirdparty/html2ps_pdf/fonts/timesbi.ttf similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/fonts/timesbi.ttf rename to thirdparty/html2ps_pdf/fonts/timesbi.ttf diff --git a/gulliver/thirdparty/html2ps_pdf/fonts/timesi.afm b/thirdparty/html2ps_pdf/fonts/timesi.afm similarity index 97% rename from gulliver/thirdparty/html2ps_pdf/fonts/timesi.afm rename to thirdparty/html2ps_pdf/fonts/timesi.afm index 49a1e5bec..b3b5ab7fc 100644 --- a/gulliver/thirdparty/html2ps_pdf/fonts/timesi.afm +++ b/thirdparty/html2ps_pdf/fonts/timesi.afm @@ -1,1819 +1,1819 @@ -StartFontMetrics 4.1 -FontName TimesNewRomanPS-ItalicMT -FullName Times New Roman Italic -Notice Typeface The Monotype Corporation plc. Data The Monotype Corporation plc/Type Solutions Inc. 1990-1992. All Rights Reserved -EncodingScheme FontSpecific -FamilyName Times New Roman -Weight Italic -Version Version 2.90 -Characters 940 -ItalicAngle -17.3 -Ascender 891 -Descender -216 -UnderlineThickness 49 -UnderlinePosition -109 -IsFixedPitch false -FontBBox -498 -307 1120 1023 -StartCharMetrics 975 -C 0 ; WX 778 ; N .notdef ; B 125 0 625 625 ; -C 1 ; WX 778 ; N .notdef ; B 125 0 625 625 ; -C 2 ; WX 778 ; N .notdef ; B 125 0 625 625 ; -C 3 ; WX 778 ; N .notdef ; B 125 0 625 625 ; -C 4 ; WX 778 ; N .notdef ; B 125 0 625 625 ; -C 5 ; WX 778 ; N .notdef ; B 125 0 625 625 ; -C 6 ; WX 778 ; N .notdef ; B 125 0 625 625 ; -C 7 ; WX 778 ; N .notdef ; B 125 0 625 625 ; -C 8 ; WX 778 ; N .notdef ; B 125 0 625 625 ; -C 9 ; WX 778 ; N .notdef ; B 125 0 625 625 ; -C 10 ; WX 778 ; N .notdef ; B 125 0 625 625 ; -C 11 ; WX 778 ; N .notdef ; B 125 0 625 625 ; -C 12 ; WX 778 ; N .notdef ; B 125 0 625 625 ; -C 13 ; WX 778 ; N .notdef ; B 125 0 625 625 ; -C 14 ; WX 778 ; N .notdef ; B 125 0 625 625 ; -C 15 ; WX 778 ; N .notdef ; B 125 0 625 625 ; -C 16 ; WX 778 ; N .notdef ; B 125 0 625 625 ; -C 17 ; WX 778 ; N .notdef ; B 125 0 625 625 ; -C 18 ; WX 778 ; N .notdef ; B 125 0 625 625 ; -C 19 ; WX 778 ; N .notdef ; B 125 0 625 625 ; -C 20 ; WX 778 ; N .notdef ; B 125 0 625 625 ; -C 21 ; WX 778 ; N .notdef ; B 125 0 625 625 ; -C 22 ; WX 778 ; N .notdef ; B 125 0 625 625 ; -C 23 ; WX 778 ; N .notdef ; B 125 0 625 625 ; -C 24 ; WX 778 ; N .notdef ; B 125 0 625 625 ; -C 25 ; WX 778 ; N .notdef ; B 125 0 625 625 ; -C 26 ; WX 778 ; N .notdef ; B 125 0 625 625 ; -C 27 ; WX 778 ; N .notdef ; B 125 0 625 625 ; -C 28 ; WX 778 ; N .notdef ; B 125 0 625 625 ; -C 29 ; WX 778 ; N .notdef ; B 125 0 625 625 ; -C 30 ; WX 778 ; N .notdef ; B 125 0 625 625 ; -C 31 ; WX 778 ; N .notdef ; B 125 0 625 625 ; -C 32 ; WX 250 ; N space ; B 75 -16 317 677 ; -C 33 ; WX 333 ; N exclam ; B 75 -16 317 677 ; -C 34 ; WX 420 ; N quotedbl ; B 144 392 452 677 ; -C 35 ; WX 500 ; N numbersign ; B 18 -14 482 677 ; -C 36 ; WX 500 ; N dollar ; B 42 -66 489 700 ; -C 37 ; WX 833 ; N percent ; B 70 -27 817 677 ; -C 38 ; WX 778 ; N ampersand ; B 48 -15 733 677 ; -C 39 ; WX 214 ; N quotesingle ; B 131 392 261 677 ; -C 40 ; WX 333 ; N parenleft ; B 68 -214 442 694 ; -C 41 ; WX 333 ; N parenright ; B -109 -214 265 694 ; -C 42 ; WX 500 ; N asterisk ; B 71 289 430 694 ; -C 43 ; WX 675 ; N plus ; B 18 69 544 595 ; -C 44 ; WX 250 ; N comma ; B -10 -125 133 88 ; -C 45 ; WX 333 ; N hyphen ; B 26 185 299 250 ; -C 46 ; WX 250 ; N period ; B 34 -11 133 87 ; -C 47 ; WX 278 ; N slash ; B -34 -15 381 694 ; -C 48 ; WX 500 ; N zero ; B 60 -12 494 676 ; -C 49 ; WX 500 ; N one ; B 61 0 417 676 ; -C 50 ; WX 500 ; N two ; B 16 0 469 676 ; -C 51 ; WX 500 ; N three ; B 33 -12 454 676 ; -C 52 ; WX 500 ; N four ; B 31 -12 487 662 ; -C 53 ; WX 500 ; N five ; B 36 -12 479 662 ; -C 54 ; WX 500 ; N six ; B 63 -12 525 676 ; -C 55 ; WX 500 ; N seven ; B 113 -12 523 662 ; -C 56 ; WX 500 ; N eight ; B 38 -12 489 676 ; -C 57 ; WX 500 ; N nine ; B 29 -12 491 676 ; -C 58 ; WX 333 ; N colon ; B 60 -9 262 442 ; -C 59 ; WX 333 ; N semicolon ; B 18 -125 264 441 ; -C 60 ; WX 675 ; N less ; B 19 91 544 572 ; -C 61 ; WX 675 ; N equal ; B 18 232 545 431 ; -C 62 ; WX 675 ; N greater ; B 18 91 543 572 ; -C 63 ; WX 500 ; N question ; B 97 -15 458 677 ; -C 64 ; WX 920 ; N at ; B 47 -216 896 694 ; -C 65 ; WX 611 ; N A ; B -49 0 547 677 ; -C 66 ; WX 611 ; N B ; B -23 0 590 662 ; -C 67 ; WX 667 ; N C ; B 67 -15 704 677 ; -C 68 ; WX 722 ; N D ; B -30 0 705 662 ; -C 69 ; WX 611 ; N E ; B -22 0 632 662 ; -C 70 ; WX 611 ; N F ; B -24 0 668 662 ; -C 71 ; WX 722 ; N G ; B 69 -16 725 677 ; -C 72 ; WX 722 ; N H ; B -26 0 811 662 ; -C 73 ; WX 333 ; N I ; B -31 0 410 662 ; -C 74 ; WX 444 ; N J ; B -34 -15 547 662 ; -C 75 ; WX 667 ; N K ; B -27 0 729 662 ; -C 76 ; WX 556 ; N L ; B -32 0 523 662 ; -C 77 ; WX 833 ; N M ; B -33 0 924 662 ; -C 78 ; WX 667 ; N N ; B -28 -15 762 662 ; -C 79 ; WX 722 ; N O ; B 60 -15 718 677 ; -C 80 ; WX 611 ; N P ; B -24 0 621 662 ; -C 81 ; WX 722 ; N Q ; B 47 -211 717 677 ; -C 82 ; WX 611 ; N R ; B -23 0 579 662 ; -C 83 ; WX 500 ; N S ; B 7 -15 542 677 ; -C 84 ; WX 556 ; N T ; B 70 0 649 662 ; -C 85 ; WX 722 ; N U ; B 106 -15 814 662 ; -C 86 ; WX 611 ; N V ; B 125 -15 723 662 ; -C 87 ; WX 833 ; N W ; B 122 -15 944 662 ; -C 88 ; WX 611 ; N X ; B -67 0 741 662 ; -C 89 ; WX 556 ; N Y ; B 90 0 667 662 ; -C 90 ; WX 556 ; N Z ; B -2 0 611 662 ; -C 91 ; WX 389 ; N bracketleft ; B 6 -199 471 677 ; -C 92 ; WX 278 ; N backslash ; B 106 -15 231 694 ; -C 93 ; WX 389 ; N bracketright ; B -100 -199 365 677 ; -C 94 ; WX 422 ; N asciicircum ; B 27 328 460 677 ; -C 95 ; WX 500 ; N underscore ; B -8 -216 509 -175 ; -C 96 ; WX 333 ; N grave ; B 176 517 337 685 ; -C 97 ; WX 500 ; N a ; B 23 -12 469 442 ; -C 98 ; WX 500 ; N b ; B 26 -12 469 694 ; -C 99 ; WX 444 ; N c ; B 29 -12 428 442 ; -C 100 ; WX 500 ; N d ; B 19 -12 541 694 ; -C 101 ; WX 444 ; N e ; B 31 -12 430 442 ; -C 102 ; WX 278 ; N f ; B -172 -216 473 694 ; -C 103 ; WX 500 ; N g ; B -27 -216 521 442 ; -C 104 ; WX 500 ; N h ; B 20 -12 459 694 ; -C 105 ; WX 278 ; N i ; B 43 -12 272 636 ; -C 106 ; WX 278 ; N j ; B -170 -216 280 635 ; -C 107 ; WX 444 ; N k ; B 12 -12 490 694 ; -C 108 ; WX 278 ; N l ; B 39 -12 297 694 ; -C 109 ; WX 722 ; N m ; B 17 -12 679 442 ; -C 110 ; WX 500 ; N n ; B 19 -12 459 442 ; -C 111 ; WX 500 ; N o ; B 29 -12 462 442 ; -C 112 ; WX 500 ; N p ; B -110 -214 473 442 ; -C 113 ; WX 500 ; N q ; B 22 -214 474 442 ; -C 114 ; WX 389 ; N r ; B 19 0 403 442 ; -C 115 ; WX 389 ; N s ; B -9 -12 363 442 ; -C 116 ; WX 278 ; N t ; B 42 -12 300 563 ; -C 117 ; WX 500 ; N u ; B 29 -12 471 442 ; -C 118 ; WX 444 ; N v ; B 21 -12 442 442 ; -C 119 ; WX 667 ; N w ; B 17 -12 662 442 ; -C 120 ; WX 444 ; N x ; B -33 -12 439 442 ; -C 121 ; WX 444 ; N y ; B -78 -216 440 442 ; -C 122 ; WX 389 ; N z ; B -30 0 392 430 ; -C 123 ; WX 400 ; N braceleft ; B 109 -216 515 694 ; -C 124 ; WX 275 ; N bar ; B 79 -216 119 694 ; -C 125 ; WX 400 ; N braceright ; B -34 -216 372 694 ; -C 126 ; WX 541 ; N asciitilde ; B 21 194 542 331 ; -C 127 ; WX 778 ; N .notdef ; B 125 0 625 625 ; -C 128 ; WX 500 ; N Euro ; B 8 -12 586 676 ; -C 129 ; WX 569 ; N afii10052 ; B -36 0 664 871 ; -C 130 ; WX 333 ; N quotesinglbase ; B 32 -125 175 88 ; -C 131 ; WX 500 ; N florin ; B 1 -210 488 677 ; -C 132 ; WX 556 ; N quotedblbase ; B 15 -128 381 88 ; -C 133 ; WX 889 ; N ellipsis ; B 130 -14 755 95 ; -C 134 ; WX 500 ; N dagger ; B 108 -203 521 677 ; -C 135 ; WX 500 ; N daggerdbl ; B -14 -216 504 694 ; -C 136 ; WX 333 ; N circumflex ; B 124 523 386 677 ; -C 137 ; WX 1000 ; N perthousand ; B 62 -26 986 677 ; -C 138 ; WX 500 ; N Scaron ; B 7 -15 546 863 ; -C 139 ; WX 333 ; N guilsinglleft ; B 57 -15 312 449 ; -C 140 ; WX 944 ; N OE ; B 22 -7 969 668 ; -C 141 ; WX 664 ; N afii10061 ; B -28 0 723 880 ; -C 142 ; WX 556 ; N Zcaron ; B -2 0 611 863 ; -C 143 ; WX 722 ; N afii10145 ; B -25 -196 812 662 ; -C 144 ; WX 556 ; N quotedblbase ; B 15 -128 381 88 ; -C 145 ; WX 333 ; N quoteleft ; B 212 464 355 677 ; -C 146 ; WX 333 ; N quoteright ; B 196 464 339 677 ; -C 147 ; WX 556 ; N quotedblleft ; B 192 461 559 677 ; -C 148 ; WX 556 ; N quotedblright ; B 182 461 549 678 ; -C 149 ; WX 350 ; N bullet ; B 55 208 300 453 ; -C 150 ; WX 500 ; N endash ; B -9 221 508 257 ; -C 151 ; WX 889 ; N emdash ; B -9 221 898 257 ; -C 152 ; WX 333 ; N tilde ; B 97 538 409 667 ; -C 153 ; WX 980 ; N trademark ; B 15 268 963 662 ; -C 154 ; WX 389 ; N scaron ; B -9 -12 412 677 ; -C 155 ; WX 333 ; N guilsinglright ; B 22 -15 277 449 ; -C 156 ; WX 667 ; N oe ; B 26 -12 648 442 ; -C 157 ; WX 468 ; N afii10109 ; B 18 0 465 685 ; -C 158 ; WX 389 ; N zcaron ; B -30 0 412 677 ; -C 159 ; WX 556 ; N Ydieresis ; B 90 0 667 836 ; -C 160 ; WX 250 ; N space ; B 75 -16 317 677 ; -C 161 ; WX 389 ; N exclamdown ; B 70 -216 313 478 ; -C 162 ; WX 500 ; N cent ; B 56 -184 453 636 ; -C 163 ; WX 500 ; N sterling ; B 24 -15 524 676 ; -C 164 ; WX 500 ; N currency ; B 13 97 486 567 ; -C 165 ; WX 500 ; N yen ; B -7 0 623 662 ; -C 166 ; WX 275 ; N brokenbar ; B 79 -216 119 694 ; -C 167 ; WX 500 ; N section ; B -2 -203 510 683 ; -C 168 ; WX 333 ; N dieresis ; B 131 549 409 654 ; -C 169 ; WX 760 ; N copyright ; B 34 -15 727 677 ; -C 170 ; WX 276 ; N ordfeminine ; B 87 405 376 677 ; -C 171 ; WX 500 ; N guillemotleft ; B 41 -15 482 449 ; -C 172 ; WX 675 ; N logicalnot ; B 18 230 545 429 ; -C 173 ; WX 333 ; N hyphen ; B 26 185 299 250 ; -C 174 ; WX 760 ; N registered ; B 34 -15 727 677 ; -C 175 ; WX 500 ; N overscore ; B -8 714 509 755 ; -C 176 ; WX 400 ; N degree ; B 48 376 348 677 ; -C 177 ; WX 549 ; N plusminus ; B 11 69 538 595 ; -C 178 ; WX 300 ; N twosuperior ; B 54 323 333 676 ; -C 179 ; WX 300 ; N threesuperior ; B 64 317 324 676 ; -C 180 ; WX 333 ; N acute ; B 200 517 360 685 ; -C 181 ; WX 576 ; N mu1 ; B -22 -215 519 430 ; -C 182 ; WX 523 ; N paragraph ; B -7 -216 455 662 ; -C 183 ; WX 250 ; N periodcentered ; B 71 277 179 385 ; -C 184 ; WX 333 ; N cedilla ; B -18 -181 165 15 ; -C 185 ; WX 300 ; N onesuperior ; B 80 323 304 676 ; -C 186 ; WX 310 ; N ordmasculine ; B 111 405 393 677 ; -C 187 ; WX 500 ; N guillemotright ; B 18 -15 459 449 ; -C 188 ; WX 750 ; N onequarter ; B 79 -27 700 676 ; -C 189 ; WX 750 ; N onehalf ; B 79 -27 688 676 ; -C 190 ; WX 750 ; N threequarters ; B 63 -27 700 676 ; -C 191 ; WX 500 ; N questiondown ; B 36 -216 397 477 ; -C 192 ; WX 611 ; N Agrave ; B -49 0 583 880 ; -C 193 ; WX 611 ; N Aacute ; B -49 0 618 880 ; -C 194 ; WX 611 ; N Acircumflex ; B -49 0 621 863 ; -C 195 ; WX 611 ; N Atilde ; B -49 0 668 847 ; -C 196 ; WX 611 ; N Adieresis ; B -49 0 669 836 ; -C 197 ; WX 611 ; N Aring ; B -49 0 606 840 ; -C 198 ; WX 889 ; N AE ; B -53 0 909 662 ; -C 199 ; WX 667 ; N Ccedilla ; B 67 -181 704 677 ; -C 200 ; WX 611 ; N Egrave ; B -22 0 632 880 ; -C 201 ; WX 611 ; N Eacute ; B -22 0 632 880 ; -C 202 ; WX 611 ; N Ecircumflex ; B -22 0 632 863 ; -C 203 ; WX 611 ; N Edieresis ; B -22 0 632 836 ; -C 204 ; WX 333 ; N Igrave ; B -31 0 410 880 ; -C 205 ; WX 333 ; N Iacute ; B -31 0 410 880 ; -C 206 ; WX 333 ; N Icircumflex ; B -31 0 421 863 ; -C 207 ; WX 333 ; N Idieresis ; B -31 0 446 836 ; -C 208 ; WX 722 ; N Eth ; B -23 0 711 662 ; -C 209 ; WX 667 ; N Ntilde ; B -28 -15 762 847 ; -C 210 ; WX 722 ; N Ograve ; B 60 -15 718 880 ; -C 211 ; WX 722 ; N Oacute ; B 60 -15 718 880 ; -C 212 ; WX 722 ; N Ocircumflex ; B 60 -15 718 863 ; -C 213 ; WX 722 ; N Otilde ; B 60 -15 718 847 ; -C 214 ; WX 722 ; N Odieresis ; B 60 -15 718 836 ; -C 215 ; WX 675 ; N multiply ; B 81 132 481 533 ; -C 216 ; WX 722 ; N Oslash ; B 35 -35 737 689 ; -C 217 ; WX 722 ; N Ugrave ; B 106 -15 814 880 ; -C 218 ; WX 722 ; N Uacute ; B 106 -15 814 880 ; -C 219 ; WX 722 ; N Ucircumflex ; B 106 -15 814 863 ; -C 220 ; WX 722 ; N Udieresis ; B 106 -15 814 836 ; -C 221 ; WX 556 ; N Yacute ; B 90 0 667 880 ; -C 222 ; WX 611 ; N Thorn ; B -24 0 605 662 ; -C 223 ; WX 500 ; N germandbls ; B -161 -216 498 694 ; -C 224 ; WX 500 ; N agrave ; B 23 -12 469 685 ; -C 225 ; WX 500 ; N aacute ; B 23 -12 469 685 ; -C 226 ; WX 500 ; N acircumflex ; B 23 -12 469 677 ; -C 227 ; WX 500 ; N atilde ; B 23 -12 493 667 ; -C 228 ; WX 500 ; N adieresis ; B 23 -12 494 654 ; -C 229 ; WX 500 ; N aring ; B 23 -12 469 694 ; -C 230 ; WX 667 ; N ae ; B 22 -12 652 442 ; -C 231 ; WX 444 ; N ccedilla ; B 29 -181 428 442 ; -C 232 ; WX 444 ; N egrave ; B 31 -12 430 685 ; -C 233 ; WX 444 ; N eacute ; B 31 -12 430 685 ; -C 234 ; WX 444 ; N ecircumflex ; B 31 -12 443 677 ; -C 235 ; WX 444 ; N edieresis ; B 31 -12 468 654 ; -C 236 ; WX 278 ; N igrave ; B 43 -12 276 685 ; -C 237 ; WX 278 ; N iacute ; B 43 -12 334 685 ; -C 238 ; WX 278 ; N icircumflex ; B 43 -12 342 677 ; -C 239 ; WX 278 ; N idieresis ; B 43 -12 367 654 ; -C 240 ; WX 500 ; N eth ; B 27 -12 481 692 ; -C 241 ; WX 500 ; N ntilde ; B 19 -12 493 667 ; -C 242 ; WX 500 ; N ograve ; B 29 -12 462 685 ; -C 243 ; WX 500 ; N oacute ; B 29 -12 462 685 ; -C 244 ; WX 500 ; N ocircumflex ; B 29 -12 469 677 ; -C 245 ; WX 500 ; N otilde ; B 29 -12 493 667 ; -C 246 ; WX 500 ; N odieresis ; B 29 -12 494 654 ; -C 247 ; WX 549 ; N divide ; B 11 136 538 525 ; -C 248 ; WX 500 ; N oslash ; B 2 -36 489 471 ; -C 249 ; WX 500 ; N ugrave ; B 29 -12 471 685 ; -C 250 ; WX 500 ; N uacute ; B 29 -12 471 685 ; -C 251 ; WX 500 ; N ucircumflex ; B 29 -12 471 677 ; -C 252 ; WX 500 ; N udieresis ; B 29 -12 482 654 ; -C 253 ; WX 444 ; N yacute ; B -78 -216 440 685 ; -C 254 ; WX 500 ; N thorn ; B -110 -216 473 694 ; -C 255 ; WX 444 ; N ydieresis ; B -78 -216 450 654 ; -C -1 ; WX 0 ; N .null ; B 75 -16 317 677 ; -C -1 ; WX 250 ; N nonmarkingreturn ; B 75 -16 317 677 ; -C -1 ; WX 549 ; N notequal ; B 12 -132 537 660 ; -C -1 ; WX 713 ; N infinity ; B 24 52 685 461 ; -C -1 ; WX 549 ; N lessequal ; B 12 -80 537 605 ; -C -1 ; WX 549 ; N greaterequal ; B 12 -80 537 605 ; -C -1 ; WX 494 ; N partialdiff ; B 29 -15 484 694 ; -C -1 ; WX 713 ; N summation ; B 21 -216 693 693 ; -C -1 ; WX 823 ; N product ; B 22 -216 801 693 ; -C -1 ; WX 549 ; N pi1 ; B 35 -12 520 430 ; -C -1 ; WX 274 ; N integral ; B -1 -107 272 910 ; -C -1 ; WX 768 ; N Ohm ; B 35 0 734 675 ; -C -1 ; WX 549 ; N radical ; B 42 -38 550 913 ; -C -1 ; WX 549 ; N approxequal ; B 15 133 535 508 ; -C -1 ; WX 612 ; N increment ; B 14 0 600 677 ; -C -1 ; WX 494 ; N lozenge ; B 23 0 472 694 ; -C -1 ; WX 167 ; N fraction ; B -167 -27 333 676 ; -C -1 ; WX 500 ; N fi ; B -189 -216 500 694 ; -C -1 ; WX 500 ; N fl ; B -189 -216 550 694 ; -C -1 ; WX 278 ; N dotlessi ; B 43 -12 230 442 ; -C -1 ; WX 333 ; N macron ; B 120 596 431 658 ; -C -1 ; WX 333 ; N breve ; B 144 543 421 687 ; -C -1 ; WX 333 ; N dotaccent ; B 219 550 324 654 ; -C -1 ; WX 333 ; N ring ; B 186 509 371 694 ; -C -1 ; WX 333 ; N hungarumlaut ; B 148 517 451 685 ; -C -1 ; WX 333 ; N ogonek ; B 38 -185 262 0 ; -C -1 ; WX 333 ; N caron ; B 165 523 427 677 ; -C -1 ; WX 556 ; N Lslash ; B -28 0 523 662 ; -C -1 ; WX 278 ; N lslash ; B 25 -12 300 694 ; -C -1 ; WX 675 ; N minus ; B 18 313 544 353 ; -C -1 ; WX 500 ; N franc ; B -24 0 554 662 ; -C -1 ; WX 722 ; N Gbreve ; B 69 -16 725 863 ; -C -1 ; WX 500 ; N gbreve ; B -27 -216 521 687 ; -C -1 ; WX 333 ; N Idot ; B -31 0 410 840 ; -C -1 ; WX 500 ; N Scedilla ; B 7 -181 542 677 ; -C -1 ; WX 389 ; N scedilla ; B -9 -181 363 442 ; -C -1 ; WX 667 ; N Cacute ; B 67 -15 704 880 ; -C -1 ; WX 444 ; N cacute ; B 29 -12 429 685 ; -C -1 ; WX 667 ; N Ccaron ; B 67 -15 704 863 ; -C -1 ; WX 444 ; N ccaron ; B 29 -12 513 677 ; -C -1 ; WX 500 ; N dmacron ; B 19 -12 587 694 ; -C -1 ; WX 333 ; N middot ; B 241 291 344 393 ; -C -1 ; WX 611 ; N Abreve ; B -49 0 689 864 ; -C -1 ; WX 500 ; N abreve ; B 23 -12 480 687 ; -C -1 ; WX 611 ; N Aogonek ; B -49 -186 551 677 ; -C -1 ; WX 500 ; N aogonek ; B 23 -185 489 442 ; -C -1 ; WX 722 ; N Dcaron ; B -30 0 705 863 ; -C -1 ; WX 608 ; N dcaron ; B 19 -12 696 694 ; -C -1 ; WX 722 ; N Dslash ; B -23 0 711 662 ; -C -1 ; WX 611 ; N Eogonek ; B -22 -185 632 662 ; -C -1 ; WX 444 ; N eogonek ; B 31 -185 430 442 ; -C -1 ; WX 611 ; N Ecaron ; B -22 0 632 863 ; -C -1 ; WX 444 ; N ecaron ; B 31 -12 508 677 ; -C -1 ; WX 556 ; N Lacute ; B -32 0 523 880 ; -C -1 ; WX 278 ; N lacute ; B 39 -12 368 880 ; -C -1 ; WX 556 ; N Lcaron ; B -32 0 601 677 ; -C -1 ; WX 364 ; N lcaron ; B 38 -12 452 694 ; -C -1 ; WX 556 ; N Ldot ; B -32 0 523 662 ; -C -1 ; WX 323 ; N ldot ; B 39 -12 379 694 ; -C -1 ; WX 667 ; N Nacute ; B -28 -15 762 880 ; -C -1 ; WX 500 ; N nacute ; B 19 -12 459 685 ; -C -1 ; WX 667 ; N Ncaron ; B -28 -15 762 863 ; -C -1 ; WX 500 ; N ncaron ; B 19 -12 459 677 ; -C -1 ; WX 722 ; N Odblacute ; B 60 -15 720 880 ; -C -1 ; WX 500 ; N odblacute ; B 29 -12 542 685 ; -C -1 ; WX 611 ; N Racute ; B -23 0 579 880 ; -C -1 ; WX 389 ; N racute ; B 19 0 403 685 ; -C -1 ; WX 611 ; N Rcaron ; B -23 0 579 863 ; -C -1 ; WX 389 ; N rcaron ; B 19 0 429 677 ; -C -1 ; WX 500 ; N Sacute ; B 7 -15 542 880 ; -C -1 ; WX 389 ; N sacute ; B -9 -12 377 685 ; -C -1 ; WX 556 ; N Tcedilla ; B 70 -217 649 662 ; -C -1 ; WX 278 ; N tcedilla ; B -17 -217 300 563 ; -C -1 ; WX 556 ; N Tcaron ; B 70 0 649 863 ; -C -1 ; WX 364 ; N tcaron ; B 42 -12 452 694 ; -C -1 ; WX 722 ; N Uring ; B 106 -15 814 883 ; -C -1 ; WX 500 ; N uring ; B 29 -12 471 694 ; -C -1 ; WX 722 ; N Udblacute ; B 106 -15 814 880 ; -C -1 ; WX 500 ; N udblacute ; B 29 -12 522 685 ; -C -1 ; WX 556 ; N Zacute ; B -2 0 611 880 ; -C -1 ; WX 389 ; N zacute ; B -30 0 392 685 ; -C -1 ; WX 556 ; N Zdot ; B -2 0 611 835 ; -C -1 ; WX 389 ; N zdot ; B -30 0 392 654 ; -C -1 ; WX 569 ; N Gamma ; B -36 0 664 662 ; -C -1 ; WX 722 ; N Theta ; B 61 -15 719 677 ; -C -1 ; WX 761 ; N Phi ; B 77 0 748 662 ; -C -1 ; WX 525 ; N alpha ; B 29 -12 501 442 ; -C -1 ; WX 465 ; N delta ; B 23 -12 462 694 ; -C -1 ; WX 394 ; N epsilon ; B 11 -12 391 442 ; -C -1 ; WX 493 ; N sigma ; B 26 -12 527 430 ; -C -1 ; WX 358 ; N tau ; B 25 -12 390 430 ; -C -1 ; WX 553 ; N phi ; B 36 -214 513 442 ; -C -1 ; WX 500 ; N underscoredbl ; B -8 -216 509 -98 ; -C -1 ; WX 573 ; N exclamdbl ; B 75 -16 557 677 ; -C -1 ; WX 315 ; N nsuperior ; B 10 271 292 545 ; -C -1 ; WX 990 ; N peseta ; B 23 -12 979 662 ; -C -1 ; WX 1000 ; N arrowleft ; B 39 77 961 428 ; -C -1 ; WX 500 ; N arrowup ; B 75 -209 426 654 ; -C -1 ; WX 1000 ; N arrowright ; B 39 77 961 428 ; -C -1 ; WX 500 ; N arrowdown ; B 75 -209 426 654 ; -C -1 ; WX 1000 ; N arrowboth ; B 39 77 961 429 ; -C -1 ; WX 500 ; N arrowupdn ; B 74 -208 425 714 ; -C -1 ; WX 500 ; N arrowupdnbse ; B 74 -303 425 714 ; -C -1 ; WX 979 ; N orthogonal ; B 177 0 802 625 ; -C -1 ; WX 722 ; N intersection ; B 94 0 625 676 ; -C -1 ; WX 675 ; N equivalence ; B 19 152 545 511 ; -C -1 ; WX 600 ; N house ; B 75 0 525 563 ; -C -1 ; WX 675 ; N revlogicalnot ; B 19 230 546 429 ; -C -1 ; WX 604 ; N integraltp ; B 267 -251 477 848 ; -C -1 ; WX 604 ; N integralbt ; B 127 -251 337 848 ; -C -1 ; WX 708 ; N SF100000 ; B -11 261 719 346 ; -C -1 ; WX 616 ; N SF110000 ; B 219 -303 304 910 ; -C -1 ; WX 708 ; N SF010000 ; B 312 -303 720 346 ; -C -1 ; WX 708 ; N SF030000 ; B -11 -303 396 346 ; -C -1 ; WX 708 ; N SF020000 ; B 312 261 720 910 ; -C -1 ; WX 708 ; N SF040000 ; B -11 261 396 910 ; -C -1 ; WX 708 ; N SF080000 ; B 312 -303 720 910 ; -C -1 ; WX 708 ; N SF090000 ; B -11 -303 396 910 ; -C -1 ; WX 708 ; N SF060000 ; B -11 -303 719 346 ; -C -1 ; WX 708 ; N SF070000 ; B -11 261 719 910 ; -C -1 ; WX 708 ; N SF050000 ; B -11 -303 719 910 ; -C -1 ; WX 708 ; N SF430000 ; B 0 168 730 439 ; -C -1 ; WX 708 ; N SF240000 ; B 0 -303 271 910 ; -C -1 ; WX 708 ; N SF510000 ; B 0 -303 408 439 ; -C -1 ; WX 708 ; N SF520000 ; B 0 -303 501 346 ; -C -1 ; WX 708 ; N SF390000 ; B 0 -303 500 439 ; -C -1 ; WX 708 ; N SF220000 ; B 0 -303 408 439 ; -C -1 ; WX 708 ; N SF210000 ; B 0 -303 500 346 ; -C -1 ; WX 708 ; N SF250000 ; B 0 -303 500 439 ; -C -1 ; WX 708 ; N SF500000 ; B 0 168 408 910 ; -C -1 ; WX 708 ; N SF490000 ; B 0 261 501 910 ; -C -1 ; WX 708 ; N SF380000 ; B 0 168 500 910 ; -C -1 ; WX 708 ; N SF280000 ; B 0 168 408 910 ; -C -1 ; WX 708 ; N SF270000 ; B 0 261 500 910 ; -C -1 ; WX 708 ; N SF260000 ; B 0 168 500 910 ; -C -1 ; WX 708 ; N SF360000 ; B 0 -303 408 910 ; -C -1 ; WX 708 ; N SF370000 ; B 0 -303 501 910 ; -C -1 ; WX 708 ; N SF420000 ; B 0 -303 501 910 ; -C -1 ; WX 708 ; N SF190000 ; B 0 -303 408 910 ; -C -1 ; WX 708 ; N SF200000 ; B 0 -303 500 910 ; -C -1 ; WX 708 ; N SF230000 ; B 0 -303 500 910 ; -C -1 ; WX 708 ; N SF470000 ; B 0 -303 730 439 ; -C -1 ; WX 708 ; N SF480000 ; B 0 -303 730 346 ; -C -1 ; WX 708 ; N SF410000 ; B 0 -303 730 439 ; -C -1 ; WX 708 ; N SF450000 ; B 0 168 730 910 ; -C -1 ; WX 708 ; N SF460000 ; B 0 261 730 910 ; -C -1 ; WX 708 ; N SF400000 ; B 0 168 730 910 ; -C -1 ; WX 708 ; N SF540000 ; B 0 -303 730 910 ; -C -1 ; WX 708 ; N SF530000 ; B 0 -303 730 910 ; -C -1 ; WX 708 ; N SF440000 ; B 0 -303 730 910 ; -C -1 ; WX 708 ; N upblock ; B 0 303 730 910 ; -C -1 ; WX 708 ; N dnblock ; B 0 -303 730 303 ; -C -1 ; WX 708 ; N block ; B 0 -303 730 910 ; -C -1 ; WX 708 ; N lfblock ; B 0 -303 365 910 ; -C -1 ; WX 708 ; N rtblock ; B 0 -303 365 910 ; -C -1 ; WX 708 ; N ltshade ; B 50 -246 719 910 ; -C -1 ; WX 708 ; N shade ; B -11 -246 719 910 ; -C -1 ; WX 729 ; N dkshade ; B 0 -307 729 910 ; -C -1 ; WX 604 ; N filledbox ; B 0 0 461 461 ; -C -1 ; WX 1000 ; N filledrect ; B 0 155 1000 343 ; -C -1 ; WX 990 ; N triagup ; B 0 0 693 693 ; -C -1 ; WX 990 ; N triagrt ; B 0 -15 708 692 ; -C -1 ; WX 990 ; N triagdn ; B 0 -15 693 678 ; -C -1 ; WX 990 ; N triaglf ; B 141 -15 849 692 ; -C -1 ; WX 604 ; N circle ; B 0 67 430 497 ; -C -1 ; WX 604 ; N invbullet ; B 0 0 479 479 ; -C -1 ; WX 604 ; N invcircle ; B 0 0 564 564 ; -C -1 ; WX 1021 ; N smileface ; B 199 -58 822 564 ; -C -1 ; WX 1052 ; N invsmileface ; B 215 -58 838 564 ; -C -1 ; WX 917 ; N sun ; B 0 -109 901 792 ; -C -1 ; WX 750 ; N female ; B 119 -214 630 736 ; -C -1 ; WX 750 ; N male ; B 54 -128 691 791 ; -C -1 ; WX 531 ; N spade ; B 0 0 475 601 ; -C -1 ; WX 656 ; N club ; B 27 0 629 601 ; -C -1 ; WX 594 ; N heart ; B 0 -12 532 601 ; -C -1 ; WX 510 ; N diamond ; B 0 -12 448 601 ; -C -1 ; WX 500 ; N musicalnote ; B 18 -18 482 666 ; -C -1 ; WX 750 ; N musicalnotedbl ; B 42 -63 649 742 ; -C -1 ; WX 750 ; N IJ ; B -31 -15 828 662 ; -C -1 ; WX 500 ; N ij ; B 37 -216 501 636 ; -C -1 ; WX 577 ; N napostrophe ; B 69 -12 538 677 ; -C -1 ; WX 219 ; N minute ; B 131 392 261 677 ; -C -1 ; WX 417 ; N second ; B 144 392 452 677 ; -C -1 ; WX 833 ; N afii61248 ; B 53 -26 804 677 ; -C -1 ; WX 417 ; N afii61289 ; B 15 -12 432 677 ; -C -1 ; WX 604 ; N H22073 ; B 71 0 532 461 ; -C -1 ; WX 354 ; N H18543 ; B 64 217 290 444 ; -C -1 ; WX 354 ; N H18551 ; B 64 217 290 444 ; -C -1 ; WX 604 ; N H18533 ; B 87 67 517 497 ; -C -1 ; WX 354 ; N openbullet ; B 55 208 300 453 ; -C -1 ; WX 611 ; N Amacron ; B -49 0 673 799 ; -C -1 ; WX 500 ; N amacron ; B 23 -12 502 614 ; -C -1 ; WX 667 ; N Ccircumflex ; B 67 -15 704 863 ; -C -1 ; WX 444 ; N ccircumflex ; B 29 -12 441 677 ; -C -1 ; WX 667 ; N Cdot ; B 67 -15 704 840 ; -C -1 ; WX 444 ; N cdot ; B 29 -12 428 608 ; -C -1 ; WX 611 ; N Emacron ; B -22 0 632 799 ; -C -1 ; WX 444 ; N emacron ; B 31 -12 473 614 ; -C -1 ; WX 611 ; N Ebreve ; B -22 0 632 873 ; -C -1 ; WX 444 ; N ebreve ; B 31 -12 491 687 ; -C -1 ; WX 611 ; N Edot ; B -22 0 632 840 ; -C -1 ; WX 444 ; N edot ; B 31 -12 430 654 ; -C -1 ; WX 722 ; N Gcircumflex ; B 69 -16 725 863 ; -C -1 ; WX 500 ; N gcircumflex ; B -27 -216 521 677 ; -C -1 ; WX 722 ; N Gdot ; B 69 -16 725 840 ; -C -1 ; WX 500 ; N gdot ; B -27 -216 521 654 ; -C -1 ; WX 722 ; N Gcedilla ; B 69 -181 725 677 ; -C -1 ; WX 500 ; N gcedilla ; B -27 -216 521 720 ; -C -1 ; WX 722 ; N Hcircumflex ; B -26 0 811 863 ; -C -1 ; WX 500 ; N hcircumflex ; B 20 -12 523 863 ; -C -1 ; WX 722 ; N Hbar ; B -26 0 811 662 ; -C -1 ; WX 500 ; N hbar ; B 20 -12 459 694 ; -C -1 ; WX 333 ; N Itilde ; B -31 0 468 853 ; -C -1 ; WX 278 ; N itilde ; B 43 -12 386 667 ; -C -1 ; WX 333 ; N Imacron ; B -31 0 465 799 ; -C -1 ; WX 278 ; N imacron ; B 43 -12 371 614 ; -C -1 ; WX 333 ; N Ibreve ; B -31 0 484 873 ; -C -1 ; WX 278 ; N ibreve ; B 43 -12 386 687 ; -C -1 ; WX 333 ; N Iogonek ; B -31 -185 410 662 ; -C -1 ; WX 278 ; N iogonek ; B 25 -185 272 636 ; -C -1 ; WX 444 ; N Jcircumflex ; B -34 -15 566 863 ; -C -1 ; WX 278 ; N jcircumflex ; B -172 -216 333 677 ; -C -1 ; WX 667 ; N Kcedilla ; B -27 -181 729 662 ; -C -1 ; WX 444 ; N kcedilla ; B 12 -181 490 694 ; -C -1 ; WX 444 ; N kgreenlandic ; B 10 -12 488 442 ; -C -1 ; WX 556 ; N Lcedilla ; B -32 -181 523 662 ; -C -1 ; WX 278 ; N lcedilla ; B -41 -181 297 694 ; -C -1 ; WX 667 ; N Ncedilla ; B -28 -181 762 662 ; -C -1 ; WX 500 ; N ncedilla ; B 19 -181 459 442 ; -C -1 ; WX 696 ; N Eng ; B -31 -15 690 677 ; -C -1 ; WX 482 ; N eng ; B 19 -216 445 442 ; -C -1 ; WX 722 ; N Omacron ; B 60 -15 718 799 ; -C -1 ; WX 500 ; N omacron ; B 29 -12 499 614 ; -C -1 ; WX 722 ; N Obreve ; B 60 -15 718 873 ; -C -1 ; WX 500 ; N obreve ; B 29 -12 510 687 ; -C -1 ; WX 611 ; N Rcedilla ; B -23 -181 579 662 ; -C -1 ; WX 389 ; N rcedilla ; B 11 -181 403 442 ; -C -1 ; WX 500 ; N Scircumflex ; B 7 -15 542 863 ; -C -1 ; WX 389 ; N scircumflex ; B -9 -12 401 677 ; -C -1 ; WX 556 ; N Tbar ; B 72 0 651 662 ; -C -1 ; WX 278 ; N tbar ; B 24 -12 298 563 ; -C -1 ; WX 722 ; N Utilde ; B 106 -15 814 853 ; -C -1 ; WX 500 ; N utilde ; B 29 -12 492 667 ; -C -1 ; WX 722 ; N Umacron ; B 106 -15 814 799 ; -C -1 ; WX 500 ; N umacron ; B 29 -12 491 614 ; -C -1 ; WX 722 ; N Ubreve ; B 106 -15 814 873 ; -C -1 ; WX 500 ; N ubreve ; B 29 -12 497 687 ; -C -1 ; WX 722 ; N Uogonek ; B 106 -185 814 662 ; -C -1 ; WX 500 ; N uogonek ; B 29 -185 528 442 ; -C -1 ; WX 833 ; N Wcircumflex ; B 122 -15 944 863 ; -C -1 ; WX 667 ; N wcircumflex ; B 17 -12 662 677 ; -C -1 ; WX 556 ; N Ycircumflex ; B 90 0 667 863 ; -C -1 ; WX 444 ; N ycircumflex ; B -78 -216 440 677 ; -C -1 ; WX 278 ; N longs ; B -173 -216 472 695 ; -C -1 ; WX 611 ; N Aringacute ; B -49 0 681 1023 ; -C -1 ; WX 500 ; N aringacute ; B 23 -12 517 896 ; -C -1 ; WX 889 ; N AEacute ; B -53 0 909 871 ; -C -1 ; WX 667 ; N aeacute ; B 22 -12 652 685 ; -C -1 ; WX 722 ; N Oslashacute ; B 35 -35 737 871 ; -C -1 ; WX 500 ; N oslashacute ; B 2 -36 489 685 ; -C -1 ; WX 333 ; N anoteleia ; B 163 343 262 442 ; -C -1 ; WX 833 ; N Wgrave ; B 122 -15 944 871 ; -C -1 ; WX 667 ; N wgrave ; B 17 -12 662 685 ; -C -1 ; WX 833 ; N Wacute ; B 122 -15 944 871 ; -C -1 ; WX 667 ; N wacute ; B 17 -12 662 685 ; -C -1 ; WX 833 ; N Wdieresis ; B 122 -15 944 840 ; -C -1 ; WX 667 ; N wdieresis ; B 17 -12 662 654 ; -C -1 ; WX 556 ; N Ygrave ; B 90 0 667 871 ; -C -1 ; WX 444 ; N ygrave ; B -78 -216 440 685 ; -C -1 ; WX 333 ; N quotereversed ; B 217 458 332 677 ; -C -1 ; WX 333 ; N radicalex ; B 89 569 459 631 ; -C -1 ; WX 500 ; N afii08941 ; B 24 -15 524 676 ; -C -1 ; WX 600 ; N estimated ; B 44 -17 561 535 ; -C -1 ; WX 750 ; N oneeighth ; B 79 -27 700 676 ; -C -1 ; WX 750 ; N threeeighths ; B 63 -27 700 676 ; -C -1 ; WX 750 ; N fiveeighths ; B 64 -27 700 676 ; -C -1 ; WX 750 ; N seveneighths ; B 113 -27 700 676 ; -C -1 ; WX 333 ; N commaaccent ; B 37 -217 181 -38 ; -C -1 ; WX 333 ; N undercommaaccent ; B -3 -181 180 -22 ; -C -1 ; WX 333 ; N tonos ; B 200 517 360 685 ; -C -1 ; WX 333 ; N dieresistonos ; B 88 517 442 685 ; -C -1 ; WX 611 ; N Alphatonos ; B -49 0 547 685 ; -C -1 ; WX 679 ; N Epsilontonos ; B 45 0 700 685 ; -C -1 ; WX 792 ; N Etatonos ; B 43 0 881 685 ; -C -1 ; WX 402 ; N Iotatonos ; B 38 0 479 685 ; -C -1 ; WX 722 ; N Omicrontonos ; B 60 -15 718 685 ; -C -1 ; WX 660 ; N Upsilontonos ; B 46 0 771 685 ; -C -1 ; WX 726 ; N Omegatonos ; B 16 0 727 685 ; -C -1 ; WX 278 ; N iotadieresistonos ; B 41 -12 395 685 ; -C -1 ; WX 611 ; N Alpha ; B -49 0 547 677 ; -C -1 ; WX 611 ; N Beta ; B -23 0 590 662 ; -C -1 ; WX 587 ; N Delta ; B -43 0 511 677 ; -C -1 ; WX 611 ; N Epsilon ; B -22 0 632 662 ; -C -1 ; WX 556 ; N Zeta ; B -2 0 611 662 ; -C -1 ; WX 722 ; N Eta ; B -26 0 811 662 ; -C -1 ; WX 333 ; N Iota ; B -31 0 410 662 ; -C -1 ; WX 667 ; N Kappa ; B -27 0 729 662 ; -C -1 ; WX 604 ; N Lambda ; B -55 0 543 677 ; -C -1 ; WX 833 ; N Mu ; B -33 0 924 662 ; -C -1 ; WX 667 ; N Nu ; B -28 -15 762 662 ; -C -1 ; WX 639 ; N Xi ; B -7 0 688 662 ; -C -1 ; WX 722 ; N Omicron ; B 60 -15 718 677 ; -C -1 ; WX 722 ; N Pi ; B -29 0 806 662 ; -C -1 ; WX 611 ; N Rho ; B -24 0 621 662 ; -C -1 ; WX 594 ; N Sigma ; B -35 0 655 662 ; -C -1 ; WX 556 ; N Tau ; B 70 0 649 662 ; -C -1 ; WX 556 ; N Upsilon ; B 90 0 667 662 ; -C -1 ; WX 611 ; N Chi ; B -67 0 741 662 ; -C -1 ; WX 703 ; N Psi ; B 134 0 808 670 ; -C -1 ; WX 723 ; N Omega ; B 13 0 725 677 ; -C -1 ; WX 333 ; N Iotadieresis ; B -31 0 446 836 ; -C -1 ; WX 556 ; N Upsilondieresis ; B 90 0 667 836 ; -C -1 ; WX 525 ; N alphatonos ; B 29 -12 501 685 ; -C -1 ; WX 394 ; N epsilontonos ; B 11 -12 391 685 ; -C -1 ; WX 496 ; N etatonos ; B 28 -214 454 685 ; -C -1 ; WX 278 ; N iotatonos ; B 43 -12 334 685 ; -C -1 ; WX 459 ; N upsilondieresistonos ; B 26 -12 482 685 ; -C -1 ; WX 498 ; N beta ; B -67 -214 508 694 ; -C -1 ; WX 394 ; N gamma ; B 24 -216 386 442 ; -C -1 ; WX 405 ; N zeta ; B 23 -160 530 689 ; -C -1 ; WX 496 ; N eta ; B 28 -214 454 442 ; -C -1 ; WX 491 ; N theta ; B 44 -12 507 694 ; -C -1 ; WX 278 ; N iota ; B 43 -12 230 442 ; -C -1 ; WX 480 ; N kappa ; B 15 -6 494 442 ; -C -1 ; WX 433 ; N lambda ; B -31 -6 408 694 ; -C -1 ; WX 502 ; N mu ; B -53 -216 475 430 ; -C -1 ; WX 444 ; N nu ; B 21 -12 442 442 ; -C -1 ; WX 428 ; N xi ; B 18 -160 490 689 ; -C -1 ; WX 500 ; N omicron ; B 29 -12 462 442 ; -C -1 ; WX 480 ; N rho ; B -71 -214 438 442 ; -C -1 ; WX 406 ; N sigma1 ; B 31 -161 426 442 ; -C -1 ; WX 459 ; N upsilon ; B 26 -12 424 442 ; -C -1 ; WX 440 ; N chi ; B -94 -216 469 436 ; -C -1 ; WX 621 ; N psi ; B 70 -214 647 442 ; -C -1 ; WX 706 ; N omega ; B 35 -12 661 442 ; -C -1 ; WX 278 ; N iotadieresis ; B 43 -12 367 654 ; -C -1 ; WX 459 ; N upsilondieresis ; B 26 -12 424 654 ; -C -1 ; WX 500 ; N omicrontonos ; B 29 -12 462 685 ; -C -1 ; WX 459 ; N upsilontonos ; B 26 -12 424 685 ; -C -1 ; WX 698 ; N omegatonos ; B 35 -12 661 685 ; -C -1 ; WX 611 ; N afii10023 ; B -22 0 632 850 ; -C -1 ; WX 797 ; N afii10051 ; B 94 -8 761 662 ; -C -1 ; WX 669 ; N afii10053 ; B 69 -15 706 677 ; -C -1 ; WX 500 ; N afii10054 ; B 7 -15 542 677 ; -C -1 ; WX 333 ; N afii10055 ; B -31 0 410 662 ; -C -1 ; WX 333 ; N afii10056 ; B -31 0 446 836 ; -C -1 ; WX 444 ; N afii10057 ; B -34 -15 547 662 ; -C -1 ; WX 927 ; N afii10058 ; B -34 -8 877 662 ; -C -1 ; WX 921 ; N afii10059 ; B -30 0 872 662 ; -C -1 ; WX 799 ; N afii10060 ; B 97 0 729 662 ; -C -1 ; WX 673 ; N afii10062 ; B 110 -15 776 849 ; -C -1 ; WX 611 ; N afii10017 ; B -49 0 547 677 ; -C -1 ; WX 590 ; N afii10018 ; B -28 0 628 662 ; -C -1 ; WX 611 ; N afii10019 ; B -23 0 590 662 ; -C -1 ; WX 569 ; N afii10020 ; B -36 0 664 662 ; -C -1 ; WX 636 ; N afii10021 ; B -103 -193 723 662 ; -C -1 ; WX 611 ; N afii10022 ; B -22 0 632 662 ; -C -1 ; WX 916 ; N afii10024 ; B -55 0 975 670 ; -C -1 ; WX 495 ; N afii10025 ; B -1 -15 492 677 ; -C -1 ; WX 722 ; N afii10026 ; B -25 0 812 662 ; -C -1 ; WX 722 ; N afii10027 ; B -25 0 812 849 ; -C -1 ; WX 664 ; N afii10028 ; B -28 0 723 670 ; -C -1 ; WX 677 ; N afii10029 ; B -35 -8 761 662 ; -C -1 ; WX 833 ; N afii10030 ; B -33 0 924 662 ; -C -1 ; WX 722 ; N afii10031 ; B -26 0 811 662 ; -C -1 ; WX 722 ; N afii10032 ; B 60 -15 718 677 ; -C -1 ; WX 722 ; N afii10033 ; B -29 0 806 662 ; -C -1 ; WX 611 ; N afii10034 ; B -24 0 621 662 ; -C -1 ; WX 667 ; N afii10035 ; B 67 -15 704 677 ; -C -1 ; WX 556 ; N afii10036 ; B 70 0 649 662 ; -C -1 ; WX 673 ; N afii10037 ; B 110 -15 776 662 ; -C -1 ; WX 804 ; N afii10038 ; B 73 0 792 662 ; -C -1 ; WX 611 ; N afii10039 ; B -67 0 741 662 ; -C -1 ; WX 722 ; N afii10040 ; B -25 -196 813 662 ; -C -1 ; WX 689 ; N afii10041 ; B 113 0 770 662 ; -C -1 ; WX 1043 ; N afii10042 ; B -14 0 1120 662 ; -C -1 ; WX 1043 ; N afii10043 ; B -14 -196 1120 662 ; -C -1 ; WX 676 ; N afii10044 ; B 58 0 626 662 ; -C -1 ; WX 872 ; N afii10045 ; B -28 0 957 662 ; -C -1 ; WX 590 ; N afii10046 ; B -28 0 540 662 ; -C -1 ; WX 655 ; N afii10047 ; B 15 -15 642 677 ; -C -1 ; WX 1032 ; N afii10048 ; B -32 -15 1029 677 ; -C -1 ; WX 657 ; N afii10049 ; B -54 0 746 662 ; -C -1 ; WX 500 ; N afii10065 ; B 23 -12 469 442 ; -C -1 ; WX 503 ; N afii10066 ; B 36 -12 519 694 ; -C -1 ; WX 434 ; N afii10067 ; B 31 -12 420 442 ; -C -1 ; WX 390 ; N afii10068 ; B 1 -12 384 442 ; -C -1 ; WX 506 ; N afii10069 ; B 30 -12 474 694 ; -C -1 ; WX 444 ; N afii10070 ; B 31 -12 430 442 ; -C -1 ; WX 930 ; N afii10072 ; B 0 -12 926 442 ; -C -1 ; WX 390 ; N afii10073 ; B -24 -12 371 442 ; -C -1 ; WX 500 ; N afii10074 ; B 29 -12 471 442 ; -C -1 ; WX 500 ; N afii10075 ; B 29 -12 483 674 ; -C -1 ; WX 468 ; N afii10076 ; B 18 0 465 442 ; -C -1 ; WX 436 ; N afii10077 ; B -44 -12 405 430 ; -C -1 ; WX 638 ; N afii10078 ; B -45 -12 606 442 ; -C -1 ; WX 496 ; N afii10079 ; B 20 -12 462 442 ; -C -1 ; WX 500 ; N afii10080 ; B 29 -12 462 442 ; -C -1 ; WX 500 ; N afii10081 ; B 19 -12 459 442 ; -C -1 ; WX 500 ; N afii10082 ; B -110 -214 473 442 ; -C -1 ; WX 444 ; N afii10083 ; B 29 -12 428 442 ; -C -1 ; WX 722 ; N afii10084 ; B 17 -12 679 442 ; -C -1 ; WX 444 ; N afii10085 ; B -78 -216 440 442 ; -C -1 ; WX 710 ; N afii10086 ; B 29 -214 673 694 ; -C -1 ; WX 444 ; N afii10087 ; B -33 -12 439 442 ; -C -1 ; WX 500 ; N afii10088 ; B 29 -196 471 442 ; -C -1 ; WX 477 ; N afii10089 ; B 42 -12 444 442 ; -C -1 ; WX 755 ; N afii10090 ; B 31 -12 725 442 ; -C -1 ; WX 755 ; N afii10091 ; B 31 -196 725 442 ; -C -1 ; WX 519 ; N afii10092 ; B 29 -12 471 430 ; -C -1 ; WX 677 ; N afii10093 ; B 50 -12 627 442 ; -C -1 ; WX 455 ; N afii10094 ; B 50 -12 408 442 ; -C -1 ; WX 441 ; N afii10095 ; B 7 -12 398 442 ; -C -1 ; WX 705 ; N afii10096 ; B 21 -12 668 442 ; -C -1 ; WX 465 ; N afii10097 ; B -61 -12 434 442 ; -C -1 ; WX 444 ; N afii10071 ; B 31 -12 468 654 ; -C -1 ; WX 479 ; N afii10099 ; B 20 -216 441 694 ; -C -1 ; WX 377 ; N afii10100 ; B -42 0 405 685 ; -C -1 ; WX 436 ; N afii10101 ; B 26 -12 450 442 ; -C -1 ; WX 389 ; N afii10102 ; B -9 -12 363 442 ; -C -1 ; WX 278 ; N afii10103 ; B 43 -12 272 636 ; -C -1 ; WX 278 ; N afii10104 ; B 43 -12 367 654 ; -C -1 ; WX 278 ; N afii10105 ; B -170 -216 280 635 ; -C -1 ; WX 679 ; N afii10106 ; B -44 -12 631 442 ; -C -1 ; WX 712 ; N afii10107 ; B 21 -12 665 442 ; -C -1 ; WX 500 ; N afii10108 ; B 20 -12 459 694 ; -C -1 ; WX 444 ; N afii10110 ; B -80 -216 444 674 ; -C -1 ; WX 500 ; N afii10193 ; B 18 -192 471 442 ; -C -1 ; WX 440 ; N afii10050 ; B -30 0 589 803 ; -C -1 ; WX 315 ; N afii10098 ; B 42 -12 382 519 ; -C -1 ; WX 1000 ; N afii00208 ; B 32 224 969 294 ; -C -1 ; WX 943 ; N afii61352 ; B -43 -15 929 674 ; -C -1 ; WX 501 ; N pi ; B 24 -12 532 430 ; -C -1 ; WX 333 ; N sheva ; B 26 -265 107 -72 ; -C -1 ; WX 333 ; N hatafsegol ; B -86 -265 219 -72 ; -C -1 ; WX 333 ; N hatafpatah ; B -76 -265 208 -72 ; -C -1 ; WX 333 ; N hatafqamats ; B -91 -265 224 -72 ; -C -1 ; WX 333 ; N hiriq ; B 26 -153 107 -72 ; -C -1 ; WX 333 ; N tsere ; B -30 -153 163 -72 ; -C -1 ; WX 333 ; N segol ; B -30 -265 163 -72 ; -C -1 ; WX 333 ; N patah ; B -30 -130 163 -80 ; -C -1 ; WX 333 ; N qamats ; B -30 -243 163 -80 ; -C -1 ; WX 333 ; N holam ; B 226 587 307 668 ; -C -1 ; WX 333 ; N qubuts ; B -86 -265 219 -72 ; -C -1 ; WX 333 ; N dagesh ; B 126 211 207 292 ; -C -1 ; WX 333 ; N meteg ; B 41 -242 91 -80 ; -C -1 ; WX 371 ; N maqaf ; B 116 415 388 516 ; -C -1 ; WX 333 ; N rafe ; B 170 596 363 646 ; -C -1 ; WX 333 ; N paseq ; B 46 -49 294 564 ; -C -1 ; WX 343 ; N shindot ; B 436 587 517 668 ; -C -1 ; WX 343 ; N sindot ; B 27 587 108 668 ; -C -1 ; WX 333 ; N sofpasuq ; B 60 -9 286 525 ; -C -1 ; WX 478 ; N alef ; B -21 -9 489 554 ; -C -1 ; WX 437 ; N bet ; B -29 0 412 550 ; -C -1 ; WX 321 ; N gimel ; B -63 -13 296 554 ; -C -1 ; WX 417 ; N dalet ; B 92 -12 450 550 ; -C -1 ; WX 476 ; N he ; B -23 -12 496 550 ; -C -1 ; WX 264 ; N vav ; B 93 -12 260 554 ; -C -1 ; WX 254 ; N zayin ; B 20 -11 280 554 ; -C -1 ; WX 471 ; N het ; B -3 -12 491 550 ; -C -1 ; WX 478 ; N tet ; B 43 0 469 554 ; -C -1 ; WX 242 ; N yod ; B 97 239 256 554 ; -C -1 ; WX 438 ; N finalkaf ; B 94 -173 464 550 ; -C -1 ; WX 411 ; N kaf ; B -28 0 388 550 ; -C -1 ; WX 430 ; N lamed ; B 97 -8 432 746 ; -C -1 ; WX 473 ; N finalmem ; B -14 0 456 550 ; -C -1 ; WX 470 ; N mem ; B -17 0 444 554 ; -C -1 ; WX 255 ; N finalnun ; B 36 -173 270 554 ; -C -1 ; WX 279 ; N nun ; B -48 0 273 554 ; -C -1 ; WX 461 ; N samekh ; B 52 -14 437 550 ; -C -1 ; WX 439 ; N ayin ; B -25 -29 467 554 ; -C -1 ; WX 431 ; N finalpe ; B 39 -173 412 550 ; -C -1 ; WX 429 ; N pe ; B -21 0 406 550 ; -C -1 ; WX 445 ; N finaltsadi ; B 96 -173 471 554 ; -C -1 ; WX 449 ; N tsadi ; B -8 0 476 554 ; -C -1 ; WX 444 ; N qof ; B -55 -173 448 550 ; -C -1 ; WX 448 ; N resh ; B 92 -12 430 550 ; -C -1 ; WX 620 ; N shin ; B 95 0 645 554 ; -C -1 ; WX 474 ; N tav ; B -60 -12 459 550 ; -C -1 ; WX 527 ; N doublevav ; B 93 -12 523 554 ; -C -1 ; WX 505 ; N vavyod ; B 97 -12 501 554 ; -C -1 ; WX 483 ; N doubleyod ; B 97 239 498 554 ; -C -1 ; WX 190 ; N geresh ; B 76 304 219 535 ; -C -1 ; WX 368 ; N gershayim ; B 76 304 396 535 ; -C -1 ; WX 787 ; N newsheqelsign ; B 8 0 791 516 ; -C -1 ; WX 264 ; N vavshindot ; B 32 -12 260 668 ; -C -1 ; WX 438 ; N finalkafsheva ; B 94 -173 464 550 ; -C -1 ; WX 438 ; N finalkafqamats ; B 70 -173 464 550 ; -C -1 ; WX 430 ; N lamedholam ; B 11 -8 432 746 ; -C -1 ; WX 430 ; N lamedholamdagesh ; B 11 -8 432 746 ; -C -1 ; WX 439 ; N altayin ; B -23 0 467 554 ; -C -1 ; WX 620 ; N shinshindot ; B 95 0 645 669 ; -C -1 ; WX 620 ; N shinsindot ; B 95 0 645 668 ; -C -1 ; WX 620 ; N shindageshshindot ; B 95 0 645 669 ; -C -1 ; WX 620 ; N shindageshsindot ; B 95 0 645 668 ; -C -1 ; WX 478 ; N alefpatah ; B -21 -130 489 554 ; -C -1 ; WX 478 ; N alefqamats ; B -21 -243 489 554 ; -C -1 ; WX 478 ; N alefmapiq ; B -21 -9 489 554 ; -C -1 ; WX 437 ; N betdagesh ; B -29 0 412 550 ; -C -1 ; WX 321 ; N gimeldagesh ; B -63 -13 296 554 ; -C -1 ; WX 417 ; N daletdagesh ; B 92 -12 450 550 ; -C -1 ; WX 476 ; N hedagesh ; B -23 -12 496 550 ; -C -1 ; WX 264 ; N vavdagesh ; B 48 -12 260 554 ; -C -1 ; WX 268 ; N zayindagesh ; B 6 -11 294 554 ; -C -1 ; WX 478 ; N tetdagesh ; B 43 0 469 554 ; -C -1 ; WX 242 ; N yoddagesh ; B 44 239 256 554 ; -C -1 ; WX 438 ; N finalkafdagesh ; B 94 -173 464 550 ; -C -1 ; WX 411 ; N kafdagesh ; B -28 0 388 550 ; -C -1 ; WX 430 ; N lameddagesh ; B 97 -8 432 746 ; -C -1 ; WX 470 ; N memdagesh ; B -17 0 444 554 ; -C -1 ; WX 279 ; N nundagesh ; B -48 0 273 554 ; -C -1 ; WX 461 ; N samekhdagesh ; B 52 -14 437 550 ; -C -1 ; WX 431 ; N finalpedagesh ; B 39 -173 412 550 ; -C -1 ; WX 429 ; N pedagesh ; B -21 0 406 550 ; -C -1 ; WX 449 ; N tsadidagesh ; B -8 0 476 554 ; -C -1 ; WX 444 ; N qofdagesh ; B -55 -173 448 550 ; -C -1 ; WX 444 ; N reshdagesh ; B 77 -6 432 550 ; -C -1 ; WX 620 ; N shindagesh ; B 95 0 645 554 ; -C -1 ; WX 474 ; N tavdages ; B -60 -12 459 550 ; -C -1 ; WX 264 ; N vavholam ; B 93 -12 272 668 ; -C -1 ; WX 437 ; N betrafe ; B -29 0 415 646 ; -C -1 ; WX 411 ; N kafrafe ; B -28 0 402 646 ; -C -1 ; WX 429 ; N perafe ; B -21 0 411 646 ; -C -1 ; WX 535 ; N aleflamed ; B 36 -9 546 746 ; -C -1 ; WX 0 ; N zerowidthnonjoiner ; B -18 -134 18 629 ; -C -1 ; WX 0 ; N zerowidthjoiner ; B -107 -134 107 690 ; -C -1 ; WX 0 ; N lefttorightmark ; B -18 -134 210 690 ; -C -1 ; WX 0 ; N righttoleftmark ; B -210 -134 17 690 ; -C -1 ; WX 1000 ; N uniFFFC ; B 0 0 1000 719 ; -C -1 ; WX 722 ; N Ohorn ; B 60 -15 809 695 ; -C -1 ; WX 534 ; N ohorn ; B 29 -12 581 471 ; -C -1 ; WX 754 ; N Uhorn ; B 106 -15 910 778 ; -C -1 ; WX 545 ; N uhorn ; B 29 -12 587 442 ; -C -1 ; WX 0 ; N f00b ; B -112 818 21 891 ; -C -1 ; WX 0 ; N f00c ; B -257 818 -74 891 ; -C -1 ; WX 0 ; N f00e ; B -287 728 -126 891 ; -C -1 ; WX 0 ; N f006 ; B -54 818 79 891 ; -C -1 ; WX 0 ; N f007 ; B -130 818 52 891 ; -C -1 ; WX 0 ; N f009 ; B -139 728 22 891 ; -C -1 ; WX 0 ; N combininghookabove ; B -66 728 83 891 ; -C -1 ; WX 0 ; N f010 ; B -58 810 74 891 ; -C -1 ; WX 0 ; N f013 ; B -184 728 -34 891 ; -C -1 ; WX 0 ; N f011 ; B -127 810 4 891 ; -C -1 ; WX 0 ; N f01c ; B -171 755 142 884 ; -C -1 ; WX 0 ; N f015 ; B -196 813 85 891 ; -C -1 ; WX 0 ; N combiningtildeaccent ; B -256 726 57 854 ; -C -1 ; WX 0 ; N _d_767 ; B 26 722 278 802 ; -C -1 ; WX 0 ; N _d_768 ; B 15 722 263 792 ; -C -1 ; WX 0 ; N f02c ; B -215 -157 -116 -59 ; -C -1 ; WX 513 ; N dongsign ; B 59 140 532 694 ; -C -1 ; WX 750 ; N onethird ; B 79 -27 676 676 ; -C -1 ; WX 750 ; N twothirds ; B 54 -27 676 676 ; -C -1 ; WX 0 ; N f008 ; B -104 517 57 680 ; -C -1 ; WX 0 ; N f00a ; B -197 517 -37 680 ; -C -1 ; WX 0 ; N f00d ; B -183 517 -22 680 ; -C -1 ; WX 0 ; N f00f ; B -272 517 -112 680 ; -C -1 ; WX 0 ; N f012 ; B -110 517 39 681 ; -C -1 ; WX 0 ; N f014 ; B -223 517 -73 681 ; -C -1 ; WX 0 ; N f016 ; B -275 755 38 884 ; -C -1 ; WX 0 ; N f017 ; B -363 755 -50 884 ; -C -1 ; WX 0 ; N f018 ; B -387 755 -74 884 ; -C -1 ; WX 0 ; N f019 ; B -320 538 -7 667 ; -C -1 ; WX 0 ; N f01a ; B -344 538 -32 667 ; -C -1 ; WX 0 ; N f01b ; B -378 538 -66 667 ; -C -1 ; WX 0 ; N f01e ; B -400 -157 -301 -59 ; -C -1 ; WX 0 ; N f01f ; B -498 -157 -398 -59 ; -C -1 ; WX 0 ; N f020 ; B -498 -157 -398 -59 ; -C -1 ; WX 0 ; N f021 ; B -458 -157 -359 -59 ; -C -1 ; WX 0 ; N f022 ; B -493 -157 -394 -59 ; -C -1 ; WX 0 ; N combininggraveaccent ; B -113 728 48 891 ; -C -1 ; WX 0 ; N combiningacuteaccent ; B -46 728 115 891 ; -C -1 ; WX 0 ; N f01d ; B -226 538 86 667 ; -C -1 ; WX 0 ; N combiningdotbelow ; B -458 -157 -359 -59 ; -C -1 ; WX 0 ; N f023 ; B -383 -157 -284 -59 ; -C -1 ; WX 0 ; N f029 ; B -299 -157 -200 -59 ; -C -1 ; WX 0 ; N f02a ; B -269 -157 -169 -59 ; -C -1 ; WX 0 ; N f02b ; B -421 -157 -322 -59 ; -C -1 ; WX 0 ; N f024 ; B -334 -157 -235 -59 ; -C -1 ; WX 0 ; N f025 ; B -383 -157 -284 -59 ; -C -1 ; WX 0 ; N f026 ; B -413 -157 -313 -59 ; -C -1 ; WX 0 ; N f027 ; B -369 -157 -270 -59 ; -C -1 ; WX 0 ; N f028 ; B -413 -157 -313 -59 ; -C -1 ; WX 0 ; N f02d ; B -284 813 -2 891 ; -C -1 ; WX 0 ; N f02e ; B -303 755 10 884 ; -C -1 ; WX 0 ; N f02f ; B -313 813 -32 891 ; -C -1 ; WX 0 ; N f030 ; B -352 755 -39 884 ; -C -1 ; WX 278 ; N f031 ; B 43 -12 230 442 ; -C -1 ; WX 611 ; N Adotbelow ; B -49 -157 547 677 ; -C -1 ; WX 500 ; N adotbelow ; B 23 -157 469 442 ; -C -1 ; WX 611 ; N Ahookabove ; B -49 0 630 891 ; -C -1 ; WX 500 ; N ahookabove ; B 23 -12 469 681 ; -C -1 ; WX 611 ; N Acircumflexacute ; B -49 0 665 891 ; -C -1 ; WX 500 ; N acircumflexacute ; B 23 -12 531 891 ; -C -1 ; WX 611 ; N Acircumflexgrave ; B -49 0 650 891 ; -C -1 ; WX 500 ; N acircumflexgrave ; B 23 -12 479 891 ; -C -1 ; WX 611 ; N Acircumflexhookabove ; B -49 0 650 891 ; -C -1 ; WX 500 ; N acircumflexhookabove ; B 23 -12 522 891 ; -C -1 ; WX 611 ; N Acircumflextilde ; B -49 0 696 891 ; -C -1 ; WX 500 ; N acircumflextilde ; B 23 -12 582 884 ; -C -1 ; WX 611 ; N Acircumflexdotbelow ; B -49 -157 650 792 ; -C -1 ; WX 500 ; N acircumflexdotbelow ; B 23 -157 469 677 ; -C -1 ; WX 611 ; N Abreveacute ; B -49 0 666 891 ; -C -1 ; WX 500 ; N abreveacute ; B 23 -12 510 891 ; -C -1 ; WX 611 ; N Abrevegrave ; B -49 0 666 891 ; -C -1 ; WX 500 ; N abrevegrave ; B 23 -12 510 891 ; -C -1 ; WX 611 ; N Abrevehookabove ; B -49 0 666 891 ; -C -1 ; WX 500 ; N abrevehookabove ; B 23 -12 510 891 ; -C -1 ; WX 611 ; N Abrevetilde ; B -49 0 691 891 ; -C -1 ; WX 500 ; N abrevetilde ; B 23 -12 542 884 ; -C -1 ; WX 611 ; N Abrevedotbelow ; B -49 -157 666 802 ; -C -1 ; WX 500 ; N abrevedotbelow ; B 23 -157 480 687 ; -C -1 ; WX 611 ; N Edotbelow ; B -22 -157 632 662 ; -C -1 ; WX 444 ; N edotbelow ; B 31 -157 430 442 ; -C -1 ; WX 611 ; N Ehookabove ; B -22 0 632 891 ; -C -1 ; WX 444 ; N ehookabove ; B 31 -12 430 681 ; -C -1 ; WX 611 ; N Etilde ; B -22 0 632 847 ; -C -1 ; WX 444 ; N etilde ; B 31 -12 493 667 ; -C -1 ; WX 611 ; N Ecircumflexacute ; B -22 0 632 891 ; -C -1 ; WX 444 ; N ecircumflexacute ; B 31 -12 505 891 ; -C -1 ; WX 611 ; N Ecircumflexgrave ; B -22 0 632 891 ; -C -1 ; WX 444 ; N ecircumflexgrave ; B 31 -12 453 891 ; -C -1 ; WX 611 ; N Ecircumflexhookabove ; B -22 0 632 891 ; -C -1 ; WX 444 ; N ecircumflexhookabove ; B 31 -12 497 891 ; -C -1 ; WX 611 ; N Ecircumflextilde ; B -22 0 632 891 ; -C -1 ; WX 444 ; N ecircumflextilde ; B 31 -12 556 884 ; -C -1 ; WX 611 ; N Ecircumflexdotbelow ; B -22 -157 632 792 ; -C -1 ; WX 444 ; N ecircumflexdotbelow ; B 31 -157 443 677 ; -C -1 ; WX 333 ; N Ihookabove ; B -31 0 420 891 ; -C -1 ; WX 278 ; N ihookabove ; B 43 -12 322 681 ; -C -1 ; WX 333 ; N Idotbelow ; B -31 -157 410 662 ; -C -1 ; WX 278 ; N idotbelow ; B 24 -157 272 636 ; -C -1 ; WX 722 ; N Odotbelow ; B 60 -157 718 677 ; -C -1 ; WX 500 ; N odotbelow ; B 29 -157 462 442 ; -C -1 ; WX 722 ; N Ohookabove ; B 60 -15 718 891 ; -C -1 ; WX 500 ; N ohookabove ; B 29 -12 462 681 ; -C -1 ; WX 722 ; N Ocircumflexacute ; B 60 -15 718 891 ; -C -1 ; WX 500 ; N ocircumflexacute ; B 29 -12 531 891 ; -C -1 ; WX 722 ; N Ocircumflexgrave ; B 60 -15 718 891 ; -C -1 ; WX 500 ; N ocircumflexgrave ; B 29 -12 479 891 ; -C -1 ; WX 722 ; N Ocircumflexhookabove ; B 60 -15 718 891 ; -C -1 ; WX 500 ; N ocircumflexhookabove ; B 29 -12 522 891 ; -C -1 ; WX 722 ; N Ocircumflextilde ; B 60 -15 718 891 ; -C -1 ; WX 500 ; N ocircumflextilde ; B 29 -12 582 884 ; -C -1 ; WX 722 ; N Ocircumflexdotbelow ; B 60 -157 718 792 ; -C -1 ; WX 500 ; N ocircumflexdotbelow ; B 29 -157 469 677 ; -C -1 ; WX 722 ; N Ohornacute ; B 60 -15 809 880 ; -C -1 ; WX 534 ; N ohornacute ; B 29 -12 581 685 ; -C -1 ; WX 722 ; N Ohorngrave ; B 60 -15 809 880 ; -C -1 ; WX 534 ; N ohorngrave ; B 29 -12 581 685 ; -C -1 ; WX 722 ; N Ohornhookabove ; B 60 -15 809 891 ; -C -1 ; WX 534 ; N ohornhookabove ; B 29 -12 581 681 ; -C -1 ; WX 722 ; N Ohorntilde ; B 60 -15 809 847 ; -C -1 ; WX 534 ; N ohorntilde ; B 29 -12 581 667 ; -C -1 ; WX 722 ; N Ohorndotbelow ; B 60 -157 809 695 ; -C -1 ; WX 534 ; N ohorndotbelow ; B 29 -157 581 471 ; -C -1 ; WX 722 ; N Udotbelow ; B 106 -157 814 662 ; -C -1 ; WX 500 ; N udotbelow ; B 29 -157 471 442 ; -C -1 ; WX 722 ; N Uhookabove ; B 106 -15 814 891 ; -C -1 ; WX 500 ; N uhookabove ; B 29 -12 471 681 ; -C -1 ; WX 754 ; N Uhornacute ; B 106 -15 910 880 ; -C -1 ; WX 545 ; N uhornacute ; B 29 -12 587 685 ; -C -1 ; WX 754 ; N Uhorngrave ; B 106 -15 910 880 ; -C -1 ; WX 545 ; N uhorngrave ; B 29 -12 587 685 ; -C -1 ; WX 754 ; N Uhornhookabove ; B 106 -15 910 891 ; -C -1 ; WX 545 ; N uhornhookabove ; B 29 -12 587 681 ; -C -1 ; WX 754 ; N Uhorntilde ; B 106 -15 910 847 ; -C -1 ; WX 545 ; N uhorntilde ; B 29 -12 587 667 ; -C -1 ; WX 754 ; N Uhorndotbelow ; B 106 -157 910 778 ; -C -1 ; WX 545 ; N uhorndotbelow ; B 29 -157 587 442 ; -C -1 ; WX 556 ; N Ydotbelow ; B 90 -157 667 662 ; -C -1 ; WX 444 ; N ydotbelow ; B -78 -216 440 442 ; -C -1 ; WX 556 ; N Yhookabove ; B 90 0 667 891 ; -C -1 ; WX 444 ; N yhookabove ; B -78 -216 440 681 ; -C -1 ; WX 556 ; N Ytilde ; B 90 0 667 847 ; -C -1 ; WX 444 ; N ytilde ; B -78 -216 473 667 ; -C -1 ; WX 611 ; N uni01CD ; B -49 0 695 876 ; -C -1 ; WX 500 ; N uni01CE ; B 23 -12 515 677 ; -C -1 ; WX 333 ; N uni01CF ; B -31 0 485 876 ; -C -1 ; WX 278 ; N uni01D0 ; B 43 -12 393 677 ; -C -1 ; WX 722 ; N uni01D1 ; B 60 -15 718 876 ; -C -1 ; WX 500 ; N uni01D2 ; B 29 -12 520 677 ; -C -1 ; WX 722 ; N uni01D3 ; B 106 -15 814 876 ; -C -1 ; WX 500 ; N uni01D4 ; B 29 -12 495 677 ; -C -1 ; WX 722 ; N uni01D5 ; B 106 -15 814 891 ; -C -1 ; WX 500 ; N uni01D6 ; B 29 -12 519 747 ; -C -1 ; WX 722 ; N uni01D7 ; B 106 -15 814 891 ; -C -1 ; WX 500 ; N uni01D8 ; B 29 -12 477 822 ; -C -1 ; WX 722 ; N uni01D9 ; B 106 -15 814 891 ; -C -1 ; WX 500 ; N uni01DA ; B 29 -12 524 809 ; -C -1 ; WX 722 ; N uni01DB ; B 106 -15 814 891 ; -C -1 ; WX 500 ; N uni01DC ; B 29 -12 471 823 ; -C -1 ; WX 0 ; N _d_912 ; B 93 706 376 891 ; -C -1 ; WX 0 ; N _d_913 ; B 93 706 334 891 ; -C -1 ; WX 0 ; N _d_914 ; B 93 706 358 891 ; -C -1 ; WX 0 ; N _d_915 ; B 93 706 334 891 ; -C -1 ; WX 569 ; N uni0492 ; B -36 0 664 662 ; -C -1 ; WX 390 ; N uni0493 ; B 1 -12 384 442 ; -C -1 ; WX 916 ; N uni0496 ; B -55 -196 975 670 ; -C -1 ; WX 930 ; N uni0497 ; B 0 -193 926 442 ; -C -1 ; WX 664 ; N uni049a ; B -28 -196 723 670 ; -C -1 ; WX 468 ; N uni049b ; B 18 -196 465 442 ; -C -1 ; WX 664 ; N uni049c ; B -28 0 723 670 ; -C -1 ; WX 468 ; N uni049d ; B 18 0 465 442 ; -C -1 ; WX 722 ; N uni04a2 ; B -26 -196 811 662 ; -C -1 ; WX 496 ; N uni04a3 ; B 20 -196 462 442 ; -C -1 ; WX 556 ; N uni04ae ; B 90 0 667 662 ; -C -1 ; WX 500 ; N uni04af ; B 1 -214 557 447 ; -C -1 ; WX 556 ; N uni04b0 ; B 90 0 667 662 ; -C -1 ; WX 500 ; N uni04b1 ; B -16 -214 557 447 ; -C -1 ; WX 611 ; N uni04b2 ; B -67 -196 741 662 ; -C -1 ; WX 444 ; N uni04b3 ; B -35 -196 438 442 ; -C -1 ; WX 689 ; N uni04b8 ; B 113 0 770 662 ; -C -1 ; WX 477 ; N uni04b9 ; B 42 -12 444 442 ; -C -1 ; WX 689 ; N uni04ba ; B -26 0 631 662 ; -C -1 ; WX 500 ; N uni04bb ; B 19 -12 459 442 ; -C -1 ; WX 695 ; N uni018f ; B 60 -15 690 677 ; -C -1 ; WX 444 ; N uni0259 ; B 13 -12 412 442 ; -C -1 ; WX 722 ; N uni04e8 ; B 60 -15 718 677 ; -C -1 ; WX 500 ; N uni04e9 ; B 29 -12 462 442 ; -EndCharMetrics -StartKernData -StartKernPairs 821 -KPX space A -18 -KPX space Alphatonos -18 -KPX space Alpha -18 -KPX space Delta -18 -KPX space Lambda -18 -KPX one one -74 -KPX A space -18 -KPX A T -37 -KPX A V -50 -KPX A W -37 -KPX A Y -55 -KPX A v -55 -KPX A w -55 -KPX A y -55 -KPX A quoteright -37 -KPX F comma -129 -KPX F period -129 -KPX F A -129 -KPX L space -18 -KPX L T -20 -KPX L V -37 -KPX L W -37 -KPX L Y -20 -KPX L y -30 -KPX L quoteright -37 -KPX P space -18 -KPX P comma -129 -KPX P period -129 -KPX P A -129 -KPX R V -18 -KPX R W -18 -KPX R Y -18 -KPX R y -18 -KPX T space -18 -KPX T comma -74 -KPX T hyphen -74 -KPX T period -74 -KPX T colon -55 -KPX T semicolon -65 -KPX T A -74 -KPX T O -18 -KPX T a -92 -KPX T c -92 -KPX T e -92 -KPX T i -55 -KPX T o -92 -KPX T r -55 -KPX T s -92 -KPX T u -55 -KPX T w -74 -KPX T y -74 -KPX V space -18 -KPX V comma -129 -KPX V hyphen -55 -KPX V period -129 -KPX V colon -65 -KPX V semicolon -74 -KPX V A -74 -KPX V O -30 -KPX V a -111 -KPX V e -111 -KPX V i -74 -KPX V o -111 -KPX V r -74 -KPX V u -74 -KPX V y -92 -KPX W comma -92 -KPX W hyphen -37 -KPX W period -92 -KPX W colon -65 -KPX W semicolon -65 -KPX W A -70 -KPX W a -92 -KPX W e -92 -KPX W i -55 -KPX W o -92 -KPX W r -55 -KPX W u -55 -KPX W y -92 -KPX Y comma -92 -KPX Y hyphen -74 -KPX Y period -92 -KPX Y colon -65 -KPX Y semicolon -65 -KPX Y A -70 -KPX Y a -92 -KPX Y e -92 -KPX Y i -74 -KPX Y o -92 -KPX Y p -92 -KPX Y q -111 -KPX Y u -92 -KPX Y v -92 -KPX f quoteright 92 -KPX r comma -111 -KPX r hyphen -20 -KPX r period -111 -KPX r c -37 -KPX r d -37 -KPX r e -37 -KPX r g -37 -KPX r h -18 -KPX r o -37 -KPX r q -37 -KPX r quoteright 37 -KPX v comma -74 -KPX v period -74 -KPX w comma -74 -KPX w period -74 -KPX y comma -55 -KPX y period -55 -KPX quoteleft quoteleft -111 -KPX quoteright space -111 -KPX quoteright s -129 -KPX quoteright t -111 -KPX quoteright quoteright -111 -KPX quotesinglbase afii10051 -113 -KPX quotesinglbase afii10060 -113 -KPX quotesinglbase afii10036 -113 -KPX quotesinglbase afii10041 -176 -KPX quotesinglbase afii10044 -88 -KPX quotedblbase afii10051 -113 -KPX quotedblbase afii10060 -113 -KPX quotedblbase afii10036 -113 -KPX quotedblbase afii10041 -125 -KPX quotedblbase afii10044 -50 -KPX Gamma comma -128 -KPX Gamma period -128 -KPX Gamma iotadieresistonos 42 -KPX Gamma Alpha -142 -KPX Gamma Delta -142 -KPX Gamma Lambda -142 -KPX Gamma iota -55 -KPX Theta Alpha -44 -KPX Theta Delta -25 -KPX Theta Lambda -44 -KPX Theta Tau -18 -KPX Theta Upsilon -41 -KPX Theta Upsilondieresis -41 -KPX Phi Alpha -44 -KPX Phi Upsilon -77 -KPX Phi Upsilondieresis -77 -KPX delta chi -20 -KPX tau zeta 16 -KPX phi lambda -21 -KPX phi chi -20 -KPX Alphatonos space -18 -KPX Alphatonos Theta -44 -KPX Alphatonos Phi -44 -KPX Alphatonos Omicron -44 -KPX Alphatonos Tau -37 -KPX Alphatonos Upsilon -82 -KPX Alphatonos Upsilondieresis -82 -KPX Alphatonos gamma -45 -KPX Alphatonos nu -55 -KPX Alphatonos chi -45 -KPX Omicrontonos Upsilon -41 -KPX Upsilontonos Odieresis -36 -KPX Upsilontonos Theta -36 -KPX Upsilontonos Phi -59 -KPX Upsilontonos alpha -91 -KPX Upsilontonos delta -68 -KPX Upsilontonos sigma -91 -KPX Upsilontonos phi -91 -KPX Upsilontonos iotadieresistonos 29 -KPX Upsilontonos Alpha -97 -KPX Upsilontonos Delta -69 -KPX Upsilontonos Lambda -97 -KPX Upsilontonos Omicron -36 -KPX Upsilontonos alphatonos -91 -KPX Upsilontonos etatonos -47 -KPX Upsilontonos iotatonos -51 -KPX Upsilontonos eta -47 -KPX Upsilontonos iota -51 -KPX Upsilontonos kappa -47 -KPX Upsilontonos mu -74 -KPX Upsilontonos omicron -91 -KPX Upsilontonos iotadieresis 29 -KPX Upsilontonos omicrontonos -91 -KPX Alpha space -18 -KPX Alpha quoteright -37 -KPX Alpha Theta -44 -KPX Alpha Phi -44 -KPX Alpha Omicron -44 -KPX Alpha Tau -37 -KPX Alpha Upsilon -82 -KPX Alpha Upsilondieresis -82 -KPX Alpha gamma -45 -KPX Alpha nu -55 -KPX Alpha chi -45 -KPX Delta space -18 -KPX Delta Theta -19 -KPX Delta Omicron -19 -KPX Delta Tau -19 -KPX Delta Upsilon -69 -KPX Delta Upsilondieresis -69 -KPX Kappa Theta -55 -KPX Kappa Phi -82 -KPX Kappa alpha -29 -KPX Kappa delta -29 -KPX Kappa sigma -29 -KPX Kappa phi -29 -KPX Kappa Omicron -55 -KPX Kappa alphatonos -29 -KPX Kappa zeta -29 -KPX Kappa theta -29 -KPX Kappa xi -29 -KPX Kappa omicron -29 -KPX Kappa omega -29 -KPX Kappa omicrontonos -29 -KPX Kappa omegatonos -29 -KPX Lambda space -18 -KPX Lambda Theta -44 -KPX Lambda Omicron -44 -KPX Lambda Tau -37 -KPX Lambda Upsilon -82 -KPX Lambda Upsilondieresis -82 -KPX Omicron Alpha -44 -KPX Omicron Delta -25 -KPX Omicron Lambda -44 -KPX Omicron Upsilon -41 -KPX Omicron Upsilondieresis -41 -KPX Rho comma -128 -KPX Rho period -128 -KPX Rho Alpha -128 -KPX Rho Delta -88 -KPX Rho Lambda -128 -KPX Sigma tau -34 -KPX Tau space -18 -KPX Tau hyphen -74 -KPX Tau period -74 -KPX Tau colon -55 -KPX Tau semicolon -55 -KPX Tau Theta -18 -KPX Tau Phi -18 -KPX Tau alpha -91 -KPX Tau delta -91 -KPX Tau epsilon -91 -KPX Tau sigma -91 -KPX Tau phi -91 -KPX Tau iotadieresistonos 44 -KPX Tau Alpha -74 -KPX Tau Delta -44 -KPX Tau Lambda -74 -KPX Tau Omicron -18 -KPX Tau Omega -18 -KPX Tau alphatonos -91 -KPX Tau epsilontonos -48 -KPX Tau gamma -74 -KPX Tau eta -55 -KPX Tau iota -55 -KPX Tau mu -55 -KPX Tau nu -74 -KPX Tau omicron -91 -KPX Tau chi -74 -KPX Tau psi -55 -KPX Tau omicrontonos -91 -KPX Tau upsilontonos -55 -KPX Upsilon comma -91 -KPX Upsilon hyphen -74 -KPX Upsilon period -91 -KPX Upsilon colon -64 -KPX Upsilon semicolon -64 -KPX Upsilon Theta -18 -KPX Upsilon Phi -59 -KPX Upsilon alpha -91 -KPX Upsilon delta -68 -KPX Upsilon sigma -91 -KPX Upsilon phi -91 -KPX Upsilon iotadieresistonos 29 -KPX Upsilon Alpha -97 -KPX Upsilon Delta -69 -KPX Upsilon Lambda -97 -KPX Upsilon Omicron -18 -KPX Upsilon alphatonos -91 -KPX Upsilon etatonos -47 -KPX Upsilon iotatonos -51 -KPX Upsilon gamma -46 -KPX Upsilon eta -47 -KPX Upsilon iota -51 -KPX Upsilon kappa -47 -KPX Upsilon mu -74 -KPX Upsilon omicron -91 -KPX Upsilon iotadieresis 29 -KPX Upsilon omicrontonos -91 -KPX Chi omega -25 -KPX Chi omegatonos -25 -KPX Psi alpha -44 -KPX Psi delta -44 -KPX Psi sigma -44 -KPX Psi phi -44 -KPX Psi alphatonos -44 -KPX Psi theta -25 -KPX Psi omicron -44 -KPX Psi omega -44 -KPX Psi omicrontonos -44 -KPX Psi omegatonos -44 -KPX Omega Upsilon -23 -KPX Omega Upsilondieresis -23 -KPX Upsilondieresis Theta -18 -KPX Upsilondieresis Phi -59 -KPX Upsilondieresis alpha -91 -KPX Upsilondieresis delta -68 -KPX Upsilondieresis sigma -91 -KPX Upsilondieresis phi -91 -KPX Upsilondieresis iotadieresistonos 29 -KPX Upsilondieresis Alpha -97 -KPX Upsilondieresis Delta -69 -KPX Upsilondieresis Lambda -97 -KPX Upsilondieresis Omicron -18 -KPX Upsilondieresis alphatonos -91 -KPX Upsilondieresis etatonos -47 -KPX Upsilondieresis iotatonos -51 -KPX Upsilondieresis eta -47 -KPX Upsilondieresis iota -51 -KPX Upsilondieresis kappa -47 -KPX Upsilondieresis mu -74 -KPX Upsilondieresis omicron -91 -KPX Upsilondieresis iotadieresis 29 -KPX Upsilondieresis omicrontonos -91 -KPX zeta alpha -57 -KPX zeta delta -43 -KPX zeta sigma -57 -KPX zeta tau -69 -KPX zeta phi -57 -KPX zeta alphatonos -57 -KPX zeta etatonos -32 -KPX zeta gamma -50 -KPX zeta eta -32 -KPX zeta theta -43 -KPX zeta iota -32 -KPX zeta kappa -32 -KPX zeta nu -50 -KPX zeta omicron -57 -KPX zeta omega -57 -KPX zeta omicrontonos -57 -KPX zeta omegatonos -57 -KPX zeta pi -34 -KPX lambda upsilon -17 -KPX xi alpha -42 -KPX xi delta -42 -KPX xi sigma -42 -KPX xi phi -42 -KPX xi alphatonos -42 -KPX xi zeta -42 -KPX xi xi -42 -KPX xi omicron -42 -KPX xi sigma1 -42 -KPX xi omicrontonos -42 -KPX omicron chi -20 -KPX chi alpha -21 -KPX chi delta -21 -KPX chi sigma -21 -KPX chi phi -21 -KPX chi alphatonos -21 -KPX chi zeta -21 -KPX chi omicron -21 -KPX chi sigma1 -21 -KPX chi omega -21 -KPX chi omicrontonos -21 -KPX chi omegatonos -21 -KPX omega chi -20 -KPX omicrontonos chi -20 -KPX omegatonos chi -20 -KPX afii10052 comma -63 -KPX afii10052 period -75 -KPX afii10052 colon 25 -KPX afii10058 quoteright -121 -KPX afii10059 quoteright -88 -KPX afii10017 quoteright -101 -KPX afii10017 afii10021 14 -KPX afii10017 afii10025 -13 -KPX afii10017 afii10029 -20 -KPX afii10017 afii10032 -38 -KPX afii10017 afii10033 -25 -KPX afii10017 afii10035 -25 -KPX afii10017 afii10036 -38 -KPX afii10017 afii10037 -63 -KPX afii10017 afii10038 -51 -KPX afii10017 afii10041 -63 -KPX afii10017 afii10047 -50 -KPX afii10017 afii10065 -15 -KPX afii10017 afii10066 -15 -KPX afii10017 afii10070 -15 -KPX afii10017 afii10080 -15 -KPX afii10017 afii10083 -15 -KPX afii10017 afii10085 -33 -KPX afii10017 afii10086 -15 -KPX afii10017 afii10095 -15 -KPX afii10018 afii10017 -27 -KPX afii10018 afii10021 12 -KPX afii10018 afii10024 25 -KPX afii10018 afii10025 37 -KPX afii10018 afii10037 -40 -KPX afii10018 afii10038 -27 -KPX afii10018 afii10039 -13 -KPX afii10018 afii10041 -27 -KPX afii10018 afii10047 -14 -KPX afii10018 afii10069 12 -KPX afii10018 afii10085 -12 -KPX afii10018 afii10097 23 -KPX afii10019 afii10017 -38 -KPX afii10019 afii10021 -53 -KPX afii10019 afii10024 -40 -KPX afii10019 afii10025 -34 -KPX afii10019 afii10032 -47 -KPX afii10019 afii10035 -47 -KPX afii10019 afii10036 -57 -KPX afii10019 afii10037 -85 -KPX afii10019 afii10038 -54 -KPX afii10019 afii10039 -25 -KPX afii10019 afii10041 -60 -KPX afii10019 afii10044 -48 -KPX afii10019 afii10049 -47 -KPX afii10019 afii10069 12 -KPX afii10019 afii10078 -13 -KPX afii10019 afii10084 12 -KPX afii10019 afii10085 -14 -KPX afii10019 afii10087 -14 -KPX afii10019 afii10089 12 -KPX afii10019 afii10097 12 -KPX afii10020 comma -63 -KPX afii10020 period -75 -KPX afii10020 colon 25 -KPX afii10020 afii10017 -75 -KPX afii10020 afii10025 19 -KPX afii10020 afii10029 -13 -KPX afii10020 afii10030 -25 -KPX afii10020 afii10032 -13 -KPX afii10020 afii10049 -13 -KPX afii10020 afii10065 -25 -KPX afii10020 afii10067 -38 -KPX afii10020 afii10069 -18 -KPX afii10020 afii10070 -30 -KPX afii10020 afii10074 -19 -KPX afii10020 afii10077 -53 -KPX afii10020 afii10078 -40 -KPX afii10020 afii10079 -30 -KPX afii10020 afii10080 -52 -KPX afii10020 afii10082 -28 -KPX afii10020 afii10085 -43 -KPX afii10020 afii10093 -53 -KPX afii10020 afii10094 -50 -KPX afii10020 afii10096 -65 -KPX afii10020 afii10097 -40 -KPX afii10022 afii10025 -14 -KPX afii10024 afii10032 -53 -KPX afii10024 afii10035 -53 -KPX afii10024 afii10037 -34 -KPX afii10024 afii10041 -34 -KPX afii10024 afii10080 -13 -KPX afii10024 afii10085 -30 -KPX afii10025 afii10036 12 -KPX afii10025 afii10037 -13 -KPX afii10025 afii10041 -50 -KPX afii10025 afii10069 13 -KPX afii10028 afii10032 -47 -KPX afii10028 afii10035 -47 -KPX afii10028 afii10037 -13 -KPX afii10028 afii10038 -80 -KPX afii10028 afii10047 -13 -KPX afii10028 afii10070 -25 -KPX afii10028 afii10080 -38 -KPX afii10028 afii10083 -25 -KPX afii10028 afii10085 -43 -KPX afii10028 afii10095 -25 -KPX afii10030 afii10038 -25 -KPX afii10030 afii10065 -14 -KPX afii10030 afii10070 -14 -KPX afii10030 afii10080 -14 -KPX afii10030 afii10083 -14 -KPX afii10032 afii10017 -48 -KPX afii10032 afii10021 -25 -KPX afii10032 afii10024 -38 -KPX afii10032 afii10029 -25 -KPX afii10032 afii10037 -58 -KPX afii10032 afii10038 12 -KPX afii10032 afii10039 -50 -KPX afii10032 afii10041 -38 -KPX afii10032 afii10049 -38 -KPX afii10034 comma -88 -KPX afii10034 period -100 -KPX afii10034 colon 25 -KPX afii10034 afii10017 -88 -KPX afii10034 afii10021 -99 -KPX afii10034 afii10024 -52 -KPX afii10034 afii10025 -33 -KPX afii10034 afii10029 -78 -KPX afii10034 afii10030 -25 -KPX afii10034 afii10032 -13 -KPX afii10034 afii10037 -71 -KPX afii10034 afii10038 -27 -KPX afii10034 afii10039 -63 -KPX afii10034 afii10049 -78 -KPX afii10034 afii10065 -38 -KPX afii10034 afii10069 -36 -KPX afii10034 afii10070 -36 -KPX afii10034 afii10080 -36 -KPX afii10034 afii10095 -14 -KPX afii10034 afii10097 -25 -KPX afii10035 afii10017 -38 -KPX afii10035 afii10029 12 -KPX afii10035 afii10037 -13 -KPX afii10035 afii10039 -13 -KPX afii10035 afii10041 -13 -KPX afii10035 afii10065 7 -KPX afii10035 afii10066 7 -KPX afii10035 afii10070 7 -KPX afii10035 afii10072 7 -KPX afii10035 afii10073 7 -KPX afii10035 afii10080 7 -KPX afii10035 afii10083 7 -KPX afii10035 afii10084 14 -KPX afii10035 afii10086 7 -KPX afii10035 afii10095 7 -KPX afii10036 comma -50 -KPX afii10036 period -63 -KPX afii10036 colon 37 -KPX afii10036 semicolon 12 -KPX afii10036 guillemotleft 25 -KPX afii10036 guillemotright 25 -KPX afii10036 afii10017 -63 -KPX afii10036 afii10021 25 -KPX afii10036 afii10038 -27 -KPX afii10036 afii10065 -36 -KPX afii10036 afii10067 -36 -KPX afii10036 afii10070 -36 -KPX afii10036 afii10074 -24 -KPX afii10036 afii10076 -36 -KPX afii10036 afii10077 -36 -KPX afii10036 afii10078 -36 -KPX afii10036 afii10080 -36 -KPX afii10036 afii10081 -24 -KPX afii10036 afii10082 -25 -KPX afii10036 afii10083 -36 -KPX afii10036 afii10085 -24 -KPX afii10036 afii10087 -24 -KPX afii10036 afii10091 -24 -KPX afii10036 afii10093 -36 -KPX afii10036 afii10094 -36 -KPX afii10036 afii10096 -36 -KPX afii10036 afii10097 -24 -KPX afii10037 comma -51 -KPX afii10037 period -63 -KPX afii10037 colon 25 -KPX afii10037 guillemotleft 12 -KPX afii10037 guillemotright 25 -KPX afii10037 afii10017 -75 -KPX afii10037 afii10021 -40 -KPX afii10037 afii10029 -65 -KPX afii10037 afii10032 -27 -KPX afii10037 afii10038 -53 -KPX afii10037 afii10049 -53 -KPX afii10037 afii10066 -13 -KPX afii10037 afii10067 -47 -KPX afii10037 afii10068 -50 -KPX afii10037 afii10069 -13 -KPX afii10037 afii10070 -47 -KPX afii10037 afii10072 -50 -KPX afii10037 afii10073 -50 -KPX afii10037 afii10074 -15 -KPX afii10037 afii10075 -13 -KPX afii10037 afii10076 -25 -KPX afii10037 afii10077 -50 -KPX afii10037 afii10078 -50 -KPX afii10037 afii10079 -25 -KPX afii10037 afii10080 -47 -KPX afii10037 afii10081 -28 -KPX afii10037 afii10082 -40 -KPX afii10037 afii10083 -47 -KPX afii10037 afii10087 -47 -KPX afii10037 afii10088 -13 -KPX afii10037 afii10090 -13 -KPX afii10037 afii10091 -13 -KPX afii10037 afii10096 -28 -KPX afii10037 afii10097 -47 -KPX afii10038 afii10017 -50 -KPX afii10038 afii10021 -47 -KPX afii10038 afii10029 -13 -KPX afii10038 afii10030 -6 -KPX afii10038 afii10032 12 -KPX afii10038 afii10036 -13 -KPX afii10038 afii10037 -77 -KPX afii10038 afii10041 -34 -KPX afii10038 afii10049 -13 -KPX afii10038 afii10077 -15 -KPX afii10039 afii10032 -51 -KPX afii10039 afii10035 -38 -KPX afii10039 afii10038 -25 -KPX afii10039 afii10080 -20 -KPX afii10039 afii10085 -20 -KPX afii10044 quoteright -121 -KPX afii10044 afii10049 -29 -KPX afii10046 quoteright -121 -KPX afii10046 afii10017 -34 -KPX afii10046 afii10021 -13 -KPX afii10046 afii10024 -28 -KPX afii10046 afii10025 -13 -KPX afii10046 afii10030 -20 -KPX afii10046 afii10032 -25 -KPX afii10046 afii10035 -20 -KPX afii10046 afii10036 -51 -KPX afii10046 afii10039 -40 -KPX afii10046 afii10041 -112 -KPX afii10046 afii10047 -38 -KPX afii10046 afii10049 -13 -KPX afii10047 afii10024 -13 -KPX afii10047 afii10025 25 -KPX afii10047 afii10029 -13 -KPX afii10047 afii10039 -38 -KPX afii10047 afii10049 -13 -KPX afii10047 afii10069 14 -KPX afii10047 afii10072 14 -KPX afii10047 afii10077 -7 -KPX afii10047 afii10078 -14 -KPX afii10047 afii10097 14 -KPX afii10048 afii10017 -56 -KPX afii10048 afii10021 -13 -KPX afii10048 afii10024 -25 -KPX afii10048 afii10029 -25 -KPX afii10048 afii10032 -13 -KPX afii10048 afii10036 -13 -KPX afii10048 afii10039 -51 -KPX afii10048 afii10041 -25 -KPX afii10048 afii10069 7 -KPX afii10048 afii10072 7 -KPX afii10065 afii10085 -13 -KPX afii10065 afii10089 -13 -KPX afii10066 afii10072 -13 -KPX afii10066 afii10073 -13 -KPX afii10066 afii10077 -25 -KPX afii10066 afii10078 -38 -KPX afii10066 afii10080 -13 -KPX afii10066 afii10083 -13 -KPX afii10066 afii10085 -13 -KPX afii10066 afii10086 -13 -KPX afii10066 afii10087 -20 -KPX afii10066 afii10089 -13 -KPX afii10066 afii10092 -25 -KPX afii10066 afii10095 -13 -KPX afii10066 afii10097 -25 -KPX afii10067 afii10065 -7 -KPX afii10067 afii10066 -13 -KPX afii10067 afii10069 -19 -KPX afii10067 afii10073 -13 -KPX afii10067 afii10080 -13 -KPX afii10067 afii10083 -13 -KPX afii10067 afii10086 -7 -KPX afii10067 afii10092 -13 -KPX afii10067 afii10097 -13 -KPX afii10068 period -13 -KPX afii10068 afii10077 -13 -KPX afii10069 afii10070 12 -KPX afii10069 afii10085 -13 -KPX afii10069 afii10092 -13 -KPX afii10069 afii10095 -13 -KPX afii10070 afii10065 -13 -KPX afii10070 afii10066 -13 -KPX afii10070 afii10069 -25 -KPX afii10070 afii10072 -25 -KPX afii10070 afii10073 -13 -KPX afii10070 afii10077 -25 -KPX afii10070 afii10078 -25 -KPX afii10070 afii10080 -13 -KPX afii10070 afii10083 -13 -KPX afii10070 afii10084 -13 -KPX afii10070 afii10086 -25 -KPX afii10070 afii10087 -13 -KPX afii10070 afii10089 -13 -KPX afii10072 afii10065 -13 -KPX afii10072 afii10066 -13 -KPX afii10072 afii10070 -13 -KPX afii10072 afii10073 -13 -KPX afii10072 afii10080 -25 -KPX afii10072 afii10083 -25 -KPX afii10072 afii10089 -13 -KPX afii10072 afii10092 -13 -KPX afii10073 afii10069 -13 -KPX afii10073 afii10072 -13 -KPX afii10073 afii10073 -13 -KPX afii10073 afii10077 -25 -KPX afii10073 afii10078 -25 -KPX afii10073 afii10080 -13 -KPX afii10073 afii10083 -13 -KPX afii10073 afii10085 -7 -KPX afii10073 afii10089 -13 -KPX afii10073 afii10092 -13 -KPX afii10076 guillemotleft -27 -KPX afii10076 afii10065 -25 -KPX afii10076 afii10066 -25 -KPX afii10076 afii10070 -25 -KPX afii10076 afii10073 -13 -KPX afii10076 afii10077 20 -KPX afii10076 afii10080 -38 -KPX afii10076 afii10083 -38 -KPX afii10076 afii10084 -13 -KPX afii10076 afii10086 -25 -KPX afii10076 afii10089 -13 -KPX afii10076 afii10095 -13 -KPX afii10077 afii10065 12 -KPX afii10077 afii10066 12 -KPX afii10077 afii10070 25 -KPX afii10077 afii10073 12 -KPX afii10077 afii10080 12 -KPX afii10077 afii10083 12 -KPX afii10077 afii10085 -13 -KPX afii10077 afii10086 12 -KPX afii10077 afii10089 -13 -KPX afii10080 afii10066 -13 -KPX afii10080 afii10069 -13 -KPX afii10080 afii10072 -25 -KPX afii10080 afii10073 -13 -KPX afii10080 afii10077 -25 -KPX afii10080 afii10078 -38 -KPX afii10080 afii10085 -20 -KPX afii10080 afii10087 -20 -KPX afii10080 afii10089 -26 -KPX afii10080 afii10095 -13 -KPX afii10080 afii10097 -13 -KPX afii10082 afii10069 -13 -KPX afii10082 afii10072 -25 -KPX afii10082 afii10073 -13 -KPX afii10082 afii10077 -38 -KPX afii10082 afii10078 -50 -KPX afii10082 afii10084 -13 -KPX afii10082 afii10085 -13 -KPX afii10082 afii10087 -20 -KPX afii10082 afii10089 -13 -KPX afii10082 afii10095 -13 -KPX afii10082 afii10097 -13 -KPX afii10083 afii10065 -26 -KPX afii10083 afii10066 -13 -KPX afii10083 afii10070 -13 -KPX afii10083 afii10072 -13 -KPX afii10083 afii10073 -13 -KPX afii10083 afii10080 -25 -KPX afii10083 afii10085 -7 -KPX afii10083 afii10086 -25 -KPX afii10083 afii10087 -13 -KPX afii10083 afii10089 -13 -KPX afii10083 afii10092 -13 -KPX afii10084 comma 25 -KPX afii10084 period 12 -KPX afii10084 afii10065 12 -KPX afii10084 afii10073 12 -KPX afii10084 afii10085 -25 -KPX afii10084 afii10097 12 -KPX afii10085 comma -50 -KPX afii10085 period -63 -KPX afii10085 colon -13 -KPX afii10085 semicolon -38 -KPX afii10085 afii10069 -3 -KPX afii10085 afii10072 -25 -KPX afii10085 afii10073 -13 -KPX afii10085 afii10077 -27 -KPX afii10085 afii10078 -25 -KPX afii10085 afii10082 -13 -KPX afii10085 afii10087 -13 -KPX afii10085 afii10095 -13 -KPX afii10085 afii10097 -15 -KPX afii10086 afii10077 -25 -KPX afii10086 afii10078 -38 -KPX afii10086 afii10080 -13 -KPX afii10086 afii10084 -13 -KPX afii10086 afii10085 -33 -KPX afii10086 afii10089 -13 -KPX afii10086 afii10097 -13 -KPX afii10087 afii10065 -13 -KPX afii10087 afii10066 -25 -KPX afii10087 afii10073 -13 -KPX afii10087 afii10080 -25 -KPX afii10087 afii10083 -25 -KPX afii10087 afii10086 -25 -KPX afii10087 afii10089 -13 -KPX afii10087 afii10092 -25 -KPX afii10087 afii10095 -13 -KPX afii10088 afii10065 12 -KPX afii10088 afii10070 25 -KPX afii10088 afii10073 12 -KPX afii10088 afii10080 12 -KPX afii10088 afii10083 12 -KPX afii10088 afii10085 -13 -KPX afii10091 afii10065 25 -KPX afii10091 afii10070 25 -KPX afii10091 afii10080 12 -KPX afii10091 afii10085 -13 -KPX afii10094 afii10084 -13 -KPX afii10094 afii10089 -38 -KPX afii10095 afii10066 -13 -KPX afii10095 afii10069 -13 -KPX afii10095 afii10072 -25 -KPX afii10095 afii10073 -13 -KPX afii10095 afii10077 -25 -KPX afii10095 afii10078 -38 -KPX afii10095 afii10080 -13 -KPX afii10095 afii10083 -13 -KPX afii10095 afii10084 -13 -KPX afii10095 afii10086 -13 -KPX afii10095 afii10087 -20 -KPX afii10095 afii10097 -25 -KPX afii10096 afii10066 -13 -KPX afii10096 afii10072 -13 -KPX afii10096 afii10077 -25 -KPX afii10096 afii10078 -38 -KPX afii10096 afii10080 -13 -KPX afii10096 afii10083 -13 -KPX afii10096 afii10087 -40 -KPX afii10096 afii10089 -13 -KPX afii10096 afii10095 -13 -KPX afii10110 comma -50 -KPX afii10110 period -63 -KPX afii10110 colon -13 -KPX afii10110 semicolon -38 -KPX afii10110 guillemotleft 12 -KPX afii10110 guillemotright 12 -KPX afii10050 comma -25 -KPX afii10050 period -38 -KPX afii10050 colon 25 -KPX afii10050 guillemotleft 25 -KPX afii10050 guillemotright 25 -KPX pi zeta 16 -EndKernPairs -EndKernData -EndFontMetrics +StartFontMetrics 4.1 +FontName TimesNewRomanPS-ItalicMT +FullName Times New Roman Italic +Notice Typeface The Monotype Corporation plc. Data The Monotype Corporation plc/Type Solutions Inc. 1990-1992. All Rights Reserved +EncodingScheme FontSpecific +FamilyName Times New Roman +Weight Italic +Version Version 2.90 +Characters 940 +ItalicAngle -17.3 +Ascender 891 +Descender -216 +UnderlineThickness 49 +UnderlinePosition -109 +IsFixedPitch false +FontBBox -498 -307 1120 1023 +StartCharMetrics 975 +C 0 ; WX 778 ; N .notdef ; B 125 0 625 625 ; +C 1 ; WX 778 ; N .notdef ; B 125 0 625 625 ; +C 2 ; WX 778 ; N .notdef ; B 125 0 625 625 ; +C 3 ; WX 778 ; N .notdef ; B 125 0 625 625 ; +C 4 ; WX 778 ; N .notdef ; B 125 0 625 625 ; +C 5 ; WX 778 ; N .notdef ; B 125 0 625 625 ; +C 6 ; WX 778 ; N .notdef ; B 125 0 625 625 ; +C 7 ; WX 778 ; N .notdef ; B 125 0 625 625 ; +C 8 ; WX 778 ; N .notdef ; B 125 0 625 625 ; +C 9 ; WX 778 ; N .notdef ; B 125 0 625 625 ; +C 10 ; WX 778 ; N .notdef ; B 125 0 625 625 ; +C 11 ; WX 778 ; N .notdef ; B 125 0 625 625 ; +C 12 ; WX 778 ; N .notdef ; B 125 0 625 625 ; +C 13 ; WX 778 ; N .notdef ; B 125 0 625 625 ; +C 14 ; WX 778 ; N .notdef ; B 125 0 625 625 ; +C 15 ; WX 778 ; N .notdef ; B 125 0 625 625 ; +C 16 ; WX 778 ; N .notdef ; B 125 0 625 625 ; +C 17 ; WX 778 ; N .notdef ; B 125 0 625 625 ; +C 18 ; WX 778 ; N .notdef ; B 125 0 625 625 ; +C 19 ; WX 778 ; N .notdef ; B 125 0 625 625 ; +C 20 ; WX 778 ; N .notdef ; B 125 0 625 625 ; +C 21 ; WX 778 ; N .notdef ; B 125 0 625 625 ; +C 22 ; WX 778 ; N .notdef ; B 125 0 625 625 ; +C 23 ; WX 778 ; N .notdef ; B 125 0 625 625 ; +C 24 ; WX 778 ; N .notdef ; B 125 0 625 625 ; +C 25 ; WX 778 ; N .notdef ; B 125 0 625 625 ; +C 26 ; WX 778 ; N .notdef ; B 125 0 625 625 ; +C 27 ; WX 778 ; N .notdef ; B 125 0 625 625 ; +C 28 ; WX 778 ; N .notdef ; B 125 0 625 625 ; +C 29 ; WX 778 ; N .notdef ; B 125 0 625 625 ; +C 30 ; WX 778 ; N .notdef ; B 125 0 625 625 ; +C 31 ; WX 778 ; N .notdef ; B 125 0 625 625 ; +C 32 ; WX 250 ; N space ; B 75 -16 317 677 ; +C 33 ; WX 333 ; N exclam ; B 75 -16 317 677 ; +C 34 ; WX 420 ; N quotedbl ; B 144 392 452 677 ; +C 35 ; WX 500 ; N numbersign ; B 18 -14 482 677 ; +C 36 ; WX 500 ; N dollar ; B 42 -66 489 700 ; +C 37 ; WX 833 ; N percent ; B 70 -27 817 677 ; +C 38 ; WX 778 ; N ampersand ; B 48 -15 733 677 ; +C 39 ; WX 214 ; N quotesingle ; B 131 392 261 677 ; +C 40 ; WX 333 ; N parenleft ; B 68 -214 442 694 ; +C 41 ; WX 333 ; N parenright ; B -109 -214 265 694 ; +C 42 ; WX 500 ; N asterisk ; B 71 289 430 694 ; +C 43 ; WX 675 ; N plus ; B 18 69 544 595 ; +C 44 ; WX 250 ; N comma ; B -10 -125 133 88 ; +C 45 ; WX 333 ; N hyphen ; B 26 185 299 250 ; +C 46 ; WX 250 ; N period ; B 34 -11 133 87 ; +C 47 ; WX 278 ; N slash ; B -34 -15 381 694 ; +C 48 ; WX 500 ; N zero ; B 60 -12 494 676 ; +C 49 ; WX 500 ; N one ; B 61 0 417 676 ; +C 50 ; WX 500 ; N two ; B 16 0 469 676 ; +C 51 ; WX 500 ; N three ; B 33 -12 454 676 ; +C 52 ; WX 500 ; N four ; B 31 -12 487 662 ; +C 53 ; WX 500 ; N five ; B 36 -12 479 662 ; +C 54 ; WX 500 ; N six ; B 63 -12 525 676 ; +C 55 ; WX 500 ; N seven ; B 113 -12 523 662 ; +C 56 ; WX 500 ; N eight ; B 38 -12 489 676 ; +C 57 ; WX 500 ; N nine ; B 29 -12 491 676 ; +C 58 ; WX 333 ; N colon ; B 60 -9 262 442 ; +C 59 ; WX 333 ; N semicolon ; B 18 -125 264 441 ; +C 60 ; WX 675 ; N less ; B 19 91 544 572 ; +C 61 ; WX 675 ; N equal ; B 18 232 545 431 ; +C 62 ; WX 675 ; N greater ; B 18 91 543 572 ; +C 63 ; WX 500 ; N question ; B 97 -15 458 677 ; +C 64 ; WX 920 ; N at ; B 47 -216 896 694 ; +C 65 ; WX 611 ; N A ; B -49 0 547 677 ; +C 66 ; WX 611 ; N B ; B -23 0 590 662 ; +C 67 ; WX 667 ; N C ; B 67 -15 704 677 ; +C 68 ; WX 722 ; N D ; B -30 0 705 662 ; +C 69 ; WX 611 ; N E ; B -22 0 632 662 ; +C 70 ; WX 611 ; N F ; B -24 0 668 662 ; +C 71 ; WX 722 ; N G ; B 69 -16 725 677 ; +C 72 ; WX 722 ; N H ; B -26 0 811 662 ; +C 73 ; WX 333 ; N I ; B -31 0 410 662 ; +C 74 ; WX 444 ; N J ; B -34 -15 547 662 ; +C 75 ; WX 667 ; N K ; B -27 0 729 662 ; +C 76 ; WX 556 ; N L ; B -32 0 523 662 ; +C 77 ; WX 833 ; N M ; B -33 0 924 662 ; +C 78 ; WX 667 ; N N ; B -28 -15 762 662 ; +C 79 ; WX 722 ; N O ; B 60 -15 718 677 ; +C 80 ; WX 611 ; N P ; B -24 0 621 662 ; +C 81 ; WX 722 ; N Q ; B 47 -211 717 677 ; +C 82 ; WX 611 ; N R ; B -23 0 579 662 ; +C 83 ; WX 500 ; N S ; B 7 -15 542 677 ; +C 84 ; WX 556 ; N T ; B 70 0 649 662 ; +C 85 ; WX 722 ; N U ; B 106 -15 814 662 ; +C 86 ; WX 611 ; N V ; B 125 -15 723 662 ; +C 87 ; WX 833 ; N W ; B 122 -15 944 662 ; +C 88 ; WX 611 ; N X ; B -67 0 741 662 ; +C 89 ; WX 556 ; N Y ; B 90 0 667 662 ; +C 90 ; WX 556 ; N Z ; B -2 0 611 662 ; +C 91 ; WX 389 ; N bracketleft ; B 6 -199 471 677 ; +C 92 ; WX 278 ; N backslash ; B 106 -15 231 694 ; +C 93 ; WX 389 ; N bracketright ; B -100 -199 365 677 ; +C 94 ; WX 422 ; N asciicircum ; B 27 328 460 677 ; +C 95 ; WX 500 ; N underscore ; B -8 -216 509 -175 ; +C 96 ; WX 333 ; N grave ; B 176 517 337 685 ; +C 97 ; WX 500 ; N a ; B 23 -12 469 442 ; +C 98 ; WX 500 ; N b ; B 26 -12 469 694 ; +C 99 ; WX 444 ; N c ; B 29 -12 428 442 ; +C 100 ; WX 500 ; N d ; B 19 -12 541 694 ; +C 101 ; WX 444 ; N e ; B 31 -12 430 442 ; +C 102 ; WX 278 ; N f ; B -172 -216 473 694 ; +C 103 ; WX 500 ; N g ; B -27 -216 521 442 ; +C 104 ; WX 500 ; N h ; B 20 -12 459 694 ; +C 105 ; WX 278 ; N i ; B 43 -12 272 636 ; +C 106 ; WX 278 ; N j ; B -170 -216 280 635 ; +C 107 ; WX 444 ; N k ; B 12 -12 490 694 ; +C 108 ; WX 278 ; N l ; B 39 -12 297 694 ; +C 109 ; WX 722 ; N m ; B 17 -12 679 442 ; +C 110 ; WX 500 ; N n ; B 19 -12 459 442 ; +C 111 ; WX 500 ; N o ; B 29 -12 462 442 ; +C 112 ; WX 500 ; N p ; B -110 -214 473 442 ; +C 113 ; WX 500 ; N q ; B 22 -214 474 442 ; +C 114 ; WX 389 ; N r ; B 19 0 403 442 ; +C 115 ; WX 389 ; N s ; B -9 -12 363 442 ; +C 116 ; WX 278 ; N t ; B 42 -12 300 563 ; +C 117 ; WX 500 ; N u ; B 29 -12 471 442 ; +C 118 ; WX 444 ; N v ; B 21 -12 442 442 ; +C 119 ; WX 667 ; N w ; B 17 -12 662 442 ; +C 120 ; WX 444 ; N x ; B -33 -12 439 442 ; +C 121 ; WX 444 ; N y ; B -78 -216 440 442 ; +C 122 ; WX 389 ; N z ; B -30 0 392 430 ; +C 123 ; WX 400 ; N braceleft ; B 109 -216 515 694 ; +C 124 ; WX 275 ; N bar ; B 79 -216 119 694 ; +C 125 ; WX 400 ; N braceright ; B -34 -216 372 694 ; +C 126 ; WX 541 ; N asciitilde ; B 21 194 542 331 ; +C 127 ; WX 778 ; N .notdef ; B 125 0 625 625 ; +C 128 ; WX 500 ; N Euro ; B 8 -12 586 676 ; +C 129 ; WX 569 ; N afii10052 ; B -36 0 664 871 ; +C 130 ; WX 333 ; N quotesinglbase ; B 32 -125 175 88 ; +C 131 ; WX 500 ; N florin ; B 1 -210 488 677 ; +C 132 ; WX 556 ; N quotedblbase ; B 15 -128 381 88 ; +C 133 ; WX 889 ; N ellipsis ; B 130 -14 755 95 ; +C 134 ; WX 500 ; N dagger ; B 108 -203 521 677 ; +C 135 ; WX 500 ; N daggerdbl ; B -14 -216 504 694 ; +C 136 ; WX 333 ; N circumflex ; B 124 523 386 677 ; +C 137 ; WX 1000 ; N perthousand ; B 62 -26 986 677 ; +C 138 ; WX 500 ; N Scaron ; B 7 -15 546 863 ; +C 139 ; WX 333 ; N guilsinglleft ; B 57 -15 312 449 ; +C 140 ; WX 944 ; N OE ; B 22 -7 969 668 ; +C 141 ; WX 664 ; N afii10061 ; B -28 0 723 880 ; +C 142 ; WX 556 ; N Zcaron ; B -2 0 611 863 ; +C 143 ; WX 722 ; N afii10145 ; B -25 -196 812 662 ; +C 144 ; WX 556 ; N quotedblbase ; B 15 -128 381 88 ; +C 145 ; WX 333 ; N quoteleft ; B 212 464 355 677 ; +C 146 ; WX 333 ; N quoteright ; B 196 464 339 677 ; +C 147 ; WX 556 ; N quotedblleft ; B 192 461 559 677 ; +C 148 ; WX 556 ; N quotedblright ; B 182 461 549 678 ; +C 149 ; WX 350 ; N bullet ; B 55 208 300 453 ; +C 150 ; WX 500 ; N endash ; B -9 221 508 257 ; +C 151 ; WX 889 ; N emdash ; B -9 221 898 257 ; +C 152 ; WX 333 ; N tilde ; B 97 538 409 667 ; +C 153 ; WX 980 ; N trademark ; B 15 268 963 662 ; +C 154 ; WX 389 ; N scaron ; B -9 -12 412 677 ; +C 155 ; WX 333 ; N guilsinglright ; B 22 -15 277 449 ; +C 156 ; WX 667 ; N oe ; B 26 -12 648 442 ; +C 157 ; WX 468 ; N afii10109 ; B 18 0 465 685 ; +C 158 ; WX 389 ; N zcaron ; B -30 0 412 677 ; +C 159 ; WX 556 ; N Ydieresis ; B 90 0 667 836 ; +C 160 ; WX 250 ; N space ; B 75 -16 317 677 ; +C 161 ; WX 389 ; N exclamdown ; B 70 -216 313 478 ; +C 162 ; WX 500 ; N cent ; B 56 -184 453 636 ; +C 163 ; WX 500 ; N sterling ; B 24 -15 524 676 ; +C 164 ; WX 500 ; N currency ; B 13 97 486 567 ; +C 165 ; WX 500 ; N yen ; B -7 0 623 662 ; +C 166 ; WX 275 ; N brokenbar ; B 79 -216 119 694 ; +C 167 ; WX 500 ; N section ; B -2 -203 510 683 ; +C 168 ; WX 333 ; N dieresis ; B 131 549 409 654 ; +C 169 ; WX 760 ; N copyright ; B 34 -15 727 677 ; +C 170 ; WX 276 ; N ordfeminine ; B 87 405 376 677 ; +C 171 ; WX 500 ; N guillemotleft ; B 41 -15 482 449 ; +C 172 ; WX 675 ; N logicalnot ; B 18 230 545 429 ; +C 173 ; WX 333 ; N hyphen ; B 26 185 299 250 ; +C 174 ; WX 760 ; N registered ; B 34 -15 727 677 ; +C 175 ; WX 500 ; N overscore ; B -8 714 509 755 ; +C 176 ; WX 400 ; N degree ; B 48 376 348 677 ; +C 177 ; WX 549 ; N plusminus ; B 11 69 538 595 ; +C 178 ; WX 300 ; N twosuperior ; B 54 323 333 676 ; +C 179 ; WX 300 ; N threesuperior ; B 64 317 324 676 ; +C 180 ; WX 333 ; N acute ; B 200 517 360 685 ; +C 181 ; WX 576 ; N mu1 ; B -22 -215 519 430 ; +C 182 ; WX 523 ; N paragraph ; B -7 -216 455 662 ; +C 183 ; WX 250 ; N periodcentered ; B 71 277 179 385 ; +C 184 ; WX 333 ; N cedilla ; B -18 -181 165 15 ; +C 185 ; WX 300 ; N onesuperior ; B 80 323 304 676 ; +C 186 ; WX 310 ; N ordmasculine ; B 111 405 393 677 ; +C 187 ; WX 500 ; N guillemotright ; B 18 -15 459 449 ; +C 188 ; WX 750 ; N onequarter ; B 79 -27 700 676 ; +C 189 ; WX 750 ; N onehalf ; B 79 -27 688 676 ; +C 190 ; WX 750 ; N threequarters ; B 63 -27 700 676 ; +C 191 ; WX 500 ; N questiondown ; B 36 -216 397 477 ; +C 192 ; WX 611 ; N Agrave ; B -49 0 583 880 ; +C 193 ; WX 611 ; N Aacute ; B -49 0 618 880 ; +C 194 ; WX 611 ; N Acircumflex ; B -49 0 621 863 ; +C 195 ; WX 611 ; N Atilde ; B -49 0 668 847 ; +C 196 ; WX 611 ; N Adieresis ; B -49 0 669 836 ; +C 197 ; WX 611 ; N Aring ; B -49 0 606 840 ; +C 198 ; WX 889 ; N AE ; B -53 0 909 662 ; +C 199 ; WX 667 ; N Ccedilla ; B 67 -181 704 677 ; +C 200 ; WX 611 ; N Egrave ; B -22 0 632 880 ; +C 201 ; WX 611 ; N Eacute ; B -22 0 632 880 ; +C 202 ; WX 611 ; N Ecircumflex ; B -22 0 632 863 ; +C 203 ; WX 611 ; N Edieresis ; B -22 0 632 836 ; +C 204 ; WX 333 ; N Igrave ; B -31 0 410 880 ; +C 205 ; WX 333 ; N Iacute ; B -31 0 410 880 ; +C 206 ; WX 333 ; N Icircumflex ; B -31 0 421 863 ; +C 207 ; WX 333 ; N Idieresis ; B -31 0 446 836 ; +C 208 ; WX 722 ; N Eth ; B -23 0 711 662 ; +C 209 ; WX 667 ; N Ntilde ; B -28 -15 762 847 ; +C 210 ; WX 722 ; N Ograve ; B 60 -15 718 880 ; +C 211 ; WX 722 ; N Oacute ; B 60 -15 718 880 ; +C 212 ; WX 722 ; N Ocircumflex ; B 60 -15 718 863 ; +C 213 ; WX 722 ; N Otilde ; B 60 -15 718 847 ; +C 214 ; WX 722 ; N Odieresis ; B 60 -15 718 836 ; +C 215 ; WX 675 ; N multiply ; B 81 132 481 533 ; +C 216 ; WX 722 ; N Oslash ; B 35 -35 737 689 ; +C 217 ; WX 722 ; N Ugrave ; B 106 -15 814 880 ; +C 218 ; WX 722 ; N Uacute ; B 106 -15 814 880 ; +C 219 ; WX 722 ; N Ucircumflex ; B 106 -15 814 863 ; +C 220 ; WX 722 ; N Udieresis ; B 106 -15 814 836 ; +C 221 ; WX 556 ; N Yacute ; B 90 0 667 880 ; +C 222 ; WX 611 ; N Thorn ; B -24 0 605 662 ; +C 223 ; WX 500 ; N germandbls ; B -161 -216 498 694 ; +C 224 ; WX 500 ; N agrave ; B 23 -12 469 685 ; +C 225 ; WX 500 ; N aacute ; B 23 -12 469 685 ; +C 226 ; WX 500 ; N acircumflex ; B 23 -12 469 677 ; +C 227 ; WX 500 ; N atilde ; B 23 -12 493 667 ; +C 228 ; WX 500 ; N adieresis ; B 23 -12 494 654 ; +C 229 ; WX 500 ; N aring ; B 23 -12 469 694 ; +C 230 ; WX 667 ; N ae ; B 22 -12 652 442 ; +C 231 ; WX 444 ; N ccedilla ; B 29 -181 428 442 ; +C 232 ; WX 444 ; N egrave ; B 31 -12 430 685 ; +C 233 ; WX 444 ; N eacute ; B 31 -12 430 685 ; +C 234 ; WX 444 ; N ecircumflex ; B 31 -12 443 677 ; +C 235 ; WX 444 ; N edieresis ; B 31 -12 468 654 ; +C 236 ; WX 278 ; N igrave ; B 43 -12 276 685 ; +C 237 ; WX 278 ; N iacute ; B 43 -12 334 685 ; +C 238 ; WX 278 ; N icircumflex ; B 43 -12 342 677 ; +C 239 ; WX 278 ; N idieresis ; B 43 -12 367 654 ; +C 240 ; WX 500 ; N eth ; B 27 -12 481 692 ; +C 241 ; WX 500 ; N ntilde ; B 19 -12 493 667 ; +C 242 ; WX 500 ; N ograve ; B 29 -12 462 685 ; +C 243 ; WX 500 ; N oacute ; B 29 -12 462 685 ; +C 244 ; WX 500 ; N ocircumflex ; B 29 -12 469 677 ; +C 245 ; WX 500 ; N otilde ; B 29 -12 493 667 ; +C 246 ; WX 500 ; N odieresis ; B 29 -12 494 654 ; +C 247 ; WX 549 ; N divide ; B 11 136 538 525 ; +C 248 ; WX 500 ; N oslash ; B 2 -36 489 471 ; +C 249 ; WX 500 ; N ugrave ; B 29 -12 471 685 ; +C 250 ; WX 500 ; N uacute ; B 29 -12 471 685 ; +C 251 ; WX 500 ; N ucircumflex ; B 29 -12 471 677 ; +C 252 ; WX 500 ; N udieresis ; B 29 -12 482 654 ; +C 253 ; WX 444 ; N yacute ; B -78 -216 440 685 ; +C 254 ; WX 500 ; N thorn ; B -110 -216 473 694 ; +C 255 ; WX 444 ; N ydieresis ; B -78 -216 450 654 ; +C -1 ; WX 0 ; N .null ; B 75 -16 317 677 ; +C -1 ; WX 250 ; N nonmarkingreturn ; B 75 -16 317 677 ; +C -1 ; WX 549 ; N notequal ; B 12 -132 537 660 ; +C -1 ; WX 713 ; N infinity ; B 24 52 685 461 ; +C -1 ; WX 549 ; N lessequal ; B 12 -80 537 605 ; +C -1 ; WX 549 ; N greaterequal ; B 12 -80 537 605 ; +C -1 ; WX 494 ; N partialdiff ; B 29 -15 484 694 ; +C -1 ; WX 713 ; N summation ; B 21 -216 693 693 ; +C -1 ; WX 823 ; N product ; B 22 -216 801 693 ; +C -1 ; WX 549 ; N pi1 ; B 35 -12 520 430 ; +C -1 ; WX 274 ; N integral ; B -1 -107 272 910 ; +C -1 ; WX 768 ; N Ohm ; B 35 0 734 675 ; +C -1 ; WX 549 ; N radical ; B 42 -38 550 913 ; +C -1 ; WX 549 ; N approxequal ; B 15 133 535 508 ; +C -1 ; WX 612 ; N increment ; B 14 0 600 677 ; +C -1 ; WX 494 ; N lozenge ; B 23 0 472 694 ; +C -1 ; WX 167 ; N fraction ; B -167 -27 333 676 ; +C -1 ; WX 500 ; N fi ; B -189 -216 500 694 ; +C -1 ; WX 500 ; N fl ; B -189 -216 550 694 ; +C -1 ; WX 278 ; N dotlessi ; B 43 -12 230 442 ; +C -1 ; WX 333 ; N macron ; B 120 596 431 658 ; +C -1 ; WX 333 ; N breve ; B 144 543 421 687 ; +C -1 ; WX 333 ; N dotaccent ; B 219 550 324 654 ; +C -1 ; WX 333 ; N ring ; B 186 509 371 694 ; +C -1 ; WX 333 ; N hungarumlaut ; B 148 517 451 685 ; +C -1 ; WX 333 ; N ogonek ; B 38 -185 262 0 ; +C -1 ; WX 333 ; N caron ; B 165 523 427 677 ; +C -1 ; WX 556 ; N Lslash ; B -28 0 523 662 ; +C -1 ; WX 278 ; N lslash ; B 25 -12 300 694 ; +C -1 ; WX 675 ; N minus ; B 18 313 544 353 ; +C -1 ; WX 500 ; N franc ; B -24 0 554 662 ; +C -1 ; WX 722 ; N Gbreve ; B 69 -16 725 863 ; +C -1 ; WX 500 ; N gbreve ; B -27 -216 521 687 ; +C -1 ; WX 333 ; N Idot ; B -31 0 410 840 ; +C -1 ; WX 500 ; N Scedilla ; B 7 -181 542 677 ; +C -1 ; WX 389 ; N scedilla ; B -9 -181 363 442 ; +C -1 ; WX 667 ; N Cacute ; B 67 -15 704 880 ; +C -1 ; WX 444 ; N cacute ; B 29 -12 429 685 ; +C -1 ; WX 667 ; N Ccaron ; B 67 -15 704 863 ; +C -1 ; WX 444 ; N ccaron ; B 29 -12 513 677 ; +C -1 ; WX 500 ; N dmacron ; B 19 -12 587 694 ; +C -1 ; WX 333 ; N middot ; B 241 291 344 393 ; +C -1 ; WX 611 ; N Abreve ; B -49 0 689 864 ; +C -1 ; WX 500 ; N abreve ; B 23 -12 480 687 ; +C -1 ; WX 611 ; N Aogonek ; B -49 -186 551 677 ; +C -1 ; WX 500 ; N aogonek ; B 23 -185 489 442 ; +C -1 ; WX 722 ; N Dcaron ; B -30 0 705 863 ; +C -1 ; WX 608 ; N dcaron ; B 19 -12 696 694 ; +C -1 ; WX 722 ; N Dslash ; B -23 0 711 662 ; +C -1 ; WX 611 ; N Eogonek ; B -22 -185 632 662 ; +C -1 ; WX 444 ; N eogonek ; B 31 -185 430 442 ; +C -1 ; WX 611 ; N Ecaron ; B -22 0 632 863 ; +C -1 ; WX 444 ; N ecaron ; B 31 -12 508 677 ; +C -1 ; WX 556 ; N Lacute ; B -32 0 523 880 ; +C -1 ; WX 278 ; N lacute ; B 39 -12 368 880 ; +C -1 ; WX 556 ; N Lcaron ; B -32 0 601 677 ; +C -1 ; WX 364 ; N lcaron ; B 38 -12 452 694 ; +C -1 ; WX 556 ; N Ldot ; B -32 0 523 662 ; +C -1 ; WX 323 ; N ldot ; B 39 -12 379 694 ; +C -1 ; WX 667 ; N Nacute ; B -28 -15 762 880 ; +C -1 ; WX 500 ; N nacute ; B 19 -12 459 685 ; +C -1 ; WX 667 ; N Ncaron ; B -28 -15 762 863 ; +C -1 ; WX 500 ; N ncaron ; B 19 -12 459 677 ; +C -1 ; WX 722 ; N Odblacute ; B 60 -15 720 880 ; +C -1 ; WX 500 ; N odblacute ; B 29 -12 542 685 ; +C -1 ; WX 611 ; N Racute ; B -23 0 579 880 ; +C -1 ; WX 389 ; N racute ; B 19 0 403 685 ; +C -1 ; WX 611 ; N Rcaron ; B -23 0 579 863 ; +C -1 ; WX 389 ; N rcaron ; B 19 0 429 677 ; +C -1 ; WX 500 ; N Sacute ; B 7 -15 542 880 ; +C -1 ; WX 389 ; N sacute ; B -9 -12 377 685 ; +C -1 ; WX 556 ; N Tcedilla ; B 70 -217 649 662 ; +C -1 ; WX 278 ; N tcedilla ; B -17 -217 300 563 ; +C -1 ; WX 556 ; N Tcaron ; B 70 0 649 863 ; +C -1 ; WX 364 ; N tcaron ; B 42 -12 452 694 ; +C -1 ; WX 722 ; N Uring ; B 106 -15 814 883 ; +C -1 ; WX 500 ; N uring ; B 29 -12 471 694 ; +C -1 ; WX 722 ; N Udblacute ; B 106 -15 814 880 ; +C -1 ; WX 500 ; N udblacute ; B 29 -12 522 685 ; +C -1 ; WX 556 ; N Zacute ; B -2 0 611 880 ; +C -1 ; WX 389 ; N zacute ; B -30 0 392 685 ; +C -1 ; WX 556 ; N Zdot ; B -2 0 611 835 ; +C -1 ; WX 389 ; N zdot ; B -30 0 392 654 ; +C -1 ; WX 569 ; N Gamma ; B -36 0 664 662 ; +C -1 ; WX 722 ; N Theta ; B 61 -15 719 677 ; +C -1 ; WX 761 ; N Phi ; B 77 0 748 662 ; +C -1 ; WX 525 ; N alpha ; B 29 -12 501 442 ; +C -1 ; WX 465 ; N delta ; B 23 -12 462 694 ; +C -1 ; WX 394 ; N epsilon ; B 11 -12 391 442 ; +C -1 ; WX 493 ; N sigma ; B 26 -12 527 430 ; +C -1 ; WX 358 ; N tau ; B 25 -12 390 430 ; +C -1 ; WX 553 ; N phi ; B 36 -214 513 442 ; +C -1 ; WX 500 ; N underscoredbl ; B -8 -216 509 -98 ; +C -1 ; WX 573 ; N exclamdbl ; B 75 -16 557 677 ; +C -1 ; WX 315 ; N nsuperior ; B 10 271 292 545 ; +C -1 ; WX 990 ; N peseta ; B 23 -12 979 662 ; +C -1 ; WX 1000 ; N arrowleft ; B 39 77 961 428 ; +C -1 ; WX 500 ; N arrowup ; B 75 -209 426 654 ; +C -1 ; WX 1000 ; N arrowright ; B 39 77 961 428 ; +C -1 ; WX 500 ; N arrowdown ; B 75 -209 426 654 ; +C -1 ; WX 1000 ; N arrowboth ; B 39 77 961 429 ; +C -1 ; WX 500 ; N arrowupdn ; B 74 -208 425 714 ; +C -1 ; WX 500 ; N arrowupdnbse ; B 74 -303 425 714 ; +C -1 ; WX 979 ; N orthogonal ; B 177 0 802 625 ; +C -1 ; WX 722 ; N intersection ; B 94 0 625 676 ; +C -1 ; WX 675 ; N equivalence ; B 19 152 545 511 ; +C -1 ; WX 600 ; N house ; B 75 0 525 563 ; +C -1 ; WX 675 ; N revlogicalnot ; B 19 230 546 429 ; +C -1 ; WX 604 ; N integraltp ; B 267 -251 477 848 ; +C -1 ; WX 604 ; N integralbt ; B 127 -251 337 848 ; +C -1 ; WX 708 ; N SF100000 ; B -11 261 719 346 ; +C -1 ; WX 616 ; N SF110000 ; B 219 -303 304 910 ; +C -1 ; WX 708 ; N SF010000 ; B 312 -303 720 346 ; +C -1 ; WX 708 ; N SF030000 ; B -11 -303 396 346 ; +C -1 ; WX 708 ; N SF020000 ; B 312 261 720 910 ; +C -1 ; WX 708 ; N SF040000 ; B -11 261 396 910 ; +C -1 ; WX 708 ; N SF080000 ; B 312 -303 720 910 ; +C -1 ; WX 708 ; N SF090000 ; B -11 -303 396 910 ; +C -1 ; WX 708 ; N SF060000 ; B -11 -303 719 346 ; +C -1 ; WX 708 ; N SF070000 ; B -11 261 719 910 ; +C -1 ; WX 708 ; N SF050000 ; B -11 -303 719 910 ; +C -1 ; WX 708 ; N SF430000 ; B 0 168 730 439 ; +C -1 ; WX 708 ; N SF240000 ; B 0 -303 271 910 ; +C -1 ; WX 708 ; N SF510000 ; B 0 -303 408 439 ; +C -1 ; WX 708 ; N SF520000 ; B 0 -303 501 346 ; +C -1 ; WX 708 ; N SF390000 ; B 0 -303 500 439 ; +C -1 ; WX 708 ; N SF220000 ; B 0 -303 408 439 ; +C -1 ; WX 708 ; N SF210000 ; B 0 -303 500 346 ; +C -1 ; WX 708 ; N SF250000 ; B 0 -303 500 439 ; +C -1 ; WX 708 ; N SF500000 ; B 0 168 408 910 ; +C -1 ; WX 708 ; N SF490000 ; B 0 261 501 910 ; +C -1 ; WX 708 ; N SF380000 ; B 0 168 500 910 ; +C -1 ; WX 708 ; N SF280000 ; B 0 168 408 910 ; +C -1 ; WX 708 ; N SF270000 ; B 0 261 500 910 ; +C -1 ; WX 708 ; N SF260000 ; B 0 168 500 910 ; +C -1 ; WX 708 ; N SF360000 ; B 0 -303 408 910 ; +C -1 ; WX 708 ; N SF370000 ; B 0 -303 501 910 ; +C -1 ; WX 708 ; N SF420000 ; B 0 -303 501 910 ; +C -1 ; WX 708 ; N SF190000 ; B 0 -303 408 910 ; +C -1 ; WX 708 ; N SF200000 ; B 0 -303 500 910 ; +C -1 ; WX 708 ; N SF230000 ; B 0 -303 500 910 ; +C -1 ; WX 708 ; N SF470000 ; B 0 -303 730 439 ; +C -1 ; WX 708 ; N SF480000 ; B 0 -303 730 346 ; +C -1 ; WX 708 ; N SF410000 ; B 0 -303 730 439 ; +C -1 ; WX 708 ; N SF450000 ; B 0 168 730 910 ; +C -1 ; WX 708 ; N SF460000 ; B 0 261 730 910 ; +C -1 ; WX 708 ; N SF400000 ; B 0 168 730 910 ; +C -1 ; WX 708 ; N SF540000 ; B 0 -303 730 910 ; +C -1 ; WX 708 ; N SF530000 ; B 0 -303 730 910 ; +C -1 ; WX 708 ; N SF440000 ; B 0 -303 730 910 ; +C -1 ; WX 708 ; N upblock ; B 0 303 730 910 ; +C -1 ; WX 708 ; N dnblock ; B 0 -303 730 303 ; +C -1 ; WX 708 ; N block ; B 0 -303 730 910 ; +C -1 ; WX 708 ; N lfblock ; B 0 -303 365 910 ; +C -1 ; WX 708 ; N rtblock ; B 0 -303 365 910 ; +C -1 ; WX 708 ; N ltshade ; B 50 -246 719 910 ; +C -1 ; WX 708 ; N shade ; B -11 -246 719 910 ; +C -1 ; WX 729 ; N dkshade ; B 0 -307 729 910 ; +C -1 ; WX 604 ; N filledbox ; B 0 0 461 461 ; +C -1 ; WX 1000 ; N filledrect ; B 0 155 1000 343 ; +C -1 ; WX 990 ; N triagup ; B 0 0 693 693 ; +C -1 ; WX 990 ; N triagrt ; B 0 -15 708 692 ; +C -1 ; WX 990 ; N triagdn ; B 0 -15 693 678 ; +C -1 ; WX 990 ; N triaglf ; B 141 -15 849 692 ; +C -1 ; WX 604 ; N circle ; B 0 67 430 497 ; +C -1 ; WX 604 ; N invbullet ; B 0 0 479 479 ; +C -1 ; WX 604 ; N invcircle ; B 0 0 564 564 ; +C -1 ; WX 1021 ; N smileface ; B 199 -58 822 564 ; +C -1 ; WX 1052 ; N invsmileface ; B 215 -58 838 564 ; +C -1 ; WX 917 ; N sun ; B 0 -109 901 792 ; +C -1 ; WX 750 ; N female ; B 119 -214 630 736 ; +C -1 ; WX 750 ; N male ; B 54 -128 691 791 ; +C -1 ; WX 531 ; N spade ; B 0 0 475 601 ; +C -1 ; WX 656 ; N club ; B 27 0 629 601 ; +C -1 ; WX 594 ; N heart ; B 0 -12 532 601 ; +C -1 ; WX 510 ; N diamond ; B 0 -12 448 601 ; +C -1 ; WX 500 ; N musicalnote ; B 18 -18 482 666 ; +C -1 ; WX 750 ; N musicalnotedbl ; B 42 -63 649 742 ; +C -1 ; WX 750 ; N IJ ; B -31 -15 828 662 ; +C -1 ; WX 500 ; N ij ; B 37 -216 501 636 ; +C -1 ; WX 577 ; N napostrophe ; B 69 -12 538 677 ; +C -1 ; WX 219 ; N minute ; B 131 392 261 677 ; +C -1 ; WX 417 ; N second ; B 144 392 452 677 ; +C -1 ; WX 833 ; N afii61248 ; B 53 -26 804 677 ; +C -1 ; WX 417 ; N afii61289 ; B 15 -12 432 677 ; +C -1 ; WX 604 ; N H22073 ; B 71 0 532 461 ; +C -1 ; WX 354 ; N H18543 ; B 64 217 290 444 ; +C -1 ; WX 354 ; N H18551 ; B 64 217 290 444 ; +C -1 ; WX 604 ; N H18533 ; B 87 67 517 497 ; +C -1 ; WX 354 ; N openbullet ; B 55 208 300 453 ; +C -1 ; WX 611 ; N Amacron ; B -49 0 673 799 ; +C -1 ; WX 500 ; N amacron ; B 23 -12 502 614 ; +C -1 ; WX 667 ; N Ccircumflex ; B 67 -15 704 863 ; +C -1 ; WX 444 ; N ccircumflex ; B 29 -12 441 677 ; +C -1 ; WX 667 ; N Cdot ; B 67 -15 704 840 ; +C -1 ; WX 444 ; N cdot ; B 29 -12 428 608 ; +C -1 ; WX 611 ; N Emacron ; B -22 0 632 799 ; +C -1 ; WX 444 ; N emacron ; B 31 -12 473 614 ; +C -1 ; WX 611 ; N Ebreve ; B -22 0 632 873 ; +C -1 ; WX 444 ; N ebreve ; B 31 -12 491 687 ; +C -1 ; WX 611 ; N Edot ; B -22 0 632 840 ; +C -1 ; WX 444 ; N edot ; B 31 -12 430 654 ; +C -1 ; WX 722 ; N Gcircumflex ; B 69 -16 725 863 ; +C -1 ; WX 500 ; N gcircumflex ; B -27 -216 521 677 ; +C -1 ; WX 722 ; N Gdot ; B 69 -16 725 840 ; +C -1 ; WX 500 ; N gdot ; B -27 -216 521 654 ; +C -1 ; WX 722 ; N Gcedilla ; B 69 -181 725 677 ; +C -1 ; WX 500 ; N gcedilla ; B -27 -216 521 720 ; +C -1 ; WX 722 ; N Hcircumflex ; B -26 0 811 863 ; +C -1 ; WX 500 ; N hcircumflex ; B 20 -12 523 863 ; +C -1 ; WX 722 ; N Hbar ; B -26 0 811 662 ; +C -1 ; WX 500 ; N hbar ; B 20 -12 459 694 ; +C -1 ; WX 333 ; N Itilde ; B -31 0 468 853 ; +C -1 ; WX 278 ; N itilde ; B 43 -12 386 667 ; +C -1 ; WX 333 ; N Imacron ; B -31 0 465 799 ; +C -1 ; WX 278 ; N imacron ; B 43 -12 371 614 ; +C -1 ; WX 333 ; N Ibreve ; B -31 0 484 873 ; +C -1 ; WX 278 ; N ibreve ; B 43 -12 386 687 ; +C -1 ; WX 333 ; N Iogonek ; B -31 -185 410 662 ; +C -1 ; WX 278 ; N iogonek ; B 25 -185 272 636 ; +C -1 ; WX 444 ; N Jcircumflex ; B -34 -15 566 863 ; +C -1 ; WX 278 ; N jcircumflex ; B -172 -216 333 677 ; +C -1 ; WX 667 ; N Kcedilla ; B -27 -181 729 662 ; +C -1 ; WX 444 ; N kcedilla ; B 12 -181 490 694 ; +C -1 ; WX 444 ; N kgreenlandic ; B 10 -12 488 442 ; +C -1 ; WX 556 ; N Lcedilla ; B -32 -181 523 662 ; +C -1 ; WX 278 ; N lcedilla ; B -41 -181 297 694 ; +C -1 ; WX 667 ; N Ncedilla ; B -28 -181 762 662 ; +C -1 ; WX 500 ; N ncedilla ; B 19 -181 459 442 ; +C -1 ; WX 696 ; N Eng ; B -31 -15 690 677 ; +C -1 ; WX 482 ; N eng ; B 19 -216 445 442 ; +C -1 ; WX 722 ; N Omacron ; B 60 -15 718 799 ; +C -1 ; WX 500 ; N omacron ; B 29 -12 499 614 ; +C -1 ; WX 722 ; N Obreve ; B 60 -15 718 873 ; +C -1 ; WX 500 ; N obreve ; B 29 -12 510 687 ; +C -1 ; WX 611 ; N Rcedilla ; B -23 -181 579 662 ; +C -1 ; WX 389 ; N rcedilla ; B 11 -181 403 442 ; +C -1 ; WX 500 ; N Scircumflex ; B 7 -15 542 863 ; +C -1 ; WX 389 ; N scircumflex ; B -9 -12 401 677 ; +C -1 ; WX 556 ; N Tbar ; B 72 0 651 662 ; +C -1 ; WX 278 ; N tbar ; B 24 -12 298 563 ; +C -1 ; WX 722 ; N Utilde ; B 106 -15 814 853 ; +C -1 ; WX 500 ; N utilde ; B 29 -12 492 667 ; +C -1 ; WX 722 ; N Umacron ; B 106 -15 814 799 ; +C -1 ; WX 500 ; N umacron ; B 29 -12 491 614 ; +C -1 ; WX 722 ; N Ubreve ; B 106 -15 814 873 ; +C -1 ; WX 500 ; N ubreve ; B 29 -12 497 687 ; +C -1 ; WX 722 ; N Uogonek ; B 106 -185 814 662 ; +C -1 ; WX 500 ; N uogonek ; B 29 -185 528 442 ; +C -1 ; WX 833 ; N Wcircumflex ; B 122 -15 944 863 ; +C -1 ; WX 667 ; N wcircumflex ; B 17 -12 662 677 ; +C -1 ; WX 556 ; N Ycircumflex ; B 90 0 667 863 ; +C -1 ; WX 444 ; N ycircumflex ; B -78 -216 440 677 ; +C -1 ; WX 278 ; N longs ; B -173 -216 472 695 ; +C -1 ; WX 611 ; N Aringacute ; B -49 0 681 1023 ; +C -1 ; WX 500 ; N aringacute ; B 23 -12 517 896 ; +C -1 ; WX 889 ; N AEacute ; B -53 0 909 871 ; +C -1 ; WX 667 ; N aeacute ; B 22 -12 652 685 ; +C -1 ; WX 722 ; N Oslashacute ; B 35 -35 737 871 ; +C -1 ; WX 500 ; N oslashacute ; B 2 -36 489 685 ; +C -1 ; WX 333 ; N anoteleia ; B 163 343 262 442 ; +C -1 ; WX 833 ; N Wgrave ; B 122 -15 944 871 ; +C -1 ; WX 667 ; N wgrave ; B 17 -12 662 685 ; +C -1 ; WX 833 ; N Wacute ; B 122 -15 944 871 ; +C -1 ; WX 667 ; N wacute ; B 17 -12 662 685 ; +C -1 ; WX 833 ; N Wdieresis ; B 122 -15 944 840 ; +C -1 ; WX 667 ; N wdieresis ; B 17 -12 662 654 ; +C -1 ; WX 556 ; N Ygrave ; B 90 0 667 871 ; +C -1 ; WX 444 ; N ygrave ; B -78 -216 440 685 ; +C -1 ; WX 333 ; N quotereversed ; B 217 458 332 677 ; +C -1 ; WX 333 ; N radicalex ; B 89 569 459 631 ; +C -1 ; WX 500 ; N afii08941 ; B 24 -15 524 676 ; +C -1 ; WX 600 ; N estimated ; B 44 -17 561 535 ; +C -1 ; WX 750 ; N oneeighth ; B 79 -27 700 676 ; +C -1 ; WX 750 ; N threeeighths ; B 63 -27 700 676 ; +C -1 ; WX 750 ; N fiveeighths ; B 64 -27 700 676 ; +C -1 ; WX 750 ; N seveneighths ; B 113 -27 700 676 ; +C -1 ; WX 333 ; N commaaccent ; B 37 -217 181 -38 ; +C -1 ; WX 333 ; N undercommaaccent ; B -3 -181 180 -22 ; +C -1 ; WX 333 ; N tonos ; B 200 517 360 685 ; +C -1 ; WX 333 ; N dieresistonos ; B 88 517 442 685 ; +C -1 ; WX 611 ; N Alphatonos ; B -49 0 547 685 ; +C -1 ; WX 679 ; N Epsilontonos ; B 45 0 700 685 ; +C -1 ; WX 792 ; N Etatonos ; B 43 0 881 685 ; +C -1 ; WX 402 ; N Iotatonos ; B 38 0 479 685 ; +C -1 ; WX 722 ; N Omicrontonos ; B 60 -15 718 685 ; +C -1 ; WX 660 ; N Upsilontonos ; B 46 0 771 685 ; +C -1 ; WX 726 ; N Omegatonos ; B 16 0 727 685 ; +C -1 ; WX 278 ; N iotadieresistonos ; B 41 -12 395 685 ; +C -1 ; WX 611 ; N Alpha ; B -49 0 547 677 ; +C -1 ; WX 611 ; N Beta ; B -23 0 590 662 ; +C -1 ; WX 587 ; N Delta ; B -43 0 511 677 ; +C -1 ; WX 611 ; N Epsilon ; B -22 0 632 662 ; +C -1 ; WX 556 ; N Zeta ; B -2 0 611 662 ; +C -1 ; WX 722 ; N Eta ; B -26 0 811 662 ; +C -1 ; WX 333 ; N Iota ; B -31 0 410 662 ; +C -1 ; WX 667 ; N Kappa ; B -27 0 729 662 ; +C -1 ; WX 604 ; N Lambda ; B -55 0 543 677 ; +C -1 ; WX 833 ; N Mu ; B -33 0 924 662 ; +C -1 ; WX 667 ; N Nu ; B -28 -15 762 662 ; +C -1 ; WX 639 ; N Xi ; B -7 0 688 662 ; +C -1 ; WX 722 ; N Omicron ; B 60 -15 718 677 ; +C -1 ; WX 722 ; N Pi ; B -29 0 806 662 ; +C -1 ; WX 611 ; N Rho ; B -24 0 621 662 ; +C -1 ; WX 594 ; N Sigma ; B -35 0 655 662 ; +C -1 ; WX 556 ; N Tau ; B 70 0 649 662 ; +C -1 ; WX 556 ; N Upsilon ; B 90 0 667 662 ; +C -1 ; WX 611 ; N Chi ; B -67 0 741 662 ; +C -1 ; WX 703 ; N Psi ; B 134 0 808 670 ; +C -1 ; WX 723 ; N Omega ; B 13 0 725 677 ; +C -1 ; WX 333 ; N Iotadieresis ; B -31 0 446 836 ; +C -1 ; WX 556 ; N Upsilondieresis ; B 90 0 667 836 ; +C -1 ; WX 525 ; N alphatonos ; B 29 -12 501 685 ; +C -1 ; WX 394 ; N epsilontonos ; B 11 -12 391 685 ; +C -1 ; WX 496 ; N etatonos ; B 28 -214 454 685 ; +C -1 ; WX 278 ; N iotatonos ; B 43 -12 334 685 ; +C -1 ; WX 459 ; N upsilondieresistonos ; B 26 -12 482 685 ; +C -1 ; WX 498 ; N beta ; B -67 -214 508 694 ; +C -1 ; WX 394 ; N gamma ; B 24 -216 386 442 ; +C -1 ; WX 405 ; N zeta ; B 23 -160 530 689 ; +C -1 ; WX 496 ; N eta ; B 28 -214 454 442 ; +C -1 ; WX 491 ; N theta ; B 44 -12 507 694 ; +C -1 ; WX 278 ; N iota ; B 43 -12 230 442 ; +C -1 ; WX 480 ; N kappa ; B 15 -6 494 442 ; +C -1 ; WX 433 ; N lambda ; B -31 -6 408 694 ; +C -1 ; WX 502 ; N mu ; B -53 -216 475 430 ; +C -1 ; WX 444 ; N nu ; B 21 -12 442 442 ; +C -1 ; WX 428 ; N xi ; B 18 -160 490 689 ; +C -1 ; WX 500 ; N omicron ; B 29 -12 462 442 ; +C -1 ; WX 480 ; N rho ; B -71 -214 438 442 ; +C -1 ; WX 406 ; N sigma1 ; B 31 -161 426 442 ; +C -1 ; WX 459 ; N upsilon ; B 26 -12 424 442 ; +C -1 ; WX 440 ; N chi ; B -94 -216 469 436 ; +C -1 ; WX 621 ; N psi ; B 70 -214 647 442 ; +C -1 ; WX 706 ; N omega ; B 35 -12 661 442 ; +C -1 ; WX 278 ; N iotadieresis ; B 43 -12 367 654 ; +C -1 ; WX 459 ; N upsilondieresis ; B 26 -12 424 654 ; +C -1 ; WX 500 ; N omicrontonos ; B 29 -12 462 685 ; +C -1 ; WX 459 ; N upsilontonos ; B 26 -12 424 685 ; +C -1 ; WX 698 ; N omegatonos ; B 35 -12 661 685 ; +C -1 ; WX 611 ; N afii10023 ; B -22 0 632 850 ; +C -1 ; WX 797 ; N afii10051 ; B 94 -8 761 662 ; +C -1 ; WX 669 ; N afii10053 ; B 69 -15 706 677 ; +C -1 ; WX 500 ; N afii10054 ; B 7 -15 542 677 ; +C -1 ; WX 333 ; N afii10055 ; B -31 0 410 662 ; +C -1 ; WX 333 ; N afii10056 ; B -31 0 446 836 ; +C -1 ; WX 444 ; N afii10057 ; B -34 -15 547 662 ; +C -1 ; WX 927 ; N afii10058 ; B -34 -8 877 662 ; +C -1 ; WX 921 ; N afii10059 ; B -30 0 872 662 ; +C -1 ; WX 799 ; N afii10060 ; B 97 0 729 662 ; +C -1 ; WX 673 ; N afii10062 ; B 110 -15 776 849 ; +C -1 ; WX 611 ; N afii10017 ; B -49 0 547 677 ; +C -1 ; WX 590 ; N afii10018 ; B -28 0 628 662 ; +C -1 ; WX 611 ; N afii10019 ; B -23 0 590 662 ; +C -1 ; WX 569 ; N afii10020 ; B -36 0 664 662 ; +C -1 ; WX 636 ; N afii10021 ; B -103 -193 723 662 ; +C -1 ; WX 611 ; N afii10022 ; B -22 0 632 662 ; +C -1 ; WX 916 ; N afii10024 ; B -55 0 975 670 ; +C -1 ; WX 495 ; N afii10025 ; B -1 -15 492 677 ; +C -1 ; WX 722 ; N afii10026 ; B -25 0 812 662 ; +C -1 ; WX 722 ; N afii10027 ; B -25 0 812 849 ; +C -1 ; WX 664 ; N afii10028 ; B -28 0 723 670 ; +C -1 ; WX 677 ; N afii10029 ; B -35 -8 761 662 ; +C -1 ; WX 833 ; N afii10030 ; B -33 0 924 662 ; +C -1 ; WX 722 ; N afii10031 ; B -26 0 811 662 ; +C -1 ; WX 722 ; N afii10032 ; B 60 -15 718 677 ; +C -1 ; WX 722 ; N afii10033 ; B -29 0 806 662 ; +C -1 ; WX 611 ; N afii10034 ; B -24 0 621 662 ; +C -1 ; WX 667 ; N afii10035 ; B 67 -15 704 677 ; +C -1 ; WX 556 ; N afii10036 ; B 70 0 649 662 ; +C -1 ; WX 673 ; N afii10037 ; B 110 -15 776 662 ; +C -1 ; WX 804 ; N afii10038 ; B 73 0 792 662 ; +C -1 ; WX 611 ; N afii10039 ; B -67 0 741 662 ; +C -1 ; WX 722 ; N afii10040 ; B -25 -196 813 662 ; +C -1 ; WX 689 ; N afii10041 ; B 113 0 770 662 ; +C -1 ; WX 1043 ; N afii10042 ; B -14 0 1120 662 ; +C -1 ; WX 1043 ; N afii10043 ; B -14 -196 1120 662 ; +C -1 ; WX 676 ; N afii10044 ; B 58 0 626 662 ; +C -1 ; WX 872 ; N afii10045 ; B -28 0 957 662 ; +C -1 ; WX 590 ; N afii10046 ; B -28 0 540 662 ; +C -1 ; WX 655 ; N afii10047 ; B 15 -15 642 677 ; +C -1 ; WX 1032 ; N afii10048 ; B -32 -15 1029 677 ; +C -1 ; WX 657 ; N afii10049 ; B -54 0 746 662 ; +C -1 ; WX 500 ; N afii10065 ; B 23 -12 469 442 ; +C -1 ; WX 503 ; N afii10066 ; B 36 -12 519 694 ; +C -1 ; WX 434 ; N afii10067 ; B 31 -12 420 442 ; +C -1 ; WX 390 ; N afii10068 ; B 1 -12 384 442 ; +C -1 ; WX 506 ; N afii10069 ; B 30 -12 474 694 ; +C -1 ; WX 444 ; N afii10070 ; B 31 -12 430 442 ; +C -1 ; WX 930 ; N afii10072 ; B 0 -12 926 442 ; +C -1 ; WX 390 ; N afii10073 ; B -24 -12 371 442 ; +C -1 ; WX 500 ; N afii10074 ; B 29 -12 471 442 ; +C -1 ; WX 500 ; N afii10075 ; B 29 -12 483 674 ; +C -1 ; WX 468 ; N afii10076 ; B 18 0 465 442 ; +C -1 ; WX 436 ; N afii10077 ; B -44 -12 405 430 ; +C -1 ; WX 638 ; N afii10078 ; B -45 -12 606 442 ; +C -1 ; WX 496 ; N afii10079 ; B 20 -12 462 442 ; +C -1 ; WX 500 ; N afii10080 ; B 29 -12 462 442 ; +C -1 ; WX 500 ; N afii10081 ; B 19 -12 459 442 ; +C -1 ; WX 500 ; N afii10082 ; B -110 -214 473 442 ; +C -1 ; WX 444 ; N afii10083 ; B 29 -12 428 442 ; +C -1 ; WX 722 ; N afii10084 ; B 17 -12 679 442 ; +C -1 ; WX 444 ; N afii10085 ; B -78 -216 440 442 ; +C -1 ; WX 710 ; N afii10086 ; B 29 -214 673 694 ; +C -1 ; WX 444 ; N afii10087 ; B -33 -12 439 442 ; +C -1 ; WX 500 ; N afii10088 ; B 29 -196 471 442 ; +C -1 ; WX 477 ; N afii10089 ; B 42 -12 444 442 ; +C -1 ; WX 755 ; N afii10090 ; B 31 -12 725 442 ; +C -1 ; WX 755 ; N afii10091 ; B 31 -196 725 442 ; +C -1 ; WX 519 ; N afii10092 ; B 29 -12 471 430 ; +C -1 ; WX 677 ; N afii10093 ; B 50 -12 627 442 ; +C -1 ; WX 455 ; N afii10094 ; B 50 -12 408 442 ; +C -1 ; WX 441 ; N afii10095 ; B 7 -12 398 442 ; +C -1 ; WX 705 ; N afii10096 ; B 21 -12 668 442 ; +C -1 ; WX 465 ; N afii10097 ; B -61 -12 434 442 ; +C -1 ; WX 444 ; N afii10071 ; B 31 -12 468 654 ; +C -1 ; WX 479 ; N afii10099 ; B 20 -216 441 694 ; +C -1 ; WX 377 ; N afii10100 ; B -42 0 405 685 ; +C -1 ; WX 436 ; N afii10101 ; B 26 -12 450 442 ; +C -1 ; WX 389 ; N afii10102 ; B -9 -12 363 442 ; +C -1 ; WX 278 ; N afii10103 ; B 43 -12 272 636 ; +C -1 ; WX 278 ; N afii10104 ; B 43 -12 367 654 ; +C -1 ; WX 278 ; N afii10105 ; B -170 -216 280 635 ; +C -1 ; WX 679 ; N afii10106 ; B -44 -12 631 442 ; +C -1 ; WX 712 ; N afii10107 ; B 21 -12 665 442 ; +C -1 ; WX 500 ; N afii10108 ; B 20 -12 459 694 ; +C -1 ; WX 444 ; N afii10110 ; B -80 -216 444 674 ; +C -1 ; WX 500 ; N afii10193 ; B 18 -192 471 442 ; +C -1 ; WX 440 ; N afii10050 ; B -30 0 589 803 ; +C -1 ; WX 315 ; N afii10098 ; B 42 -12 382 519 ; +C -1 ; WX 1000 ; N afii00208 ; B 32 224 969 294 ; +C -1 ; WX 943 ; N afii61352 ; B -43 -15 929 674 ; +C -1 ; WX 501 ; N pi ; B 24 -12 532 430 ; +C -1 ; WX 333 ; N sheva ; B 26 -265 107 -72 ; +C -1 ; WX 333 ; N hatafsegol ; B -86 -265 219 -72 ; +C -1 ; WX 333 ; N hatafpatah ; B -76 -265 208 -72 ; +C -1 ; WX 333 ; N hatafqamats ; B -91 -265 224 -72 ; +C -1 ; WX 333 ; N hiriq ; B 26 -153 107 -72 ; +C -1 ; WX 333 ; N tsere ; B -30 -153 163 -72 ; +C -1 ; WX 333 ; N segol ; B -30 -265 163 -72 ; +C -1 ; WX 333 ; N patah ; B -30 -130 163 -80 ; +C -1 ; WX 333 ; N qamats ; B -30 -243 163 -80 ; +C -1 ; WX 333 ; N holam ; B 226 587 307 668 ; +C -1 ; WX 333 ; N qubuts ; B -86 -265 219 -72 ; +C -1 ; WX 333 ; N dagesh ; B 126 211 207 292 ; +C -1 ; WX 333 ; N meteg ; B 41 -242 91 -80 ; +C -1 ; WX 371 ; N maqaf ; B 116 415 388 516 ; +C -1 ; WX 333 ; N rafe ; B 170 596 363 646 ; +C -1 ; WX 333 ; N paseq ; B 46 -49 294 564 ; +C -1 ; WX 343 ; N shindot ; B 436 587 517 668 ; +C -1 ; WX 343 ; N sindot ; B 27 587 108 668 ; +C -1 ; WX 333 ; N sofpasuq ; B 60 -9 286 525 ; +C -1 ; WX 478 ; N alef ; B -21 -9 489 554 ; +C -1 ; WX 437 ; N bet ; B -29 0 412 550 ; +C -1 ; WX 321 ; N gimel ; B -63 -13 296 554 ; +C -1 ; WX 417 ; N dalet ; B 92 -12 450 550 ; +C -1 ; WX 476 ; N he ; B -23 -12 496 550 ; +C -1 ; WX 264 ; N vav ; B 93 -12 260 554 ; +C -1 ; WX 254 ; N zayin ; B 20 -11 280 554 ; +C -1 ; WX 471 ; N het ; B -3 -12 491 550 ; +C -1 ; WX 478 ; N tet ; B 43 0 469 554 ; +C -1 ; WX 242 ; N yod ; B 97 239 256 554 ; +C -1 ; WX 438 ; N finalkaf ; B 94 -173 464 550 ; +C -1 ; WX 411 ; N kaf ; B -28 0 388 550 ; +C -1 ; WX 430 ; N lamed ; B 97 -8 432 746 ; +C -1 ; WX 473 ; N finalmem ; B -14 0 456 550 ; +C -1 ; WX 470 ; N mem ; B -17 0 444 554 ; +C -1 ; WX 255 ; N finalnun ; B 36 -173 270 554 ; +C -1 ; WX 279 ; N nun ; B -48 0 273 554 ; +C -1 ; WX 461 ; N samekh ; B 52 -14 437 550 ; +C -1 ; WX 439 ; N ayin ; B -25 -29 467 554 ; +C -1 ; WX 431 ; N finalpe ; B 39 -173 412 550 ; +C -1 ; WX 429 ; N pe ; B -21 0 406 550 ; +C -1 ; WX 445 ; N finaltsadi ; B 96 -173 471 554 ; +C -1 ; WX 449 ; N tsadi ; B -8 0 476 554 ; +C -1 ; WX 444 ; N qof ; B -55 -173 448 550 ; +C -1 ; WX 448 ; N resh ; B 92 -12 430 550 ; +C -1 ; WX 620 ; N shin ; B 95 0 645 554 ; +C -1 ; WX 474 ; N tav ; B -60 -12 459 550 ; +C -1 ; WX 527 ; N doublevav ; B 93 -12 523 554 ; +C -1 ; WX 505 ; N vavyod ; B 97 -12 501 554 ; +C -1 ; WX 483 ; N doubleyod ; B 97 239 498 554 ; +C -1 ; WX 190 ; N geresh ; B 76 304 219 535 ; +C -1 ; WX 368 ; N gershayim ; B 76 304 396 535 ; +C -1 ; WX 787 ; N newsheqelsign ; B 8 0 791 516 ; +C -1 ; WX 264 ; N vavshindot ; B 32 -12 260 668 ; +C -1 ; WX 438 ; N finalkafsheva ; B 94 -173 464 550 ; +C -1 ; WX 438 ; N finalkafqamats ; B 70 -173 464 550 ; +C -1 ; WX 430 ; N lamedholam ; B 11 -8 432 746 ; +C -1 ; WX 430 ; N lamedholamdagesh ; B 11 -8 432 746 ; +C -1 ; WX 439 ; N altayin ; B -23 0 467 554 ; +C -1 ; WX 620 ; N shinshindot ; B 95 0 645 669 ; +C -1 ; WX 620 ; N shinsindot ; B 95 0 645 668 ; +C -1 ; WX 620 ; N shindageshshindot ; B 95 0 645 669 ; +C -1 ; WX 620 ; N shindageshsindot ; B 95 0 645 668 ; +C -1 ; WX 478 ; N alefpatah ; B -21 -130 489 554 ; +C -1 ; WX 478 ; N alefqamats ; B -21 -243 489 554 ; +C -1 ; WX 478 ; N alefmapiq ; B -21 -9 489 554 ; +C -1 ; WX 437 ; N betdagesh ; B -29 0 412 550 ; +C -1 ; WX 321 ; N gimeldagesh ; B -63 -13 296 554 ; +C -1 ; WX 417 ; N daletdagesh ; B 92 -12 450 550 ; +C -1 ; WX 476 ; N hedagesh ; B -23 -12 496 550 ; +C -1 ; WX 264 ; N vavdagesh ; B 48 -12 260 554 ; +C -1 ; WX 268 ; N zayindagesh ; B 6 -11 294 554 ; +C -1 ; WX 478 ; N tetdagesh ; B 43 0 469 554 ; +C -1 ; WX 242 ; N yoddagesh ; B 44 239 256 554 ; +C -1 ; WX 438 ; N finalkafdagesh ; B 94 -173 464 550 ; +C -1 ; WX 411 ; N kafdagesh ; B -28 0 388 550 ; +C -1 ; WX 430 ; N lameddagesh ; B 97 -8 432 746 ; +C -1 ; WX 470 ; N memdagesh ; B -17 0 444 554 ; +C -1 ; WX 279 ; N nundagesh ; B -48 0 273 554 ; +C -1 ; WX 461 ; N samekhdagesh ; B 52 -14 437 550 ; +C -1 ; WX 431 ; N finalpedagesh ; B 39 -173 412 550 ; +C -1 ; WX 429 ; N pedagesh ; B -21 0 406 550 ; +C -1 ; WX 449 ; N tsadidagesh ; B -8 0 476 554 ; +C -1 ; WX 444 ; N qofdagesh ; B -55 -173 448 550 ; +C -1 ; WX 444 ; N reshdagesh ; B 77 -6 432 550 ; +C -1 ; WX 620 ; N shindagesh ; B 95 0 645 554 ; +C -1 ; WX 474 ; N tavdages ; B -60 -12 459 550 ; +C -1 ; WX 264 ; N vavholam ; B 93 -12 272 668 ; +C -1 ; WX 437 ; N betrafe ; B -29 0 415 646 ; +C -1 ; WX 411 ; N kafrafe ; B -28 0 402 646 ; +C -1 ; WX 429 ; N perafe ; B -21 0 411 646 ; +C -1 ; WX 535 ; N aleflamed ; B 36 -9 546 746 ; +C -1 ; WX 0 ; N zerowidthnonjoiner ; B -18 -134 18 629 ; +C -1 ; WX 0 ; N zerowidthjoiner ; B -107 -134 107 690 ; +C -1 ; WX 0 ; N lefttorightmark ; B -18 -134 210 690 ; +C -1 ; WX 0 ; N righttoleftmark ; B -210 -134 17 690 ; +C -1 ; WX 1000 ; N uniFFFC ; B 0 0 1000 719 ; +C -1 ; WX 722 ; N Ohorn ; B 60 -15 809 695 ; +C -1 ; WX 534 ; N ohorn ; B 29 -12 581 471 ; +C -1 ; WX 754 ; N Uhorn ; B 106 -15 910 778 ; +C -1 ; WX 545 ; N uhorn ; B 29 -12 587 442 ; +C -1 ; WX 0 ; N f00b ; B -112 818 21 891 ; +C -1 ; WX 0 ; N f00c ; B -257 818 -74 891 ; +C -1 ; WX 0 ; N f00e ; B -287 728 -126 891 ; +C -1 ; WX 0 ; N f006 ; B -54 818 79 891 ; +C -1 ; WX 0 ; N f007 ; B -130 818 52 891 ; +C -1 ; WX 0 ; N f009 ; B -139 728 22 891 ; +C -1 ; WX 0 ; N combininghookabove ; B -66 728 83 891 ; +C -1 ; WX 0 ; N f010 ; B -58 810 74 891 ; +C -1 ; WX 0 ; N f013 ; B -184 728 -34 891 ; +C -1 ; WX 0 ; N f011 ; B -127 810 4 891 ; +C -1 ; WX 0 ; N f01c ; B -171 755 142 884 ; +C -1 ; WX 0 ; N f015 ; B -196 813 85 891 ; +C -1 ; WX 0 ; N combiningtildeaccent ; B -256 726 57 854 ; +C -1 ; WX 0 ; N _d_767 ; B 26 722 278 802 ; +C -1 ; WX 0 ; N _d_768 ; B 15 722 263 792 ; +C -1 ; WX 0 ; N f02c ; B -215 -157 -116 -59 ; +C -1 ; WX 513 ; N dongsign ; B 59 140 532 694 ; +C -1 ; WX 750 ; N onethird ; B 79 -27 676 676 ; +C -1 ; WX 750 ; N twothirds ; B 54 -27 676 676 ; +C -1 ; WX 0 ; N f008 ; B -104 517 57 680 ; +C -1 ; WX 0 ; N f00a ; B -197 517 -37 680 ; +C -1 ; WX 0 ; N f00d ; B -183 517 -22 680 ; +C -1 ; WX 0 ; N f00f ; B -272 517 -112 680 ; +C -1 ; WX 0 ; N f012 ; B -110 517 39 681 ; +C -1 ; WX 0 ; N f014 ; B -223 517 -73 681 ; +C -1 ; WX 0 ; N f016 ; B -275 755 38 884 ; +C -1 ; WX 0 ; N f017 ; B -363 755 -50 884 ; +C -1 ; WX 0 ; N f018 ; B -387 755 -74 884 ; +C -1 ; WX 0 ; N f019 ; B -320 538 -7 667 ; +C -1 ; WX 0 ; N f01a ; B -344 538 -32 667 ; +C -1 ; WX 0 ; N f01b ; B -378 538 -66 667 ; +C -1 ; WX 0 ; N f01e ; B -400 -157 -301 -59 ; +C -1 ; WX 0 ; N f01f ; B -498 -157 -398 -59 ; +C -1 ; WX 0 ; N f020 ; B -498 -157 -398 -59 ; +C -1 ; WX 0 ; N f021 ; B -458 -157 -359 -59 ; +C -1 ; WX 0 ; N f022 ; B -493 -157 -394 -59 ; +C -1 ; WX 0 ; N combininggraveaccent ; B -113 728 48 891 ; +C -1 ; WX 0 ; N combiningacuteaccent ; B -46 728 115 891 ; +C -1 ; WX 0 ; N f01d ; B -226 538 86 667 ; +C -1 ; WX 0 ; N combiningdotbelow ; B -458 -157 -359 -59 ; +C -1 ; WX 0 ; N f023 ; B -383 -157 -284 -59 ; +C -1 ; WX 0 ; N f029 ; B -299 -157 -200 -59 ; +C -1 ; WX 0 ; N f02a ; B -269 -157 -169 -59 ; +C -1 ; WX 0 ; N f02b ; B -421 -157 -322 -59 ; +C -1 ; WX 0 ; N f024 ; B -334 -157 -235 -59 ; +C -1 ; WX 0 ; N f025 ; B -383 -157 -284 -59 ; +C -1 ; WX 0 ; N f026 ; B -413 -157 -313 -59 ; +C -1 ; WX 0 ; N f027 ; B -369 -157 -270 -59 ; +C -1 ; WX 0 ; N f028 ; B -413 -157 -313 -59 ; +C -1 ; WX 0 ; N f02d ; B -284 813 -2 891 ; +C -1 ; WX 0 ; N f02e ; B -303 755 10 884 ; +C -1 ; WX 0 ; N f02f ; B -313 813 -32 891 ; +C -1 ; WX 0 ; N f030 ; B -352 755 -39 884 ; +C -1 ; WX 278 ; N f031 ; B 43 -12 230 442 ; +C -1 ; WX 611 ; N Adotbelow ; B -49 -157 547 677 ; +C -1 ; WX 500 ; N adotbelow ; B 23 -157 469 442 ; +C -1 ; WX 611 ; N Ahookabove ; B -49 0 630 891 ; +C -1 ; WX 500 ; N ahookabove ; B 23 -12 469 681 ; +C -1 ; WX 611 ; N Acircumflexacute ; B -49 0 665 891 ; +C -1 ; WX 500 ; N acircumflexacute ; B 23 -12 531 891 ; +C -1 ; WX 611 ; N Acircumflexgrave ; B -49 0 650 891 ; +C -1 ; WX 500 ; N acircumflexgrave ; B 23 -12 479 891 ; +C -1 ; WX 611 ; N Acircumflexhookabove ; B -49 0 650 891 ; +C -1 ; WX 500 ; N acircumflexhookabove ; B 23 -12 522 891 ; +C -1 ; WX 611 ; N Acircumflextilde ; B -49 0 696 891 ; +C -1 ; WX 500 ; N acircumflextilde ; B 23 -12 582 884 ; +C -1 ; WX 611 ; N Acircumflexdotbelow ; B -49 -157 650 792 ; +C -1 ; WX 500 ; N acircumflexdotbelow ; B 23 -157 469 677 ; +C -1 ; WX 611 ; N Abreveacute ; B -49 0 666 891 ; +C -1 ; WX 500 ; N abreveacute ; B 23 -12 510 891 ; +C -1 ; WX 611 ; N Abrevegrave ; B -49 0 666 891 ; +C -1 ; WX 500 ; N abrevegrave ; B 23 -12 510 891 ; +C -1 ; WX 611 ; N Abrevehookabove ; B -49 0 666 891 ; +C -1 ; WX 500 ; N abrevehookabove ; B 23 -12 510 891 ; +C -1 ; WX 611 ; N Abrevetilde ; B -49 0 691 891 ; +C -1 ; WX 500 ; N abrevetilde ; B 23 -12 542 884 ; +C -1 ; WX 611 ; N Abrevedotbelow ; B -49 -157 666 802 ; +C -1 ; WX 500 ; N abrevedotbelow ; B 23 -157 480 687 ; +C -1 ; WX 611 ; N Edotbelow ; B -22 -157 632 662 ; +C -1 ; WX 444 ; N edotbelow ; B 31 -157 430 442 ; +C -1 ; WX 611 ; N Ehookabove ; B -22 0 632 891 ; +C -1 ; WX 444 ; N ehookabove ; B 31 -12 430 681 ; +C -1 ; WX 611 ; N Etilde ; B -22 0 632 847 ; +C -1 ; WX 444 ; N etilde ; B 31 -12 493 667 ; +C -1 ; WX 611 ; N Ecircumflexacute ; B -22 0 632 891 ; +C -1 ; WX 444 ; N ecircumflexacute ; B 31 -12 505 891 ; +C -1 ; WX 611 ; N Ecircumflexgrave ; B -22 0 632 891 ; +C -1 ; WX 444 ; N ecircumflexgrave ; B 31 -12 453 891 ; +C -1 ; WX 611 ; N Ecircumflexhookabove ; B -22 0 632 891 ; +C -1 ; WX 444 ; N ecircumflexhookabove ; B 31 -12 497 891 ; +C -1 ; WX 611 ; N Ecircumflextilde ; B -22 0 632 891 ; +C -1 ; WX 444 ; N ecircumflextilde ; B 31 -12 556 884 ; +C -1 ; WX 611 ; N Ecircumflexdotbelow ; B -22 -157 632 792 ; +C -1 ; WX 444 ; N ecircumflexdotbelow ; B 31 -157 443 677 ; +C -1 ; WX 333 ; N Ihookabove ; B -31 0 420 891 ; +C -1 ; WX 278 ; N ihookabove ; B 43 -12 322 681 ; +C -1 ; WX 333 ; N Idotbelow ; B -31 -157 410 662 ; +C -1 ; WX 278 ; N idotbelow ; B 24 -157 272 636 ; +C -1 ; WX 722 ; N Odotbelow ; B 60 -157 718 677 ; +C -1 ; WX 500 ; N odotbelow ; B 29 -157 462 442 ; +C -1 ; WX 722 ; N Ohookabove ; B 60 -15 718 891 ; +C -1 ; WX 500 ; N ohookabove ; B 29 -12 462 681 ; +C -1 ; WX 722 ; N Ocircumflexacute ; B 60 -15 718 891 ; +C -1 ; WX 500 ; N ocircumflexacute ; B 29 -12 531 891 ; +C -1 ; WX 722 ; N Ocircumflexgrave ; B 60 -15 718 891 ; +C -1 ; WX 500 ; N ocircumflexgrave ; B 29 -12 479 891 ; +C -1 ; WX 722 ; N Ocircumflexhookabove ; B 60 -15 718 891 ; +C -1 ; WX 500 ; N ocircumflexhookabove ; B 29 -12 522 891 ; +C -1 ; WX 722 ; N Ocircumflextilde ; B 60 -15 718 891 ; +C -1 ; WX 500 ; N ocircumflextilde ; B 29 -12 582 884 ; +C -1 ; WX 722 ; N Ocircumflexdotbelow ; B 60 -157 718 792 ; +C -1 ; WX 500 ; N ocircumflexdotbelow ; B 29 -157 469 677 ; +C -1 ; WX 722 ; N Ohornacute ; B 60 -15 809 880 ; +C -1 ; WX 534 ; N ohornacute ; B 29 -12 581 685 ; +C -1 ; WX 722 ; N Ohorngrave ; B 60 -15 809 880 ; +C -1 ; WX 534 ; N ohorngrave ; B 29 -12 581 685 ; +C -1 ; WX 722 ; N Ohornhookabove ; B 60 -15 809 891 ; +C -1 ; WX 534 ; N ohornhookabove ; B 29 -12 581 681 ; +C -1 ; WX 722 ; N Ohorntilde ; B 60 -15 809 847 ; +C -1 ; WX 534 ; N ohorntilde ; B 29 -12 581 667 ; +C -1 ; WX 722 ; N Ohorndotbelow ; B 60 -157 809 695 ; +C -1 ; WX 534 ; N ohorndotbelow ; B 29 -157 581 471 ; +C -1 ; WX 722 ; N Udotbelow ; B 106 -157 814 662 ; +C -1 ; WX 500 ; N udotbelow ; B 29 -157 471 442 ; +C -1 ; WX 722 ; N Uhookabove ; B 106 -15 814 891 ; +C -1 ; WX 500 ; N uhookabove ; B 29 -12 471 681 ; +C -1 ; WX 754 ; N Uhornacute ; B 106 -15 910 880 ; +C -1 ; WX 545 ; N uhornacute ; B 29 -12 587 685 ; +C -1 ; WX 754 ; N Uhorngrave ; B 106 -15 910 880 ; +C -1 ; WX 545 ; N uhorngrave ; B 29 -12 587 685 ; +C -1 ; WX 754 ; N Uhornhookabove ; B 106 -15 910 891 ; +C -1 ; WX 545 ; N uhornhookabove ; B 29 -12 587 681 ; +C -1 ; WX 754 ; N Uhorntilde ; B 106 -15 910 847 ; +C -1 ; WX 545 ; N uhorntilde ; B 29 -12 587 667 ; +C -1 ; WX 754 ; N Uhorndotbelow ; B 106 -157 910 778 ; +C -1 ; WX 545 ; N uhorndotbelow ; B 29 -157 587 442 ; +C -1 ; WX 556 ; N Ydotbelow ; B 90 -157 667 662 ; +C -1 ; WX 444 ; N ydotbelow ; B -78 -216 440 442 ; +C -1 ; WX 556 ; N Yhookabove ; B 90 0 667 891 ; +C -1 ; WX 444 ; N yhookabove ; B -78 -216 440 681 ; +C -1 ; WX 556 ; N Ytilde ; B 90 0 667 847 ; +C -1 ; WX 444 ; N ytilde ; B -78 -216 473 667 ; +C -1 ; WX 611 ; N uni01CD ; B -49 0 695 876 ; +C -1 ; WX 500 ; N uni01CE ; B 23 -12 515 677 ; +C -1 ; WX 333 ; N uni01CF ; B -31 0 485 876 ; +C -1 ; WX 278 ; N uni01D0 ; B 43 -12 393 677 ; +C -1 ; WX 722 ; N uni01D1 ; B 60 -15 718 876 ; +C -1 ; WX 500 ; N uni01D2 ; B 29 -12 520 677 ; +C -1 ; WX 722 ; N uni01D3 ; B 106 -15 814 876 ; +C -1 ; WX 500 ; N uni01D4 ; B 29 -12 495 677 ; +C -1 ; WX 722 ; N uni01D5 ; B 106 -15 814 891 ; +C -1 ; WX 500 ; N uni01D6 ; B 29 -12 519 747 ; +C -1 ; WX 722 ; N uni01D7 ; B 106 -15 814 891 ; +C -1 ; WX 500 ; N uni01D8 ; B 29 -12 477 822 ; +C -1 ; WX 722 ; N uni01D9 ; B 106 -15 814 891 ; +C -1 ; WX 500 ; N uni01DA ; B 29 -12 524 809 ; +C -1 ; WX 722 ; N uni01DB ; B 106 -15 814 891 ; +C -1 ; WX 500 ; N uni01DC ; B 29 -12 471 823 ; +C -1 ; WX 0 ; N _d_912 ; B 93 706 376 891 ; +C -1 ; WX 0 ; N _d_913 ; B 93 706 334 891 ; +C -1 ; WX 0 ; N _d_914 ; B 93 706 358 891 ; +C -1 ; WX 0 ; N _d_915 ; B 93 706 334 891 ; +C -1 ; WX 569 ; N uni0492 ; B -36 0 664 662 ; +C -1 ; WX 390 ; N uni0493 ; B 1 -12 384 442 ; +C -1 ; WX 916 ; N uni0496 ; B -55 -196 975 670 ; +C -1 ; WX 930 ; N uni0497 ; B 0 -193 926 442 ; +C -1 ; WX 664 ; N uni049a ; B -28 -196 723 670 ; +C -1 ; WX 468 ; N uni049b ; B 18 -196 465 442 ; +C -1 ; WX 664 ; N uni049c ; B -28 0 723 670 ; +C -1 ; WX 468 ; N uni049d ; B 18 0 465 442 ; +C -1 ; WX 722 ; N uni04a2 ; B -26 -196 811 662 ; +C -1 ; WX 496 ; N uni04a3 ; B 20 -196 462 442 ; +C -1 ; WX 556 ; N uni04ae ; B 90 0 667 662 ; +C -1 ; WX 500 ; N uni04af ; B 1 -214 557 447 ; +C -1 ; WX 556 ; N uni04b0 ; B 90 0 667 662 ; +C -1 ; WX 500 ; N uni04b1 ; B -16 -214 557 447 ; +C -1 ; WX 611 ; N uni04b2 ; B -67 -196 741 662 ; +C -1 ; WX 444 ; N uni04b3 ; B -35 -196 438 442 ; +C -1 ; WX 689 ; N uni04b8 ; B 113 0 770 662 ; +C -1 ; WX 477 ; N uni04b9 ; B 42 -12 444 442 ; +C -1 ; WX 689 ; N uni04ba ; B -26 0 631 662 ; +C -1 ; WX 500 ; N uni04bb ; B 19 -12 459 442 ; +C -1 ; WX 695 ; N uni018f ; B 60 -15 690 677 ; +C -1 ; WX 444 ; N uni0259 ; B 13 -12 412 442 ; +C -1 ; WX 722 ; N uni04e8 ; B 60 -15 718 677 ; +C -1 ; WX 500 ; N uni04e9 ; B 29 -12 462 442 ; +EndCharMetrics +StartKernData +StartKernPairs 821 +KPX space A -18 +KPX space Alphatonos -18 +KPX space Alpha -18 +KPX space Delta -18 +KPX space Lambda -18 +KPX one one -74 +KPX A space -18 +KPX A T -37 +KPX A V -50 +KPX A W -37 +KPX A Y -55 +KPX A v -55 +KPX A w -55 +KPX A y -55 +KPX A quoteright -37 +KPX F comma -129 +KPX F period -129 +KPX F A -129 +KPX L space -18 +KPX L T -20 +KPX L V -37 +KPX L W -37 +KPX L Y -20 +KPX L y -30 +KPX L quoteright -37 +KPX P space -18 +KPX P comma -129 +KPX P period -129 +KPX P A -129 +KPX R V -18 +KPX R W -18 +KPX R Y -18 +KPX R y -18 +KPX T space -18 +KPX T comma -74 +KPX T hyphen -74 +KPX T period -74 +KPX T colon -55 +KPX T semicolon -65 +KPX T A -74 +KPX T O -18 +KPX T a -92 +KPX T c -92 +KPX T e -92 +KPX T i -55 +KPX T o -92 +KPX T r -55 +KPX T s -92 +KPX T u -55 +KPX T w -74 +KPX T y -74 +KPX V space -18 +KPX V comma -129 +KPX V hyphen -55 +KPX V period -129 +KPX V colon -65 +KPX V semicolon -74 +KPX V A -74 +KPX V O -30 +KPX V a -111 +KPX V e -111 +KPX V i -74 +KPX V o -111 +KPX V r -74 +KPX V u -74 +KPX V y -92 +KPX W comma -92 +KPX W hyphen -37 +KPX W period -92 +KPX W colon -65 +KPX W semicolon -65 +KPX W A -70 +KPX W a -92 +KPX W e -92 +KPX W i -55 +KPX W o -92 +KPX W r -55 +KPX W u -55 +KPX W y -92 +KPX Y comma -92 +KPX Y hyphen -74 +KPX Y period -92 +KPX Y colon -65 +KPX Y semicolon -65 +KPX Y A -70 +KPX Y a -92 +KPX Y e -92 +KPX Y i -74 +KPX Y o -92 +KPX Y p -92 +KPX Y q -111 +KPX Y u -92 +KPX Y v -92 +KPX f quoteright 92 +KPX r comma -111 +KPX r hyphen -20 +KPX r period -111 +KPX r c -37 +KPX r d -37 +KPX r e -37 +KPX r g -37 +KPX r h -18 +KPX r o -37 +KPX r q -37 +KPX r quoteright 37 +KPX v comma -74 +KPX v period -74 +KPX w comma -74 +KPX w period -74 +KPX y comma -55 +KPX y period -55 +KPX quoteleft quoteleft -111 +KPX quoteright space -111 +KPX quoteright s -129 +KPX quoteright t -111 +KPX quoteright quoteright -111 +KPX quotesinglbase afii10051 -113 +KPX quotesinglbase afii10060 -113 +KPX quotesinglbase afii10036 -113 +KPX quotesinglbase afii10041 -176 +KPX quotesinglbase afii10044 -88 +KPX quotedblbase afii10051 -113 +KPX quotedblbase afii10060 -113 +KPX quotedblbase afii10036 -113 +KPX quotedblbase afii10041 -125 +KPX quotedblbase afii10044 -50 +KPX Gamma comma -128 +KPX Gamma period -128 +KPX Gamma iotadieresistonos 42 +KPX Gamma Alpha -142 +KPX Gamma Delta -142 +KPX Gamma Lambda -142 +KPX Gamma iota -55 +KPX Theta Alpha -44 +KPX Theta Delta -25 +KPX Theta Lambda -44 +KPX Theta Tau -18 +KPX Theta Upsilon -41 +KPX Theta Upsilondieresis -41 +KPX Phi Alpha -44 +KPX Phi Upsilon -77 +KPX Phi Upsilondieresis -77 +KPX delta chi -20 +KPX tau zeta 16 +KPX phi lambda -21 +KPX phi chi -20 +KPX Alphatonos space -18 +KPX Alphatonos Theta -44 +KPX Alphatonos Phi -44 +KPX Alphatonos Omicron -44 +KPX Alphatonos Tau -37 +KPX Alphatonos Upsilon -82 +KPX Alphatonos Upsilondieresis -82 +KPX Alphatonos gamma -45 +KPX Alphatonos nu -55 +KPX Alphatonos chi -45 +KPX Omicrontonos Upsilon -41 +KPX Upsilontonos Odieresis -36 +KPX Upsilontonos Theta -36 +KPX Upsilontonos Phi -59 +KPX Upsilontonos alpha -91 +KPX Upsilontonos delta -68 +KPX Upsilontonos sigma -91 +KPX Upsilontonos phi -91 +KPX Upsilontonos iotadieresistonos 29 +KPX Upsilontonos Alpha -97 +KPX Upsilontonos Delta -69 +KPX Upsilontonos Lambda -97 +KPX Upsilontonos Omicron -36 +KPX Upsilontonos alphatonos -91 +KPX Upsilontonos etatonos -47 +KPX Upsilontonos iotatonos -51 +KPX Upsilontonos eta -47 +KPX Upsilontonos iota -51 +KPX Upsilontonos kappa -47 +KPX Upsilontonos mu -74 +KPX Upsilontonos omicron -91 +KPX Upsilontonos iotadieresis 29 +KPX Upsilontonos omicrontonos -91 +KPX Alpha space -18 +KPX Alpha quoteright -37 +KPX Alpha Theta -44 +KPX Alpha Phi -44 +KPX Alpha Omicron -44 +KPX Alpha Tau -37 +KPX Alpha Upsilon -82 +KPX Alpha Upsilondieresis -82 +KPX Alpha gamma -45 +KPX Alpha nu -55 +KPX Alpha chi -45 +KPX Delta space -18 +KPX Delta Theta -19 +KPX Delta Omicron -19 +KPX Delta Tau -19 +KPX Delta Upsilon -69 +KPX Delta Upsilondieresis -69 +KPX Kappa Theta -55 +KPX Kappa Phi -82 +KPX Kappa alpha -29 +KPX Kappa delta -29 +KPX Kappa sigma -29 +KPX Kappa phi -29 +KPX Kappa Omicron -55 +KPX Kappa alphatonos -29 +KPX Kappa zeta -29 +KPX Kappa theta -29 +KPX Kappa xi -29 +KPX Kappa omicron -29 +KPX Kappa omega -29 +KPX Kappa omicrontonos -29 +KPX Kappa omegatonos -29 +KPX Lambda space -18 +KPX Lambda Theta -44 +KPX Lambda Omicron -44 +KPX Lambda Tau -37 +KPX Lambda Upsilon -82 +KPX Lambda Upsilondieresis -82 +KPX Omicron Alpha -44 +KPX Omicron Delta -25 +KPX Omicron Lambda -44 +KPX Omicron Upsilon -41 +KPX Omicron Upsilondieresis -41 +KPX Rho comma -128 +KPX Rho period -128 +KPX Rho Alpha -128 +KPX Rho Delta -88 +KPX Rho Lambda -128 +KPX Sigma tau -34 +KPX Tau space -18 +KPX Tau hyphen -74 +KPX Tau period -74 +KPX Tau colon -55 +KPX Tau semicolon -55 +KPX Tau Theta -18 +KPX Tau Phi -18 +KPX Tau alpha -91 +KPX Tau delta -91 +KPX Tau epsilon -91 +KPX Tau sigma -91 +KPX Tau phi -91 +KPX Tau iotadieresistonos 44 +KPX Tau Alpha -74 +KPX Tau Delta -44 +KPX Tau Lambda -74 +KPX Tau Omicron -18 +KPX Tau Omega -18 +KPX Tau alphatonos -91 +KPX Tau epsilontonos -48 +KPX Tau gamma -74 +KPX Tau eta -55 +KPX Tau iota -55 +KPX Tau mu -55 +KPX Tau nu -74 +KPX Tau omicron -91 +KPX Tau chi -74 +KPX Tau psi -55 +KPX Tau omicrontonos -91 +KPX Tau upsilontonos -55 +KPX Upsilon comma -91 +KPX Upsilon hyphen -74 +KPX Upsilon period -91 +KPX Upsilon colon -64 +KPX Upsilon semicolon -64 +KPX Upsilon Theta -18 +KPX Upsilon Phi -59 +KPX Upsilon alpha -91 +KPX Upsilon delta -68 +KPX Upsilon sigma -91 +KPX Upsilon phi -91 +KPX Upsilon iotadieresistonos 29 +KPX Upsilon Alpha -97 +KPX Upsilon Delta -69 +KPX Upsilon Lambda -97 +KPX Upsilon Omicron -18 +KPX Upsilon alphatonos -91 +KPX Upsilon etatonos -47 +KPX Upsilon iotatonos -51 +KPX Upsilon gamma -46 +KPX Upsilon eta -47 +KPX Upsilon iota -51 +KPX Upsilon kappa -47 +KPX Upsilon mu -74 +KPX Upsilon omicron -91 +KPX Upsilon iotadieresis 29 +KPX Upsilon omicrontonos -91 +KPX Chi omega -25 +KPX Chi omegatonos -25 +KPX Psi alpha -44 +KPX Psi delta -44 +KPX Psi sigma -44 +KPX Psi phi -44 +KPX Psi alphatonos -44 +KPX Psi theta -25 +KPX Psi omicron -44 +KPX Psi omega -44 +KPX Psi omicrontonos -44 +KPX Psi omegatonos -44 +KPX Omega Upsilon -23 +KPX Omega Upsilondieresis -23 +KPX Upsilondieresis Theta -18 +KPX Upsilondieresis Phi -59 +KPX Upsilondieresis alpha -91 +KPX Upsilondieresis delta -68 +KPX Upsilondieresis sigma -91 +KPX Upsilondieresis phi -91 +KPX Upsilondieresis iotadieresistonos 29 +KPX Upsilondieresis Alpha -97 +KPX Upsilondieresis Delta -69 +KPX Upsilondieresis Lambda -97 +KPX Upsilondieresis Omicron -18 +KPX Upsilondieresis alphatonos -91 +KPX Upsilondieresis etatonos -47 +KPX Upsilondieresis iotatonos -51 +KPX Upsilondieresis eta -47 +KPX Upsilondieresis iota -51 +KPX Upsilondieresis kappa -47 +KPX Upsilondieresis mu -74 +KPX Upsilondieresis omicron -91 +KPX Upsilondieresis iotadieresis 29 +KPX Upsilondieresis omicrontonos -91 +KPX zeta alpha -57 +KPX zeta delta -43 +KPX zeta sigma -57 +KPX zeta tau -69 +KPX zeta phi -57 +KPX zeta alphatonos -57 +KPX zeta etatonos -32 +KPX zeta gamma -50 +KPX zeta eta -32 +KPX zeta theta -43 +KPX zeta iota -32 +KPX zeta kappa -32 +KPX zeta nu -50 +KPX zeta omicron -57 +KPX zeta omega -57 +KPX zeta omicrontonos -57 +KPX zeta omegatonos -57 +KPX zeta pi -34 +KPX lambda upsilon -17 +KPX xi alpha -42 +KPX xi delta -42 +KPX xi sigma -42 +KPX xi phi -42 +KPX xi alphatonos -42 +KPX xi zeta -42 +KPX xi xi -42 +KPX xi omicron -42 +KPX xi sigma1 -42 +KPX xi omicrontonos -42 +KPX omicron chi -20 +KPX chi alpha -21 +KPX chi delta -21 +KPX chi sigma -21 +KPX chi phi -21 +KPX chi alphatonos -21 +KPX chi zeta -21 +KPX chi omicron -21 +KPX chi sigma1 -21 +KPX chi omega -21 +KPX chi omicrontonos -21 +KPX chi omegatonos -21 +KPX omega chi -20 +KPX omicrontonos chi -20 +KPX omegatonos chi -20 +KPX afii10052 comma -63 +KPX afii10052 period -75 +KPX afii10052 colon 25 +KPX afii10058 quoteright -121 +KPX afii10059 quoteright -88 +KPX afii10017 quoteright -101 +KPX afii10017 afii10021 14 +KPX afii10017 afii10025 -13 +KPX afii10017 afii10029 -20 +KPX afii10017 afii10032 -38 +KPX afii10017 afii10033 -25 +KPX afii10017 afii10035 -25 +KPX afii10017 afii10036 -38 +KPX afii10017 afii10037 -63 +KPX afii10017 afii10038 -51 +KPX afii10017 afii10041 -63 +KPX afii10017 afii10047 -50 +KPX afii10017 afii10065 -15 +KPX afii10017 afii10066 -15 +KPX afii10017 afii10070 -15 +KPX afii10017 afii10080 -15 +KPX afii10017 afii10083 -15 +KPX afii10017 afii10085 -33 +KPX afii10017 afii10086 -15 +KPX afii10017 afii10095 -15 +KPX afii10018 afii10017 -27 +KPX afii10018 afii10021 12 +KPX afii10018 afii10024 25 +KPX afii10018 afii10025 37 +KPX afii10018 afii10037 -40 +KPX afii10018 afii10038 -27 +KPX afii10018 afii10039 -13 +KPX afii10018 afii10041 -27 +KPX afii10018 afii10047 -14 +KPX afii10018 afii10069 12 +KPX afii10018 afii10085 -12 +KPX afii10018 afii10097 23 +KPX afii10019 afii10017 -38 +KPX afii10019 afii10021 -53 +KPX afii10019 afii10024 -40 +KPX afii10019 afii10025 -34 +KPX afii10019 afii10032 -47 +KPX afii10019 afii10035 -47 +KPX afii10019 afii10036 -57 +KPX afii10019 afii10037 -85 +KPX afii10019 afii10038 -54 +KPX afii10019 afii10039 -25 +KPX afii10019 afii10041 -60 +KPX afii10019 afii10044 -48 +KPX afii10019 afii10049 -47 +KPX afii10019 afii10069 12 +KPX afii10019 afii10078 -13 +KPX afii10019 afii10084 12 +KPX afii10019 afii10085 -14 +KPX afii10019 afii10087 -14 +KPX afii10019 afii10089 12 +KPX afii10019 afii10097 12 +KPX afii10020 comma -63 +KPX afii10020 period -75 +KPX afii10020 colon 25 +KPX afii10020 afii10017 -75 +KPX afii10020 afii10025 19 +KPX afii10020 afii10029 -13 +KPX afii10020 afii10030 -25 +KPX afii10020 afii10032 -13 +KPX afii10020 afii10049 -13 +KPX afii10020 afii10065 -25 +KPX afii10020 afii10067 -38 +KPX afii10020 afii10069 -18 +KPX afii10020 afii10070 -30 +KPX afii10020 afii10074 -19 +KPX afii10020 afii10077 -53 +KPX afii10020 afii10078 -40 +KPX afii10020 afii10079 -30 +KPX afii10020 afii10080 -52 +KPX afii10020 afii10082 -28 +KPX afii10020 afii10085 -43 +KPX afii10020 afii10093 -53 +KPX afii10020 afii10094 -50 +KPX afii10020 afii10096 -65 +KPX afii10020 afii10097 -40 +KPX afii10022 afii10025 -14 +KPX afii10024 afii10032 -53 +KPX afii10024 afii10035 -53 +KPX afii10024 afii10037 -34 +KPX afii10024 afii10041 -34 +KPX afii10024 afii10080 -13 +KPX afii10024 afii10085 -30 +KPX afii10025 afii10036 12 +KPX afii10025 afii10037 -13 +KPX afii10025 afii10041 -50 +KPX afii10025 afii10069 13 +KPX afii10028 afii10032 -47 +KPX afii10028 afii10035 -47 +KPX afii10028 afii10037 -13 +KPX afii10028 afii10038 -80 +KPX afii10028 afii10047 -13 +KPX afii10028 afii10070 -25 +KPX afii10028 afii10080 -38 +KPX afii10028 afii10083 -25 +KPX afii10028 afii10085 -43 +KPX afii10028 afii10095 -25 +KPX afii10030 afii10038 -25 +KPX afii10030 afii10065 -14 +KPX afii10030 afii10070 -14 +KPX afii10030 afii10080 -14 +KPX afii10030 afii10083 -14 +KPX afii10032 afii10017 -48 +KPX afii10032 afii10021 -25 +KPX afii10032 afii10024 -38 +KPX afii10032 afii10029 -25 +KPX afii10032 afii10037 -58 +KPX afii10032 afii10038 12 +KPX afii10032 afii10039 -50 +KPX afii10032 afii10041 -38 +KPX afii10032 afii10049 -38 +KPX afii10034 comma -88 +KPX afii10034 period -100 +KPX afii10034 colon 25 +KPX afii10034 afii10017 -88 +KPX afii10034 afii10021 -99 +KPX afii10034 afii10024 -52 +KPX afii10034 afii10025 -33 +KPX afii10034 afii10029 -78 +KPX afii10034 afii10030 -25 +KPX afii10034 afii10032 -13 +KPX afii10034 afii10037 -71 +KPX afii10034 afii10038 -27 +KPX afii10034 afii10039 -63 +KPX afii10034 afii10049 -78 +KPX afii10034 afii10065 -38 +KPX afii10034 afii10069 -36 +KPX afii10034 afii10070 -36 +KPX afii10034 afii10080 -36 +KPX afii10034 afii10095 -14 +KPX afii10034 afii10097 -25 +KPX afii10035 afii10017 -38 +KPX afii10035 afii10029 12 +KPX afii10035 afii10037 -13 +KPX afii10035 afii10039 -13 +KPX afii10035 afii10041 -13 +KPX afii10035 afii10065 7 +KPX afii10035 afii10066 7 +KPX afii10035 afii10070 7 +KPX afii10035 afii10072 7 +KPX afii10035 afii10073 7 +KPX afii10035 afii10080 7 +KPX afii10035 afii10083 7 +KPX afii10035 afii10084 14 +KPX afii10035 afii10086 7 +KPX afii10035 afii10095 7 +KPX afii10036 comma -50 +KPX afii10036 period -63 +KPX afii10036 colon 37 +KPX afii10036 semicolon 12 +KPX afii10036 guillemotleft 25 +KPX afii10036 guillemotright 25 +KPX afii10036 afii10017 -63 +KPX afii10036 afii10021 25 +KPX afii10036 afii10038 -27 +KPX afii10036 afii10065 -36 +KPX afii10036 afii10067 -36 +KPX afii10036 afii10070 -36 +KPX afii10036 afii10074 -24 +KPX afii10036 afii10076 -36 +KPX afii10036 afii10077 -36 +KPX afii10036 afii10078 -36 +KPX afii10036 afii10080 -36 +KPX afii10036 afii10081 -24 +KPX afii10036 afii10082 -25 +KPX afii10036 afii10083 -36 +KPX afii10036 afii10085 -24 +KPX afii10036 afii10087 -24 +KPX afii10036 afii10091 -24 +KPX afii10036 afii10093 -36 +KPX afii10036 afii10094 -36 +KPX afii10036 afii10096 -36 +KPX afii10036 afii10097 -24 +KPX afii10037 comma -51 +KPX afii10037 period -63 +KPX afii10037 colon 25 +KPX afii10037 guillemotleft 12 +KPX afii10037 guillemotright 25 +KPX afii10037 afii10017 -75 +KPX afii10037 afii10021 -40 +KPX afii10037 afii10029 -65 +KPX afii10037 afii10032 -27 +KPX afii10037 afii10038 -53 +KPX afii10037 afii10049 -53 +KPX afii10037 afii10066 -13 +KPX afii10037 afii10067 -47 +KPX afii10037 afii10068 -50 +KPX afii10037 afii10069 -13 +KPX afii10037 afii10070 -47 +KPX afii10037 afii10072 -50 +KPX afii10037 afii10073 -50 +KPX afii10037 afii10074 -15 +KPX afii10037 afii10075 -13 +KPX afii10037 afii10076 -25 +KPX afii10037 afii10077 -50 +KPX afii10037 afii10078 -50 +KPX afii10037 afii10079 -25 +KPX afii10037 afii10080 -47 +KPX afii10037 afii10081 -28 +KPX afii10037 afii10082 -40 +KPX afii10037 afii10083 -47 +KPX afii10037 afii10087 -47 +KPX afii10037 afii10088 -13 +KPX afii10037 afii10090 -13 +KPX afii10037 afii10091 -13 +KPX afii10037 afii10096 -28 +KPX afii10037 afii10097 -47 +KPX afii10038 afii10017 -50 +KPX afii10038 afii10021 -47 +KPX afii10038 afii10029 -13 +KPX afii10038 afii10030 -6 +KPX afii10038 afii10032 12 +KPX afii10038 afii10036 -13 +KPX afii10038 afii10037 -77 +KPX afii10038 afii10041 -34 +KPX afii10038 afii10049 -13 +KPX afii10038 afii10077 -15 +KPX afii10039 afii10032 -51 +KPX afii10039 afii10035 -38 +KPX afii10039 afii10038 -25 +KPX afii10039 afii10080 -20 +KPX afii10039 afii10085 -20 +KPX afii10044 quoteright -121 +KPX afii10044 afii10049 -29 +KPX afii10046 quoteright -121 +KPX afii10046 afii10017 -34 +KPX afii10046 afii10021 -13 +KPX afii10046 afii10024 -28 +KPX afii10046 afii10025 -13 +KPX afii10046 afii10030 -20 +KPX afii10046 afii10032 -25 +KPX afii10046 afii10035 -20 +KPX afii10046 afii10036 -51 +KPX afii10046 afii10039 -40 +KPX afii10046 afii10041 -112 +KPX afii10046 afii10047 -38 +KPX afii10046 afii10049 -13 +KPX afii10047 afii10024 -13 +KPX afii10047 afii10025 25 +KPX afii10047 afii10029 -13 +KPX afii10047 afii10039 -38 +KPX afii10047 afii10049 -13 +KPX afii10047 afii10069 14 +KPX afii10047 afii10072 14 +KPX afii10047 afii10077 -7 +KPX afii10047 afii10078 -14 +KPX afii10047 afii10097 14 +KPX afii10048 afii10017 -56 +KPX afii10048 afii10021 -13 +KPX afii10048 afii10024 -25 +KPX afii10048 afii10029 -25 +KPX afii10048 afii10032 -13 +KPX afii10048 afii10036 -13 +KPX afii10048 afii10039 -51 +KPX afii10048 afii10041 -25 +KPX afii10048 afii10069 7 +KPX afii10048 afii10072 7 +KPX afii10065 afii10085 -13 +KPX afii10065 afii10089 -13 +KPX afii10066 afii10072 -13 +KPX afii10066 afii10073 -13 +KPX afii10066 afii10077 -25 +KPX afii10066 afii10078 -38 +KPX afii10066 afii10080 -13 +KPX afii10066 afii10083 -13 +KPX afii10066 afii10085 -13 +KPX afii10066 afii10086 -13 +KPX afii10066 afii10087 -20 +KPX afii10066 afii10089 -13 +KPX afii10066 afii10092 -25 +KPX afii10066 afii10095 -13 +KPX afii10066 afii10097 -25 +KPX afii10067 afii10065 -7 +KPX afii10067 afii10066 -13 +KPX afii10067 afii10069 -19 +KPX afii10067 afii10073 -13 +KPX afii10067 afii10080 -13 +KPX afii10067 afii10083 -13 +KPX afii10067 afii10086 -7 +KPX afii10067 afii10092 -13 +KPX afii10067 afii10097 -13 +KPX afii10068 period -13 +KPX afii10068 afii10077 -13 +KPX afii10069 afii10070 12 +KPX afii10069 afii10085 -13 +KPX afii10069 afii10092 -13 +KPX afii10069 afii10095 -13 +KPX afii10070 afii10065 -13 +KPX afii10070 afii10066 -13 +KPX afii10070 afii10069 -25 +KPX afii10070 afii10072 -25 +KPX afii10070 afii10073 -13 +KPX afii10070 afii10077 -25 +KPX afii10070 afii10078 -25 +KPX afii10070 afii10080 -13 +KPX afii10070 afii10083 -13 +KPX afii10070 afii10084 -13 +KPX afii10070 afii10086 -25 +KPX afii10070 afii10087 -13 +KPX afii10070 afii10089 -13 +KPX afii10072 afii10065 -13 +KPX afii10072 afii10066 -13 +KPX afii10072 afii10070 -13 +KPX afii10072 afii10073 -13 +KPX afii10072 afii10080 -25 +KPX afii10072 afii10083 -25 +KPX afii10072 afii10089 -13 +KPX afii10072 afii10092 -13 +KPX afii10073 afii10069 -13 +KPX afii10073 afii10072 -13 +KPX afii10073 afii10073 -13 +KPX afii10073 afii10077 -25 +KPX afii10073 afii10078 -25 +KPX afii10073 afii10080 -13 +KPX afii10073 afii10083 -13 +KPX afii10073 afii10085 -7 +KPX afii10073 afii10089 -13 +KPX afii10073 afii10092 -13 +KPX afii10076 guillemotleft -27 +KPX afii10076 afii10065 -25 +KPX afii10076 afii10066 -25 +KPX afii10076 afii10070 -25 +KPX afii10076 afii10073 -13 +KPX afii10076 afii10077 20 +KPX afii10076 afii10080 -38 +KPX afii10076 afii10083 -38 +KPX afii10076 afii10084 -13 +KPX afii10076 afii10086 -25 +KPX afii10076 afii10089 -13 +KPX afii10076 afii10095 -13 +KPX afii10077 afii10065 12 +KPX afii10077 afii10066 12 +KPX afii10077 afii10070 25 +KPX afii10077 afii10073 12 +KPX afii10077 afii10080 12 +KPX afii10077 afii10083 12 +KPX afii10077 afii10085 -13 +KPX afii10077 afii10086 12 +KPX afii10077 afii10089 -13 +KPX afii10080 afii10066 -13 +KPX afii10080 afii10069 -13 +KPX afii10080 afii10072 -25 +KPX afii10080 afii10073 -13 +KPX afii10080 afii10077 -25 +KPX afii10080 afii10078 -38 +KPX afii10080 afii10085 -20 +KPX afii10080 afii10087 -20 +KPX afii10080 afii10089 -26 +KPX afii10080 afii10095 -13 +KPX afii10080 afii10097 -13 +KPX afii10082 afii10069 -13 +KPX afii10082 afii10072 -25 +KPX afii10082 afii10073 -13 +KPX afii10082 afii10077 -38 +KPX afii10082 afii10078 -50 +KPX afii10082 afii10084 -13 +KPX afii10082 afii10085 -13 +KPX afii10082 afii10087 -20 +KPX afii10082 afii10089 -13 +KPX afii10082 afii10095 -13 +KPX afii10082 afii10097 -13 +KPX afii10083 afii10065 -26 +KPX afii10083 afii10066 -13 +KPX afii10083 afii10070 -13 +KPX afii10083 afii10072 -13 +KPX afii10083 afii10073 -13 +KPX afii10083 afii10080 -25 +KPX afii10083 afii10085 -7 +KPX afii10083 afii10086 -25 +KPX afii10083 afii10087 -13 +KPX afii10083 afii10089 -13 +KPX afii10083 afii10092 -13 +KPX afii10084 comma 25 +KPX afii10084 period 12 +KPX afii10084 afii10065 12 +KPX afii10084 afii10073 12 +KPX afii10084 afii10085 -25 +KPX afii10084 afii10097 12 +KPX afii10085 comma -50 +KPX afii10085 period -63 +KPX afii10085 colon -13 +KPX afii10085 semicolon -38 +KPX afii10085 afii10069 -3 +KPX afii10085 afii10072 -25 +KPX afii10085 afii10073 -13 +KPX afii10085 afii10077 -27 +KPX afii10085 afii10078 -25 +KPX afii10085 afii10082 -13 +KPX afii10085 afii10087 -13 +KPX afii10085 afii10095 -13 +KPX afii10085 afii10097 -15 +KPX afii10086 afii10077 -25 +KPX afii10086 afii10078 -38 +KPX afii10086 afii10080 -13 +KPX afii10086 afii10084 -13 +KPX afii10086 afii10085 -33 +KPX afii10086 afii10089 -13 +KPX afii10086 afii10097 -13 +KPX afii10087 afii10065 -13 +KPX afii10087 afii10066 -25 +KPX afii10087 afii10073 -13 +KPX afii10087 afii10080 -25 +KPX afii10087 afii10083 -25 +KPX afii10087 afii10086 -25 +KPX afii10087 afii10089 -13 +KPX afii10087 afii10092 -25 +KPX afii10087 afii10095 -13 +KPX afii10088 afii10065 12 +KPX afii10088 afii10070 25 +KPX afii10088 afii10073 12 +KPX afii10088 afii10080 12 +KPX afii10088 afii10083 12 +KPX afii10088 afii10085 -13 +KPX afii10091 afii10065 25 +KPX afii10091 afii10070 25 +KPX afii10091 afii10080 12 +KPX afii10091 afii10085 -13 +KPX afii10094 afii10084 -13 +KPX afii10094 afii10089 -38 +KPX afii10095 afii10066 -13 +KPX afii10095 afii10069 -13 +KPX afii10095 afii10072 -25 +KPX afii10095 afii10073 -13 +KPX afii10095 afii10077 -25 +KPX afii10095 afii10078 -38 +KPX afii10095 afii10080 -13 +KPX afii10095 afii10083 -13 +KPX afii10095 afii10084 -13 +KPX afii10095 afii10086 -13 +KPX afii10095 afii10087 -20 +KPX afii10095 afii10097 -25 +KPX afii10096 afii10066 -13 +KPX afii10096 afii10072 -13 +KPX afii10096 afii10077 -25 +KPX afii10096 afii10078 -38 +KPX afii10096 afii10080 -13 +KPX afii10096 afii10083 -13 +KPX afii10096 afii10087 -40 +KPX afii10096 afii10089 -13 +KPX afii10096 afii10095 -13 +KPX afii10110 comma -50 +KPX afii10110 period -63 +KPX afii10110 colon -13 +KPX afii10110 semicolon -38 +KPX afii10110 guillemotleft 12 +KPX afii10110 guillemotright 12 +KPX afii10050 comma -25 +KPX afii10050 period -38 +KPX afii10050 colon 25 +KPX afii10050 guillemotleft 25 +KPX afii10050 guillemotright 25 +KPX pi zeta 16 +EndKernPairs +EndKernData +EndFontMetrics diff --git a/gulliver/thirdparty/html2ps_pdf/fonts/timesi.ttf b/thirdparty/html2ps_pdf/fonts/timesi.ttf similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/fonts/timesi.ttf rename to thirdparty/html2ps_pdf/fonts/timesi.ttf diff --git a/gulliver/thirdparty/html2ps_pdf/fonts/verdana.ttf b/thirdparty/html2ps_pdf/fonts/verdana.ttf similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/fonts/verdana.ttf rename to thirdparty/html2ps_pdf/fonts/verdana.ttf diff --git a/gulliver/thirdparty/html2ps_pdf/fonts/verdanab.ttf b/thirdparty/html2ps_pdf/fonts/verdanab.ttf similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/fonts/verdanab.ttf rename to thirdparty/html2ps_pdf/fonts/verdanab.ttf diff --git a/gulliver/thirdparty/html2ps_pdf/fonts/verdanai.ttf b/thirdparty/html2ps_pdf/fonts/verdanai.ttf similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/fonts/verdanai.ttf rename to thirdparty/html2ps_pdf/fonts/verdanai.ttf diff --git a/gulliver/thirdparty/html2ps_pdf/fonts/verdanaz.ttf b/thirdparty/html2ps_pdf/fonts/verdanaz.ttf similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/fonts/verdanaz.ttf rename to thirdparty/html2ps_pdf/fonts/verdanaz.ttf diff --git a/gulliver/thirdparty/html2ps_pdf/globals.inc.php b/thirdparty/html2ps_pdf/globals.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/globals.inc.php rename to thirdparty/html2ps_pdf/globals.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/globals.php b/thirdparty/html2ps_pdf/globals.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/globals.php rename to thirdparty/html2ps_pdf/globals.php diff --git a/gulliver/thirdparty/html2ps_pdf/height.php b/thirdparty/html2ps_pdf/height.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/height.php rename to thirdparty/html2ps_pdf/height.php diff --git a/gulliver/thirdparty/html2ps_pdf/help/UML/Custom_fetcher_session.png b/thirdparty/html2ps_pdf/help/UML/Custom_fetcher_session.png similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/help/UML/Custom_fetcher_session.png rename to thirdparty/html2ps_pdf/help/UML/Custom_fetcher_session.png diff --git a/gulliver/thirdparty/html2ps_pdf/help/UML/Data_filters.PNG b/thirdparty/html2ps_pdf/help/UML/Data_filters.PNG similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/help/UML/Data_filters.PNG rename to thirdparty/html2ps_pdf/help/UML/Data_filters.PNG diff --git a/gulliver/thirdparty/html2ps_pdf/help/UML/Destinations.PNG b/thirdparty/html2ps_pdf/help/UML/Destinations.PNG similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/help/UML/Destinations.PNG rename to thirdparty/html2ps_pdf/help/UML/Destinations.PNG diff --git a/gulliver/thirdparty/html2ps_pdf/help/UML/Fetchers.PNG b/thirdparty/html2ps_pdf/help/UML/Fetchers.PNG similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/help/UML/Fetchers.PNG rename to thirdparty/html2ps_pdf/help/UML/Fetchers.PNG diff --git a/gulliver/thirdparty/html2ps_pdf/help/UML/Layout_engines.PNG b/thirdparty/html2ps_pdf/help/UML/Layout_engines.PNG similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/help/UML/Layout_engines.PNG rename to thirdparty/html2ps_pdf/help/UML/Layout_engines.PNG diff --git a/gulliver/thirdparty/html2ps_pdf/help/UML/Multiple_fetcher_session.PNG b/thirdparty/html2ps_pdf/help/UML/Multiple_fetcher_session.PNG similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/help/UML/Multiple_fetcher_session.PNG rename to thirdparty/html2ps_pdf/help/UML/Multiple_fetcher_session.PNG diff --git a/gulliver/thirdparty/html2ps_pdf/help/UML/Output_drivers.PNG b/thirdparty/html2ps_pdf/help/UML/Output_drivers.PNG similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/help/UML/Output_drivers.PNG rename to thirdparty/html2ps_pdf/help/UML/Output_drivers.PNG diff --git a/gulliver/thirdparty/html2ps_pdf/help/UML/Output_filters.PNG b/thirdparty/html2ps_pdf/help/UML/Output_filters.PNG similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/help/UML/Output_filters.PNG rename to thirdparty/html2ps_pdf/help/UML/Output_filters.PNG diff --git a/gulliver/thirdparty/html2ps_pdf/help/UML/Parsers.PNG b/thirdparty/html2ps_pdf/help/UML/Parsers.PNG similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/help/UML/Parsers.PNG rename to thirdparty/html2ps_pdf/help/UML/Parsers.PNG diff --git a/gulliver/thirdparty/html2ps_pdf/help/UML/Post_filters.PNG b/thirdparty/html2ps_pdf/help/UML/Post_filters.PNG similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/help/UML/Post_filters.PNG rename to thirdparty/html2ps_pdf/help/UML/Post_filters.PNG diff --git a/gulliver/thirdparty/html2ps_pdf/help/UML/Pre_filters.PNG b/thirdparty/html2ps_pdf/help/UML/Pre_filters.PNG similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/help/UML/Pre_filters.PNG rename to thirdparty/html2ps_pdf/help/UML/Pre_filters.PNG diff --git a/gulliver/thirdparty/html2ps_pdf/help/UML/Simple_custom_fetcher_session.png b/thirdparty/html2ps_pdf/help/UML/Simple_custom_fetcher_session.png similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/help/UML/Simple_custom_fetcher_session.png rename to thirdparty/html2ps_pdf/help/UML/Simple_custom_fetcher_session.png diff --git a/gulliver/thirdparty/html2ps_pdf/help/UML/Simple_fetcher_session.PNG b/thirdparty/html2ps_pdf/help/UML/Simple_fetcher_session.PNG similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/help/UML/Simple_fetcher_session.PNG rename to thirdparty/html2ps_pdf/help/UML/Simple_fetcher_session.PNG diff --git a/gulliver/thirdparty/html2ps_pdf/help/api.html b/thirdparty/html2ps_pdf/help/api.html similarity index 96% rename from gulliver/thirdparty/html2ps_pdf/help/api.html rename to thirdparty/html2ps_pdf/help/api.html index 14b617bd6..e3d5a0d75 100644 --- a/gulliver/thirdparty/html2ps_pdf/help/api.html +++ b/thirdparty/html2ps_pdf/help/api.html @@ -1,409 +1,409 @@ - - -API description - - - - - -

      Beware: GLOBALS!

      -

      -At the moment, the layout/conversion engine makes use of several global variables: -

        -
      • $g_config array (in particular, $g_config['renderforms'], $g_config['renderlinks'], $g_config['renderimages'], - $g_config['debugbox'], $g_config['mode'], $g_config['cssmedia'] and $g_config['draw_page_border'] - elements for all output methods and $g_config['ps2pdf'] and $g_config['transparency_workaround'] for - 'fastps' output method.
      • -
      • $g_px_scale
      • -
      • $g_pt_scale
      • -
      -Please take this into account while using API. We're planning to get rid of these globals eventually. For a while, -you may initialize these global with the code from samples above. -

      -

      -Also, there's some global items script initializes itself: -

        -
      • $g_box_uid
      • -
      • $g_colors
      • -
      • $__g_css_manager
      • -
      • $__g_css_handler_set
      • -
      • $g_encoding_aliases
      • -
      • $g_frame_level
      • -
      • $g_font_resolver
      • -
      • $g_font_resolver_pdf
      • -
      • $g_html_entities
      • -
      • $g_image_cache
      • -
      • $g_last_assigned_font_id
      • -
      • $g_manager_encodings
      • -
      • $g_media
      • -
      • $g_predefined_media
      • -
      • $g_stylesheet_title
      • -
      • $g_tag_attrs
      • -
      • $g_unicode_glyphs
      • -
      • $g_utf8_converters
      • -
      -There's no need to initialize or modify these variables; just don't accidentally overwrite them. Some of them -are here for "historical" reasons and will be eventually removed. Some are here due lack of static class variables -in older PHP versions. -

      - -

      Conversion pipeline

      -
      -PipelineFactory is a simple factory class simplifying building of Pipeline instances; -create_default_pipeline() will build a simple ready-to-run conversion pipeline. The usage of -PipelineFactory is not required; you may create the Pipeline object and fill -the appropriate fields manually. - -
      -class PipelineFactory {
      -  function create_default_pipeline();
      -}
      -
      -
      - -
      -Pipeline class describe the process of conversion as a whole; it contains references to classes, described -above and is responsible for calling them in correct order and error handling. -
      -class Pipeline {
      -  var $fetchers;
      -  var $data_filters;
      -  var $parser;
      -  var $pre_tree_filters;
      -  var $layout_engine;
      -  var $post_tree_filters;
      -  var $output_driver;
      -  var $output_filter;
      -  var $destination;
      -
      -  function Pipeline();
      -
      -  function configure($options);
      -  function process($data_id, &$media);
      -  function process_batch($data_id_array, &$media);
      -  function error_message();
      -
      -  function &get_dispatcher();
      -}
      -
      -
      - -
      - -

      Description of interfaces and classes

      - -
      -Almost all interfaces described below include -error_message method. -It should return the user-readable description of -the error. This description MAY contain HTML tags, but should remain -readable in case tags are removed. -
      - -
      -

      Fetcher interface provides a method of -fetching the data required -to build a document tree. Normally, classes implementing this interface would -fetch an HTML/XHTML string from somewhere (e.g. from remove HTTP server, -local file or database). Nevertheless, it MAY fetch ANY data provided that -this data will be understood by parser. The pipeline object may contain -several fetcher objects; in this case they're used one-by-one until -one of them return non-null value.

      - -

      It is assumed that if you need to get data from non-standard places (e.g. from template engine or database), you -should implement Fetcher in your own class.

      - -

      -Note that the get_data method returns the FetchedData object (or one of its descendants) instead of -HTML string! -

      -
      - - - -
      -
      get_data($data_id)
      -
      -Fetches the URL and returns page content and supplementary information. -
        -
      • $data_id – URI identifying the page location
      • -
      -
      - -
      get_base_url()
      -
      Returns URL to be used as the base url when resolving relative links
      -
      - -
      -FetcherURL reads remote HTML page via HTTP or HTTPS. -
      - -
      -FetcherLocalFile reads local file; in this case $data_id should contain path to the file to be read. -
      - -
      -DataFilter interface describes the filters modifying the raw input data. -The main purpose of these filters is to fix the raw data so that it can be -processed by parser without errors. -
      - - - -
      -
      process($data)
      -
      -Processes the FetchedData object and returns another FetchedData object with (probably) modified content -
        -
      • $data – FetchedData object
      • -
      -
      -
      - -
      -DataFilterDoctype tries to detect the mode this document should be rendered in (HTML, XHTML, QUIRKS). -
      - -
      -DataFilterHTML2XHTML -The precise description of this filter actions are beyond the scope of this -document. In general, it makes the input document a wellformed XML document -(possibly throwing out invalid parts, by the way). Note that it is achieved -by extensive use of regular expressions; no XML/HTML parsers involved -in conversion at this stage. -
      - -
      -DataFilterXHTML2XHTML does some additional XHTML processing required for the -script; for example, it removes comments, SCRIPT tags and does some other steps simplifying -document processing. -
      - -
      -DataFilterUTF8 converts content from the source encoding to UTF-8. It is a good idea -to use this filter if you're not limited by ASCII encoding. -
      - -
      -Parser interface provides a method of building the DOM tree from the -filtered data. -
      - - - -
      -
      process($data)
      -
      -Processes the FetchedData object and returns the document tree (somewhat similar to DOM) object. -
        -
      • $data – FetchedData object
      • -
      -
      -
      - -
      -ParserXHTML -
      - -
      -PreTreeFilter interface describes a procedure of document tree transformation executed before -the layout engine starts. -
      - - - -
      -
      process($data)
      -
      -Make some modifications in document tree (in-place) before the layout engine have been run. -
        -
      • $data – Document tree object
      • -
      -
      -
      - -
      -PreTreeFilterHTML2PSFields handles the processing -of special fields (such a date, page count, page number, etc.). -
      - -
      -PreTreeFilterHeaderFooter adds script-generated header and footer to the document tree. -
      - -
      -LayoutEngine interface of a class processing -of the document tree and calculating positions of page elements. In theory, different implementations -of this interface will allow us to use "lightweight" layout engines in case we do -not need full HTML/CSS support. -
      - - - -
      -
      process($data)
      -
      -Runs the layout process (document tree object is modified in-place). -
        -
      • $data – Document tree object
      • -
      -
      -
      - -
      -LayoutEngineDefault - a standard layout engine HTML2PS uses. -
      - -
      -PostTreeFilter interface describes a procedure of document tree transformation executed after -the layout engine completes. -
      - - - -
      -
      process($data)
      -
      -Apply some changes to document tree (in-place) after the layout engine have been run. -
        -
      • $data – document tree object
      • -
      -
      -
      - -
      OutputDriver interface contains device-specific functions - drawing, movement, fonts selection, etc. -In general, description of this interface is beyond the scope of this document, as users are not intended -to implement this interface themselves. Instead, they would use pre-defined output drivers described below. -
      - - - -
      -OutputDriverPDFLIB outputs PDF using PDFLIB. -
      - -
      -OutputDriverFPDF outputs PDF using FPDF -
      - -
      -OutputDriverFastPS handles Postscript Level 3 output. -
      - -
      -OutputDriverFastPSLevel2 handles Postscript Level 2 output. -
      - -
      -OutputFilter interface describes the filter applied to generated PS or PDF file. -
      - - - -
      -OutputFilterPS2PDF runs the PS2PDF utitity on the generated file. -
      - -
      -OutputFilterGZIP compresses generated file using ZLIB. -
      - -
      -Destination interface describes the "channel" object which determines where the final output file -should be placed. -
      - - - -
      -DestinationBrowser outputs the generated file directly to the browser. -
      - -
      -DestinationDownload outputs the generated file directly to the browser. -Unlike DestinationBrowser, this class send headers preventing the file from being opened directly -in the browser window. -
      - -
      -DestinationFile saves generated file on the server side. -
      - -

      Implementing your own fetcher class

      -

      -Sometimes you may need to convert HTML code taken from database or from other non-standard sources. -In this case you should implement Fetcher interface yourself, returning the string to be converted -from the get_data method. Additional parameters (like database connection settings, -template variables, etc) may be specified either as globals (not recommended, though), passed as a parameters -to constructor of fetcher object or as $dataId parameter of get_data method. -

      -

      -Keep in mind that if you're including files from your HTML code (e.g. stylesheets or images), you should either -return null from your fetcher for URL of these files, or handle them yourself. Unless you do it, -these files will not be available. -

      - -
      -class MyFetcherLocalFile extends Fetcher {
      -  var $_content;
      -
      -  function MyFetcherLocalFile($file) {
      -    $this->_content = file_get_contents($file);
      -  }
      -
      -  function get_data($dummy1) {
      -    return new FetchedDataURL($this->_content, array(), "");
      -  }
      -
      -  function get_base_url() {
      -    return "";
      -  }
      -}
      -
      - -Also see sample.simplest.from.file.php and sample.simples.from.memory.php files. - -

      Class dependencies

      -The pipeline object contains the following: -
        -
      • one or more objects implementing Fetcher interface;
      • -
      • zero or more objects implementing DataFilter interface;
      • -
      • one object implementing Parser interface;
      • -
      • zero or more objects implementing PreTreeFilter interface;
      • -
      • one object implementing LayoutEngine interface;
      • -
      • zero or more objects implementing PostTreeFilter interface;
      • -
      • one object implementing OutputDriver interface;
      • -
      • one object implementing Destination interface;
      • -
      - -No other dependencies between class in interfaces (except "implements"). - -Note that order of filters is important; imagine you're using some king of tree filter which adds header block -containing HTML2PS-specific fields. In this case you must add this filter before PostTreeFilterHTML2PSFields, or -you'll get raw field codes in generated output. - - + + +API description + + + + + +

      Beware: GLOBALS!

      +

      +At the moment, the layout/conversion engine makes use of several global variables: +

        +
      • $g_config array (in particular, $g_config['renderforms'], $g_config['renderlinks'], $g_config['renderimages'], + $g_config['debugbox'], $g_config['mode'], $g_config['cssmedia'] and $g_config['draw_page_border'] + elements for all output methods and $g_config['ps2pdf'] and $g_config['transparency_workaround'] for + 'fastps' output method.
      • +
      • $g_px_scale
      • +
      • $g_pt_scale
      • +
      +Please take this into account while using API. We're planning to get rid of these globals eventually. For a while, +you may initialize these global with the code from samples above. +

      +

      +Also, there's some global items script initializes itself: +

        +
      • $g_box_uid
      • +
      • $g_colors
      • +
      • $__g_css_manager
      • +
      • $__g_css_handler_set
      • +
      • $g_encoding_aliases
      • +
      • $g_frame_level
      • +
      • $g_font_resolver
      • +
      • $g_font_resolver_pdf
      • +
      • $g_html_entities
      • +
      • $g_image_cache
      • +
      • $g_last_assigned_font_id
      • +
      • $g_manager_encodings
      • +
      • $g_media
      • +
      • $g_predefined_media
      • +
      • $g_stylesheet_title
      • +
      • $g_tag_attrs
      • +
      • $g_unicode_glyphs
      • +
      • $g_utf8_converters
      • +
      +There's no need to initialize or modify these variables; just don't accidentally overwrite them. Some of them +are here for "historical" reasons and will be eventually removed. Some are here due lack of static class variables +in older PHP versions. +

      + +

      Conversion pipeline

      +
      +PipelineFactory is a simple factory class simplifying building of Pipeline instances; +create_default_pipeline() will build a simple ready-to-run conversion pipeline. The usage of +PipelineFactory is not required; you may create the Pipeline object and fill +the appropriate fields manually. + +
      +class PipelineFactory {
      +  function create_default_pipeline();
      +}
      +
      +
      + +
      +Pipeline class describe the process of conversion as a whole; it contains references to classes, described +above and is responsible for calling them in correct order and error handling. +
      +class Pipeline {
      +  var $fetchers;
      +  var $data_filters;
      +  var $parser;
      +  var $pre_tree_filters;
      +  var $layout_engine;
      +  var $post_tree_filters;
      +  var $output_driver;
      +  var $output_filter;
      +  var $destination;
      +
      +  function Pipeline();
      +
      +  function configure($options);
      +  function process($data_id, &$media);
      +  function process_batch($data_id_array, &$media);
      +  function error_message();
      +
      +  function &get_dispatcher();
      +}
      +
      +
      + +
      + +

      Description of interfaces and classes

      + +
      +Almost all interfaces described below include +error_message method. +It should return the user-readable description of +the error. This description MAY contain HTML tags, but should remain +readable in case tags are removed. +
      + +
      +

      Fetcher interface provides a method of +fetching the data required +to build a document tree. Normally, classes implementing this interface would +fetch an HTML/XHTML string from somewhere (e.g. from remove HTTP server, +local file or database). Nevertheless, it MAY fetch ANY data provided that +this data will be understood by parser. The pipeline object may contain +several fetcher objects; in this case they're used one-by-one until +one of them return non-null value.

      + +

      It is assumed that if you need to get data from non-standard places (e.g. from template engine or database), you +should implement Fetcher in your own class.

      + +

      +Note that the get_data method returns the FetchedData object (or one of its descendants) instead of +HTML string! +

      +
      + + + +
      +
      get_data($data_id)
      +
      +Fetches the URL and returns page content and supplementary information. +
        +
      • $data_id – URI identifying the page location
      • +
      +
      + +
      get_base_url()
      +
      Returns URL to be used as the base url when resolving relative links
      +
      + +
      +FetcherURL reads remote HTML page via HTTP or HTTPS. +
      + +
      +FetcherLocalFile reads local file; in this case $data_id should contain path to the file to be read. +
      + +
      +DataFilter interface describes the filters modifying the raw input data. +The main purpose of these filters is to fix the raw data so that it can be +processed by parser without errors. +
      + + + +
      +
      process($data)
      +
      +Processes the FetchedData object and returns another FetchedData object with (probably) modified content +
        +
      • $data – FetchedData object
      • +
      +
      +
      + +
      +DataFilterDoctype tries to detect the mode this document should be rendered in (HTML, XHTML, QUIRKS). +
      + +
      +DataFilterHTML2XHTML +The precise description of this filter actions are beyond the scope of this +document. In general, it makes the input document a wellformed XML document +(possibly throwing out invalid parts, by the way). Note that it is achieved +by extensive use of regular expressions; no XML/HTML parsers involved +in conversion at this stage. +
      + +
      +DataFilterXHTML2XHTML does some additional XHTML processing required for the +script; for example, it removes comments, SCRIPT tags and does some other steps simplifying +document processing. +
      + +
      +DataFilterUTF8 converts content from the source encoding to UTF-8. It is a good idea +to use this filter if you're not limited by ASCII encoding. +
      + +
      +Parser interface provides a method of building the DOM tree from the +filtered data. +
      + + + +
      +
      process($data)
      +
      +Processes the FetchedData object and returns the document tree (somewhat similar to DOM) object. +
        +
      • $data – FetchedData object
      • +
      +
      +
      + +
      +ParserXHTML +
      + +
      +PreTreeFilter interface describes a procedure of document tree transformation executed before +the layout engine starts. +
      + + + +
      +
      process($data)
      +
      +Make some modifications in document tree (in-place) before the layout engine have been run. +
        +
      • $data – Document tree object
      • +
      +
      +
      + +
      +PreTreeFilterHTML2PSFields handles the processing +of special fields (such a date, page count, page number, etc.). +
      + +
      +PreTreeFilterHeaderFooter adds script-generated header and footer to the document tree. +
      + +
      +LayoutEngine interface of a class processing +of the document tree and calculating positions of page elements. In theory, different implementations +of this interface will allow us to use "lightweight" layout engines in case we do +not need full HTML/CSS support. +
      + + + +
      +
      process($data)
      +
      +Runs the layout process (document tree object is modified in-place). +
        +
      • $data – Document tree object
      • +
      +
      +
      + +
      +LayoutEngineDefault - a standard layout engine HTML2PS uses. +
      + +
      +PostTreeFilter interface describes a procedure of document tree transformation executed after +the layout engine completes. +
      + + + +
      +
      process($data)
      +
      +Apply some changes to document tree (in-place) after the layout engine have been run. +
        +
      • $data – document tree object
      • +
      +
      +
      + +
      OutputDriver interface contains device-specific functions - drawing, movement, fonts selection, etc. +In general, description of this interface is beyond the scope of this document, as users are not intended +to implement this interface themselves. Instead, they would use pre-defined output drivers described below. +
      + + + +
      +OutputDriverPDFLIB outputs PDF using PDFLIB. +
      + +
      +OutputDriverFPDF outputs PDF using FPDF +
      + +
      +OutputDriverFastPS handles Postscript Level 3 output. +
      + +
      +OutputDriverFastPSLevel2 handles Postscript Level 2 output. +
      + +
      +OutputFilter interface describes the filter applied to generated PS or PDF file. +
      + + + +
      +OutputFilterPS2PDF runs the PS2PDF utitity on the generated file. +
      + +
      +OutputFilterGZIP compresses generated file using ZLIB. +
      + +
      +Destination interface describes the "channel" object which determines where the final output file +should be placed. +
      + + + +
      +DestinationBrowser outputs the generated file directly to the browser. +
      + +
      +DestinationDownload outputs the generated file directly to the browser. +Unlike DestinationBrowser, this class send headers preventing the file from being opened directly +in the browser window. +
      + +
      +DestinationFile saves generated file on the server side. +
      + +

      Implementing your own fetcher class

      +

      +Sometimes you may need to convert HTML code taken from database or from other non-standard sources. +In this case you should implement Fetcher interface yourself, returning the string to be converted +from the get_data method. Additional parameters (like database connection settings, +template variables, etc) may be specified either as globals (not recommended, though), passed as a parameters +to constructor of fetcher object or as $dataId parameter of get_data method. +

      +

      +Keep in mind that if you're including files from your HTML code (e.g. stylesheets or images), you should either +return null from your fetcher for URL of these files, or handle them yourself. Unless you do it, +these files will not be available. +

      + +
      +class MyFetcherLocalFile extends Fetcher {
      +  var $_content;
      +
      +  function MyFetcherLocalFile($file) {
      +    $this->_content = file_get_contents($file);
      +  }
      +
      +  function get_data($dummy1) {
      +    return new FetchedDataURL($this->_content, array(), "");
      +  }
      +
      +  function get_base_url() {
      +    return "";
      +  }
      +}
      +
      + +Also see sample.simplest.from.file.php and sample.simples.from.memory.php files. + +

      Class dependencies

      +The pipeline object contains the following: +
        +
      • one or more objects implementing Fetcher interface;
      • +
      • zero or more objects implementing DataFilter interface;
      • +
      • one object implementing Parser interface;
      • +
      • zero or more objects implementing PreTreeFilter interface;
      • +
      • one object implementing LayoutEngine interface;
      • +
      • zero or more objects implementing PostTreeFilter interface;
      • +
      • one object implementing OutputDriver interface;
      • +
      • one object implementing Destination interface;
      • +
      + +No other dependencies between class in interfaces (except "implements"). + +Note that order of filters is important; imagine you're using some king of tree filter which adds header block +containing HTML2PS-specific fields. In this case you must add this filter before PostTreeFilterHTML2PSFields, or +you'll get raw field codes in generated output. + + \ No newline at end of file diff --git a/gulliver/thirdparty/html2ps_pdf/help/api_events.html b/thirdparty/html2ps_pdf/help/api_events.html similarity index 96% rename from gulliver/thirdparty/html2ps_pdf/help/api_events.html rename to thirdparty/html2ps_pdf/help/api_events.html index 063d29ae3..f9262bf7e 100644 --- a/gulliver/thirdparty/html2ps_pdf/help/api_events.html +++ b/thirdparty/html2ps_pdf/help/api_events.html @@ -1,95 +1,95 @@ - - -Events - - - - - -

      Events

      -

      -Sometimes you'd want to add your own code to the rendering routines; for example, you could want to make your own watermarks, -count pages in the multiple-document batch, add digital signature to the generated PDF file or -perform any other actions requiring low-level access to PDF file at the certain moments. Now you may do this using -HTML2PS events. Pipeline object will fire events at predefined moments while rendering PDF file; you may catch them and -do something useful. -

      - -

      The code below illustrates installation of a simple callback to be called immediately after -new page was rendered. (If you're using PHP 5, you can write this way more elegant, but we're keeping PHP 4 compatibility here)

      -
      -$dispatcher =& $pipeline->get_dispatcher();
      -$dispatcher->add_observer('after-page', 'my_watermark_callback_func');
      -
      - -

      -A single parameter is passed to the callback function: an associative array containing information related to event. -

      - -

      Following events are available:

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      NameFired…Event information
      after-batchafter all documents in current batch were renderedpipeline: reference to current pipeline object
      after-documentafter all pages in a current document were renderedpipeline: reference to current pipeline object; document: reference to the body box object
      after-pageafter all elements were rendered on current page, but before new page is added.pipeline: reference to current pipeline object; document: reference to the body box object; pageno: current page number (1-based)
      before-batchbefore new document batch starts renderingpipeline: reference to current pipeline object
      before-documentbefore new document in a batch starts renderingpipeline: reference to current pipeline object; document: reference to the body box object
      before-pageafter new blank page is added to the PDF document but before any elements are renderedpipeline: reference to current pipeline object; document: reference to the body box object; pageno: current page number (1-based)
      - - + + +Events + + + + + +

      Events

      +

      +Sometimes you'd want to add your own code to the rendering routines; for example, you could want to make your own watermarks, +count pages in the multiple-document batch, add digital signature to the generated PDF file or +perform any other actions requiring low-level access to PDF file at the certain moments. Now you may do this using +HTML2PS events. Pipeline object will fire events at predefined moments while rendering PDF file; you may catch them and +do something useful. +

      + +

      The code below illustrates installation of a simple callback to be called immediately after +new page was rendered. (If you're using PHP 5, you can write this way more elegant, but we're keeping PHP 4 compatibility here)

      +
      +$dispatcher =& $pipeline->get_dispatcher();
      +$dispatcher->add_observer('after-page', 'my_watermark_callback_func');
      +
      + +

      +A single parameter is passed to the callback function: an associative array containing information related to event. +

      + +

      Following events are available:

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      NameFired…Event information
      after-batchafter all documents in current batch were renderedpipeline: reference to current pipeline object
      after-documentafter all pages in a current document were renderedpipeline: reference to current pipeline object; document: reference to the body box object
      after-pageafter all elements were rendered on current page, but before new page is added.pipeline: reference to current pipeline object; document: reference to the body box object; pageno: current page number (1-based)
      before-batchbefore new document batch starts renderingpipeline: reference to current pipeline object
      before-documentbefore new document in a batch starts renderingpipeline: reference to current pipeline object; document: reference to the body box object
      before-pageafter new blank page is added to the PDF document but before any elements are renderedpipeline: reference to current pipeline object; document: reference to the body box object; pageno: current page number (1-based)
      + + \ No newline at end of file diff --git a/gulliver/thirdparty/html2ps_pdf/help/api_fetchers.html b/thirdparty/html2ps_pdf/help/api_fetchers.html similarity index 97% rename from gulliver/thirdparty/html2ps_pdf/help/api_fetchers.html rename to thirdparty/html2ps_pdf/help/api_fetchers.html index 4bb3c859a..4a652ec65 100644 --- a/gulliver/thirdparty/html2ps_pdf/help/api_fetchers.html +++ b/thirdparty/html2ps_pdf/help/api_fetchers.html @@ -1,70 +1,70 @@ - - -How do "fetchers" work? - - - - - -

      How do "fetchers" work?

      -

      -Basically, "fetcher" is a simple object responsible for delivering external files to the script. -Default fetcher object supplied with html2ps/pdf fetches HTML, images and CSS from remote sites using HTTP protocol. -If you're using your own fetcher, you need to implement 'get_data' function returning contents of requested file and, -probably, 'get_base_url', returning URL to be used as a base one while resolving relative URLs in recently fetched HTML file. -

      - -

      -The image below illustrates simple html2ps session using default fetcher while converting html file from abstract test.com site. -

      - - - -

      -If you have pages stored on your local system or dynamically generated and kept in memory, you don't need to use HTTP protocol to fetch them. -In this case, you should use custom fetcher, so session will look similar to image below. Note that fetcher processes all requests, -returning valid content for all requests; this makes difference from the very simple fetcher supplied with html2ps, which does always -return memory string content whatever the request is. Internals of the fully-featured fetcher will depend on your system architecture greatly, -so most likely such fetcher will never be included to html2ps distribution. -

      - - - -

      -The image below illustrates why images and external stylesheets are not rendered when you're using too simple fetcher object. -

      - - - -

      -Sometimes you need to fetch files from different places; for example, HTML code is generated locally, while images and CSS files should be fetched via -HTTP protocol. In this case you'll need to use several fetchers at once, as illustrated below. Note that in this case you need to implement 'get_base_url' -function returning correct URL so script will be able to resolve relative URLs contained in HTML code. -

      - - - - + + +How do "fetchers" work? + + + + + +

      How do "fetchers" work?

      +

      +Basically, "fetcher" is a simple object responsible for delivering external files to the script. +Default fetcher object supplied with html2ps/pdf fetches HTML, images and CSS from remote sites using HTTP protocol. +If you're using your own fetcher, you need to implement 'get_data' function returning contents of requested file and, +probably, 'get_base_url', returning URL to be used as a base one while resolving relative URLs in recently fetched HTML file. +

      + +

      +The image below illustrates simple html2ps session using default fetcher while converting html file from abstract test.com site. +

      + + + +

      +If you have pages stored on your local system or dynamically generated and kept in memory, you don't need to use HTTP protocol to fetch them. +In this case, you should use custom fetcher, so session will look similar to image below. Note that fetcher processes all requests, +returning valid content for all requests; this makes difference from the very simple fetcher supplied with html2ps, which does always +return memory string content whatever the request is. Internals of the fully-featured fetcher will depend on your system architecture greatly, +so most likely such fetcher will never be included to html2ps distribution. +

      + + + +

      +The image below illustrates why images and external stylesheets are not rendered when you're using too simple fetcher object. +

      + + + +

      +Sometimes you need to fetch files from different places; for example, HTML code is generated locally, while images and CSS files should be fetched via +HTTP protocol. In this case you'll need to use several fetchers at once, as illustrated below. Note that in this case you need to implement 'get_base_url' +function returning correct URL so script will be able to resolve relative URLs contained in HTML code. +

      + + + + \ No newline at end of file diff --git a/gulliver/thirdparty/html2ps_pdf/help/api_samples.html b/thirdparty/html2ps_pdf/help/api_samples.html similarity index 96% rename from gulliver/thirdparty/html2ps_pdf/help/api_samples.html rename to thirdparty/html2ps_pdf/help/api_samples.html index 4b406f120..e117e59f2 100644 --- a/gulliver/thirdparty/html2ps_pdf/help/api_samples.html +++ b/thirdparty/html2ps_pdf/help/api_samples.html @@ -1,139 +1,139 @@ - - -Minimal code samples - - - - - -

      Minimal code

      -

      Using the default pipeline

      -
      -require_once('pipeline.factory.class.php');
      -parse_config_file('./html2ps.config');
      -
      -global $g_config;
      -$g_config = array(
      -                  'cssmedia'     => 'screen',
      -                  'renderimages' => true,
      -                  'renderforms'  => false,
      -                  'renderlinks'  => true,
      -                  'mode'         => 'html',
      -                  'debugbox'     => false,
      -                  'draw_page_border' => false
      -                  );
      -
      -$media = Media::predefined('A4');
      -$media->set_landscape(false);
      -$media->set_margins(array('left'   => 0,
      -                          'right'  => 0,
      -                          'top'    => 0,
      -                          'bottom' => 0));
      -$media->set_pixels(1024);
      -
      -global $g_px_scale;
      -$g_px_scale = mm2pt($media->width() - $media->margins['left'] - $media->margins['right']) / $media->pixels;
      -
      -global $g_pt_scale;
      -$g_pt_scale = $g_px_scale * 1.43; 
      -
      -$pipeline = PipelineFactory::create_default_pipeline("","");
      -$pipeline->process('http://www.google.com', $media); 
      -
      - -

      Building your own conversion pipeline

      -
      -require_once('pipeline.class.php');
      -parse_config_file('html2ps.config');
      -
      -$g_config = array(
      -                  'cssmedia'     => 'screen',
      -                  'renderimages' => true,
      -                  'renderforms'  => false,
      -                  'renderlinks'  => true,
      -                  'mode'         => 'html',
      -                  'debugbox'     => false,
      -                  'draw_page_border' => false
      -                  );
      -
      -$media = Media::predefined('A4');
      -$media->set_landscape(false);
      -$media->set_margins(array('left'   => 0,
      -                          'right'  => 0,
      -                          'top'    => 0,
      -                          'bottom' => 0));
      -$media->set_pixels(1024);
      -
      -$g_px_scale = mm2pt($media->width() - $media->margins['left'] - $media->margins['right']) / $media->pixels;
      -$g_pt_scale = $g_px_scale * 1.43; 
      -
      -$pipeline = new Pipeline;
      -$pipeline->fetchers[]     = new FetcherURL;
      -$pipeline->data_filters[] = new DataFilterHTML2XHTML;
      -$pipeline->parser         = new ParserXHTML;
      -$pipeline->layout_engine  = new LayoutEngineDefault;
      -$pipeline->output_driver  = new OutputDriverFPDF($media);
      -$pipeline->destination    = new DestinationFile(null);
      -
      -$pipeline->process('http://www.yahoo.com', $media); 
      -
      - -

      Running the script in batch mode

      -
      -require_once('pipeline.factory.class.php');
      -parse_config_file('./html2ps.config');
      -
      -global $g_config;
      -$g_config = array(
      -                  'cssmedia'     => 'screen',
      -                  'renderimages' => true,
      -                  'renderforms'  => false,
      -                  'renderlinks'  => true,
      -                  'mode'         => 'html',
      -                  'debugbox'     => false,
      -                  'draw_page_border' => false
      -                  );
      -
      -$media = Media::predefined('A4');
      -$media->set_landscape(false);
      -$media->set_margins(array('left'   => 0,
      -                          'right'  => 0,
      -                          'top'    => 0,
      -                          'bottom' => 0));
      -$media->set_pixels(1024);
      -
      -global $g_px_scale;
      -$g_px_scale = mm2pt($media->width() - $media->margins['left'] - $media->margins['right']) / $media->pixels;
      -
      -global $g_pt_scale;
      -$g_pt_scale = $g_px_scale * 1.43; 
      -
      -$pipeline = PipelineFactory::create_default_pipeline("","");
      -$pipeline->process_batch(array('http://www.google.com',
      -                               'http://www.yahoo.com'), $media); 
      -
      - - + + +Minimal code samples + + + + + +

      Minimal code

      +

      Using the default pipeline

      +
      +require_once('pipeline.factory.class.php');
      +parse_config_file('./html2ps.config');
      +
      +global $g_config;
      +$g_config = array(
      +                  'cssmedia'     => 'screen',
      +                  'renderimages' => true,
      +                  'renderforms'  => false,
      +                  'renderlinks'  => true,
      +                  'mode'         => 'html',
      +                  'debugbox'     => false,
      +                  'draw_page_border' => false
      +                  );
      +
      +$media = Media::predefined('A4');
      +$media->set_landscape(false);
      +$media->set_margins(array('left'   => 0,
      +                          'right'  => 0,
      +                          'top'    => 0,
      +                          'bottom' => 0));
      +$media->set_pixels(1024);
      +
      +global $g_px_scale;
      +$g_px_scale = mm2pt($media->width() - $media->margins['left'] - $media->margins['right']) / $media->pixels;
      +
      +global $g_pt_scale;
      +$g_pt_scale = $g_px_scale * 1.43; 
      +
      +$pipeline = PipelineFactory::create_default_pipeline("","");
      +$pipeline->process('http://www.google.com', $media); 
      +
      + +

      Building your own conversion pipeline

      +
      +require_once('pipeline.class.php');
      +parse_config_file('html2ps.config');
      +
      +$g_config = array(
      +                  'cssmedia'     => 'screen',
      +                  'renderimages' => true,
      +                  'renderforms'  => false,
      +                  'renderlinks'  => true,
      +                  'mode'         => 'html',
      +                  'debugbox'     => false,
      +                  'draw_page_border' => false
      +                  );
      +
      +$media = Media::predefined('A4');
      +$media->set_landscape(false);
      +$media->set_margins(array('left'   => 0,
      +                          'right'  => 0,
      +                          'top'    => 0,
      +                          'bottom' => 0));
      +$media->set_pixels(1024);
      +
      +$g_px_scale = mm2pt($media->width() - $media->margins['left'] - $media->margins['right']) / $media->pixels;
      +$g_pt_scale = $g_px_scale * 1.43; 
      +
      +$pipeline = new Pipeline;
      +$pipeline->fetchers[]     = new FetcherURL;
      +$pipeline->data_filters[] = new DataFilterHTML2XHTML;
      +$pipeline->parser         = new ParserXHTML;
      +$pipeline->layout_engine  = new LayoutEngineDefault;
      +$pipeline->output_driver  = new OutputDriverFPDF($media);
      +$pipeline->destination    = new DestinationFile(null);
      +
      +$pipeline->process('http://www.yahoo.com', $media); 
      +
      + +

      Running the script in batch mode

      +
      +require_once('pipeline.factory.class.php');
      +parse_config_file('./html2ps.config');
      +
      +global $g_config;
      +$g_config = array(
      +                  'cssmedia'     => 'screen',
      +                  'renderimages' => true,
      +                  'renderforms'  => false,
      +                  'renderlinks'  => true,
      +                  'mode'         => 'html',
      +                  'debugbox'     => false,
      +                  'draw_page_border' => false
      +                  );
      +
      +$media = Media::predefined('A4');
      +$media->set_landscape(false);
      +$media->set_margins(array('left'   => 0,
      +                          'right'  => 0,
      +                          'top'    => 0,
      +                          'bottom' => 0));
      +$media->set_pixels(1024);
      +
      +global $g_px_scale;
      +$g_px_scale = mm2pt($media->width() - $media->margins['left'] - $media->margins['right']) / $media->pixels;
      +
      +global $g_pt_scale;
      +$g_pt_scale = $g_px_scale * 1.43; 
      +
      +$pipeline = PipelineFactory::create_default_pipeline("","");
      +$pipeline->process_batch(array('http://www.google.com',
      +                               'http://www.yahoo.com'), $media); 
      +
      + + \ No newline at end of file diff --git a/gulliver/thirdparty/html2ps_pdf/help/calling.html b/thirdparty/html2ps_pdf/help/calling.html similarity index 97% rename from gulliver/thirdparty/html2ps_pdf/help/calling.html rename to thirdparty/html2ps_pdf/help/calling.html index 360232694..56e25a585 100644 --- a/gulliver/thirdparty/html2ps_pdf/help/calling.html +++ b/thirdparty/html2ps_pdf/help/calling.html @@ -1,281 +1,281 @@ - - -html2ps/html2pdf script parameters - - - -

      html2ps/pdf script parameters

      - -

      Back to table of contents

      - -

      Note that parameter names are case-sensitive. This script accepts parameters - passed using both the GET and POST methods. Script parameters (in alphabetical order) are:

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      ParameterDescription
      batch[] -Specify a list of URL for "batch-processing" mode here. -Note that ##PAGES## directive will not work in this case. -
      compressSet this option to generate compressed Postscript files. You'll probably - only need this option only if you're working with Postscript (NOT PDF) files - via Adobe Acrobat Distiller, as it does not support compressed Postscript. - In any other case, use compressed Postscript, as it will save on bandwidth. -

      PDF files may be compressed, but you will need to unpack them manually before viewing.

      cssmediaHTML page can contain stylesheets for different target media types; for - example, the printable version of a page may have navigation panes and banners - hidden, while the version for handhelds may be specially formatted to work - on small displays and so on. By setting the value of this parameter, you - determine which set of CSS rules will be used during PS/PDF rendering.
      debugbox -

      Set this option if you want to see boundaries of all boxes generated by the script. -It is unlikely you'll need this option, as it is mostly for debugging purposes.

      -

      Please note if you're using this option that the script renders the content -boundary which is different from the "normal" box border!

      encodingEncoding can usually be automatically detected using HTTP response header - or META tags inside the HTML. Sometimes, encoding information is missing; - you can specify encoding name as a value of this parameter.
      footerhtmlHTML string containing text to insert to every page footer. -You may use 'style' attribute to control header/footer appearance; for example, -
      -<div style="background: red;">SOME TEXT</div>
      -
      -Note this string must be (almost) valid XHTML (almost means that HTML/HEAD/BODY tags may be omitted). In particular, -you should replace &,< and > with &amp;,&lt and &gt; correspondingly. -For more sophisticated -control over the header/footer data, please refer to CSS 3 margin boxes -
      headerhtmlHTML string containing text to insert to every page header. -You may use 'style' attribute to control header/footer appearance; for example, -
      <div style="background: red;">SOME TEXT</div>
      -Note this string must be (almost) valid XHTML (almost means that HTML/HEAD/BODY tags may be omitted). In particular, -you should replace &,< and > with &amp;,&lt and &gt; correspondingly. All tags should be -closed (including self-closing tags like BR or IMG). - For more sophisticated -control over the header/footer data, please refer to CSS 3 margin boxes -
      html2xhtmlIf you're absolutely sure you have valid strict XHTML page, you can set - this option to disable HTML-to-XHTML conversion and speed up script execution - a little. In any other case, do not set this option, as the script will - not work with non-well-formed XML. Use this option at your own risk; if you encounts any - errors first enable the HTML-to-XHTML conversion.
      landscapeSet this parameter to rotate the media to landscape orientation. Please - note that the 'virtual resolution' will remain the same; all page content - will be scaled to fit the new page width.
      leftmargin, rightmargin, topmargin, bottommarginPage margins (millimeters). Note that you may calculate top and bottom margin height automatically - to fit header/footer content by specifying zero values for topmargin AND bottommargin at the same time.
      mediaName of predefined media to use. Note that media name is case-sensitive!
      methodThis option determines the type of script output: -
        -
      • fastps -- Postscript;
      • -
      • pdflib -- PDF generated using PDFLIB;
      • -
      • fpdf -- PDF generated using FPdf
      • -
      -
      outputThe value of this parameter determines how the generated file will be - handled: -
        -
      • 0 -- PDF file will be opened immediately (possibly in the same browser - window). Note it will not work for Postscript files in most cases, they - will be downloaded as usual;
      • -
      • 1 -- user will be prompted to download generated file;
      • -
      • 2 -- generated file will be stored - on the server;
      • -
      -
      pageborderSet this parameter if you want the page border to be printed.
      pdfversionThis option determines the compatibility level of PDF to be generated; - the higher level you use, more features can this PDF contain. On the other - hand, high-level PDFs may not be readable by older viewer versions: -
        -
      • 1.2 (Acrobat Reader 3)
      • -
      • 1.3 (Acrobat Reader 4)
      • -
      • 1.4 (Acrobat Reader 5)
      • -
      • 1.5 (Acrobat Reader 6)
      • -
      -
      pixels -

      'Virtual screen' horizontal resolution used during the page rendering - process. As you know, a lot of HTML pages contain dimensions set in pixels - -- images, in most cases, but sometimes fonts. Postscript/PDF files do - not have "pixels", all dimensions are measured in "points" - so we need to provide information about the pixel/point ratio. In our - case, this ratio can be calculated as follows:

      -
      R = (page full width in points - page horizontal margins in points) / virtual resolution
      - -

      Thus, you can specify resolution in 800 pixels and make pages designed - for 800x600 resolution to fit your printed page exactly.

      -

      index.php provides three default values for this parameter: - 640, 800 and 1024; if you need more exotic value, say 945, you may specify - this in the script query string manually and still get correct results.

      -

      Please note that pages may be cut off on the right side if they're designed for the higher resolution -than you've specified (for example, if they have hardcoded table widths or wide images). It is a feature. -In such cases please consider increasing 'pixels' value.

      -
      process_modeSet this parameter to 'batch' to process several URLs at once and merge results in one PDF file; -if this parameter have any other value, script runs in normal "single-url" mode.
      pslevel -If this parameter have value of '3', the script will generate Postscript Level 3; -otherwise – Postscript Level 2. Default value is '3'. This parameter does not affect PDF generation. -
      ps2pdfFlag indicating whether script should convert generated Postscript file to PDF using Ghostscript utility. -Note that generally script does not prevent you to enable this filter for 'fpdf' and 'pdflib' methods, but -this will result in conversion error.
      renderfieldsFlag indicating whether script should render special fields like ##PAGE##. Fields will be rendered if this parameter -is present (even if it has empty value)
      renderformsFlag indicating whether script should render interactive form controls. Forms will be rendered if this parameter -is present (even if it has empty value)
      renderimagesFlag indicating whether script should fetch and render image files. Images will be rendered if this parameter -is present (even if it has empty value)
      Flag indicating whether script should render internal and external hyperlinks. Links will be rendered if this parameter -is present (even if it has empty value)
      scalepoints -

      When a page contains both device-dependent (in pixels) and device-independent - (in points) dimensions, we're in trouble. For example, imagine a page - containing absolute-positioned text inside the image; in this case, as - display and paper have different sizes, point/pixel ratio will be different - in the browser window and file rendered by the script, possilibly breaking - the page layout. To prevent this, the scalepoint option is used. -

      - -

      If this parameter is set, the HTML page "points" are scaled - to keep the mentioned ratio, so if you print the resulting file and measure - fonts, they will be smaller than you expect, but the page layout will - be exactly the same as you see in browser window (well, close to it). - If you want fonts to have their real size, disable this option.

      - -

      Note that this additional scaling applies to points only; such units as in, cm, mm and pc -are not affected by this option.

      URL -

      -URL you're going to convert (page should be available via either http -or https). Note that the http:// prefix is prepended to -this value automatically in case no http or https protocol part is found, -thus you may set the value of this parameter, for example, to www.google.com, -not http://www.google.com. -

      -

      -Note that if you're trying to use URL containing GET request (e.g. http://www.google.com/search?q=test), -you must apply urlencode function -to this url. -

      -
      watermarkhtmlHTML string containing text to display across every page.
      - -Top↑ - -
       
      - - + + +html2ps/html2pdf script parameters + + + +

      html2ps/pdf script parameters

      + +

      Back to table of contents

      + +

      Note that parameter names are case-sensitive. This script accepts parameters + passed using both the GET and POST methods. Script parameters (in alphabetical order) are:

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      ParameterDescription
      batch[] +Specify a list of URL for "batch-processing" mode here. +Note that ##PAGES## directive will not work in this case. +
      compressSet this option to generate compressed Postscript files. You'll probably + only need this option only if you're working with Postscript (NOT PDF) files + via Adobe Acrobat Distiller, as it does not support compressed Postscript. + In any other case, use compressed Postscript, as it will save on bandwidth. +

      PDF files may be compressed, but you will need to unpack them manually before viewing.

      cssmediaHTML page can contain stylesheets for different target media types; for + example, the printable version of a page may have navigation panes and banners + hidden, while the version for handhelds may be specially formatted to work + on small displays and so on. By setting the value of this parameter, you + determine which set of CSS rules will be used during PS/PDF rendering.
      debugbox +

      Set this option if you want to see boundaries of all boxes generated by the script. +It is unlikely you'll need this option, as it is mostly for debugging purposes.

      +

      Please note if you're using this option that the script renders the content +boundary which is different from the "normal" box border!

      encodingEncoding can usually be automatically detected using HTTP response header + or META tags inside the HTML. Sometimes, encoding information is missing; + you can specify encoding name as a value of this parameter.
      footerhtmlHTML string containing text to insert to every page footer. +You may use 'style' attribute to control header/footer appearance; for example, +
      +<div style="background: red;">SOME TEXT</div>
      +
      +Note this string must be (almost) valid XHTML (almost means that HTML/HEAD/BODY tags may be omitted). In particular, +you should replace &,< and > with &amp;,&lt and &gt; correspondingly. +For more sophisticated +control over the header/footer data, please refer to CSS 3 margin boxes +
      headerhtmlHTML string containing text to insert to every page header. +You may use 'style' attribute to control header/footer appearance; for example, +
      <div style="background: red;">SOME TEXT</div>
      +Note this string must be (almost) valid XHTML (almost means that HTML/HEAD/BODY tags may be omitted). In particular, +you should replace &,< and > with &amp;,&lt and &gt; correspondingly. All tags should be +closed (including self-closing tags like BR or IMG). + For more sophisticated +control over the header/footer data, please refer to CSS 3 margin boxes +
      html2xhtmlIf you're absolutely sure you have valid strict XHTML page, you can set + this option to disable HTML-to-XHTML conversion and speed up script execution + a little. In any other case, do not set this option, as the script will + not work with non-well-formed XML. Use this option at your own risk; if you encounts any + errors first enable the HTML-to-XHTML conversion.
      landscapeSet this parameter to rotate the media to landscape orientation. Please + note that the 'virtual resolution' will remain the same; all page content + will be scaled to fit the new page width.
      leftmargin, rightmargin, topmargin, bottommarginPage margins (millimeters). Note that you may calculate top and bottom margin height automatically + to fit header/footer content by specifying zero values for topmargin AND bottommargin at the same time.
      mediaName of predefined media to use. Note that media name is case-sensitive!
      methodThis option determines the type of script output: +
        +
      • fastps -- Postscript;
      • +
      • pdflib -- PDF generated using PDFLIB;
      • +
      • fpdf -- PDF generated using FPdf
      • +
      +
      outputThe value of this parameter determines how the generated file will be + handled: +
        +
      • 0 -- PDF file will be opened immediately (possibly in the same browser + window). Note it will not work for Postscript files in most cases, they + will be downloaded as usual;
      • +
      • 1 -- user will be prompted to download generated file;
      • +
      • 2 -- generated file will be stored + on the server;
      • +
      +
      pageborderSet this parameter if you want the page border to be printed.
      pdfversionThis option determines the compatibility level of PDF to be generated; + the higher level you use, more features can this PDF contain. On the other + hand, high-level PDFs may not be readable by older viewer versions: +
        +
      • 1.2 (Acrobat Reader 3)
      • +
      • 1.3 (Acrobat Reader 4)
      • +
      • 1.4 (Acrobat Reader 5)
      • +
      • 1.5 (Acrobat Reader 6)
      • +
      +
      pixels +

      'Virtual screen' horizontal resolution used during the page rendering + process. As you know, a lot of HTML pages contain dimensions set in pixels + -- images, in most cases, but sometimes fonts. Postscript/PDF files do + not have "pixels", all dimensions are measured in "points" + so we need to provide information about the pixel/point ratio. In our + case, this ratio can be calculated as follows:

      +
      R = (page full width in points - page horizontal margins in points) / virtual resolution
      + +

      Thus, you can specify resolution in 800 pixels and make pages designed + for 800x600 resolution to fit your printed page exactly.

      +

      index.php provides three default values for this parameter: + 640, 800 and 1024; if you need more exotic value, say 945, you may specify + this in the script query string manually and still get correct results.

      +

      Please note that pages may be cut off on the right side if they're designed for the higher resolution +than you've specified (for example, if they have hardcoded table widths or wide images). It is a feature. +In such cases please consider increasing 'pixels' value.

      +
      process_modeSet this parameter to 'batch' to process several URLs at once and merge results in one PDF file; +if this parameter have any other value, script runs in normal "single-url" mode.
      pslevel +If this parameter have value of '3', the script will generate Postscript Level 3; +otherwise – Postscript Level 2. Default value is '3'. This parameter does not affect PDF generation. +
      ps2pdfFlag indicating whether script should convert generated Postscript file to PDF using Ghostscript utility. +Note that generally script does not prevent you to enable this filter for 'fpdf' and 'pdflib' methods, but +this will result in conversion error.
      renderfieldsFlag indicating whether script should render special fields like ##PAGE##. Fields will be rendered if this parameter +is present (even if it has empty value)
      renderformsFlag indicating whether script should render interactive form controls. Forms will be rendered if this parameter +is present (even if it has empty value)
      renderimagesFlag indicating whether script should fetch and render image files. Images will be rendered if this parameter +is present (even if it has empty value)
      Flag indicating whether script should render internal and external hyperlinks. Links will be rendered if this parameter +is present (even if it has empty value)
      scalepoints +

      When a page contains both device-dependent (in pixels) and device-independent + (in points) dimensions, we're in trouble. For example, imagine a page + containing absolute-positioned text inside the image; in this case, as + display and paper have different sizes, point/pixel ratio will be different + in the browser window and file rendered by the script, possilibly breaking + the page layout. To prevent this, the scalepoint option is used. +

      + +

      If this parameter is set, the HTML page "points" are scaled + to keep the mentioned ratio, so if you print the resulting file and measure + fonts, they will be smaller than you expect, but the page layout will + be exactly the same as you see in browser window (well, close to it). + If you want fonts to have their real size, disable this option.

      + +

      Note that this additional scaling applies to points only; such units as in, cm, mm and pc +are not affected by this option.

      URL +

      +URL you're going to convert (page should be available via either http +or https). Note that the http:// prefix is prepended to +this value automatically in case no http or https protocol part is found, +thus you may set the value of this parameter, for example, to www.google.com, +not http://www.google.com. +

      +

      +Note that if you're trying to use URL containing GET request (e.g. http://www.google.com/search?q=test), +you must apply urlencode function +to this url. +

      +
      watermarkhtmlHTML string containing text to display across every page.
      + +Top↑ + +
       
      + + \ No newline at end of file diff --git a/gulliver/thirdparty/html2ps_pdf/help/compatibility.css.2.1.html b/thirdparty/html2ps_pdf/help/compatibility.css.2.1.html similarity index 92% rename from gulliver/thirdparty/html2ps_pdf/help/compatibility.css.2.1.html rename to thirdparty/html2ps_pdf/help/compatibility.css.2.1.html index ae24be2f2..ad2dd0e42 100644 --- a/gulliver/thirdparty/html2ps_pdf/help/compatibility.css.2.1.html +++ b/thirdparty/html2ps_pdf/help/compatibility.css.2.1.html @@ -1,654 +1,654 @@ - - -html2ps/html2pdf CSS 2.1 Compatibility List - - - -

      html2ps/pdf CSS 2.1 Compatibility List

      - -

      Back to table of contents

      - -

      Selectors

      - -

      Properties

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      PropertySupportNote
      azimuthN/Aaural media group
      background-attachmentN/A
      background-colorYes
      background-imageYesnot all output methods support transparent images
      background-positionYes
      background-repeatYes
      backgroundYesbackground-attachment subproperties are ignored
      border-collapseYes
      border-colorYes
      border-spacingNo
      border-styleYes
      -border-top, -border-right, -border-bottom, -border-left -Yes
      -border-top-color, -border-right-color, -border-bottom-color, -border-left-color -Yes
      -border-top-style, -border-right-style, -border-bottom-style, -border-left-style -Yes
      -border-top-width, -border-right-width, -border-bottom-width, -border-left-width -Yes
      border-widthYes
      borderYes
      bottomYes
      caption-sideNo
      clearYes
      clipNo
      colorYes
      contentPartialOnly 'normal', 'inherit' and <string> value is supported
      counter-incrementNo
      counter-resetNo
      cue-afterN/Aaural
      cue-beforeN/Aaural
      cueN/Aaural
      cursorN/Ainteractive
      directionNo
      displayPartial
      elevationN/Aaural
      empty-cellsNo
      floatYes
      font-family -Partial - -'cursive' and 'fantasy' generic font families are not supported. -Custom font families should be explicitly installed by an user.
      font-sizeYes
      font-styleYes
      font-variantNo
      font-weightYesOnly two weight gradations are available: bold and normal font
      fontPartial'caption', 'icon', 'menu', 'message-box', 'small-caption' and 'status-bar' values are not supported.
      heightYes
      leftYes
      letter-spacingYes
      line-heightYes
      list-style-imageYes
      list-style-positionYes
      list-style-typePartial'lower-greek', 'armenian' and 'georgian' values are not supported
      list-styleYes
      margin-right, margin-leftYes
      margin-top, margin-bottomYes
      marginYes
      max-heightYes
      max-widthNo
      min-heightYes
      min-widthPartial, 'inherit' and percentage values not supported
      orphansNo
      outline-colorN/Ainteractive
      outline-styleN/Ainteractive
      outline-widthN/Ainteractive
      outlineN/Ainteractive
      overflowYesNote that 'auto' and 'scroll' values are treated as 'hidden', as generated PDF is not interactive
      padding-top, -padding-right, padding-bottom, -padding-leftYes
      paddingYes
      page-break-afterPartialOnly 'always' value is supported
      page-break-beforeNo
      page-break-insideNo
      pause-afterN/Aaural
      pause-beforeN/Aaural
      pauseN/Aaural
      pitch-rangeN/Aaural
      pitchN/Aaural
      play-duringN/Aaural
      positionYesCSS 3 'position: footnote' is supported in addition to standard CSS 2.1 values
      quotesNo
      richnessN/Aaural
      rightYes
      speak-headerN/Aaural
      speak-numeralN/Aaural
      speak-punctuationN/Aaural
      speakN/Aaural
      speech-rateN/Aaural
      stressN/Aaural
      table-layoutNo
      text-alignYes
      text-decorationPartial -

      'blink' value is ignored, as rendered PDF is static. -

      'text-decoration' currently inherited by all descendants, while CSS 2.1 declares that -

      -It is not, however, further propagated to floating and absolutely positioned descendants, -nor to the contents of 'inline-table' and 'inline-block' descendants. -
      -
      text-indentYes
      text-transformYes
      topYes
      unicode-bidiNo
      vertical-alignPartial -

      For inline elements, values 'text-top' and 'text-bottom', percentages and lengths are not supported. -

      Nested aligned subtrees are not supported -

      visibilityPartial'collapse' value is not supported
      voice-familyN/Aaural
      volumeN/Aaural
      white-spacePartial'pre-wrap' and 'pre-line' values not supported
      widowsNo
      widthYes
      word-spacingYes
      z-indexPartialSupported for absolute-positioned boxes only; only numeric values are supported
      - -html2ps/pdf (c) TUFaT.com - - + + +html2ps/html2pdf CSS 2.1 Compatibility List + + + +

      html2ps/pdf CSS 2.1 Compatibility List

      + +

      Back to table of contents

      + +

      Selectors

      + +

      Properties

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      PropertySupportNote
      azimuthN/Aaural media group
      background-attachmentN/A
      background-colorYes
      background-imageYesnot all output methods support transparent images
      background-positionYes
      background-repeatYes
      backgroundYesbackground-attachment subproperties are ignored
      border-collapseYes
      border-colorYes
      border-spacingNo
      border-styleYes
      +border-top, +border-right, +border-bottom, +border-left +Yes
      +border-top-color, +border-right-color, +border-bottom-color, +border-left-color +Yes
      +border-top-style, +border-right-style, +border-bottom-style, +border-left-style +Yes
      +border-top-width, +border-right-width, +border-bottom-width, +border-left-width +Yes
      border-widthYes
      borderYes
      bottomYes
      caption-sideNo
      clearYes
      clipNo
      colorYes
      contentPartialOnly 'normal', 'inherit' and <string> value is supported
      counter-incrementNo
      counter-resetNo
      cue-afterN/Aaural
      cue-beforeN/Aaural
      cueN/Aaural
      cursorN/Ainteractive
      directionNo
      displayPartial
      elevationN/Aaural
      empty-cellsNo
      floatYes
      font-family +Partial + +'cursive' and 'fantasy' generic font families are not supported. +Custom font families should be explicitly installed by an user.
      font-sizeYes
      font-styleYes
      font-variantNo
      font-weightYesOnly two weight gradations are available: bold and normal font
      fontPartial'caption', 'icon', 'menu', 'message-box', 'small-caption' and 'status-bar' values are not supported.
      heightYes
      leftYes
      letter-spacingYes
      line-heightYes
      list-style-imageYes
      list-style-positionYes
      list-style-typePartial'lower-greek', 'armenian' and 'georgian' values are not supported
      list-styleYes
      margin-right, margin-leftYes
      margin-top, margin-bottomYes
      marginYes
      max-heightYes
      max-widthNo
      min-heightYes
      min-widthPartial, 'inherit' and percentage values not supported
      orphansNo
      outline-colorN/Ainteractive
      outline-styleN/Ainteractive
      outline-widthN/Ainteractive
      outlineN/Ainteractive
      overflowYesNote that 'auto' and 'scroll' values are treated as 'hidden', as generated PDF is not interactive
      padding-top, +padding-right, padding-bottom, +padding-leftYes
      paddingYes
      page-break-afterPartialOnly 'always' value is supported
      page-break-beforeNo
      page-break-insideNo
      pause-afterN/Aaural
      pause-beforeN/Aaural
      pauseN/Aaural
      pitch-rangeN/Aaural
      pitchN/Aaural
      play-duringN/Aaural
      positionYesCSS 3 'position: footnote' is supported in addition to standard CSS 2.1 values
      quotesNo
      richnessN/Aaural
      rightYes
      speak-headerN/Aaural
      speak-numeralN/Aaural
      speak-punctuationN/Aaural
      speakN/Aaural
      speech-rateN/Aaural
      stressN/Aaural
      table-layoutNo
      text-alignYes
      text-decorationPartial +

      'blink' value is ignored, as rendered PDF is static. +

      'text-decoration' currently inherited by all descendants, while CSS 2.1 declares that +

      +It is not, however, further propagated to floating and absolutely positioned descendants, +nor to the contents of 'inline-table' and 'inline-block' descendants. +
      +
      text-indentYes
      text-transformYes
      topYes
      unicode-bidiNo
      vertical-alignPartial +

      For inline elements, values 'text-top' and 'text-bottom', percentages and lengths are not supported. +

      Nested aligned subtrees are not supported +

      visibilityPartial'collapse' value is not supported
      voice-familyN/Aaural
      volumeN/Aaural
      white-spacePartial'pre-wrap' and 'pre-line' values not supported
      widowsNo
      widthYes
      word-spacingYes
      z-indexPartialSupported for absolute-positioned boxes only; only numeric values are supported
      + +html2ps/pdf (c) TUFaT.com + + diff --git a/gulliver/thirdparty/html2ps_pdf/help/compatibility.css.3.html b/thirdparty/html2ps_pdf/help/compatibility.css.3.html similarity index 95% rename from gulliver/thirdparty/html2ps_pdf/help/compatibility.css.3.html rename to thirdparty/html2ps_pdf/help/compatibility.css.3.html index f8a8f0727..1abcdb8c1 100644 --- a/gulliver/thirdparty/html2ps_pdf/help/compatibility.css.3.html +++ b/thirdparty/html2ps_pdf/help/compatibility.css.3.html @@ -1,86 +1,86 @@ - - -html2ps/html2pdf CSS 3 Compatibility List - - - -

      html2ps/pdf CSS 3 Compatibility List

      - -

      Back to table of contents

      - -

      Margin boxes

      -

      -html2ps supports margin boxes in accordance to CSS 3. For example, you may render a header -using the following CSS code: -

      -@page {
      -  @top-left {
      -    content: "My Page";
      -  }
      -  @top-right {
      -    content: "Page " counter(page) " of " counter(pages);
      -  }
      -}
      -
      -

      -

      -As an extension of the margin box specification, html2ps provides '-html2ps-html-content' -property. In general, it is similar to 'content' property, except the resulting string -is processed by HTML parser. Thus, you may use HTML tags in this property value. -

      -@page {
      -  @top-left {
      -    -html2ps-html-content: "&lt;span style=&quot;font-weight: bold;&quot;&gt;My&lt;/span&gt; Page";
      -  }
      -  @top-right {
      -    content: "Page " counter(page) " of " counter(pages);
      -  }
      -}
      -
      -

      -

      -Note that you may set text formatting using usual CSS propeties in margin box context: -

      -@page {
      -  @top-left {
      -    color: red;
      -    content: "My Page";
      -  }
      -  @top-right {
      -    content: "Page " counter(page) " of " counter(pages);
      -  }
      -}
      -
      -

      -

      -For further information please refer to -CSS 3 Paged Media Module. -Note that html2ps at the moment does not support setting page size and margins via CSS. -

      - -

      Footnotes

      - -

      Properties

      - - - - - - - - - - - - - - - - - - -
      PropertySupportNote
      - -html2ps/pdf (c) TUFaT.com - - + + +html2ps/html2pdf CSS 3 Compatibility List + + + +

      html2ps/pdf CSS 3 Compatibility List

      + +

      Back to table of contents

      + +

      Margin boxes

      +

      +html2ps supports margin boxes in accordance to CSS 3. For example, you may render a header +using the following CSS code: +

      +@page {
      +  @top-left {
      +    content: "My Page";
      +  }
      +  @top-right {
      +    content: "Page " counter(page) " of " counter(pages);
      +  }
      +}
      +
      +

      +

      +As an extension of the margin box specification, html2ps provides '-html2ps-html-content' +property. In general, it is similar to 'content' property, except the resulting string +is processed by HTML parser. Thus, you may use HTML tags in this property value. +

      +@page {
      +  @top-left {
      +    -html2ps-html-content: "&lt;span style=&quot;font-weight: bold;&quot;&gt;My&lt;/span&gt; Page";
      +  }
      +  @top-right {
      +    content: "Page " counter(page) " of " counter(pages);
      +  }
      +}
      +
      +

      +

      +Note that you may set text formatting using usual CSS propeties in margin box context: +

      +@page {
      +  @top-left {
      +    color: red;
      +    content: "My Page";
      +  }
      +  @top-right {
      +    content: "Page " counter(page) " of " counter(pages);
      +  }
      +}
      +
      +

      +

      +For further information please refer to +CSS 3 Paged Media Module. +Note that html2ps at the moment does not support setting page size and margins via CSS. +

      + +

      Footnotes

      + +

      Properties

      + + + + + + + + + + + + + + + + + + +
      PropertySupportNote
      + +html2ps/pdf (c) TUFaT.com + + diff --git a/gulliver/thirdparty/html2ps_pdf/help/configuration.html b/thirdparty/html2ps_pdf/help/configuration.html similarity index 97% rename from gulliver/thirdparty/html2ps_pdf/help/configuration.html rename to thirdparty/html2ps_pdf/help/configuration.html index bbf670e98..35137d10e 100644 --- a/gulliver/thirdparty/html2ps_pdf/help/configuration.html +++ b/thirdparty/html2ps_pdf/help/configuration.html @@ -1,255 +1,255 @@ - - -html2ps/html2pdf configuration files and options - - - -

      html2ps/pdf configuration files and options

      -

      Back to table of contents

      - -

      Currently, configuration is done both via configuration file (html2ps.config) - and configuration constants inside the config.inc.php file. -

      html2ps.config, Common configuration options

      - - - - - - - - - - - - -

      Common directives in html2ps.config
      -

      OptionAppears atDescription
      mediaTop level Defines the output media size. This tag should have three arguments: -
        -
      • name – media name; you'll be able to refer to this media - by name while calling the script;
      • -
      • width – media width in millimetres;
      • -
      • height – media height in millimetres.
      • -
      -
      - -

      html2ps.config, Postscript and Ghotscript configuration

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

      Postscript-specific directives in html2ps.config

      -
      OptionAppears atDescription
      fontsTop levelContains information about font-family value to Postscript font name mappings. - See descrripton of nested directives.
      family/fontsContains information about particular font-family value mapping. Attributes: -
        -
      • name – value of 'font-family' property being mapped.
      • -
      -
      encoding-override/fonts, /fonts/familyContains information about exceptions in font-family mappings. Attributes: -
        -
      • name – comma-separated list of encodings to apply this rule - for.
      • -
      - For example, normally 'times' family is mapped to /Times-Roman font. On - the other hand, this standard font does not contain cyrillic symbols, so - when one of the cyrillic encodings is met, 'times' will be mapped to /TimesCyr-Medium.
      alias/fontsList of font-family aliases. Attributes: -
        -
      • alias – font family alias to be translated
      • -
      • family – real font family name for this alias
      • -
      - Note that alias resolving is done once, so there's not much use of constructions - similar to -
      -  <alias alias="verdana" family="arial"/>
      -  <alias alias="arial" family="helvetica"/>
      -
      -
      metrics/fonts - Reference to a font metric file for this font family. Attributes: -
        -
      • typeface – typeface name (refers to the ones used in normal, - italic and oblique attributes)
      • -
      • file – name of the font metric (AFM) file (searched in TYPE1_FONT_REPOSITORY directory)
      • -
      -
      normal/fonts/family, /fonts/family/encoding-override, /encoding-overrideSystem font names for normal font variant. Attributes: -
        -
      • normal – font name for roman (non-italic) font
      • -
      • italic – font name for italic font
      • -
      • oblique – font name for oblique font
      • -
      -
      bold/fonts/family, /fonts/family/encoding-override, /encoding-overrideSystem font names for bold font variant. Attributes: -
        -
      • normal – font name for bold roman (non-italic) font
      • -
      • italic – font name for bold italic font
      • -
      • oblique – font name for bold oblique font
      • -
      -
      - -

      html2ps, config PDFLIB/FPDF configuration

      - - - - - - - - - - - - - - - - - - - -

      PDFLIB-specific directives in html2ps.config

      OptionAppears atDescription
      fonts-pdfTop levelContains information about font-family value to PDF font name mappings. - Note that nested directives and their meanings are the same as for the fonts - directive, except that they're applied when PDFLIB is used.
      ttffonts-pdfDefines mapping of typefaces to available TrueType fonts. Attributes: -
        -
      • typeface – typeface name (refers to the ones used in normal, italic and oblique attributes)
      • -
      • file – name of the TTF file (searched in TTF_FONTS_REPOSITORY directory) -
      • embed – flag indicating whether this font file should be embedded in generated PDF (0 - not embedded, 1 - embedded).
      -
      - -

      config.inc.php, Common configuration options

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

      Common configuration constants

      NameDescription
      HTML2PS_DIR -Path to directory on server where HTML2PS script files reside. All HTML2PS-specific directories and -paths are relative to this directory. -
      DEFAULT_USER_AGENT -Value of the 'User-Agent' HTTP header which will be sent by PHP when fetching files from remote server. -
      OUTPUT_DEFAULT_NAME -Default PDF or PS file name to use when no filename have been specified via API. -
      DEFAULT_ENCODING -Default encoding to use when no encoding information is available (e.g. encoding was specified neither in -HTTP headers nor in META tag of HTML page). -
      - -

      config.inc.php, Postscript options

      - - - - - - - - - - - - - - - - - -

      Postscript-related constants

      NameDescription
      GS_PATH -Path to your Ghostscript executable. Note to Windows users! Ghostscript distribution includes two executables: gswin32.exe -(GUI version) and gswin32c.exe (command-line version). You should provide path to command-line version -only! -
      TYPE1_FONTS_REPOSITORY -Path to font metric (AFM) files. Usually AFM files are packaged together with Ghostscript in 'fonts' subdirectory; -in some Linux distibutions you should install 'ghostscript-fonts' package to get font metrics. -
      - -

      config.inc.php, PDFLIB options

      - - - - - - - - - - - - - - - - - - - - - - -

      PDFLIB-related constants

      NameDescription
      PDFLIB_DL_PATH -Path to PDFLIB dynamically loaded library. If no "pdf" extension loaded, script attempts to call "dl" with -PDFLIB_DF_PATH as argument. -
      PDFLIB_LICENSE -Your PDFLIB license key. -
      TTF_FONTS_REPOSITORY -Path to directory containing a set of True-Type font files to be used by PDFLIB. -
      - - - + + +html2ps/html2pdf configuration files and options + + + +

      html2ps/pdf configuration files and options

      +

      Back to table of contents

      + +

      Currently, configuration is done both via configuration file (html2ps.config) + and configuration constants inside the config.inc.php file. +

      html2ps.config, Common configuration options

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

      Common directives in html2ps.config
      +

      OptionAppears atDescription
      mediaTop level Defines the output media size. This tag should have three arguments: +
        +
      • name – media name; you'll be able to refer to this media + by name while calling the script;
      • +
      • width – media width in millimetres;
      • +
      • height – media height in millimetres.
      • +
      +
      + +

      html2ps.config, Postscript and Ghotscript configuration

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

      Postscript-specific directives in html2ps.config

      +
      OptionAppears atDescription
      fontsTop levelContains information about font-family value to Postscript font name mappings. + See descrripton of nested directives.
      family/fontsContains information about particular font-family value mapping. Attributes: +
        +
      • name – value of 'font-family' property being mapped.
      • +
      +
      encoding-override/fonts, /fonts/familyContains information about exceptions in font-family mappings. Attributes: +
        +
      • name – comma-separated list of encodings to apply this rule + for.
      • +
      + For example, normally 'times' family is mapped to /Times-Roman font. On + the other hand, this standard font does not contain cyrillic symbols, so + when one of the cyrillic encodings is met, 'times' will be mapped to /TimesCyr-Medium.
      alias/fontsList of font-family aliases. Attributes: +
        +
      • alias – font family alias to be translated
      • +
      • family – real font family name for this alias
      • +
      + Note that alias resolving is done once, so there's not much use of constructions + similar to +
      +  <alias alias="verdana" family="arial"/>
      +  <alias alias="arial" family="helvetica"/>
      +
      +
      metrics/fonts + Reference to a font metric file for this font family. Attributes: +
        +
      • typeface – typeface name (refers to the ones used in normal, + italic and oblique attributes)
      • +
      • file – name of the font metric (AFM) file (searched in TYPE1_FONT_REPOSITORY directory)
      • +
      +
      normal/fonts/family, /fonts/family/encoding-override, /encoding-overrideSystem font names for normal font variant. Attributes: +
        +
      • normal – font name for roman (non-italic) font
      • +
      • italic – font name for italic font
      • +
      • oblique – font name for oblique font
      • +
      +
      bold/fonts/family, /fonts/family/encoding-override, /encoding-overrideSystem font names for bold font variant. Attributes: +
        +
      • normal – font name for bold roman (non-italic) font
      • +
      • italic – font name for bold italic font
      • +
      • oblique – font name for bold oblique font
      • +
      +
      + +

      html2ps, config PDFLIB/FPDF configuration

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

      PDFLIB-specific directives in html2ps.config

      OptionAppears atDescription
      fonts-pdfTop levelContains information about font-family value to PDF font name mappings. + Note that nested directives and their meanings are the same as for the fonts + directive, except that they're applied when PDFLIB is used.
      ttffonts-pdfDefines mapping of typefaces to available TrueType fonts. Attributes: +
        +
      • typeface – typeface name (refers to the ones used in normal, italic and oblique attributes)
      • +
      • file – name of the TTF file (searched in TTF_FONTS_REPOSITORY directory) +
      • embed – flag indicating whether this font file should be embedded in generated PDF (0 - not embedded, 1 - embedded).
      +
      + +

      config.inc.php, Common configuration options

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

      Common configuration constants

      NameDescription
      HTML2PS_DIR +Path to directory on server where HTML2PS script files reside. All HTML2PS-specific directories and +paths are relative to this directory. +
      DEFAULT_USER_AGENT +Value of the 'User-Agent' HTTP header which will be sent by PHP when fetching files from remote server. +
      OUTPUT_DEFAULT_NAME +Default PDF or PS file name to use when no filename have been specified via API. +
      DEFAULT_ENCODING +Default encoding to use when no encoding information is available (e.g. encoding was specified neither in +HTTP headers nor in META tag of HTML page). +
      + +

      config.inc.php, Postscript options

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

      Postscript-related constants

      NameDescription
      GS_PATH +Path to your Ghostscript executable. Note to Windows users! Ghostscript distribution includes two executables: gswin32.exe +(GUI version) and gswin32c.exe (command-line version). You should provide path to command-line version +only! +
      TYPE1_FONTS_REPOSITORY +Path to font metric (AFM) files. Usually AFM files are packaged together with Ghostscript in 'fonts' subdirectory; +in some Linux distibutions you should install 'ghostscript-fonts' package to get font metrics. +
      + +

      config.inc.php, PDFLIB options

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

      PDFLIB-related constants

      NameDescription
      PDFLIB_DL_PATH +Path to PDFLIB dynamically loaded library. If no "pdf" extension loaded, script attempts to call "dl" with +PDFLIB_DF_PATH as argument. +
      PDFLIB_LICENSE +Your PDFLIB license key. +
      TTF_FONTS_REPOSITORY +Path to directory containing a set of True-Type font files to be used by PDFLIB. +
      + + + diff --git a/gulliver/thirdparty/html2ps_pdf/help/css/help.css b/thirdparty/html2ps_pdf/help/css/help.css similarity index 92% rename from gulliver/thirdparty/html2ps_pdf/help/css/help.css rename to thirdparty/html2ps_pdf/help/css/help.css index e72d56034..94fae7c58 100644 --- a/gulliver/thirdparty/html2ps_pdf/help/css/help.css +++ b/thirdparty/html2ps_pdf/help/css/help.css @@ -1,127 +1,127 @@ -body { - color:#000; - background-color:#fff; - margin:10px; - font-family:arial, helvetica, sans-serif; - color:#000; - font-size:12px; - line-height:18px; -} - -p, td { - color:#000; - font-size:12px; - line-height:18px; - margin-top:12px; - margin-bottom:12px; -} - -h1 { - font-family:arial, helvetica, sans-serif; - color:#669; - font-size:27px; - letter-spacing:-1px; - margin-top:12px; - margin-bottom:12px; -} - -h2 { - font-family:arial, helvetica, sans-serif; - color:#669; - font-size:18px; - letter-spacing:-1px; - margin-top:12px; - margin-bottom:12px; -} - -input,textarea,select { - background-color:#eeeeee; - border: 1px solid #045564; -} - -img { - border:0px; -} - -fieldset { - border: #26a solid 1px; - margin-left:10px; - padding-bottom:0px; - padding-top:0px; - margin-top:10px; -} - -legend { - background: #eee; - border: #26a solid 1px; - padding: 1px 10px; - font-weight:bold; -} - -.submit { - background-color:#669; - color:#fff; -} - -.nulinp { - border:0px; - background-color:#fff; -} - -.hand { - cursor: pointer; -} - -li ol { - list-style-type: lower-latin; -} - -caption { - text-align: left; - font-size: small; -} - -tr.odd { - background-color: #f0f0f0; -} - -tr.even { - background-color: #ffffff; -} - -td, th { - padding: 3px; -} - -.description_table { - width: 100%; -} - -.description_table td { - vertical-align: top; -} - -dt { - font-weight: bold; - margin-top: 2ex; - margin-bottom: 1ex; -} - -dd { - margin-top: 1ex; - margin-bottom: 2ex; -} - -.added { - margin-left: 1em; - border-top: solid 1px #fcc; - border-bottom: solid 1px #fcc; -} - -.when { - background-color: #ddd; -} - -td.yesno { - text-align: center; +body { + color:#000; + background-color:#fff; + margin:10px; + font-family:arial, helvetica, sans-serif; + color:#000; + font-size:12px; + line-height:18px; +} + +p, td { + color:#000; + font-size:12px; + line-height:18px; + margin-top:12px; + margin-bottom:12px; +} + +h1 { + font-family:arial, helvetica, sans-serif; + color:#669; + font-size:27px; + letter-spacing:-1px; + margin-top:12px; + margin-bottom:12px; +} + +h2 { + font-family:arial, helvetica, sans-serif; + color:#669; + font-size:18px; + letter-spacing:-1px; + margin-top:12px; + margin-bottom:12px; +} + +input,textarea,select { + background-color:#eeeeee; + border: 1px solid #045564; +} + +img { + border:0px; +} + +fieldset { + border: #26a solid 1px; + margin-left:10px; + padding-bottom:0px; + padding-top:0px; + margin-top:10px; +} + +legend { + background: #eee; + border: #26a solid 1px; + padding: 1px 10px; + font-weight:bold; +} + +.submit { + background-color:#669; + color:#fff; +} + +.nulinp { + border:0px; + background-color:#fff; +} + +.hand { + cursor: pointer; +} + +li ol { + list-style-type: lower-latin; +} + +caption { + text-align: left; + font-size: small; +} + +tr.odd { + background-color: #f0f0f0; +} + +tr.even { + background-color: #ffffff; +} + +td, th { + padding: 3px; +} + +.description_table { + width: 100%; +} + +.description_table td { + vertical-align: top; +} + +dt { + font-weight: bold; + margin-top: 2ex; + margin-bottom: 1ex; +} + +dd { + margin-top: 1ex; + margin-bottom: 2ex; +} + +.added { + margin-left: 1em; + border-top: solid 1px #fcc; + border-bottom: solid 1px #fcc; +} + +.when { + background-color: #ddd; +} + +td.yesno { + text-align: center; } \ No newline at end of file diff --git a/gulliver/thirdparty/html2ps_pdf/help/directives.html b/thirdparty/html2ps_pdf/help/directives.html similarity index 95% rename from gulliver/thirdparty/html2ps_pdf/help/directives.html rename to thirdparty/html2ps_pdf/help/directives.html index f48f8818a..ce413681c 100644 --- a/gulliver/thirdparty/html2ps_pdf/help/directives.html +++ b/thirdparty/html2ps_pdf/help/directives.html @@ -1,68 +1,68 @@ - - -html2ps/html2pdf directives - - - -

      html2ps/pdf directives

      -Back to table of contents -

      Page-breaking commands

      -

      You can force a page break by inserting any one of the following commands - into the HTML page: -

      -<!--NewPage-->
      -<pagebreak/>
      -<?page-break>
      -
      - -

      It is highly NOT RECOMMENDED to use these directives inside table cells, as - you can get unpredictable results. - -

      Special fields

      - -

      Note that these fields are processed by separate filter -(PreTreeFilterHTML2PSFields). -If you're using HTML2PS API, you should install this filter using the following code: -

      -pipeline->pre_tree_filters[] = new PreTreeFilterHTML2PSFields();
      -
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + +html2ps/html2pdf directives + + + +

      html2ps/pdf directives

      +Back to table of contents +

      Page-breaking commands

      +

      You can force a page break by inserting any one of the following commands + into the HTML page: +

      +<!--NewPage-->
      +<pagebreak/>
      +<?page-break>
      +
      + +

      It is highly NOT RECOMMENDED to use these directives inside table cells, as + you can get unpredictable results. + +

      Special fields

      + +

      Note that these fields are processed by separate filter +(PreTreeFilterHTML2PSFields). +If you're using HTML2PS API, you should install this filter using the following code: +

      +pipeline->pre_tree_filters[] = new PreTreeFilterHTML2PSFields();
      +
      + +
      NameReplaced with
      ##PAGE##Number of current page
      ##PAGES## -Total number of pages in the generated PDF file. Note that this directive -will show number of pages in current source file when the script is run in batch mode. -
      ##FILENAME##Filename (URL) of the source HTML
      ##FILESIZE##Size of the source file (without included files)
      ##TIMESTAMP##Date/time the PDF file have been generated
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gulliver/thirdparty/html2ps_pdf/help/faq.html b/thirdparty/html2ps_pdf/help/faq.html similarity index 98% rename from gulliver/thirdparty/html2ps_pdf/help/faq.html rename to thirdparty/html2ps_pdf/help/faq.html index 17d00482c..0c2dbd8ac 100644 --- a/gulliver/thirdparty/html2ps_pdf/help/faq.html +++ b/thirdparty/html2ps_pdf/help/faq.html @@ -1,397 +1,397 @@ - - -html2ps/html2pdf FAQ - - - -

      html2ps/pdf FAQ

      -Back to table of contents - - - -
      -

      How would I report a bug?

      -

      -Use the support forum of tufat.com. -

      -

      -Please, provide the following: -

        -
      • phpinfo() output;
      • -
      • script version (and information about applied patches, if any);
      • -
      • script parameters you're using for conversion;
      • -
      • full HTML code of the page you're trying to convert.
      • -
      -The will greatly reduce the time required for solving your issue. Thank you for understanding. -

      -
      - -

      Installation.

      -
      -
      Does html2ps require any external utilities like ghostscript?
      -
      No. PHP with GD extension is sufficient to run conversion. You may use additional -extensions/utilities to use alternative output methods or to boost conversion speed a little bit, though.
      -
      Can I call this script from the command line?
      -
      Probably yes; check if your PHP support command line interface. Also, consider -reading this article on php.net: - -Using PHP from the command line -
      -
      - -

      No output at all. Broken output.

      -
      -
      I'm getting "Warning: DOMDocument::loadXML() [function.DOMDocument-loadXML]: Empty string supplied as input" error message in PHP 5.2.0 when attemting to convert some files
      -
      A new configuration parameter pcre.backtrack_limit was introduced in PHP 5.2.0. html2ps does the excessive -regexp usage; it is recommended to increase pcre.backtrack_limit value to 1000000. -
      - -
      -
      HTML2PS returns blank page. There's some strange messages in PHP error log, for example: -
      -Parent: child process exited with status 3221225477 -- Restarting.
      -
      -I'm using PHP 4.4.2
      -
      It is a PHP 4.4.2 bug #36017; there's no workarounds -except changing PHP version or writing your own fetcher without 'fopen' function calls. -I would recommend either downgrading to earlier 4.4.x versions or installing PHP 5. -
      - -
      All I'm getting is a blank page; no error messages in PHP error log. Whats happened?
      -
      The script is probably running out of memory or execution time. Try increasing - the values of max_execution_time and/or memory_limit PHP configuration variables. - Recommended values are 120 seconds and 32 megabytes. Nevertheless, if you're - using VERY big images, you'll probably need to increase these values - even more.
      - -
      -Another cause may be a JavaScript or META redirect on page you're trying to convert. As HTML2PS script is not designed -as interactive user agent, it will not follow such redirects for you. You may try to open the url in question in your browser -and check if the URL will change when page finishes loading. In this case, just supply the final URL to the script. -
      -
      -Also, please note that domain.com and www.domain.com may point to different sites. In the worst case, -domain.com (without 'www' part) may just ignore HTTP requests. On the other side, popular browsers try to guess correct -URL; for example, when you enter 'something' to the address bar, they may try to get something.com or www.something.com. -This may lead to problem similar to one described in previous paragraph; the solution is the same: open URL in browser and -check it will change. -
      - -
      I got the following error message: Fatal error: Allowed memory size of … bytes exhausted (tried to allocate … bytes) in&hellip
      -
      The script is running out of memory. Please refer to memory_limit PHP.net documentation regarding increasing memory limit.
      - -
      The script just hangs when converting page containing images! With "render images" options disabled it works!
      -
      There were reports on this problem on Windows recently. A quick investigation showed that for some reason PHP 4.4.0 -sometimes hangs indefinitely inside the 'fsockopen' call. Consider upgrading your PHP version in this case.
      - -
      I've increased limits, but still sometimes get a blank page immediately - after the script starts! Some sites are parsed, though...
      -
      Some users encountered this problem using the GD library bundled with PHP. - While it matched the GD version requirement, it sometimes caused PHP to silently - die on some images. The problem is solved by recompiling the PHP using the - external (recent enough) GD library. Note that NOT ALL PHP configurations - are subject to this problem.
      - -
      I'm getting "PDF doesn't start with "%PDF-" message from - Acrobat Reader. Nevertheless, when I save file to my hard drive, it opens - perfectly. I'm using Firefox. -
      There were user reports on issues related to Firefox/Acrobat Reader plugin - incompatibility. In particular, this problem appeared with Firefox 1.0.7 and - Reader 6.0.2 PL. You may consider upgrading your software to latest versions - in this case.
      - -
      Some characters are displayed incorrectly or missing.
      -
      -

      If you've installed, removed or changed font files, you may need to clear -cache subdirectory. HTML2PS do store information extracted from file fonts -there to reduce script initialization overhead. See also -"I've installed/updated True-Type fonts, but it seems that ... (some mysterious problem) ... happens" -

      Another cause of this problem may be incorrect source encoding; when encoding is not explicilty specified, -html2ps tries to take encoding from HTTP headers and META tags. If no encoding information found, -html2ps assumes iso-8851-1. -

      -
      - -

      Broken layout.

      -
      -
      Some characters are missing in my PDFs on some Acrobat Reader versions / different OSes
      -
      Try enabling font embedding (set 'embed' property in html2ps.config to value 1 for fonts used in your documents).
      - -
      Sites are cut-off on the right side when I'm using 640 pixels page width. What can I do?
      -
      Nothing. Treat this as a feature. Just increase the page width. Most sites - are NOT designed for such small resolutions and will cause a horizontal - scrollbar to appear in browser in such cases.
      - -
      I've disabled the "Keep screen pixel/point ratio" option and the - page layout is completely broken! What can I do?
      -
      Nothing. Treat this as a feature. If you want to get the layout close to - the image rendered by the browser, never disable this option. The only - time you'll need it is when you need to render text having the exact - size specified in points.
      - -
      Some images are rendered inside black rectangles!
      -
      PNG images with alpha channel are NOT supported. Swicth to single-color transparency, if you need it.
      - -
      Horizontal lines (e.g. line under the text) look like they consist of several parts with slightly different width.
      -
      Try disabling antialiasing in your PDF reader.
      - -
      - -

      Customizing output.

      -
      -
      How can I make an explicit page break?
      -
      -You may use one of the following HTML2PS script-specific commands: -
      -<!--NewPage-->
      -<pagebreak/>
      -<?page-break>
      -
      -Or CSS page-break-after property: -
      -<div style="page-break-after: always">
      -... some content ...
      -</div>
      -
      -
      - -
      How should I add headers or footers to generated Postscript / PDF files?
      -
      -You may use one of the following options: -
        -
      • Use blocks with 'position: fixed'. Pleas note that you probably want to -set 'top' and 'bottom' properties to negative values to avoid overlapping with -main content; it is an expected behavior according to HTML/CSS standards. -(see also a simple sample)
      • -
      • Use "Header" and "Footer" options in web interface or -PreTreeFilterHeaderFooter filter in API
      • -
      • Use CSS 3 margin boxes.
      • -
      -Note that when you use PreTreeFilterHeaderFooter or Header/Footer fields in web interface, -content is implicitly placed in fixed-positioned div; you may thing of this as follows: -
      -...
      -<body>
      -<!--header starts-->
      -<div style="position: fixed; ....">...your header content...</div>
      -<!--header ends-->
      -...
      -your HTML content
      -...
      -<!--footer starts-->
      -<div style="position: fixed; ....">...your footer content...</div>
      -<!--footer ends-->
      -</body>
      -...
      -
      -
      - -
      I've added headers and footers to my HTML pages, but how I can prevent them from showing up in the browser?
      -
      -Use @media css rules setting 'display: none' or 'display: block' for header/footer blocks on different media. -
      - -
      Is there a possibility to create pdf documents with more than 72dpi using html2ps?
      -
      You may make a page with high-resolution images and set their on-page height and width using -height and width attributes. -HTML2PS does not resample images, just outputs them to PDF and provides the scaling factor. -
      - -
      ##PAGES## directive always displays 1 in batch mode!
      -
      Yes, it is a documented feature. ##PAGES## always refer to the number of pages in file being processed. -
      - -
      - -

      API

      -
      -
      How could I convert HTML file from my local drive?
      -
      Use example file in samples/sample.simplest.from.file.php as a starting point.
      -
      How could I convert HTML code contained in a variable?
      -
      Use example file in samples/sample.simplest.from.memory.php as a starting point.
      -
      Can I convert a page using some authentication mechanism using the html2ps webinterface?
      -
      Out-of-the-box – no. Depending on the type of the authentication you may override the fetcher -object with your custom one able to bypass authentication. Still, the recommended approach -is html2ps API usage; in this case, you store your HTML code in a PHP variable instead of outputting it to the browser -and call conversion engine directly.
      -
      I'm using API to convert files and images and / or CSS files seems to be ignored.
      -
      -Most likely, you're using relative URLs and, at the same time, converting either HTML string from memory or -local file. In this case script doesn't know the base URL to use while resolving relative paths, so -these URLs are ignored. You have two options in this case: -
        -
      • Change relative URI to absolute in your HTML code
      • -
      • Implement 'get_base_url' function in the fetcher object you're using so it return valid meaningful value.
      • -
      -
      - -
      - -

      Fonts. National symbols.

      -
      - -
      How can I use fonts other than standard (Times, Helvetica and Courier)?
      -
      Follow these instructions
      - -
      Euro symbol is not displayed
      -
      First of all, check if you provided correct information on the file encoding to html2ps; encoding vectors containing euro symbol are -'iso-8859-15', 'windows-1250', 'windows-1251' or 'windows-1252'. Alternatively, you may use UTF-8 or HTML entities -&euro; or &8364;. -
      - -
      Cyrillic symbols are not displayed in PS output
      -
      Install sharatype-fonts package to your Ghostscript; -the script is configured to use these fonts out-of-the-box. -
      - -
      Greek symbols with tonos are not displayed in PS output; all other greek symbols rendered normally.
      -
      -
        -
      • install the unicode postscript .pfb fonts (for example, from http://canopus.iacp.dvo.ru/~panov/cm-unicode/)
      • -
      • remove the following default 'encoding-override' section from .html2ps.config, as it make greek text to use by default 'Symbol' font lacking 'tonos' symbols: -
        -<encoding-override name="iso-8859-7">
        -  <normal normal="Symbol" italic="Symbol" oblique="Symbol"/>
        -  <bold normal="Symbol" italic="Symbol" oblique="Symbol"/>
        -</encoding-override>
        -
        -
      • -
      • -update "fonts" (NOT "fonts-pdf") section to point to installed fonts, for example: -
        -<fonts>
        -  <family name="times">
        -    <normal normal="CMUSansSerif" italic="CMUSansSerif-Oblique" oblique="CMUSansSerif-Oblique"/>
        -
        -
      • -
      -
      - -
      Chinese (Japanese, Arabic, etc...) symbols do not show on the page. What I need to do?
      -
      First of all, you'll need fonts containing these symbols; in most cases - default fonts bundled with Ghostscript or PDFLIB will contain only Western/Central - European symbols. After you find fonts containing characters you need, you - should install them instead of the standard fonts, using the answer for this - question «How can I use fonts other than standard (Times, - Helvetica and Courier)?»
      - -
      I've installed/updated True-Type fonts, but it seems that ... (some mysterious problem) ... happens
      -
      First of all, clean a "parsed fonts" cache in 'fpdf/font' subdirectory (just remove all files). This could -solve most font-related issues.
      -
      - -

      Interactive forms

      -
      -
      When I try to submit the form, Acrobat responds with a "Cannot handle content type: …" message.
      -
      Every time I submit the form, I get a strange-looking result page in by browser.
      -
      -PDF interactive forms are not like HTML forms; you MUST modify the server-side script so it return FDF file -instead of normal HTML in this case. -See PDF Reference, v 1.6, page 1026, par. 134 for futher information. -Also, you may check for a brief outline of PDF forms. -
      -
      - -

      Frames

      -
      -
      I have a page with frames containing a lot of text, but generated PDF contains only 1 page. Where's my content?
      -
      -As produced PDFs are static, you have no ways to scroll frame content. Thus, only initially visible frame content will be available. -It is a feature. -
      -
      Some links inside the frames are not active even when I enable "Render Hyperlinks" option.
      -
      -As was stated previously, script may render only a part of frame content. So, if rendered part contains a local hyperlink -pointing to non-rendered part, this hyperlink will be disabled, as it points to nowhere. -
      -
      - -

      Miscellanous

      - -
      -
      Is it possible to reduce the size of output PDF file?
      -
      Yes. By default HTML2PS embeds fonts used during conversion in the generated PDF. You may disable this option by -setting 'embed' attribute to '0' for these fonts in html2ps.config. Note that it will probably cause problems -with national symbols on older versions of Acrobat Reader; also, this assumes that users have all fonts used in PDF -files on their machines.
      - -
      Is it possible to use a custom file name when outputting the pdf file? As of right now, the filename is long ugly string and doesn't look very clean. -Can I pass the script a varible such as &saveas=thispdffile.pdf and use that for the file name when saving in the browser?
      - -
      Yes. If you're using the web interface (html2ps.php file from distribution) you would need to replace -$g_baseurl with $_REQUEST['saveas'] in the following piece of code near the end of html2ps.php: -
      -switch ($g_config['output']) {
      -case 0:
      -   $pipeline->destination = new DestinationBrowser($g_baseurl);
      -   break;
      -case 1:
      -   $pipeline->destination = new DestinationDownload($g_baseurl);
      -   break;
      -case 2:
      -   $pipeline->destination = new DestinationFile($g_baseurl);
      -   break;
      -}; 
      -
      -Also please note that by default output file name can contain only latin letters, digits, '-' and '_' signs, -any other symbols will be replaced by underscores; -you may change this behavior by hacking the filename_escape function in destination._interface.class.php. -

      -If you're using API, refer to DestinationBrowser/DestinationDownload/DestinationFile class documentation. -

      -
      - - - + + +html2ps/html2pdf FAQ + + + +

      html2ps/pdf FAQ

      +Back to table of contents + + + +
      +

      How would I report a bug?

      +

      +Use the support forum of tufat.com. +

      +

      +Please, provide the following: +

        +
      • phpinfo() output;
      • +
      • script version (and information about applied patches, if any);
      • +
      • script parameters you're using for conversion;
      • +
      • full HTML code of the page you're trying to convert.
      • +
      +The will greatly reduce the time required for solving your issue. Thank you for understanding. +

      +
      + +

      Installation.

      +
      +
      Does html2ps require any external utilities like ghostscript?
      +
      No. PHP with GD extension is sufficient to run conversion. You may use additional +extensions/utilities to use alternative output methods or to boost conversion speed a little bit, though.
      +
      Can I call this script from the command line?
      +
      Probably yes; check if your PHP support command line interface. Also, consider +reading this article on php.net: + +Using PHP from the command line +
      +
      + +

      No output at all. Broken output.

      +
      +
      I'm getting "Warning: DOMDocument::loadXML() [function.DOMDocument-loadXML]: Empty string supplied as input" error message in PHP 5.2.0 when attemting to convert some files
      +
      A new configuration parameter pcre.backtrack_limit was introduced in PHP 5.2.0. html2ps does the excessive +regexp usage; it is recommended to increase pcre.backtrack_limit value to 1000000. +
      + +
      +
      HTML2PS returns blank page. There's some strange messages in PHP error log, for example: +
      +Parent: child process exited with status 3221225477 -- Restarting.
      +
      +I'm using PHP 4.4.2
      +
      It is a PHP 4.4.2 bug #36017; there's no workarounds +except changing PHP version or writing your own fetcher without 'fopen' function calls. +I would recommend either downgrading to earlier 4.4.x versions or installing PHP 5. +
      + +
      All I'm getting is a blank page; no error messages in PHP error log. Whats happened?
      +
      The script is probably running out of memory or execution time. Try increasing + the values of max_execution_time and/or memory_limit PHP configuration variables. + Recommended values are 120 seconds and 32 megabytes. Nevertheless, if you're + using VERY big images, you'll probably need to increase these values + even more.
      + +
      +Another cause may be a JavaScript or META redirect on page you're trying to convert. As HTML2PS script is not designed +as interactive user agent, it will not follow such redirects for you. You may try to open the url in question in your browser +and check if the URL will change when page finishes loading. In this case, just supply the final URL to the script. +
      +
      +Also, please note that domain.com and www.domain.com may point to different sites. In the worst case, +domain.com (without 'www' part) may just ignore HTTP requests. On the other side, popular browsers try to guess correct +URL; for example, when you enter 'something' to the address bar, they may try to get something.com or www.something.com. +This may lead to problem similar to one described in previous paragraph; the solution is the same: open URL in browser and +check it will change. +
      + +
      I got the following error message: Fatal error: Allowed memory size of … bytes exhausted (tried to allocate … bytes) in&hellip
      +
      The script is running out of memory. Please refer to memory_limit PHP.net documentation regarding increasing memory limit.
      + +
      The script just hangs when converting page containing images! With "render images" options disabled it works!
      +
      There were reports on this problem on Windows recently. A quick investigation showed that for some reason PHP 4.4.0 +sometimes hangs indefinitely inside the 'fsockopen' call. Consider upgrading your PHP version in this case.
      + +
      I've increased limits, but still sometimes get a blank page immediately + after the script starts! Some sites are parsed, though...
      +
      Some users encountered this problem using the GD library bundled with PHP. + While it matched the GD version requirement, it sometimes caused PHP to silently + die on some images. The problem is solved by recompiling the PHP using the + external (recent enough) GD library. Note that NOT ALL PHP configurations + are subject to this problem.
      + +
      I'm getting "PDF doesn't start with "%PDF-" message from + Acrobat Reader. Nevertheless, when I save file to my hard drive, it opens + perfectly. I'm using Firefox. +
      There were user reports on issues related to Firefox/Acrobat Reader plugin + incompatibility. In particular, this problem appeared with Firefox 1.0.7 and + Reader 6.0.2 PL. You may consider upgrading your software to latest versions + in this case.
      + +
      Some characters are displayed incorrectly or missing.
      +
      +

      If you've installed, removed or changed font files, you may need to clear +cache subdirectory. HTML2PS do store information extracted from file fonts +there to reduce script initialization overhead. See also +"I've installed/updated True-Type fonts, but it seems that ... (some mysterious problem) ... happens" +

      Another cause of this problem may be incorrect source encoding; when encoding is not explicilty specified, +html2ps tries to take encoding from HTTP headers and META tags. If no encoding information found, +html2ps assumes iso-8851-1. +

      +
      + +

      Broken layout.

      +
      +
      Some characters are missing in my PDFs on some Acrobat Reader versions / different OSes
      +
      Try enabling font embedding (set 'embed' property in html2ps.config to value 1 for fonts used in your documents).
      + +
      Sites are cut-off on the right side when I'm using 640 pixels page width. What can I do?
      +
      Nothing. Treat this as a feature. Just increase the page width. Most sites + are NOT designed for such small resolutions and will cause a horizontal + scrollbar to appear in browser in such cases.
      + +
      I've disabled the "Keep screen pixel/point ratio" option and the + page layout is completely broken! What can I do?
      +
      Nothing. Treat this as a feature. If you want to get the layout close to + the image rendered by the browser, never disable this option. The only + time you'll need it is when you need to render text having the exact + size specified in points.
      + +
      Some images are rendered inside black rectangles!
      +
      PNG images with alpha channel are NOT supported. Swicth to single-color transparency, if you need it.
      + +
      Horizontal lines (e.g. line under the text) look like they consist of several parts with slightly different width.
      +
      Try disabling antialiasing in your PDF reader.
      + +
      + +

      Customizing output.

      +
      +
      How can I make an explicit page break?
      +
      +You may use one of the following HTML2PS script-specific commands: +
      +<!--NewPage-->
      +<pagebreak/>
      +<?page-break>
      +
      +Or CSS page-break-after property: +
      +<div style="page-break-after: always">
      +... some content ...
      +</div>
      +
      +
      + +
      How should I add headers or footers to generated Postscript / PDF files?
      +
      +You may use one of the following options: +
        +
      • Use blocks with 'position: fixed'. Pleas note that you probably want to +set 'top' and 'bottom' properties to negative values to avoid overlapping with +main content; it is an expected behavior according to HTML/CSS standards. +(see also a simple sample)
      • +
      • Use "Header" and "Footer" options in web interface or +PreTreeFilterHeaderFooter filter in API
      • +
      • Use CSS 3 margin boxes.
      • +
      +Note that when you use PreTreeFilterHeaderFooter or Header/Footer fields in web interface, +content is implicitly placed in fixed-positioned div; you may thing of this as follows: +
      +...
      +<body>
      +<!--header starts-->
      +<div style="position: fixed; ....">...your header content...</div>
      +<!--header ends-->
      +...
      +your HTML content
      +...
      +<!--footer starts-->
      +<div style="position: fixed; ....">...your footer content...</div>
      +<!--footer ends-->
      +</body>
      +...
      +
      +
      + +
      I've added headers and footers to my HTML pages, but how I can prevent them from showing up in the browser?
      +
      +Use @media css rules setting 'display: none' or 'display: block' for header/footer blocks on different media. +
      + +
      Is there a possibility to create pdf documents with more than 72dpi using html2ps?
      +
      You may make a page with high-resolution images and set their on-page height and width using +height and width attributes. +HTML2PS does not resample images, just outputs them to PDF and provides the scaling factor. +
      + +
      ##PAGES## directive always displays 1 in batch mode!
      +
      Yes, it is a documented feature. ##PAGES## always refer to the number of pages in file being processed. +
      + +
      + +

      API

      +
      +
      How could I convert HTML file from my local drive?
      +
      Use example file in samples/sample.simplest.from.file.php as a starting point.
      +
      How could I convert HTML code contained in a variable?
      +
      Use example file in samples/sample.simplest.from.memory.php as a starting point.
      +
      Can I convert a page using some authentication mechanism using the html2ps webinterface?
      +
      Out-of-the-box – no. Depending on the type of the authentication you may override the fetcher +object with your custom one able to bypass authentication. Still, the recommended approach +is html2ps API usage; in this case, you store your HTML code in a PHP variable instead of outputting it to the browser +and call conversion engine directly.
      +
      I'm using API to convert files and images and / or CSS files seems to be ignored.
      +
      +Most likely, you're using relative URLs and, at the same time, converting either HTML string from memory or +local file. In this case script doesn't know the base URL to use while resolving relative paths, so +these URLs are ignored. You have two options in this case: +
        +
      • Change relative URI to absolute in your HTML code
      • +
      • Implement 'get_base_url' function in the fetcher object you're using so it return valid meaningful value.
      • +
      +
      + +
      + +

      Fonts. National symbols.

      +
      + +
      How can I use fonts other than standard (Times, Helvetica and Courier)?
      +
      Follow these instructions
      + +
      Euro symbol is not displayed
      +
      First of all, check if you provided correct information on the file encoding to html2ps; encoding vectors containing euro symbol are +'iso-8859-15', 'windows-1250', 'windows-1251' or 'windows-1252'. Alternatively, you may use UTF-8 or HTML entities +&euro; or &8364;. +
      + +
      Cyrillic symbols are not displayed in PS output
      +
      Install sharatype-fonts package to your Ghostscript; +the script is configured to use these fonts out-of-the-box. +
      + +
      Greek symbols with tonos are not displayed in PS output; all other greek symbols rendered normally.
      +
      +
        +
      • install the unicode postscript .pfb fonts (for example, from http://canopus.iacp.dvo.ru/~panov/cm-unicode/)
      • +
      • remove the following default 'encoding-override' section from .html2ps.config, as it make greek text to use by default 'Symbol' font lacking 'tonos' symbols: +
        +<encoding-override name="iso-8859-7">
        +  <normal normal="Symbol" italic="Symbol" oblique="Symbol"/>
        +  <bold normal="Symbol" italic="Symbol" oblique="Symbol"/>
        +</encoding-override>
        +
        +
      • +
      • +update "fonts" (NOT "fonts-pdf") section to point to installed fonts, for example: +
        +<fonts>
        +  <family name="times">
        +    <normal normal="CMUSansSerif" italic="CMUSansSerif-Oblique" oblique="CMUSansSerif-Oblique"/>
        +
        +
      • +
      +
      + +
      Chinese (Japanese, Arabic, etc...) symbols do not show on the page. What I need to do?
      +
      First of all, you'll need fonts containing these symbols; in most cases + default fonts bundled with Ghostscript or PDFLIB will contain only Western/Central + European symbols. After you find fonts containing characters you need, you + should install them instead of the standard fonts, using the answer for this + question «How can I use fonts other than standard (Times, + Helvetica and Courier)?»
      + +
      I've installed/updated True-Type fonts, but it seems that ... (some mysterious problem) ... happens
      +
      First of all, clean a "parsed fonts" cache in 'fpdf/font' subdirectory (just remove all files). This could +solve most font-related issues.
      +
      + +

      Interactive forms

      +
      +
      When I try to submit the form, Acrobat responds with a "Cannot handle content type: …" message.
      +
      Every time I submit the form, I get a strange-looking result page in by browser.
      +
      +PDF interactive forms are not like HTML forms; you MUST modify the server-side script so it return FDF file +instead of normal HTML in this case. +See PDF Reference, v 1.6, page 1026, par. 134 for futher information. +Also, you may check for a brief outline of PDF forms. +
      +
      + +

      Frames

      +
      +
      I have a page with frames containing a lot of text, but generated PDF contains only 1 page. Where's my content?
      +
      +As produced PDFs are static, you have no ways to scroll frame content. Thus, only initially visible frame content will be available. +It is a feature. +
      +
      Some links inside the frames are not active even when I enable "Render Hyperlinks" option.
      +
      +As was stated previously, script may render only a part of frame content. So, if rendered part contains a local hyperlink +pointing to non-rendered part, this hyperlink will be disabled, as it points to nowhere. +
      +
      + +

      Miscellanous

      + +
      +
      Is it possible to reduce the size of output PDF file?
      +
      Yes. By default HTML2PS embeds fonts used during conversion in the generated PDF. You may disable this option by +setting 'embed' attribute to '0' for these fonts in html2ps.config. Note that it will probably cause problems +with national symbols on older versions of Acrobat Reader; also, this assumes that users have all fonts used in PDF +files on their machines.
      + +
      Is it possible to use a custom file name when outputting the pdf file? As of right now, the filename is long ugly string and doesn't look very clean. +Can I pass the script a varible such as &saveas=thispdffile.pdf and use that for the file name when saving in the browser?
      + +
      Yes. If you're using the web interface (html2ps.php file from distribution) you would need to replace +$g_baseurl with $_REQUEST['saveas'] in the following piece of code near the end of html2ps.php: +
      +switch ($g_config['output']) {
      +case 0:
      +   $pipeline->destination = new DestinationBrowser($g_baseurl);
      +   break;
      +case 1:
      +   $pipeline->destination = new DestinationDownload($g_baseurl);
      +   break;
      +case 2:
      +   $pipeline->destination = new DestinationFile($g_baseurl);
      +   break;
      +}; 
      +
      +Also please note that by default output file name can contain only latin letters, digits, '-' and '_' signs, +any other symbols will be replaced by underscores; +you may change this behavior by hacking the filename_escape function in destination._interface.class.php. +

      +If you're using API, refer to DestinationBrowser/DestinationDownload/DestinationFile class documentation. +

      +
      + + + diff --git a/gulliver/thirdparty/html2ps_pdf/help/forms.html b/thirdparty/html2ps_pdf/help/forms.html similarity index 97% rename from gulliver/thirdparty/html2ps_pdf/help/forms.html rename to thirdparty/html2ps_pdf/help/forms.html index 0f96c72e9..3cd3de479 100644 --- a/gulliver/thirdparty/html2ps_pdf/help/forms.html +++ b/thirdparty/html2ps_pdf/help/forms.html @@ -1,215 +1,215 @@ - - -html2ps/html2pdf interactive forms - - - -

      html2ps/pdf interactive forms

      -Back to table of contents - -

      Difference between forms in HTML and PDF

      -

      I guess, if you use html2ps script, then you know how forms are defined in HTML and how form data is sent using the POST format. This script -tries to emulate the browser behavior as closely as possible; nevertheless, there's several important differences. - -

      Field names are required

      -

      In HMTL, you may write an INPUT tag without "name" attribute and get working interactive control; often, submit and reset buttons -are written this way. When using html2ps interactive forms, you must provide "name" attribute for all -controls which should be rendered interactive. If you don't do it, the control will be rendered as a graphic like "Interactive forms" options -disabled. - -

      Field names should be unique

      -

      In HTML you usually may enter several controls with the same name into the same form and get -some kind of results. PDF files do not allow such fields at all. In this case, all subsequent fields -sharing the same name will be rendered as non-interactive. -

      - -

      Form & field names

      -

      Unlike HTML, the parameter names in POST request are not the field names. Acrobat Reader uses a "fully qualified field names" -instead. It means that field is identified by composite string having the form -

      -<form name>.<field name>
      -
      -(See also PDF Reference 1.6 Fifth Edition, pp.638–639 -for more precise and detailed explanation). When posting data in POST format, dots are converted to underscores, so you would get: -
      -<form name>_<field name>
      -
      -when processing the POSTed data. -

      - -

      To illustrate what I've said above, consider the following example: -

      -<form name="form1">
      -<input type="text" name="item1" value="test"/>
      -<input type="submit" name="submit" value="Submit 1st form"/>
      -</form>
      -
      -<form name="form2">
      -<input type="text" name="item2" value="test"/>
      -<input type="submit" name="submit" value="Submit 2nd form"/>
      -</form>
      -
      -Usually you would get POST variables "item1" and "submit" when submitting the 1st form and -"item2" and "submit" when submitting the 2nd form. When submitting the form from PDF, you'll get -"form1_item1", "form1_submit" and "form2_item2", "form2_submit" correspondingly. - -

      - -

      The name of the form is taken from "name" or "id" FORM tag attributes (note that if both attributes are specified, then -"name" have the higher priority). If both these attributes are missing, then the script attemts to generate an unique name for the form; -Newertheless, it is highly recommended to add "id" or "name" attributes for every form definition. The -autogenerated form names may suddenly change when you change the page content. It is not guaranteed that future html2ps versions will -use the same name generation rules.

      - -

      Also, you must note that html2ps is less tolerant to the form definition than most browsers. You may get conversion errors or even -unpredictable results when viewing generated PDF if the following conditions are not satisfied: -

        -
      • Form names are unique throughout the page
      • -
      • Field names are unique in the form
      • -
      • Radio button values are unique inside the button group
      • -
      -

      - -

      Button field values

      -

      -In HTML, when you click on the Submit button, the posted data will include the value of "value" attribute for the button. -When you're submitting form from generated PDF, you'll get an empty string as a value of this parameter. Thus, -this check is a bad idea (bad, but rather popular): -

      -…
      -if ($_POST['my_submit_button_name']) { 
      -…
      -
      -and should be replaced by this code: -
      -…
      -if (isset($_POST['my_submit_button_name'])) { 
      -…
      -
      -

      - -

      Image submit button click coordinates

      -

      -In HTML forms, you'll get three POST varaibles after clicking on "image" submit button: <button>, <button>_x and <button>_y. -When you're posting data from PDF you'll get only two last parameters! -

      - -

      Unsupported field types

      -

      -"file;" and "hidden" fields are not supported. -

      - -

      Server-side form handling

      - -Note: there's an PHP extension designed to work with FDF files; you may wish to check documentation at - PHP.net: Forms Data Format Functions - -

      Basically, you must use the script which accepts data in HTTP POST format and outputs result in FDF format. (Actually, in any format, -but be prepared to Acrobat Reader complaints like "Cannot handle Content-Type: …") -The minimal data-handling example is: -

      -// output an empty FPF file
      -
      -$outfdf  = fdf_create();
      -$tmpname = tempnam('../temp',"FDF_");
      -fdf_set_status($outfdf, "Thank you!");
      -fdf_save($outfdf, $tmpname);
      -fdf_close($outfdf);
      -
      -fdf_header();
      -$fp = fopen($tmpname, "r");
      -fpassthru($fp);
      -unlink($tmpname);
      -
      -It just confirms the receiving of the posted data; "Thank you!" message will be shown as a popup by Acrobat Reader. -Probably you would want to actually do something with POSTed data, but is it far beyound the area of this manual. - -

      Compatibility list

      -
      NameReplaced with
      ##PAGE##Number of current page
      ##PAGES## +Total number of pages in the generated PDF file. Note that this directive +will show number of pages in current source file when the script is run in batch mode. +
      ##FILENAME##Filename (URL) of the source HTML
      ##FILESIZE##Size of the source file (without included files)
      ##TIMESTAMP##Date/time the PDF file have been generated
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      ElementIs supported?Notes
      Text field (<input type="text">)Yes
      Password field (<input type="password">)Yes
      Submit button (<input type="submit">)YesValue of button "value" attribute is not posted
      Reset button (<input type="reset">)Yes
      Plain button (<input type="button">)YesRenders and you may click on them, but there's no much use of buttons, as Javascript is NOT supported
      Checkbox (<input type="checkbox">)Yes
      Radio (<input type="radio">)Yes
      Textarea (<textarea>)Yes
      Select (<select>)Yes
      Image (<input type="image">)Yes
      File (<input type="file">)No
      Hidden (<input type="hidden">)No
      - - - + + +html2ps/html2pdf interactive forms + + + +

      html2ps/pdf interactive forms

      +Back to table of contents + +

      Difference between forms in HTML and PDF

      +

      I guess, if you use html2ps script, then you know how forms are defined in HTML and how form data is sent using the POST format. This script +tries to emulate the browser behavior as closely as possible; nevertheless, there's several important differences. + +

      Field names are required

      +

      In HMTL, you may write an INPUT tag without "name" attribute and get working interactive control; often, submit and reset buttons +are written this way. When using html2ps interactive forms, you must provide "name" attribute for all +controls which should be rendered interactive. If you don't do it, the control will be rendered as a graphic like "Interactive forms" options +disabled. + +

      Field names should be unique

      +

      In HTML you usually may enter several controls with the same name into the same form and get +some kind of results. PDF files do not allow such fields at all. In this case, all subsequent fields +sharing the same name will be rendered as non-interactive. +

      + +

      Form & field names

      +

      Unlike HTML, the parameter names in POST request are not the field names. Acrobat Reader uses a "fully qualified field names" +instead. It means that field is identified by composite string having the form +

      +<form name>.<field name>
      +
      +(See also PDF Reference 1.6 Fifth Edition, pp.638–639 +for more precise and detailed explanation). When posting data in POST format, dots are converted to underscores, so you would get: +
      +<form name>_<field name>
      +
      +when processing the POSTed data. +

      + +

      To illustrate what I've said above, consider the following example: +

      +<form name="form1">
      +<input type="text" name="item1" value="test"/>
      +<input type="submit" name="submit" value="Submit 1st form"/>
      +</form>
      +
      +<form name="form2">
      +<input type="text" name="item2" value="test"/>
      +<input type="submit" name="submit" value="Submit 2nd form"/>
      +</form>
      +
      +Usually you would get POST variables "item1" and "submit" when submitting the 1st form and +"item2" and "submit" when submitting the 2nd form. When submitting the form from PDF, you'll get +"form1_item1", "form1_submit" and "form2_item2", "form2_submit" correspondingly. + +

      + +

      The name of the form is taken from "name" or "id" FORM tag attributes (note that if both attributes are specified, then +"name" have the higher priority). If both these attributes are missing, then the script attemts to generate an unique name for the form; +Newertheless, it is highly recommended to add "id" or "name" attributes for every form definition. The +autogenerated form names may suddenly change when you change the page content. It is not guaranteed that future html2ps versions will +use the same name generation rules.

      + +

      Also, you must note that html2ps is less tolerant to the form definition than most browsers. You may get conversion errors or even +unpredictable results when viewing generated PDF if the following conditions are not satisfied: +

        +
      • Form names are unique throughout the page
      • +
      • Field names are unique in the form
      • +
      • Radio button values are unique inside the button group
      • +
      +

      + +

      Button field values

      +

      +In HTML, when you click on the Submit button, the posted data will include the value of "value" attribute for the button. +When you're submitting form from generated PDF, you'll get an empty string as a value of this parameter. Thus, +this check is a bad idea (bad, but rather popular): +

      +…
      +if ($_POST['my_submit_button_name']) { 
      +…
      +
      +and should be replaced by this code: +
      +…
      +if (isset($_POST['my_submit_button_name'])) { 
      +…
      +
      +

      + +

      Image submit button click coordinates

      +

      +In HTML forms, you'll get three POST varaibles after clicking on "image" submit button: <button>, <button>_x and <button>_y. +When you're posting data from PDF you'll get only two last parameters! +

      + +

      Unsupported field types

      +

      +"file;" and "hidden" fields are not supported. +

      + +

      Server-side form handling

      + +Note: there's an PHP extension designed to work with FDF files; you may wish to check documentation at + PHP.net: Forms Data Format Functions + +

      Basically, you must use the script which accepts data in HTTP POST format and outputs result in FDF format. (Actually, in any format, +but be prepared to Acrobat Reader complaints like "Cannot handle Content-Type: …") +The minimal data-handling example is: +

      +// output an empty FPF file
      +
      +$outfdf  = fdf_create();
      +$tmpname = tempnam('../temp',"FDF_");
      +fdf_set_status($outfdf, "Thank you!");
      +fdf_save($outfdf, $tmpname);
      +fdf_close($outfdf);
      +
      +fdf_header();
      +$fp = fopen($tmpname, "r");
      +fpassthru($fp);
      +unlink($tmpname);
      +
      +It just confirms the receiving of the posted data; "Thank you!" message will be shown as a popup by Acrobat Reader. +Probably you would want to actually do something with POSTed data, but is it far beyound the area of this manual. + +

      Compatibility list

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      ElementIs supported?Notes
      Text field (<input type="text">)Yes
      Password field (<input type="password">)Yes
      Submit button (<input type="submit">)YesValue of button "value" attribute is not posted
      Reset button (<input type="reset">)Yes
      Plain button (<input type="button">)YesRenders and you may click on them, but there's no much use of buttons, as Javascript is NOT supported
      Checkbox (<input type="checkbox">)Yes
      Radio (<input type="radio">)Yes
      Textarea (<textarea>)Yes
      Select (<select>)Yes
      Image (<input type="image">)Yes
      File (<input type="file">)No
      Hidden (<input type="hidden">)No
      + + + diff --git a/gulliver/thirdparty/html2ps_pdf/help/howto_afm.html b/thirdparty/html2ps_pdf/help/howto_afm.html similarity index 96% rename from gulliver/thirdparty/html2ps_pdf/help/howto_afm.html rename to thirdparty/html2ps_pdf/help/howto_afm.html index a0b89e62b..40731b465 100644 --- a/gulliver/thirdparty/html2ps_pdf/help/howto_afm.html +++ b/thirdparty/html2ps_pdf/help/howto_afm.html @@ -1,19 +1,19 @@ - - -html2ps/html2pdf FAQ - - - -

      HOWTO: Generate AFM metrics file

      -

      Back to table of contents

      - -using the ttf2pt1 utility (or any other utility able to produce AFM files) - -
      -ttf2pt1.exe -a -GfAe verdana.ttf
      -
      - -An alternative is to search pre-generated AFM files in the Net. - - + + +html2ps/html2pdf FAQ + + + +

      HOWTO: Generate AFM metrics file

      +

      Back to table of contents

      + +using the ttf2pt1 utility (or any other utility able to produce AFM files) + +
      +ttf2pt1.exe -a -GfAe verdana.ttf
      +
      + +An alternative is to search pre-generated AFM files in the Net. + + \ No newline at end of file diff --git a/gulliver/thirdparty/html2ps_pdf/help/howto_fonts.html b/thirdparty/html2ps_pdf/help/howto_fonts.html similarity index 98% rename from gulliver/thirdparty/html2ps_pdf/help/howto_fonts.html rename to thirdparty/html2ps_pdf/help/howto_fonts.html index a97df09b2..f6de48a69 100644 --- a/gulliver/thirdparty/html2ps_pdf/help/howto_fonts.html +++ b/thirdparty/html2ps_pdf/help/howto_fonts.html @@ -1,141 +1,141 @@ - - -html2ps/html2pdf FAQ - - - -

      HOWTO: Install custom fonts

      -

      Back to table of contents

      - -
      -Keep in mind that most likely you will be using FPDF output method, as it covers 90% of your needs. -Installing fonts for PDFLIB and Postscript output methods is required only if you're using -non-default output driver. -
      - -
        -
      1. FPDF -
      2. Postscript
      3. -
      4. Postscript (PS2PDF)
      5. -
      6. PDFLIB -
      - -

      FPDF output method

      -Let's assume that you're going to install Trebuchet MS for the FPDF output method. -
        -
      1. Copy font files (trebuc.ttf, treducdb.ttf, trebucbi.ttf and trebucit.ttf) -to TTF_FONTS_REPOSITORY directory (by default it points to 'fonts' subdirectory)
      2. -
      3. Generate font metrics file for these fonts files -and put it into the same directory. Note that metrics file should have the same name as font file and -extension .afm (this step is optional if you're using a html2ps version more recent than 1.9.4)
      4. -
      5. Register new font family in html2ps.config: add the following lines to html2ps.config in -the FONTS-PDF section (between <fonts-pdf> and </fonts-pdf> tags): -
        -  <family name="Trebuchet MS">
        -    <normal normal="TrebuchetMS" italic="TrebuchetMS-Italic" oblique="TrebuchetMS-Italic"/>
        -    <bold normal="TrebuchetMS-Bold" italic="TrebuchetMS-Bold-Italic" oblique="TrebuchetMS-Bold-Italic"/>
        -  </family>
        -
        -
      6. -Register font files: add the following to the FONTS-PDF section: -
        -  <ttf typeface="TrebuchetMS"             embed="0" file="trebuc.ttf"/>
        -  <ttf typeface="TrebuchetMS-Bold"        embed="0" file="trebucbd.ttf"/>
        -  <ttf typeface="TrebuchetMS-Italic"      embed="0" file="trebucit.ttf"/>
        -  <ttf typeface="TrebuchetMS-Bold-Italic" embed="0" file="trebucbi.ttf"/>
        -
        -Note that you may want to replace embed="0" with embed="1" if you intend -to distribute generated PDF to users without Trebuchet MS font installed in their machines. -
      7. -
      - -

      Postscript output method

      -Say you want to see the fancy "Trebuchet MS" font in your generated -postscript... -
        -
      1. First of all, TrueType-compatible Ghostscript is a must. Most Ghostscipt - distributions are TrueType compatible. If you're not sure, ask your system - administrator. If your GS is not True-Type compatible, consider building from - source using require options.
        -
        -
      2. -
      3. Find the file coresponding to "Trebuchet MS". Assuming you're - using some version of Windows on your home machine, you can do it by opening - "Control Panel ... Fonts" and checking the properties of the chosen - font. At the top of the property page you'll see the file name - trebuc.ttf, - in our case.
        -
        -
      4. -
      5. Find the font files corresponding to the bold, italic and bold italic versions - of this font. Probably, it will be:
        - "Trebuchet MS Bold" -- trebucbd.ttf,
        - "Trebuchet MS Italic" -- trebucit.ttf,
        - "Trebuchet MS Bold Italic" -- trebucbi.ttf
        -
        -
      6. -
      7. Copy these files from the Windows fonts directory (probably C:\Windows\Fonts) - to the Ghostscript fonts directory (probably C:\gs\fonts).
        -
        -
      8. -
      9. Modify the Ghostscript fontmap file (probably C:\gs\gs8.51\lib\Fontmap, - assuming you're using Ghostscript version 8.51), adding the folowing lines: -
        -/TrebuchetMS (trebuc.ttf) ;
        -/TrebuchetMS-Italic (trebucit.ttf) ;
        -/TrebuchetMS-Bold (trebucbd.ttf) ;
        -/TrebuchetMS-Bold-Italic (trebucbi.ttf) ;
        -
        - Note you can write almost anything after the / assuming it won't interfere - with other font names. Say: -
        -/MyCoolFont1 (trebuc.ttf) ;
        -/MyCoolFont2 (trebucit.ttf) ;
        -/MyCoolFont3 (trebucbd.ttf) ;
        -/MyCoolFont4 (trebucbi.ttf) ;
        -
        -
      10. -
      11. Register the above font names in the script config file. Add the following - lines to html2ps.config in the FONTS section (between <fonts> - and </fonts> tags) -
        -  <family name="Trebuchet MS">
        -    <normal normal="TrebuchetMS" italic="TrebuchetMS-Italic" oblique="TrebuchetMS-Italic"/>
        -    <bold normal="TrebuchetMS-Bold" italic="TrebuchetMS-Bold-Italic" oblique="TrebuchetMS-Bold-Italic"/>
        -  </family>
        -
        - Of course, the modified file should be uploaded to the server where the working - script reside.
        -
        -
      12. Register the metric files of the new TrueType fonts. To do it, add the following to the FONT section: -
        -    <metrics typeface="TrebuchetMS" file="trebuc"/>
        -    <metrics typeface="TrebuchetMS-Italic" file="trebucit"/>
        -    <metrics typeface="TrebuchetMS-Bold" file="trebucbd"/>
        -    <metrics typeface="TrebuchetMS-BoldItalic" file="trebucbi"/>
        -
        - In this case, the "file" value refers to the name of the font metric file (.afm) you've - generated. The ".afm" extension - as appended automatically; files are searched in the directory specified by TYPE1_FONTS_REPOSITORY configuration - constant (see your config.inc.php file). -
      13. -
      14. Now, the following example should be rendered using Trebuchet MS font: -
        -<BIG style="font-family: 'Trebuchet MS'">ABCDEFGH</BIG><br>
        -<BIG style="font-family: 'Trebuchet MS'; font-weight: bold;">ABCDEFGH</BIG><br>
        -<BIG style="font-family: 'Trebuchet MS'; font-style: italic;">ABCDEFGH</BIG><br>
        -<BIG style="font-family: 'Trebuchet MS'; font-weight: bold; font-style: italic;">ABCDEFGH</BIG><br>
        -
        -
      15. -
      - -

      PS2PDF output method

      - -

      Take the steps described above with only this difference: all Ghostscript-related - directories are on your server where the script resides. Ask your hoster/system - administrator about the exact location of Ghostscript.

      - -

      PDFLIB output method

      -

      Please refer to PDFLib Documentation.

      - - + + +html2ps/html2pdf FAQ + + + +

      HOWTO: Install custom fonts

      +

      Back to table of contents

      + +
      +Keep in mind that most likely you will be using FPDF output method, as it covers 90% of your needs. +Installing fonts for PDFLIB and Postscript output methods is required only if you're using +non-default output driver. +
      + +
        +
      1. FPDF +
      2. Postscript
      3. +
      4. Postscript (PS2PDF)
      5. +
      6. PDFLIB +
      + +

      FPDF output method

      +Let's assume that you're going to install Trebuchet MS for the FPDF output method. +
        +
      1. Copy font files (trebuc.ttf, treducdb.ttf, trebucbi.ttf and trebucit.ttf) +to TTF_FONTS_REPOSITORY directory (by default it points to 'fonts' subdirectory)
      2. +
      3. Generate font metrics file for these fonts files +and put it into the same directory. Note that metrics file should have the same name as font file and +extension .afm (this step is optional if you're using a html2ps version more recent than 1.9.4)
      4. +
      5. Register new font family in html2ps.config: add the following lines to html2ps.config in +the FONTS-PDF section (between <fonts-pdf> and </fonts-pdf> tags): +
        +  <family name="Trebuchet MS">
        +    <normal normal="TrebuchetMS" italic="TrebuchetMS-Italic" oblique="TrebuchetMS-Italic"/>
        +    <bold normal="TrebuchetMS-Bold" italic="TrebuchetMS-Bold-Italic" oblique="TrebuchetMS-Bold-Italic"/>
        +  </family>
        +
        +
      6. +Register font files: add the following to the FONTS-PDF section: +
        +  <ttf typeface="TrebuchetMS"             embed="0" file="trebuc.ttf"/>
        +  <ttf typeface="TrebuchetMS-Bold"        embed="0" file="trebucbd.ttf"/>
        +  <ttf typeface="TrebuchetMS-Italic"      embed="0" file="trebucit.ttf"/>
        +  <ttf typeface="TrebuchetMS-Bold-Italic" embed="0" file="trebucbi.ttf"/>
        +
        +Note that you may want to replace embed="0" with embed="1" if you intend +to distribute generated PDF to users without Trebuchet MS font installed in their machines. +
      7. +
      + +

      Postscript output method

      +Say you want to see the fancy "Trebuchet MS" font in your generated +postscript... +
        +
      1. First of all, TrueType-compatible Ghostscript is a must. Most Ghostscipt + distributions are TrueType compatible. If you're not sure, ask your system + administrator. If your GS is not True-Type compatible, consider building from + source using require options.
        +
        +
      2. +
      3. Find the file coresponding to "Trebuchet MS". Assuming you're + using some version of Windows on your home machine, you can do it by opening + "Control Panel ... Fonts" and checking the properties of the chosen + font. At the top of the property page you'll see the file name - trebuc.ttf, + in our case.
        +
        +
      4. +
      5. Find the font files corresponding to the bold, italic and bold italic versions + of this font. Probably, it will be:
        + "Trebuchet MS Bold" -- trebucbd.ttf,
        + "Trebuchet MS Italic" -- trebucit.ttf,
        + "Trebuchet MS Bold Italic" -- trebucbi.ttf
        +
        +
      6. +
      7. Copy these files from the Windows fonts directory (probably C:\Windows\Fonts) + to the Ghostscript fonts directory (probably C:\gs\fonts).
        +
        +
      8. +
      9. Modify the Ghostscript fontmap file (probably C:\gs\gs8.51\lib\Fontmap, + assuming you're using Ghostscript version 8.51), adding the folowing lines: +
        +/TrebuchetMS (trebuc.ttf) ;
        +/TrebuchetMS-Italic (trebucit.ttf) ;
        +/TrebuchetMS-Bold (trebucbd.ttf) ;
        +/TrebuchetMS-Bold-Italic (trebucbi.ttf) ;
        +
        + Note you can write almost anything after the / assuming it won't interfere + with other font names. Say: +
        +/MyCoolFont1 (trebuc.ttf) ;
        +/MyCoolFont2 (trebucit.ttf) ;
        +/MyCoolFont3 (trebucbd.ttf) ;
        +/MyCoolFont4 (trebucbi.ttf) ;
        +
        +
      10. +
      11. Register the above font names in the script config file. Add the following + lines to html2ps.config in the FONTS section (between <fonts> + and </fonts> tags) +
        +  <family name="Trebuchet MS">
        +    <normal normal="TrebuchetMS" italic="TrebuchetMS-Italic" oblique="TrebuchetMS-Italic"/>
        +    <bold normal="TrebuchetMS-Bold" italic="TrebuchetMS-Bold-Italic" oblique="TrebuchetMS-Bold-Italic"/>
        +  </family>
        +
        + Of course, the modified file should be uploaded to the server where the working + script reside.
        +
        +
      12. Register the metric files of the new TrueType fonts. To do it, add the following to the FONT section: +
        +    <metrics typeface="TrebuchetMS" file="trebuc"/>
        +    <metrics typeface="TrebuchetMS-Italic" file="trebucit"/>
        +    <metrics typeface="TrebuchetMS-Bold" file="trebucbd"/>
        +    <metrics typeface="TrebuchetMS-BoldItalic" file="trebucbi"/>
        +
        + In this case, the "file" value refers to the name of the font metric file (.afm) you've + generated. The ".afm" extension + as appended automatically; files are searched in the directory specified by TYPE1_FONTS_REPOSITORY configuration + constant (see your config.inc.php file). +
      13. +
      14. Now, the following example should be rendered using Trebuchet MS font: +
        +<BIG style="font-family: 'Trebuchet MS'">ABCDEFGH</BIG><br>
        +<BIG style="font-family: 'Trebuchet MS'; font-weight: bold;">ABCDEFGH</BIG><br>
        +<BIG style="font-family: 'Trebuchet MS'; font-style: italic;">ABCDEFGH</BIG><br>
        +<BIG style="font-family: 'Trebuchet MS'; font-weight: bold; font-style: italic;">ABCDEFGH</BIG><br>
        +
        +
      15. +
      + +

      PS2PDF output method

      + +

      Take the steps described above with only this difference: all Ghostscript-related + directories are on your server where the script resides. Ask your hoster/system + administrator about the exact location of Ghostscript.

      + +

      PDFLIB output method

      +

      Please refer to PDFLib Documentation.

      + + \ No newline at end of file diff --git a/gulliver/thirdparty/html2ps_pdf/help/index.html b/thirdparty/html2ps_pdf/help/index.html similarity index 97% rename from gulliver/thirdparty/html2ps_pdf/help/index.html rename to thirdparty/html2ps_pdf/help/index.html index 921039c60..a3fdbeef4 100644 --- a/gulliver/thirdparty/html2ps_pdf/help/index.html +++ b/thirdparty/html2ps_pdf/help/index.html @@ -1,33 +1,33 @@ - - -html2ps/html2pdf documentation - - - -

      html2ps/pdf documentation

      -
        -
      1. FAQ
      2. -
      3. Requirements and recommendations
      4. -
      5. Installation notes -
      6. Configuring html2ps/pdf -
      7. Calling html2ps/pdf
      8. -
      9. html2ps/pdf HTML directives
      10. -
      11. Interactive forms
      12. -
      13. API -
          -
        1. API description
        2. -
        3. How do "fetchers" work?
        4. -
        5. Minimal code samples
        6. -
        7. API events
        8. -
        -
      14. -
      15. HOWTO: Use custom fonts
      16. -
      17. CSS 2.1 compatibility list
      18. -
      19. CSS 3 compatibility list
      20. - -
      -html2ps/pdf (c) TUFaT.com - - + + +html2ps/html2pdf documentation + + + +

      html2ps/pdf documentation

      +
        +
      1. FAQ
      2. +
      3. Requirements and recommendations
      4. +
      5. Installation notes +
      6. Configuring html2ps/pdf +
      7. Calling html2ps/pdf
      8. +
      9. html2ps/pdf HTML directives
      10. +
      11. Interactive forms
      12. +
      13. API +
          +
        1. API description
        2. +
        3. How do "fetchers" work?
        4. +
        5. Minimal code samples
        6. +
        7. API events
        8. +
        +
      14. +
      15. HOWTO: Use custom fonts
      16. +
      17. CSS 2.1 compatibility list
      18. +
      19. CSS 3 compatibility list
      20. + +
      +html2ps/pdf (c) TUFaT.com + + diff --git a/gulliver/thirdparty/html2ps_pdf/help/install.html b/thirdparty/html2ps_pdf/help/install.html similarity index 98% rename from gulliver/thirdparty/html2ps_pdf/help/install.html rename to thirdparty/html2ps_pdf/help/install.html index 2d2263444..30f0d1462 100644 --- a/gulliver/thirdparty/html2ps_pdf/help/install.html +++ b/thirdparty/html2ps_pdf/help/install.html @@ -1,31 +1,31 @@ - - -html2ps/html2pdf installation notes - - - -

      html2ps/pdf installation notes

      -

      Back to table of contents

      - -

      To install HTML2PS, follow these simple steps:

      -
        -
      1. Unpack zip package contents to some directory on your web server
      2. -
      3. Edit config.inc.php to suit your needs; most probably you'll need to update values of GS_PATH and TYPE1_FONTS_REPOSITORY constants
      4. -
      5. Ensure script files and directories have correct permissions: -
          -
        • All files and folders should be readable by webserver user account
        • -
        • Directories 'out','tmp' and 'cache' should be writeable by webserver user account
        • -
        • If you're going to use FPDF output method, please copy .ttf files from your Windows distribution (or any other source) to -fonts subdirectory! Due the size of TrueType fonts files, they're not distibuted with the scripts, but still needed by some output methods.
        • -
        -
      - -

      Important: if you're upgrading from older script version, remove all files -from 'cache' subdirectory!

      - -

      Warning:

      -The default distribution includes several sample script files and script web interface; they may be easily used for DoS attack on your server! -It is highly recommended that you remove 'sample' and 'demo' subdirectories from publicly available script installation. - - - + + +html2ps/html2pdf installation notes + + + +

      html2ps/pdf installation notes

      +

      Back to table of contents

      + +

      To install HTML2PS, follow these simple steps:

      +
        +
      1. Unpack zip package contents to some directory on your web server
      2. +
      3. Edit config.inc.php to suit your needs; most probably you'll need to update values of GS_PATH and TYPE1_FONTS_REPOSITORY constants
      4. +
      5. Ensure script files and directories have correct permissions: +
          +
        • All files and folders should be readable by webserver user account
        • +
        • Directories 'out','tmp' and 'cache' should be writeable by webserver user account
        • +
        • If you're going to use FPDF output method, please copy .ttf files from your Windows distribution (or any other source) to +fonts subdirectory! Due the size of TrueType fonts files, they're not distibuted with the scripts, but still needed by some output methods.
        • +
        +
      + +

      Important: if you're upgrading from older script version, remove all files +from 'cache' subdirectory!

      + +

      Warning:

      +The default distribution includes several sample script files and script web interface; they may be easily used for DoS attack on your server! +It is highly recommended that you remove 'sample' and 'demo' subdirectories from publicly available script installation. + + + diff --git a/gulliver/thirdparty/html2ps_pdf/help/misc.html b/thirdparty/html2ps_pdf/help/misc.html similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/help/misc.html rename to thirdparty/html2ps_pdf/help/misc.html diff --git a/gulliver/thirdparty/html2ps_pdf/help/requirements.html b/thirdparty/html2ps_pdf/help/requirements.html similarity index 98% rename from gulliver/thirdparty/html2ps_pdf/help/requirements.html rename to thirdparty/html2ps_pdf/help/requirements.html index c453ab0fe..adc7d1805 100644 --- a/gulliver/thirdparty/html2ps_pdf/help/requirements.html +++ b/thirdparty/html2ps_pdf/help/requirements.html @@ -1,90 +1,90 @@ - - -html2ps/html2pdf requirements - - - -

      html2ps/pdf requirements

      -

      Back to table of contents

      - -

      Required:

      -
        -
      1. PHP 4.1.0 or newer (PHP 5 is supported)
      2. -
      3. -native PHP DOM XML -OR -Active-Link DOM XML extension installed
      4. - -
      5. -GD PHP Image Extension, version 2.0.28 or newer. -Note that you may use GD starting with version 2.0.1, but you will lack GIF support.
      6. -
      -

      If your system satisfies this requirements, you will be able to generate uncompressed - Postscript files. Use GhostView - or any other Postscript viewer to view/print these files. Note that Acrobat - Reader cannot read Poscript files! -

      -Also, use native DOM XML PHP extension if possible. - -

      Highly recommended:

      -
        -
      1. Zlib - PHP extension -- allows compressed Postscript file generation. Compression - greatly reduces the generated file size, up to 5-7 times, saving significant - bandwidth.
      2. -
      3. Ghostscript - version 7.05 or newer -- allows generation of PDF files (strictly speaking, - script generates Postscript file, then converts it to PDF using Ghostscript). - Please note that you'll need to have the ghostscript fonts package intalled - in order for this conversion to work!. Also, keep in mind that Ghostscript - is an external program, so you'll need to have the exec function enabled - in your PHP configuration; if you're using PHP in safe mode, it is probably - disabled. It might be disabled even if safe mode is not in use. Please check - with your system administrator regarding the availability of the exec - function.
      4. -
      5. PDFLIB - -- allows direct PDF generation; in general, PDF files generated via PDFLIB - have better image quality and renders a little bit faster than PDFs created - using Ghostscript. Nevertheless, PDFLIB is a non-free library, so you'll probably - will need to buy a license for it.
      6. - -
      -

      If your system satisfies this requirements, you will be able to generated both - Postscript and PDF files. -

      Note: You can choose either Ghostscript or PDFLIB (or both). Only one of these - packages is needed for PDF generation. Another option is to use the FPdf libraries, - which are bundled with html2ps/pdf. Using this method to generate PDFs is slower, - but does not require external libraries. -

      Recommended:

      -
        -
      1. iconv - PHP extension -- allows faster and more stable HTML page conversion from different - charsets (you can ignore this requirement if the pages you're working with - do not contain non-iso-8859-1 symbols -- central european or cyrillic, for - example)
      2. -
      -

      Systems satisfying these recommended requirements will have a minor boost in - conversion speed. -

      Recommended PHP configuration settings:

      -
        -
      1. PHP Memory limit should be set to 32-62 megabytes;
      2. -
      3. PHP Script time execution limit should be set to 2-3 minutes;
      4. -
      -

      Systems NOT satisfying these requirements MAY be not able to process complicated - pages with big images. The exact values of these variables should be determined - experimentally (trial and error).

      - -

      Client-side software:

      -
        -
      1. Ghostscript - version 7.05 or newer and GSView - -- to view generated compressed and uncompressed files and to convert them - to PDF on the client side.
      2. -
      3. Adobe - Acrobat Distiller -- to convert Postscript files to PDF on the client - size (Ghostscript alternative).
      4. -
      5. Adobe - Acrobat Reader -- to view PDF files.
      6. -
      - - + + +html2ps/html2pdf requirements + + + +

      html2ps/pdf requirements

      +

      Back to table of contents

      + +

      Required:

      +
        +
      1. PHP 4.1.0 or newer (PHP 5 is supported)
      2. +
      3. +native PHP DOM XML +OR +Active-Link DOM XML extension installed
      4. + +
      5. +GD PHP Image Extension, version 2.0.28 or newer. +Note that you may use GD starting with version 2.0.1, but you will lack GIF support.
      6. +
      +

      If your system satisfies this requirements, you will be able to generate uncompressed + Postscript files. Use GhostView + or any other Postscript viewer to view/print these files. Note that Acrobat + Reader cannot read Poscript files! +

      +Also, use native DOM XML PHP extension if possible. + +

      Highly recommended:

      +
        +
      1. Zlib + PHP extension -- allows compressed Postscript file generation. Compression + greatly reduces the generated file size, up to 5-7 times, saving significant + bandwidth.
      2. +
      3. Ghostscript + version 7.05 or newer -- allows generation of PDF files (strictly speaking, + script generates Postscript file, then converts it to PDF using Ghostscript). + Please note that you'll need to have the ghostscript fonts package intalled + in order for this conversion to work!. Also, keep in mind that Ghostscript + is an external program, so you'll need to have the exec function enabled + in your PHP configuration; if you're using PHP in safe mode, it is probably + disabled. It might be disabled even if safe mode is not in use. Please check + with your system administrator regarding the availability of the exec + function.
      4. +
      5. PDFLIB + -- allows direct PDF generation; in general, PDF files generated via PDFLIB + have better image quality and renders a little bit faster than PDFs created + using Ghostscript. Nevertheless, PDFLIB is a non-free library, so you'll probably + will need to buy a license for it.
      6. + +
      +

      If your system satisfies this requirements, you will be able to generated both + Postscript and PDF files. +

      Note: You can choose either Ghostscript or PDFLIB (or both). Only one of these + packages is needed for PDF generation. Another option is to use the FPdf libraries, + which are bundled with html2ps/pdf. Using this method to generate PDFs is slower, + but does not require external libraries. +

      Recommended:

      +
        +
      1. iconv + PHP extension -- allows faster and more stable HTML page conversion from different + charsets (you can ignore this requirement if the pages you're working with + do not contain non-iso-8859-1 symbols -- central european or cyrillic, for + example)
      2. +
      +

      Systems satisfying these recommended requirements will have a minor boost in + conversion speed. +

      Recommended PHP configuration settings:

      +
        +
      1. PHP Memory limit should be set to 32-62 megabytes;
      2. +
      3. PHP Script time execution limit should be set to 2-3 minutes;
      4. +
      +

      Systems NOT satisfying these requirements MAY be not able to process complicated + pages with big images. The exact values of these variables should be determined + experimentally (trial and error).

      + +

      Client-side software:

      +
        +
      1. Ghostscript + version 7.05 or newer and GSView + -- to view generated compressed and uncompressed files and to convert them + to PDF on the client side.
      2. +
      3. Adobe + Acrobat Distiller -- to convert Postscript files to PDF on the client + size (Ghostscript alternative).
      4. +
      5. Adobe + Acrobat Reader -- to view PDF files.
      6. +
      + + diff --git a/gulliver/thirdparty/html2ps_pdf/help/samples/headfoot.html b/thirdparty/html2ps_pdf/help/samples/headfoot.html similarity index 98% rename from gulliver/thirdparty/html2ps_pdf/help/samples/headfoot.html rename to thirdparty/html2ps_pdf/help/samples/headfoot.html index a7338b8a3..7b1068700 100644 --- a/gulliver/thirdparty/html2ps_pdf/help/samples/headfoot.html +++ b/thirdparty/html2ps_pdf/help/samples/headfoot.html @@ -1,5 +1,5 @@ -
      HEADER
      -
      FOOTER
      -
      text on the first page
      -
      text on the second page
      - +
      HEADER
      +
      FOOTER
      +
      text on the first page
      +
      text on the second page
      + diff --git a/gulliver/thirdparty/html2ps_pdf/html.attrs.inc.php b/thirdparty/html2ps_pdf/html.attrs.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/html.attrs.inc.php rename to thirdparty/html2ps_pdf/html.attrs.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/html2ps.config b/thirdparty/html2ps_pdf/html2ps.config similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/html2ps.config rename to thirdparty/html2ps_pdf/html2ps.config diff --git a/gulliver/thirdparty/html2ps_pdf/html2ps.config.recommended b/thirdparty/html2ps_pdf/html2ps.config.recommended similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/html2ps.config.recommended rename to thirdparty/html2ps_pdf/html2ps.config.recommended diff --git a/gulliver/thirdparty/html2ps_pdf/image.class.php b/thirdparty/html2ps_pdf/image.class.php similarity index 99% rename from gulliver/thirdparty/html2ps_pdf/image.class.php rename to thirdparty/html2ps_pdf/image.class.php index 78e8b572c..fbf16bd2f 100644 --- a/gulliver/thirdparty/html2ps_pdf/image.class.php +++ b/thirdparty/html2ps_pdf/image.class.php @@ -80,14 +80,14 @@ class Image { // allowed file name length (especially after escaping specialy symbols) // thus, we generate long almost random 32-character name using the md5 hash function // - if(!class_exists('G')){ - $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); - $docuroot = explode( '/', $realdocuroot ); - array_pop( $docuroot ); - $pathhome = implode( '/', $docuroot ) . '/'; - array_pop( $docuroot ); - $pathTrunk = implode( '/', $docuroot ) . '/'; - require_once($pathTrunk.'gulliver/system/class.g.php'); + if(!class_exists('G')){ + $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); + $docuroot = explode( '/', $realdocuroot ); + array_pop( $docuroot ); + $pathhome = implode( '/', $docuroot ) . '/'; + array_pop( $docuroot ); + $pathTrunk = implode( '/', $docuroot ) . '/'; + require_once($pathTrunk.'gulliver/system/class.g.php'); } return CACHE_DIR.G::encryptOld(time() + $url + rand()); } diff --git a/gulliver/thirdparty/html2ps_pdf/index.php b/thirdparty/html2ps_pdf/index.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/index.php rename to thirdparty/html2ps_pdf/index.php diff --git a/gulliver/thirdparty/html2ps_pdf/inline.content.builder.factory.php b/thirdparty/html2ps_pdf/inline.content.builder.factory.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/inline.content.builder.factory.php rename to thirdparty/html2ps_pdf/inline.content.builder.factory.php diff --git a/gulliver/thirdparty/html2ps_pdf/inline.content.builder.normal.php b/thirdparty/html2ps_pdf/inline.content.builder.normal.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/inline.content.builder.normal.php rename to thirdparty/html2ps_pdf/inline.content.builder.normal.php diff --git a/gulliver/thirdparty/html2ps_pdf/inline.content.builder.nowrap.php b/thirdparty/html2ps_pdf/inline.content.builder.nowrap.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/inline.content.builder.nowrap.php rename to thirdparty/html2ps_pdf/inline.content.builder.nowrap.php diff --git a/gulliver/thirdparty/html2ps_pdf/inline.content.builder.php b/thirdparty/html2ps_pdf/inline.content.builder.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/inline.content.builder.php rename to thirdparty/html2ps_pdf/inline.content.builder.php diff --git a/gulliver/thirdparty/html2ps_pdf/inline.content.builder.pre.line.php b/thirdparty/html2ps_pdf/inline.content.builder.pre.line.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/inline.content.builder.pre.line.php rename to thirdparty/html2ps_pdf/inline.content.builder.pre.line.php diff --git a/gulliver/thirdparty/html2ps_pdf/inline.content.builder.pre.php b/thirdparty/html2ps_pdf/inline.content.builder.pre.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/inline.content.builder.pre.php rename to thirdparty/html2ps_pdf/inline.content.builder.pre.php diff --git a/gulliver/thirdparty/html2ps_pdf/inline.content.builder.pre.wrap.php b/thirdparty/html2ps_pdf/inline.content.builder.pre.wrap.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/inline.content.builder.pre.wrap.php rename to thirdparty/html2ps_pdf/inline.content.builder.pre.wrap.php diff --git a/gulliver/thirdparty/html2ps_pdf/layout._interface.class.php b/thirdparty/html2ps_pdf/layout._interface.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/layout._interface.class.php rename to thirdparty/html2ps_pdf/layout._interface.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/layout.default.class.php b/thirdparty/html2ps_pdf/layout.default.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/layout.default.class.php rename to thirdparty/html2ps_pdf/layout.default.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/layout.page.breaks.php b/thirdparty/html2ps_pdf/layout.page.breaks.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/layout.page.breaks.php rename to thirdparty/html2ps_pdf/layout.page.breaks.php diff --git a/gulliver/thirdparty/html2ps_pdf/layout.vertical.php b/thirdparty/html2ps_pdf/layout.vertical.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/layout.vertical.php rename to thirdparty/html2ps_pdf/layout.vertical.php diff --git a/gulliver/thirdparty/html2ps_pdf/list-style.image.php b/thirdparty/html2ps_pdf/list-style.image.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/list-style.image.php rename to thirdparty/html2ps_pdf/list-style.image.php diff --git a/gulliver/thirdparty/html2ps_pdf/manager.encoding.php b/thirdparty/html2ps_pdf/manager.encoding.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/manager.encoding.php rename to thirdparty/html2ps_pdf/manager.encoding.php diff --git a/gulliver/thirdparty/html2ps_pdf/media.layout.inc.php b/thirdparty/html2ps_pdf/media.layout.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/media.layout.inc.php rename to thirdparty/html2ps_pdf/media.layout.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/observer.class.php b/thirdparty/html2ps_pdf/observer.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/observer.class.php rename to thirdparty/html2ps_pdf/observer.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/ot.class.php b/thirdparty/html2ps_pdf/ot.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/ot.class.php rename to thirdparty/html2ps_pdf/ot.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/out/readme.txt b/thirdparty/html2ps_pdf/out/readme.txt similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/out/readme.txt rename to thirdparty/html2ps_pdf/out/readme.txt diff --git a/gulliver/thirdparty/html2ps_pdf/output._generic.class.php b/thirdparty/html2ps_pdf/output._generic.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/output._generic.class.php rename to thirdparty/html2ps_pdf/output._generic.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/output._generic.pdf.class.php b/thirdparty/html2ps_pdf/output._generic.pdf.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/output._generic.pdf.class.php rename to thirdparty/html2ps_pdf/output._generic.pdf.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/output._generic.ps.class.php b/thirdparty/html2ps_pdf/output._generic.ps.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/output._generic.ps.class.php rename to thirdparty/html2ps_pdf/output._generic.ps.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/output._interface.class.php b/thirdparty/html2ps_pdf/output._interface.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/output._interface.class.php rename to thirdparty/html2ps_pdf/output._interface.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/output.fastps.class.php b/thirdparty/html2ps_pdf/output.fastps.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/output.fastps.class.php rename to thirdparty/html2ps_pdf/output.fastps.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/output.fastps.l2.class.php b/thirdparty/html2ps_pdf/output.fastps.l2.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/output.fastps.l2.class.php rename to thirdparty/html2ps_pdf/output.fastps.l2.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/output.fpdf.class.php b/thirdparty/html2ps_pdf/output.fpdf.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/output.fpdf.class.php rename to thirdparty/html2ps_pdf/output.fpdf.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/output.pcl.class.php b/thirdparty/html2ps_pdf/output.pcl.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/output.pcl.class.php rename to thirdparty/html2ps_pdf/output.pcl.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/output.pdflib.1.6.class.php b/thirdparty/html2ps_pdf/output.pdflib.1.6.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/output.pdflib.1.6.class.php rename to thirdparty/html2ps_pdf/output.pdflib.1.6.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/output.pdflib.class.php b/thirdparty/html2ps_pdf/output.pdflib.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/output.pdflib.class.php rename to thirdparty/html2ps_pdf/output.pdflib.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/output.pdflib.old.class.php b/thirdparty/html2ps_pdf/output.pdflib.old.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/output.pdflib.old.class.php rename to thirdparty/html2ps_pdf/output.pdflib.old.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/output.png.class.php b/thirdparty/html2ps_pdf/output.png.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/output.png.class.php rename to thirdparty/html2ps_pdf/output.png.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/parser._interface.class.php b/thirdparty/html2ps_pdf/parser._interface.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/parser._interface.class.php rename to thirdparty/html2ps_pdf/parser._interface.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/parser.xhtml.class.php b/thirdparty/html2ps_pdf/parser.xhtml.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/parser.xhtml.class.php rename to thirdparty/html2ps_pdf/parser.xhtml.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/path.php b/thirdparty/html2ps_pdf/path.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/path.php rename to thirdparty/html2ps_pdf/path.php diff --git a/gulliver/thirdparty/html2ps_pdf/path.point.php b/thirdparty/html2ps_pdf/path.point.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/path.point.php rename to thirdparty/html2ps_pdf/path.point.php diff --git a/gulliver/thirdparty/html2ps_pdf/path.rectangle.php b/thirdparty/html2ps_pdf/path.rectangle.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/path.rectangle.php rename to thirdparty/html2ps_pdf/path.rectangle.php diff --git a/gulliver/thirdparty/html2ps_pdf/pdf.fpdf.encryption.php b/thirdparty/html2ps_pdf/pdf.fpdf.encryption.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/pdf.fpdf.encryption.php rename to thirdparty/html2ps_pdf/pdf.fpdf.encryption.php diff --git a/gulliver/thirdparty/html2ps_pdf/pdf.fpdf.makefont.php b/thirdparty/html2ps_pdf/pdf.fpdf.makefont.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/pdf.fpdf.makefont.php rename to thirdparty/html2ps_pdf/pdf.fpdf.makefont.php diff --git a/gulliver/thirdparty/html2ps_pdf/pdf.fpdf.php b/thirdparty/html2ps_pdf/pdf.fpdf.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/pdf.fpdf.php rename to thirdparty/html2ps_pdf/pdf.fpdf.php diff --git a/gulliver/thirdparty/html2ps_pdf/pipeline.class.php b/thirdparty/html2ps_pdf/pipeline.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/pipeline.class.php rename to thirdparty/html2ps_pdf/pipeline.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/pipeline.factory.class.php b/thirdparty/html2ps_pdf/pipeline.factory.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/pipeline.factory.class.php rename to thirdparty/html2ps_pdf/pipeline.factory.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/array.ps b/thirdparty/html2ps_pdf/postscript/array.ps similarity index 97% rename from gulliver/thirdparty/html2ps_pdf/postscript/array.ps rename to thirdparty/html2ps_pdf/postscript/array.ps index ad1421ada..680bf7807 100644 --- a/gulliver/thirdparty/html2ps_pdf/postscript/array.ps +++ b/thirdparty/html2ps_pdf/postscript/array.ps @@ -1,284 +1,284 @@ -% $Header: /cvsroot/html2ps/postscript/array.ps,v 1.1 2005/12/18 07:21:36 Konstantin Exp $ - -% Actually, array-append and array-prepend should have names exchanged; -% nevertheless, I don't want to track down renames all over ps files, so I've decided to -% keep this as is -% -% Prepends item to array -% -% @param Item item value -% @param Array source array -% @return A copy of source array with Item prepended as a first element -% -/array-append { % => Item Array - aload length - 1 add - array astore -} def - -/in-array-find { % => Array Value Pos - 2 index length 0 eq { - pop pop pop -1 - } { - 2 index 0 get % => Array Value Pos A0 - 2 index eq { % => Array Value Pos - 3 1 roll % => Pos Array Value - pop pop % => Pos - } { - 1 add % => Array Value Pos+1 - 2 index - array-pop-first % => Array Value Pos+1 Array' - 4 3 roll pop % => Value Pos+1 Array' - 3 1 roll % => Array' Value Pos+1 - in-array-find - } ifelse - } ifelse -} def - -/array-find { % => Array Value - 0 in-array-find -} def - -/array-insert { % => Index Value Data - aload length % => Index Value A1 .. AN N - 1 add % => Index Value A1 .. AN N+1 - dup 2 add % => Index Value A1 .. AN N+1 N+3 - dup index % => Index Value A1 .. AN N+1 N+3 Index - exch % => Index Value A1 .. AN N+1 Index N+3 - 1 sub % => Index Value A1 .. AN N+1 Index N+2 - index % => Index Value A1 .. AN N+1 Index Value - exch % => Index Value A1 .. AN N+1 Value Index - 2 index % => Index Value A1 .. AN N+1 Value Index N+1 - 1 add % => Index Value A1 .. AN N+1 Value Index N+2 - exch sub % => Index Value A1 .. AN N+1 Value N-Index+2 - 1 % => Index Value A1 .. AN N+1 Value N-Index+2 1 - roll % => Index Value A1 .. AINDEX-1 Value AINDEX .. AN N+1 - array astore % => Index Value Array - 3 1 roll % => Array Index Value - pop pop -} def % => Data' - -/array-last { % => Array - dup length % => Array Length - 1 sub % => Array Length-1 - get % => Last -} def - -/array-merge { % => A1 A2 - { % => A1 A2[i] - exch array-prepend % => A1' - } forall % => A1' -} def - -/array-pop-last { % => Array - aload length % => A1 .. AN N - 1 sub % => A1 .. AN N-1 - exch pop % => A1 .. AN-1 N-1 - array astore % => Array' -} def - -/array-pop-first { % => Array - aload length % => A1 .. AN N - 1 sub % => A1 .. AN N-1 - array astore % => A1 Array' - exch pop % => Array' -} def - -% Appends item to array -% -% @param Item item value -% @param Array source array -% @return A copy of source array with Item appended as a last element -% -/array-prepend { % => Item Array - aload length % => Item Item1 .. ItemN N - 1 add % => Item Item1 .. ItemN N+1 - dup 1 add % => Item Item1 .. ItemN N+1 N+2 - 1 index roll % => Item1 .. ItemN N+1 Item - exch % => Item1 .. ItemN Item N+1 - array astore % => Array -} def - -/array-remove { % => Array Index(ZeroBased) - exch % => Index Array - aload length % => Index A1 .. AN N - 1 sub % => Index A1 .. AN N-1 - dup 2 add % => Index A1 .. AN N-1 N+2 - index % => Index A1 .. AN N-1 Index - 1 index % => Index A1 .. AN N-1 Index N-1 - 2 add % => Index A1 .. AN N-1 Index N+1 - exch sub % => Index A1 .. AN N-1 N-Index+1 - dup 1 sub % => Index A1 .. AN N-1 N-Index+1 N-Index - roll % => Index A1 .. AINDEX-1 AINDEX+1 .. AN N-1 AINDEX - pop % => Index A1 .. AINDEX-1 AINDEX+1 .. AN N-1 - array astore % => Index Array - exch pop % => Array -} def - -% Basic insertions algorithm; we're working with small arrays -% and these arrays are have "good" natural order of elements, so -% more complicated algorithms are not needed here -% -/array-sort { % => Data GtFun - [] % => Data GtFun SortedData - array-sort-rec % => SortedData -} def - -/array-sort-rec { % => Data GtFun SortedData - 2 index length 0 gt { - 2 index 2 index - array-sort-rec-select-max % => Data GtFun SortedData Data' MaxValue - - 5 4 roll pop % => GtFun SortedData Data' MaxValue - 2 index array-prepend % => GtFun SortedData Data' SortedData' - - 3 2 roll pop % => GtFun Data' SortedData' - exch % => GtFun SortedData' Data' - 3 1 roll % => Data' GtFun SortedData' - array-sort-rec - } { - exch pop - exch pop % => SortedData - } ifelse -} def - -/array-sort-rec-select-max { % => Data GtFun - 1 index 0 get % => Data GtFun E0 - 0 1 % => Data GtFun EMax EMaxIndex ECurIndex - array-sort-rec-select-max-rec % => Data GtFun EMax EMaxIndex - -% remove element found from source array - 3 index exch array-remove % => Data GtFun EMax Data' - - 4 2 roll pop pop % => EMax Data - exch % => Data EMax -} def - -/array-sort-rec-select-max-rec { % => Data GtFun EMax EMaxIndex ECurIndex -% Check if we're out of source array bounds - 4 index length 1 index gt { % => Data GtFun EMax EMaxIndex ECurIndex - 4 index 1 index get % => Data GtFun EMax EMaxIndex ECurIndex ECur - 3 index % => Data GtFun EMax EMaxIndex ECurIndex ECur EMax - 5 index exec % => Data GtFun EMax EMaxIndex ECurIndex ECur>EMax - { % => Data GtFun EMax EMaxIndex ECurIndex - exch pop dup % => Data GtFun EMax EMaxIndex' ECurIndex - 4 index 1 index get % => Data GtFun EMax EMaxIndex' ECurIndex EMax' - 4 3 roll pop % => Data GtFun EMaxIndex' ECurIndex EMax' - 3 1 roll % => Data GtFun EMax' EMaxIndex' ECurIndex - } if % => Data GtFun EMax' EMaxIndex' ECurIndex - 1 add - array-sort-rec-select-max-rec - } { - pop - } ifelse -} def % => Data GtFun EMax EMaxIndex - -/expand-to { % => Size Array -% if array have no elements - return immediately - dup length 0 eq { - [] % => Size Array Flags [] - } { - dup sum % => Size Array ASize - dup 0 gt { % => Size Array ASize - dup % => Size Array ASize ASize - 3 index lt % => Size Array ASize - { % => Size Array ASize - 2 index % => Size Array ASize Size - exch div % => Size Array Size/ASize - map-scale % => Size Array' - exch pop % => Array' - } { % => Size Array ASize - pop exch % => Array Size - pop % => Array - } ifelse % => Array - } { % => Size Array ASize -% No content found in some colspan columns - pop % => Size Array - array-pop-first - array-append % => Array - } ifelse - } ifelse -} def - -/expand-to-with-flags { % => Size Array Flags -% if array have no elements - return immediately - 1 index length 0 eq { - [] % => Size Array Flags [] - } { -% Never decrease exising values - 1 index sum % => Size Array Flags ASum - 3 index % => Size Array Flags ASum Size - gt { - 1 index % => Size Array Flags Expanded - } { % => Size Array Flags -% Subtract non-modifiable values from target value - 2 copy { - dup not { pop } { pop pop 0 } ifelse - } zip-with - sum % => Size Array Flags Non-modSum - 4 3 roll exch sub 3 1 roll % => Size' Array Flags -% Check if there's any expandable columns - 2 copy { - dup { pop } { pop pop 0 } ifelse - } zip-with - sum % => Size Array Flags ModSum - - dup 0 eq { % => Size Array Flags ModSum - pop % => Size Array Flags - 1 index % => Size Array Flags Array - 0 get 3 index add % => Size Array Flags A0' - 2 index exch - 0 exch put % => Size Array Flags - 1 index - } { % => Size Array Flags ModSum -% Calculate scale koeff - 3 index exch div % => Size Array Flags Koeff -% Apply scale koeff - 0 1 4 index length 1 sub { % => Size Array Flags Koeff I - 2 index 1 index get { - 3 index - 1 index get % => Size Array Flags Koeff I A[i] - 2 index mul % => Size Array Flags Koeff I A[i]*Koeff - 4 index exch - 2 index exch put % => Size Array Flags Koeff I - } if - pop - } for % => Size Array Flags Koeff - pop % => Size Array Flags - 1 index - } ifelse % => Size Array Flags Expanded - } ifelse - } ifelse % => Size Array Flags Expanded - - exch pop - exch pop - exch pop -} def - -/in-reduce { % => A1 .. AN N Fun StartValue - 2 index 0 gt { - 4 3 roll % => A1 .. AN-1 N Fun StartValue AN - 2 index exec % => A1 .. AN-1 N Fun (StartValue Fun AN) - 3 2 roll % => A1 .. AN-1 Fun (StartValue Fun AN) N - 1 sub % => A1 .. AN-1 Fun (StartValue Fun AN) N-1 - 3 1 roll % => A1 .. AN-1 N-1 Fun (StartValue Fun AN) - in-reduce - } { % => N Fun Value - 3 1 roll % => Value N Fun - pop pop % => Value - } ifelse -} def - -/reduce { % => Fun StartValue Array - aload length % => Fun StartValue A1 .. AN N - dup 3 add % => Fun StartValue A1 .. AN N N+3 - 1 index 1 add % => Fun StartValue A1 .. AN N N+3 N+1 - roll % => A1 .. AN N Fun StartValue - in-reduce -} def - -/sum { % => Array - {add} 0 % => Array {add} 0 - 3 2 roll % => {add} 0 Array - reduce % => Sum -} def +% $Header: /cvsroot/html2ps/postscript/array.ps,v 1.1 2005/12/18 07:21:36 Konstantin Exp $ + +% Actually, array-append and array-prepend should have names exchanged; +% nevertheless, I don't want to track down renames all over ps files, so I've decided to +% keep this as is +% +% Prepends item to array +% +% @param Item item value +% @param Array source array +% @return A copy of source array with Item prepended as a first element +% +/array-append { % => Item Array + aload length + 1 add + array astore +} def + +/in-array-find { % => Array Value Pos + 2 index length 0 eq { + pop pop pop -1 + } { + 2 index 0 get % => Array Value Pos A0 + 2 index eq { % => Array Value Pos + 3 1 roll % => Pos Array Value + pop pop % => Pos + } { + 1 add % => Array Value Pos+1 + 2 index + array-pop-first % => Array Value Pos+1 Array' + 4 3 roll pop % => Value Pos+1 Array' + 3 1 roll % => Array' Value Pos+1 + in-array-find + } ifelse + } ifelse +} def + +/array-find { % => Array Value + 0 in-array-find +} def + +/array-insert { % => Index Value Data + aload length % => Index Value A1 .. AN N + 1 add % => Index Value A1 .. AN N+1 + dup 2 add % => Index Value A1 .. AN N+1 N+3 + dup index % => Index Value A1 .. AN N+1 N+3 Index + exch % => Index Value A1 .. AN N+1 Index N+3 + 1 sub % => Index Value A1 .. AN N+1 Index N+2 + index % => Index Value A1 .. AN N+1 Index Value + exch % => Index Value A1 .. AN N+1 Value Index + 2 index % => Index Value A1 .. AN N+1 Value Index N+1 + 1 add % => Index Value A1 .. AN N+1 Value Index N+2 + exch sub % => Index Value A1 .. AN N+1 Value N-Index+2 + 1 % => Index Value A1 .. AN N+1 Value N-Index+2 1 + roll % => Index Value A1 .. AINDEX-1 Value AINDEX .. AN N+1 + array astore % => Index Value Array + 3 1 roll % => Array Index Value + pop pop +} def % => Data' + +/array-last { % => Array + dup length % => Array Length + 1 sub % => Array Length-1 + get % => Last +} def + +/array-merge { % => A1 A2 + { % => A1 A2[i] + exch array-prepend % => A1' + } forall % => A1' +} def + +/array-pop-last { % => Array + aload length % => A1 .. AN N + 1 sub % => A1 .. AN N-1 + exch pop % => A1 .. AN-1 N-1 + array astore % => Array' +} def + +/array-pop-first { % => Array + aload length % => A1 .. AN N + 1 sub % => A1 .. AN N-1 + array astore % => A1 Array' + exch pop % => Array' +} def + +% Appends item to array +% +% @param Item item value +% @param Array source array +% @return A copy of source array with Item appended as a last element +% +/array-prepend { % => Item Array + aload length % => Item Item1 .. ItemN N + 1 add % => Item Item1 .. ItemN N+1 + dup 1 add % => Item Item1 .. ItemN N+1 N+2 + 1 index roll % => Item1 .. ItemN N+1 Item + exch % => Item1 .. ItemN Item N+1 + array astore % => Array +} def + +/array-remove { % => Array Index(ZeroBased) + exch % => Index Array + aload length % => Index A1 .. AN N + 1 sub % => Index A1 .. AN N-1 + dup 2 add % => Index A1 .. AN N-1 N+2 + index % => Index A1 .. AN N-1 Index + 1 index % => Index A1 .. AN N-1 Index N-1 + 2 add % => Index A1 .. AN N-1 Index N+1 + exch sub % => Index A1 .. AN N-1 N-Index+1 + dup 1 sub % => Index A1 .. AN N-1 N-Index+1 N-Index + roll % => Index A1 .. AINDEX-1 AINDEX+1 .. AN N-1 AINDEX + pop % => Index A1 .. AINDEX-1 AINDEX+1 .. AN N-1 + array astore % => Index Array + exch pop % => Array +} def + +% Basic insertions algorithm; we're working with small arrays +% and these arrays are have "good" natural order of elements, so +% more complicated algorithms are not needed here +% +/array-sort { % => Data GtFun + [] % => Data GtFun SortedData + array-sort-rec % => SortedData +} def + +/array-sort-rec { % => Data GtFun SortedData + 2 index length 0 gt { + 2 index 2 index + array-sort-rec-select-max % => Data GtFun SortedData Data' MaxValue + + 5 4 roll pop % => GtFun SortedData Data' MaxValue + 2 index array-prepend % => GtFun SortedData Data' SortedData' + + 3 2 roll pop % => GtFun Data' SortedData' + exch % => GtFun SortedData' Data' + 3 1 roll % => Data' GtFun SortedData' + array-sort-rec + } { + exch pop + exch pop % => SortedData + } ifelse +} def + +/array-sort-rec-select-max { % => Data GtFun + 1 index 0 get % => Data GtFun E0 + 0 1 % => Data GtFun EMax EMaxIndex ECurIndex + array-sort-rec-select-max-rec % => Data GtFun EMax EMaxIndex + +% remove element found from source array + 3 index exch array-remove % => Data GtFun EMax Data' + + 4 2 roll pop pop % => EMax Data + exch % => Data EMax +} def + +/array-sort-rec-select-max-rec { % => Data GtFun EMax EMaxIndex ECurIndex +% Check if we're out of source array bounds + 4 index length 1 index gt { % => Data GtFun EMax EMaxIndex ECurIndex + 4 index 1 index get % => Data GtFun EMax EMaxIndex ECurIndex ECur + 3 index % => Data GtFun EMax EMaxIndex ECurIndex ECur EMax + 5 index exec % => Data GtFun EMax EMaxIndex ECurIndex ECur>EMax + { % => Data GtFun EMax EMaxIndex ECurIndex + exch pop dup % => Data GtFun EMax EMaxIndex' ECurIndex + 4 index 1 index get % => Data GtFun EMax EMaxIndex' ECurIndex EMax' + 4 3 roll pop % => Data GtFun EMaxIndex' ECurIndex EMax' + 3 1 roll % => Data GtFun EMax' EMaxIndex' ECurIndex + } if % => Data GtFun EMax' EMaxIndex' ECurIndex + 1 add + array-sort-rec-select-max-rec + } { + pop + } ifelse +} def % => Data GtFun EMax EMaxIndex + +/expand-to { % => Size Array +% if array have no elements - return immediately + dup length 0 eq { + [] % => Size Array Flags [] + } { + dup sum % => Size Array ASize + dup 0 gt { % => Size Array ASize + dup % => Size Array ASize ASize + 3 index lt % => Size Array ASize + { % => Size Array ASize + 2 index % => Size Array ASize Size + exch div % => Size Array Size/ASize + map-scale % => Size Array' + exch pop % => Array' + } { % => Size Array ASize + pop exch % => Array Size + pop % => Array + } ifelse % => Array + } { % => Size Array ASize +% No content found in some colspan columns + pop % => Size Array + array-pop-first + array-append % => Array + } ifelse + } ifelse +} def + +/expand-to-with-flags { % => Size Array Flags +% if array have no elements - return immediately + 1 index length 0 eq { + [] % => Size Array Flags [] + } { +% Never decrease exising values + 1 index sum % => Size Array Flags ASum + 3 index % => Size Array Flags ASum Size + gt { + 1 index % => Size Array Flags Expanded + } { % => Size Array Flags +% Subtract non-modifiable values from target value + 2 copy { + dup not { pop } { pop pop 0 } ifelse + } zip-with + sum % => Size Array Flags Non-modSum + 4 3 roll exch sub 3 1 roll % => Size' Array Flags +% Check if there's any expandable columns + 2 copy { + dup { pop } { pop pop 0 } ifelse + } zip-with + sum % => Size Array Flags ModSum + + dup 0 eq { % => Size Array Flags ModSum + pop % => Size Array Flags + 1 index % => Size Array Flags Array + 0 get 3 index add % => Size Array Flags A0' + 2 index exch + 0 exch put % => Size Array Flags + 1 index + } { % => Size Array Flags ModSum +% Calculate scale koeff + 3 index exch div % => Size Array Flags Koeff +% Apply scale koeff + 0 1 4 index length 1 sub { % => Size Array Flags Koeff I + 2 index 1 index get { + 3 index + 1 index get % => Size Array Flags Koeff I A[i] + 2 index mul % => Size Array Flags Koeff I A[i]*Koeff + 4 index exch + 2 index exch put % => Size Array Flags Koeff I + } if + pop + } for % => Size Array Flags Koeff + pop % => Size Array Flags + 1 index + } ifelse % => Size Array Flags Expanded + } ifelse + } ifelse % => Size Array Flags Expanded + + exch pop + exch pop + exch pop +} def + +/in-reduce { % => A1 .. AN N Fun StartValue + 2 index 0 gt { + 4 3 roll % => A1 .. AN-1 N Fun StartValue AN + 2 index exec % => A1 .. AN-1 N Fun (StartValue Fun AN) + 3 2 roll % => A1 .. AN-1 Fun (StartValue Fun AN) N + 1 sub % => A1 .. AN-1 Fun (StartValue Fun AN) N-1 + 3 1 roll % => A1 .. AN-1 N-1 Fun (StartValue Fun AN) + in-reduce + } { % => N Fun Value + 3 1 roll % => Value N Fun + pop pop % => Value + } ifelse +} def + +/reduce { % => Fun StartValue Array + aload length % => Fun StartValue A1 .. AN N + dup 3 add % => Fun StartValue A1 .. AN N N+3 + 1 index 1 add % => Fun StartValue A1 .. AN N N+3 N+1 + roll % => A1 .. AN N Fun StartValue + in-reduce +} def + +/sum { % => Array + {add} 0 % => Array {add} 0 + 3 2 roll % => {add} 0 Array + reduce % => Sum +} def diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/background.image.ps b/thirdparty/html2ps_pdf/postscript/background.image.ps similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/postscript/background.image.ps rename to thirdparty/html2ps_pdf/postscript/background.image.ps diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/background.ps b/thirdparty/html2ps_pdf/postscript/background.ps similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/postscript/background.ps rename to thirdparty/html2ps_pdf/postscript/background.ps diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/border.ps b/thirdparty/html2ps_pdf/postscript/border.ps similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/postscript/border.ps rename to thirdparty/html2ps_pdf/postscript/border.ps diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/box.block.inline.ps b/thirdparty/html2ps_pdf/postscript/box.block.inline.ps similarity index 96% rename from gulliver/thirdparty/html2ps_pdf/postscript/box.block.inline.ps rename to thirdparty/html2ps_pdf/postscript/box.block.inline.ps index 6d5a29377..70d0c9c13 100644 --- a/gulliver/thirdparty/html2ps_pdf/postscript/box.block.inline.ps +++ b/thirdparty/html2ps_pdf/postscript/box.block.inline.ps @@ -1,57 +1,57 @@ -% $Header: /cvsroot/html2ps/postscript/box.block.inline.ps,v 1.1 2005/12/18 07:21:36 Konstantin Exp $ - -/box-inline-block-create { - box-container-create - dup box-inline-block-setup-methods - dup /box-inline-block add-type -} def - -/box-inline-block-reflow { % => Context Parent Box - 1 index /null ne { -% Calculate margin values if they have been set as a percentage - 2 copy - box-generic-calc-percentage-margins - -% Calculate width value if it had been set as a percentage - 3 copy - box-generic-calc-percentage-width - -% Calculate 'auto' values of width and margins - 2 copy - box-generic-calc-auto-width-margins - -% Add current box to the parent's line-box - dup 2 index - box-container-append-line - - 2 copy - box-generic-guess-corner - -% By default, child block box will fill all available parent width; -% note that actual width will be smaller because of non-zero padding, border and margins - 1 index /get-width call-method - 1 index put-full-width - } if - -% Reflow content - - 2 index 1 index box-container-reflow-content - - 1 index /null ne { -% Extend parent's height to fit current box - dup get-bottom-margin - 2 index box-generic-extend-height - -% Offset current x coordinate of parent box - dup get-right-margin - 2 index put-current-x - } if - - pop pop pop -} def - -/box-inline-block-setup-methods { - dup /Methods get - dup /reflow {box-inline-block-reflow} put - pop pop +% $Header: /cvsroot/html2ps/postscript/box.block.inline.ps,v 1.1 2005/12/18 07:21:36 Konstantin Exp $ + +/box-inline-block-create { + box-container-create + dup box-inline-block-setup-methods + dup /box-inline-block add-type +} def + +/box-inline-block-reflow { % => Context Parent Box + 1 index /null ne { +% Calculate margin values if they have been set as a percentage + 2 copy + box-generic-calc-percentage-margins + +% Calculate width value if it had been set as a percentage + 3 copy + box-generic-calc-percentage-width + +% Calculate 'auto' values of width and margins + 2 copy + box-generic-calc-auto-width-margins + +% Add current box to the parent's line-box + dup 2 index + box-container-append-line + + 2 copy + box-generic-guess-corner + +% By default, child block box will fill all available parent width; +% note that actual width will be smaller because of non-zero padding, border and margins + 1 index /get-width call-method + 1 index put-full-width + } if + +% Reflow content + + 2 index 1 index box-container-reflow-content + + 1 index /null ne { +% Extend parent's height to fit current box + dup get-bottom-margin + 2 index box-generic-extend-height + +% Offset current x coordinate of parent box + dup get-right-margin + 2 index put-current-x + } if + + pop pop pop +} def + +/box-inline-block-setup-methods { + dup /Methods get + dup /reflow {box-inline-block-reflow} put + pop pop } def \ No newline at end of file diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/box.block.ps b/thirdparty/html2ps_pdf/postscript/box.block.ps similarity index 97% rename from gulliver/thirdparty/html2ps_pdf/postscript/box.block.ps rename to thirdparty/html2ps_pdf/postscript/box.block.ps index bc7e78e4b..9bfc0f15e 100644 --- a/gulliver/thirdparty/html2ps_pdf/postscript/box.block.ps +++ b/thirdparty/html2ps_pdf/postscript/box.block.ps @@ -1,255 +1,255 @@ -% $Header: /cvsroot/html2ps/postscript/box.block.ps,v 1.1 2005/12/18 07:21:36 Konstantin Exp $ - -/box-block-create { - box-container-create - -% Setup method references - dup box-block-setup-methods - dup /box-block add-type -} def - -/box-block-reflow { % => Content Parent This - dup /position get-css-value - { - dup /static eq { pop 3 copy /reflow-static call-method exit } if - dup /relative eq { pop 3 copy /reflow-relative call-method exit } if - dup /absolute eq { pop dup 3 index context-add-absolute-positioned exit } if - dup /fixed eq { pop dup 3 index context-add-fixed-positioned exit } if - } loop - - pop pop pop % => -} def % => - -/box-block-reflow-absolute { % => Context This -% Calculate actual box position relative to the containing block - dup box-generic-get-containing-block - % => Context This CBlock - - dup containing-block-left % => Context This CBlock CBLeft - 2 index /left get-css-value add % => Context This CBlock Left - 2 index put-left % => COntext This CBlock - -% TODO: top percentage values - - dup containing-block-top - 2 index /top get-css-value - /value get sub % => Context This CBlock Top - 2 index get-extra-top sub % => Context This CBlock Top - 2 index put-top % => Context This CBlock - -% As sometimes left/right values may not be set, we need to use the "fit" width here -% if no width constraints been set, it will not be modified by the code below - - 2 index 2 index /get-max-width - call-method % => Context This CBlock MW - 2 index put-full-width % => Context This CBlock - -% Update the width, as it should be calculated based upon containing block width, not real parent - - dup containing-block-right - 1 index containing-block-left - sub % => Context This CBlock CBWidth - 2 index /get-width call-method % => Context This CBlock CBWidth W - 3 index get-width-constraint - wc-apply % => Context This CBlock W' - 2 index put-full-width % => Context This CBlock - -% And remove any width constraint after this, as they could refer to parent widths - wc-create-none % => Context This CBlock WCNone - 2 index put-width-constraint % => Context This CBlock - - 2 index 2 index - box-container-reflow-content % => Context This CBlock - - pop pop pop -} def - -/box-block-reflow-fixed { % => Context This - 0 1 index put-left - 0 1 index put-top - -% As sometimes left/right values may not be set, we need to use the "fit" width here -% if no width constraints been set, it will not be modified by the code below - - 1 index - 1 index /get-max-width - call-method - 1 index put-full-width % => Context This - - dup /get-width call-method - dup - 2 index get-width-constraint - wc-apply - 1 index put-full-width % => Context This - - wc-create-none 1 index - put-width-constraint % => Context This - - 2 copy - box-container-reflow-content - - pop pop -} def - -/box-block-reflow-relative { % => Context Parent This -% CSS 2.1: -% Once a box has been laid out according to the normal flow or floated, it may be shifted relative -% to this position. This is called relative positioning. Offsetting a box (B1) in this way has no -% effect on the box (B2) that follows: B2 is given a position as if B1 were not offset and B2 is -% not re-positioned after B1's offset is applied. This implies that relative positioning may cause boxes -% to overlap. However, if relative positioning causes an 'overflow:auto' box to have overflow, the UA must -% allow the user to access this content, which, through the creation of scrollbars, may affect layout. - - 3 copy - box-block-reflow-static - -% Note that percentage values are ignored for relative positioning - -% Check if top value is percentage - - dup /top get-css-value /percentage get { - 0 - } { - dup /top get-css-value /value get - } ifelse % => Context Parent This Top - neg - - 2 index /left get-css-value % => Context Parent This Top Left - 2 index /offset call-method % => Context Parent This - - pop pop pop -} def - -/box-block-reflow-static { % => Context Parent This - dup /float get-css-value - /none eq { - 3 copy /reflow-static-normal call-method - } { - 3 copy /reflow-static-float call-method - } ifelse - pop pop pop -} def - -/box-block-reflow-static-normal { % => Context Parent This - 1 index /null ne { -% By default, child block box will fill all available parent width; -% note that actual width will be smaller because of non-zero padding, border and margins - 1 index /get-width call-method - 1 index put-full-width - -% calculate margin values if thy have been set as a percentage - 1 index 1 index box-generic-calc-percentage-margins - -% calculate width value if it had been set as percentage - 2 index 2 index 2 index box-generic-calc-percentage-width - -% calculate 'auto' values of width and margins -% unline tables, DIV width is either constrained by some CSS rules or -% expanded to the parent width; thus, we can calculate 'auto' margin -% values immediately - 1 index 1 index box-generic-calc-auto-width-margins - - 3 copy box-generic-collapse-margin % => Context Parent This Y - -% At this moment we have top parent/child collapsed margin at the top of context object -% margin stack - -% Apply 'clear' property - - 3 index exch 2 index % => Context Parent This Context Y This - box-generic-apply-clear % => Context Parent This Y - -% Store calculated Y coordinate as current Y in the parent box - 2 index put-current-y % => Context Parent This - -% Terminate current parent line-box - 2 index - 2 index - box-container-close-line - -% And add current box to the parent's line-box (alone) - dup 2 index box-container-append-line - -% Note that top margin already used above during margin collapsing - 1 index get-current-y - 1 index get-border-top-width sub - 1 index get-padding-top sub % => Context Parent This Y - - 2 index get-left - 2 index get-extra-left add % => Context Parent This Y X - - 2 index box-generic-move-to % => Context Parent This - } if - -% Reflow contents - 2 index 1 index % => Context Parent This Context This - box-container-reflow-content % => Context Parent This - -% After reflow_content we should have the top stack value replaced by the value -% of last child bottom collapsed margin - - dup box-container-get-first /null ne { - 2 index context-get-collapsed-margin - } { - 0 - } ifelse - 1 index get-margin-bottom - max % => Context Parent This max(cm,bm) - - 3 index context-pop-collapsed-margin - 3 index context-pop-collapsed-margin - 3 index context-push-collapsed-margin - % => Context Parent This - - 1 index /null ne { -% Extend parent's height to fit current box - 1 index get-uid - 3 index context-container-uid eq { - dup get-bottom-margin - 2 index box-generic-extend-height - } { - dup get-bottom-border - 2 index box-generic-extend-height - } ifelse % => Context Parent This - - 2 index 2 index - box-container-close-line - -% Then shift current flow position to the current box margin edge - dup get-bottom-border - 3 index context-get-collapsed-margin sub - 2 index put-current-y - } if % => Context Parent This - - 3 copy - box-generic-check-page-break-after - - pop pop pop -} def - -/box-block-setup-methods { % => Box - dup get-box-dict /Methods get % => Box Methods - dup /reflow {box-block-reflow} put - dup /reflow-absolute {box-block-reflow-absolute} put - dup /reflow-relative {box-block-reflow-relative} put - dup /reflow-static {box-block-reflow-static} put - dup /reflow-static-normal {box-block-reflow-static-normal} put - pop pop -} def - -/box-block-show-fixed { % => Viewport Box - 1 index viewport-get-left - 1 index /left get-css-value add % => Viewport Box Left - - 2 index viewport-get-top - 2 index /top get-css-value - /value get sub % => Viewport Box Left Top - - exch - - 2 index box-generic-move-to % => Viewport Box - - 2 copy /show call-method - - pop pop +% $Header: /cvsroot/html2ps/postscript/box.block.ps,v 1.1 2005/12/18 07:21:36 Konstantin Exp $ + +/box-block-create { + box-container-create + +% Setup method references + dup box-block-setup-methods + dup /box-block add-type +} def + +/box-block-reflow { % => Content Parent This + dup /position get-css-value + { + dup /static eq { pop 3 copy /reflow-static call-method exit } if + dup /relative eq { pop 3 copy /reflow-relative call-method exit } if + dup /absolute eq { pop dup 3 index context-add-absolute-positioned exit } if + dup /fixed eq { pop dup 3 index context-add-fixed-positioned exit } if + } loop + + pop pop pop % => +} def % => + +/box-block-reflow-absolute { % => Context This +% Calculate actual box position relative to the containing block + dup box-generic-get-containing-block + % => Context This CBlock + + dup containing-block-left % => Context This CBlock CBLeft + 2 index /left get-css-value add % => Context This CBlock Left + 2 index put-left % => COntext This CBlock + +% TODO: top percentage values + + dup containing-block-top + 2 index /top get-css-value + /value get sub % => Context This CBlock Top + 2 index get-extra-top sub % => Context This CBlock Top + 2 index put-top % => Context This CBlock + +% As sometimes left/right values may not be set, we need to use the "fit" width here +% if no width constraints been set, it will not be modified by the code below + + 2 index 2 index /get-max-width + call-method % => Context This CBlock MW + 2 index put-full-width % => Context This CBlock + +% Update the width, as it should be calculated based upon containing block width, not real parent + + dup containing-block-right + 1 index containing-block-left + sub % => Context This CBlock CBWidth + 2 index /get-width call-method % => Context This CBlock CBWidth W + 3 index get-width-constraint + wc-apply % => Context This CBlock W' + 2 index put-full-width % => Context This CBlock + +% And remove any width constraint after this, as they could refer to parent widths + wc-create-none % => Context This CBlock WCNone + 2 index put-width-constraint % => Context This CBlock + + 2 index 2 index + box-container-reflow-content % => Context This CBlock + + pop pop pop +} def + +/box-block-reflow-fixed { % => Context This + 0 1 index put-left + 0 1 index put-top + +% As sometimes left/right values may not be set, we need to use the "fit" width here +% if no width constraints been set, it will not be modified by the code below + + 1 index + 1 index /get-max-width + call-method + 1 index put-full-width % => Context This + + dup /get-width call-method + dup + 2 index get-width-constraint + wc-apply + 1 index put-full-width % => Context This + + wc-create-none 1 index + put-width-constraint % => Context This + + 2 copy + box-container-reflow-content + + pop pop +} def + +/box-block-reflow-relative { % => Context Parent This +% CSS 2.1: +% Once a box has been laid out according to the normal flow or floated, it may be shifted relative +% to this position. This is called relative positioning. Offsetting a box (B1) in this way has no +% effect on the box (B2) that follows: B2 is given a position as if B1 were not offset and B2 is +% not re-positioned after B1's offset is applied. This implies that relative positioning may cause boxes +% to overlap. However, if relative positioning causes an 'overflow:auto' box to have overflow, the UA must +% allow the user to access this content, which, through the creation of scrollbars, may affect layout. + + 3 copy + box-block-reflow-static + +% Note that percentage values are ignored for relative positioning + +% Check if top value is percentage + + dup /top get-css-value /percentage get { + 0 + } { + dup /top get-css-value /value get + } ifelse % => Context Parent This Top + neg + + 2 index /left get-css-value % => Context Parent This Top Left + 2 index /offset call-method % => Context Parent This + + pop pop pop +} def + +/box-block-reflow-static { % => Context Parent This + dup /float get-css-value + /none eq { + 3 copy /reflow-static-normal call-method + } { + 3 copy /reflow-static-float call-method + } ifelse + pop pop pop +} def + +/box-block-reflow-static-normal { % => Context Parent This + 1 index /null ne { +% By default, child block box will fill all available parent width; +% note that actual width will be smaller because of non-zero padding, border and margins + 1 index /get-width call-method + 1 index put-full-width + +% calculate margin values if thy have been set as a percentage + 1 index 1 index box-generic-calc-percentage-margins + +% calculate width value if it had been set as percentage + 2 index 2 index 2 index box-generic-calc-percentage-width + +% calculate 'auto' values of width and margins +% unline tables, DIV width is either constrained by some CSS rules or +% expanded to the parent width; thus, we can calculate 'auto' margin +% values immediately + 1 index 1 index box-generic-calc-auto-width-margins + + 3 copy box-generic-collapse-margin % => Context Parent This Y + +% At this moment we have top parent/child collapsed margin at the top of context object +% margin stack + +% Apply 'clear' property + + 3 index exch 2 index % => Context Parent This Context Y This + box-generic-apply-clear % => Context Parent This Y + +% Store calculated Y coordinate as current Y in the parent box + 2 index put-current-y % => Context Parent This + +% Terminate current parent line-box + 2 index + 2 index + box-container-close-line + +% And add current box to the parent's line-box (alone) + dup 2 index box-container-append-line + +% Note that top margin already used above during margin collapsing + 1 index get-current-y + 1 index get-border-top-width sub + 1 index get-padding-top sub % => Context Parent This Y + + 2 index get-left + 2 index get-extra-left add % => Context Parent This Y X + + 2 index box-generic-move-to % => Context Parent This + } if + +% Reflow contents + 2 index 1 index % => Context Parent This Context This + box-container-reflow-content % => Context Parent This + +% After reflow_content we should have the top stack value replaced by the value +% of last child bottom collapsed margin + + dup box-container-get-first /null ne { + 2 index context-get-collapsed-margin + } { + 0 + } ifelse + 1 index get-margin-bottom + max % => Context Parent This max(cm,bm) + + 3 index context-pop-collapsed-margin + 3 index context-pop-collapsed-margin + 3 index context-push-collapsed-margin + % => Context Parent This + + 1 index /null ne { +% Extend parent's height to fit current box + 1 index get-uid + 3 index context-container-uid eq { + dup get-bottom-margin + 2 index box-generic-extend-height + } { + dup get-bottom-border + 2 index box-generic-extend-height + } ifelse % => Context Parent This + + 2 index 2 index + box-container-close-line + +% Then shift current flow position to the current box margin edge + dup get-bottom-border + 3 index context-get-collapsed-margin sub + 2 index put-current-y + } if % => Context Parent This + + 3 copy + box-generic-check-page-break-after + + pop pop pop +} def + +/box-block-setup-methods { % => Box + dup get-box-dict /Methods get % => Box Methods + dup /reflow {box-block-reflow} put + dup /reflow-absolute {box-block-reflow-absolute} put + dup /reflow-relative {box-block-reflow-relative} put + dup /reflow-static {box-block-reflow-static} put + dup /reflow-static-normal {box-block-reflow-static-normal} put + pop pop +} def + +/box-block-show-fixed { % => Viewport Box + 1 index viewport-get-left + 1 index /left get-css-value add % => Viewport Box Left + + 2 index viewport-get-top + 2 index /top get-css-value + /value get sub % => Viewport Box Left Top + + exch + + 2 index box-generic-move-to % => Viewport Box + + 2 copy /show call-method + + pop pop } def \ No newline at end of file diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/box.break.ps b/thirdparty/html2ps_pdf/postscript/box.break.ps similarity index 96% rename from gulliver/thirdparty/html2ps_pdf/postscript/box.break.ps rename to thirdparty/html2ps_pdf/postscript/box.break.ps index a06b4bba2..f51351947 100644 --- a/gulliver/thirdparty/html2ps_pdf/postscript/box.break.ps +++ b/thirdparty/html2ps_pdf/postscript/box.break.ps @@ -1,93 +1,93 @@ -% $Header: /cvsroot/html2ps/postscript/box.break.ps,v 1.1 2005/12/18 07:21:36 Konstantin Exp $ - -/box-br-create { - box-generic-create - dup box-br-setup-methods - dup /box-br add-type - - dup /display /block put-css-value -} def - -/box-br-get-max-width { % => Context This - pop pop 0 -} def - -/box-br-get-min-width { % => Context This - pop pop 0 -} def - -/box-br-reflow { % => Context Parent This - 1 index get-current-y % => Context Parent This PCY - -% CSS 'clear' property may be applied to BR tags! - - 3 index exch % => Context Pareht This Context PCY - 2 index box-generic-apply-clear % => Context Pareht This Y - -% Move current "box" to parent current coordinates. It is REQUIRED, -% as some other routines uses box coordinates. - - 2 index get-current-x - 2 index put-left % => Context Parent This Y - - 1 index put-top % => Context Parent This - -% If we have a sequence of BR tags (like

      ), we'll have an only one item in the parent's -% line box - whitespace; in this case we'll need to additionally offset current y coordinate by the font size - - 1 index get-line length 0 eq { % => Context Parent This - 2 index - 2 index - box-container-close-line % => Context Parent This - - 1 index get-current-y - 1 index /font-size get-css-value - sub - 1 index get-bottom - min - - 2 index put-current-y - } { - 1 index get-line length 1 gt - 2 index get-line 0 get - is-whitespace not or { % => Context Parent This - 2 index - 2 index box-container-close-line - } { - 1 index get-line length 0 gt { -% Restore height of whitespace (it had been reset in /flow-whitespace as a first whitespace in a line box) - 1 index get-line 0 get - /font-size get-css-value % => Context Parent This DH - 3 index - 3 index - box-container-close-line % => Context Parent This DH - 2 index get-current-y - exch sub % => Context Parent This CY' - 1 index get-bottom - min - 2 index put-current-y % => Context Pareht This - } if - } ifelse - } ifelse % => Context Parent This - -% We need to explicitly extend the parent's height, as we don't know if -% it have any children _after_ this BR box. - 1 index get-current-y - 2 index box-generic-extend-height - - pop pop pop - -} def - -/box-br-setup-methods { - dup /Methods get - dup /get-max-width {box-br-get-max-width} put - dup /get-min-width {box-br-get-min-width} put - dup /reflow {box-br-reflow} put - dup /show {box-br-show} put - pop pop -} def - -/box-br-show { % => Viewport Box - pop pop +% $Header: /cvsroot/html2ps/postscript/box.break.ps,v 1.1 2005/12/18 07:21:36 Konstantin Exp $ + +/box-br-create { + box-generic-create + dup box-br-setup-methods + dup /box-br add-type + + dup /display /block put-css-value +} def + +/box-br-get-max-width { % => Context This + pop pop 0 +} def + +/box-br-get-min-width { % => Context This + pop pop 0 +} def + +/box-br-reflow { % => Context Parent This + 1 index get-current-y % => Context Parent This PCY + +% CSS 'clear' property may be applied to BR tags! + + 3 index exch % => Context Pareht This Context PCY + 2 index box-generic-apply-clear % => Context Pareht This Y + +% Move current "box" to parent current coordinates. It is REQUIRED, +% as some other routines uses box coordinates. + + 2 index get-current-x + 2 index put-left % => Context Parent This Y + + 1 index put-top % => Context Parent This + +% If we have a sequence of BR tags (like

      ), we'll have an only one item in the parent's +% line box - whitespace; in this case we'll need to additionally offset current y coordinate by the font size + + 1 index get-line length 0 eq { % => Context Parent This + 2 index + 2 index + box-container-close-line % => Context Parent This + + 1 index get-current-y + 1 index /font-size get-css-value + sub + 1 index get-bottom + min + + 2 index put-current-y + } { + 1 index get-line length 1 gt + 2 index get-line 0 get + is-whitespace not or { % => Context Parent This + 2 index + 2 index box-container-close-line + } { + 1 index get-line length 0 gt { +% Restore height of whitespace (it had been reset in /flow-whitespace as a first whitespace in a line box) + 1 index get-line 0 get + /font-size get-css-value % => Context Parent This DH + 3 index + 3 index + box-container-close-line % => Context Parent This DH + 2 index get-current-y + exch sub % => Context Parent This CY' + 1 index get-bottom + min + 2 index put-current-y % => Context Pareht This + } if + } ifelse + } ifelse % => Context Parent This + +% We need to explicitly extend the parent's height, as we don't know if +% it have any children _after_ this BR box. + 1 index get-current-y + 2 index box-generic-extend-height + + pop pop pop + +} def + +/box-br-setup-methods { + dup /Methods get + dup /get-max-width {box-br-get-max-width} put + dup /get-min-width {box-br-get-min-width} put + dup /reflow {box-br-reflow} put + dup /show {box-br-show} put + pop pop +} def + +/box-br-show { % => Viewport Box + pop pop } def \ No newline at end of file diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/box.button.ps b/thirdparty/html2ps_pdf/postscript/box.button.ps similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/postscript/box.button.ps rename to thirdparty/html2ps_pdf/postscript/box.button.ps diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/box.checkbutton.ps b/thirdparty/html2ps_pdf/postscript/box.checkbutton.ps similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/postscript/box.checkbutton.ps rename to thirdparty/html2ps_pdf/postscript/box.checkbutton.ps diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/box.container.ps b/thirdparty/html2ps_pdf/postscript/box.container.ps similarity index 97% rename from gulliver/thirdparty/html2ps_pdf/postscript/box.container.ps rename to thirdparty/html2ps_pdf/postscript/box.container.ps index 25d50029c..1ae955ec4 100644 --- a/gulliver/thirdparty/html2ps_pdf/postscript/box.container.ps +++ b/thirdparty/html2ps_pdf/postscript/box.container.ps @@ -1,1023 +1,1023 @@ -/add-child { - 1 index /add-child call-method -} def - -/box-container-add-child { % => Child This - dup 2 index put-parent % => Child This - - 1 index - 1 index get-content % => Child This Child Content - array-prepend % => Child This Content' - 1 index put-content - - pop pop -} def - -/box-container-add-deferred-float {% => Float This - dup /DeferredFloats get % => Float This DeferredFloats - 2 index exch array-prepend % => Float This Floats - 1 index exch - /DeferredFloats exch - put % => Float This - pop pop -} def - -/box-container-append-line { % => Child This - exch - 1 index get-line % => Parent Child PLine - array-prepend - exch put-line -} def - -/box-container-calculate-text-indent { - % => This - dup /text-indent get-css-value % => This TextIndent - - dup /Percentage get { - /Value get - 1 index /get-width call-method mul 100 div - } { - /Value get - } ifelse % => This Value - - exch pop -} def - -/box-container-clear-deferred-floats { - get-box-dict [] /DeferredFloats put -} def - -/box-container-clear-line { % => Box - [] exch put-line -} def - -/box-container-close-line { % => Context This - false 2 index 2 index - box-container-close-line-common % => Context This - pop pop -} def - -/box-container-close-last-line { % => Context This - true 2 index 2 index - box-container-close-line-common % => Context This - pop pop -} def - -/box-container-close-line-common { % => IsLastLine Context This -% Align line-box using 'text-align' property - -% Note that text-align should not be applied to the block boxes! -% As block boxes will be alone in the line-box, we can check -% if the very first box in the line is inline; if not - no justification should be made - dup get-line dup length 0 gt { % => IsLastLine Context This Line - 0 get is-inline { % => IsLastLine Context This - dup /text-align get-css-value - 3 index exch % => IsLastLine Context This IsLastLine AlignFun - 3 index exch % => IsLastLine Context This IsLastLine Context AlignFun - 3 index exch % => IsLastLine Context This IsLastLine Context This AlignFun - cvx exec % => IsLastLine Context This - } { % => IsLastLine Context This -% Nevertheless, CENTER tag and P/DIV with ALIGN attribute set should affect the -% position of non-inline children. - dup /pseudo-align get-css-value - 3 index exch % => IsLastLine Context This IsLastLine AlignFun - 3 index exch % => IsLastLine Context This IsLastLine Context AlignFun - 3 index exch % => IsLastLine Context This IsLastLine Context This AlignFun - cvx exec - } ifelse % => IsLastLine Context This - } { - pop - } ifelse % => IsLastLine Context This - -% Apply vertical align to all of the line content -% first, we need to aling all baseline-aligned boxes to determine the basic line-box height, top and bottom edges -% then, SUP and SUP positioned boxes (as they can extend the top and bottom edges, but not affected themselves) -% then, MIDDLE, BOTTOM and TOP positioned boxes in the given order - - 0 0 % => IsLastLine Context This 0(Baseline) 0(Height) - 2 index get-line { % => IsLastLine Context This 0(Baseline) 0(Height) Child - dup /vertical-align get-css-value - /baseline eq { % => IsLastLine Context This Baseline Height Child - dup get-default-baseline % => IsLastLine Context This Baseline Height Child DefaultDaseline - 4 3 roll % => IsLastLine Context This Height Child DefaultDaseline Baseline - max % => IsLastLine Context This Height Child Baseline' - 3 1 roll % => IsLastLine Context This Baseline' Height Child - } if - pop - } forall % => IsLastLine Context This Baseline' Height - - 2 index get-line { % => IsLastLine Context This Baseline' Height Child - dup /vertical-align get-css-value - /baseline eq { % => IsLastLine Context This Baseline Height Child - 2 index 1 index put-baseline % => IsLastLine Context This Baseline Height Child - - dup get-baseline-offset - 1 index get-full-height add % => IsLastLine Context This Baseline Height Child H+BO - 3 2 roll % => IsLastLine Context This Baseline Child Height H+BO - max % => IsLastLine Context This Baseline Child Height' - exch % => IsLastLine Context This Baseline Height' Child - } if - pop - } forall % => IsLastLine Context This Baseline Height - -% SUB vertical align - 2 index get-line { % => IsLastLine Context This Baseline' Height Child - dup /vertical-align get-css-value - /sub eq { % => IsLastLine Context This Baseline Height Child - 2 index - 1 index get-full-height - 2 div % => IsLastLine Context This Baseline Height Child - add - 1 index put-baseline - } if - pop - } forall % => IsLastLine Context This Baseline Height - -% SUPER vertical align - 2 index get-line { % => IsLastLine Context This Baseline' Height Child - dup /vertical-align get-css-value - /super eq { % => IsLastLine Context This Baseline Height Child - dup get-full-height 2 div % => IsLastLine Context This Baseline Height Child BL - 1 index put-baseline - } if - pop - } forall % => IsLastLine Context This Baseline Height - -% MIDDLE vertical align - 0 % => IsLastLine Context This Baseline Height 0 - 3 index get-line { % => IsLastLine Context This Baseline Height Middle Child - dup /vertical-align get-css-value - /middle eq { % => IsLastLine Context This Baseline Height Middle Child - dup get-full-height 2 div % => IsLastLine Context This Baseline Height Middle Child Middle - 3 2 roll % => IsLastLine Context This Baseline Height Child Middle Middle2 - max % => IsLastLine Context This Baseline Height Child Middle' - exch % => IsLastLine Context This Baseline Height Middle Child - } if - pop - } forall % => IsLastLine Context This Baseline Height Middle - - dup 2 mul 2 index gt { % => IsLastLine Context This Baseline Height Middle - dup 2 index 2 div sub % => IsLastLine Context This Baseline Height Middle Delta -% offset already aligned items - 4 index get-line { % => IsLastLine Context This Baseline Height Middle Delta Child - dup get-baseline - 2 index add - 1 index put-baseline - pop - } forall % => IsLastLine Context This Baseline Height Middle Delta - pop % => IsLastLine Context This Baseline Height Middle - 2 mul exch pop - } { - pop - } ifelse % => IsLastLine Context This Baseline Height - - 2 index get-line { % => IsLastLine Context This Baseline Height Child - dup /vertical-align get-css-value - /middle eq { % => IsLastLine Context This Baseline Height Child - dup get-default-baseline - 1 index get-full-height 2 div - sub - 2 index 2 div - add - 1 index put-baseline % => IsLastLine Context This Baseline Height Child - } if - pop - } forall - -% BOTTOM vertical align - 0 % => IsLastLine Context This Baseline Height 0 - 3 index get-line { % => IsLastLine Context This Baseline Height Bottom Child - dup /vertical-align get-css-value - /bottom eq { % => IsLastLine Context This Baseline Height Bottom Child - dup get-full-height % => IsLastLine Context This Baseline Height Bottom Child Bottom - 3 2 roll % => IsLastLine Context This Baseline Height Child Bottom Bottom2 - max % => IsLastLine Context This Baseline Height Child Bottom' - exch % => IsLastLine Context This Baseline Height Bottom Child - } if - pop - } forall % => IsLastLine Context This Baseline Height Bottom - - dup 2 index gt { % => IsLastLine Context This Baseline Height Bottom - dup 2 index sub % => IsLastLine Context This Baseline Height Bottom Delta -% offset already aligned items - 4 index get-line { % => IsLastLine Context This Baseline Height Bottom Delta Child - dup get-baseline - 2 index add - 1 index put-baseline - pop - } forall % => IsLastLine Context This Baseline Height Bottom Delta - pop % => IsLastLine Context This Baseline Height Bottom - exch pop - } { - pop - } ifelse % => IsLastLine Context This Baseline Height - - 2 index get-line { % => IsLastLine Context This Baseline Height Child - dup /vertical-align get-css-value - /bottom eq { % => IsLastLine Context This Baseline Height Child - dup get-default-baseline - 1 index get-full-height - sub - 2 index - add - 1 index put-baseline % => IsLastLine Context This Baseline Height Child - } if - pop - } forall - -% TOP vertical align - 0 % => IsLastLine Context This Baseline Height 0 - 3 index get-line { % => IsLastLine Context This Baseline Height Bottom Child - dup /vertical-align get-css-value - /top eq { % => IsLastLine Context This Baseline Height Bottom Child - dup get-full-height % => IsLastLine Context This Baseline Height Bottom Child Bottom - 3 2 roll % => IsLastLine Context This Baseline Height Child Bottom Bottom2 - max % => IsLastLine Context This Baseline Height Child Bottom' - exch % => IsLastLine Context This Baseline Height Bottom Child - } if - pop - } forall % => IsLastLine Context This Baseline Height Bottom - - dup 2 index gt { % => IsLastLine Context This Baseline Height Bottom - dup 2 index sub % => IsLastLine Context This Baseline Height Bottom Delta -% offset already aligned items - 4 index get-line { % => IsLastLine Context This Baseline Height Bottom Delta Child - dup get-baseline - 2 index add - 1 index put-baseline - pop - } forall % => IsLastLine Context This Baseline Height Bottom Delta - pop % => IsLastLine Context This Baseline Height Bottom - exch pop - } { - pop - } ifelse % => IsLastLine Context This Baseline Height - - 2 index get-line { % => IsLastLine Context This Baseline Height Child - dup /vertical-align get-css-value - /top eq { % => IsLastLine Context This Baseline Height Child - dup get-default-baseline - 1 index put-baseline % => IsLastLine Context This Baseline Height Child - } if - pop - } forall % => IsLastLine Context This Baseline Height - - pop pop % => IsLastLine Context This - -% Calculate the bottom Y coordinate of last line box - - dup get-current-y % => IsLastLine Context This BY - 1 index get-line { % => IsLastLine Context This BY Child -% This line is required; say, we have sequence of text and image inside the container, -% AND image have greater baseline than text; in out case, text will be offset to the bottom -% of the page and we lose the gap between text and container bottom edge, unless we'll re-extend -% containier height - -% Note that we're using the colapsed margin value to get the Y coordinate to extend height to, -% as bottom margin may be collapsed with parent - - dup get-bottom-margin - 4 index context-get-collapsed-margin add - 3 index box-generic-extend-height - - get-bottom-margin % => IsLastLine Context This BY BM - min % => IsLastLine Context This BY' - } forall - -% Clear the line box - 1 index box-container-clear-line - -% Reset current X coordinate to the far left - 1 index get-left - 2 index put-current-x - -% Extend Y coordinate - 1 index put-current-y % => IsLastLine Context This - -% Render the deferred floats - dup box-container-get-deferred-floats { - % => IsLastLine Context This Float - 3 copy % => IsLastLine Context This Float Context This Float - box-container-reflow-static-float - pop - } forall % => IsLastLine Context This - dup box-container-clear-deferred-floats - -% modify the current-x value, so that next inline box will not intersect any floating boxes - dup get-current-y - 1 index get-current-x % => IsLastLine Context This Y X - 3 index context-float-left-x % => IsLastLine Context This X - - 1 index put-current-x % => IsLastLine Context This - -% clear the stack - pop pop pop -} def - -/box-container-create { % => - box-generic-create - - dup /Content [] put - dup /Line [] put - - dup box-container-setup-methods - dup /box-container add-type -} def - -% Calculate the available widths - e.g. content width minus space occupied by floats; -% as floats may not fill the whole height of this box, this value depends on Y-coordinate. -% We use current_Y in calculations -% -/box-container-get-available-width { % => Context Box - dup get-current-y - 1 index get-left - 3 index context-float-left-x % => Context Box FL - 1 index get-left sub % => Context Box FloatLeftWidth - - 1 index get-right - 2 index get-current-y - 3 index get-right - 5 index context-float-right-x - sub % => Context Box FloatLeftWidth FloatRightWidth - - 2 index /get-width call-method - exch sub - exch sub - - exch pop - exch pop -} def - -% Get a list of floating boxes which shold be rendered -% at the end of current line box -% -/box-container-get-deferred-floats { - get-box-dict /DeferredFloats get -} def - -% Get first child of current box which actually will be drawn -% on the page. So, whitespace and null boxes will be ignored -% -% See description of is_null for null box definition. -% (not only NullBoxPDF is treated as null box) -% -% @return reference to the first visible child of current box -/box-container-get-first { % => This - /null - 1 index get-content { % => This /null Child - dup /is-whitespace call-method not - 1 index /is-null call-method not - and { % => This FC Child - exch pop % => This Child - exit - } if % => This FC Child - pop - } forall % => This FC - - exch pop % => FC -} def - -% Get first text or image child of current box which actually will be drawn -% on the page. So, whitespace and null boxes will be ignored -% -% See description of is_null for null box definition. -% (not only NullBoxPDF is treated as null box) -% -% @return reference to the first visible child of current box -/box-container-get-first-data { % => This - /null - 1 index get-content { % => This /null Child - dup /is-whitespace call-method not - 1 index /is-null call-method not - and { % => This FC Child - dup is-container { - box-container-get-first-data - dup /null ne { - exch pop exit - } if - } { - exch pop exit - } ifelse % => This FC Child - } if % => This FC Child - pop - } forall % => This FC - - exch pop % => FC -} def - -% Get last child of current box which actually will be drawn -% on the page. So, whitespace and null boxes will be ignored -% -% See description of is_null for null box definition. -% (not only NullBoxPDF is treated as null box) -% -% @return reference to the first visible child of current box -/box-container-get-last { % => This - /null - 1 index get-content % => This /null Content - dup length 1 sub -1 0 { % => This /null Content I - 2 copy get % => This /null Context I Element - - dup /is-whitespace call-method not - 1 index /is-null call-method not - and - { - 4 3 roll pop 3 1 roll % => This /null Context I - pop - exit - } { - pop - } ifelse % => This /null Context I - pop - } for % => This Last Content - pop exch pop -} def - - -/box-container-get-max-width { % => Context This - 0 % => Context This MaxW - -% We need to add text indent to the max width - 1 index - box-generic-calc-text-indent % => Context This MaxW CMaxW - - 2 index get-content { % => Context This MaxW CMaxW Item - dup is-inline - 1 index /float get-css-value - /none ne or { % => Context This MaxW CMaxW Item - 4 index - 1 index - /get-max-width call-method % => Context This MaxW CMaxW Item W - 3 2 roll add exch % => Context This MaxW CMaxW' Item - } { % => Context This MaxW CMaxW Item - 2 index 2 index max % => Context This MaxW CMaxW Item MaxW' - 4 3 roll pop % => Context This CMaxW Item MaxW' - 3 1 roll % => Context This MaxW CMaxW Item - - 4 index - 1 index /get-max-width - call-method % => Context This MaxW CMaxW Item CMaxW' - 3 2 roll pop exch % => Context This MaxW CMaxW' Item - -% Process special case with percentage constrained table - - dup get-width-constraint % => Context This MaxW CMaxW Item WC - - 1 index /box-table is-a - 1 index /type get - /fraction eq and { % => Context This MaxW CMaxW Item WC - 4 index - box-generic-get-expandable-width % => Context This MaxW CMaxW Item WC ExpandableWidth - - 5 index - /get-width call-method % => Context This MaxW CMaxW Item WC ExpandableWidth Width - - 2 index - dup /apply get exec % => Context This MaxW CMaxW Item WC CWidth - - 3 index max % => Context This MaxW CMaxW Item WC CMaxW' - - 4 3 roll pop 3 1 roll % => Context This MaxW CMaxW' Item WC - } if % => Context This MaxW CMaxW Item WC - pop % => Context This MaxW CMaxW Item - } ifelse % => Context This MaxW CMaxW Item - - pop - } forall % => Context This MaxW CMaxW - -% Check if last line have maximal width - - max % => Context This MaxW - -% Note that max width cannot differ drom constrained width, -% if any width constraints apply - - 1 index get-width-constraint % => Context This MaxW WC - dup /type get /none ne { - 2 index get-parent - /get-width call-method % => Context This MaxW WC PWidth - 2 index % => Context This MaxW WC PWidth MaxW - 2 index dup /apply get exec % => Context This MaxW WC MaxW' - exch pop % => Context This MaxW MaxW' - exch pop - } { - pop - } ifelse % => Context This MaxW - - 1 index get-hor-extra - add - - exch pop - exch pop -} def - -/box-container-get-min-nowrap-width { % => Context This - 0 % => Context This MaxW - -% We need to add text indent to the width - - 1 index - box-generic-calc-text-indent % => Context This MaxW CMaxW - - 2 index get-content { % => Context This MaxW CMaxW Child - dup is-inline { -% Inline boxes content will not be wrapped, so we may calculate its max width - 4 index exch - /get-max-width call-method % => Context This MaxW CMaxW CMW - add % => Context This MaxW CMaxW - } { % => Context This MaxW CMaxW Child - 3 1 roll % => Context This Child MaxW CMaxW - max % => Context This Child MaxW' - exch % => Context This MaxW' Child - 3 index exch % => Context This MaxW' Context Child - /get-min-width call-method % => Context This MaxW' CMaxW' - } ifelse % => Context This MaxW CMaxW - } forall % => Context This MaxW CMaxW - -% Check if last line have maximal width - max % => Context This MaxW - -% Apply width constraint to min width. Return maximal value - 1 index get-parent - /get-width call-method % => Context This MaxW ParentW - 1 index % => Context This MaxW ParentW W - 3 index get-width-constraint % => Context This MaxW ParentW W WC - dup /apply get exec % => Context This MaxW MaxW' - max % => Context This MaxW - - 1 index get-hor-extra add % => Context This MaxW - exch pop - exch pop -} def - -/box-container-get-min-width { % => Context This -% If box does not have any context, its minimal width is determined by extra horizontal space - dup get-content length 0 eq { % => Context This - dup get-hor-extra - } { % => Context This -% If we're in 'nowrap' mode, minimal and maximal width will be equal - dup /white-space get-css-value /nowrap eq - 1 index - /pseudo-nowrap get-css-value - /nowrap eq or { % => Context This - 2 copy box-container-get-min-nowrap-width - } { % => Context This -% We need to add text indent size to the with of the first item - dup - box-generic-calc-text-indent % => Context This TI - 2 index - 2 index % => Context This TI Context This - get-content 0 get -% box-container-get-first-data % => Context This TI Context First - /get-min-width call-method % => Context This TI WFirst - add % => Context This MinW - - 1 index get-content { % => Context This MinW Child - 3 index exch - /get-min-width call-method % => Context This MinW CMinW - max % => Context This MinW - } forall % => Context This MinW - - 1 index get-parent - /get-width call-method % => Context This MinW ParentW - 1 index % => Context This MinW ParentW MinW - 3 index get-width-constraint % => Context This MinW ParentW MinW WC - dup /apply get exec % => Context This MinW MinW' - max - - 1 index get-hor-extra add % => Context This MinW' - } ifelse % => Context This Width - } ifelse % => Context This Width - - exch pop - exch pop -} def - -% Get total height of this box content (including floats, if any) -% Note that floats can be contained inside children, so we'll need to use -% this function recusively -/box-container-get-real-full-height { % => This -% Treat items with overflow: hidden specifically, -% as floats flown out of this boxes will not be visible - dup /overflow get-css-value - /hidden eq { % => This - dup get-full-height % => This Height - } { % => This -% Check if this cell is totally empty - dup get-content length 0 eq { - 0 % => This Height - } { % => This -% Initialize the vertical extent taken by content using the -% very first child - dup get-content 0 get - dup get-top-margin % => This C0 Top - 1 index get-bottom-margin % => This C0 Top Bottom - 3 2 roll pop % => This Top Bottom - - 2 index get-content { % => This Top Bottom Child -% Check if top margin of current child is to the up -% of vertical extent top margin - dup get-top-margin % => This Top Bottom Child ChildTop - 4 3 roll max 3 1 roll % => This Top' Bottom Child - -% Check if current child bottom margin will extend -% the vertical space OR if it contains floats extending -% this, unless this child have overflow: hidden, because this -% will prevent additional content to be visible - dup /overflow get-css-value - /hidden eq { - dup get-bottom-margin - 3 2 roll min - exch % => This Top Bottom Child - } { - dup get-bottom-margin - 1 index get-top-margin - 2 index /get-real-full-height call-method - sub - min % => This Top Bottom Child ChildBM - 3 2 roll min exch % => This Top Bottom' Child - } ifelse % => This Top Bottom Child - pop - } forall % => This Top Bottom - sub 0 max % => This RH - 1 index get-vert-extra add % => This Height - } ifelse - } ifelse % => This Height - exch pop -} def - -/box-container-is-first { % => Box This - dup box-container-get-first % => Box This First - dup /null eq { - pop false - } { - get-uid - 2 index get-uid - eq - } ifelse - - exch pop - exch pop -} def - -% Line box should be treated as empty in following cases: -% 1. It is really empty (so, it contains 0 boxes) -% 2. It contains only whitespace boxes -% -/box-container-line-box-empty { % => This - dup get-line length 0 eq { - pop true % => true - } { - true 1 index get-line % => This true Line - { % => This Flag Child - /is-whitespace call-method - and - } forall - - exch pop - } ifelse -} def - -/box-container-offset { % => DY DX This - 3 copy box-generic-offset - - dup get-current-x - 2 index add - 1 index put-current-x - - dup get-current-y - 3 index add - 1 index put-current-y - - dup get-content { - 3 index exch - 3 index exch - /offset call-method - } forall - - pop pop pop -} def - -/box-container-offset-if-first { % => DY DX Box This - 2 copy box-container-is-first { - dup get-parent /null ne { - 3 index - 3 index - 3 index - 3 index get-parent % => DY DX Box This DY DX Box Parent - - box-container-offset-if-first - % => DY DX Box This ParentResult - - not { - 3 index - 3 index - 2 index /offset call-method % => DY DX Box This - true - } { false } ifelse - } { false } ifelse - } { false }ifelse - - exch pop - exch pop - exch pop - exch pop -} def - -/box-container-pre-reflow-images { % => This - dup get-content { - /pre-reflow-images call-method - } forall - pop -} def - -/box-container-setup-methods { % => Box - dup get-box-dict /Methods get % => Box Methods - dup /add-child { box-container-add-child } put - dup /get-max-width { box-container-get-max-width } put - dup /get-min-width { box-container-get-min-width } put - dup /get-real-full-height { box-container-get-real-full-height } put - dup /offset { box-container-offset } put - dup /pre-reflow-images { box-container-pre-reflow-images } put - dup /reflow-anchors { box-container-reflow-anchors } put - dup /reflow-content { box-container-reflow-content } put - dup /reflow-inline { box-container-reflow-inline } put - dup /reflow-static-float { box-container-reflow-static-float } put - dup /show { box-container-show } put - pop pop -} def - -/box-container-show { % => Viewport Box - 2 copy box-generic-show % => Viewport Box - -% Setup clipping path for non 'overflow: visible' boxes - dup /overflow get-css-value - /visible ne { -% Save clipping area state (of course, BEFORE the clipping area will be set) - gsave - - newpath - dup get-left-border - 1 index get-bottom-border % => Viewport Box X Y - 2 index get-right-border - 3 index get-left-border sub % => Viewport Box X Y W - 3 index get-top-border - 4 index get-bottom-border sub % => Viewport Box X Y W H - rectclip - - } if - -% draw content - dup get-content { % => Viewport Box ContentElement -% We'll check the visibility property here -% Reason: all boxes (except the top-level one) are contained in some other box, -% so every box will pass this check. The alternative is to add this check into every -% box class show member. - -% The only exception of absolute positioned block boxes which are drawn separately; -% their show method is called explicitly; the similar check should be performed there - - dup /visibility get-css-value /visible eq { - 2 index - 1 index - /show call-method - } if % => Viewport Box ContentElement - pop - } forall % => Viewport Box - - dup /overflow get-css-value /visible ne { -% restore previous clipping path - grestore - } if - - pop pop -} def % => - -/box-container-reflow-anchors { % => List Viewport Box - 3 copy box-generic-reflow-anchors - - dup get-content { % => List Viewport Box Child - 3 index exch - 3 index exch % => List Viewport Box List Viewport Child - /reflow-anchors call-method % => List' Viewport Box - } forall - - pop pop pop -} def - -/box-container-reflow-content { % => Context This - 2 copy box-container-close-line % => Context This - -% If first child is inline - apply text-indent - dup box-container-get-first - dup /null ne { - dup is-inline { % => Context This First - pop - dup box-container-calculate-text-indent - 1 index get-additional-text-indent - add - 1 index get-current-x - add - 1 index put-current-x % => Context This - } { - pop - } ifelse - } { - pop - } ifelse - - 0 1 index put-height - -% reset current Y value - dup get-top - 1 index put-current-y - - dup get-content { % => Context This Child - 2 index exch % => Context This Context Child - 2 index exch % => Context This Context This Child - /reflow call-method % => Context This - } forall % => Context This - - 1 index 1 index - box-container-close-last-line % => Context This - - pop pop % => -} def - -/box-container-reflow-inline { % => This - dup get-content { % => This Child - /reflow-inline call-method % => This - } forall - pop -} def - -/box-container-reflow-static-float { % => Context Parent Box -% Defer the float rendering till the next line box - 1 index get-line length 0 gt { - dup 2 index box-container-add-deferred-float - } { - -% Calculate margin values if they have been set as a percentage - - 2 copy - box-generic-calc-percentage-margins - -% Calculate width value if it have been set as a percentage - - 3 copy - box-generic-calc-percentage-width - -% Calculate margins and/or width is 'auto' values have been specified - - 2 copy - box-generic-calc-auto-width-margins - -% Determine the actual width of the floating box -% Note that get_max_width returns both content and extra width - - 2 index 1 index /get-max-width call-method - 1 index put-full-width - -% We need to call this function before determining the horizontal coordinate -% as after vertical offset the additional space to the left may apperar - % => Context Parent Box - 2 index - 2 index get-current-y - 2 index - box-generic-apply-clear % => Context Parent Box Y - -% determine the position of top-left floating box corner - 1 index /float get-css-value - /right eq { - 2 index - 2 index get-full-width - 2 index % => Context Parent Box Y Parent Width Y - 6 index - context-float-right-xy % => Context Parent Box Y X' Y' - - exch - 3 index get-full-width sub - exch - } { - 2 index - 2 index get-full-width - 2 index % => Context Parent Box Y Parent Width Y - 6 index - context-float-left-xy % => Context Parent Box Y X' Y' - } ifelse % => Context Parent Box Y X' Y' - - 3 index get-extra-top sub - exch - 3 index get-extra-left add - 3 index box-generic-move-to % => Context Parent Box Y - pop % => Context Parent Box - -% Reflow contents. -% Note that floating box creates a new float flow context for it children. - - 2 index context-push-floats - -% Floating box create a separate margin collapsing context - - 0 3 index context-push-collapsed-margin - - 2 index 1 index /reflow-content call-method - - 2 index context-pop-collapsed-margin - -% Float should completely enclose its child floats - - 2 index context-float-bottom % => Context Parent Box FB - dup /null ne { - 1 index box-generic-extend-height - } { - pop - } ifelse - - 2 index context-float-right % => Context Parent Box FR - dup /null ne { - 1 index box-generic-extend-width - } { - pop - } ifelse - -% restore old float flow context - - 2 index context-pop-floats - -% Add this box to the list of floats in current context - - dup 3 index context-add-float % => Context Parent Box - -% Now fix the value of _current_x for the parent box; it is required -% in the following case: -% some text -% in such situation floating image is flown immediately, but it the close_line call have been made before, -% so _current_x value of container box will be still equal to ots left content edge; by calling float_left_x again, -% we'll force "some text" to be offset to the right - - 1 index get-current-y - 2 index get-current-x - 4 index - context-float-left-x - 2 index put-current-x - - } ifelse % => Context Parent Box - pop pop pop -} def - -/get-content { - /Content get -} def - -/get-line { - /Line get -} def - -/line-length { % => Box - dup get-line 0 exch % => Box 0(CurrentLength) Line - { % => Box CurrentLength LineElement -% Note that the line length should include the inline boxes margin/padding -% as inline boxes are not directly included to the parent line box, -% we'll need to check the parent of current line box element, -% and, if it is an inline box, AND this element is last or first contained element -% add correcponsing padding value - dup get-full-width % => Box CurrentLength LineElement EWidth - 3 2 roll add exch % => Box CurrentLength LineElement - - dup get-parent % => Box CurrentLength LineElement EParent - dup /null ne { - dup box-container-get-first % => Box CurrentLength LineElement EParent First - 1 index - box-container-get-last % => Box CurrentLength LineElement EParent First Last - - 1 index /null ne { - 1 index get-uid - 4 index get-uid eq { - 2 index - /get-extra-line-left - call-method % => Box CurrentLength LineElement EParent First Last ELeft - 6 5 roll add 5 1 roll % => Box CurrentLength' LineElement EParent First Last - } if - } if - - dup /null ne { - dup get-uid - 4 index get-uid eq { - 2 index - /get-extra-line-right - call-method % => Box CurrentLength LineElement EParent First Last ELeft - 6 5 roll add 5 1 roll % => Box CurrentLength' LineElement EParent First Last - } if - } if - - pop pop % => Box CurrentLength LineELement EParent - } if % => Box CurrentLength LineElement EParent - pop pop - } forall % => Box CurrentLength - exch pop % => Length -} def - -/put-line { - exch /Line exch put +/add-child { + 1 index /add-child call-method +} def + +/box-container-add-child { % => Child This + dup 2 index put-parent % => Child This + + 1 index + 1 index get-content % => Child This Child Content + array-prepend % => Child This Content' + 1 index put-content + + pop pop +} def + +/box-container-add-deferred-float {% => Float This + dup /DeferredFloats get % => Float This DeferredFloats + 2 index exch array-prepend % => Float This Floats + 1 index exch + /DeferredFloats exch + put % => Float This + pop pop +} def + +/box-container-append-line { % => Child This + exch + 1 index get-line % => Parent Child PLine + array-prepend + exch put-line +} def + +/box-container-calculate-text-indent { + % => This + dup /text-indent get-css-value % => This TextIndent + + dup /Percentage get { + /Value get + 1 index /get-width call-method mul 100 div + } { + /Value get + } ifelse % => This Value + + exch pop +} def + +/box-container-clear-deferred-floats { + get-box-dict [] /DeferredFloats put +} def + +/box-container-clear-line { % => Box + [] exch put-line +} def + +/box-container-close-line { % => Context This + false 2 index 2 index + box-container-close-line-common % => Context This + pop pop +} def + +/box-container-close-last-line { % => Context This + true 2 index 2 index + box-container-close-line-common % => Context This + pop pop +} def + +/box-container-close-line-common { % => IsLastLine Context This +% Align line-box using 'text-align' property + +% Note that text-align should not be applied to the block boxes! +% As block boxes will be alone in the line-box, we can check +% if the very first box in the line is inline; if not - no justification should be made + dup get-line dup length 0 gt { % => IsLastLine Context This Line + 0 get is-inline { % => IsLastLine Context This + dup /text-align get-css-value + 3 index exch % => IsLastLine Context This IsLastLine AlignFun + 3 index exch % => IsLastLine Context This IsLastLine Context AlignFun + 3 index exch % => IsLastLine Context This IsLastLine Context This AlignFun + cvx exec % => IsLastLine Context This + } { % => IsLastLine Context This +% Nevertheless, CENTER tag and P/DIV with ALIGN attribute set should affect the +% position of non-inline children. + dup /pseudo-align get-css-value + 3 index exch % => IsLastLine Context This IsLastLine AlignFun + 3 index exch % => IsLastLine Context This IsLastLine Context AlignFun + 3 index exch % => IsLastLine Context This IsLastLine Context This AlignFun + cvx exec + } ifelse % => IsLastLine Context This + } { + pop + } ifelse % => IsLastLine Context This + +% Apply vertical align to all of the line content +% first, we need to aling all baseline-aligned boxes to determine the basic line-box height, top and bottom edges +% then, SUP and SUP positioned boxes (as they can extend the top and bottom edges, but not affected themselves) +% then, MIDDLE, BOTTOM and TOP positioned boxes in the given order + + 0 0 % => IsLastLine Context This 0(Baseline) 0(Height) + 2 index get-line { % => IsLastLine Context This 0(Baseline) 0(Height) Child + dup /vertical-align get-css-value + /baseline eq { % => IsLastLine Context This Baseline Height Child + dup get-default-baseline % => IsLastLine Context This Baseline Height Child DefaultDaseline + 4 3 roll % => IsLastLine Context This Height Child DefaultDaseline Baseline + max % => IsLastLine Context This Height Child Baseline' + 3 1 roll % => IsLastLine Context This Baseline' Height Child + } if + pop + } forall % => IsLastLine Context This Baseline' Height + + 2 index get-line { % => IsLastLine Context This Baseline' Height Child + dup /vertical-align get-css-value + /baseline eq { % => IsLastLine Context This Baseline Height Child + 2 index 1 index put-baseline % => IsLastLine Context This Baseline Height Child + + dup get-baseline-offset + 1 index get-full-height add % => IsLastLine Context This Baseline Height Child H+BO + 3 2 roll % => IsLastLine Context This Baseline Child Height H+BO + max % => IsLastLine Context This Baseline Child Height' + exch % => IsLastLine Context This Baseline Height' Child + } if + pop + } forall % => IsLastLine Context This Baseline Height + +% SUB vertical align + 2 index get-line { % => IsLastLine Context This Baseline' Height Child + dup /vertical-align get-css-value + /sub eq { % => IsLastLine Context This Baseline Height Child + 2 index + 1 index get-full-height + 2 div % => IsLastLine Context This Baseline Height Child + add + 1 index put-baseline + } if + pop + } forall % => IsLastLine Context This Baseline Height + +% SUPER vertical align + 2 index get-line { % => IsLastLine Context This Baseline' Height Child + dup /vertical-align get-css-value + /super eq { % => IsLastLine Context This Baseline Height Child + dup get-full-height 2 div % => IsLastLine Context This Baseline Height Child BL + 1 index put-baseline + } if + pop + } forall % => IsLastLine Context This Baseline Height + +% MIDDLE vertical align + 0 % => IsLastLine Context This Baseline Height 0 + 3 index get-line { % => IsLastLine Context This Baseline Height Middle Child + dup /vertical-align get-css-value + /middle eq { % => IsLastLine Context This Baseline Height Middle Child + dup get-full-height 2 div % => IsLastLine Context This Baseline Height Middle Child Middle + 3 2 roll % => IsLastLine Context This Baseline Height Child Middle Middle2 + max % => IsLastLine Context This Baseline Height Child Middle' + exch % => IsLastLine Context This Baseline Height Middle Child + } if + pop + } forall % => IsLastLine Context This Baseline Height Middle + + dup 2 mul 2 index gt { % => IsLastLine Context This Baseline Height Middle + dup 2 index 2 div sub % => IsLastLine Context This Baseline Height Middle Delta +% offset already aligned items + 4 index get-line { % => IsLastLine Context This Baseline Height Middle Delta Child + dup get-baseline + 2 index add + 1 index put-baseline + pop + } forall % => IsLastLine Context This Baseline Height Middle Delta + pop % => IsLastLine Context This Baseline Height Middle + 2 mul exch pop + } { + pop + } ifelse % => IsLastLine Context This Baseline Height + + 2 index get-line { % => IsLastLine Context This Baseline Height Child + dup /vertical-align get-css-value + /middle eq { % => IsLastLine Context This Baseline Height Child + dup get-default-baseline + 1 index get-full-height 2 div + sub + 2 index 2 div + add + 1 index put-baseline % => IsLastLine Context This Baseline Height Child + } if + pop + } forall + +% BOTTOM vertical align + 0 % => IsLastLine Context This Baseline Height 0 + 3 index get-line { % => IsLastLine Context This Baseline Height Bottom Child + dup /vertical-align get-css-value + /bottom eq { % => IsLastLine Context This Baseline Height Bottom Child + dup get-full-height % => IsLastLine Context This Baseline Height Bottom Child Bottom + 3 2 roll % => IsLastLine Context This Baseline Height Child Bottom Bottom2 + max % => IsLastLine Context This Baseline Height Child Bottom' + exch % => IsLastLine Context This Baseline Height Bottom Child + } if + pop + } forall % => IsLastLine Context This Baseline Height Bottom + + dup 2 index gt { % => IsLastLine Context This Baseline Height Bottom + dup 2 index sub % => IsLastLine Context This Baseline Height Bottom Delta +% offset already aligned items + 4 index get-line { % => IsLastLine Context This Baseline Height Bottom Delta Child + dup get-baseline + 2 index add + 1 index put-baseline + pop + } forall % => IsLastLine Context This Baseline Height Bottom Delta + pop % => IsLastLine Context This Baseline Height Bottom + exch pop + } { + pop + } ifelse % => IsLastLine Context This Baseline Height + + 2 index get-line { % => IsLastLine Context This Baseline Height Child + dup /vertical-align get-css-value + /bottom eq { % => IsLastLine Context This Baseline Height Child + dup get-default-baseline + 1 index get-full-height + sub + 2 index + add + 1 index put-baseline % => IsLastLine Context This Baseline Height Child + } if + pop + } forall + +% TOP vertical align + 0 % => IsLastLine Context This Baseline Height 0 + 3 index get-line { % => IsLastLine Context This Baseline Height Bottom Child + dup /vertical-align get-css-value + /top eq { % => IsLastLine Context This Baseline Height Bottom Child + dup get-full-height % => IsLastLine Context This Baseline Height Bottom Child Bottom + 3 2 roll % => IsLastLine Context This Baseline Height Child Bottom Bottom2 + max % => IsLastLine Context This Baseline Height Child Bottom' + exch % => IsLastLine Context This Baseline Height Bottom Child + } if + pop + } forall % => IsLastLine Context This Baseline Height Bottom + + dup 2 index gt { % => IsLastLine Context This Baseline Height Bottom + dup 2 index sub % => IsLastLine Context This Baseline Height Bottom Delta +% offset already aligned items + 4 index get-line { % => IsLastLine Context This Baseline Height Bottom Delta Child + dup get-baseline + 2 index add + 1 index put-baseline + pop + } forall % => IsLastLine Context This Baseline Height Bottom Delta + pop % => IsLastLine Context This Baseline Height Bottom + exch pop + } { + pop + } ifelse % => IsLastLine Context This Baseline Height + + 2 index get-line { % => IsLastLine Context This Baseline Height Child + dup /vertical-align get-css-value + /top eq { % => IsLastLine Context This Baseline Height Child + dup get-default-baseline + 1 index put-baseline % => IsLastLine Context This Baseline Height Child + } if + pop + } forall % => IsLastLine Context This Baseline Height + + pop pop % => IsLastLine Context This + +% Calculate the bottom Y coordinate of last line box + + dup get-current-y % => IsLastLine Context This BY + 1 index get-line { % => IsLastLine Context This BY Child +% This line is required; say, we have sequence of text and image inside the container, +% AND image have greater baseline than text; in out case, text will be offset to the bottom +% of the page and we lose the gap between text and container bottom edge, unless we'll re-extend +% containier height + +% Note that we're using the colapsed margin value to get the Y coordinate to extend height to, +% as bottom margin may be collapsed with parent + + dup get-bottom-margin + 4 index context-get-collapsed-margin add + 3 index box-generic-extend-height + + get-bottom-margin % => IsLastLine Context This BY BM + min % => IsLastLine Context This BY' + } forall + +% Clear the line box + 1 index box-container-clear-line + +% Reset current X coordinate to the far left + 1 index get-left + 2 index put-current-x + +% Extend Y coordinate + 1 index put-current-y % => IsLastLine Context This + +% Render the deferred floats + dup box-container-get-deferred-floats { + % => IsLastLine Context This Float + 3 copy % => IsLastLine Context This Float Context This Float + box-container-reflow-static-float + pop + } forall % => IsLastLine Context This + dup box-container-clear-deferred-floats + +% modify the current-x value, so that next inline box will not intersect any floating boxes + dup get-current-y + 1 index get-current-x % => IsLastLine Context This Y X + 3 index context-float-left-x % => IsLastLine Context This X + + 1 index put-current-x % => IsLastLine Context This + +% clear the stack + pop pop pop +} def + +/box-container-create { % => + box-generic-create + + dup /Content [] put + dup /Line [] put + + dup box-container-setup-methods + dup /box-container add-type +} def + +% Calculate the available widths - e.g. content width minus space occupied by floats; +% as floats may not fill the whole height of this box, this value depends on Y-coordinate. +% We use current_Y in calculations +% +/box-container-get-available-width { % => Context Box + dup get-current-y + 1 index get-left + 3 index context-float-left-x % => Context Box FL + 1 index get-left sub % => Context Box FloatLeftWidth + + 1 index get-right + 2 index get-current-y + 3 index get-right + 5 index context-float-right-x + sub % => Context Box FloatLeftWidth FloatRightWidth + + 2 index /get-width call-method + exch sub + exch sub + + exch pop + exch pop +} def + +% Get a list of floating boxes which shold be rendered +% at the end of current line box +% +/box-container-get-deferred-floats { + get-box-dict /DeferredFloats get +} def + +% Get first child of current box which actually will be drawn +% on the page. So, whitespace and null boxes will be ignored +% +% See description of is_null for null box definition. +% (not only NullBoxPDF is treated as null box) +% +% @return reference to the first visible child of current box +/box-container-get-first { % => This + /null + 1 index get-content { % => This /null Child + dup /is-whitespace call-method not + 1 index /is-null call-method not + and { % => This FC Child + exch pop % => This Child + exit + } if % => This FC Child + pop + } forall % => This FC + + exch pop % => FC +} def + +% Get first text or image child of current box which actually will be drawn +% on the page. So, whitespace and null boxes will be ignored +% +% See description of is_null for null box definition. +% (not only NullBoxPDF is treated as null box) +% +% @return reference to the first visible child of current box +/box-container-get-first-data { % => This + /null + 1 index get-content { % => This /null Child + dup /is-whitespace call-method not + 1 index /is-null call-method not + and { % => This FC Child + dup is-container { + box-container-get-first-data + dup /null ne { + exch pop exit + } if + } { + exch pop exit + } ifelse % => This FC Child + } if % => This FC Child + pop + } forall % => This FC + + exch pop % => FC +} def + +% Get last child of current box which actually will be drawn +% on the page. So, whitespace and null boxes will be ignored +% +% See description of is_null for null box definition. +% (not only NullBoxPDF is treated as null box) +% +% @return reference to the first visible child of current box +/box-container-get-last { % => This + /null + 1 index get-content % => This /null Content + dup length 1 sub -1 0 { % => This /null Content I + 2 copy get % => This /null Context I Element + + dup /is-whitespace call-method not + 1 index /is-null call-method not + and + { + 4 3 roll pop 3 1 roll % => This /null Context I + pop + exit + } { + pop + } ifelse % => This /null Context I + pop + } for % => This Last Content + pop exch pop +} def + + +/box-container-get-max-width { % => Context This + 0 % => Context This MaxW + +% We need to add text indent to the max width + 1 index + box-generic-calc-text-indent % => Context This MaxW CMaxW + + 2 index get-content { % => Context This MaxW CMaxW Item + dup is-inline + 1 index /float get-css-value + /none ne or { % => Context This MaxW CMaxW Item + 4 index + 1 index + /get-max-width call-method % => Context This MaxW CMaxW Item W + 3 2 roll add exch % => Context This MaxW CMaxW' Item + } { % => Context This MaxW CMaxW Item + 2 index 2 index max % => Context This MaxW CMaxW Item MaxW' + 4 3 roll pop % => Context This CMaxW Item MaxW' + 3 1 roll % => Context This MaxW CMaxW Item + + 4 index + 1 index /get-max-width + call-method % => Context This MaxW CMaxW Item CMaxW' + 3 2 roll pop exch % => Context This MaxW CMaxW' Item + +% Process special case with percentage constrained table + + dup get-width-constraint % => Context This MaxW CMaxW Item WC + + 1 index /box-table is-a + 1 index /type get + /fraction eq and { % => Context This MaxW CMaxW Item WC + 4 index + box-generic-get-expandable-width % => Context This MaxW CMaxW Item WC ExpandableWidth + + 5 index + /get-width call-method % => Context This MaxW CMaxW Item WC ExpandableWidth Width + + 2 index + dup /apply get exec % => Context This MaxW CMaxW Item WC CWidth + + 3 index max % => Context This MaxW CMaxW Item WC CMaxW' + + 4 3 roll pop 3 1 roll % => Context This MaxW CMaxW' Item WC + } if % => Context This MaxW CMaxW Item WC + pop % => Context This MaxW CMaxW Item + } ifelse % => Context This MaxW CMaxW Item + + pop + } forall % => Context This MaxW CMaxW + +% Check if last line have maximal width + + max % => Context This MaxW + +% Note that max width cannot differ drom constrained width, +% if any width constraints apply + + 1 index get-width-constraint % => Context This MaxW WC + dup /type get /none ne { + 2 index get-parent + /get-width call-method % => Context This MaxW WC PWidth + 2 index % => Context This MaxW WC PWidth MaxW + 2 index dup /apply get exec % => Context This MaxW WC MaxW' + exch pop % => Context This MaxW MaxW' + exch pop + } { + pop + } ifelse % => Context This MaxW + + 1 index get-hor-extra + add + + exch pop + exch pop +} def + +/box-container-get-min-nowrap-width { % => Context This + 0 % => Context This MaxW + +% We need to add text indent to the width + + 1 index + box-generic-calc-text-indent % => Context This MaxW CMaxW + + 2 index get-content { % => Context This MaxW CMaxW Child + dup is-inline { +% Inline boxes content will not be wrapped, so we may calculate its max width + 4 index exch + /get-max-width call-method % => Context This MaxW CMaxW CMW + add % => Context This MaxW CMaxW + } { % => Context This MaxW CMaxW Child + 3 1 roll % => Context This Child MaxW CMaxW + max % => Context This Child MaxW' + exch % => Context This MaxW' Child + 3 index exch % => Context This MaxW' Context Child + /get-min-width call-method % => Context This MaxW' CMaxW' + } ifelse % => Context This MaxW CMaxW + } forall % => Context This MaxW CMaxW + +% Check if last line have maximal width + max % => Context This MaxW + +% Apply width constraint to min width. Return maximal value + 1 index get-parent + /get-width call-method % => Context This MaxW ParentW + 1 index % => Context This MaxW ParentW W + 3 index get-width-constraint % => Context This MaxW ParentW W WC + dup /apply get exec % => Context This MaxW MaxW' + max % => Context This MaxW + + 1 index get-hor-extra add % => Context This MaxW + exch pop + exch pop +} def + +/box-container-get-min-width { % => Context This +% If box does not have any context, its minimal width is determined by extra horizontal space + dup get-content length 0 eq { % => Context This + dup get-hor-extra + } { % => Context This +% If we're in 'nowrap' mode, minimal and maximal width will be equal + dup /white-space get-css-value /nowrap eq + 1 index + /pseudo-nowrap get-css-value + /nowrap eq or { % => Context This + 2 copy box-container-get-min-nowrap-width + } { % => Context This +% We need to add text indent size to the with of the first item + dup + box-generic-calc-text-indent % => Context This TI + 2 index + 2 index % => Context This TI Context This + get-content 0 get +% box-container-get-first-data % => Context This TI Context First + /get-min-width call-method % => Context This TI WFirst + add % => Context This MinW + + 1 index get-content { % => Context This MinW Child + 3 index exch + /get-min-width call-method % => Context This MinW CMinW + max % => Context This MinW + } forall % => Context This MinW + + 1 index get-parent + /get-width call-method % => Context This MinW ParentW + 1 index % => Context This MinW ParentW MinW + 3 index get-width-constraint % => Context This MinW ParentW MinW WC + dup /apply get exec % => Context This MinW MinW' + max + + 1 index get-hor-extra add % => Context This MinW' + } ifelse % => Context This Width + } ifelse % => Context This Width + + exch pop + exch pop +} def + +% Get total height of this box content (including floats, if any) +% Note that floats can be contained inside children, so we'll need to use +% this function recusively +/box-container-get-real-full-height { % => This +% Treat items with overflow: hidden specifically, +% as floats flown out of this boxes will not be visible + dup /overflow get-css-value + /hidden eq { % => This + dup get-full-height % => This Height + } { % => This +% Check if this cell is totally empty + dup get-content length 0 eq { + 0 % => This Height + } { % => This +% Initialize the vertical extent taken by content using the +% very first child + dup get-content 0 get + dup get-top-margin % => This C0 Top + 1 index get-bottom-margin % => This C0 Top Bottom + 3 2 roll pop % => This Top Bottom + + 2 index get-content { % => This Top Bottom Child +% Check if top margin of current child is to the up +% of vertical extent top margin + dup get-top-margin % => This Top Bottom Child ChildTop + 4 3 roll max 3 1 roll % => This Top' Bottom Child + +% Check if current child bottom margin will extend +% the vertical space OR if it contains floats extending +% this, unless this child have overflow: hidden, because this +% will prevent additional content to be visible + dup /overflow get-css-value + /hidden eq { + dup get-bottom-margin + 3 2 roll min + exch % => This Top Bottom Child + } { + dup get-bottom-margin + 1 index get-top-margin + 2 index /get-real-full-height call-method + sub + min % => This Top Bottom Child ChildBM + 3 2 roll min exch % => This Top Bottom' Child + } ifelse % => This Top Bottom Child + pop + } forall % => This Top Bottom + sub 0 max % => This RH + 1 index get-vert-extra add % => This Height + } ifelse + } ifelse % => This Height + exch pop +} def + +/box-container-is-first { % => Box This + dup box-container-get-first % => Box This First + dup /null eq { + pop false + } { + get-uid + 2 index get-uid + eq + } ifelse + + exch pop + exch pop +} def + +% Line box should be treated as empty in following cases: +% 1. It is really empty (so, it contains 0 boxes) +% 2. It contains only whitespace boxes +% +/box-container-line-box-empty { % => This + dup get-line length 0 eq { + pop true % => true + } { + true 1 index get-line % => This true Line + { % => This Flag Child + /is-whitespace call-method + and + } forall + + exch pop + } ifelse +} def + +/box-container-offset { % => DY DX This + 3 copy box-generic-offset + + dup get-current-x + 2 index add + 1 index put-current-x + + dup get-current-y + 3 index add + 1 index put-current-y + + dup get-content { + 3 index exch + 3 index exch + /offset call-method + } forall + + pop pop pop +} def + +/box-container-offset-if-first { % => DY DX Box This + 2 copy box-container-is-first { + dup get-parent /null ne { + 3 index + 3 index + 3 index + 3 index get-parent % => DY DX Box This DY DX Box Parent + + box-container-offset-if-first + % => DY DX Box This ParentResult + + not { + 3 index + 3 index + 2 index /offset call-method % => DY DX Box This + true + } { false } ifelse + } { false } ifelse + } { false }ifelse + + exch pop + exch pop + exch pop + exch pop +} def + +/box-container-pre-reflow-images { % => This + dup get-content { + /pre-reflow-images call-method + } forall + pop +} def + +/box-container-setup-methods { % => Box + dup get-box-dict /Methods get % => Box Methods + dup /add-child { box-container-add-child } put + dup /get-max-width { box-container-get-max-width } put + dup /get-min-width { box-container-get-min-width } put + dup /get-real-full-height { box-container-get-real-full-height } put + dup /offset { box-container-offset } put + dup /pre-reflow-images { box-container-pre-reflow-images } put + dup /reflow-anchors { box-container-reflow-anchors } put + dup /reflow-content { box-container-reflow-content } put + dup /reflow-inline { box-container-reflow-inline } put + dup /reflow-static-float { box-container-reflow-static-float } put + dup /show { box-container-show } put + pop pop +} def + +/box-container-show { % => Viewport Box + 2 copy box-generic-show % => Viewport Box + +% Setup clipping path for non 'overflow: visible' boxes + dup /overflow get-css-value + /visible ne { +% Save clipping area state (of course, BEFORE the clipping area will be set) + gsave + + newpath + dup get-left-border + 1 index get-bottom-border % => Viewport Box X Y + 2 index get-right-border + 3 index get-left-border sub % => Viewport Box X Y W + 3 index get-top-border + 4 index get-bottom-border sub % => Viewport Box X Y W H + rectclip + + } if + +% draw content + dup get-content { % => Viewport Box ContentElement +% We'll check the visibility property here +% Reason: all boxes (except the top-level one) are contained in some other box, +% so every box will pass this check. The alternative is to add this check into every +% box class show member. + +% The only exception of absolute positioned block boxes which are drawn separately; +% their show method is called explicitly; the similar check should be performed there + + dup /visibility get-css-value /visible eq { + 2 index + 1 index + /show call-method + } if % => Viewport Box ContentElement + pop + } forall % => Viewport Box + + dup /overflow get-css-value /visible ne { +% restore previous clipping path + grestore + } if + + pop pop +} def % => + +/box-container-reflow-anchors { % => List Viewport Box + 3 copy box-generic-reflow-anchors + + dup get-content { % => List Viewport Box Child + 3 index exch + 3 index exch % => List Viewport Box List Viewport Child + /reflow-anchors call-method % => List' Viewport Box + } forall + + pop pop pop +} def + +/box-container-reflow-content { % => Context This + 2 copy box-container-close-line % => Context This + +% If first child is inline - apply text-indent + dup box-container-get-first + dup /null ne { + dup is-inline { % => Context This First + pop + dup box-container-calculate-text-indent + 1 index get-additional-text-indent + add + 1 index get-current-x + add + 1 index put-current-x % => Context This + } { + pop + } ifelse + } { + pop + } ifelse + + 0 1 index put-height + +% reset current Y value + dup get-top + 1 index put-current-y + + dup get-content { % => Context This Child + 2 index exch % => Context This Context Child + 2 index exch % => Context This Context This Child + /reflow call-method % => Context This + } forall % => Context This + + 1 index 1 index + box-container-close-last-line % => Context This + + pop pop % => +} def + +/box-container-reflow-inline { % => This + dup get-content { % => This Child + /reflow-inline call-method % => This + } forall + pop +} def + +/box-container-reflow-static-float { % => Context Parent Box +% Defer the float rendering till the next line box + 1 index get-line length 0 gt { + dup 2 index box-container-add-deferred-float + } { + +% Calculate margin values if they have been set as a percentage + + 2 copy + box-generic-calc-percentage-margins + +% Calculate width value if it have been set as a percentage + + 3 copy + box-generic-calc-percentage-width + +% Calculate margins and/or width is 'auto' values have been specified + + 2 copy + box-generic-calc-auto-width-margins + +% Determine the actual width of the floating box +% Note that get_max_width returns both content and extra width + + 2 index 1 index /get-max-width call-method + 1 index put-full-width + +% We need to call this function before determining the horizontal coordinate +% as after vertical offset the additional space to the left may apperar + % => Context Parent Box + 2 index + 2 index get-current-y + 2 index + box-generic-apply-clear % => Context Parent Box Y + +% determine the position of top-left floating box corner + 1 index /float get-css-value + /right eq { + 2 index + 2 index get-full-width + 2 index % => Context Parent Box Y Parent Width Y + 6 index + context-float-right-xy % => Context Parent Box Y X' Y' + + exch + 3 index get-full-width sub + exch + } { + 2 index + 2 index get-full-width + 2 index % => Context Parent Box Y Parent Width Y + 6 index + context-float-left-xy % => Context Parent Box Y X' Y' + } ifelse % => Context Parent Box Y X' Y' + + 3 index get-extra-top sub + exch + 3 index get-extra-left add + 3 index box-generic-move-to % => Context Parent Box Y + pop % => Context Parent Box + +% Reflow contents. +% Note that floating box creates a new float flow context for it children. + + 2 index context-push-floats + +% Floating box create a separate margin collapsing context + + 0 3 index context-push-collapsed-margin + + 2 index 1 index /reflow-content call-method + + 2 index context-pop-collapsed-margin + +% Float should completely enclose its child floats + + 2 index context-float-bottom % => Context Parent Box FB + dup /null ne { + 1 index box-generic-extend-height + } { + pop + } ifelse + + 2 index context-float-right % => Context Parent Box FR + dup /null ne { + 1 index box-generic-extend-width + } { + pop + } ifelse + +% restore old float flow context + + 2 index context-pop-floats + +% Add this box to the list of floats in current context + + dup 3 index context-add-float % => Context Parent Box + +% Now fix the value of _current_x for the parent box; it is required +% in the following case: +% some text +% in such situation floating image is flown immediately, but it the close_line call have been made before, +% so _current_x value of container box will be still equal to ots left content edge; by calling float_left_x again, +% we'll force "some text" to be offset to the right + + 1 index get-current-y + 2 index get-current-x + 4 index + context-float-left-x + 2 index put-current-x + + } ifelse % => Context Parent Box + pop pop pop +} def + +/get-content { + /Content get +} def + +/get-line { + /Line get +} def + +/line-length { % => Box + dup get-line 0 exch % => Box 0(CurrentLength) Line + { % => Box CurrentLength LineElement +% Note that the line length should include the inline boxes margin/padding +% as inline boxes are not directly included to the parent line box, +% we'll need to check the parent of current line box element, +% and, if it is an inline box, AND this element is last or first contained element +% add correcponsing padding value + dup get-full-width % => Box CurrentLength LineElement EWidth + 3 2 roll add exch % => Box CurrentLength LineElement + + dup get-parent % => Box CurrentLength LineElement EParent + dup /null ne { + dup box-container-get-first % => Box CurrentLength LineElement EParent First + 1 index + box-container-get-last % => Box CurrentLength LineElement EParent First Last + + 1 index /null ne { + 1 index get-uid + 4 index get-uid eq { + 2 index + /get-extra-line-left + call-method % => Box CurrentLength LineElement EParent First Last ELeft + 6 5 roll add 5 1 roll % => Box CurrentLength' LineElement EParent First Last + } if + } if + + dup /null ne { + dup get-uid + 4 index get-uid eq { + 2 index + /get-extra-line-right + call-method % => Box CurrentLength LineElement EParent First Last ELeft + 6 5 roll add 5 1 roll % => Box CurrentLength' LineElement EParent First Last + } if + } if + + pop pop % => Box CurrentLength LineELement EParent + } if % => Box CurrentLength LineElement EParent + pop pop + } forall % => Box CurrentLength + exch pop % => Length +} def + +/put-line { + exch /Line exch put } def \ No newline at end of file diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/box.frame.ps b/thirdparty/html2ps_pdf/postscript/box.frame.ps similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/postscript/box.frame.ps rename to thirdparty/html2ps_pdf/postscript/box.frame.ps diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/box.generic.inline.ps b/thirdparty/html2ps_pdf/postscript/box.generic.inline.ps similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/postscript/box.generic.inline.ps rename to thirdparty/html2ps_pdf/postscript/box.generic.inline.ps diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/box.generic.ps b/thirdparty/html2ps_pdf/postscript/box.generic.ps similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/postscript/box.generic.ps rename to thirdparty/html2ps_pdf/postscript/box.generic.ps diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/box.iframe.ps b/thirdparty/html2ps_pdf/postscript/box.iframe.ps similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/postscript/box.iframe.ps rename to thirdparty/html2ps_pdf/postscript/box.iframe.ps diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/box.image.ps b/thirdparty/html2ps_pdf/postscript/box.image.ps similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/postscript/box.image.ps rename to thirdparty/html2ps_pdf/postscript/box.image.ps diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/box.inline.ps b/thirdparty/html2ps_pdf/postscript/box.inline.ps similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/postscript/box.inline.ps rename to thirdparty/html2ps_pdf/postscript/box.inline.ps diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/box.inline.whitespace.ps b/thirdparty/html2ps_pdf/postscript/box.inline.whitespace.ps similarity index 96% rename from gulliver/thirdparty/html2ps_pdf/postscript/box.inline.whitespace.ps rename to thirdparty/html2ps_pdf/postscript/box.inline.whitespace.ps index e5517cc43..99b4c199d 100644 --- a/gulliver/thirdparty/html2ps_pdf/postscript/box.inline.whitespace.ps +++ b/thirdparty/html2ps_pdf/postscript/box.inline.whitespace.ps @@ -1,76 +1,76 @@ -% $Header: /cvsroot/html2ps/postscript/box.inline.whitespace.ps,v 1.1 2005/12/18 07:21:36 Konstantin Exp $ - -% Whitespace flow control function. Do nothing if whitespace is at the beginning of the line box -% make a inline box containining space symbol otherwise. -/flow-whitespace { % => Parent Child - 1 index get-current-x - 2 index get-current-y % => Parent Child X Y - 2 index - move-to-box % => Parent Child - -% Check if there are any boxes in parent's line box - 1 index - get-line - length 0 gt { - % there's some boxes in the parent's line box already - % just make a space (if previous inline box wasn't a whitespace!) - 1 index get-line - dup length 1 sub get % => Parent Child LastInlineBox - - get-box-dict - /Display get - /inline-whitespace ne { - dup get-default-baseline - 1 index put-baseline - - apply-line-height - - dup get-vertical-align exec - - dup /get-width call-method - 2 index get-current-x - add - 2 index put-current-x - } { -% Duplicate whitespace boxes should not offset further content and affect the line box length - 0 1 index put-width -% Make whitespace correctly aligned relative to the baseline - dup get-vertical-align exec - } ifelse - } { -% The very first whitespace in the line box should not affect neither height nor baseline of the line box; -% because following boxes can be smaller that assumed whitespace height -% Example:
      [whitespace]
      ; whitespace can overextend this line - 0 1 index put-height -% Aslo, the very first whitespace should not offset further content and affect the line box length - 0 1 index put-width - } ifelse - - dup 2 index append-line - -% dup get-baseline -% 1 index get-default-baseline -% sub -% 1 index get-full-height -% add - dup get-full-height - exch pop - extend-height % => Parent - - pop -} def - -/make-whitespace-box { % => FontSize FontName - ( ) - 2 index 2 index - make-text-box % => FontSize FontName Box - - {flow-whitespace} - 1 index put-flow-fun % => FontSize FontName Box - dup get-box-dict - /Display /inline-whitespace put - - 3 1 roll - pop pop -} def - +% $Header: /cvsroot/html2ps/postscript/box.inline.whitespace.ps,v 1.1 2005/12/18 07:21:36 Konstantin Exp $ + +% Whitespace flow control function. Do nothing if whitespace is at the beginning of the line box +% make a inline box containining space symbol otherwise. +/flow-whitespace { % => Parent Child + 1 index get-current-x + 2 index get-current-y % => Parent Child X Y + 2 index + move-to-box % => Parent Child + +% Check if there are any boxes in parent's line box + 1 index + get-line + length 0 gt { + % there's some boxes in the parent's line box already + % just make a space (if previous inline box wasn't a whitespace!) + 1 index get-line + dup length 1 sub get % => Parent Child LastInlineBox + + get-box-dict + /Display get + /inline-whitespace ne { + dup get-default-baseline + 1 index put-baseline + + apply-line-height + + dup get-vertical-align exec + + dup /get-width call-method + 2 index get-current-x + add + 2 index put-current-x + } { +% Duplicate whitespace boxes should not offset further content and affect the line box length + 0 1 index put-width +% Make whitespace correctly aligned relative to the baseline + dup get-vertical-align exec + } ifelse + } { +% The very first whitespace in the line box should not affect neither height nor baseline of the line box; +% because following boxes can be smaller that assumed whitespace height +% Example:
      [whitespace]
      ; whitespace can overextend this line + 0 1 index put-height +% Aslo, the very first whitespace should not offset further content and affect the line box length + 0 1 index put-width + } ifelse + + dup 2 index append-line + +% dup get-baseline +% 1 index get-default-baseline +% sub +% 1 index get-full-height +% add + dup get-full-height + exch pop + extend-height % => Parent + + pop +} def + +/make-whitespace-box { % => FontSize FontName + ( ) + 2 index 2 index + make-text-box % => FontSize FontName Box + + {flow-whitespace} + 1 index put-flow-fun % => FontSize FontName Box + dup get-box-dict + /Display /inline-whitespace put + + 3 1 roll + pop pop +} def + diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/box.input.check.ps b/thirdparty/html2ps_pdf/postscript/box.input.check.ps similarity index 95% rename from gulliver/thirdparty/html2ps_pdf/postscript/box.input.check.ps rename to thirdparty/html2ps_pdf/postscript/box.input.check.ps index 8b3739c69..9bbc62952 100644 --- a/gulliver/thirdparty/html2ps_pdf/postscript/box.input.check.ps +++ b/thirdparty/html2ps_pdf/postscript/box.input.check.ps @@ -1,63 +1,63 @@ -% $Header: /cvsroot/html2ps/postscript/box.input.check.ps,v 1.1 2005/12/18 07:21:37 Konstantin Exp $ - -/show-checked-check-box { -% render empty (unchecked) radio button - show-check-box - -% Get check center coordinates - dup get-left - 1 index get-right - add 2 div - - 1 index get-top - 2 index get-bottom - add 2 div % => CX CY - -% calculate check box size - 2 index get-width - 6 div % => CX CY R - - 2 index 1 index sub % => CX CY R L - 2 index 2 index sub % => CX CY R L T - 2 index 2 mul dup % => CX CY R L T H W - -% render the checkmark (cross) - 0.5 setlinewidth - -% / cross part - 4 copy - 4 2 roll - newpath moveto rlineto stroke - -% \ cross part - neg - 4 2 roll 2 index sub - newpath moveto rlineto stroke - - pop pop pop -} def - -/show-check-box { -% Get check center coordinates - dup get-left - 1 index get-right - add 2 div - - 1 index get-top - 2 index get-bottom - add 2 div % => CX CY - -% calculate check box size - 2 index get-width - 3 div % => CX CY R - - 2 index 1 index sub % => CX CY R L - 2 index 2 index sub % => CX CY R L T - 2 index 2 mul dup % => CX CY R L T H W - -% render the empty (unchecked) radio button - 0.25 setlinewidth - rectstroke - - pop pop pop -} def +% $Header: /cvsroot/html2ps/postscript/box.input.check.ps,v 1.1 2005/12/18 07:21:37 Konstantin Exp $ + +/show-checked-check-box { +% render empty (unchecked) radio button + show-check-box + +% Get check center coordinates + dup get-left + 1 index get-right + add 2 div + + 1 index get-top + 2 index get-bottom + add 2 div % => CX CY + +% calculate check box size + 2 index get-width + 6 div % => CX CY R + + 2 index 1 index sub % => CX CY R L + 2 index 2 index sub % => CX CY R L T + 2 index 2 mul dup % => CX CY R L T H W + +% render the checkmark (cross) + 0.5 setlinewidth + +% / cross part + 4 copy + 4 2 roll + newpath moveto rlineto stroke + +% \ cross part + neg + 4 2 roll 2 index sub + newpath moveto rlineto stroke + + pop pop pop +} def + +/show-check-box { +% Get check center coordinates + dup get-left + 1 index get-right + add 2 div + + 1 index get-top + 2 index get-bottom + add 2 div % => CX CY + +% calculate check box size + 2 index get-width + 3 div % => CX CY R + + 2 index 1 index sub % => CX CY R L + 2 index 2 index sub % => CX CY R L T + 2 index 2 mul dup % => CX CY R L T H W + +% render the empty (unchecked) radio button + 0.25 setlinewidth + rectstroke + + pop pop pop +} def diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/box.input.radio.ps b/thirdparty/html2ps_pdf/postscript/box.input.radio.ps similarity index 94% rename from gulliver/thirdparty/html2ps_pdf/postscript/box.input.radio.ps rename to thirdparty/html2ps_pdf/postscript/box.input.radio.ps index ca1b8477f..0ec54db7d 100644 --- a/gulliver/thirdparty/html2ps_pdf/postscript/box.input.radio.ps +++ b/thirdparty/html2ps_pdf/postscript/box.input.radio.ps @@ -1,50 +1,50 @@ -% $Header: /cvsroot/html2ps/postscript/box.input.radio.ps,v 1.1 2005/12/18 07:21:37 Konstantin Exp $ - -/show-checked-circle-box { -% render empty (unchecked) radio button - show-circle-box - -% Get circle center coordinates - dup get-left - 1 index get-right - add 2 div - - 1 index get-top - 2 index get-bottom - add 2 div % => CX CY - -% Calculate circle radius - 2 index get-width - 6 div - - 0 360 - 0.25 setlinewidth - -% render the black point in the button's center - newpath - arc - fill -} def - -/show-circle-box { -% Get circle center coordinates - dup get-left - 1 index get-right - add 2 div - - 1 index get-top - 2 index get-bottom - add 2 div - -% calculate circle radius - 2 index get-width - 3 div - - 0 360 - 0.25 setlinewidth - -% render the empty (unchecked) radio button - newpath - arc - stroke -} def +% $Header: /cvsroot/html2ps/postscript/box.input.radio.ps,v 1.1 2005/12/18 07:21:37 Konstantin Exp $ + +/show-checked-circle-box { +% render empty (unchecked) radio button + show-circle-box + +% Get circle center coordinates + dup get-left + 1 index get-right + add 2 div + + 1 index get-top + 2 index get-bottom + add 2 div % => CX CY + +% Calculate circle radius + 2 index get-width + 6 div + + 0 360 + 0.25 setlinewidth + +% render the black point in the button's center + newpath + arc + fill +} def + +/show-circle-box { +% Get circle center coordinates + dup get-left + 1 index get-right + add 2 div + + 1 index get-top + 2 index get-bottom + add 2 div + +% calculate circle radius + 2 index get-width + 3 div + + 0 360 + 0.25 setlinewidth + +% render the empty (unchecked) radio button + newpath + arc + stroke +} def diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/box.input.text.ps b/thirdparty/html2ps_pdf/postscript/box.input.text.ps similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/postscript/box.input.text.ps rename to thirdparty/html2ps_pdf/postscript/box.input.text.ps diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/box.list-item.ps b/thirdparty/html2ps_pdf/postscript/box.list-item.ps similarity index 96% rename from gulliver/thirdparty/html2ps_pdf/postscript/box.list-item.ps rename to thirdparty/html2ps_pdf/postscript/box.list-item.ps index 255fbdd59..bc8090dfd 100644 --- a/gulliver/thirdparty/html2ps_pdf/postscript/box.list-item.ps +++ b/thirdparty/html2ps_pdf/postscript/box.list-item.ps @@ -1,246 +1,246 @@ -% $Header: /cvsroot/html2ps/postscript/box.list-item.ps,v 1.1 2005/12/18 07:21:37 Konstantin Exp $ - -/box-list-item-height-koeff 0.7 def -/box-list-item-bullet-size-koeff 0.15 def - -/box-list-item-create { - box-block-create - - dup /MarkerImage /null put - dup /MarkerString ( ) put - - dup box-list-item-setup-methods - dup /box-list-item add-type -} def - -/box-list-item-get-marker-box-width { % => ListItem - dup /list-style get-css-value - /type get { % => ListItem Type - dup /none eq { pop 0 exit } if - - dup /disc eq - 1 index /circle eq or - 1 index /square eq or { pop dup /font-size get-css-value exit } if - - pop - - dup /font-family get-css-value - 1 index /font-size get-css-value - scalefont - setfont - - dup box-list-item-get-string - stringwidth pop % => ListItem Width - } loop % => ListItem Width - exch pop % => Width -} def - -/box-list-item-get-marker-image { - /MarkerImage get -} def - -/box-list-item-get-string { - /MarkerString get -} def - -/box-list-item-put-marker-image { % => Image This - exch /MarkerImage exch put -} def - -/box-list-item-put-string { - exch /MarkerString exch put -} def - -/box-list-item-reflow { % => Context Parent Box -% If list-style-position is inside, we'll need to move marker box inside the -% list-item box and offset all content by its size; - dup /list-style get-css-value /position get - /inside eq { -% Add marker box width to text-indent value - dup box-list-item-get-marker-box-width - 1 index put-additional-text-indent - } if - - 3 copy box-block-reflow - pop pop pop -} def - -/box-list-item-show { % => Viewport This -% Draw generic block box - 2 copy box-container-show - -% Draw marker -% Determine the marker box base X coordinate - dup get-left % => Viewport This MX - -% Determine the base Y coordinate of marker box - 1 index box-container-get-first-data - dup /null ne { % => Viewport This MX Element - dup get-top - 1 index get-default-baseline sub - exch pop - } { % => Viewport This MX /null - pop - 1 index get-top - } ifelse % => Viewport This MX MY - -% If list-style-position is inside, we'll need to move marker box inside the -% list-item box and offset all content by its size; - 2 index /list-style get-css-value /position get - /inside eq { - 2 index box-list-item-get-marker-box-width - 2 index add % => Viewport This MX MY MX' - 3 2 roll pop - exch - } if - - 2 index box-list-item-get-marker-image - /null ne { % => Viewport This MX MY - exch 3 index 3 index - box-list-item-show-image - } { % => Viewport This MX MY - exch - 3 index 3 index % => Viewport This MY MX Viewport This - dup /list-style get-css-value /type get - { - dup /none eq { pop pop pop pop pop exit } if - dup /disc eq { pop box-list-item-show-disc exit } if - dup /circle eq { pop box-list-item-show-circle exit } if - dup /square eq { pop box-list-item-show-square exit } if - pop box-list-item-show-string exit - } loop - } ifelse % => Viewport This - - pop pop -} def - -/box-list-item-setup-methods { % => Box - dup /Methods get - dup /reflow {box-list-item-reflow} put - dup /show {box-list-item-show} put - pop pop -} def - -/box-list-item-show-circle { % => MY MX Viewport This - dup /color get-css-value - color-apply - - 0.1 setlinewidth - - dup /font-size get-css-value - 2 div neg - 3 index add % => MY MX Viewport This X - - 1 index /font-size get-css-value - 0.4 mul - box-list-item-height-koeff mul - 5 index add % => MY MX Viewport This X Y - - 2 copy newpath moveto - - 2 index /font-size get-css-value - box-list-item-bullet-size-koeff mul - % => MY MX Viewport This X Y R - - 0 360 arc closepath stroke - - pop pop pop pop -} def - -/box-list-item-show-disc { % => MY MX Viewport This - dup /color get-css-value - color-apply - - dup /font-size get-css-value - 2 div neg - 3 index add % => MY MX Viewport This X - - 1 index /font-size get-css-value - 0.4 mul - box-list-item-height-koeff mul - 5 index add % => MY MX Viewport This X Y - - 2 copy newpath moveto - - 2 index /font-size get-css-value - box-list-item-bullet-size-koeff mul - % => MY MX Viewport This X Y R - - 0 360 arc closepath fill - - pop pop pop pop -} def - -/box-list-item-show-image { % => MY MX Viewport This - dup box-list-item-get-marker-image - % => MY MX Viewport This Image - 3 index - 5 index moveto % => MY MX Viewport This Image - - dup /SX get px - 1 index /SY get px - 2 index - image-show % => MY MX Viewport This Image - - pop pop pop pop pop -} def - -/box-list-item-show-square { % => MY MX Viewport This - dup /color get-css-value - color-apply - - 2 index - 1 index /font-size get-css-value - 0.512 mul sub - - 4 index - 2 index /font-size get-css-value - 0.3 mul - box-list-item-height-koeff mul add - - 2 index /font-size get-css-value 0.25 mul - 3 index /font-size get-css-value 0.25 mul - - rectfill - - pop pop pop pop -} def - -/box-list-item-show-string { % => MY MX Viewport This - box-text-create % => MY MX Viewport This TextBox - - 1 index box-list-item-get-string % => MY MX Viewport This TextBox String - 1 index put-text % => MY MX Viewport This TextBox - - 1 index - /font-family get-css-value % => MY MX Viewport This TextBox Font - 1 index exch - /font-family exch put-css-value % => MY MX Viewport This TextBox - - 1 index - /font-size get-css-value % => MY MX Viewport This TextBox FontSize - 1 index exch - /font-size exch put-css-value % => MY MX Viewport This TextBox - - 1 index - /color get-css-value % => MY MX Viewport This TextBox Color - 1 index exch - /color exch put-css-value % => MY MX Viewport This TextBox - - dup box-text-setup % => MY MX Viewport This TextBox - - dup get-default-baseline - 1 index put-baseline - - 4 index - 1 index get-baseline add - 4 index - 2 index get-full-width sub % => MY MX Viewport This TextBox MY MX - 2 index - box-generic-move-to % => MY MX Viewport This TextBox - - 2 index exch - box-text-show - - pop pop pop pop +% $Header: /cvsroot/html2ps/postscript/box.list-item.ps,v 1.1 2005/12/18 07:21:37 Konstantin Exp $ + +/box-list-item-height-koeff 0.7 def +/box-list-item-bullet-size-koeff 0.15 def + +/box-list-item-create { + box-block-create + + dup /MarkerImage /null put + dup /MarkerString ( ) put + + dup box-list-item-setup-methods + dup /box-list-item add-type +} def + +/box-list-item-get-marker-box-width { % => ListItem + dup /list-style get-css-value + /type get { % => ListItem Type + dup /none eq { pop 0 exit } if + + dup /disc eq + 1 index /circle eq or + 1 index /square eq or { pop dup /font-size get-css-value exit } if + + pop + + dup /font-family get-css-value + 1 index /font-size get-css-value + scalefont + setfont + + dup box-list-item-get-string + stringwidth pop % => ListItem Width + } loop % => ListItem Width + exch pop % => Width +} def + +/box-list-item-get-marker-image { + /MarkerImage get +} def + +/box-list-item-get-string { + /MarkerString get +} def + +/box-list-item-put-marker-image { % => Image This + exch /MarkerImage exch put +} def + +/box-list-item-put-string { + exch /MarkerString exch put +} def + +/box-list-item-reflow { % => Context Parent Box +% If list-style-position is inside, we'll need to move marker box inside the +% list-item box and offset all content by its size; + dup /list-style get-css-value /position get + /inside eq { +% Add marker box width to text-indent value + dup box-list-item-get-marker-box-width + 1 index put-additional-text-indent + } if + + 3 copy box-block-reflow + pop pop pop +} def + +/box-list-item-show { % => Viewport This +% Draw generic block box + 2 copy box-container-show + +% Draw marker +% Determine the marker box base X coordinate + dup get-left % => Viewport This MX + +% Determine the base Y coordinate of marker box + 1 index box-container-get-first-data + dup /null ne { % => Viewport This MX Element + dup get-top + 1 index get-default-baseline sub + exch pop + } { % => Viewport This MX /null + pop + 1 index get-top + } ifelse % => Viewport This MX MY + +% If list-style-position is inside, we'll need to move marker box inside the +% list-item box and offset all content by its size; + 2 index /list-style get-css-value /position get + /inside eq { + 2 index box-list-item-get-marker-box-width + 2 index add % => Viewport This MX MY MX' + 3 2 roll pop + exch + } if + + 2 index box-list-item-get-marker-image + /null ne { % => Viewport This MX MY + exch 3 index 3 index + box-list-item-show-image + } { % => Viewport This MX MY + exch + 3 index 3 index % => Viewport This MY MX Viewport This + dup /list-style get-css-value /type get + { + dup /none eq { pop pop pop pop pop exit } if + dup /disc eq { pop box-list-item-show-disc exit } if + dup /circle eq { pop box-list-item-show-circle exit } if + dup /square eq { pop box-list-item-show-square exit } if + pop box-list-item-show-string exit + } loop + } ifelse % => Viewport This + + pop pop +} def + +/box-list-item-setup-methods { % => Box + dup /Methods get + dup /reflow {box-list-item-reflow} put + dup /show {box-list-item-show} put + pop pop +} def + +/box-list-item-show-circle { % => MY MX Viewport This + dup /color get-css-value + color-apply + + 0.1 setlinewidth + + dup /font-size get-css-value + 2 div neg + 3 index add % => MY MX Viewport This X + + 1 index /font-size get-css-value + 0.4 mul + box-list-item-height-koeff mul + 5 index add % => MY MX Viewport This X Y + + 2 copy newpath moveto + + 2 index /font-size get-css-value + box-list-item-bullet-size-koeff mul + % => MY MX Viewport This X Y R + + 0 360 arc closepath stroke + + pop pop pop pop +} def + +/box-list-item-show-disc { % => MY MX Viewport This + dup /color get-css-value + color-apply + + dup /font-size get-css-value + 2 div neg + 3 index add % => MY MX Viewport This X + + 1 index /font-size get-css-value + 0.4 mul + box-list-item-height-koeff mul + 5 index add % => MY MX Viewport This X Y + + 2 copy newpath moveto + + 2 index /font-size get-css-value + box-list-item-bullet-size-koeff mul + % => MY MX Viewport This X Y R + + 0 360 arc closepath fill + + pop pop pop pop +} def + +/box-list-item-show-image { % => MY MX Viewport This + dup box-list-item-get-marker-image + % => MY MX Viewport This Image + 3 index + 5 index moveto % => MY MX Viewport This Image + + dup /SX get px + 1 index /SY get px + 2 index + image-show % => MY MX Viewport This Image + + pop pop pop pop pop +} def + +/box-list-item-show-square { % => MY MX Viewport This + dup /color get-css-value + color-apply + + 2 index + 1 index /font-size get-css-value + 0.512 mul sub + + 4 index + 2 index /font-size get-css-value + 0.3 mul + box-list-item-height-koeff mul add + + 2 index /font-size get-css-value 0.25 mul + 3 index /font-size get-css-value 0.25 mul + + rectfill + + pop pop pop pop +} def + +/box-list-item-show-string { % => MY MX Viewport This + box-text-create % => MY MX Viewport This TextBox + + 1 index box-list-item-get-string % => MY MX Viewport This TextBox String + 1 index put-text % => MY MX Viewport This TextBox + + 1 index + /font-family get-css-value % => MY MX Viewport This TextBox Font + 1 index exch + /font-family exch put-css-value % => MY MX Viewport This TextBox + + 1 index + /font-size get-css-value % => MY MX Viewport This TextBox FontSize + 1 index exch + /font-size exch put-css-value % => MY MX Viewport This TextBox + + 1 index + /color get-css-value % => MY MX Viewport This TextBox Color + 1 index exch + /color exch put-css-value % => MY MX Viewport This TextBox + + dup box-text-setup % => MY MX Viewport This TextBox + + dup get-default-baseline + 1 index put-baseline + + 4 index + 1 index get-baseline add + 4 index + 2 index get-full-width sub % => MY MX Viewport This TextBox MY MX + 2 index + box-generic-move-to % => MY MX Viewport This TextBox + + 2 index exch + box-text-show + + pop pop pop pop } def \ No newline at end of file diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/box.ps b/thirdparty/html2ps_pdf/postscript/box.ps similarity index 97% rename from gulliver/thirdparty/html2ps_pdf/postscript/box.ps rename to thirdparty/html2ps_pdf/postscript/box.ps index 4a66949ef..d406a232c 100644 --- a/gulliver/thirdparty/html2ps_pdf/postscript/box.ps +++ b/thirdparty/html2ps_pdf/postscript/box.ps @@ -1,2 +1,2 @@ -% $Header: /cvsroot/html2ps/postscript/box.ps,v 1.1 2005/12/18 07:21:37 Konstantin Exp $ - +% $Header: /cvsroot/html2ps/postscript/box.ps,v 1.1 2005/12/18 07:21:37 Konstantin Exp $ + diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/box.radiobutton.ps b/thirdparty/html2ps_pdf/postscript/box.radiobutton.ps similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/postscript/box.radiobutton.ps rename to thirdparty/html2ps_pdf/postscript/box.radiobutton.ps diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/box.select.ps b/thirdparty/html2ps_pdf/postscript/box.select.ps similarity index 96% rename from gulliver/thirdparty/html2ps_pdf/postscript/box.select.ps rename to thirdparty/html2ps_pdf/postscript/box.select.ps index 1cb13041e..1a218f58a 100644 --- a/gulliver/thirdparty/html2ps_pdf/postscript/box.select.ps +++ b/thirdparty/html2ps_pdf/postscript/box.select.ps @@ -1,101 +1,101 @@ -% $Header: /cvsroot/html2ps/postscript/box.select.ps,v 1.1 2005/12/18 07:21:37 Konstantin Exp $ - -/box-select-button-triangle-padding 1.5 def - -/box-select-create { - box-container-create % => Box - dup box-select-setup-methods - dup /box-select add-type -} def - -/box-select-reflow { % => Context Parent This -% append to parent line box - dup 2 index box-container-append-line - -% Determine coordinates of upper-left _margin_ corner - 1 index 1 index box-generic-guess-corner - -% Determine the box width - 2 index 1 index /get-max-width call-method - 1 index put-full-width - - 2 index 1 index - box-container-reflow-content - - 2 index context-pop-collapsed-margin - 0 3 index - context-push-collapsed-margin % => Context Parent This - - dup get-content 0 get get-baseline - 1 index get-extra-top add - 1 index put-baseline % => Context Parent This - - dup get-baseline - 1 index put-default-baseline - -% Offset parent current X coordinate - 1 index get-current-x - 1 index get-full-width add - 2 index put-current-x - -% Extend parent height - dup get-bottom-margin - 2 index box-generic-extend-height - - pop pop pop -} def - -/box-select-setup-methods { % => Box - dup /Methods get - dup /reflow {box-select-reflow} put - dup /show {box-select-show} put - pop pop -} def - -/box-select-show { % => Viewport Box - 2 copy box-container-show - - dup get-height - 1 index get-padding-top add - 1 index get-padding-bottom add % => Viewport Box ButtonHeight - -% Show arrow button box - 0.93 0.93 0.93 setrgbcolor - 1 index get-right-padding - 1 index sub % => Viewport Box ButtonHeight X - 2 index get-bottom-padding % => Viewport Box ButtonHeight X Y - 2 index dup % => Viewport Box ButtonHeight X Y W H - rectfill % => Viewport Box ButtonHeight - -% Show box boundary - 0 0 0 setrgbcolor - 1 index get-right-padding - 1 index sub % => Viewport Box ButtonHeight X - 2 index get-bottom-padding % => Viewport Box ButtonHeight X Y - 2 index dup % => Viewport Box ButtonHeight X Y W H - rectstroke % => Viewport Box ButtonHeight - -% Show arrow - 0 0 0 setrgbcolor - - 1 index get-right-padding - box-select-button-triangle-padding sub - 2 index get-top-padding - box-select-button-triangle-padding sub moveto - - 1 index get-right-padding - 1 index sub - box-select-button-triangle-padding add - 2 index get-top-padding - box-select-button-triangle-padding sub lineto - - 1 index get-right-padding - 1 index 2 div sub - 2 index get-bottom-padding - box-select-button-triangle-padding add lineto - - closepath - fill - - pop pop pop -} def +% $Header: /cvsroot/html2ps/postscript/box.select.ps,v 1.1 2005/12/18 07:21:37 Konstantin Exp $ + +/box-select-button-triangle-padding 1.5 def + +/box-select-create { + box-container-create % => Box + dup box-select-setup-methods + dup /box-select add-type +} def + +/box-select-reflow { % => Context Parent This +% append to parent line box + dup 2 index box-container-append-line + +% Determine coordinates of upper-left _margin_ corner + 1 index 1 index box-generic-guess-corner + +% Determine the box width + 2 index 1 index /get-max-width call-method + 1 index put-full-width + + 2 index 1 index + box-container-reflow-content + + 2 index context-pop-collapsed-margin + 0 3 index + context-push-collapsed-margin % => Context Parent This + + dup get-content 0 get get-baseline + 1 index get-extra-top add + 1 index put-baseline % => Context Parent This + + dup get-baseline + 1 index put-default-baseline + +% Offset parent current X coordinate + 1 index get-current-x + 1 index get-full-width add + 2 index put-current-x + +% Extend parent height + dup get-bottom-margin + 2 index box-generic-extend-height + + pop pop pop +} def + +/box-select-setup-methods { % => Box + dup /Methods get + dup /reflow {box-select-reflow} put + dup /show {box-select-show} put + pop pop +} def + +/box-select-show { % => Viewport Box + 2 copy box-container-show + + dup get-height + 1 index get-padding-top add + 1 index get-padding-bottom add % => Viewport Box ButtonHeight + +% Show arrow button box + 0.93 0.93 0.93 setrgbcolor + 1 index get-right-padding + 1 index sub % => Viewport Box ButtonHeight X + 2 index get-bottom-padding % => Viewport Box ButtonHeight X Y + 2 index dup % => Viewport Box ButtonHeight X Y W H + rectfill % => Viewport Box ButtonHeight + +% Show box boundary + 0 0 0 setrgbcolor + 1 index get-right-padding + 1 index sub % => Viewport Box ButtonHeight X + 2 index get-bottom-padding % => Viewport Box ButtonHeight X Y + 2 index dup % => Viewport Box ButtonHeight X Y W H + rectstroke % => Viewport Box ButtonHeight + +% Show arrow + 0 0 0 setrgbcolor + + 1 index get-right-padding + box-select-button-triangle-padding sub + 2 index get-top-padding + box-select-button-triangle-padding sub moveto + + 1 index get-right-padding + 1 index sub + box-select-button-triangle-padding add + 2 index get-top-padding + box-select-button-triangle-padding sub lineto + + 1 index get-right-padding + 1 index 2 div sub + 2 index get-bottom-padding + box-select-button-triangle-padding add lineto + + closepath + fill + + pop pop pop +} def diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/box.span.ps b/thirdparty/html2ps_pdf/postscript/box.span.ps similarity index 97% rename from gulliver/thirdparty/html2ps_pdf/postscript/box.span.ps rename to thirdparty/html2ps_pdf/postscript/box.span.ps index 08727d559..3738b7985 100644 --- a/gulliver/thirdparty/html2ps_pdf/postscript/box.span.ps +++ b/thirdparty/html2ps_pdf/postscript/box.span.ps @@ -1,2 +1,2 @@ -% $Header: /cvsroot/html2ps/postscript/box.span.ps,v 1.1 2005/12/18 07:21:37 Konstantin Exp $ - +% $Header: /cvsroot/html2ps/postscript/box.span.ps,v 1.1 2005/12/18 07:21:37 Konstantin Exp $ + diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/box.table.cell.fake.ps b/thirdparty/html2ps_pdf/postscript/box.table.cell.fake.ps similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/postscript/box.table.cell.fake.ps rename to thirdparty/html2ps_pdf/postscript/box.table.cell.fake.ps diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/box.table.cell.ps b/thirdparty/html2ps_pdf/postscript/box.table.cell.ps similarity index 96% rename from gulliver/thirdparty/html2ps_pdf/postscript/box.table.cell.ps rename to thirdparty/html2ps_pdf/postscript/box.table.cell.ps index 841794d79..14e107fc9 100644 --- a/gulliver/thirdparty/html2ps_pdf/postscript/box.table.cell.ps +++ b/thirdparty/html2ps_pdf/postscript/box.table.cell.ps @@ -1,166 +1,166 @@ -% $Header: /cvsroot/html2ps/postscript/box.table.cell.ps,v 1.1 2005/12/18 07:21:37 Konstantin Exp $ - -/box-table-cell-apply-vertical-align { % => Baseline Height Cell - dup /vertical-align - get-css-value % => Baseline Height Cell Valign - { % => Baseline Height Cell Valign - dup /baseline eq { - pop % => Baseline Height Cell - - 2 index - 1 index box-table-cell-get-baseline - sub % => Baseline Height Cell Delta - - 1 index get-top % => Baseline Height Cell Delta OldTop - 1 index neg - 0 - 4 index /offset call-method % => Baseline Height Cell Delta OldTop - 2 index put-top % => Baseline Height Cell Delta - - pop - - exit - } if - dup /bottom eq { - pop % => Baseline Height Cell - - 1 index - 1 index box-container-get-real-full-height - sub % => Baseline Height Cell Delta - - 1 index get-top % => Baseline Height Cell Delta OldTop - - 1 index neg 0 - 4 index - /offset call-method % => Baseline Height Cell Delta OldTop - - 2 index put-top % => Baseline Height Cell Delta - pop - exit - } if - dup /middle eq { - pop % => Baseline Height Cell - - 1 index - 1 index box-container-get-real-full-height - sub 2 div - 0 max % => Baseline Height Cell Delta - - 1 index get-top % => Baseline Height Cell Delta OldTop - - 1 index neg 0 - 4 index - /offset call-method % => Baseline Height Cell Delta OldTop - - 2 index put-top % => Baseline Height Cell Delta - pop - exit - } if - dup /super eq { pop exit } if - dup /sub eq { pop exit } if - dup /text-top eq { pop exit } if - dup /text-bottom eq { - pop % => Baseline Height Cell - - 2 index - 1 index box-table-cell-get-baseline - sub % => Baseline Height Cell Delta - - 1 index get-top % => Baseline Height Cell Delta OldTop - 1 index neg - 0 - 4 index /offset call-method % => Baseline Height Cell Delta OldTop - 2 index put-top % => Baseline Height Cell Delta - - pop - - exit - } if - dup /top eq { pop exit } if - pop exit - } loop - - pop pop pop -} def - -/box-table-cell-create { - box-container-create - dup box-table-cell-setup-methods - dup /box-table-cell add-type - - dup /Colspan 1 put - dup /Rowspan 1 put - dup /column 0 put - dup /row 0 put -} def - -/box-table-cell-get-baseline { % => Cell - dup box-container-get-first-data % => Cell First - dup /null eq { - pop pop 0 - } { - get-baseline exch pop - } ifelse -} def - -/box-table-cell-get-colspan { - /Colspan get -} def - -/box-table-cell-get-rowspan { - /Rowspan get -} def - -/box-table-cell-put-colspan { - exch /Colspan exch put -} def - -/box-table-cell-put-rowspan { - exch /Rowspan exch put -} def - -/box-table-cell-reflow { % => Context Parent Cell -% Determine upper-left _content_ corner position of current box - 1 index get-current-x - 1 index get-extra-left add - 1 index put-left % => Content Parent Cell - -% NOTE: Table cell margin is used as a cell-spacing value - 1 index get-current-y - 1 index get-border-top-width sub - 1 index get-padding-top sub - 1 index put-top % => Content Parent Cell - -% CSS 2.1: -% Floats, absolutely positioned elements, inline-blocks, table-cells, and elements with 'overflow' other than -% 'visible' establish new block formatting contexts. - 2 index context-push - dup get-uid - 3 index context-push-container-uid - -% Reflow cell content - 2 index 1 index - box-container-reflow-content % => Content Parent Cell - -% Extend the table cell height to fit all contained floats -% Determine the bottom edge corrdinate of the bottommost float - 2 index context-float-bottom % => Content Parent Cell FloatBottom - dup /null ne { - 1 index box-generic-extend-height - } { - pop - } ifelse % => Content Parent Cell - -% Restore old context - 2 index context-pop-container-uid - 2 index context-pop - - pop pop pop -} def - -/box-table-cell-setup-methods { - dup /Methods get - dup /reflow {box-table-cell-reflow} put - pop pop -} def - +% $Header: /cvsroot/html2ps/postscript/box.table.cell.ps,v 1.1 2005/12/18 07:21:37 Konstantin Exp $ + +/box-table-cell-apply-vertical-align { % => Baseline Height Cell + dup /vertical-align + get-css-value % => Baseline Height Cell Valign + { % => Baseline Height Cell Valign + dup /baseline eq { + pop % => Baseline Height Cell + + 2 index + 1 index box-table-cell-get-baseline + sub % => Baseline Height Cell Delta + + 1 index get-top % => Baseline Height Cell Delta OldTop + 1 index neg + 0 + 4 index /offset call-method % => Baseline Height Cell Delta OldTop + 2 index put-top % => Baseline Height Cell Delta + + pop + + exit + } if + dup /bottom eq { + pop % => Baseline Height Cell + + 1 index + 1 index box-container-get-real-full-height + sub % => Baseline Height Cell Delta + + 1 index get-top % => Baseline Height Cell Delta OldTop + + 1 index neg 0 + 4 index + /offset call-method % => Baseline Height Cell Delta OldTop + + 2 index put-top % => Baseline Height Cell Delta + pop + exit + } if + dup /middle eq { + pop % => Baseline Height Cell + + 1 index + 1 index box-container-get-real-full-height + sub 2 div + 0 max % => Baseline Height Cell Delta + + 1 index get-top % => Baseline Height Cell Delta OldTop + + 1 index neg 0 + 4 index + /offset call-method % => Baseline Height Cell Delta OldTop + + 2 index put-top % => Baseline Height Cell Delta + pop + exit + } if + dup /super eq { pop exit } if + dup /sub eq { pop exit } if + dup /text-top eq { pop exit } if + dup /text-bottom eq { + pop % => Baseline Height Cell + + 2 index + 1 index box-table-cell-get-baseline + sub % => Baseline Height Cell Delta + + 1 index get-top % => Baseline Height Cell Delta OldTop + 1 index neg + 0 + 4 index /offset call-method % => Baseline Height Cell Delta OldTop + 2 index put-top % => Baseline Height Cell Delta + + pop + + exit + } if + dup /top eq { pop exit } if + pop exit + } loop + + pop pop pop +} def + +/box-table-cell-create { + box-container-create + dup box-table-cell-setup-methods + dup /box-table-cell add-type + + dup /Colspan 1 put + dup /Rowspan 1 put + dup /column 0 put + dup /row 0 put +} def + +/box-table-cell-get-baseline { % => Cell + dup box-container-get-first-data % => Cell First + dup /null eq { + pop pop 0 + } { + get-baseline exch pop + } ifelse +} def + +/box-table-cell-get-colspan { + /Colspan get +} def + +/box-table-cell-get-rowspan { + /Rowspan get +} def + +/box-table-cell-put-colspan { + exch /Colspan exch put +} def + +/box-table-cell-put-rowspan { + exch /Rowspan exch put +} def + +/box-table-cell-reflow { % => Context Parent Cell +% Determine upper-left _content_ corner position of current box + 1 index get-current-x + 1 index get-extra-left add + 1 index put-left % => Content Parent Cell + +% NOTE: Table cell margin is used as a cell-spacing value + 1 index get-current-y + 1 index get-border-top-width sub + 1 index get-padding-top sub + 1 index put-top % => Content Parent Cell + +% CSS 2.1: +% Floats, absolutely positioned elements, inline-blocks, table-cells, and elements with 'overflow' other than +% 'visible' establish new block formatting contexts. + 2 index context-push + dup get-uid + 3 index context-push-container-uid + +% Reflow cell content + 2 index 1 index + box-container-reflow-content % => Content Parent Cell + +% Extend the table cell height to fit all contained floats +% Determine the bottom edge corrdinate of the bottommost float + 2 index context-float-bottom % => Content Parent Cell FloatBottom + dup /null ne { + 1 index box-generic-extend-height + } { + pop + } ifelse % => Content Parent Cell + +% Restore old context + 2 index context-pop-container-uid + 2 index context-pop + + pop pop pop +} def + +/box-table-cell-setup-methods { + dup /Methods get + dup /reflow {box-table-cell-reflow} put + pop pop +} def + diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/box.table.ps b/thirdparty/html2ps_pdf/postscript/box.table.ps similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/postscript/box.table.ps rename to thirdparty/html2ps_pdf/postscript/box.table.ps diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/box.table.row.ps b/thirdparty/html2ps_pdf/postscript/box.table.row.ps similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/postscript/box.table.row.ps rename to thirdparty/html2ps_pdf/postscript/box.table.row.ps diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/box.text.ps b/thirdparty/html2ps_pdf/postscript/box.text.ps similarity index 96% rename from gulliver/thirdparty/html2ps_pdf/postscript/box.text.ps rename to thirdparty/html2ps_pdf/postscript/box.text.ps index 8535426fb..7f54b66e0 100644 --- a/gulliver/thirdparty/html2ps_pdf/postscript/box.text.ps +++ b/thirdparty/html2ps_pdf/postscript/box.text.ps @@ -1,379 +1,379 @@ -% $Header: /cvsroot/html2ps/postscript/box.text.ps,v 1.1 2005/12/18 07:21:37 Konstantin Exp $ - -/box-text-create { % => - box-generic-inline-create - -% setup box-specific properties - dup /Text () put - dup /Encoding ISOLatin1Encoding put - -% setup inherited method references - dup box-text-setup-methods - dup /box-text add-type -} def - -/box-text-draw-overline { % => Text Box - newpath - -% Get the thickness of the font underline - 0 - currentfont - font-underline-thick % => Text Box UThick - setlinewidth % => Text Box - -% Get the position of the font underline - currentfont - font-overline-pos % => Text Box UPos - - 1 index get-left - 2 index get-top - 3 index get-default-baseline - sub % => Text Box UPos X Y' -% Note that UPos is negative - 2 index add % => Text Box UPos X Y' - - moveto - - 1 index /get-width call-method - 0 - rlineto - stroke % => Text Box UPos - - pop pop pop -} def - -/box-text-draw-line-through { % => Text Box - newpath - -% Get the line thickness - 0 - currentfont - font-underline-thick % => Text Box UThick - setlinewidth % => Text Box - -% Get the position of the font underline - currentfont - font-line-through-pos % => Text Box UPos - - 1 index get-left - 2 index get-top - 3 index get-default-baseline - sub % => Text Box UPos X Y' -% Note that UPos is negative - 2 index add % => Text Box UPos X Y' - - moveto - - 1 index /get-width call-method - 0 - rlineto - stroke % => Text Box UPos - - pop pop pop -} def - -/box-text-draw-underline { % => Text Box - newpath - -% Get the line thickness - 0 - currentfont - font-underline-thick % => Text Box UThick - setlinewidth % => Text Box - -% Get the position of the font underline - currentfont - font-underline-pos % => Text Box UPos - - 1 index get-left - 2 index get-top - 3 index get-default-baseline - sub % => Text Box UPos X Y' -% Note that UPos is negative - 2 index add % => Text Box UPos X Y' - - moveto - - 1 index /get-width call-method - 0 - rlineto - stroke % => Text Box UPos - - pop pop pop -} def - -/box-text-find-font { % => Box - dup /font-size get-css-value - - 1 index - /font-family get-css-value % => Box FontSize FontFamily - exch scalefont % => Box <> - - exch pop % => <> -} def - -/box-text-get-min-width { % => Context This - dup get-full-width - exch pop - exch pop -} def - -/box-text-get-max-width { % => Context This - dup get-full-width - exch pop - exch pop -} def - -/box-text-reflow { % => Context Parent This -% Check if we need a line break here (possilble several times in a row, if we -% have a long word and a floating box intersecting with this word - -% To prevent infinite loop, we'll use a limit of 100 sequental line feeds - - 0 % => Content Parent This 0(LFs) - { - 1 add % => Context Parent This LFs' - - 3 index - 3 index - 3 index - /maybe-line-break - call-method % => Context Parent This LFs Flag - - 1 index 100 ge - or { - exit - } if - } loop % => Context Parent This LFs - pop % => Context Parent This - -% Determine the baseline position and height of the text-box using line-height CSS property - dup box-generic-apply-line-height - -% set default baseline - dup get-default-baseline - 1 index put-baseline - -% append current box to parent line box - dup 2 index - box-container-append-line % => Context Parent This - -% Determine coordinates of upper-left _margin_ corner - 1 index 1 index - box-generic-guess-corner % => Context Parent This - -% Offset parent current X coordinate - dup get-full-width - 2 index get-current-x - add % => Context Parent This CX' - 2 index put-current-x % => Context Parent This - -% Extends parents height - dup get-bottom-margin % => Context Parent This BM - 2 index - box-generic-extend-height % => Context Parent This - -% Update the value of current collapsed margin; pure text (non-span) -% boxes always have zero margin - - 2 index context-pop-collapsed-margin - 0 3 index context-push-collapsed-margin - -% Clear the stack - pop pop pop -} def - -/box-text-setup { % => Box -% select the font used to render current text box - dup box-text-find-font % => Box <> - - dup font-ascender % => Box <> Ascender - 1 index font-descender % => Box <> Ascender Descender - - 3 2 roll - setfont % => Box Ascender Descender - - 1 index 3 index put-default-baseline - - add -% 1 index /font-size get-css-value min - 1 index put-height % => Box - -% determine the width of the current text box - dup get-text stringwidth % => Box SX __ - pop % => Box SX - 1 index put-width % => Box - - pop -} def - -/box-text-setup-methods { % => Box -% Setup method references - dup get-box-dict /Methods get % => Box Methods - dup /get-min-width {box-text-get-min-width} put - dup /get-max-width {box-text-get-max-width} put - dup /reflow {box-text-reflow} put - dup /show {box-text-show} put - pop pop -} def - -/box-text-show { % => Viewport Box -% Check if current text box will be cut-off by the page edge -% Get Y coordinate of the top edge of the box - dup get-top-margin % => Viewport Box Top - -% Get Y coordinate of the bottom edge of the box - 1 index get-bottom-margin % => Viewport Box Top Bottom - - 1 index - 4 index viewport-get-bottom - gt % => Viewport Box Top Bottom TopInside - - 1 index - 5 index viewport-get-bottom - gt % => Viewport Box Top Bottom TopInside BottomInside - - 2 copy - not and % => Viewport Box Top Bottom TopInside BottomInside TopInside&&!BottomInside - { % => Viewport Box Top Bottom TopInside BottomInside -% If yes, do not draw current text box at all; add an required value -% to the viewport page offset to make the text box fully visible on the next page - 5 index - viewport-get-offset-delta % => Viewport Box Top Bottom TopInside BottomInside OD - - 4 index - 7 index viewport-get-bottom - sub % => Viewport Box Top Bottom TopInside BottomInside OD ODNew - max % => Viewport Box Top Bottom TopInside BottomInside OD' - - 6 index - viewport-put-offset-delta % => Viewport Box Top Bottom TopInside BottomInside - - pop pop - } { % => Viewport Box Top Bottom TopInside BottomInside - or not { % => Viewport Box Top Bottom - } { % => Viewport Box Top Bottom -% draw generic box - 3 index 3 index - box-generic-show - - 2 index get-left - 3 index get-top - 4 index get-default-baseline - sub - moveto - - 2 index get-text % => Viewport Box Top Bottom Text - - 3 index - box-text-find-font % => Viewport Box Top Bottom Text <> - setfont - show % => Viewport Box Top Bottom - -% draw text decoration - 2 index /text-decoration get-css-value - 3 index get-text % => Viewport Box Top Bottom Decoration Text -% underline - 1 index /underline get { % => Viewport Box Top Bottom Decoration Text - dup - 5 index % => Viewport Box Top Bottom Decoration Text Text Box - box-text-draw-underline % => Viewport Box Top Bottom Decoration Text - } if - -% overline - 1 index /overline get { % => Viewport Box Top Bottom Decoration Text - dup - 5 index % => Viewport Box Top Bottom Decoration Text Text Box - box-text-draw-overline % => Viewport Box Top Bottom Decoration Text - } if - -% line-through - 1 index /line-through get { % => Viewport Box Top Bottom Decoration Text - dup - 5 index % => Viewport Box Top Bottom Decoration Text Text Box - box-text-draw-line-through % => Viewport Box Top Bottom Decoration Text - } if - - pop pop - } ifelse - } ifelse % => Viewport Box Top Bottom - - pop pop pop pop -} def - -/get-encoding { - /Encoding get -} def - -/get-text { % => Box - /Text get -} def - -/put-encoding { % => Encoding Box - exch - /Encoding - exch - put -} def - -/put-text { % => Text Box - exch - /Text - exch - put -} def - -%%%%%%%%%%%%%%%%%%%% - -/show-enc-text-box { -% Check if this box will be cut on the bottom edge of the page (i.e. bottom < 0) - dup get-bottom bmargin gt { - show-enc-text-box-force - } { -% do not display this box; also, store the additional offset to show this text on the next page - /vdelta vdelta 2 index get-top bmargin sub max def - pop - } ifelse -} def - -/show-enc-text-box-force { % => Box - show-generic-box % => Box - currentpoint - 2 index get-content % => Box X Y Content - aload pop - show-enc-text - moveto - - dup get-text-decoration % => Box Decor - dup /Underline known { - currentpoint - 3 index get-content % => Box Decor X Y [Text <>] - aload pop pop - draw-underline - moveto - } if - - dup /Overline known { - currentpoint - 3 index get-content - aload pop pop - draw-overline - moveto - } if - - dup /Line-Through known { - currentpoint - 3 index get-content - aload pop pop - draw-line-through - moveto - } if - - pop % => Box - -} def - -/show-enc-text { % => Text <> - setfont % => Text - show % => -} def +% $Header: /cvsroot/html2ps/postscript/box.text.ps,v 1.1 2005/12/18 07:21:37 Konstantin Exp $ + +/box-text-create { % => + box-generic-inline-create + +% setup box-specific properties + dup /Text () put + dup /Encoding ISOLatin1Encoding put + +% setup inherited method references + dup box-text-setup-methods + dup /box-text add-type +} def + +/box-text-draw-overline { % => Text Box + newpath + +% Get the thickness of the font underline + 0 + currentfont + font-underline-thick % => Text Box UThick + setlinewidth % => Text Box + +% Get the position of the font underline + currentfont + font-overline-pos % => Text Box UPos + + 1 index get-left + 2 index get-top + 3 index get-default-baseline + sub % => Text Box UPos X Y' +% Note that UPos is negative + 2 index add % => Text Box UPos X Y' + + moveto + + 1 index /get-width call-method + 0 + rlineto + stroke % => Text Box UPos + + pop pop pop +} def + +/box-text-draw-line-through { % => Text Box + newpath + +% Get the line thickness + 0 + currentfont + font-underline-thick % => Text Box UThick + setlinewidth % => Text Box + +% Get the position of the font underline + currentfont + font-line-through-pos % => Text Box UPos + + 1 index get-left + 2 index get-top + 3 index get-default-baseline + sub % => Text Box UPos X Y' +% Note that UPos is negative + 2 index add % => Text Box UPos X Y' + + moveto + + 1 index /get-width call-method + 0 + rlineto + stroke % => Text Box UPos + + pop pop pop +} def + +/box-text-draw-underline { % => Text Box + newpath + +% Get the line thickness + 0 + currentfont + font-underline-thick % => Text Box UThick + setlinewidth % => Text Box + +% Get the position of the font underline + currentfont + font-underline-pos % => Text Box UPos + + 1 index get-left + 2 index get-top + 3 index get-default-baseline + sub % => Text Box UPos X Y' +% Note that UPos is negative + 2 index add % => Text Box UPos X Y' + + moveto + + 1 index /get-width call-method + 0 + rlineto + stroke % => Text Box UPos + + pop pop pop +} def + +/box-text-find-font { % => Box + dup /font-size get-css-value + + 1 index + /font-family get-css-value % => Box FontSize FontFamily + exch scalefont % => Box <> + + exch pop % => <> +} def + +/box-text-get-min-width { % => Context This + dup get-full-width + exch pop + exch pop +} def + +/box-text-get-max-width { % => Context This + dup get-full-width + exch pop + exch pop +} def + +/box-text-reflow { % => Context Parent This +% Check if we need a line break here (possilble several times in a row, if we +% have a long word and a floating box intersecting with this word + +% To prevent infinite loop, we'll use a limit of 100 sequental line feeds + + 0 % => Content Parent This 0(LFs) + { + 1 add % => Context Parent This LFs' + + 3 index + 3 index + 3 index + /maybe-line-break + call-method % => Context Parent This LFs Flag + + 1 index 100 ge + or { + exit + } if + } loop % => Context Parent This LFs + pop % => Context Parent This + +% Determine the baseline position and height of the text-box using line-height CSS property + dup box-generic-apply-line-height + +% set default baseline + dup get-default-baseline + 1 index put-baseline + +% append current box to parent line box + dup 2 index + box-container-append-line % => Context Parent This + +% Determine coordinates of upper-left _margin_ corner + 1 index 1 index + box-generic-guess-corner % => Context Parent This + +% Offset parent current X coordinate + dup get-full-width + 2 index get-current-x + add % => Context Parent This CX' + 2 index put-current-x % => Context Parent This + +% Extends parents height + dup get-bottom-margin % => Context Parent This BM + 2 index + box-generic-extend-height % => Context Parent This + +% Update the value of current collapsed margin; pure text (non-span) +% boxes always have zero margin + + 2 index context-pop-collapsed-margin + 0 3 index context-push-collapsed-margin + +% Clear the stack + pop pop pop +} def + +/box-text-setup { % => Box +% select the font used to render current text box + dup box-text-find-font % => Box <> + + dup font-ascender % => Box <> Ascender + 1 index font-descender % => Box <> Ascender Descender + + 3 2 roll + setfont % => Box Ascender Descender + + 1 index 3 index put-default-baseline + + add +% 1 index /font-size get-css-value min + 1 index put-height % => Box + +% determine the width of the current text box + dup get-text stringwidth % => Box SX __ + pop % => Box SX + 1 index put-width % => Box + + pop +} def + +/box-text-setup-methods { % => Box +% Setup method references + dup get-box-dict /Methods get % => Box Methods + dup /get-min-width {box-text-get-min-width} put + dup /get-max-width {box-text-get-max-width} put + dup /reflow {box-text-reflow} put + dup /show {box-text-show} put + pop pop +} def + +/box-text-show { % => Viewport Box +% Check if current text box will be cut-off by the page edge +% Get Y coordinate of the top edge of the box + dup get-top-margin % => Viewport Box Top + +% Get Y coordinate of the bottom edge of the box + 1 index get-bottom-margin % => Viewport Box Top Bottom + + 1 index + 4 index viewport-get-bottom + gt % => Viewport Box Top Bottom TopInside + + 1 index + 5 index viewport-get-bottom + gt % => Viewport Box Top Bottom TopInside BottomInside + + 2 copy + not and % => Viewport Box Top Bottom TopInside BottomInside TopInside&&!BottomInside + { % => Viewport Box Top Bottom TopInside BottomInside +% If yes, do not draw current text box at all; add an required value +% to the viewport page offset to make the text box fully visible on the next page + 5 index + viewport-get-offset-delta % => Viewport Box Top Bottom TopInside BottomInside OD + + 4 index + 7 index viewport-get-bottom + sub % => Viewport Box Top Bottom TopInside BottomInside OD ODNew + max % => Viewport Box Top Bottom TopInside BottomInside OD' + + 6 index + viewport-put-offset-delta % => Viewport Box Top Bottom TopInside BottomInside + + pop pop + } { % => Viewport Box Top Bottom TopInside BottomInside + or not { % => Viewport Box Top Bottom + } { % => Viewport Box Top Bottom +% draw generic box + 3 index 3 index + box-generic-show + + 2 index get-left + 3 index get-top + 4 index get-default-baseline + sub + moveto + + 2 index get-text % => Viewport Box Top Bottom Text + + 3 index + box-text-find-font % => Viewport Box Top Bottom Text <> + setfont + show % => Viewport Box Top Bottom + +% draw text decoration + 2 index /text-decoration get-css-value + 3 index get-text % => Viewport Box Top Bottom Decoration Text +% underline + 1 index /underline get { % => Viewport Box Top Bottom Decoration Text + dup + 5 index % => Viewport Box Top Bottom Decoration Text Text Box + box-text-draw-underline % => Viewport Box Top Bottom Decoration Text + } if + +% overline + 1 index /overline get { % => Viewport Box Top Bottom Decoration Text + dup + 5 index % => Viewport Box Top Bottom Decoration Text Text Box + box-text-draw-overline % => Viewport Box Top Bottom Decoration Text + } if + +% line-through + 1 index /line-through get { % => Viewport Box Top Bottom Decoration Text + dup + 5 index % => Viewport Box Top Bottom Decoration Text Text Box + box-text-draw-line-through % => Viewport Box Top Bottom Decoration Text + } if + + pop pop + } ifelse + } ifelse % => Viewport Box Top Bottom + + pop pop pop pop +} def + +/get-encoding { + /Encoding get +} def + +/get-text { % => Box + /Text get +} def + +/put-encoding { % => Encoding Box + exch + /Encoding + exch + put +} def + +/put-text { % => Text Box + exch + /Text + exch + put +} def + +%%%%%%%%%%%%%%%%%%%% + +/show-enc-text-box { +% Check if this box will be cut on the bottom edge of the page (i.e. bottom < 0) + dup get-bottom bmargin gt { + show-enc-text-box-force + } { +% do not display this box; also, store the additional offset to show this text on the next page + /vdelta vdelta 2 index get-top bmargin sub max def + pop + } ifelse +} def + +/show-enc-text-box-force { % => Box + show-generic-box % => Box + currentpoint + 2 index get-content % => Box X Y Content + aload pop + show-enc-text + moveto + + dup get-text-decoration % => Box Decor + dup /Underline known { + currentpoint + 3 index get-content % => Box Decor X Y [Text <>] + aload pop pop + draw-underline + moveto + } if + + dup /Overline known { + currentpoint + 3 index get-content + aload pop pop + draw-overline + moveto + } if + + dup /Line-Through known { + currentpoint + 3 index get-content + aload pop pop + draw-line-through + moveto + } if + + pop % => Box + +} def + +/show-enc-text { % => Text <> + setfont % => Text + show % => +} def diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/box.whitespace.ps b/thirdparty/html2ps_pdf/postscript/box.whitespace.ps similarity index 97% rename from gulliver/thirdparty/html2ps_pdf/postscript/box.whitespace.ps rename to thirdparty/html2ps_pdf/postscript/box.whitespace.ps index 1132ceae6..b9aca483a 100644 --- a/gulliver/thirdparty/html2ps_pdf/postscript/box.whitespace.ps +++ b/thirdparty/html2ps_pdf/postscript/box.whitespace.ps @@ -1,74 +1,74 @@ -/box-whitespace-create { % => - box-text-create - - dup get-box-dict - /Methods get - dup /reflow {box-whitespace-reflow} put - dup /is-whitespace {box-whitespace-is-whitespace} put - pop - - dup /box-whitespace add-type - - ( ) 1 index put-text -} def - -/box-whitespace-is-whitespace { % => Box - pop true -} def - -/box-whitespace-reflow { % => Context Parent Box -% Check if there are any boxes in parent's line box - 1 index % => Context Parent Box Parent - box-container-line-box-empty { % => Context Parent Box -% The very first whitespace in the line box should not affect neither height nor baseline of the line box; -% because following boxes can be smaller that assumed whitespace height -% Example:
      [whitespace]
      ; whitespace can overextend this line - 0 1 index put-height - 0 1 index put-width - 0 1 index put-default-baseline - } { % => Context Parent Box -% Duplicate whitespace boxes should not offset further content and affect the line box length - 1 index - get-line % => Context Parent Box Line - array-last - /box-whitespace is-a { % => Context Parent Box - 0 1 index put-height - 0 1 index put-width - 0 1 index put-default-baseline - } if - } ifelse - -% Determine the baseline position and height of the text-box using line-height CSS property - dup box-generic-apply-line-height - -% set default baseline - dup get-default-baseline - 1 index put-baseline - -% append current box to parent line box - dup 2 index - box-container-append-line % => Context Parent This - -% Determine coordinates of upper-left _margin_ corner - 1 index 1 index - box-generic-guess-corner % => Context Parent This - -% Offset parent current X coordinate - dup get-full-width - 2 index get-current-x - add % => Context Parent This CX' - 2 index put-current-x % => Context Parent This - -% Extends parents height - dup get-bottom-margin % => Context Parent This BM - 2 index - box-generic-extend-height % => Context Parent This - -% Update the value of current collapsed margin; pure text (non-span) -% boxes always have zero margin - - 2 index context-pop-collapsed-margin - 0 3 index context-push-collapsed-margin - - pop pop pop +/box-whitespace-create { % => + box-text-create + + dup get-box-dict + /Methods get + dup /reflow {box-whitespace-reflow} put + dup /is-whitespace {box-whitespace-is-whitespace} put + pop + + dup /box-whitespace add-type + + ( ) 1 index put-text +} def + +/box-whitespace-is-whitespace { % => Box + pop true +} def + +/box-whitespace-reflow { % => Context Parent Box +% Check if there are any boxes in parent's line box + 1 index % => Context Parent Box Parent + box-container-line-box-empty { % => Context Parent Box +% The very first whitespace in the line box should not affect neither height nor baseline of the line box; +% because following boxes can be smaller that assumed whitespace height +% Example:
      [whitespace]
      ; whitespace can overextend this line + 0 1 index put-height + 0 1 index put-width + 0 1 index put-default-baseline + } { % => Context Parent Box +% Duplicate whitespace boxes should not offset further content and affect the line box length + 1 index + get-line % => Context Parent Box Line + array-last + /box-whitespace is-a { % => Context Parent Box + 0 1 index put-height + 0 1 index put-width + 0 1 index put-default-baseline + } if + } ifelse + +% Determine the baseline position and height of the text-box using line-height CSS property + dup box-generic-apply-line-height + +% set default baseline + dup get-default-baseline + 1 index put-baseline + +% append current box to parent line box + dup 2 index + box-container-append-line % => Context Parent This + +% Determine coordinates of upper-left _margin_ corner + 1 index 1 index + box-generic-guess-corner % => Context Parent This + +% Offset parent current X coordinate + dup get-full-width + 2 index get-current-x + add % => Context Parent This CX' + 2 index put-current-x % => Context Parent This + +% Extends parents height + dup get-bottom-margin % => Context Parent This BM + 2 index + box-generic-extend-height % => Context Parent This + +% Update the value of current collapsed margin; pure text (non-span) +% boxes always have zero margin + + 2 index context-pop-collapsed-margin + 0 3 index context-push-collapsed-margin + + pop pop pop } def \ No newline at end of file diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/cellspan.ps b/thirdparty/html2ps_pdf/postscript/cellspan.ps similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/postscript/cellspan.ps rename to thirdparty/html2ps_pdf/postscript/cellspan.ps diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/class.ps b/thirdparty/html2ps_pdf/postscript/class.ps similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/postscript/class.ps rename to thirdparty/html2ps_pdf/postscript/class.ps diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/color.ps b/thirdparty/html2ps_pdf/postscript/color.ps similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/postscript/color.ps rename to thirdparty/html2ps_pdf/postscript/color.ps diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/containing_block.ps b/thirdparty/html2ps_pdf/postscript/containing_block.ps similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/postscript/containing_block.ps rename to thirdparty/html2ps_pdf/postscript/containing_block.ps diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/context.ps b/thirdparty/html2ps_pdf/postscript/context.ps similarity index 97% rename from gulliver/thirdparty/html2ps_pdf/postscript/context.ps rename to thirdparty/html2ps_pdf/postscript/context.ps index 6f44e4437..f9c2d2ec0 100644 --- a/gulliver/thirdparty/html2ps_pdf/postscript/context.ps +++ b/thirdparty/html2ps_pdf/postscript/context.ps @@ -1,472 +1,472 @@ -% Definition of float context "class" - -/context-add-absolute-positioned { % => Box Context - dup /AbsolutePositioned get % => Box Context AB - 2 index exch - array-prepend % => Box Context AB' - /AbsolutePositioned exch put % => Box - pop -} def - -/context-add-fixed-positioned { % => Box Context - dup /FixedPositioned get % => Box Context AB - 2 index exch - array-prepend % => Box Context AB' - /FixedPositioned exch put % => Box - pop -} def - -/context-add-float { % => Float Context - dup /Floats get % => Float Context Floats - dup 0 get % => Float Context Floats Floats[0] - 3 index exch array-prepend % => Float Context Floats Floats[0]' - 0 exch put % => Float Context - pop pop -} def - -/context-container-uid { % => Context - /ContainerUID get 0 get -} def - -/context-create { % => - << - /ContainerUID [1] - /AbsolutePositioned [] - /FixedPositioned [] - /Floats [[]] - /Margin [0 0] - /Viewport [] - >> -} def - -% Find the minimal X at the given Y coordinate suitable for float placement -% -/context-float-left-x { % => Y X Context - 3 copy dup - context-floats % => Y X Context Y X Context Floats - context-float-left-x-rec % => Y X Context X - -% Clear the stack - exch pop - exch pop - exch pop -} def - -/context-float-left-x-rec { % => Y X Context Floats - dup length 0 gt { - dup 0 get % => Y X Context Floats Float - - dup /float get-css-value - /left eq { - -% Check if this float contains given Y-coordinate -% -% Note that top margin coordinate is inclusive but -% bottom margin coordinate is exclusive! The cause is following: -% - if we have several floats in one line, their top margin edge Y coordinates will be equal, -% so we must use agreater or equal sign to avod placing all floats at one X coordinate -% - on the other side, if we place one float under the other, the top margin Y coordinate -% of bottom float will be equal to bottom margin Y coordinate of the top float and -% we should NOT offset tho bottom float in this case - - dup get-top-margin % => Y X Context Floats Float FTM - rounding-epsilon add - 5 index % => Y X Context Floats Float FTM Y - ge % => Y X Context Floats Float FTM>=Y - - 1 index get-bottom-margin % => Y X Context Floats Float FTM>=Y FBM - 6 index % => Y X Context Floats Float FTM>=Y FBM Y - lt % => Y X Context Floats Float FTM>=Y FBM Y X Context Floats Float - dup get-right-margin % => Y X Context Floats Float FRM - 4 index max % => Y X Context Floats Float X'=MAX(FRM,X) - exch pop % => Y X Context Floats X' - 4 3 roll pop % => Y Context Floats X' - 3 1 roll % => Y X' Context Floats - array-pop-first - context-float-left-x-rec % => X - } { - pop - array-pop-first - context-float-left-x-rec - } ifelse - } { - pop - array-pop-first - context-float-left-x-rec - } ifelse - } { -% no more floats - pop pop exch pop - } ifelse -} def % => X - -% Calculates position of left floating box (taking into account the possibility -% of "wrapping" float to next line in case we have not enough space at current level (Y coordinate) -% -% @param parent reference to a parent box -% @param width width of float being placed. Full width! so, extra horizontal space (padding, margins and borders) is added here too -% @param $y Starting Y-coordinate -% @return X X coordinate of float upper-left corner -% @return Y Y coordinate of float upper-left corner -% -/context-float-left-xy { % => Parent Width Y Context -% Prepare information about the float bottom corrdinates - dup context-floats % => Parent Width Y Context Floats - make-sorted-bottom-y-list % => Parent Width Y Context FloatBottoms - - context-float-left-xy-rec % => Y X -} def % => Y X - -/context-float-left-xy-rec { % => Parent Width Y Context FloatBottoms - 4 index get-left - 3 index % => Parent Width Y Context FloatBottoms X Y - exch % => Parent Width Y Context FloatBottoms Y X - 3 index - context-float-left-x % => Parent Width Y Context FloatBottoms X - -% Check if current float will fit into the parent box - dup 5 index add % => Parent Width Y Context FloatBottoms X FloatRight - 6 index get-right - rounding-epsilon add - le { % => Parent Width Y Context FloatBottoms X -% will fit - exch pop % => Parent Width Y Context X - exch pop % => Parent Width Y X - 4 2 roll % => Y X Parent Width - pop pop exch % => X Y - } { - pop % => Parent Width Y Context FloatBottoms -% Check if all floats have been already cleared - dup length 0 eq { -% All floats are cleared; fall back to the leftmost X coordinate - pop pop exch pop % => Parent Y - exch % => Y Parent - get-left exch % => X Y - } { -% No, float does not fit at current level, let's try to 'clear' some previous floats - dup 0 get % => Parent Width Y Context FloatBottoms Bottom0 - 3 index min % => Parent Width Y Context FloatBottoms Y' - 4 3 roll pop % => Parent Width Context FloatBottoms Y' - 3 1 roll - array-pop-first % => Parent Width Y' Context FloatBottoms' - context-float-left-xy-rec % => X Y - } ifelse - } ifelse -} def % => X Y - -% Find the minimal X at the given Y coordinate suitable for float placement -% -/context-float-right-x { % => Y X Context - 3 copy dup - context-floats % => Y X Context Y X Context Floats - context-float-right-x-rec % => Y X Context X - -% Clear the stack - exch pop - exch pop - exch pop -} def - -/context-float-right-x-rec { % => Y X Context Floats - dup length 0 gt { - dup 0 get % => Y X Context Floats Float - - dup /float get-css-value - /right eq { - -% Check if this float contains given Y-coordinate -% -% Note that top margin coordinate is inclusive but -% bottom margin coordinate is exclusive! The cause is following: -% - if we have several floats in one line, their top margin edge Y coordinates will be equal, -% so we must use agreater or equal sign to avod placing all floats at one X coordinate -% - on the other side, if we place one float under the other, the top margin Y coordinate -% of bottom float will be equal to bottom margin Y coordinate of the top float and -% we should NOT offset tho bottom float in this case - - dup get-top-margin % => Y X Context Floats Float FTM - rounding-epsilon add - 5 index % => Y X Context Floats Float FTM Y - ge % => Y X Context Floats Float FTM>=Y - - 1 index get-bottom-margin % => Y X Context Floats Float FTM>=Y FBM - 6 index % => Y X Context Floats Float FTM>=Y FBM Y - lt % => Y X Context Floats Float FTM>=Y FBM Y X Context Floats Float - dup get-left-margin % => Y X Context Floats Float FRM - 4 index min % => Y X Context Floats Float X'=MAX(FRM,X) - exch pop % => Y X Context Floats X' - 4 3 roll pop % => Y Context Floats X' - 3 1 roll % => Y X' Context Floats - array-pop-first - context-float-right-x-rec % => X - } { % => Y X Context Floats Float - pop % => Y X Context Floats - array-pop-first - context-float-right-x-rec % => X - } ifelse - } { - pop - array-pop-first - context-float-right-x-rec - } ifelse - } { -% no more floats - pop pop exch pop - } ifelse -} def % => X - -% Calculates position of left floating box (taking into account the possibility -% of "wrapping" float to next line in case we have not enough space at current level (Y coordinate) -% -% @param parent reference to a parent box -% @param width width of float being placed. Full width! so, extra horizontal space (padding, margins and borders) is added here too -% @param $y Starting Y-coordinate -% @return X X coordinate of float upper-left corner -% @return Y Y coordinate of float upper-left corner -% -/context-float-right-xy { % => Parent Width Y Context -% Prepare information about the float bottom corrdinates - dup context-floats % => Parent Width Y Context Floats - make-sorted-bottom-y-list % => Parent Width Y Context FloatBottoms - - context-float-right-xy-rec % => X Y -} def % => X Y - -/context-float-right-xy-rec { % => Parent Width Y Context FloatBottoms - 4 index get-right - 3 index % => Parent Width Y Context FloatBottoms X Y - exch - 3 index - context-float-right-x % => Parent Width Y Context FloatBottoms X - -% Check if current float will fit into the parent box - dup % => Parent Width Y Context FloatBottoms X X - 6 index get-right - rounding-epsilon add % => Parent Width Y Context FloatBottoms X X FRight - le { % => Parent Width Y Context FloatBottoms X -% will fit - exch pop exch pop % => Parent Width Y X - 4 2 roll % => Y X Parent Width - pop pop exch % => X Y - } { - pop % => Parent Width Y Context FloatBottoms -% Check if all floats have been already cleared - dup length 0 eq { -% All floats are cleared; fall back to the leftmost X coordinate - pop pop exch pop % => Parent Y - exch % => Y Parent - get-left exch % => X Y - } { -% No, float does not fit at current level, let's try to 'clear' some previous floats - dup 0 get % => Parent Width Y Context FloatBottoms Bottom0 - 3 index min % => Parent Width Y Context FloatBottoms Y' - 4 3 roll pop % => Parent Width Context FloatBottoms Y' - 3 1 roll - array-pop-first % => Parent Width Y' Context FloatBottoms' - context-float-left-xy-rec % => X Y - } ifelse - } ifelse -} def % => X Y - -/context-floats { % => Context - /Floats get 0 get -} def - -/context-get-absolute-positioned { % => Context - /AbsolutePositioned get -} def - -/context-get-collapsed-margin { % => Context - /Margin get 0 get -} def - -/context-get-fixed-positioned { % => Context - /FixedPositioned get -} def - -/context-get-viewport { % => Context - /Viewport get 0 get -} def - -/context-point-in-floats { % => Y X Context - /null % => Y X Context /null - 1 index context-floats % => Y X Context /null Floats - { % => Y X Context /null Float - 4 index - 4 index - 2 index - box-generic-contains-point-margin { % => Y X Context /null Float - exch pop - exit % => Y X Context Float - } if - pop - } forall % => Y X Context Float - - exch pop - exch pop - exch pop -} def - -/context-pop { % => Context - dup context-pop-collapsed-margin - dup context-pop-floats - pop -} def - -/context-pop-collapsed-margin { % => Context - dup /Margin get % => Context CMT - array-pop-first % => Context CMT' - /Margin exch put % => -} def - -/context-pop-container-uid { % => Context - dup /ContainerUID get - array-pop-first - /ContainerUID exch put -} def - -/context-pop-floats { % => Context - dup /Floats get - array-pop-first - /Floats exch put -} def - -/context-pop-viewport { % => Context - dup /Viewport get - array-pop-first % => Context Viewports - /Viewport exch put % => -} def - -/context-push { % => Context - 0 1 index context-push-collapsed-margin - dup context-push-floats - pop -} def - -/context-push-collapsed-margin { % => Value Context - dup /Margin get % => Value Context CMT - 2 index exch % => Value Content Value CMT - array-append % => Value Context CMT' - /Margin exch put % => Value - pop -} def - -/context-push-container-uid { % => Uid Context - dup /ContainerUID get % => Uid Context UIDStack - 2 index exch array-append % => Uid Context UIDStack' - 1 index exch - /ContainerUID exch put - pop pop -} def - -/context-push-floats { % => Context - dup /Floats get - [] exch array-append % => Context Floats' - /Floats exch % => Context /Floats Floats' - put % => -} def - -/context-push-viewport { % => Viewport Context - dup /Viewport get % => Viewport Context Viewports - 2 index exch array-append % => Viewport Context Viewports' - 1 index exch /Viewport exch put % => Viewport Context - pop pop -} def - -% helper utility -/make-sorted-bottom-y-list { % => Boxes - { - get-bottom-margin - exch array-prepend - } exch - [] exch - reduce % => UnsortedBottomsYs - - { gt } % => UnsortedBottomsYs GtFun - array-sort % => SortedBottomYs -} def - -%%%%%%%%%%%%%%%%%%%%% - -/empty-context { - << /Floats [] /CollapsedMarginTop [0] >> -} def - -/context-stack [ empty-context ] def - -/push-context { - empty-context - context-stack - array-append - - /context-stack exch def -} def - -/pop-context { - context-stack - array-pop-first - - /context-stack exch def -} def - -/context-current { - context-stack 0 get -} def - -/context-floats-bottom { % => MaxValue - { get-bottom-margin min } exch - context-floats reduce -} def - -/context-save-float { % => Float - context-current - /Floats get - - array-append - - context-current exch - /Floats exch - put -} def - -% Get the bottom edge coordinate of the bottommost float in -% current formatting context -% -% @return /null in case of no floats exists in current context -% numeric coordinate value otherwise -% -/context-float-bottom { % => - context-floats - dup length 0 gt { - { get-bottom-margin min } - exch - dup 0 get get-bottom-margin - exch - reduce - } { - pop /null - } ifelse -} def - -% Get the right edge coordinate of the rightmost float in -% current formatting context -% -% @return null in case of no floats exists in current context -% numeric coordinate value otherwise -% -/context-float-right { % => - context-floats - dup length 0 gt { - { get-right-margin min } - exch - dup 0 get get-right-margin - exch - reduce - } { - pop /null - } ifelse +% Definition of float context "class" + +/context-add-absolute-positioned { % => Box Context + dup /AbsolutePositioned get % => Box Context AB + 2 index exch + array-prepend % => Box Context AB' + /AbsolutePositioned exch put % => Box + pop +} def + +/context-add-fixed-positioned { % => Box Context + dup /FixedPositioned get % => Box Context AB + 2 index exch + array-prepend % => Box Context AB' + /FixedPositioned exch put % => Box + pop +} def + +/context-add-float { % => Float Context + dup /Floats get % => Float Context Floats + dup 0 get % => Float Context Floats Floats[0] + 3 index exch array-prepend % => Float Context Floats Floats[0]' + 0 exch put % => Float Context + pop pop +} def + +/context-container-uid { % => Context + /ContainerUID get 0 get +} def + +/context-create { % => + << + /ContainerUID [1] + /AbsolutePositioned [] + /FixedPositioned [] + /Floats [[]] + /Margin [0 0] + /Viewport [] + >> +} def + +% Find the minimal X at the given Y coordinate suitable for float placement +% +/context-float-left-x { % => Y X Context + 3 copy dup + context-floats % => Y X Context Y X Context Floats + context-float-left-x-rec % => Y X Context X + +% Clear the stack + exch pop + exch pop + exch pop +} def + +/context-float-left-x-rec { % => Y X Context Floats + dup length 0 gt { + dup 0 get % => Y X Context Floats Float + + dup /float get-css-value + /left eq { + +% Check if this float contains given Y-coordinate +% +% Note that top margin coordinate is inclusive but +% bottom margin coordinate is exclusive! The cause is following: +% - if we have several floats in one line, their top margin edge Y coordinates will be equal, +% so we must use agreater or equal sign to avod placing all floats at one X coordinate +% - on the other side, if we place one float under the other, the top margin Y coordinate +% of bottom float will be equal to bottom margin Y coordinate of the top float and +% we should NOT offset tho bottom float in this case + + dup get-top-margin % => Y X Context Floats Float FTM + rounding-epsilon add + 5 index % => Y X Context Floats Float FTM Y + ge % => Y X Context Floats Float FTM>=Y + + 1 index get-bottom-margin % => Y X Context Floats Float FTM>=Y FBM + 6 index % => Y X Context Floats Float FTM>=Y FBM Y + lt % => Y X Context Floats Float FTM>=Y FBM Y X Context Floats Float + dup get-right-margin % => Y X Context Floats Float FRM + 4 index max % => Y X Context Floats Float X'=MAX(FRM,X) + exch pop % => Y X Context Floats X' + 4 3 roll pop % => Y Context Floats X' + 3 1 roll % => Y X' Context Floats + array-pop-first + context-float-left-x-rec % => X + } { + pop + array-pop-first + context-float-left-x-rec + } ifelse + } { + pop + array-pop-first + context-float-left-x-rec + } ifelse + } { +% no more floats + pop pop exch pop + } ifelse +} def % => X + +% Calculates position of left floating box (taking into account the possibility +% of "wrapping" float to next line in case we have not enough space at current level (Y coordinate) +% +% @param parent reference to a parent box +% @param width width of float being placed. Full width! so, extra horizontal space (padding, margins and borders) is added here too +% @param $y Starting Y-coordinate +% @return X X coordinate of float upper-left corner +% @return Y Y coordinate of float upper-left corner +% +/context-float-left-xy { % => Parent Width Y Context +% Prepare information about the float bottom corrdinates + dup context-floats % => Parent Width Y Context Floats + make-sorted-bottom-y-list % => Parent Width Y Context FloatBottoms + + context-float-left-xy-rec % => Y X +} def % => Y X + +/context-float-left-xy-rec { % => Parent Width Y Context FloatBottoms + 4 index get-left + 3 index % => Parent Width Y Context FloatBottoms X Y + exch % => Parent Width Y Context FloatBottoms Y X + 3 index + context-float-left-x % => Parent Width Y Context FloatBottoms X + +% Check if current float will fit into the parent box + dup 5 index add % => Parent Width Y Context FloatBottoms X FloatRight + 6 index get-right + rounding-epsilon add + le { % => Parent Width Y Context FloatBottoms X +% will fit + exch pop % => Parent Width Y Context X + exch pop % => Parent Width Y X + 4 2 roll % => Y X Parent Width + pop pop exch % => X Y + } { + pop % => Parent Width Y Context FloatBottoms +% Check if all floats have been already cleared + dup length 0 eq { +% All floats are cleared; fall back to the leftmost X coordinate + pop pop exch pop % => Parent Y + exch % => Y Parent + get-left exch % => X Y + } { +% No, float does not fit at current level, let's try to 'clear' some previous floats + dup 0 get % => Parent Width Y Context FloatBottoms Bottom0 + 3 index min % => Parent Width Y Context FloatBottoms Y' + 4 3 roll pop % => Parent Width Context FloatBottoms Y' + 3 1 roll + array-pop-first % => Parent Width Y' Context FloatBottoms' + context-float-left-xy-rec % => X Y + } ifelse + } ifelse +} def % => X Y + +% Find the minimal X at the given Y coordinate suitable for float placement +% +/context-float-right-x { % => Y X Context + 3 copy dup + context-floats % => Y X Context Y X Context Floats + context-float-right-x-rec % => Y X Context X + +% Clear the stack + exch pop + exch pop + exch pop +} def + +/context-float-right-x-rec { % => Y X Context Floats + dup length 0 gt { + dup 0 get % => Y X Context Floats Float + + dup /float get-css-value + /right eq { + +% Check if this float contains given Y-coordinate +% +% Note that top margin coordinate is inclusive but +% bottom margin coordinate is exclusive! The cause is following: +% - if we have several floats in one line, their top margin edge Y coordinates will be equal, +% so we must use agreater or equal sign to avod placing all floats at one X coordinate +% - on the other side, if we place one float under the other, the top margin Y coordinate +% of bottom float will be equal to bottom margin Y coordinate of the top float and +% we should NOT offset tho bottom float in this case + + dup get-top-margin % => Y X Context Floats Float FTM + rounding-epsilon add + 5 index % => Y X Context Floats Float FTM Y + ge % => Y X Context Floats Float FTM>=Y + + 1 index get-bottom-margin % => Y X Context Floats Float FTM>=Y FBM + 6 index % => Y X Context Floats Float FTM>=Y FBM Y + lt % => Y X Context Floats Float FTM>=Y FBM Y X Context Floats Float + dup get-left-margin % => Y X Context Floats Float FRM + 4 index min % => Y X Context Floats Float X'=MAX(FRM,X) + exch pop % => Y X Context Floats X' + 4 3 roll pop % => Y Context Floats X' + 3 1 roll % => Y X' Context Floats + array-pop-first + context-float-right-x-rec % => X + } { % => Y X Context Floats Float + pop % => Y X Context Floats + array-pop-first + context-float-right-x-rec % => X + } ifelse + } { + pop + array-pop-first + context-float-right-x-rec + } ifelse + } { +% no more floats + pop pop exch pop + } ifelse +} def % => X + +% Calculates position of left floating box (taking into account the possibility +% of "wrapping" float to next line in case we have not enough space at current level (Y coordinate) +% +% @param parent reference to a parent box +% @param width width of float being placed. Full width! so, extra horizontal space (padding, margins and borders) is added here too +% @param $y Starting Y-coordinate +% @return X X coordinate of float upper-left corner +% @return Y Y coordinate of float upper-left corner +% +/context-float-right-xy { % => Parent Width Y Context +% Prepare information about the float bottom corrdinates + dup context-floats % => Parent Width Y Context Floats + make-sorted-bottom-y-list % => Parent Width Y Context FloatBottoms + + context-float-right-xy-rec % => X Y +} def % => X Y + +/context-float-right-xy-rec { % => Parent Width Y Context FloatBottoms + 4 index get-right + 3 index % => Parent Width Y Context FloatBottoms X Y + exch + 3 index + context-float-right-x % => Parent Width Y Context FloatBottoms X + +% Check if current float will fit into the parent box + dup % => Parent Width Y Context FloatBottoms X X + 6 index get-right + rounding-epsilon add % => Parent Width Y Context FloatBottoms X X FRight + le { % => Parent Width Y Context FloatBottoms X +% will fit + exch pop exch pop % => Parent Width Y X + 4 2 roll % => Y X Parent Width + pop pop exch % => X Y + } { + pop % => Parent Width Y Context FloatBottoms +% Check if all floats have been already cleared + dup length 0 eq { +% All floats are cleared; fall back to the leftmost X coordinate + pop pop exch pop % => Parent Y + exch % => Y Parent + get-left exch % => X Y + } { +% No, float does not fit at current level, let's try to 'clear' some previous floats + dup 0 get % => Parent Width Y Context FloatBottoms Bottom0 + 3 index min % => Parent Width Y Context FloatBottoms Y' + 4 3 roll pop % => Parent Width Context FloatBottoms Y' + 3 1 roll + array-pop-first % => Parent Width Y' Context FloatBottoms' + context-float-left-xy-rec % => X Y + } ifelse + } ifelse +} def % => X Y + +/context-floats { % => Context + /Floats get 0 get +} def + +/context-get-absolute-positioned { % => Context + /AbsolutePositioned get +} def + +/context-get-collapsed-margin { % => Context + /Margin get 0 get +} def + +/context-get-fixed-positioned { % => Context + /FixedPositioned get +} def + +/context-get-viewport { % => Context + /Viewport get 0 get +} def + +/context-point-in-floats { % => Y X Context + /null % => Y X Context /null + 1 index context-floats % => Y X Context /null Floats + { % => Y X Context /null Float + 4 index + 4 index + 2 index + box-generic-contains-point-margin { % => Y X Context /null Float + exch pop + exit % => Y X Context Float + } if + pop + } forall % => Y X Context Float + + exch pop + exch pop + exch pop +} def + +/context-pop { % => Context + dup context-pop-collapsed-margin + dup context-pop-floats + pop +} def + +/context-pop-collapsed-margin { % => Context + dup /Margin get % => Context CMT + array-pop-first % => Context CMT' + /Margin exch put % => +} def + +/context-pop-container-uid { % => Context + dup /ContainerUID get + array-pop-first + /ContainerUID exch put +} def + +/context-pop-floats { % => Context + dup /Floats get + array-pop-first + /Floats exch put +} def + +/context-pop-viewport { % => Context + dup /Viewport get + array-pop-first % => Context Viewports + /Viewport exch put % => +} def + +/context-push { % => Context + 0 1 index context-push-collapsed-margin + dup context-push-floats + pop +} def + +/context-push-collapsed-margin { % => Value Context + dup /Margin get % => Value Context CMT + 2 index exch % => Value Content Value CMT + array-append % => Value Context CMT' + /Margin exch put % => Value + pop +} def + +/context-push-container-uid { % => Uid Context + dup /ContainerUID get % => Uid Context UIDStack + 2 index exch array-append % => Uid Context UIDStack' + 1 index exch + /ContainerUID exch put + pop pop +} def + +/context-push-floats { % => Context + dup /Floats get + [] exch array-append % => Context Floats' + /Floats exch % => Context /Floats Floats' + put % => +} def + +/context-push-viewport { % => Viewport Context + dup /Viewport get % => Viewport Context Viewports + 2 index exch array-append % => Viewport Context Viewports' + 1 index exch /Viewport exch put % => Viewport Context + pop pop +} def + +% helper utility +/make-sorted-bottom-y-list { % => Boxes + { + get-bottom-margin + exch array-prepend + } exch + [] exch + reduce % => UnsortedBottomsYs + + { gt } % => UnsortedBottomsYs GtFun + array-sort % => SortedBottomYs +} def + +%%%%%%%%%%%%%%%%%%%%% + +/empty-context { + << /Floats [] /CollapsedMarginTop [0] >> +} def + +/context-stack [ empty-context ] def + +/push-context { + empty-context + context-stack + array-append + + /context-stack exch def +} def + +/pop-context { + context-stack + array-pop-first + + /context-stack exch def +} def + +/context-current { + context-stack 0 get +} def + +/context-floats-bottom { % => MaxValue + { get-bottom-margin min } exch + context-floats reduce +} def + +/context-save-float { % => Float + context-current + /Floats get + + array-append + + context-current exch + /Floats exch + put +} def + +% Get the bottom edge coordinate of the bottommost float in +% current formatting context +% +% @return /null in case of no floats exists in current context +% numeric coordinate value otherwise +% +/context-float-bottom { % => + context-floats + dup length 0 gt { + { get-bottom-margin min } + exch + dup 0 get get-bottom-margin + exch + reduce + } { + pop /null + } ifelse +} def + +% Get the right edge coordinate of the rightmost float in +% current formatting context +% +% @return null in case of no floats exists in current context +% numeric coordinate value otherwise +% +/context-float-right { % => + context-floats + dup length 0 gt { + { get-right-margin min } + exch + dup 0 get get-right-margin + exch + reduce + } { + pop /null + } ifelse } def \ No newline at end of file diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/encoding.dingbats.ps b/thirdparty/html2ps_pdf/postscript/encoding.dingbats.ps similarity index 95% rename from gulliver/thirdparty/html2ps_pdf/postscript/encoding.dingbats.ps rename to thirdparty/html2ps_pdf/postscript/encoding.dingbats.ps index ff4867f72..2fd2bdf0f 100644 --- a/gulliver/thirdparty/html2ps_pdf/postscript/encoding.dingbats.ps +++ b/thirdparty/html2ps_pdf/postscript/encoding.dingbats.ps @@ -1,104 +1,104 @@ -% $Header: /cvsroot/html2ps/postscript/encoding.dingbats.ps,v 1.1 2005/12/18 07:21:37 Konstantin Exp $ -/Dingbats-Encoding [ - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef -% \040 - /space - /a1 - /a2 - /a202 - /a3 - /a4 - /a5 /a119 - /a118 /a117 /a11 /a12 /a13 /a14 /a15 /a16 - /a105 /a17 /a18 /a19 /a20 /a21 /a22 /a23 - /a24 /a25 /a26 /a27 /a28 /a6 /a7 /a8 -% \100 - /a9 /a10 /a29 /a30 /a31 /a32 /a33 /a34 - /a35 /a36 /a37 /a38 /a39 /a40 /a41 /a42 - /a43 /a44 /a45 /a46 /a47 /a48 /a49 /a50 - /a51 /a52 /a53 /a54 /a55 /a56 /a57 /a58 -% \140 - /a59 /a60 /a61 /a62 /a63 /a64 /a65 /a66 - /a67 /a68 /a69 /a70 /a71 /a72 /a73 /a74 - /a203 /a75 /a204 /a76 /a77 /a78 /a79 /a81 - /a82 /a83 /a84 /a97 /a98 /a99 /a100 /.notdef -% \200 - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef -% \240 - /.notdef /a101 /a102 /a103 /a104 /a106 /a107 /a108 - /a112 /a111 /a110 /a109 /a120 /a121 /a122 /a123 - /a124 /a125 /a126 /a127 /a128 /a129 /a130 /a131 - /a132 /a133 /a134 /a135 /a136 /a137 /a138 /a139 -% \300 - /a140 /a141 /a142 /a143 /a144 /a145 /a146 /a147 - /a148 /a149 /a150 /a151 /a152 /a153 /a154 /a155 - /a156 /a157 /a158 /a159 /a160 /a161 /a163 /a164 - /a196 /a165 /a192 /a166 /a167 /a168 /a169 /a170 -% \340 - /a171 /a172 /a173 /a162 /a174 /a175 /a176 /a177 - /a178 /a179 /a193 /a180 /a199 /a181 /a200 /a182 - /.notdef /a201 /a183 /a184 /a197 /a185 /a194 /a198 - /a186 /a195 /a187 /a188 /a189 /a190 /a191 /.notdef +% $Header: /cvsroot/html2ps/postscript/encoding.dingbats.ps,v 1.1 2005/12/18 07:21:37 Konstantin Exp $ +/Dingbats-Encoding [ + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef +% \040 + /space + /a1 + /a2 + /a202 + /a3 + /a4 + /a5 /a119 + /a118 /a117 /a11 /a12 /a13 /a14 /a15 /a16 + /a105 /a17 /a18 /a19 /a20 /a21 /a22 /a23 + /a24 /a25 /a26 /a27 /a28 /a6 /a7 /a8 +% \100 + /a9 /a10 /a29 /a30 /a31 /a32 /a33 /a34 + /a35 /a36 /a37 /a38 /a39 /a40 /a41 /a42 + /a43 /a44 /a45 /a46 /a47 /a48 /a49 /a50 + /a51 /a52 /a53 /a54 /a55 /a56 /a57 /a58 +% \140 + /a59 /a60 /a61 /a62 /a63 /a64 /a65 /a66 + /a67 /a68 /a69 /a70 /a71 /a72 /a73 /a74 + /a203 /a75 /a204 /a76 /a77 /a78 /a79 /a81 + /a82 /a83 /a84 /a97 /a98 /a99 /a100 /.notdef +% \200 + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef +% \240 + /.notdef /a101 /a102 /a103 /a104 /a106 /a107 /a108 + /a112 /a111 /a110 /a109 /a120 /a121 /a122 /a123 + /a124 /a125 /a126 /a127 /a128 /a129 /a130 /a131 + /a132 /a133 /a134 /a135 /a136 /a137 /a138 /a139 +% \300 + /a140 /a141 /a142 /a143 /a144 /a145 /a146 /a147 + /a148 /a149 /a150 /a151 /a152 /a153 /a154 /a155 + /a156 /a157 /a158 /a159 /a160 /a161 /a163 /a164 + /a196 /a165 /a192 /a166 /a167 /a168 /a169 /a170 +% \340 + /a171 /a172 /a173 /a162 /a174 /a175 /a176 /a177 + /a178 /a179 /a193 /a180 /a199 /a181 /a200 /a182 + /.notdef /a201 /a183 /a184 /a197 /a185 /a194 /a198 + /a186 /a195 /a187 /a188 /a189 /a190 /a191 /.notdef ] readonly def \ No newline at end of file diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/encoding.iso-8859-10.ps b/thirdparty/html2ps_pdf/postscript/encoding.iso-8859-10.ps similarity index 91% rename from gulliver/thirdparty/html2ps_pdf/postscript/encoding.iso-8859-10.ps rename to thirdparty/html2ps_pdf/postscript/encoding.iso-8859-10.ps index 20fead7ed..71e441fbc 100644 --- a/gulliver/thirdparty/html2ps_pdf/postscript/encoding.iso-8859-10.ps +++ b/thirdparty/html2ps_pdf/postscript/encoding.iso-8859-10.ps @@ -1,259 +1,259 @@ -% $Header: /cvsroot/html2ps/postscript/encoding.iso-8859-10.ps,v 1.1 2005/12/18 07:21:37 Konstantin Exp $ -/ISO-8859-10-Encoding [ - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /space - /exclam - /quotedbl - /numbersign - /dollar - /percent - /ampersand - /quotesingle - /parenleft - /parenright - /asterisk - /plus - /comma - /hyphen - /period - /slash - /zero - /one - /two - /three - /four - /five - /six - /seven - /eight - /nine - /colon - /semicolon - /less - /equal - /greater - /question - /at - /A - /B - /C - /D - /E - /F - /G - /H - /I - /J - /K - /L - /M - /N - /O - /P - /Q - /R - /S - /T - /U - /V - /W - /X - /Y - /Z - /bracketleft - /backslash - /bracketright - /asciicircum - /underscore - /grave - /a - /b - /c - /d - /e - /f - /g - /h - /i - /j - /k - /l - /m - /n - /o - /p - /q - /r - /s - /t - /u - /v - /w - /x - /y - /z - /braceleft - /bar - /braceright - /asciitilde - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /uni00A0 - /Aogonek - /Emacron - /Gcommaaccent - /Imacron - /Itilde - /Kcommaaccent - /section - /Lcommaaccent - /Dcroat - /Scaron - /Tbar - /Zcaron - /uni00AD - /Umacron - /Eng - /degree - /aogonek - /emacron - /gcommaaccent - /imacron - /itilde - /kcommaaccent - /periodcentered - /lcommaaccent - /dcroat - /scaron - /tbar - /zcaron - /macron - /umacron - /eng - /Amacron - /Aacute - /Acircumflex - /Atilde - /Adieresis - /Aring - /AE - /Iogonek - /Ccaron - /Eacute - /Eogonek - /Edieresis - /Emacron - /Iacute - /Icircumflex - /Idieresis - /Eth - /Ncommaaccent - /Omacron - /Oacute - /Ocircumflex - /Otilde - /Odieresis - /Utilde - /Oslash - /Uogonek - /Uacute - /Ucircumflex - /Udieresis - /Yacute - /Thorn - /germandbls - /amacron - /aacute - /acircumflex - /atilde - /adieresis - /aring - /ae - /iogonek - /ccaron - /eacute - /eogonek - /edieresis - /emacron - /iacute - /icircumflex - /idieresis - /eth - /ncommaaccent - /omacron - /oacute - /ocircumflex - /otilde - /odieresis - /utilde - /oslash - /uogonek - /uacute - /ucircumflex - /udieresis - /yacute - /thorn - /kgreenlandic +% $Header: /cvsroot/html2ps/postscript/encoding.iso-8859-10.ps,v 1.1 2005/12/18 07:21:37 Konstantin Exp $ +/ISO-8859-10-Encoding [ + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /space + /exclam + /quotedbl + /numbersign + /dollar + /percent + /ampersand + /quotesingle + /parenleft + /parenright + /asterisk + /plus + /comma + /hyphen + /period + /slash + /zero + /one + /two + /three + /four + /five + /six + /seven + /eight + /nine + /colon + /semicolon + /less + /equal + /greater + /question + /at + /A + /B + /C + /D + /E + /F + /G + /H + /I + /J + /K + /L + /M + /N + /O + /P + /Q + /R + /S + /T + /U + /V + /W + /X + /Y + /Z + /bracketleft + /backslash + /bracketright + /asciicircum + /underscore + /grave + /a + /b + /c + /d + /e + /f + /g + /h + /i + /j + /k + /l + /m + /n + /o + /p + /q + /r + /s + /t + /u + /v + /w + /x + /y + /z + /braceleft + /bar + /braceright + /asciitilde + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /uni00A0 + /Aogonek + /Emacron + /Gcommaaccent + /Imacron + /Itilde + /Kcommaaccent + /section + /Lcommaaccent + /Dcroat + /Scaron + /Tbar + /Zcaron + /uni00AD + /Umacron + /Eng + /degree + /aogonek + /emacron + /gcommaaccent + /imacron + /itilde + /kcommaaccent + /periodcentered + /lcommaaccent + /dcroat + /scaron + /tbar + /zcaron + /macron + /umacron + /eng + /Amacron + /Aacute + /Acircumflex + /Atilde + /Adieresis + /Aring + /AE + /Iogonek + /Ccaron + /Eacute + /Eogonek + /Edieresis + /Emacron + /Iacute + /Icircumflex + /Idieresis + /Eth + /Ncommaaccent + /Omacron + /Oacute + /Ocircumflex + /Otilde + /Odieresis + /Utilde + /Oslash + /Uogonek + /Uacute + /Ucircumflex + /Udieresis + /Yacute + /Thorn + /germandbls + /amacron + /aacute + /acircumflex + /atilde + /adieresis + /aring + /ae + /iogonek + /ccaron + /eacute + /eogonek + /edieresis + /emacron + /iacute + /icircumflex + /idieresis + /eth + /ncommaaccent + /omacron + /oacute + /ocircumflex + /otilde + /odieresis + /utilde + /oslash + /uogonek + /uacute + /ucircumflex + /udieresis + /yacute + /thorn + /kgreenlandic ] readonly def \ No newline at end of file diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/encoding.iso-8859-11.ps b/thirdparty/html2ps_pdf/postscript/encoding.iso-8859-11.ps similarity index 91% rename from gulliver/thirdparty/html2ps_pdf/postscript/encoding.iso-8859-11.ps rename to thirdparty/html2ps_pdf/postscript/encoding.iso-8859-11.ps index 788c0c5ca..88d27a8b5 100644 --- a/gulliver/thirdparty/html2ps_pdf/postscript/encoding.iso-8859-11.ps +++ b/thirdparty/html2ps_pdf/postscript/encoding.iso-8859-11.ps @@ -1,259 +1,259 @@ -% $Header: /cvsroot/html2ps/postscript/encoding.iso-8859-11.ps,v 1.1 2005/12/18 07:21:37 Konstantin Exp $ -/ISO-8859-11-Encoding [ - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /space - /exclam - /quotedbl - /numbersign - /dollar - /percent - /ampersand - /quotesingle - /parenleft - /parenright - /asterisk - /plus - /comma - /hyphen - /period - /slash - /zero - /one - /two - /three - /four - /five - /six - /seven - /eight - /nine - /colon - /semicolon - /less - /equal - /greater - /question - /at - /A - /B - /C - /D - /E - /F - /G - /H - /I - /J - /K - /L - /M - /N - /O - /P - /Q - /R - /S - /T - /U - /V - /W - /X - /Y - /Z - /bracketleft - /backslash - /bracketright - /asciicircum - /underscore - /grave - /a - /b - /c - /d - /e - /f - /g - /h - /i - /j - /k - /l - /m - /n - /o - /p - /q - /r - /s - /t - /u - /v - /w - /x - /y - /z - /braceleft - /bar - /braceright - /asciitilde - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /uni00A0 - /uni0E01 - /uni0E02 - /uni0E03 - /uni0E04 - /uni0E05 - /uni0E06 - /uni0E07 - /uni0E08 - /uni0E09 - /uni0E0A - /uni0E0B - /uni0E0C - /uni0E0D - /uni0E0E - /uni0E0F - /uni0E10 - /uni0E11 - /uni0E12 - /uni0E13 - /uni0E14 - /uni0E15 - /uni0E16 - /uni0E17 - /uni0E18 - /uni0E19 - /uni0E1A - /uni0E1B - /uni0E1C - /uni0E1D - /uni0E1E - /uni0E1F - /uni0E20 - /uni0E21 - /uni0E22 - /uni0E23 - /uni0E24 - /uni0E25 - /uni0E26 - /uni0E27 - /uni0E28 - /uni0E29 - /uni0E2A - /uni0E2B - /uni0E2C - /uni0E2D - /uni0E2E - /uni0E2F - /uni0E30 - /uni0E31 - /uni0E32 - /uni0E33 - /uni0E34 - /uni0E35 - /uni0E36 - /uni0E37 - /uni0E38 - /uni0E39 - /uni0E3A - /.notdef - /space - /.notdef - /.notdef - /uni0E3F - /uni0E40 - /uni0E41 - /uni0E42 - /uni0E43 - /uni0E44 - /uni0E45 - /uni0E46 - /uni0E47 - /uni0E48 - /uni0E49 - /uni0E4A - /uni0E4B - /uni0E4C - /uni0E4D - /uni0E4E - /uni0E4F - /uni0E50 - /uni0E51 - /uni0E52 - /uni0E53 - /uni0E54 - /uni0E55 - /uni0E56 - /uni0E57 - /uni0E58 - /uni0E59 - /uni0E5A - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef +% $Header: /cvsroot/html2ps/postscript/encoding.iso-8859-11.ps,v 1.1 2005/12/18 07:21:37 Konstantin Exp $ +/ISO-8859-11-Encoding [ + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /space + /exclam + /quotedbl + /numbersign + /dollar + /percent + /ampersand + /quotesingle + /parenleft + /parenright + /asterisk + /plus + /comma + /hyphen + /period + /slash + /zero + /one + /two + /three + /four + /five + /six + /seven + /eight + /nine + /colon + /semicolon + /less + /equal + /greater + /question + /at + /A + /B + /C + /D + /E + /F + /G + /H + /I + /J + /K + /L + /M + /N + /O + /P + /Q + /R + /S + /T + /U + /V + /W + /X + /Y + /Z + /bracketleft + /backslash + /bracketright + /asciicircum + /underscore + /grave + /a + /b + /c + /d + /e + /f + /g + /h + /i + /j + /k + /l + /m + /n + /o + /p + /q + /r + /s + /t + /u + /v + /w + /x + /y + /z + /braceleft + /bar + /braceright + /asciitilde + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /uni00A0 + /uni0E01 + /uni0E02 + /uni0E03 + /uni0E04 + /uni0E05 + /uni0E06 + /uni0E07 + /uni0E08 + /uni0E09 + /uni0E0A + /uni0E0B + /uni0E0C + /uni0E0D + /uni0E0E + /uni0E0F + /uni0E10 + /uni0E11 + /uni0E12 + /uni0E13 + /uni0E14 + /uni0E15 + /uni0E16 + /uni0E17 + /uni0E18 + /uni0E19 + /uni0E1A + /uni0E1B + /uni0E1C + /uni0E1D + /uni0E1E + /uni0E1F + /uni0E20 + /uni0E21 + /uni0E22 + /uni0E23 + /uni0E24 + /uni0E25 + /uni0E26 + /uni0E27 + /uni0E28 + /uni0E29 + /uni0E2A + /uni0E2B + /uni0E2C + /uni0E2D + /uni0E2E + /uni0E2F + /uni0E30 + /uni0E31 + /uni0E32 + /uni0E33 + /uni0E34 + /uni0E35 + /uni0E36 + /uni0E37 + /uni0E38 + /uni0E39 + /uni0E3A + /.notdef + /space + /.notdef + /.notdef + /uni0E3F + /uni0E40 + /uni0E41 + /uni0E42 + /uni0E43 + /uni0E44 + /uni0E45 + /uni0E46 + /uni0E47 + /uni0E48 + /uni0E49 + /uni0E4A + /uni0E4B + /uni0E4C + /uni0E4D + /uni0E4E + /uni0E4F + /uni0E50 + /uni0E51 + /uni0E52 + /uni0E53 + /uni0E54 + /uni0E55 + /uni0E56 + /uni0E57 + /uni0E58 + /uni0E59 + /uni0E5A + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef ] readonly def \ No newline at end of file diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/encoding.iso-8859-13.ps b/thirdparty/html2ps_pdf/postscript/encoding.iso-8859-13.ps similarity index 91% rename from gulliver/thirdparty/html2ps_pdf/postscript/encoding.iso-8859-13.ps rename to thirdparty/html2ps_pdf/postscript/encoding.iso-8859-13.ps index ab2c47025..02670d532 100644 --- a/gulliver/thirdparty/html2ps_pdf/postscript/encoding.iso-8859-13.ps +++ b/thirdparty/html2ps_pdf/postscript/encoding.iso-8859-13.ps @@ -1,259 +1,259 @@ -% $Header: /cvsroot/html2ps/postscript/encoding.iso-8859-13.ps,v 1.1 2005/12/18 07:21:37 Konstantin Exp $ -/ISO-8859-13-Encoding [ - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /space - /exclam - /quotedbl - /numbersign - /dollar - /percent - /ampersand - /quotesingle - /parenleft - /parenright - /asterisk - /plus - /comma - /hyphen - /period - /slash - /zero - /one - /two - /three - /four - /five - /six - /seven - /eight - /nine - /colon - /semicolon - /less - /equal - /greater - /question - /at - /A - /B - /C - /D - /E - /F - /G - /H - /I - /J - /K - /L - /M - /N - /O - /P - /Q - /R - /S - /T - /U - /V - /W - /X - /Y - /Z - /bracketleft - /backslash - /bracketright - /asciicircum - /underscore - /grave - /a - /b - /c - /d - /e - /f - /g - /h - /i - /j - /k - /l - /m - /n - /o - /p - /q - /r - /s - /t - /u - /v - /w - /x - /y - /z - /braceleft - /bar - /braceright - /asciitilde - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /uni00A0 - /quotedblright - /cent - /sterling - /currency - /quotedblbase - /brokenbar - /section - /Oslash - /copyright - /rcommaaccent - /guillemotleft - /logicalnot - /uni00AD - /registered - /AE - /degree - /plusminus - /twosuperior - /threesuperior - /quotedblleft - /mu - /paragraph - /periodcentered - /oslash - /onesuperior - /.notdef - /guillemotright - /onequarter - /onehalf - /threequarters - /ae - /Aogonek - /Iogonek - /Amacron - /Cacute - /Adieresis - /Aring - /Eogonek - /Emacron - /Ccaron - /Eacute - /Zacute - /Edotaccent - /Gcommaaccent - /Kcommaaccent - /Imacron - /Lcommaaccent - /Scaron - /Nacute - /Ncommaaccent - /Oacute - /Omacron - /Otilde - /Odieresis - /multiply - /Uogonek - /Lslash - /Uacute - /Ucircumflex - /Udieresis - /Zdotaccent - /Zcaron - /germandbls - /aogonek - /Iogonek - /amacron - /cacute - /adieresis - /aring - /eogonek - /emacron - /ccaron - /eacute - /zacute - /edotaccent - /gcommaaccent - /kcommaaccent - /imacron - /lcommaaccent - /scaron - /nacute - /ncommaaccent - /oacute - /omacron - /otilde - /odieresis - /divide - /uogonek - /lslash - /uacute - /ucircumflex - /udieresis - /zdotaccent - /zcaron - /quoteright +% $Header: /cvsroot/html2ps/postscript/encoding.iso-8859-13.ps,v 1.1 2005/12/18 07:21:37 Konstantin Exp $ +/ISO-8859-13-Encoding [ + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /space + /exclam + /quotedbl + /numbersign + /dollar + /percent + /ampersand + /quotesingle + /parenleft + /parenright + /asterisk + /plus + /comma + /hyphen + /period + /slash + /zero + /one + /two + /three + /four + /five + /six + /seven + /eight + /nine + /colon + /semicolon + /less + /equal + /greater + /question + /at + /A + /B + /C + /D + /E + /F + /G + /H + /I + /J + /K + /L + /M + /N + /O + /P + /Q + /R + /S + /T + /U + /V + /W + /X + /Y + /Z + /bracketleft + /backslash + /bracketright + /asciicircum + /underscore + /grave + /a + /b + /c + /d + /e + /f + /g + /h + /i + /j + /k + /l + /m + /n + /o + /p + /q + /r + /s + /t + /u + /v + /w + /x + /y + /z + /braceleft + /bar + /braceright + /asciitilde + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /uni00A0 + /quotedblright + /cent + /sterling + /currency + /quotedblbase + /brokenbar + /section + /Oslash + /copyright + /rcommaaccent + /guillemotleft + /logicalnot + /uni00AD + /registered + /AE + /degree + /plusminus + /twosuperior + /threesuperior + /quotedblleft + /mu + /paragraph + /periodcentered + /oslash + /onesuperior + /.notdef + /guillemotright + /onequarter + /onehalf + /threequarters + /ae + /Aogonek + /Iogonek + /Amacron + /Cacute + /Adieresis + /Aring + /Eogonek + /Emacron + /Ccaron + /Eacute + /Zacute + /Edotaccent + /Gcommaaccent + /Kcommaaccent + /Imacron + /Lcommaaccent + /Scaron + /Nacute + /Ncommaaccent + /Oacute + /Omacron + /Otilde + /Odieresis + /multiply + /Uogonek + /Lslash + /Uacute + /Ucircumflex + /Udieresis + /Zdotaccent + /Zcaron + /germandbls + /aogonek + /Iogonek + /amacron + /cacute + /adieresis + /aring + /eogonek + /emacron + /ccaron + /eacute + /zacute + /edotaccent + /gcommaaccent + /kcommaaccent + /imacron + /lcommaaccent + /scaron + /nacute + /ncommaaccent + /oacute + /omacron + /otilde + /odieresis + /divide + /uogonek + /lslash + /uacute + /ucircumflex + /udieresis + /zdotaccent + /zcaron + /quoteright ] readonly def \ No newline at end of file diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/encoding.iso-8859-14.ps b/thirdparty/html2ps_pdf/postscript/encoding.iso-8859-14.ps similarity index 91% rename from gulliver/thirdparty/html2ps_pdf/postscript/encoding.iso-8859-14.ps rename to thirdparty/html2ps_pdf/postscript/encoding.iso-8859-14.ps index f848f3f80..64240cae3 100644 --- a/gulliver/thirdparty/html2ps_pdf/postscript/encoding.iso-8859-14.ps +++ b/thirdparty/html2ps_pdf/postscript/encoding.iso-8859-14.ps @@ -1,259 +1,259 @@ -% $Header: /cvsroot/html2ps/postscript/encoding.iso-8859-14.ps,v 1.1 2005/12/18 07:21:37 Konstantin Exp $ -/ISO-8859-14-Encoding [ - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /space - /exclam - /quotedbl - /numbersign - /dollar - /percent - /ampersand - /quotesingle - /parenleft - /parenright - /asterisk - /plus - /comma - /hyphen - /period - /slash - /zero - /one - /two - /three - /four - /five - /six - /seven - /eight - /nine - /colon - /semicolon - /less - /equal - /greater - /question - /at - /A - /B - /C - /D - /E - /F - /G - /H - /I - /J - /K - /L - /M - /N - /O - /P - /Q - /R - /S - /T - /U - /V - /W - /X - /Y - /Z - /bracketleft - /backslash - /bracketright - /asciicircum - /underscore - /grave - /a - /b - /c - /d - /e - /f - /g - /h - /i - /j - /k - /l - /m - /n - /o - /p - /q - /r - /s - /t - /u - /v - /w - /x - /y - /z - /braceleft - /bar - /braceright - /asciitilde - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /uni00A0 - /uni1E02 - /uni1E03 - /sterling - /Cdotaccent - /cdotaccent - /uni1E0A - /section - /Wgrave - /copyright - /Wacute - /uni1E0B - /Ygrave - /uni00AD - /registered - /Ydieresis - /uni1E1E - /uni1E1F - /Gdotaccent - /gdotaccent - /uni1E40 - /uni1E41 - /paragraph - /uni1E56 - /wgrave - /uni1E57 - /wacute - /uni1E60 - /ygrave - /Wdieresis - /wdieresis - /uni1E61 - /Agrave - /Aacute - /Acircumflex - /Atilde - /Adieresis - /Aring - /AE - /Ccedilla - /Egrave - /Eacute - /Ecircumflex - /Edieresis - /Igrave - /Iacute - /Icircumflex - /Idieresis - /Wcircumflex - /Ntilde - /Ograve - /Oacute - /Ocircumflex - /Otilde - /Odieresis - /uni1E6A - /Oslash - /Ugrave - /Uacute - /Ucircumflex - /Udieresis - /Yacute - /Ycircumflex - /germandbls - /agrave - /aacute - /acircumflex - /atilde - /adieresis - /aring - /ae - /ccedilla - /egrave - /eacute - /ecircumflex - /edieresis - /igrave - /iacute - /icircumflex - /idieresis - /wcircumflex - /ntilde - /ograve - /oacute - /ocircumflex - /otilde - /odieresis - /uni1E6B - /oslash - /ugrave - /uacute - /ucircumflex - /udieresis - /yacute - /ycircumflex - /ydieresis +% $Header: /cvsroot/html2ps/postscript/encoding.iso-8859-14.ps,v 1.1 2005/12/18 07:21:37 Konstantin Exp $ +/ISO-8859-14-Encoding [ + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /space + /exclam + /quotedbl + /numbersign + /dollar + /percent + /ampersand + /quotesingle + /parenleft + /parenright + /asterisk + /plus + /comma + /hyphen + /period + /slash + /zero + /one + /two + /three + /four + /five + /six + /seven + /eight + /nine + /colon + /semicolon + /less + /equal + /greater + /question + /at + /A + /B + /C + /D + /E + /F + /G + /H + /I + /J + /K + /L + /M + /N + /O + /P + /Q + /R + /S + /T + /U + /V + /W + /X + /Y + /Z + /bracketleft + /backslash + /bracketright + /asciicircum + /underscore + /grave + /a + /b + /c + /d + /e + /f + /g + /h + /i + /j + /k + /l + /m + /n + /o + /p + /q + /r + /s + /t + /u + /v + /w + /x + /y + /z + /braceleft + /bar + /braceright + /asciitilde + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /uni00A0 + /uni1E02 + /uni1E03 + /sterling + /Cdotaccent + /cdotaccent + /uni1E0A + /section + /Wgrave + /copyright + /Wacute + /uni1E0B + /Ygrave + /uni00AD + /registered + /Ydieresis + /uni1E1E + /uni1E1F + /Gdotaccent + /gdotaccent + /uni1E40 + /uni1E41 + /paragraph + /uni1E56 + /wgrave + /uni1E57 + /wacute + /uni1E60 + /ygrave + /Wdieresis + /wdieresis + /uni1E61 + /Agrave + /Aacute + /Acircumflex + /Atilde + /Adieresis + /Aring + /AE + /Ccedilla + /Egrave + /Eacute + /Ecircumflex + /Edieresis + /Igrave + /Iacute + /Icircumflex + /Idieresis + /Wcircumflex + /Ntilde + /Ograve + /Oacute + /Ocircumflex + /Otilde + /Odieresis + /uni1E6A + /Oslash + /Ugrave + /Uacute + /Ucircumflex + /Udieresis + /Yacute + /Ycircumflex + /germandbls + /agrave + /aacute + /acircumflex + /atilde + /adieresis + /aring + /ae + /ccedilla + /egrave + /eacute + /ecircumflex + /edieresis + /igrave + /iacute + /icircumflex + /idieresis + /wcircumflex + /ntilde + /ograve + /oacute + /ocircumflex + /otilde + /odieresis + /uni1E6B + /oslash + /ugrave + /uacute + /ucircumflex + /udieresis + /yacute + /ycircumflex + /ydieresis ] readonly def \ No newline at end of file diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/encoding.iso-8859-15.ps b/thirdparty/html2ps_pdf/postscript/encoding.iso-8859-15.ps similarity index 91% rename from gulliver/thirdparty/html2ps_pdf/postscript/encoding.iso-8859-15.ps rename to thirdparty/html2ps_pdf/postscript/encoding.iso-8859-15.ps index 31a3c1618..6469fc197 100644 --- a/gulliver/thirdparty/html2ps_pdf/postscript/encoding.iso-8859-15.ps +++ b/thirdparty/html2ps_pdf/postscript/encoding.iso-8859-15.ps @@ -1,259 +1,259 @@ -% $Header: /cvsroot/html2ps/postscript/encoding.iso-8859-15.ps,v 1.1 2005/12/18 07:21:37 Konstantin Exp $ -/ISO-8859-15-Encoding [ - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /space - /exclam - /quotedbl - /numbersign - /dollar - /percent - /ampersand - /quotesingle - /parenleft - /parenright - /asterisk - /plus - /comma - /hyphen - /period - /slash - /zero - /one - /two - /three - /four - /five - /six - /seven - /eight - /nine - /colon - /semicolon - /less - /equal - /greater - /question - /at - /A - /B - /C - /D - /E - /F - /G - /H - /I - /J - /K - /L - /M - /N - /O - /P - /Q - /R - /S - /T - /U - /V - /W - /X - /Y - /Z - /bracketleft - /backslash - /bracketright - /asciicircum - /underscore - /grave - /a - /b - /c - /d - /e - /f - /g - /h - /i - /j - /k - /l - /m - /n - /o - /p - /q - /r - /s - /t - /u - /v - /w - /x - /y - /z - /braceleft - /bar - /braceright - /asciitilde - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /uni00A0 - /exclamdown - /cent - /sterling - /Euro - /yen - /Scaron - /section - /scaron - /copyright - /ordfeminine - /guillemotleft - /logicalnot - /uni00AD - /registered - /macron - /degree - /plusminus - /twosuperior - /threesuperior - /Zcaron - /mu - /paragraph - /periodcentered - /zcaron - /onesuperior - /ordmasculine - /guillemotright - /OE - /oe - /Ydieresis - /questiondown - /Agrave - /Aacute - /Acircumflex - /Atilde - /Adieresis - /Aring - /AE - /Ccedilla - /Egrave - /Eacute - /Ecircumflex - /Edieresis - /Igrave - /Iacute - /Icircumflex - /Idieresis - /Eth - /Ntilde - /Ograve - /Oacute - /Ocircumflex - /Otilde - /Odieresis - /multiply - /Oslash - /Ugrave - /Uacute - /Ucircumflex - /Udieresis - /Yacute - /Thorn - /germandbls - /agrave - /aacute - /acircumflex - /atilde - /adieresis - /aring - /ae - /ccedilla - /egrave - /eacute - /ecircumflex - /edieresis - /igrave - /iacute - /icircumflex - /idieresis - /eth - /ntilde - /ograve - /oacute - /ocircumflex - /otilde - /odieresis - /divide - /oslash - /ugrave - /uacute - /ucircumflex - /udieresis - /yacute - /thorn - /ydieresis +% $Header: /cvsroot/html2ps/postscript/encoding.iso-8859-15.ps,v 1.1 2005/12/18 07:21:37 Konstantin Exp $ +/ISO-8859-15-Encoding [ + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /space + /exclam + /quotedbl + /numbersign + /dollar + /percent + /ampersand + /quotesingle + /parenleft + /parenright + /asterisk + /plus + /comma + /hyphen + /period + /slash + /zero + /one + /two + /three + /four + /five + /six + /seven + /eight + /nine + /colon + /semicolon + /less + /equal + /greater + /question + /at + /A + /B + /C + /D + /E + /F + /G + /H + /I + /J + /K + /L + /M + /N + /O + /P + /Q + /R + /S + /T + /U + /V + /W + /X + /Y + /Z + /bracketleft + /backslash + /bracketright + /asciicircum + /underscore + /grave + /a + /b + /c + /d + /e + /f + /g + /h + /i + /j + /k + /l + /m + /n + /o + /p + /q + /r + /s + /t + /u + /v + /w + /x + /y + /z + /braceleft + /bar + /braceright + /asciitilde + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /uni00A0 + /exclamdown + /cent + /sterling + /Euro + /yen + /Scaron + /section + /scaron + /copyright + /ordfeminine + /guillemotleft + /logicalnot + /uni00AD + /registered + /macron + /degree + /plusminus + /twosuperior + /threesuperior + /Zcaron + /mu + /paragraph + /periodcentered + /zcaron + /onesuperior + /ordmasculine + /guillemotright + /OE + /oe + /Ydieresis + /questiondown + /Agrave + /Aacute + /Acircumflex + /Atilde + /Adieresis + /Aring + /AE + /Ccedilla + /Egrave + /Eacute + /Ecircumflex + /Edieresis + /Igrave + /Iacute + /Icircumflex + /Idieresis + /Eth + /Ntilde + /Ograve + /Oacute + /Ocircumflex + /Otilde + /Odieresis + /multiply + /Oslash + /Ugrave + /Uacute + /Ucircumflex + /Udieresis + /Yacute + /Thorn + /germandbls + /agrave + /aacute + /acircumflex + /atilde + /adieresis + /aring + /ae + /ccedilla + /egrave + /eacute + /ecircumflex + /edieresis + /igrave + /iacute + /icircumflex + /idieresis + /eth + /ntilde + /ograve + /oacute + /ocircumflex + /otilde + /odieresis + /divide + /oslash + /ugrave + /uacute + /ucircumflex + /udieresis + /yacute + /thorn + /ydieresis ] readonly def \ No newline at end of file diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/encoding.iso-8859-2.ps b/thirdparty/html2ps_pdf/postscript/encoding.iso-8859-2.ps similarity index 98% rename from gulliver/thirdparty/html2ps_pdf/postscript/encoding.iso-8859-2.ps rename to thirdparty/html2ps_pdf/postscript/encoding.iso-8859-2.ps index d72e18470..dbc0f1236 100644 --- a/gulliver/thirdparty/html2ps_pdf/postscript/encoding.iso-8859-2.ps +++ b/thirdparty/html2ps_pdf/postscript/encoding.iso-8859-2.ps @@ -1,2 +1,2 @@ -% $Header: /cvsroot/html2ps/postscript/encoding.iso-8859-2.ps,v 1.2 2006/01/13 20:18:51 Konstantin Exp $ -/ISO-8859-1-Encoding ISOLatin1Encoding def +% $Header: /cvsroot/html2ps/postscript/encoding.iso-8859-2.ps,v 1.2 2006/01/13 20:18:51 Konstantin Exp $ +/ISO-8859-1-Encoding ISOLatin1Encoding def diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/encoding.iso-8859-3.ps b/thirdparty/html2ps_pdf/postscript/encoding.iso-8859-3.ps similarity index 91% rename from gulliver/thirdparty/html2ps_pdf/postscript/encoding.iso-8859-3.ps rename to thirdparty/html2ps_pdf/postscript/encoding.iso-8859-3.ps index 59af8d039..e65becf9d 100644 --- a/gulliver/thirdparty/html2ps_pdf/postscript/encoding.iso-8859-3.ps +++ b/thirdparty/html2ps_pdf/postscript/encoding.iso-8859-3.ps @@ -1,259 +1,259 @@ -% $Header: /cvsroot/html2ps/postscript/encoding.iso-8859-3.ps,v 1.1 2005/12/18 07:21:37 Konstantin Exp $ -/ISO-8859-3-Encoding [ - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /space - /exclam - /quotedbl - /numbersign - /dollar - /percent - /ampersand - /quotesingle - /parenleft - /parenright - /asterisk - /plus - /comma - /hyphen - /period - /slash - /zero - /one - /two - /three - /four - /five - /six - /seven - /eight - /nine - /colon - /semicolon - /less - /equal - /greater - /question - /at - /A - /B - /C - /D - /E - /F - /G - /H - /I - /J - /K - /L - /M - /N - /O - /P - /Q - /R - /S - /T - /U - /V - /W - /X - /Y - /Z - /bracketleft - /backslash - /bracketright - /asciicircum - /underscore - /grave - /a - /b - /c - /d - /e - /f - /g - /h - /i - /j - /k - /l - /m - /n - /o - /p - /q - /r - /s - /t - /u - /v - /w - /x - /y - /z - /braceleft - /bar - /braceright - /asciitilde - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /uni00A0 - /Hbar - /breve - /sterling - /currency - /yen - /Hcircumflex - /section - /dieresis - /Idotaccent - /Scedilla - /Gbreve - /Jcircumflex - /uni00AD - /registered - /Zdotaccent - /degree - /hbar - /twosuperior - /threesuperior - /acute - /mu - /hcircumflex - /periodcentered - /cedilla - /dotlessi - /scedilla - /gbreve - /jcircumflex - /onehalf - /threequarters - /zdotaccent - /Agrave - /Aacute - /Acircumflex - /Atilde - /Adieresis - /Cdotaccent - /Ccircumflex - /Ccedilla - /Egrave - /Eacute - /Ecircumflex - /Edieresis - /Igrave - /Iacute - /Icircumflex - /Idieresis - /Eth - /Ntilde - /Ograve - /Oacute - /Ocircumflex - /Gdotaccent - /Odieresis - /multiply - /Gcircumflex - /Ugrave - /Uacute - /Ucircumflex - /Udieresis - /Ubreve - /Scircumflex - /germandbls - /agrave - /aacute - /acircumflex - /atilde - /adieresis - /cdotaccent - /ccircumflex - /ccedilla - /egrave - /eacute - /ecircumflex - /edieresis - /igrave - /iacute - /icircumflex - /idieresis - /eth - /ntilde - /ograve - /oacute - /ocircumflex - /gdotaccent - /odieresis - /divide - /gcircumflex - /ugrave - /uacute - /ucircumflex - /udieresis - /ubreve - /scircumflex - /dotaccent +% $Header: /cvsroot/html2ps/postscript/encoding.iso-8859-3.ps,v 1.1 2005/12/18 07:21:37 Konstantin Exp $ +/ISO-8859-3-Encoding [ + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /space + /exclam + /quotedbl + /numbersign + /dollar + /percent + /ampersand + /quotesingle + /parenleft + /parenright + /asterisk + /plus + /comma + /hyphen + /period + /slash + /zero + /one + /two + /three + /four + /five + /six + /seven + /eight + /nine + /colon + /semicolon + /less + /equal + /greater + /question + /at + /A + /B + /C + /D + /E + /F + /G + /H + /I + /J + /K + /L + /M + /N + /O + /P + /Q + /R + /S + /T + /U + /V + /W + /X + /Y + /Z + /bracketleft + /backslash + /bracketright + /asciicircum + /underscore + /grave + /a + /b + /c + /d + /e + /f + /g + /h + /i + /j + /k + /l + /m + /n + /o + /p + /q + /r + /s + /t + /u + /v + /w + /x + /y + /z + /braceleft + /bar + /braceright + /asciitilde + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /uni00A0 + /Hbar + /breve + /sterling + /currency + /yen + /Hcircumflex + /section + /dieresis + /Idotaccent + /Scedilla + /Gbreve + /Jcircumflex + /uni00AD + /registered + /Zdotaccent + /degree + /hbar + /twosuperior + /threesuperior + /acute + /mu + /hcircumflex + /periodcentered + /cedilla + /dotlessi + /scedilla + /gbreve + /jcircumflex + /onehalf + /threequarters + /zdotaccent + /Agrave + /Aacute + /Acircumflex + /Atilde + /Adieresis + /Cdotaccent + /Ccircumflex + /Ccedilla + /Egrave + /Eacute + /Ecircumflex + /Edieresis + /Igrave + /Iacute + /Icircumflex + /Idieresis + /Eth + /Ntilde + /Ograve + /Oacute + /Ocircumflex + /Gdotaccent + /Odieresis + /multiply + /Gcircumflex + /Ugrave + /Uacute + /Ucircumflex + /Udieresis + /Ubreve + /Scircumflex + /germandbls + /agrave + /aacute + /acircumflex + /atilde + /adieresis + /cdotaccent + /ccircumflex + /ccedilla + /egrave + /eacute + /ecircumflex + /edieresis + /igrave + /iacute + /icircumflex + /idieresis + /eth + /ntilde + /ograve + /oacute + /ocircumflex + /gdotaccent + /odieresis + /divide + /gcircumflex + /ugrave + /uacute + /ucircumflex + /udieresis + /ubreve + /scircumflex + /dotaccent ] readonly def \ No newline at end of file diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/encoding.iso-8859-4.ps b/thirdparty/html2ps_pdf/postscript/encoding.iso-8859-4.ps similarity index 91% rename from gulliver/thirdparty/html2ps_pdf/postscript/encoding.iso-8859-4.ps rename to thirdparty/html2ps_pdf/postscript/encoding.iso-8859-4.ps index 7932fec2c..d309604a0 100644 --- a/gulliver/thirdparty/html2ps_pdf/postscript/encoding.iso-8859-4.ps +++ b/thirdparty/html2ps_pdf/postscript/encoding.iso-8859-4.ps @@ -1,259 +1,259 @@ -% $Header: /cvsroot/html2ps/postscript/encoding.iso-8859-4.ps,v 1.1 2005/12/18 07:21:37 Konstantin Exp $ -/ISO-8859-4-Encoding [ - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /space - /exclam - /quotedbl - /numbersign - /dollar - /percent - /ampersand - /quotesingle - /parenleft - /parenright - /asterisk - /plus - /comma - /hyphen - /period - /slash - /zero - /one - /two - /three - /four - /five - /six - /seven - /eight - /nine - /colon - /semicolon - /less - /equal - /greater - /question - /at - /A - /B - /C - /D - /E - /F - /G - /H - /I - /J - /K - /L - /M - /N - /O - /P - /Q - /R - /S - /T - /U - /V - /W - /X - /Y - /Z - /bracketleft - /backslash - /bracketright - /asciicircum - /underscore - /grave - /a - /b - /c - /d - /e - /f - /g - /h - /i - /j - /k - /l - /m - /n - /o - /p - /q - /r - /s - /t - /u - /v - /w - /x - /y - /z - /braceleft - /bar - /braceright - /asciitilde - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /uni00A0 - /Aogonek - /kgreenlandic - /Rcommaaccent - /currency - /Itilde - /Lcommaaccent - /section - /dieresis - /Scaron - /Emacron - /Gcommaaccent - /Tbar - /uni00AD - /Zcaron - /macron - /degree - /aogonek - /ogonek - /rcommaaccent - /acute - /itilde - /lcommaaccent - /caron - /cedilla - /scaron - /emacron - /gcommaaccent - /tbar - /Eng - /zcaron - /eng - /Amacron - /Aacute - /Acircumflex - /Atilde - /Adieresis - /Aring - /AE - /Iogonek - /Ccaron - /Eacute - /Eogonek - /Edieresis - /Edotaccent - /Iacute - /Icircumflex - /Imacron - /Dcroat - /Ncommaaccent - /Omacron - /Kcommaaccent - /Ocircumflex - /Otilde - /Odieresis - /multiply - /Oslash - /Uogonek - /Uacute - /Ucircumflex - /Udieresis - /Utilde - /Umacron - /germandbls - /amacron - /aacute - /acircumflex - /atilde - /adieresis - /aring - /ae - /iogonek - /ccaron - /eacute - /eogonek - /edieresis - /edotaccent - /iacute - /icircumflex - /imacron - /dcroat - /ncommaaccent - /omacron - /kcommaaccent - /ocircumflex - /otilde - /odieresis - /divide - /oslash - /uogonek - /uacute - /ucircumflex - /udieresis - /utilde - /umacron - /dotaccent +% $Header: /cvsroot/html2ps/postscript/encoding.iso-8859-4.ps,v 1.1 2005/12/18 07:21:37 Konstantin Exp $ +/ISO-8859-4-Encoding [ + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /space + /exclam + /quotedbl + /numbersign + /dollar + /percent + /ampersand + /quotesingle + /parenleft + /parenright + /asterisk + /plus + /comma + /hyphen + /period + /slash + /zero + /one + /two + /three + /four + /five + /six + /seven + /eight + /nine + /colon + /semicolon + /less + /equal + /greater + /question + /at + /A + /B + /C + /D + /E + /F + /G + /H + /I + /J + /K + /L + /M + /N + /O + /P + /Q + /R + /S + /T + /U + /V + /W + /X + /Y + /Z + /bracketleft + /backslash + /bracketright + /asciicircum + /underscore + /grave + /a + /b + /c + /d + /e + /f + /g + /h + /i + /j + /k + /l + /m + /n + /o + /p + /q + /r + /s + /t + /u + /v + /w + /x + /y + /z + /braceleft + /bar + /braceright + /asciitilde + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /uni00A0 + /Aogonek + /kgreenlandic + /Rcommaaccent + /currency + /Itilde + /Lcommaaccent + /section + /dieresis + /Scaron + /Emacron + /Gcommaaccent + /Tbar + /uni00AD + /Zcaron + /macron + /degree + /aogonek + /ogonek + /rcommaaccent + /acute + /itilde + /lcommaaccent + /caron + /cedilla + /scaron + /emacron + /gcommaaccent + /tbar + /Eng + /zcaron + /eng + /Amacron + /Aacute + /Acircumflex + /Atilde + /Adieresis + /Aring + /AE + /Iogonek + /Ccaron + /Eacute + /Eogonek + /Edieresis + /Edotaccent + /Iacute + /Icircumflex + /Imacron + /Dcroat + /Ncommaaccent + /Omacron + /Kcommaaccent + /Ocircumflex + /Otilde + /Odieresis + /multiply + /Oslash + /Uogonek + /Uacute + /Ucircumflex + /Udieresis + /Utilde + /Umacron + /germandbls + /amacron + /aacute + /acircumflex + /atilde + /adieresis + /aring + /ae + /iogonek + /ccaron + /eacute + /eogonek + /edieresis + /edotaccent + /iacute + /icircumflex + /imacron + /dcroat + /ncommaaccent + /omacron + /kcommaaccent + /ocircumflex + /otilde + /odieresis + /divide + /oslash + /uogonek + /uacute + /ucircumflex + /udieresis + /utilde + /umacron + /dotaccent ] readonly def \ No newline at end of file diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/encoding.iso-8859-5.ps b/thirdparty/html2ps_pdf/postscript/encoding.iso-8859-5.ps similarity index 91% rename from gulliver/thirdparty/html2ps_pdf/postscript/encoding.iso-8859-5.ps rename to thirdparty/html2ps_pdf/postscript/encoding.iso-8859-5.ps index 64d4a12bf..837dfc839 100644 --- a/gulliver/thirdparty/html2ps_pdf/postscript/encoding.iso-8859-5.ps +++ b/thirdparty/html2ps_pdf/postscript/encoding.iso-8859-5.ps @@ -1,259 +1,259 @@ -% $Header: /cvsroot/html2ps/postscript/encoding.iso-8859-5.ps,v 1.1 2005/12/18 07:21:38 Konstantin Exp $ -/ISO-8859-5-Encoding [ - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /space - /exclam - /quotedbl - /numbersign - /dollar - /percent - /ampersand - /quotesingle - /parenleft - /parenright - /asterisk - /plus - /comma - /hyphen - /period - /slash - /zero - /one - /two - /three - /four - /five - /six - /seven - /eight - /nine - /colon - /semicolon - /less - /equal - /greater - /question - /at - /A - /B - /C - /D - /E - /F - /G - /H - /I - /J - /K - /L - /M - /N - /O - /P - /Q - /R - /S - /T - /U - /V - /W - /X - /Y - /Z - /bracketleft - /backslash - /bracketright - /asciicircum - /underscore - /grave - /a - /b - /c - /d - /e - /f - /g - /h - /i - /j - /k - /l - /m - /n - /o - /p - /q - /r - /s - /t - /u - /v - /w - /x - /y - /z - /braceleft - /bar - /braceright - /asciitilde - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /uni00A0 - /afii10023 - /afii10051 - /afii10052 - /afii10053 - /afii10054 - /afii10055 - /afii10056 - /afii10057 - /afii10058 - /afii10059 - /afii10060 - /afii10061 - /uni00AD - /afii10062 - /afii10145 - /afii10017 - /afii10018 - /afii10019 - /afii10020 - /afii10021 - /afii10022 - /afii10024 - /afii10025 - /afii10026 - /afii10027 - /afii10028 - /afii10029 - /afii10030 - /afii10031 - /afii10032 - /afii10033 - /afii10034 - /afii10035 - /afii10036 - /afii10037 - /afii10038 - /afii10039 - /afii10040 - /afii10041 - /afii10042 - /afii10043 - /afii10044 - /afii10045 - /afii10046 - /afii10047 - /afii10048 - /afii10049 - /afii10065 - /afii10066 - /afii10067 - /afii10068 - /afii10069 - /afii10070 - /afii10072 - /afii10073 - /afii10074 - /afii10075 - /afii10076 - /afii10077 - /afii10078 - /afii10079 - /afii10080 - /afii10081 - /afii10082 - /afii10083 - /afii10084 - /afii10085 - /afii10086 - /afii10087 - /afii10088 - /afii10089 - /afii10090 - /afii10091 - /afii10092 - /afii10093 - /afii10094 - /afii10095 - /afii10096 - /afii10097 - /afii61352 - /afii10071 - /afii10099 - /afii10100 - /afii10101 - /afii10102 - /afii10103 - /afii10104 - /afii10105 - /afii10106 - /afii10107 - /afii10108 - /afii10109 - /section - /afii10110 - /afii10193 +% $Header: /cvsroot/html2ps/postscript/encoding.iso-8859-5.ps,v 1.1 2005/12/18 07:21:38 Konstantin Exp $ +/ISO-8859-5-Encoding [ + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /space + /exclam + /quotedbl + /numbersign + /dollar + /percent + /ampersand + /quotesingle + /parenleft + /parenright + /asterisk + /plus + /comma + /hyphen + /period + /slash + /zero + /one + /two + /three + /four + /five + /six + /seven + /eight + /nine + /colon + /semicolon + /less + /equal + /greater + /question + /at + /A + /B + /C + /D + /E + /F + /G + /H + /I + /J + /K + /L + /M + /N + /O + /P + /Q + /R + /S + /T + /U + /V + /W + /X + /Y + /Z + /bracketleft + /backslash + /bracketright + /asciicircum + /underscore + /grave + /a + /b + /c + /d + /e + /f + /g + /h + /i + /j + /k + /l + /m + /n + /o + /p + /q + /r + /s + /t + /u + /v + /w + /x + /y + /z + /braceleft + /bar + /braceright + /asciitilde + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /uni00A0 + /afii10023 + /afii10051 + /afii10052 + /afii10053 + /afii10054 + /afii10055 + /afii10056 + /afii10057 + /afii10058 + /afii10059 + /afii10060 + /afii10061 + /uni00AD + /afii10062 + /afii10145 + /afii10017 + /afii10018 + /afii10019 + /afii10020 + /afii10021 + /afii10022 + /afii10024 + /afii10025 + /afii10026 + /afii10027 + /afii10028 + /afii10029 + /afii10030 + /afii10031 + /afii10032 + /afii10033 + /afii10034 + /afii10035 + /afii10036 + /afii10037 + /afii10038 + /afii10039 + /afii10040 + /afii10041 + /afii10042 + /afii10043 + /afii10044 + /afii10045 + /afii10046 + /afii10047 + /afii10048 + /afii10049 + /afii10065 + /afii10066 + /afii10067 + /afii10068 + /afii10069 + /afii10070 + /afii10072 + /afii10073 + /afii10074 + /afii10075 + /afii10076 + /afii10077 + /afii10078 + /afii10079 + /afii10080 + /afii10081 + /afii10082 + /afii10083 + /afii10084 + /afii10085 + /afii10086 + /afii10087 + /afii10088 + /afii10089 + /afii10090 + /afii10091 + /afii10092 + /afii10093 + /afii10094 + /afii10095 + /afii10096 + /afii10097 + /afii61352 + /afii10071 + /afii10099 + /afii10100 + /afii10101 + /afii10102 + /afii10103 + /afii10104 + /afii10105 + /afii10106 + /afii10107 + /afii10108 + /afii10109 + /section + /afii10110 + /afii10193 ] readonly def \ No newline at end of file diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/encoding.iso-8859-7.ps b/thirdparty/html2ps_pdf/postscript/encoding.iso-8859-7.ps similarity index 91% rename from gulliver/thirdparty/html2ps_pdf/postscript/encoding.iso-8859-7.ps rename to thirdparty/html2ps_pdf/postscript/encoding.iso-8859-7.ps index 83e990bd8..2e1eb821b 100644 --- a/gulliver/thirdparty/html2ps_pdf/postscript/encoding.iso-8859-7.ps +++ b/thirdparty/html2ps_pdf/postscript/encoding.iso-8859-7.ps @@ -1,259 +1,259 @@ -% $Header: /cvsroot/html2ps/postscript/encoding.iso-8859-7.ps,v 1.1 2005/12/18 07:21:38 Konstantin Exp $ -/ISO-8859-7-Encoding [ - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /space - /exclam - /quotedbl - /numbersign - /dollar - /percent - /ampersand - /quotesingle - /parenleft - /parenright - /asterisk - /plus - /comma - /hyphen - /period - /slash - /zero - /one - /two - /three - /four - /five - /six - /seven - /eight - /nine - /colon - /semicolon - /less - /equal - /greater - /question - /at - /A - /B - /C - /D - /E - /F - /G - /H - /I - /J - /K - /L - /M - /N - /O - /P - /Q - /R - /S - /T - /U - /V - /W - /X - /Y - /Z - /bracketleft - /backslash - /bracketright - /asciicircum - /underscore - /grave - /a - /b - /c - /d - /e - /f - /g - /h - /i - /j - /k - /l - /m - /n - /o - /p - /q - /r - /s - /t - /u - /v - /w - /x - /y - /z - /braceleft - /bar - /braceright - /asciitilde - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /uni00A0 - /afii64937 - /afii57929 - /sterling - /currency - /yen - /brokenbar - /section - /dieresis - /copyright - /ordfeminine - /guillemotleft - /logicalnot - /uni00AD - /registered - /afii00208 - /degree - /plusminus - /twosuperior - /threesuperior - /tonos - /dieresistonos - /Alphatonos - /periodcentered - /Epsilontonos - /Etatonos - /Iotatonos - /guillemotright - /Omicrontonos - /onehalf - /Upsilontonos - /Omegatonos - /iotadieresistonos - /Alpha - /Beta - /Gamma - /Delta - /Epsilon - /Zeta - /Eta - /Theta - /Iota - /Kappa - /Lambda - /Mu - /Nu - /Xi - /Omicron - /Pi - /Rho - /Ograve - /Sigma - /Tau - /Upsilon - /Phi - /Chi - /Psi - /Omega - /Iotadieresis - /Upsilondieresis - /alphatonos - /epsilontonos - /etatonos - /iotatonos - /upsilondieresistonos - /alpha - /beta - /gamma - /delta - /epsilon - /zeta - /eta - /theta - /iota - /kappa - /lambda - /uni03BC - /nu - /xi - /omicron - /pi - /rho - /sigma1 - /sigma - /tau - /upsilon - /phi - /chi - /psi - /omega - /iotadieresis - /upsilondieresis - /omicrontonos - /upsilontonos - /omegatonos - /ydieresis +% $Header: /cvsroot/html2ps/postscript/encoding.iso-8859-7.ps,v 1.1 2005/12/18 07:21:38 Konstantin Exp $ +/ISO-8859-7-Encoding [ + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /space + /exclam + /quotedbl + /numbersign + /dollar + /percent + /ampersand + /quotesingle + /parenleft + /parenright + /asterisk + /plus + /comma + /hyphen + /period + /slash + /zero + /one + /two + /three + /four + /five + /six + /seven + /eight + /nine + /colon + /semicolon + /less + /equal + /greater + /question + /at + /A + /B + /C + /D + /E + /F + /G + /H + /I + /J + /K + /L + /M + /N + /O + /P + /Q + /R + /S + /T + /U + /V + /W + /X + /Y + /Z + /bracketleft + /backslash + /bracketright + /asciicircum + /underscore + /grave + /a + /b + /c + /d + /e + /f + /g + /h + /i + /j + /k + /l + /m + /n + /o + /p + /q + /r + /s + /t + /u + /v + /w + /x + /y + /z + /braceleft + /bar + /braceright + /asciitilde + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /uni00A0 + /afii64937 + /afii57929 + /sterling + /currency + /yen + /brokenbar + /section + /dieresis + /copyright + /ordfeminine + /guillemotleft + /logicalnot + /uni00AD + /registered + /afii00208 + /degree + /plusminus + /twosuperior + /threesuperior + /tonos + /dieresistonos + /Alphatonos + /periodcentered + /Epsilontonos + /Etatonos + /Iotatonos + /guillemotright + /Omicrontonos + /onehalf + /Upsilontonos + /Omegatonos + /iotadieresistonos + /Alpha + /Beta + /Gamma + /Delta + /Epsilon + /Zeta + /Eta + /Theta + /Iota + /Kappa + /Lambda + /Mu + /Nu + /Xi + /Omicron + /Pi + /Rho + /Ograve + /Sigma + /Tau + /Upsilon + /Phi + /Chi + /Psi + /Omega + /Iotadieresis + /Upsilondieresis + /alphatonos + /epsilontonos + /etatonos + /iotatonos + /upsilondieresistonos + /alpha + /beta + /gamma + /delta + /epsilon + /zeta + /eta + /theta + /iota + /kappa + /lambda + /uni03BC + /nu + /xi + /omicron + /pi + /rho + /sigma1 + /sigma + /tau + /upsilon + /phi + /chi + /psi + /omega + /iotadieresis + /upsilondieresis + /omicrontonos + /upsilontonos + /omegatonos + /ydieresis ] readonly def \ No newline at end of file diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/encoding.iso-8859-9.ps b/thirdparty/html2ps_pdf/postscript/encoding.iso-8859-9.ps similarity index 91% rename from gulliver/thirdparty/html2ps_pdf/postscript/encoding.iso-8859-9.ps rename to thirdparty/html2ps_pdf/postscript/encoding.iso-8859-9.ps index 5c29364e2..5ae27ec1a 100644 --- a/gulliver/thirdparty/html2ps_pdf/postscript/encoding.iso-8859-9.ps +++ b/thirdparty/html2ps_pdf/postscript/encoding.iso-8859-9.ps @@ -1,259 +1,259 @@ -% $Header: /cvsroot/html2ps/postscript/encoding.iso-8859-9.ps,v 1.1 2005/12/18 07:21:38 Konstantin Exp $ -/ISO-8859-9-Encoding [ - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /space - /exclam - /quotedbl - /numbersign - /dollar - /percent - /ampersand - /quotesingle - /parenleft - /parenright - /asterisk - /plus - /comma - /hyphen - /period - /slash - /zero - /one - /two - /three - /four - /five - /six - /seven - /eight - /nine - /colon - /semicolon - /less - /equal - /greater - /question - /at - /A - /B - /C - /D - /E - /F - /G - /H - /I - /J - /K - /L - /M - /N - /O - /P - /Q - /R - /S - /T - /U - /V - /W - /X - /Y - /Z - /bracketleft - /backslash - /bracketright - /asciicircum - /underscore - /grave - /a - /b - /c - /d - /e - /f - /g - /h - /i - /j - /k - /l - /m - /n - /o - /p - /q - /r - /s - /t - /u - /v - /w - /x - /y - /z - /braceleft - /bar - /braceright - /asciitilde - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /uni00A0 - /exclamdown - /cent - /sterling - /currency - /yen - /brokenbar - /section - /dieresis - /copyright - /ordfeminine - /guillemotleft - /logicalnot - /uni00AD - /registered - /macron - /degree - /plusminus - /twosuperior - /threesuperior - /acute - /mu - /paragraph - /periodcentered - /cedilla - /onesuperior - /ordmasculine - /guillemotright - /onequarter - /onehalf - /threequarters - /questiondown - /Agrave - /Aacute - /Acircumflex - /Atilde - /Adieresis - /Aring - /AE - /Ccedilla - /Egrave - /Eacute - /Ecircumflex - /Edieresis - /Igrave - /Iacute - /Icircumflex - /Idieresis - /Gbreve - /Ntilde - /Ograve - /Oacute - /Ocircumflex - /Otilde - /Odieresis - /multiply - /Oslash - /Ugrave - /Uacute - /Ucircumflex - /Udieresis - /Idotaccent - /Scedilla - /germandbls - /agrave - /aacute - /acircumflex - /atilde - /adieresis - /aring - /ae - /ccedilla - /egrave - /eacute - /ecircumflex - /edieresis - /igrave - /iacute - /icircumflex - /idieresis - /gbreve - /ntilde - /ograve - /oacute - /ocircumflex - /otilde - /odieresis - /divide - /oslash - /ugrave - /uacute - /ucircumflex - /udieresis - /dotlessi - /scedilla - /ydieresis +% $Header: /cvsroot/html2ps/postscript/encoding.iso-8859-9.ps,v 1.1 2005/12/18 07:21:38 Konstantin Exp $ +/ISO-8859-9-Encoding [ + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /space + /exclam + /quotedbl + /numbersign + /dollar + /percent + /ampersand + /quotesingle + /parenleft + /parenright + /asterisk + /plus + /comma + /hyphen + /period + /slash + /zero + /one + /two + /three + /four + /five + /six + /seven + /eight + /nine + /colon + /semicolon + /less + /equal + /greater + /question + /at + /A + /B + /C + /D + /E + /F + /G + /H + /I + /J + /K + /L + /M + /N + /O + /P + /Q + /R + /S + /T + /U + /V + /W + /X + /Y + /Z + /bracketleft + /backslash + /bracketright + /asciicircum + /underscore + /grave + /a + /b + /c + /d + /e + /f + /g + /h + /i + /j + /k + /l + /m + /n + /o + /p + /q + /r + /s + /t + /u + /v + /w + /x + /y + /z + /braceleft + /bar + /braceright + /asciitilde + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /uni00A0 + /exclamdown + /cent + /sterling + /currency + /yen + /brokenbar + /section + /dieresis + /copyright + /ordfeminine + /guillemotleft + /logicalnot + /uni00AD + /registered + /macron + /degree + /plusminus + /twosuperior + /threesuperior + /acute + /mu + /paragraph + /periodcentered + /cedilla + /onesuperior + /ordmasculine + /guillemotright + /onequarter + /onehalf + /threequarters + /questiondown + /Agrave + /Aacute + /Acircumflex + /Atilde + /Adieresis + /Aring + /AE + /Ccedilla + /Egrave + /Eacute + /Ecircumflex + /Edieresis + /Igrave + /Iacute + /Icircumflex + /Idieresis + /Gbreve + /Ntilde + /Ograve + /Oacute + /Ocircumflex + /Otilde + /Odieresis + /multiply + /Oslash + /Ugrave + /Uacute + /Ucircumflex + /Udieresis + /Idotaccent + /Scedilla + /germandbls + /agrave + /aacute + /acircumflex + /atilde + /adieresis + /aring + /ae + /ccedilla + /egrave + /eacute + /ecircumflex + /edieresis + /igrave + /iacute + /icircumflex + /idieresis + /gbreve + /ntilde + /ograve + /oacute + /ocircumflex + /otilde + /odieresis + /divide + /oslash + /ugrave + /uacute + /ucircumflex + /udieresis + /dotlessi + /scedilla + /ydieresis ] readonly def \ No newline at end of file diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/encoding.koi8-r.ps b/thirdparty/html2ps_pdf/postscript/encoding.koi8-r.ps similarity index 91% rename from gulliver/thirdparty/html2ps_pdf/postscript/encoding.koi8-r.ps rename to thirdparty/html2ps_pdf/postscript/encoding.koi8-r.ps index 7d516e5c0..41a436464 100644 --- a/gulliver/thirdparty/html2ps_pdf/postscript/encoding.koi8-r.ps +++ b/thirdparty/html2ps_pdf/postscript/encoding.koi8-r.ps @@ -1,259 +1,259 @@ -% $Header: /cvsroot/html2ps/postscript/encoding.koi8-r.ps,v 1.1 2005/12/18 07:21:38 Konstantin Exp $ -/KOI8-R-Encoding [ - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /space - /exclam - /quotedbl - /numbersign - /dollar - /percent - /ampersand - /quotesingle - /parenleft - /parenright - /asterisk - /plus - /comma - /hyphen - /period - /slash - /zero - /one - /two - /three - /four - /five - /six - /seven - /eight - /nine - /colon - /semicolon - /less - /equal - /greater - /question - /at - /A - /B - /C - /D - /E - /F - /G - /H - /I - /J - /K - /L - /M - /N - /O - /P - /Q - /R - /S - /T - /U - /V - /W - /X - /Y - /Z - /bracketleft - /backslash - /bracketright - /asciicircum - /underscore - /grave - /a - /b - /c - /d - /e - /f - /g - /h - /i - /j - /k - /l - /m - /n - /o - /p - /q - /r - /s - /t - /u - /v - /w - /x - /y - /z - /braceleft - /bar - /braceright - /asciitilde - /.notdef - /SF100000 - /SF110000 - /SF010000 - /SF030000 - /SF020000 - /SF040000 - /SF080000 - /SF090000 - /SF060000 - /SF070000 - /SF050000 - /upblock - /dnblock - /block - /lfblock - /rtblock - /ltshade - /shade - /dkshade - /integraltp - /filledbox - /uni2219 - /radical - /approxequal - /lessequal - /greaterequal - /uni00A0 - /integralbt - /degree - /twosuperior - /periodcentered - /divide - /SF430000 - /SF240000 - /SF510000 - /afii10071 - /SF520000 - /SF390000 - /SF220000 - /SF210000 - /SF250000 - /SF500000 - /SF490000 - /SF380000 - /SF280000 - /SF270000 - /SF260000 - /SF360000 - /SF370000 - /SF420000 - /SF190000 - /afii10023 - /SF200000 - /SF230000 - /SF470000 - /SF480000 - /SF410000 - /SF450000 - /SF460000 - /SF400000 - /SF540000 - /SF530000 - /SF440000 - /copyright - /afii10096 - /afii10065 - /afii10066 - /afii10088 - /afii10069 - /afii10070 - /afii10086 - /afii10068 - /afii10087 - /afii10074 - /afii10075 - /afii10076 - /afii10077 - /afii10078 - /afii10079 - /afii10080 - /afii10081 - /afii10097 - /afii10082 - /afii10083 - /afii10084 - /afii10085 - /afii10072 - /afii10067 - /afii10094 - /afii10093 - /afii10073 - /afii10090 - /afii10095 - /afii10091 - /afii10089 - /afii10092 - /afii10048 - /afii10017 - /afii10018 - /afii10040 - /afii10021 - /afii10022 - /afii10038 - /afii10020 - /afii10039 - /afii10026 - /afii10027 - /afii10028 - /afii10029 - /afii10030 - /afii10031 - /afii10032 - /afii10033 - /afii10049 - /afii10034 - /afii10035 - /afii10036 - /afii10037 - /afii10024 - /afii10019 - /afii10046 - /afii10045 - /afii10025 - /afii10042 - /afii10047 - /afii10043 - /afii10041 - /afii10044 +% $Header: /cvsroot/html2ps/postscript/encoding.koi8-r.ps,v 1.1 2005/12/18 07:21:38 Konstantin Exp $ +/KOI8-R-Encoding [ + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /space + /exclam + /quotedbl + /numbersign + /dollar + /percent + /ampersand + /quotesingle + /parenleft + /parenright + /asterisk + /plus + /comma + /hyphen + /period + /slash + /zero + /one + /two + /three + /four + /five + /six + /seven + /eight + /nine + /colon + /semicolon + /less + /equal + /greater + /question + /at + /A + /B + /C + /D + /E + /F + /G + /H + /I + /J + /K + /L + /M + /N + /O + /P + /Q + /R + /S + /T + /U + /V + /W + /X + /Y + /Z + /bracketleft + /backslash + /bracketright + /asciicircum + /underscore + /grave + /a + /b + /c + /d + /e + /f + /g + /h + /i + /j + /k + /l + /m + /n + /o + /p + /q + /r + /s + /t + /u + /v + /w + /x + /y + /z + /braceleft + /bar + /braceright + /asciitilde + /.notdef + /SF100000 + /SF110000 + /SF010000 + /SF030000 + /SF020000 + /SF040000 + /SF080000 + /SF090000 + /SF060000 + /SF070000 + /SF050000 + /upblock + /dnblock + /block + /lfblock + /rtblock + /ltshade + /shade + /dkshade + /integraltp + /filledbox + /uni2219 + /radical + /approxequal + /lessequal + /greaterequal + /uni00A0 + /integralbt + /degree + /twosuperior + /periodcentered + /divide + /SF430000 + /SF240000 + /SF510000 + /afii10071 + /SF520000 + /SF390000 + /SF220000 + /SF210000 + /SF250000 + /SF500000 + /SF490000 + /SF380000 + /SF280000 + /SF270000 + /SF260000 + /SF360000 + /SF370000 + /SF420000 + /SF190000 + /afii10023 + /SF200000 + /SF230000 + /SF470000 + /SF480000 + /SF410000 + /SF450000 + /SF460000 + /SF400000 + /SF540000 + /SF530000 + /SF440000 + /copyright + /afii10096 + /afii10065 + /afii10066 + /afii10088 + /afii10069 + /afii10070 + /afii10086 + /afii10068 + /afii10087 + /afii10074 + /afii10075 + /afii10076 + /afii10077 + /afii10078 + /afii10079 + /afii10080 + /afii10081 + /afii10097 + /afii10082 + /afii10083 + /afii10084 + /afii10085 + /afii10072 + /afii10067 + /afii10094 + /afii10093 + /afii10073 + /afii10090 + /afii10095 + /afii10091 + /afii10089 + /afii10092 + /afii10048 + /afii10017 + /afii10018 + /afii10040 + /afii10021 + /afii10022 + /afii10038 + /afii10020 + /afii10039 + /afii10026 + /afii10027 + /afii10028 + /afii10029 + /afii10030 + /afii10031 + /afii10032 + /afii10033 + /afii10049 + /afii10034 + /afii10035 + /afii10036 + /afii10037 + /afii10024 + /afii10019 + /afii10046 + /afii10045 + /afii10025 + /afii10042 + /afii10047 + /afii10043 + /afii10041 + /afii10044 ] readonly def \ No newline at end of file diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/encoding.symbol.ps b/thirdparty/html2ps_pdf/postscript/encoding.symbol.ps similarity index 96% rename from gulliver/thirdparty/html2ps_pdf/postscript/encoding.symbol.ps rename to thirdparty/html2ps_pdf/postscript/encoding.symbol.ps index 70b06ee4c..dc4b4aad0 100644 --- a/gulliver/thirdparty/html2ps_pdf/postscript/encoding.symbol.ps +++ b/thirdparty/html2ps_pdf/postscript/encoding.symbol.ps @@ -1,122 +1,122 @@ -% $Header: /cvsroot/html2ps/postscript/encoding.symbol.ps,v 1.1 2005/12/18 07:21:38 Konstantin Exp $ -/Symbol-Encoding [ - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef -% \040 - /space /exclam /universal /numbersign - /existential /percent /ampersand /suchthat - /parenleft /parenright /asteriskmath /plus - /comma /minus /period /slash - /zero /one /two /three - /four /five /six /seven - /eight /nine /colon /semicolon - /less /equal /greater /question -% \100 - /congruent /Alpha /Beta /Chi - /Delta /Epsilon /Phi /Gamma - /Eta /Iota /theta1 /Kappa - /Lambda /Mu /Nu /Omicron - /Pi /Theta /Rho /Sigma - /Tau /Upsilon /sigma1 /Omega - /Xi /Psi /Zeta /bracketleft - /therefore /bracketright /perpendicular /underscore -% \140 - /radicalex /alpha /beta /chi - /delta /epsilon /phi /gamma - /eta /iota /phi1 /kappa - /lambda /mu /nu /omicron - /pi /theta /rho /sigma - /tau /upsilon /omega1 /omega - /xi /psi /zeta /braceleft - /bar /braceright /similar /.notdef -% \200 - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef -% \240 - /Euro /Upsilon1 /minute /lessequal - /fraction /infinity /florin /club - /diamond /heart /spade /arrowboth - /arrowleft /arrowup /arrowright /arrowdown - /degree /plusminus /second /greaterequal - /multiply /proportional /partialdiff /bullet - /divide /notequal /equivalence /approxequal - /ellipsis /arrowvertex /arrowhorizex /carriagereturn -% \300 - /aleph /Ifraktur /Rfraktur /weierstrass - /circlemultiply /circleplus /emptyset /intersection - /union /propersuperset /reflexsuperset /notsubset - /propersubset /reflexsubset /element /notelement - /angle /gradient /registerserif /copyrightserif - /trademarkserif /product /radical /dotmath - /logicalnot /logicaland /logicalor /arrowdblboth - /arrowdblleft /arrowdblup /arrowdblright /arrowdbldown -% \340 - /lozenge /angleleft /registersans /copyrightsans - /trademarksans /summation /parenlefttp /parenleftex - /parenleftbt /bracketlefttp /bracketleftex /bracketleftbt - /bracelefttp /braceleftmid /braceleftbt /braceex - /.notdef /angleright /integral /integraltp - /integralex /integralbt /parenrighttp /parenrightex - /parenrightbt /bracketrighttp /bracketrightex /bracketrightbt - /bracerighttp /bracerightmid /bracerightbt /.notdef +% $Header: /cvsroot/html2ps/postscript/encoding.symbol.ps,v 1.1 2005/12/18 07:21:38 Konstantin Exp $ +/Symbol-Encoding [ + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef +% \040 + /space /exclam /universal /numbersign + /existential /percent /ampersand /suchthat + /parenleft /parenright /asteriskmath /plus + /comma /minus /period /slash + /zero /one /two /three + /four /five /six /seven + /eight /nine /colon /semicolon + /less /equal /greater /question +% \100 + /congruent /Alpha /Beta /Chi + /Delta /Epsilon /Phi /Gamma + /Eta /Iota /theta1 /Kappa + /Lambda /Mu /Nu /Omicron + /Pi /Theta /Rho /Sigma + /Tau /Upsilon /sigma1 /Omega + /Xi /Psi /Zeta /bracketleft + /therefore /bracketright /perpendicular /underscore +% \140 + /radicalex /alpha /beta /chi + /delta /epsilon /phi /gamma + /eta /iota /phi1 /kappa + /lambda /mu /nu /omicron + /pi /theta /rho /sigma + /tau /upsilon /omega1 /omega + /xi /psi /zeta /braceleft + /bar /braceright /similar /.notdef +% \200 + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef +% \240 + /Euro /Upsilon1 /minute /lessequal + /fraction /infinity /florin /club + /diamond /heart /spade /arrowboth + /arrowleft /arrowup /arrowright /arrowdown + /degree /plusminus /second /greaterequal + /multiply /proportional /partialdiff /bullet + /divide /notequal /equivalence /approxequal + /ellipsis /arrowvertex /arrowhorizex /carriagereturn +% \300 + /aleph /Ifraktur /Rfraktur /weierstrass + /circlemultiply /circleplus /emptyset /intersection + /union /propersuperset /reflexsuperset /notsubset + /propersubset /reflexsubset /element /notelement + /angle /gradient /registerserif /copyrightserif + /trademarkserif /product /radical /dotmath + /logicalnot /logicaland /logicalor /arrowdblboth + /arrowdblleft /arrowdblup /arrowdblright /arrowdbldown +% \340 + /lozenge /angleleft /registersans /copyrightsans + /trademarksans /summation /parenlefttp /parenleftex + /parenleftbt /bracketlefttp /bracketleftex /bracketleftbt + /bracelefttp /braceleftmid /braceleftbt /braceex + /.notdef /angleright /integral /integraltp + /integralex /integralbt /parenrighttp /parenrightex + /parenrightbt /bracketrighttp /bracketrightex /bracketrightbt + /bracerighttp /bracerightmid /bracerightbt /.notdef ] readonly def \ No newline at end of file diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/encoding.windows-1250.ps b/thirdparty/html2ps_pdf/postscript/encoding.windows-1250.ps similarity index 95% rename from gulliver/thirdparty/html2ps_pdf/postscript/encoding.windows-1250.ps rename to thirdparty/html2ps_pdf/postscript/encoding.windows-1250.ps index 108d7279f..099dc0c10 100644 --- a/gulliver/thirdparty/html2ps_pdf/postscript/encoding.windows-1250.ps +++ b/thirdparty/html2ps_pdf/postscript/encoding.windows-1250.ps @@ -1,259 +1,259 @@ -% $Header: /cvsroot/html2ps/postscript/encoding.windows-1250.ps,v 1.1 2005/12/18 07:21:38 Konstantin Exp $ -/Windows-1250-Encoding [ - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /.notdef - /space - /exclam - /quotedbl - /numbersign - /dollar - /percent - /ampersand - /quotesingle - /parenleft - /parenright - /asterisk - /plus - /comma - /hyphen - /period - /slash - /zero - /one - /two - /three - /four - /five - /six - /seven - /eight - /nine - /colon - /semicolon - /less - /equal - /greater - /question - /at - /A - /B - /C - /D - /E - /F - /G - /H - /I - /J - /K - /L - /M - /N - /O - /P - /Q - /R - /S - /T - /U - /V - /W - /X - /Y - /Z - /bracketleft - /backslash - /bracketright - /asciicircum - /underscore - /grave - /a - /b - /c - /d - /e - /f - /g - /h - /i - /j - /k - /l - /m - /n - /o - /p - /q - /r - /s - /t - /u - /v - /w - /x - /y - /z - /braceleft - /bar - /braceright - /asciitilde - /.notdef - /Euro - /.notdef - /uni201A - /.notdef - /uni201E - /uni2026 -/uni2020 % DAGGER -/uni2021 % DOUBLE DAGGER -/.notdef -/uni2030 % PER MILLE SIGN -/uni0160 % LATIN CAPITAL LETTER S WITH CARON -/uni2039 % SINGLE LEFT-POINTING ANGLE QUOTATION MARK -/uni015A % LATIN CAPITAL LETTER S WITH ACUTE -/uni0164 % LATIN CAPITAL LETTER T WITH CARON -/uni017D % LATIN CAPITAL LETTER Z WITH CARON -/uni0179 % LATIN CAPITAL LETTER Z WITH ACUTE -/.notdef -/uni2018 % LEFT SINGLE QUOTATION MARK -/uni2019 % RIGHT SINGLE QUOTATION MARK -/uni201C % LEFT DOUBLE QUOTATION MARK -/uni201D % RIGHT DOUBLE QUOTATION MARK -/uni2022 % BULLET -/uni2013 % EN DASH -/uni2014 % EM DASH -/.notdef -/uni2122 % TRADE MARK SIGN -/uni0161 % LATIN SMALL LETTER S WITH CARON -/uni203A % SINGLE RIGHT-POINTING ANGLE QUOTATION MARK -/uni015B % LATIN SMALL LETTER S WITH ACUTE -/uni0165 % LATIN SMALL LETTER T WITH CARON -/uni017E % LATIN SMALL LETTER Z WITH CARON -/uni017A % LATIN SMALL LETTER Z WITH ACUTE -/uni00A0 % NO-BREAK SPACE -/uni02C7 % CARON -/uni02D8 % BREVE -/uni0141 % LATIN CAPITAL LETTER L WITH STROKE -/uni00A4 % CURRENCY SIGN -/uni0104 % LATIN CAPITAL LETTER A WITH OGONEK -/uni00A6 % BROKEN BAR -/uni00A7 % SECTION SIGN -/uni00A8 % DIAERESIS -/uni00A9 % COPYRIGHT SIGN -/uni015E % LATIN CAPITAL LETTER S WITH CEDILLA -/uni00AB % LEFT-POINTING DOUBLE ANGLE QUOTATION MARK -/uni00AC % NOT SIGN -/uni00AD % SOFT HYPHEN -/uni00AE % REGISTERED SIGN -/uni017B % LATIN CAPITAL LETTER Z WITH DOT ABOVE -/uni00B0 % DEGREE SIGN -/uni00B1 % PLUS-MINUS SIGN -/uni02DB % OGONEK -/uni0142 % LATIN SMALL LETTER L WITH STROKE -/uni00B4 % ACUTE ACCENT -/uni00B5 % MICRO SIGN -/uni00B6 % PILCROW SIGN -/uni00B7 % MIDDLE DOT -/uni00B8 % CEDILLA -/uni0105 % LATIN SMALL LETTER A WITH OGONEK -/uni015F % LATIN SMALL LETTER S WITH CEDILLA -/uni00BB % RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK -/uni013D % LATIN CAPITAL LETTER L WITH CARON -/uni02DD % DOUBLE ACUTE ACCENT -/uni013E % LATIN SMALL LETTER L WITH CARON -/uni017C % LATIN SMALL LETTER Z WITH DOT ABOVE -/uni0154 % LATIN CAPITAL LETTER R WITH ACUTE -/uni00C1 % LATIN CAPITAL LETTER A WITH ACUTE -/uni00C2 % LATIN CAPITAL LETTER A WITH CIRCUMFLEX -/uni0102 % LATIN CAPITAL LETTER A WITH BREVE -/uni00C4 % LATIN CAPITAL LETTER A WITH DIAERESIS -/uni0139 % LATIN CAPITAL LETTER L WITH ACUTE -/uni0106 % LATIN CAPITAL LETTER C WITH ACUTE -/uni00C7 % LATIN CAPITAL LETTER C WITH CEDILLA -/uni010C % LATIN CAPITAL LETTER C WITH CARON -/uni00C9 % LATIN CAPITAL LETTER E WITH ACUTE -/uni0118 % LATIN CAPITAL LETTER E WITH OGONEK -/uni00CB % LATIN CAPITAL LETTER E WITH DIAERESIS -/uni011A % LATIN CAPITAL LETTER E WITH CARON -/uni00CD % LATIN CAPITAL LETTER I WITH ACUTE -/uni00CE % LATIN CAPITAL LETTER I WITH CIRCUMFLEX -/uni010E % LATIN CAPITAL LETTER D WITH CARON -/uni0110 % LATIN CAPITAL LETTER D WITH STROKE -/uni0143 % LATIN CAPITAL LETTER N WITH ACUTE -/uni0147 % LATIN CAPITAL LETTER N WITH CARON -/uni00D3 % LATIN CAPITAL LETTER O WITH ACUTE -/uni00D4 % LATIN CAPITAL LETTER O WITH CIRCUMFLEX -/uni0150 % LATIN CAPITAL LETTER O WITH DOUBLE ACUTE -/uni00D6 % LATIN CAPITAL LETTER O WITH DIAERESIS -/uni00D7 % MULTIPLICATION SIGN -/uni0158 % LATIN CAPITAL LETTER R WITH CARON -/uni016E % LATIN CAPITAL LETTER U WITH RING ABOVE -/uni00DA % LATIN CAPITAL LETTER U WITH ACUTE -/uni0170 % LATIN CAPITAL LETTER U WITH DOUBLE ACUTE -/uni00DC % LATIN CAPITAL LETTER U WITH DIAERESIS -/uni00DD % LATIN CAPITAL LETTER Y WITH ACUTE -/uni0162 % LATIN CAPITAL LETTER T WITH CEDILLA -/uni00DF % LATIN SMALL LETTER SHARP S -/uni0155 % LATIN SMALL LETTER R WITH ACUTE -/uni00E1 % LATIN SMALL LETTER A WITH ACUTE -/uni00E2 % LATIN SMALL LETTER A WITH CIRCUMFLEX -/uni0103 % LATIN SMALL LETTER A WITH BREVE -/uni00E4 % LATIN SMALL LETTER A WITH DIAERESIS -/uni013A % LATIN SMALL LETTER L WITH ACUTE -/uni0107 % LATIN SMALL LETTER C WITH ACUTE -/uni00E7 % LATIN SMALL LETTER C WITH CEDILLA -/uni010D % LATIN SMALL LETTER C WITH CARON -/uni00E9 % LATIN SMALL LETTER E WITH ACUTE -/uni0119 % LATIN SMALL LETTER E WITH OGONEK -/uni00EB % LATIN SMALL LETTER E WITH DIAERESIS -/uni011B % LATIN SMALL LETTER E WITH CARON -/uni00ED % LATIN SMALL LETTER I WITH ACUTE -/uni00EE % LATIN SMALL LETTER I WITH CIRCUMFLEX -/uni010F % LATIN SMALL LETTER D WITH CARON -/uni0111 % LATIN SMALL LETTER D WITH STROKE -/uni0144 % LATIN SMALL LETTER N WITH ACUTE -/uni0148 % LATIN SMALL LETTER N WITH CARON -/uni00F3 % LATIN SMALL LETTER O WITH ACUTE -/uni00F4 % LATIN SMALL LETTER O WITH CIRCUMFLEX -/uni0151 % LATIN SMALL LETTER O WITH DOUBLE ACUTE -/uni00F6 % LATIN SMALL LETTER O WITH DIAERESIS -/uni00F7 % DIVISION SIGN -/uni0159 % LATIN SMALL LETTER R WITH CARON -/uni016F % LATIN SMALL LETTER U WITH RING ABOVE -/uni00FA % LATIN SMALL LETTER U WITH ACUTE -/uni0171 % LATIN SMALL LETTER U WITH DOUBLE ACUTE -/uni00FC % LATIN SMALL LETTER U WITH DIAERESIS -/uni00FD % LATIN SMALL LETTER Y WITH ACUTE -/uni0163 % LATIN SMALL LETTER T WITH CEDILLA -/uni02D9 % DOT ABOVE +% $Header: /cvsroot/html2ps/postscript/encoding.windows-1250.ps,v 1.1 2005/12/18 07:21:38 Konstantin Exp $ +/Windows-1250-Encoding [ + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /space + /exclam + /quotedbl + /numbersign + /dollar + /percent + /ampersand + /quotesingle + /parenleft + /parenright + /asterisk + /plus + /comma + /hyphen + /period + /slash + /zero + /one + /two + /three + /four + /five + /six + /seven + /eight + /nine + /colon + /semicolon + /less + /equal + /greater + /question + /at + /A + /B + /C + /D + /E + /F + /G + /H + /I + /J + /K + /L + /M + /N + /O + /P + /Q + /R + /S + /T + /U + /V + /W + /X + /Y + /Z + /bracketleft + /backslash + /bracketright + /asciicircum + /underscore + /grave + /a + /b + /c + /d + /e + /f + /g + /h + /i + /j + /k + /l + /m + /n + /o + /p + /q + /r + /s + /t + /u + /v + /w + /x + /y + /z + /braceleft + /bar + /braceright + /asciitilde + /.notdef + /Euro + /.notdef + /uni201A + /.notdef + /uni201E + /uni2026 +/uni2020 % DAGGER +/uni2021 % DOUBLE DAGGER +/.notdef +/uni2030 % PER MILLE SIGN +/uni0160 % LATIN CAPITAL LETTER S WITH CARON +/uni2039 % SINGLE LEFT-POINTING ANGLE QUOTATION MARK +/uni015A % LATIN CAPITAL LETTER S WITH ACUTE +/uni0164 % LATIN CAPITAL LETTER T WITH CARON +/uni017D % LATIN CAPITAL LETTER Z WITH CARON +/uni0179 % LATIN CAPITAL LETTER Z WITH ACUTE +/.notdef +/uni2018 % LEFT SINGLE QUOTATION MARK +/uni2019 % RIGHT SINGLE QUOTATION MARK +/uni201C % LEFT DOUBLE QUOTATION MARK +/uni201D % RIGHT DOUBLE QUOTATION MARK +/uni2022 % BULLET +/uni2013 % EN DASH +/uni2014 % EM DASH +/.notdef +/uni2122 % TRADE MARK SIGN +/uni0161 % LATIN SMALL LETTER S WITH CARON +/uni203A % SINGLE RIGHT-POINTING ANGLE QUOTATION MARK +/uni015B % LATIN SMALL LETTER S WITH ACUTE +/uni0165 % LATIN SMALL LETTER T WITH CARON +/uni017E % LATIN SMALL LETTER Z WITH CARON +/uni017A % LATIN SMALL LETTER Z WITH ACUTE +/uni00A0 % NO-BREAK SPACE +/uni02C7 % CARON +/uni02D8 % BREVE +/uni0141 % LATIN CAPITAL LETTER L WITH STROKE +/uni00A4 % CURRENCY SIGN +/uni0104 % LATIN CAPITAL LETTER A WITH OGONEK +/uni00A6 % BROKEN BAR +/uni00A7 % SECTION SIGN +/uni00A8 % DIAERESIS +/uni00A9 % COPYRIGHT SIGN +/uni015E % LATIN CAPITAL LETTER S WITH CEDILLA +/uni00AB % LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +/uni00AC % NOT SIGN +/uni00AD % SOFT HYPHEN +/uni00AE % REGISTERED SIGN +/uni017B % LATIN CAPITAL LETTER Z WITH DOT ABOVE +/uni00B0 % DEGREE SIGN +/uni00B1 % PLUS-MINUS SIGN +/uni02DB % OGONEK +/uni0142 % LATIN SMALL LETTER L WITH STROKE +/uni00B4 % ACUTE ACCENT +/uni00B5 % MICRO SIGN +/uni00B6 % PILCROW SIGN +/uni00B7 % MIDDLE DOT +/uni00B8 % CEDILLA +/uni0105 % LATIN SMALL LETTER A WITH OGONEK +/uni015F % LATIN SMALL LETTER S WITH CEDILLA +/uni00BB % RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +/uni013D % LATIN CAPITAL LETTER L WITH CARON +/uni02DD % DOUBLE ACUTE ACCENT +/uni013E % LATIN SMALL LETTER L WITH CARON +/uni017C % LATIN SMALL LETTER Z WITH DOT ABOVE +/uni0154 % LATIN CAPITAL LETTER R WITH ACUTE +/uni00C1 % LATIN CAPITAL LETTER A WITH ACUTE +/uni00C2 % LATIN CAPITAL LETTER A WITH CIRCUMFLEX +/uni0102 % LATIN CAPITAL LETTER A WITH BREVE +/uni00C4 % LATIN CAPITAL LETTER A WITH DIAERESIS +/uni0139 % LATIN CAPITAL LETTER L WITH ACUTE +/uni0106 % LATIN CAPITAL LETTER C WITH ACUTE +/uni00C7 % LATIN CAPITAL LETTER C WITH CEDILLA +/uni010C % LATIN CAPITAL LETTER C WITH CARON +/uni00C9 % LATIN CAPITAL LETTER E WITH ACUTE +/uni0118 % LATIN CAPITAL LETTER E WITH OGONEK +/uni00CB % LATIN CAPITAL LETTER E WITH DIAERESIS +/uni011A % LATIN CAPITAL LETTER E WITH CARON +/uni00CD % LATIN CAPITAL LETTER I WITH ACUTE +/uni00CE % LATIN CAPITAL LETTER I WITH CIRCUMFLEX +/uni010E % LATIN CAPITAL LETTER D WITH CARON +/uni0110 % LATIN CAPITAL LETTER D WITH STROKE +/uni0143 % LATIN CAPITAL LETTER N WITH ACUTE +/uni0147 % LATIN CAPITAL LETTER N WITH CARON +/uni00D3 % LATIN CAPITAL LETTER O WITH ACUTE +/uni00D4 % LATIN CAPITAL LETTER O WITH CIRCUMFLEX +/uni0150 % LATIN CAPITAL LETTER O WITH DOUBLE ACUTE +/uni00D6 % LATIN CAPITAL LETTER O WITH DIAERESIS +/uni00D7 % MULTIPLICATION SIGN +/uni0158 % LATIN CAPITAL LETTER R WITH CARON +/uni016E % LATIN CAPITAL LETTER U WITH RING ABOVE +/uni00DA % LATIN CAPITAL LETTER U WITH ACUTE +/uni0170 % LATIN CAPITAL LETTER U WITH DOUBLE ACUTE +/uni00DC % LATIN CAPITAL LETTER U WITH DIAERESIS +/uni00DD % LATIN CAPITAL LETTER Y WITH ACUTE +/uni0162 % LATIN CAPITAL LETTER T WITH CEDILLA +/uni00DF % LATIN SMALL LETTER SHARP S +/uni0155 % LATIN SMALL LETTER R WITH ACUTE +/uni00E1 % LATIN SMALL LETTER A WITH ACUTE +/uni00E2 % LATIN SMALL LETTER A WITH CIRCUMFLEX +/uni0103 % LATIN SMALL LETTER A WITH BREVE +/uni00E4 % LATIN SMALL LETTER A WITH DIAERESIS +/uni013A % LATIN SMALL LETTER L WITH ACUTE +/uni0107 % LATIN SMALL LETTER C WITH ACUTE +/uni00E7 % LATIN SMALL LETTER C WITH CEDILLA +/uni010D % LATIN SMALL LETTER C WITH CARON +/uni00E9 % LATIN SMALL LETTER E WITH ACUTE +/uni0119 % LATIN SMALL LETTER E WITH OGONEK +/uni00EB % LATIN SMALL LETTER E WITH DIAERESIS +/uni011B % LATIN SMALL LETTER E WITH CARON +/uni00ED % LATIN SMALL LETTER I WITH ACUTE +/uni00EE % LATIN SMALL LETTER I WITH CIRCUMFLEX +/uni010F % LATIN SMALL LETTER D WITH CARON +/uni0111 % LATIN SMALL LETTER D WITH STROKE +/uni0144 % LATIN SMALL LETTER N WITH ACUTE +/uni0148 % LATIN SMALL LETTER N WITH CARON +/uni00F3 % LATIN SMALL LETTER O WITH ACUTE +/uni00F4 % LATIN SMALL LETTER O WITH CIRCUMFLEX +/uni0151 % LATIN SMALL LETTER O WITH DOUBLE ACUTE +/uni00F6 % LATIN SMALL LETTER O WITH DIAERESIS +/uni00F7 % DIVISION SIGN +/uni0159 % LATIN SMALL LETTER R WITH CARON +/uni016F % LATIN SMALL LETTER U WITH RING ABOVE +/uni00FA % LATIN SMALL LETTER U WITH ACUTE +/uni0171 % LATIN SMALL LETTER U WITH DOUBLE ACUTE +/uni00FC % LATIN SMALL LETTER U WITH DIAERESIS +/uni00FD % LATIN SMALL LETTER Y WITH ACUTE +/uni0163 % LATIN SMALL LETTER T WITH CEDILLA +/uni02D9 % DOT ABOVE ] readonly def \ No newline at end of file diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/encoding.windows-1251.ps b/thirdparty/html2ps_pdf/postscript/encoding.windows-1251.ps similarity index 97% rename from gulliver/thirdparty/html2ps_pdf/postscript/encoding.windows-1251.ps rename to thirdparty/html2ps_pdf/postscript/encoding.windows-1251.ps index b45ae607f..1baa187ab 100644 --- a/gulliver/thirdparty/html2ps_pdf/postscript/encoding.windows-1251.ps +++ b/thirdparty/html2ps_pdf/postscript/encoding.windows-1251.ps @@ -1,258 +1,258 @@ -% $Header: /cvsroot/html2ps/postscript/encoding.windows-1251.ps,v 1.1 2005/12/18 07:21:38 Konstantin Exp $ -/Windows-1251-Encoding [ -/uni0000 % NULL -/uni0001 % START OF HEADING -/uni0002 % START OF TEXT -/uni0003 % END OF TEXT -/uni0004 % END OF TRANSMISSION -/uni0005 % ENQUIRY -/uni0006 % ACKNOWLEDGE -/uni0007 % BELL -/uni0008 % BACKSPACE -/uni0009 % HORIZONTAL TABULATION -/uni000A % LINE FEED -/uni000B % VERTICAL TABULATION -/uni000C % FORM FEED -/uni000D % CARRIAGE RETURN -/uni000E % SHIFT OUT -/uni000F % SHIFT IN -/uni0010 % DATA LINK ESCAPE -/uni0011 % DEVICE CONTROL ONE -/uni0012 % DEVICE CONTROL TWO -/uni0013 % DEVICE CONTROL THREE -/uni0014 % DEVICE CONTROL FOUR -/uni0015 % NEGATIVE ACKNOWLEDGE -/uni0016 % SYNCHRONOUS IDLE -/uni0017 % END OF TRANSMISSION BLOCK -/uni0018 % CANCEL -/uni0019 % END OF MEDIUM -/uni001A % SUBSTITUTE -/uni001B % ESCAPE -/uni001C % FILE SEPARATOR -/uni001D % GROUP SEPARATOR -/uni001E % RECORD SEPARATOR -/uni001F % UNIT SEPARATOR -/uni0020 % SPACE -/uni0021 % EXCLAMATION MARK -/uni0022 % QUOTATION MARK -/uni0023 % NUMBER SIGN -/uni0024 % DOLLAR SIGN -/uni0025 % PERCENT SIGN -/uni0026 % AMPERSAND -/uni0027 % APOSTROPHE -/uni0028 % LEFT PARENTHESIS -/uni0029 % RIGHT PARENTHESIS -/uni002A % ASTERISK -/uni002B % PLUS SIGN -/uni002C % COMMA -/uni002D % HYPHEN-MINUS -/uni002E % FULL STOP -/uni002F % SOLIDUS -/uni0030 % DIGIT ZERO -/uni0031 % DIGIT ONE -/uni0032 % DIGIT TWO -/uni0033 % DIGIT THREE -/uni0034 % DIGIT FOUR -/uni0035 % DIGIT FIVE -/uni0036 % DIGIT SIX -/uni0037 % DIGIT SEVEN -/uni0038 % DIGIT EIGHT -/uni0039 % DIGIT NINE -/uni003A % COLON -/uni003B % SEMICOLON -/uni003C % LESS-THAN SIGN -/uni003D % EQUALS SIGN -/uni003E % GREATER-THAN SIGN -/uni003F % QUESTION MARK -/uni0040 % COMMERCIAL AT -/uni0041 % LATIN CAPITAL LETTER A -/uni0042 % LATIN CAPITAL LETTER B -/uni0043 % LATIN CAPITAL LETTER C -/uni0044 % LATIN CAPITAL LETTER D -/uni0045 % LATIN CAPITAL LETTER E -/uni0046 % LATIN CAPITAL LETTER F -/uni0047 % LATIN CAPITAL LETTER G -/uni0048 % LATIN CAPITAL LETTER H -/uni0049 % LATIN CAPITAL LETTER I -/uni004A % LATIN CAPITAL LETTER J -/uni004B % LATIN CAPITAL LETTER K -/uni004C % LATIN CAPITAL LETTER L -/uni004D % LATIN CAPITAL LETTER M -/uni004E % LATIN CAPITAL LETTER N -/uni004F % LATIN CAPITAL LETTER O -/uni0050 % LATIN CAPITAL LETTER P -/uni0051 % LATIN CAPITAL LETTER Q -/uni0052 % LATIN CAPITAL LETTER R -/uni0053 % LATIN CAPITAL LETTER S -/uni0054 % LATIN CAPITAL LETTER T -/uni0055 % LATIN CAPITAL LETTER U -/uni0056 % LATIN CAPITAL LETTER V -/uni0057 % LATIN CAPITAL LETTER W -/uni0058 % LATIN CAPITAL LETTER X -/uni0059 % LATIN CAPITAL LETTER Y -/uni005A % LATIN CAPITAL LETTER Z -/uni005B % LEFT SQUARE BRACKET -/uni005C % REVERSE SOLIDUS -/uni005D % RIGHT SQUARE BRACKET -/uni005E % CIRCUMFLEX ACCENT -/uni005F % LOW LINE -/uni0060 % GRAVE ACCENT -/uni0061 % LATIN SMALL LETTER A -/uni0062 % LATIN SMALL LETTER B -/uni0063 % LATIN SMALL LETTER C -/uni0064 % LATIN SMALL LETTER D -/uni0065 % LATIN SMALL LETTER E -/uni0066 % LATIN SMALL LETTER F -/uni0067 % LATIN SMALL LETTER G -/uni0068 % LATIN SMALL LETTER H -/uni0069 % LATIN SMALL LETTER I -/uni006A % LATIN SMALL LETTER J -/uni006B % LATIN SMALL LETTER K -/uni006C % LATIN SMALL LETTER L -/uni006D % LATIN SMALL LETTER M -/uni006E % LATIN SMALL LETTER N -/uni006F % LATIN SMALL LETTER O -/uni0070 % LATIN SMALL LETTER P -/uni0071 % LATIN SMALL LETTER Q -/uni0072 % LATIN SMALL LETTER R -/uni0073 % LATIN SMALL LETTER S -/uni0074 % LATIN SMALL LETTER T -/uni0075 % LATIN SMALL LETTER U -/uni0076 % LATIN SMALL LETTER V -/uni0077 % LATIN SMALL LETTER W -/uni0078 % LATIN SMALL LETTER X -/uni0079 % LATIN SMALL LETTER Y -/uni007A % LATIN SMALL LETTER Z -/uni007B % LEFT CURLY BRACKET -/uni007C % VERTICAL LINE -/uni007D % RIGHT CURLY BRACKET -/uni007E % TILDE -/uni007F % DELETE -/uni0402 % CYRILLIC CAPITAL LETTER DJE -/uni0403 % CYRILLIC CAPITAL LETTER GJE -/uni201A % SINGLE LOW-9 QUOTATION MARK -/uni0453 % CYRILLIC SMALL LETTER GJE -/uni201E % DOUBLE LOW-9 QUOTATION MARK -/uni2026 % HORIZONTAL ELLIPSIS -/uni2020 % DAGGER -/uni2021 % DOUBLE DAGGER -/uni20AC % EURO SIGN -/uni2030 % PER MILLE SIGN -/uni0409 % CYRILLIC CAPITAL LETTER LJE -/uni2039 % SINGLE LEFT-POINTING ANGLE QUOTATION MARK -/uni040A % CYRILLIC CAPITAL LETTER NJE -/uni040C % CYRILLIC CAPITAL LETTER KJE -/uni040B % CYRILLIC CAPITAL LETTER TSHE -/uni040F % CYRILLIC CAPITAL LETTER DZHE -/uni0452 % CYRILLIC SMALL LETTER DJE -/uni2018 % LEFT SINGLE QUOTATION MARK -/uni2019 % RIGHT SINGLE QUOTATION MARK -/uni201C % LEFT DOUBLE QUOTATION MARK -/uni201D % RIGHT DOUBLE QUOTATION MARK -/uni2022 % BULLET -/uni2013 % EN DASH -/uni2014 % EM DASH -/uni2122 % TRADE MARK SIGN -/uni0459 % CYRILLIC SMALL LETTER LJE -/uni203A % SINGLE RIGHT-POINTING ANGLE QUOTATION MARK -/uni045A % CYRILLIC SMALL LETTER NJE -/uni045C % CYRILLIC SMALL LETTER KJE -/uni045B % CYRILLIC SMALL LETTER TSHE -/uni045F % CYRILLIC SMALL LETTER DZHE -/uni00A0 % NO-BREAK SPACE -/uni040E % CYRILLIC CAPITAL LETTER SHORT U -/uni045E % CYRILLIC SMALL LETTER SHORT U -/uni0408 % CYRILLIC CAPITAL LETTER JE -/uni00A4 % CURRENCY SIGN -/uni0490 % CYRILLIC CAPITAL LETTER GHE WITH UPTURN -/uni00A6 % BROKEN BAR -/uni00A7 % SECTION SIGN -/uni0401 % CYRILLIC CAPITAL LETTER IO -/uni00A9 % COPYRIGHT SIGN -/uni0404 % CYRILLIC CAPITAL LETTER UKRAINIAN IE -/uni00AB % LEFT-POINTING DOUBLE ANGLE QUOTATION MARK -/uni00AC % NOT SIGN -/uni00AD % SOFT HYPHEN -/uni00AE % REGISTERED SIGN -/uni0407 % CYRILLIC CAPITAL LETTER YI -/uni00B0 % DEGREE SIGN -/uni00B1 % PLUS-MINUS SIGN -/uni0406 % CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I -/uni0456 % CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I -/uni0491 % CYRILLIC SMALL LETTER GHE WITH UPTURN -/uni00B5 % MICRO SIGN -/uni00B6 % PILCROW SIGN -/uni00B7 % MIDDLE DOT -/uni0451 % CYRILLIC SMALL LETTER IO -/uni2116 % NUMERO SIGN -/uni0454 % CYRILLIC SMALL LETTER UKRAINIAN IE -/uni00BB % RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK -/uni0458 % CYRILLIC SMALL LETTER JE -/uni0405 % CYRILLIC CAPITAL LETTER DZE -/uni0455 % CYRILLIC SMALL LETTER DZE -/uni0457 % CYRILLIC SMALL LETTER YI -/uni0410 % CYRILLIC CAPITAL LETTER A -/uni0411 % CYRILLIC CAPITAL LETTER BE -/uni0412 % CYRILLIC CAPITAL LETTER VE -/uni0413 % CYRILLIC CAPITAL LETTER GHE -/uni0414 % CYRILLIC CAPITAL LETTER DE -/uni0415 % CYRILLIC CAPITAL LETTER IE -/uni0416 % CYRILLIC CAPITAL LETTER ZHE -/uni0417 % CYRILLIC CAPITAL LETTER ZE -/uni0418 % CYRILLIC CAPITAL LETTER I -/uni0419 % CYRILLIC CAPITAL LETTER SHORT I -/uni041A % CYRILLIC CAPITAL LETTER KA -/uni041B % CYRILLIC CAPITAL LETTER EL -/uni041C % CYRILLIC CAPITAL LETTER EM -/uni041D % CYRILLIC CAPITAL LETTER EN -/uni041E % CYRILLIC CAPITAL LETTER O -/uni041F % CYRILLIC CAPITAL LETTER PE -/uni0420 % CYRILLIC CAPITAL LETTER ER -/uni0421 % CYRILLIC CAPITAL LETTER ES -/uni0422 % CYRILLIC CAPITAL LETTER TE -/uni0423 % CYRILLIC CAPITAL LETTER U -/uni0424 % CYRILLIC CAPITAL LETTER EF -/uni0425 % CYRILLIC CAPITAL LETTER HA -/uni0426 % CYRILLIC CAPITAL LETTER TSE -/uni0427 % CYRILLIC CAPITAL LETTER CHE -/uni0428 % CYRILLIC CAPITAL LETTER SHA -/uni0429 % CYRILLIC CAPITAL LETTER SHCHA -/uni042A % CYRILLIC CAPITAL LETTER HARD SIGN -/uni042B % CYRILLIC CAPITAL LETTER YERU -/uni042C % CYRILLIC CAPITAL LETTER SOFT SIGN -/uni042D % CYRILLIC CAPITAL LETTER E -/uni042E % CYRILLIC CAPITAL LETTER YU -/uni042F % CYRILLIC CAPITAL LETTER YA -/uni0430 % CYRILLIC SMALL LETTER A -/uni0431 % CYRILLIC SMALL LETTER BE -/uni0432 % CYRILLIC SMALL LETTER VE -/uni0433 % CYRILLIC SMALL LETTER GHE -/uni0434 % CYRILLIC SMALL LETTER DE -/uni0435 % CYRILLIC SMALL LETTER IE -/uni0436 % CYRILLIC SMALL LETTER ZHE -/uni0437 % CYRILLIC SMALL LETTER ZE -/uni0438 % CYRILLIC SMALL LETTER I -/uni0439 % CYRILLIC SMALL LETTER SHORT I -/uni043A % CYRILLIC SMALL LETTER KA -/uni043B % CYRILLIC SMALL LETTER EL -/uni043C % CYRILLIC SMALL LETTER EM -/uni043D % CYRILLIC SMALL LETTER EN -/uni043E % CYRILLIC SMALL LETTER O -/uni043F % CYRILLIC SMALL LETTER PE -/uni0440 % CYRILLIC SMALL LETTER ER -/uni0441 % CYRILLIC SMALL LETTER ES -/uni0442 % CYRILLIC SMALL LETTER TE -/uni0443 % CYRILLIC SMALL LETTER U -/uni0444 % CYRILLIC SMALL LETTER EF -/uni0445 % CYRILLIC SMALL LETTER HA -/uni0446 % CYRILLIC SMALL LETTER TSE -/uni0447 % CYRILLIC SMALL LETTER CHE -/uni0448 % CYRILLIC SMALL LETTER SHA -/uni0449 % CYRILLIC SMALL LETTER SHCHA -/uni044A % CYRILLIC SMALL LETTER HARD SIGN -/uni044B % CYRILLIC SMALL LETTER YERU -/uni044C % CYRILLIC SMALL LETTER SOFT SIGN -/uni044D % CYRILLIC SMALL LETTER E -/uni044E % CYRILLIC SMALL LETTER YU -/uni044F % CYRILLIC SMALL LETTER YA +% $Header: /cvsroot/html2ps/postscript/encoding.windows-1251.ps,v 1.1 2005/12/18 07:21:38 Konstantin Exp $ +/Windows-1251-Encoding [ +/uni0000 % NULL +/uni0001 % START OF HEADING +/uni0002 % START OF TEXT +/uni0003 % END OF TEXT +/uni0004 % END OF TRANSMISSION +/uni0005 % ENQUIRY +/uni0006 % ACKNOWLEDGE +/uni0007 % BELL +/uni0008 % BACKSPACE +/uni0009 % HORIZONTAL TABULATION +/uni000A % LINE FEED +/uni000B % VERTICAL TABULATION +/uni000C % FORM FEED +/uni000D % CARRIAGE RETURN +/uni000E % SHIFT OUT +/uni000F % SHIFT IN +/uni0010 % DATA LINK ESCAPE +/uni0011 % DEVICE CONTROL ONE +/uni0012 % DEVICE CONTROL TWO +/uni0013 % DEVICE CONTROL THREE +/uni0014 % DEVICE CONTROL FOUR +/uni0015 % NEGATIVE ACKNOWLEDGE +/uni0016 % SYNCHRONOUS IDLE +/uni0017 % END OF TRANSMISSION BLOCK +/uni0018 % CANCEL +/uni0019 % END OF MEDIUM +/uni001A % SUBSTITUTE +/uni001B % ESCAPE +/uni001C % FILE SEPARATOR +/uni001D % GROUP SEPARATOR +/uni001E % RECORD SEPARATOR +/uni001F % UNIT SEPARATOR +/uni0020 % SPACE +/uni0021 % EXCLAMATION MARK +/uni0022 % QUOTATION MARK +/uni0023 % NUMBER SIGN +/uni0024 % DOLLAR SIGN +/uni0025 % PERCENT SIGN +/uni0026 % AMPERSAND +/uni0027 % APOSTROPHE +/uni0028 % LEFT PARENTHESIS +/uni0029 % RIGHT PARENTHESIS +/uni002A % ASTERISK +/uni002B % PLUS SIGN +/uni002C % COMMA +/uni002D % HYPHEN-MINUS +/uni002E % FULL STOP +/uni002F % SOLIDUS +/uni0030 % DIGIT ZERO +/uni0031 % DIGIT ONE +/uni0032 % DIGIT TWO +/uni0033 % DIGIT THREE +/uni0034 % DIGIT FOUR +/uni0035 % DIGIT FIVE +/uni0036 % DIGIT SIX +/uni0037 % DIGIT SEVEN +/uni0038 % DIGIT EIGHT +/uni0039 % DIGIT NINE +/uni003A % COLON +/uni003B % SEMICOLON +/uni003C % LESS-THAN SIGN +/uni003D % EQUALS SIGN +/uni003E % GREATER-THAN SIGN +/uni003F % QUESTION MARK +/uni0040 % COMMERCIAL AT +/uni0041 % LATIN CAPITAL LETTER A +/uni0042 % LATIN CAPITAL LETTER B +/uni0043 % LATIN CAPITAL LETTER C +/uni0044 % LATIN CAPITAL LETTER D +/uni0045 % LATIN CAPITAL LETTER E +/uni0046 % LATIN CAPITAL LETTER F +/uni0047 % LATIN CAPITAL LETTER G +/uni0048 % LATIN CAPITAL LETTER H +/uni0049 % LATIN CAPITAL LETTER I +/uni004A % LATIN CAPITAL LETTER J +/uni004B % LATIN CAPITAL LETTER K +/uni004C % LATIN CAPITAL LETTER L +/uni004D % LATIN CAPITAL LETTER M +/uni004E % LATIN CAPITAL LETTER N +/uni004F % LATIN CAPITAL LETTER O +/uni0050 % LATIN CAPITAL LETTER P +/uni0051 % LATIN CAPITAL LETTER Q +/uni0052 % LATIN CAPITAL LETTER R +/uni0053 % LATIN CAPITAL LETTER S +/uni0054 % LATIN CAPITAL LETTER T +/uni0055 % LATIN CAPITAL LETTER U +/uni0056 % LATIN CAPITAL LETTER V +/uni0057 % LATIN CAPITAL LETTER W +/uni0058 % LATIN CAPITAL LETTER X +/uni0059 % LATIN CAPITAL LETTER Y +/uni005A % LATIN CAPITAL LETTER Z +/uni005B % LEFT SQUARE BRACKET +/uni005C % REVERSE SOLIDUS +/uni005D % RIGHT SQUARE BRACKET +/uni005E % CIRCUMFLEX ACCENT +/uni005F % LOW LINE +/uni0060 % GRAVE ACCENT +/uni0061 % LATIN SMALL LETTER A +/uni0062 % LATIN SMALL LETTER B +/uni0063 % LATIN SMALL LETTER C +/uni0064 % LATIN SMALL LETTER D +/uni0065 % LATIN SMALL LETTER E +/uni0066 % LATIN SMALL LETTER F +/uni0067 % LATIN SMALL LETTER G +/uni0068 % LATIN SMALL LETTER H +/uni0069 % LATIN SMALL LETTER I +/uni006A % LATIN SMALL LETTER J +/uni006B % LATIN SMALL LETTER K +/uni006C % LATIN SMALL LETTER L +/uni006D % LATIN SMALL LETTER M +/uni006E % LATIN SMALL LETTER N +/uni006F % LATIN SMALL LETTER O +/uni0070 % LATIN SMALL LETTER P +/uni0071 % LATIN SMALL LETTER Q +/uni0072 % LATIN SMALL LETTER R +/uni0073 % LATIN SMALL LETTER S +/uni0074 % LATIN SMALL LETTER T +/uni0075 % LATIN SMALL LETTER U +/uni0076 % LATIN SMALL LETTER V +/uni0077 % LATIN SMALL LETTER W +/uni0078 % LATIN SMALL LETTER X +/uni0079 % LATIN SMALL LETTER Y +/uni007A % LATIN SMALL LETTER Z +/uni007B % LEFT CURLY BRACKET +/uni007C % VERTICAL LINE +/uni007D % RIGHT CURLY BRACKET +/uni007E % TILDE +/uni007F % DELETE +/uni0402 % CYRILLIC CAPITAL LETTER DJE +/uni0403 % CYRILLIC CAPITAL LETTER GJE +/uni201A % SINGLE LOW-9 QUOTATION MARK +/uni0453 % CYRILLIC SMALL LETTER GJE +/uni201E % DOUBLE LOW-9 QUOTATION MARK +/uni2026 % HORIZONTAL ELLIPSIS +/uni2020 % DAGGER +/uni2021 % DOUBLE DAGGER +/uni20AC % EURO SIGN +/uni2030 % PER MILLE SIGN +/uni0409 % CYRILLIC CAPITAL LETTER LJE +/uni2039 % SINGLE LEFT-POINTING ANGLE QUOTATION MARK +/uni040A % CYRILLIC CAPITAL LETTER NJE +/uni040C % CYRILLIC CAPITAL LETTER KJE +/uni040B % CYRILLIC CAPITAL LETTER TSHE +/uni040F % CYRILLIC CAPITAL LETTER DZHE +/uni0452 % CYRILLIC SMALL LETTER DJE +/uni2018 % LEFT SINGLE QUOTATION MARK +/uni2019 % RIGHT SINGLE QUOTATION MARK +/uni201C % LEFT DOUBLE QUOTATION MARK +/uni201D % RIGHT DOUBLE QUOTATION MARK +/uni2022 % BULLET +/uni2013 % EN DASH +/uni2014 % EM DASH +/uni2122 % TRADE MARK SIGN +/uni0459 % CYRILLIC SMALL LETTER LJE +/uni203A % SINGLE RIGHT-POINTING ANGLE QUOTATION MARK +/uni045A % CYRILLIC SMALL LETTER NJE +/uni045C % CYRILLIC SMALL LETTER KJE +/uni045B % CYRILLIC SMALL LETTER TSHE +/uni045F % CYRILLIC SMALL LETTER DZHE +/uni00A0 % NO-BREAK SPACE +/uni040E % CYRILLIC CAPITAL LETTER SHORT U +/uni045E % CYRILLIC SMALL LETTER SHORT U +/uni0408 % CYRILLIC CAPITAL LETTER JE +/uni00A4 % CURRENCY SIGN +/uni0490 % CYRILLIC CAPITAL LETTER GHE WITH UPTURN +/uni00A6 % BROKEN BAR +/uni00A7 % SECTION SIGN +/uni0401 % CYRILLIC CAPITAL LETTER IO +/uni00A9 % COPYRIGHT SIGN +/uni0404 % CYRILLIC CAPITAL LETTER UKRAINIAN IE +/uni00AB % LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +/uni00AC % NOT SIGN +/uni00AD % SOFT HYPHEN +/uni00AE % REGISTERED SIGN +/uni0407 % CYRILLIC CAPITAL LETTER YI +/uni00B0 % DEGREE SIGN +/uni00B1 % PLUS-MINUS SIGN +/uni0406 % CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I +/uni0456 % CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I +/uni0491 % CYRILLIC SMALL LETTER GHE WITH UPTURN +/uni00B5 % MICRO SIGN +/uni00B6 % PILCROW SIGN +/uni00B7 % MIDDLE DOT +/uni0451 % CYRILLIC SMALL LETTER IO +/uni2116 % NUMERO SIGN +/uni0454 % CYRILLIC SMALL LETTER UKRAINIAN IE +/uni00BB % RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +/uni0458 % CYRILLIC SMALL LETTER JE +/uni0405 % CYRILLIC CAPITAL LETTER DZE +/uni0455 % CYRILLIC SMALL LETTER DZE +/uni0457 % CYRILLIC SMALL LETTER YI +/uni0410 % CYRILLIC CAPITAL LETTER A +/uni0411 % CYRILLIC CAPITAL LETTER BE +/uni0412 % CYRILLIC CAPITAL LETTER VE +/uni0413 % CYRILLIC CAPITAL LETTER GHE +/uni0414 % CYRILLIC CAPITAL LETTER DE +/uni0415 % CYRILLIC CAPITAL LETTER IE +/uni0416 % CYRILLIC CAPITAL LETTER ZHE +/uni0417 % CYRILLIC CAPITAL LETTER ZE +/uni0418 % CYRILLIC CAPITAL LETTER I +/uni0419 % CYRILLIC CAPITAL LETTER SHORT I +/uni041A % CYRILLIC CAPITAL LETTER KA +/uni041B % CYRILLIC CAPITAL LETTER EL +/uni041C % CYRILLIC CAPITAL LETTER EM +/uni041D % CYRILLIC CAPITAL LETTER EN +/uni041E % CYRILLIC CAPITAL LETTER O +/uni041F % CYRILLIC CAPITAL LETTER PE +/uni0420 % CYRILLIC CAPITAL LETTER ER +/uni0421 % CYRILLIC CAPITAL LETTER ES +/uni0422 % CYRILLIC CAPITAL LETTER TE +/uni0423 % CYRILLIC CAPITAL LETTER U +/uni0424 % CYRILLIC CAPITAL LETTER EF +/uni0425 % CYRILLIC CAPITAL LETTER HA +/uni0426 % CYRILLIC CAPITAL LETTER TSE +/uni0427 % CYRILLIC CAPITAL LETTER CHE +/uni0428 % CYRILLIC CAPITAL LETTER SHA +/uni0429 % CYRILLIC CAPITAL LETTER SHCHA +/uni042A % CYRILLIC CAPITAL LETTER HARD SIGN +/uni042B % CYRILLIC CAPITAL LETTER YERU +/uni042C % CYRILLIC CAPITAL LETTER SOFT SIGN +/uni042D % CYRILLIC CAPITAL LETTER E +/uni042E % CYRILLIC CAPITAL LETTER YU +/uni042F % CYRILLIC CAPITAL LETTER YA +/uni0430 % CYRILLIC SMALL LETTER A +/uni0431 % CYRILLIC SMALL LETTER BE +/uni0432 % CYRILLIC SMALL LETTER VE +/uni0433 % CYRILLIC SMALL LETTER GHE +/uni0434 % CYRILLIC SMALL LETTER DE +/uni0435 % CYRILLIC SMALL LETTER IE +/uni0436 % CYRILLIC SMALL LETTER ZHE +/uni0437 % CYRILLIC SMALL LETTER ZE +/uni0438 % CYRILLIC SMALL LETTER I +/uni0439 % CYRILLIC SMALL LETTER SHORT I +/uni043A % CYRILLIC SMALL LETTER KA +/uni043B % CYRILLIC SMALL LETTER EL +/uni043C % CYRILLIC SMALL LETTER EM +/uni043D % CYRILLIC SMALL LETTER EN +/uni043E % CYRILLIC SMALL LETTER O +/uni043F % CYRILLIC SMALL LETTER PE +/uni0440 % CYRILLIC SMALL LETTER ER +/uni0441 % CYRILLIC SMALL LETTER ES +/uni0442 % CYRILLIC SMALL LETTER TE +/uni0443 % CYRILLIC SMALL LETTER U +/uni0444 % CYRILLIC SMALL LETTER EF +/uni0445 % CYRILLIC SMALL LETTER HA +/uni0446 % CYRILLIC SMALL LETTER TSE +/uni0447 % CYRILLIC SMALL LETTER CHE +/uni0448 % CYRILLIC SMALL LETTER SHA +/uni0449 % CYRILLIC SMALL LETTER SHCHA +/uni044A % CYRILLIC SMALL LETTER HARD SIGN +/uni044B % CYRILLIC SMALL LETTER YERU +/uni044C % CYRILLIC SMALL LETTER SOFT SIGN +/uni044D % CYRILLIC SMALL LETTER E +/uni044E % CYRILLIC SMALL LETTER YU +/uni044F % CYRILLIC SMALL LETTER YA ] readonly def \ No newline at end of file diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/encoding.windows-1252.ps b/thirdparty/html2ps_pdf/postscript/encoding.windows-1252.ps similarity index 97% rename from gulliver/thirdparty/html2ps_pdf/postscript/encoding.windows-1252.ps rename to thirdparty/html2ps_pdf/postscript/encoding.windows-1252.ps index 356fb1bed..8ba1c9649 100644 --- a/gulliver/thirdparty/html2ps_pdf/postscript/encoding.windows-1252.ps +++ b/thirdparty/html2ps_pdf/postscript/encoding.windows-1252.ps @@ -1,259 +1,259 @@ -% $Header: /cvsroot/html2ps/postscript/encoding.windows-1252.ps,v 1.1 2005/12/18 07:21:38 Konstantin Exp $ -/Windows-1252-Encoding [ -/uni0000 % NULL -/uni0001 % START OF HEADING -/uni0002 % START OF TEXT -/uni0003 % END OF TEXT -/uni0004 % END OF TRANSMISSION -/uni0005 % ENQUIRY -/uni0006 % ACKNOWLEDGE -/uni0007 % BELL -/uni0008 % BACKSPACE -/uni0009 % HORIZONTAL TABULATION -/uni000A % LINE FEED -/uni000B % VERTICAL TABULATION -/uni000C % FORM FEED -/uni000D % CARRIAGE RETURN -/uni000E % SHIFT OUT -/uni000F % SHIFT IN -/uni0010 % DATA LINK ESCAPE -/uni0011 % DEVICE CONTROL ONE -/uni0012 % DEVICE CONTROL TWO -/uni0013 % DEVICE CONTROL THREE -/uni0014 % DEVICE CONTROL FOUR -/uni0015 % NEGATIVE ACKNOWLEDGE -/uni0016 % SYNCHRONOUS IDLE -/uni0017 % END OF TRANSMISSION BLOCK -/uni0018 % CANCEL -/uni0019 % END OF MEDIUM -/uni001A % SUBSTITUTE -/uni001B % ESCAPE -/uni001C % FILE SEPARATOR -/uni001D % GROUP SEPARATOR -/uni001E % RECORD SEPARATOR -/uni001F % UNIT SEPARATOR -/uni0020 % SPACE -/uni0021 % EXCLAMATION MARK -/uni0022 % QUOTATION MARK -/uni0023 % NUMBER SIGN -/uni0024 % DOLLAR SIGN -/uni0025 % PERCENT SIGN -/uni0026 % AMPERSAND -/uni0027 % APOSTROPHE -/uni0028 % LEFT PARENTHESIS -/uni0029 % RIGHT PARENTHESIS -/uni002A % ASTERISK -/uni002B % PLUS SIGN -/uni002C % COMMA -/uni002D % HYPHEN-MINUS -/uni002E % FULL STOP -/uni002F % SOLIDUS -/uni0030 % DIGIT ZERO -/uni0031 % DIGIT ONE -/uni0032 % DIGIT TWO -/uni0033 % DIGIT THREE -/uni0034 % DIGIT FOUR -/uni0035 % DIGIT FIVE -/uni0036 % DIGIT SIX -/uni0037 % DIGIT SEVEN -/uni0038 % DIGIT EIGHT -/uni0039 % DIGIT NINE -/uni003A % COLON -/uni003B % SEMICOLON -/uni003C % LESS-THAN SIGN -/uni003D % EQUALS SIGN -/uni003E % GREATER-THAN SIGN -/uni003F % QUESTION MARK -/uni0040 % COMMERCIAL AT -/uni0041 % LATIN CAPITAL LETTER A -/uni0042 % LATIN CAPITAL LETTER B -/uni0043 % LATIN CAPITAL LETTER C -/uni0044 % LATIN CAPITAL LETTER D -/uni0045 % LATIN CAPITAL LETTER E -/uni0046 % LATIN CAPITAL LETTER F -/uni0047 % LATIN CAPITAL LETTER G -/uni0048 % LATIN CAPITAL LETTER H -/uni0049 % LATIN CAPITAL LETTER I -/uni004A % LATIN CAPITAL LETTER J -/uni004B % LATIN CAPITAL LETTER K -/uni004C % LATIN CAPITAL LETTER L -/uni004D % LATIN CAPITAL LETTER M -/uni004E % LATIN CAPITAL LETTER N -/uni004F % LATIN CAPITAL LETTER O -/uni0050 % LATIN CAPITAL LETTER P -/uni0051 % LATIN CAPITAL LETTER Q -/uni0052 % LATIN CAPITAL LETTER R -/uni0053 % LATIN CAPITAL LETTER S -/uni0054 % LATIN CAPITAL LETTER T -/uni0055 % LATIN CAPITAL LETTER U -/uni0056 % LATIN CAPITAL LETTER V -/uni0057 % LATIN CAPITAL LETTER W -/uni0058 % LATIN CAPITAL LETTER X -/uni0059 % LATIN CAPITAL LETTER Y -/uni005A % LATIN CAPITAL LETTER Z -/uni005B % LEFT SQUARE BRACKET -/uni005C % REVERSE SOLIDUS -/uni005D % RIGHT SQUARE BRACKET -/uni005E % CIRCUMFLEX ACCENT -/uni005F % LOW LINE -/uni0060 % GRAVE ACCENT -/uni0061 % LATIN SMALL LETTER A -/uni0062 % LATIN SMALL LETTER B -/uni0063 % LATIN SMALL LETTER C -/uni0064 % LATIN SMALL LETTER D -/uni0065 % LATIN SMALL LETTER E -/uni0066 % LATIN SMALL LETTER F -/uni0067 % LATIN SMALL LETTER G -/uni0068 % LATIN SMALL LETTER H -/uni0069 % LATIN SMALL LETTER I -/uni006A % LATIN SMALL LETTER J -/uni006B % LATIN SMALL LETTER K -/uni006C % LATIN SMALL LETTER L -/uni006D % LATIN SMALL LETTER M -/uni006E % LATIN SMALL LETTER N -/uni006F % LATIN SMALL LETTER O -/uni0070 % LATIN SMALL LETTER P -/uni0071 % LATIN SMALL LETTER Q -/uni0072 % LATIN SMALL LETTER R -/uni0073 % LATIN SMALL LETTER S -/uni0074 % LATIN SMALL LETTER T -/uni0075 % LATIN SMALL LETTER U -/uni0076 % LATIN SMALL LETTER V -/uni0077 % LATIN SMALL LETTER W -/uni0078 % LATIN SMALL LETTER X -/uni0079 % LATIN SMALL LETTER Y -/uni007A % LATIN SMALL LETTER Z -/uni007B % LEFT CURLY BRACKET -/uni007C % VERTICAL LINE -/uni007D % RIGHT CURLY BRACKET -/uni007E % TILDE -/uni007F % DELETE -/uni20AC % EURO SIGN -/.undef -/uni201A % SINGLE LOW-9 QUOTATION MARK -/uni0192 % LATIN SMALL LETTER F WITH HOOK -/uni201E % DOUBLE LOW-9 QUOTATION MARK -/uni2026 % HORIZONTAL ELLIPSIS -/uni2020 % DAGGER -/uni2021 % DOUBLE DAGGER -/uni02C6 % MODIFIER LETTER CIRCUMFLEX ACCENT -/uni2030 % PER MILLE SIGN -/uni0160 % LATIN CAPITAL LETTER S WITH CARON -/uni2039 % SINGLE LEFT-POINTING ANGLE QUOTATION MARK -/uni0152 % LATIN CAPITAL LIGATURE OE -/.undef -/uni017D % LATIN CAPITAL LETTER Z WITH CARON -/.undef -/.undef -/uni2018 % LEFT SINGLE QUOTATION MARK -/uni2019 % RIGHT SINGLE QUOTATION MARK -/uni201C % LEFT DOUBLE QUOTATION MARK -/uni201D % RIGHT DOUBLE QUOTATION MARK -/uni2022 % BULLET -/uni2013 % EN DASH -/uni2014 % EM DASH -/uni02DC % SMALL TILDE -/uni2122 % TRADE MARK SIGN -/uni0161 % LATIN SMALL LETTER S WITH CARON -/uni203A % SINGLE RIGHT-POINTING ANGLE QUOTATION MARK -/uni0153 % LATIN SMALL LIGATURE OE -/.undef -/uni017E % LATIN SMALL LETTER Z WITH CARON -/uni0178 % LATIN CAPITAL LETTER Y WITH DIAERESIS -/uni00A0 % NO-BREAK SPACE -/uni00A1 % INVERTED EXCLAMATION MARK -/uni00A2 % CENT SIGN -/uni00A3 % POUND SIGN -/uni00A4 % CURRENCY SIGN -/uni00A5 % YEN SIGN -/uni00A6 % BROKEN BAR -/uni00A7 % SECTION SIGN -/uni00A8 % DIAERESIS -/uni00A9 % COPYRIGHT SIGN -/uni00AA % FEMININE ORDINAL INDICATOR -/uni00AB % LEFT-POINTING DOUBLE ANGLE QUOTATION MARK -/uni00AC % NOT SIGN -/uni00AD % SOFT HYPHEN -/uni00AE % REGISTERED SIGN -/uni00AF % MACRON -/uni00B0 % DEGREE SIGN -/uni00B1 % PLUS-MINUS SIGN -/uni00B2 % SUPERSCRIPT TWO -/uni00B3 % SUPERSCRIPT THREE -/uni00B4 % ACUTE ACCENT -/uni00B5 % MICRO SIGN -/uni00B6 % PILCROW SIGN -/uni00B7 % MIDDLE DOT -/uni00B8 % CEDILLA -/uni00B9 % SUPERSCRIPT ONE -/uni00BA % MASCULINE ORDINAL INDICATOR -/uni00BB % RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK -/uni00BC % VULGAR FRACTION ONE QUARTER -/uni00BD % VULGAR FRACTION ONE HALF -/uni00BE % VULGAR FRACTION THREE QUARTERS -/uni00BF % INVERTED QUESTION MARK -/uni00C0 % LATIN CAPITAL LETTER A WITH GRAVE -/uni00C1 % LATIN CAPITAL LETTER A WITH ACUTE -/uni00C2 % LATIN CAPITAL LETTER A WITH CIRCUMFLEX -/uni00C3 % LATIN CAPITAL LETTER A WITH TILDE -/uni00C4 % LATIN CAPITAL LETTER A WITH DIAERESIS -/uni00C5 % LATIN CAPITAL LETTER A WITH RING ABOVE -/uni00C6 % LATIN CAPITAL LETTER AE -/uni00C7 % LATIN CAPITAL LETTER C WITH CEDILLA -/uni00C8 % LATIN CAPITAL LETTER E WITH GRAVE -/uni00C9 % LATIN CAPITAL LETTER E WITH ACUTE -/uni00CA % LATIN CAPITAL LETTER E WITH CIRCUMFLEX -/uni00CB % LATIN CAPITAL LETTER E WITH DIAERESIS -/uni00CC % LATIN CAPITAL LETTER I WITH GRAVE -/uni00CD % LATIN CAPITAL LETTER I WITH ACUTE -/uni00CE % LATIN CAPITAL LETTER I WITH CIRCUMFLEX -/uni00CF % LATIN CAPITAL LETTER I WITH DIAERESIS -/uni00D0 % LATIN CAPITAL LETTER ETH -/uni00D1 % LATIN CAPITAL LETTER N WITH TILDE -/uni00D2 % LATIN CAPITAL LETTER O WITH GRAVE -/uni00D3 % LATIN CAPITAL LETTER O WITH ACUTE -/uni00D4 % LATIN CAPITAL LETTER O WITH CIRCUMFLEX -/uni00D5 % LATIN CAPITAL LETTER O WITH TILDE -/uni00D6 % LATIN CAPITAL LETTER O WITH DIAERESIS -/uni00D7 % MULTIPLICATION SIGN -/uni00D8 % LATIN CAPITAL LETTER O WITH STROKE -/uni00D9 % LATIN CAPITAL LETTER U WITH GRAVE -/uni00DA % LATIN CAPITAL LETTER U WITH ACUTE -/uni00DB % LATIN CAPITAL LETTER U WITH CIRCUMFLEX -/uni00DC % LATIN CAPITAL LETTER U WITH DIAERESIS -/uni00DD % LATIN CAPITAL LETTER Y WITH ACUTE -/uni00DE % LATIN CAPITAL LETTER THORN -/uni00DF % LATIN SMALL LETTER SHARP S -/uni00E0 % LATIN SMALL LETTER A WITH GRAVE -/uni00E1 % LATIN SMALL LETTER A WITH ACUTE -/uni00E2 % LATIN SMALL LETTER A WITH CIRCUMFLEX -/uni00E3 % LATIN SMALL LETTER A WITH TILDE -/uni00E4 % LATIN SMALL LETTER A WITH DIAERESIS -/uni00E5 % LATIN SMALL LETTER A WITH RING ABOVE -/uni00E6 % LATIN SMALL LETTER AE -/uni00E7 % LATIN SMALL LETTER C WITH CEDILLA -/uni00E8 % LATIN SMALL LETTER E WITH GRAVE -/uni00E9 % LATIN SMALL LETTER E WITH ACUTE -/uni00EA % LATIN SMALL LETTER E WITH CIRCUMFLEX -/uni00EB % LATIN SMALL LETTER E WITH DIAERESIS -/uni00EC % LATIN SMALL LETTER I WITH GRAVE -/uni00ED % LATIN SMALL LETTER I WITH ACUTE -/uni00EE % LATIN SMALL LETTER I WITH CIRCUMFLEX -/uni00EF % LATIN SMALL LETTER I WITH DIAERESIS -/uni00F0 % LATIN SMALL LETTER ETH -/uni00F1 % LATIN SMALL LETTER N WITH TILDE -/uni00F2 % LATIN SMALL LETTER O WITH GRAVE -/uni00F3 % LATIN SMALL LETTER O WITH ACUTE -/uni00F4 % LATIN SMALL LETTER O WITH CIRCUMFLEX -/uni00F5 % LATIN SMALL LETTER O WITH TILDE -/uni00F6 % LATIN SMALL LETTER O WITH DIAERESIS -/uni00F7 % DIVISION SIGN -/uni00F8 % LATIN SMALL LETTER O WITH STROKE -/uni00F9 % LATIN SMALL LETTER U WITH GRAVE -/uni00FA % LATIN SMALL LETTER U WITH ACUTE -/uni00FB % LATIN SMALL LETTER U WITH CIRCUMFLEX -/uni00FC % LATIN SMALL LETTER U WITH DIAERESIS -/uni00FD % LATIN SMALL LETTER Y WITH ACUTE -/uni00FE % LATIN SMALL LETTER THORN -/uni00FF % LATIN SMALL LETTER Y WITH DIAERESIS +% $Header: /cvsroot/html2ps/postscript/encoding.windows-1252.ps,v 1.1 2005/12/18 07:21:38 Konstantin Exp $ +/Windows-1252-Encoding [ +/uni0000 % NULL +/uni0001 % START OF HEADING +/uni0002 % START OF TEXT +/uni0003 % END OF TEXT +/uni0004 % END OF TRANSMISSION +/uni0005 % ENQUIRY +/uni0006 % ACKNOWLEDGE +/uni0007 % BELL +/uni0008 % BACKSPACE +/uni0009 % HORIZONTAL TABULATION +/uni000A % LINE FEED +/uni000B % VERTICAL TABULATION +/uni000C % FORM FEED +/uni000D % CARRIAGE RETURN +/uni000E % SHIFT OUT +/uni000F % SHIFT IN +/uni0010 % DATA LINK ESCAPE +/uni0011 % DEVICE CONTROL ONE +/uni0012 % DEVICE CONTROL TWO +/uni0013 % DEVICE CONTROL THREE +/uni0014 % DEVICE CONTROL FOUR +/uni0015 % NEGATIVE ACKNOWLEDGE +/uni0016 % SYNCHRONOUS IDLE +/uni0017 % END OF TRANSMISSION BLOCK +/uni0018 % CANCEL +/uni0019 % END OF MEDIUM +/uni001A % SUBSTITUTE +/uni001B % ESCAPE +/uni001C % FILE SEPARATOR +/uni001D % GROUP SEPARATOR +/uni001E % RECORD SEPARATOR +/uni001F % UNIT SEPARATOR +/uni0020 % SPACE +/uni0021 % EXCLAMATION MARK +/uni0022 % QUOTATION MARK +/uni0023 % NUMBER SIGN +/uni0024 % DOLLAR SIGN +/uni0025 % PERCENT SIGN +/uni0026 % AMPERSAND +/uni0027 % APOSTROPHE +/uni0028 % LEFT PARENTHESIS +/uni0029 % RIGHT PARENTHESIS +/uni002A % ASTERISK +/uni002B % PLUS SIGN +/uni002C % COMMA +/uni002D % HYPHEN-MINUS +/uni002E % FULL STOP +/uni002F % SOLIDUS +/uni0030 % DIGIT ZERO +/uni0031 % DIGIT ONE +/uni0032 % DIGIT TWO +/uni0033 % DIGIT THREE +/uni0034 % DIGIT FOUR +/uni0035 % DIGIT FIVE +/uni0036 % DIGIT SIX +/uni0037 % DIGIT SEVEN +/uni0038 % DIGIT EIGHT +/uni0039 % DIGIT NINE +/uni003A % COLON +/uni003B % SEMICOLON +/uni003C % LESS-THAN SIGN +/uni003D % EQUALS SIGN +/uni003E % GREATER-THAN SIGN +/uni003F % QUESTION MARK +/uni0040 % COMMERCIAL AT +/uni0041 % LATIN CAPITAL LETTER A +/uni0042 % LATIN CAPITAL LETTER B +/uni0043 % LATIN CAPITAL LETTER C +/uni0044 % LATIN CAPITAL LETTER D +/uni0045 % LATIN CAPITAL LETTER E +/uni0046 % LATIN CAPITAL LETTER F +/uni0047 % LATIN CAPITAL LETTER G +/uni0048 % LATIN CAPITAL LETTER H +/uni0049 % LATIN CAPITAL LETTER I +/uni004A % LATIN CAPITAL LETTER J +/uni004B % LATIN CAPITAL LETTER K +/uni004C % LATIN CAPITAL LETTER L +/uni004D % LATIN CAPITAL LETTER M +/uni004E % LATIN CAPITAL LETTER N +/uni004F % LATIN CAPITAL LETTER O +/uni0050 % LATIN CAPITAL LETTER P +/uni0051 % LATIN CAPITAL LETTER Q +/uni0052 % LATIN CAPITAL LETTER R +/uni0053 % LATIN CAPITAL LETTER S +/uni0054 % LATIN CAPITAL LETTER T +/uni0055 % LATIN CAPITAL LETTER U +/uni0056 % LATIN CAPITAL LETTER V +/uni0057 % LATIN CAPITAL LETTER W +/uni0058 % LATIN CAPITAL LETTER X +/uni0059 % LATIN CAPITAL LETTER Y +/uni005A % LATIN CAPITAL LETTER Z +/uni005B % LEFT SQUARE BRACKET +/uni005C % REVERSE SOLIDUS +/uni005D % RIGHT SQUARE BRACKET +/uni005E % CIRCUMFLEX ACCENT +/uni005F % LOW LINE +/uni0060 % GRAVE ACCENT +/uni0061 % LATIN SMALL LETTER A +/uni0062 % LATIN SMALL LETTER B +/uni0063 % LATIN SMALL LETTER C +/uni0064 % LATIN SMALL LETTER D +/uni0065 % LATIN SMALL LETTER E +/uni0066 % LATIN SMALL LETTER F +/uni0067 % LATIN SMALL LETTER G +/uni0068 % LATIN SMALL LETTER H +/uni0069 % LATIN SMALL LETTER I +/uni006A % LATIN SMALL LETTER J +/uni006B % LATIN SMALL LETTER K +/uni006C % LATIN SMALL LETTER L +/uni006D % LATIN SMALL LETTER M +/uni006E % LATIN SMALL LETTER N +/uni006F % LATIN SMALL LETTER O +/uni0070 % LATIN SMALL LETTER P +/uni0071 % LATIN SMALL LETTER Q +/uni0072 % LATIN SMALL LETTER R +/uni0073 % LATIN SMALL LETTER S +/uni0074 % LATIN SMALL LETTER T +/uni0075 % LATIN SMALL LETTER U +/uni0076 % LATIN SMALL LETTER V +/uni0077 % LATIN SMALL LETTER W +/uni0078 % LATIN SMALL LETTER X +/uni0079 % LATIN SMALL LETTER Y +/uni007A % LATIN SMALL LETTER Z +/uni007B % LEFT CURLY BRACKET +/uni007C % VERTICAL LINE +/uni007D % RIGHT CURLY BRACKET +/uni007E % TILDE +/uni007F % DELETE +/uni20AC % EURO SIGN +/.undef +/uni201A % SINGLE LOW-9 QUOTATION MARK +/uni0192 % LATIN SMALL LETTER F WITH HOOK +/uni201E % DOUBLE LOW-9 QUOTATION MARK +/uni2026 % HORIZONTAL ELLIPSIS +/uni2020 % DAGGER +/uni2021 % DOUBLE DAGGER +/uni02C6 % MODIFIER LETTER CIRCUMFLEX ACCENT +/uni2030 % PER MILLE SIGN +/uni0160 % LATIN CAPITAL LETTER S WITH CARON +/uni2039 % SINGLE LEFT-POINTING ANGLE QUOTATION MARK +/uni0152 % LATIN CAPITAL LIGATURE OE +/.undef +/uni017D % LATIN CAPITAL LETTER Z WITH CARON +/.undef +/.undef +/uni2018 % LEFT SINGLE QUOTATION MARK +/uni2019 % RIGHT SINGLE QUOTATION MARK +/uni201C % LEFT DOUBLE QUOTATION MARK +/uni201D % RIGHT DOUBLE QUOTATION MARK +/uni2022 % BULLET +/uni2013 % EN DASH +/uni2014 % EM DASH +/uni02DC % SMALL TILDE +/uni2122 % TRADE MARK SIGN +/uni0161 % LATIN SMALL LETTER S WITH CARON +/uni203A % SINGLE RIGHT-POINTING ANGLE QUOTATION MARK +/uni0153 % LATIN SMALL LIGATURE OE +/.undef +/uni017E % LATIN SMALL LETTER Z WITH CARON +/uni0178 % LATIN CAPITAL LETTER Y WITH DIAERESIS +/uni00A0 % NO-BREAK SPACE +/uni00A1 % INVERTED EXCLAMATION MARK +/uni00A2 % CENT SIGN +/uni00A3 % POUND SIGN +/uni00A4 % CURRENCY SIGN +/uni00A5 % YEN SIGN +/uni00A6 % BROKEN BAR +/uni00A7 % SECTION SIGN +/uni00A8 % DIAERESIS +/uni00A9 % COPYRIGHT SIGN +/uni00AA % FEMININE ORDINAL INDICATOR +/uni00AB % LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +/uni00AC % NOT SIGN +/uni00AD % SOFT HYPHEN +/uni00AE % REGISTERED SIGN +/uni00AF % MACRON +/uni00B0 % DEGREE SIGN +/uni00B1 % PLUS-MINUS SIGN +/uni00B2 % SUPERSCRIPT TWO +/uni00B3 % SUPERSCRIPT THREE +/uni00B4 % ACUTE ACCENT +/uni00B5 % MICRO SIGN +/uni00B6 % PILCROW SIGN +/uni00B7 % MIDDLE DOT +/uni00B8 % CEDILLA +/uni00B9 % SUPERSCRIPT ONE +/uni00BA % MASCULINE ORDINAL INDICATOR +/uni00BB % RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +/uni00BC % VULGAR FRACTION ONE QUARTER +/uni00BD % VULGAR FRACTION ONE HALF +/uni00BE % VULGAR FRACTION THREE QUARTERS +/uni00BF % INVERTED QUESTION MARK +/uni00C0 % LATIN CAPITAL LETTER A WITH GRAVE +/uni00C1 % LATIN CAPITAL LETTER A WITH ACUTE +/uni00C2 % LATIN CAPITAL LETTER A WITH CIRCUMFLEX +/uni00C3 % LATIN CAPITAL LETTER A WITH TILDE +/uni00C4 % LATIN CAPITAL LETTER A WITH DIAERESIS +/uni00C5 % LATIN CAPITAL LETTER A WITH RING ABOVE +/uni00C6 % LATIN CAPITAL LETTER AE +/uni00C7 % LATIN CAPITAL LETTER C WITH CEDILLA +/uni00C8 % LATIN CAPITAL LETTER E WITH GRAVE +/uni00C9 % LATIN CAPITAL LETTER E WITH ACUTE +/uni00CA % LATIN CAPITAL LETTER E WITH CIRCUMFLEX +/uni00CB % LATIN CAPITAL LETTER E WITH DIAERESIS +/uni00CC % LATIN CAPITAL LETTER I WITH GRAVE +/uni00CD % LATIN CAPITAL LETTER I WITH ACUTE +/uni00CE % LATIN CAPITAL LETTER I WITH CIRCUMFLEX +/uni00CF % LATIN CAPITAL LETTER I WITH DIAERESIS +/uni00D0 % LATIN CAPITAL LETTER ETH +/uni00D1 % LATIN CAPITAL LETTER N WITH TILDE +/uni00D2 % LATIN CAPITAL LETTER O WITH GRAVE +/uni00D3 % LATIN CAPITAL LETTER O WITH ACUTE +/uni00D4 % LATIN CAPITAL LETTER O WITH CIRCUMFLEX +/uni00D5 % LATIN CAPITAL LETTER O WITH TILDE +/uni00D6 % LATIN CAPITAL LETTER O WITH DIAERESIS +/uni00D7 % MULTIPLICATION SIGN +/uni00D8 % LATIN CAPITAL LETTER O WITH STROKE +/uni00D9 % LATIN CAPITAL LETTER U WITH GRAVE +/uni00DA % LATIN CAPITAL LETTER U WITH ACUTE +/uni00DB % LATIN CAPITAL LETTER U WITH CIRCUMFLEX +/uni00DC % LATIN CAPITAL LETTER U WITH DIAERESIS +/uni00DD % LATIN CAPITAL LETTER Y WITH ACUTE +/uni00DE % LATIN CAPITAL LETTER THORN +/uni00DF % LATIN SMALL LETTER SHARP S +/uni00E0 % LATIN SMALL LETTER A WITH GRAVE +/uni00E1 % LATIN SMALL LETTER A WITH ACUTE +/uni00E2 % LATIN SMALL LETTER A WITH CIRCUMFLEX +/uni00E3 % LATIN SMALL LETTER A WITH TILDE +/uni00E4 % LATIN SMALL LETTER A WITH DIAERESIS +/uni00E5 % LATIN SMALL LETTER A WITH RING ABOVE +/uni00E6 % LATIN SMALL LETTER AE +/uni00E7 % LATIN SMALL LETTER C WITH CEDILLA +/uni00E8 % LATIN SMALL LETTER E WITH GRAVE +/uni00E9 % LATIN SMALL LETTER E WITH ACUTE +/uni00EA % LATIN SMALL LETTER E WITH CIRCUMFLEX +/uni00EB % LATIN SMALL LETTER E WITH DIAERESIS +/uni00EC % LATIN SMALL LETTER I WITH GRAVE +/uni00ED % LATIN SMALL LETTER I WITH ACUTE +/uni00EE % LATIN SMALL LETTER I WITH CIRCUMFLEX +/uni00EF % LATIN SMALL LETTER I WITH DIAERESIS +/uni00F0 % LATIN SMALL LETTER ETH +/uni00F1 % LATIN SMALL LETTER N WITH TILDE +/uni00F2 % LATIN SMALL LETTER O WITH GRAVE +/uni00F3 % LATIN SMALL LETTER O WITH ACUTE +/uni00F4 % LATIN SMALL LETTER O WITH CIRCUMFLEX +/uni00F5 % LATIN SMALL LETTER O WITH TILDE +/uni00F6 % LATIN SMALL LETTER O WITH DIAERESIS +/uni00F7 % DIVISION SIGN +/uni00F8 % LATIN SMALL LETTER O WITH STROKE +/uni00F9 % LATIN SMALL LETTER U WITH GRAVE +/uni00FA % LATIN SMALL LETTER U WITH ACUTE +/uni00FB % LATIN SMALL LETTER U WITH CIRCUMFLEX +/uni00FC % LATIN SMALL LETTER U WITH DIAERESIS +/uni00FD % LATIN SMALL LETTER Y WITH ACUTE +/uni00FE % LATIN SMALL LETTER THORN +/uni00FF % LATIN SMALL LETTER Y WITH DIAERESIS ] readonly def \ No newline at end of file diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/fastps.footer.ps b/thirdparty/html2ps_pdf/postscript/fastps.footer.ps similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/postscript/fastps.footer.ps rename to thirdparty/html2ps_pdf/postscript/fastps.footer.ps diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/fastps.header.ps b/thirdparty/html2ps_pdf/postscript/fastps.header.ps similarity index 96% rename from gulliver/thirdparty/html2ps_pdf/postscript/fastps.header.ps rename to thirdparty/html2ps_pdf/postscript/fastps.header.ps index 3865e295e..606403267 100644 --- a/gulliver/thirdparty/html2ps_pdf/postscript/fastps.header.ps +++ b/thirdparty/html2ps_pdf/postscript/fastps.header.ps @@ -1,381 +1,381 @@ -%!PS-Adobe-3.0 -%%Pages: ##PAGES## -%%BoundingBox: ##BBOX## -%%EndComments -%%BeginProlog -/cm {28.34 mul} def -/mm {2.834 mul} def - -##PS2PDF## -##TRANSPARENCY## - -/findfont-enc { % => FontName Encoding - exch - findfont % => FontSize - dup length dict begin { - 1 index /FID ne { - def - } { - pop pop - } ifelse - } forall - /Encoding 1 index def - currentdict - end - - /Font-Enc exch definefont % => - exch pop -} def - -/image-create { % => Mask Image Init SY SX - << >> - dup /SX 3 index put - dup /SY 4 index put - dup /Init 5 index put - dup /Image 6 index put - dup /Mask 7 index put - - exch pop - exch pop - exch pop - exch pop - exch pop -} def - -/image-show { % => W H Image -% Check if image is transparent - dup /Mask get /null eq { % => W H Image - 2 index - 2 index % => W H Image W H - 2 index /SX get - 3 index /SY get - 4 index /Image get - 5 index /Init get % => W H Image W H SX SY Image Init - show-image % => W H Image - } { - 2 index - 2 index % => W H Image W H - 2 index /SX get - 3 index /SY get - 4 index /Mask get - 5 index /Image get - 6 index /Init get % => W H Image W H SX SY Mask Image Init - show-transparent-image - } ifelse % => W H Image - pop pop pop -} def - -/image-show-simple { % => Scale Y X Image - 1 index - 3 index moveto % => Scale Y X Image - - dup /SX get 4 index mul - 1 index /SY get 5 index mul % => Scale Y X Image W H - 2 index image-show % => Scale Y X Image - - pop pop pop pop -} def - -/image-show-repeat-x { % => Scale YOffset XOffset Right Width Y X Image - dup /SX get 8 index mul - 1 index /SY get 9 index mul % => Scale YOffset XOffset Right width Y X Image W H - -% Fill part to the right - - 3 index % => Scale YOffset XOffset Right width Y X Image W H CX - { % => Scale YOffset XOffset Right width Y X Image W H CX - dup - 8 index ge { exit } if - - dup 6 index moveto % => Scale YOffset XOffset Right width Y X Image W H CX - - 2 index 2 index 5 index - image-show % => Scale YOffset XOffset Right width Y X Image W H CY - 6 index add % => Scale YOffset XOffset Right width Y X Image W H CY - } loop - pop -% Fill part to the left - - 3 index - { % => Scale YOffset XOffset Right width Y X Image W H CX - dup 7 index add - 5 index 10 index sub - lt { exit } if - - dup 7 index sub - 6 index moveto % => Scale YOffset XOffset Right width Y X Image W H CX - - 2 index 2 index 5 index - image-show % => Scale YOffset XOffset Right width Y X Image W H CX - - 6 index sub % => Scale YOffset XOffset Right width Y X Image W H CX - } loop - pop - pop pop - - pop pop pop - pop pop pop - pop pop -} def - -/image-show-repeat-y { % => Scale YOffset XOffset Bottom height Y X Image - dup /SX get 8 index mul - 1 index /SY get 9 index mul % => Scale YOffset XOffset Bottom height Y X Image W H - -% Fill part to the bottom - - 4 index % => Scale YOffset XOffset Bottom height Y X Image W H CY - { % => Scale YOffset XOffset Bottom height Y X Image W H CY - 6 index 1 index add - 8 index le { exit } if - - 4 index 1 index moveto % => Scale YOffset XOffset Bottom height Y X Image W H CY - - 2 index 2 index 5 index - image-show % => Scale YOffset XOffset Bottom height Y X Image W H CY - 6 index sub % => Scale YOffset XOffset Bottom height Y X Image W H CY - } loop - pop - -% Fill part to the top - - 4 index - { % => Scale YOffset XOffset Bottom height Y X Image W H CY - 6 index 1 index exch sub - 10 index 7 index add - ge { exit } if - - 4 index 1 index moveto % => Scale YOffset XOffset Bottom height Y X Image W H CY - - 2 index 2 index 5 index - image-show % => Scale YOffset XOffset Bottom height Y X Image W H CY - - 6 index add % => Scale YOffset XOffset Bottom height Y X Image W H CY - } loop - pop - pop pop - - pop pop pop - pop pop pop - pop pop -} def - -/image-show-repeat-xy { % => Scale YOffset XOffset Bottom Right Height Width Y X Image - dup /SX get 10 index mul - 1 index /SY get 11 index mul % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H - -% Fill bottom-right quadrant - 4 index % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY - { - dup 8 index add - 10 index le { exit } if % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY - - 4 index % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY CX - { - dup 10 index ge { exit } if - - dup 2 index moveto - 3 index 3 index 6 index - image-show - - 7 index add - } loop % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY CX - pop - - 7 index sub - } loop % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY - pop - -% Fill bottom-left quadrant - 4 index % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY - { - dup 8 index add - 10 index le { exit } if % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY - - 4 index % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY CX - { - dup 8 index add - 6 index 13 index sub - le { exit } if - - dup 2 index moveto - 3 index 3 index 6 index - image-show - - 7 index sub - } loop % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY CX - pop - - 7 index sub - } loop % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY - pop - -% Fill top-right quadrant - 4 index % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY - { - dup - 6 index 13 index add - gt { exit } if % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY - - 4 index % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY CX - { - dup 10 index gt { exit } if - - dup 2 index moveto - 3 index 3 index 6 index - image-show - - 7 index add - } loop % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY CX - pop - - 7 index add - } loop % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY - pop - -% Fill top-left quadrant - 4 index % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY - { - dup - 6 index 13 index add - ge { exit } if % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY - - 4 index % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY CX - { - dup 8 index add - 6 index 13 index sub - le { exit } if - - dup 2 index moveto - 3 index 3 index 6 index - image-show - - 7 index sub - } loop % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY CX - pop - - 7 index add - } loop % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY - pop - - pop pop - - pop pop pop - pop pop pop - pop pop pop - pop -} def - -/show-image { % => W H W H Samples InitFunc - exec % => W H W H Samples - - gsave - - matrix % => W H W H Samples Matr - currentpoint % => W H W H Samples Matr X Y - translate % => W H W H Samples Matr' - 5 index - 4 index div % => W H W H Samples Matr' KX - 5 index - 4 index div neg % => W H W H Samples Matr' KX KY - scale % => W H W H Samples Matr'' - 0 3 index neg % => W H W H Samples Matr'' 0 -H(px) - translate % => W H W H Samples Matr - - << - /ImageType 1 - /Width 7 index - /Height 8 index - /BitsPerComponent 8 - /Decode [0 1 0 1 0 1] - /ImageMatrix 12 index - /DataSource 15 index - >> - - image - - grestore - - pop pop pop - pop pop pop -} def - -/show-transparent-image { % => W H W H Mask Samples InitFunc - exec % => W H W H Mask Samples - - gsave - - matrix % => W H W H Mask Samples Matr - currentpoint % => W H W H Mask Samples Matr X Y - translate % => W H W H Mask Samples Matr' - 6 index - 5 index div % => W H W H Mask Samples Matr' KX - 6 index - 5 index div neg % => W H W H Mask Samples Matr' KX KY - scale % => W H W H Mask Samples Matr'' - 0 4 index neg % => W H W H Mask Samples Matr'' 0 -H(px) - translate % => W H W H Mask Samples Matr - -% As support of type 3 images in ps2pdf is bad, we'll use this workaround - ps2pdf-transparency-hack { - << - /ImageType no-transparency-output { 1 } { 4 } ifelse - /Width 8 index - /Height 9 index - /BitsPerComponent 8 - /Decode [0 1 0 1 0 1] - /ImageMatrix 12 index - /DataSource 15 index - /MaskColor [0 0 0] - >> - } { - << - /ImageType 3 - /InterleaveType 3 - /DataDict - << - /ImageType 1 - /Width 14 index - /Height 15 index - /BitsPerComponent 8 - /Decode [0 1 0 1 0 1] - /ImageMatrix 18 index - /DataSource 21 index - >> - /MaskDict - << - /ImageType 1 - /Width 16 index - /Height 17 index - /BitsPerComponent 1 - /Decode [0 1] - /ImageMatrix 20 index - /DataSource 24 index - >> - >> - } ifelse - - image - - grestore - - pop pop pop pop - pop pop pop -} def - -/IL1 { % => Width Matrix Source - << /ImageType 1 /Width 6 index /Height 1 /BitsPerComponent 8 /Decode [0 1 0 1 0 1] /ImageMatrix 13 index /DataSource 14 index >> image -} def - -##MEDIA## - -##PROLOG## -%%EndProlog -%%BeginSetup -%%EndSetup - -%%Page: 1 1 -%%BeginPageSetup -initpage -0 0 0 setrgbcolor +%!PS-Adobe-3.0 +%%Pages: ##PAGES## +%%BoundingBox: ##BBOX## +%%EndComments +%%BeginProlog +/cm {28.34 mul} def +/mm {2.834 mul} def + +##PS2PDF## +##TRANSPARENCY## + +/findfont-enc { % => FontName Encoding + exch + findfont % => FontSize + dup length dict begin { + 1 index /FID ne { + def + } { + pop pop + } ifelse + } forall + /Encoding 1 index def + currentdict + end + + /Font-Enc exch definefont % => + exch pop +} def + +/image-create { % => Mask Image Init SY SX + << >> + dup /SX 3 index put + dup /SY 4 index put + dup /Init 5 index put + dup /Image 6 index put + dup /Mask 7 index put + + exch pop + exch pop + exch pop + exch pop + exch pop +} def + +/image-show { % => W H Image +% Check if image is transparent + dup /Mask get /null eq { % => W H Image + 2 index + 2 index % => W H Image W H + 2 index /SX get + 3 index /SY get + 4 index /Image get + 5 index /Init get % => W H Image W H SX SY Image Init + show-image % => W H Image + } { + 2 index + 2 index % => W H Image W H + 2 index /SX get + 3 index /SY get + 4 index /Mask get + 5 index /Image get + 6 index /Init get % => W H Image W H SX SY Mask Image Init + show-transparent-image + } ifelse % => W H Image + pop pop pop +} def + +/image-show-simple { % => Scale Y X Image + 1 index + 3 index moveto % => Scale Y X Image + + dup /SX get 4 index mul + 1 index /SY get 5 index mul % => Scale Y X Image W H + 2 index image-show % => Scale Y X Image + + pop pop pop pop +} def + +/image-show-repeat-x { % => Scale YOffset XOffset Right Width Y X Image + dup /SX get 8 index mul + 1 index /SY get 9 index mul % => Scale YOffset XOffset Right width Y X Image W H + +% Fill part to the right + + 3 index % => Scale YOffset XOffset Right width Y X Image W H CX + { % => Scale YOffset XOffset Right width Y X Image W H CX + dup + 8 index ge { exit } if + + dup 6 index moveto % => Scale YOffset XOffset Right width Y X Image W H CX + + 2 index 2 index 5 index + image-show % => Scale YOffset XOffset Right width Y X Image W H CY + 6 index add % => Scale YOffset XOffset Right width Y X Image W H CY + } loop + pop +% Fill part to the left + + 3 index + { % => Scale YOffset XOffset Right width Y X Image W H CX + dup 7 index add + 5 index 10 index sub + lt { exit } if + + dup 7 index sub + 6 index moveto % => Scale YOffset XOffset Right width Y X Image W H CX + + 2 index 2 index 5 index + image-show % => Scale YOffset XOffset Right width Y X Image W H CX + + 6 index sub % => Scale YOffset XOffset Right width Y X Image W H CX + } loop + pop + pop pop + + pop pop pop + pop pop pop + pop pop +} def + +/image-show-repeat-y { % => Scale YOffset XOffset Bottom height Y X Image + dup /SX get 8 index mul + 1 index /SY get 9 index mul % => Scale YOffset XOffset Bottom height Y X Image W H + +% Fill part to the bottom + + 4 index % => Scale YOffset XOffset Bottom height Y X Image W H CY + { % => Scale YOffset XOffset Bottom height Y X Image W H CY + 6 index 1 index add + 8 index le { exit } if + + 4 index 1 index moveto % => Scale YOffset XOffset Bottom height Y X Image W H CY + + 2 index 2 index 5 index + image-show % => Scale YOffset XOffset Bottom height Y X Image W H CY + 6 index sub % => Scale YOffset XOffset Bottom height Y X Image W H CY + } loop + pop + +% Fill part to the top + + 4 index + { % => Scale YOffset XOffset Bottom height Y X Image W H CY + 6 index 1 index exch sub + 10 index 7 index add + ge { exit } if + + 4 index 1 index moveto % => Scale YOffset XOffset Bottom height Y X Image W H CY + + 2 index 2 index 5 index + image-show % => Scale YOffset XOffset Bottom height Y X Image W H CY + + 6 index add % => Scale YOffset XOffset Bottom height Y X Image W H CY + } loop + pop + pop pop + + pop pop pop + pop pop pop + pop pop +} def + +/image-show-repeat-xy { % => Scale YOffset XOffset Bottom Right Height Width Y X Image + dup /SX get 10 index mul + 1 index /SY get 11 index mul % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H + +% Fill bottom-right quadrant + 4 index % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY + { + dup 8 index add + 10 index le { exit } if % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY + + 4 index % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY CX + { + dup 10 index ge { exit } if + + dup 2 index moveto + 3 index 3 index 6 index + image-show + + 7 index add + } loop % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY CX + pop + + 7 index sub + } loop % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY + pop + +% Fill bottom-left quadrant + 4 index % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY + { + dup 8 index add + 10 index le { exit } if % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY + + 4 index % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY CX + { + dup 8 index add + 6 index 13 index sub + le { exit } if + + dup 2 index moveto + 3 index 3 index 6 index + image-show + + 7 index sub + } loop % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY CX + pop + + 7 index sub + } loop % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY + pop + +% Fill top-right quadrant + 4 index % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY + { + dup + 6 index 13 index add + gt { exit } if % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY + + 4 index % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY CX + { + dup 10 index gt { exit } if + + dup 2 index moveto + 3 index 3 index 6 index + image-show + + 7 index add + } loop % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY CX + pop + + 7 index add + } loop % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY + pop + +% Fill top-left quadrant + 4 index % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY + { + dup + 6 index 13 index add + ge { exit } if % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY + + 4 index % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY CX + { + dup 8 index add + 6 index 13 index sub + le { exit } if + + dup 2 index moveto + 3 index 3 index 6 index + image-show + + 7 index sub + } loop % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY CX + pop + + 7 index add + } loop % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY + pop + + pop pop + + pop pop pop + pop pop pop + pop pop pop + pop +} def + +/show-image { % => W H W H Samples InitFunc + exec % => W H W H Samples + + gsave + + matrix % => W H W H Samples Matr + currentpoint % => W H W H Samples Matr X Y + translate % => W H W H Samples Matr' + 5 index + 4 index div % => W H W H Samples Matr' KX + 5 index + 4 index div neg % => W H W H Samples Matr' KX KY + scale % => W H W H Samples Matr'' + 0 3 index neg % => W H W H Samples Matr'' 0 -H(px) + translate % => W H W H Samples Matr + + << + /ImageType 1 + /Width 7 index + /Height 8 index + /BitsPerComponent 8 + /Decode [0 1 0 1 0 1] + /ImageMatrix 12 index + /DataSource 15 index + >> + + image + + grestore + + pop pop pop + pop pop pop +} def + +/show-transparent-image { % => W H W H Mask Samples InitFunc + exec % => W H W H Mask Samples + + gsave + + matrix % => W H W H Mask Samples Matr + currentpoint % => W H W H Mask Samples Matr X Y + translate % => W H W H Mask Samples Matr' + 6 index + 5 index div % => W H W H Mask Samples Matr' KX + 6 index + 5 index div neg % => W H W H Mask Samples Matr' KX KY + scale % => W H W H Mask Samples Matr'' + 0 4 index neg % => W H W H Mask Samples Matr'' 0 -H(px) + translate % => W H W H Mask Samples Matr + +% As support of type 3 images in ps2pdf is bad, we'll use this workaround + ps2pdf-transparency-hack { + << + /ImageType no-transparency-output { 1 } { 4 } ifelse + /Width 8 index + /Height 9 index + /BitsPerComponent 8 + /Decode [0 1 0 1 0 1] + /ImageMatrix 12 index + /DataSource 15 index + /MaskColor [0 0 0] + >> + } { + << + /ImageType 3 + /InterleaveType 3 + /DataDict + << + /ImageType 1 + /Width 14 index + /Height 15 index + /BitsPerComponent 8 + /Decode [0 1 0 1 0 1] + /ImageMatrix 18 index + /DataSource 21 index + >> + /MaskDict + << + /ImageType 1 + /Width 16 index + /Height 17 index + /BitsPerComponent 1 + /Decode [0 1] + /ImageMatrix 20 index + /DataSource 24 index + >> + >> + } ifelse + + image + + grestore + + pop pop pop pop + pop pop pop +} def + +/IL1 { % => Width Matrix Source + << /ImageType 1 /Width 6 index /Height 1 /BitsPerComponent 8 /Decode [0 1 0 1 0 1] /ImageMatrix 13 index /DataSource 14 index >> image +} def + +##MEDIA## + +##PROLOG## +%%EndProlog +%%BeginSetup +%%EndSetup + +%%Page: 1 1 +%%BeginPageSetup +initpage +0 0 0 setrgbcolor %%EndPageSetup \ No newline at end of file diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/flow.block.ps b/thirdparty/html2ps_pdf/postscript/flow.block.ps similarity index 96% rename from gulliver/thirdparty/html2ps_pdf/postscript/flow.block.ps rename to thirdparty/html2ps_pdf/postscript/flow.block.ps index 97ca35cc1..727c3a226 100644 --- a/gulliver/thirdparty/html2ps_pdf/postscript/flow.block.ps +++ b/thirdparty/html2ps_pdf/postscript/flow.block.ps @@ -1,96 +1,96 @@ -% $Header: /cvsroot/html2ps/postscript/flow.block.ps,v 1.1 2005/12/18 07:21:38 Konstantin Exp $ - -% Shorthand for -% $this->_current_x = $context->float_left_x($this->_current_x, $this->_current_y); -% in PHP -% -/offset-x-floats { % => Box - dup get-current-x - 1 index get-current-y % => Box X Y - float-left-x % => Box X - 1 index - put-current-x - pop -} def - -% Close line subroutine; checks if text justification -% is needed and applies it to the line-box content -/close-line-justify { % => Box - dup get-line dup length 1 gt { % => Box Line - pop - dup get-text-align % => Box AlignFunction - 1 index exch % => Box Box AlignFunction - exec % => Box - } { - dup length 0 gt { - 0 get % => Box L0 - get-local-align % => Box LA - 1 index exch % => Box Box LA - exec % => Box - } { - pop - dup get-text-align % => Box AlignFunction - 1 index exch % => Box Box AlignFunction - exec % => Box - } ifelse - } ifelse -} def - -/close-line { % => Box -% make line justification - -% Note that text-align should not be applied to the block boxes! -% As block boxes will be alone in the line-box, we can check -% if the very first box in the line is inline; if not - no justification should be made - dup get-line length 0 gt { - dup get-line 0 get is-inline { - close-line-justify - } { -% Nevertheless, CENTER tag and P/DIV with ALIGN attribute set should affect the -% position of non-inline children. - dup get-box-dict - /PseudoAlign get - 1 index exch % => Box Box PA - exec % => Box - } ifelse - } if - - - dup get-line % => Box Line - 0 exch % => Box 0(LH) Line - { % => Box LH LineElement - get-full-height - max - } forall % => Box LH - - % Clear line - [] 2 index put-line % => Box LH - % Reset X coordinate - 1 index get-left-internal % => Box LH LeftI - 2 index put-current-x % => Box LH - % Extend Y coordinate - 1 index get-current-y % => Box LH CY - exch sub % => Box CY-LH - 1 index put-current-y % => Box - - % Reset information about the line baseline - 0 1 index put-line-baseline - -% Line box completed, render the deferred floats - dup get-box-dict - /Flow get /DeferredFloats get - { - flow-float - } forall - - dup get-box-dict - /Flow get /DeferredFloats [] put - -% modify the current-x value, so that next inline box will not intersect any floating boxes - dup offset-x-floats - -% Clear the stack - pop - /no-justify {false} def -} def - +% $Header: /cvsroot/html2ps/postscript/flow.block.ps,v 1.1 2005/12/18 07:21:38 Konstantin Exp $ + +% Shorthand for +% $this->_current_x = $context->float_left_x($this->_current_x, $this->_current_y); +% in PHP +% +/offset-x-floats { % => Box + dup get-current-x + 1 index get-current-y % => Box X Y + float-left-x % => Box X + 1 index + put-current-x + pop +} def + +% Close line subroutine; checks if text justification +% is needed and applies it to the line-box content +/close-line-justify { % => Box + dup get-line dup length 1 gt { % => Box Line + pop + dup get-text-align % => Box AlignFunction + 1 index exch % => Box Box AlignFunction + exec % => Box + } { + dup length 0 gt { + 0 get % => Box L0 + get-local-align % => Box LA + 1 index exch % => Box Box LA + exec % => Box + } { + pop + dup get-text-align % => Box AlignFunction + 1 index exch % => Box Box AlignFunction + exec % => Box + } ifelse + } ifelse +} def + +/close-line { % => Box +% make line justification + +% Note that text-align should not be applied to the block boxes! +% As block boxes will be alone in the line-box, we can check +% if the very first box in the line is inline; if not - no justification should be made + dup get-line length 0 gt { + dup get-line 0 get is-inline { + close-line-justify + } { +% Nevertheless, CENTER tag and P/DIV with ALIGN attribute set should affect the +% position of non-inline children. + dup get-box-dict + /PseudoAlign get + 1 index exch % => Box Box PA + exec % => Box + } ifelse + } if + + + dup get-line % => Box Line + 0 exch % => Box 0(LH) Line + { % => Box LH LineElement + get-full-height + max + } forall % => Box LH + + % Clear line + [] 2 index put-line % => Box LH + % Reset X coordinate + 1 index get-left-internal % => Box LH LeftI + 2 index put-current-x % => Box LH + % Extend Y coordinate + 1 index get-current-y % => Box LH CY + exch sub % => Box CY-LH + 1 index put-current-y % => Box + + % Reset information about the line baseline + 0 1 index put-line-baseline + +% Line box completed, render the deferred floats + dup get-box-dict + /Flow get /DeferredFloats get + { + flow-float + } forall + + dup get-box-dict + /Flow get /DeferredFloats [] put + +% modify the current-x value, so that next inline box will not intersect any floating boxes + dup offset-x-floats + +% Clear the stack + pop + /no-justify {false} def +} def + diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/flow.box.ps b/thirdparty/html2ps_pdf/postscript/flow.box.ps similarity index 96% rename from gulliver/thirdparty/html2ps_pdf/postscript/flow.box.ps rename to thirdparty/html2ps_pdf/postscript/flow.box.ps index f3f65c677..b5aff9a69 100644 --- a/gulliver/thirdparty/html2ps_pdf/postscript/flow.box.ps +++ b/thirdparty/html2ps_pdf/postscript/flow.box.ps @@ -1,53 +1,53 @@ -% $Header: /cvsroot/html2ps/postscript/flow.box.ps,v 1.1 2005/12/18 07:21:38 Konstantin Exp $ - -/flow-box { % => Child Parent - exch % => Parent Child - -% in case we're working with floated box, -% set 'display' property to 'block' value (FIXME: make this more compatible with CSS spec. 9.7) - dup get-box-dict /Float get - /none ne { -% if line box already have content, the flow this float _after_ the line box -% otherwise flow it immediately. - 1 index get-line length 0 gt { - 1 index exch add-deferred-float - pop - } { - flow-float % => Parent -% Fix parent's current-x value -% in case this float had 'float: left' style first inline box should be shifted to the right - offset-x-floats % => - } ifelse - } { - dup get-flow-fun - exec - } ifelse -} def - -/apply-clear { % => Box Y - 1 index get-box-dict /Clear get - dup /left eq exch /both eq - or { - { - dup get-box-dict /Float get /left eq { - get-bottom min - } { - pop - } ifelse - } 1 index context-floats reduce % => Parent Child DY FY1 - min - } if - - 1 index get-box-dict /Clear get - dup /right eq exch /both eq - or { - { - dup get-box-dict /Float get /right eq { - get-bottom min - } { - pop - } ifelse - } 1 index context-floats reduce % => Parent Child DY FY1 - min - } if +% $Header: /cvsroot/html2ps/postscript/flow.box.ps,v 1.1 2005/12/18 07:21:38 Konstantin Exp $ + +/flow-box { % => Child Parent + exch % => Parent Child + +% in case we're working with floated box, +% set 'display' property to 'block' value (FIXME: make this more compatible with CSS spec. 9.7) + dup get-box-dict /Float get + /none ne { +% if line box already have content, the flow this float _after_ the line box +% otherwise flow it immediately. + 1 index get-line length 0 gt { + 1 index exch add-deferred-float + pop + } { + flow-float % => Parent +% Fix parent's current-x value +% in case this float had 'float: left' style first inline box should be shifted to the right + offset-x-floats % => + } ifelse + } { + dup get-flow-fun + exec + } ifelse +} def + +/apply-clear { % => Box Y + 1 index get-box-dict /Clear get + dup /left eq exch /both eq + or { + { + dup get-box-dict /Float get /left eq { + get-bottom min + } { + pop + } ifelse + } 1 index context-floats reduce % => Parent Child DY FY1 + min + } if + + 1 index get-box-dict /Clear get + dup /right eq exch /both eq + or { + { + dup get-box-dict /Float get /right eq { + get-bottom min + } { + pop + } ifelse + } 1 index context-floats reduce % => Parent Child DY FY1 + min + } if } def \ No newline at end of file diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/flow.float.ps b/thirdparty/html2ps_pdf/postscript/flow.float.ps similarity index 97% rename from gulliver/thirdparty/html2ps_pdf/postscript/flow.float.ps rename to thirdparty/html2ps_pdf/postscript/flow.float.ps index 58483d4bc..e75ed1629 100644 --- a/gulliver/thirdparty/html2ps_pdf/postscript/flow.float.ps +++ b/thirdparty/html2ps_pdf/postscript/flow.float.ps @@ -1,36 +1,36 @@ -% $Header: /cvsroot/html2ps/postscript/flow.float.ps,v 1.1 2005/12/18 07:21:38 Konstantin Exp $ - -/add-deferred-float { % => Parent Float - 1 index get-box-dict - /Flow get - /DeferredFloats get % => Parent Float DefFList -% see comments on array-append/array-prepend - array-prepend % => Parent DefFList' - 1 index get-box-dict - /Flow get % => Parent DefFList' FlowDict - /DeferredFloats 2 index put - pop pop -} def - -% Find the maximal X at the given Y coordinate suitable for float placement -/float-right-x { % => Parent Float W X0 - context-floats - 1 index % => Parent Float W X0 Floats X0 - 5 index get-current-y % => Parent Float W X0 Floats X0 Y0 -% The following line is a dirty hack; it is required, as due some rounding errors -% the right corner, lying on the right float box edge, is not treated by point-in-floats -% correctly - exch 0.0001 sub exch - - point-in-floats dup false ne { % => Parent Float W X0 Float - get-left 1 sub % => Parent Float W X0 X1 - exch pop % => Parent Float W X1 - float-right-x % => X - } { - pop % => Parent Float W X0 - exch pop % => Parent Float X0 - exch pop % => Parent X - exch pop % => X - } ifelse % => X -} def - +% $Header: /cvsroot/html2ps/postscript/flow.float.ps,v 1.1 2005/12/18 07:21:38 Konstantin Exp $ + +/add-deferred-float { % => Parent Float + 1 index get-box-dict + /Flow get + /DeferredFloats get % => Parent Float DefFList +% see comments on array-append/array-prepend + array-prepend % => Parent DefFList' + 1 index get-box-dict + /Flow get % => Parent DefFList' FlowDict + /DeferredFloats 2 index put + pop pop +} def + +% Find the maximal X at the given Y coordinate suitable for float placement +/float-right-x { % => Parent Float W X0 + context-floats + 1 index % => Parent Float W X0 Floats X0 + 5 index get-current-y % => Parent Float W X0 Floats X0 Y0 +% The following line is a dirty hack; it is required, as due some rounding errors +% the right corner, lying on the right float box edge, is not treated by point-in-floats +% correctly + exch 0.0001 sub exch + + point-in-floats dup false ne { % => Parent Float W X0 Float + get-left 1 sub % => Parent Float W X0 X1 + exch pop % => Parent Float W X1 + float-right-x % => X + } { + pop % => Parent Float W X0 + exch pop % => Parent Float X0 + exch pop % => Parent X + exch pop % => X + } ifelse % => X +} def + diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/flow.inline.block.ps b/thirdparty/html2ps_pdf/postscript/flow.inline.block.ps similarity index 96% rename from gulliver/thirdparty/html2ps_pdf/postscript/flow.inline.block.ps rename to thirdparty/html2ps_pdf/postscript/flow.inline.block.ps index e86f3e6a7..4bee60460 100644 --- a/gulliver/thirdparty/html2ps_pdf/postscript/flow.inline.block.ps +++ b/thirdparty/html2ps_pdf/postscript/flow.inline.block.ps @@ -1,57 +1,57 @@ -% $Header: /cvsroot/html2ps/postscript/flow.inline.block.ps,v 1.1 2005/12/18 07:21:38 Konstantin Exp $ - -/flow-inline-block { -% inline-block margins are never collapsed -% While drawing, we need position of margin edge, not border edge. - 1 index get-current-x - 2 index get-current-y % => Parent Child X Y - 2 index - move-to-box % => Parent Child - - 2 copy inline-block-calc-width - -% we're now interested in last content y, not the bottom border of the containing -% block, because, due the min-height, bottom border can contain lesser (lower on the page) -% value than current y - dup get-right - 2 index put-current-x - -% determine the baseline of inline-block box - { - get-baseline max - } - 0 - 2 index get-content - reduce -% now we have text baseline counted from the padding edge; -% add padding, margin and border size on the top size of inline-block box to -% calculate its own baseline - 1 index get-margin-top add - 1 index get-padding-top add - 1 index get-border-top-width add - - 1 index put-baseline - - dup get-vertical-align exec - -% do horizontal align -% treat inline-block content as one long line box - dup get-content { % => Parent Box ContentElement - 1 index append-line - } forall - - dup get-text-align - 1 index exch - exec - -% append current box to the parent's line box - dup 2 index append-line - - dup get-full-height - 2 index exch - extend-height % => Parent - pop - -% clear the stack - pop pop -} def +% $Header: /cvsroot/html2ps/postscript/flow.inline.block.ps,v 1.1 2005/12/18 07:21:38 Konstantin Exp $ + +/flow-inline-block { +% inline-block margins are never collapsed +% While drawing, we need position of margin edge, not border edge. + 1 index get-current-x + 2 index get-current-y % => Parent Child X Y + 2 index + move-to-box % => Parent Child + + 2 copy inline-block-calc-width + +% we're now interested in last content y, not the bottom border of the containing +% block, because, due the min-height, bottom border can contain lesser (lower on the page) +% value than current y + dup get-right + 2 index put-current-x + +% determine the baseline of inline-block box + { + get-baseline max + } + 0 + 2 index get-content + reduce +% now we have text baseline counted from the padding edge; +% add padding, margin and border size on the top size of inline-block box to +% calculate its own baseline + 1 index get-margin-top add + 1 index get-padding-top add + 1 index get-border-top-width add + + 1 index put-baseline + + dup get-vertical-align exec + +% do horizontal align +% treat inline-block content as one long line box + dup get-content { % => Parent Box ContentElement + 1 index append-line + } forall + + dup get-text-align + 1 index exch + exec + +% append current box to the parent's line box + dup 2 index append-line + + dup get-full-height + 2 index exch + extend-height % => Parent + pop + +% clear the stack + pop pop +} def diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/flow.inline.ps b/thirdparty/html2ps_pdf/postscript/flow.inline.ps similarity index 96% rename from gulliver/thirdparty/html2ps_pdf/postscript/flow.inline.ps rename to thirdparty/html2ps_pdf/postscript/flow.inline.ps index 43c9b6a39..aba80fb16 100644 --- a/gulliver/thirdparty/html2ps_pdf/postscript/flow.inline.ps +++ b/thirdparty/html2ps_pdf/postscript/flow.inline.ps @@ -1,116 +1,116 @@ -% $Header: /cvsroot/html2ps/postscript/flow.inline.ps,v 1.1 2005/12/18 07:21:38 Konstantin Exp $ - -% Check if given point is inside some alredy-layout floating box -/maybe-line-break-1 { % => Parent Child -% Check for right-floating boxes -% If upper-right corner of this inline box is inside of some float, wrap the line - context-floats % => Parent Child Floats - 1 index get-full-width - 3 index get-current-x add % => Parent Child Floats X - 3 index get-current-y % => Parent Child Floats X Y - point-in-floats % => Parent Child Float/false - false ne % => Parent Chils true/false - exch pop - exch pop -} def % => true/false - -/maybe-line-break-2 { % => Parent Child - dup get-full-width - 2 index get-current-x add % => Parent Child X - - 2 index get-right-internal - rounding-epsilon add % => Parent Child X R - - 3 index get-current-x % => Parent Child X R CX - 4 index get-left-internal % => Parent Child X R CX Left - - gt 3 1 roll gt and % => Parent Child (X>R)&&(CX>Left) - - exch pop - exch pop % => true/false -} def - -/maybe-line-break-in { % => Parent Child - 2 copy maybe-line-break-1 { - pop pop true - } { - 2 copy maybe-line-break-2 { - pop pop true - } { - pop pop false - } ifelse - } ifelse -} def - -/maybe-line-break { % => Parent Child - 2 copy maybe-line-break-in dup { % => Parent Child Break -% break is needed -% check if parent line box containg any boxes - 2 index get-line length 0 eq { - 1 index get-height - 3 index get-current-y - exch sub % => Parent Child Break CY' - 3 index put-current-y - } if % => Parent Child Break - - 2 index close-line - } if % => Parent Child Break - - exch pop - exch pop % => Break -} def - -/line-break-allowed { % => Box - dup get-box-dict /Display get - dup /-text ne - exch pop - exch pop -} def % => true/false - -/flow-inline { % => Parent Child - 1 index line-break-allowed { - { - 2 copy maybe-line-break not - { exit } if - } loop - } if - -% set default baseline - dup get-default-baseline - 1 index put-baseline - -% Determine the baseline position and height of the text-box using line-height CSS property - dup get-box-dict - /Display get - /inline-text eq { - apply-line-height - } if - - dup get-vertical-align exec - - dup 2 index append-line - - % Determine coordinates of upper-left corner - 1 index get-current-x - 2 index get-current-y % => Parent Child X Y - 2 index - move-to-box % => Parent Child - - % ??? - dup - 0 1 index get-margin-top - offset-box - - % Offset parent current X value - 1 index get-current-x % => Parent Child PCX - 1 index get-full-width % => Parent Child PCX CW - add % => Parent Child PCX+CW - 2 index put-current-x % => Parent Child - - % extend parent's height - dup get-full-height - exch pop - extend-height % => Parent - - pop -} def +% $Header: /cvsroot/html2ps/postscript/flow.inline.ps,v 1.1 2005/12/18 07:21:38 Konstantin Exp $ + +% Check if given point is inside some alredy-layout floating box +/maybe-line-break-1 { % => Parent Child +% Check for right-floating boxes +% If upper-right corner of this inline box is inside of some float, wrap the line + context-floats % => Parent Child Floats + 1 index get-full-width + 3 index get-current-x add % => Parent Child Floats X + 3 index get-current-y % => Parent Child Floats X Y + point-in-floats % => Parent Child Float/false + false ne % => Parent Chils true/false + exch pop + exch pop +} def % => true/false + +/maybe-line-break-2 { % => Parent Child + dup get-full-width + 2 index get-current-x add % => Parent Child X + + 2 index get-right-internal + rounding-epsilon add % => Parent Child X R + + 3 index get-current-x % => Parent Child X R CX + 4 index get-left-internal % => Parent Child X R CX Left + + gt 3 1 roll gt and % => Parent Child (X>R)&&(CX>Left) + + exch pop + exch pop % => true/false +} def + +/maybe-line-break-in { % => Parent Child + 2 copy maybe-line-break-1 { + pop pop true + } { + 2 copy maybe-line-break-2 { + pop pop true + } { + pop pop false + } ifelse + } ifelse +} def + +/maybe-line-break { % => Parent Child + 2 copy maybe-line-break-in dup { % => Parent Child Break +% break is needed +% check if parent line box containg any boxes + 2 index get-line length 0 eq { + 1 index get-height + 3 index get-current-y + exch sub % => Parent Child Break CY' + 3 index put-current-y + } if % => Parent Child Break + + 2 index close-line + } if % => Parent Child Break + + exch pop + exch pop % => Break +} def + +/line-break-allowed { % => Box + dup get-box-dict /Display get + dup /-text ne + exch pop + exch pop +} def % => true/false + +/flow-inline { % => Parent Child + 1 index line-break-allowed { + { + 2 copy maybe-line-break not + { exit } if + } loop + } if + +% set default baseline + dup get-default-baseline + 1 index put-baseline + +% Determine the baseline position and height of the text-box using line-height CSS property + dup get-box-dict + /Display get + /inline-text eq { + apply-line-height + } if + + dup get-vertical-align exec + + dup 2 index append-line + + % Determine coordinates of upper-left corner + 1 index get-current-x + 2 index get-current-y % => Parent Child X Y + 2 index + move-to-box % => Parent Child + + % ??? + dup + 0 1 index get-margin-top + offset-box + + % Offset parent current X value + 1 index get-current-x % => Parent Child PCX + 1 index get-full-width % => Parent Child PCX CW + add % => Parent Child PCX+CW + 2 index put-current-x % => Parent Child + + % extend parent's height + dup get-full-height + exch pop + extend-height % => Parent + + pop +} def diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/flow.legend.ps b/thirdparty/html2ps_pdf/postscript/flow.legend.ps similarity index 97% rename from gulliver/thirdparty/html2ps_pdf/postscript/flow.legend.ps rename to thirdparty/html2ps_pdf/postscript/flow.legend.ps index 3910d2334..2dd17de58 100644 --- a/gulliver/thirdparty/html2ps_pdf/postscript/flow.legend.ps +++ b/thirdparty/html2ps_pdf/postscript/flow.legend.ps @@ -1,49 +1,49 @@ -% $Header: /cvsroot/html2ps/postscript/flow.legend.ps,v 1.1 2005/12/18 07:21:38 Konstantin Exp $ - -% Flow the LEGEND-generated box -/flow-legend { % => Parent Child -% calculate size of the legend - 2 copy inline-block-calc-width - - reflow % => Parent Child - -% If legend is presend, FIELDSET margin is counted from the LEGEND top edge, -% not the actual border edge -% We need to offset the containing FIELDSET by the 1/2 of LEGEND height - dup get-full-height 2 div - 2 index get-margin-top - add % => Parent Child NewTopPaddingValue - 2 index get-margin - exch 0 exch put % => Parent Child NewPaddingArray - -% If legend is present, FIELDSET padding is counted from the LEGEND bottom edge, -% not the actual border edge - dup get-full-height 2 div % => Parent Child (PaddingOffsetValue = H/2) - 2 index get-padding-top - add % => Parent Child NewTopPaddingValue - 2 index get-padding - exch 0 exch put % => Parent Child NewPaddingArray - -% also, note that we'll need to modify current-y, as the flow is already in progress - 1 index get-top-internal - 2 index put-current-y - -% determine the position of top-left legend box corner -% X-coordinate - 1 index get-left-padded -% Y-coordinate - 2 index get-top-padded % => Parent Child X Y - - 2 index - move-to-box-force % => Parent Child - -% Do legend offset - dup % => Parent Child Child - dup get-full-height % => Parent Child Child H - 2 div % => Parent Child Child H/2 - dup - offset-box % => Parent Child - -% clear the stack - pop pop % => -} def +% $Header: /cvsroot/html2ps/postscript/flow.legend.ps,v 1.1 2005/12/18 07:21:38 Konstantin Exp $ + +% Flow the LEGEND-generated box +/flow-legend { % => Parent Child +% calculate size of the legend + 2 copy inline-block-calc-width + + reflow % => Parent Child + +% If legend is presend, FIELDSET margin is counted from the LEGEND top edge, +% not the actual border edge +% We need to offset the containing FIELDSET by the 1/2 of LEGEND height + dup get-full-height 2 div + 2 index get-margin-top + add % => Parent Child NewTopPaddingValue + 2 index get-margin + exch 0 exch put % => Parent Child NewPaddingArray + +% If legend is present, FIELDSET padding is counted from the LEGEND bottom edge, +% not the actual border edge + dup get-full-height 2 div % => Parent Child (PaddingOffsetValue = H/2) + 2 index get-padding-top + add % => Parent Child NewTopPaddingValue + 2 index get-padding + exch 0 exch put % => Parent Child NewPaddingArray + +% also, note that we'll need to modify current-y, as the flow is already in progress + 1 index get-top-internal + 2 index put-current-y + +% determine the position of top-left legend box corner +% X-coordinate + 1 index get-left-padded +% Y-coordinate + 2 index get-top-padded % => Parent Child X Y + + 2 index + move-to-box-force % => Parent Child + +% Do legend offset + dup % => Parent Child Child + dup get-full-height % => Parent Child Child H + 2 div % => Parent Child Child H/2 + dup + offset-box % => Parent Child + +% clear the stack + pop pop % => +} def diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/flow.table.ps b/thirdparty/html2ps_pdf/postscript/flow.table.ps similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/postscript/flow.table.ps rename to thirdparty/html2ps_pdf/postscript/flow.table.ps diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/flow_viewport.ps b/thirdparty/html2ps_pdf/postscript/flow_viewport.ps similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/postscript/flow_viewport.ps rename to thirdparty/html2ps_pdf/postscript/flow_viewport.ps diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/font.ps b/thirdparty/html2ps_pdf/postscript/font.ps similarity index 95% rename from gulliver/thirdparty/html2ps_pdf/postscript/font.ps rename to thirdparty/html2ps_pdf/postscript/font.ps index bcf5e4219..c5f7e090c 100644 --- a/gulliver/thirdparty/html2ps_pdf/postscript/font.ps +++ b/thirdparty/html2ps_pdf/postscript/font.ps @@ -1,71 +1,71 @@ -/findfont-enc { % => FontName Encoding - exch - findfont % => FontSize - dup length dict begin { - 1 index /FID ne { - def - } { - pop pop - } ifelse - } forall - /Encoding 1 index def - currentdict - end - - /Font-Enc exch definefont % => - exch pop -} def - -/font-ascender { % => <> - dup /FontBBox get 3 get 0 - 2 index /FontMatrix get transform - pop % => <> Ascender - %1 index font-descender sub % => <> Ascender' - exch pop -} def - -/font-descender { % => <> - dup /FontBBox get 1 get 0 - 2 index /FontMatrix get transform - pop - exch pop - neg -} def - -/font-underline-pos { % => <> - dup /FontInfo get % => <> <> -% some fonts (especially when you're using Adobe Distiller) do not contain /UnderlinePosition. - dup /UnderlinePosition known { - /UnderlinePosition get - } { - pop 2 px - } ifelse % => <> UP - - 0 exch % => <> O UP - - 3 2 roll /FontMatrix get % => <> O UP - transform % => 0 UPos - exch pop -} def - -/font-overline-pos { % => <> - dup /FontBBox get 3 get % => <> Top - 0.8 mul - - 0 exch - 2 index /FontMatrix get - transform - exch pop - exch pop -} def - -/font-line-through-pos { % => <> - dup /FontBBox get 3 get % => <> Top - 0.25 mul - - 0 exch - 2 index /FontMatrix get - transform - exch pop - exch pop +/findfont-enc { % => FontName Encoding + exch + findfont % => FontSize + dup length dict begin { + 1 index /FID ne { + def + } { + pop pop + } ifelse + } forall + /Encoding 1 index def + currentdict + end + + /Font-Enc exch definefont % => + exch pop +} def + +/font-ascender { % => <> + dup /FontBBox get 3 get 0 + 2 index /FontMatrix get transform + pop % => <> Ascender + %1 index font-descender sub % => <> Ascender' + exch pop +} def + +/font-descender { % => <> + dup /FontBBox get 1 get 0 + 2 index /FontMatrix get transform + pop + exch pop + neg +} def + +/font-underline-pos { % => <> + dup /FontInfo get % => <> <> +% some fonts (especially when you're using Adobe Distiller) do not contain /UnderlinePosition. + dup /UnderlinePosition known { + /UnderlinePosition get + } { + pop 2 px + } ifelse % => <> UP + + 0 exch % => <> O UP + + 3 2 roll /FontMatrix get % => <> O UP + transform % => 0 UPos + exch pop +} def + +/font-overline-pos { % => <> + dup /FontBBox get 3 get % => <> Top + 0.8 mul + + 0 exch + 2 index /FontMatrix get + transform + exch pop + exch pop +} def + +/font-line-through-pos { % => <> + dup /FontBBox get 3 get % => <> Top + 0.25 mul + + 0 exch + 2 index /FontMatrix get + transform + exch pop + exch pop } def \ No newline at end of file diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/footer.ps b/thirdparty/html2ps_pdf/postscript/footer.ps similarity index 96% rename from gulliver/thirdparty/html2ps_pdf/postscript/footer.ps rename to thirdparty/html2ps_pdf/postscript/footer.ps index be51b4a4e..d54f07b28 100644 --- a/gulliver/thirdparty/html2ps_pdf/postscript/footer.ps +++ b/thirdparty/html2ps_pdf/postscript/footer.ps @@ -1,154 +1,154 @@ -% $Header: /cvsroot/html2ps/postscript/footer.ps,v 1.1 2005/12/18 07:21:38 Konstantin Exp $ - -% As BODY generated box have zero calculated width at the very moment, -% and we need some box to use as a parameter to _calc_percentage_margins, -% we'll create a fake box having with equal to the viewport width. - - % => BODY - dup /pre-reflow-images - call-method % => BODY - - box-block-create % => BODY MediaBox - pagewidth - lmargin sub - rmargin sub % => BODY MediaBox PW - 1 index put-width % => BODY MediaBox - -% Calculate actual margin values - 1 index box-generic-calc-percentage-margins - % => BODY - - pagewidth - lmargin sub - rmargin sub - 1 index get-hor-extra sub - 1 index put-width % => BODY - - pageheight - tmargin sub - bmargin sub - 1 index get-vert-extra sub - 1 index put-height - - pageheight tmargin sub - 1 index get-extra-top sub - 1 index put-top - - lmargin - 1 index get-extra-left add - 1 index put-left - -% create the initial context - % => Box - context-create % => Box Context - 1 index flow-viewport-create % => Box Context Viewport - 1 index context-push-viewport % => Box Context - - - exch 1 index % => Context Box Context - /null % => Context Box Context FakeParent - 2 index /reflow call-method % => Context Box - dup /reflow-inline call-method - -% flow absolute-positioned boxes - 1 index - context-get-absolute-positioned {% => Context Box AbsoluteBox - 2 index context-push - - 2 index exch - /reflow-absolute call-method - - 1 index context-pop - } forall - -% flow fixed-positioned boxes - 1 index - context-get-fixed-positioned {% => Context Box AbsoluteBox - 2 index context-push - - 2 index exch - box-block-reflow-fixed - - 1 index context-pop - } forall - -% Make the top-level box competely fill the last page - /pages 1 index get-full-height real-page-height div ceiling 1 max def - -% Note we cannot have less than 1 page in our doc; max() call -% is required as we, in general, CAN have the content height strictly equal to 0. -% In this case wi still render the very first page - - pages real-page-height mul - 1 index get-top - pageheight tmargin sub - sub - add % => Context Box H - dup 2 index put-height % => Context Box H - 1 index get-content 0 get put-height - - dup viewport-create % => Context Box Viewport - -% generate a list of anchors - << >> % => Context Box Viewport List - dup - 2 index % => Context Box Viewport List List Viewport - 4 index % => Context Box Viewport List List Viewport Box - /reflow-anchors - call-method % => Context Box Viewport Anchors - - 1 index viewport-put-anchors % => Context Box Viewport - exch % => Context Viewport Box - 1 index /page-offset bmargin put - 1 index /height real-page-height put - - 1 1 pages { % => Context Viewport Box I - 0 0 moveto - - 2 index viewport-init-page - - gsave - 2 index viewport-setup-clip - - 2 index % => Context Viewport Box I Viewport - 2 index /show call-method % => Context Viewport Box I - -% Absolute positioned boxes should be shown after all other boxes, because -% they're placed higher in the stack-order - 3 index - context-get-absolute-positioned { - % => Context Viewport Box I AbsoluteBox - dup /visibility get-css-value /visible eq { - 3 index % => Context Viewport Box I AbsoluteBox Viewport - 1 index % => Context Viewport Box I AbsoluteBox ViewportAbsoluteBox - /show call-method % => Context Viewport Box I AbsoluteBox - } if - - pop - } forall % => Context Viewport Box I - - grestore - - 3 index - context-get-fixed-positioned { - % => Context Viewport Box I AbsoluteBox - dup /visibility get-css-value /visible eq { - 3 index % => Context Viewport Box I AbsoluteBox Viewport - 1 index % => Context Viewport Box I AbsoluteBox ViewportAbsoluteBox - box-block-show-fixed - } if - - pop - } forall % => Context Viewport Box I - - setting-draw-page-border { - 2 index viewport-draw-page-border - } if - -% Add page if currently rendered page is not last - 2 index viewport-next-page - - showpage - pop - initpage +% $Header: /cvsroot/html2ps/postscript/footer.ps,v 1.1 2005/12/18 07:21:38 Konstantin Exp $ + +% As BODY generated box have zero calculated width at the very moment, +% and we need some box to use as a parameter to _calc_percentage_margins, +% we'll create a fake box having with equal to the viewport width. + + % => BODY + dup /pre-reflow-images + call-method % => BODY + + box-block-create % => BODY MediaBox + pagewidth + lmargin sub + rmargin sub % => BODY MediaBox PW + 1 index put-width % => BODY MediaBox + +% Calculate actual margin values + 1 index box-generic-calc-percentage-margins + % => BODY + + pagewidth + lmargin sub + rmargin sub + 1 index get-hor-extra sub + 1 index put-width % => BODY + + pageheight + tmargin sub + bmargin sub + 1 index get-vert-extra sub + 1 index put-height + + pageheight tmargin sub + 1 index get-extra-top sub + 1 index put-top + + lmargin + 1 index get-extra-left add + 1 index put-left + +% create the initial context + % => Box + context-create % => Box Context + 1 index flow-viewport-create % => Box Context Viewport + 1 index context-push-viewport % => Box Context + + + exch 1 index % => Context Box Context + /null % => Context Box Context FakeParent + 2 index /reflow call-method % => Context Box + dup /reflow-inline call-method + +% flow absolute-positioned boxes + 1 index + context-get-absolute-positioned {% => Context Box AbsoluteBox + 2 index context-push + + 2 index exch + /reflow-absolute call-method + + 1 index context-pop + } forall + +% flow fixed-positioned boxes + 1 index + context-get-fixed-positioned {% => Context Box AbsoluteBox + 2 index context-push + + 2 index exch + box-block-reflow-fixed + + 1 index context-pop + } forall + +% Make the top-level box competely fill the last page + /pages 1 index get-full-height real-page-height div ceiling 1 max def + +% Note we cannot have less than 1 page in our doc; max() call +% is required as we, in general, CAN have the content height strictly equal to 0. +% In this case wi still render the very first page + + pages real-page-height mul + 1 index get-top + pageheight tmargin sub + sub + add % => Context Box H + dup 2 index put-height % => Context Box H + 1 index get-content 0 get put-height + + dup viewport-create % => Context Box Viewport + +% generate a list of anchors + << >> % => Context Box Viewport List + dup + 2 index % => Context Box Viewport List List Viewport + 4 index % => Context Box Viewport List List Viewport Box + /reflow-anchors + call-method % => Context Box Viewport Anchors + + 1 index viewport-put-anchors % => Context Box Viewport + exch % => Context Viewport Box + 1 index /page-offset bmargin put + 1 index /height real-page-height put + + 1 1 pages { % => Context Viewport Box I + 0 0 moveto + + 2 index viewport-init-page + + gsave + 2 index viewport-setup-clip + + 2 index % => Context Viewport Box I Viewport + 2 index /show call-method % => Context Viewport Box I + +% Absolute positioned boxes should be shown after all other boxes, because +% they're placed higher in the stack-order + 3 index + context-get-absolute-positioned { + % => Context Viewport Box I AbsoluteBox + dup /visibility get-css-value /visible eq { + 3 index % => Context Viewport Box I AbsoluteBox Viewport + 1 index % => Context Viewport Box I AbsoluteBox ViewportAbsoluteBox + /show call-method % => Context Viewport Box I AbsoluteBox + } if + + pop + } forall % => Context Viewport Box I + + grestore + + 3 index + context-get-fixed-positioned { + % => Context Viewport Box I AbsoluteBox + dup /visibility get-css-value /visible eq { + 3 index % => Context Viewport Box I AbsoluteBox Viewport + 1 index % => Context Viewport Box I AbsoluteBox ViewportAbsoluteBox + box-block-show-fixed + } if + + pop + } forall % => Context Viewport Box I + + setting-draw-page-border { + 2 index viewport-draw-page-border + } if + +% Add page if currently rendered page is not last + 2 index viewport-next-page + + showpage + pop + initpage } for \ No newline at end of file diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/geometry.ps b/thirdparty/html2ps_pdf/postscript/geometry.ps similarity index 98% rename from gulliver/thirdparty/html2ps_pdf/postscript/geometry.ps rename to thirdparty/html2ps_pdf/postscript/geometry.ps index 96bfb5892..c129baa51 100644 --- a/gulliver/thirdparty/html2ps_pdf/postscript/geometry.ps +++ b/thirdparty/html2ps_pdf/postscript/geometry.ps @@ -1,27 +1,27 @@ -% $Header: /cvsroot/html2ps/postscript/geometry.ps,v 1.1 2005/12/18 07:21:38 Konstantin Exp $ - -/inside-rectangle { % => X Y L T W H - 5 index 4 index sub % => X Y L T W H X-L - dup 0 gt % => X Y L T W H X-L X-L>0 - exch 3 index lt and % => X Y L T W H (X-L0) - 5 index 4 index sub neg % => X Y L T W H (X-L0) -(Y-T) - dup 0 gt % => X Y L T W H (X-L0) -(Y-T) -(Y-T)>0 - exch 3 index lt and % => X Y L T W H (X-L0) (-(Y-T)>0 & -(Y-T) X Y L T W H (X-L0) & (-(Y-T)>0 & -(Y-T) X Y L T W H - 5 index 4 index sub % => X Y L T W H X-L - dup 0 ge % => X Y L T W H X-L X-L>0 - exch 3 index le and % => X Y L T W H (X-L0) - 5 index 4 index sub neg % => X Y L T W H (X-L0) -(Y-T) - dup 0 ge % => X Y L T W H (X-L0) -(Y-T) -(Y-T)>0 - exch 3 index le and % => X Y L T W H (X-L0) (-(Y-T)>0 & -(Y-T) X Y L T W H (X-L0) & (-(Y-T)>0 & -(Y-T) X Y L T W H + 5 index 4 index sub % => X Y L T W H X-L + dup 0 gt % => X Y L T W H X-L X-L>0 + exch 3 index lt and % => X Y L T W H (X-L0) + 5 index 4 index sub neg % => X Y L T W H (X-L0) -(Y-T) + dup 0 gt % => X Y L T W H (X-L0) -(Y-T) -(Y-T)>0 + exch 3 index lt and % => X Y L T W H (X-L0) (-(Y-T)>0 & -(Y-T) X Y L T W H (X-L0) & (-(Y-T)>0 & -(Y-T) X Y L T W H + 5 index 4 index sub % => X Y L T W H X-L + dup 0 ge % => X Y L T W H X-L X-L>0 + exch 3 index le and % => X Y L T W H (X-L0) + 5 index 4 index sub neg % => X Y L T W H (X-L0) -(Y-T) + dup 0 ge % => X Y L T W H (X-L0) -(Y-T) -(Y-T)>0 + exch 3 index le and % => X Y L T W H (X-L0) (-(Y-T)>0 & -(Y-T) X Y L T W H (X-L0) & (-(Y-T)>0 & -(Y-T) Array - dup sum - 1 exch div - map-scale -} def - -/map-scale { % => Array Scale - /mul cvx - /exch cvx - /array-append - cvx % => Array Scale mul exch array-prepend - 4 array astore - cvx % => Array {Scale mul array-prepend} - [] % => Array {Scale mul array-prepend} [] - 3 2 roll % => {Scale mul array-prepend} [] Array - reduce -} def - -/reduce-max { - {max} 0 % => Array {max} 0 - 3 2 roll % => {max} 0 Array - reduce % => Max -} def - -/in-zip-with { % => Data A B Fun - 1 index length 0 gt { - 2 index 0 get % => Data A B Fun A0 - 2 index 0 get % => Data A B Fun A0 B0 - 2 index exec % => Data A B Fun (A0 Fun B0) - 5 2 roll array-pop-first % => Fun (A0 Fun B0) Data A B' - 5 1 roll array-pop-first % => B' Fun (A0 Fun B0) Data A' - 5 1 roll array-prepend % => A' B' Fun Data' - 4 1 roll % => Data' A' B' Fun - in-zip-with - } { - pop pop pop - } ifelse -} def -/zip-with { % => A B Fun - [] 4 1 roll % => [] A B Fun - in-zip-with -} def - -/font-underline-thick { % => <> - dup /FontInfo get -% some fonts (especially when you're using Adobe Distiller) do not contain /UnderlinePosition. - dup /UnderlineThickness known { - /UnderlineThickness get - } { - pop 1 px - } ifelse % => <> UT - - exch /FontMatrix get - transform - exch pop % => UT -} def - -% Table helpers -/in-array-extend { % => Left Value Array - 2 index 0 gt { - 2 copy % => Left Value Array Value Array - array-prepend % => Left Value Array Array' - exch pop % => Left Value Array' - 3 2 roll % => Value Array' Left - 1 sub % => Value Array' Left-1 - 3 1 roll % => Left Value Array' - in-array-extend % => Array' - } { - 3 1 roll % => Array Left Value - pop pop % => Array - } ifelse -} def - -/array-extend { % => Array Size DefValue - 2 index length % => Array Size DefValue ALen - 2 index exch sub % => Array Size DefValue Size-ALen - 1 index % => Array Size DefValue Size-ALen DefValue - 4 index % => Array Size DefValue Size-ALen DefValue Array - in-array-extend % => Array Size DefValue Array' - 4 1 roll % => Array' Array Size DefValue - pop pop pop % => Array' -} def - -% height constraint priority -/hc-lt { % => C1 C2 - 1 index - array-last - /wc-none cvx eq { - pop pop true - } { - 1 index array-last - /hc-constant cvx eq { - dup array-last - /wc-none cvx ne - exch pop - exch pop - } { - dup array-last - /wc-fraction cvx eq - exch pop - exch pop - } ifelse - } ifelse -} def - -% priority: percentage, absolute, no-constraint -/row-get-height-constraint { % => Row - { % => - get-height-constraint - exch - array-append - } - [] - 2 index - reduce - exch pop % => CellHCs - - { - 2 copy - hc-lt { - exch pop - } { - pop - } ifelse - } - {wc-none} - 2 index - reduce - exch pop % => HCWithMostPriority -} def -/table-get-colspans { % => Table - get-content % => Content - 3 get % => Colspans -} def -/table-get-rowspans { % => Table - get-content % => Content - 4 get % => Rowspans -} def -/table-put-colspans { % => Colspans Table - get-content % => Colspans Content - 3 % => Colspans Content 3 - 3 2 roll % => Content 3 Colspans - put % => -} def -/table-put-rowspans { % => Rowspans Table - get-content % => Colspans Content - 4 % => Colspans Content 3 - 3 2 roll % => Content 3 Rowspans - put % => -} def -/table-add-colspan { % => SpanSize CurRow CurColumn Table - 4 1 roll % => Table SpanSize CurRow CurColumn - 3 array astore % => Table NewSpan - 1 index % => Table NewSpan Table - table-get-colspans % => Table NewSpan Colspans - array-append % => Table Colspans' - exch - table-put-colspans % => -} def -/table-add-rowspan { % => SpanSize CurRow CurColumn Table - 4 1 roll % => Table SpanSize CurRow CurColumn - 3 array astore % => Table NewSpan - 1 index % => Table NewSpan Table - table-get-rowspans % => Table NewSpan Colspans - -% determine index to place new rowspan to - { % => ... [CColumn Index] [Sz Row Col] - 1 index 0 get % => ... [CColumn Index] [Sz Row Col] CColumn - 1 index 2 get % => ... [CColumn Index] [Sz Row Col] CColumn Col - ge { - pop - dup 1 get % => ... [CColumn Index] Index - 1 add - 1 index exch - 1 exch put % => ... [CColumn Index+1] - } { - pop % => ... [CColumn Index] - } ifelse - } - 2 index 2 get - 0 - 2 array astore % => Table NewSpan Colspans [CColumn 0] - 2 index - - reduce % => Table NewSpan Colspans [CColumn Index] - - 1 get % => Table NewSpan Colspans Index - 3 1 roll % => Table Index NewSpan Rowspans - array-insert % => Table Rowspans' - - exch - table-put-rowspans % => -} def -/replicate-row { % => Length Length - dup 0 gt { -% make 'fake' cells to pad table row to the desired length - box-block-create - % => Length Length [] - 3 1 roll % => [] Length Length - 1 sub % => [] Length Length-1 - replicate-row - } if -} def -/render-background-image-transparent { - 2 index /Mask get % => Box ImageDict W H Mask - 3 index /Samples get % => Box ImageDict W H Mask Samples - - 4 index /XRepeat known - { - 5 index get-width-padded % => Box ImageDict W H Mask Sample WP - 4 index px div ceiling cvi % => Box ImageDict W H Mask Sample HRepeats - } { - 1 - } ifelse % => Box ImageDict W H Mask Sample HRepeats - - 5 index /YRepeat known - { - 6 index get-height-padded % => Box ImageDict W H Mask Sample HRepeats HP - 4 index px div ceiling cvi % => Box ImageDict W H Mask Sample HRepeats VRepeats - } { - 1 - } ifelse % => Box ImageDict W H Mask Sample HRepeats VRepeats - - { % => Box ImageDict W H Mask Samples HRepeats - currentpoint % => Box ImageDict W H Mask Samples HRepeats X Y - exch pop % => Box ImageDict W H Mask Samples HRepeats Y - 7 index get-left-padded % => Box ImageDict W H Mask Samples HRepeats Y X - exch moveto % => Box ImageDict W H Mask Samples HRepeats - - 0 4 index px neg rmoveto - dup - { % => Box ImageDict W H Mask Samples HRepeats - 5 1 roll % => Box ImageDict HRepeats W H Mask Samples - 4 copy % => Box ImageDict HRepeats W H Mask Samples W H Mask Samples - 4 2 roll % => Box ImageDict HRepeats W H Mask Samples Mask Samples W H - 2 copy % => Box ImageDict HRepeats W H Mask Samples Mask Samples W H W H - 6 2 roll px 6 1 roll px - 6 1 roll % => Box Image Dict HRepeats W H Mask Samples W H W H Mask Samples - 11 index /Init get - show-transparent-image % => Box Image Dict HRepeats W H Mask Samples - 5 4 roll % => Box Image Dict W H Mask Samples HRepeats - - 4 index px 0 rmoveto - } repeat - } repeat - - pop pop pop pop pop pop -} def -/render-background-image { - 2 index /Samples get % => Box ImageDict W H Samples - - 3 index /XRepeat known - { - 4 index get-width-padded % => Box ImageDict W H Sample WP - 3 index px div ceiling cvi % => Box ImageDict W H Sample HRepeats - } { - 1 - } ifelse % => Box ImageDict W H Sample HRepeats - - 4 index /YRepeat known - { - 5 index get-height-padded % => Box ImageDict W H Sample HRepeats HP - 3 index px div ceiling cvi % => Box ImageDict W H Sample HRepeats VRepeats - } { - 1 - } ifelse % => Box ImageDict W H Sample HRepeats VRepeats - - { % => Box ImageDict W H Samples HRepeats - currentpoint % => Box ImageDict W H Samples HRepeats X Y - exch pop % => Box ImageDict W H Samples HRepeats Y - 6 index get-left-padded % => Box ImageDict W H Samples HRepeats Y X - exch moveto % => Box ImageDict W H Samples HRepeats - - 0 3 index px neg rmoveto - dup - { % => Box ImageDict W H Samples HRepeats - 4 1 roll % => Box ImageDict HRepeats W H Samples - 3 copy % => Box ImageDict HRepeats W H Samples W H Samples - 3 1 roll % => Box ImageDict HRepeats W H Samples Samples W H - 2 copy % => Box ImageDict HRepeats W H Samples Samples W H W H - 5 2 roll px 5 1 roll px - 5 1 roll % => Box Image Dict HRepeats W H Samples W H W H Samples - 9 index /Init get - show-image % => Box Image Dict HRepeats W H Samples - 4 3 roll % => Box Image Dict W H Samples HRepeats - - 3 index px 0 rmoveto - } repeat - } repeat - - pop pop pop pop pop -} def - -% Show absolute positioned boxes layer -/show-box-absolute { - dup is-static not { - show-box-force - } if -} def - -% Displaying data - -/show-text { % => Text FontSize FontName - findfont - exch % => Text FontSize - - scalefont % => Text - setfont % => Text - show % => -} def - -/in-add-table-row { % => Box - dup get-content % => Box [Cols Rows Content](RawContent) - dup 1 get 1 add % => Box [Cols Rows Content](RawContent) Rows+1 - 1 index exch - 1 exch put % => Box [Cols Rows+1 Content](RawContent) - dup 2 get % => Box [Cols Rows+1 Content](RawContent) Content - aload length % => Box [Cols Rows+1 Content](RawContent) Row1 .. RowN N - 1 add % => Box [Cols Rows+1 Content](RawContent) Row1 .. RowN N+1 - [] % => Box [Cols Rows+1 Content](RawContent) Row1 .. RowN N+1 [] - exch % => Box [Cols Rows+1 Content](RawContent) Row1 .. RowN [] N+1 - array astore % => Box [Cols Rows+1 Content](RawContent) NewContent - 2 exch put -} def - -/add-table-row { % => Box - dup is-table { - in-add-table-row - } if -} def - -% BOX getters -/get-real-height { 1 get } def -/get-parent-height-fraction { % => Box Fraction - 1 index get-box-dict - /Parent known { - 1 index get-box-dict /Parent get - get-height - mul - exch pop - } { -% if it is the top-level box, just return its own height - pop get-height - } ifelse -} def -/get-max-height { - dup get-box-dict % => Box HB - /Height get - dup /MaxPercentage get { - /Max get - 1 index exch - get-parent-height-fraction - } { - /Max get - } ifelse - - exch pop -} def - -% Compatibility with old code function; -% generates old-fashined height-constraint function using min-height data -/get-color { get-color-array aload pop } def -/get-background-color { get-background aload pop } def - -% BOX setters -/put-td-dict { exch 26 exch put } def -/put-vertical-align { exch 25 exch put } def -/put-local-align { exch 24 exch put } def -%/put-valign { exch 22 exch put } def -/put-z-index { exch 21 exch put } def -/put-background-image-transparent { - % => [W H Mask Samples Init] Box - get-background-image % => [W H Mask Samples Init] Dict - dup /W 3 index 0 get put % => [W H Mask Samples Init] Dict(W) - dup /H 3 index 1 get put % => [W H Mask Samples Init] Dict(W H) - dup /Mask 3 index 2 get put % => [W H Mask Samples Init] Dict(W H Mask) - dup /Samples 3 index 3 get put % => [W H Mask Samples Init] Dict(W H Mask Samples) - dup /Init 3 index 4 get put - pop pop -} def -/put-background-image { % => [W H Samples Init] Box - get-background-image % => [W H Samples Init] Dict - dup /W 3 index 0 get put % => [W H Samples Init] Dict(W) - dup /H 3 index 1 get put % => [W H Samples Init] Dict(W H) - dup /Samples 3 index 2 get put % => [W H Samples Init] Dict(W H Samples) - dup /Init 3 index 3 get put - pop pop -} def -/put-position { exch 18 exch put } def -/put-color-array { exch 14 exch put } def -/put-text-align { exch 13 exch put } def -/put-background { exch 12 exch put } def -/put-display { exch 8 exch put } def -/put-color { 4 1 roll 3 array astore exch put-color-array } def -/put-background-color { 4 1 roll 3 array astore exch put-background } def -/put-full-width-force { % => Width Element - dup get-hor-extra % => Width Element Padding+Margin+Border - 3 2 roll % => Element Padding+Margin+Border Width - exch sub % => Element Width - exch % => Width Element - put-width -} def -/put-full-height { % => Height Element - dup get-vert-extra % => Height Element Padding+Margin+Border - 3 2 roll % => Element Padding+Margin+Border Height - exch sub % => Element Height' - - exch % => Height'' Element - put-height -} def -/in-get-table-content { % => Data Content Rows - dup 0 gt { - 2 copy % => Data Content Rows Content Rows - 1 sub get % => Data Content Rows Row - aload length % => Data Content Rows Cell1 .. CellN N - dup 3 add % => Data Content Rows Cell1 .. CellN N N+4 - index % => Data Content Rows Cell1 .. CellN N Data - aload length % => Data Content Rows Cell1 .. CellN N Data1 .. DataM M - dup 2 add % => Data Content Rows Cell1 .. CellN N Data1 .. DataM M M+2 - dup 1 sub % => Data Content Rows Cell1 .. CellN N Data1 .. DataM M M+2 M+1 - roll % => Data Content Rows Cell1 .. CellN Data1 .. DataM M N - add % => Data Content Rows Cell1 .. CellN Data1 .. DataM M+N - array astore % => Data Content Rows NewData - 4 3 roll pop % => Content Rows NewData - 3 1 roll % => NewData Content Rows - 1 sub - in-get-table-content - } { - pop pop - } ifelse -} def -/get-table-content { % => Box - dup - get-table-content-rows % => Box Content - 1 index get-content % => Box Content RawContent - 1 get % => Box Content Rows - [] % => Box Content Rows [] - 4 3 roll pop % => Content Rows [] - 3 1 roll % => [] Content Rows - in-get-table-content -} def -/get-table-content-rows { % => Box - get-content % => RawContent - 2 get % => Content -} def -/get-table-content-column { % => Box ColumnNo - exch get-content % => ColumnNo Content - dup 1 get exch % => ColumnNo RowsNum Content - 2 get % => ColumnNo RowsNum Rows - { % => ColumnNo RowsNum Row - 2 index get % => ColumnNo RowsNum Cell - 3 1 roll % => Cell ColumnNo RowsNum - } forall % => Cell1 .. CellN ColumnNo N - exch pop % => Cell1 .. CellN N - array astore % => Column -} def -/get-table-content-columns { % => Box - dup get-content % => Box [Cols Rows Content] - 0 get 1 sub % => Box Cols-1 - [] % => Box Cols [] - in-get-table-content-columns % => ColsList -} def -/in-get-table-content-columns { % => Box ColsIndex ColsList - 1 index 0 ge { - 3 1 roll % => ColsList Box ColsIndex - 2 copy % => ColsList Box ColsIndex Box ColsIndex - get-table-content-column % => ColsList Box ColsIndex Column - 4 1 roll % => Column ColsList Box ColsIndex - 1 sub % => Column ColsList Box ColsIndex-1 - 4 2 roll % => Box ColsIndex-1 Column ColsList - array-append % => Box ColsIndex-1 ColsList' - in-get-table-content-columns - } { - 3 1 roll - pop pop - } ifelse -} def -/table-get-cell-content { % => R C Box -% One based idices are passed - get-table-content-rows % => R C Rows - 2 index 1 sub get % => R C Row - 1 index 1 sub get % => R C Cell - 3 1 roll pop pop % => Cell -} def - -/rmove-current-point { % => Box DX DY - 2 index get-current-y add % => Box DX DY' - 2 index put-current-y % => Box' DX - 1 index get-current-x add % => Box' DX' - 1 index put-current-x % => Box'' -} def -/safe-div { % => A B - dup 0 % => A B B 0 - eq { % => A B - pop 1 % => A 1 - } if - div -} def -/find-best-column { % => Width MinWidths MaxWidths - dup sum % => Width MinWidths MaxWidths MaxWidth - 3 index % => Width MinWidths MaxWidths MaxWidth Width - exch safe-div % => Width MinWidths MaxWidths Width/MaxWidth(WK) - - 3 1 roll % => Width WK MinWidths MaxWidths - 2 copy {safe-div} zip-with % => Width WK MinWidths MaxWidths [MinI/MaxI] - dup reduce-max % => Width WK MinWidths MaxWidths [MinI/MaxI] MAX[MinI/MaxI] - 4 index gt { % => Width WK MinWidths MaxWidths [MinI/MaxI] - dup reduce-max % => Width WK MinWidths MaxWidths [MinI/MaxI] MaxKoeff - array-find % => Width WK MinWidths MaxWidths MaxKoeffIndex - 2 index 1 index get % => Width WK MinWidths MaxWidths MaxKoeffIndex SW - 6 2 roll % => MaxKoeffIndex SW Width WK MinWidths MaxWidths - pop pop pop pop % => MaxKoeffIndex SW - } { % => Width WK MinWidths MaxWidths [MinI/MaxI] - pop % => Width WK MinWidths MaxWidths - 3 2 roll % => Width MinWidths MaxWidths WK - - 1 index 0 get mul % => Width MinWidths MaxWidths W*WidthKoeff - 2 index 0 get % => Width MinWidths MaxWidths W*WidthKoeff MinW - max % => Width MinWidths MaxWidths SelectedWidth - 0 exch % => Width MinWidths MaxWidths 0 SelectedWidth - 5 2 roll % => 0 SelectedWidth Width MinWidths MaxWidths - pop pop pop - } ifelse -} def -/is-fraction { % => WC - aload % => X ... X WC - 1 index /wc-fraction eq - 2 index /hc-fraction eq or { - astore pop true - } { - astore pop false - } ifelse -} def -/array-reverse { - { - exch array-prepend - } [] 2 index reduce - exch pop -} def -/table-normalize-cwc { % => Box - /temp-table-normalize-cwc 1 def - - { % => ... CVal Val - dup is-fraction { % => ... CVal Val - aload pop pop % => ... CVal Fraction - temp-table-normalize-cwc - min % => ... CVal Fraction' - temp-table-normalize-cwc - 1 index sub % => ... CVal Fraction' Rest - /temp-table-normalize-cwc - exch def % => ... CVal Fraction' - /wc-fraction cvx - 2 array astore cvx % => ... CVal WC' - } if - exch array-prepend % => ... CVal - } [] 2 index table-get-cwc array-reverse - - reduce % => Box CWC' - - exch pop -} def - -/calc-text-indent { % => Box - dup get-box-dict - /Text-Indent get - dup /Relative get { % => Box TIDict - /Value get - 1 index get-width - mul - } { - /Value get - } ifelse % => Box Indent - -% add special offset (for example, if we have marker box with position: inside) - 1 index get-box-dict - /AdditionalTextIndent get - add - - exch pop -} def - -/flow-page-break { % => Parent Child - 1 index get-current-x - 2 index get-current-y % => Parent Child X Y - - 2 index - move-to-box % => Parent Child - - 1 index get-width % => Parent Child PW - 1 index put-full-width % => Parent Child - -% Setup height for the "fake" box - 1 index get-current-y % => Parent Child PCY - - bmargin sub - real-page-height sub neg - real-page-height div - ceiling % => Parent Child Pages - real-page-height mul - neg % => Parent Child EndOfLastPage0 - real-page-height add % => Parent Child EndOfLastPage - - 2 index get-current-y - bmargin sub - exch sub - 1 index put-height - -% we're now interested in last content y, not the bottom border of the containing -% block, because, due the min-height, bottom border can contain lesser (lower on the page) -% value than current y -% 1 index get-bottom-internal - dup get-height - 2 index exch % => Parent Child Parent CH - extend-height pop % => Parent Child - - dup get-top - 1 index get-height - sub - - 2 index - put-current-y - pop - - dup get-right-internal - 1 index put-current-x - - dup close-line - - pop +%!PS +% $Header: /cvsroot/html2ps/postscript/header.ps,v 1.1 2005/12/18 07:21:38 Konstantin Exp $ +/DeviceRGB setcolorspace +/cm {28.34 mul} def +/mm {2.834 mul} def + +/rounding-epsilon 0.001 def + +/default-font /Times-Roman findfont def + +% User settings +##PAGE## +##PT## +##PS2PDF## +##TRANSPARENCY## +##IMAGEQUALITY## +/setting-debug-box ##DEBUGBOX## def +/setting-draw-page-border ##PAGEBORDER## def +/real-page-height { pageheight tmargin sub bmargin sub } def +/real-page-width { pagewidth lmargin sub rmargin sub } def + +% We need to call init page now, unless PS2PDF will incorrecly determine th orientation of the very first PDF page +initpage + +% MAX and MIN functions are build-ins in ghostscript; +% Adobe distiller (and, well, most other PS interpreters) will require +% the definition of MIN and MAX +currentdict /max known not { + /max { 2 copy lt { exch } if pop } def +} if + +currentdict /min known not { + /min { 2 copy gt { exch } if pop } def +} if + +/normalize { % => Array + dup sum + 1 exch div + map-scale +} def + +/map-scale { % => Array Scale + /mul cvx + /exch cvx + /array-append + cvx % => Array Scale mul exch array-prepend + 4 array astore + cvx % => Array {Scale mul array-prepend} + [] % => Array {Scale mul array-prepend} [] + 3 2 roll % => {Scale mul array-prepend} [] Array + reduce +} def + +/reduce-max { + {max} 0 % => Array {max} 0 + 3 2 roll % => {max} 0 Array + reduce % => Max +} def + +/in-zip-with { % => Data A B Fun + 1 index length 0 gt { + 2 index 0 get % => Data A B Fun A0 + 2 index 0 get % => Data A B Fun A0 B0 + 2 index exec % => Data A B Fun (A0 Fun B0) + 5 2 roll array-pop-first % => Fun (A0 Fun B0) Data A B' + 5 1 roll array-pop-first % => B' Fun (A0 Fun B0) Data A' + 5 1 roll array-prepend % => A' B' Fun Data' + 4 1 roll % => Data' A' B' Fun + in-zip-with + } { + pop pop pop + } ifelse +} def +/zip-with { % => A B Fun + [] 4 1 roll % => [] A B Fun + in-zip-with +} def + +/font-underline-thick { % => <> + dup /FontInfo get +% some fonts (especially when you're using Adobe Distiller) do not contain /UnderlinePosition. + dup /UnderlineThickness known { + /UnderlineThickness get + } { + pop 1 px + } ifelse % => <> UT + + exch /FontMatrix get + transform + exch pop % => UT +} def + +% Table helpers +/in-array-extend { % => Left Value Array + 2 index 0 gt { + 2 copy % => Left Value Array Value Array + array-prepend % => Left Value Array Array' + exch pop % => Left Value Array' + 3 2 roll % => Value Array' Left + 1 sub % => Value Array' Left-1 + 3 1 roll % => Left Value Array' + in-array-extend % => Array' + } { + 3 1 roll % => Array Left Value + pop pop % => Array + } ifelse +} def + +/array-extend { % => Array Size DefValue + 2 index length % => Array Size DefValue ALen + 2 index exch sub % => Array Size DefValue Size-ALen + 1 index % => Array Size DefValue Size-ALen DefValue + 4 index % => Array Size DefValue Size-ALen DefValue Array + in-array-extend % => Array Size DefValue Array' + 4 1 roll % => Array' Array Size DefValue + pop pop pop % => Array' +} def + +% height constraint priority +/hc-lt { % => C1 C2 + 1 index + array-last + /wc-none cvx eq { + pop pop true + } { + 1 index array-last + /hc-constant cvx eq { + dup array-last + /wc-none cvx ne + exch pop + exch pop + } { + dup array-last + /wc-fraction cvx eq + exch pop + exch pop + } ifelse + } ifelse +} def + +% priority: percentage, absolute, no-constraint +/row-get-height-constraint { % => Row + { % => + get-height-constraint + exch + array-append + } + [] + 2 index + reduce + exch pop % => CellHCs + + { + 2 copy + hc-lt { + exch pop + } { + pop + } ifelse + } + {wc-none} + 2 index + reduce + exch pop % => HCWithMostPriority +} def +/table-get-colspans { % => Table + get-content % => Content + 3 get % => Colspans +} def +/table-get-rowspans { % => Table + get-content % => Content + 4 get % => Rowspans +} def +/table-put-colspans { % => Colspans Table + get-content % => Colspans Content + 3 % => Colspans Content 3 + 3 2 roll % => Content 3 Colspans + put % => +} def +/table-put-rowspans { % => Rowspans Table + get-content % => Colspans Content + 4 % => Colspans Content 3 + 3 2 roll % => Content 3 Rowspans + put % => +} def +/table-add-colspan { % => SpanSize CurRow CurColumn Table + 4 1 roll % => Table SpanSize CurRow CurColumn + 3 array astore % => Table NewSpan + 1 index % => Table NewSpan Table + table-get-colspans % => Table NewSpan Colspans + array-append % => Table Colspans' + exch + table-put-colspans % => +} def +/table-add-rowspan { % => SpanSize CurRow CurColumn Table + 4 1 roll % => Table SpanSize CurRow CurColumn + 3 array astore % => Table NewSpan + 1 index % => Table NewSpan Table + table-get-rowspans % => Table NewSpan Colspans + +% determine index to place new rowspan to + { % => ... [CColumn Index] [Sz Row Col] + 1 index 0 get % => ... [CColumn Index] [Sz Row Col] CColumn + 1 index 2 get % => ... [CColumn Index] [Sz Row Col] CColumn Col + ge { + pop + dup 1 get % => ... [CColumn Index] Index + 1 add + 1 index exch + 1 exch put % => ... [CColumn Index+1] + } { + pop % => ... [CColumn Index] + } ifelse + } + 2 index 2 get + 0 + 2 array astore % => Table NewSpan Colspans [CColumn 0] + 2 index + + reduce % => Table NewSpan Colspans [CColumn Index] + + 1 get % => Table NewSpan Colspans Index + 3 1 roll % => Table Index NewSpan Rowspans + array-insert % => Table Rowspans' + + exch + table-put-rowspans % => +} def +/replicate-row { % => Length Length + dup 0 gt { +% make 'fake' cells to pad table row to the desired length + box-block-create + % => Length Length [] + 3 1 roll % => [] Length Length + 1 sub % => [] Length Length-1 + replicate-row + } if +} def +/render-background-image-transparent { + 2 index /Mask get % => Box ImageDict W H Mask + 3 index /Samples get % => Box ImageDict W H Mask Samples + + 4 index /XRepeat known + { + 5 index get-width-padded % => Box ImageDict W H Mask Sample WP + 4 index px div ceiling cvi % => Box ImageDict W H Mask Sample HRepeats + } { + 1 + } ifelse % => Box ImageDict W H Mask Sample HRepeats + + 5 index /YRepeat known + { + 6 index get-height-padded % => Box ImageDict W H Mask Sample HRepeats HP + 4 index px div ceiling cvi % => Box ImageDict W H Mask Sample HRepeats VRepeats + } { + 1 + } ifelse % => Box ImageDict W H Mask Sample HRepeats VRepeats + + { % => Box ImageDict W H Mask Samples HRepeats + currentpoint % => Box ImageDict W H Mask Samples HRepeats X Y + exch pop % => Box ImageDict W H Mask Samples HRepeats Y + 7 index get-left-padded % => Box ImageDict W H Mask Samples HRepeats Y X + exch moveto % => Box ImageDict W H Mask Samples HRepeats + + 0 4 index px neg rmoveto + dup + { % => Box ImageDict W H Mask Samples HRepeats + 5 1 roll % => Box ImageDict HRepeats W H Mask Samples + 4 copy % => Box ImageDict HRepeats W H Mask Samples W H Mask Samples + 4 2 roll % => Box ImageDict HRepeats W H Mask Samples Mask Samples W H + 2 copy % => Box ImageDict HRepeats W H Mask Samples Mask Samples W H W H + 6 2 roll px 6 1 roll px + 6 1 roll % => Box Image Dict HRepeats W H Mask Samples W H W H Mask Samples + 11 index /Init get + show-transparent-image % => Box Image Dict HRepeats W H Mask Samples + 5 4 roll % => Box Image Dict W H Mask Samples HRepeats + + 4 index px 0 rmoveto + } repeat + } repeat + + pop pop pop pop pop pop +} def +/render-background-image { + 2 index /Samples get % => Box ImageDict W H Samples + + 3 index /XRepeat known + { + 4 index get-width-padded % => Box ImageDict W H Sample WP + 3 index px div ceiling cvi % => Box ImageDict W H Sample HRepeats + } { + 1 + } ifelse % => Box ImageDict W H Sample HRepeats + + 4 index /YRepeat known + { + 5 index get-height-padded % => Box ImageDict W H Sample HRepeats HP + 3 index px div ceiling cvi % => Box ImageDict W H Sample HRepeats VRepeats + } { + 1 + } ifelse % => Box ImageDict W H Sample HRepeats VRepeats + + { % => Box ImageDict W H Samples HRepeats + currentpoint % => Box ImageDict W H Samples HRepeats X Y + exch pop % => Box ImageDict W H Samples HRepeats Y + 6 index get-left-padded % => Box ImageDict W H Samples HRepeats Y X + exch moveto % => Box ImageDict W H Samples HRepeats + + 0 3 index px neg rmoveto + dup + { % => Box ImageDict W H Samples HRepeats + 4 1 roll % => Box ImageDict HRepeats W H Samples + 3 copy % => Box ImageDict HRepeats W H Samples W H Samples + 3 1 roll % => Box ImageDict HRepeats W H Samples Samples W H + 2 copy % => Box ImageDict HRepeats W H Samples Samples W H W H + 5 2 roll px 5 1 roll px + 5 1 roll % => Box Image Dict HRepeats W H Samples W H W H Samples + 9 index /Init get + show-image % => Box Image Dict HRepeats W H Samples + 4 3 roll % => Box Image Dict W H Samples HRepeats + + 3 index px 0 rmoveto + } repeat + } repeat + + pop pop pop pop pop +} def + +% Show absolute positioned boxes layer +/show-box-absolute { + dup is-static not { + show-box-force + } if +} def + +% Displaying data + +/show-text { % => Text FontSize FontName + findfont + exch % => Text FontSize + + scalefont % => Text + setfont % => Text + show % => +} def + +/in-add-table-row { % => Box + dup get-content % => Box [Cols Rows Content](RawContent) + dup 1 get 1 add % => Box [Cols Rows Content](RawContent) Rows+1 + 1 index exch + 1 exch put % => Box [Cols Rows+1 Content](RawContent) + dup 2 get % => Box [Cols Rows+1 Content](RawContent) Content + aload length % => Box [Cols Rows+1 Content](RawContent) Row1 .. RowN N + 1 add % => Box [Cols Rows+1 Content](RawContent) Row1 .. RowN N+1 + [] % => Box [Cols Rows+1 Content](RawContent) Row1 .. RowN N+1 [] + exch % => Box [Cols Rows+1 Content](RawContent) Row1 .. RowN [] N+1 + array astore % => Box [Cols Rows+1 Content](RawContent) NewContent + 2 exch put +} def + +/add-table-row { % => Box + dup is-table { + in-add-table-row + } if +} def + +% BOX getters +/get-real-height { 1 get } def +/get-parent-height-fraction { % => Box Fraction + 1 index get-box-dict + /Parent known { + 1 index get-box-dict /Parent get + get-height + mul + exch pop + } { +% if it is the top-level box, just return its own height + pop get-height + } ifelse +} def +/get-max-height { + dup get-box-dict % => Box HB + /Height get + dup /MaxPercentage get { + /Max get + 1 index exch + get-parent-height-fraction + } { + /Max get + } ifelse + + exch pop +} def + +% Compatibility with old code function; +% generates old-fashined height-constraint function using min-height data +/get-color { get-color-array aload pop } def +/get-background-color { get-background aload pop } def + +% BOX setters +/put-td-dict { exch 26 exch put } def +/put-vertical-align { exch 25 exch put } def +/put-local-align { exch 24 exch put } def +%/put-valign { exch 22 exch put } def +/put-z-index { exch 21 exch put } def +/put-background-image-transparent { + % => [W H Mask Samples Init] Box + get-background-image % => [W H Mask Samples Init] Dict + dup /W 3 index 0 get put % => [W H Mask Samples Init] Dict(W) + dup /H 3 index 1 get put % => [W H Mask Samples Init] Dict(W H) + dup /Mask 3 index 2 get put % => [W H Mask Samples Init] Dict(W H Mask) + dup /Samples 3 index 3 get put % => [W H Mask Samples Init] Dict(W H Mask Samples) + dup /Init 3 index 4 get put + pop pop +} def +/put-background-image { % => [W H Samples Init] Box + get-background-image % => [W H Samples Init] Dict + dup /W 3 index 0 get put % => [W H Samples Init] Dict(W) + dup /H 3 index 1 get put % => [W H Samples Init] Dict(W H) + dup /Samples 3 index 2 get put % => [W H Samples Init] Dict(W H Samples) + dup /Init 3 index 3 get put + pop pop +} def +/put-position { exch 18 exch put } def +/put-color-array { exch 14 exch put } def +/put-text-align { exch 13 exch put } def +/put-background { exch 12 exch put } def +/put-display { exch 8 exch put } def +/put-color { 4 1 roll 3 array astore exch put-color-array } def +/put-background-color { 4 1 roll 3 array astore exch put-background } def +/put-full-width-force { % => Width Element + dup get-hor-extra % => Width Element Padding+Margin+Border + 3 2 roll % => Element Padding+Margin+Border Width + exch sub % => Element Width + exch % => Width Element + put-width +} def +/put-full-height { % => Height Element + dup get-vert-extra % => Height Element Padding+Margin+Border + 3 2 roll % => Element Padding+Margin+Border Height + exch sub % => Element Height' + + exch % => Height'' Element + put-height +} def +/in-get-table-content { % => Data Content Rows + dup 0 gt { + 2 copy % => Data Content Rows Content Rows + 1 sub get % => Data Content Rows Row + aload length % => Data Content Rows Cell1 .. CellN N + dup 3 add % => Data Content Rows Cell1 .. CellN N N+4 + index % => Data Content Rows Cell1 .. CellN N Data + aload length % => Data Content Rows Cell1 .. CellN N Data1 .. DataM M + dup 2 add % => Data Content Rows Cell1 .. CellN N Data1 .. DataM M M+2 + dup 1 sub % => Data Content Rows Cell1 .. CellN N Data1 .. DataM M M+2 M+1 + roll % => Data Content Rows Cell1 .. CellN Data1 .. DataM M N + add % => Data Content Rows Cell1 .. CellN Data1 .. DataM M+N + array astore % => Data Content Rows NewData + 4 3 roll pop % => Content Rows NewData + 3 1 roll % => NewData Content Rows + 1 sub + in-get-table-content + } { + pop pop + } ifelse +} def +/get-table-content { % => Box + dup + get-table-content-rows % => Box Content + 1 index get-content % => Box Content RawContent + 1 get % => Box Content Rows + [] % => Box Content Rows [] + 4 3 roll pop % => Content Rows [] + 3 1 roll % => [] Content Rows + in-get-table-content +} def +/get-table-content-rows { % => Box + get-content % => RawContent + 2 get % => Content +} def +/get-table-content-column { % => Box ColumnNo + exch get-content % => ColumnNo Content + dup 1 get exch % => ColumnNo RowsNum Content + 2 get % => ColumnNo RowsNum Rows + { % => ColumnNo RowsNum Row + 2 index get % => ColumnNo RowsNum Cell + 3 1 roll % => Cell ColumnNo RowsNum + } forall % => Cell1 .. CellN ColumnNo N + exch pop % => Cell1 .. CellN N + array astore % => Column +} def +/get-table-content-columns { % => Box + dup get-content % => Box [Cols Rows Content] + 0 get 1 sub % => Box Cols-1 + [] % => Box Cols [] + in-get-table-content-columns % => ColsList +} def +/in-get-table-content-columns { % => Box ColsIndex ColsList + 1 index 0 ge { + 3 1 roll % => ColsList Box ColsIndex + 2 copy % => ColsList Box ColsIndex Box ColsIndex + get-table-content-column % => ColsList Box ColsIndex Column + 4 1 roll % => Column ColsList Box ColsIndex + 1 sub % => Column ColsList Box ColsIndex-1 + 4 2 roll % => Box ColsIndex-1 Column ColsList + array-append % => Box ColsIndex-1 ColsList' + in-get-table-content-columns + } { + 3 1 roll + pop pop + } ifelse +} def +/table-get-cell-content { % => R C Box +% One based idices are passed + get-table-content-rows % => R C Rows + 2 index 1 sub get % => R C Row + 1 index 1 sub get % => R C Cell + 3 1 roll pop pop % => Cell +} def + +/rmove-current-point { % => Box DX DY + 2 index get-current-y add % => Box DX DY' + 2 index put-current-y % => Box' DX + 1 index get-current-x add % => Box' DX' + 1 index put-current-x % => Box'' +} def +/safe-div { % => A B + dup 0 % => A B B 0 + eq { % => A B + pop 1 % => A 1 + } if + div +} def +/find-best-column { % => Width MinWidths MaxWidths + dup sum % => Width MinWidths MaxWidths MaxWidth + 3 index % => Width MinWidths MaxWidths MaxWidth Width + exch safe-div % => Width MinWidths MaxWidths Width/MaxWidth(WK) + + 3 1 roll % => Width WK MinWidths MaxWidths + 2 copy {safe-div} zip-with % => Width WK MinWidths MaxWidths [MinI/MaxI] + dup reduce-max % => Width WK MinWidths MaxWidths [MinI/MaxI] MAX[MinI/MaxI] + 4 index gt { % => Width WK MinWidths MaxWidths [MinI/MaxI] + dup reduce-max % => Width WK MinWidths MaxWidths [MinI/MaxI] MaxKoeff + array-find % => Width WK MinWidths MaxWidths MaxKoeffIndex + 2 index 1 index get % => Width WK MinWidths MaxWidths MaxKoeffIndex SW + 6 2 roll % => MaxKoeffIndex SW Width WK MinWidths MaxWidths + pop pop pop pop % => MaxKoeffIndex SW + } { % => Width WK MinWidths MaxWidths [MinI/MaxI] + pop % => Width WK MinWidths MaxWidths + 3 2 roll % => Width MinWidths MaxWidths WK + + 1 index 0 get mul % => Width MinWidths MaxWidths W*WidthKoeff + 2 index 0 get % => Width MinWidths MaxWidths W*WidthKoeff MinW + max % => Width MinWidths MaxWidths SelectedWidth + 0 exch % => Width MinWidths MaxWidths 0 SelectedWidth + 5 2 roll % => 0 SelectedWidth Width MinWidths MaxWidths + pop pop pop + } ifelse +} def +/is-fraction { % => WC + aload % => X ... X WC + 1 index /wc-fraction eq + 2 index /hc-fraction eq or { + astore pop true + } { + astore pop false + } ifelse +} def +/array-reverse { + { + exch array-prepend + } [] 2 index reduce + exch pop +} def +/table-normalize-cwc { % => Box + /temp-table-normalize-cwc 1 def + + { % => ... CVal Val + dup is-fraction { % => ... CVal Val + aload pop pop % => ... CVal Fraction + temp-table-normalize-cwc + min % => ... CVal Fraction' + temp-table-normalize-cwc + 1 index sub % => ... CVal Fraction' Rest + /temp-table-normalize-cwc + exch def % => ... CVal Fraction' + /wc-fraction cvx + 2 array astore cvx % => ... CVal WC' + } if + exch array-prepend % => ... CVal + } [] 2 index table-get-cwc array-reverse + + reduce % => Box CWC' + + exch pop +} def + +/calc-text-indent { % => Box + dup get-box-dict + /Text-Indent get + dup /Relative get { % => Box TIDict + /Value get + 1 index get-width + mul + } { + /Value get + } ifelse % => Box Indent + +% add special offset (for example, if we have marker box with position: inside) + 1 index get-box-dict + /AdditionalTextIndent get + add + + exch pop +} def + +/flow-page-break { % => Parent Child + 1 index get-current-x + 2 index get-current-y % => Parent Child X Y + + 2 index + move-to-box % => Parent Child + + 1 index get-width % => Parent Child PW + 1 index put-full-width % => Parent Child + +% Setup height for the "fake" box + 1 index get-current-y % => Parent Child PCY + + bmargin sub + real-page-height sub neg + real-page-height div + ceiling % => Parent Child Pages + real-page-height mul + neg % => Parent Child EndOfLastPage0 + real-page-height add % => Parent Child EndOfLastPage + + 2 index get-current-y + bmargin sub + exch sub + 1 index put-height + +% we're now interested in last content y, not the bottom border of the containing +% block, because, due the min-height, bottom border can contain lesser (lower on the page) +% value than current y +% 1 index get-bottom-internal + dup get-height + 2 index exch % => Parent Child Parent CH + extend-height pop % => Parent Child + + dup get-top + 1 index get-height + sub + + 2 index + put-current-y + pop + + dup get-right-internal + 1 index put-current-x + + dup close-line + + pop } def \ No newline at end of file diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/height.ps b/thirdparty/html2ps_pdf/postscript/height.ps similarity index 96% rename from gulliver/thirdparty/html2ps_pdf/postscript/height.ps rename to thirdparty/html2ps_pdf/postscript/height.ps index d29b451dc..b63aa925c 100644 --- a/gulliver/thirdparty/html2ps_pdf/postscript/height.ps +++ b/thirdparty/html2ps_pdf/postscript/height.ps @@ -1,231 +1,231 @@ -% $Header: /cvsroot/html2ps/postscript/height.ps,v 1.1 2005/12/18 07:21:38 Konstantin Exp $ - -/hc-apply { % => Box RawHeight HC - dup /constant get /null ne { - 1 index % => Box RawHeight HC RawHeight - 3 index % => Box RawHeight HC RawHeight Box - 2 index /constant get % => Box RawHeight HC RawHeight Box Constant - hc-fix-value % => Box RawHeight HC H - } { - 2 index % => Box RawHeight HC Box - 2 index % => Box RawHeight HC Box RawHeight - 2 index % => Box RawHeight HC Box RawHeight HC - hc-apply-max % => Box RawHeight HC H0 - - 3 index exch % => Box RawHeight HC Box H0 - 2 index - hc-apply-min % => Box RawHeight HC H1 - } ifelse % => Box RawHeight HC H - - exch pop - exch pop - exch pop -} def - -/hc-apply-max { % => Box Value HC - dup /max get /null eq { - 1 index - } { - 1 index - 3 index % => Box Value HC Value Box - 2 index /max get % => Box Value HC Value Box HC - hc-fix-value % => Box Value HC H - - 2 index min % => Box Value HC H - } ifelse % => Box Value HC H - - exch pop - exch pop - exch pop -} def - -/hc-apply-min { % => Box Value HC - dup /min get /null eq { - 1 index - } { - 1 index - 3 index % => Box Value HC Value Box - 2 index /min get % => Box Value HC Value Box HC - hc-fix-value % => Box Value HC H - - 2 index max % => Box Value HC H - } ifelse % => Box Value HC H - - exch pop - exch pop - exch pop -} def - -/hc-create { % => Max Min Constant - << >> - dup /max 5 index put - dup /min 4 index put - dup /constant 3 index put - - exch pop - exch pop - exch pop -} def - -/hc-fix-value { % => Default Box Value -% A percentage or immediate value? - dup /percentage get { % => Default Box Value - -% CSS 2.1: The percentage is calculated with respect to the height of the generated box's containing block. -% If the height of the containing block is not specified explicitly (i.e., it depends on content height), -% and this element is not absolutely positioned, the value is interpreted like 'auto'. - -% Check if parent exists - - 1 index get-parent dup - /null ne { % => Default Box Value Parent - dup get-height-constraint % => Default Box Value Parent ParentHC - 3 index get-parent /box-table-cell is-a not - 1 index /constant get /null eq and - 1 index /min get /null eq and - 1 index /max get /null eq and { -% if parent does not constrained height, return null - no height constraint can be applied - pop pop 2 index - } { % => Default Box Value Parent ParentHC - 3 index get-parent /box-table-cell is-a { - 3 index get-parent - /row get % => Default Box Value Parent ParentHC Row - -% Note that unlike pure PHP DOM tree, we have box-table-row as a direct parent of the cell here - 4 index get-parent - get-parent - get-parent % => Default Box Value Parent ParentHC Row Table - - box-table-get-rhc % => Default Box Value Parent ParentHC RHC - - dup hc-is-null { - pop 4 index - } { - 4 index exch % => Default Box Value Parent ParentHC Box RHC - 1 index get-parent - get-height exch % => Default Box Value Parent ParentHC Box BaseHeight RHC - hc-apply % => Default Box Value Parent ParentHC H - } ifelse - - exch pop - exch pop % => Default Box Value H - } { - pop - get-height % => Default Box Value ParentH - 1 index /value get - mul 100 div % => Default Box Value H - } ifelse - } ifelse - } { % => Default Box Value - /null - } ifelse % => Default Box Value H - } { % => Default Box Value - dup /value get - } ifelse % => Default Box Value H - - exch pop - exch pop - exch pop -} def - -/hc-is-constant { % => HC - /constant get /null ne -} def - -/hc-is-null { % => HC - dup /min get /null eq - 1 index /max get /null eq and - 1 index /constant get /null eq and - exch pop -} def - -/hc-is-percentage { % => HC - dup /min get /null ne { - dup /min get /percentage get not - } { true } ifelse - - 1 index /max get /null ne { - 1 index /max get /percentage get not - } { true } ifelse and - - 1 index /constant get /null ne { - 1 index /constant get /percentage get not - } { true } ifelse and - - not - exch pop -} def - -%%%%%%%%%%%%% - -/is-height-constrained { % => Box - dup get-box-dict % => Box Dict - /Height get - dup /Constrained get % => Box HDict /Constrained - 1 index /Min get 0 gt % => Box HDict /Constrained /ConstrainedMin - or - exch pop - exch pop -} def - -/get-min-height { - dup get-box-dict % => Box Dict - /Height get - dup /MinPercentage get { % => Box HeightDict -% Percentage height can be applied only if parent's height is explicitly height to the constant length - 1 index get-box-dict - /Parent get % => Box HeightDict Parent - get-box-dict - /Height get % => Box HeightDict ParentHeightDict - dup /Constrained get { % => Box HeightDict ParentHeightDict - /ConstraintPercentage - get not { % => Box HeightDict - /Min get - 1 index exch - get-parent-height-fraction - } { % => Box HeightDict - pop 0 - } ifelse - } { % => Box HeightDict ParentHeightDict - pop pop 0 - } ifelse - } { - /Min get - } ifelse - - exch pop -} def - -/find-containing-block-height { % => Box -% Check if the parent box have constrained height - dup get-box-dict % => Box Dict - dup /Parent known { - /Parent get % => Box Parent - get-box-dict % => Box ParentDict - /Height get % => Box ParentHeightDict - dup /Constrained get % => Box ParentHeightDict ParentConstrained - exch % => Box ParentConstrained ParentHeightDict - /ConstraintPercentage get - not % => Box ParentConstrained !ParentPercentageConstrained - and - { - get-box-dict /Parent get - get-height - } { - % Box parent is not height-constrained, proceed to its parent - get-box-dict /Parent get - find-containing-block-height - } ifelse - } { - pop pop 0 - } ifelse -} def - -/calc-auto-height-margins { % => Box - dup get-real-height % => Box RH - 1 index get-min-height % => Box RH MH - max % => Box H1 - 1 index get-max-height - min % => Box H - exch pop +% $Header: /cvsroot/html2ps/postscript/height.ps,v 1.1 2005/12/18 07:21:38 Konstantin Exp $ + +/hc-apply { % => Box RawHeight HC + dup /constant get /null ne { + 1 index % => Box RawHeight HC RawHeight + 3 index % => Box RawHeight HC RawHeight Box + 2 index /constant get % => Box RawHeight HC RawHeight Box Constant + hc-fix-value % => Box RawHeight HC H + } { + 2 index % => Box RawHeight HC Box + 2 index % => Box RawHeight HC Box RawHeight + 2 index % => Box RawHeight HC Box RawHeight HC + hc-apply-max % => Box RawHeight HC H0 + + 3 index exch % => Box RawHeight HC Box H0 + 2 index + hc-apply-min % => Box RawHeight HC H1 + } ifelse % => Box RawHeight HC H + + exch pop + exch pop + exch pop +} def + +/hc-apply-max { % => Box Value HC + dup /max get /null eq { + 1 index + } { + 1 index + 3 index % => Box Value HC Value Box + 2 index /max get % => Box Value HC Value Box HC + hc-fix-value % => Box Value HC H + + 2 index min % => Box Value HC H + } ifelse % => Box Value HC H + + exch pop + exch pop + exch pop +} def + +/hc-apply-min { % => Box Value HC + dup /min get /null eq { + 1 index + } { + 1 index + 3 index % => Box Value HC Value Box + 2 index /min get % => Box Value HC Value Box HC + hc-fix-value % => Box Value HC H + + 2 index max % => Box Value HC H + } ifelse % => Box Value HC H + + exch pop + exch pop + exch pop +} def + +/hc-create { % => Max Min Constant + << >> + dup /max 5 index put + dup /min 4 index put + dup /constant 3 index put + + exch pop + exch pop + exch pop +} def + +/hc-fix-value { % => Default Box Value +% A percentage or immediate value? + dup /percentage get { % => Default Box Value + +% CSS 2.1: The percentage is calculated with respect to the height of the generated box's containing block. +% If the height of the containing block is not specified explicitly (i.e., it depends on content height), +% and this element is not absolutely positioned, the value is interpreted like 'auto'. + +% Check if parent exists + + 1 index get-parent dup + /null ne { % => Default Box Value Parent + dup get-height-constraint % => Default Box Value Parent ParentHC + 3 index get-parent /box-table-cell is-a not + 1 index /constant get /null eq and + 1 index /min get /null eq and + 1 index /max get /null eq and { +% if parent does not constrained height, return null - no height constraint can be applied + pop pop 2 index + } { % => Default Box Value Parent ParentHC + 3 index get-parent /box-table-cell is-a { + 3 index get-parent + /row get % => Default Box Value Parent ParentHC Row + +% Note that unlike pure PHP DOM tree, we have box-table-row as a direct parent of the cell here + 4 index get-parent + get-parent + get-parent % => Default Box Value Parent ParentHC Row Table + + box-table-get-rhc % => Default Box Value Parent ParentHC RHC + + dup hc-is-null { + pop 4 index + } { + 4 index exch % => Default Box Value Parent ParentHC Box RHC + 1 index get-parent + get-height exch % => Default Box Value Parent ParentHC Box BaseHeight RHC + hc-apply % => Default Box Value Parent ParentHC H + } ifelse + + exch pop + exch pop % => Default Box Value H + } { + pop + get-height % => Default Box Value ParentH + 1 index /value get + mul 100 div % => Default Box Value H + } ifelse + } ifelse + } { % => Default Box Value + /null + } ifelse % => Default Box Value H + } { % => Default Box Value + dup /value get + } ifelse % => Default Box Value H + + exch pop + exch pop + exch pop +} def + +/hc-is-constant { % => HC + /constant get /null ne +} def + +/hc-is-null { % => HC + dup /min get /null eq + 1 index /max get /null eq and + 1 index /constant get /null eq and + exch pop +} def + +/hc-is-percentage { % => HC + dup /min get /null ne { + dup /min get /percentage get not + } { true } ifelse + + 1 index /max get /null ne { + 1 index /max get /percentage get not + } { true } ifelse and + + 1 index /constant get /null ne { + 1 index /constant get /percentage get not + } { true } ifelse and + + not + exch pop +} def + +%%%%%%%%%%%%% + +/is-height-constrained { % => Box + dup get-box-dict % => Box Dict + /Height get + dup /Constrained get % => Box HDict /Constrained + 1 index /Min get 0 gt % => Box HDict /Constrained /ConstrainedMin + or + exch pop + exch pop +} def + +/get-min-height { + dup get-box-dict % => Box Dict + /Height get + dup /MinPercentage get { % => Box HeightDict +% Percentage height can be applied only if parent's height is explicitly height to the constant length + 1 index get-box-dict + /Parent get % => Box HeightDict Parent + get-box-dict + /Height get % => Box HeightDict ParentHeightDict + dup /Constrained get { % => Box HeightDict ParentHeightDict + /ConstraintPercentage + get not { % => Box HeightDict + /Min get + 1 index exch + get-parent-height-fraction + } { % => Box HeightDict + pop 0 + } ifelse + } { % => Box HeightDict ParentHeightDict + pop pop 0 + } ifelse + } { + /Min get + } ifelse + + exch pop +} def + +/find-containing-block-height { % => Box +% Check if the parent box have constrained height + dup get-box-dict % => Box Dict + dup /Parent known { + /Parent get % => Box Parent + get-box-dict % => Box ParentDict + /Height get % => Box ParentHeightDict + dup /Constrained get % => Box ParentHeightDict ParentConstrained + exch % => Box ParentConstrained ParentHeightDict + /ConstraintPercentage get + not % => Box ParentConstrained !ParentPercentageConstrained + and + { + get-box-dict /Parent get + get-height + } { + % Box parent is not height-constrained, proceed to its parent + get-box-dict /Parent get + find-containing-block-height + } ifelse + } { + pop pop 0 + } ifelse +} def + +/calc-auto-height-margins { % => Box + dup get-real-height % => Box RH + 1 index get-min-height % => Box RH MH + max % => Box H1 + 1 index get-max-height + min % => Box H + exch pop } def \ No newline at end of file diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/image.ps b/thirdparty/html2ps_pdf/postscript/image.ps similarity index 96% rename from gulliver/thirdparty/html2ps_pdf/postscript/image.ps rename to thirdparty/html2ps_pdf/postscript/image.ps index 78fe74d84..b8fb62fb3 100644 --- a/gulliver/thirdparty/html2ps_pdf/postscript/image.ps +++ b/thirdparty/html2ps_pdf/postscript/image.ps @@ -1,338 +1,338 @@ -% $Header: /cvsroot/html2ps/postscript/image.ps,v 1.1 2005/12/18 07:21:38 Konstantin Exp $ - -/image-create { % => Mask Image Init SY SX - << >> - dup /SX 3 index put - dup /SY 4 index put - dup /Init 5 index put - dup /Image 6 index put - dup /Mask 7 index put - - exch pop - exch pop - exch pop - exch pop - exch pop -} def - -/image-show { % => W H Image -% Check if image is transparent - dup /Mask get /null eq { % => W H Image - 2 index - 2 index % => W H Image W H - 2 index /SX get - 3 index /SY get - 4 index /Image get - 5 index /Init get % => W H Image W H SX SY Image Init - show-image % => W H Image - } { - 2 index - 2 index % => W H Image W H - 2 index /SX get - 3 index /SY get - 4 index /Mask get - 5 index /Image get - 6 index /Init get % => W H Image W H SX SY Mask Image Init - show-transparent-image - } ifelse % => W H Image - pop pop pop -} def - -/image-show-simple { % => Scale Y X Image - 1 index - 3 index moveto % => Scale Y X Image - - dup /SX get 4 index mul - 1 index /SY get 5 index mul % => Scale Y X Image W H - 2 index image-show % => Scale Y X Image - - pop pop pop pop -} def - -/image-show-repeat-x { % => Scale YOffset XOffset Right Width Y X Image - dup /SX get 8 index mul - 1 index /SY get 9 index mul % => Scale YOffset XOffset Right width Y X Image W H - -% Fill part to the right - - 3 index % => Scale YOffset XOffset Right width Y X Image W H CX - { % => Scale YOffset XOffset Right width Y X Image W H CX - dup - 8 index ge { exit } if - - dup 6 index moveto % => Scale YOffset XOffset Right width Y X Image W H CX - - 2 index 2 index 5 index - image-show % => Scale YOffset XOffset Right width Y X Image W H CY - 6 index add % => Scale YOffset XOffset Right width Y X Image W H CY - } loop - pop -% Fill part to the left - - 3 index - { % => Scale YOffset XOffset Right width Y X Image W H CX - dup 7 index add - 5 index 10 index sub - lt { exit } if - - dup 7 index sub - 6 index moveto % => Scale YOffset XOffset Right width Y X Image W H CX - - 2 index 2 index 5 index - image-show % => Scale YOffset XOffset Right width Y X Image W H CX - - 6 index sub % => Scale YOffset XOffset Right width Y X Image W H CX - } loop - pop - pop pop - - pop pop pop - pop pop pop - pop pop -} def - -/image-show-repeat-y { % => Scale YOffset XOffset Bottom height Y X Image - dup /SX get 8 index mul - 1 index /SY get 9 index mul % => Scale YOffset XOffset Bottom height Y X Image W H - -% Fill part to the bottom - - 4 index % => Scale YOffset XOffset Bottom height Y X Image W H CY - { % => Scale YOffset XOffset Bottom height Y X Image W H CY - 6 index 1 index add - 8 index le { exit } if - - 4 index 1 index moveto % => Scale YOffset XOffset Bottom height Y X Image W H CY - - 2 index 2 index 5 index - image-show % => Scale YOffset XOffset Bottom height Y X Image W H CY - 6 index sub % => Scale YOffset XOffset Bottom height Y X Image W H CY - } loop - pop - -% Fill part to the top - - 4 index - { % => Scale YOffset XOffset Bottom height Y X Image W H CY - 6 index 1 index exch sub - 10 index 7 index add - ge { exit } if - - 4 index 1 index moveto % => Scale YOffset XOffset Bottom height Y X Image W H CY - - 2 index 2 index 5 index - image-show % => Scale YOffset XOffset Bottom height Y X Image W H CY - - 6 index add % => Scale YOffset XOffset Bottom height Y X Image W H CY - } loop - pop - pop pop - - pop pop pop - pop pop pop - pop pop -} def - -/image-show-repeat-xy { % => Scale YOffset XOffset Bottom Right Height Width Y X Image - dup /SX get 10 index mul - 1 index /SY get 11 index mul % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H - -% Fill bottom-right quadrant - 4 index % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY - { - dup 8 index add - 10 index le { exit } if % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY - - 4 index % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY CX - { - dup 10 index ge { exit } if - - dup 2 index moveto - 3 index 3 index 6 index - image-show - - 7 index add - } loop % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY CX - pop - - 7 index sub - } loop % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY - pop - -% Fill bottom-left quadrant - 4 index % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY - { - dup 8 index add - 10 index le { exit } if % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY - - 4 index % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY CX - { - dup 8 index add - 6 index 13 index sub - le { exit } if - - dup 2 index moveto - 3 index 3 index 6 index - image-show - - 7 index sub - } loop % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY CX - pop - - 7 index sub - } loop % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY - pop - -% Fill top-right quadrant - 4 index % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY - { - dup - 6 index 13 index add - gt { exit } if % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY - - 4 index % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY CX - { - dup 10 index gt { exit } if - - dup 2 index moveto - 3 index 3 index 6 index - image-show - - 7 index add - } loop % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY CX - pop - - 7 index add - } loop % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY - pop - -% Fill top-left quadrant - 4 index % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY - { - dup - 6 index 13 index add - ge { exit } if % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY - - 4 index % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY CX - { - dup 8 index add - 6 index 13 index sub - le { exit } if - - dup 2 index moveto - 3 index 3 index 6 index - image-show - - 7 index sub - } loop % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY CX - pop - - 7 index add - } loop % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY - pop - - pop pop - - pop pop pop - pop pop pop - pop pop pop - pop -} def - -/show-image { % => W H W H Samples InitFunc - exec % => W H W H Samples - - gsave - - matrix % => W H W H Samples Matr - currentpoint % => W H W H Samples Matr X Y - translate % => W H W H Samples Matr' - 5 index - 4 index div % => W H W H Samples Matr' KX - 5 index - 4 index div neg % => W H W H Samples Matr' KX KY - scale % => W H W H Samples Matr'' - 0 3 index neg % => W H W H Samples Matr'' 0 -H(px) - translate % => W H W H Samples Matr - - << - /ImageType 1 - /Width 7 index - /Height 8 index - /BitsPerComponent 8 - /Decode [0 1 0 1 0 1] - /ImageMatrix 12 index - /DataSource 15 index - >> - - image - - grestore - - pop pop pop - pop pop pop -} def - -/show-transparent-image { % => W H W H Mask Samples InitFunc - exec % => W H W H Mask Samples - - gsave - - matrix % => W H W H Mask Samples Matr - currentpoint % => W H W H Mask Samples Matr X Y - translate % => W H W H Mask Samples Matr' - 6 index - 5 index div % => W H W H Mask Samples Matr' KX - 6 index - 5 index div neg % => W H W H Mask Samples Matr' KX KY - scale % => W H W H Mask Samples Matr'' - 0 4 index neg % => W H W H Mask Samples Matr'' 0 -H(px) - translate % => W H W H Mask Samples Matr - -% As support of type 3 images in ps2pdf is bad, we'll use this workaround - ps2pdf-transparency-hack { - << - /ImageType no-transparency-output { 1 } { 4 } ifelse - /Width 8 index - /Height 9 index - /BitsPerComponent 8 - /Decode [0 1 0 1 0 1] - /ImageMatrix 12 index - /DataSource 15 index - /MaskColor [0 0 0] - >> - } { - << - /ImageType 3 - /InterleaveType 3 - /DataDict - << - /ImageType 1 - /Width 14 index - /Height 15 index - /BitsPerComponent 8 - /Decode [0 1 0 1 0 1] - /ImageMatrix 18 index - /DataSource 21 index - >> - /MaskDict - << - /ImageType 1 - /Width 16 index - /Height 17 index - /BitsPerComponent 1 - /Decode [0 1] - /ImageMatrix 20 index - /DataSource 24 index - >> - >> - } ifelse - - image - - grestore - - pop pop pop pop - pop pop pop -} def - +% $Header: /cvsroot/html2ps/postscript/image.ps,v 1.1 2005/12/18 07:21:38 Konstantin Exp $ + +/image-create { % => Mask Image Init SY SX + << >> + dup /SX 3 index put + dup /SY 4 index put + dup /Init 5 index put + dup /Image 6 index put + dup /Mask 7 index put + + exch pop + exch pop + exch pop + exch pop + exch pop +} def + +/image-show { % => W H Image +% Check if image is transparent + dup /Mask get /null eq { % => W H Image + 2 index + 2 index % => W H Image W H + 2 index /SX get + 3 index /SY get + 4 index /Image get + 5 index /Init get % => W H Image W H SX SY Image Init + show-image % => W H Image + } { + 2 index + 2 index % => W H Image W H + 2 index /SX get + 3 index /SY get + 4 index /Mask get + 5 index /Image get + 6 index /Init get % => W H Image W H SX SY Mask Image Init + show-transparent-image + } ifelse % => W H Image + pop pop pop +} def + +/image-show-simple { % => Scale Y X Image + 1 index + 3 index moveto % => Scale Y X Image + + dup /SX get 4 index mul + 1 index /SY get 5 index mul % => Scale Y X Image W H + 2 index image-show % => Scale Y X Image + + pop pop pop pop +} def + +/image-show-repeat-x { % => Scale YOffset XOffset Right Width Y X Image + dup /SX get 8 index mul + 1 index /SY get 9 index mul % => Scale YOffset XOffset Right width Y X Image W H + +% Fill part to the right + + 3 index % => Scale YOffset XOffset Right width Y X Image W H CX + { % => Scale YOffset XOffset Right width Y X Image W H CX + dup + 8 index ge { exit } if + + dup 6 index moveto % => Scale YOffset XOffset Right width Y X Image W H CX + + 2 index 2 index 5 index + image-show % => Scale YOffset XOffset Right width Y X Image W H CY + 6 index add % => Scale YOffset XOffset Right width Y X Image W H CY + } loop + pop +% Fill part to the left + + 3 index + { % => Scale YOffset XOffset Right width Y X Image W H CX + dup 7 index add + 5 index 10 index sub + lt { exit } if + + dup 7 index sub + 6 index moveto % => Scale YOffset XOffset Right width Y X Image W H CX + + 2 index 2 index 5 index + image-show % => Scale YOffset XOffset Right width Y X Image W H CX + + 6 index sub % => Scale YOffset XOffset Right width Y X Image W H CX + } loop + pop + pop pop + + pop pop pop + pop pop pop + pop pop +} def + +/image-show-repeat-y { % => Scale YOffset XOffset Bottom height Y X Image + dup /SX get 8 index mul + 1 index /SY get 9 index mul % => Scale YOffset XOffset Bottom height Y X Image W H + +% Fill part to the bottom + + 4 index % => Scale YOffset XOffset Bottom height Y X Image W H CY + { % => Scale YOffset XOffset Bottom height Y X Image W H CY + 6 index 1 index add + 8 index le { exit } if + + 4 index 1 index moveto % => Scale YOffset XOffset Bottom height Y X Image W H CY + + 2 index 2 index 5 index + image-show % => Scale YOffset XOffset Bottom height Y X Image W H CY + 6 index sub % => Scale YOffset XOffset Bottom height Y X Image W H CY + } loop + pop + +% Fill part to the top + + 4 index + { % => Scale YOffset XOffset Bottom height Y X Image W H CY + 6 index 1 index exch sub + 10 index 7 index add + ge { exit } if + + 4 index 1 index moveto % => Scale YOffset XOffset Bottom height Y X Image W H CY + + 2 index 2 index 5 index + image-show % => Scale YOffset XOffset Bottom height Y X Image W H CY + + 6 index add % => Scale YOffset XOffset Bottom height Y X Image W H CY + } loop + pop + pop pop + + pop pop pop + pop pop pop + pop pop +} def + +/image-show-repeat-xy { % => Scale YOffset XOffset Bottom Right Height Width Y X Image + dup /SX get 10 index mul + 1 index /SY get 11 index mul % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H + +% Fill bottom-right quadrant + 4 index % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY + { + dup 8 index add + 10 index le { exit } if % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY + + 4 index % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY CX + { + dup 10 index ge { exit } if + + dup 2 index moveto + 3 index 3 index 6 index + image-show + + 7 index add + } loop % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY CX + pop + + 7 index sub + } loop % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY + pop + +% Fill bottom-left quadrant + 4 index % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY + { + dup 8 index add + 10 index le { exit } if % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY + + 4 index % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY CX + { + dup 8 index add + 6 index 13 index sub + le { exit } if + + dup 2 index moveto + 3 index 3 index 6 index + image-show + + 7 index sub + } loop % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY CX + pop + + 7 index sub + } loop % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY + pop + +% Fill top-right quadrant + 4 index % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY + { + dup + 6 index 13 index add + gt { exit } if % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY + + 4 index % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY CX + { + dup 10 index gt { exit } if + + dup 2 index moveto + 3 index 3 index 6 index + image-show + + 7 index add + } loop % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY CX + pop + + 7 index add + } loop % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY + pop + +% Fill top-left quadrant + 4 index % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY + { + dup + 6 index 13 index add + ge { exit } if % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY + + 4 index % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY CX + { + dup 8 index add + 6 index 13 index sub + le { exit } if + + dup 2 index moveto + 3 index 3 index 6 index + image-show + + 7 index sub + } loop % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY CX + pop + + 7 index add + } loop % => Scale YOffset XOffset Bottom Right Height Width Y X Image W H CY + pop + + pop pop + + pop pop pop + pop pop pop + pop pop pop + pop +} def + +/show-image { % => W H W H Samples InitFunc + exec % => W H W H Samples + + gsave + + matrix % => W H W H Samples Matr + currentpoint % => W H W H Samples Matr X Y + translate % => W H W H Samples Matr' + 5 index + 4 index div % => W H W H Samples Matr' KX + 5 index + 4 index div neg % => W H W H Samples Matr' KX KY + scale % => W H W H Samples Matr'' + 0 3 index neg % => W H W H Samples Matr'' 0 -H(px) + translate % => W H W H Samples Matr + + << + /ImageType 1 + /Width 7 index + /Height 8 index + /BitsPerComponent 8 + /Decode [0 1 0 1 0 1] + /ImageMatrix 12 index + /DataSource 15 index + >> + + image + + grestore + + pop pop pop + pop pop pop +} def + +/show-transparent-image { % => W H W H Mask Samples InitFunc + exec % => W H W H Mask Samples + + gsave + + matrix % => W H W H Mask Samples Matr + currentpoint % => W H W H Mask Samples Matr X Y + translate % => W H W H Mask Samples Matr' + 6 index + 5 index div % => W H W H Mask Samples Matr' KX + 6 index + 5 index div neg % => W H W H Mask Samples Matr' KX KY + scale % => W H W H Mask Samples Matr'' + 0 4 index neg % => W H W H Mask Samples Matr'' 0 -H(px) + translate % => W H W H Mask Samples Matr + +% As support of type 3 images in ps2pdf is bad, we'll use this workaround + ps2pdf-transparency-hack { + << + /ImageType no-transparency-output { 1 } { 4 } ifelse + /Width 8 index + /Height 9 index + /BitsPerComponent 8 + /Decode [0 1 0 1 0 1] + /ImageMatrix 12 index + /DataSource 15 index + /MaskColor [0 0 0] + >> + } { + << + /ImageType 3 + /InterleaveType 3 + /DataDict + << + /ImageType 1 + /Width 14 index + /Height 15 index + /BitsPerComponent 8 + /Decode [0 1 0 1 0 1] + /ImageMatrix 18 index + /DataSource 21 index + >> + /MaskDict + << + /ImageType 1 + /Width 16 index + /Height 17 index + /BitsPerComponent 1 + /Decode [0 1] + /ImageMatrix 20 index + /DataSource 24 index + >> + >> + } ifelse + + image + + grestore + + pop pop pop pop + pop pop pop +} def + diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/init.ps b/thirdparty/html2ps_pdf/postscript/init.ps similarity index 95% rename from gulliver/thirdparty/html2ps_pdf/postscript/init.ps rename to thirdparty/html2ps_pdf/postscript/init.ps index 535394640..29997f76b 100644 --- a/gulliver/thirdparty/html2ps_pdf/postscript/init.ps +++ b/thirdparty/html2ps_pdf/postscript/init.ps @@ -1,11 +1,11 @@ -% $Header: /cvsroot/html2ps/postscript/init.ps,v 1.1 2005/12/18 07:21:38 Konstantin Exp $ - -% move to top of the page -% -lmargin -pageheight tmargin sub -moveto - -% define the "page-box" -% +% $Header: /cvsroot/html2ps/postscript/init.ps,v 1.1 2005/12/18 07:21:38 Konstantin Exp $ + +% move to top of the page +% +lmargin +pageheight tmargin sub +moveto + +% define the "page-box" +% box-block-create \ No newline at end of file diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/position.ps b/thirdparty/html2ps_pdf/postscript/position.ps similarity index 98% rename from gulliver/thirdparty/html2ps_pdf/postscript/position.ps rename to thirdparty/html2ps_pdf/postscript/position.ps index 25e7e9633..e5a36f101 100644 --- a/gulliver/thirdparty/html2ps_pdf/postscript/position.ps +++ b/thirdparty/html2ps_pdf/postscript/position.ps @@ -1,4 +1,4 @@ -% $Header: /cvsroot/html2ps/postscript/position.ps,v 1.1 2005/12/18 07:21:38 Konstantin Exp $ - -/position-float { % Parent Child +% $Header: /cvsroot/html2ps/postscript/position.ps,v 1.1 2005/12/18 07:21:38 Konstantin Exp $ + +/position-float { % Parent Child } def \ No newline at end of file diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/predicates.ps b/thirdparty/html2ps_pdf/postscript/predicates.ps similarity index 95% rename from gulliver/thirdparty/html2ps_pdf/postscript/predicates.ps rename to thirdparty/html2ps_pdf/postscript/predicates.ps index 217cb9e46..6941b12d8 100644 --- a/gulliver/thirdparty/html2ps_pdf/postscript/predicates.ps +++ b/thirdparty/html2ps_pdf/postscript/predicates.ps @@ -1,28 +1,28 @@ -% $Header: /cvsroot/html2ps/postscript/predicates.ps,v 1.1 2005/12/18 07:21:38 Konstantin Exp $ - -/is-inline { - /display get-css-value - dup /-button eq - 1 index /-checkbox eq or - 1 index /-image eq or - 1 index /inline eq or - 1 index /inline-block eq or - 1 index /none eq or - 1 index /-radio eq or - 1 index /-select eq or - 1 index /-text eq or - exch pop -} def - -/is-whitespace { - dup /box-whitespace is-a - 1 index /box-null is-a or - exch pop -} def - -/is-container { - dup /box-container is-a - 1 index /box-generic-inline is-a not and - 1 index /box-inline is-a or - exch pop +% $Header: /cvsroot/html2ps/postscript/predicates.ps,v 1.1 2005/12/18 07:21:38 Konstantin Exp $ + +/is-inline { + /display get-css-value + dup /-button eq + 1 index /-checkbox eq or + 1 index /-image eq or + 1 index /inline eq or + 1 index /inline-block eq or + 1 index /none eq or + 1 index /-radio eq or + 1 index /-select eq or + 1 index /-text eq or + exch pop +} def + +/is-whitespace { + dup /box-whitespace is-a + 1 index /box-null is-a or + exch pop +} def + +/is-container { + dup /box-container is-a + 1 index /box-generic-inline is-a not and + 1 index /box-inline is-a or + exch pop } def \ No newline at end of file diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/table.ps b/thirdparty/html2ps_pdf/postscript/table.ps similarity index 97% rename from gulliver/thirdparty/html2ps_pdf/postscript/table.ps rename to thirdparty/html2ps_pdf/postscript/table.ps index cfc92d789..e3528c179 100644 --- a/gulliver/thirdparty/html2ps_pdf/postscript/table.ps +++ b/thirdparty/html2ps_pdf/postscript/table.ps @@ -1,1256 +1,1256 @@ -% $Header: /cvsroot/html2ps/postscript/table.ps,v 1.1 2005/12/18 07:21:38 Konstantin Exp $ - -/table-get-row-height-constraints {% => Box - get-table-content-rows % => Rows - { - row-get-height-constraint - exch - array-append - } - [] - 2 index - reduce % => Rows RHCs - - exch pop % => RHCs -} def - -/put-table-column-width-constraint % => WC Box -{ - dup is-table { - dup table-get-cwc-raw % => WC Box CWC - 1 index get-current-column - 1 add % => WC Box CWC CC(1-based) - 2 index get-table-content-rows % => WC Box CWC CC Rows - length % => WC Box CWC CC CR - 4 index % => WC Box CWC CC CR WC - 3 array astore % => WC Box CWC [CC CR WC] - exch array-prepend % => WC Box CWC' - 1 index table-put-cwc-raw % => WC Box - } if - pop pop - -} def -/table-get-cwc { % => Table - [] % => Table [](CWC) - - 1 index get-current-column - dup 0 ge { - 1 add - - {wc-none} - array-extend - - 1 index table-get-cwc-raw % => Table CWC RawCWCS - { % => Table CWC RawCWC[CC CR WC] - aload pop % => Table CWC CC CR WC - -% Ignore column-width constraints for colspanned columns - 1 index - 3 index - 6 index - table-have-colspan 1 eq { - exch pop % => Table CWC CC WC - exch 1 sub exch % => Table CWC CC(0-based) WC - 2 index length 2 index 1 add lt { - 3 1 roll {wc-none} - array-extend % => Table WC CWC' - array-prepend % => Table CWC'' - } { - 2 index - 3 1 roll - put - } ifelse - } { - pop pop pop - } ifelse - } forall - exch pop - } { - pop pop pop [] - } ifelse -} def - -% Get the cell-width constraint -% @param R row number (zero based) -% @param C column number (zero based) -% @param Table table being processed -% returns false if no constraint; WC function if constraint have been found -/table-get-cwc-raw-at { % => R C Table - [] % => R C Table [] - 1 index table-get-cwc-raw { % => R C Table [] CurrentWC - aload pop % => R C Table [] C' R' WC - - 6 index 2 index eq - 6 index 4 index eq and { % => R C Table [] C' R' WC - exch pop - exch pop - exch array-append % => R C Table [WC] - - } { - pop pop pop - } ifelse % => R C Table [WC] - } forall - - 4 1 roll - pop pop pop - - dup length 0 gt { - 0 get - } { - pop false - } ifelse -} def - -/table-get-cwc-raw { % => Table - get-content % => Content - 5 get % => CWC -} def -/table-put-cwc-raw { % => CWC Table - get-content % => CWC Content - 5 % => CWC Content 5 - 3 2 roll % => Content 5 CWC - put % => -} def -/make-table-box { % => W Cols Rows - 0 3 1 roll % => W 0(H) Cols Rows - 2 copy make-table - [] [] % => W 0(H) Cols Rows [] [](ColSpans) [](RowSpans) - [] % => W 0(H) Cols Rows [] [](ColSpans) [](RowSpans) [](ColumnWidthConstraints) - 6 array astore % => W 0(H) [Cols Rows [] [](ColSpans) [](RowSpans)](Content) - 0 0 0 0 - 5 4 roll % => W H 0 0 0 0 Content - 0 % => W H 0 0 0 0 Content 0(Baseline) - /show-table-box % => W H 0 0 0 0 Content 0(Baseline) DisplayFun - 0 % => W H 0 0 0 0 Content 0(Baseline) DisplayFun 0(DefaultBaseline) - [0 0 0 0] - make-box - {flow-table} 1 index put-flow-fun -% Mark box as table - dup get-box-dict - /Display /table put -} def -/make-default-table-box { % => W - 0 0 make-table-box - dup get-box-dict - /Width get - /Auto false put -} def - -% PREDICATES -/is-constrained-column { % => WC - 0 get /wc-none cvx ne -} def % => Flag - -% ROW-RELATED -/table-fit-row { % => R Row Box ColsWidth -% Get total height of current row - 3 2 roll % => R Box ColsWidth Row - - 2 index -% table-row-height accepts 1-based row indices - 4 index 1 add - 2 index - table-row-height % => R Box ColsWidth Row RH - -% Get current Y coordinate (indicated the bottom edge of current row) - dup 2 div - 4 index get-current-y -% Calculate middle Y coordinate of this row - exch sub % => R Box ColsWidth Row RH Middle - -% Row baseline information - 2 index get-row-baseline % => R Box ColsWidth Row RH Middle RBaseline - exch - 4 3 roll % => R Box ColsWidth RH RBaseline Middle Row - - { % => R Box ColsWidth RH RBaseline Middle Cell - 4 copy - apply-valign % => R Box ColsWidth RH RBaseline Middle Cell - -% extend cell height to fit the row vertically - 1 index % => R Box ColsWidth RH RBaseline Middle Cell Middle - 6 index get-current-y % => R Box ColsWidth RH RBaseline Middle Cell Middle CY - - exch sub % => R Box ColsWidth RH RBaseline Middle Cell H/2 - 2 mul % => R Box ColsWidth RH RBaseline Middle Cell H - dup 2 index - get-full-height % => R Box ColsWidth RH RBaseline Middle Cell H H CellH - gt { % => R Box ColsWidth RH RBaseline Middle Cell H - 2 copy exch - put-full-height % => R Box ColsWidth RH RBaseline Middle Cell H - } if -% align the top edge of extended cell with the row top edge - 2 div 2 index exch - add % => R Box ColsWidth RH RBaseline Middle Cell TY - 1 index put-top - pop - } forall % => R Box ColsWidth RH RBaseline Middle - - pop pop pop pop pop pop % => -} def -/table-row-height { % => Box R Row - 1 exch % => Box R 1(C) Row - 0 exch % => Box R 1(C) 0(H) Row - { % => Box R C H Cell - 3 index - 3 index % => Box R C H Cell R C - 6 index % => Box R C H Cell R C Box - table-have-rowspan % => Box R C H Cell Span - 1 le { - get-full-height - max % => Box R C H - } { - pop - } ifelse % => Box R C H - exch 1 add exch % => Box R C+1 H - } forall % => Box R C+1 H - 4 1 roll - pop pop pop % => H -} def -/in-table-resize-rows { % => Box R OY RHs Rows - dup length 0 gt { % => Box R OY RHs Rows - 1 index 0 get % => Box R OY RHs Rows H - - 1 index 0 get % => Box R OY RHs Rows H Row - 5 index % => Box R OY RHs Rows H Row R - 7 index % => Box R OY RHs Rows H Row R Box - exch % => Box R OY RHs Rows H Row Box R - 3 2 roll % => Box R OY RHs Rows H Box R Row - table-row-height % => Box R OY RHs Rows H OldH - 7 1 roll % => OldH Box R OY RHs Rows H - - 1 index 0 get % => OldH Box R OY RHs Rows H Row - - dup get-row-baseline - exch % => OldH Box R OY RHs Rows H RowBaseLine Row - - { % => OldH Box R OY RHs Rows H RowBaseLine Cell -% align top edge of the expanded cell and the top edge of row -% note that table content already have vertical alignment, so it should not -% be affected by this action - dup get-left % => OldH Box R OY RHs Rows H RowBaseLine Cell X - 8 index get-top-internal - 7 index sub % => OldH Box R OY RHs Rows H RowBaseLine Cell X Y - 2 index - move-to-box % => OldH Box R OY RHs Rows H RowBaseLine Cell - -% re-try to vertical align the cell contents using new row height - 1 index % => OldH Box R OY RHs Rows H RowBaseLine Cell RowBaseline - 8 index get-top - 7 index sub - 4 index 2 div - sub % => OldH Box R OY RHs Rows H RowBaseLine Cell Baseline Middle - 2 index % => OldH Box R OY RHs Rows H RowBaseLine Cell Baseline Middle Cell - 5 index 4 1 roll % => OldH Box R OY RHs Rows H RowBaseLine Cell H Baseline Middle Cell - - apply-valign % => OldH Box R OY RHs Rows H RowBaseLine Cell - -% expand cell to the row height - 2 index - 1 index % => OldH Box R OY RHs Rows H RowBaseLine Cell H Cell - put-full-height % => OldH Box R OY RHs Rows H RowBaseLine Cell - - pop - } forall % => OldH Box R OY RHs Rows H RowBaseLine - pop % => OldH Box R OY RHs Rows H - -% Calculate new offset from the table top (old offset+current row height) - 7 6 roll % => Box R OY RHs Rows H OldH - pop % => Box R OY RHs Rows H - 4 3 roll % => Box R RHs Rows H OY - add % => Box R RHs Rows OY' -% remove processed element for row array - 3 1 roll % => Box R OY' RHs Rows - array-pop-first % => Box R OY RHs Rows' -% remove processed element for row heights array - 4 1 roll - array-pop-first % => Box Rows' R OY RHs' -% increase row index - 4 2 roll - 1 add % => Box OY RHs' Rows' R+1 -% process next row recusively - 4 1 roll % => Box R+1 OY RHs' Rows' - - in-table-resize-rows - } if -} def -/table-resize-rows { % => Box RHs - dup sum % => Box RHs FH - 2 index put-height % => Box RHs - 1 exch % => Box 1(R) RHs - 0 exch % => Box 1(R) 0(Ofs) RHs - 3 index - get-table-content-rows % => Box 1(R) 0(Ofs) RHs Rows - in-table-resize-rows % => Box 1(R) OY [] [] - pop pop pop pop pop -} def -/table-rows-heights { % => Box - dup get-table-content-rows % => Box Rows - [] exch % => Box [](Heights) Rows - 1 exch % => Box [](Heights) 1(R) Rows - { % => Box Heights R Row - 1 index exch % => Box Heights R R Row - 4 index 3 1 roll % => Box Heights R Box R Row - table-row-height % => Box Heights R H - 2 index array-prepend % => Box Heights R Heights' - 3 1 roll % => Box Heights' Heights R - exch pop % => Box Heights R - 1 add % => Box Heights R+1 - } forall % => Box Heights R - pop - exch pop % => Heights -} def - -% Modify minimal column width using column span information -/get-max-width-table-column { % => Box C Column - 1 exch - 0 exch { % => Box C 1(R) 0(ColumnMinWidth) ColumnElement - 2 index % => Box C 1(R) 0(ColumnMinWidth) ColumnElement R - 4 index % => Box C 1(R) 0(ColumnMinWidth) ColumnElement R C - 6 index - table-have-colspan 1 gt { % => Box C R Width Element - pop % => Box C R Width - } { - get-max-width % => Box C R Width CWidth - max % => Box C R Width' - } ifelse - exch 1 add exch % => Box C R+1 Width' - } forall % => Box C RL Width' - - exch pop % => Box C Width' - 2 index get-hor-extra - sub - - 3 1 roll pop pop % => Width -} def -/get-min-width-table-column { % => Box C Column - 1 exch - 0 exch { % => Box C 1(R) 0(ColumnMinWidth) ColumnElement - 2 index % => Box C 1(R) 0(ColumnMinWidth) ColumnElement R - 4 index % => Box C 1(R) 0(ColumnMinWidth) ColumnElement R C - 6 index % => Box C 1(R) 0(ColumnMinWidth) ColumnElement R C Box - - table-have-colspan 1 gt { % => Box C R Width Element - pop % => Box C R Width - } { -% dup get-td-dict -% /NoWrap get { -% dup get-max-width -% 1 index get-min-width -% max exch pop -% } { - get-min-width % => Box C R Width CWidth -% } ifelse - max % => Box C R Width' - } ifelse - exch 1 add exch % => Box C R+1 Width' - } forall % => Box C RL Width' - - exch pop % => Box C Width' - 2 index get-hor-extra - sub - - 3 1 roll pop pop % => Width -} def -/get-table-columns-min-widths { % => Box - dup get-table-content-columns % => Box ColumnsList - 1 exch - [] exch % => Box 1(C) [] ColumnsList - { % => Box C [](Widths) Column - 3 index % => Box C Widths Column Box - 3 index % => Box C Widths Column Box C - 3 2 roll % => Box C Widths Box C Column - - get-min-width-table-column % => Box C Widths ColW - exch array-prepend % => Box C Widths - - exch 1 add exch % => Box C+1 TotalMinWidth - } forall % => Box C MinWidth - exch pop % => Box MinWidths - exch pop % => MinWidths -} def -/get-table-columns-max-widths { % => Box - dup get-table-content-columns % => Box ColumnsList - 1 exch - [] exch % => Box 1(C) [] ColumnsList - { % => Box C [](Widths) Column - 3 index % => Box C Widths Column Box - 3 index % => Box C Widths Column Box C - 3 2 roll % => Box C Widths Box C Column - - get-max-width-table-column % => Box C Widths ColW - exch array-prepend % => Box C Widths - - exch 1 add exch % => Box C+1 TotalMinWidth - } forall % => Box C MaxWidth - exch pop % => Box MaxWidths - - % Use column width constraints - column should not be wider its constrained width - 1 index get-width % => Box MaxWidths BW - 2 index table-normalize-cwc % => Box MaxWidths BW CWCs - 2 index % => Box MaxWidths BW CWCs MaxWidths - { 1 index is-fraction - { - 6 index false 3 index exec 3 1 roll pop pop - } - { exch false exch exec } ifelse } - zip-with - exch pop exch pop % => Box MaxWidhts - - exch pop % => MinWidths -} def - -/table-apply-colspans-minw { % => Flags Widths Fun Box - dup table-get-colspans % => Flags Widths Fun Box Colspans - { % => Flags Widths Fun Box Colspan[Size R C] - dup 0 get % => Flags Widths Fun Box Colspan[Size R C] Size - 1 index 1 get % => Flags Widths Fun Box Colspan[Size R C] Size R - 2 index 2 get % => Flags Widths Fun Box Colspan[Size R C] Size R C -% Calculate colspanned cell width (using appropriate function passed in the stack when -% calling this function) - 4 index % => Flags Widths Fun Box Colspan[Size R C] Size R C Box - table-get-cell-content % => Flags Widths Fun Box Colspan[Size R C] Size Cell - 4 index exec % => Flags Widths Fun Box Colspan[Size R C] Size CellWidth -% apply cell width constraint, if any - 2 index aload pop - 3 2 roll pop % => Flags Widths Fun Box Colspan[Size R C] Size CellWidth R C - 5 index table-get-cwc-raw-at % => Flags Widths Fun Box Colspan[Size R C] Size CellWidth WC - dup false ne { - dup is-fraction { - 4 index no-width-constraint not { - 4 index get-width exch - false exch exec - max - } { - pop - } ifelse - } { - false exch exec - } ifelse - } { - pop - } ifelse % => Flags Widths Fun Box Colspan[Size R C] Size CellWidth' -% now select the pre-calculated widths of columns covered by this cell - 2 index 2 get % => Flags Widths Fun Box Colspan[Size R C] Size CellWidth C - 1 sub % => Flags Widths Fun Box Colspan[Size R C] Size CellWidth C(ZeroBased) - 3 2 roll % => Flags Widths Fun Box Colspan[Size R C] CellWidth C(ZeroBased) Size - 1 index % => Flags Widths Fun Box Colspan[Size R C] CellWidth C Size C - exch % => Flags Widths Fun Box Colspan[Size R C] CellWidth C C Size - 7 index % => Flags Widths Fun Box Colspan[Size R C] CellWidth C C Size Widths - 3 1 roll % => Flags Widths Fun Box Colspan[Size R C] CellWidth C Widths C Size - getinterval % => Flags Widths Fun Box Colspan[Size R C] CellWidth C SWidths -% select the list of resizable columns covered by this cell - 3 2 roll exch % => Flags Widths Fun Box Colspan[Size R C] C CellWidth SWidths - 7 index % => Flags Widths Fun Box Colspan[Size R C] C CellWidth SWidths Flags - 3 index % => Flags Widths Fun Box Colspan[Size R C] C CellWidth SWidths Flags C - 5 index 0 get % => Flags Widths Fun Box Colspan[Size R C] C CellWidth SWidths Flags C Size - getinterval % => Flags Widths Fun Box Colspan[Size R C] C CellWidth SWidths SFlags -% Subtract sum width of non-resizable columns this cell spans over from the cell width -% Non-resizable columns are marked as 'false' in SFlags - 2 copy { - { pop 0 } if - } zip-with sum % => Flags Widths Fun Box Colspan[Size R C] C CellWidth SWidths SFlags Non-resizable-width - 4 3 roll - exch sub -% do not allow target width drop below zero - 0 max - 3 1 roll -% Expand resizable columns to - expand-to-with-flags % => Flags Widths Fun Box Colspan[Size R C] C SWidths' -% store modified widths - 5 index % => Flags Widths Fun Box Colspan[Size R C] C SWidths' Widths - 3 1 roll % => Flags Widths Fun Box Colspan[Size R C] Widths C SWidths' - putinterval % => Flags Widths' Fun Box Colspan[Size R C] - pop % => Flags Widths' Fun Box - } forall % => Flags Widths' Fun Box - pop pop % => Widths' - exch pop -} def - -/table-apply-colspans { % => Widths Fun Box - dup table-get-colspans % => Widths Fun Box Colspans -% Scan all cell spanning several columns - { % => Widths Fun Box Colspan[Size R C] -% Get current colspan contents - dup 0 get % => Widths Fun Box Colspan[Size R C] Size - 1 index 1 get % => Widths Fun Box Colspan[Size R C] Size R - 2 index 2 get % => Widths Fun Box Colspan[Size R C] Size R C - 4 index % => Widths Fun Box Colspan[Size R C] Size R C Box - table-get-cell-content % => Widths Fun Box Colspan[Size R C] Size Cell -% Calculate its width (by calling the appropriate function passed; usually it will be -% get-min-width or get-max-width) - 4 index exec % => Widths Fun Box Colspan[Size R C] Size CellWidth -% apply cell width constraint, if any - 2 index aload pop - 3 2 roll pop % => Flags Widths Fun Box Colspan[Size R C] Size CellWidth R C - 5 index table-get-cwc-raw-at % => Flags Widths Fun Box Colspan[Size R C] Size CellWidth WC - dup false ne { - dup is-fraction { - 4 index no-width-constraint not { - 4 index get-width exch - false exch exec - max - } { - pop - } ifelse - } { - false exch exec - } ifelse - } { - pop - } ifelse % => Flags Widths Fun Box Colspan[Size R C] Size CellWidth' -% Get the width list of columns covered by current column span - 2 index 2 get % => Widths Fun Box Colspan[Size R C] Size CellWidth C - 1 sub % => Widths Fun Box Colspan[Size R C] Size CellWidth C(ZeroBased) - 3 2 roll % => Widths Fun Box Colspan[Size R C] CellWidth C(ZeroBased) Size - 1 index % => Widths Fun Box Colspan[Size R C] CellWidth C Size C - exch % => Widths Fun Box Colspan[Size R C] CellWidth C C Size - 7 index % => Widths Fun Box Colspan[Size R C] CellWidth C C Size Widths - 3 1 roll % => Widths Fun Box Colspan[Size R C] CellWidth C Widths C Size - getinterval % => Widths Fun Box Colspan[Size R C] CellWidth C SWidths -% expand these columns to fit spanned data - 3 2 roll exch % => Widths Fun Box Colspan[Size R C] C CellWidth SWidths - expand-to % => Widths Fun Box Colspan[Size R C] C SWidths' -% Store changed widths - 5 index % => Widths Fun Box Colspan[Size R C] C SWidths' Widths - 3 1 roll % => Widths Fun Box Colspan[Size R C] Widths C SWidths' - putinterval % => Widths' Fun Box Colspan[Size R C] - pop % => Widths' Fun Box - } forall % => Widths' Fun Box - pop pop % => Widths' -} def -/table-column-widths { % => Box - dup get-width % => Box Width - table-columns-fit -} def -/table-columns-fit { % => Box Widht -% Check if there's any columns in table - 1 index get-table-content-columns - length 0 gt { - in-table-columns-fit - } { - pop pop [] - } ifelse -} def - -% columns-fit helper function -/fit-cwidth { % => MW MCW TW-TCW TMCW-TMW - 2 index - 4 index - sub % => MW MCW TW-TCW TMCW-TMW MCW-MW - exch div % => MW MCW TW-TCW MCW-MW/TMCW-TMW - mul - add -% to avoid problems with negative cell widths - 0 max - exch pop -} def -/in-table-columns-fit { % => Box Width - 1 index - get-table-content-columns % => Box Width Columns - - 2 index % => Box Width Columns Box - get-table-columns-min-widths % => Box Width Columns MinWidths - - 3 index - get-table-columns-max-widths % => Box Width Columns MinWidths MaxWidths - - 1 index - { max } - zip-with - -% Use data on the spanned cells -% exch % => Box Width Columns MaxWidths MinWidths -% 2 copy { ne } zip-with % => Box Width Columns MaxWidths MaxWidths [MaxWidthsCi<>MinWidthsCi] -% exch % => Box Width Columns MaxWidths ResizableFlags MinWidths - -% { get-min-width } 6 index % => Box Width Columns ManWidths ResizableFlags MinWidths Fun Box -% table-apply-colspans-minw % => Box Width Columns MaxWidths MinWidth -% exch % => Box Width Columns MinWidth MaxWidths -% { get-max-width } 5 index % => Box Width Columns MinWidth MaxWidths Fun Box -% table-apply-colspans % => Box Width Columns MinWidth MaxWidths - - 3 2 roll - pop % => Box Width MinWidths MaxWidths - -% Apply column width constraints to minimum widths - 2 index % => Box Width MinWidths MaxWidths BW - 4 index table-normalize-cwc % => Box Width MinWidths MaxWidths BW CWCs - 3 index % => Box Width MinWidths MaxWidths BW CWCs MinWidths - { 1 index is-fraction - { - 6 index false 3 index exec 3 1 roll pop pop - } - { exch false exch exec } ifelse } - zip-with - exch pop - -% Apply column width constraints to maximum widths - 3 index % => Box Width MinWidths MaxWidths MinWidthsC BW - 5 index table-normalize-cwc % => Box Width MinWidths MaxWidths MinWidthsC BW CWCs - 3 index % => Box Width MinWidths MaxWidths MinWidthsC BW CWCs maxWidth - { 1 index is-fraction - { - % 6 index = BW - 6 index false 3 index exec 3 1 roll pop pop - } - { exch false exch exec } ifelse } - zip-with - exch pop % => ox Width MinWidths MaxWidths MinWidthsC MaxWidths - -% Do not allow constrained max width be less than min width - 3 index - { max } - zip-with % => Box Width MinWidths MaxWidths MinWidthsC MaxWidthsC - -% Do not allow constrained min width be less than min width - 3 index - 2 index - { max } - zip-with % => Box Width MinWidths MaxWidths MinWidthsC MaxWidthsC W' - - 3 2 roll % => Box Width MinWidths MaxWidths MaxWidthsC W' MinWidthsC - pop % => Box Width MinWidths MaxWidths MaxWidthsC W' - exch % => Box Width MinWidths MaxWidths MinWidthsC' MaxWidthsC - -% Check if sum of constrained widths is too big -% Note that we compare sum of constrained width with the MAXIMAL value of table width and -% sum of uncostrained minimal width; it will prevent from unneeded collapsing of table cells -% if table content will expand its width anyway - 1 index sum % => Box Width MinWidths MaxWidths MinWidthsC' MaxWidthsC SUM(MinWidthsC') -% find the "template" value - 5 index - 5 index sum - max -% compare - gt { -% now we should scale columns to fit table width - 1 index sum -% find template value - 5 index - 5 index sum - max - -% Calculate the amount if difference between minimal and constrained minimal width for each columns - exch sub % => Box Width MinWidths MaxWidths MinWidthsC MaxWidthsC Width-MinWC - 4 index % => Box Width MinWidths MaxWidths MinWidthsC MaxWidthsC Width-MinWC MinWidth - 3 index % => Box Width MinWidths MaxWidths MinWidthsC MaxWidthsC Width-MinWC MinWidth MinWidthC - {exch sub} zip-with sum % => Box Width MinWidths MaxWidths MinWidthsC MaxWidthsC Width-MinWC CWDelta - dup 0 gt { - 5 index % => Box Width MinWidths MaxWidths MinWidthsC MaxWidthsC Width-MinWC CWDelta MinW - 4 index % => Box Width MinWidths MaxWidths MinWidthsC MaxWidthsC Width-MinWC CWDelta MinW MinWC - 4 2 roll % => Box Width MinWidths MaxWidths MinWidthsC MaxWidthsC MinW MinWC Width-MinWC CWDelta - /fit-cwidth cvx % => Box Width MinWidths MaxWidths MinWidthsC MaxWidthsC MinW MinWC Width-MinWC CWDelta cit-cwidth - 3 array astore cvx % => Box Width MinWidths MaxWidths MinWidthsC MaxWidthsC MinW MinWC {Width-MinWC CWDelta cit-cwidth} - zip-with % => Box Width MinWidths MaxWidths MinWidthsC MaxWidthsC MinWC' - exch 3 2 roll pop % => Box Width MinWidths MaxWidths MinWC' MaxWidthsC - } { -% if no difference is found, we can collapse no columns - pop pop % => Box Width MinWidths MaxWidths MinWidthsC MaxWidthsC - } ifelse - } if - -% Use data on the spanned cells (again) - exch % => Box Width MinWidths MaxWidths MaxWidthsC MinWidthsC - 2 copy { ne } zip-with % => Box Width MinWidths MaxWidths MaxWidthsC MinWidthsC [MaxWidthsCi<>MinWidthsCi] - exch % => Box Width MinWidths MaxWidths MaxWidthsC ResizableFlags MinWidthsC - - { get-min-width } 7 index % => Box Width MinWidths MaxWidths MaxWidthsC ResizableFlags MinWidthsC Fun Box - table-apply-colspans-minw % => Box Width MinWidths MaxWidths MaxWidthsC MinWidthC - exch % => Box Width MinWidths MaxWidths MinWidthC MaxWidthsC - { get-max-width } 6 index % => Box Width MinWidths MaxWidths MinWidthC MaxWidthsC Fun Box - table-apply-colspans % => Box Width MinWidths MaxWidths MinWidthC MaxWidthsC - -% Calculate actual widths -% Prepare width array - [] - 1 index length 0 - array-extend % => Box Width MinWidths MaxWidths MinWidthsC' MaxWidthsC Widths - -% First pass - calculate widths for all constrained columns - 6 index table-normalize-cwc % => Box Width MinWidths MaxWidths MinWidthsC' MaxWidthsC Widths CWCs - - 0 1 2 index length 1 sub { % => Box Width MinWidths MaxWidths MinWidthsC' MaxWidthsC Widths CWCs I - 2 copy get - is-constrained-column { - 2 index - 1 index - 6 index 3 index get - put - } if - - pop - } for - -% Quick fix for overconstrained tables: if table have width attribute AND its value is less than sum -% of constrained columns widths plus minimal widths of uncostrained columns, then we'll expand the width of table -% to fit all columns -% 1. calculate sum of constrained column widths - 1 index sum % => Box Width MinWidths MaxWidths MinWidthsC' MaxWidthsC Widths CWCs SumConW -% 2. calculate sum of unconstrained column minimal widths - 2 index - 7 index - { 1 index 0 gt { pop pop 0 } { exch pop } ifelse } - zip-with sum % => Box Width MinWidths MaxWidths MinWidthsC' MaxWidthsC Widths CWCs SumConW SumUnconW -% 3. compare these widths with the table width - add - dup 8 index gt { % => Box Width MinWidths MaxWidths MinWidthsC' MaxWidthsC Widths CWCs SumConW+SumUnconW - 8 7 roll pop - 7 1 roll - } { - pop - } ifelse - -% Second pass - distribute the rest of the width - -% Explanation of the stuff below (I've really had problems with this small piece of code, especially -% when I was trying to fix "bugs" inside it) -% -% First of all, no column can be narrower than it minimal width (determined by its content) -% Note that constrained columns have their widths distributed above, so we can exclude them for now -% (just throw them out and imagine that table does not contain any width-constrained cols) -% -% Second, the relative widths of columns will have _appoximately_ the same ratio as -% their maximal content widths. (In exception of cases where the first rule will take place - -% say for the table containing two columns with the VERY long text in the first and one or two words -% in the second) -% -% In general, this approach can be inoptimal in case of _very_ different font sizes -% inside the cells, of, say big images; nevertheless, it will give a good approximate -% AND still fast enough (unlike fully correct methods involving evaluation of the content height of the cell) -% -% Thus, we do the following: -% - calculate the ratio of current column MAXIMAL ($current_max) width to the sum of MAXIMAL widths of all columns left -% (inluding current) second rule applied. Note that we need remember about column spans and select -% maxw or maxwc in order. -% - then check if the rest of width will be too small for other columns to fit and decrease current columns -% width (see MIN function call) -% - then check again if our width will be too small for current column to fit (and expand if nesessary) - -% MAX function call - - 0 1 2 index length 1 sub { % => Box Width MinWidths MaxWidths MinWidthsC' MaxWidthsC Widths CWCs I - 2 copy get -% Process only uncostrained columns - is-constrained-column not { - 2 index - 1 index % => Box Width MinWidths MaxWidths MinWidthsC' MaxWidthsC Widths CWCs I Widths I -% Get undistibuted width (total table width - width of constrained columns) - 9 index % => Box Width MinWidths MaxWidths MinWidthsC' MaxWidthsC Widths CWCs I Widths I Width - 2 index sum sub % => Box Width MinWidths MaxWidths MinWidthsC' MaxWidthsC Widths CWCs I Widths I WidthRest -% Get max width of column being processed - 8 index 2 index get % => Box Width MinWidths MaxWidths MinWidthsC' MaxWidthsC Widths CWCs I Widths I WidthRest MaxW - 7 index 3 index get max % => Box Width MinWidths MaxWidths MinWidthsC' MaxWidthsC Widths CWCs I Widths I WidthRest MaxW -% If width is equal to zero, use max constrained width, as this column could be covered by colspan; -% If not, we lose nothing, because all constrained columns are already processed earlier, and no more -% columns except these two types can have different constrained and raw widths - dup 0 eq { - pop - 6 index 2 index get - } if -% Get sum of maximal constrained widths of unplaced columns - 3 index % => Box Width MinWidths MaxWidths MinWidthsC' MaxWidthsC Widths CWCs I Widths I WidthRest MaxW Widths - 8 index % => Box Width MinWidths MaxWidths MinWidthsC' MaxWidthsC Widths CWCs I Widths I WidthRest MaxW Widths MaxWidthsC - { 1 index 0 eq {exch pop} {pop pop 0} ifelse } - zip-with - sum % => Box Width MinWidths MaxWidths MinWidthsC' MaxWidthsC Widths CWCs I Widths I WidthRest MW MWR -% Get sum of minimal constrained widths of unplaced columns - 4 index % => Box Width MinWidths MaxWidths MinWidthsC' MaxWidthsC Widths CWCs I Widths I WidthRest MaxW MaxWR Widths - 10 index % => Box Width MinWidths MaxWidths MinWidthsC' MaxWidthsC Widths CWCs I Widths I WidthRest MaxW MaxWR Widths MaxWidthsC - { 1 index 0 eq {exch pop} {pop pop 0} ifelse } - zip-with - sum % => Box Width MinWidths MaxWidths MinWidthsC' MaxWidthsC Widths CWCs I Widths I WidthRest MaxW MaxWR MinWR - 3 index exch sub % => Box Width MinWidths MaxWidths MinWidthsC' MaxWidthsC Widths CWCs I Widths I WidthRest MaxW MaxWR WidthRest-MinWR -% add current columns min width - 12 index 5 index get - 11 index 6 index get max - add - 4 1 roll % => Box Width MinWidths MaxWidths MinWidthsC' MaxWidthsC Widths CWCs I Widths I WidthRest-MinWR WidthRest MaxW MaxWR -% If some unplaced columns have maximal (constrained width) greater zero - dup 0 gt { -% Calculate the appropriate fraction of free table width for the current column - div % => Box Width MinWidths MaxWidths MinWidthsC' MaxWidthsC Widths CWCs I Widths I WidthRest-MinWR WidthRest MinWE MaxW MaxWR - mul % => Box Width MinWidths MaxWidths MinWidthsC' MaxWidthsC Widths CWCs I Widths I WidthRest-MinWR W(WidthRest*MW/MWR) - min -% Remove minimal width of current column; -% 9 index 2 index get -% sub -% This will make calculated width not less than raw minimal column with. See also line marked with (*) -% 0 max - } { - pop pop pop pop 0 - } ifelse -% (*) Add the minimal width of current column - 9 index 2 index get - dup 0 eq { - pop - 7 index 2 index get - } if - max % => Box Width MinWidths MaxWidths MinWidthsC' MaxWidthsC Widths CWCs I Widths I W - - put - } if - - pop - } for - pop % => Box Width MinWidths MaxWidths MinWidthsC' MaxWidthsC Widths - -% in case of overconstrained table (e.g. two columns with 20% widths), expand them - dup sum % => Box Width MinWidths MaxWidths MinWidthsC' MaxWidthsC Widths SumWidth - dup 0 gt { - 6 index - exch div - dup 1 gt { - map-scale - } { pop } ifelse - } { - pop - } ifelse % => Box Width MinWidths MaxWidths MinWidthsC' MaxWidthsC Widths - -% now - the last attempt; if total width is less than box width, just expand the very first column to fit - dup sum 6 index lt { - dup sum % => Box Width MinWidths MaxWidths MinWidthsC' MaxWidthsC Widths SumWidth - 6 index - exch sub % => Box Width MinWidths MaxWidths MinWidthsC' MaxWidthsC Widths Delta - 1 index 0 get % => Box Width MinWidths MaxWidths MinWidthsC' MaxWidthsC Widths Delta W0 - add % => Box Width MinWidths MaxWidths MinWidthsC' MaxWidthsC Widths W0' - 1 index exch - 0 exch put % => Box Width MinWidths MaxWidths MinWidthsC' MaxWidthsC Widths - } if - - 7 1 roll - pop pop pop - pop pop pop -} def - -% Modify heights of table cells spanning several rows -/table-fit-rowspans { % => Table - dup table-rows-heights % => Table RHs - 1 index table-get-rowspans % => Table RHs RS -% scan all cells spanning several rows - { % => Table RHs RowSpan -% calculate the bottom edge of current cell - aload pop % => Box RHs Span R C - 2 copy % => Box RHs Span R C R C - 6 index % => Box RHs Span R C R C Box - table-get-cell-content % => Box RHs Span R C Cell - { - get-bottom - min - } - 1 index get-top - 2 index get-content - reduce -% reset the height of the cell to its content height (as it have been probably fitted to the top row spanned-over) - 1 index get-top - sub neg - 1 index put-height - -% now check if cell height is less than sum spanned rows height - dup get-full-height % => Box RHs Span R C Cell CellFH - 5 index % => Box RHs Span R C Cell CellFH RHs - 4 index 1 sub % => Box RHs Span R C Cell CellFH RHs R - 6 index % => Box RHs Span R C Cell CellFH RHs R Span - getinterval sum % => Box RHs Span R C Cell CellFH RowH - - 2 copy lt { -% vertical-align current cell -% calculate (approximate) row baseline - 6 index % => Box RHs Span R C Cell CellFH RowH RHs - 0 6 index 1 sub % => Box RHs Span R C Cell CellFH RowH RHs 0 R(ZeroBased) - getinterval sum neg % => Box RHs Span R C Cell CellFH RowH -SpannedRHs - 8 index get-top-internal - add % => Box RHs Span R C Cell CellFH RowH RBaseline -% calculate row middle coordinate - dup 2 index 2 div sub % => Box RHs Span R C Cell CellFH RowH RBaseline Middle - - 2 index - 2 index - 2 index - 7 index - - apply-valign - - pop pop - -% Make cell fill all available vertical space - dup % => Box RHs Span R C Cell CellFH RowH RowH - 3 index - put-full-height % => Box RHs Span R C Cell CellFH RowH - - pop pop pop - } { - pop pop pop - } ifelse % => Box RHs Span R C - pop pop pop - } forall - pop pop -} def - -/table-have-colspan { % => Row Col Table - table-get-colspans - 1 % => Row Col Spans 1 - exch % => Row Col 1 Spans - { % => Row Col CS Span - dup 1 get % => Row Col CS Span Row - 1 index 2 get % => Row Col CS Span Row Col - 4 index eq % => Row Col CS Span Row CEq - exch % => Row Col CS Span CEq Row - 5 index eq % => Row Col CS Span CEq REq - and % => Row Col CS Span Match - { - 0 get exch pop - } { - pop - } ifelse - } forall % => Row Col CS - 3 1 roll % => CS Row Col - pop pop % => CS -} def - -/table-have-rowspan { % => Row Col Table - table-get-rowspans - 1 % => Row Col Spans 1 - exch % => Row Col 1 Spans - { % => Row Col CS Span - dup 1 get % => Row Col CS Span Row - 1 index 2 get % => Row Col CS Span Row Col - 4 index eq % => Row Col CS Span Row CEq - exch % => Row Col CS Span CEq Row - 5 index eq % => Row Col CS Span CEq REq - and % => Row Col CS Span Match - { - 0 get exch pop - } { - pop - } ifelse - } forall % => Row Col CS - 3 1 roll % => CS Row Col - pop pop % => CS -} def - -/table-mark-rowspan { % => Table SpanSize - 1 index - get-table-content-rows % => Table SpanSize Rows - dup length % => Table SpanSize Rows CurRow - 1 index array-last % => Table SpanSize Rows CurRow LastRow - length % => Table SpanSize Rows CurRow CurColumn - 3 2 roll pop % => Table SpanSize CurRow CurColumn - 3 index % => Table SpanSize CurRow CurColumn Table - table-add-rowspan % => Table -} def - -/table-mark-colspan { % => Table SpanSize - 1 index - get-table-content-rows % => Table SpanSize Rows - dup length % => Table SpanSize Rows CurRow - 1 index array-last % => Table SpanSize Rows CurRow LastRow - length % => Table SpanSize Rows CurRow CurColumn - 3 2 roll pop % => Table SpanSize CurRow CurColumn - 3 index % => Table SpanSize CurRow CurColumn Table - table-add-colspan % => Table -} def - -/normalize-row { % => Length Row - aload length % => Length R1 .. RN N - dup % => Length R1 .. RN N N - dup 2 add % => Length R1 .. RN N N N+2 - index % => Length R1 .. RN N N Length - exch sub dup % => Length R1 .. RN N Delta Delta - replicate-row % => Length R1 .. RN N []..[] Delta 0 - pop % => Length R1 .. RN N []..[] Delta - dup 2 add % => Length R1 .. RN N []..[] Delta Delta+2 - dup 1 sub % => Length R1 .. RN N []..[] Delta Delta+2 Delta+1 - roll % => Length R1 .. RN []..[] Delta N - add % => Length R1 .. RN []..[] Delta+N - array astore % => Length Row' - exch pop % => Row' -} def - -/table-slide-cw { % => R C Box - dup table-get-cwc-raw % => R C Box RawCWCS - { % => R C Box RawCWC - aload % => R C Box !C !R WC [!C !R WC] - 2 index 7 index eq { - 3 index 6 index ge { - dup - 0 5 index 1 add put % => R C Box !C !R WC [!C+1 !R WC] - } if - } if % => R C Box !C !R WC [!C !R WC] - pop pop pop pop - } forall - - pop pop pop -} def - -/do-slide-rs { % => ... RS' [SS SR SC] R C - 2 index 1 get % => ... RS' [SS SR SC] R C SR - 2 index eq { % => ... RS' [SS SR SC] R C - 2 index 2 get % => ... RS' [SS SR SC] R C SC - 1 index ge { % => ... RS' [SS SR SC] R C - 2 index 2 get % => ... RS' [SS SR SC] R C SC - 1 add % => ... RS' [SS SR SC] R C SC+1 - 3 index exch - 2 exch % => ... RS' [SS SR SC] R C [..] 2 SC+1 - put % => ... RS' [SS SR SC+1] R C -% FIXME: reorder rowspans after this operation? - } if - } if - - pop pop - exch array-prepend -} def - -/table-slide-rs { % => R C Box - 2 index 2 index /do-slide-rs % => R C Box {fun} - cvx 3 array astore cvx - [] - 2 index table-get-rowspans - reduce - - 1 index table-put-rowspans % => R C Box - - pop pop pop % => -} def - -/do-slide-cs { % => ... RS' [SS SR SC] R C - 2 index 1 get % => ... RS' [SS SR SC] R C SR - 2 index eq { % => ... RS' [SS SR SC] R C - 2 index 2 get % => ... RS' [SS SR SC] R C SC - 1 index ge { % => ... RS' [SS SR SC] R C - 2 index 2 get % => ... RS' [SS SR SC] R C SC - 1 add % => ... RS' [SS SR SC] R C SC+1 - 3 index exch - 2 exch % => ... RS' [SS SR SC] R C [..] 2 SC+1 - put % => ... RS' [SS SR SC+1] R C -% FIXME: reorder rowspans after this operation? - } if - } if - - pop pop - exch array-prepend -} def - -/table-slide-cs { % => R C Box - 2 index 2 index /do-slide-cs % => R C Box {fun} - cvx 3 array astore cvx - [] - 2 index table-get-colspans - reduce - - 1 index table-put-colspans % => R C Box - - pop pop pop % => -} def - -/table-fake-cell { % => R C Box - 3 copy - table-slide-cw % => R C Box - 3 copy - table-slide-rs % => R C Box - 3 copy - table-slide-cs % => R C Box - - dup - get-table-content-rows % => R C Box Rows - dup % => R C Box Rows Rows - 4 index 1 sub % => R C Box Rows Rows R(0) - dup - 2 index length 1 sub gt { - pop pop pop pop pop pop - } { - get % => R C Box Rows Row - 3 index 1 sub exch % => R C Box Rows C(ZeroBased) Row - box-block-create % => R C Box Rows C Row FBox - {show-fake-block-box} - 1 index put-display - exch % => R C Box Rows C FBox Row - - dup length 3 index lt { - 3 1 roll - array-extend - } { - array-insert % => R C Box Rows Row' - } ifelse - - dup length % => R C Box Rows Row' RL' - 3 index get-content % => R C Box Rows Row' RL' [C R Content] - exch 0 exch % => R C Box Rows Row' [C R Content] 1 RL' - 2 index 0 get max - put - - 4 index 1 sub % => R C Box Rows Row' R(ZeroBased) - exch % => R C Box Rows R(ZeroBased) Row' - put % => R C Box - pop pop pop % => - } ifelse -} def - -/in-normalize-rowspans { % => Size Row Col Box - 3 index 1 gt { - 2 index 1 add % => Size Row Col Box Row+1 - 2 index % => Size Row Col Box Row+1 Col - 2 index - table-fake-cell % => Size Row Col Box - 4 2 roll % => Col Box Size Row - 1 add % => Col Box Size Row+1 - 4 1 roll % => Row+1 Col Box Size - 1 sub % => Row+1 Col Box Size-1 - 4 1 roll % => Size-1 Row+1 Col Box - in-normalize-rowspans % => - } { - pop pop pop pop % => - } ifelse -} def - -/normalize-rowspans { % => Box - dup table-get-rowspans % => Box Rowspans - { % => Box Rowspan - aload pop % => Box Size Row Col - 3 index % => Box Size Row Col Box - in-normalize-rowspans % => Box - } forall % => Box - - dup get-table-content-rows % => Box Rows - length % => Box RN - - 1 index table-get-rowspans % => Box RN Rowspans - { % => Box RN Rowspan - dup 1 get % => Box RN Rowspan RSR - dup % => Box RN Rowspan RSR RSR - 2 index 0 get % => Box RN Rowspan RSR RSR RSS - add 1 sub % => Box RN Rowspan RSR RSR+RSS-1 - 3 index min % => Box RN RowSpan RSR SpanEnd - exch sub 1 add % => Box RN RowSpan SpanSize - 0 exch put % => Box RN - } forall % => Box RN - - pop pop % => -} def - -/normalize-table { % => Box - dup normalize-rowspans - - dup get-content % => Box Content - get-children-from-content % => Box Rows - dup dup % => Box Rows Rows Rows - 0 exch % => Box Rows Rows 0 Rows - { % => Box Rows Rows 0 Row - length - max - } forall % => Box Rows Rows MaxRowLength - - 0 exch % => Box Rows Rows 0 MaxRowLength - 3 2 roll % => Box Rows 0 MaxRowLength Rows - { % => Box Rows RowNo MaxRowLength Row - 1 index exch % => Box Rows RowNo MaxRowLength MaxRowLength Row - normalize-row % => Box Rows RowNo MaxRowLength Row' - 3 index 3 index % => Box Rows RowNo MaxRowLength Row' Rows RowNo - 3 2 roll % => Box Rows RowNo MaxRowLength Rows RowNo Row' - put % => Box Rows RowNo MaxRowLength - exch 1 add exch % => Box Rows RowNo+1 MaxRowLength - } forall - - pop pop pop - pop -} def - -/in-make-table-row { % => RowData Size - dup 0 gt { - 1 index % => RowData Size RowData - aload % => RowData Size Data1 ... DataN Arr - length % => RowData Size Data1 ... DataN N - 1 add % => RowData Size Data1 ... DataN N+1 - [] exch % => RowData Size Data1 ... DataN [] N+1 - array astore % => RowData Size NewRowData - 3 2 roll pop % => Size NewRowData - exch % => NewRowData Size - 1 sub % => NewRowData Size-1 - in-make-table-row - } { - pop - } ifelse -} def - -/make-table-row { % => Size - [] exch % => [](EmptyRow) Size - in-make-table-row -} def - -/in-make-table { % => TableData Cols Rows - dup 0 gt { - 2 index % => TableData Cols Rows TableData - aload % => TableData Cols Rows Data1 ... DataN TableData - length % => TableData Cols Rows Data1 ... DataN N - 1 add % => TableData Cols Rows Data1 ... DataN N+1 - dup 1 add index - make-table-row - exch % => TableData Cols Rows Data1 ... DataN NewRow N+1 - array astore % => TableData Cols Rows NewTableData - 4 3 roll pop % => Cols Rows NewTableData - 3 1 roll % => NewTableData Cols Rows - 1 sub % => NewTableData Cols Rows-1 - in-make-table - } { - pop pop - } ifelse -} def - -/make-table { % => Cols Rows - [] 3 1 roll - in-make-table -} def - -/in-add-table-cell { % => Box Cell - 1 index get-content % => Box Cell [Cols Rows Content](RawContent) - 2 get % => Box Cell Rows - dup length 1 sub % => Box Cell Rows LastIndex - dup - 2 index exch get % => Box Cell Rows LastIndex LastRow - aload length % => Box Cell Rows LastIndex Cell1 .. CellN N - dup 3 add % => Box Cell Rows LastIndex Cell1 .. CellN N N+4 - index exch % => Box Cell Rows LastIndex Cell1 .. CellN Cell N - 1 add - array astore % => Box Cell Rows LastIndex NewRow - dup length % => Box Cell Rows LastIndex NewRow NewRowLength - 5 1 roll % => Box NewRowLength Cell Rows LastIndex NewRow - put - pop % => Box NewRowLength - 1 index get-content - dup 0 get % => Box NewRowLength Content Cols - 3 2 roll % => Box Content Cols NewRowLength - max - 0 exch put % => Box -} def - -/add-table-cell { % => Table Child - 1 index is-table { -% setup parent reference in the child box - dup get-box-dict - /Parent 3 index put -% set display property - dup get-box-dict - /Display /table-cell put - -% Check if any rows have been added to the table -% Add one if no rows still exists - 1 index get-table-content-rows % => Rows - length 0 eq { - 1 index add-table-row pop - } if - - 2 copy - in-add-table-cell % => Table Child Table - pop % => Table Child - -% If table-cell had width constaint, propagate it to the column - dup no-width-constraint not { - dup get-width-constraint - 2 index put-table-column-width-constraint - {wc-none} 1 index put-width-constraint - } if - pop - } { -% if parent is not a table, just ignore this box - pop - } ifelse -} def +% $Header: /cvsroot/html2ps/postscript/table.ps,v 1.1 2005/12/18 07:21:38 Konstantin Exp $ + +/table-get-row-height-constraints {% => Box + get-table-content-rows % => Rows + { + row-get-height-constraint + exch + array-append + } + [] + 2 index + reduce % => Rows RHCs + + exch pop % => RHCs +} def + +/put-table-column-width-constraint % => WC Box +{ + dup is-table { + dup table-get-cwc-raw % => WC Box CWC + 1 index get-current-column + 1 add % => WC Box CWC CC(1-based) + 2 index get-table-content-rows % => WC Box CWC CC Rows + length % => WC Box CWC CC CR + 4 index % => WC Box CWC CC CR WC + 3 array astore % => WC Box CWC [CC CR WC] + exch array-prepend % => WC Box CWC' + 1 index table-put-cwc-raw % => WC Box + } if + pop pop + +} def +/table-get-cwc { % => Table + [] % => Table [](CWC) + + 1 index get-current-column + dup 0 ge { + 1 add + + {wc-none} + array-extend + + 1 index table-get-cwc-raw % => Table CWC RawCWCS + { % => Table CWC RawCWC[CC CR WC] + aload pop % => Table CWC CC CR WC + +% Ignore column-width constraints for colspanned columns + 1 index + 3 index + 6 index + table-have-colspan 1 eq { + exch pop % => Table CWC CC WC + exch 1 sub exch % => Table CWC CC(0-based) WC + 2 index length 2 index 1 add lt { + 3 1 roll {wc-none} + array-extend % => Table WC CWC' + array-prepend % => Table CWC'' + } { + 2 index + 3 1 roll + put + } ifelse + } { + pop pop pop + } ifelse + } forall + exch pop + } { + pop pop pop [] + } ifelse +} def + +% Get the cell-width constraint +% @param R row number (zero based) +% @param C column number (zero based) +% @param Table table being processed +% returns false if no constraint; WC function if constraint have been found +/table-get-cwc-raw-at { % => R C Table + [] % => R C Table [] + 1 index table-get-cwc-raw { % => R C Table [] CurrentWC + aload pop % => R C Table [] C' R' WC + + 6 index 2 index eq + 6 index 4 index eq and { % => R C Table [] C' R' WC + exch pop + exch pop + exch array-append % => R C Table [WC] + + } { + pop pop pop + } ifelse % => R C Table [WC] + } forall + + 4 1 roll + pop pop pop + + dup length 0 gt { + 0 get + } { + pop false + } ifelse +} def + +/table-get-cwc-raw { % => Table + get-content % => Content + 5 get % => CWC +} def +/table-put-cwc-raw { % => CWC Table + get-content % => CWC Content + 5 % => CWC Content 5 + 3 2 roll % => Content 5 CWC + put % => +} def +/make-table-box { % => W Cols Rows + 0 3 1 roll % => W 0(H) Cols Rows + 2 copy make-table + [] [] % => W 0(H) Cols Rows [] [](ColSpans) [](RowSpans) + [] % => W 0(H) Cols Rows [] [](ColSpans) [](RowSpans) [](ColumnWidthConstraints) + 6 array astore % => W 0(H) [Cols Rows [] [](ColSpans) [](RowSpans)](Content) + 0 0 0 0 + 5 4 roll % => W H 0 0 0 0 Content + 0 % => W H 0 0 0 0 Content 0(Baseline) + /show-table-box % => W H 0 0 0 0 Content 0(Baseline) DisplayFun + 0 % => W H 0 0 0 0 Content 0(Baseline) DisplayFun 0(DefaultBaseline) + [0 0 0 0] + make-box + {flow-table} 1 index put-flow-fun +% Mark box as table + dup get-box-dict + /Display /table put +} def +/make-default-table-box { % => W + 0 0 make-table-box + dup get-box-dict + /Width get + /Auto false put +} def + +% PREDICATES +/is-constrained-column { % => WC + 0 get /wc-none cvx ne +} def % => Flag + +% ROW-RELATED +/table-fit-row { % => R Row Box ColsWidth +% Get total height of current row + 3 2 roll % => R Box ColsWidth Row + + 2 index +% table-row-height accepts 1-based row indices + 4 index 1 add + 2 index + table-row-height % => R Box ColsWidth Row RH + +% Get current Y coordinate (indicated the bottom edge of current row) + dup 2 div + 4 index get-current-y +% Calculate middle Y coordinate of this row + exch sub % => R Box ColsWidth Row RH Middle + +% Row baseline information + 2 index get-row-baseline % => R Box ColsWidth Row RH Middle RBaseline + exch + 4 3 roll % => R Box ColsWidth RH RBaseline Middle Row + + { % => R Box ColsWidth RH RBaseline Middle Cell + 4 copy + apply-valign % => R Box ColsWidth RH RBaseline Middle Cell + +% extend cell height to fit the row vertically + 1 index % => R Box ColsWidth RH RBaseline Middle Cell Middle + 6 index get-current-y % => R Box ColsWidth RH RBaseline Middle Cell Middle CY + + exch sub % => R Box ColsWidth RH RBaseline Middle Cell H/2 + 2 mul % => R Box ColsWidth RH RBaseline Middle Cell H + dup 2 index + get-full-height % => R Box ColsWidth RH RBaseline Middle Cell H H CellH + gt { % => R Box ColsWidth RH RBaseline Middle Cell H + 2 copy exch + put-full-height % => R Box ColsWidth RH RBaseline Middle Cell H + } if +% align the top edge of extended cell with the row top edge + 2 div 2 index exch + add % => R Box ColsWidth RH RBaseline Middle Cell TY + 1 index put-top + pop + } forall % => R Box ColsWidth RH RBaseline Middle + + pop pop pop pop pop pop % => +} def +/table-row-height { % => Box R Row + 1 exch % => Box R 1(C) Row + 0 exch % => Box R 1(C) 0(H) Row + { % => Box R C H Cell + 3 index + 3 index % => Box R C H Cell R C + 6 index % => Box R C H Cell R C Box + table-have-rowspan % => Box R C H Cell Span + 1 le { + get-full-height + max % => Box R C H + } { + pop + } ifelse % => Box R C H + exch 1 add exch % => Box R C+1 H + } forall % => Box R C+1 H + 4 1 roll + pop pop pop % => H +} def +/in-table-resize-rows { % => Box R OY RHs Rows + dup length 0 gt { % => Box R OY RHs Rows + 1 index 0 get % => Box R OY RHs Rows H + + 1 index 0 get % => Box R OY RHs Rows H Row + 5 index % => Box R OY RHs Rows H Row R + 7 index % => Box R OY RHs Rows H Row R Box + exch % => Box R OY RHs Rows H Row Box R + 3 2 roll % => Box R OY RHs Rows H Box R Row + table-row-height % => Box R OY RHs Rows H OldH + 7 1 roll % => OldH Box R OY RHs Rows H + + 1 index 0 get % => OldH Box R OY RHs Rows H Row + + dup get-row-baseline + exch % => OldH Box R OY RHs Rows H RowBaseLine Row + + { % => OldH Box R OY RHs Rows H RowBaseLine Cell +% align top edge of the expanded cell and the top edge of row +% note that table content already have vertical alignment, so it should not +% be affected by this action + dup get-left % => OldH Box R OY RHs Rows H RowBaseLine Cell X + 8 index get-top-internal + 7 index sub % => OldH Box R OY RHs Rows H RowBaseLine Cell X Y + 2 index + move-to-box % => OldH Box R OY RHs Rows H RowBaseLine Cell + +% re-try to vertical align the cell contents using new row height + 1 index % => OldH Box R OY RHs Rows H RowBaseLine Cell RowBaseline + 8 index get-top + 7 index sub + 4 index 2 div + sub % => OldH Box R OY RHs Rows H RowBaseLine Cell Baseline Middle + 2 index % => OldH Box R OY RHs Rows H RowBaseLine Cell Baseline Middle Cell + 5 index 4 1 roll % => OldH Box R OY RHs Rows H RowBaseLine Cell H Baseline Middle Cell + + apply-valign % => OldH Box R OY RHs Rows H RowBaseLine Cell + +% expand cell to the row height + 2 index + 1 index % => OldH Box R OY RHs Rows H RowBaseLine Cell H Cell + put-full-height % => OldH Box R OY RHs Rows H RowBaseLine Cell + + pop + } forall % => OldH Box R OY RHs Rows H RowBaseLine + pop % => OldH Box R OY RHs Rows H + +% Calculate new offset from the table top (old offset+current row height) + 7 6 roll % => Box R OY RHs Rows H OldH + pop % => Box R OY RHs Rows H + 4 3 roll % => Box R RHs Rows H OY + add % => Box R RHs Rows OY' +% remove processed element for row array + 3 1 roll % => Box R OY' RHs Rows + array-pop-first % => Box R OY RHs Rows' +% remove processed element for row heights array + 4 1 roll + array-pop-first % => Box Rows' R OY RHs' +% increase row index + 4 2 roll + 1 add % => Box OY RHs' Rows' R+1 +% process next row recusively + 4 1 roll % => Box R+1 OY RHs' Rows' + + in-table-resize-rows + } if +} def +/table-resize-rows { % => Box RHs + dup sum % => Box RHs FH + 2 index put-height % => Box RHs + 1 exch % => Box 1(R) RHs + 0 exch % => Box 1(R) 0(Ofs) RHs + 3 index + get-table-content-rows % => Box 1(R) 0(Ofs) RHs Rows + in-table-resize-rows % => Box 1(R) OY [] [] + pop pop pop pop pop +} def +/table-rows-heights { % => Box + dup get-table-content-rows % => Box Rows + [] exch % => Box [](Heights) Rows + 1 exch % => Box [](Heights) 1(R) Rows + { % => Box Heights R Row + 1 index exch % => Box Heights R R Row + 4 index 3 1 roll % => Box Heights R Box R Row + table-row-height % => Box Heights R H + 2 index array-prepend % => Box Heights R Heights' + 3 1 roll % => Box Heights' Heights R + exch pop % => Box Heights R + 1 add % => Box Heights R+1 + } forall % => Box Heights R + pop + exch pop % => Heights +} def + +% Modify minimal column width using column span information +/get-max-width-table-column { % => Box C Column + 1 exch + 0 exch { % => Box C 1(R) 0(ColumnMinWidth) ColumnElement + 2 index % => Box C 1(R) 0(ColumnMinWidth) ColumnElement R + 4 index % => Box C 1(R) 0(ColumnMinWidth) ColumnElement R C + 6 index + table-have-colspan 1 gt { % => Box C R Width Element + pop % => Box C R Width + } { + get-max-width % => Box C R Width CWidth + max % => Box C R Width' + } ifelse + exch 1 add exch % => Box C R+1 Width' + } forall % => Box C RL Width' + + exch pop % => Box C Width' + 2 index get-hor-extra + sub + + 3 1 roll pop pop % => Width +} def +/get-min-width-table-column { % => Box C Column + 1 exch + 0 exch { % => Box C 1(R) 0(ColumnMinWidth) ColumnElement + 2 index % => Box C 1(R) 0(ColumnMinWidth) ColumnElement R + 4 index % => Box C 1(R) 0(ColumnMinWidth) ColumnElement R C + 6 index % => Box C 1(R) 0(ColumnMinWidth) ColumnElement R C Box + + table-have-colspan 1 gt { % => Box C R Width Element + pop % => Box C R Width + } { +% dup get-td-dict +% /NoWrap get { +% dup get-max-width +% 1 index get-min-width +% max exch pop +% } { + get-min-width % => Box C R Width CWidth +% } ifelse + max % => Box C R Width' + } ifelse + exch 1 add exch % => Box C R+1 Width' + } forall % => Box C RL Width' + + exch pop % => Box C Width' + 2 index get-hor-extra + sub + + 3 1 roll pop pop % => Width +} def +/get-table-columns-min-widths { % => Box + dup get-table-content-columns % => Box ColumnsList + 1 exch + [] exch % => Box 1(C) [] ColumnsList + { % => Box C [](Widths) Column + 3 index % => Box C Widths Column Box + 3 index % => Box C Widths Column Box C + 3 2 roll % => Box C Widths Box C Column + + get-min-width-table-column % => Box C Widths ColW + exch array-prepend % => Box C Widths + + exch 1 add exch % => Box C+1 TotalMinWidth + } forall % => Box C MinWidth + exch pop % => Box MinWidths + exch pop % => MinWidths +} def +/get-table-columns-max-widths { % => Box + dup get-table-content-columns % => Box ColumnsList + 1 exch + [] exch % => Box 1(C) [] ColumnsList + { % => Box C [](Widths) Column + 3 index % => Box C Widths Column Box + 3 index % => Box C Widths Column Box C + 3 2 roll % => Box C Widths Box C Column + + get-max-width-table-column % => Box C Widths ColW + exch array-prepend % => Box C Widths + + exch 1 add exch % => Box C+1 TotalMinWidth + } forall % => Box C MaxWidth + exch pop % => Box MaxWidths + + % Use column width constraints - column should not be wider its constrained width + 1 index get-width % => Box MaxWidths BW + 2 index table-normalize-cwc % => Box MaxWidths BW CWCs + 2 index % => Box MaxWidths BW CWCs MaxWidths + { 1 index is-fraction + { + 6 index false 3 index exec 3 1 roll pop pop + } + { exch false exch exec } ifelse } + zip-with + exch pop exch pop % => Box MaxWidhts + + exch pop % => MinWidths +} def + +/table-apply-colspans-minw { % => Flags Widths Fun Box + dup table-get-colspans % => Flags Widths Fun Box Colspans + { % => Flags Widths Fun Box Colspan[Size R C] + dup 0 get % => Flags Widths Fun Box Colspan[Size R C] Size + 1 index 1 get % => Flags Widths Fun Box Colspan[Size R C] Size R + 2 index 2 get % => Flags Widths Fun Box Colspan[Size R C] Size R C +% Calculate colspanned cell width (using appropriate function passed in the stack when +% calling this function) + 4 index % => Flags Widths Fun Box Colspan[Size R C] Size R C Box + table-get-cell-content % => Flags Widths Fun Box Colspan[Size R C] Size Cell + 4 index exec % => Flags Widths Fun Box Colspan[Size R C] Size CellWidth +% apply cell width constraint, if any + 2 index aload pop + 3 2 roll pop % => Flags Widths Fun Box Colspan[Size R C] Size CellWidth R C + 5 index table-get-cwc-raw-at % => Flags Widths Fun Box Colspan[Size R C] Size CellWidth WC + dup false ne { + dup is-fraction { + 4 index no-width-constraint not { + 4 index get-width exch + false exch exec + max + } { + pop + } ifelse + } { + false exch exec + } ifelse + } { + pop + } ifelse % => Flags Widths Fun Box Colspan[Size R C] Size CellWidth' +% now select the pre-calculated widths of columns covered by this cell + 2 index 2 get % => Flags Widths Fun Box Colspan[Size R C] Size CellWidth C + 1 sub % => Flags Widths Fun Box Colspan[Size R C] Size CellWidth C(ZeroBased) + 3 2 roll % => Flags Widths Fun Box Colspan[Size R C] CellWidth C(ZeroBased) Size + 1 index % => Flags Widths Fun Box Colspan[Size R C] CellWidth C Size C + exch % => Flags Widths Fun Box Colspan[Size R C] CellWidth C C Size + 7 index % => Flags Widths Fun Box Colspan[Size R C] CellWidth C C Size Widths + 3 1 roll % => Flags Widths Fun Box Colspan[Size R C] CellWidth C Widths C Size + getinterval % => Flags Widths Fun Box Colspan[Size R C] CellWidth C SWidths +% select the list of resizable columns covered by this cell + 3 2 roll exch % => Flags Widths Fun Box Colspan[Size R C] C CellWidth SWidths + 7 index % => Flags Widths Fun Box Colspan[Size R C] C CellWidth SWidths Flags + 3 index % => Flags Widths Fun Box Colspan[Size R C] C CellWidth SWidths Flags C + 5 index 0 get % => Flags Widths Fun Box Colspan[Size R C] C CellWidth SWidths Flags C Size + getinterval % => Flags Widths Fun Box Colspan[Size R C] C CellWidth SWidths SFlags +% Subtract sum width of non-resizable columns this cell spans over from the cell width +% Non-resizable columns are marked as 'false' in SFlags + 2 copy { + { pop 0 } if + } zip-with sum % => Flags Widths Fun Box Colspan[Size R C] C CellWidth SWidths SFlags Non-resizable-width + 4 3 roll + exch sub +% do not allow target width drop below zero + 0 max + 3 1 roll +% Expand resizable columns to + expand-to-with-flags % => Flags Widths Fun Box Colspan[Size R C] C SWidths' +% store modified widths + 5 index % => Flags Widths Fun Box Colspan[Size R C] C SWidths' Widths + 3 1 roll % => Flags Widths Fun Box Colspan[Size R C] Widths C SWidths' + putinterval % => Flags Widths' Fun Box Colspan[Size R C] + pop % => Flags Widths' Fun Box + } forall % => Flags Widths' Fun Box + pop pop % => Widths' + exch pop +} def + +/table-apply-colspans { % => Widths Fun Box + dup table-get-colspans % => Widths Fun Box Colspans +% Scan all cell spanning several columns + { % => Widths Fun Box Colspan[Size R C] +% Get current colspan contents + dup 0 get % => Widths Fun Box Colspan[Size R C] Size + 1 index 1 get % => Widths Fun Box Colspan[Size R C] Size R + 2 index 2 get % => Widths Fun Box Colspan[Size R C] Size R C + 4 index % => Widths Fun Box Colspan[Size R C] Size R C Box + table-get-cell-content % => Widths Fun Box Colspan[Size R C] Size Cell +% Calculate its width (by calling the appropriate function passed; usually it will be +% get-min-width or get-max-width) + 4 index exec % => Widths Fun Box Colspan[Size R C] Size CellWidth +% apply cell width constraint, if any + 2 index aload pop + 3 2 roll pop % => Flags Widths Fun Box Colspan[Size R C] Size CellWidth R C + 5 index table-get-cwc-raw-at % => Flags Widths Fun Box Colspan[Size R C] Size CellWidth WC + dup false ne { + dup is-fraction { + 4 index no-width-constraint not { + 4 index get-width exch + false exch exec + max + } { + pop + } ifelse + } { + false exch exec + } ifelse + } { + pop + } ifelse % => Flags Widths Fun Box Colspan[Size R C] Size CellWidth' +% Get the width list of columns covered by current column span + 2 index 2 get % => Widths Fun Box Colspan[Size R C] Size CellWidth C + 1 sub % => Widths Fun Box Colspan[Size R C] Size CellWidth C(ZeroBased) + 3 2 roll % => Widths Fun Box Colspan[Size R C] CellWidth C(ZeroBased) Size + 1 index % => Widths Fun Box Colspan[Size R C] CellWidth C Size C + exch % => Widths Fun Box Colspan[Size R C] CellWidth C C Size + 7 index % => Widths Fun Box Colspan[Size R C] CellWidth C C Size Widths + 3 1 roll % => Widths Fun Box Colspan[Size R C] CellWidth C Widths C Size + getinterval % => Widths Fun Box Colspan[Size R C] CellWidth C SWidths +% expand these columns to fit spanned data + 3 2 roll exch % => Widths Fun Box Colspan[Size R C] C CellWidth SWidths + expand-to % => Widths Fun Box Colspan[Size R C] C SWidths' +% Store changed widths + 5 index % => Widths Fun Box Colspan[Size R C] C SWidths' Widths + 3 1 roll % => Widths Fun Box Colspan[Size R C] Widths C SWidths' + putinterval % => Widths' Fun Box Colspan[Size R C] + pop % => Widths' Fun Box + } forall % => Widths' Fun Box + pop pop % => Widths' +} def +/table-column-widths { % => Box + dup get-width % => Box Width + table-columns-fit +} def +/table-columns-fit { % => Box Widht +% Check if there's any columns in table + 1 index get-table-content-columns + length 0 gt { + in-table-columns-fit + } { + pop pop [] + } ifelse +} def + +% columns-fit helper function +/fit-cwidth { % => MW MCW TW-TCW TMCW-TMW + 2 index + 4 index + sub % => MW MCW TW-TCW TMCW-TMW MCW-MW + exch div % => MW MCW TW-TCW MCW-MW/TMCW-TMW + mul + add +% to avoid problems with negative cell widths + 0 max + exch pop +} def +/in-table-columns-fit { % => Box Width + 1 index + get-table-content-columns % => Box Width Columns + + 2 index % => Box Width Columns Box + get-table-columns-min-widths % => Box Width Columns MinWidths + + 3 index + get-table-columns-max-widths % => Box Width Columns MinWidths MaxWidths + + 1 index + { max } + zip-with + +% Use data on the spanned cells +% exch % => Box Width Columns MaxWidths MinWidths +% 2 copy { ne } zip-with % => Box Width Columns MaxWidths MaxWidths [MaxWidthsCi<>MinWidthsCi] +% exch % => Box Width Columns MaxWidths ResizableFlags MinWidths + +% { get-min-width } 6 index % => Box Width Columns ManWidths ResizableFlags MinWidths Fun Box +% table-apply-colspans-minw % => Box Width Columns MaxWidths MinWidth +% exch % => Box Width Columns MinWidth MaxWidths +% { get-max-width } 5 index % => Box Width Columns MinWidth MaxWidths Fun Box +% table-apply-colspans % => Box Width Columns MinWidth MaxWidths + + 3 2 roll + pop % => Box Width MinWidths MaxWidths + +% Apply column width constraints to minimum widths + 2 index % => Box Width MinWidths MaxWidths BW + 4 index table-normalize-cwc % => Box Width MinWidths MaxWidths BW CWCs + 3 index % => Box Width MinWidths MaxWidths BW CWCs MinWidths + { 1 index is-fraction + { + 6 index false 3 index exec 3 1 roll pop pop + } + { exch false exch exec } ifelse } + zip-with + exch pop + +% Apply column width constraints to maximum widths + 3 index % => Box Width MinWidths MaxWidths MinWidthsC BW + 5 index table-normalize-cwc % => Box Width MinWidths MaxWidths MinWidthsC BW CWCs + 3 index % => Box Width MinWidths MaxWidths MinWidthsC BW CWCs maxWidth + { 1 index is-fraction + { + % 6 index = BW + 6 index false 3 index exec 3 1 roll pop pop + } + { exch false exch exec } ifelse } + zip-with + exch pop % => ox Width MinWidths MaxWidths MinWidthsC MaxWidths + +% Do not allow constrained max width be less than min width + 3 index + { max } + zip-with % => Box Width MinWidths MaxWidths MinWidthsC MaxWidthsC + +% Do not allow constrained min width be less than min width + 3 index + 2 index + { max } + zip-with % => Box Width MinWidths MaxWidths MinWidthsC MaxWidthsC W' + + 3 2 roll % => Box Width MinWidths MaxWidths MaxWidthsC W' MinWidthsC + pop % => Box Width MinWidths MaxWidths MaxWidthsC W' + exch % => Box Width MinWidths MaxWidths MinWidthsC' MaxWidthsC + +% Check if sum of constrained widths is too big +% Note that we compare sum of constrained width with the MAXIMAL value of table width and +% sum of uncostrained minimal width; it will prevent from unneeded collapsing of table cells +% if table content will expand its width anyway + 1 index sum % => Box Width MinWidths MaxWidths MinWidthsC' MaxWidthsC SUM(MinWidthsC') +% find the "template" value + 5 index + 5 index sum + max +% compare + gt { +% now we should scale columns to fit table width + 1 index sum +% find template value + 5 index + 5 index sum + max + +% Calculate the amount if difference between minimal and constrained minimal width for each columns + exch sub % => Box Width MinWidths MaxWidths MinWidthsC MaxWidthsC Width-MinWC + 4 index % => Box Width MinWidths MaxWidths MinWidthsC MaxWidthsC Width-MinWC MinWidth + 3 index % => Box Width MinWidths MaxWidths MinWidthsC MaxWidthsC Width-MinWC MinWidth MinWidthC + {exch sub} zip-with sum % => Box Width MinWidths MaxWidths MinWidthsC MaxWidthsC Width-MinWC CWDelta + dup 0 gt { + 5 index % => Box Width MinWidths MaxWidths MinWidthsC MaxWidthsC Width-MinWC CWDelta MinW + 4 index % => Box Width MinWidths MaxWidths MinWidthsC MaxWidthsC Width-MinWC CWDelta MinW MinWC + 4 2 roll % => Box Width MinWidths MaxWidths MinWidthsC MaxWidthsC MinW MinWC Width-MinWC CWDelta + /fit-cwidth cvx % => Box Width MinWidths MaxWidths MinWidthsC MaxWidthsC MinW MinWC Width-MinWC CWDelta cit-cwidth + 3 array astore cvx % => Box Width MinWidths MaxWidths MinWidthsC MaxWidthsC MinW MinWC {Width-MinWC CWDelta cit-cwidth} + zip-with % => Box Width MinWidths MaxWidths MinWidthsC MaxWidthsC MinWC' + exch 3 2 roll pop % => Box Width MinWidths MaxWidths MinWC' MaxWidthsC + } { +% if no difference is found, we can collapse no columns + pop pop % => Box Width MinWidths MaxWidths MinWidthsC MaxWidthsC + } ifelse + } if + +% Use data on the spanned cells (again) + exch % => Box Width MinWidths MaxWidths MaxWidthsC MinWidthsC + 2 copy { ne } zip-with % => Box Width MinWidths MaxWidths MaxWidthsC MinWidthsC [MaxWidthsCi<>MinWidthsCi] + exch % => Box Width MinWidths MaxWidths MaxWidthsC ResizableFlags MinWidthsC + + { get-min-width } 7 index % => Box Width MinWidths MaxWidths MaxWidthsC ResizableFlags MinWidthsC Fun Box + table-apply-colspans-minw % => Box Width MinWidths MaxWidths MaxWidthsC MinWidthC + exch % => Box Width MinWidths MaxWidths MinWidthC MaxWidthsC + { get-max-width } 6 index % => Box Width MinWidths MaxWidths MinWidthC MaxWidthsC Fun Box + table-apply-colspans % => Box Width MinWidths MaxWidths MinWidthC MaxWidthsC + +% Calculate actual widths +% Prepare width array + [] + 1 index length 0 + array-extend % => Box Width MinWidths MaxWidths MinWidthsC' MaxWidthsC Widths + +% First pass - calculate widths for all constrained columns + 6 index table-normalize-cwc % => Box Width MinWidths MaxWidths MinWidthsC' MaxWidthsC Widths CWCs + + 0 1 2 index length 1 sub { % => Box Width MinWidths MaxWidths MinWidthsC' MaxWidthsC Widths CWCs I + 2 copy get + is-constrained-column { + 2 index + 1 index + 6 index 3 index get + put + } if + + pop + } for + +% Quick fix for overconstrained tables: if table have width attribute AND its value is less than sum +% of constrained columns widths plus minimal widths of uncostrained columns, then we'll expand the width of table +% to fit all columns +% 1. calculate sum of constrained column widths + 1 index sum % => Box Width MinWidths MaxWidths MinWidthsC' MaxWidthsC Widths CWCs SumConW +% 2. calculate sum of unconstrained column minimal widths + 2 index + 7 index + { 1 index 0 gt { pop pop 0 } { exch pop } ifelse } + zip-with sum % => Box Width MinWidths MaxWidths MinWidthsC' MaxWidthsC Widths CWCs SumConW SumUnconW +% 3. compare these widths with the table width + add + dup 8 index gt { % => Box Width MinWidths MaxWidths MinWidthsC' MaxWidthsC Widths CWCs SumConW+SumUnconW + 8 7 roll pop + 7 1 roll + } { + pop + } ifelse + +% Second pass - distribute the rest of the width + +% Explanation of the stuff below (I've really had problems with this small piece of code, especially +% when I was trying to fix "bugs" inside it) +% +% First of all, no column can be narrower than it minimal width (determined by its content) +% Note that constrained columns have their widths distributed above, so we can exclude them for now +% (just throw them out and imagine that table does not contain any width-constrained cols) +% +% Second, the relative widths of columns will have _appoximately_ the same ratio as +% their maximal content widths. (In exception of cases where the first rule will take place - +% say for the table containing two columns with the VERY long text in the first and one or two words +% in the second) +% +% In general, this approach can be inoptimal in case of _very_ different font sizes +% inside the cells, of, say big images; nevertheless, it will give a good approximate +% AND still fast enough (unlike fully correct methods involving evaluation of the content height of the cell) +% +% Thus, we do the following: +% - calculate the ratio of current column MAXIMAL ($current_max) width to the sum of MAXIMAL widths of all columns left +% (inluding current) second rule applied. Note that we need remember about column spans and select +% maxw or maxwc in order. +% - then check if the rest of width will be too small for other columns to fit and decrease current columns +% width (see MIN function call) +% - then check again if our width will be too small for current column to fit (and expand if nesessary) - +% MAX function call + + 0 1 2 index length 1 sub { % => Box Width MinWidths MaxWidths MinWidthsC' MaxWidthsC Widths CWCs I + 2 copy get +% Process only uncostrained columns + is-constrained-column not { + 2 index + 1 index % => Box Width MinWidths MaxWidths MinWidthsC' MaxWidthsC Widths CWCs I Widths I +% Get undistibuted width (total table width - width of constrained columns) + 9 index % => Box Width MinWidths MaxWidths MinWidthsC' MaxWidthsC Widths CWCs I Widths I Width + 2 index sum sub % => Box Width MinWidths MaxWidths MinWidthsC' MaxWidthsC Widths CWCs I Widths I WidthRest +% Get max width of column being processed + 8 index 2 index get % => Box Width MinWidths MaxWidths MinWidthsC' MaxWidthsC Widths CWCs I Widths I WidthRest MaxW + 7 index 3 index get max % => Box Width MinWidths MaxWidths MinWidthsC' MaxWidthsC Widths CWCs I Widths I WidthRest MaxW +% If width is equal to zero, use max constrained width, as this column could be covered by colspan; +% If not, we lose nothing, because all constrained columns are already processed earlier, and no more +% columns except these two types can have different constrained and raw widths + dup 0 eq { + pop + 6 index 2 index get + } if +% Get sum of maximal constrained widths of unplaced columns + 3 index % => Box Width MinWidths MaxWidths MinWidthsC' MaxWidthsC Widths CWCs I Widths I WidthRest MaxW Widths + 8 index % => Box Width MinWidths MaxWidths MinWidthsC' MaxWidthsC Widths CWCs I Widths I WidthRest MaxW Widths MaxWidthsC + { 1 index 0 eq {exch pop} {pop pop 0} ifelse } + zip-with + sum % => Box Width MinWidths MaxWidths MinWidthsC' MaxWidthsC Widths CWCs I Widths I WidthRest MW MWR +% Get sum of minimal constrained widths of unplaced columns + 4 index % => Box Width MinWidths MaxWidths MinWidthsC' MaxWidthsC Widths CWCs I Widths I WidthRest MaxW MaxWR Widths + 10 index % => Box Width MinWidths MaxWidths MinWidthsC' MaxWidthsC Widths CWCs I Widths I WidthRest MaxW MaxWR Widths MaxWidthsC + { 1 index 0 eq {exch pop} {pop pop 0} ifelse } + zip-with + sum % => Box Width MinWidths MaxWidths MinWidthsC' MaxWidthsC Widths CWCs I Widths I WidthRest MaxW MaxWR MinWR + 3 index exch sub % => Box Width MinWidths MaxWidths MinWidthsC' MaxWidthsC Widths CWCs I Widths I WidthRest MaxW MaxWR WidthRest-MinWR +% add current columns min width + 12 index 5 index get + 11 index 6 index get max + add + 4 1 roll % => Box Width MinWidths MaxWidths MinWidthsC' MaxWidthsC Widths CWCs I Widths I WidthRest-MinWR WidthRest MaxW MaxWR +% If some unplaced columns have maximal (constrained width) greater zero + dup 0 gt { +% Calculate the appropriate fraction of free table width for the current column + div % => Box Width MinWidths MaxWidths MinWidthsC' MaxWidthsC Widths CWCs I Widths I WidthRest-MinWR WidthRest MinWE MaxW MaxWR + mul % => Box Width MinWidths MaxWidths MinWidthsC' MaxWidthsC Widths CWCs I Widths I WidthRest-MinWR W(WidthRest*MW/MWR) + min +% Remove minimal width of current column; +% 9 index 2 index get +% sub +% This will make calculated width not less than raw minimal column with. See also line marked with (*) +% 0 max + } { + pop pop pop pop 0 + } ifelse +% (*) Add the minimal width of current column + 9 index 2 index get + dup 0 eq { + pop + 7 index 2 index get + } if + max % => Box Width MinWidths MaxWidths MinWidthsC' MaxWidthsC Widths CWCs I Widths I W + + put + } if + + pop + } for + pop % => Box Width MinWidths MaxWidths MinWidthsC' MaxWidthsC Widths + +% in case of overconstrained table (e.g. two columns with 20% widths), expand them + dup sum % => Box Width MinWidths MaxWidths MinWidthsC' MaxWidthsC Widths SumWidth + dup 0 gt { + 6 index + exch div + dup 1 gt { + map-scale + } { pop } ifelse + } { + pop + } ifelse % => Box Width MinWidths MaxWidths MinWidthsC' MaxWidthsC Widths + +% now - the last attempt; if total width is less than box width, just expand the very first column to fit + dup sum 6 index lt { + dup sum % => Box Width MinWidths MaxWidths MinWidthsC' MaxWidthsC Widths SumWidth + 6 index + exch sub % => Box Width MinWidths MaxWidths MinWidthsC' MaxWidthsC Widths Delta + 1 index 0 get % => Box Width MinWidths MaxWidths MinWidthsC' MaxWidthsC Widths Delta W0 + add % => Box Width MinWidths MaxWidths MinWidthsC' MaxWidthsC Widths W0' + 1 index exch + 0 exch put % => Box Width MinWidths MaxWidths MinWidthsC' MaxWidthsC Widths + } if + + 7 1 roll + pop pop pop + pop pop pop +} def + +% Modify heights of table cells spanning several rows +/table-fit-rowspans { % => Table + dup table-rows-heights % => Table RHs + 1 index table-get-rowspans % => Table RHs RS +% scan all cells spanning several rows + { % => Table RHs RowSpan +% calculate the bottom edge of current cell + aload pop % => Box RHs Span R C + 2 copy % => Box RHs Span R C R C + 6 index % => Box RHs Span R C R C Box + table-get-cell-content % => Box RHs Span R C Cell + { + get-bottom + min + } + 1 index get-top + 2 index get-content + reduce +% reset the height of the cell to its content height (as it have been probably fitted to the top row spanned-over) + 1 index get-top + sub neg + 1 index put-height + +% now check if cell height is less than sum spanned rows height + dup get-full-height % => Box RHs Span R C Cell CellFH + 5 index % => Box RHs Span R C Cell CellFH RHs + 4 index 1 sub % => Box RHs Span R C Cell CellFH RHs R + 6 index % => Box RHs Span R C Cell CellFH RHs R Span + getinterval sum % => Box RHs Span R C Cell CellFH RowH + + 2 copy lt { +% vertical-align current cell +% calculate (approximate) row baseline + 6 index % => Box RHs Span R C Cell CellFH RowH RHs + 0 6 index 1 sub % => Box RHs Span R C Cell CellFH RowH RHs 0 R(ZeroBased) + getinterval sum neg % => Box RHs Span R C Cell CellFH RowH -SpannedRHs + 8 index get-top-internal + add % => Box RHs Span R C Cell CellFH RowH RBaseline +% calculate row middle coordinate + dup 2 index 2 div sub % => Box RHs Span R C Cell CellFH RowH RBaseline Middle + + 2 index + 2 index + 2 index + 7 index + + apply-valign + + pop pop + +% Make cell fill all available vertical space + dup % => Box RHs Span R C Cell CellFH RowH RowH + 3 index + put-full-height % => Box RHs Span R C Cell CellFH RowH + + pop pop pop + } { + pop pop pop + } ifelse % => Box RHs Span R C + pop pop pop + } forall + pop pop +} def + +/table-have-colspan { % => Row Col Table + table-get-colspans + 1 % => Row Col Spans 1 + exch % => Row Col 1 Spans + { % => Row Col CS Span + dup 1 get % => Row Col CS Span Row + 1 index 2 get % => Row Col CS Span Row Col + 4 index eq % => Row Col CS Span Row CEq + exch % => Row Col CS Span CEq Row + 5 index eq % => Row Col CS Span CEq REq + and % => Row Col CS Span Match + { + 0 get exch pop + } { + pop + } ifelse + } forall % => Row Col CS + 3 1 roll % => CS Row Col + pop pop % => CS +} def + +/table-have-rowspan { % => Row Col Table + table-get-rowspans + 1 % => Row Col Spans 1 + exch % => Row Col 1 Spans + { % => Row Col CS Span + dup 1 get % => Row Col CS Span Row + 1 index 2 get % => Row Col CS Span Row Col + 4 index eq % => Row Col CS Span Row CEq + exch % => Row Col CS Span CEq Row + 5 index eq % => Row Col CS Span CEq REq + and % => Row Col CS Span Match + { + 0 get exch pop + } { + pop + } ifelse + } forall % => Row Col CS + 3 1 roll % => CS Row Col + pop pop % => CS +} def + +/table-mark-rowspan { % => Table SpanSize + 1 index + get-table-content-rows % => Table SpanSize Rows + dup length % => Table SpanSize Rows CurRow + 1 index array-last % => Table SpanSize Rows CurRow LastRow + length % => Table SpanSize Rows CurRow CurColumn + 3 2 roll pop % => Table SpanSize CurRow CurColumn + 3 index % => Table SpanSize CurRow CurColumn Table + table-add-rowspan % => Table +} def + +/table-mark-colspan { % => Table SpanSize + 1 index + get-table-content-rows % => Table SpanSize Rows + dup length % => Table SpanSize Rows CurRow + 1 index array-last % => Table SpanSize Rows CurRow LastRow + length % => Table SpanSize Rows CurRow CurColumn + 3 2 roll pop % => Table SpanSize CurRow CurColumn + 3 index % => Table SpanSize CurRow CurColumn Table + table-add-colspan % => Table +} def + +/normalize-row { % => Length Row + aload length % => Length R1 .. RN N + dup % => Length R1 .. RN N N + dup 2 add % => Length R1 .. RN N N N+2 + index % => Length R1 .. RN N N Length + exch sub dup % => Length R1 .. RN N Delta Delta + replicate-row % => Length R1 .. RN N []..[] Delta 0 + pop % => Length R1 .. RN N []..[] Delta + dup 2 add % => Length R1 .. RN N []..[] Delta Delta+2 + dup 1 sub % => Length R1 .. RN N []..[] Delta Delta+2 Delta+1 + roll % => Length R1 .. RN []..[] Delta N + add % => Length R1 .. RN []..[] Delta+N + array astore % => Length Row' + exch pop % => Row' +} def + +/table-slide-cw { % => R C Box + dup table-get-cwc-raw % => R C Box RawCWCS + { % => R C Box RawCWC + aload % => R C Box !C !R WC [!C !R WC] + 2 index 7 index eq { + 3 index 6 index ge { + dup + 0 5 index 1 add put % => R C Box !C !R WC [!C+1 !R WC] + } if + } if % => R C Box !C !R WC [!C !R WC] + pop pop pop pop + } forall + + pop pop pop +} def + +/do-slide-rs { % => ... RS' [SS SR SC] R C + 2 index 1 get % => ... RS' [SS SR SC] R C SR + 2 index eq { % => ... RS' [SS SR SC] R C + 2 index 2 get % => ... RS' [SS SR SC] R C SC + 1 index ge { % => ... RS' [SS SR SC] R C + 2 index 2 get % => ... RS' [SS SR SC] R C SC + 1 add % => ... RS' [SS SR SC] R C SC+1 + 3 index exch + 2 exch % => ... RS' [SS SR SC] R C [..] 2 SC+1 + put % => ... RS' [SS SR SC+1] R C +% FIXME: reorder rowspans after this operation? + } if + } if + + pop pop + exch array-prepend +} def + +/table-slide-rs { % => R C Box + 2 index 2 index /do-slide-rs % => R C Box {fun} + cvx 3 array astore cvx + [] + 2 index table-get-rowspans + reduce + + 1 index table-put-rowspans % => R C Box + + pop pop pop % => +} def + +/do-slide-cs { % => ... RS' [SS SR SC] R C + 2 index 1 get % => ... RS' [SS SR SC] R C SR + 2 index eq { % => ... RS' [SS SR SC] R C + 2 index 2 get % => ... RS' [SS SR SC] R C SC + 1 index ge { % => ... RS' [SS SR SC] R C + 2 index 2 get % => ... RS' [SS SR SC] R C SC + 1 add % => ... RS' [SS SR SC] R C SC+1 + 3 index exch + 2 exch % => ... RS' [SS SR SC] R C [..] 2 SC+1 + put % => ... RS' [SS SR SC+1] R C +% FIXME: reorder rowspans after this operation? + } if + } if + + pop pop + exch array-prepend +} def + +/table-slide-cs { % => R C Box + 2 index 2 index /do-slide-cs % => R C Box {fun} + cvx 3 array astore cvx + [] + 2 index table-get-colspans + reduce + + 1 index table-put-colspans % => R C Box + + pop pop pop % => +} def + +/table-fake-cell { % => R C Box + 3 copy + table-slide-cw % => R C Box + 3 copy + table-slide-rs % => R C Box + 3 copy + table-slide-cs % => R C Box + + dup + get-table-content-rows % => R C Box Rows + dup % => R C Box Rows Rows + 4 index 1 sub % => R C Box Rows Rows R(0) + dup + 2 index length 1 sub gt { + pop pop pop pop pop pop + } { + get % => R C Box Rows Row + 3 index 1 sub exch % => R C Box Rows C(ZeroBased) Row + box-block-create % => R C Box Rows C Row FBox + {show-fake-block-box} + 1 index put-display + exch % => R C Box Rows C FBox Row + + dup length 3 index lt { + 3 1 roll + array-extend + } { + array-insert % => R C Box Rows Row' + } ifelse + + dup length % => R C Box Rows Row' RL' + 3 index get-content % => R C Box Rows Row' RL' [C R Content] + exch 0 exch % => R C Box Rows Row' [C R Content] 1 RL' + 2 index 0 get max + put + + 4 index 1 sub % => R C Box Rows Row' R(ZeroBased) + exch % => R C Box Rows R(ZeroBased) Row' + put % => R C Box + pop pop pop % => + } ifelse +} def + +/in-normalize-rowspans { % => Size Row Col Box + 3 index 1 gt { + 2 index 1 add % => Size Row Col Box Row+1 + 2 index % => Size Row Col Box Row+1 Col + 2 index + table-fake-cell % => Size Row Col Box + 4 2 roll % => Col Box Size Row + 1 add % => Col Box Size Row+1 + 4 1 roll % => Row+1 Col Box Size + 1 sub % => Row+1 Col Box Size-1 + 4 1 roll % => Size-1 Row+1 Col Box + in-normalize-rowspans % => + } { + pop pop pop pop % => + } ifelse +} def + +/normalize-rowspans { % => Box + dup table-get-rowspans % => Box Rowspans + { % => Box Rowspan + aload pop % => Box Size Row Col + 3 index % => Box Size Row Col Box + in-normalize-rowspans % => Box + } forall % => Box + + dup get-table-content-rows % => Box Rows + length % => Box RN + + 1 index table-get-rowspans % => Box RN Rowspans + { % => Box RN Rowspan + dup 1 get % => Box RN Rowspan RSR + dup % => Box RN Rowspan RSR RSR + 2 index 0 get % => Box RN Rowspan RSR RSR RSS + add 1 sub % => Box RN Rowspan RSR RSR+RSS-1 + 3 index min % => Box RN RowSpan RSR SpanEnd + exch sub 1 add % => Box RN RowSpan SpanSize + 0 exch put % => Box RN + } forall % => Box RN + + pop pop % => +} def + +/normalize-table { % => Box + dup normalize-rowspans + + dup get-content % => Box Content + get-children-from-content % => Box Rows + dup dup % => Box Rows Rows Rows + 0 exch % => Box Rows Rows 0 Rows + { % => Box Rows Rows 0 Row + length + max + } forall % => Box Rows Rows MaxRowLength + + 0 exch % => Box Rows Rows 0 MaxRowLength + 3 2 roll % => Box Rows 0 MaxRowLength Rows + { % => Box Rows RowNo MaxRowLength Row + 1 index exch % => Box Rows RowNo MaxRowLength MaxRowLength Row + normalize-row % => Box Rows RowNo MaxRowLength Row' + 3 index 3 index % => Box Rows RowNo MaxRowLength Row' Rows RowNo + 3 2 roll % => Box Rows RowNo MaxRowLength Rows RowNo Row' + put % => Box Rows RowNo MaxRowLength + exch 1 add exch % => Box Rows RowNo+1 MaxRowLength + } forall + + pop pop pop + pop +} def + +/in-make-table-row { % => RowData Size + dup 0 gt { + 1 index % => RowData Size RowData + aload % => RowData Size Data1 ... DataN Arr + length % => RowData Size Data1 ... DataN N + 1 add % => RowData Size Data1 ... DataN N+1 + [] exch % => RowData Size Data1 ... DataN [] N+1 + array astore % => RowData Size NewRowData + 3 2 roll pop % => Size NewRowData + exch % => NewRowData Size + 1 sub % => NewRowData Size-1 + in-make-table-row + } { + pop + } ifelse +} def + +/make-table-row { % => Size + [] exch % => [](EmptyRow) Size + in-make-table-row +} def + +/in-make-table { % => TableData Cols Rows + dup 0 gt { + 2 index % => TableData Cols Rows TableData + aload % => TableData Cols Rows Data1 ... DataN TableData + length % => TableData Cols Rows Data1 ... DataN N + 1 add % => TableData Cols Rows Data1 ... DataN N+1 + dup 1 add index + make-table-row + exch % => TableData Cols Rows Data1 ... DataN NewRow N+1 + array astore % => TableData Cols Rows NewTableData + 4 3 roll pop % => Cols Rows NewTableData + 3 1 roll % => NewTableData Cols Rows + 1 sub % => NewTableData Cols Rows-1 + in-make-table + } { + pop pop + } ifelse +} def + +/make-table { % => Cols Rows + [] 3 1 roll + in-make-table +} def + +/in-add-table-cell { % => Box Cell + 1 index get-content % => Box Cell [Cols Rows Content](RawContent) + 2 get % => Box Cell Rows + dup length 1 sub % => Box Cell Rows LastIndex + dup + 2 index exch get % => Box Cell Rows LastIndex LastRow + aload length % => Box Cell Rows LastIndex Cell1 .. CellN N + dup 3 add % => Box Cell Rows LastIndex Cell1 .. CellN N N+4 + index exch % => Box Cell Rows LastIndex Cell1 .. CellN Cell N + 1 add + array astore % => Box Cell Rows LastIndex NewRow + dup length % => Box Cell Rows LastIndex NewRow NewRowLength + 5 1 roll % => Box NewRowLength Cell Rows LastIndex NewRow + put + pop % => Box NewRowLength + 1 index get-content + dup 0 get % => Box NewRowLength Content Cols + 3 2 roll % => Box Content Cols NewRowLength + max + 0 exch put % => Box +} def + +/add-table-cell { % => Table Child + 1 index is-table { +% setup parent reference in the child box + dup get-box-dict + /Parent 3 index put +% set display property + dup get-box-dict + /Display /table-cell put + +% Check if any rows have been added to the table +% Add one if no rows still exists + 1 index get-table-content-rows % => Rows + length 0 eq { + 1 index add-table-row pop + } if + + 2 copy + in-add-table-cell % => Table Child Table + pop % => Table Child + +% If table-cell had width constaint, propagate it to the column + dup no-width-constraint not { + dup get-width-constraint + 2 index put-table-column-width-constraint + {wc-none} 1 index put-width-constraint + } if + pop + } { +% if parent is not a table, just ignore this box + pop + } ifelse +} def diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/table.row.ps b/thirdparty/html2ps_pdf/postscript/table.row.ps similarity index 95% rename from gulliver/thirdparty/html2ps_pdf/postscript/table.row.ps rename to thirdparty/html2ps_pdf/postscript/table.row.ps index fa1af857b..37d4494c8 100644 --- a/gulliver/thirdparty/html2ps_pdf/postscript/table.row.ps +++ b/thirdparty/html2ps_pdf/postscript/table.row.ps @@ -1,20 +1,20 @@ -% $Header: /cvsroot/html2ps/postscript/table.row.ps,v 1.1 2005/12/18 07:21:38 Konstantin Exp $ - -/get-row-baseline { % => Row -% Calculate maximal baseline for each cell contained -% Cell baseline is the baseline of its first line box - { - get-content - dup length 0 gt { - 0 get - get-baseline - max - } { - pop - } ifelse - } - exch - 0 exch - reduce - -} def +% $Header: /cvsroot/html2ps/postscript/table.row.ps,v 1.1 2005/12/18 07:21:38 Konstantin Exp $ + +/get-row-baseline { % => Row +% Calculate maximal baseline for each cell contained +% Cell baseline is the baseline of its first line box + { + get-content + dup length 0 gt { + 0 get + get-baseline + max + } { + pop + } ifelse + } + exch + 0 exch + reduce + +} def diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/text-align.ps b/thirdparty/html2ps_pdf/postscript/text-align.ps similarity index 97% rename from gulliver/thirdparty/html2ps_pdf/postscript/text-align.ps rename to thirdparty/html2ps_pdf/postscript/text-align.ps index 52fa65107..2493c694f 100644 --- a/gulliver/thirdparty/html2ps_pdf/postscript/text-align.ps +++ b/thirdparty/html2ps_pdf/postscript/text-align.ps @@ -1,95 +1,95 @@ -% $Header: /cvsroot/html2ps/postscript/text-align.ps,v 1.1 2005/12/18 07:21:38 Konstantin Exp $ - -% Constants -/max-justify-fraction {0.33} def - -/line-length-delta { % Context Box - dup line-length % Context Box LineLength -% calculate length line to be expanded - 2 index 2 index - box-container-get-available-width - exch sub % Context Box Delta -% Quick workaround - line delta should not be less than 0 - 0 max - - exch pop - exch pop -} def - -/text-align-left { % => LastLine Context Box - pop pop pop -} def - -/text-align-center { % => LastLine Context Box - 2 copy line-length-delta % => LastLine Context Box Delta - 2 div % => LastLine Context Box Delta/2 - 1 index get-line % => LastLine Context Box Delta/2 Line - { % => LastLine Context Box Delta/2 LineElement - 0 exch - 2 index exch % => LastLine Context Box Delta/2 0 Delta/2 LineElement - /offset call-method - } forall % => LastLine Context Box Delta/2 - pop pop pop pop -} def - -/text-align-right { % => LastLine Context Box - 2 copy line-length-delta % => LastLine Context Box Delta - 1 index get-line % => LastLine Context Box Delta Line - { % => LastLine Context Box Delta LineElement - 0 exch - 2 index exch % => LastLine Context Box Delta/2 Delta/2 0 LineElement - /offset call-method - } forall % => LastLine Context Box Delta/2 - pop pop pop pop -} def - -/text-align-justify { % => LastLine Context Box -% last line is never justified - 2 index not { % => LastLine Context Box - -% If line box contains less that two items, no justification can be done, just return - dup get-line length 2 ge { % => LastLine Context Box - -% Calculate extra space to be filled by this line - 2 copy line-length-delta % => LastLine Context Box Delta - -% note that if it is the very first line inside the container, 'text-indent' value -% should not be taken into account while calculating delta value - 1 index - box-container-get-first - get-uid % => LastLine Context Box Delta FirstUID - 2 index get-line - 0 get get-uid % => LastLine Context Box Delta FirstUID FirstLineUID - eq { % => LastLine Context Box Delta - 1 index box-generic-calc-text-indent - sub - } if % => LastLine Context Box Delta - -% if line takes less that MAX_JUSTIFY_FRACTION of available space, no justtification should be done - 1 index line-length - max-justify-fraction mul % => LastLine Context Box Delta LL*MJF - 1 index ge { % => LastLine Context Box Delta -% Calculate offset for each box - dup - 2 index get-line length - 1 sub div % => LastLine Context Box Delta Offset - dup % => LastLine Context Box Delta Offset COffset - -% Offset all boxes in current line box - 3 index get-line { % => LastLine Context Box Delta Offset COffset Child - 0 2 index 2 index - /offset call-method % => LastLine Context Box Delta Offset COffset Child - - pop - 1 index add % => LastLine Context Box Delta Offset COffset - } forall - - pop pop % => LastLine Context Box Delta - } if - - pop % => LastLine Context Box - } if - } if - - pop pop pop -} def +% $Header: /cvsroot/html2ps/postscript/text-align.ps,v 1.1 2005/12/18 07:21:38 Konstantin Exp $ + +% Constants +/max-justify-fraction {0.33} def + +/line-length-delta { % Context Box + dup line-length % Context Box LineLength +% calculate length line to be expanded + 2 index 2 index + box-container-get-available-width + exch sub % Context Box Delta +% Quick workaround - line delta should not be less than 0 + 0 max + + exch pop + exch pop +} def + +/text-align-left { % => LastLine Context Box + pop pop pop +} def + +/text-align-center { % => LastLine Context Box + 2 copy line-length-delta % => LastLine Context Box Delta + 2 div % => LastLine Context Box Delta/2 + 1 index get-line % => LastLine Context Box Delta/2 Line + { % => LastLine Context Box Delta/2 LineElement + 0 exch + 2 index exch % => LastLine Context Box Delta/2 0 Delta/2 LineElement + /offset call-method + } forall % => LastLine Context Box Delta/2 + pop pop pop pop +} def + +/text-align-right { % => LastLine Context Box + 2 copy line-length-delta % => LastLine Context Box Delta + 1 index get-line % => LastLine Context Box Delta Line + { % => LastLine Context Box Delta LineElement + 0 exch + 2 index exch % => LastLine Context Box Delta/2 Delta/2 0 LineElement + /offset call-method + } forall % => LastLine Context Box Delta/2 + pop pop pop pop +} def + +/text-align-justify { % => LastLine Context Box +% last line is never justified + 2 index not { % => LastLine Context Box + +% If line box contains less that two items, no justification can be done, just return + dup get-line length 2 ge { % => LastLine Context Box + +% Calculate extra space to be filled by this line + 2 copy line-length-delta % => LastLine Context Box Delta + +% note that if it is the very first line inside the container, 'text-indent' value +% should not be taken into account while calculating delta value + 1 index + box-container-get-first + get-uid % => LastLine Context Box Delta FirstUID + 2 index get-line + 0 get get-uid % => LastLine Context Box Delta FirstUID FirstLineUID + eq { % => LastLine Context Box Delta + 1 index box-generic-calc-text-indent + sub + } if % => LastLine Context Box Delta + +% if line takes less that MAX_JUSTIFY_FRACTION of available space, no justtification should be done + 1 index line-length + max-justify-fraction mul % => LastLine Context Box Delta LL*MJF + 1 index ge { % => LastLine Context Box Delta +% Calculate offset for each box + dup + 2 index get-line length + 1 sub div % => LastLine Context Box Delta Offset + dup % => LastLine Context Box Delta Offset COffset + +% Offset all boxes in current line box + 3 index get-line { % => LastLine Context Box Delta Offset COffset Child + 0 2 index 2 index + /offset call-method % => LastLine Context Box Delta Offset COffset Child + + pop + 1 index add % => LastLine Context Box Delta Offset COffset + } forall + + pop pop % => LastLine Context Box Delta + } if + + pop % => LastLine Context Box + } if + } if + + pop pop pop +} def diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/vertical-align.ps b/thirdparty/html2ps_pdf/postscript/vertical-align.ps similarity index 95% rename from gulliver/thirdparty/html2ps_pdf/postscript/vertical-align.ps rename to thirdparty/html2ps_pdf/postscript/vertical-align.ps index 6f0280acd..4c17b32bb 100644 --- a/gulliver/thirdparty/html2ps_pdf/postscript/vertical-align.ps +++ b/thirdparty/html2ps_pdf/postscript/vertical-align.ps @@ -1,93 +1,93 @@ -% $Header: /cvsroot/html2ps/postscript/vertical-align.ps,v 1.1 2005/12/18 07:21:39 Konstantin Exp $ - -/vertical-align-text-top { -} def - -/vertical-align-text-bottom { - 1 index get-line-baseline neg - 1 index get-baseline % => Parent Child MaxBaseline Baseline - - 2 copy ge { - pop - 1 index put-baseline - } { - sub - 2 index get-line - { - dup get-baseline - 2 index sub - exch put-baseline - } forall - 2 index get-line-baseline - add - 2 index put-line-baseline % => Parent Child - } ifelse -} def - -/vertical-align-super { - dup get-baseline 2 div - 1 index put-baseline -} def - -/vertical-align-sub { - 1 index get-line-baseline neg - 1 index get-baseline - 2 div - add - 1 index put-baseline -} def -/vertical-align-top { -} def -/vertical-align-middle { - vertical-align-baseline - - dup get-default-baseline - 1 index get-baseline - sub 2 div - - 1 index get-baseline - add - 1 index put-baseline -} def - -% TODO: -/vertical-align-bottom { - 1 index get-line-baseline neg - 1 index get-baseline % => Parent Child MaxBaseline Baseline - - 2 copy ge { - pop - 1 index put-baseline - } { - sub - 2 index get-line - { - dup get-baseline - 2 index sub - exch put-baseline - } forall - 2 index get-line-baseline - add - 2 index put-line-baseline % => Parent Child - } ifelse -} def -/vertical-align-baseline { % => Parent Child - 1 index get-line-baseline neg - 1 index get-baseline % => Parent Child MaxBaseline Baseline - - 2 copy ge { - pop - 1 index put-baseline - } { - sub - 2 index get-line - { - dup get-baseline - 2 index sub - exch put-baseline - } forall - 2 index get-line-baseline - add - 2 index put-line-baseline % => Parent Child - } ifelse -} def +% $Header: /cvsroot/html2ps/postscript/vertical-align.ps,v 1.1 2005/12/18 07:21:39 Konstantin Exp $ + +/vertical-align-text-top { +} def + +/vertical-align-text-bottom { + 1 index get-line-baseline neg + 1 index get-baseline % => Parent Child MaxBaseline Baseline + + 2 copy ge { + pop + 1 index put-baseline + } { + sub + 2 index get-line + { + dup get-baseline + 2 index sub + exch put-baseline + } forall + 2 index get-line-baseline + add + 2 index put-line-baseline % => Parent Child + } ifelse +} def + +/vertical-align-super { + dup get-baseline 2 div + 1 index put-baseline +} def + +/vertical-align-sub { + 1 index get-line-baseline neg + 1 index get-baseline + 2 div + add + 1 index put-baseline +} def +/vertical-align-top { +} def +/vertical-align-middle { + vertical-align-baseline + + dup get-default-baseline + 1 index get-baseline + sub 2 div + + 1 index get-baseline + add + 1 index put-baseline +} def + +% TODO: +/vertical-align-bottom { + 1 index get-line-baseline neg + 1 index get-baseline % => Parent Child MaxBaseline Baseline + + 2 copy ge { + pop + 1 index put-baseline + } { + sub + 2 index get-line + { + dup get-baseline + 2 index sub + exch put-baseline + } forall + 2 index get-line-baseline + add + 2 index put-line-baseline % => Parent Child + } ifelse +} def +/vertical-align-baseline { % => Parent Child + 1 index get-line-baseline neg + 1 index get-baseline % => Parent Child MaxBaseline Baseline + + 2 copy ge { + pop + 1 index put-baseline + } { + sub + 2 index get-line + { + dup get-baseline + 2 index sub + exch put-baseline + } forall + 2 index get-line-baseline + add + 2 index put-line-baseline % => Parent Child + } ifelse +} def diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/viewport.ps b/thirdparty/html2ps_pdf/postscript/viewport.ps similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/postscript/viewport.ps rename to thirdparty/html2ps_pdf/postscript/viewport.ps diff --git a/gulliver/thirdparty/html2ps_pdf/postscript/width.ps b/thirdparty/html2ps_pdf/postscript/width.ps similarity index 94% rename from gulliver/thirdparty/html2ps_pdf/postscript/width.ps rename to thirdparty/html2ps_pdf/postscript/width.ps index d33fc4bca..2fc265a07 100644 --- a/gulliver/thirdparty/html2ps_pdf/postscript/width.ps +++ b/thirdparty/html2ps_pdf/postscript/width.ps @@ -1,61 +1,61 @@ -% $Header: /cvsroot/html2ps/postscript/width.ps,v 1.1 2005/12/18 07:21:39 Konstantin Exp $ - -/wc-apply { % => PW CW WC - dup /apply get exec -} def - -/wc-create-constant { % => Value - << - /type /constant - /value 4 index - /apply { % => ... PW CW This - /value get - exch pop - exch pop - } - /apply-inverse { - pop pop - } - >> - - exch pop -} def - -/wc-create-fraction { % => Value - << - /type /fraction - /fraction 4 index - /apply { % => ... PW CW This - /fraction get - exch pop - mul - } - /apply-inverse { % => ... PW CW This - /fraction get - dup 0 gt { - div exch pop - } { - pop pop pop 0 - } ifelse - } - >> - - exch pop -} def - -/wc-create-none { - << - /type /none - /apply { % => ... PW CW This - pop - exch pop % => ... CW - } - /apply-inverse { - pop pop - } - >> -} def - -/wc-is-fraction { % => WC - /type get /fraction eq -} def +% $Header: /cvsroot/html2ps/postscript/width.ps,v 1.1 2005/12/18 07:21:39 Konstantin Exp $ + +/wc-apply { % => PW CW WC + dup /apply get exec +} def + +/wc-create-constant { % => Value + << + /type /constant + /value 4 index + /apply { % => ... PW CW This + /value get + exch pop + exch pop + } + /apply-inverse { + pop pop + } + >> + + exch pop +} def + +/wc-create-fraction { % => Value + << + /type /fraction + /fraction 4 index + /apply { % => ... PW CW This + /fraction get + exch pop + mul + } + /apply-inverse { % => ... PW CW This + /fraction get + dup 0 gt { + div exch pop + } { + pop pop pop 0 + } ifelse + } + >> + + exch pop +} def + +/wc-create-none { + << + /type /none + /apply { % => ... PW CW This + pop + exch pop % => ... CW + } + /apply-inverse { + pop pop + } + >> +} def + +/wc-is-fraction { % => WC + /type get /fraction eq +} def diff --git a/gulliver/thirdparty/html2ps_pdf/ps.image.encoder.inc.php b/thirdparty/html2ps_pdf/ps.image.encoder.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/ps.image.encoder.inc.php rename to thirdparty/html2ps_pdf/ps.image.encoder.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/ps.image.encoder.simple.inc.php b/thirdparty/html2ps_pdf/ps.image.encoder.simple.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/ps.image.encoder.simple.inc.php rename to thirdparty/html2ps_pdf/ps.image.encoder.simple.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/ps.image.encoder.stream.inc.php b/thirdparty/html2ps_pdf/ps.image.encoder.stream.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/ps.image.encoder.stream.inc.php rename to thirdparty/html2ps_pdf/ps.image.encoder.stream.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/ps.l2.image.encoder.stream.inc.php b/thirdparty/html2ps_pdf/ps.l2.image.encoder.stream.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/ps.l2.image.encoder.stream.inc.php rename to thirdparty/html2ps_pdf/ps.l2.image.encoder.stream.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/ps.l3.image.encoder.stream.inc.php b/thirdparty/html2ps_pdf/ps.l3.image.encoder.stream.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/ps.l3.image.encoder.stream.inc.php rename to thirdparty/html2ps_pdf/ps.l3.image.encoder.stream.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/ps.unicode.inc.php b/thirdparty/html2ps_pdf/ps.unicode.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/ps.unicode.inc.php rename to thirdparty/html2ps_pdf/ps.unicode.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/ps.utils.inc.php b/thirdparty/html2ps_pdf/ps.utils.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/ps.utils.inc.php rename to thirdparty/html2ps_pdf/ps.utils.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/ps.whitespace.inc.php b/thirdparty/html2ps_pdf/ps.whitespace.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/ps.whitespace.inc.php rename to thirdparty/html2ps_pdf/ps.whitespace.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/render.queue.class.php b/thirdparty/html2ps_pdf/render.queue.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/render.queue.class.php rename to thirdparty/html2ps_pdf/render.queue.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/render.stacking.context.class.php b/thirdparty/html2ps_pdf/render.stacking.context.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/render.stacking.context.class.php rename to thirdparty/html2ps_pdf/render.stacking.context.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/render.stacking.level.class.php b/thirdparty/html2ps_pdf/render.stacking.level.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/render.stacking.level.class.php rename to thirdparty/html2ps_pdf/render.stacking.level.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/samples/out/readme.txt b/thirdparty/html2ps_pdf/samples/out/readme.txt similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/samples/out/readme.txt rename to thirdparty/html2ps_pdf/samples/out/readme.txt diff --git a/gulliver/thirdparty/html2ps_pdf/samples/sample.batch.php b/thirdparty/html2ps_pdf/samples/sample.batch.php similarity index 97% rename from gulliver/thirdparty/html2ps_pdf/samples/sample.batch.php rename to thirdparty/html2ps_pdf/samples/sample.batch.php index 7d492eb03..fdde86608 100644 --- a/gulliver/thirdparty/html2ps_pdf/samples/sample.batch.php +++ b/thirdparty/html2ps_pdf/samples/sample.batch.php @@ -1,160 +1,160 @@ - 'screen', - 'renderimages' => true, - 'renderforms' => true, - 'renderlinks' => true, - 'mode' => 'html', - 'debugbox' => false, - 'draw_page_border' => false - ); - -$media = Media::predefined('A4'); -$media->set_landscape(false); -$media->set_margins(array('left' => 10, - 'right' => 10, - 'top' => 10, - 'bottom' => 10)); -$media->set_pixels(1024); - -$g_px_scale = mm2pt($media->width() - $media->margins['left'] - $media->margins['right']) / $media->pixels; -$g_pt_scale = $g_px_scale * 1.43; - -$pipeline = new Pipeline; -$pipeline->configure($g_config); -$pipeline->fetchers[] = new FetcherURL; -$pipeline->data_filters[] = new DataFilterDoctype(); -$pipeline->data_filters[] = new DataFilterUTF8(""); -$pipeline->data_filters[] = new DataFilterHTML2XHTML; -$pipeline->parser = new ParserXHTML; -$pipeline->pre_tree_filters = array(); -$pipeline->layout_engine = new LayoutEngineDefault; -$pipeline->post_tree_filters = array(); -$pipeline->output_driver = new OutputDriverFPDF(); - -$time = time(); -foreach ($urls as $url) { - $pipeline->destination = new DestinationFile($url); - $pipeline->process($url, $media); - - $message = sprintf("
      Processing of '%s' completed in %u seconds", $url, time() - $time); - error_log($message); - print($message."
      "); - flush(); - - $time = time(); -}; - - + 'screen', + 'renderimages' => true, + 'renderforms' => true, + 'renderlinks' => true, + 'mode' => 'html', + 'debugbox' => false, + 'draw_page_border' => false + ); + +$media = Media::predefined('A4'); +$media->set_landscape(false); +$media->set_margins(array('left' => 10, + 'right' => 10, + 'top' => 10, + 'bottom' => 10)); +$media->set_pixels(1024); + +$g_px_scale = mm2pt($media->width() - $media->margins['left'] - $media->margins['right']) / $media->pixels; +$g_pt_scale = $g_px_scale * 1.43; + +$pipeline = new Pipeline; +$pipeline->configure($g_config); +$pipeline->fetchers[] = new FetcherURL; +$pipeline->data_filters[] = new DataFilterDoctype(); +$pipeline->data_filters[] = new DataFilterUTF8(""); +$pipeline->data_filters[] = new DataFilterHTML2XHTML; +$pipeline->parser = new ParserXHTML; +$pipeline->pre_tree_filters = array(); +$pipeline->layout_engine = new LayoutEngineDefault; +$pipeline->post_tree_filters = array(); +$pipeline->output_driver = new OutputDriverFPDF(); + +$time = time(); +foreach ($urls as $url) { + $pipeline->destination = new DestinationFile($url); + $pipeline->process($url, $media); + + $message = sprintf("
      Processing of '%s' completed in %u seconds", $url, time() - $time); + error_log($message); + print($message."
      "); + flush(); + + $time = time(); +}; + + ?> \ No newline at end of file diff --git a/gulliver/thirdparty/html2ps_pdf/samples/sample.form.handler.php b/thirdparty/html2ps_pdf/samples/sample.form.handler.php similarity index 92% rename from gulliver/thirdparty/html2ps_pdf/samples/sample.form.handler.php rename to thirdparty/html2ps_pdf/samples/sample.form.handler.php index f22c8562a..9f9e8719a 100644 --- a/gulliver/thirdparty/html2ps_pdf/samples/sample.form.handler.php +++ b/thirdparty/html2ps_pdf/samples/sample.form.handler.php @@ -1,8 +1,8 @@ - \ No newline at end of file diff --git a/gulliver/thirdparty/html2ps_pdf/samples/sample.pipeline.custom.php b/thirdparty/html2ps_pdf/samples/sample.pipeline.custom.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/samples/sample.pipeline.custom.php rename to thirdparty/html2ps_pdf/samples/sample.pipeline.custom.php diff --git a/gulliver/thirdparty/html2ps_pdf/samples/sample.pipeline.default.php b/thirdparty/html2ps_pdf/samples/sample.pipeline.default.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/samples/sample.pipeline.default.php rename to thirdparty/html2ps_pdf/samples/sample.pipeline.default.php diff --git a/gulliver/thirdparty/html2ps_pdf/samples/sample.simplest.from.file.php b/thirdparty/html2ps_pdf/samples/sample.simplest.from.file.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/samples/sample.simplest.from.file.php rename to thirdparty/html2ps_pdf/samples/sample.simplest.from.file.php diff --git a/gulliver/thirdparty/html2ps_pdf/samples/sample.simplest.from.memory.php b/thirdparty/html2ps_pdf/samples/sample.simplest.from.memory.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/samples/sample.simplest.from.memory.php rename to thirdparty/html2ps_pdf/samples/sample.simplest.from.memory.php diff --git a/gulliver/thirdparty/html2ps_pdf/samples/sample.simplest.php b/thirdparty/html2ps_pdf/samples/sample.simplest.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/samples/sample.simplest.php rename to thirdparty/html2ps_pdf/samples/sample.simplest.php diff --git a/gulliver/thirdparty/html2ps_pdf/strategy.link.rendering.normal.php b/thirdparty/html2ps_pdf/strategy.link.rendering.normal.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/strategy.link.rendering.normal.php rename to thirdparty/html2ps_pdf/strategy.link.rendering.normal.php diff --git a/gulliver/thirdparty/html2ps_pdf/strategy.position.absolute.php b/thirdparty/html2ps_pdf/strategy.position.absolute.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/strategy.position.absolute.php rename to thirdparty/html2ps_pdf/strategy.position.absolute.php diff --git a/gulliver/thirdparty/html2ps_pdf/strategy.table.layout.auto.php b/thirdparty/html2ps_pdf/strategy.table.layout.auto.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/strategy.table.layout.auto.php rename to thirdparty/html2ps_pdf/strategy.table.layout.auto.php diff --git a/gulliver/thirdparty/html2ps_pdf/strategy.table.layout.fixed.php b/thirdparty/html2ps_pdf/strategy.table.layout.fixed.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/strategy.table.layout.fixed.php rename to thirdparty/html2ps_pdf/strategy.table.layout.fixed.php diff --git a/gulliver/thirdparty/html2ps_pdf/strategy.width.absolute.positioned.php b/thirdparty/html2ps_pdf/strategy.width.absolute.positioned.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/strategy.width.absolute.positioned.php rename to thirdparty/html2ps_pdf/strategy.width.absolute.positioned.php diff --git a/gulliver/thirdparty/html2ps_pdf/strategy.width.max.natural.php b/thirdparty/html2ps_pdf/strategy.width.max.natural.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/strategy.width.max.natural.php rename to thirdparty/html2ps_pdf/strategy.width.max.natural.php diff --git a/gulliver/thirdparty/html2ps_pdf/strategy.width.max.php b/thirdparty/html2ps_pdf/strategy.width.max.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/strategy.width.max.php rename to thirdparty/html2ps_pdf/strategy.width.max.php diff --git a/gulliver/thirdparty/html2ps_pdf/strategy.width.min.nowrap.php b/thirdparty/html2ps_pdf/strategy.width.min.nowrap.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/strategy.width.min.nowrap.php rename to thirdparty/html2ps_pdf/strategy.width.min.nowrap.php diff --git a/gulliver/thirdparty/html2ps_pdf/strategy.width.min.php b/thirdparty/html2ps_pdf/strategy.width.min.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/strategy.width.min.php rename to thirdparty/html2ps_pdf/strategy.width.min.php diff --git a/gulliver/thirdparty/html2ps_pdf/stubs._.inc.php b/thirdparty/html2ps_pdf/stubs._.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/stubs._.inc.php rename to thirdparty/html2ps_pdf/stubs._.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/stubs.common.inc.php b/thirdparty/html2ps_pdf/stubs.common.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/stubs.common.inc.php rename to thirdparty/html2ps_pdf/stubs.common.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/stubs.file_get_contents.inc.php b/thirdparty/html2ps_pdf/stubs.file_get_contents.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/stubs.file_get_contents.inc.php rename to thirdparty/html2ps_pdf/stubs.file_get_contents.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/stubs.file_put_contents.inc.php b/thirdparty/html2ps_pdf/stubs.file_put_contents.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/stubs.file_put_contents.inc.php rename to thirdparty/html2ps_pdf/stubs.file_put_contents.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/stubs.is_executable.inc.php b/thirdparty/html2ps_pdf/stubs.is_executable.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/stubs.is_executable.inc.php rename to thirdparty/html2ps_pdf/stubs.is_executable.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/stubs.memory_get_usage.inc.php b/thirdparty/html2ps_pdf/stubs.memory_get_usage.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/stubs.memory_get_usage.inc.php rename to thirdparty/html2ps_pdf/stubs.memory_get_usage.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/tag.body.inc.php b/thirdparty/html2ps_pdf/tag.body.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/tag.body.inc.php rename to thirdparty/html2ps_pdf/tag.body.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/tag.font.inc.php b/thirdparty/html2ps_pdf/tag.font.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/tag.font.inc.php rename to thirdparty/html2ps_pdf/tag.font.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/tag.frame.inc.php b/thirdparty/html2ps_pdf/tag.frame.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/tag.frame.inc.php rename to thirdparty/html2ps_pdf/tag.frame.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/tag.img.inc.php b/thirdparty/html2ps_pdf/tag.img.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/tag.img.inc.php rename to thirdparty/html2ps_pdf/tag.img.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/tag.input.inc.php b/thirdparty/html2ps_pdf/tag.input.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/tag.input.inc.php rename to thirdparty/html2ps_pdf/tag.input.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/tag.select.inc.php b/thirdparty/html2ps_pdf/tag.select.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/tag.select.inc.php rename to thirdparty/html2ps_pdf/tag.select.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/tag.span.inc.php b/thirdparty/html2ps_pdf/tag.span.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/tag.span.inc.php rename to thirdparty/html2ps_pdf/tag.span.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/tag.table.inc.php b/thirdparty/html2ps_pdf/tag.table.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/tag.table.inc.php rename to thirdparty/html2ps_pdf/tag.table.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/tag.td.inc.php b/thirdparty/html2ps_pdf/tag.td.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/tag.td.inc.php rename to thirdparty/html2ps_pdf/tag.td.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/tag.utils.inc.php b/thirdparty/html2ps_pdf/tag.utils.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/tag.utils.inc.php rename to thirdparty/html2ps_pdf/tag.utils.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/temp/readme.txt b/thirdparty/html2ps_pdf/temp/readme.txt similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/temp/readme.txt rename to thirdparty/html2ps_pdf/temp/readme.txt diff --git a/gulliver/thirdparty/html2ps_pdf/templates/cannot_parse.html b/thirdparty/html2ps_pdf/templates/cannot_parse.html similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/templates/cannot_parse.html rename to thirdparty/html2ps_pdf/templates/cannot_parse.html diff --git a/gulliver/thirdparty/html2ps_pdf/templates/error._connection.tpl b/thirdparty/html2ps_pdf/templates/error._connection.tpl similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/templates/error._connection.tpl rename to thirdparty/html2ps_pdf/templates/error._connection.tpl diff --git a/gulliver/thirdparty/html2ps_pdf/templates/error._footer.tpl b/thirdparty/html2ps_pdf/templates/error._footer.tpl similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/templates/error._footer.tpl rename to thirdparty/html2ps_pdf/templates/error._footer.tpl diff --git a/gulliver/thirdparty/html2ps_pdf/templates/error._header.tpl b/thirdparty/html2ps_pdf/templates/error._header.tpl similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/templates/error._header.tpl rename to thirdparty/html2ps_pdf/templates/error._header.tpl diff --git a/gulliver/thirdparty/html2ps_pdf/templates/error._http.tpl b/thirdparty/html2ps_pdf/templates/error._http.tpl similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/templates/error._http.tpl rename to thirdparty/html2ps_pdf/templates/error._http.tpl diff --git a/gulliver/thirdparty/html2ps_pdf/templates/error._missing_afm.tpl b/thirdparty/html2ps_pdf/templates/error._missing_afm.tpl similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/templates/error._missing_afm.tpl rename to thirdparty/html2ps_pdf/templates/error._missing_afm.tpl diff --git a/gulliver/thirdparty/html2ps_pdf/templates/error._no_fetchers.tpl b/thirdparty/html2ps_pdf/templates/error._no_fetchers.tpl similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/templates/error._no_fetchers.tpl rename to thirdparty/html2ps_pdf/templates/error._no_fetchers.tpl diff --git a/gulliver/thirdparty/html2ps_pdf/templates/error._redirects.tpl b/thirdparty/html2ps_pdf/templates/error._redirects.tpl similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/templates/error._redirects.tpl rename to thirdparty/html2ps_pdf/templates/error._redirects.tpl diff --git a/gulliver/thirdparty/html2ps_pdf/templates/error_exec.tpl b/thirdparty/html2ps_pdf/templates/error_exec.tpl similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/templates/error_exec.tpl rename to thirdparty/html2ps_pdf/templates/error_exec.tpl diff --git a/gulliver/thirdparty/html2ps_pdf/templates/missing_exec.html b/thirdparty/html2ps_pdf/templates/missing_exec.html similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/templates/missing_exec.html rename to thirdparty/html2ps_pdf/templates/missing_exec.html diff --git a/gulliver/thirdparty/html2ps_pdf/templates/missing_gs.html b/thirdparty/html2ps_pdf/templates/missing_gs.html similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/templates/missing_gs.html rename to thirdparty/html2ps_pdf/templates/missing_gs.html diff --git a/gulliver/thirdparty/html2ps_pdf/templates/missing_pdflib.html b/thirdparty/html2ps_pdf/templates/missing_pdflib.html similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/templates/missing_pdflib.html rename to thirdparty/html2ps_pdf/templates/missing_pdflib.html diff --git a/gulliver/thirdparty/html2ps_pdf/templates/missing_url_fopen.html b/thirdparty/html2ps_pdf/templates/missing_url_fopen.html similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/templates/missing_url_fopen.html rename to thirdparty/html2ps_pdf/templates/missing_url_fopen.html diff --git a/gulliver/thirdparty/html2ps_pdf/tree.navigation.inc.php b/thirdparty/html2ps_pdf/tree.navigation.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/tree.navigation.inc.php rename to thirdparty/html2ps_pdf/tree.navigation.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/treebuilder.class.php b/thirdparty/html2ps_pdf/treebuilder.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/treebuilder.class.php rename to thirdparty/html2ps_pdf/treebuilder.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/utils_array.php b/thirdparty/html2ps_pdf/utils_array.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/utils_array.php rename to thirdparty/html2ps_pdf/utils_array.php diff --git a/gulliver/thirdparty/html2ps_pdf/utils_graphic.php b/thirdparty/html2ps_pdf/utils_graphic.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/utils_graphic.php rename to thirdparty/html2ps_pdf/utils_graphic.php diff --git a/gulliver/thirdparty/html2ps_pdf/utils_number.php b/thirdparty/html2ps_pdf/utils_number.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/utils_number.php rename to thirdparty/html2ps_pdf/utils_number.php diff --git a/gulliver/thirdparty/html2ps_pdf/utils_text.php b/thirdparty/html2ps_pdf/utils_text.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/utils_text.php rename to thirdparty/html2ps_pdf/utils_text.php diff --git a/gulliver/thirdparty/html2ps_pdf/utils_units.php b/thirdparty/html2ps_pdf/utils_units.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/utils_units.php rename to thirdparty/html2ps_pdf/utils_units.php diff --git a/gulliver/thirdparty/html2ps_pdf/utils_url.php b/thirdparty/html2ps_pdf/utils_url.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/utils_url.php rename to thirdparty/html2ps_pdf/utils_url.php diff --git a/gulliver/thirdparty/html2ps_pdf/value.background.php b/thirdparty/html2ps_pdf/value.background.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/value.background.php rename to thirdparty/html2ps_pdf/value.background.php diff --git a/gulliver/thirdparty/html2ps_pdf/value.border.class.php b/thirdparty/html2ps_pdf/value.border.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/value.border.class.php rename to thirdparty/html2ps_pdf/value.border.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/value.border.color.class.php b/thirdparty/html2ps_pdf/value.border.color.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/value.border.color.class.php rename to thirdparty/html2ps_pdf/value.border.color.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/value.border.edge.class.php b/thirdparty/html2ps_pdf/value.border.edge.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/value.border.edge.class.php rename to thirdparty/html2ps_pdf/value.border.edge.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/value.border.style.class.php b/thirdparty/html2ps_pdf/value.border.style.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/value.border.style.class.php rename to thirdparty/html2ps_pdf/value.border.style.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/value.border.width.class.php b/thirdparty/html2ps_pdf/value.border.width.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/value.border.width.class.php rename to thirdparty/html2ps_pdf/value.border.width.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/value.bottom.php b/thirdparty/html2ps_pdf/value.bottom.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/value.bottom.php rename to thirdparty/html2ps_pdf/value.bottom.php diff --git a/gulliver/thirdparty/html2ps_pdf/value.color.php b/thirdparty/html2ps_pdf/value.color.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/value.color.php rename to thirdparty/html2ps_pdf/value.color.php diff --git a/gulliver/thirdparty/html2ps_pdf/value.content.item.php b/thirdparty/html2ps_pdf/value.content.item.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/value.content.item.php rename to thirdparty/html2ps_pdf/value.content.item.php diff --git a/gulliver/thirdparty/html2ps_pdf/value.content.php b/thirdparty/html2ps_pdf/value.content.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/value.content.php rename to thirdparty/html2ps_pdf/value.content.php diff --git a/gulliver/thirdparty/html2ps_pdf/value.font.class.php b/thirdparty/html2ps_pdf/value.font.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/value.font.class.php rename to thirdparty/html2ps_pdf/value.font.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/value.generic.length.php b/thirdparty/html2ps_pdf/value.generic.length.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/value.generic.length.php rename to thirdparty/html2ps_pdf/value.generic.length.php diff --git a/gulliver/thirdparty/html2ps_pdf/value.generic.percentage.php b/thirdparty/html2ps_pdf/value.generic.percentage.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/value.generic.percentage.php rename to thirdparty/html2ps_pdf/value.generic.percentage.php diff --git a/gulliver/thirdparty/html2ps_pdf/value.generic.php b/thirdparty/html2ps_pdf/value.generic.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/value.generic.php rename to thirdparty/html2ps_pdf/value.generic.php diff --git a/gulliver/thirdparty/html2ps_pdf/value.height.php b/thirdparty/html2ps_pdf/value.height.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/value.height.php rename to thirdparty/html2ps_pdf/value.height.php diff --git a/gulliver/thirdparty/html2ps_pdf/value.left.php b/thirdparty/html2ps_pdf/value.left.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/value.left.php rename to thirdparty/html2ps_pdf/value.left.php diff --git a/gulliver/thirdparty/html2ps_pdf/value.line-height.class.php b/thirdparty/html2ps_pdf/value.line-height.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/value.line-height.class.php rename to thirdparty/html2ps_pdf/value.line-height.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/value.list-style.class.php b/thirdparty/html2ps_pdf/value.list-style.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/value.list-style.class.php rename to thirdparty/html2ps_pdf/value.list-style.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/value.margin.class.php b/thirdparty/html2ps_pdf/value.margin.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/value.margin.class.php rename to thirdparty/html2ps_pdf/value.margin.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/value.max-height.php b/thirdparty/html2ps_pdf/value.max-height.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/value.max-height.php rename to thirdparty/html2ps_pdf/value.max-height.php diff --git a/gulliver/thirdparty/html2ps_pdf/value.min-height.php b/thirdparty/html2ps_pdf/value.min-height.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/value.min-height.php rename to thirdparty/html2ps_pdf/value.min-height.php diff --git a/gulliver/thirdparty/html2ps_pdf/value.padding.class.php b/thirdparty/html2ps_pdf/value.padding.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/value.padding.class.php rename to thirdparty/html2ps_pdf/value.padding.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/value.right.php b/thirdparty/html2ps_pdf/value.right.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/value.right.php rename to thirdparty/html2ps_pdf/value.right.php diff --git a/gulliver/thirdparty/html2ps_pdf/value.text-indent.class.php b/thirdparty/html2ps_pdf/value.text-indent.class.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/value.text-indent.class.php rename to thirdparty/html2ps_pdf/value.text-indent.class.php diff --git a/gulliver/thirdparty/html2ps_pdf/value.top.php b/thirdparty/html2ps_pdf/value.top.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/value.top.php rename to thirdparty/html2ps_pdf/value.top.php diff --git a/gulliver/thirdparty/html2ps_pdf/width.constraint.php b/thirdparty/html2ps_pdf/width.constraint.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/width.constraint.php rename to thirdparty/html2ps_pdf/width.constraint.php diff --git a/gulliver/thirdparty/html2ps_pdf/width.php b/thirdparty/html2ps_pdf/width.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/width.php rename to thirdparty/html2ps_pdf/width.php diff --git a/gulliver/thirdparty/html2ps_pdf/xhtml.autoclose.inc.php b/thirdparty/html2ps_pdf/xhtml.autoclose.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/xhtml.autoclose.inc.php rename to thirdparty/html2ps_pdf/xhtml.autoclose.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/xhtml.comments.inc.php b/thirdparty/html2ps_pdf/xhtml.comments.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/xhtml.comments.inc.php rename to thirdparty/html2ps_pdf/xhtml.comments.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/xhtml.deflist.inc.php b/thirdparty/html2ps_pdf/xhtml.deflist.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/xhtml.deflist.inc.php rename to thirdparty/html2ps_pdf/xhtml.deflist.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/xhtml.entities.inc.php b/thirdparty/html2ps_pdf/xhtml.entities.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/xhtml.entities.inc.php rename to thirdparty/html2ps_pdf/xhtml.entities.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/xhtml.lists.inc.php b/thirdparty/html2ps_pdf/xhtml.lists.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/xhtml.lists.inc.php rename to thirdparty/html2ps_pdf/xhtml.lists.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/xhtml.p.inc.php b/thirdparty/html2ps_pdf/xhtml.p.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/xhtml.p.inc.php rename to thirdparty/html2ps_pdf/xhtml.p.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/xhtml.script.inc.php b/thirdparty/html2ps_pdf/xhtml.script.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/xhtml.script.inc.php rename to thirdparty/html2ps_pdf/xhtml.script.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/xhtml.selects.inc.php b/thirdparty/html2ps_pdf/xhtml.selects.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/xhtml.selects.inc.php rename to thirdparty/html2ps_pdf/xhtml.selects.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/xhtml.style.inc.php b/thirdparty/html2ps_pdf/xhtml.style.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/xhtml.style.inc.php rename to thirdparty/html2ps_pdf/xhtml.style.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/xhtml.tables.inc.php b/thirdparty/html2ps_pdf/xhtml.tables.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/xhtml.tables.inc.php rename to thirdparty/html2ps_pdf/xhtml.tables.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/xhtml.utils.inc.php b/thirdparty/html2ps_pdf/xhtml.utils.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/xhtml.utils.inc.php rename to thirdparty/html2ps_pdf/xhtml.utils.inc.php diff --git a/gulliver/thirdparty/html2ps_pdf/xml.validation.inc.php b/thirdparty/html2ps_pdf/xml.validation.inc.php similarity index 100% rename from gulliver/thirdparty/html2ps_pdf/xml.validation.inc.php rename to thirdparty/html2ps_pdf/xml.validation.inc.php diff --git a/gulliver/thirdparty/htmlarea/editor.js b/thirdparty/htmlarea/editor.js similarity index 97% rename from gulliver/thirdparty/htmlarea/editor.js rename to thirdparty/htmlarea/editor.js index d4e0d6981..d83221f98 100644 --- a/gulliver/thirdparty/htmlarea/editor.js +++ b/thirdparty/htmlarea/editor.js @@ -1,1124 +1,1124 @@ -// -// htmlArea v2.03 - Copyright (c) 2002 interactivetools.com, inc. -// This copyright notice MUST stay intact for use (see license.txt). -// -// A free WYSIWYG editor replacement for '; - - // add context menu - editor += ''; - - // hide original textarea and insert htmlarea after it - if (!config.debug) { document.getElementById(objname).style.display = "none"; } - - if (config.plaintextInput) { // replace nextlines with breaks - var contents = document.getElementById(objname).value; - contents = contents.replace(/\r\n/g, '
      '); - contents = contents.replace(/\n/g, '
      '); - contents = contents.replace(/\r/g, '
      '); - document.getElementById(objname).value = contents; - } - - // insert wysiwyg - //document.getElementById(objname).insertAdjacentHTML('afterEnd', editor) - insertHTMLAfterEnd(document.getElementById(objname),editor); - - // convert htmlarea from textarea to wysiwyg editor - editor_setmode(objname, 'init'); - - // call filterOutput when user submits form - for (var idx=0; idx < document.forms.length; idx++) { - //var r = document.forms[idx].attachEvent('onsubmit', function() { editor_filterOutput(objname); }); - leimnud.event.add(document.forms[idx],'submit',function() { editor_filterOutput(objname); }); - //var r = document.forms[idx].attachEvent('onsubmit', function() { editor_filterOutput(objname); }); - //if (!r) { alert("Error attaching event to form!"); } - } - -return true; - -} - -/* ---------------------------------------------------------------------- *\ - Function : editor_action - Description : perform an editor command on selected editor content - Usage : - Arguments : button_id - button id string with editor and action name -\* ---------------------------------------------------------------------- */ - -function editor_action(button_id) { - - // split up button name into "editorID" and "cmdID" - var BtnParts = Array(); - BtnParts = button_id.split("_"); - var objname = button_id.replace(/^_(.*)_[^_]*$/, '$1'); - var cmdID = BtnParts[ BtnParts.length-1 ]; - var button_obj = document.getElementById(button_id); - var editor_obj = document.getElementById("_" +objname + "_editor"); - var config = document.getElementById(objname).config; - - // help popup - if (cmdID == 'showhelp') { - window.open(_editor_url + "popups/editor_help.html", 'EditorHelp'); - return; - } - - // popup editor - if (cmdID == 'popupeditor') { - window.open(_editor_url + "popups/fullscreen.html?"+objname, - 'FullScreen', - 'toolbar=no,location=no,directories=no,status=yes,menubar=no,scrollbars=yes,resizable=yes,width=640,height=480'); - return; - } - - // check editor mode (don't perform actions in textedit mode) - if (editor_obj.tagName.toLowerCase() == 'textarea') { return; } - - var editdoc = editor_obj.contentWindow.document; - editor_focus(editor_obj); - - // get index and value for pulldowns - var idx = button_obj.selectedIndex; - var val = (idx != null) ? button_obj[ idx ].value : null; - - if (0) {} // use else if for easy cutting and pasting - - // - // CUSTOM BUTTONS START HERE - // - - // Custom1 - else if (cmdID == 'custom1') { - alert("Hello, I am custom button 1!"); - } - - // Custom2 - else if (cmdID == 'custom2') { // insert some text from a popup window - var myTitle = "This is a custom title"; - var myText = showModalDialog(_editor_url + "popups/custom2.html", - myTitle, // str or obj specified here can be read from dialog as "window.dialogArguments" - "resizable: yes; help: no; status: no; scroll: no; "); - if (myText) { editor_insertHTML(objname, myText); } - } - - // Custom3 - else if (cmdID == 'custom3') { // insert some text - editor_insertHTML(objname, "It's easy to add buttons that insert text!"); - } - - // - // END OF CUSTOM BUTTONS - // - - // FontName - else if (cmdID == 'FontName' && val) { - editdoc.execCommand(cmdID,0,val); - } - - // FontSize - else if (cmdID == 'FontSize' && val) { - editdoc.execCommand(cmdID,0,val); - } - - // FontStyle (change CSS className) - else if (cmdID == 'FontStyle' && val) { - editdoc.execCommand('RemoveFormat'); - editdoc.execCommand('FontName',0,'636c6173734e616d6520706c616365686f6c646572'); - //var fontArray = editdoc.all.tags("FONT"); - var fontArray = editdoc.getElementsByTagName("FONT"); - for (i=0; i instead -// if (ord == 13 && editEvent.type == 'keypress') { -// editEvent.returnValue = false; -// editor_insertHTML(objname, "
      "); -// return; -// } - - if (ctrlKey && (ord == 122 || ord == 90)) { // catch ctrl-z (UNDO) -// TODO: Add our own undo/redo functionality -// editEvent.cancelBubble = true; - return; - } - if ((ctrlKey && (ord == 121 || ord == 89)) || - ctrlKey && shiftKey && (ord == 122 || ord == 90)) { // catch ctrl-y, ctrl-shift-z (REDO) -// TODO: Add our own undo/redo functionality - return; - } - } - - // setup timer for delayed updates (some events take time to complete) - if (runDelay > 0) { return setTimeout(function(){ editor_event(objname); }, runDelay); } - - // don't execute more than 3 times a second (eg: too soon after last execution) - if (this.tooSoon == 1 && runDelay >= 0) { this.queue = 1; return; } // queue all but urgent events - this.tooSoon = 1; - setTimeout(function(){ - this.tooSoon = 0; - if (this.queue) { editor_event(objname,-1); }; - this.queue = 0; - }, 333); // 1/3 second - - - editor_updateOutput(objname); - editor_updateToolbar(objname); - -} - -/* ---------------------------------------------------------------------- *\ - Function : editor_updateToolbar - Description : update toolbar state - Usage : - Arguments : objname - ID of textarea to replace - action - enable, disable, or update (default action) -\* ---------------------------------------------------------------------- */ - -function editor_updateToolbar(objname,action) { - var config = document.getElementById(objname).config; - var editor_obj = document.getElementById("_" +objname+ "_editor"); - - // disable or enable toolbar - - if (action == "enable" || action == "disable") { - var tbItems = new Array('FontName','FontSize','FontStyle'); // add pulldowns - for(var btnName=0;btnName

    - - - - -

    Version 2.02a (Released: December 5, 2002)
    - -

      -
    • fixed error in readme.html example code under "How do I add htmlArea to my web page?". -
    - -

- - - - - -

Version 2.02 (Released: December 5, 2002)
    - -

    Bug Fixes (Thanks to everybody in the forum for contributing and reporting bugs!)
    - -
  • fix nested script tag error (thanks to Phil Revill) - -

    New Features
    -
  • added 'replaceNextlines' config option to replace nextlines with spaces on output -
  • added 'plaintextInput' config option to replace nextlines with <br> tags on input -
- -

- - - - - -

Version 2.01 (Released: December 3, 2002)
    - -

    Bug Fixes (Thanks to everybody in the forum for contributing and reporting bugs!)
    - -
  • fixed "function not found" error for non IE5.5+ browsers (thanks to slowhand) -
  • popup editor - fixed javascript error caused during launch of popup (thanks to slowhand and Chlorel) -
  • popup editor - fixed toolbar 'linebreak' error (thanks to fbridge9 and RekiM) - -

    Documentation Updates
    -
  • Add two new questions to readme.html -
      -
    • Why do the toolbar buttons take so long to load when I have multiple htmlArea editors on the same page?
      -
    • Why do I get "non secure items" warnings when using htmlarea on a secure (SSL) https:// page?
      -
    - -

    - - - -

    Version 2.00 (official release) (Released: November 25, 2002)
      - -

      New Javascript Functions
      -
    • editor_getHTML(objname) - return HTML content of editor -
    • editor_setHTML(objname) - set HTML content of editor -
    • editor_appendHTML(objname) - add HTML content to editor - -

      New Features
      -
    • Popup "fullscreen" editor now has minimize and maximize buttons (switched from ModalDialog to popup window) - -

      Bug Fixes (Thanks to everybody in the forum for contributing and reporting bugs!)
      -
    • "Create Table" popup now creates tables with the correct number of cols and rows (thanks to Corey) -
    • Clicking on images no longer causes error when you have "CSS style pulldown" enabled (thanks to Virrdo) -
    • Fixed bug that prevented external stylesheets from working properly (thanks to slowhand) -
    • fixed javascript errors in Mozilla 1.0 (thanks to slowhand) -
    • moved browser detection code to editor page to prevent javascript errors from older browsers and prevent the editor from being loaded unless it's needed. -
    • submitting empty htmlarea now submits nothing "" instead of "<p>&nbsp;</p>" -
    • Popup "fullscreen" editor no longer generates error on "<>" html mode change - -

    - - - -

    Version 2.00 (beta2) (Released: October 16, 2002)
      - -

      New Docs
      -
    • created new readme.html with install instructions, faq, and lots of information - -

      New Features
      -
    • added support for stylesheets -
    • get enlarge/shrink window working -
    • get context menu working (still disabled by default, needs more code for functionality) -
    • allow user to change ANY option in internal config from calling page -
    • added _editor_filterOutput function that's called on form submit -
    • added insert table button - -

      Bug Fixes / Optimizations
      -
    • organized associated files into directories -
    • fixed bug that caused htmlarea to sometimes not display last entered content when user pressed back in their browser. -
    • moved about window into a separate file to reduce size of editor - -

    - - -

    Version 2.00 (beta1) (Released: August 19, 2002)
      - -

      visual changes
      -
    • added mouseover/mouseoff events and style for toolbar ui buttons -
    • update toolbar to take up less space and be smaller -
    • display point sizes beside HTML font sizes (eg: 7 (36px) -
    • change "about this editor" icon to an "i" -
    • created a help popup (content still needs to be written). -
    • added version number to about page. - -

      code changes
      -
    • added "defer" to script tag to prevent editor from being created until page loads -
    • simplified header that needs to be added to pages that contain editor -
    • generated script include tag using _editor_url so users don't have to enter URL twice -
    • moved CSS for editor toolbar buttons into editor.js -
    • switched to using object to pass configuration arguments to editor_generate -
    • general code improvements, optimizations and re-organization -
    • added hooks for keypress events for future use - -

      new features
      -
    • added pulldown for CSS style classnames -
    • added many many more config options including: -
    • ability to select which toolbar elements you want displayed -
    • ability to specify the order of toolbar elements -
    • ability to specify fonts, sizes, and CSS styles for pulldowns -
    • ability to set default font and style used in editor window -
    • debug flag that lets you see the source of the WYSIWYG field at all times -
    • add more sample code and comments showing how to add custom buttons - -

      bug fixes
      -
    • fixed error caused when height/width were manually specified (reported by jpeto, thanks!) -
    • "about this editor" window now works when in textedit mode -

    - - - - -

    Version 1.05 (Released: August 28, 2002)
      -
    • - Added support for textareas with underscores ("_") in their names.
    • -

    - - - -

    Version 1.04 (Released: August 27, 2002)
      -
    • Even more speed improvements (WYSIWYG editor is now much faster on older computers).
    • -
    • General code improvements and optimizations.
    • -

    - - - -

    Version 1.03 (Released: August 26, 2002)
      -
    • Beta release only
    • -

    - - - -

    Version 1.02 (Released: August 21, 2002)
      -
    • added editor_insertHTML() function. Developers can now easily add buttons that insert HTML or surround selected text with HTML.
    • -
    • removed unneeded debug code and comments to reduce editor.js file size (and load time).
    • -

    - - - -

    Version 1.01 (Released: August 20, 2002)
      -
    • optimized code to improve speed (WYSIWYG editor is now much faster)
    • -
    • added addition event handlers to update UI on mouse events.
    • -

    - - - -

    Version 1.00 (Released: August 19, 2002)
      -
    • Initial Release
    • -

    - - - - - -


    +htmlArea Help + + + + + + + + +
    +htmlArea v2.03
    +Turn any <textarea> into a WYSIWYG editor, a free script
    from your friends at interactivetools.com
    +
    +
    + + + +

    Introduction

    + +What is htmlArea?
    +Is it really free? What's the catch?
    +What are the browser requirements?
    +Can I see an example of what it looks like?
    +Where can I find out more info, download the latest version, and talk to other htmlArea users?
    + +

    Installation / Setup

    + +How do I add htmlArea to my web page?
    +I want to change the editor settings, how do I do that?
    +How can I change what controls are displayed on the toolbar?
    +How can I change what fonts are in the font list?
    +How can I change what sizes are in the font size?
    +How can I change what styles are in the font style (CSS) list?
    +How can I specify an external stylesheet for my styles?
    + +

    Frequently Asked Questions

    + +What the project goals for htmlArea?
    +This editor is pretty neat, so how does it actually work?
    +You don't happen to have one of these for (Netscape, Mozilla, Opera, Mac IE, etc) do you?
    +Why doesn't htmlArea output XHTML instead of regular HTML? Can you make it do that?
    +I'd like to be able to upload images from my hard drive, can you add that feature?
    +I'd like to <insert idea here>, can you add that feature?
    +Can I change the toolbar/button colors?
    +I love htmlArea, is there anything I can do to help the project?
    +Why do the toolbar buttons take so long to load when I have multiple htmlArea editors on the same page?
    + + +

    Known Bugs & Issues

    + +Undo/Redo doesn't work
    +Relative paths are converted to absolute paths
    +HTML header info (eg: <head>, <body>, etc) doesn't get preserved
    +Some tags (eg: noframes, noscript, etc) doesn't get preserved
    +htmlArea doesn't work when multiple textareas that have the same name
    +Why do I get "non secure items" warnings when using htmlarea on a secure (SSL) https:// page?
    + +

    Change Log

    + +View Change Log
    + + + +

    + + + +

    Introduction back to top

    +
    + + +

    What is htmlArea?
    +
    htmlArea is a free WYSIWYG (what you see is what you get) editor replacement for <textarea> fields. By adding a few +simple lines of JavaScript to your web page you can replace a regular textarea with a rich text +editor that let your users do the following: +

      +
    • Format text to be bold, italicized, or underlined.
    • +
    • Change the face, size, style and colour.
    • +
    • Left, centre, or right-justify paragraphs.
    • +
    • Make bulleted or numbered lists.
    • +
    • Indent or un-indent paragraphs.
    • +
    • Insert a horizontal line.
    • +
    • Insert hyperlinks and images.
    • +
    • View the raw HTML source of what they're editing.
    • +
    • and much more...
    • +
    + +

    Some of the interesting features of htmlArea that set's it apart from other web based WYSIWYG editors are as follows: + +

      +
    • It's lightweight, fast loading and can transform a regular textarea into a rich-text editor with a single line of JavaScript.
    • +
    • It's 100% backwards compatible with older or non-supported browsers (they get the original textarea field).
    • +
    • It's free and can be incorporated into any free or commercial program.
    • +
    • It works with any programming language (ASP, PHP, Perl, Java, etc).
    • +
    • It's written in simple JavaScript and can be easily viewed, modified or extended.
    • +
    • It remembers entered content when a user navigates away and then hits "back" in their browser.
    • +
    • Since it replaces existing textareas it doesn't require a lot of code to add it to your pages (just one line).
    • +
    • Did we mention it was free? : )
    • +
    + + +

    + + +

    Is it really free? What's the catch?
    +
    Yes! It's really free. You can use it, modify it, distribute it with your software, +or do just about anything you like with it. +

    + + + +

    What are the browser requirements?
    +
    htmlArea requires Internet Explorer 5.5 or better on Windows to run. This is because it +makes use of some advanced features of IE5.5 that aren't available in other browsers yet. +It is backwards compatible with other browsers, though. They will get a regular textarea +field instead of a WYSIWYG editor.

    + + + +

    Can I see an example of what it looks like?
    +
    Sure, make sure you're using IE5.5 or better on windows and see below. + +

    Here is a regular <textarea> field.
    + + +

    And here is a <textarea> transformed with htmlArea (with a single line of JavaScript code).

    + + + + +

    + + +

    Where can I find out more info, download the latest version, and talk to other htmlArea users?
    +
    You can find out more about htmlArea and download the latest version on the +htmlArea homepage +and you can talk to other htmlArea users and post any comments or suggestions you have in the +htmlArea forum. + +
    + + + +

    Installation / Setup back to top

    +
    + + +

    How do I add htmlArea to my web page?
    +
    It's easy, first you need to upload the htmlArea files to your website. Just follow these steps: + +

      +
    1. Download the latest version from the htmlArea homepage.
    2. +
    3. Unzip the files onto your local computer (making sure to maintain the directory structure contained in the zip).
    4. +
    5. Create a new folder on your website called /htmlarea/ (make sure it's NOT inside the cgi-bin).
    6. +
    7. Transfer all the htmlArea files from your local computer into the /htmlarea/ folder on your website.
    8. +
    9. Open the example page /htmlarea/example.html with your browser to make sure everything works.
    10. +

    + +Once htmlArea is on your website all you need to do is add some JavaScript to any pages that you want to +add WYSIWYG editors to. Here's how to do that. + +

      +
    1. Open the page you want to add a WYSIWYG editor to. Add the following to the top of +the page in the <head></head> of the HTML document. +
      +<script language="Javascript1.2"><!-- // load htmlarea
      +_editor_url = "";                     // URL to htmlarea files
      +var win_ie_ver = parseFloat(navigator.appVersion.split("MSIE")[1]);
      +if (navigator.userAgent.indexOf('Mac')        >= 0) { win_ie_ver = 0; }
      +if (navigator.userAgent.indexOf('Windows CE') >= 0) { win_ie_ver = 0; }
      +if (navigator.userAgent.indexOf('Opera')      >= 0) { win_ie_ver = 0; }
      +if (win_ie_ver >= 5.5) {
      +  document.write('<scr' + 'ipt src="' +_editor_url+ 'editor.js"');
      +  document.write(' language="Javascript1.2"></scr' + 'ipt>');  
      +} else { document.write('<scr'+'ipt>function editor_generate() { return false; }</scr'+'ipt>'); }
      +// --></script> +
      +If you've installed htmlArea anywhere other than /htmlarea/ then be sure to change _editor_url to point to +your htmlarea directory (ending with a forward slash "/").
    2. + +

    3. For each <textarea> that you want to change, add the following code to the page. +
      +<script language="JavaScript1.2" defer>
      +editor_generate('fieldname');
      +</script>
      +
      +Be sure to change "fieldname" to be the name (not id) of the textarea you want to change.
    4. + +

    5. And you're done, open your page in your browser and see if it worked. If you run into +any problems, keep trying and feel free to visit the +htmlArea forum.
    6. +

    + + +

    I want to change the editor settings, how do I do that?
    +
    While it's true that all you need is one line of JavaScript to create an htmlArea WYSIWYG editor +you can also specify more config settings in the code to control how the editor works and looks. Here's an +example of some of the available settings: +
    +<script language="JavaScript1.2" defer>
    +var config = new Object(); // create new config object

    + +config.width = "90%";
    +config.height = "200px";
    +config.bodyStyle = 'background-color: white; font-family: "Verdana"; font-size: x-small;';
    +config.debug = 0;

    + +// Add additional editor config settings here...

    + +editor_generate('fieldname',config);
    +</script>
    +
    +See below for even more configuration options that can be added. All of these settings will use +default values in editor.js if you don't specify them yourself. +

    + + + + +
    Widthspecifies the width of the editor (in pixels or as a percentage).
    Heightspecifies the height of the editor (in pixels or as a percentage).
    bodyStylespecifies CSS style of the editor window including color, default font face, and size. Note, the default font information isn't saved, it just controls how text is displayed if no other font formatting has been applied.
    debugif set to 1, displays a debug field with the actual contents of the editor (in raw html) which is updated as your type.
    +

    + + +

    How can I change what controls are displayed on the toolbar?
    +
    You can add a config.toolbar config setting to control exactly what's shown on the toolbar. +Here's an example. +
    +config.toolbar = [
    +   ['fontname'],
    +   ['fontsize'],
    +   ['fontstyle'],
    +   ['linebreak'],
    +   ['bold','italic','underline','separator'],
    +   ['strikethrough','subscript','superscript','separator'],
    +   ['justifyleft','justifycenter','justifyright','separator'],
    +   ['OrderedList','UnOrderedList','Outdent','Indent','separator'],
    +   ['forecolor','backcolor','separator'],
    +//['custom1','custom2','custom3','separator'],
    +   ['HorizontalRule','Createlink','InsertImage','htmlmode','separator'],
    +   ['about','help']
    +]; +
    +The square brackets control how the buttons are "grouped" together. You can either erase +or comment out (by adding // to the beginning of the line) buttons or button groups you don't +want displayed. Most of the buttons do pretty much just what you'd expect, but here's a few +odd ones for reference. +

    + + + +
    linebreakadds a linebreak to the toolbar, all buttons after this are on the next line.
    separatoradds a vertical separator between buttons, helps to visually group buttons together
    customNthese are custom buttons that can be defined by JavaScript programmers who want to extend htmlArea.
    +

    + + +

    How can I change what fonts are in the font list?
    +
    There is a config.fontnames setting that lets you control this. See below. +
    +config.fontnames = {
    +   "Arial":           "arial, helvetica, sans-serif",
    +   "Courier New":     "courier new, courier, mono",
    +   "Georgia":         "Georgia, Times New Roman, Times, Serif",
    +   "Tahoma":          "Tahoma, Arial, Helvetica, sans-serif",
    +   "Times New Roman": "times new roman, times, serif",
    +   "Verdana":         "Verdana, Arial, Helvetica, sans-serif",
    +   "impact":          "impact",
    +   "WingDings":       "WingDings"
    +};
    +
    +The name on the left is what is displayed to the user. The list of fonts on the right is what is +actually put into the font tag in the code.

    + + +

    How can I change what sizes are in the font size?
    +
    There is a config.fontsizes setting that lets you control this. See below. +
    +config.fontsizes = {
    +   "1 (8 pt)":  "1",
    +   "2 (10 pt)": "2",
    +   "3 (12 pt)": "3",
    +   "4 (14 pt)": "4",
    +   "5 (18 pt)": "5",
    +   "6 (24 pt)": "6",
    +   "7 (36 pt)": "7"
    + };
    +
    +The value on the right is what the user sees, the value on the left is the actual font size used. +

    + + +

    How can I change what styles are in the font style (CSS) list?
    +
    As you can probably guess, there's a config.fontstyles setting for this. Now remember, the +styles defined here control how the text looks in the editor. These styles ALSO have to be defined +on any page where you display content created with the editor. htmlArea will save the class name +with the content but nothing else. It's up to you to define the class style in your pages. +
    + +config.fontstyles = [{
    +   name: "headline",
    +   className: "headline",
    +   classStyle: "font-family: arial; font-size: 28px;"
    + },{
    +   name: "red text",
    +   className: "saletext2",
    +   classStyle: ""
    +}];
    +
    +The "name" is what's displayed to users, "className" is the name of the CSS class to use, and +classStyle defines the attributes of the style in the editor. If you leave classStyle blank +you have to be sure to also specify an external stylesheet with all the style information (and +matching classNames!). See the next question on how to do that. +

    + + + + +

    How can I specify an external stylesheet for my styles?
    +
    You can specify a stylesheet to avoid entering the class style data for each class name. +You STILL have to specify which classNames you want to have available though, see the previous +question for information on that. +
    +config.stylesheet = "/style.css";
    +
    +

    + +
    + + + +

    Frequently Asked Questions back to top

    +
    + + +

    What are the project goals for htmlArea?
    +
    When we originally started the htmlArea project we had some pretty specific +goals in mind for how it would work and what issues were important to us. Those +goals still lead the direction of development today and are listed below in order +of priority. + +
      +

    1. Compatibility
    2. +
      htmlArea has to always be backwards compatible with older and unsupported browsers. This +ensures that even if a user with an older and unsupported browser can't use htmlArea, they'll always be able to, at a minimum, +enter text in a plain textarea like they would have done before. + +htmlArea should also be compatible with as many programming languages as possible by being +completely DHTML and JavaScript based. + +
      + +

    3. Ease of Use
    4. +
      htmlArea needs to be easy for developers to +integrate into their applications and customize, easy for programmers to extend +and modify, and easy for end users to "use". That's why you only have to add a +single line of JavaScript for each textarea you want to convert, and why all the +code is stored in a single, easy to follow JavaScript file. That's why htmlArea +can be used with almost any programming language (ASP, PHP, Perl, Java, etc), +and that the toolbar is streamlined, customizable by developers, and follows the +conventions of common word processing programs.
      + +

    5. Lightweight
    6. +
      htmlArea needs to be fast loading, allow the user to perform word processing functions at a +reasonable speed, and not put a lot of strain on a user's browser. To these ends we've +managed to keep the main editor program in a single file of only 40k and we've written the editor +in such a way that it has a minimal impact on the resources of the browser it is running in. +In addition, where we make use of popup windows to perform additional functions we try to put as +much code as possible in the popup window so it doesn't increase the size of the base editor.
      + +
    + +

    + + + +

    This editor is pretty neat, so how does it actually work?
    +
    htmlArea is based on the MSHTML Editing Platform +in Internet Explorer 5.5+ on windows. Basically, Internet Explorer includes some functionality to make sections of a +webpage editable by defining a "contentEditable" attribute or "designMode" property. It also provides some built in +commands +for performing common web editing operations (bold, italic, center, insert image, etc). + +

    htmlArea builds on the features provided by Internet Explorer and adds its own user definable toolbar, +an easy method to include a WYSIWYG editor in a web page (replacing textareas), an easy way to save user +changes, as well as a number of custom web editing commands of its own. + +

    How htmlArea actually works is it replaces a textarea with an (user definable) toolbar, an iframe that +has the "contentEditable" attribute set to true, and a hidden field with the same name as your original +textarea that gets updated automatically when you modify content in the editor. + +

    The user can enter or modify text as well as use keyboard shortcuts and toolbar buttons to perform operations +on the content. A lot of the editor commands are built into IE and called via +the execCommand +method, but htmlArea also includes other custom commands and functions written in JavaScript and stored in +the editor.js file or the popup windows (in the /popups/ folder). + + +

    + + +

    You don't happen to have one of these for (Netscape, Mozilla, Opera, Mac IE, etc) do you?
    +
    No. None of these other browsers (including IE for Mac) support "contentEditable" or a way to make +existing content in the page editable. It might be possible to emulate this in JavaScript, but it would +be a lot of work. Other problems include displaying or emulating the flashing | bar cursor you see when +editing. The cross-platform Mozilla browser has some bug entries related to adding contentEditable +functionality, and perhaps in the future it may be possible to create something for that browser. +

    Although it's a long shot, you might want to send a friendly letter to Microsoft to encourage them to +make the "contentEditable" functionality work on IE for the Macintosh. Once they implement it, we can offer it. + + +

    + + +

    Why doesn't htmlArea output XHTML instead of regular HTML? Can you make it do that?
    +
    The HTML output by htmlArea is generated by the built in functionality of Internet Explorer. +For that reason, there is no easy way to have it output XHTML. If we were going to do it, the way +to do so would be to parse the HTML after it's output by IE and convert it to XHTML. That's something +we hope to do at some point. + +

    + + +

    I'd like to be able to upload images from my hard drive, can you add that feature?
    +
    No. We want htmlArea to be compatible with as many programming languages as possible. Because it's +written in client side JavaScript, it should work with any programming language. If we start adding +language specific features htmlArea won't be as useful to as many people. That said, there's a lot of +free "file upload" scripts available, and htmlArea does include a function called editor_insertHTML()\ +for inserting text or HTML tags. If you want to write your own program for doing this it should be +that hard. Alternatively, you might check in the forum to see if someone already has. +

    + + +

    I'd like to <insert idea here>, can you add that feature?
    +
    Maybe, maybe not. If it's a good feature and it fits in with the goals of our project we'll +likely consider it. The best thing to do is post your suggestions to the +forum. At the very least +we'll try to give you some suggestions and point you in the right direction. At best you might +find somebody else has already implemented the feature you were hoping for. + + +

    + + +

    Can I change the toolbar/button colors?
    +
    Yes, just search for "buttonface" and "buttonhighlight" in editor.js and change those to whatever colors +you like. If you haven't heard of those colors before, it's because they're special windows colors +that match whatever color scheme the user has selected for their desktop. For example, if someone +has changed their desktop color scheme to "lilac", the WYSIWYG editor toolbar and buttons will match that +theme. Try it, it's really neat.

    + + +

    I love htmlArea, is there anything I can do to help the project?
    +
    The number one thing you can do to help is also the easiest thing to do; give us a link on your website. +The more people who can find out about htmlArea the better it will be. + +

    The next best thing you can do is participate in our +forum and post a message or two to +help other htmlArea users (or learn something new yourself). + +

    Lastly, any code improvements you want to share would certainly be welcome as well.

    + + +

    Why do the toolbar buttons take so long to load when I have multiple htmlArea editors on the same page?
    +
    This is a bug/feature of Internet Explorer. htmlArea dynamically updates the content of your page to replace +a textarea with the WYSIWYG editor. In Internet Explorer, when you update the content of a page after it has loaded +and insert an image it will load the image from the server EVEN if has the image in it's cache. This means if you have 10 +htmlareas on the same page the "bold" toolbar button will be loaded 10 times. + +

    One workaround for this is to move all your editor_generate() scripts to the bottom of the page, combine them +into one script tag, and remove the "defer" attribute from that script tag. This will cause them all to run just +as the page is finishing loading and the cached images WILL be used. Meaning, the browser will only need to load each +image once. + + +

    + + + +

    Known Bugs and Issues back to top

    +
    + + +

    Undo/Redo doesn't work
    +
    We update a hidden field every time you make a change in the editor so the hidden field will be +submitted when you submit the form. The way undo/redo works in Internet Explorer it seems to reset +the undo buffer every time you use JavaScript to set the value of a form element or otherwise make +changes to the page. Because of this the built in undo/redo functionality of the browser doesn't +work. We hope to implement our own undo/redo functionality at a future point.

    + + +

    Relative paths are converted to absolute paths
    +
    Internet Explorer has a tendency to convert relative paths into absolute paths. We've seen some +implementations of WYSIWYG editors that maintain relative paths "better" than others but certain operations +(such as dragging and dropping, etc) still convert relative paths to absolute paths. We hope to find a +workaround for this in a future version. +

    + + +

    HTML header info (eg: <head>, <body>, etc) doesn't get preserved
    +
    This is due to Internet Explorer and the way the editor works. The editor already has a +HTML header of its own so inserting another one confuses the browser and the content gets thrown +away. The best solution is to have another plain text textarea field for HTML header information.

    + + +

    Some tags (eg: noframes, noscript, etc) doesn't get preserved
    +
    This is a result of how Internet Explorer works. It seems to discard certain tags that it +doesn't need to display. Because htmlArea reads the content back from the browser it cannot +preserve content the browser has "thrown away".

    + + +

    htmlArea doesn't work with multiple textareas that have the same name
    +
    If you have two or more textareas with the same name on the same page and you try +to convert one or more of them into a WYSIWYG editor htmlArea won't work. This is because htmlArea +looks up the textareas by name in the entire page, not just inside a specific form. There's currently +no workaround for this. We hope to resolve it in a future release.

    + + +

    Why do I get "non secure items" warnings when using htmlarea on a secure (SSL) https:// page?
    +
    This is a bug/feature of Internet Explorer. Even if you get unsecure warnings your form contents should +still be submitted securely. + +

    htmlArea uses an <iframe> to contain the editor and because the contents of the iframe isn't being +loaded off a secure site, Internet Explorer thinks the iframe is unsecure. The problem is, the iframe doesn't +load anything off any site, it's blank, it doesn't even have a src attribute. We just create an empty iframe +and then use javascript to update it. We hope to have this fixed in a future release. + +

    Note: There's a clever workaround for this problem posted in the forum here. +The only issue with it is that can cause the back button to not work as intended (it goes back in the iframe first). + +

    + + + +
    + +

    Change Log back to top

    +
    + + + + + + + + + +

    Version 2.03 (Released: December 17, 2002)
    + +

      +
    • new license - switched to "BSD style" software license. The "About this editor" button is no longer required. +
    • readme updates - minor updates, spelling, and grammer fixes. +
    + +

+ + + + +

Version 2.02a (Released: December 5, 2002)
+ +

    +
  • fixed error in readme.html example code under "How do I add htmlArea to my web page?". +
+ +

+ + + + + +

Version 2.02 (Released: December 5, 2002)
    + +

    Bug Fixes (Thanks to everybody in the forum for contributing and reporting bugs!)
    + +
  • fix nested script tag error (thanks to Phil Revill) + +

    New Features
    +
  • added 'replaceNextlines' config option to replace nextlines with spaces on output +
  • added 'plaintextInput' config option to replace nextlines with <br> tags on input +
+ +

+ + + + + +

Version 2.01 (Released: December 3, 2002)
    + +

    Bug Fixes (Thanks to everybody in the forum for contributing and reporting bugs!)
    + +
  • fixed "function not found" error for non IE5.5+ browsers (thanks to slowhand) +
  • popup editor - fixed javascript error caused during launch of popup (thanks to slowhand and Chlorel) +
  • popup editor - fixed toolbar 'linebreak' error (thanks to fbridge9 and RekiM) + +

    Documentation Updates
    +
  • Add two new questions to readme.html +
      +
    • Why do the toolbar buttons take so long to load when I have multiple htmlArea editors on the same page?
      +
    • Why do I get "non secure items" warnings when using htmlarea on a secure (SSL) https:// page?
      +
    + +

    + + + +

    Version 2.00 (official release) (Released: November 25, 2002)
      + +

      New Javascript Functions
      +
    • editor_getHTML(objname) - return HTML content of editor +
    • editor_setHTML(objname) - set HTML content of editor +
    • editor_appendHTML(objname) - add HTML content to editor + +

      New Features
      +
    • Popup "fullscreen" editor now has minimize and maximize buttons (switched from ModalDialog to popup window) + +

      Bug Fixes (Thanks to everybody in the forum for contributing and reporting bugs!)
      +
    • "Create Table" popup now creates tables with the correct number of cols and rows (thanks to Corey) +
    • Clicking on images no longer causes error when you have "CSS style pulldown" enabled (thanks to Virrdo) +
    • Fixed bug that prevented external stylesheets from working properly (thanks to slowhand) +
    • fixed javascript errors in Mozilla 1.0 (thanks to slowhand) +
    • moved browser detection code to editor page to prevent javascript errors from older browsers and prevent the editor from being loaded unless it's needed. +
    • submitting empty htmlarea now submits nothing "" instead of "<p>&nbsp;</p>" +
    • Popup "fullscreen" editor no longer generates error on "<>" html mode change + +

    + + + +

    Version 2.00 (beta2) (Released: October 16, 2002)
      + +

      New Docs
      +
    • created new readme.html with install instructions, faq, and lots of information + +

      New Features
      +
    • added support for stylesheets +
    • get enlarge/shrink window working +
    • get context menu working (still disabled by default, needs more code for functionality) +
    • allow user to change ANY option in internal config from calling page +
    • added _editor_filterOutput function that's called on form submit +
    • added insert table button + +

      Bug Fixes / Optimizations
      +
    • organized associated files into directories +
    • fixed bug that caused htmlarea to sometimes not display last entered content when user pressed back in their browser. +
    • moved about window into a separate file to reduce size of editor + +

    + + +

    Version 2.00 (beta1) (Released: August 19, 2002)
      + +

      visual changes
      +
    • added mouseover/mouseoff events and style for toolbar ui buttons +
    • update toolbar to take up less space and be smaller +
    • display point sizes beside HTML font sizes (eg: 7 (36px) +
    • change "about this editor" icon to an "i" +
    • created a help popup (content still needs to be written). +
    • added version number to about page. + +

      code changes
      +
    • added "defer" to script tag to prevent editor from being created until page loads +
    • simplified header that needs to be added to pages that contain editor +
    • generated script include tag using _editor_url so users don't have to enter URL twice +
    • moved CSS for editor toolbar buttons into editor.js +
    • switched to using object to pass configuration arguments to editor_generate +
    • general code improvements, optimizations and re-organization +
    • added hooks for keypress events for future use + +

      new features
      +
    • added pulldown for CSS style classnames +
    • added many many more config options including: +
    • ability to select which toolbar elements you want displayed +
    • ability to specify the order of toolbar elements +
    • ability to specify fonts, sizes, and CSS styles for pulldowns +
    • ability to set default font and style used in editor window +
    • debug flag that lets you see the source of the WYSIWYG field at all times +
    • add more sample code and comments showing how to add custom buttons + +

      bug fixes
      +
    • fixed error caused when height/width were manually specified (reported by jpeto, thanks!) +
    • "about this editor" window now works when in textedit mode +

    + + + + +

    Version 1.05 (Released: August 28, 2002)
      +
    • - Added support for textareas with underscores ("_") in their names.
    • +

    + + + +

    Version 1.04 (Released: August 27, 2002)
      +
    • Even more speed improvements (WYSIWYG editor is now much faster on older computers).
    • +
    • General code improvements and optimizations.
    • +

    + + + +

    Version 1.03 (Released: August 26, 2002)
      +
    • Beta release only
    • +

    + + + +

    Version 1.02 (Released: August 21, 2002)
      +
    • added editor_insertHTML() function. Developers can now easily add buttons that insert HTML or surround selected text with HTML.
    • +
    • removed unneeded debug code and comments to reduce editor.js file size (and load time).
    • +

    + + + +

    Version 1.01 (Released: August 20, 2002)
      +
    • optimized code to improve speed (WYSIWYG editor is now much faster)
    • +
    • added addition event handlers to update UI on mouse events.
    • +

    + + + +

    Version 1.00 (Released: August 19, 2002)
      +
    • Initial Release
    • +

    + + + + + +


    \ No newline at end of file diff --git a/gulliver/thirdparty/jsmin/jsmin.php b/thirdparty/jsmin/jsmin.php similarity index 96% rename from gulliver/thirdparty/jsmin/jsmin.php rename to thirdparty/jsmin/jsmin.php index 5e4e9b81f..a1fc36dcc 100644 --- a/gulliver/thirdparty/jsmin/jsmin.php +++ b/thirdparty/jsmin/jsmin.php @@ -1,386 +1,386 @@ - - * @copyright 2002 Douglas Crockford (jsmin.c) - * @copyright 2008 Ryan Grove (PHP port) - * @copyright 2012 Adam Goforth (Updates) - * @license http://opensource.org/licenses/mit-license.php MIT License - * @version 1.1.2 (2012-05-01) - * @link https://github.com/rgrove/jsmin-php - */ - -class JSMin { - const ORD_LF = 10; - const ORD_SPACE = 32; - const ACTION_KEEP_A = 1; - const ACTION_DELETE_A = 2; - const ACTION_DELETE_A_B = 3; - - protected $a = ''; - protected $b = ''; - protected $input = ''; - protected $inputIndex = 0; - protected $inputLength = 0; - protected $lookAhead = null; - protected $output = ''; - - // -- Public Static Methods -------------------------------------------------- - - /** - * Minify Javascript - * - * @uses __construct() - * @uses min() - * @param string $js Javascript to be minified - * @return string - */ - public static function minify($js) { - $jsmin = new JSMin($js); - return $jsmin->min(); - } - - // -- Public Instance Methods ------------------------------------------------ - - /** - * Constructor - * - * @param string $input Javascript to be minified - */ - public function __construct($input) { - $this->input = str_replace("\r\n", "\n", $input); - $this->inputLength = strlen($this->input); - } - - // -- Protected Instance Methods --------------------------------------------- - - /** - * Action -- do something! What to do is determined by the $command argument. - * - * action treats a string as a single character. Wow! - * action recognizes a regular expression if it is preceded by ( or , or =. - * - * @uses next() - * @uses get() - * @throws JSMinException If parser errors are found: - * - Unterminated string literal - * - Unterminated regular expression set in regex literal - * - Unterminated regular expression literal - * @param int $command One of class constants: - * ACTION_KEEP_A Output A. Copy B to A. Get the next B. - * ACTION_DELETE_A Copy B to A. Get the next B. (Delete A). - * ACTION_DELETE_A_B Get the next B. (Delete B). - */ - protected function action($command) { - switch($command) { - case self::ACTION_KEEP_A: - $this->output .= $this->a; - - case self::ACTION_DELETE_A: - $this->a = $this->b; - - if ($this->a === "'" || $this->a === '"') { - for (;;) { - $this->output .= $this->a; - $this->a = $this->get(); - - if ($this->a === $this->b) { - break; - } - - if (ord($this->a) <= self::ORD_LF) { - throw new JSMinException('Unterminated string literal.'); - } - - if ($this->a === '\\') { - $this->output .= $this->a; - $this->a = $this->get(); - } - } - } - - case self::ACTION_DELETE_A_B: - $this->b = $this->next(); - - if ($this->b === '/' && ( - $this->a === '(' || $this->a === ',' || $this->a === '=' || - $this->a === ':' || $this->a === '[' || $this->a === '!' || - $this->a === '&' || $this->a === '|' || $this->a === '?' || - $this->a === '{' || $this->a === '}' || $this->a === ';' || - $this->a === "\n" )) { - - $this->output .= $this->a . $this->b; - - for (;;) { - $this->a = $this->get(); - - if ($this->a === '[') { - /* - inside a regex [...] set, which MAY contain a '/' itself. Example: mootools Form.Validator near line 460: - return Form.Validator.getValidator('IsEmpty').test(element) || (/^(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]\.?){0,63}[a-z0-9!#$%&'*+/=?^_`{|}~-]@(?:(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)*[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\])$/i).test(element.get('value')); - */ - for (;;) { - $this->output .= $this->a; - $this->a = $this->get(); - - if ($this->a === ']') { - break; - } elseif ($this->a === '\\') { - $this->output .= $this->a; - $this->a = $this->get(); - } elseif (ord($this->a) <= self::ORD_LF) { - throw new JSMinException('Unterminated regular expression set in regex literal.'); - } - } - } elseif ($this->a === '/') { - break; - } elseif ($this->a === '\\') { - $this->output .= $this->a; - $this->a = $this->get(); - } elseif (ord($this->a) <= self::ORD_LF) { - throw new JSMinException('Unterminated regular expression literal.'); - } - - $this->output .= $this->a; - } - - $this->b = $this->next(); - } - } - } - - /** - * Get next char. Convert ctrl char to space. - * - * @return string|null - */ - protected function get() { - $c = $this->lookAhead; - $this->lookAhead = null; - - if ($c === null) { - if ($this->inputIndex < $this->inputLength) { - $c = substr($this->input, $this->inputIndex, 1); - $this->inputIndex += 1; - } else { - $c = null; - } - } - - if ($c === "\r") { - return "\n"; - } - - if ($c === null || $c === "\n" || ord($c) >= self::ORD_SPACE) { - return $c; - } - - return ' '; - } - - /** - * Is $c a letter, digit, underscore, dollar sign, or non-ASCII character. - * - * @return bool - */ - protected function isAlphaNum($c) { - return ord($c) > 126 || $c === '\\' || preg_match('/^[\w\$]$/', $c) === 1; - } - - /** - * Perform minification, return result - * - * @uses action() - * @uses isAlphaNum() - * @uses get() - * @uses peek() - * @return string - */ - protected function min() { - if (0 == strncmp($this->peek(), "\xef", 1)) { - $this->get(); - $this->get(); - $this->get(); - } - - $this->a = "\n"; - $this->action(self::ACTION_DELETE_A_B); - - while ($this->a !== null) { - switch ($this->a) { - case ' ': - if ($this->isAlphaNum($this->b)) { - $this->action(self::ACTION_KEEP_A); - } else { - $this->action(self::ACTION_DELETE_A); - } - break; - - case "\n": - switch ($this->b) { - case '{': - case '[': - case '(': - case '+': - case '-': - case '!': - case '~': - $this->action(self::ACTION_KEEP_A); - break; - - case ' ': - $this->action(self::ACTION_DELETE_A_B); - break; - - default: - if ($this->isAlphaNum($this->b)) { - $this->action(self::ACTION_KEEP_A); - } - else { - $this->action(self::ACTION_DELETE_A); - } - } - break; - - default: - switch ($this->b) { - case ' ': - if ($this->isAlphaNum($this->a)) { - $this->action(self::ACTION_KEEP_A); - break; - } - - $this->action(self::ACTION_DELETE_A_B); - break; - - case "\n": - switch ($this->a) { - case '}': - case ']': - case ')': - case '+': - case '-': - case '"': - case "'": - $this->action(self::ACTION_KEEP_A); - break; - - default: - if ($this->isAlphaNum($this->a)) { - $this->action(self::ACTION_KEEP_A); - } - else { - $this->action(self::ACTION_DELETE_A_B); - } - } - break; - - default: - $this->action(self::ACTION_KEEP_A); - break; - } - } - } - - return $this->output; - } - - /** - * Get the next character, skipping over comments. peek() is used to see - * if a '/' is followed by a '/' or '*'. - * - * @uses get() - * @uses peek() - * @throws JSMinException On unterminated comment. - * @return string - */ - protected function next() { - $c = $this->get(); - - if ($c === '/') { - switch($this->peek()) { - case '/': - for (;;) { - $c = $this->get(); - - if (ord($c) <= self::ORD_LF) { - return $c; - } - } - - case '*': - $this->get(); - - for (;;) { - switch($this->get()) { - case '*': - if ($this->peek() === '/') { - $this->get(); - return ' '; - } - break; - - case null: - throw new JSMinException('Unterminated comment.'); - } - } - - default: - return $c; - } - } - - return $c; - } - - /** - * Get next char. If is ctrl character, translate to a space or newline. - * - * @uses get() - * @return string|null - */ - protected function peek() { - $this->lookAhead = $this->get(); - return $this->lookAhead; - } -} - -// -- Exceptions --------------------------------------------------------------- -class JSMinException extends Exception {} + + * @copyright 2002 Douglas Crockford (jsmin.c) + * @copyright 2008 Ryan Grove (PHP port) + * @copyright 2012 Adam Goforth (Updates) + * @license http://opensource.org/licenses/mit-license.php MIT License + * @version 1.1.2 (2012-05-01) + * @link https://github.com/rgrove/jsmin-php + */ + +class JSMin { + const ORD_LF = 10; + const ORD_SPACE = 32; + const ACTION_KEEP_A = 1; + const ACTION_DELETE_A = 2; + const ACTION_DELETE_A_B = 3; + + protected $a = ''; + protected $b = ''; + protected $input = ''; + protected $inputIndex = 0; + protected $inputLength = 0; + protected $lookAhead = null; + protected $output = ''; + + // -- Public Static Methods -------------------------------------------------- + + /** + * Minify Javascript + * + * @uses __construct() + * @uses min() + * @param string $js Javascript to be minified + * @return string + */ + public static function minify($js) { + $jsmin = new JSMin($js); + return $jsmin->min(); + } + + // -- Public Instance Methods ------------------------------------------------ + + /** + * Constructor + * + * @param string $input Javascript to be minified + */ + public function __construct($input) { + $this->input = str_replace("\r\n", "\n", $input); + $this->inputLength = strlen($this->input); + } + + // -- Protected Instance Methods --------------------------------------------- + + /** + * Action -- do something! What to do is determined by the $command argument. + * + * action treats a string as a single character. Wow! + * action recognizes a regular expression if it is preceded by ( or , or =. + * + * @uses next() + * @uses get() + * @throws JSMinException If parser errors are found: + * - Unterminated string literal + * - Unterminated regular expression set in regex literal + * - Unterminated regular expression literal + * @param int $command One of class constants: + * ACTION_KEEP_A Output A. Copy B to A. Get the next B. + * ACTION_DELETE_A Copy B to A. Get the next B. (Delete A). + * ACTION_DELETE_A_B Get the next B. (Delete B). + */ + protected function action($command) { + switch($command) { + case self::ACTION_KEEP_A: + $this->output .= $this->a; + + case self::ACTION_DELETE_A: + $this->a = $this->b; + + if ($this->a === "'" || $this->a === '"') { + for (;;) { + $this->output .= $this->a; + $this->a = $this->get(); + + if ($this->a === $this->b) { + break; + } + + if (ord($this->a) <= self::ORD_LF) { + throw new JSMinException('Unterminated string literal.'); + } + + if ($this->a === '\\') { + $this->output .= $this->a; + $this->a = $this->get(); + } + } + } + + case self::ACTION_DELETE_A_B: + $this->b = $this->next(); + + if ($this->b === '/' && ( + $this->a === '(' || $this->a === ',' || $this->a === '=' || + $this->a === ':' || $this->a === '[' || $this->a === '!' || + $this->a === '&' || $this->a === '|' || $this->a === '?' || + $this->a === '{' || $this->a === '}' || $this->a === ';' || + $this->a === "\n" )) { + + $this->output .= $this->a . $this->b; + + for (;;) { + $this->a = $this->get(); + + if ($this->a === '[') { + /* + inside a regex [...] set, which MAY contain a '/' itself. Example: mootools Form.Validator near line 460: + return Form.Validator.getValidator('IsEmpty').test(element) || (/^(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]\.?){0,63}[a-z0-9!#$%&'*+/=?^_`{|}~-]@(?:(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)*[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\])$/i).test(element.get('value')); + */ + for (;;) { + $this->output .= $this->a; + $this->a = $this->get(); + + if ($this->a === ']') { + break; + } elseif ($this->a === '\\') { + $this->output .= $this->a; + $this->a = $this->get(); + } elseif (ord($this->a) <= self::ORD_LF) { + throw new JSMinException('Unterminated regular expression set in regex literal.'); + } + } + } elseif ($this->a === '/') { + break; + } elseif ($this->a === '\\') { + $this->output .= $this->a; + $this->a = $this->get(); + } elseif (ord($this->a) <= self::ORD_LF) { + throw new JSMinException('Unterminated regular expression literal.'); + } + + $this->output .= $this->a; + } + + $this->b = $this->next(); + } + } + } + + /** + * Get next char. Convert ctrl char to space. + * + * @return string|null + */ + protected function get() { + $c = $this->lookAhead; + $this->lookAhead = null; + + if ($c === null) { + if ($this->inputIndex < $this->inputLength) { + $c = substr($this->input, $this->inputIndex, 1); + $this->inputIndex += 1; + } else { + $c = null; + } + } + + if ($c === "\r") { + return "\n"; + } + + if ($c === null || $c === "\n" || ord($c) >= self::ORD_SPACE) { + return $c; + } + + return ' '; + } + + /** + * Is $c a letter, digit, underscore, dollar sign, or non-ASCII character. + * + * @return bool + */ + protected function isAlphaNum($c) { + return ord($c) > 126 || $c === '\\' || preg_match('/^[\w\$]$/', $c) === 1; + } + + /** + * Perform minification, return result + * + * @uses action() + * @uses isAlphaNum() + * @uses get() + * @uses peek() + * @return string + */ + protected function min() { + if (0 == strncmp($this->peek(), "\xef", 1)) { + $this->get(); + $this->get(); + $this->get(); + } + + $this->a = "\n"; + $this->action(self::ACTION_DELETE_A_B); + + while ($this->a !== null) { + switch ($this->a) { + case ' ': + if ($this->isAlphaNum($this->b)) { + $this->action(self::ACTION_KEEP_A); + } else { + $this->action(self::ACTION_DELETE_A); + } + break; + + case "\n": + switch ($this->b) { + case '{': + case '[': + case '(': + case '+': + case '-': + case '!': + case '~': + $this->action(self::ACTION_KEEP_A); + break; + + case ' ': + $this->action(self::ACTION_DELETE_A_B); + break; + + default: + if ($this->isAlphaNum($this->b)) { + $this->action(self::ACTION_KEEP_A); + } + else { + $this->action(self::ACTION_DELETE_A); + } + } + break; + + default: + switch ($this->b) { + case ' ': + if ($this->isAlphaNum($this->a)) { + $this->action(self::ACTION_KEEP_A); + break; + } + + $this->action(self::ACTION_DELETE_A_B); + break; + + case "\n": + switch ($this->a) { + case '}': + case ']': + case ')': + case '+': + case '-': + case '"': + case "'": + $this->action(self::ACTION_KEEP_A); + break; + + default: + if ($this->isAlphaNum($this->a)) { + $this->action(self::ACTION_KEEP_A); + } + else { + $this->action(self::ACTION_DELETE_A_B); + } + } + break; + + default: + $this->action(self::ACTION_KEEP_A); + break; + } + } + } + + return $this->output; + } + + /** + * Get the next character, skipping over comments. peek() is used to see + * if a '/' is followed by a '/' or '*'. + * + * @uses get() + * @uses peek() + * @throws JSMinException On unterminated comment. + * @return string + */ + protected function next() { + $c = $this->get(); + + if ($c === '/') { + switch($this->peek()) { + case '/': + for (;;) { + $c = $this->get(); + + if (ord($c) <= self::ORD_LF) { + return $c; + } + } + + case '*': + $this->get(); + + for (;;) { + switch($this->get()) { + case '*': + if ($this->peek() === '/') { + $this->get(); + return ' '; + } + break; + + case null: + throw new JSMinException('Unterminated comment.'); + } + } + + default: + return $c; + } + } + + return $c; + } + + /** + * Get next char. If is ctrl character, translate to a space or newline. + * + * @uses get() + * @return string|null + */ + protected function peek() { + $this->lookAhead = $this->get(); + return $this->lookAhead; + } +} + +// -- Exceptions --------------------------------------------------------------- +class JSMinException extends Exception {} ?> \ No newline at end of file diff --git a/gulliver/thirdparty/libchart/COPYING b/thirdparty/libchart/COPYING similarity index 100% rename from gulliver/thirdparty/libchart/COPYING rename to thirdparty/libchart/COPYING diff --git a/gulliver/thirdparty/libchart/ChangeLog b/thirdparty/libchart/ChangeLog similarity index 100% rename from gulliver/thirdparty/libchart/ChangeLog rename to thirdparty/libchart/ChangeLog diff --git a/gulliver/thirdparty/libchart/README b/thirdparty/libchart/README similarity index 100% rename from gulliver/thirdparty/libchart/README rename to thirdparty/libchart/README diff --git a/gulliver/thirdparty/libchart/classes/libchart.php b/thirdparty/libchart/classes/libchart.php similarity index 100% rename from gulliver/thirdparty/libchart/classes/libchart.php rename to thirdparty/libchart/classes/libchart.php diff --git a/gulliver/thirdparty/libchart/classes/model/DataSet.php b/thirdparty/libchart/classes/model/DataSet.php similarity index 97% rename from gulliver/thirdparty/libchart/classes/model/DataSet.php rename to thirdparty/libchart/classes/model/DataSet.php index eaa6e0cd8..d5ec57ba5 100644 --- a/gulliver/thirdparty/libchart/classes/model/DataSet.php +++ b/thirdparty/libchart/classes/model/DataSet.php @@ -1,28 +1,28 @@ -. - * - */ - - /** - * Superclass of all data sets. - * - * @author Jean-Marc Trmeaux (jm.tremeaux at gmail.com) - * Created on 10 may 2007 - */ - abstract class DataSet { - } +. + * + */ + + /** + * Superclass of all data sets. + * + * @author Jean-Marc Trmeaux (jm.tremeaux at gmail.com) + * Created on 10 may 2007 + */ + abstract class DataSet { + } ?> \ No newline at end of file diff --git a/gulliver/thirdparty/libchart/classes/model/Point.php b/thirdparty/libchart/classes/model/Point.php similarity index 100% rename from gulliver/thirdparty/libchart/classes/model/Point.php rename to thirdparty/libchart/classes/model/Point.php diff --git a/gulliver/thirdparty/libchart/classes/model/XYDataSet.php b/thirdparty/libchart/classes/model/XYDataSet.php similarity index 96% rename from gulliver/thirdparty/libchart/classes/model/XYDataSet.php rename to thirdparty/libchart/classes/model/XYDataSet.php index 8e50eaa64..3949e1643 100644 --- a/gulliver/thirdparty/libchart/classes/model/XYDataSet.php +++ b/thirdparty/libchart/classes/model/XYDataSet.php @@ -1,56 +1,56 @@ -. - * - */ - - /** - * Set of data in the form of (x, y) items. - * - * @author Jean-Marc Trmeaux (jm.tremeaux at gmail.com) - * Created on 10 may 2007 - */ - class XYDataSet extends DataSet { - private $pointList; - - /** - * Constructor of XYDataSet. - * - */ - public function XYDataSet() { - $this->pointList = array(); - } - - /** - * Add a new point to the dataset. - * - * @param Point Point to add to the dataset - */ - - public function addPoint($point) { - array_push($this->pointList, $point); - } - - /** - * Getter of pointList. - * - * @return List of points. - */ - public function getPointList() { - return $this->pointList; - } - } +. + * + */ + + /** + * Set of data in the form of (x, y) items. + * + * @author Jean-Marc Trmeaux (jm.tremeaux at gmail.com) + * Created on 10 may 2007 + */ + class XYDataSet extends DataSet { + private $pointList; + + /** + * Constructor of XYDataSet. + * + */ + public function XYDataSet() { + $this->pointList = array(); + } + + /** + * Add a new point to the dataset. + * + * @param Point Point to add to the dataset + */ + + public function addPoint($point) { + array_push($this->pointList, $point); + } + + /** + * Getter of pointList. + * + * @return List of points. + */ + public function getPointList() { + return $this->pointList; + } + } ?> \ No newline at end of file diff --git a/gulliver/thirdparty/libchart/classes/model/XYSeriesDataSet.php b/thirdparty/libchart/classes/model/XYSeriesDataSet.php similarity index 96% rename from gulliver/thirdparty/libchart/classes/model/XYSeriesDataSet.php rename to thirdparty/libchart/classes/model/XYSeriesDataSet.php index 80b721d73..5f3b81805 100644 --- a/gulliver/thirdparty/libchart/classes/model/XYSeriesDataSet.php +++ b/thirdparty/libchart/classes/model/XYSeriesDataSet.php @@ -1,76 +1,76 @@ -. - * - */ - - /** - * This dataset comprises several series of points and is used to plot multiple lines charts. - * Each serie is a XYDataSet. - * - * @author Jean-Marc Trmeaux (jm.tremeaux at gmail.com) - * Created on 20 july 2007 - */ - class XYSeriesDataSet extends DataSet { - /** - * List of titles - */ - private $titleList; - - /** - * List of XYDataSet. - */ - private $serieList; - - /** - * Constructor of XYSeriesDataSet. - * - */ - public function XYSeriesDataSet() { - $this->titleList = array(); - $this->serieList = array(); - } - - /** - * Add a new serie to the dataset. - * - * @param string Title (label) of the serie. - * @param XYDataSet Serie of points to add - */ - public function addSerie($title, $serie) { - array_push($this->titleList, $title); - array_push($this->serieList, $serie); - } - - /** - * Getter of titleList. - * - * @return List of titles. - */ - public function getTitleList() { - return $this->titleList; - } - - /** - * Getter of serieList. - * - * @return List of series. - */ - public function getSerieList() { - return $this->serieList; - } - } +. + * + */ + + /** + * This dataset comprises several series of points and is used to plot multiple lines charts. + * Each serie is a XYDataSet. + * + * @author Jean-Marc Trmeaux (jm.tremeaux at gmail.com) + * Created on 20 july 2007 + */ + class XYSeriesDataSet extends DataSet { + /** + * List of titles + */ + private $titleList; + + /** + * List of XYDataSet. + */ + private $serieList; + + /** + * Constructor of XYSeriesDataSet. + * + */ + public function XYSeriesDataSet() { + $this->titleList = array(); + $this->serieList = array(); + } + + /** + * Add a new serie to the dataset. + * + * @param string Title (label) of the serie. + * @param XYDataSet Serie of points to add + */ + public function addSerie($title, $serie) { + array_push($this->titleList, $title); + array_push($this->serieList, $serie); + } + + /** + * Getter of titleList. + * + * @return List of titles. + */ + public function getTitleList() { + return $this->titleList; + } + + /** + * Getter of serieList. + * + * @return List of series. + */ + public function getSerieList() { + return $this->serieList; + } + } ?> \ No newline at end of file diff --git a/gulliver/thirdparty/libchart/classes/view/axis/Axis.php b/thirdparty/libchart/classes/view/axis/Axis.php similarity index 100% rename from gulliver/thirdparty/libchart/classes/view/axis/Axis.php rename to thirdparty/libchart/classes/view/axis/Axis.php diff --git a/gulliver/thirdparty/libchart/classes/view/axis/Bound.php b/thirdparty/libchart/classes/view/axis/Bound.php similarity index 96% rename from gulliver/thirdparty/libchart/classes/view/axis/Bound.php rename to thirdparty/libchart/classes/view/axis/Bound.php index b5fd5919b..3531d1fad 100644 --- a/gulliver/thirdparty/libchart/classes/view/axis/Bound.php +++ b/thirdparty/libchart/classes/view/axis/Bound.php @@ -1,146 +1,146 @@ -. - * - */ - - /** - * Object representing the bounds of a dataset (its minimal and maximal values) on its vertical axis. - * The bounds are automatically calculated from a XYDataSet or XYSeriesDataSet. - * Default (calculated) bounds can be overriden using the setLowerBound() and setUpperBound() methods. - * - * @author Jean-Marc Trmeaux (jm.tremeaux at gmail.com) - * Created on 25 july 2007 - */ - class Bound { - /** - * Manually set lower bound, overrides the value calculated by computeBound(). - */ - private $lowerBound = null; - - /** - * Manually set upper bound, overrides the value calculated by computeBound(). - */ - private $upperBound = null; - - /** - * Computed min bound. - */ - private $yMinValue = null; - - /** - * Computed max bound. - */ - private $yMaxValue = null; - - /** - * Compute the boundaries on the axis. - * - * @param dataSet The data set - */ - public function computeBound($dataSet) { - // Check if the data set is empty - $dataSetEmpty = true; - $serieList = null; - if ($dataSet instanceof XYDataSet) { - $pointList = $dataSet->getPointList(); - $dataSetEmpty = count($pointList) == 0; - - if (!$dataSetEmpty) { - // Process it as a serie - $serieList = array(); - array_push($serieList, $dataSet); - } - } else if ($dataSet instanceof XYSeriesDataSet) { - $serieList = $dataSet->getSerieList(); - if (count($serieList) > 0) { - $serie = current($serieList); - $dataSetEmpty = count($serie) == 0; - } - } else { - die("Error: unknown dataset type"); - } - - // If the dataset is empty, default some bounds - $yMin = 0; - $yMax = 1; - if (!$dataSetEmpty) { - // Compute lower and upper bound on the value axis - unset($yMin); - unset($yMax); - - foreach ($serieList as $serie) { - foreach ($serie->getPointList() as $point) { - $y = $point->getY(); - - if (!isset($yMin)) { - $yMin = $y; - $yMax = $y; - } else { - if ($y < $yMin) { - $yMin = $y; - } - - if ($y > $yMax) { - $yMax = $y; - } - } - } - } - } - - $this->yMinValue = isset($this->lowerBound) ? $this->lowerBound : $yMin; - $this->yMaxValue = isset($this->upperBound) ? $this->upperBound : $yMax; - } - - /** - * Getter of yMinValue. - * - * @return min bound - */ - public function getYMinValue() { - return $this->yMinValue; - } - - /** - * Getter of yMaxValue. - * - * @return max bound - */ - public function getYMaxValue() { - return $this->yMaxValue; - } - - /** - * Set manually the lower boundary value (overrides the automatic formatting). - * Typical usage is to set the bars starting from zero. - * - * @param double lower boundary value - */ - public function setLowerBound($lowerBound) { - $this->lowerBound = $lowerBound; - } - - /** - * Set manually the upper boundary value (overrides the automatic formatting). - * - * @param double upper boundary value - */ - public function setUpperBound($upperBound) { - $this->upperBound = $upperBound; - } - } +. + * + */ + + /** + * Object representing the bounds of a dataset (its minimal and maximal values) on its vertical axis. + * The bounds are automatically calculated from a XYDataSet or XYSeriesDataSet. + * Default (calculated) bounds can be overriden using the setLowerBound() and setUpperBound() methods. + * + * @author Jean-Marc Trmeaux (jm.tremeaux at gmail.com) + * Created on 25 july 2007 + */ + class Bound { + /** + * Manually set lower bound, overrides the value calculated by computeBound(). + */ + private $lowerBound = null; + + /** + * Manually set upper bound, overrides the value calculated by computeBound(). + */ + private $upperBound = null; + + /** + * Computed min bound. + */ + private $yMinValue = null; + + /** + * Computed max bound. + */ + private $yMaxValue = null; + + /** + * Compute the boundaries on the axis. + * + * @param dataSet The data set + */ + public function computeBound($dataSet) { + // Check if the data set is empty + $dataSetEmpty = true; + $serieList = null; + if ($dataSet instanceof XYDataSet) { + $pointList = $dataSet->getPointList(); + $dataSetEmpty = count($pointList) == 0; + + if (!$dataSetEmpty) { + // Process it as a serie + $serieList = array(); + array_push($serieList, $dataSet); + } + } else if ($dataSet instanceof XYSeriesDataSet) { + $serieList = $dataSet->getSerieList(); + if (count($serieList) > 0) { + $serie = current($serieList); + $dataSetEmpty = count($serie) == 0; + } + } else { + die("Error: unknown dataset type"); + } + + // If the dataset is empty, default some bounds + $yMin = 0; + $yMax = 1; + if (!$dataSetEmpty) { + // Compute lower and upper bound on the value axis + unset($yMin); + unset($yMax); + + foreach ($serieList as $serie) { + foreach ($serie->getPointList() as $point) { + $y = $point->getY(); + + if (!isset($yMin)) { + $yMin = $y; + $yMax = $y; + } else { + if ($y < $yMin) { + $yMin = $y; + } + + if ($y > $yMax) { + $yMax = $y; + } + } + } + } + } + + $this->yMinValue = isset($this->lowerBound) ? $this->lowerBound : $yMin; + $this->yMaxValue = isset($this->upperBound) ? $this->upperBound : $yMax; + } + + /** + * Getter of yMinValue. + * + * @return min bound + */ + public function getYMinValue() { + return $this->yMinValue; + } + + /** + * Getter of yMaxValue. + * + * @return max bound + */ + public function getYMaxValue() { + return $this->yMaxValue; + } + + /** + * Set manually the lower boundary value (overrides the automatic formatting). + * Typical usage is to set the bars starting from zero. + * + * @param double lower boundary value + */ + public function setLowerBound($lowerBound) { + $this->lowerBound = $lowerBound; + } + + /** + * Set manually the upper boundary value (overrides the automatic formatting). + * + * @param double upper boundary value + */ + public function setUpperBound($upperBound) { + $this->upperBound = $upperBound; + } + } ?> \ No newline at end of file diff --git a/gulliver/thirdparty/libchart/classes/view/caption/Caption.php b/thirdparty/libchart/classes/view/caption/Caption.php similarity index 100% rename from gulliver/thirdparty/libchart/classes/view/caption/Caption.php rename to thirdparty/libchart/classes/view/caption/Caption.php diff --git a/gulliver/thirdparty/libchart/classes/view/chart/BarChart.php b/thirdparty/libchart/classes/view/chart/BarChart.php similarity index 100% rename from gulliver/thirdparty/libchart/classes/view/chart/BarChart.php rename to thirdparty/libchart/classes/view/chart/BarChart.php diff --git a/gulliver/thirdparty/libchart/classes/view/chart/Chart.php b/thirdparty/libchart/classes/view/chart/Chart.php similarity index 100% rename from gulliver/thirdparty/libchart/classes/view/chart/Chart.php rename to thirdparty/libchart/classes/view/chart/Chart.php diff --git a/gulliver/thirdparty/libchart/classes/view/chart/HorizontalBarChart.php b/thirdparty/libchart/classes/view/chart/HorizontalBarChart.php similarity index 100% rename from gulliver/thirdparty/libchart/classes/view/chart/HorizontalBarChart.php rename to thirdparty/libchart/classes/view/chart/HorizontalBarChart.php diff --git a/gulliver/thirdparty/libchart/classes/view/chart/LineChart.php b/thirdparty/libchart/classes/view/chart/LineChart.php similarity index 100% rename from gulliver/thirdparty/libchart/classes/view/chart/LineChart.php rename to thirdparty/libchart/classes/view/chart/LineChart.php diff --git a/gulliver/thirdparty/libchart/classes/view/chart/PieChart.php b/thirdparty/libchart/classes/view/chart/PieChart.php similarity index 100% rename from gulliver/thirdparty/libchart/classes/view/chart/PieChart.php rename to thirdparty/libchart/classes/view/chart/PieChart.php diff --git a/gulliver/thirdparty/libchart/classes/view/chart/VerticalBarChart.php b/thirdparty/libchart/classes/view/chart/VerticalBarChart.php similarity index 100% rename from gulliver/thirdparty/libchart/classes/view/chart/VerticalBarChart.php rename to thirdparty/libchart/classes/view/chart/VerticalBarChart.php diff --git a/gulliver/thirdparty/libchart/classes/view/color/Color.php b/thirdparty/libchart/classes/view/color/Color.php similarity index 100% rename from gulliver/thirdparty/libchart/classes/view/color/Color.php rename to thirdparty/libchart/classes/view/color/Color.php diff --git a/gulliver/thirdparty/libchart/classes/view/color/ColorSet.php b/thirdparty/libchart/classes/view/color/ColorSet.php similarity index 100% rename from gulliver/thirdparty/libchart/classes/view/color/ColorSet.php rename to thirdparty/libchart/classes/view/color/ColorSet.php diff --git a/gulliver/thirdparty/libchart/classes/view/color/Palette.php b/thirdparty/libchart/classes/view/color/Palette.php similarity index 100% rename from gulliver/thirdparty/libchart/classes/view/color/Palette.php rename to thirdparty/libchart/classes/view/color/Palette.php diff --git a/gulliver/thirdparty/libchart/classes/view/plot/Plot.php b/thirdparty/libchart/classes/view/plot/Plot.php similarity index 100% rename from gulliver/thirdparty/libchart/classes/view/plot/Plot.php rename to thirdparty/libchart/classes/view/plot/Plot.php diff --git a/gulliver/thirdparty/libchart/classes/view/primitive/Padding.php b/thirdparty/libchart/classes/view/primitive/Padding.php similarity index 100% rename from gulliver/thirdparty/libchart/classes/view/primitive/Padding.php rename to thirdparty/libchart/classes/view/primitive/Padding.php diff --git a/gulliver/thirdparty/libchart/classes/view/primitive/Primitive.php b/thirdparty/libchart/classes/view/primitive/Primitive.php similarity index 100% rename from gulliver/thirdparty/libchart/classes/view/primitive/Primitive.php rename to thirdparty/libchart/classes/view/primitive/Primitive.php diff --git a/gulliver/thirdparty/libchart/classes/view/primitive/Rectangle.php b/thirdparty/libchart/classes/view/primitive/Rectangle.php similarity index 100% rename from gulliver/thirdparty/libchart/classes/view/primitive/Rectangle.php rename to thirdparty/libchart/classes/view/primitive/Rectangle.php diff --git a/gulliver/thirdparty/libchart/classes/view/text/Text.php b/thirdparty/libchart/classes/view/text/Text.php similarity index 100% rename from gulliver/thirdparty/libchart/classes/view/text/Text.php rename to thirdparty/libchart/classes/view/text/Text.php diff --git a/gulliver/thirdparty/libchart/fonts/DejaVuSansCondensed-Bold.ttf b/thirdparty/libchart/fonts/DejaVuSansCondensed-Bold.ttf similarity index 100% rename from gulliver/thirdparty/libchart/fonts/DejaVuSansCondensed-Bold.ttf rename to thirdparty/libchart/fonts/DejaVuSansCondensed-Bold.ttf diff --git a/gulliver/thirdparty/libchart/fonts/DejaVuSansCondensed.ttf b/thirdparty/libchart/fonts/DejaVuSansCondensed.ttf similarity index 100% rename from gulliver/thirdparty/libchart/fonts/DejaVuSansCondensed.ttf rename to thirdparty/libchart/fonts/DejaVuSansCondensed.ttf diff --git a/gulliver/thirdparty/libchart/images/PoweredBy.png b/thirdparty/libchart/images/PoweredBy.png similarity index 100% rename from gulliver/thirdparty/libchart/images/PoweredBy.png rename to thirdparty/libchart/images/PoweredBy.png diff --git a/gulliver/thirdparty/lime/Spyc.class.php b/thirdparty/lime/Spyc.class.php similarity index 100% rename from gulliver/thirdparty/lime/Spyc.class.php rename to thirdparty/lime/Spyc.class.php diff --git a/gulliver/thirdparty/lime/lime.php b/thirdparty/lime/lime.php similarity index 100% rename from gulliver/thirdparty/lime/lime.php rename to thirdparty/lime/lime.php diff --git a/gulliver/thirdparty/lime/yaml.class.php b/thirdparty/lime/yaml.class.php similarity index 100% rename from gulliver/thirdparty/lime/yaml.class.php rename to thirdparty/lime/yaml.class.php diff --git a/gulliver/thirdparty/pake/pakeApp.class.php b/thirdparty/pake/pakeApp.class.php similarity index 100% rename from gulliver/thirdparty/pake/pakeApp.class.php rename to thirdparty/pake/pakeApp.class.php diff --git a/gulliver/thirdparty/pake/pakeColor.class.php b/thirdparty/pake/pakeColor.class.php similarity index 100% rename from gulliver/thirdparty/pake/pakeColor.class.php rename to thirdparty/pake/pakeColor.class.php diff --git a/gulliver/thirdparty/pake/pakeException.class.php b/thirdparty/pake/pakeException.class.php similarity index 100% rename from gulliver/thirdparty/pake/pakeException.class.php rename to thirdparty/pake/pakeException.class.php diff --git a/gulliver/thirdparty/pake/pakeFileTask.class.php b/thirdparty/pake/pakeFileTask.class.php similarity index 100% rename from gulliver/thirdparty/pake/pakeFileTask.class.php rename to thirdparty/pake/pakeFileTask.class.php diff --git a/gulliver/thirdparty/pake/pakeFinder.class.php b/thirdparty/pake/pakeFinder.class.php similarity index 100% rename from gulliver/thirdparty/pake/pakeFinder.class.php rename to thirdparty/pake/pakeFinder.class.php diff --git a/gulliver/thirdparty/pake/pakeFunction.php b/thirdparty/pake/pakeFunction.php similarity index 100% rename from gulliver/thirdparty/pake/pakeFunction.php rename to thirdparty/pake/pakeFunction.php diff --git a/gulliver/thirdparty/pake/pakeGetopt.class.php b/thirdparty/pake/pakeGetopt.class.php similarity index 100% rename from gulliver/thirdparty/pake/pakeGetopt.class.php rename to thirdparty/pake/pakeGetopt.class.php diff --git a/gulliver/thirdparty/pake/pakeGlobToRegex.class.php b/thirdparty/pake/pakeGlobToRegex.class.php similarity index 100% rename from gulliver/thirdparty/pake/pakeGlobToRegex.class.php rename to thirdparty/pake/pakeGlobToRegex.class.php diff --git a/gulliver/thirdparty/pake/pakeNumberCompare.class.php b/thirdparty/pake/pakeNumberCompare.class.php similarity index 100% rename from gulliver/thirdparty/pake/pakeNumberCompare.class.php rename to thirdparty/pake/pakeNumberCompare.class.php diff --git a/gulliver/thirdparty/pake/pakeTask.class.php b/thirdparty/pake/pakeTask.class.php similarity index 100% rename from gulliver/thirdparty/pake/pakeTask.class.php rename to thirdparty/pake/pakeTask.class.php diff --git a/gulliver/thirdparty/pake/pakeYaml.class.php b/thirdparty/pake/pakeYaml.class.php similarity index 100% rename from gulliver/thirdparty/pake/pakeYaml.class.php rename to thirdparty/pake/pakeYaml.class.php diff --git a/gulliver/thirdparty/pake/tasks/pakePearTask.class.php b/thirdparty/pake/tasks/pakePearTask.class.php similarity index 100% rename from gulliver/thirdparty/pake/tasks/pakePearTask.class.php rename to thirdparty/pake/tasks/pakePearTask.class.php diff --git a/gulliver/thirdparty/pake/tasks/pakePhingTask.class.php b/thirdparty/pake/tasks/pakePhingTask.class.php similarity index 100% rename from gulliver/thirdparty/pake/tasks/pakePhingTask.class.php rename to thirdparty/pake/tasks/pakePhingTask.class.php diff --git a/gulliver/thirdparty/pake/tasks/pakeSimpletestTask.class.php b/thirdparty/pake/tasks/pakeSimpletestTask.class.php similarity index 100% rename from gulliver/thirdparty/pake/tasks/pakeSimpletestTask.class.php rename to thirdparty/pake/tasks/pakeSimpletestTask.class.php diff --git a/thirdparty/pear/Archive/Tar.php b/thirdparty/pear/Archive/Tar.php new file mode 100644 index 000000000..8197d94aa --- /dev/null +++ b/thirdparty/pear/Archive/Tar.php @@ -0,0 +1,1993 @@ + + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * @category File_Formats + * @package Archive_Tar + * @author Vincent Blavet + * @copyright 1997-2010 The Authors + * @license http://www.opensource.org/licenses/bsd-license.php New BSD License + * @version CVS: $Id$ + * @link http://pear.php.net/package/Archive_Tar + */ + +require_once 'PEAR.php'; + +define('ARCHIVE_TAR_ATT_SEPARATOR', 90001); +define('ARCHIVE_TAR_END_BLOCK', pack("a512", '')); + +/** + * Creates a (compressed) Tar archive + * + * @package Archive_Tar + * @author Vincent Blavet + * @license http://www.opensource.org/licenses/bsd-license.php New BSD License + * @version $Revision$ + */ +class Archive_Tar extends PEAR +{ + /** + * @var string Name of the Tar + */ + var $_tarname=''; + + /** + * @var boolean if true, the Tar file will be gzipped + */ + var $_compress=false; + + /** + * @var string Type of compression : 'none', 'gz' or 'bz2' + */ + var $_compress_type='none'; + + /** + * @var string Explode separator + */ + var $_separator=' '; + + /** + * @var file descriptor + */ + var $_file=0; + + /** + * @var string Local Tar name of a remote Tar (http:// or ftp://) + */ + var $_temp_tarname=''; + + /** + * @var string regular expression for ignoring files or directories + */ + var $_ignore_regexp=''; + + /** + * @var object PEAR_Error object + */ + var $error_object=null; + + // {{{ constructor + /** + * Archive_Tar Class constructor. This flavour of the constructor only + * declare a new Archive_Tar object, identifying it by the name of the + * tar file. + * If the compress argument is set the tar will be read or created as a + * gzip or bz2 compressed TAR file. + * + * @param string $p_tarname The name of the tar archive to create + * @param string $p_compress can be null, 'gz' or 'bz2'. This + * parameter indicates if gzip or bz2 compression + * is required. For compatibility reason the + * boolean value 'true' means 'gz'. + * + * @access public + */ + function Archive_Tar($p_tarname, $p_compress = null) + { + $this->PEAR(); + $this->_compress = false; + $this->_compress_type = 'none'; + if (($p_compress === null) || ($p_compress == '')) { + if (@file_exists($p_tarname)) { + if ($fp = @fopen($p_tarname, "rb")) { + // look for gzip magic cookie + $data = fread($fp, 2); + fclose($fp); + if ($data == "\37\213") { + $this->_compress = true; + $this->_compress_type = 'gz'; + // No sure it's enought for a magic code .... + } elseif ($data == "BZ") { + $this->_compress = true; + $this->_compress_type = 'bz2'; + } + } + } else { + // probably a remote file or some file accessible + // through a stream interface + if (substr($p_tarname, -2) == 'gz') { + $this->_compress = true; + $this->_compress_type = 'gz'; + } elseif ((substr($p_tarname, -3) == 'bz2') || + (substr($p_tarname, -2) == 'bz')) { + $this->_compress = true; + $this->_compress_type = 'bz2'; + } + } + } else { + if (($p_compress === true) || ($p_compress == 'gz')) { + $this->_compress = true; + $this->_compress_type = 'gz'; + } else if ($p_compress == 'bz2') { + $this->_compress = true; + $this->_compress_type = 'bz2'; + } else { + $this->_error("Unsupported compression type '$p_compress'\n". + "Supported types are 'gz' and 'bz2'.\n"); + return false; + } + } + $this->_tarname = $p_tarname; + if ($this->_compress) { // assert zlib or bz2 extension support + if ($this->_compress_type == 'gz') + $extname = 'zlib'; + else if ($this->_compress_type == 'bz2') + $extname = 'bz2'; + + if (!extension_loaded($extname)) { + PEAR::loadExtension($extname); + } + if (!extension_loaded($extname)) { + $this->_error("The extension '$extname' couldn't be found.\n". + "Please make sure your version of PHP was built ". + "with '$extname' support.\n"); + return false; + } + } + } + // }}} + + // {{{ destructor + function _Archive_Tar() + { + $this->_close(); + // ----- Look for a local copy to delete + if ($this->_temp_tarname != '') + @unlink($this->_temp_tarname); + $this->_PEAR(); + } + // }}} + + // {{{ create() + /** + * This method creates the archive file and add the files / directories + * that are listed in $p_filelist. + * If a file with the same name exist and is writable, it is replaced + * by the new tar. + * The method return false and a PEAR error text. + * The $p_filelist parameter can be an array of string, each string + * representing a filename or a directory name with their path if + * needed. It can also be a single string with names separated by a + * single blank. + * For each directory added in the archive, the files and + * sub-directories are also added. + * See also createModify() method for more details. + * + * @param array $p_filelist An array of filenames and directory names, or a + * single string with names separated by a single + * blank space. + * + * @return true on success, false on error. + * @see createModify() + * @access public + */ + function create($p_filelist) + { + return $this->createModify($p_filelist, '', ''); + } + // }}} + + // {{{ add() + /** + * This method add the files / directories that are listed in $p_filelist in + * the archive. If the archive does not exist it is created. + * The method return false and a PEAR error text. + * The files and directories listed are only added at the end of the archive, + * even if a file with the same name is already archived. + * See also createModify() method for more details. + * + * @param array $p_filelist An array of filenames and directory names, or a + * single string with names separated by a single + * blank space. + * + * @return true on success, false on error. + * @see createModify() + * @access public + */ + function add($p_filelist) + { + return $this->addModify($p_filelist, '', ''); + } + // }}} + + // {{{ extract() + function extract($p_path='', $p_preserve=false) + { + return $this->extractModify($p_path, '', $p_preserve); + } + // }}} + + // {{{ listContent() + function listContent() + { + $v_list_detail = array(); + + if ($this->_openRead()) { + if (!$this->_extractList('', $v_list_detail, "list", '', '')) { + unset($v_list_detail); + $v_list_detail = 0; + } + $this->_close(); + } + + return $v_list_detail; + } + // }}} + + // {{{ createModify() + /** + * This method creates the archive file and add the files / directories + * that are listed in $p_filelist. + * If the file already exists and is writable, it is replaced by the + * new tar. It is a create and not an add. If the file exists and is + * read-only or is a directory it is not replaced. The method return + * false and a PEAR error text. + * The $p_filelist parameter can be an array of string, each string + * representing a filename or a directory name with their path if + * needed. It can also be a single string with names separated by a + * single blank. + * The path indicated in $p_remove_dir will be removed from the + * memorized path of each file / directory listed when this path + * exists. By default nothing is removed (empty path '') + * The path indicated in $p_add_dir will be added at the beginning of + * the memorized path of each file / directory listed. However it can + * be set to empty ''. The adding of a path is done after the removing + * of path. + * The path add/remove ability enables the user to prepare an archive + * for extraction in a different path than the origin files are. + * See also addModify() method for file adding properties. + * + * @param array $p_filelist An array of filenames and directory names, + * or a single string with names separated by + * a single blank space. + * @param string $p_add_dir A string which contains a path to be added + * to the memorized path of each element in + * the list. + * @param string $p_remove_dir A string which contains a path to be + * removed from the memorized path of each + * element in the list, when relevant. + * + * @return boolean true on success, false on error. + * @access public + * @see addModify() + */ + function createModify($p_filelist, $p_add_dir, $p_remove_dir='') + { + $v_result = true; + + if (!$this->_openWrite()) + return false; + + if ($p_filelist != '') { + if (is_array($p_filelist)) + $v_list = $p_filelist; + elseif (is_string($p_filelist)) + $v_list = explode($this->_separator, $p_filelist); + else { + $this->_cleanFile(); + $this->_error('Invalid file list'); + return false; + } + + $v_result = $this->_addList($v_list, $p_add_dir, $p_remove_dir); + } + + if ($v_result) { + $this->_writeFooter(); + $this->_close(); + } else + $this->_cleanFile(); + + return $v_result; + } + // }}} + + // {{{ addModify() + /** + * This method add the files / directories listed in $p_filelist at the + * end of the existing archive. If the archive does not yet exists it + * is created. + * The $p_filelist parameter can be an array of string, each string + * representing a filename or a directory name with their path if + * needed. It can also be a single string with names separated by a + * single blank. + * The path indicated in $p_remove_dir will be removed from the + * memorized path of each file / directory listed when this path + * exists. By default nothing is removed (empty path '') + * The path indicated in $p_add_dir will be added at the beginning of + * the memorized path of each file / directory listed. However it can + * be set to empty ''. The adding of a path is done after the removing + * of path. + * The path add/remove ability enables the user to prepare an archive + * for extraction in a different path than the origin files are. + * If a file/dir is already in the archive it will only be added at the + * end of the archive. There is no update of the existing archived + * file/dir. However while extracting the archive, the last file will + * replace the first one. This results in a none optimization of the + * archive size. + * If a file/dir does not exist the file/dir is ignored. However an + * error text is send to PEAR error. + * If a file/dir is not readable the file/dir is ignored. However an + * error text is send to PEAR error. + * + * @param array $p_filelist An array of filenames and directory + * names, or a single string with names + * separated by a single blank space. + * @param string $p_add_dir A string which contains a path to be + * added to the memorized path of each + * element in the list. + * @param string $p_remove_dir A string which contains a path to be + * removed from the memorized path of + * each element in the list, when + * relevant. + * + * @return true on success, false on error. + * @access public + */ + function addModify($p_filelist, $p_add_dir, $p_remove_dir='') + { + $v_result = true; + + if (!$this->_isArchive()) + $v_result = $this->createModify($p_filelist, $p_add_dir, + $p_remove_dir); + else { + if (is_array($p_filelist)) + $v_list = $p_filelist; + elseif (is_string($p_filelist)) + $v_list = explode($this->_separator, $p_filelist); + else { + $this->_error('Invalid file list'); + return false; + } + + $v_result = $this->_append($v_list, $p_add_dir, $p_remove_dir); + } + + return $v_result; + } + // }}} + + // {{{ addString() + /** + * This method add a single string as a file at the + * end of the existing archive. If the archive does not yet exists it + * is created. + * + * @param string $p_filename A string which contains the full + * filename path that will be associated + * with the string. + * @param string $p_string The content of the file added in + * the archive. + * @param int $p_datetime A custom date/time (unix timestamp) + * for the file (optional). + * + * @return true on success, false on error. + * @access public + */ + function addString($p_filename, $p_string, $p_datetime = false) + { + $v_result = true; + + if (!$this->_isArchive()) { + if (!$this->_openWrite()) { + return false; + } + $this->_close(); + } + + if (!$this->_openAppend()) + return false; + + // Need to check the get back to the temporary file ? .... + $v_result = $this->_addString($p_filename, $p_string, $p_datetime); + + $this->_writeFooter(); + + $this->_close(); + + return $v_result; + } + // }}} + + // {{{ extractModify() + /** + * This method extract all the content of the archive in the directory + * indicated by $p_path. When relevant the memorized path of the + * files/dir can be modified by removing the $p_remove_path path at the + * beginning of the file/dir path. + * While extracting a file, if the directory path does not exists it is + * created. + * While extracting a file, if the file already exists it is replaced + * without looking for last modification date. + * While extracting a file, if the file already exists and is write + * protected, the extraction is aborted. + * While extracting a file, if a directory with the same name already + * exists, the extraction is aborted. + * While extracting a directory, if a file with the same name already + * exists, the extraction is aborted. + * While extracting a file/directory if the destination directory exist + * and is write protected, or does not exist but can not be created, + * the extraction is aborted. + * If after extraction an extracted file does not show the correct + * stored file size, the extraction is aborted. + * When the extraction is aborted, a PEAR error text is set and false + * is returned. However the result can be a partial extraction that may + * need to be manually cleaned. + * + * @param string $p_path The path of the directory where the + * files/dir need to by extracted. + * @param string $p_remove_path Part of the memorized path that can be + * removed if present at the beginning of + * the file/dir path. + * @param boolean $p_preserve Preserve user/group ownership of files + * + * @return boolean true on success, false on error. + * @access public + * @see extractList() + */ + function extractModify($p_path, $p_remove_path, $p_preserve=false) + { + $v_result = true; + $v_list_detail = array(); + + if ($v_result = $this->_openRead()) { + $v_result = $this->_extractList($p_path, $v_list_detail, + "complete", 0, $p_remove_path, $p_preserve); + $this->_close(); + } + + return $v_result; + } + // }}} + + // {{{ extractInString() + /** + * This method extract from the archive one file identified by $p_filename. + * The return value is a string with the file content, or NULL on error. + * + * @param string $p_filename The path of the file to extract in a string. + * + * @return a string with the file content or NULL. + * @access public + */ + function extractInString($p_filename) + { + if ($this->_openRead()) { + $v_result = $this->_extractInString($p_filename); + $this->_close(); + } else { + $v_result = null; + } + + return $v_result; + } + // }}} + + // {{{ extractList() + /** + * This method extract from the archive only the files indicated in the + * $p_filelist. These files are extracted in the current directory or + * in the directory indicated by the optional $p_path parameter. + * If indicated the $p_remove_path can be used in the same way as it is + * used in extractModify() method. + * + * @param array $p_filelist An array of filenames and directory names, + * or a single string with names separated + * by a single blank space. + * @param string $p_path The path of the directory where the + * files/dir need to by extracted. + * @param string $p_remove_path Part of the memorized path that can be + * removed if present at the beginning of + * the file/dir path. + * @param boolean $p_preserve Preserve user/group ownership of files + * + * @return true on success, false on error. + * @access public + * @see extractModify() + */ + function extractList($p_filelist, $p_path='', $p_remove_path='', $p_preserve=false) + { + $v_result = true; + $v_list_detail = array(); + + if (is_array($p_filelist)) + $v_list = $p_filelist; + elseif (is_string($p_filelist)) + $v_list = explode($this->_separator, $p_filelist); + else { + $this->_error('Invalid string list'); + return false; + } + + if ($v_result = $this->_openRead()) { + $v_result = $this->_extractList($p_path, $v_list_detail, "partial", + $v_list, $p_remove_path, $p_preserve); + $this->_close(); + } + + return $v_result; + } + // }}} + + // {{{ setAttribute() + /** + * This method set specific attributes of the archive. It uses a variable + * list of parameters, in the format attribute code + attribute values : + * $arch->setAttribute(ARCHIVE_TAR_ATT_SEPARATOR, ','); + * + * @param mixed $argv variable list of attributes and values + * + * @return true on success, false on error. + * @access public + */ + function setAttribute() + { + $v_result = true; + + // ----- Get the number of variable list of arguments + if (($v_size = func_num_args()) == 0) { + return true; + } + + // ----- Get the arguments + $v_att_list = &func_get_args(); + + // ----- Read the attributes + $i=0; + while ($i<$v_size) { + + // ----- Look for next option + switch ($v_att_list[$i]) { + // ----- Look for options that request a string value + case ARCHIVE_TAR_ATT_SEPARATOR : + // ----- Check the number of parameters + if (($i+1) >= $v_size) { + $this->_error('Invalid number of parameters for ' + .'attribute ARCHIVE_TAR_ATT_SEPARATOR'); + return false; + } + + // ----- Get the value + $this->_separator = $v_att_list[$i+1]; + $i++; + break; + + default : + $this->_error('Unknow attribute code '.$v_att_list[$i].''); + return false; + } + + // ----- Next attribute + $i++; + } + + return $v_result; + } + // }}} + + // {{{ setIgnoreRegexp() + /** + * This method sets the regular expression for ignoring files and directories + * at import, for example: + * $arch->setIgnoreRegexp("#CVS|\.svn#"); + * + * @param string $regexp regular expression defining which files or directories to ignore + * + * @access public + */ + function setIgnoreRegexp($regexp) + { + $this->_ignore_regexp = $regexp; + } + // }}} + + // {{{ setIgnoreList() + /** + * This method sets the regular expression for ignoring all files and directories + * matching the filenames in the array list at import, for example: + * $arch->setIgnoreList(array('CVS', '.svn', 'bin/tool')); + * + * @param array $list a list of file or directory names to ignore + * + * @access public + */ + function setIgnoreList($list) + { + $regexp = str_replace(array('#', '.', '^', '$'), array('\#', '\.', '\^', '\$'), $list); + $regexp = '#/'.join('$|/', $list).'#'; + $this->setIgnoreRegexp($regexp); + } + // }}} + + // {{{ _error() + function _error($p_message) + { + $this->error_object = &$this->raiseError($p_message); + } + // }}} + + // {{{ _warning() + function _warning($p_message) + { + $this->error_object = &$this->raiseError($p_message); + } + // }}} + + // {{{ _isArchive() + function _isArchive($p_filename=null) + { + if ($p_filename == null) { + $p_filename = $this->_tarname; + } + clearstatcache(); + return @is_file($p_filename) && !@is_link($p_filename); + } + // }}} + + // {{{ _openWrite() + function _openWrite() + { + if ($this->_compress_type == 'gz' && function_exists('gzopen')) + $this->_file = @gzopen($this->_tarname, "wb9"); + else if ($this->_compress_type == 'bz2' && function_exists('bzopen')) + $this->_file = @bzopen($this->_tarname, "w"); + else if ($this->_compress_type == 'none') + $this->_file = @fopen($this->_tarname, "wb"); + else { + $this->_error('Unknown or missing compression type (' + .$this->_compress_type.')'); + return false; + } + + if ($this->_file == 0) { + $this->_error('Unable to open in write mode \'' + .$this->_tarname.'\''); + return false; + } + + return true; + } + // }}} + + // {{{ _openRead() + function _openRead() + { + if (strtolower(substr($this->_tarname, 0, 7)) == 'http://') { + + // ----- Look if a local copy need to be done + if ($this->_temp_tarname == '') { + $this->_temp_tarname = uniqid('tar').'.tmp'; + if (!$v_file_from = @fopen($this->_tarname, 'rb')) { + $this->_error('Unable to open in read mode \'' + .$this->_tarname.'\''); + $this->_temp_tarname = ''; + return false; + } + if (!$v_file_to = @fopen($this->_temp_tarname, 'wb')) { + $this->_error('Unable to open in write mode \'' + .$this->_temp_tarname.'\''); + $this->_temp_tarname = ''; + return false; + } + while ($v_data = @fread($v_file_from, 1024)) + @fwrite($v_file_to, $v_data); + @fclose($v_file_from); + @fclose($v_file_to); + } + + // ----- File to open if the local copy + $v_filename = $this->_temp_tarname; + + } else + // ----- File to open if the normal Tar file + $v_filename = $this->_tarname; + + if ($this->_compress_type == 'gz' && function_exists('gzopen')) + $this->_file = @gzopen($v_filename, "rb"); + else if ($this->_compress_type == 'bz2' && function_exists('bzopen')) + $this->_file = @bzopen($v_filename, "r"); + else if ($this->_compress_type == 'none') + $this->_file = @fopen($v_filename, "rb"); + else { + $this->_error('Unknown or missing compression type (' + .$this->_compress_type.')'); + return false; + } + + if ($this->_file == 0) { + $this->_error('Unable to open in read mode \''.$v_filename.'\''); + return false; + } + + return true; + } + // }}} + + // {{{ _openReadWrite() + function _openReadWrite() + { + if ($this->_compress_type == 'gz') + $this->_file = @gzopen($this->_tarname, "r+b"); + else if ($this->_compress_type == 'bz2') { + $this->_error('Unable to open bz2 in read/write mode \'' + .$this->_tarname.'\' (limitation of bz2 extension)'); + return false; + } else if ($this->_compress_type == 'none') + $this->_file = @fopen($this->_tarname, "r+b"); + else { + $this->_error('Unknown or missing compression type (' + .$this->_compress_type.')'); + return false; + } + + if ($this->_file == 0) { + $this->_error('Unable to open in read/write mode \'' + .$this->_tarname.'\''); + return false; + } + + return true; + } + // }}} + + // {{{ _close() + function _close() + { + //if (isset($this->_file)) { + if (is_resource($this->_file)) { + if ($this->_compress_type == 'gz') + @gzclose($this->_file); + else if ($this->_compress_type == 'bz2') + @bzclose($this->_file); + else if ($this->_compress_type == 'none') + @fclose($this->_file); + else + $this->_error('Unknown or missing compression type (' + .$this->_compress_type.')'); + + $this->_file = 0; + } + + // ----- Look if a local copy need to be erase + // Note that it might be interesting to keep the url for a time : ToDo + if ($this->_temp_tarname != '') { + @unlink($this->_temp_tarname); + $this->_temp_tarname = ''; + } + + return true; + } + // }}} + + // {{{ _cleanFile() + function _cleanFile() + { + $this->_close(); + + // ----- Look for a local copy + if ($this->_temp_tarname != '') { + // ----- Remove the local copy but not the remote tarname + @unlink($this->_temp_tarname); + $this->_temp_tarname = ''; + } else { + // ----- Remove the local tarname file + @unlink($this->_tarname); + } + $this->_tarname = ''; + + return true; + } + // }}} + + // {{{ _writeBlock() + function _writeBlock($p_binary_data, $p_len=null) + { + if (is_resource($this->_file)) { + if ($p_len === null) { + if ($this->_compress_type == 'gz') + @gzputs($this->_file, $p_binary_data); + else if ($this->_compress_type == 'bz2') + @bzwrite($this->_file, $p_binary_data); + else if ($this->_compress_type == 'none') + @fputs($this->_file, $p_binary_data); + else + $this->_error('Unknown or missing compression type (' + .$this->_compress_type.')'); + } else { + if ($this->_compress_type == 'gz') + @gzputs($this->_file, $p_binary_data, $p_len); + else if ($this->_compress_type == 'bz2') + @bzwrite($this->_file, $p_binary_data, $p_len); + else if ($this->_compress_type == 'none') + @fputs($this->_file, $p_binary_data, $p_len); + else + $this->_error('Unknown or missing compression type (' + .$this->_compress_type.')'); + + } + } + return true; + } + // }}} + + // {{{ _readBlock() + function _readBlock() + { + $v_block = null; + if (is_resource($this->_file)) { + if ($this->_compress_type == 'gz') + $v_block = @gzread($this->_file, 512); + else if ($this->_compress_type == 'bz2') + $v_block = @bzread($this->_file, 512); + else if ($this->_compress_type == 'none') + $v_block = @fread($this->_file, 512); + else + $this->_error('Unknown or missing compression type (' + .$this->_compress_type.')'); + } + return $v_block; + } + // }}} + + // {{{ _jumpBlock() + function _jumpBlock($p_len=null) + { + if (is_resource($this->_file)) { + if ($p_len === null) + $p_len = 1; + + if ($this->_compress_type == 'gz') { + @gzseek($this->_file, gztell($this->_file)+($p_len*512)); + } + else if ($this->_compress_type == 'bz2') { + // ----- Replace missing bztell() and bzseek() + for ($i=0; $i<$p_len; $i++) + $this->_readBlock(); + } else if ($this->_compress_type == 'none') + @fseek($this->_file, $p_len*512, SEEK_CUR); + else + $this->_error('Unknown or missing compression type (' + .$this->_compress_type.')'); + + } + return true; + } + // }}} + + // {{{ _writeFooter() + function _writeFooter() + { + if (is_resource($this->_file)) { + // ----- Write the last 0 filled block for end of archive + $v_binary_data = pack('a1024', ''); + $this->_writeBlock($v_binary_data); + } + return true; + } + // }}} + + // {{{ _addList() + function _addList($p_list, $p_add_dir, $p_remove_dir) + { + $v_result=true; + $v_header = array(); + + // ----- Remove potential windows directory separator + $p_add_dir = $this->_translateWinPath($p_add_dir); + $p_remove_dir = $this->_translateWinPath($p_remove_dir, false); + + if (!$this->_file) { + $this->_error('Invalid file descriptor'); + return false; + } + + if (sizeof($p_list) == 0) + return true; + + foreach ($p_list as $v_filename) { + if (!$v_result) { + break; + } + + // ----- Skip the current tar name + if ($v_filename == $this->_tarname) + continue; + + if ($v_filename == '') + continue; + + // ----- ignore files and directories matching the ignore regular expression + if ($this->_ignore_regexp && preg_match($this->_ignore_regexp, '/'.$v_filename)) { + $this->_warning("File '$v_filename' ignored"); + continue; + } + + if (!file_exists($v_filename) && !is_link($v_filename)) { + $this->_warning("File '$v_filename' does not exist"); + continue; + } + + // ----- Add the file or directory header + if (!$this->_addFile($v_filename, $v_header, $p_add_dir, $p_remove_dir)) + return false; + + if (@is_dir($v_filename) && !@is_link($v_filename)) { + if (!($p_hdir = opendir($v_filename))) { + $this->_warning("Directory '$v_filename' can not be read"); + continue; + } + while (false !== ($p_hitem = readdir($p_hdir))) { + if (($p_hitem != '.') && ($p_hitem != '..')) { + if ($v_filename != ".") + $p_temp_list[0] = $v_filename.'/'.$p_hitem; + else + $p_temp_list[0] = $p_hitem; + + $v_result = $this->_addList($p_temp_list, + $p_add_dir, + $p_remove_dir); + } + } + + unset($p_temp_list); + unset($p_hdir); + unset($p_hitem); + } + } + + return $v_result; + } + // }}} + + // {{{ _addFile() + function _addFile($p_filename, &$p_header, $p_add_dir, $p_remove_dir) + { + if (!$this->_file) { + $this->_error('Invalid file descriptor'); + return false; + } + + if ($p_filename == '') { + $this->_error('Invalid file name'); + return false; + } + + // ----- Calculate the stored filename + $p_filename = $this->_translateWinPath($p_filename, false);; + $v_stored_filename = $p_filename; + if (strcmp($p_filename, $p_remove_dir) == 0) { + return true; + } + if ($p_remove_dir != '') { + if (substr($p_remove_dir, -1) != '/') + $p_remove_dir .= '/'; + + if (substr($p_filename, 0, strlen($p_remove_dir)) == $p_remove_dir) + $v_stored_filename = substr($p_filename, strlen($p_remove_dir)); + } + $v_stored_filename = $this->_translateWinPath($v_stored_filename); + 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; + } + + $v_stored_filename = $this->_pathReduction($v_stored_filename); + + if ($this->_isArchive($p_filename)) { + if (($v_file = @fopen($p_filename, "rb")) == 0) { + $this->_warning("Unable to open file '".$p_filename + ."' in binary read mode"); + return true; + } + + if (!$this->_writeHeader($p_filename, $v_stored_filename)) + return false; + + while (($v_buffer = fread($v_file, 512)) != '') { + $v_binary_data = pack("a512", "$v_buffer"); + $this->_writeBlock($v_binary_data); + } + + fclose($v_file); + + } else { + // ----- Only header for dir + if (!$this->_writeHeader($p_filename, $v_stored_filename)) + return false; + } + + return true; + } + // }}} + + // {{{ _addString() + function _addString($p_filename, $p_string, $p_datetime = false) + { + if (!$this->_file) { + $this->_error('Invalid file descriptor'); + return false; + } + + if ($p_filename == '') { + $this->_error('Invalid file name'); + return false; + } + + // ----- Calculate the stored filename + $p_filename = $this->_translateWinPath($p_filename, false);; + + // ----- If datetime is not specified, set current time + if ($p_datetime === false) { + $p_datetime = time(); + } + + if (!$this->_writeHeaderBlock($p_filename, strlen($p_string), + $p_datetime, 384, "", 0, 0)) + return false; + + $i=0; + while (($v_buffer = substr($p_string, (($i++)*512), 512)) != '') { + $v_binary_data = pack("a512", $v_buffer); + $this->_writeBlock($v_binary_data); + } + + return true; + } + // }}} + + // {{{ _writeHeader() + function _writeHeader($p_filename, $p_stored_filename) + { + if ($p_stored_filename == '') + $p_stored_filename = $p_filename; + $v_reduce_filename = $this->_pathReduction($p_stored_filename); + + if (strlen($v_reduce_filename) > 99) { + if (!$this->_writeLongHeader($v_reduce_filename)) + return false; + } + + $v_info = lstat($p_filename); + $v_uid = sprintf("%07s", DecOct($v_info[4])); + $v_gid = sprintf("%07s", DecOct($v_info[5])); + $v_perms = sprintf("%07s", DecOct($v_info['mode'] & 000777)); + + $v_mtime = sprintf("%011s", DecOct($v_info['mtime'])); + + $v_linkname = ''; + + if (@is_link($p_filename)) { + $v_typeflag = '2'; + $v_linkname = readlink($p_filename); + $v_size = sprintf("%011s", DecOct(0)); + } elseif (@is_dir($p_filename)) { + $v_typeflag = "5"; + $v_size = sprintf("%011s", DecOct(0)); + } else { + $v_typeflag = '0'; + clearstatcache(); + $v_size = sprintf("%011s", DecOct($v_info['size'])); + } + + $v_magic = 'ustar '; + + $v_version = ' '; + + if (function_exists('posix_getpwuid')) + { + $userinfo = posix_getpwuid($v_info[4]); + $groupinfo = posix_getgrgid($v_info[5]); + + $v_uname = $userinfo['name']; + $v_gname = $groupinfo['name']; + } + else + { + $v_uname = ''; + $v_gname = ''; + } + + $v_devmajor = ''; + + $v_devminor = ''; + + $v_prefix = ''; + + $v_binary_data_first = pack("a100a8a8a8a12a12", + $v_reduce_filename, $v_perms, $v_uid, + $v_gid, $v_size, $v_mtime); + $v_binary_data_last = pack("a1a100a6a2a32a32a8a8a155a12", + $v_typeflag, $v_linkname, $v_magic, + $v_version, $v_uname, $v_gname, + $v_devmajor, $v_devminor, $v_prefix, ''); + + // ----- Calculate the checksum + $v_checksum = 0; + // ..... First part of the header + for ($i=0; $i<148; $i++) + $v_checksum += ord(substr($v_binary_data_first,$i,1)); + // ..... Ignore the checksum value and replace it by ' ' (space) + for ($i=148; $i<156; $i++) + $v_checksum += ord(' '); + // ..... Last part of the header + for ($i=156, $j=0; $i<512; $i++, $j++) + $v_checksum += ord(substr($v_binary_data_last,$j,1)); + + // ----- Write the first 148 bytes of the header in the archive + $this->_writeBlock($v_binary_data_first, 148); + + // ----- Write the calculated checksum + $v_checksum = sprintf("%06s ", DecOct($v_checksum)); + $v_binary_data = pack("a8", $v_checksum); + $this->_writeBlock($v_binary_data, 8); + + // ----- Write the last 356 bytes of the header in the archive + $this->_writeBlock($v_binary_data_last, 356); + + return true; + } + // }}} + + // {{{ _writeHeaderBlock() + function _writeHeaderBlock($p_filename, $p_size, $p_mtime=0, $p_perms=0, + $p_type='', $p_uid=0, $p_gid=0) + { + $p_filename = $this->_pathReduction($p_filename); + + if (strlen($p_filename) > 99) { + if (!$this->_writeLongHeader($p_filename)) + return false; + } + + if ($p_type == "5") { + $v_size = sprintf("%011s", DecOct(0)); + } else { + $v_size = sprintf("%011s", DecOct($p_size)); + } + + $v_uid = sprintf("%07s", DecOct($p_uid)); + $v_gid = sprintf("%07s", DecOct($p_gid)); + $v_perms = sprintf("%07s", DecOct($p_perms & 000777)); + + $v_mtime = sprintf("%11s", DecOct($p_mtime)); + + $v_linkname = ''; + + $v_magic = 'ustar '; + + $v_version = ' '; + + if (function_exists('posix_getpwuid')) + { + $userinfo = posix_getpwuid($p_uid); + $groupinfo = posix_getgrgid($p_gid); + + $v_uname = $userinfo['name']; + $v_gname = $groupinfo['name']; + } + else + { + $v_uname = ''; + $v_gname = ''; + } + + $v_devmajor = ''; + + $v_devminor = ''; + + $v_prefix = ''; + + $v_binary_data_first = pack("a100a8a8a8a12A12", + $p_filename, $v_perms, $v_uid, $v_gid, + $v_size, $v_mtime); + $v_binary_data_last = pack("a1a100a6a2a32a32a8a8a155a12", + $p_type, $v_linkname, $v_magic, + $v_version, $v_uname, $v_gname, + $v_devmajor, $v_devminor, $v_prefix, ''); + + // ----- Calculate the checksum + $v_checksum = 0; + // ..... First part of the header + for ($i=0; $i<148; $i++) + $v_checksum += ord(substr($v_binary_data_first,$i,1)); + // ..... Ignore the checksum value and replace it by ' ' (space) + for ($i=148; $i<156; $i++) + $v_checksum += ord(' '); + // ..... Last part of the header + for ($i=156, $j=0; $i<512; $i++, $j++) + $v_checksum += ord(substr($v_binary_data_last,$j,1)); + + // ----- Write the first 148 bytes of the header in the archive + $this->_writeBlock($v_binary_data_first, 148); + + // ----- Write the calculated checksum + $v_checksum = sprintf("%06s ", DecOct($v_checksum)); + $v_binary_data = pack("a8", $v_checksum); + $this->_writeBlock($v_binary_data, 8); + + // ----- Write the last 356 bytes of the header in the archive + $this->_writeBlock($v_binary_data_last, 356); + + return true; + } + // }}} + + // {{{ _writeLongHeader() + function _writeLongHeader($p_filename) + { + $v_size = sprintf("%11s ", DecOct(strlen($p_filename))); + + $v_typeflag = 'L'; + + $v_linkname = ''; + + $v_magic = ''; + + $v_version = ''; + + $v_uname = ''; + + $v_gname = ''; + + $v_devmajor = ''; + + $v_devminor = ''; + + $v_prefix = ''; + + $v_binary_data_first = pack("a100a8a8a8a12a12", + '././@LongLink', 0, 0, 0, $v_size, 0); + $v_binary_data_last = pack("a1a100a6a2a32a32a8a8a155a12", + $v_typeflag, $v_linkname, $v_magic, + $v_version, $v_uname, $v_gname, + $v_devmajor, $v_devminor, $v_prefix, ''); + + // ----- Calculate the checksum + $v_checksum = 0; + // ..... First part of the header + for ($i=0; $i<148; $i++) + $v_checksum += ord(substr($v_binary_data_first,$i,1)); + // ..... Ignore the checksum value and replace it by ' ' (space) + for ($i=148; $i<156; $i++) + $v_checksum += ord(' '); + // ..... Last part of the header + for ($i=156, $j=0; $i<512; $i++, $j++) + $v_checksum += ord(substr($v_binary_data_last,$j,1)); + + // ----- Write the first 148 bytes of the header in the archive + $this->_writeBlock($v_binary_data_first, 148); + + // ----- Write the calculated checksum + $v_checksum = sprintf("%06s ", DecOct($v_checksum)); + $v_binary_data = pack("a8", $v_checksum); + $this->_writeBlock($v_binary_data, 8); + + // ----- Write the last 356 bytes of the header in the archive + $this->_writeBlock($v_binary_data_last, 356); + + // ----- Write the filename as content of the block + $i=0; + while (($v_buffer = substr($p_filename, (($i++)*512), 512)) != '') { + $v_binary_data = pack("a512", "$v_buffer"); + $this->_writeBlock($v_binary_data); + } + + return true; + } + // }}} + + // {{{ _readHeader() + function _readHeader($v_binary_data, &$v_header) + { + if (strlen($v_binary_data)==0) { + $v_header['filename'] = ''; + return true; + } + + if (strlen($v_binary_data) != 512) { + $v_header['filename'] = ''; + $this->_error('Invalid block size : '.strlen($v_binary_data)); + return false; + } + + if (!is_array($v_header)) { + $v_header = array(); + } + // ----- Calculate the checksum + $v_checksum = 0; + // ..... First part of the header + for ($i=0; $i<148; $i++) + $v_checksum+=ord(substr($v_binary_data,$i,1)); + // ..... Ignore the checksum value and replace it by ' ' (space) + for ($i=148; $i<156; $i++) + $v_checksum += ord(' '); + // ..... Last part of the header + for ($i=156; $i<512; $i++) + $v_checksum+=ord(substr($v_binary_data,$i,1)); + + if (version_compare(PHP_VERSION,"5.5.0-dev")<0) { + $fmt = "a100filename/a8mode/a8uid/a8gid/a12size/a12mtime/" . + "a8checksum/a1typeflag/a100link/a6magic/a2version/" . + "a32uname/a32gname/a8devmajor/a8devminor/a131prefix"; + } else { + $fmt = "Z100filename/Z8mode/Z8uid/Z8gid/Z12size/Z12mtime/" . + "Z8checksum/Z1typeflag/Z100link/Z6magic/Z2version/" . + "Z32uname/Z32gname/Z8devmajor/Z8devminor/Z131prefix"; + } + $v_data = unpack($fmt, $v_binary_data); + + if (strlen($v_data["prefix"]) > 0) { + $v_data["filename"] = "$v_data[prefix]/$v_data[filename]"; + } + + // ----- Extract the checksum + $v_header['checksum'] = OctDec(trim($v_data['checksum'])); + if ($v_header['checksum'] != $v_checksum) { + $v_header['filename'] = ''; + + // ----- Look for last block (empty block) + if (($v_checksum == 256) && ($v_header['checksum'] == 0)) + return true; + + $this->_error('Invalid checksum for file "'.$v_data['filename'] + .'" : '.$v_checksum.' calculated, ' + .$v_header['checksum'].' expected'); + return false; + } + + // ----- Extract the properties + $v_header['filename'] = $v_data['filename']; + if ($this->_maliciousFilename($v_header['filename'])) { + $this->_error('Malicious .tar detected, file "' . $v_header['filename'] . + '" will not install in desired directory tree'); + return false; + } + $v_header['mode'] = OctDec(trim($v_data['mode'])); + $v_header['uid'] = OctDec(trim($v_data['uid'])); + $v_header['gid'] = OctDec(trim($v_data['gid'])); + $v_header['size'] = OctDec(trim($v_data['size'])); + $v_header['mtime'] = OctDec(trim($v_data['mtime'])); + if (($v_header['typeflag'] = $v_data['typeflag']) == "5") { + $v_header['size'] = 0; + } + $v_header['link'] = trim($v_data['link']); + /* ----- All these fields are removed form the header because + they do not carry interesting info + $v_header[magic] = trim($v_data[magic]); + $v_header[version] = trim($v_data[version]); + $v_header[uname] = trim($v_data[uname]); + $v_header[gname] = trim($v_data[gname]); + $v_header[devmajor] = trim($v_data[devmajor]); + $v_header[devminor] = trim($v_data[devminor]); + */ + + return true; + } + // }}} + + // {{{ _maliciousFilename() + /** + * Detect and report a malicious file name + * + * @param string $file + * + * @return bool + * @access private + */ + function _maliciousFilename($file) + { + if (strpos($file, '/../') !== false) { + return true; + } + if (strpos($file, '../') === 0) { + return true; + } + return false; + } + // }}} + + // {{{ _readLongHeader() + function _readLongHeader(&$v_header) + { + $v_filename = ''; + $n = floor($v_header['size']/512); + for ($i=0; $i<$n; $i++) { + $v_content = $this->_readBlock(); + $v_filename .= $v_content; + } + if (($v_header['size'] % 512) != 0) { + $v_content = $this->_readBlock(); + $v_filename .= trim($v_content); + } + + // ----- Read the next header + $v_binary_data = $this->_readBlock(); + + if (!$this->_readHeader($v_binary_data, $v_header)) + return false; + + $v_filename = trim($v_filename); + $v_header['filename'] = $v_filename; + if ($this->_maliciousFilename($v_filename)) { + $this->_error('Malicious .tar detected, file "' . $v_filename . + '" will not install in desired directory tree'); + return false; + } + + return true; + } + // }}} + + // {{{ _extractInString() + /** + * This method extract from the archive one file identified by $p_filename. + * The return value is a string with the file content, or null on error. + * + * @param string $p_filename The path of the file to extract in a string. + * + * @return a string with the file content or null. + * @access private + */ + function _extractInString($p_filename) + { + $v_result_str = ""; + + While (strlen($v_binary_data = $this->_readBlock()) != 0) + { + if (!$this->_readHeader($v_binary_data, $v_header)) + return null; + + if ($v_header['filename'] == '') + continue; + + // ----- Look for long filename + if ($v_header['typeflag'] == 'L') { + if (!$this->_readLongHeader($v_header)) + return null; + } + + if ($v_header['filename'] == $p_filename) { + if ($v_header['typeflag'] == "5") { + $this->_error('Unable to extract in string a directory ' + .'entry {'.$v_header['filename'].'}'); + return null; + } else { + $n = floor($v_header['size']/512); + for ($i=0; $i<$n; $i++) { + $v_result_str .= $this->_readBlock(); + } + if (($v_header['size'] % 512) != 0) { + $v_content = $this->_readBlock(); + $v_result_str .= substr($v_content, 0, + ($v_header['size'] % 512)); + } + return $v_result_str; + } + } else { + $this->_jumpBlock(ceil(($v_header['size']/512))); + } + } + + return null; + } + // }}} + + // {{{ _extractList() + function _extractList($p_path, &$p_list_detail, $p_mode, + $p_file_list, $p_remove_path, $p_preserve=false) + { + $v_result=true; + $v_nb = 0; + $v_extract_all = true; + $v_listing = false; + + $p_path = $this->_translateWinPath($p_path, false); + if ($p_path == '' || (substr($p_path, 0, 1) != '/' + && substr($p_path, 0, 3) != "../" && !strpos($p_path, ':'))) { + $p_path = "./".$p_path; + } + $p_remove_path = $this->_translateWinPath($p_remove_path); + + // ----- 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); + + switch ($p_mode) { + case "complete" : + $v_extract_all = true; + $v_listing = false; + break; + case "partial" : + $v_extract_all = false; + $v_listing = false; + break; + case "list" : + $v_extract_all = false; + $v_listing = true; + break; + default : + $this->_error('Invalid extract mode ('.$p_mode.')'); + return false; + } + + clearstatcache(); + + while (strlen($v_binary_data = $this->_readBlock()) != 0) + { + $v_extract_file = FALSE; + $v_extraction_stopped = 0; + + if (!$this->_readHeader($v_binary_data, $v_header)) + return false; + + if ($v_header['filename'] == '') { + continue; + } + + // ----- Look for long filename + if ($v_header['typeflag'] == 'L') { + if (!$this->_readLongHeader($v_header)) + return false; + } + + if ((!$v_extract_all) && (is_array($p_file_list))) { + // ----- By default no unzip if the file is not found + $v_extract_file = false; + + for ($i=0; $i strlen($p_file_list[$i])) + && (substr($v_header['filename'], 0, strlen($p_file_list[$i])) + == $p_file_list[$i])) { + $v_extract_file = true; + break; + } + } + + // ----- It is a file, so compare the file names + elseif ($p_file_list[$i] == $v_header['filename']) { + $v_extract_file = true; + break; + } + } + } else { + $v_extract_file = true; + } + + // ----- Look if this file need to be extracted + if (($v_extract_file) && (!$v_listing)) + { + if (($p_remove_path != '') + && (substr($v_header['filename'].'/', 0, $p_remove_path_size) + == $p_remove_path)) { + $v_header['filename'] = substr($v_header['filename'], + $p_remove_path_size); + if( $v_header['filename'] == '' ){ + continue; + } + } + if (($p_path != './') && ($p_path != '/')) { + while (substr($p_path, -1) == '/') + $p_path = substr($p_path, 0, strlen($p_path)-1); + + if (substr($v_header['filename'], 0, 1) == '/') + $v_header['filename'] = $p_path.$v_header['filename']; + else + $v_header['filename'] = $p_path.'/'.$v_header['filename']; + } + if (file_exists($v_header['filename'])) { + if ( (@is_dir($v_header['filename'])) + && ($v_header['typeflag'] == '')) { + $this->_error('File '.$v_header['filename'] + .' already exists as a directory'); + return false; + } + if ( ($this->_isArchive($v_header['filename'])) + && ($v_header['typeflag'] == "5")) { + $this->_error('Directory '.$v_header['filename'] + .' already exists as a file'); + return false; + } + if (!is_writeable($v_header['filename'])) { + $this->_error('File '.$v_header['filename'] + .' already exists and is write protected'); + return false; + } + if (filemtime($v_header['filename']) > $v_header['mtime']) { + // To be completed : An error or silent no replace ? + } + } + + // ----- Check the directory availability and create it if necessary + elseif (($v_result + = $this->_dirCheck(($v_header['typeflag'] == "5" + ?$v_header['filename'] + :dirname($v_header['filename'])))) != 1) { + $this->_error('Unable to create path for '.$v_header['filename']); + return false; + } + + if ($v_extract_file) { + if ($v_header['typeflag'] == "5") { + if (!@file_exists($v_header['filename'])) { + if (!@mkdir($v_header['filename'], 0777)) { + $this->_error('Unable to create directory {' + .$v_header['filename'].'}'); + return false; + } + } + } elseif ($v_header['typeflag'] == "2") { + if (@file_exists($v_header['filename'])) { + @unlink($v_header['filename']); + } + if (!@symlink($v_header['link'], $v_header['filename'])) { + $this->_error('Unable to extract symbolic link {' + .$v_header['filename'].'}'); + return false; + } + } else { + if (($v_dest_file = @fopen($v_header['filename'], "wb")) == 0) { + $this->_error('Error while opening {'.$v_header['filename'] + .'} in write binary mode'); + return false; + } else { + $n = floor($v_header['size']/512); + for ($i=0; $i<$n; $i++) { + $v_content = $this->_readBlock(); + fwrite($v_dest_file, $v_content, 512); + } + if (($v_header['size'] % 512) != 0) { + $v_content = $this->_readBlock(); + fwrite($v_dest_file, $v_content, ($v_header['size'] % 512)); + } + + @fclose($v_dest_file); + + if ($p_preserve) { + @chown($v_header['filename'], $v_header['uid']); + @chgrp($v_header['filename'], $v_header['gid']); + } + + // ----- Change the file mode, mtime + @touch($v_header['filename'], $v_header['mtime']); + if ($v_header['mode'] & 0111) { + // make file executable, obey umask + $mode = fileperms($v_header['filename']) | (~umask() & 0111); + @chmod($v_header['filename'], $mode); + } + } + + // ----- Check the file size + clearstatcache(); + if (!is_file($v_header['filename'])) { + $this->_error('Extracted file '.$v_header['filename'] + .'does not exist. Archive may be corrupted.'); + return false; + } + + $filesize = filesize($v_header['filename']); + if ($filesize != $v_header['size']) { + $this->_error('Extracted file '.$v_header['filename'] + .' does not have the correct file size \'' + .$filesize + .'\' ('.$v_header['size'] + .' expected). Archive may be corrupted.'); + return false; + } + } + } else { + $this->_jumpBlock(ceil(($v_header['size']/512))); + } + } else { + $this->_jumpBlock(ceil(($v_header['size']/512))); + } + + /* TBC : Seems to be unused ... + if ($this->_compress) + $v_end_of_file = @gzeof($this->_file); + else + $v_end_of_file = @feof($this->_file); + */ + + if ($v_listing || $v_extract_file || $v_extraction_stopped) { + // ----- Log extracted files + if (($v_file_dir = dirname($v_header['filename'])) + == $v_header['filename']) + $v_file_dir = ''; + if ((substr($v_header['filename'], 0, 1) == '/') && ($v_file_dir == '')) + $v_file_dir = '/'; + + $p_list_detail[$v_nb++] = $v_header; + if (is_array($p_file_list) && (count($p_list_detail) == count($p_file_list))) { + return true; + } + } + } + + return true; + } + // }}} + + // {{{ _openAppend() + function _openAppend() + { + if (filesize($this->_tarname) == 0) + return $this->_openWrite(); + + if ($this->_compress) { + $this->_close(); + + if (!@rename($this->_tarname, $this->_tarname.".tmp")) { + $this->_error('Error while renaming \''.$this->_tarname + .'\' to temporary file \''.$this->_tarname + .'.tmp\''); + return false; + } + + if ($this->_compress_type == 'gz') + $v_temp_tar = @gzopen($this->_tarname.".tmp", "rb"); + elseif ($this->_compress_type == 'bz2') + $v_temp_tar = @bzopen($this->_tarname.".tmp", "r"); + + if ($v_temp_tar == 0) { + $this->_error('Unable to open file \''.$this->_tarname + .'.tmp\' in binary read mode'); + @rename($this->_tarname.".tmp", $this->_tarname); + return false; + } + + if (!$this->_openWrite()) { + @rename($this->_tarname.".tmp", $this->_tarname); + return false; + } + + if ($this->_compress_type == 'gz') { + $end_blocks = 0; + + while (!@gzeof($v_temp_tar)) { + $v_buffer = @gzread($v_temp_tar, 512); + if ($v_buffer == ARCHIVE_TAR_END_BLOCK || strlen($v_buffer) == 0) { + $end_blocks++; + // do not copy end blocks, we will re-make them + // after appending + continue; + } elseif ($end_blocks > 0) { + for ($i = 0; $i < $end_blocks; $i++) { + $this->_writeBlock(ARCHIVE_TAR_END_BLOCK); + } + $end_blocks = 0; + } + $v_binary_data = pack("a512", $v_buffer); + $this->_writeBlock($v_binary_data); + } + + @gzclose($v_temp_tar); + } + elseif ($this->_compress_type == 'bz2') { + $end_blocks = 0; + + while (strlen($v_buffer = @bzread($v_temp_tar, 512)) > 0) { + if ($v_buffer == ARCHIVE_TAR_END_BLOCK || strlen($v_buffer) == 0) { + $end_blocks++; + // do not copy end blocks, we will re-make them + // after appending + continue; + } elseif ($end_blocks > 0) { + for ($i = 0; $i < $end_blocks; $i++) { + $this->_writeBlock(ARCHIVE_TAR_END_BLOCK); + } + $end_blocks = 0; + } + $v_binary_data = pack("a512", $v_buffer); + $this->_writeBlock($v_binary_data); + } + + @bzclose($v_temp_tar); + } + + if (!@unlink($this->_tarname.".tmp")) { + $this->_error('Error while deleting temporary file \'' + .$this->_tarname.'.tmp\''); + } + + } else { + // ----- For not compressed tar, just add files before the last + // one or two 512 bytes block + if (!$this->_openReadWrite()) + return false; + + clearstatcache(); + $v_size = filesize($this->_tarname); + + // We might have zero, one or two end blocks. + // The standard is two, but we should try to handle + // other cases. + fseek($this->_file, $v_size - 1024); + if (fread($this->_file, 512) == ARCHIVE_TAR_END_BLOCK) { + fseek($this->_file, $v_size - 1024); + } + elseif (fread($this->_file, 512) == ARCHIVE_TAR_END_BLOCK) { + fseek($this->_file, $v_size - 512); + } + } + + return true; + } + // }}} + + // {{{ _append() + function _append($p_filelist, $p_add_dir='', $p_remove_dir='') + { + if (!$this->_openAppend()) + return false; + + if ($this->_addList($p_filelist, $p_add_dir, $p_remove_dir)) + $this->_writeFooter(); + + $this->_close(); + + return true; + } + // }}} + + // {{{ _dirCheck() + + /** + * Check if a directory exists and create it (including parent + * dirs) if not. + * + * @param string $p_dir directory to check + * + * @return bool true if the directory exists or was created + */ + function _dirCheck($p_dir) + { + clearstatcache(); + if ((@is_dir($p_dir)) || ($p_dir == '')) + return true; + + $p_parent_dir = dirname($p_dir); + + if (($p_parent_dir != $p_dir) && + ($p_parent_dir != '') && + (!$this->_dirCheck($p_parent_dir))) + return false; + + if (!@mkdir($p_dir, 0777)) { + $this->_error("Unable to create directory '$p_dir'"); + return false; + } + + return true; + } + + // }}} + + // {{{ _pathReduction() + + /** + * Compress path by changing for example "/dir/foo/../bar" to "/dir/bar", + * rand emove double slashes. + * + * @param string $p_dir path to reduce + * + * @return string reduced path + * + * @access private + * + */ + function _pathReduction($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 + 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] == "..") { + // ----- Ignore it and ignore the $i-1 + $i--; + } + else if ( ($v_list[$i] == '') + && ($i!=(sizeof($v_list)-1)) + && ($i!=0)) { + // ----- Ignore only the double '//' in path, + // but not the first and last / + } else { + $v_result = $v_list[$i].($i!=(sizeof($v_list)-1)?'/' + .$v_result:''); + } + } + } + + if (defined('OS_WINDOWS') && OS_WINDOWS) { + $v_result = strtr($v_result, '\\', '/'); + } + + return $v_result; + } + + // }}} + + // {{{ _translateWinPath() + function _translateWinPath($p_path, $p_remove_disk_letter=true) + { + if (defined('OS_WINDOWS') && OS_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; + } + // }}} + +} +?> \ No newline at end of file diff --git a/thirdparty/pear/Archive/Zip.php b/thirdparty/pear/Archive/Zip.php new file mode 100644 index 000000000..941b0d655 --- /dev/null +++ b/thirdparty/pear/Archive/Zip.php @@ -0,0 +1,3620 @@ + | +// +----------------------------------------------------------------------+ +// +// $Id: Zip.php,v 1.2 2005/11/21 06:51:57 vblavet Exp $ + + require_once 'PEAR.php'; + + // ----- Constants + define( 'ARCHIVE_ZIP_READ_BLOCK_SIZE', 2048 ); + + // ----- File list separator + define( 'ARCHIVE_ZIP_SEPARATOR', ',' ); + + // ----- Optional static temporary directory + // By default temporary files are generated in the script current + // path. + // If defined : + // - MUST BE terminated by a '/'. + // - MUST be a valid, already created directory + // Samples : + // define( 'ARCHIVE_ZIP_TEMPORARY_DIR', '/temp/' ); + // define( 'ARCHIVE_ZIP_TEMPORARY_DIR', 'C:/Temp/' ); + define( 'ARCHIVE_ZIP_TEMPORARY_DIR', '' ); + + // ----- Error codes + define( 'ARCHIVE_ZIP_ERR_NO_ERROR', 0 ); + define( 'ARCHIVE_ZIP_ERR_WRITE_OPEN_FAIL', -1 ); + define( 'ARCHIVE_ZIP_ERR_READ_OPEN_FAIL', -2 ); + define( 'ARCHIVE_ZIP_ERR_INVALID_PARAMETER', -3 ); + define( 'ARCHIVE_ZIP_ERR_MISSING_FILE', -4 ); + define( 'ARCHIVE_ZIP_ERR_FILENAME_TOO_LONG', -5 ); + define( 'ARCHIVE_ZIP_ERR_INVALID_ZIP', -6 ); + define( 'ARCHIVE_ZIP_ERR_BAD_EXTRACTED_FILE', -7 ); + define( 'ARCHIVE_ZIP_ERR_DIR_CREATE_FAIL', -8 ); + define( 'ARCHIVE_ZIP_ERR_BAD_EXTENSION', -9 ); + define( 'ARCHIVE_ZIP_ERR_BAD_FORMAT', -10 ); + define( 'ARCHIVE_ZIP_ERR_DELETE_FILE_FAIL', -11 ); + define( 'ARCHIVE_ZIP_ERR_RENAME_FILE_FAIL', -12 ); + define( 'ARCHIVE_ZIP_ERR_BAD_CHECKSUM', -13 ); + define( 'ARCHIVE_ZIP_ERR_INVALID_ARCHIVE_ZIP', -14 ); + define( 'ARCHIVE_ZIP_ERR_MISSING_OPTION_VALUE', -15 ); + define( 'ARCHIVE_ZIP_ERR_INVALID_PARAM_VALUE', -16 ); + + // ----- Warning codes + define( 'ARCHIVE_ZIP_WARN_NO_WARNING', 0 ); + define( 'ARCHIVE_ZIP_WARN_FILE_EXIST', 1 ); + + // ----- Methods parameters + define( 'ARCHIVE_ZIP_PARAM_PATH', 'path' ); + define( 'ARCHIVE_ZIP_PARAM_ADD_PATH', 'add_path' ); + define( 'ARCHIVE_ZIP_PARAM_REMOVE_PATH', 'remove_path' ); + define( 'ARCHIVE_ZIP_PARAM_REMOVE_ALL_PATH', 'remove_all_path' ); + define( 'ARCHIVE_ZIP_PARAM_SET_CHMOD', 'set_chmod' ); + define( 'ARCHIVE_ZIP_PARAM_EXTRACT_AS_STRING', 'extract_as_string' ); + define( 'ARCHIVE_ZIP_PARAM_NO_COMPRESSION', 'no_compression' ); + define( 'ARCHIVE_ZIP_PARAM_BY_NAME', 'by_name' ); + define( 'ARCHIVE_ZIP_PARAM_BY_INDEX', 'by_index' ); + define( 'ARCHIVE_ZIP_PARAM_BY_EREG', 'by_ereg' ); + define( 'ARCHIVE_ZIP_PARAM_BY_PREG', 'by_preg' ); + + define( 'ARCHIVE_ZIP_PARAM_PRE_EXTRACT', 'callback_pre_extract' ); + define( 'ARCHIVE_ZIP_PARAM_POST_EXTRACT', 'callback_post_extract' ); + define( 'ARCHIVE_ZIP_PARAM_PRE_ADD', 'callback_pre_add' ); + define( 'ARCHIVE_ZIP_PARAM_POST_ADD', 'callback_post_add' ); + + + +/** +* Class for manipulating zip archive files +* +* A class which provided common methods to manipulate ZIP formatted +* archive files. +* It provides creation, extraction, deletion and add features. +* +* @author Vincent Blavet +* @version $Revision: 1.2 $ +* @package Archive_Zip +* @category Archive +*/ +class Archive_Zip +{ + /** + * The filename of the zip archive. + * + * @var string Name of the Zip file + */ + var $_zipname=''; + + /** + * File descriptor of the opened Zip file. + * + * @var int Internal zip file descriptor + */ + var $_zip_fd=0; + + /** + * @var int last error code + */ + var $_error_code=1; + + /** + * @var string Last error description + */ + var $_error_string=''; + + // {{{ constructor + /** + * Archive_Zip Class constructor. This flavour of the constructor only + * declare a new Archive_Zip object, identifying it by the name of the + * zip file. + * + * @param string $p_zipname The name of the zip archive to create + * @access public + */ + function Archive_Zip($p_zipname) + { + + // ----- Check the zlib + if (!extension_loaded('zlib')) { + PEAR::loadExtension('zlib'); + } + if (!extension_loaded('zlib')) { + die("The extension 'zlib' couldn't be found.\n". + "Please make sure your version of PHP was built ". + "with 'zlib' support.\n"); + return false; + } + + // ----- Set the attributes + $this->_zipname = $p_zipname; + $this->_zip_fd = 0; + + return; + } + // }}} + + // {{{ create() + /** + * This method creates a Zip Archive with the filename set with + * the constructor. + * The files and directories indicated in $p_filelist + * are added in the archive. + * When a directory is in the list, the directory and its content is added + * in the archive. + * The methods takes a variable list of parameters in $p_params. + * The supported parameters for this method are : + * 'add_path' : Add a path to the archived files. + * 'remove_path' : Remove the specified 'root' path of the archived files. + * 'remove_all_path' : Remove all the path of the archived files. + * 'no_compression' : The archived files will not be compressed. + * + * @access public + * @param mixed $p_filelist The list of the files or folders to add. + * It can be a string with filenames separated + * by a comma, or an array of filenames. + * @param mixed $p_params An array of variable parameters and values. + * @return mixed An array of file description on success, + * an error code on error + */ + function create($p_filelist, $p_params=0) + { + $this->_errorReset(); + + // ----- Set default values + if ($p_params === 0) { + $p_params = array(); + } + if ($this->_check_parameters($p_params, + array('no_compression' => false, + 'add_path' => "", + 'remove_path' => "", + 'remove_all_path' => false)) != 1) { + return 0; + } + + // ----- Look if the $p_filelist is really an array + $p_result_list = array(); + if (is_array($p_filelist)) { + $v_result = $this->_create($p_filelist, $p_result_list, $p_params); + } + + // ----- Look if the $p_filelist is a string + else if (is_string($p_filelist)) { + // ----- Create a list with the elements from the string + $v_list = explode(ARCHIVE_ZIP_SEPARATOR, $p_filelist); + + $v_result = $this->_create($v_list, $p_result_list, $p_params); + } + + // ----- Invalid variable + else { + $this->_errorLog(ARCHIVE_ZIP_ERR_INVALID_PARAMETER, + 'Invalid variable type p_filelist'); + $v_result = ARCHIVE_ZIP_ERR_INVALID_PARAMETER; + } + + if ($v_result != 1) { + return 0; + } + + return $p_result_list; + } + // }}} + + // {{{ add() + /** + * This method add files or directory in an existing Zip Archive. + * If the Zip Archive does not exist it is created. + * The files and directories to add are indicated in $p_filelist. + * When a directory is in the list, the directory and its content is added + * in the archive. + * The methods takes a variable list of parameters in $p_params. + * The supported parameters for this method are : + * 'add_path' : Add a path to the archived files. + * 'remove_path' : Remove the specified 'root' path of the archived files. + * 'remove_all_path' : Remove all the path of the archived files. + * 'no_compression' : The archived files will not be compressed. + * 'callback_pre_add' : A callback function that will be called before + * each entry archiving. + * 'callback_post_add' : A callback function that will be called after + * each entry archiving. + * + * @access public + * @param mixed $p_filelist The list of the files or folders to add. + * It can be a string with filenames separated + * by a comma, or an array of filenames. + * @param mixed $p_params An array of variable parameters and values. + * @return mixed An array of file description on success, + * 0 on an unrecoverable failure, an error code is logged. + */ + function add($p_filelist, $p_params=0) + { + $this->_errorReset(); + + // ----- Set default values + if ($p_params === 0) { + $p_params = array(); + } + if ($this->_check_parameters($p_params, + array ('no_compression' => false, + 'add_path' => '', + 'remove_path' => '', + 'remove_all_path' => false, + 'callback_pre_add' => '', + 'callback_post_add' => '')) != 1) { + return 0; + } + + // ----- Look if the $p_filelist is really an array + $p_result_list = array(); + if (is_array($p_filelist)) { + // ----- Call the create fct + $v_result = $this->_add($p_filelist, $p_result_list, $p_params); + } + + // ----- Look if the $p_filelist is a string + else if (is_string($p_filelist)) { + // ----- Create a list with the elements from the string + $v_list = explode(ARCHIVE_ZIP_SEPARATOR, $p_filelist); + + // ----- Call the create fct + $v_result = $this->_add($v_list, $p_result_list, $p_params); + } + + // ----- Invalid variable + else { + $this->_errorLog(ARCHIVE_ZIP_ERR_INVALID_PARAMETER, + "add() : Invalid variable type p_filelist"); + $v_result = ARCHIVE_ZIP_ERR_INVALID_PARAMETER; + } + + if ($v_result != 1) { + return 0; + } + + // ----- Return the result list + return $p_result_list; + } + // }}} + + // {{{ listContent() + /** + * This method gives the names and properties of the files and directories + * which are present in the zip archive. + * The properties of each entries in the list are : + * filename : Name of the file. + * For create() or add() it's the filename given by the user. + * For an extract() it's 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 zip headers overhead) + * mtime : Last known modification date of the file (UNIX timestamp) + * comment : Comment associated with the file + * folder : true | false (indicates if the entry is a folder) + * index : index of the file in the archive (-1 when not available) + * status : status of the action on the entry (depending of the action) : + * Values are : + * ok : OK ! + * filtered : the file/dir was not extracted (filtered by user) + * already_a_directory : the file can't be extracted because a + * directory with the same name already + * exists + * write_protected : the file can't 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 already exists + * path_creation_fail : the file is not extracted because the + * folder does not exists and can't 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 error on a single file, the error is only logged in the file status. + * + * @access public + * @return mixed An array of file description on success, + * 0 on an unrecoverable failure, an error code is logged. + */ + function listContent() + { + $this->_errorReset(); + + // ----- Check archive + if (!$this->_checkFormat()) { + return(0); + } + + $v_list = array(); + if ($this->_list($v_list) != 1) { + unset($v_list); + return(0); + } + + return $v_list; + } + // }}} + + // {{{ extract() + /** + * This method extract the files and folders which are in the zip archive. + * It can extract all the archive or a part of the archive by using filter + * feature (extract by name, by index, by ereg, by preg). The extraction + * can occur in the current path or an other path. + * All the advanced features are activated by the use of variable + * parameters. + * The return value is an array of entry descriptions which gives + * information on extracted files (See listContent()). + * The method may return a success value (an array) even if some files + * are not correctly extracted (see the file status in listContent()). + * The supported variable parameters for this method are : + * 'add_path' : Path where the files and directories are to be extracted + * 'remove_path' : First part ('root' part) of the memorized path + * (if similar) to remove while extracting. + * 'remove_all_path' : Remove all the memorized path while extracting. + * 'extract_as_string' : + * 'set_chmod' : After the extraction of the file the indicated mode + * will be set. + * 'by_name' : It can be a string with file/dir names separated by ',', + * or an array of file/dir names to extract from the archive. + * 'by_index' : A string with range of indexes separated by ',', + * (sample "1,3-5,12"). + * 'by_ereg' : A regular expression (ereg) that must match the extracted + * filename. + * 'by_preg' : A regular expression (preg) that must match the extracted + * filename. + * 'callback_pre_extract' : A callback function that will be called before + * each entry extraction. + * 'callback_post_extract' : A callback function that will be called after + * each entry extraction. + * + * @access public + * @param mixed $p_params An array of variable parameters and values. + * @return mixed An array of file description on success, + * 0 on an unrecoverable failure, an error code is logged. + */ + function extract($p_params=0) + { + + $this->_errorReset(); + + // ----- Check archive + if (!$this->_checkFormat()) { + return(0); + } + + // ----- Set default values + if ($p_params === 0) { + $p_params = array(); + } + if ($this->_check_parameters($p_params, + array ('extract_as_string' => false, + 'add_path' => '', + 'remove_path' => '', + 'remove_all_path' => false, + 'callback_pre_extract' => '', + 'callback_post_extract' => '', + 'set_chmod' => 0, + 'by_name' => '', + 'by_index' => '', + 'by_ereg' => '', + 'by_preg' => '') ) != 1) { + return 0; + } + + // ----- Call the extracting fct + $v_list = array(); + if ($this->_extractByRule($v_list, $p_params) != 1) { + unset($v_list); + return(0); + } + + return $v_list; + } + // }}} + + + // {{{ delete() + /** + * This methods delete archive entries in the zip archive. + * Notice that at least one filtering rule (set by the variable parameter + * list) must be set. + * Also notice that if you delete a folder entry, only the folder entry + * is deleted, not all the files bellonging to this folder. + * The supported variable parameters for this method are : + * 'by_name' : It can be a string with file/dir names separated by ',', + * or an array of file/dir names to delete from the archive. + * 'by_index' : A string with range of indexes separated by ',', + * (sample "1,3-5,12"). + * 'by_ereg' : A regular expression (ereg) that must match the extracted + * filename. + * 'by_preg' : A regular expression (preg) that must match the extracted + * filename. + * + * @access public + * @param mixed $p_params An array of variable parameters and values. + * @return mixed An array of file description on success, + * 0 on an unrecoverable failure, an error code is logged. + */ + function delete($p_params) + { + $this->_errorReset(); + + // ----- Check archive + if (!$this->_checkFormat()) { + return(0); + } + + // ----- Set default values + if ($this->_check_parameters($p_params, + array ('by_name' => '', + 'by_index' => '', + 'by_ereg' => '', + 'by_preg' => '') ) != 1) { + return 0; + } + + // ----- Check that at least one rule is set + if ( ($p_params['by_name'] == '') + && ($p_params['by_index'] == '') + && ($p_params['by_ereg'] == '') + && ($p_params['by_preg'] == '')) { + $this->_errorLog(ARCHIVE_ZIP_ERR_INVALID_PARAMETER, + 'At least one filtering rule must' + .' be set as parameter'); + return 0; + } + + // ----- Call the delete fct + $v_list = array(); + if ($this->_deleteByRule($v_list, $p_params) != 1) { + unset($v_list); + return(0); + } + + return $v_list; + } + // }}} + + // {{{ properties() + /** + * This method gives the global 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 + * + * @access public + * @param mixed $p_params {Description} + * @return mixed An array with the global properties or 0 on error. + */ + function properties() + { + $this->_errorReset(); + + // ----- Check archive + if (!$this->_checkFormat()) { + 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->_errorLog(ARCHIVE_ZIP_ERR_READ_OPEN_FAIL, + 'Unable to open archive \''.$this->_zipname + .'\' in binary read mode'); + return 0; + } + + // ----- Read the central directory informations + $v_central_dir = array(); + if (($v_result = $this->_readEndCentralDir($v_central_dir)) != 1) { + return 0; + } + + $this->_closeFd(); + + // ----- Set the user attributes + $v_prop['comment'] = $v_central_dir['comment']; + $v_prop['nb'] = $v_central_dir['entries']; + $v_prop['status'] = 'ok'; + } + + return $v_prop; + } + // }}} + + + // {{{ duplicate() + /** + * 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. + * + * @access public + * @param mixed $p_archive It can be a valid Archive_Zip object or + * the filename of a valid zip archive. + * @return integer 1 on success, 0 on failure. + */ + function duplicate($p_archive) + { + $this->_errorReset(); + + // ----- Look if the $p_archive is a Archive_Zip object + if ( (is_object($p_archive)) + && (strtolower(get_class($p_archive)) == 'archive_zip')) { + $v_result = $this->_duplicate($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)) { + $this->_errorLog(ARCHIVE_ZIP_ERR_MISSING_FILE, + "No file with filename '".$p_archive."'"); + $v_result = ARCHIVE_ZIP_ERR_MISSING_FILE; + } + else { + $v_result = $this->_duplicate($p_archive); + } + } + + // ----- Invalid variable + else { + $this->_errorLog(ARCHIVE_ZIP_ERR_INVALID_PARAMETER, + "Invalid variable type p_archive_to_add"); + $v_result = ARCHIVE_ZIP_ERR_INVALID_PARAMETER; + } + + return $v_result; + } + // }}} + + // {{{ merge() + /** + * This method merge a valid zip archive at the end of the + * archive identified by the Archive_Zip object. + * If the archive ($this) does not exist, the merge becomes a duplicate. + * If the archive to add does not exist, the merge is a success. + * + * @access public + * @param mixed $p_archive_to_add It can be a valid Archive_Zip object or + * the filename of a valid zip archive. + * @return integer 1 on success, 0 on failure. + */ + function merge($p_archive_to_add) + { + $v_result = 1; + $this->_errorReset(); + + // ----- Check archive + if (!$this->_checkFormat()) { + return(0); + } + + // ----- Look if the $p_archive_to_add is a Archive_Zip object + if ( (is_object($p_archive_to_add)) + && (strtolower(get_class($p_archive_to_add)) == 'archive_zip')) { + $v_result = $this->_merge($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 Archive_Zip($p_archive_to_add); + + // ----- Merge the archive + $v_result = $this->_merge($v_object_archive); + } + + // ----- Invalid variable + else { + $this->_errorLog(ARCHIVE_ZIP_ERR_INVALID_PARAMETER, + "Invalid variable type p_archive_to_add"); + $v_result = ARCHIVE_ZIP_ERR_INVALID_PARAMETER; + } + + return $v_result; + } + // }}} + + // {{{ errorCode() + /** + * Method that gives the lastest error code. + * + * @access public + * @return integer The error code value. + */ + function errorCode() + { + return($this->_error_code); + } + // }}} + + // {{{ errorName() + /** + * This method gives the latest error code name. + * + * @access public + * @param boolean $p_with_code If true, gives the name and the int value. + * @return string The error name. + */ + function errorName($p_with_code=false) + { + $v_const_list = get_defined_constants(); + + // ----- Extract error constants from all const. + for (reset($v_const_list); + list($v_key, $v_value) = each($v_const_list);) { + if (substr($v_key, 0, strlen('ARCHIVE_ZIP_ERR_')) + =='ARCHIVE_ZIP_ERR_') { + $v_error_list[$v_key] = $v_value; + } + } + + // ----- Search the name form the code value + $v_key=array_search($this->_error_code, $v_error_list, true); + if ($v_key!=false) { + $v_value = $v_key; + } + else { + $v_value = 'NoName'; + } + + if ($p_with_code) { + return($v_value.' ('.$this->_error_code.')'); + } + else { + return($v_value); + } + } + // }}} + + // {{{ errorInfo() + /** + * This method returns the description associated with the latest error. + * + * @access public + * @param boolean $p_full If set to true gives the description with the + * error code, the name and the description. + * If set to false gives only the description + * and the error code. + * @return string The error description. + */ + function errorInfo($p_full=false) + { + 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 : _checkFormat() + // 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. + // --------------------------------------------------------------------------- + /** + * Archive_Zip::_checkFormat() + * + * { Description } + * + * @param integer $p_level + */ + function _checkFormat($p_level=0) + { + $v_result = true; + + // ----- Reset the error handler + $this->_errorReset(); + + // ----- Look if the file exits + if (!is_file($this->_zipname)) { + // ----- Error log + $this->_errorLog(ARCHIVE_ZIP_ERR_MISSING_FILE, + "Missing archive file '".$this->_zipname."'"); + return(false); + } + + // ----- Check that the file is readeable + if (!is_readable($this->_zipname)) { + // ----- Error log + $this->_errorLog(ARCHIVE_ZIP_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 : _create() + // Description : + // Parameters : + // Return Values : + // --------------------------------------------------------------------------- + /** + * Archive_Zip::_create() + * + * { Description } + * + */ + function _create($p_list, &$p_result_list, &$p_params) + { + $v_result=1; + $v_list_detail = array(); + + $p_add_dir = $p_params['add_path']; + $p_remove_dir = $p_params['remove_path']; + $p_remove_all_dir = $p_params['remove_all_path']; + + // ----- Open the file in write mode + if (($v_result = $this->_openFd('wb')) != 1) + { + // ----- Return + return $v_result; + } + + // ----- Add the list of files + $v_result = $this->_addList($p_list, $p_result_list, $p_add_dir, $p_remove_dir, $p_remove_all_dir, $p_params); + + // ----- Close + $this->_closeFd(); + + // ----- Return + return $v_result; + } + // --------------------------------------------------------------------------- + + // --------------------------------------------------------------------------- + // Function : _add() + // Description : + // Parameters : + // Return Values : + // --------------------------------------------------------------------------- + /** + * Archive_Zip::_add() + * + * { Description } + * + */ + function _add($p_list, &$p_result_list, &$p_params) + { + $v_result=1; + $v_list_detail = array(); + + $p_add_dir = $p_params['add_path']; + $p_remove_dir = $p_params['remove_path']; + $p_remove_all_dir = $p_params['remove_all_path']; + + // ----- Look if the archive exists or is empty and need to be created + if ((!is_file($this->_zipname)) || (filesize($this->_zipname) == 0)) { + $v_result = $this->_create($p_list, $p_result_list, $p_params); + return $v_result; + } + + // ----- Open the zip file + if (($v_result=$this->_openFd('rb')) != 1) { + return $v_result; + } + + // ----- Read the central directory informations + $v_central_dir = array(); + if (($v_result = $this->_readEndCentralDir($v_central_dir)) != 1) + { + $this->_closeFd(); + return $v_result; + } + + // ----- Go to beginning of File + @rewind($this->_zip_fd); + + // ----- Creates a temporay file + $v_zip_temp_name = ARCHIVE_ZIP_TEMPORARY_DIR.uniqid('archive_zip-').'.tmp'; + + // ----- Open the temporary file in write mode + if (($v_zip_temp_fd = @fopen($v_zip_temp_name, 'wb')) == 0) + { + $this->_closeFd(); + + $this->_errorLog(ARCHIVE_ZIP_ERR_READ_OPEN_FAIL, + 'Unable to open temporary file \'' + .$v_zip_temp_name.'\' in binary write mode'); + return Archive_Zip::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 < ARCHIVE_ZIP_READ_BLOCK_SIZE + ? $v_size : ARCHIVE_ZIP_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->_addFileList($p_list, $v_header_list, + $p_add_dir, $p_remove_dir, + $p_remove_all_dir, $p_params)) != 1) + { + fclose($v_zip_temp_fd); + $this->_closeFd(); + @unlink($v_zip_temp_name); + + // ----- 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 < ARCHIVE_ZIP_READ_BLOCK_SIZE + ? $v_size : ARCHIVE_ZIP_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; $i_writeCentralFileHeader($v_header_list[$i]))!=1) { + fclose($v_zip_temp_fd); + $this->_closeFd(); + @unlink($v_zip_temp_name); + + // ----- Return + return $v_result; + } + $v_count++; + } + + // ----- Transform the header to a 'usable' info + $this->_convertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]); + } + + // ----- Zip file 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->_writeCentralHeader($v_count + +$v_central_dir['entries'], + $v_size, $v_offset, + $v_comment)) != 1) { + // ----- 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->_closeFd(); + + // ----- 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); + $this->_tool_Rename($v_zip_temp_name, $this->_zipname); + + // ----- Return + return $v_result; + } + // --------------------------------------------------------------------------- + + // --------------------------------------------------------------------------- + // Function : _openFd() + // Description : + // Parameters : + // --------------------------------------------------------------------------- + /** + * Archive_Zip::_openFd() + * + * { Description } + * + */ + function _openFd($p_mode) + { + $v_result=1; + + // ----- Look if already open + if ($this->_zip_fd != 0) + { + $this->_errorLog(ARCHIVE_ZIP_ERR_READ_OPEN_FAIL, + 'Zip file \''.$this->_zipname.'\' already open'); + return Archive_Zip::errorCode(); + } + + // ----- Open the zip file + if (($this->_zip_fd = @fopen($this->_zipname, $p_mode)) == 0) + { + $this->_errorLog(ARCHIVE_ZIP_ERR_READ_OPEN_FAIL, + 'Unable to open archive \''.$this->_zipname + .'\' in '.$p_mode.' mode'); + return Archive_Zip::errorCode(); + } + + // ----- Return + return $v_result; + } + // --------------------------------------------------------------------------- + + // --------------------------------------------------------------------------- + // Function : _closeFd() + // Description : + // Parameters : + // --------------------------------------------------------------------------- + /** + * Archive_Zip::_closeFd() + * + * { Description } + * + */ + function _closeFd() + { + $v_result=1; + + if ($this->_zip_fd != 0) + @fclose($this->_zip_fd); + $this->_zip_fd = 0; + + // ----- Return + return $v_result; + } + // --------------------------------------------------------------------------- + + // --------------------------------------------------------------------------- + // Function : _addList() + // 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 : + // --------------------------------------------------------------------------- + /** + * Archive_Zip::_addList() + * + * { Description } + * + */ + function _addList($p_list, &$p_result_list, + $p_add_dir, $p_remove_dir, $p_remove_all_dir, &$p_params) + { + $v_result=1; + + // ----- Add the files + $v_header_list = array(); + if (($v_result = $this->_addFileList($p_list, $v_header_list, + $p_add_dir, $p_remove_dir, + $p_remove_all_dir, $p_params)) != 1) { + 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; $i_writeCentralFileHeader($v_header_list[$i])) != 1) { + return $v_result; + } + $v_count++; + } + + // ----- Transform the header to a 'usable' info + $this->_convertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]); + } + + // ----- Zip file 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->_writeCentralHeader($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 : _addFileList() + // 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 + // run the lib 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 : + // --------------------------------------------------------------------------- + /** + * Archive_Zip::_addFileList() + * + * { Description } + * + */ + function _addFileList($p_list, &$p_result_list, + $p_add_dir, $p_remove_dir, $p_remove_all_dir, + &$p_params) + { + $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; ($j_tool_TranslateWinPath($p_list[$j], false); + + // ----- Skip empty file names + if ($p_filename == "") + { + continue; + } + + // ----- Check the filename + if (!file_exists($p_filename)) + { + $this->_errorLog(ARCHIVE_ZIP_ERR_MISSING_FILE, + "File '$p_filename' does not exists"); + return Archive_Zip::errorCode(); + } + + // ----- Look if it is a file or a dir with no all pathnre move + if ((is_file($p_filename)) || ((is_dir($p_filename)) && !$p_remove_all_dir)) { + // ----- Add the file + if (($v_result = $this->_addFile($p_filename, $v_header, $p_add_dir, $p_remove_dir, $p_remove_all_dir, $p_params)) != 1) + { + // ----- Return status + return $v_result; + } + + // ----- Store the file infos + $p_result_list[$v_nb++] = $v_header; + } + + // ----- Look for directory + if (is_dir($p_filename)) + { + + // ----- Look for path + if ($p_filename != ".") + $v_path = $p_filename."/"; + else + $v_path = ""; + + // ----- Read the directory for files and sub-directories + $p_hdir = opendir($p_filename); + $p_hitem = readdir($p_hdir); // '.' directory + $p_hitem = readdir($p_hdir); // '..' directory + while ($p_hitem = readdir($p_hdir)) + { + + // ----- Look for a file + if (is_file($v_path.$p_hitem)) + { + + // ----- Add the file + if (($v_result = $this->_addFile($v_path.$p_hitem, $v_header, $p_add_dir, $p_remove_dir, $p_remove_all_dir, $p_params)) != 1) + { + // ----- Return status + return $v_result; + } + + // ----- Store the file infos + $p_result_list[$v_nb++] = $v_header; + } + + // ----- Recursive call to _addFileList() + else + { + + // ----- Need an array as parameter + $p_temp_list[0] = $v_path.$p_hitem; + $v_result = $this->_addFileList($p_temp_list, $p_result_list, $p_add_dir, $p_remove_dir, $p_remove_all_dir, $p_params); + + // ----- Update the number of elements of the list + $v_nb = sizeof($p_result_list); + } + } + + // ----- Free memory for the recursive loop + unset($p_temp_list); + unset($p_hdir); + unset($p_hitem); + } + } + + return $v_result; + } + // --------------------------------------------------------------------------- + + // --------------------------------------------------------------------------- + // Function : _addFile() + // Description : + // Parameters : + // Return Values : + // --------------------------------------------------------------------------- + /** + * Archive_Zip::_addFile() + * + * { Description } + * + */ + function _addFile($p_filename, &$p_header, $p_add_dir, $p_remove_dir, $p_remove_all_dir, &$p_params) + { + $v_result=1; + + if ($p_filename == "") + { + // ----- Error log + $this->_errorLog(ARCHIVE_ZIP_ERR_INVALID_PARAMETER, "Invalid file list parameter (invalid or empty list)"); + + // ----- Return + return Archive_Zip::errorCode(); + } + + // ----- 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 = $this->_tool_PathInclusion($p_remove_dir, $p_filename); + if ($v_compare > 0) +// if (substr($p_filename, 0, strlen($p_remove_dir)) == $p_remove_dir) + { + + if ($v_compare == 2) { + $v_stored_filename = ""; + } + else { + $v_stored_filename = substr($p_filename, strlen($p_remove_dir)); + } + } + } + // ----- 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 = $this->_tool_PathReduction($v_stored_filename); + + + /* filename length moved after call-back in release 1.3 + // ----- Check the path length + if (strlen($v_stored_filename) > 0xFF) + { + // ----- Error log + $this->_errorLog(-5, "Stored file name is too long (max. 255) : '$v_stored_filename'"); + + // ----- Return + return Archive_Zip::errorCode(); + } + */ + + // ----- Set the file properties + clearstatcache(); + $p_header['version'] = 20; + $p_header['version_extracted'] = 10; + $p_header['flag'] = 0; + $p_header['compression'] = 0; + $p_header['mtime'] = filemtime($p_filename); + $p_header['crc'] = 0; + $p_header['compressed_size'] = 0; + $p_header['size'] = filesize($p_filename); + $p_header['filename_len'] = strlen($p_filename); + $p_header['extra_len'] = 0; + $p_header['comment_len'] = 0; + $p_header['disk'] = 0; + $p_header['internal'] = 0; + $p_header['external'] = (is_file($p_filename)?0xFE49FFE0:0x41FF0010); + $p_header['offset'] = 0; + $p_header['filename'] = $p_filename; + $p_header['stored_filename'] = $v_stored_filename; + $p_header['extra'] = ''; + $p_header['comment'] = ''; + $p_header['status'] = 'ok'; + $p_header['index'] = -1; + + // ----- Look for pre-add callback + if ( (isset($p_params[ARCHIVE_ZIP_PARAM_PRE_ADD])) + && ($p_params[ARCHIVE_ZIP_PARAM_PRE_ADD] != '')) { + + // ----- Generate a local information + $v_local_header = array(); + $this->_convertHeader2FileInfo($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_params[ARCHIVE_ZIP_PARAM_PRE_ADD].'(ARCHIVE_ZIP_PARAM_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'] = $this->_tool_PathReduction($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 (is_file($p_filename)) + { + // ----- Open the source file + if (($v_file = @fopen($p_filename, "rb")) == 0) { + $this->_errorLog(ARCHIVE_ZIP_ERR_READ_OPEN_FAIL, "Unable to open file '$p_filename' in binary read mode"); + return Archive_Zip::errorCode(); + } + + if ($p_params['no_compression']) { + // ----- Read the file content + $v_content_compressed = @fread($v_file, $p_header['size']); + + // ----- Calculate the CRC + $p_header['crc'] = $this->encryptCrc32($v_content_compressed); + } + else { + // ----- Read the file content + $v_content = @fread($v_file, $p_header['size']); + + // ----- Calculate the CRC + $p_header['crc'] = $this->encryptCrc32($v_content); + + // ----- Compress the file + $v_content_compressed = gzdeflate($v_content); + } + + // ----- Set header parameters + $p_header['compressed_size'] = strlen($v_content_compressed); + $p_header['compression'] = 8; + + // ----- Call the header generation + if (($v_result = $this->_writeFileHeader($p_header)) != 1) { + @fclose($v_file); + return $v_result; + } + + // ----- Write the compressed content + $v_binary_data = pack('a'.$p_header['compressed_size'], $v_content_compressed); + @fwrite($this->_zip_fd, $v_binary_data, $p_header['compressed_size']); + + // ----- Close the file + @fclose($v_file); + } + + // ----- Look for a directory + else + { + // ----- Set the file properties + $p_header['filename'] .= '/'; + $p_header['filename_len']++; + $p_header['size'] = 0; + $p_header['external'] = 0x41FF0010; // Value for a folder : to be checked + + // ----- Call the header generation + if (($v_result = $this->_writeFileHeader($p_header)) != 1) + { + return $v_result; + } + } + } + + // ----- Look for pre-add callback + if ( (isset($p_params[ARCHIVE_ZIP_PARAM_POST_ADD])) + && ($p_params[ARCHIVE_ZIP_PARAM_POST_ADD] != '')) { + + // ----- Generate a local information + $v_local_header = array(); + $this->_convertHeader2FileInfo($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_params[ARCHIVE_ZIP_PARAM_POST_ADD].'(ARCHIVE_ZIP_PARAM_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 : _writeFileHeader() + // Description : + // Parameters : + // Return Values : + // --------------------------------------------------------------------------- + /** + * Archive_Zip::_writeFileHeader() + * + * { Description } + * + */ + function _writeFileHeader(&$p_header) + { + $v_result=1; + + // TBC + //for(reset($p_header); $key = key($p_header); next($p_header)) { + //} + + // ----- 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'], $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 : _writeCentralFileHeader() + // Description : + // Parameters : + // Return Values : + // --------------------------------------------------------------------------- + /** + * Archive_Zip::_writeCentralFileHeader() + * + * { Description } + * + */ + function _writeCentralFileHeader(&$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 : _writeCentralHeader() + // Description : + // Parameters : + // Return Values : + // --------------------------------------------------------------------------- + /** + * Archive_Zip::_writeCentralHeader() + * + * { Description } + * + */ + function _writeCentralHeader($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 : _list() + // Description : + // Parameters : + // Return Values : + // --------------------------------------------------------------------------- + /** + * Archive_Zip::_list() + * + * { Description } + * + */ + function _list(&$p_list) + { + $v_result=1; + + // ----- Open the zip file + if (($this->_zip_fd = @fopen($this->_zipname, 'rb')) == 0) + { + // ----- Error log + $this->_errorLog(ARCHIVE_ZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->_zipname.'\' in binary read mode'); + + // ----- Return + return Archive_Zip::errorCode(); + } + + // ----- Read the central directory informations + $v_central_dir = array(); + if (($v_result = $this->_readEndCentralDir($v_central_dir)) != 1) + { + return $v_result; + } + + // ----- Go to beginning of Central Dir + @rewind($this->_zip_fd); + if (@fseek($this->_zip_fd, $v_central_dir['offset'])) + { + // ----- Error log + $this->_errorLog(ARCHIVE_ZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); + + // ----- Return + return Archive_Zip::errorCode(); + } + + // ----- Read each entry + for ($i=0; $i<$v_central_dir['entries']; $i++) + { + // ----- Read the file header + if (($v_result = $this->_readCentralFileHeader($v_header)) != 1) + { + return $v_result; + } + $v_header['index'] = $i; + + // ----- Get the only interesting attributes + $this->_convertHeader2FileInfo($v_header, $p_list[$i]); + unset($v_header); + } + + // ----- Close the zip file + $this->_closeFd(); + + // ----- Return + return $v_result; + } + // --------------------------------------------------------------------------- + + // --------------------------------------------------------------------------- + // Function : _convertHeader2FileInfo() + // 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. + // Parameters : + // Return Values : + // --------------------------------------------------------------------------- + /** + * Archive_Zip::_convertHeader2FileInfo() + * + * { Description } + * + */ + function _convertHeader2FileInfo($p_header, &$p_info) + { + $v_result=1; + + // ----- Get the interesting attributes + $p_info['filename'] = $p_header['filename']; + $p_info['stored_filename'] = $p_header['stored_filename']; + $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']; + + // ----- Return + return $v_result; + } + // --------------------------------------------------------------------------- + + // --------------------------------------------------------------------------- + // Function : _extractByRule() + // 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) + // --------------------------------------------------------------------------- + /** + * Archive_Zip::_extractByRule() + * + * { Description } + * + */ + function _extractByRule(&$p_file_list, &$p_params) + { + $v_result=1; + + $p_path = $p_params['add_path']; + $p_remove_path = $p_params['remove_path']; + $p_remove_all_path = $p_params['remove_all_path']; + + // ----- 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->_openFd('rb')) != 1) + { + return $v_result; + } + + // ----- Read the central directory informations + $v_central_dir = array(); + if (($v_result = $this->_readEndCentralDir($v_central_dir)) != 1) + { + // ----- Close the zip file + $this->_closeFd(); + + 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)) { + $this->_closeFd(); + + $this->_errorLog(ARCHIVE_ZIP_ERR_INVALID_ARCHIVE_ZIP, + 'Invalid archive size'); + + return Archive_Zip::errorCode(); + } + + // ----- Read the file header + $v_header = array(); + if (($v_result = $this->_readCentralFileHeader($v_header)) != 1) { + $this->_closeFd(); + + 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_params[ARCHIVE_ZIP_PARAM_BY_NAME])) + && ($p_params[ARCHIVE_ZIP_PARAM_BY_NAME] != 0)) { + + // ----- Look if the filename is in the list + for ($j=0; + ($j strlen($p_params[ARCHIVE_ZIP_PARAM_BY_NAME][$j])) + && (substr($v_header['stored_filename'], 0, strlen($p_params[ARCHIVE_ZIP_PARAM_BY_NAME][$j])) == $p_params[ARCHIVE_ZIP_PARAM_BY_NAME][$j])) { + $v_extract = true; + } + } + // ----- Look for a filename + elseif ($v_header['stored_filename'] == $p_params[ARCHIVE_ZIP_PARAM_BY_NAME][$j]) { + $v_extract = true; + } + } + } + + // ----- Look for extract by ereg rule + else if ( (isset($p_params[ARCHIVE_ZIP_PARAM_BY_EREG])) + && ($p_params[ARCHIVE_ZIP_PARAM_BY_EREG] != "")) { + + if (ereg($p_params[ARCHIVE_ZIP_PARAM_BY_EREG], $v_header['stored_filename'])) { + $v_extract = true; + } + } + + // ----- Look for extract by preg rule + else if ( (isset($p_params[ARCHIVE_ZIP_PARAM_BY_PREG])) + && ($p_params[ARCHIVE_ZIP_PARAM_BY_PREG] != "")) { + + if (preg_match($p_params[ARCHIVE_ZIP_PARAM_BY_PREG], $v_header['stored_filename'])) { + $v_extract = true; + } + } + + // ----- Look for extract by index rule + else if ( (isset($p_params[ARCHIVE_ZIP_PARAM_BY_INDEX])) + && ($p_params[ARCHIVE_ZIP_PARAM_BY_INDEX] != 0)) { + + // ----- Look if the index is in the list + for ($j=$j_start; ($j=$p_params[ARCHIVE_ZIP_PARAM_BY_INDEX][$j]['start']) && ($i<=$p_params[ARCHIVE_ZIP_PARAM_BY_INDEX][$j]['end'])) { + $v_extract = true; + } + if ($i>=$p_params[ARCHIVE_ZIP_PARAM_BY_INDEX][$j]['end']) { + $j_start = $j+1; + } + + if ($p_params[ARCHIVE_ZIP_PARAM_BY_INDEX][$j]['start']>$i) { + break; + } + } + } + + // ----- Look for no rule, which means extract all the archive + else { + $v_extract = true; + } + + + // ----- 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->_closeFd(); + + // ----- Error log + $this->_errorLog(ARCHIVE_ZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); + + // ----- Return + return Archive_Zip::errorCode(); + } + + // ----- Look for extraction as string + if ($p_params[ARCHIVE_ZIP_PARAM_EXTRACT_AS_STRING]) { + + // ----- Extracting the file + if (($v_result = $this->_extractFileAsString($v_header, $v_string)) != 1) + { + // ----- Close the zip file + $this->_closeFd(); + + return $v_result; + } + + // ----- Get the only interesting attributes + if (($v_result = $this->_convertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted])) != 1) + { + // ----- Close the zip file + $this->_closeFd(); + + return $v_result; + } + + // ----- Set the file content + $p_file_list[$v_nb_extracted]['content'] = $v_string; + + // ----- Next extracted file + $v_nb_extracted++; + } + else { + // ----- Extracting the file + if (($v_result = $this->_extractFile($v_header, $p_path, $p_remove_path, $p_remove_all_path, $p_params)) != 1) + { + // ----- Close the zip file + $this->_closeFd(); + + return $v_result; + } + + // ----- Get the only interesting attributes + if (($v_result = $this->_convertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++])) != 1) + { + // ----- Close the zip file + $this->_closeFd(); + + return $v_result; + } + } + } + } + + // ----- Close the zip file + $this->_closeFd(); + + // ----- Return + return $v_result; + } + // --------------------------------------------------------------------------- + + // --------------------------------------------------------------------------- + // Function : _extractFile() + // Description : + // Parameters : + // Return Values : + // --------------------------------------------------------------------------- + /** + * Archive_Zip::_extractFile() + * + * { Description } + * + */ + function _extractFile(&$p_entry, $p_path, $p_remove_path, $p_remove_all_path, &$p_params) + { + $v_result=1; + + // ----- Read the file header + if (($v_result = $this->_readFileHeader($v_header)) != 1) + { + // ----- Return + return $v_result; + } + + + // ----- Check that the file header is coherent with $p_entry info + // TBC + + // ----- Look for all path to remove + if ($p_remove_all_path == true) { + // ----- Get the basename of the path + $p_entry['filename'] = basename($p_entry['filename']); + } + + // ----- Look for path to remove + else if ($p_remove_path != "") + { + //if (strcmp($p_remove_path, $p_entry['filename'])==0) + if ($this->_tool_PathInclusion($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']; + } + + // ----- Look for pre-extract callback + if ( (isset($p_params[ARCHIVE_ZIP_PARAM_PRE_EXTRACT])) + && ($p_params[ARCHIVE_ZIP_PARAM_PRE_EXTRACT] != '')) { + + // ----- Generate a local information + $v_local_header = array(); + $this->_convertHeader2FileInfo($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_params[ARCHIVE_ZIP_PARAM_PRE_EXTRACT].'(ARCHIVE_ZIP_PARAM_PRE_EXTRACT, $v_local_header);'); + if ($v_result == 0) { + // ----- Change the file status + $p_entry['status'] = "skipped"; + $v_result = 1; + } + + // ----- 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') { + + // ----- 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"; + + // ----- Return + //return $v_result; + } + // ----- Look if file is write protected + else if (!is_writeable($p_entry['filename'])) + { + + // ----- Change the file status + $p_entry['status'] = "write_protected"; + + // ----- Return + //return $v_result; + } + + // ----- Look if the extracted file is older + else if (filemtime($p_entry['filename']) > $p_entry['mtime']) + { + + // ----- Change the file status + $p_entry['status'] = "newer_exist"; + + // ----- Return + //return $v_result; + } + } + + // ----- 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->_dirCheck($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['compressed_size'] == $p_entry['size']) + { + + // ----- 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 ARCHIVE_ZIP_READ_BLOCK_SIZE octets blocks + $v_size = $p_entry['compressed_size']; + while ($v_size != 0) + { + $v_read_size = ($v_size < ARCHIVE_ZIP_READ_BLOCK_SIZE ? $v_size : ARCHIVE_ZIP_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_binary_data, $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 + { + // ----- Trace + + // ----- 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; + } + + + // ----- 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); + + // ----- 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_params[ARCHIVE_ZIP_PARAM_SET_CHMOD])) + && ($p_params[ARCHIVE_ZIP_PARAM_SET_CHMOD] != 0)) { + + // ----- Change the mode of the file + chmod($p_entry['filename'], $p_params[ARCHIVE_ZIP_PARAM_SET_CHMOD]); + } + + } + } + + // ----- Look for post-extract callback + if ( (isset($p_params[ARCHIVE_ZIP_PARAM_POST_EXTRACT])) + && ($p_params[ARCHIVE_ZIP_PARAM_POST_EXTRACT] != '')) { + + // ----- Generate a local information + $v_local_header = array(); + $this->_convertHeader2FileInfo($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_params[ARCHIVE_ZIP_PARAM_POST_EXTRACT].'(ARCHIVE_ZIP_PARAM_POST_EXTRACT, $v_local_header);'); + } + + // ----- Return + return $v_result; + } + // --------------------------------------------------------------------------- + + // --------------------------------------------------------------------------- + // Function : _extractFileAsString() + // Description : + // Parameters : + // Return Values : + // --------------------------------------------------------------------------- + /** + * Archive_Zip::_extractFileAsString() + * + * { Description } + * + */ + function _extractFileAsString(&$p_entry, &$p_string) + { + $v_result=1; + + // ----- Read the file header + $v_header = array(); + if (($v_result = $this->_readFileHeader($v_header)) != 1) + { + // ----- Return + return $v_result; + } + + + // ----- Check that the file header is coherent with $p_entry info + // TBC + + // ----- Trace + + // ----- 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']) + { + // ----- Trace + + // ----- Reading the file + $p_string = fread($this->_zip_fd, $p_entry['compressed_size']); + } + else + { + // ----- Trace + + // ----- Reading the file + $v_data = fread($this->_zip_fd, $p_entry['compressed_size']); + + // ----- Decompress the file + $p_string = gzinflate($v_data); + } + + // ----- Trace + } + else { + // TBC : error : can not extract a folder in a string + } + + // ----- Return + return $v_result; + } + // --------------------------------------------------------------------------- + + // --------------------------------------------------------------------------- + // Function : _readFileHeader() + // Description : + // Parameters : + // Return Values : + // --------------------------------------------------------------------------- + /** + * Archive_Zip::_readFileHeader() + * + * { Description } + * + */ + function _readFileHeader(&$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 + $this->_errorLog(ARCHIVE_ZIP_ERR_BAD_FORMAT, 'Invalid archive structure'); + + // ----- Return + return Archive_Zip::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 + $this->_errorLog(ARCHIVE_ZIP_ERR_BAD_FORMAT, "Invalid block size : ".strlen($v_binary_data)); + + // ----- Return + return Archive_Zip::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['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']; + + // ----- 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(); + } + + // ----- Other informations + + // 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 : _readCentralFileHeader() + // Description : + // Parameters : + // Return Values : + // --------------------------------------------------------------------------- + /** + * Archive_Zip::_readCentralFileHeader() + * + * { Description } + * + */ + function _readCentralFileHeader(&$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 + $this->_errorLog(ARCHIVE_ZIP_ERR_BAD_FORMAT, 'Invalid archive structure'); + + // ----- Return + return Archive_Zip::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 + $this->_errorLog(ARCHIVE_ZIP_ERR_BAD_FORMAT, "Invalid block size : ".strlen($v_binary_data)); + + // ----- Return + return Archive_Zip::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']) + { + // ----- 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; + } + + + // ----- Return + return $v_result; + } + // --------------------------------------------------------------------------- + + // --------------------------------------------------------------------------- + // Function : _readEndCentralDir() + // Description : + // Parameters : + // Return Values : + // --------------------------------------------------------------------------- + /** + * Archive_Zip::_readEndCentralDir() + * + * { Description } + * + */ + function _readEndCentralDir(&$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) { + $this->_errorLog(ARCHIVE_ZIP_ERR_BAD_FORMAT, + 'Unable to go to the end of the archive \'' + .$this->_zipname.'\''); + return Archive_Zip::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)) { + $this->_errorLog(ARCHIVE_ZIP_ERR_BAD_FORMAT, + 'Unable to seek back to the middle of the archive \'' + .$this->_zipname.'\''); + return Archive_Zip::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)) { + $this->_errorLog(ARCHIVE_ZIP_ERR_BAD_FORMAT, + 'Unable to seek back to the middle of the archive \'' + .$this->_zipname.'\''); + return Archive_Zip::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); + + // ----- 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) { + $this->_errorLog(ARCHIVE_ZIP_ERR_BAD_FORMAT, + "Unable to find End of Central Dir Record signature"); + return Archive_Zip::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) { + $this->_errorLog(ARCHIVE_ZIP_ERR_BAD_FORMAT, + "Invalid End of Central Dir Record size : " + .strlen($v_binary_data)); + return Archive_Zip::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) { + $this->_errorLog(ARCHIVE_ZIP_ERR_BAD_FORMAT, + "Fail to find the right signature"); + return Archive_Zip::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']; + + // ----- Return + return $v_result; + } + // --------------------------------------------------------------------------- + + // --------------------------------------------------------------------------- + // Function : _deleteByRule() + // Description : + // Parameters : + // Return Values : + // --------------------------------------------------------------------------- + /** + * Archive_Zip::_deleteByRule() + * + * { Description } + * + */ + function _deleteByRule(&$p_result_list, &$p_params) + { + $v_result=1; + $v_list_detail = array(); + + // ----- Open the zip file + if (($v_result=$this->_openFd('rb')) != 1) + { + // ----- Return + return $v_result; + } + + // ----- Read the central directory informations + $v_central_dir = array(); + if (($v_result = $this->_readEndCentralDir($v_central_dir)) != 1) + { + $this->_closeFd(); + 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)) { + // ----- Clean + $this->_closeFd(); + + $this->_errorLog(ARCHIVE_ZIP_ERR_INVALID_ARCHIVE_ZIP, + 'Invalid archive size'); + return Archive_Zip::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(); + $v_result + = $this->_readCentralFileHeader($v_header_list[$v_nb_extracted]); + if ($v_result != 1) { + // ----- Clean + $this->_closeFd(); + + 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_params[ARCHIVE_ZIP_PARAM_BY_NAME])) + && ($p_params[ARCHIVE_ZIP_PARAM_BY_NAME] != 0)) { + + // ----- Look if the filename is in the list + for ($j=0; + ($j strlen($p_params[ARCHIVE_ZIP_PARAM_BY_NAME][$j])) + && (substr($v_header_list[$v_nb_extracted]['stored_filename'], 0, strlen($p_params[ARCHIVE_ZIP_PARAM_BY_NAME][$j])) == $p_params[ARCHIVE_ZIP_PARAM_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_params[ARCHIVE_ZIP_PARAM_BY_NAME][$j])) { + $v_found = true; + } + } + // ----- Look for a filename + elseif ($v_header_list[$v_nb_extracted]['stored_filename'] + == $p_params[ARCHIVE_ZIP_PARAM_BY_NAME][$j]) { + $v_found = true; + } + } + } + + // ----- Look for extract by ereg rule + else if ( (isset($p_params[ARCHIVE_ZIP_PARAM_BY_EREG])) + && ($p_params[ARCHIVE_ZIP_PARAM_BY_EREG] != "")) { + + if (ereg($p_params[ARCHIVE_ZIP_PARAM_BY_EREG], + $v_header_list[$v_nb_extracted]['stored_filename'])) { + $v_found = true; + } + } + + // ----- Look for extract by preg rule + else if ( (isset($p_params[ARCHIVE_ZIP_PARAM_BY_PREG])) + && ($p_params[ARCHIVE_ZIP_PARAM_BY_PREG] != "")) { + + if (preg_match($p_params[ARCHIVE_ZIP_PARAM_BY_PREG], + $v_header_list[$v_nb_extracted]['stored_filename'])) { + $v_found = true; + } + } + + // ----- Look for extract by index rule + else if ( (isset($p_params[ARCHIVE_ZIP_PARAM_BY_INDEX])) + && ($p_params[ARCHIVE_ZIP_PARAM_BY_INDEX] != 0)) { + + // ----- Look if the index is in the list + for ($j=$j_start; + ($j=$p_params[ARCHIVE_ZIP_PARAM_BY_INDEX][$j]['start']) + && ($i<=$p_params[ARCHIVE_ZIP_PARAM_BY_INDEX][$j]['end'])) { + $v_found = true; + } + if ($i>=$p_params[ARCHIVE_ZIP_PARAM_BY_INDEX][$j]['end']) { + $j_start = $j+1; + } + + if ($p_params[ARCHIVE_ZIP_PARAM_BY_INDEX][$j]['start']>$i) { + break; + } + } + } + + // ----- 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 = ARCHIVE_ZIP_TEMPORARY_DIR.uniqid('archive_zip-') + .'.tmp'; + + // ----- Creates a temporary zip archive + $v_temp_zip = new Archive_Zip($v_zip_temp_name); + + // ----- Open the temporary zip file in write mode + if (($v_result = $v_temp_zip->_openFd('wb')) != 1) { + $this->_closeFd(); + + // ----- Return + return $v_result; + } + + // ----- Look which file need to be kept + for ($i=0; $i_zip_fd); + if (@fseek($this->_zip_fd, $v_header_list[$i]['offset'])) { + // ----- Clean + $this->_closeFd(); + $v_temp_zip->_closeFd(); + @unlink($v_zip_temp_name); + + $this->_errorLog(ARCHIVE_ZIP_ERR_INVALID_ARCHIVE_ZIP, + 'Invalid archive size'); + return Archive_Zip::errorCode(); + } + + // ----- Read the file header + if (($v_result = $this->_readFileHeader($v_header_list[$i])) != 1) { + // ----- Clean + $this->_closeFd(); + $v_temp_zip->_closeFd(); + @unlink($v_zip_temp_name); + + return $v_result; + } + + // ----- Write the file header + $v_result = $v_temp_zip->_writeFileHeader($v_header_list[$i]); + if ($v_result != 1) { + // ----- Clean + $this->_closeFd(); + $v_temp_zip->_closeFd(); + @unlink($v_zip_temp_name); + + return $v_result; + } + + // ----- Read/write the data block + $v_result = $this->_tool_CopyBlock($this->_zip_fd, + $v_temp_zip->_zip_fd, + $v_header_list[$i]['compressed_size']); + if ($v_result != 1) { + // ----- Clean + $this->_closeFd(); + $v_temp_zip->_closeFd(); + @unlink($v_zip_temp_name); + + 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; $i_writeCentralFileHeader($v_header_list[$i]); + if ($v_result != 1) { + // ----- Clean + $v_temp_zip->_closeFd(); + $this->_closeFd(); + @unlink($v_zip_temp_name); + + return $v_result; + } + + // ----- Transform the header to a 'usable' info + $v_temp_zip->_convertHeader2FileInfo($v_header_list[$i], + $p_result_list[$i]); + } + + + // ----- Zip file comment + $v_comment = ''; + + // ----- Calculate the size of the central header + $v_size = @ftell($v_temp_zip->_zip_fd)-$v_offset; + + // ----- Create the central dir footer + $v_result = $v_temp_zip->_writeCentralHeader(sizeof($v_header_list), + $v_size, $v_offset, + $v_comment); + if ($v_result != 1) { + // ----- Clean + unset($v_header_list); + $v_temp_zip->_closeFd(); + $this->_closeFd(); + @unlink($v_zip_temp_name); + + return $v_result; + } + + // ----- Close + $v_temp_zip->_closeFd(); + $this->_closeFd(); + + // ----- 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); + $this->_tool_Rename($v_zip_temp_name, $this->_zipname); + + // ----- Destroy the temporary archive + unset($v_temp_zip); + } + + // ----- Return + return $v_result; + } + // --------------------------------------------------------------------------- + + // --------------------------------------------------------------------------- + // Function : _dirCheck() + // 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 + // --------------------------------------------------------------------------- + /** + * Archive_Zip::_dirCheck() + * + * { Description } + * + * @param [type] $p_is_dir + */ + function _dirCheck($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->_dirCheck($p_parent_dir)) != 1) { + return $v_result; + } + } + } + + // ----- Create the directory + if (!@mkdir($p_dir, 0777)) { + $this->_errorLog(ARCHIVE_ZIP_ERR_DIR_CREATE_FAIL, + "Unable to create directory '$p_dir'"); + return Archive_Zip::errorCode(); + } + + // ----- Return + return $v_result; + } + // --------------------------------------------------------------------------- + + // --------------------------------------------------------------------------- + // Function : _merge() + // Description : + // If $p_archive_to_add does not exist, the function exit with a success result. + // Parameters : + // Return Values : + // --------------------------------------------------------------------------- + /** + * Archive_Zip::_merge() + * + * { Description } + * + */ + function _merge(&$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 + return 1; + } + + // ----- Look if the archive exists + if (!is_file($this->_zipname)) { + // ----- Do a duplicate + $v_result = $this->_duplicate($p_archive_to_add->_zipname); + + return $v_result; + } + + // ----- Open the zip file + if (($v_result=$this->_openFd('rb')) != 1) { + return $v_result; + } + + // ----- Read the central directory informations + $v_central_dir = array(); + if (($v_result = $this->_readEndCentralDir($v_central_dir)) != 1) { + $this->_closeFd(); + 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->_openFd('rb')) != 1) { + $this->_closeFd(); + return $v_result; + } + + // ----- Read the central directory informations + $v_central_dir_to_add = array(); + $v_result = $p_archive_to_add->_readEndCentralDir($v_central_dir_to_add); + if ($v_result != 1) { + $this->_closeFd(); + $p_archive_to_add->_closeFd(); + return $v_result; + } + + // ----- Go to beginning of File + @rewind($p_archive_to_add->_zip_fd); + + // ----- Creates a temporay file + $v_zip_temp_name = ARCHIVE_ZIP_TEMPORARY_DIR.uniqid('archive_zip-').'.tmp'; + + // ----- Open the temporary file in write mode + if (($v_zip_temp_fd = @fopen($v_zip_temp_name, 'wb')) == 0) { + $this->_closeFd(); + $p_archive_to_add->_closeFd(); + $this->_errorLog(ARCHIVE_ZIP_ERR_READ_OPEN_FAIL, + 'Unable to open temporary file \'' + .$v_zip_temp_name.'\' in binary write mode'); + return Archive_Zip::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 < ARCHIVE_ZIP_READ_BLOCK_SIZE + ? $v_size : ARCHIVE_ZIP_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 < ARCHIVE_ZIP_READ_BLOCK_SIZE + ? $v_size : ARCHIVE_ZIP_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 < ARCHIVE_ZIP_READ_BLOCK_SIZE + ? $v_size : ARCHIVE_ZIP_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 < ARCHIVE_ZIP_READ_BLOCK_SIZE + ? $v_size : ARCHIVE_ZIP_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; + } + + // ----- Zip file comment + // TBC : I should merge the two comments + $v_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->_writeCentralHeader($v_central_dir['entries'] + +$v_central_dir_to_add['entries'], + $v_size, $v_offset, + $v_comment)) != 1) { + $this->_closeFd(); + $p_archive_to_add->_closeFd(); + @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->_closeFd(); + $p_archive_to_add->_closeFd(); + + // ----- 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); + $this->_tool_Rename($v_zip_temp_name, $this->_zipname); + + // ----- Return + return $v_result; + } + // --------------------------------------------------------------------------- + + // --------------------------------------------------------------------------- + // Function : _duplicate() + // Description : + // Parameters : + // Return Values : + // --------------------------------------------------------------------------- + /** + * Archive_Zip::_duplicate() + * + * { Description } + * + */ + function _duplicate($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->_openFd('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->_closeFd(); + $this->_errorLog(ARCHIVE_ZIP_ERR_READ_OPEN_FAIL, + 'Unable to open archive file \'' + .$p_archive_filename.'\' in binary write mode'); + return Archive_Zip::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 < ARCHIVE_ZIP_READ_BLOCK_SIZE + ? $v_size : ARCHIVE_ZIP_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->_closeFd(); + + // ----- Close the temporary file + @fclose($v_zip_temp_fd); + + return $v_result; + } + // --------------------------------------------------------------------------- + + /** + * Archive_Zip::_check_parameters() + * + * { Description } + * + * @param integer $p_error_code + * @param string $p_error_string + */ + function _check_parameters(&$p_params, $p_default) + { + + // ----- Check that param is an array + if (!is_array($p_params)) { + $this->_errorLog(ARCHIVE_ZIP_ERR_INVALID_PARAMETER, + 'Unsupported parameter, waiting for an array'); + return Archive_Zip::errorCode(); + } + + // ----- Check that all the params are valid + for (reset($p_params); list($v_key, $v_value) = each($p_params); ) { + if (!isset($p_default[$v_key])) { + $this->_errorLog(ARCHIVE_ZIP_ERR_INVALID_PARAMETER, + 'Unsupported parameter with key \''.$v_key.'\''); + + return Archive_Zip::errorCode(); + } + } + + // ----- Set the default values + for (reset($p_default); list($v_key, $v_value) = each($p_default); ) { + if (!isset($p_params[$v_key])) { + $p_params[$v_key] = $p_default[$v_key]; + } + } + + // ----- Check specific parameters + $v_callback_list = array ('callback_pre_add','callback_post_add', + 'callback_pre_extract','callback_post_extract'); + for ($i=0; $i_errorLog(ARCHIVE_ZIP_ERR_INVALID_PARAM_VALUE, + "Callback '".$p_params[$v_key] + ."()' is not an existing function for " + ."parameter '".$v_key."'"); + return Archive_Zip::errorCode(); + } + } + } + + return(1); + } + // --------------------------------------------------------------------------- + + // --------------------------------------------------------------------------- + // Function : _errorLog() + // Description : + // Parameters : + // --------------------------------------------------------------------------- + /** + * Archive_Zip::_errorLog() + * + * { Description } + * + * @param integer $p_error_code + * @param string $p_error_string + */ + function _errorLog($p_error_code=0, $p_error_string='') + { + $this->_error_code = $p_error_code; + $this->_error_string = $p_error_string; + } + // --------------------------------------------------------------------------- + + // --------------------------------------------------------------------------- + // Function : _errorReset() + // Description : + // Parameters : + // --------------------------------------------------------------------------- + /** + * Archive_Zip::_errorReset() + * + * { Description } + * + */ + function _errorReset() + { + $this->_error_code = 1; + $this->_error_string = ''; + } + // --------------------------------------------------------------------------- + + // --------------------------------------------------------------------------- + // Function : $this->_tool_PathReduction() + // Description : + // Parameters : + // Return Values : + // --------------------------------------------------------------------------- + /** + * _tool_PathReduction() + * + * { Description } + * + */ + function _tool_PathReduction($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 + 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] == "..") + { + // ----- Ignore it and ignore the $i-1 + $i--; + } + else if (($v_list[$i] == "") && ($i!=(sizeof($v_list)-1)) && ($i!=0)) + { + // ----- Ignore only the double '//' in path, + // but not the first and last '/' + } + else + { + $v_result = $v_list[$i].($i!=(sizeof($v_list)-1)?"/".$v_result:""); + } + } + } + + // ----- Return + return $v_result; + } + // --------------------------------------------------------------------------- + + // --------------------------------------------------------------------------- + // Function : $this->_tool_PathInclusion() + // 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 + // --------------------------------------------------------------------------- + /** + * _tool_PathInclusion() + * + * { Description } + * + */ + function _tool_PathInclusion($p_dir, $p_path) + { + $v_result = 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 : $this->_tool_CopyBlock() + // 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 : + // --------------------------------------------------------------------------- + /** + * _tool_CopyBlock() + * + * { Description } + * + * @param integer $p_mode + */ + function _tool_CopyBlock($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 < ARCHIVE_ZIP_READ_BLOCK_SIZE + ? $p_size : ARCHIVE_ZIP_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 < ARCHIVE_ZIP_READ_BLOCK_SIZE + ? $p_size : ARCHIVE_ZIP_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 < ARCHIVE_ZIP_READ_BLOCK_SIZE + ? $p_size : ARCHIVE_ZIP_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 < ARCHIVE_ZIP_READ_BLOCK_SIZE + ? $p_size : ARCHIVE_ZIP_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 : $this->_tool_Rename() + // 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. + // --------------------------------------------------------------------------- + /** + * _tool_Rename() + * + * { Description } + * + */ + function _tool_Rename($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 : $this->_tool_TranslateWinPath() + // 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. + // --------------------------------------------------------------------------- + /** + * _tool_TranslateWinPath() + * + * { Description } + * + * @param [type] $p_remove_disk_letter + */ + function _tool_TranslateWinPath($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; + } + // --------------------------------------------------------------------------- + + public function encryptCrc32($string) + { + if (!class_exists('G')) { + $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); + $docuroot = explode( '/', $realdocuroot ); + array_pop( $docuroot ); + $pathhome = implode( '/', $docuroot ) . '/'; + array_pop( $docuroot ); + $pathTrunk = implode( '/', $docuroot ) . '/'; + require_once($pathTrunk.'gulliver/system/class.g.php'); + } + return G::encryptCrc32($string); + } + + } + // End of class + +?> diff --git a/thirdparty/pear/Benchmark/Iterate.php b/thirdparty/pear/Benchmark/Iterate.php new file mode 100644 index 000000000..159b43416 --- /dev/null +++ b/thirdparty/pear/Benchmark/Iterate.php @@ -0,0 +1,167 @@ +. | +// +------------------------------------------------------------------------+ +// | This source file is subject to the New BSD license, That is bundled | +// | with this package in the file LICENSE, and is available through | +// | the world-wide-web at | +// | http://www.opensource.org/licenses/bsd-license.php | +// | If you did not receive a copy of the new BSDlicense and are unable | +// | to obtain it through the world-wide-web, please send a note to | +// | license@php.net so we can mail you a copy immediately. | +// +------------------------------------------------------------------------+ +// +// $Id: Iterate.php,v 1.1 2007/05/24 05:17:56 anant Exp $ +// + +require_once 'Benchmark/Timer.php'; + +/** + * Provides timing and profiling information. + * + * Example 1 + * + * + * '; + * } + * + * $benchmark->run(100, 'foo', 'test'); + * $result = $benchmark->get(); + * ?> + * + * + * Example 2 + * + * + * '; + * } + * } + * + * $benchmark->run(100, 'myclass::foo', 'test'); + * $result = $benchmark->get(); + * ?> + * + * + * Example 3 + * + * + * '; + * } + * } + * + * $o = new MyClass(); + * + * $benchmark->run(100, 'o->foo', 'test'); + * $result = $benchmark->get(); + * ?> + * + * + * @author Sebastian Bergmann + * @copyright Copyright © 2002-2005 Sebastian Bergmann + * @license http://www.php.net/license/3_0.txt The PHP License, Version 3.0 + * @category Benchmarking + * @package Benchmark + */ +class Benchmark_Iterate extends Benchmark_Timer { + /** + * Benchmarks a function or method. + * + * @access public + */ + function run() { + $arguments = func_get_args(); + $iterations = array_shift($arguments); + $function_name = array_shift($arguments); + + if (strstr($function_name, '::')) { + $function_name = explode('::', $function_name); + $objectmethod = $function_name[1]; + } + + if (strstr($function_name, '->')) { + $function_name = explode('->', $function_name); + $objectname = $function_name[0]; + + $object = $GLOBALS[$objectname]; + $objectmethod = $function_name[1]; + + for ($i = 1; $i <= $iterations; $i++) { + $this->setMarker('start_' . $i); + call_user_func_array(array($object, $function_name[1]), $arguments); + $this->setMarker('end_' . $i); + } + + return(0); + } + + for ($i = 1; $i <= $iterations; $i++) { + $this->setMarker('start_' . $i); + call_user_func_array($function_name, $arguments); + $this->setMarker('end_' . $i); + } + } + + /** + * Returns benchmark result. + * + * $result[x ] = execution time of iteration x + * $result['mean' ] = mean execution time + * $result['iterations'] = number of iterations + * + * @return array + * @access public + */ + function get($simple_output = false) { + $result = array(); + $total = 0; + + $iterations = count($this->markers)/2; + + for ($i = 1; $i <= $iterations; $i++) { + $time = $this->timeElapsed('start_'.$i , 'end_'.$i); + + if (extension_loaded('bcmath')) { + $total = bcadd($total, $time, 6); + } else { + $total = $total + $time; + } + + if (!$simple_output) { + $result[$i] = $time; + } + } + + if (extension_loaded('bcmath')) { + $result['mean'] = bcdiv($total, $iterations, 6); + } else { + $result['mean'] = $total / $iterations; + } + + $result['iterations'] = $iterations; + + return $result; + } +} diff --git a/thirdparty/pear/Benchmark/Profiler.php b/thirdparty/pear/Benchmark/Profiler.php new file mode 100644 index 000000000..a91b34477 --- /dev/null +++ b/thirdparty/pear/Benchmark/Profiler.php @@ -0,0 +1,447 @@ +. | +// +----------------------------------------------------------------------+ +// | This source file is subject to the New BSD license, That is bundled | +// | with this package in the file LICENSE, and is available through | +// | the world-wide-web at | +// | http://www.opensource.org/licenses/bsd-license.php | +// | If you did not receive a copy of the new BSDlicense and are unable | +// | to obtain it through the world-wide-web, please send a note to | +// | license@php.net so we can mail you a copy immediately. | +// +----------------------------------------------------------------------+ +// +// $Id: Profiler.php,v 1.2 2007/05/24 05:23:20 anant Exp $ +// + +require_once 'PEAR.php'; + +/** + * Provides timing and profiling information. + * + * Example 1: Automatic profiling start, stop, and output. + * + * + * enterSection('myFunction'); + * //do something + * $profiler->leaveSection('myFunction'); + * return; + * } + * + * //do something + * myFunction(); + * //do more + * ?> + * + * + * Example 2: Manual profiling start, stop, and output. + * + * + * enterSection('myFunction'); + * //do something + * $profiler->leaveSection('myFunction'); + * return; + * } + * + * $profiler->start(); + * //do something + * myFunction(); + * //do more + * $profiler->stop(); + * $profiler->display(); + * ?> + * + * + * @author Matthias Englert + * @copyright Copyright © 2002-2005 Matthias Englert + * @license http://www.php.net/license/3_0.txt The PHP License, Version 3.0 + * @category Benchmarking + * @package Benchmark + * @since 1.2.0 + */ +class Benchmark_Profiler extends PEAR { + /** + * Contains the total ex. time of each section + * + * @var array + * @access private + */ + var $_sections = array(); + + /** + * Calling stack + * + * @var array + * @access private + */ + var $_stack = array(); + + /** + * Notes how often a section was entered + * + * @var array + * @access private + */ + var $_numberOfCalls = array(); + + /** + * Notes for each section how much time is spend in sub-sections + * + * @var array + * @access private + */ + var $_subSectionsTime = array(); + + /** + * Notes for each section how often it calls which section + * + * @var array + * @access private + */ + var $_calls = array(); + + /** + * Notes for each section how often it was called by which section + * + * @var array + * @access private + */ + var $_callers = array(); + + /** + * Auto-starts and stops profiler + * + * @var boolean + * @access private + */ + var $_auto = FALSE; + + /** + * Max marker name length for non-html output + * + * @var integer + * @access private + */ + var $_maxStringLength = 0; + + /** + * Constructor, starts profiling recording + * + * @access public + */ + function Benchmark_Profiler($auto = FALSE) { + $this->_auto = $auto; + + if ($this->_auto) { + $this->start(); + } + + $this->PEAR(); + } + + /** + * Close method, stop profiling recording and display output. + * + * @access public + */ + function close() { + if (isset($this->_auto) && $this->_auto) { + $this->stop(); + $this->display(); + } + } + + /** + * Returns profiling informations for a given section. + * + * @param string $section + * @return array + * @access public + */ + function getSectionInformations($section = 'Global') { + if (isset($this->_sections[$section])) { + $calls = array(); + + if (isset($this->_calls[$section])) { + $calls = $this->_calls[$section]; + } + + $callers = array(); + + if (isset($this->_callers[$section])) { + $callers = $this->_callers[$section]; + } + + $informations = array(); + + $informations['time'] = $this->_sections[$section]; + if (isset($this->_sections['Global'])) { + $informations['percentage'] = number_format(100 * $this->_sections[$section] / $this->_sections['Global'], 2, '.', ''); + } else { + $informations['percentage'] = 'N/A'; + } + $informations['calls'] = $calls; + $informations['num_calls'] = $this->_numberOfCalls[$section]; + $informations['callers'] = $callers; + + if (isset($this->_subSectionsTime[$section])) { + $informations['netto_time'] = $this->_sections[$section] - $this->_subSectionsTime[$section]; + } else { + $informations['netto_time'] = $this->_sections[$section]; + } + + return $informations; + } else { + $this->raiseError("The section '$section' does not exists.\n", NULL, PEAR_ERROR_TRIGGER, E_USER_WARNING); + } + } + + /** + * Returns profiling informations for all sections. + * + * @return array + * @access public + */ + function getAllSectionsInformations() { + $informations = array(); + + foreach($this->_sections as $section => $time) { + $informations[$section] = $this->getSectionInformations($section); + } + + return $informations; + } + + /** + * Returns formatted profiling information. + * + * @param string output format (auto, plain or html), default auto + * @see display() + * @access private + */ + function _getOutput($format) { + + /* Quickly find out the maximun length: Ineffecient, but will do for now! */ + $informations = $this->getAllSectionsInformations(); + $names = array_keys($informations); + + $maxLength = 0; + foreach ($names as $name) + { + if ($maxLength < strlen($name)) { + $maxLength = strlen($name); + } + } + $this->_maxStringLength = $maxLength; + + if ($format == 'auto') { + if (function_exists('version_compare') && + version_compare(phpversion(), '4.1', 'ge')) { + $format = isset($_SERVER['SERVER_PROTOCOL']) ? 'html' : 'plain'; + } else { + global $HTTP_SERVER_VARS; + $format = isset($HTTP_SERVER_VARS['SERVER_PROTOCOL']) ? 'html' : 'plain'; + } + } + + if ($format == 'html') { + $out = ''."\n"; + $out .= + ''. + ''. + ''. + ''. + "\n"; + } else { + $dashes = $out = str_pad("\n", ($this->_maxStringLength + 75), '-', STR_PAD_LEFT); + $out .= str_pad('Section', $this->_maxStringLength + 10); + $out .= str_pad("Total Ex Time", 22); + $out .= str_pad("Netto Ex Time", 22); + $out .= str_pad("#Calls", 10); + $out .= "Percentage\n"; + $out .= $dashes; + } + + foreach($informations as $name => $values) { + $percentage = $values['percentage']; + $calls_str = ""; + + foreach($values['calls'] as $key => $val) { + if ($calls_str) { + $calls_str .= ", "; + } + + $calls_str .= "$key ($val)"; + } + + $callers_str = ""; + + foreach($values['callers'] as $key => $val) { + if ($callers_str) { + $callers_str .= ", "; + } + + $callers_str .= "$key ($val)"; + } + + if ($format == 'html') { + $out .= ""; + if (is_numeric($values['percentage'])) { + $out .= "\n"; + } else { + $out .= "\n"; + } + $out .= ""; + } else { + $out .= str_pad($name, $this->_maxStringLength + 10); + $out .= str_pad($values['time'], 22); + $out .= str_pad($values['netto_time'], 22); + $out .= str_pad($values['num_calls'], 10); + if (is_numeric($values['percentage'])) { + $out .= str_pad($values['percentage']."%\n", 8, ' ', STR_PAD_LEFT); + } else { + $out .= str_pad($values['percentage']."\n", 8, ' ', STR_PAD_LEFT); + } + } + } + + if ($format == 'html') { + return $out . '
     total ex. timenetto ex. time#calls%callscallers
    $name{$values['time']}{$values['netto_time']}{$values['num_calls']}{$values['percentage']}%{$values['percentage']}$calls_str$callers_str
    '; + } else { + return $out; + } + } + + /** + * Returns formatted profiling information. + * + * @param string output format (auto, plain or html), default auto + * @access public + */ + function display($format = 'auto') { + echo $this->_getOutput($format); + } + + /** + * Enters "Global" section. + * + * @see enterSection(), stop() + * @access public + */ + function start() { + $this->enterSection('Global'); + } + + /** + * Leaves "Global" section. + * + * @see leaveSection(), start() + * @access public + */ + function stop() { + $this->leaveSection('Global'); + } + + /** + * Enters code section. + * + * @param string name of the code section + * @see start(), leaveSection() + * @access public + */ + function enterSection($name) { + if (count($this->_stack)) { + if (isset($this->_callers[$name][$this->_stack[count($this->_stack) - 1]["name"]])) { + $this->_callers[$name][$this->_stack[count($this->_stack) - 1]["name"]]++; + } else { + $this->_callers[$name][$this->_stack[count($this->_stack) - 1]["name"]] = 1; + } + + if (isset($this->_calls[$this->_stack[count($this->_stack) - 1]["name"]][$name])) { + $this->_calls[$this->_stack[count($this->_stack) - 1]["name"]][$name]++; + } else { + $this->_calls[$this->_stack[count($this->_stack) - 1]["name"]][$name] = 1; + } + } else { + if ($name != 'Global') { + $this->raiseError("tried to enter section ".$name." but profiling was not started\n", NULL, PEAR_ERROR_DIE); + } + } + + if (isset($this->_numberOfCalls[$name])) { + $this->_numberOfCalls[$name]++; + } else { + $this->_numberOfCalls[$name] = 1; + } + + array_push($this->_stack, array("name" => $name, "time" => $this->_getMicrotime())); + } + + /** + * Leaves code section. + * + * @param string name of the marker to be set + * @see stop(), enterSection() + * @access public + */ + function leaveSection($name) { + $microtime = $this->_getMicrotime(); + + if (!count($this->_stack)) { + $this->raiseError("tried to leave section ".$name." but profiling was not started\n", NULL, PEAR_ERROR_DIE); + } + + $x = array_pop($this->_stack); + + if ($x["name"] != $name) { + $this->raiseError("reached end of section $name but expecting end of " . $x["name"]."\n", NULL, PEAR_ERROR_DIE); + } + + if (isset($this->_sections[$name])) { + $this->_sections[$name] += $microtime - $x["time"]; + } else { + $this->_sections[$name] = $microtime - $x["time"]; + } + + $parent = array_pop($this->_stack); + + if (isset($parent)) { + if (isset($this->_subSectionsTime[$parent['name']])) { + $this->_subSectionsTime[$parent['name']] += $microtime - $x['time']; + } else { + $this->_subSectionsTime[$parent['name']] = $microtime - $x['time']; + } + + array_push($this->_stack, $parent); + } + } + + /** + * Wrapper for microtime(). + * + * @return float + * @access private + * @since 1.3.0 + */ + function _getMicrotime() { + $microtime = explode(' ', microtime()); + return $microtime[1] . substr($microtime[0], 1); + } +} diff --git a/thirdparty/pear/Benchmark/Timer.php b/thirdparty/pear/Benchmark/Timer.php new file mode 100644 index 000000000..093f46129 --- /dev/null +++ b/thirdparty/pear/Benchmark/Timer.php @@ -0,0 +1,321 @@ +. | +// +------------------------------------------------------------------------+ +// | This source file is subject to the New BSD license, That is bundled | +// | with this package in the file LICENSE, and is available through | +// | the world-wide-web at | +// | http://www.opensource.org/licenses/bsd-license.php | +// | If you did not receive a copy of the new BSDlicense and are unable | +// | to obtain it through the world-wide-web, please send a note to | +// | license@php.net so we can mail you a copy immediately. | +// +------------------------------------------------------------------------+ +// +// $Id: Timer.php,v 1.2 2007/05/24 05:23:20 anant Exp $ +// + +require_once 'PEAR.php'; + +/** + * Provides timing and profiling information. + * + * Example 1: Automatic profiling start, stop, and output. + * + * + * setMarker('Marker 1'); + * ?> + * + * + * Example 2: Manual profiling start, stop, and output. + * + * + * start(); + * $timer->setMarker('Marker 1'); + * $timer->stop(); + * + * $timer->display(); // to output html formated + * // AND/OR : + * $profiling = $timer->getProfiling(); // get the profiler info as an associative array + * ?> + * + * + * @author Sebastian Bergmann + * @author Ludovico Magnocavallo + * @copyright Copyright © 2002-2005 Sebastian Bergmann + * @license http://www.php.net/license/3_0.txt The PHP License, Version 3.0 + * @category Benchmarking + * @package Benchmark + */ +class Benchmark_Timer extends PEAR { + /** + * Contains the markers. + * + * @var array + * @access private + */ + var $markers = array(); + + /** + * Auto-start and stop timer. + * + * @var boolean + * @access private + */ + var $auto = FALSE; + + /** + * Max marker name length for non-html output. + * + * @var integer + * @access private + */ + var $maxStringLength = 0; + + /** + * Constructor. + * + * @param boolean $auto + * @access public + */ + function Benchmark_Timer($auto = FALSE) { + $this->auto = $auto; + + if ($this->auto) { + $this->start(); + } + + $this->PEAR(); + } + + /** + * Close method. Stop timer and display output. + * + * @access public + */ + function close() { + if ($this->auto) { + $this->stop(); + $this->display(); + } + } + + /** + * Set "Start" marker. + * + * @see setMarker(), stop() + * @access public + */ + function start() { + $this->setMarker('Start'); + } + + /** + * Set "Stop" marker. + * + * @see setMarker(), start() + * @access public + */ + function stop() { + $this->setMarker('Stop'); + } + + /** + * Set marker. + * + * @param string $name Name of the marker to be set. + * @see start(), stop() + * @access public + */ + function setMarker($name) { + $this->markers[$name] = $this->_getMicrotime(); + } + + /** + * Returns the time elapsed betweens two markers. + * + * @param string $start start marker, defaults to "Start" + * @param string $end end marker, defaults to "Stop" + * @return double $time_elapsed time elapsed between $start and $end + * @access public + */ + function timeElapsed($start = 'Start', $end = 'Stop') { + if ($end == 'Stop' && !isset($this->markers['Stop'])) { + $this->markers['Stop'] = $this->_getMicrotime(); + } + $end = isset($this->markers[$end]) ? $this->markers[$end] : 0; + $start = isset($this->markers[$start]) ? $this->markers[$start] : 0; + + if (extension_loaded('bcmath')) { + return bcsub($end, $start, 6); + } else { + return $end - $start; + } + } + + /** + * Returns profiling information. + * + * $profiling[x]['name'] = name of marker x + * $profiling[x]['time'] = time index of marker x + * $profiling[x]['diff'] = execution time from marker x-1 to this marker x + * $profiling[x]['total'] = total execution time up to marker x + * + * @return array + * @access public + */ + function getProfiling() { + $i = $total = 0; + $result = array(); + $temp = reset($this->markers); + $this->maxStringLength = 0; + + foreach ($this->markers as $marker => $time) { + if (extension_loaded('bcmath')) { + $diff = bcsub($time, $temp, 6); + $total = bcadd($total, $diff, 6); + } else { + $diff = $time - $temp; + $total = $total + $diff; + } + + $result[$i]['name'] = $marker; + $result[$i]['time'] = $time; + $result[$i]['diff'] = $diff; + $result[$i]['total'] = $total; + + $this->maxStringLength = (strlen($marker) > $this->maxStringLength ? strlen($marker) + 1 : $this->maxStringLength); + + $temp = $time; + $i++; + } + + $result[0]['diff'] = '-'; + $result[0]['total'] = '-'; + $this->maxStringLength = (strlen('total') > $this->maxStringLength ? strlen('total') : $this->maxStringLength); + $this->maxStringLength += 2; + + return $result; + } + + /** + * Return formatted profiling information. + * + * @param boolean $showTotal Optionnaly includes total in output, default no + * @param string $format output format (auto, plain or html), default auto + * @return string + * @see getProfiling() + * @access public + */ + function getOutput($showTotal = FALSE, $format = 'auto') { + if ($format == 'auto') { + if (function_exists('version_compare') && + version_compare(phpversion(), '4.1', 'ge')) + { + $format = isset($_SERVER['SERVER_PROTOCOL']) ? 'html' : 'plain'; + } else { + global $HTTP_SERVER_VARS; + $format = isset($HTTP_SERVER_VARS['SERVER_PROTOCOL']) ? 'html' : 'plain'; + } + } + + $total = $this->TimeElapsed(); + $result = $this->getProfiling(); + $dashes = ''; + + if ($format == 'html') { + $out = ''."\n"; + $out .= ''. + ($showTotal ? + '' + : '')."\n"; + } else { + $dashes = $out = str_pad("\n", + $this->maxStringLength + ($showTotal ? 70 : 45), '-', STR_PAD_LEFT); + $out .= str_pad('marker', $this->maxStringLength) . + str_pad("time index", 22) . + str_pad("ex time", 16) . + str_pad("perct ", 8) . + ($showTotal ? ' '.str_pad("elapsed", 16)."perct" : '')."\n" . + $dashes; + } + + foreach ($result as $k => $v) { + $perc = (($v['diff'] * 100) / $total); + $tperc = (($v['total'] * 100) / $total); + + if ($format == 'html') { + $out .= "". + ($showTotal ? + "" : ''). + "\n"; + } else { + $out .= str_pad($v['name'], $this->maxStringLength, ' ') . + str_pad($v['time'], 22) . + str_pad($v['diff'], 14) . + str_pad(number_format($perc, 2, '.', '')."%",8, ' ', STR_PAD_LEFT) . + ($showTotal ? ' '. + str_pad($v['total'], 14) . + str_pad(number_format($tperc, 2, '.', '')."%", + 8, ' ', STR_PAD_LEFT) : ''). + "\n"; + } + + $out .= $dashes; + } + + if ($format == 'html') { + $out .= "".($showTotal ? "" : "")."\n"; + $out .= "
     time indexex time%elapsed%
    " . $v['name'] . + "" . $v['time'] . + "" . $v['diff'] . + "" . number_format($perc, 2, '.', '') . + "%" . $v['total'] . + "" . + number_format($tperc, 2, '.', '') . + "%
    total-${total}100.00%--
    \n"; + } else { + $out .= str_pad('total', $this->maxStringLength); + $out .= str_pad('-', 22); + $out .= str_pad($total, 15); + $out .= "100.00%\n"; + $out .= $dashes; + } + + return $out; + } + + /** + * Prints the information returned by getOutput(). + * + * @param boolean $showTotal Optionnaly includes total in output, default no + * @param string $format output format (auto, plain or html), default auto + * @see getOutput() + * @access public + */ + function display($showTotal = FALSE, $format = 'auto') { + print $this->getOutput($showTotal, $format); + } + + /** + * Wrapper for microtime(). + * + * @return float + * @access private + * @since 1.3.0 + */ + function _getMicrotime() { + $microtime = explode(' ', microtime()); + return $microtime[1] . substr($microtime[0], 1); + } +} diff --git a/thirdparty/pear/CMD.php b/thirdparty/pear/CMD.php new file mode 100644 index 000000000..f65de96c3 --- /dev/null +++ b/thirdparty/pear/CMD.php @@ -0,0 +1,285 @@ + | +// +----------------------------------------------------------------------+ +// +define('CMD_RCSID', '$Id: CMD.php,v 1.5 2002/12/31 16:18:22 sebastian Exp $'); + +/** + * The Cmd:: class implements an abstraction for various ways + * of executing commands (directly using the backtick operator, + * as a background task after the script has terminated using + * register_shutdown_function() or as a detached process using nohup). + * + * @author Anders Johannsen + * @version $Revision: 1.5 $ + **/ + +require_once 'PEAR.php'; + + +class Cmd extends PEAR +{ + var $arrSetting = array(); + var $arrConstant = array(); + var $arrCommand = array(); + + /** + * Class constructor + * + * Defines all necessary constants and sets defaults + * + * @author Anders Johannsen + * + * @access public + * + **/ + + function Cmd () + { + // Defining constants + $this->arrConstant = array ("CMD_SEQUENCE", + "CMD_SHUTDOWN", + "CMD_SHELL", + "CMD_OUTPUT", + "CMD_NOHUP", + "CMD_VERBOSE" + ); + + foreach ($this->arrConstant as $key => $value) { + if (!defined($value)) { + define($value, $key); + } + } + + // Setting default values + $this->arrSetting[CMD_SEQUENCE] = true; + $this->arrSetting[CMD_SHUTDOWN] = false; + $this->arrSetting[CMD_OUTPUT] = false; + $this->arrSetting[CMD_NOHUP] = false; + $this->arrSetting[CMD_VERBOSE] = false; + + $arrShell = array ("sh", "bash", "zsh", "tcsh", "csh", "ash", "sash", "esh", "ksh"); + + foreach ($arrShell as $shell) { + if ($this->arrSetting[CMD_SHELL] = $this->which($shell)) { + break; + } + } + + if (empty($this->arrSetting[CMD_SHELL])) { + $this->raiseError("No shell found"); + } + } + + /** + * Sets any option + * + * The options are currently: + * CMD_SHUTDOWN : Execute commands via a shutdown function + * CMD_SHELL : Path to shell + * CMD_OUTPUT : Output stdout from process + * CMD_NOHUP : Use nohup to detach process + * CMD_VERBOSE : Print errors to stdout + * + * @param $option is a constant, which corresponds to the + * option that should be changed + * + * @param $setting is the value of the option currently + * being toggled. + * + * @return bool true if succes, else false + * + * @access public + * + * @author Anders Johannsen + * + **/ + + function setOption ($option, $setting) + { + if (empty($this->arrConstant[$option])) { + $this->raiseError("No such option: $option"); + return false; + } + + + switch ($option) { + case CMD_OUTPUT: + case CMD_SHUTDOWN: + case CMD_VERBOSE: + case CMD_SEQUENCE: + $this->arrSetting[$option] = $setting; + return true; + break; + + case CMD_SHELL: + if (is_executable($setting)) { + $this->arrSetting[$option] = $setting; + return true; + } else { + $this->raiseError("No such shell: $setting"); + return false; + } + break; + + + case CMD_NOHUP: + if (empty($setting)) { + $this->arrSetting[$option] = false; + + } else if ($location = $this->which("nohup")) { + $this->arrSetting[$option] = true; + + } else { + $this->raiseError("Nohup was not found on your system"); + return false; + } + break; + + } + } + + /** + * Add command for execution + * + * @param $command accepts both arrays and regular strings + * + * @return bool true if succes, else false + * + * @access public + * + * @author Anders Johannsen + * + **/ + + function command($command) + { + if (is_array($command)) { + foreach ($command as $key => $value) { + $this->arrCommand[] = $value; + } + return true; + + } else if (is_string($command)) { + $this->arrCommand[] = $command; + return true; + } + + $this->raiseError("Argument not valid"); + return false; + } + + /** + * Executes the code according to given options + * + * @return bool true if succes, else false + * + * @access public + * + * @author Anders Johannsen + * + **/ + + function exec() + { + // Warning about impossible mix of options + if (!empty($this->arrSetting[CMD_OUTPUT])) { + if (!empty($this->arrSetting[CMD_SHUTDOWN]) || !empty($this->arrSetting[CMD_NOHUP])) { + $this->raiseError("Error: Commands executed via shutdown functions or nohup cannot return output"); + return false; + } + } + + // Building command + $strCommand = implode(";", $this->arrCommand); + + $strExec = "echo '$strCommand' | ".$this->arrSetting[CMD_SHELL]; + + if (empty($this->arrSetting[CMD_OUTPUT])) { + $strExec = $strExec . ' > /dev/null'; + } + + if (!empty($this->arrSetting[CMD_NOHUP])) { + $strExec = 'nohup ' . $strExec; + } + + // Executing + if (!empty($this->arrSetting[CMD_SHUTDOWN])) { + $line = "system(\"$strExec\");"; + $function = create_function('', $line); + register_shutdown_function($function); + return true; + } else { + return `$strExec`; + } + } + + /** + * Errorhandler. If option CMD_VERBOSE is true, + * the error is printed to stdout, otherwise it + * is avaliable in lastError + * + * @return bool always returns true + * + * @access private + * + * @author Anders Johannsen + **/ + + function raiseError($strError) + { + if (!empty($this->arrSetting[CMD_VERBOSE])) { + echo $strError; + } else { + $this->lastError = $strError; + } + + return true; + } + + /** + * Functionality similiar to unix 'which'. Searches the path + * for the specified program. + * + * @param $cmd name of the executable to search for + * + * @return string returns the full path if found, + * false if not + * + * @access private + * + * @author Anders Johannsen + **/ + + function which($cmd) + { + global $HTTP_ENV_VARS; + + $arrPath = explode(":", $HTTP_ENV_VARS['PATH']); + + foreach ($arrPath as $path) { + $location = $path . "/" . $cmd; + + if (is_executable($location)) { + return $location; + } + } + return false; + } +} + +?> diff --git a/thirdparty/pear/CODING_STANDARDS b/thirdparty/pear/CODING_STANDARDS new file mode 100644 index 000000000..5687c9a9d --- /dev/null +++ b/thirdparty/pear/CODING_STANDARDS @@ -0,0 +1,8 @@ +=========================================================================== +|| PEAR Coding Standards || +=========================================================================== + +$Id: CODING_STANDARDS,v 1.14 2002/01/24 15:02:05 cox Exp $ + +This document is no longer maintained, see +http://pear.php.net/manual/ instead. diff --git a/thirdparty/pear/Console/Getopt.php b/thirdparty/pear/Console/Getopt.php new file mode 100644 index 000000000..f6b281378 --- /dev/null +++ b/thirdparty/pear/Console/Getopt.php @@ -0,0 +1,251 @@ + | +// +----------------------------------------------------------------------+ +// +// $Id: Getopt.php 6820 2007-06-20 13:35:30Z kevin_fourie $ + +require_once 'PEAR.php'; + +/** + * Command-line options parsing class. + * + * @author Andrei Zmievski + * + */ +class Console_Getopt { + /** + * Parses the command-line options. + * + * The first parameter to this function should be the list of command-line + * arguments without the leading reference to the running program. + * + * The second parameter is a string of allowed short options. Each of the + * option letters can be followed by a colon ':' to specify that the option + * requires an argument, or a double colon '::' to specify that the option + * takes an optional argument. + * + * The third argument is an optional array of allowed long options. The + * leading '--' should not be included in the option name. Options that + * require an argument should be followed by '=', and options that take an + * option argument should be followed by '=='. + * + * The return value is an array of two elements: the list of parsed + * options and the list of non-option command-line arguments. Each entry in + * the list of parsed options is a pair of elements - the first one + * specifies the option, and the second one specifies the option argument, + * if there was one. + * + * Long and short options can be mixed. + * + * Most of the semantics of this function are based on GNU getopt_long(). + * + * @param array $args an array of command-line arguments + * @param string $short_options specifies the list of allowed short options + * @param array $long_options specifies the list of allowed long options + * + * @return array two-element array containing the list of parsed options and + * the non-option arguments + * + * @access public + * + */ + function getopt2($args, $short_options, $long_options = null) + { + return Console_Getopt::doGetopt(2, $args, $short_options, $long_options); + } + + /** + * This function expects $args to start with the script name (POSIX-style). + * Preserved for backwards compatibility. + * @see getopt2() + */ + function getopt($args, $short_options, $long_options = null) + { + return Console_Getopt::doGetopt(1, $args, $short_options, $long_options); + } + + /** + * The actual implementation of the argument parsing code. + */ + function doGetopt($version, $args, $short_options, $long_options = null) + { + // in case you pass directly readPHPArgv() as the first arg + if (PEAR::isError($args)) { + return $args; + } + if (empty($args)) { + return array(array(), array()); + } + $opts = array(); + $non_opts = array(); + + settype($args, 'array'); + + if ($long_options) { + sort($long_options); + } + + /* + * Preserve backwards compatibility with callers that relied on + * erroneous POSIX fix. + */ + if ($version < 2) { + if (isset($args[0]{0}) && $args[0]{0} != '-') { + array_shift($args); + } + } + + reset($args); + while (list($i, $arg) = each($args)) { + + /* The special element '--' means explicit end of + options. Treat the rest of the arguments as non-options + and end the loop. */ + if ($arg == '--') { + $non_opts = array_merge($non_opts, array_slice($args, $i + 1)); + break; + } + + if ($arg{0} != '-' || (strlen($arg) > 1 && $arg{1} == '-' && !$long_options)) { + $non_opts = array_merge($non_opts, array_slice($args, $i)); + break; + } elseif (strlen($arg) > 1 && $arg{1} == '-') { + $error = Console_Getopt::_parseLongOption(substr($arg, 2), $long_options, $opts, $args); + if (PEAR::isError($error)) + return $error; + } else { + $error = Console_Getopt::_parseShortOption(substr($arg, 1), $short_options, $opts, $args); + if (PEAR::isError($error)) + return $error; + } + } + + return array($opts, $non_opts); + } + + /** + * @access private + * + */ + function _parseShortOption($arg, $short_options, &$opts, &$args) + { + for ($i = 0; $i < strlen($arg); $i++) { + $opt = $arg{$i}; + $opt_arg = null; + + /* Try to find the short option in the specifier string. */ + if (($spec = strstr($short_options, $opt)) === false || $arg{$i} == ':') + { + return PEAR::raiseError("Console_Getopt: unrecognized option -- $opt"); + } + + if (strlen($spec) > 1 && $spec{1} == ':') { + if (strlen($spec) > 2 && $spec{2} == ':') { + if ($i + 1 < strlen($arg)) { + /* Option takes an optional argument. Use the remainder of + the arg string if there is anything left. */ + $opts[] = array($opt, substr($arg, $i + 1)); + break; + } + } else { + /* Option requires an argument. Use the remainder of the arg + string if there is anything left. */ + if ($i + 1 < strlen($arg)) { + $opts[] = array($opt, substr($arg, $i + 1)); + break; + } else if (list(, $opt_arg) = each($args)) + /* Else use the next argument. */; + else + return PEAR::raiseError("Console_Getopt: option requires an argument -- $opt"); + } + } + + $opts[] = array($opt, $opt_arg); + } + } + + /** + * @access private + * + */ + function _parseLongOption($arg, $long_options, &$opts, &$args) + { + @list($opt, $opt_arg) = explode('=', $arg); + $opt_len = strlen($opt); + + for ($i = 0; $i < count($long_options); $i++) { + $long_opt = $long_options[$i]; + $opt_start = substr($long_opt, 0, $opt_len); + + /* Option doesn't match. Go on to the next one. */ + if ($opt_start != $opt) + continue; + + $opt_rest = substr($long_opt, $opt_len); + + /* Check that the options uniquely matches one of the allowed + options. */ + if ($opt_rest != '' && $opt{0} != '=' && + $i + 1 < count($long_options) && + $opt == substr($long_options[$i+1], 0, $opt_len)) { + return PEAR::raiseError("Console_Getopt: option --$opt is ambiguous"); + } + + if (substr($long_opt, -1) == '=') { + if (substr($long_opt, -2) != '==') { + /* Long option requires an argument. + Take the next argument if one wasn't specified. */; + if (!strlen($opt_arg) && !(list(, $opt_arg) = each($args))) { + return PEAR::raiseError("Console_Getopt: option --$opt requires an argument"); + } + } + } else if ($opt_arg) { + return PEAR::raiseError("Console_Getopt: option --$opt doesn't allow an argument"); + } + + $opts[] = array('--' . $opt, $opt_arg); + return; + } + + return PEAR::raiseError("Console_Getopt: unrecognized option --$opt"); + } + + /** + * Safely read the $argv PHP array across different PHP configurations. + * Will take care on register_globals and register_argc_argv ini directives + * + * @access public + * @return mixed the $argv PHP array or PEAR error if not registered + */ + function readPHPArgv() + { + global $argv; + if (!is_array($argv)) { + if (!@is_array($_SERVER['argv'])) { + if (!@is_array($GLOBALS['HTTP_SERVER_VARS']['argv'])) { + return PEAR::raiseError("Console_Getopt: Could not read cmd args (register_argc_argv=Off?)"); + } + return $GLOBALS['HTTP_SERVER_VARS']['argv']; + } + return $_SERVER['argv']; + } + return $argv; + } + +} + +?> diff --git a/thirdparty/pear/DB.php b/thirdparty/pear/DB.php new file mode 100644 index 000000000..d866c4d25 --- /dev/null +++ b/thirdparty/pear/DB.php @@ -0,0 +1,1114 @@ + | +// | Tomas V.V.Cox | +// | Maintainer: Daniel Convissor | +// +----------------------------------------------------------------------+ +// +// $Id: DB.php 3355 2005-06-11 22:14:40Z nbm $ +// +// Database independent query interface. + + +require_once 'PEAR.php'; + +// {{{ constants +// {{{ error codes + +/* + * The method mapErrorCode in each DB_dbtype implementation maps + * native error codes to one of these. + * + * If you add an error code here, make sure you also add a textual + * version of it in DB::errorMessage(). + */ +define('DB_OK', 1); +define('DB_ERROR', -1); +define('DB_ERROR_SYNTAX', -2); +define('DB_ERROR_CONSTRAINT', -3); +define('DB_ERROR_NOT_FOUND', -4); +define('DB_ERROR_ALREADY_EXISTS', -5); +define('DB_ERROR_UNSUPPORTED', -6); +define('DB_ERROR_MISMATCH', -7); +define('DB_ERROR_INVALID', -8); +define('DB_ERROR_NOT_CAPABLE', -9); +define('DB_ERROR_TRUNCATED', -10); +define('DB_ERROR_INVALID_NUMBER', -11); +define('DB_ERROR_INVALID_DATE', -12); +define('DB_ERROR_DIVZERO', -13); +define('DB_ERROR_NODBSELECTED', -14); +define('DB_ERROR_CANNOT_CREATE', -15); +define('DB_ERROR_CANNOT_DELETE', -16); +define('DB_ERROR_CANNOT_DROP', -17); +define('DB_ERROR_NOSUCHTABLE', -18); +define('DB_ERROR_NOSUCHFIELD', -19); +define('DB_ERROR_NEED_MORE_DATA', -20); +define('DB_ERROR_NOT_LOCKED', -21); +define('DB_ERROR_VALUE_COUNT_ON_ROW', -22); +define('DB_ERROR_INVALID_DSN', -23); +define('DB_ERROR_CONNECT_FAILED', -24); +define('DB_ERROR_EXTENSION_NOT_FOUND',-25); +define('DB_ERROR_ACCESS_VIOLATION', -26); +define('DB_ERROR_NOSUCHDB', -27); +define('DB_ERROR_CONSTRAINT_NOT_NULL',-29); + + +// }}} +// {{{ prepared statement-related + + +/* + * These constants are used when storing information about prepared + * statements (using the "prepare" method in DB_dbtype). + * + * The prepare/execute model in DB is mostly borrowed from the ODBC + * extension, in a query the "?" character means a scalar parameter. + * There are two extensions though, a "&" character means an opaque + * parameter. An opaque parameter is simply a file name, the real + * data are in that file (useful for putting uploaded files into your + * database and such). The "!" char means a parameter that must be + * left as it is. + * They modify the quote behavoir: + * DB_PARAM_SCALAR (?) => 'original string quoted' + * DB_PARAM_OPAQUE (&) => 'string from file quoted' + * DB_PARAM_MISC (!) => original string + */ +define('DB_PARAM_SCALAR', 1); +define('DB_PARAM_OPAQUE', 2); +define('DB_PARAM_MISC', 3); + + +// }}} +// {{{ binary data-related + + +/* + * These constants define different ways of returning binary data + * from queries. Again, this model has been borrowed from the ODBC + * extension. + * + * DB_BINMODE_PASSTHRU sends the data directly through to the browser + * when data is fetched from the database. + * DB_BINMODE_RETURN lets you return data as usual. + * DB_BINMODE_CONVERT returns data as well, only it is converted to + * hex format, for example the string "123" would become "313233". + */ +define('DB_BINMODE_PASSTHRU', 1); +define('DB_BINMODE_RETURN', 2); +define('DB_BINMODE_CONVERT', 3); + + +// }}} +// {{{ fetch modes + + +/** + * This is a special constant that tells DB the user hasn't specified + * any particular get mode, so the default should be used. + */ +define('DB_FETCHMODE_DEFAULT', 0); + +/** + * Column data indexed by numbers, ordered from 0 and up + */ +define('DB_FETCHMODE_ORDERED', 1); + +/** + * Column data indexed by column names + */ +define('DB_FETCHMODE_ASSOC', 2); + +/** + * Column data as object properties + */ +define('DB_FETCHMODE_OBJECT', 3); + +/** + * For multi-dimensional results: normally the first level of arrays + * is the row number, and the second level indexed by column number or name. + * DB_FETCHMODE_FLIPPED switches this order, so the first level of arrays + * is the column name, and the second level the row number. + */ +define('DB_FETCHMODE_FLIPPED', 4); + +/* for compatibility */ +define('DB_GETMODE_ORDERED', DB_FETCHMODE_ORDERED); +define('DB_GETMODE_ASSOC', DB_FETCHMODE_ASSOC); +define('DB_GETMODE_FLIPPED', DB_FETCHMODE_FLIPPED); + + +// }}} +// {{{ tableInfo() && autoPrepare()-related + + +/** + * these are constants for the tableInfo-function + * they are bitwised or'ed. so if there are more constants to be defined + * in the future, adjust DB_TABLEINFO_FULL accordingly + */ +define('DB_TABLEINFO_ORDER', 1); +define('DB_TABLEINFO_ORDERTABLE', 2); +define('DB_TABLEINFO_FULL', 3); + +/* + * Used by autoPrepare() + */ +define('DB_AUTOQUERY_INSERT', 1); +define('DB_AUTOQUERY_UPDATE', 2); + + +// }}} +// {{{ portability modes + + +/** + * Portability: turn off all portability features. + * @see DB_common::setOption() + */ +define('DB_PORTABILITY_NONE', 0); + +/** + * Portability: convert names of tables and fields to lower case + * when using the get*(), fetch*() and tableInfo() methods. + * @see DB_common::setOption() + */ +define('DB_PORTABILITY_LOWERCASE', 1); + +/** + * Portability: right trim the data output by get*() and fetch*(). + * @see DB_common::setOption() + */ +define('DB_PORTABILITY_RTRIM', 2); + +/** + * Portability: force reporting the number of rows deleted. + * @see DB_common::setOption() + */ +define('DB_PORTABILITY_DELETE_COUNT', 4); + +/** + * Portability: enable hack that makes numRows() work in Oracle. + * @see DB_common::setOption() + */ +define('DB_PORTABILITY_NUMROWS', 8); + +/** + * Portability: makes certain error messages in certain drivers compatible + * with those from other DBMS's. + * + * + mysql, mysqli: change unique/primary key constraints + * DB_ERROR_ALREADY_EXISTS -> DB_ERROR_CONSTRAINT + * + * + odbc(access): MS's ODBC driver reports 'no such field' as code + * 07001, which means 'too few parameters.' When this option is on + * that code gets mapped to DB_ERROR_NOSUCHFIELD. + * + * @see DB_common::setOption() + */ +define('DB_PORTABILITY_ERRORS', 16); + +/** + * Portability: convert null values to empty strings in data output by + * get*() and fetch*(). + * @see DB_common::setOption() + */ +define('DB_PORTABILITY_NULL_TO_EMPTY', 32); + +/** + * Portability: turn on all portability features. + * @see DB_common::setOption() + */ +define('DB_PORTABILITY_ALL', 63); + +// }}} + + +// }}} +// {{{ class DB + +/** + * The main "DB" class is simply a container class with some static + * methods for creating DB objects as well as some utility functions + * common to all parts of DB. + * + * The object model of DB is as follows (indentation means inheritance): + * + * DB The main DB class. This is simply a utility class + * with some "static" methods for creating DB objects as + * well as common utility functions for other DB classes. + * + * DB_common The base for each DB implementation. Provides default + * | implementations (in OO lingo virtual methods) for + * | the actual DB implementations as well as a bunch of + * | query utility functions. + * | + * +-DB_mysql The DB implementation for MySQL. Inherits DB_common. + * When calling DB::factory or DB::connect for MySQL + * connections, the object returned is an instance of this + * class. + * + * @package DB + * @author Stig Bakken + * @author Tomas V.V.Cox + * @since PHP 4.0 + * @version $Id: DB.php 3355 2005-06-11 22:14:40Z nbm $ + * @category Database + */ +class DB +{ + // {{{ &factory() + + /** + * Create a new DB object for the specified database type. + * + * Allows creation of a DB_ object from which the object's + * methods can be utilized without actually connecting to a database. + * + * @param string $type database type, for example "mysql" + * @param array $options associative array of option names and values + * + * @return object a new DB object. On error, an error object. + * + * @see DB_common::setOption() + * @access public + */ + function &factory($type, $options = false) + { + if (!is_array($options)) { + $options = array('persistent' => $options); + } + + if (isset($options['debug']) && $options['debug'] >= 2) { + // expose php errors with sufficient debug level + include_once "DB/{$type}.php"; + } else { + @include_once "DB/{$type}.php"; + } + + $classname = "DB_${type}"; + + if (!class_exists($classname)) { + $tmp = PEAR::raiseError(null, DB_ERROR_NOT_FOUND, null, null, + "Unable to include the DB/{$type}.php file", + 'DB_Error', true); + return $tmp; + } + + $obj = new $classname; + + foreach ($options as $option => $value) { + $test = $obj->setOption($option, $value); + if (DB::isError($test)) { + return $test; + } + } + + return $obj; + } + + // }}} + // {{{ &connect() + + /** + * Create a new DB object and connect to the specified database. + * + * Example 1. + * 2, + * 'portability' => DB_PORTABILITY_ALL, + * ); + * + * $dbh =& DB::connect($dsn, $options); + * if (DB::isError($dbh)) { + * die($dbh->getMessage()); + * } + * ?> + * + * @param mixed $dsn string "data source name" or an array in the + * format returned by DB::parseDSN() + * + * @param array $options an associative array of option names and + * their values + * + * @return object a newly created DB connection object, or a DB + * error object on error + * + * @see DB::parseDSN(), DB_common::setOption(), DB::isError() + * @access public + */ + function &connect($dsn, $options = array()) + { + $dsninfo = DB::parseDSN($dsn); + $type = $dsninfo['phptype']; + + if (!is_array($options)) { + /* + * For backwards compatibility. $options used to be boolean, + * indicating whether the connection should be persistent. + */ + $options = array('persistent' => $options); + } + + if (isset($options['debug']) && $options['debug'] >= 2) { + // expose php errors with sufficient debug level + include_once "DB/${type}.php"; + } else { + @include_once "DB/${type}.php"; + } + + $classname = "DB_${type}"; + if (!class_exists($classname)) { + $tmp = PEAR::raiseError(null, DB_ERROR_NOT_FOUND, null, null, + "Unable to include the DB/{$type}.php file for `$dsn'", + 'DB_Error', true); + return $tmp; + } + + $obj = new $classname; + + foreach ($options as $option => $value) { + $test = $obj->setOption($option, $value); + if (DB::isError($test)) { + return $test; + } + } + + $err = $obj->connect($dsninfo, $obj->getOption('persistent')); + if (DB::isError($err)) { + $err->addUserInfo($dsn); + return $err; + } + + return $obj; + } + + // }}} + // {{{ apiVersion() + + /** + * Return the DB API version + * + * @return int the DB API version number + * + * @access public + */ + function apiVersion() + { + return 2; + } + + // }}} + // {{{ isError() + + /** + * Tell whether a result code from a DB method is an error + * + * @param int $value result code + * + * @return bool whether $value is an error + * + * @access public + */ + function isError($value) + { + return is_a($value, 'DB_Error'); + } + + // }}} + // {{{ isConnection() + + /** + * Tell whether a value is a DB connection + * + * @param mixed $value value to test + * + * @return bool whether $value is a DB connection + * + * @access public + */ + function isConnection($value) + { + return (is_object($value) && + is_subclass_of($value, 'db_common') && + method_exists($value, 'simpleQuery')); + } + + // }}} + // {{{ isManip() + + /** + * Tell whether a query is a data manipulation query (insert, + * update or delete) or a data definition query (create, drop, + * alter, grant, revoke). + * + * @access public + * + * @param string $query the query + * + * @return boolean whether $query is a data manipulation query + */ + function isManip($query) + { + $manips = 'INSERT|UPDATE|DELETE|LOAD DATA|'.'REPLACE|CREATE|DROP|'. + 'ALTER|GRANT|REVOKE|'.'LOCK|UNLOCK'; + if (preg_match('/^\s*"?('.$manips.')\s+/i', $query)) { + return true; + } + return false; + } + + // }}} + // {{{ errorMessage() + + /** + * Return a textual error message for a DB error code + * + * @param integer $value error code + * + * @return string error message, or false if the error code was + * not recognized + */ + function errorMessage($value) + { + static $errorMessages; + if (!isset($errorMessages)) { + $errorMessages = array( + DB_ERROR => 'unknown error', + DB_ERROR_ALREADY_EXISTS => 'already exists', + DB_ERROR_CANNOT_CREATE => 'can not create', + DB_ERROR_CANNOT_DELETE => 'can not delete', + DB_ERROR_CANNOT_DROP => 'can not drop', + DB_ERROR_CONSTRAINT => 'constraint violation', + DB_ERROR_CONSTRAINT_NOT_NULL=> 'null value violates not-null constraint', + DB_ERROR_DIVZERO => 'division by zero', + DB_ERROR_INVALID => 'invalid', + DB_ERROR_INVALID_DATE => 'invalid date or time', + DB_ERROR_INVALID_NUMBER => 'invalid number', + DB_ERROR_MISMATCH => 'mismatch', + DB_ERROR_NODBSELECTED => 'no database selected', + DB_ERROR_NOSUCHFIELD => 'no such field', + DB_ERROR_NOSUCHTABLE => 'no such table', + DB_ERROR_NOT_CAPABLE => 'DB backend not capable', + DB_ERROR_NOT_FOUND => 'not found', + DB_ERROR_NOT_LOCKED => 'not locked', + DB_ERROR_SYNTAX => 'syntax error', + DB_ERROR_UNSUPPORTED => 'not supported', + DB_ERROR_VALUE_COUNT_ON_ROW => 'value count on row', + DB_ERROR_INVALID_DSN => 'invalid DSN', + DB_ERROR_CONNECT_FAILED => 'connect failed', + DB_OK => 'no error', + DB_ERROR_NEED_MORE_DATA => 'insufficient data supplied', + DB_ERROR_EXTENSION_NOT_FOUND=> 'extension not found', + DB_ERROR_NOSUCHDB => 'no such database', + DB_ERROR_ACCESS_VIOLATION => 'insufficient permissions', + DB_ERROR_TRUNCATED => 'truncated' + ); + } + + if (DB::isError($value)) { + $value = $value->getCode(); + } + + return isset($errorMessages[$value]) ? $errorMessages[$value] : $errorMessages[DB_ERROR]; + } + + // }}} + // {{{ parseDSN() + + /** + * Parse a data source name. + * + * Additional keys can be added by appending a URI query string to the + * end of the DSN. + * + * The format of the supplied DSN is in its fullest form: + * + * phptype(dbsyntax)://username:password@protocol+hostspec/database?option=8&another=true + * + * + * Most variations are allowed: + * + * phptype://username:password@protocol+hostspec:110//usr/db_file.db?mode=0644 + * phptype://username:password@hostspec/database_name + * phptype://username:password@hostspec + * phptype://username@hostspec + * phptype://hostspec/database + * phptype://hostspec + * phptype(dbsyntax) + * phptype + * + * + * @param string $dsn Data Source Name to be parsed + * + * @return array an associative array with the following keys: + * + phptype: Database backend used in PHP (mysql, odbc etc.) + * + dbsyntax: Database used with regards to SQL syntax etc. + * + protocol: Communication protocol to use (tcp, unix etc.) + * + hostspec: Host specification (hostname[:port]) + * + database: Database to use on the DBMS server + * + username: User name for login + * + password: Password for login + * + * @author Tomas V.V.Cox + */ + function parseDSN($dsn) + { + $parsed = array( + 'phptype' => false, + 'dbsyntax' => false, + 'username' => false, + 'password' => false, + 'protocol' => false, + 'hostspec' => false, + 'port' => false, + 'socket' => false, + 'database' => false, + ); + + if (is_array($dsn)) { + $dsn = array_merge($parsed, $dsn); + if (!$dsn['dbsyntax']) { + $dsn['dbsyntax'] = $dsn['phptype']; + } + return $dsn; + } + + // Find phptype and dbsyntax + if (($pos = strpos($dsn, '://')) !== false) { + $str = substr($dsn, 0, $pos); + $dsn = substr($dsn, $pos + 3); + } else { + $str = $dsn; + $dsn = null; + } + + // Get phptype and dbsyntax + // $str => phptype(dbsyntax) + if (preg_match('|^(.+?)\((.*?)\)$|', $str, $arr)) { + $parsed['phptype'] = $arr[1]; + $parsed['dbsyntax'] = !$arr[2] ? $arr[1] : $arr[2]; + } else { + $parsed['phptype'] = $str; + $parsed['dbsyntax'] = $str; + } + + if (!count($dsn)) { + return $parsed; + } + + // Get (if found): username and password + // $dsn => username:password@protocol+hostspec/database + if (($at = strrpos($dsn,'@')) !== false) { + $str = substr($dsn, 0, $at); + $dsn = substr($dsn, $at + 1); + if (($pos = strpos($str, ':')) !== false) { + $parsed['username'] = rawurldecode(substr($str, 0, $pos)); + $parsed['password'] = rawurldecode(substr($str, $pos + 1)); + } else { + $parsed['username'] = rawurldecode($str); + } + } + + // Find protocol and hostspec + + // $dsn => proto(proto_opts)/database + if (preg_match('|^([^(]+)\((.*?)\)/?(.*?)$|', $dsn, $match)) { + $proto = $match[1]; + $proto_opts = $match[2] ? $match[2] : false; + $dsn = $match[3]; + + // $dsn => protocol+hostspec/database (old format) + } else { + if (strpos($dsn, '+') !== false) { + list($proto, $dsn) = explode('+', $dsn, 2); + } + if (strpos($dsn, '/') !== false) { + list($proto_opts, $dsn) = explode('/', $dsn, 2); + } else { + $proto_opts = $dsn; + $dsn = null; + } + } + + // process the different protocol options + $parsed['protocol'] = (!empty($proto)) ? $proto : 'tcp'; + $proto_opts = rawurldecode($proto_opts); + if ($parsed['protocol'] == 'tcp') { + if (strpos($proto_opts, ':') !== false) { + list($parsed['hostspec'], $parsed['port']) = explode(':', $proto_opts); + } else { + $parsed['hostspec'] = $proto_opts; + } + } elseif ($parsed['protocol'] == 'unix') { + $parsed['socket'] = $proto_opts; + } + + // Get dabase if any + // $dsn => database + if ($dsn) { + // /database + if (($pos = strpos($dsn, '?')) === false) { + $parsed['database'] = rawurldecode($dsn); + // /database?param1=value1¶m2=value2 + } else { + $parsed['database'] = rawurldecode(substr($dsn, 0, $pos)); + $dsn = substr($dsn, $pos + 1); + if (strpos($dsn, '&') !== false) { + $opts = explode('&', $dsn); + } else { // database?param1=value1 + $opts = array($dsn); + } + foreach ($opts as $opt) { + list($key, $value) = explode('=', $opt); + if (!isset($parsed[$key])) { + // don't allow params overwrite + $parsed[$key] = rawurldecode($value); + } + } + } + } + + return $parsed; + } + + // }}} + // {{{ assertExtension() + + /** + * Load a PHP database extension if it is not loaded already. + * + * @access public + * + * @param string $name the base name of the extension (without the .so or + * .dll suffix) + * + * @return boolean true if the extension was already or successfully + * loaded, false if it could not be loaded + */ + function assertExtension($name) + { + if (!extension_loaded($name)) { + $dlext = OS_WINDOWS ? '.dll' : '.so'; + $dlprefix = OS_WINDOWS ? 'php_' : ''; + @dl($dlprefix . $name . $dlext); + return extension_loaded($name); + } + return true; + } + // }}} +} + +// }}} +// {{{ class DB_Error + +/** + * DB_Error implements a class for reporting portable database error + * messages. + * + * @package DB + * @author Stig Bakken + */ +class DB_Error extends PEAR_Error +{ + // {{{ constructor + + /** + * DB_Error constructor. + * + * @param mixed $code DB error code, or string with error message. + * @param integer $mode what "error mode" to operate in + * @param integer $level what error level to use for $mode & PEAR_ERROR_TRIGGER + * @param mixed $debuginfo additional debug info, such as the last query + * + * @access public + * + * @see PEAR_Error + */ + function DB_Error($code = DB_ERROR, $mode = PEAR_ERROR_RETURN, + $level = E_USER_NOTICE, $debuginfo = null) + { + if (is_int($code)) { + $this->PEAR_Error('DB Error: ' . DB::errorMessage($code), $code, $mode, $level, $debuginfo); + } else { + $this->PEAR_Error("DB Error: $code", DB_ERROR, $mode, $level, $debuginfo); + } + } + // }}} +} + +// }}} +// {{{ class DB_result + +/** + * This class implements a wrapper for a DB result set. + * A new instance of this class will be returned by the DB implementation + * after processing a query that returns data. + * + * @package DB + * @author Stig Bakken + */ +class DB_result +{ + // {{{ properties + + var $dbh; + var $result; + var $row_counter = null; + + /** + * for limit queries, the row to start fetching + * @var integer + */ + var $limit_from = null; + + /** + * for limit queries, the number of rows to fetch + * @var integer + */ + var $limit_count = null; + + // }}} + // {{{ constructor + + /** + * DB_result constructor. + * @param resource &$dbh DB object reference + * @param resource $result result resource id + * @param array $options assoc array with optional result options + */ + function DB_result(&$dbh, $result, $options = array()) + { + $this->dbh = &$dbh; + $this->result = $result; + foreach ($options as $key => $value) { + $this->setOption($key, $value); + } + $this->limit_type = $dbh->features['limit']; + $this->autofree = $dbh->options['autofree']; + $this->fetchmode = $dbh->fetchmode; + $this->fetchmode_object_class = $dbh->fetchmode_object_class; + } + + function setOption($key, $value = null) + { + switch ($key) { + case 'limit_from': + $this->limit_from = $value; break; + case 'limit_count': + $this->limit_count = $value; break; + } + } + + // }}} + // {{{ fetchRow() + + /** + * Fetch a row of data and return it by reference into an array. + * + * The type of array returned can be controlled either by setting this + * method's $fetchmode parameter or by changing the default + * fetch mode setFetchMode() before calling this method. + * + * There are two options for standardizing the information returned + * from databases, ensuring their values are consistent when changing + * DBMS's. These portability options can be turned on when creating a + * new DB object or by using setOption(). + * + * + DB_PORTABILITY_LOWERCASE + * convert names of fields to lower case + * + * + DB_PORTABILITY_RTRIM + * right trim the data + * + * @param int $fetchmode how the resulting array should be indexed + * @param int $rownum the row number to fetch + * + * @return array a row of data, null on no more rows or PEAR_Error + * object on error + * + * @see DB_common::setOption(), DB_common::setFetchMode() + * @access public + */ + function &fetchRow($fetchmode = DB_FETCHMODE_DEFAULT, $rownum=null) + { + if ($fetchmode === DB_FETCHMODE_DEFAULT) { + $fetchmode = $this->fetchmode; + } + if ($fetchmode === DB_FETCHMODE_OBJECT) { + $fetchmode = DB_FETCHMODE_ASSOC; + $object_class = $this->fetchmode_object_class; + } + if ($this->limit_from !== null) { + if ($this->row_counter === null) { + $this->row_counter = $this->limit_from; + // Skip rows + if ($this->limit_type == false) { + $i = 0; + while ($i++ < $this->limit_from) { + $this->dbh->fetchInto($this->result, $arr, $fetchmode); + } + } + } + if ($this->row_counter >= ( + $this->limit_from + $this->limit_count)) + { + if ($this->autofree) { + $this->free(); + } + $tmp = null; + return $tmp; + } + if ($this->limit_type == 'emulate') { + $rownum = $this->row_counter; + } + $this->row_counter++; + } + $res = $this->dbh->fetchInto($this->result, $arr, $fetchmode, $rownum); + if ($res === DB_OK) { + if (isset($object_class)) { + // default mode specified in DB_common::fetchmode_object_class property + if ($object_class == 'stdClass') { + $arr = (object) $arr; + } else { + $arr = new $object_class($arr); + } + } + return $arr; + } + if ($res == null && $this->autofree) { + $this->free(); + } + return $res; + } + + // }}} + // {{{ fetchInto() + + /** + * Fetch a row of data into an array which is passed by reference. + * + * The type of array returned can be controlled either by setting this + * method's $fetchmode parameter or by changing the default + * fetch mode setFetchMode() before calling this method. + * + * There are two options for standardizing the information returned + * from databases, ensuring their values are consistent when changing + * DBMS's. These portability options can be turned on when creating a + * new DB object or by using setOption(). + * + * + DB_PORTABILITY_LOWERCASE + * convert names of fields to lower case + * + * + DB_PORTABILITY_RTRIM + * right trim the data + * + * @param array &$arr (reference) array where data from the row + * should be placed + * @param int $fetchmode how the resulting array should be indexed + * @param int $rownum the row number to fetch + * + * @return mixed DB_OK on success, null on no more rows or + * a DB_Error object on error + * + * @see DB_common::setOption(), DB_common::setFetchMode() + * @access public + */ + function fetchInto(&$arr, $fetchmode = DB_FETCHMODE_DEFAULT, $rownum=null) + { + if ($fetchmode === DB_FETCHMODE_DEFAULT) { + $fetchmode = $this->fetchmode; + } + if ($fetchmode === DB_FETCHMODE_OBJECT) { + $fetchmode = DB_FETCHMODE_ASSOC; + $object_class = $this->fetchmode_object_class; + } + if ($this->limit_from !== null) { + if ($this->row_counter === null) { + $this->row_counter = $this->limit_from; + // Skip rows + if ($this->limit_type == false) { + $i = 0; + while ($i++ < $this->limit_from) { + $this->dbh->fetchInto($this->result, $arr, $fetchmode); + } + } + } + if ($this->row_counter >= ( + $this->limit_from + $this->limit_count)) + { + if ($this->autofree) { + $this->free(); + } + return null; + } + if ($this->limit_type == 'emulate') { + $rownum = $this->row_counter; + } + + $this->row_counter++; + } + $res = $this->dbh->fetchInto($this->result, $arr, $fetchmode, $rownum); + if ($res === DB_OK) { + if (isset($object_class)) { + // default mode specified in DB_common::fetchmode_object_class property + if ($object_class == 'stdClass') { + $arr = (object) $arr; + } else { + $arr = new $object_class($arr); + } + } + return DB_OK; + } + if ($res == null && $this->autofree) { + $this->free(); + } + return $res; + } + + // }}} + // {{{ numCols() + + /** + * Get the the number of columns in a result set. + * + * @return int the number of columns, or a DB error + * + * @access public + */ + function numCols() + { + return $this->dbh->numCols($this->result); + } + + // }}} + // {{{ numRows() + + /** + * Get the number of rows in a result set. + * + * @return int the number of rows, or a DB error + * + * @access public + */ + function numRows() + { + return $this->dbh->numRows($this->result); + } + + // }}} + // {{{ nextResult() + + /** + * Get the next result if a batch of queries was executed. + * + * @return bool true if a new result is available or false if not. + * + * @access public + */ + function nextResult() + { + return $this->dbh->nextResult($this->result); + } + + // }}} + // {{{ free() + + /** + * Frees the resources allocated for this result set. + * @return int error code + * + * @access public + */ + function free() + { + $err = $this->dbh->freeResult($this->result); + if (DB::isError($err)) { + return $err; + } + $this->result = false; + return true; + } + + // }}} + // {{{ tableInfo() + + /** + * @deprecated + * @internal + * @see DB_common::tableInfo() + */ + function tableInfo($mode = null) + { + if (is_string($mode)) { + return $this->dbh->raiseError(DB_ERROR_NEED_MORE_DATA); + } + return $this->dbh->tableInfo($this, $mode); + } + + // }}} + // {{{ getRowCounter() + + /** + * returns the actual row number + * @return integer + */ + function getRowCounter() + { + return $this->row_counter; + } + // }}} +} + +// }}} +// {{{ class DB_row + +/** + * Pear DB Row Object + * @see DB_common::setFetchMode() + */ +class DB_row +{ + // {{{ constructor + + /** + * constructor + * + * @param resource row data as array + */ + function DB_row(&$arr) + { + foreach ($arr as $key => $value) { + $this->$key = &$arr[$key]; + } + } + + // }}} +} + +// }}} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + */ + +?> diff --git a/thirdparty/pear/DB/common.php b/thirdparty/pear/DB/common.php new file mode 100644 index 000000000..13bb1df8c --- /dev/null +++ b/thirdparty/pear/DB/common.php @@ -0,0 +1,2042 @@ + | +// | Tomas V.V.Cox | +// | Maintainer: Daniel Convissor | +// +----------------------------------------------------------------------+ +// +// $Id: common.php 3355 2005-06-11 22:14:40Z nbm $ + +require_once 'PEAR.php'; + +/** + * DB_common is a base class for DB implementations, and must be + * inherited by all such + * + * @package DB + * @version $Id: common.php 3355 2005-06-11 22:14:40Z nbm $ + * @category Database + * @author Stig Bakken + * @author Tomas V.V.Cox + */ +class DB_common extends PEAR +{ + // {{{ properties + + /** + * assoc of capabilities for this DB implementation + * $features['limit'] => 'emulate' => emulate with fetch row by number + * 'alter' => alter the query + * false => skip rows + * @var array + */ + var $features = array(); + + /** + * assoc mapping native error codes to DB ones + * @var array + */ + var $errorcode_map = array(); + + /** + * DB type (mysql, oci8, odbc etc.) + * @var string + */ + var $phptype; + + /** + * @var string + */ + var $prepare_tokens; + + /** + * @var string + */ + var $prepare_types; + + /** + * @var string + */ + var $prepared_queries; + + /** + * @var integer + */ + var $prepare_maxstmt = 0; + + /** + * @var string + */ + var $last_query = ''; + + /** + * @var integer + */ + var $fetchmode = DB_FETCHMODE_ORDERED; + + /** + * @var string + */ + var $fetchmode_object_class = 'stdClass'; + + /** + * Run-time configuration options. + * + * The 'optimize' option has been deprecated. Use the 'portability' + * option instead. + * + * @see DB_common::setOption() + * @var array + */ + var $options = array( + 'persistent' => false, + 'ssl' => false, + 'debug' => 0, + 'seqname_format' => '%s_seq', + 'autofree' => false, + 'portability' => DB_PORTABILITY_NONE, + 'optimize' => 'performance', // Deprecated. Use 'portability'. + ); + + /** + * DB handle + * @var resource + */ + var $dbh; + + // }}} + // {{{ toString() + + /** + * String conversation + * + * @return string + * @access private + */ + function toString() + { + $info = strtolower(get_class($this)); + $info .= ': (phptype=' . $this->phptype . + ', dbsyntax=' . $this->dbsyntax . + ')'; + + if ($this->connection) { + $info .= ' [connected]'; + } + + return $info; + } + + // }}} + // {{{ constructor + + /** + * Constructor + */ + function DB_common() + { + $this->PEAR('DB_Error'); + } + + // }}} + // {{{ quoteString() + + /** + * DEPRECATED: Quotes a string so it can be safely used within string + * delimiters in a query + * + * @return string quoted string + * + * @see DB_common::quoteSmart(), DB_common::escapeSimple() + * @deprecated Deprecated in release 1.2 or lower + * @internal + */ + function quoteString($string) + { + $string = $this->quote($string); + if ($string{0} == "'") { + return substr($string, 1, -1); + } + return $string; + } + + // }}} + // {{{ quote() + + /** + * DEPRECATED: Quotes a string so it can be safely used in a query + * + * @param string $string the input string to quote + * + * @return string The NULL string or the string quotes + * in magic_quote_sybase style + * + * @see DB_common::quoteSmart(), DB_common::escapeSimple() + * @deprecated Deprecated in release 1.6.0 + * @internal + */ + function quote($string = null) + { + return ($string === null) ? 'NULL' : "'".str_replace("'", "''", $string)."'"; + } + + // }}} + // {{{ quoteIdentifier() + + /** + * Quote a string so it can be safely used as a table or column name + * + * Delimiting style depends on which database driver is being used. + * + * NOTE: just because you CAN use delimited identifiers doesn't mean + * you SHOULD use them. In general, they end up causing way more + * problems than they solve. + * + * Portability is broken by using the following characters inside + * delimited identifiers: + * + backtick (`) -- due to MySQL + * + double quote (") -- due to Oracle + * + brackets ([ or ]) -- due to Access + * + * Delimited identifiers are known to generally work correctly under + * the following drivers: + * + mssql + * + mysql + * + mysqli + * + oci8 + * + odbc(access) + * + odbc(db2) + * + pgsql + * + sqlite + * + sybase + * + * InterBase doesn't seem to be able to use delimited identifiers + * via PHP 4. They work fine under PHP 5. + * + * @param string $str identifier name to be quoted + * + * @return string quoted identifier string + * + * @since 1.6.0 + * @access public + */ + function quoteIdentifier($str) + { + return '"' . str_replace('"', '""', $str) . '"'; + } + + // }}} + // {{{ quoteSmart() + + /** + * Format input so it can be safely used in a query + * + * The output depends on the PHP data type of input and the database + * type being used. + * + * @param mixed $in data to be quoted + * + * @return mixed the format of the results depends on the input's + * PHP type: + * + *
      + *
    • + * input -> returns + *
    • + *
    • + * null -> the string NULL + *
    • + *
    • + * integer or double -> the unquoted number + *
    • + *
    • + * &type.bool; -> output depends on the driver in use + * Most drivers return integers: 1 if + * true or 0 if + * false. + * Some return strings: TRUE if + * true or FALSE if + * false. + * Finally one returns strings: T if + * true or F if + * false. Here is a list of each DBMS, + * the values returned and the suggested column type: + *
        + *
      • + * dbase -> T/F + * (Logical) + *
      • + *
      • + * fbase -> TRUE/FALSE + * (BOOLEAN) + *
      • + *
      • + * ibase -> 1/0 + * (SMALLINT) [1] + *
      • + *
      • + * ifx -> 1/0 + * (SMALLINT) [1] + *
      • + *
      • + * msql -> 1/0 + * (INTEGER) + *
      • + *
      • + * mssql -> 1/0 + * (BIT) + *
      • + *
      • + * mysql -> 1/0 + * (TINYINT(1)) + *
      • + *
      • + * mysqli -> 1/0 + * (TINYINT(1)) + *
      • + *
      • + * oci8 -> 1/0 + * (NUMBER(1)) + *
      • + *
      • + * odbc -> 1/0 + * (SMALLINT) [1] + *
      • + *
      • + * pgsql -> TRUE/FALSE + * (BOOLEAN) + *
      • + *
      • + * sqlite -> 1/0 + * (INTEGER) + *
      • + *
      • + * sybase -> 1/0 + * (TINYINT(1)) + *
      • + *
      + * [1] Accommodate the lowest common denominator because not all + * versions of have BOOLEAN. + *
    • + *
    • + * other (including strings and numeric strings) -> + * the data with single quotes escaped by preceeding + * single quotes, backslashes are escaped by preceeding + * backslashes, then the whole string is encapsulated + * between single quotes + *
    • + *
    + * + * @since 1.6.0 + * @see DB_common::escapeSimple() + * @access public + */ + function quoteSmart($in) + { + if (is_int($in) || is_double($in)) { + return $in; + } elseif (is_bool($in)) { + return $in ? 1 : 0; + } elseif (is_null($in)) { + return 'NULL'; + } else { + return "'" . $this->escapeSimple($in) . "'"; + } + } + + // }}} + // {{{ escapeSimple() + + /** + * Escape a string according to the current DBMS's standards + * + * In SQLite, this makes things safe for inserts/updates, but may + * cause problems when performing text comparisons against columns + * containing binary data. See the + * {@link http://php.net/sqlite_escape_string PHP manual} for more info. + * + * @param string $str the string to be escaped + * + * @return string the escaped string + * + * @since 1.6.0 + * @see DB_common::quoteSmart() + * @access public + */ + function escapeSimple($str) { + return str_replace("'", "''", $str); + } + + // }}} + // {{{ provides() + + /** + * Tell whether a DB implementation or its backend extension + * supports a given feature + * + * @param array $feature name of the feature (see the DB class doc) + * @return bool whether this DB implementation supports $feature + * @access public + */ + function provides($feature) + { + return $this->features[$feature]; + } + + // }}} + // {{{ errorCode() + + /** + * Map native error codes to DB's portable ones + * + * Requires that the DB implementation's constructor fills + * in the $errorcode_map property. + * + * @param mixed $nativecode the native error code, as returned by the + * backend database extension (string or integer) + * + * @return int a portable DB error code, or DB_ERROR if this DB + * implementation has no mapping for the given error code. + * + * @access public + */ + function errorCode($nativecode) + { + if (isset($this->errorcode_map[$nativecode])) { + return $this->errorcode_map[$nativecode]; + } + // Fall back to DB_ERROR if there was no mapping. + return DB_ERROR; + } + + // }}} + // {{{ errorMessage() + + /** + * Map a DB error code to a textual message. This is actually + * just a wrapper for DB::errorMessage() + * + * @param integer $dbcode the DB error code + * + * @return string the corresponding error message, of false + * if the error code was unknown + * + * @access public + */ + function errorMessage($dbcode) + { + return DB::errorMessage($this->errorcode_map[$dbcode]); + } + + // }}} + // {{{ raiseError() + + /** + * Communicate an error and invoke error callbacks, etc + * + * Basically a wrapper for PEAR::raiseError without the message string. + * + * @param mixed integer error code, or a PEAR error object (all + * other parameters are ignored if this parameter is + * an object + * + * @param int error mode, see PEAR_Error docs + * + * @param mixed If error mode is PEAR_ERROR_TRIGGER, this is the + * error level (E_USER_NOTICE etc). If error mode is + * PEAR_ERROR_CALLBACK, this is the callback function, + * either as a function name, or as an array of an + * object and method name. For other error modes this + * parameter is ignored. + * + * @param string Extra debug information. Defaults to the last + * query and native error code. + * + * @param mixed Native error code, integer or string depending the + * backend. + * + * @return object a PEAR error object + * + * @access public + * @see PEAR_Error + */ + function &raiseError($code = DB_ERROR, $mode = null, $options = null, + $userinfo = null, $nativecode = null) + { + // The error is yet a DB error object + if (is_object($code)) { + // because we the static PEAR::raiseError, our global + // handler should be used if it is set + if ($mode === null && !empty($this->_default_error_mode)) { + $mode = $this->_default_error_mode; + $options = $this->_default_error_options; + } + $tmp = PEAR::raiseError($code, null, $mode, $options, null, null, true); + return $tmp; + } + + if ($userinfo === null) { + $userinfo = $this->last_query; + } + + if ($nativecode) { + $userinfo .= ' [nativecode=' . trim($nativecode) . ']'; + } + + $tmp = PEAR::raiseError(null, $code, $mode, $options, $userinfo, + 'DB_Error', true); + return $tmp; + } + + // }}} + // {{{ setFetchMode() + + /** + * Sets which fetch mode should be used by default on queries + * on this connection + * + * @param integer $fetchmode DB_FETCHMODE_ORDERED or + * DB_FETCHMODE_ASSOC, possibly bit-wise OR'ed with + * DB_FETCHMODE_FLIPPED. + * + * @param string $object_class The class of the object + * to be returned by the fetch methods when + * the DB_FETCHMODE_OBJECT mode is selected. + * If no class is specified by default a cast + * to object from the assoc array row will be done. + * There is also the posibility to use and extend the + * 'DB_row' class. + * + * @see DB_FETCHMODE_ORDERED + * @see DB_FETCHMODE_ASSOC + * @see DB_FETCHMODE_FLIPPED + * @see DB_FETCHMODE_OBJECT + * @see DB_row::DB_row() + * @access public + */ + function setFetchMode($fetchmode, $object_class = 'stdClass') + { + switch ($fetchmode) { + case DB_FETCHMODE_OBJECT: + $this->fetchmode_object_class = $object_class; + case DB_FETCHMODE_ORDERED: + case DB_FETCHMODE_ASSOC: + $this->fetchmode = $fetchmode; + break; + default: + return $this->raiseError('invalid fetchmode mode'); + } + } + + // }}} + // {{{ setOption() + + /** + * Set run-time configuration options for PEAR DB + * + * Options, their data types, default values and description: + *
      + *
    • + * autofree boolean = false + *
      should results be freed automatically when there are no + * more rows? + *
    • + * debug integer = 0 + *
      debug level + *
    • + * persistent boolean = false + *
      should the connection be persistent? + *
    • + * portability integer = DB_PORTABILITY_NONE + *
      portability mode constant (see below) + *
    • + * seqname_format string = %s_seq + *
      the sprintf() format string used on sequence names. This + * format is applied to sequence names passed to + * createSequence(), nextID() and dropSequence(). + *
    • + * ssl boolean = false + *
      use ssl to connect? + *
    • + *
    + * + * ----------------------------------------- + * + * PORTABILITY MODES + * + * These modes are bitwised, so they can be combined using | + * and removed using ^. See the examples section below on how + * to do this. + * + * DB_PORTABILITY_NONE + * turn off all portability features + * + * This mode gets automatically turned on if the deprecated + * optimize option gets set to performance. + * + * + * DB_PORTABILITY_LOWERCASE + * convert names of tables and fields to lower case when using + * get*(), fetch*() and tableInfo() + * + * This mode gets automatically turned on in the following databases + * if the deprecated option optimize gets set to + * portability: + * + oci8 + * + * + * DB_PORTABILITY_RTRIM + * right trim the data output by get*() fetch*() + * + * + * DB_PORTABILITY_DELETE_COUNT + * force reporting the number of rows deleted + * + * Some DBMS's don't count the number of rows deleted when performing + * simple DELETE FROM tablename queries. This portability + * mode tricks such DBMS's into telling the count by adding + * WHERE 1=1 to the end of DELETE queries. + * + * This mode gets automatically turned on in the following databases + * if the deprecated option optimize gets set to + * portability: + * + fbsql + * + mysql + * + mysqli + * + sqlite + * + * + * DB_PORTABILITY_NUMROWS + * enable hack that makes numRows() work in Oracle + * + * This mode gets automatically turned on in the following databases + * if the deprecated option optimize gets set to + * portability: + * + oci8 + * + * + * DB_PORTABILITY_ERRORS + * makes certain error messages in certain drivers compatible + * with those from other DBMS's + * + * + mysql, mysqli: change unique/primary key constraints + * DB_ERROR_ALREADY_EXISTS -> DB_ERROR_CONSTRAINT + * + * + odbc(access): MS's ODBC driver reports 'no such field' as code + * 07001, which means 'too few parameters.' When this option is on + * that code gets mapped to DB_ERROR_NOSUCHFIELD. + * DB_ERROR_MISMATCH -> DB_ERROR_NOSUCHFIELD + * + * + * DB_PORTABILITY_NULL_TO_EMPTY + * convert null values to empty strings in data output by get*() and + * fetch*(). Needed because Oracle considers empty strings to be null, + * while most other DBMS's know the difference between empty and null. + * + * + * DB_PORTABILITY_ALL + * turn on all portability features + * + * ----------------------------------------- + * + * Example 1. Simple setOption() example + * setOption('autofree', true); + * ?> + * + * Example 2. Portability for lowercasing and trimming + * setOption('portability', + * DB_PORTABILITY_LOWERCASE | DB_PORTABILITY_RTRIM); + * ?> + * + * Example 3. All portability options except trimming + * setOption('portability', + * DB_PORTABILITY_ALL ^ DB_PORTABILITY_RTRIM); + * ?> + * + * @param string $option option name + * @param mixed $value value for the option + * + * @return int DB_OK on success. DB_Error object on failure. + * + * @see DB_common::$options + */ + function setOption($option, $value) + { + if (isset($this->options[$option])) { + $this->options[$option] = $value; + + /* + * Backwards compatibility check for the deprecated 'optimize' + * option. Done here in case settings change after connecting. + */ + if ($option == 'optimize') { + if ($value == 'portability') { + switch ($this->phptype) { + case 'oci8': + $this->options['portability'] = + DB_PORTABILITY_LOWERCASE | + DB_PORTABILITY_NUMROWS; + break; + case 'fbsql': + case 'mysql': + case 'mysqli': + case 'sqlite': + $this->options['portability'] = + DB_PORTABILITY_DELETE_COUNT; + break; + } + } else { + $this->options['portability'] = DB_PORTABILITY_NONE; + } + } + + return DB_OK; + } + return $this->raiseError("unknown option $option"); + } + + // }}} + // {{{ getOption() + + /** + * Returns the value of an option + * + * @param string $option option name + * + * @return mixed the option value + */ + function getOption($option) + { + if (isset($this->options[$option])) { + return $this->options[$option]; + } + return $this->raiseError("unknown option $option"); + } + + // }}} + // {{{ prepare() + + /** + * Prepares a query for multiple execution with execute() + * + * Creates a query that can be run multiple times. Each time it is run, + * the placeholders, if any, will be replaced by the contents of + * execute()'s $data argument. + * + * Three types of placeholders can be used: + * + ? scalar value (i.e. strings, integers). The system + * will automatically quote and escape the data. + * + ! value is inserted 'as is' + * + & requires a file name. The file's contents get + * inserted into the query (i.e. saving binary + * data in a db) + * + * Example 1. + * prepare('INSERT INTO tbl (a, b, c) VALUES (?, !, &)'); + * $data = array( + * "John's text", + * "'it''s good'", + * 'filename.txt' + * ); + * $res = $dbh->execute($sth, $data); + * ?> + * + * Use backslashes to escape placeholder characters if you don't want + * them to be interpreted as placeholders: + *
    +     *    "UPDATE foo SET col=? WHERE col='over \& under'"
    +     * 
    + * + * With some database backends, this is emulated. + * + * {@internal ibase and oci8 have their own prepare() methods.}} + * + * @param string $query query to be prepared + * + * @return mixed DB statement resource on success. DB_Error on failure. + * + * @see DB_common::execute() + * @access public + */ + function prepare($query) + { + $tokens = preg_split('/((?prepare_tokens[] = &$newtokens; + end($this->prepare_tokens); + + $k = key($this->prepare_tokens); + $this->prepare_types[$k] = $types; + $this->prepared_queries[$k] = implode(' ', $newtokens); + + return $k; + } + + // }}} + // {{{ autoPrepare() + + /** + * Automaticaly generate an insert or update query and pass it to prepare() + * + * @param string $table name of the table + * @param array $table_fields ordered array containing the fields names + * @param int $mode type of query to make (DB_AUTOQUERY_INSERT or DB_AUTOQUERY_UPDATE) + * @param string $where in case of update queries, this string will be put after the sql WHERE statement + * @return resource handle for the query + * @see DB_common::prepare(), DB_common::buildManipSQL() + * @access public + */ + function autoPrepare($table, $table_fields, $mode = DB_AUTOQUERY_INSERT, $where = false) + { + $query = $this->buildManipSQL($table, $table_fields, $mode, $where); + return $this->prepare($query); + } + + // }}} + // {{{ autoExecute() + + /** + * Automaticaly generate an insert or update query and call prepare() + * and execute() with it + * + * @param string $table name of the table + * @param array $fields_values assoc ($key=>$value) where $key is a field name and $value its value + * @param int $mode type of query to make (DB_AUTOQUERY_INSERT or DB_AUTOQUERY_UPDATE) + * @param string $where in case of update queries, this string will be put after the sql WHERE statement + * @return mixed a new DB_Result or a DB_Error when fail + * @see DB_common::autoPrepare(), DB_common::buildManipSQL() + * @access public + */ + function autoExecute($table, $fields_values, $mode = DB_AUTOQUERY_INSERT, $where = false) + { + $sth = $this->autoPrepare($table, array_keys($fields_values), $mode, $where); + $ret =& $this->execute($sth, array_values($fields_values)); + $this->freePrepared($sth); + return $ret; + + } + + // }}} + // {{{ buildManipSQL() + + /** + * Make automaticaly an sql query for prepare() + * + * Example : buildManipSQL('table_sql', array('field1', 'field2', 'field3'), DB_AUTOQUERY_INSERT) + * will return the string : INSERT INTO table_sql (field1,field2,field3) VALUES (?,?,?) + * NB : - This belongs more to a SQL Builder class, but this is a simple facility + * - Be carefull ! If you don't give a $where param with an UPDATE query, all + * the records of the table will be updated ! + * + * @param string $table name of the table + * @param array $table_fields ordered array containing the fields names + * @param int $mode type of query to make (DB_AUTOQUERY_INSERT or DB_AUTOQUERY_UPDATE) + * @param string $where in case of update queries, this string will be put after the sql WHERE statement + * @return string sql query for prepare() + * @access public + */ + function buildManipSQL($table, $table_fields, $mode, $where = false) + { + if (count($table_fields) == 0) { + $this->raiseError(DB_ERROR_NEED_MORE_DATA); + } + $first = true; + switch ($mode) { + case DB_AUTOQUERY_INSERT: + $values = ''; + $names = ''; + foreach ($table_fields as $value) { + if ($first) { + $first = false; + } else { + $names .= ','; + $values .= ','; + } + $names .= $value; + $values .= '?'; + } + return "INSERT INTO $table ($names) VALUES ($values)"; + case DB_AUTOQUERY_UPDATE: + $set = ''; + foreach ($table_fields as $value) { + if ($first) { + $first = false; + } else { + $set .= ','; + } + $set .= "$value = ?"; + } + $sql = "UPDATE $table SET $set"; + if ($where) { + $sql .= " WHERE $where"; + } + return $sql; + default: + $this->raiseError(DB_ERROR_SYNTAX); + } + } + + // }}} + // {{{ execute() + + /** + * Executes a DB statement prepared with prepare() + * + * Example 1. + * prepare('INSERT INTO tbl (a, b, c) VALUES (?, !, &)'); + * $data = array( + * "John's text", + * "'it''s good'", + * 'filename.txt' + * ); + * $res =& $dbh->execute($sth, $data); + * ?> + * + * @param resource $stmt a DB statement resource returned from prepare() + * @param mixed $data array, string or numeric data to be used in + * execution of the statement. Quantity of items + * passed must match quantity of placeholders in + * query: meaning 1 placeholder for non-array + * parameters or 1 placeholder per array element. + * + * @return object a new DB_Result or a DB_Error when fail + * + * {@internal ibase and oci8 have their own execute() methods.}} + * + * @see DB_common::prepare() + * @access public + */ + function &execute($stmt, $data = array()) + { + $realquery = $this->executeEmulateQuery($stmt, $data); + if (DB::isError($realquery)) { + return $realquery; + } + $result = $this->simpleQuery($realquery); + + if (DB::isError($result) || $result === DB_OK) { + return $result; + } else { + $tmp =& new DB_result($this, $result); + return $tmp; + } + } + + // }}} + // {{{ executeEmulateQuery() + + /** + * Emulates the execute statement, when not supported + * + * @param resource $stmt a DB statement resource returned from execute() + * @param mixed $data array, string or numeric data to be used in + * execution of the statement. Quantity of items + * passed must match quantity of placeholders in + * query: meaning 1 placeholder for non-array + * parameters or 1 placeholder per array element. + * + * @return mixed a string containing the real query run when emulating + * prepare/execute. A DB error code is returned on failure. + * + * @see DB_common::execute() + * @access private + */ + function executeEmulateQuery($stmt, $data = array()) + { + $stmt = (int)$stmt; + if (!is_array($data)) { + $data = array($data); + } + + if (count($this->prepare_types[$stmt]) != count($data)) { + $this->last_query = $this->prepared_queries[$stmt]; + return $this->raiseError(DB_ERROR_MISMATCH); + } + + $realquery = $this->prepare_tokens[$stmt][0]; + + $i = 0; + foreach ($data as $value) { + if ($this->prepare_types[$stmt][$i] == DB_PARAM_SCALAR) { + $realquery .= $this->quoteSmart($value); + } elseif ($this->prepare_types[$stmt][$i] == DB_PARAM_OPAQUE) { + $fp = @fopen($value, 'rb'); + if (!$fp) { + return $this->raiseError(DB_ERROR_ACCESS_VIOLATION); + } + $realquery .= $this->quoteSmart(fread($fp, filesize($value))); + fclose($fp); + } else { + $realquery .= $value; + } + + $realquery .= $this->prepare_tokens[$stmt][++$i]; + } + + return $realquery; + } + + // }}} + // {{{ executeMultiple() + + /** + * This function does several execute() calls on the same + * statement handle + * + * $data must be an array indexed numerically + * from 0, one execute call is done for every "row" in the array. + * + * If an error occurs during execute(), executeMultiple() does not + * execute the unfinished rows, but rather returns that error. + * + * @param resource $stmt query handle from prepare() + * @param array $data numeric array containing the + * data to insert into the query + * + * @return mixed DB_OK or DB_Error + * + * @see DB_common::prepare(), DB_common::execute() + * @access public + */ + function executeMultiple($stmt, $data) + { + foreach ($data as $value) { + $res =& $this->execute($stmt, $value); + if (DB::isError($res)) { + return $res; + } + } + return DB_OK; + } + + // }}} + // {{{ freePrepared() + + /** + * Free the resource used in a prepared query + * + * @param $stmt The resurce returned by the prepare() function + * @see DB_common::prepare() + */ + function freePrepared($stmt) + { + $stmt = (int)$stmt; + // Free the internal prepared vars + if (isset($this->prepare_tokens[$stmt])) { + unset($this->prepare_tokens[$stmt]); + unset($this->prepare_types[$stmt]); + unset($this->prepared_queries[$stmt]); + return true; + } + return false; + } + + // }}} + // {{{ modifyQuery() + + /** + * This method is used by backends to alter queries for various + * reasons + * + * It is defined here to assure that all implementations + * have this method defined. + * + * @param string $query query to modify + * + * @return the new (modified) query + * + * @access private + */ + function modifyQuery($query) { + return $query; + } + + // }}} + // {{{ modifyLimitQuery() + + /** + * This method is used by backends to alter limited queries + * + * @param string $query query to modify + * @param integer $from the row to start to fetching + * @param integer $count the numbers of rows to fetch + * + * @return the new (modified) query + * + * @access private + */ + function modifyLimitQuery($query, $from, $count, $params = array()) + { + return $query; + } + + // }}} + // {{{ query() + + /** + * Send a query to the database and return any results with a + * DB_result object + * + * The query string can be either a normal statement to be sent directly + * to the server OR if $params are passed the query can have + * placeholders and it will be passed through prepare() and execute(). + * + * @param string $query the SQL query or the statement to prepare + * @param mixed $params array, string or numeric data to be used in + * execution of the statement. Quantity of items + * passed must match quantity of placeholders in + * query: meaning 1 placeholder for non-array + * parameters or 1 placeholder per array element. + * + * @return mixed a DB_result object or DB_OK on success, a DB + * error on failure + * + * @see DB_result, DB_common::prepare(), DB_common::execute() + * @access public + */ + function &query($query, $params = array()) + { + if (sizeof($params) > 0) { + $sth = $this->prepare($query); + if (DB::isError($sth)) { + return $sth; + } + $ret =& $this->execute($sth, $params); + $this->freePrepared($sth); + return $ret; + } else { + $result = $this->simpleQuery($query); + if (DB::isError($result) || $result === DB_OK) { + return $result; + } else { + $tmp =& new DB_result($this, $result); + return $tmp; + } + } + } + + // }}} + // {{{ limitQuery() + + /** + * Generates a limited query + * + * @param string $query query + * @param integer $from the row to start to fetching + * @param integer $count the numbers of rows to fetch + * @param mixed $params array, string or numeric data to be used in + * execution of the statement. Quantity of items + * passed must match quantity of placeholders in + * query: meaning 1 placeholder for non-array + * parameters or 1 placeholder per array element. + * + * @return mixed a DB_Result object, DB_OK or a DB_Error + * + * @access public + */ + function &limitQuery($query, $from, $count, $params = array()) + { + $query = $this->modifyLimitQuery($query, $from, $count, $params); + if (DB::isError($query)){ + return $query; + } + $result =& $this->query($query, $params); + if (is_a($result, 'DB_result')) { + $result->setOption('limit_from', $from); + $result->setOption('limit_count', $count); + } + return $result; + } + + // }}} + // {{{ getOne() + + /** + * Fetch the first column of the first row of data returned from + * a query + * + * Takes care of doing the query and freeing the results when finished. + * + * @param string $query the SQL query + * @param mixed $params array, string or numeric data to be used in + * execution of the statement. Quantity of items + * passed must match quantity of placeholders in + * query: meaning 1 placeholder for non-array + * parameters or 1 placeholder per array element. + * + * @return mixed the returned value of the query. DB_Error on failure. + * + * @access public + */ + function &getOne($query, $params = array()) + { + settype($params, 'array'); + if (sizeof($params) > 0) { + $sth = $this->prepare($query); + if (DB::isError($sth)) { + return $sth; + } + $res =& $this->execute($sth, $params); + $this->freePrepared($sth); + } else { + $res =& $this->query($query); + } + + if (DB::isError($res)) { + return $res; + } + + $err = $res->fetchInto($row, DB_FETCHMODE_ORDERED); + $res->free(); + + if ($err !== DB_OK) { + return $err; + } + + return $row[0]; + } + + // }}} + // {{{ getRow() + + /** + * Fetch the first row of data returned from a query + * + * Takes care of doing the query and freeing the results when finished. + * + * @param string $query the SQL query + * @param array $params array to be used in execution of the statement. + * Quantity of array elements must match quantity + * of placeholders in query. This function does + * NOT support scalars. + * @param int $fetchmode the fetch mode to use + * + * @return array the first row of results as an array indexed from + * 0, or a DB error code. + * + * @access public + */ + function &getRow($query, + $params = array(), + $fetchmode = DB_FETCHMODE_DEFAULT) + { + // compat check, the params and fetchmode parameters used to + // have the opposite order + if (!is_array($params)) { + if (is_array($fetchmode)) { + if ($params === null) { + $tmp = DB_FETCHMODE_DEFAULT; + } else { + $tmp = $params; + } + $params = $fetchmode; + $fetchmode = $tmp; + } elseif ($params !== null) { + $fetchmode = $params; + $params = array(); + } + } + + if (sizeof($params) > 0) { + $sth = $this->prepare($query); + if (DB::isError($sth)) { + return $sth; + } + $res =& $this->execute($sth, $params); + $this->freePrepared($sth); + } else { + $res =& $this->query($query); + } + + if (DB::isError($res)) { + return $res; + } + + $err = $res->fetchInto($row, $fetchmode); + + $res->free(); + + if ($err !== DB_OK) { + return $err; + } + + return $row; + } + + // }}} + // {{{ getCol() + + /** + * Fetch a single column from a result set and return it as an + * indexed array + * + * @param string $query the SQL query + * @param mixed $col which column to return (integer [column number, + * starting at 0] or string [column name]) + * @param mixed $params array, string or numeric data to be used in + * execution of the statement. Quantity of items + * passed must match quantity of placeholders in + * query: meaning 1 placeholder for non-array + * parameters or 1 placeholder per array element. + * + * @return array an indexed array with the data from the first + * row at index 0, or a DB error code + * + * @see DB_common::query() + * @access public + */ + function &getCol($query, $col = 0, $params = array()) + { + settype($params, 'array'); + if (sizeof($params) > 0) { + $sth = $this->prepare($query); + + if (DB::isError($sth)) { + return $sth; + } + + $res =& $this->execute($sth, $params); + $this->freePrepared($sth); + } else { + $res =& $this->query($query); + } + + if (DB::isError($res)) { + return $res; + } + + $fetchmode = is_int($col) ? DB_FETCHMODE_ORDERED : DB_FETCHMODE_ASSOC; + + if (!is_array($row = $res->fetchRow($fetchmode))) { + $ret = array(); + } else { + if (!array_key_exists($col, $row)) { + $ret =& $this->raiseError(DB_ERROR_NOSUCHFIELD); + } else { + $ret = array($row[$col]); + while (is_array($row = $res->fetchRow($fetchmode))) { + $ret[] = $row[$col]; + } + } + } + + $res->free(); + + if (DB::isError($row)) { + $ret = $row; + } + + return $ret; + } + + // }}} + // {{{ getAssoc() + + /** + * Fetch the entire result set of a query and return it as an + * associative array using the first column as the key + * + * If the result set contains more than two columns, the value + * will be an array of the values from column 2-n. If the result + * set contains only two columns, the returned value will be a + * scalar with the value of the second column (unless forced to an + * array with the $force_array parameter). A DB error code is + * returned on errors. If the result set contains fewer than two + * columns, a DB_ERROR_TRUNCATED error is returned. + * + * For example, if the table "mytable" contains: + * + *
    +     *  ID      TEXT       DATE
    +     * --------------------------------
    +     *  1       'one'      944679408
    +     *  2       'two'      944679408
    +     *  3       'three'    944679408
    +     * 
    + * + * Then the call getAssoc('SELECT id,text FROM mytable') returns: + *
    +     *   array(
    +     *     '1' => 'one',
    +     *     '2' => 'two',
    +     *     '3' => 'three',
    +     *   )
    +     * 
    + * + * ...while the call getAssoc('SELECT id,text,date FROM mytable') returns: + *
    +     *   array(
    +     *     '1' => array('one', '944679408'),
    +     *     '2' => array('two', '944679408'),
    +     *     '3' => array('three', '944679408')
    +     *   )
    +     * 
    + * + * If the more than one row occurs with the same value in the + * first column, the last row overwrites all previous ones by + * default. Use the $group parameter if you don't want to + * overwrite like this. Example: + * + *
    +     * getAssoc('SELECT category,id,name FROM mytable', false, null,
    +     *          DB_FETCHMODE_ASSOC, true) returns:
    +     *
    +     *   array(
    +     *     '1' => array(array('id' => '4', 'name' => 'number four'),
    +     *                  array('id' => '6', 'name' => 'number six')
    +     *            ),
    +     *     '9' => array(array('id' => '4', 'name' => 'number four'),
    +     *                  array('id' => '6', 'name' => 'number six')
    +     *            )
    +     *   )
    +     * 
    + * + * Keep in mind that database functions in PHP usually return string + * values for results regardless of the database's internal type. + * + * @param string $query the SQL query + * @param boolean $force_array used only when the query returns + * exactly two columns. If true, the values + * of the returned array will be one-element + * arrays instead of scalars. + * @param mixed $params array, string or numeric data to be used in + * execution of the statement. Quantity of items + * passed must match quantity of placeholders in + * query: meaning 1 placeholder for non-array + * parameters or 1 placeholder per array element. + * @param int $fetchmode the fetch mode to use + * @param boolean $group if true, the values of the returned array + * is wrapped in another array. If the same + * key value (in the first column) repeats + * itself, the values will be appended to + * this array instead of overwriting the + * existing values. + * + * @return array associative array with results from the query. + * DB Error on failure. + * + * @access public + */ + function &getAssoc($query, $force_array = false, $params = array(), + $fetchmode = DB_FETCHMODE_DEFAULT, $group = false) + { + settype($params, 'array'); + if (sizeof($params) > 0) { + $sth = $this->prepare($query); + + if (DB::isError($sth)) { + return $sth; + } + + $res =& $this->execute($sth, $params); + $this->freePrepared($sth); + } else { + $res =& $this->query($query); + } + + if (DB::isError($res)) { + return $res; + } + if ($fetchmode == DB_FETCHMODE_DEFAULT) { + $fetchmode = $this->fetchmode; + } + $cols = $res->numCols(); + + if ($cols < 2) { + $tmp =& $this->raiseError(DB_ERROR_TRUNCATED); + return $tmp; + } + + $results = array(); + + if ($cols > 2 || $force_array) { + // return array values + // XXX this part can be optimized + if ($fetchmode == DB_FETCHMODE_ASSOC) { + while (is_array($row = $res->fetchRow(DB_FETCHMODE_ASSOC))) { + reset($row); + $key = current($row); + unset($row[key($row)]); + if ($group) { + $results[$key][] = $row; + } else { + $results[$key] = $row; + } + } + } elseif ($fetchmode == DB_FETCHMODE_OBJECT) { + while ($row = $res->fetchRow(DB_FETCHMODE_OBJECT)) { + $arr = get_object_vars($row); + $key = current($arr); + if ($group) { + $results[$key][] = $row; + } else { + $results[$key] = $row; + } + } + } else { + while (is_array($row = $res->fetchRow(DB_FETCHMODE_ORDERED))) { + // we shift away the first element to get + // indices running from 0 again + $key = array_shift($row); + if ($group) { + $results[$key][] = $row; + } else { + $results[$key] = $row; + } + } + } + if (DB::isError($row)) { + $results = $row; + } + } else { + // return scalar values + while (is_array($row = $res->fetchRow(DB_FETCHMODE_ORDERED))) { + if ($group) { + $results[$row[0]][] = $row[1]; + } else { + $results[$row[0]] = $row[1]; + } + } + if (DB::isError($row)) { + $results = $row; + } + } + + $res->free(); + + return $results; + } + + // }}} + // {{{ getAll() + + /** + * Fetch all the rows returned from a query + * + * @param string $query the SQL query + * @param array $params array to be used in execution of the statement. + * Quantity of array elements must match quantity + * of placeholders in query. This function does + * NOT support scalars. + * @param int $fetchmode the fetch mode to use + * + * @return array an nested array. DB error on failure. + * + * @access public + */ + function &getAll($query, + $params = array(), + $fetchmode = DB_FETCHMODE_DEFAULT) + { + // compat check, the params and fetchmode parameters used to + // have the opposite order + if (!is_array($params)) { + if (is_array($fetchmode)) { + if ($params === null) { + $tmp = DB_FETCHMODE_DEFAULT; + } else { + $tmp = $params; + } + $params = $fetchmode; + $fetchmode = $tmp; + } elseif ($params !== null) { + $fetchmode = $params; + $params = array(); + } + } + + if (sizeof($params) > 0) { + $sth = $this->prepare($query); + + if (DB::isError($sth)) { + return $sth; + } + + $res =& $this->execute($sth, $params); + $this->freePrepared($sth); + } else { + $res =& $this->query($query); + } + + if (DB::isError($res) || $res === DB_OK) { + return $res; + } + + $results = array(); + while (DB_OK === $res->fetchInto($row, $fetchmode)) { + if ($fetchmode & DB_FETCHMODE_FLIPPED) { + foreach ($row as $key => $val) { + $results[$key][] = $val; + } + } else { + $results[] = $row; + } + } + + $res->free(); + + if (DB::isError($row)) { + $tmp =& $this->raiseError($row); + return $tmp; + } + return $results; + } + + // }}} + // {{{ autoCommit() + + /** + * enable automatic Commit + * + * @param boolean $onoff + * @return mixed DB_Error + * + * @access public + */ + function autoCommit($onoff=false) + { + return $this->raiseError(DB_ERROR_NOT_CAPABLE); + } + + // }}} + // {{{ commit() + + /** + * starts a Commit + * + * @return mixed DB_Error + * + * @access public + */ + function commit() + { + return $this->raiseError(DB_ERROR_NOT_CAPABLE); + } + + // }}} + // {{{ rollback() + + /** + * starts a rollback + * + * @return mixed DB_Error + * + * @access public + */ + function rollback() + { + return $this->raiseError(DB_ERROR_NOT_CAPABLE); + } + + // }}} + // {{{ numRows() + + /** + * Returns the number of rows in a result object + * + * @param object DB_Result the result object to check + * + * @return mixed DB_Error or the number of rows + * + * @access public + */ + function numRows($result) + { + return $this->raiseError(DB_ERROR_NOT_CAPABLE); + } + + // }}} + // {{{ affectedRows() + + /** + * Returns the affected rows of a query + * + * @return mixed DB_Error or number of rows + * + * @access public + */ + function affectedRows() + { + return $this->raiseError(DB_ERROR_NOT_CAPABLE); + } + + // }}} + // {{{ errorNative() + + /** + * Returns an errormessage, provides by the database + * + * @return mixed DB_Error or message + * + * @access public + */ + function errorNative() + { + return $this->raiseError(DB_ERROR_NOT_CAPABLE); + } + + // }}} + // {{{ getSequenceName() + + /** + * Generate the name used inside the database for a sequence + * + * The createSequence() docblock contains notes about storing sequence + * names. + * + * @param string $sqn the sequence's public name + * + * @return string the sequence's name in the backend + * + * @see DB_common::createSequence(), DB_common::dropSequence(), + * DB_common::nextID(), DB_common::setOption() + * @access private + */ + function getSequenceName($sqn) + { + return sprintf($this->getOption('seqname_format'), + preg_replace('/[^a-z0-9_.]/i', '_', $sqn)); + } + + // }}} + // {{{ nextId() + + /** + * Returns the next free id in a sequence + * + * @param string $seq_name name of the sequence + * @param boolean $ondemand when true, the seqence is automatically + * created if it does not exist + * + * @return int the next id number in the sequence. DB_Error if problem. + * + * @see DB_common::createSequence(), DB_common::dropSequence(), + * DB_common::getSequenceName() + * @access public + */ + function nextId($seq_name, $ondemand = true) + { + return $this->raiseError(DB_ERROR_NOT_CAPABLE); + } + + // }}} + // {{{ createSequence() + + /** + * Creates a new sequence + * + * The name of a given sequence is determined by passing the string + * provided in the $seq_name argument through PHP's sprintf() + * function using the value from the seqname_format option as + * the sprintf()'s format argument. + * + * seqname_format is set via setOption(). + * + * @param string $seq_name name of the new sequence + * + * @return int DB_OK on success. A DB_Error object is returned if + * problems arise. + * + * @see DB_common::dropSequence(), DB_common::getSequenceName(), + * DB_common::nextID() + * @access public + */ + function createSequence($seq_name) + { + return $this->raiseError(DB_ERROR_NOT_CAPABLE); + } + + // }}} + // {{{ dropSequence() + + /** + * Deletes a sequence + * + * @param string $seq_name name of the sequence to be deleted + * + * @return int DB_OK on success. DB_Error if problems. + * + * @see DB_common::createSequence(), DB_common::getSequenceName(), + * DB_common::nextID() + * @access public + */ + function dropSequence($seq_name) + { + return $this->raiseError(DB_ERROR_NOT_CAPABLE); + } + + // }}} + // {{{ tableInfo() + + /** + * Returns information about a table or a result set + * + * The format of the resulting array depends on which $mode + * you select. The sample output below is based on this query: + *
    +     *    SELECT tblFoo.fldID, tblFoo.fldPhone, tblBar.fldId
    +     *    FROM tblFoo
    +     *    JOIN tblBar ON tblFoo.fldId = tblBar.fldId
    +     * 
    + * + *
      + *
    • + * + * null (default) + *
      +     *   [0] => Array (
      +     *       [table] => tblFoo
      +     *       [name] => fldId
      +     *       [type] => int
      +     *       [len] => 11
      +     *       [flags] => primary_key not_null
      +     *   )
      +     *   [1] => Array (
      +     *       [table] => tblFoo
      +     *       [name] => fldPhone
      +     *       [type] => string
      +     *       [len] => 20
      +     *       [flags] =>
      +     *   )
      +     *   [2] => Array (
      +     *       [table] => tblBar
      +     *       [name] => fldId
      +     *       [type] => int
      +     *       [len] => 11
      +     *       [flags] => primary_key not_null
      +     *   )
      +     *   
      + * + *
    • + * + * DB_TABLEINFO_ORDER + * + *

      In addition to the information found in the default output, + * a notation of the number of columns is provided by the + * num_fields element while the order + * element provides an array with the column names as the keys and + * their location index number (corresponding to the keys in the + * the default output) as the values.

      + * + *

      If a result set has identical field names, the last one is + * used.

      + * + *
      +     *   [num_fields] => 3
      +     *   [order] => Array (
      +     *       [fldId] => 2
      +     *       [fldTrans] => 1
      +     *   )
      +     *   
      + * + *
    • + * + * DB_TABLEINFO_ORDERTABLE + * + *

      Similar to DB_TABLEINFO_ORDER but adds more + * dimensions to the array in which the table names are keys and + * the field names are sub-keys. This is helpful for queries that + * join tables which have identical field names.

      + * + *
      +     *   [num_fields] => 3
      +     *   [ordertable] => Array (
      +     *       [tblFoo] => Array (
      +     *           [fldId] => 0
      +     *           [fldPhone] => 1
      +     *       )
      +     *       [tblBar] => Array (
      +     *           [fldId] => 2
      +     *       )
      +     *   )
      +     *   
      + * + *
    • + *
    + * + * The flags element contains a space separated list + * of extra information about the field. This data is inconsistent + * between DBMS's due to the way each DBMS works. + * + primary_key + * + unique_key + * + multiple_key + * + not_null + * + * Most DBMS's only provide the table and flags + * elements if $result is a table name. The following DBMS's + * provide full information from queries: + * + fbsql + * + mysql + * + * If the 'portability' option has DB_PORTABILITY_LOWERCASE + * turned on, the names of tables and fields will be lowercased. + * + * @param object|string $result DB_result object from a query or a + * string containing the name of a table. + * While this also accepts a query result + * resource identifier, this behavior is + * deprecated. + * @param int $mode either unused or one of the tableInfo modes: + * DB_TABLEINFO_ORDERTABLE, + * DB_TABLEINFO_ORDER or + * DB_TABLEINFO_FULL (which does both). + * These are bitwise, so the first two can be + * combined using |. + * @return array an associative array with the information requested. + * If something goes wrong an error object is returned. + * + * @see DB_common::setOption() + * @access public + */ + function tableInfo($result, $mode = null) + { + /* + * If the DB_ class has a tableInfo() method, that one + * overrides this one. But, if the driver doesn't have one, + * this method runs and tells users about that fact. + */ + return $this->raiseError(DB_ERROR_NOT_CAPABLE); + } + + // }}} + // {{{ getTables() + + /** + * @deprecated Deprecated in release 1.2 or lower + */ + function getTables() + { + return $this->getListOf('tables'); + } + + // }}} + // {{{ getListOf() + + /** + * list internal DB info + * valid values for $type are db dependent, + * often: databases, users, view, functions + * + * @param string $type type of requested info + * + * @return mixed DB_Error or the requested data + * + * @access public + */ + function getListOf($type) + { + $sql = $this->getSpecialQuery($type); + if ($sql === null) { // No support + return $this->raiseError(DB_ERROR_UNSUPPORTED); + } elseif (is_int($sql) || DB::isError($sql)) { // Previous error + return $this->raiseError($sql); + } elseif (is_array($sql)) { // Already the result + return $sql; + } + return $this->getCol($sql); // Launch this query + } + + // }}} + // {{{ getSpecialQuery() + + /** + * Returns the query needed to get some backend info + * + * @param string $type What kind of info you want to retrieve + * + * @return string The SQL query string + * + * @access public + */ + function getSpecialQuery($type) + { + return $this->raiseError(DB_ERROR_UNSUPPORTED); + } + + // }}} + // {{{ _rtrimArrayValues() + + /** + * Right trim all strings in an array + * + * @param array $array the array to be trimmed (passed by reference) + * @return void + * @access private + */ + function _rtrimArrayValues(&$array) + { + foreach ($array as $key => $value) { + if (is_string($value)) { + $array[$key] = rtrim($value); + } + } + } + + // }}} + // {{{ _convertNullArrayValuesToEmpty() + + /** + * Convert all null values in an array to empty strings + * + * @param array $array the array to be de-nullified (passed by reference) + * @return void + * @access private + */ + function _convertNullArrayValuesToEmpty(&$array) + { + foreach ($array as $key => $value) { + if (is_null($value)) { + $array[$key] = ''; + } + } + } + + // }}} +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + */ + +?> diff --git a/thirdparty/pear/DB/dbase.php b/thirdparty/pear/DB/dbase.php new file mode 100644 index 000000000..89b27a16d --- /dev/null +++ b/thirdparty/pear/DB/dbase.php @@ -0,0 +1,225 @@ + | +// | Maintainer: Daniel Convissor | +// +----------------------------------------------------------------------+ +// +// $Id: dbase.php 3355 2005-06-11 22:14:40Z nbm $ + + +// XXX legend: +// You have to compile your PHP with the --enable-dbase option + + +require_once 'DB/common.php'; + +/** + * Database independent query interface definition for PHP's dbase + * extension. + * + * @package DB + * @version $Id: dbase.php 3355 2005-06-11 22:14:40Z nbm $ + * @category Database + * @author Stig Bakken + */ +class DB_dbase extends DB_common +{ + // {{{ properties + + var $connection; + var $phptype, $dbsyntax; + var $prepare_tokens = array(); + var $prepare_types = array(); + var $res_row = array(); + var $result = 0; + + // }}} + // {{{ constructor + + /** + * DB_mysql constructor. + * + * @access public + */ + function DB_dbase() + { + $this->DB_common(); + $this->phptype = 'dbase'; + $this->dbsyntax = 'dbase'; + $this->features = array( + 'prepare' => false, + 'pconnect' => false, + 'transactions' => false, + 'limit' => false + ); + $this->errorcode_map = array(); + } + + // }}} + // {{{ connect() + + function connect($dsninfo, $persistent = false) + { + if (!DB::assertExtension('dbase')) { + return $this->raiseError(DB_ERROR_EXTENSION_NOT_FOUND); + } + $this->dsn = $dsninfo; + + $ini = ini_get('track_errors'); + if ($ini) { + $conn = @dbase_open($dsninfo['database'], 0); + } else { + ini_set('track_errors', 1); + $conn = @dbase_open($dsninfo['database'], 0); + ini_set('track_errors', $ini); + } + if (!$conn) { + return $this->raiseError(DB_ERROR_CONNECT_FAILED, null, + null, null, strip_tags($php_errormsg)); + } + $this->connection = $conn; + return DB_OK; + } + + // }}} + // {{{ disconnect() + + function disconnect() + { + $ret = @dbase_close($this->connection); + $this->connection = null; + return $ret; + } + + // }}} + // {{{ &query() + + function &query($query = null) + { + // emulate result resources + $this->res_row[(int)$this->result] = 0; + $tmp =& new DB_result($this, $this->result++); + return $tmp; + } + + // }}} + // {{{ fetchInto() + + /** + * Fetch a row and insert the data into an existing array. + * + * Formating of the array and the data therein are configurable. + * See DB_result::fetchInto() for more information. + * + * @param resource $result query result identifier + * @param array $arr (reference) array where data from the row + * should be placed + * @param int $fetchmode how the resulting array should be indexed + * @param int $rownum the row number to fetch + * + * @return mixed DB_OK on success, null when end of result set is + * reached or on failure + * + * @see DB_result::fetchInto() + * @access private + */ + function fetchInto($result, &$arr, $fetchmode, $rownum=null) + { + if ($rownum === null) { + $rownum = $this->res_row[(int)$result]++; + } + if ($fetchmode & DB_FETCHMODE_ASSOC) { + $arr = @dbase_get_record_with_names($this->connection, $rownum); + if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE && $arr) { + $arr = array_change_key_case($arr, CASE_LOWER); + } + } else { + $arr = @dbase_get_record($this->connection, $rownum); + } + if (!$arr) { + return null; + } + if ($this->options['portability'] & DB_PORTABILITY_RTRIM) { + $this->_rtrimArrayValues($arr); + } + if ($this->options['portability'] & DB_PORTABILITY_NULL_TO_EMPTY) { + $this->_convertNullArrayValuesToEmpty($arr); + } + return DB_OK; + } + + // }}} + // {{{ numCols() + + function numCols($foo) + { + return @dbase_numfields($this->connection); + } + + // }}} + // {{{ numRows() + + function numRows($foo) + { + return @dbase_numrecords($this->connection); + } + + // }}} + // {{{ quoteSmart() + + /** + * Format input so it can be safely used in a query + * + * @param mixed $in data to be quoted + * + * @return mixed Submitted variable's type = returned value: + * + null = the string NULL + * + boolean = T if true or + * F if false. Use the Logical + * data type. + * + integer or double = the unquoted number + * + other (including strings and numeric strings) = + * the data with single quotes escaped by preceeding + * single quotes then the whole string is encapsulated + * between single quotes + * + * @internal + */ + function quoteSmart($in) + { + if (is_int($in) || is_double($in)) { + return $in; + } elseif (is_bool($in)) { + return $in ? 'T' : 'F'; + } elseif (is_null($in)) { + return 'NULL'; + } else { + return "'" . $this->escapeSimple($in) . "'"; + } + } + + // }}} + +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + */ + +?> diff --git a/thirdparty/pear/DB/fbsql.php b/thirdparty/pear/DB/fbsql.php new file mode 100644 index 000000000..540580a79 --- /dev/null +++ b/thirdparty/pear/DB/fbsql.php @@ -0,0 +1,655 @@ + | +// | Maintainer: Daniel Convissor | +// +----------------------------------------------------------------------+ +// +// $Id: fbsql.php 3355 2005-06-11 22:14:40Z nbm $ + + +// XXX legend: +// +// XXX ERRORMSG: The error message from the fbsql function should +// be registered here. +// +// TODO/wishlist: +// longReadlen +// binmode + + +require_once 'DB/common.php'; + +/** + * Database independent query interface definition for PHP's FrontBase + * extension. + * + * @package DB + * @version $Id: fbsql.php 3355 2005-06-11 22:14:40Z nbm $ + * @category Database + * @author Frank M. Kromann + */ +class DB_fbsql extends DB_common +{ + // {{{ properties + + var $connection; + var $phptype, $dbsyntax; + var $prepare_tokens = array(); + var $prepare_types = array(); + var $num_rows = array(); + var $fetchmode = DB_FETCHMODE_ORDERED; /* Default fetch mode */ + + // }}} + // {{{ constructor + + /** + * DB_fbsql constructor. + * + * @access public + */ + function DB_fbsql() + { + $this->DB_common(); + $this->phptype = 'fbsql'; + $this->dbsyntax = 'fbsql'; + $this->features = array( + 'prepare' => false, + 'pconnect' => true, + 'transactions' => true, + 'limit' => 'emulate' + ); + $this->errorcode_map = array( + 1004 => DB_ERROR_CANNOT_CREATE, + 1005 => DB_ERROR_CANNOT_CREATE, + 1006 => DB_ERROR_CANNOT_CREATE, + 1007 => DB_ERROR_ALREADY_EXISTS, + 1008 => DB_ERROR_CANNOT_DROP, + 1046 => DB_ERROR_NODBSELECTED, + 1050 => DB_ERROR_ALREADY_EXISTS, + 1051 => DB_ERROR_NOSUCHTABLE, + 1054 => DB_ERROR_NOSUCHFIELD, + 1062 => DB_ERROR_ALREADY_EXISTS, + 1064 => DB_ERROR_SYNTAX, + 1100 => DB_ERROR_NOT_LOCKED, + 1136 => DB_ERROR_VALUE_COUNT_ON_ROW, + 1146 => DB_ERROR_NOSUCHTABLE, + ); + } + + // }}} + // {{{ connect() + + /** + * Connect to a database and log in as the specified user. + * + * @param $dsn the data source name (see DB::parseDSN for syntax) + * @param $persistent (optional) whether the connection should + * be persistent + * @access public + * @return int DB_OK on success, a DB error on failure + */ + function connect($dsninfo, $persistent = false) + { + if (!DB::assertExtension('fbsql')) { + return $this->raiseError(DB_ERROR_EXTENSION_NOT_FOUND); + } + + $this->dsn = $dsninfo; + $dbhost = $dsninfo['hostspec'] ? $dsninfo['hostspec'] : 'localhost'; + + $php_errormsg = ''; + $connect_function = $persistent ? 'fbsql_pconnect' : 'fbsql_connect'; + + if ($dbhost && $dsninfo['username'] && $dsninfo['password']) { + $conn = @$connect_function($dbhost, $dsninfo['username'], + $dsninfo['password']); + } elseif ($dbhost && $dsninfo['username']) { + $conn = @$connect_function($dbhost, $dsninfo['username']); + } elseif ($dbhost) { + $conn = @$connect_function($dbhost); + } else { + $conn = false; + } + if (!$conn) { + if (empty($php_errormsg)) { + return $this->raiseError(DB_ERROR_CONNECT_FAILED); + } else { + return $this->raiseError(DB_ERROR_CONNECT_FAILED, null, null, + null, $php_errormsg); + } + } + + if ($dsninfo['database']) { + if (!fbsql_select_db($dsninfo['database'], $conn)) { + return $this->fbsqlRaiseError(); + } + } + + $this->connection = $conn; + return DB_OK; + } + + // }}} + // {{{ disconnect() + + /** + * Log out and disconnect from the database. + * + * @access public + * + * @return bool true on success, false if not connected. + */ + function disconnect() + { + $ret = @fbsql_close($this->connection); + $this->connection = null; + return $ret; + } + + // }}} + // {{{ simpleQuery() + + /** + * Send a query to fbsql and return the results as a fbsql resource + * identifier. + * + * @param the SQL query + * + * @access public + * + * @return mixed returns a valid fbsql result for successful SELECT + * queries, DB_OK for other successful queries. A DB error is + * returned on failure. + */ + function simpleQuery($query) + { + $this->last_query = $query; + $query = $this->modifyQuery($query); + $result = @fbsql_query("$query;", $this->connection); + if (!$result) { + return $this->fbsqlRaiseError(); + } + // Determine which queries that should return data, and which + // should return an error code only. + if (DB::isManip($query)) { + return DB_OK; + } + $numrows = $this->numrows($result); + if (is_object($numrows)) { + return $numrows; + } + $this->num_rows[(int)$result] = $numrows; + return $result; + } + + // }}} + // {{{ nextResult() + + /** + * Move the internal fbsql result pointer to the next available result + * + * @param a valid fbsql result resource + * + * @access public + * + * @return true if a result is available otherwise return false + */ + function nextResult($result) + { + return @fbsql_next_result($result); + } + + // }}} + // {{{ fetchInto() + + /** + * Fetch a row and insert the data into an existing array. + * + * Formating of the array and the data therein are configurable. + * See DB_result::fetchInto() for more information. + * + * @param resource $result query result identifier + * @param array $arr (reference) array where data from the row + * should be placed + * @param int $fetchmode how the resulting array should be indexed + * @param int $rownum the row number to fetch + * + * @return mixed DB_OK on success, null when end of result set is + * reached or on failure + * + * @see DB_result::fetchInto() + * @access private + */ + function fetchInto($result, &$arr, $fetchmode, $rownum=null) + { + if ($rownum !== null) { + if (!@fbsql_data_seek($result, $rownum)) { + return null; + } + } + if ($fetchmode & DB_FETCHMODE_ASSOC) { + $arr = @fbsql_fetch_array($result, FBSQL_ASSOC); + if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE && $arr) { + $arr = array_change_key_case($arr, CASE_LOWER); + } + } else { + $arr = @fbsql_fetch_row($result); + } + if (!$arr) { + $errno = @fbsql_errno($this->connection); + if (!$errno) { + return null; + } + return $this->fbsqlRaiseError($errno); + } + if ($this->options['portability'] & DB_PORTABILITY_RTRIM) { + $this->_rtrimArrayValues($arr); + } + if ($this->options['portability'] & DB_PORTABILITY_NULL_TO_EMPTY) { + $this->_convertNullArrayValuesToEmpty($arr); + } + return DB_OK; + } + + // }}} + // {{{ freeResult() + + /** + * Free the internal resources associated with $result. + * + * @param $result fbsql result identifier + * + * @access public + * + * @return bool true on success, false if $result is invalid + */ + function freeResult($result) + { + return @fbsql_free_result($result); + } + + // }}} + // {{{ autoCommit() + + function autoCommit($onoff=false) + { + if ($onoff) { + $this->query("SET COMMIT TRUE"); + } else { + $this->query("SET COMMIT FALSE"); + } + } + + // }}} + // {{{ commit() + + function commit() + { + @fbsql_commit(); + } + + // }}} + // {{{ rollback() + + function rollback() + { + @fbsql_rollback(); + } + + // }}} + // {{{ numCols() + + /** + * Get the number of columns in a result set. + * + * @param $result fbsql result identifier + * + * @access public + * + * @return int the number of columns per row in $result + */ + function numCols($result) + { + $cols = @fbsql_num_fields($result); + + if (!$cols) { + return $this->fbsqlRaiseError(); + } + + return $cols; + } + + // }}} + // {{{ numRows() + + /** + * Get the number of rows in a result set. + * + * @param $result fbsql result identifier + * + * @access public + * + * @return int the number of rows in $result + */ + function numRows($result) + { + $rows = @fbsql_num_rows($result); + if ($rows === null) { + return $this->fbsqlRaiseError(); + } + return $rows; + } + + // }}} + // {{{ affectedRows() + + /** + * Gets the number of rows affected by the data manipulation + * query. For other queries, this function returns 0. + * + * @return number of rows affected by the last query + */ + function affectedRows() + { + if (DB::isManip($this->last_query)) { + $result = @fbsql_affected_rows($this->connection); + } else { + $result = 0; + } + return $result; + } + + // }}} + // {{{ errorNative() + + /** + * Get the native error code of the last error (if any) that + * occured on the current connection. + * + * @access public + * + * @return int native fbsql error code + */ + function errorNative() + { + return @fbsql_errno($this->connection); + } + + // }}} + // {{{ nextId() + + /** + * Returns the next free id in a sequence + * + * @param string $seq_name name of the sequence + * @param boolean $ondemand when true, the seqence is automatically + * created if it does not exist + * + * @return int the next id number in the sequence. DB_Error if problem. + * + * @internal + * @see DB_common::nextID() + * @access public + */ + function nextId($seq_name, $ondemand = true) + { + $seqname = $this->getSequenceName($seq_name); + $repeat = 0; + do { + $result = $this->query("INSERT INTO ${seqname} (id) VALUES (NULL)"); + if ($ondemand && DB::isError($result) && + $result->getCode() == DB_ERROR_NOSUCHTABLE) { + $repeat = 1; + $result = $this->createSequence($seq_name); + if (DB::isError($result)) { + return $result; + } + } else { + $repeat = 0; + } + } while ($repeat); + if (DB::isError($result)) { + return $result; + } + return @fbsql_insert_id($this->connection); + } + + /** + * Creates a new sequence + * + * @param string $seq_name name of the new sequence + * + * @return int DB_OK on success. A DB_Error object is returned if + * problems arise. + * + * @internal + * @see DB_common::createSequence() + * @access public + */ + function createSequence($seq_name) + { + $seqname = $this->getSequenceName($seq_name); + return $this->query("CREATE TABLE ${seqname} ". + '(id INTEGER UNSIGNED AUTO_INCREMENT NOT NULL,'. + ' PRIMARY KEY(id))'); + } + + // }}} + // {{{ dropSequence() + + /** + * Deletes a sequence + * + * @param string $seq_name name of the sequence to be deleted + * + * @return int DB_OK on success. DB_Error if problems. + * + * @internal + * @see DB_common::dropSequence() + * @access public + */ + function dropSequence($seq_name) + { + $seqname = $this->getSequenceName($seq_name); + return $this->query("DROP TABLE ${seqname} RESTRICT"); + } + + // }}} + // {{{ modifyQuery() + + function modifyQuery($query) + { + if ($this->options['portability'] & DB_PORTABILITY_DELETE_COUNT) { + // "DELETE FROM table" gives 0 affected rows in fbsql. + // This little hack lets you know how many rows were deleted. + if (preg_match('/^\s*DELETE\s+FROM\s+(\S+)\s*$/i', $query)) { + $query = preg_replace('/^\s*DELETE\s+FROM\s+(\S+)\s*$/', + 'DELETE FROM \1 WHERE 1=1', $query); + } + } + return $query; + } + + // }}} + // {{{ quoteSmart() + + /** + * Format input so it can be safely used in a query + * + * @param mixed $in data to be quoted + * + * @return mixed Submitted variable's type = returned value: + * + null = the string NULL + * + boolean = string TRUE or FALSE + * + integer or double = the unquoted number + * + other (including strings and numeric strings) = + * the data escaped according to MySQL's settings + * then encapsulated between single quotes + * + * @internal + */ + function quoteSmart($in) + { + if (is_int($in) || is_double($in)) { + return $in; + } elseif (is_bool($in)) { + return $in ? 'TRUE' : 'FALSE'; + } elseif (is_null($in)) { + return 'NULL'; + } else { + return "'" . $this->escapeSimple($in) . "'"; + } + } + + // }}} + // {{{ fbsqlRaiseError() + + /** + * Gather information about an error, then use that info to create a + * DB error object and finally return that object. + * + * @param integer $errno PEAR error number (usually a DB constant) if + * manually raising an error + * @return object DB error object + * @see DB_common::errorCode() + * @see DB_common::raiseError() + */ + function fbsqlRaiseError($errno = null) + { + if ($errno === null) { + $errno = $this->errorCode(fbsql_errno($this->connection)); + } + return $this->raiseError($errno, null, null, null, + @fbsql_error($this->connection)); + } + + // }}} + // {{{ tableInfo() + + /** + * Returns information about a table or a result set. + * + * @param object|string $result DB_result object from a query or a + * string containing the name of a table + * @param int $mode a valid tableInfo mode + * @return array an associative array with the information requested + * or an error object if something is wrong + * @access public + * @internal + * @see DB_common::tableInfo() + */ + function tableInfo($result, $mode = null) { + if (isset($result->result)) { + /* + * Probably received a result object. + * Extract the result resource identifier. + */ + $id = $result->result; + $got_string = false; + } elseif (is_string($result)) { + /* + * Probably received a table name. + * Create a result resource identifier. + */ + $id = @fbsql_list_fields($this->dsn['database'], + $result, $this->connection); + $got_string = true; + } else { + /* + * Probably received a result resource identifier. + * Copy it. + * Deprecated. Here for compatibility only. + */ + $id = $result; + $got_string = false; + } + + if (!is_resource($id)) { + return $this->fbsqlRaiseError(DB_ERROR_NEED_MORE_DATA); + } + + if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE) { + $case_func = 'strtolower'; + } else { + $case_func = 'strval'; + } + + $count = @fbsql_num_fields($id); + + // made this IF due to performance (one if is faster than $count if's) + if (!$mode) { + for ($i=0; $i<$count; $i++) { + $res[$i]['table'] = $case_func(@fbsql_field_table($id, $i)); + $res[$i]['name'] = $case_func(@fbsql_field_name($id, $i)); + $res[$i]['type'] = @fbsql_field_type($id, $i); + $res[$i]['len'] = @fbsql_field_len($id, $i); + $res[$i]['flags'] = @fbsql_field_flags($id, $i); + } + } else { // full + $res["num_fields"]= $count; + + for ($i=0; $i<$count; $i++) { + $res[$i]['table'] = $case_func(@fbsql_field_table($id, $i)); + $res[$i]['name'] = $case_func(@fbsql_field_name($id, $i)); + $res[$i]['type'] = @fbsql_field_type($id, $i); + $res[$i]['len'] = @fbsql_field_len($id, $i); + $res[$i]['flags'] = @fbsql_field_flags($id, $i); + + if ($mode & DB_TABLEINFO_ORDER) { + $res['order'][$res[$i]['name']] = $i; + } + if ($mode & DB_TABLEINFO_ORDERTABLE) { + $res['ordertable'][$res[$i]['table']][$res[$i]['name']] = $i; + } + } + } + + // free the result only if we were called on a table + if ($got_string) { + @fbsql_free_result($id); + } + return $res; + } + + // }}} + // {{{ getSpecialQuery() + + /** + * Returns the query needed to get some backend info + * @param string $type What kind of info you want to retrieve + * @return string The SQL query string + */ + function getSpecialQuery($type) + { + switch ($type) { + case 'tables': + return 'select "table_name" from information_schema.tables'; + default: + return null; + } + } + + // }}} +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + */ + +?> diff --git a/thirdparty/pear/DB/ibase.php b/thirdparty/pear/DB/ibase.php new file mode 100644 index 000000000..7100975bf --- /dev/null +++ b/thirdparty/pear/DB/ibase.php @@ -0,0 +1,784 @@ + | +// | Maintainer: Daniel Convissor | +// +----------------------------------------------------------------------+ +// +// $Id: ibase.php 3355 2005-06-11 22:14:40Z nbm $ + + +// Bugs: +// - If dbsyntax is not firebird, the limitQuery may fail + + +require_once 'DB/common.php'; + +/** + * Database independent query interface definition for PHP's Interbase + * extension. + * + * @package DB + * @version $Id: ibase.php 3355 2005-06-11 22:14:40Z nbm $ + * @category Database + * @author Sterling Hughes + */ +class DB_ibase extends DB_common +{ + + // {{{ properties + + var $connection; + var $phptype, $dbsyntax; + var $autocommit = 1; + var $manip_query = array(); + + // }}} + // {{{ constructor + + function DB_ibase() + { + $this->DB_common(); + $this->phptype = 'ibase'; + $this->dbsyntax = 'ibase'; + $this->features = array( + 'prepare' => true, + 'pconnect' => true, + 'transactions' => true, + 'limit' => false + ); + // just a few of the tons of Interbase error codes listed in the + // Language Reference section of the Interbase manual + $this->errorcode_map = array( + -104 => DB_ERROR_SYNTAX, + -150 => DB_ERROR_ACCESS_VIOLATION, + -151 => DB_ERROR_ACCESS_VIOLATION, + -155 => DB_ERROR_NOSUCHTABLE, + 88 => DB_ERROR_NOSUCHTABLE, + -157 => DB_ERROR_NOSUCHFIELD, + -158 => DB_ERROR_VALUE_COUNT_ON_ROW, + -170 => DB_ERROR_MISMATCH, + -171 => DB_ERROR_MISMATCH, + -172 => DB_ERROR_INVALID, + -204 => DB_ERROR_INVALID, + -205 => DB_ERROR_NOSUCHFIELD, + -206 => DB_ERROR_NOSUCHFIELD, + -208 => DB_ERROR_INVALID, + -219 => DB_ERROR_NOSUCHTABLE, + -297 => DB_ERROR_CONSTRAINT, + -530 => DB_ERROR_CONSTRAINT, + -607 => DB_ERROR_NOSUCHTABLE, + -803 => DB_ERROR_CONSTRAINT, + -551 => DB_ERROR_ACCESS_VIOLATION, + -552 => DB_ERROR_ACCESS_VIOLATION, + -922 => DB_ERROR_NOSUCHDB, + -923 => DB_ERROR_CONNECT_FAILED, + -924 => DB_ERROR_CONNECT_FAILED + ); + } + + // }}} + // {{{ connect() + + function connect($dsninfo, $persistent = false) + { + if (!DB::assertExtension('interbase')) { + return $this->raiseError(DB_ERROR_EXTENSION_NOT_FOUND); + } + $this->dsn = $dsninfo; + $dbhost = $dsninfo['hostspec'] ? + ($dsninfo['hostspec'] . ':' . $dsninfo['database']) : + $dsninfo['database']; + + $connect_function = $persistent ? 'ibase_pconnect' : 'ibase_connect'; + + $params = array(); + $params[] = $dbhost; + $params[] = $dsninfo['username'] ? $dsninfo['username'] : null; + $params[] = $dsninfo['password'] ? $dsninfo['password'] : null; + $params[] = isset($dsninfo['charset']) ? $dsninfo['charset'] : null; + $params[] = isset($dsninfo['buffers']) ? $dsninfo['buffers'] : null; + $params[] = isset($dsninfo['dialect']) ? $dsninfo['dialect'] : null; + $params[] = isset($dsninfo['role']) ? $dsninfo['role'] : null; + + $conn = @call_user_func_array($connect_function, $params); + if (!$conn) { + return $this->ibaseRaiseError(DB_ERROR_CONNECT_FAILED); + } + $this->connection = $conn; + if ($this->dsn['dbsyntax'] == 'firebird') { + $this->features['limit'] = 'alter'; + } + return DB_OK; + } + + // }}} + // {{{ disconnect() + + function disconnect() + { + $ret = @ibase_close($this->connection); + $this->connection = null; + return $ret; + } + + // }}} + // {{{ simpleQuery() + + function simpleQuery($query) + { + $ismanip = DB::isManip($query); + $this->last_query = $query; + $query = $this->modifyQuery($query); + $result = @ibase_query($this->connection, $query); + if (!$result) { + return $this->ibaseRaiseError(); + } + if ($this->autocommit && $ismanip) { + @ibase_commit($this->connection); + } + // Determine which queries that should return data, and which + // should return an error code only. + return $ismanip ? DB_OK : $result; + } + + // }}} + // {{{ modifyLimitQuery() + + /** + * This method is used by backends to alter limited queries + * Uses the new FIRST n SKIP n Firebird 1.0 syntax, so it is + * only compatible with Firebird 1.x + * + * @param string $query query to modify + * @param integer $from the row to start to fetching + * @param integer $count the numbers of rows to fetch + * + * @return the new (modified) query + * @author Ludovico Magnocavallo + * @access private + */ + function modifyLimitQuery($query, $from, $count, $params = array()) + { + if ($this->dsn['dbsyntax'] == 'firebird') { + //$from++; // SKIP starts from 1, ie SKIP 1 starts from the first record + // (cox) Seems that SKIP starts in 0 + $query = preg_replace('/^\s*select\s(.*)$/is', + "SELECT FIRST $count SKIP $from $1", $query); + } + return $query; + } + + // }}} + // {{{ nextResult() + + /** + * Move the internal ibase result pointer to the next available result + * + * @param a valid fbsql result resource + * + * @access public + * + * @return true if a result is available otherwise return false + */ + function nextResult($result) + { + return false; + } + + // }}} + // {{{ fetchInto() + + /** + * Fetch a row and insert the data into an existing array. + * + * Formating of the array and the data therein are configurable. + * See DB_result::fetchInto() for more information. + * + * @param resource $result query result identifier + * @param array $arr (reference) array where data from the row + * should be placed + * @param int $fetchmode how the resulting array should be indexed + * @param int $rownum the row number to fetch + * + * @return mixed DB_OK on success, null when end of result set is + * reached or on failure + * + * @see DB_result::fetchInto() + * @access private + */ + function fetchInto($result, &$arr, $fetchmode, $rownum=null) + { + if ($rownum !== null) { + return $this->ibaseRaiseError(DB_ERROR_NOT_CAPABLE); + } + if ($fetchmode & DB_FETCHMODE_ASSOC) { + if (function_exists('ibase_fetch_assoc')) { + $arr = @ibase_fetch_assoc($result); + } else { + $arr = get_object_vars(ibase_fetch_object($result)); + } + if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE && $arr) { + $arr = array_change_key_case($arr, CASE_LOWER); + } + } else { + $arr = @ibase_fetch_row($result); + } + if (!$arr) { + if ($errmsg = @ibase_errmsg()) { + return $this->ibaseRaiseError(null, $errmsg); + } else { + return null; + } + } + if ($this->options['portability'] & DB_PORTABILITY_RTRIM) { + $this->_rtrimArrayValues($arr); + } + if ($this->options['portability'] & DB_PORTABILITY_NULL_TO_EMPTY) { + $this->_convertNullArrayValuesToEmpty($arr); + } + return DB_OK; + } + + // }}} + // {{{ freeResult() + + function freeResult($result) + { + return @ibase_free_result($result); + } + + // }}} + // {{{ freeQuery() + + function freeQuery($query) + { + @ibase_free_query($query); + return true; + } + + // }}} + // {{{ numCols() + + function numCols($result) + { + $cols = @ibase_num_fields($result); + if (!$cols) { + return $this->ibaseRaiseError(); + } + return $cols; + } + + // }}} + // {{{ prepare() + + /** + * Prepares a query for multiple execution with execute(). + * + * prepare() requires a generic query as string like + * INSERT INTO numbers VALUES (?, ?, ?) + * . The ? characters are placeholders. + * + * Three types of placeholders can be used: + * + ? a quoted scalar value, i.e. strings, integers + * + ! value is inserted 'as is' + * + & requires a file name. The file's contents get + * inserted into the query (i.e. saving binary + * data in a db) + * + * Use backslashes to escape placeholder characters if you don't want + * them to be interpreted as placeholders. Example: + * "UPDATE foo SET col=? WHERE col='over \& under'" + * + * + * @param string $query query to be prepared + * @return mixed DB statement resource on success. DB_Error on failure. + */ + function prepare($query) + { + $tokens = preg_split('/((? $val) { + switch ($val) { + case '?': + $types[$token++] = DB_PARAM_SCALAR; + break; + case '&': + $types[$token++] = DB_PARAM_OPAQUE; + break; + case '!': + $types[$token++] = DB_PARAM_MISC; + break; + default: + $tokens[$key] = preg_replace('/\\\([&?!])/', "\\1", $val); + $newquery .= $tokens[$key] . '?'; + } + } + + $newquery = substr($newquery, 0, -1); + $this->last_query = $query; + $newquery = $this->modifyQuery($newquery); + $stmt = @ibase_prepare($this->connection, $newquery); + $this->prepare_types[(int)$stmt] = $types; + $this->manip_query[(int)$stmt] = DB::isManip($query); + return $stmt; + } + + // }}} + // {{{ execute() + + /** + * Executes a DB statement prepared with prepare(). + * + * @param resource $stmt a DB statement resource returned from prepare() + * @param mixed $data array, string or numeric data to be used in + * execution of the statement. Quantity of items + * passed must match quantity of placeholders in + * query: meaning 1 for non-array items or the + * quantity of elements in the array. + * @return object a new DB_Result or a DB_Error when fail + * @see DB_ibase::prepare() + * @access public + */ + function &execute($stmt, $data = array()) + { + if (!is_array($data)) { + $data = array($data); + } + + $types =& $this->prepare_types[(int)$stmt]; + if (count($types) != count($data)) { + $tmp =& $this->raiseError(DB_ERROR_MISMATCH); + return $tmp; + } + + $i = 0; + foreach ($data as $key => $value) { + if ($types[$i] == DB_PARAM_MISC) { + /* + * ibase doesn't seem to have the ability to pass a + * parameter along unchanged, so strip off quotes from start + * and end, plus turn two single quotes to one single quote, + * in order to avoid the quotes getting escaped by + * ibase and ending up in the database. + */ + $data[$key] = preg_replace("/^'(.*)'$/", "\\1", $data[$key]); + $data[$key] = str_replace("''", "'", $data[$key]); + } elseif ($types[$i] == DB_PARAM_OPAQUE) { + $fp = @fopen($data[$key], 'rb'); + if (!$fp) { + $tmp =& $this->raiseError(DB_ERROR_ACCESS_VIOLATION); + return $tmp; + } + $data[$key] = fread($fp, filesize($data[$key])); + fclose($fp); + } + $i++; + } + + array_unshift($data, $stmt); + + $res = call_user_func_array('ibase_execute', $data); + if (!$res) { + $tmp =& $this->ibaseRaiseError(); + return $tmp; + } + /* XXX need this? + if ($this->autocommit && $this->manip_query[(int)$stmt]) { + @ibase_commit($this->connection); + }*/ + if ($this->manip_query[(int)$stmt]) { + $tmp = DB_OK; + } else { + $tmp =& new DB_result($this, $res); + } + return $tmp; + } + + /** + * Free the internal resources associated with a prepared query. + * + * @param $stmt The interbase_query resource type + * + * @return bool true on success, false if $result is invalid + */ + function freePrepared($stmt) + { + if (!is_resource($stmt)) { + return false; + } + @ibase_free_query($stmt); + unset($this->prepare_tokens[(int)$stmt]); + unset($this->prepare_types[(int)$stmt]); + unset($this->manip_query[(int)$stmt]); + return true; + } + + // }}} + // {{{ autoCommit() + + function autoCommit($onoff = false) + { + $this->autocommit = $onoff ? 1 : 0; + return DB_OK; + } + + // }}} + // {{{ commit() + + function commit() + { + return @ibase_commit($this->connection); + } + + // }}} + // {{{ rollback() + + function rollback() + { + return @ibase_rollback($this->connection); + } + + // }}} + // {{{ transactionInit() + + function transactionInit($trans_args = 0) + { + return $trans_args ? @ibase_trans($trans_args, $this->connection) : @ibase_trans(); + } + + // }}} + // {{{ nextId() + + /** + * Returns the next free id in a sequence + * + * @param string $seq_name name of the sequence + * @param boolean $ondemand when true, the seqence is automatically + * created if it does not exist + * + * @return int the next id number in the sequence. DB_Error if problem. + * + * @internal + * @see DB_common::nextID() + * @access public + */ + function nextId($seq_name, $ondemand = true) + { + $sqn = strtoupper($this->getSequenceName($seq_name)); + $repeat = 0; + do { + $this->pushErrorHandling(PEAR_ERROR_RETURN); + $result =& $this->query("SELECT GEN_ID(${sqn}, 1) " + . 'FROM RDB$GENERATORS ' + . "WHERE RDB\$GENERATOR_NAME='${sqn}'"); + $this->popErrorHandling(); + if ($ondemand && DB::isError($result)) { + $repeat = 1; + $result = $this->createSequence($seq_name); + if (DB::isError($result)) { + return $result; + } + } else { + $repeat = 0; + } + } while ($repeat); + if (DB::isError($result)) { + return $this->raiseError($result); + } + $arr = $result->fetchRow(DB_FETCHMODE_ORDERED); + $result->free(); + return $arr[0]; + } + + // }}} + // {{{ createSequence() + + /** + * Create the sequence + * + * @param string $seq_name the name of the sequence + * @return mixed DB_OK on success or DB error on error + * @access public + */ + function createSequence($seq_name) + { + $sqn = strtoupper($this->getSequenceName($seq_name)); + $this->pushErrorHandling(PEAR_ERROR_RETURN); + $result = $this->query("CREATE GENERATOR ${sqn}"); + $this->popErrorHandling(); + + return $result; + } + + // }}} + // {{{ dropSequence() + + /** + * Drop a sequence + * + * @param string $seq_name the name of the sequence + * @return mixed DB_OK on success or DB error on error + * @access public + */ + function dropSequence($seq_name) + { + $sqn = strtoupper($this->getSequenceName($seq_name)); + return $this->query('DELETE FROM RDB$GENERATORS ' + . "WHERE RDB\$GENERATOR_NAME='${sqn}'"); + } + + // }}} + // {{{ _ibaseFieldFlags() + + /** + * get the Flags of a Field + * + * @param string $field_name the name of the field + * @param string $table_name the name of the table + * + * @return string The flags of the field ("primary_key", "unique_key", "not_null" + * "default", "computed" and "blob" are supported) + * @access private + */ + function _ibaseFieldFlags($field_name, $table_name) + { + $sql = 'SELECT R.RDB$CONSTRAINT_TYPE CTYPE' + .' FROM RDB$INDEX_SEGMENTS I' + .' JOIN RDB$RELATION_CONSTRAINTS R ON I.RDB$INDEX_NAME=R.RDB$INDEX_NAME' + .' WHERE I.RDB$FIELD_NAME=\'' . $field_name . '\'' + .' AND UPPER(R.RDB$RELATION_NAME)=\'' . strtoupper($table_name) . '\''; + + $result = @ibase_query($this->connection, $sql); + if (!$result) { + return $this->ibaseRaiseError(); + } + + $flags = ''; + if ($obj = @ibase_fetch_object($result)) { + @ibase_free_result($result); + if (isset($obj->CTYPE) && trim($obj->CTYPE) == 'PRIMARY KEY') { + $flags .= 'primary_key '; + } + if (isset($obj->CTYPE) && trim($obj->CTYPE) == 'UNIQUE') { + $flags .= 'unique_key '; + } + } + + $sql = 'SELECT R.RDB$NULL_FLAG AS NFLAG,' + .' R.RDB$DEFAULT_SOURCE AS DSOURCE,' + .' F.RDB$FIELD_TYPE AS FTYPE,' + .' F.RDB$COMPUTED_SOURCE AS CSOURCE' + .' FROM RDB$RELATION_FIELDS R ' + .' JOIN RDB$FIELDS F ON R.RDB$FIELD_SOURCE=F.RDB$FIELD_NAME' + .' WHERE UPPER(R.RDB$RELATION_NAME)=\'' . strtoupper($table_name) . '\'' + .' AND R.RDB$FIELD_NAME=\'' . $field_name . '\''; + + $result = @ibase_query($this->connection, $sql); + if (!$result) { + return $this->ibaseRaiseError(); + } + if ($obj = @ibase_fetch_object($result)) { + @ibase_free_result($result); + if (isset($obj->NFLAG)) { + $flags .= 'not_null '; + } + if (isset($obj->DSOURCE)) { + $flags .= 'default '; + } + if (isset($obj->CSOURCE)) { + $flags .= 'computed '; + } + if (isset($obj->FTYPE) && $obj->FTYPE == 261) { + $flags .= 'blob '; + } + } + + return trim($flags); + } + + // }}} + // {{{ tableInfo() + + /** + * Returns information about a table or a result set. + * + * NOTE: only supports 'table' and 'flags' if $result + * is a table name. + * + * @param object|string $result DB_result object from a query or a + * string containing the name of a table + * @param int $mode a valid tableInfo mode + * @return array an associative array with the information requested + * or an error object if something is wrong + * @access public + * @internal + * @see DB_common::tableInfo() + */ + function tableInfo($result, $mode = null) + { + if (isset($result->result)) { + /* + * Probably received a result object. + * Extract the result resource identifier. + */ + $id = $result->result; + $got_string = false; + } elseif (is_string($result)) { + /* + * Probably received a table name. + * Create a result resource identifier. + */ + $id = @ibase_query($this->connection, + "SELECT * FROM $result WHERE 1=0"); + $got_string = true; + } else { + /* + * Probably received a result resource identifier. + * Copy it. + * Deprecated. Here for compatibility only. + */ + $id = $result; + $got_string = false; + } + + if (!is_resource($id)) { + return $this->ibaseRaiseError(DB_ERROR_NEED_MORE_DATA); + } + + if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE) { + $case_func = 'strtolower'; + } else { + $case_func = 'strval'; + } + + $count = @ibase_num_fields($id); + + // made this IF due to performance (one if is faster than $count if's) + if (!$mode) { + for ($i=0; $i<$count; $i++) { + $info = @ibase_field_info($id, $i); + $res[$i]['table'] = $got_string ? $case_func($result) : ''; + $res[$i]['name'] = $case_func($info['name']); + $res[$i]['type'] = $info['type']; + $res[$i]['len'] = $info['length']; + $res[$i]['flags'] = ($got_string) ? $this->_ibaseFieldFlags($info['name'], $result) : ''; + } + } else { // full + $res['num_fields']= $count; + + for ($i=0; $i<$count; $i++) { + $info = @ibase_field_info($id, $i); + $res[$i]['table'] = $got_string ? $case_func($result) : ''; + $res[$i]['name'] = $case_func($info['name']); + $res[$i]['type'] = $info['type']; + $res[$i]['len'] = $info['length']; + $res[$i]['flags'] = ($got_string) ? $this->_ibaseFieldFlags($info['name'], $result) : ''; + + if ($mode & DB_TABLEINFO_ORDER) { + $res['order'][$res[$i]['name']] = $i; + } + if ($mode & DB_TABLEINFO_ORDERTABLE) { + $res['ordertable'][$res[$i]['table']][$res[$i]['name']] = $i; + } + } + } + + // free the result only if we were called on a table + if ($got_string) { + @ibase_free_result($id); + } + return $res; + } + + // }}} + // {{{ ibaseRaiseError() + + /** + * Gather information about an error, then use that info to create a + * DB error object and finally return that object. + * + * @param integer $db_errno PEAR error number (usually a DB constant) if + * manually raising an error + * @param string $native_errmsg text of error message if known + * @return object DB error object + * @see DB_common::errorCode() + * @see DB_common::raiseError() + */ + function &ibaseRaiseError($db_errno = null, $native_errmsg = null) + { + if ($native_errmsg === null) { + $native_errmsg = @ibase_errmsg(); + } + // memo for the interbase php module hackers: we need something similar + // to mysql_errno() to retrieve error codes instead of this ugly hack + if (preg_match('/^([^0-9\-]+)([0-9\-]+)\s+(.*)$/', $native_errmsg, $m)) { + $native_errno = (int)$m[2]; + } else { + $native_errno = null; + } + // try to map the native error to the DB one + if ($db_errno === null) { + if ($native_errno) { + // try to interpret Interbase error code (that's why we need ibase_errno() + // in the interbase module to return the real error code) + switch ($native_errno) { + case -204: + if (is_int(strpos($m[3], 'Table unknown'))) { + $db_errno = DB_ERROR_NOSUCHTABLE; + } + break; + default: + $db_errno = $this->errorCode($native_errno); + } + } else { + $error_regexps = array( + '/[tT]able not found/' => DB_ERROR_NOSUCHTABLE, + '/[tT]able .* already exists/' => DB_ERROR_ALREADY_EXISTS, + '/validation error for column .* value "\*\*\* null/' => DB_ERROR_CONSTRAINT_NOT_NULL, + '/violation of [\w ]+ constraint/' => DB_ERROR_CONSTRAINT, + '/conversion error from string/' => DB_ERROR_INVALID_NUMBER, + '/no permission for/' => DB_ERROR_ACCESS_VIOLATION, + '/arithmetic exception, numeric overflow, or string truncation/' => DB_ERROR_DIVZERO + ); + foreach ($error_regexps as $regexp => $code) { + if (preg_match($regexp, $native_errmsg)) { + $db_errno = $code; + $native_errno = null; + break; + } + } + } + } + $tmp =& $this->raiseError($db_errno, null, null, null, $native_errmsg); + return $tmp; + } + + // }}} + +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + */ + +?> diff --git a/thirdparty/pear/DB/ifx.php b/thirdparty/pear/DB/ifx.php new file mode 100644 index 000000000..89204a633 --- /dev/null +++ b/thirdparty/pear/DB/ifx.php @@ -0,0 +1,579 @@ + | +// | Maintainer: Daniel Convissor | +// +----------------------------------------------------------------------+ +// +// $Id: ifx.php 3355 2005-06-11 22:14:40Z nbm $ + + +// Legend: +// For more info on Informix errors see: +// http://www.informix.com/answers/english/ierrors.htm +// +// TODO: +// - set needed env Informix vars on connect +// - implement native prepare/execute + + +require_once 'DB/common.php'; + +/** + * Database independent query interface definition for PHP's Informix + * extension. + * + * @package DB + * @version $Id: ifx.php 3355 2005-06-11 22:14:40Z nbm $ + * @category Database + * @author Tomas V.V.Cox + */ +class DB_ifx extends DB_common +{ + // {{{ properties + + var $connection; + var $affected = 0; + var $dsn = array(); + var $transaction_opcount = 0; + var $autocommit = true; + var $fetchmode = DB_FETCHMODE_ORDERED; /* Default fetch mode */ + + // }}} + // {{{ constructor + + function DB_ifx() + { + $this->phptype = 'ifx'; + $this->dbsyntax = 'ifx'; + $this->features = array( + 'prepare' => false, + 'pconnect' => true, + 'transactions' => true, + 'limit' => 'emulate' + ); + $this->errorcode_map = array( + '-201' => DB_ERROR_SYNTAX, + '-206' => DB_ERROR_NOSUCHTABLE, + '-217' => DB_ERROR_NOSUCHFIELD, + '-239' => DB_ERROR_CONSTRAINT, + '-253' => DB_ERROR_SYNTAX, + '-292' => DB_ERROR_CONSTRAINT_NOT_NULL, + '-310' => DB_ERROR_ALREADY_EXISTS, + '-329' => DB_ERROR_NODBSELECTED, + '-346' => DB_ERROR_CONSTRAINT, + '-386' => DB_ERROR_CONSTRAINT_NOT_NULL, + '-391' => DB_ERROR_CONSTRAINT_NOT_NULL, + '-554' => DB_ERROR_SYNTAX, + '-691' => DB_ERROR_CONSTRAINT, + '-703' => DB_ERROR_CONSTRAINT_NOT_NULL, + '-1204' => DB_ERROR_INVALID_DATE, + '-1205' => DB_ERROR_INVALID_DATE, + '-1206' => DB_ERROR_INVALID_DATE, + '-1209' => DB_ERROR_INVALID_DATE, + '-1210' => DB_ERROR_INVALID_DATE, + '-1212' => DB_ERROR_INVALID_DATE, + '-1213' => DB_ERROR_INVALID_NUMBER, + ); + } + + // }}} + // {{{ connect() + + /** + * Connect to a database and log in as the specified user. + * + * @param $dsn the data source name (see DB::parseDSN for syntax) + * @param $persistent (optional) whether the connection should + * be persistent + * + * @return int DB_OK on success, a DB error code on failure + */ + function connect($dsninfo, $persistent = false) + { + if (!DB::assertExtension('informix') && + !DB::assertExtension('Informix')) + { + return $this->raiseError(DB_ERROR_EXTENSION_NOT_FOUND); + } + $this->dsn = $dsninfo; + $dbhost = $dsninfo['hostspec'] ? '@' . $dsninfo['hostspec'] : ''; + $dbname = $dsninfo['database'] ? $dsninfo['database'] . $dbhost : ''; + $user = $dsninfo['username'] ? $dsninfo['username'] : ''; + $pw = $dsninfo['password'] ? $dsninfo['password'] : ''; + + $connect_function = $persistent ? 'ifx_pconnect' : 'ifx_connect'; + + $this->connection = @$connect_function($dbname, $user, $pw); + if (!is_resource($this->connection)) { + return $this->ifxraiseError(DB_ERROR_CONNECT_FAILED); + } + return DB_OK; + } + + // }}} + // {{{ disconnect() + + /** + * Log out and disconnect from the database. + * + * @return bool true on success, false if not connected. + */ + function disconnect() + { + $ret = @ifx_close($this->connection); + $this->connection = null; + return $ret; + } + + // }}} + // {{{ simpleQuery() + + /** + * Send a query to Informix and return the results as a + * Informix resource identifier. + * + * @param $query the SQL query + * + * @return int returns a valid Informix result for successful SELECT + * queries, DB_OK for other successful queries. A DB error code + * is returned on failure. + */ + function simpleQuery($query) + { + $ismanip = DB::isManip($query); + $this->last_query = $query; + $this->affected = null; + if (preg_match('/(SELECT)/i', $query)) { //TESTME: Use !DB::isManip()? + // the scroll is needed for fetching absolute row numbers + // in a select query result + $result = @ifx_query($query, $this->connection, IFX_SCROLL); + } else { + if (!$this->autocommit && $ismanip) { + if ($this->transaction_opcount == 0) { + $result = @ifx_query('BEGIN WORK', $this->connection); + if (!$result) { + return $this->ifxraiseError(); + } + } + $this->transaction_opcount++; + } + $result = @ifx_query($query, $this->connection); + } + if (!$result) { + return $this->ifxraiseError(); + } + $this->affected = @ifx_affected_rows($result); + // Determine which queries should return data, and which + // should return an error code only. + if (preg_match('/(SELECT)/i', $query)) { + return $result; + } + // XXX Testme: free results inside a transaction + // may cause to stop it and commit the work? + + // Result has to be freed even with a insert or update + @ifx_free_result($result); + + return DB_OK; + } + + // }}} + // {{{ nextResult() + + /** + * Move the internal ifx result pointer to the next available result + * + * @param a valid fbsql result resource + * + * @access public + * + * @return true if a result is available otherwise return false + */ + function nextResult($result) + { + return false; + } + + // }}} + // {{{ affectedRows() + + /** + * Gets the number of rows affected by the last query. + * if the last query was a select, returns 0. + * + * @return number of rows affected by the last query + */ + function affectedRows() + { + if (DB::isManip($this->last_query)) { + return $this->affected; + } else { + return 0; + } + + } + + // }}} + // {{{ fetchInto() + + /** + * Fetch a row and insert the data into an existing array. + * + * Formating of the array and the data therein are configurable. + * See DB_result::fetchInto() for more information. + * + * @param resource $result query result identifier + * @param array $arr (reference) array where data from the row + * should be placed + * @param int $fetchmode how the resulting array should be indexed + * @param int $rownum the row number to fetch + * + * @return mixed DB_OK on success, null when end of result set is + * reached or on failure + * + * @see DB_result::fetchInto() + * @access private + */ + function fetchInto($result, &$arr, $fetchmode, $rownum=null) + { + if (($rownum !== null) && ($rownum < 0)) { + return null; + } + if ($rownum === null) { + /* + * Even though fetch_row() should return the next row if + * $rownum is null, it doesn't in all cases. Bug 598. + */ + $rownum = 'NEXT'; + } else { + // Index starts at row 1, unlike most DBMS's starting at 0. + $rownum++; + } + if (!$arr = @ifx_fetch_row($result, $rownum)) { + return null; + } + if ($fetchmode !== DB_FETCHMODE_ASSOC) { + $i=0; + $order = array(); + foreach ($arr as $val) { + $order[$i++] = $val; + } + $arr = $order; + } elseif ($fetchmode == DB_FETCHMODE_ASSOC && + $this->options['portability'] & DB_PORTABILITY_LOWERCASE) + { + $arr = array_change_key_case($arr, CASE_LOWER); + } + if ($this->options['portability'] & DB_PORTABILITY_RTRIM) { + $this->_rtrimArrayValues($arr); + } + if ($this->options['portability'] & DB_PORTABILITY_NULL_TO_EMPTY) { + $this->_convertNullArrayValuesToEmpty($arr); + } + return DB_OK; + } + + // }}} + // {{{ numRows() + + function numRows($result) + { + return $this->raiseError(DB_ERROR_NOT_CAPABLE); + } + + // }}} + // {{{ numCols() + + /** + * Get the number of columns in a result set. + * + * @param $result Informix result identifier + * + * @return int the number of columns per row in $result + */ + function numCols($result) + { + if (!$cols = @ifx_num_fields($result)) { + return $this->ifxraiseError(); + } + return $cols; + } + + // }}} + // {{{ freeResult() + + /** + * Free the internal resources associated with $result. + * + * @param $result Informix result identifier + * + * @return bool true on success, false if $result is invalid + */ + function freeResult($result) + { + return @ifx_free_result($result); + } + + // }}} + // {{{ autoCommit() + + /** + * Enable/disable automatic commits + */ + function autoCommit($onoff = true) + { + // XXX if $this->transaction_opcount > 0, we should probably + // issue a warning here. + $this->autocommit = $onoff ? true : false; + return DB_OK; + } + + // }}} + // {{{ commit() + + /** + * Commit the current transaction. + */ + function commit() + { + if ($this->transaction_opcount > 0) { + $result = @ifx_query('COMMIT WORK', $this->connection); + $this->transaction_opcount = 0; + if (!$result) { + return $this->ifxRaiseError(); + } + } + return DB_OK; + } + + // }}} + // {{{ rollback() + + /** + * Roll back (undo) the current transaction. + */ + function rollback() + { + if ($this->transaction_opcount > 0) { + $result = @ifx_query('ROLLBACK WORK', $this->connection); + $this->transaction_opcount = 0; + if (!$result) { + return $this->ifxRaiseError(); + } + } + return DB_OK; + } + + // }}} + // {{{ ifxraiseError() + + /** + * Gather information about an error, then use that info to create a + * DB error object and finally return that object. + * + * @param integer $errno PEAR error number (usually a DB constant) if + * manually raising an error + * @return object DB error object + * @see errorNative() + * @see errorCode() + * @see DB_common::raiseError() + */ + function ifxraiseError($errno = null) + { + if ($errno === null) { + $errno = $this->errorCode(ifx_error()); + } + + return $this->raiseError($errno, null, null, null, + $this->errorNative()); + } + + // }}} + // {{{ errorCode() + + /** + * Map native error codes to DB's portable ones. + * + * Requires that the DB implementation's constructor fills + * in the $errorcode_map property. + * + * @param string $nativecode error code returned by the database + * @return int a portable DB error code, or DB_ERROR if this DB + * implementation has no mapping for the given error code. + */ + function errorCode($nativecode) + { + if (ereg('SQLCODE=(.*)]', $nativecode, $match)) { + $code = $match[1]; + if (isset($this->errorcode_map[$code])) { + return $this->errorcode_map[$code]; + } + } + return DB_ERROR; + } + + // }}} + // {{{ errorNative() + + /** + * Get the native error message of the last error (if any) that + * occured on the current connection. + * + * @return int native Informix error code + */ + function errorNative() + { + return @ifx_error() . ' ' . @ifx_errormsg(); + } + + // }}} + // {{{ getSpecialQuery() + + /** + * Returns the query needed to get some backend info + * @param string $type What kind of info you want to retrieve + * @return string The SQL query string + */ + function getSpecialQuery($type) + { + switch ($type) { + case 'tables': + return 'select tabname from systables where tabid >= 100'; + default: + return null; + } + } + + // }}} + // {{{ tableInfo() + + /** + * Returns information about a table or a result set. + * + * NOTE: only supports 'table' if $result is a table name. + * + * If analyzing a query result and the result has duplicate field names, + * an error will be raised saying + * can't distinguish duplicate field names. + * + * @param object|string $result DB_result object from a query or a + * string containing the name of a table + * @param int $mode a valid tableInfo mode + * @return array an associative array with the information requested + * or an error object if something is wrong + * @access public + * @internal + * @since 1.6.0 + * @see DB_common::tableInfo() + */ + function tableInfo($result, $mode = null) + { + if (isset($result->result)) { + /* + * Probably received a result object. + * Extract the result resource identifier. + */ + $id = $result->result; + $got_string = false; + } elseif (is_string($result)) { + /* + * Probably received a table name. + * Create a result resource identifier. + */ + $id = @ifx_query("SELECT * FROM $result WHERE 1=0", + $this->connection); + $got_string = true; + } else { + /* + * Probably received a result resource identifier. + * Copy it. + */ + $id = $result; + $got_string = false; + } + + if (!is_resource($id)) { + return $this->ifxRaiseError(DB_ERROR_NEED_MORE_DATA); + } + + $flds = @ifx_fieldproperties($id); + $count = @ifx_num_fields($id); + + if (count($flds) != $count) { + return $this->raiseError("can't distinguish duplicate field names"); + } + + if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE) { + $case_func = 'strtolower'; + } else { + $case_func = 'strval'; + } + + $i = 0; + // made this IF due to performance (one if is faster than $count if's) + if (!$mode) { + foreach ($flds as $key => $value) { + $props = explode(';', $value); + + $res[$i]['table'] = $got_string ? $case_func($result) : ''; + $res[$i]['name'] = $case_func($key); + $res[$i]['type'] = $props[0]; + $res[$i]['len'] = $props[1]; + $res[$i]['flags'] = $props[4] == 'N' ? 'not_null' : ''; + $i++; + } + + } else { // full + $res['num_fields'] = $count; + + foreach ($flds as $key => $value) { + $props = explode(';', $value); + + $res[$i]['table'] = $got_string ? $case_func($result) : ''; + $res[$i]['name'] = $case_func($key); + $res[$i]['type'] = $props[0]; + $res[$i]['len'] = $props[1]; + $res[$i]['flags'] = $props[4] == 'N' ? 'not_null' : ''; + + if ($mode & DB_TABLEINFO_ORDER) { + $res['order'][$res[$i]['name']] = $i; + } + if ($mode & DB_TABLEINFO_ORDERTABLE) { + $res['ordertable'][$res[$i]['table']][$res[$i]['name']] = $i; + } + $i++; + } + } + + // free the result only if we were called on a table + if ($got_string) { + @ifx_free_result($id); + } + return $res; + } + + // }}} + +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + */ + +?> diff --git a/thirdparty/pear/DB/msql.php b/thirdparty/pear/DB/msql.php new file mode 100644 index 000000000..8f87689ab --- /dev/null +++ b/thirdparty/pear/DB/msql.php @@ -0,0 +1,242 @@ + | +// | Maintainer: Daniel Convissor | +// +----------------------------------------------------------------------+ +// +// $Id: msql.php 3355 2005-06-11 22:14:40Z nbm $ + +require_once 'DB/common.php'; + +/** + * Database independent query interface definition for PHP's Mini-SQL + * extension. + * + * @package DB + * @version $Id: msql.php 3355 2005-06-11 22:14:40Z nbm $ + * @category Database + * @author Sterling Hughes + */ +class DB_msql extends DB_common +{ + // {{{ properties + + var $connection; + var $phptype, $dbsyntax; + var $prepare_tokens = array(); + var $prepare_types = array(); + + // }}} + // {{{ constructor + + function DB_msql() + { + $this->DB_common(); + $this->phptype = 'msql'; + $this->dbsyntax = 'msql'; + $this->features = array( + 'prepare' => false, + 'pconnect' => true, + 'transactions' => false, + 'limit' => 'emulate' + ); + } + + // }}} + // {{{ connect() + + function connect($dsninfo, $persistent = false) + { + if (!DB::assertExtension('msql')) { + return $this->raiseError(DB_ERROR_EXTENSION_NOT_FOUND); + } + + $this->dsn = $dsninfo; + $dbhost = $dsninfo['hostspec'] ? $dsninfo['hostspec'] : 'localhost'; + + $connect_function = $persistent ? 'msql_pconnect' : 'msql_connect'; + + if ($dbhost && $dsninfo['username'] && $dsninfo['password']) { + $conn = $connect_function($dbhost, $dsninfo['username'], + $dsninfo['password']); + } elseif ($dbhost && $dsninfo['username']) { + $conn = $connect_function($dbhost, $dsninfo['username']); + } else { + $conn = $connect_function($dbhost); + } + if (!$conn) { + $this->raiseError(DB_ERROR_CONNECT_FAILED); + } + if (!@msql_select_db($dsninfo['database'], $conn)){ + return $this->raiseError(DB_ERROR_NODBSELECTED); + } + $this->connection = $conn; + return DB_OK; + } + + // }}} + // {{{ disconnect() + + function disconnect() + { + $ret = @msql_close($this->connection); + $this->connection = null; + return $ret; + } + + // }}} + // {{{ simpleQuery() + + function simpleQuery($query) + { + $this->last_query = $query; + $query = $this->modifyQuery($query); + $result = @msql_query($query, $this->connection); + if (!$result) { + return $this->raiseError(); + } + // Determine which queries that should return data, and which + // should return an error code only. + return DB::isManip($query) ? DB_OK : $result; + } + + + // }}} + // {{{ nextResult() + + /** + * Move the internal msql result pointer to the next available result + * + * @param a valid fbsql result resource + * + * @access public + * + * @return true if a result is available otherwise return false + */ + function nextResult($result) + { + return false; + } + + // }}} + // {{{ fetchInto() + + /** + * Fetch a row and insert the data into an existing array. + * + * Formating of the array and the data therein are configurable. + * See DB_result::fetchInto() for more information. + * + * @param resource $result query result identifier + * @param array $arr (reference) array where data from the row + * should be placed + * @param int $fetchmode how the resulting array should be indexed + * @param int $rownum the row number to fetch + * + * @return mixed DB_OK on success, null when end of result set is + * reached or on failure + * + * @see DB_result::fetchInto() + * @access private + */ + function fetchInto($result, &$arr, $fetchmode, $rownum=null) + { + if ($rownum !== null) { + if (!@msql_data_seek($result, $rownum)) { + return null; + } + } + if ($fetchmode & DB_FETCHMODE_ASSOC) { + $arr = @msql_fetch_array($result, MSQL_ASSOC); + if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE && $arr) { + $arr = array_change_key_case($arr, CASE_LOWER); + } + } else { + $arr = @msql_fetch_row($result); + } + if (!$arr) { + if ($error = @msql_error()) { + return $this->raiseError($error); + } else { + return null; + } + } + if ($this->options['portability'] & DB_PORTABILITY_RTRIM) { + $this->_rtrimArrayValues($arr); + } + if ($this->options['portability'] & DB_PORTABILITY_NULL_TO_EMPTY) { + $this->_convertNullArrayValuesToEmpty($arr); + } + return DB_OK; + } + + // }}} + // {{{ freeResult() + + function freeResult($result) + { + return @msql_free_result($result); + } + + // }}} + // {{{ numCols() + + function numCols($result) + { + $cols = @msql_num_fields($result); + if (!$cols) { + return $this->raiseError(); + } + return $cols; + } + + // }}} + // {{{ numRows() + + function numRows($result) + { + $rows = @msql_num_rows($result); + if (!$rows) { + return $this->raiseError(); + } + return $rows; + } + + // }}} + // {{{ affected() + + /** + * Gets the number of rows affected by a query. + * + * @return number of rows affected by the last query + */ + function affectedRows() + { + return @msql_affected_rows($this->connection); + } + + // }}} + +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + */ + +?> diff --git a/thirdparty/pear/DB/mssql.php b/thirdparty/pear/DB/mssql.php new file mode 100644 index 000000000..4c8516471 --- /dev/null +++ b/thirdparty/pear/DB/mssql.php @@ -0,0 +1,738 @@ + | +// | Maintainer: Daniel Convissor | +// +----------------------------------------------------------------------+ +// +// $Id: mssql.php 3355 2005-06-11 22:14:40Z nbm $ + +require_once 'DB/common.php'; + +/** + * Database independent query interface definition for PHP's Microsoft SQL Server + * extension. + * + * @package DB + * @version $Id: mssql.php 3355 2005-06-11 22:14:40Z nbm $ + * @category Database + * @author Sterling Hughes + */ +class DB_mssql extends DB_common +{ + // {{{ properties + + var $connection; + var $phptype, $dbsyntax; + var $prepare_tokens = array(); + var $prepare_types = array(); + var $transaction_opcount = 0; + var $autocommit = true; + var $_db = null; + + // }}} + // {{{ constructor + + function DB_mssql() + { + $this->DB_common(); + $this->phptype = 'mssql'; + $this->dbsyntax = 'mssql'; + $this->features = array( + 'prepare' => false, + 'pconnect' => true, + 'transactions' => true, + 'limit' => 'emulate' + ); + // XXX Add here error codes ie: 'S100E' => DB_ERROR_SYNTAX + $this->errorcode_map = array( + 170 => DB_ERROR_SYNTAX, + 207 => DB_ERROR_NOSUCHFIELD, + 208 => DB_ERROR_NOSUCHTABLE, + 245 => DB_ERROR_INVALID_NUMBER, + 515 => DB_ERROR_CONSTRAINT_NOT_NULL, + 547 => DB_ERROR_CONSTRAINT, + 2627 => DB_ERROR_CONSTRAINT, + 2714 => DB_ERROR_ALREADY_EXISTS, + 3701 => DB_ERROR_NOSUCHTABLE, + 8134 => DB_ERROR_DIVZERO, + ); + } + + // }}} + // {{{ connect() + + function connect($dsninfo, $persistent = false) + { + if (!DB::assertExtension('mssql') && !DB::assertExtension('sybase') + && !DB::assertExtension('sybase_ct')) + { + return $this->raiseError(DB_ERROR_EXTENSION_NOT_FOUND); + } + $this->dsn = $dsninfo; + $dbhost = $dsninfo['hostspec'] ? $dsninfo['hostspec'] : 'localhost'; + //$dbhost .= $dsninfo['port'] ? ',' . $dsninfo['port'] : ''; + + $dbhost .= $dsninfo['port'] ? ':' . $dsninfo['port'] : ':1433'; + $connect_function = $persistent ? 'mssql_pconnect' : 'mssql_connect'; + + if ($dbhost && $dsninfo['username'] && $dsninfo['password']) { + $conn = @$connect_function($dbhost, $dsninfo['username'], $dsninfo['password']); + }elseif ($dbhost && $dsninfo['username']){ + $conn = @$connect_function($dbhost, $dsninfo['username']); + } else { + $conn = @$connect_function($dbhost); + } + if (!$conn) { + return $this->raiseError(DB_ERROR_CONNECT_FAILED, null, null, + null, @mssql_get_last_message()); + } + if ($dsninfo['database']) { + if (!@mssql_select_db($dsninfo['database'], $conn)) { + return $this->raiseError(DB_ERROR_NODBSELECTED, null, null, + null, @mssql_get_last_message()); + } + $this->_db = $dsninfo['database']; + } + $this->connection = $conn; + return DB_OK; + } + + // }}} + // {{{ disconnect() + + function disconnect() + { + $ret = @mssql_close($this->connection); + $this->connection = null; + return $ret; + } + + // }}} + // {{{ simpleQuery() + + function simpleQuery($query) + { + $ismanip = DB::isManip($query); + $this->last_query = $query; + if (!@mssql_select_db($this->_db, $this->connection)) { + return $this->mssqlRaiseError(DB_ERROR_NODBSELECTED); + } + $query = $this->modifyQuery($query); + if (!$this->autocommit && $ismanip) { + if ($this->transaction_opcount == 0) { + $result = @mssql_query('BEGIN TRAN', $this->connection); + if (!$result) { + return $this->mssqlRaiseError(); + } + } + $this->transaction_opcount++; + } + $result = @mssql_query($query, $this->connection); + if (!$result) { + return $this->mssqlRaiseError(); + } + // Determine which queries that should return data, and which + // should return an error code only. + return $ismanip ? DB_OK : $result; + } + + // }}} + // {{{ nextResult() + + /** + * Move the internal mssql result pointer to the next available result + * + * @param a valid fbsql result resource + * + * @access public + * + * @return true if a result is available otherwise return false + */ + function nextResult($result) + { + return @mssql_next_result($result); + } + + // }}} + // {{{ fetchInto() + + /** + * Fetch a row and insert the data into an existing array. + * + * Formating of the array and the data therein are configurable. + * See DB_result::fetchInto() for more information. + * + * @param resource $result query result identifier + * @param array $arr (reference) array where data from the row + * should be placed + * @param int $fetchmode how the resulting array should be indexed + * @param int $rownum the row number to fetch + * + * @return mixed DB_OK on success, null when end of result set is + * reached or on failure + * + * @see DB_result::fetchInto() + * @access private + */ + function fetchInto($result, &$arr, $fetchmode, $rownum=null) + { + if ($rownum !== null) { + if (!@mssql_data_seek($result, $rownum)) { + return null; + } + } + if ($fetchmode & DB_FETCHMODE_ASSOC) { + $arr = @mssql_fetch_array($result, MSSQL_ASSOC); + if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE && $arr) { + $arr = array_change_key_case($arr, CASE_LOWER); + } + } else { + $arr = @mssql_fetch_row($result); + } + if (!$arr) { + /* This throws informative error messages, + don't use it for now + if ($msg = @mssql_get_last_message()) { + return $this->raiseError($msg); + } + */ + return null; + } + if ($this->options['portability'] & DB_PORTABILITY_RTRIM) { + $this->_rtrimArrayValues($arr); + } + if ($this->options['portability'] & DB_PORTABILITY_NULL_TO_EMPTY) { + $this->_convertNullArrayValuesToEmpty($arr); + } + return DB_OK; + } + + // }}} + // {{{ freeResult() + + function freeResult($result) + { + return @mssql_free_result($result); + } + + // }}} + // {{{ numCols() + + function numCols($result) + { + $cols = @mssql_num_fields($result); + if (!$cols) { + return $this->mssqlRaiseError(); + } + return $cols; + } + + // }}} + // {{{ numRows() + + function numRows($result) + { + $rows = @mssql_num_rows($result); + if ($rows === false) { + return $this->mssqlRaiseError(); + } + return $rows; + } + + // }}} + // {{{ autoCommit() + + /** + * Enable/disable automatic commits + */ + function autoCommit($onoff = false) + { + // XXX if $this->transaction_opcount > 0, we should probably + // issue a warning here. + $this->autocommit = $onoff ? true : false; + return DB_OK; + } + + // }}} + // {{{ commit() + + /** + * Commit the current transaction. + */ + function commit() + { + if ($this->transaction_opcount > 0) { + if (!@mssql_select_db($this->_db, $this->connection)) { + return $this->mssqlRaiseError(DB_ERROR_NODBSELECTED); + } + $result = @mssql_query('COMMIT TRAN', $this->connection); + $this->transaction_opcount = 0; + if (!$result) { + return $this->mssqlRaiseError(); + } + } + return DB_OK; + } + + // }}} + // {{{ rollback() + + /** + * Roll back (undo) the current transaction. + */ + function rollback() + { + if ($this->transaction_opcount > 0) { + if (!@mssql_select_db($this->_db, $this->connection)) { + return $this->mssqlRaiseError(DB_ERROR_NODBSELECTED); + } + $result = @mssql_query('ROLLBACK TRAN', $this->connection); + $this->transaction_opcount = 0; + if (!$result) { + return $this->mssqlRaiseError(); + } + } + return DB_OK; + } + + // }}} + // {{{ affectedRows() + + /** + * Gets the number of rows affected by the last query. + * if the last query was a select, returns 0. + * + * @return number of rows affected by the last query or DB_ERROR + */ + function affectedRows() + { + if (DB::isManip($this->last_query)) { + $res = @mssql_query('select @@rowcount', $this->connection); + if (!$res) { + return $this->mssqlRaiseError(); + } + $ar = @mssql_fetch_row($res); + if (!$ar) { + $result = 0; + } else { + @mssql_free_result($res); + $result = $ar[0]; + } + } else { + $result = 0; + } + return $result; + } + + // }}} + // {{{ nextId() + + /** + * Returns the next free id in a sequence + * + * @param string $seq_name name of the sequence + * @param boolean $ondemand when true, the seqence is automatically + * created if it does not exist + * + * @return int the next id number in the sequence. DB_Error if problem. + * + * @internal + * @see DB_common::nextID() + * @access public + */ + function nextId($seq_name, $ondemand = true) + { + $seqname = $this->getSequenceName($seq_name); + if (!@mssql_select_db($this->_db, $this->connection)) { + return $this->mssqlRaiseError(DB_ERROR_NODBSELECTED); + } + $repeat = 0; + do { + $this->pushErrorHandling(PEAR_ERROR_RETURN); + $result = $this->query("INSERT INTO $seqname (vapor) VALUES (0)"); + $this->popErrorHandling(); + if ($ondemand && DB::isError($result) && + ($result->getCode() == DB_ERROR || $result->getCode() == DB_ERROR_NOSUCHTABLE)) + { + $repeat = 1; + $result = $this->createSequence($seq_name); + if (DB::isError($result)) { + return $this->raiseError($result); + } + } elseif (!DB::isError($result)) { + $result =& $this->query("SELECT @@IDENTITY FROM $seqname"); + $repeat = 0; + } else { + $repeat = false; + } + } while ($repeat); + if (DB::isError($result)) { + return $this->raiseError($result); + } + $result = $result->fetchRow(DB_FETCHMODE_ORDERED); + return $result[0]; + } + + /** + * Creates a new sequence + * + * @param string $seq_name name of the new sequence + * + * @return int DB_OK on success. A DB_Error object is returned if + * problems arise. + * + * @internal + * @see DB_common::createSequence() + * @access public + */ + function createSequence($seq_name) + { + $seqname = $this->getSequenceName($seq_name); + return $this->query("CREATE TABLE $seqname ". + '([id] [int] IDENTITY (1, 1) NOT NULL ,' . + '[vapor] [int] NULL)'); + } + + // }}} + // {{{ dropSequence() + + /** + * Deletes a sequence + * + * @param string $seq_name name of the sequence to be deleted + * + * @return int DB_OK on success. DB_Error if problems. + * + * @internal + * @see DB_common::dropSequence() + * @access public + */ + function dropSequence($seq_name) + { + $seqname = $this->getSequenceName($seq_name); + return $this->query("DROP TABLE $seqname"); + } + + // }}} + // {{{ errorNative() + + /** + * Determine MS SQL Server error code by querying @@ERROR. + * + * @return mixed mssql's native error code or DB_ERROR if unknown. + */ + function errorNative() + { + $res = @mssql_query('select @@ERROR as ErrorCode', $this->connection); + if (!$res) { + return DB_ERROR; + } + $row = @mssql_fetch_row($res); + return $row[0]; + } + + // }}} + // {{{ errorCode() + + /** + * Determine PEAR::DB error code from mssql's native codes. + * + * If $nativecode isn't known yet, it will be looked up. + * + * @param mixed $nativecode mssql error code, if known + * @return integer an error number from a DB error constant + * @see errorNative() + */ + function errorCode($nativecode = null) + { + if (!$nativecode) { + $nativecode = $this->errorNative(); + } + if (isset($this->errorcode_map[$nativecode])) { + return $this->errorcode_map[$nativecode]; + } else { + return DB_ERROR; + } + } + + // }}} + // {{{ mssqlRaiseError() + + /** + * Gather information about an error, then use that info to create a + * DB error object and finally return that object. + * + * @param integer $code PEAR error number (usually a DB constant) if + * manually raising an error + * @return object DB error object + * @see errorCode() + * @see errorNative() + * @see DB_common::raiseError() + */ + function mssqlRaiseError($code = null) + { + $message = @mssql_get_last_message(); + if (!$code) { + $code = $this->errorNative(); + } + return $this->raiseError($this->errorCode($code), null, null, null, + "$code - $message"); + } + + // }}} + // {{{ tableInfo() + + /** + * Returns information about a table or a result set. + * + * NOTE: only supports 'table' and 'flags' if $result + * is a table name. + * + * @param object|string $result DB_result object from a query or a + * string containing the name of a table + * @param int $mode a valid tableInfo mode + * @return array an associative array with the information requested + * or an error object if something is wrong + * @access public + * @internal + * @see DB_common::tableInfo() + */ + function tableInfo($result, $mode = null) + { + if (isset($result->result)) { + /* + * Probably received a result object. + * Extract the result resource identifier. + */ + $id = $result->result; + $got_string = false; + } elseif (is_string($result)) { + /* + * Probably received a table name. + * Create a result resource identifier. + */ + if (!@mssql_select_db($this->_db, $this->connection)) { + return $this->mssqlRaiseError(DB_ERROR_NODBSELECTED); + } + $id = @mssql_query("SELECT * FROM $result WHERE 1=0", + $this->connection); + $got_string = true; + } else { + /* + * Probably received a result resource identifier. + * Copy it. + * Deprecated. Here for compatibility only. + */ + $id = $result; + $got_string = false; + } + + if (!is_resource($id)) { + return $this->mssqlRaiseError(DB_ERROR_NEED_MORE_DATA); + } + + if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE) { + $case_func = 'strtolower'; + } else { + $case_func = 'strval'; + } + + $count = @mssql_num_fields($id); + + // made this IF due to performance (one if is faster than $count if's) + if (!$mode) { + for ($i=0; $i<$count; $i++) { + $res[$i]['table'] = $got_string ? $case_func($result) : ''; + $res[$i]['name'] = $case_func(@mssql_field_name($id, $i)); + $res[$i]['type'] = @mssql_field_type($id, $i); + $res[$i]['len'] = @mssql_field_length($id, $i); + // We only support flags for tables + $res[$i]['flags'] = $got_string ? $this->_mssql_field_flags($result, $res[$i]['name']) : ''; + } + + } else { // full + $res['num_fields']= $count; + + for ($i=0; $i<$count; $i++) { + $res[$i]['table'] = $got_string ? $case_func($result) : ''; + $res[$i]['name'] = $case_func(@mssql_field_name($id, $i)); + $res[$i]['type'] = @mssql_field_type($id, $i); + $res[$i]['len'] = @mssql_field_length($id, $i); + // We only support flags for tables + $res[$i]['flags'] = $got_string ? $this->_mssql_field_flags($result, $res[$i]['name']) : ''; + + if ($mode & DB_TABLEINFO_ORDER) { + $res['order'][$res[$i]['name']] = $i; + } + if ($mode & DB_TABLEINFO_ORDERTABLE) { + $res['ordertable'][$res[$i]['table']][$res[$i]['name']] = $i; + } + } + } + + // free the result only if we were called on a table + if ($got_string) { + @mssql_free_result($id); + } + return $res; + } + + // }}} + // {{{ getSpecialQuery() + + /** + * Returns the query needed to get some backend info + * @param string $type What kind of info you want to retrieve + * @return string The SQL query string + */ + function getSpecialQuery($type) + { + switch ($type) { + case 'tables': + return "select name from sysobjects where type = 'U' order by name"; + case 'views': + return "select name from sysobjects where type = 'V'"; + default: + return null; + } + } + + // }}} + // {{{ _mssql_field_flags() + + /** + * Get the flags for a field, currently supports "not_null", "primary_key", + * "auto_increment" (mssql identity), "timestamp" (mssql timestamp), + * "unique_key" (mssql unique index, unique check or primary_key) and + * "multiple_key" (multikey index) + * + * mssql timestamp is NOT similar to the mysql timestamp so this is maybe + * not useful at all - is the behaviour of mysql_field_flags that primary + * keys are alway unique? is the interpretation of multiple_key correct? + * + * @param string The table name + * @param string The field + * @author Joern Barthel + * @access private + */ + function _mssql_field_flags($table, $column) + { + static $tableName = null; + static $flags = array(); + + if ($table != $tableName) { + + $flags = array(); + $tableName = $table; + + // get unique and primary keys + $res = $this->getAll("EXEC SP_HELPINDEX[$table]", DB_FETCHMODE_ASSOC); + + foreach ($res as $val) { + $keys = explode(', ', $val['index_keys']); + + if (sizeof($keys) > 1) { + foreach ($keys as $key) { + $this->_add_flag($flags[$key], 'multiple_key'); + } + } + + if (strpos($val['index_description'], 'primary key')) { + foreach ($keys as $key) { + $this->_add_flag($flags[$key], 'primary_key'); + } + } elseif (strpos($val['index_description'], 'unique')) { + foreach ($keys as $key) { + $this->_add_flag($flags[$key], 'unique_key'); + } + } + } + + // get auto_increment, not_null and timestamp + $res = $this->getAll("EXEC SP_COLUMNS[$table]", DB_FETCHMODE_ASSOC); + + foreach ($res as $val) { + $val = array_change_key_case($val, CASE_LOWER); + if ($val['nullable'] == '0') { + $this->_add_flag($flags[$val['column_name']], 'not_null'); + } + if (strpos($val['type_name'], 'identity')) { + $this->_add_flag($flags[$val['column_name']], 'auto_increment'); + } + if (strpos($val['type_name'], 'timestamp')) { + $this->_add_flag($flags[$val['column_name']], 'timestamp'); + } + } + } + + if (array_key_exists($column, $flags)) { + return(implode(' ', $flags[$column])); + } + return ''; + } + + // }}} + // {{{ _add_flag() + + /** + * Adds a string to the flags array if the flag is not yet in there + * - if there is no flag present the array is created. + * + * @param reference Reference to the flag-array + * @param value The flag value + * @access private + * @author Joern Barthel + */ + function _add_flag(&$array, $value) + { + if (!is_array($array)) { + $array = array($value); + } elseif (!in_array($value, $array)) { + array_push($array, $value); + } + } + + // }}} + // {{{ quoteIdentifier() + + /** + * Quote a string so it can be safely used as a table / column name + * + * Quoting style depends on which database driver is being used. + * + * @param string $str identifier name to be quoted + * + * @return string quoted identifier string + * + * @since 1.6.0 + * @access public + */ + function quoteIdentifier($str) + { + return '[' . str_replace(']', ']]', $str) . ']'; + } + + // }}} +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + */ + +?> diff --git a/thirdparty/pear/DB/mysql.php b/thirdparty/pear/DB/mysql.php new file mode 100644 index 000000000..f7f032c17 --- /dev/null +++ b/thirdparty/pear/DB/mysql.php @@ -0,0 +1,916 @@ + | +// | Maintainer: Daniel Convissor | +// +----------------------------------------------------------------------+ +// +// $Id: mysql.php 3355 2005-06-11 22:14:40Z nbm $ + + +// XXX legend: +// +// XXX ERRORMSG: The error message from the mysql function should +// be registered here. +// +// TODO/wishlist: +// longReadlen +// binmode + + +require_once 'DB/common.php'; + +/** + * Database independent query interface definition for PHP's MySQL + * extension. + * + * This is for MySQL versions 4.0 and below. + * + * @package DB + * @version $Id: mysql.php 3355 2005-06-11 22:14:40Z nbm $ + * @category Database + * @author Stig Bakken + */ +class DB_mysql extends DB_common +{ + // {{{ properties + + var $connection; + var $phptype, $dbsyntax; + var $prepare_tokens = array(); + var $prepare_types = array(); + var $num_rows = array(); + var $transaction_opcount = 0; + var $autocommit = true; + var $fetchmode = DB_FETCHMODE_ORDERED; /* Default fetch mode */ + var $_db = false; + + // }}} + // {{{ constructor + + /** + * DB_mysql constructor. + * + * @access public + */ + function DB_mysql() + { + $this->DB_common(); + $this->phptype = 'mysql'; + $this->dbsyntax = 'mysql'; + $this->features = array( + 'prepare' => false, + 'pconnect' => true, + 'transactions' => true, + 'limit' => 'alter' + ); + $this->errorcode_map = array( + 1004 => DB_ERROR_CANNOT_CREATE, + 1005 => DB_ERROR_CANNOT_CREATE, + 1006 => DB_ERROR_CANNOT_CREATE, + 1007 => DB_ERROR_ALREADY_EXISTS, + 1008 => DB_ERROR_CANNOT_DROP, + 1022 => DB_ERROR_ALREADY_EXISTS, + 1046 => DB_ERROR_NODBSELECTED, + 1048 => DB_ERROR_CONSTRAINT, + 1050 => DB_ERROR_ALREADY_EXISTS, + 1051 => DB_ERROR_NOSUCHTABLE, + 1054 => DB_ERROR_NOSUCHFIELD, + 1062 => DB_ERROR_ALREADY_EXISTS, + 1064 => DB_ERROR_SYNTAX, + 1100 => DB_ERROR_NOT_LOCKED, + 1136 => DB_ERROR_VALUE_COUNT_ON_ROW, + 1146 => DB_ERROR_NOSUCHTABLE, + 1216 => DB_ERROR_CONSTRAINT, + 1217 => DB_ERROR_CONSTRAINT, + ); + } + + // }}} + // {{{ connect() + + /** + * Connect to a database and log in as the specified user. + * + * @param $dsn the data source name (see DB::parseDSN for syntax) + * @param $persistent (optional) whether the connection should + * be persistent + * @access public + * @return int DB_OK on success, a DB error on failure + */ + function connect($dsninfo, $persistent = false) + { + if (!DB::assertExtension('mysql')) { + return $this->raiseError(DB_ERROR_EXTENSION_NOT_FOUND); + } + $this->dsn = $dsninfo; + if ($dsninfo['protocol'] && $dsninfo['protocol'] == 'unix') { + $dbhost = ':' . $dsninfo['socket']; + } else { + $dbhost = $dsninfo['hostspec'] ? $dsninfo['hostspec'] : 'localhost'; + if ($dsninfo['port']) { + $dbhost .= ':' . $dsninfo['port']; + } + } + + $connect_function = $persistent ? 'mysql_pconnect' : 'mysql_connect'; + + if ($dbhost && $dsninfo['username'] && isset($dsninfo['password'])) { + $conn = @$connect_function($dbhost, $dsninfo['username'], + $dsninfo['password']); + } elseif ($dbhost && $dsninfo['username']) { + $conn = @$connect_function($dbhost, $dsninfo['username']); + } elseif ($dbhost) { + $conn = @$connect_function($dbhost); + } else { + $conn = false; + } + if (!$conn) { + if (($err = @mysql_error()) != '') { + return $this->raiseError(DB_ERROR_CONNECT_FAILED, null, null, + null, $err); + } elseif (empty($php_errormsg)) { + return $this->raiseError(DB_ERROR_CONNECT_FAILED); + } else { + return $this->raiseError(DB_ERROR_CONNECT_FAILED, null, null, + null, $php_errormsg); + } + } + + if ($dsninfo['database']) { + if (!@mysql_select_db($dsninfo['database'], $conn)) { + switch(mysql_errno($conn)) { + case 1049: + return $this->raiseError(DB_ERROR_NOSUCHDB, null, null, + null, @mysql_error($conn)); + case 1044: + return $this->raiseError(DB_ERROR_ACCESS_VIOLATION, null, null, + null, @mysql_error($conn)); + default: + return $this->raiseError(DB_ERROR, null, null, + null, @mysql_error($conn)); + } + } + // fix to allow calls to different databases in the same script + $this->_db = $dsninfo['database']; + } + + $this->connection = $conn; + return DB_OK; + } + + // }}} + // {{{ disconnect() + + /** + * Log out and disconnect from the database. + * + * @access public + * + * @return bool true on success, false if not connected. + */ + function disconnect() + { + $ret = @mysql_close($this->connection); + $this->connection = null; + return $ret; + } + + // }}} + // {{{ simpleQuery() + + /** + * Send a query to MySQL and return the results as a MySQL resource + * identifier. + * + * @param the SQL query + * + * @access public + * + * @return mixed returns a valid MySQL result for successful SELECT + * queries, DB_OK for other successful queries. A DB error is + * returned on failure. + */ + function simpleQuery($query) + { + $ismanip = DB::isManip($query); + $this->last_query = $query; + $query = $this->modifyQuery($query); + if ($this->_db) { + if (!@mysql_select_db($this->_db, $this->connection)) { + return $this->mysqlRaiseError(DB_ERROR_NODBSELECTED); + } + } + if (!$this->autocommit && $ismanip) { + if ($this->transaction_opcount == 0) { + $result = @mysql_query('SET AUTOCOMMIT=0', $this->connection); + $result = @mysql_query('BEGIN', $this->connection); + if (!$result) { + return $this->mysqlRaiseError(); + } + } + $this->transaction_opcount++; + } + $result = @mysql_query($query, $this->connection); + if (!$result) { + return $this->mysqlRaiseError(); + } + if (is_resource($result)) { + $numrows = $this->numrows($result); + if (is_object($numrows)) { + return $numrows; + } + $this->num_rows[(int)$result] = $numrows; + return $result; + } + return DB_OK; + } + + // }}} + // {{{ nextResult() + + /** + * Move the internal mysql result pointer to the next available result + * + * This method has not been implemented yet. + * + * @param a valid sql result resource + * + * @access public + * + * @return false + */ + function nextResult($result) + { + return false; + } + + // }}} + // {{{ fetchInto() + + /** + * Fetch a row and insert the data into an existing array. + * + * Formating of the array and the data therein are configurable. + * See DB_result::fetchInto() for more information. + * + * @param resource $result query result identifier + * @param array $arr (reference) array where data from the row + * should be placed + * @param int $fetchmode how the resulting array should be indexed + * @param int $rownum the row number to fetch + * + * @return mixed DB_OK on success, null when end of result set is + * reached or on failure + * + * @see DB_result::fetchInto() + * @access private + */ + function fetchInto($result, &$arr, $fetchmode, $rownum=null) + { + if ($rownum !== null) { + if (!@mysql_data_seek($result, $rownum)) { + return null; + } + } + if ($fetchmode & DB_FETCHMODE_ASSOC) { + $arr = @mysql_fetch_array($result, MYSQL_ASSOC); + if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE && $arr) { + $arr = array_change_key_case($arr, CASE_LOWER); + } + } else { + $arr = @mysql_fetch_row($result); + } + if (!$arr) { + // See: http://bugs.php.net/bug.php?id=22328 + // for why we can't check errors on fetching + return null; + /* + $errno = @mysql_errno($this->connection); + if (!$errno) { + return null; + } + return $this->mysqlRaiseError($errno); + */ + } + if ($this->options['portability'] & DB_PORTABILITY_RTRIM) { + /* + * Even though this DBMS already trims output, we do this because + * a field might have intentional whitespace at the end that + * gets removed by DB_PORTABILITY_RTRIM under another driver. + */ + $this->_rtrimArrayValues($arr); + } + if ($this->options['portability'] & DB_PORTABILITY_NULL_TO_EMPTY) { + $this->_convertNullArrayValuesToEmpty($arr); + } + return DB_OK; + } + + // }}} + // {{{ freeResult() + + /** + * Free the internal resources associated with $result. + * + * @param $result MySQL result identifier + * + * @access public + * + * @return bool true on success, false if $result is invalid + */ + function freeResult($result) + { + unset($this->num_rows[(int)$result]); + return @mysql_free_result($result); + } + + // }}} + // {{{ numCols() + + /** + * Get the number of columns in a result set. + * + * @param $result MySQL result identifier + * + * @access public + * + * @return int the number of columns per row in $result + */ + function numCols($result) + { + $cols = @mysql_num_fields($result); + + if (!$cols) { + return $this->mysqlRaiseError(); + } + + return $cols; + } + + // }}} + // {{{ numRows() + + /** + * Get the number of rows in a result set. + * + * @param $result MySQL result identifier + * + * @access public + * + * @return int the number of rows in $result + */ + function numRows($result) + { + $rows = @mysql_num_rows($result); + if ($rows === null) { + return $this->mysqlRaiseError(); + } + return $rows; + } + + // }}} + // {{{ autoCommit() + + /** + * Enable/disable automatic commits + */ + function autoCommit($onoff = false) + { + // XXX if $this->transaction_opcount > 0, we should probably + // issue a warning here. + $this->autocommit = $onoff ? true : false; + return DB_OK; + } + + // }}} + // {{{ commit() + + /** + * Commit the current transaction. + */ + function commit() + { + if ($this->transaction_opcount > 0) { + if ($this->_db) { + if (!@mysql_select_db($this->_db, $this->connection)) { + return $this->mysqlRaiseError(DB_ERROR_NODBSELECTED); + } + } + $result = @mysql_query('COMMIT', $this->connection); + $result = @mysql_query('SET AUTOCOMMIT=1', $this->connection); + $this->transaction_opcount = 0; + if (!$result) { + return $this->mysqlRaiseError(); + } + } + return DB_OK; + } + + // }}} + // {{{ rollback() + + /** + * Roll back (undo) the current transaction. + */ + function rollback() + { + if ($this->transaction_opcount > 0) { + if ($this->_db) { + if (!@mysql_select_db($this->_db, $this->connection)) { + return $this->mysqlRaiseError(DB_ERROR_NODBSELECTED); + } + } + $result = @mysql_query('ROLLBACK', $this->connection); + $result = @mysql_query('SET AUTOCOMMIT=1', $this->connection); + $this->transaction_opcount = 0; + if (!$result) { + return $this->mysqlRaiseError(); + } + } + return DB_OK; + } + + // }}} + // {{{ affectedRows() + + /** + * Gets the number of rows affected by the data manipulation + * query. For other queries, this function returns 0. + * + * @return number of rows affected by the last query + */ + function affectedRows() + { + if (DB::isManip($this->last_query)) { + return @mysql_affected_rows($this->connection); + } else { + return 0; + } + } + + // }}} + // {{{ errorNative() + + /** + * Get the native error code of the last error (if any) that + * occured on the current connection. + * + * @access public + * + * @return int native MySQL error code + */ + function errorNative() + { + return @mysql_errno($this->connection); + } + + // }}} + // {{{ nextId() + + /** + * Returns the next free id in a sequence + * + * @param string $seq_name name of the sequence + * @param boolean $ondemand when true, the seqence is automatically + * created if it does not exist + * + * @return int the next id number in the sequence. DB_Error if problem. + * + * @internal + * @see DB_common::nextID() + * @access public + */ + function nextId($seq_name, $ondemand = true) + { + $seqname = $this->getSequenceName($seq_name); + do { + $repeat = 0; + $this->pushErrorHandling(PEAR_ERROR_RETURN); + $result = $this->query("UPDATE ${seqname} ". + 'SET id=LAST_INSERT_ID(id+1)'); + $this->popErrorHandling(); + if ($result === DB_OK) { + /** COMMON CASE **/ + $id = @mysql_insert_id($this->connection); + if ($id != 0) { + return $id; + } + /** EMPTY SEQ TABLE **/ + // Sequence table must be empty for some reason, so fill it and return 1 + // Obtain a user-level lock + $result = $this->getOne("SELECT GET_LOCK('${seqname}_lock',10)"); + if (DB::isError($result)) { + return $this->raiseError($result); + } + if ($result == 0) { + // Failed to get the lock, bail with a DB_ERROR_NOT_LOCKED error + return $this->mysqlRaiseError(DB_ERROR_NOT_LOCKED); + } + + // add the default value + $result = $this->query("REPLACE INTO ${seqname} (id) VALUES (0)"); + if (DB::isError($result)) { + return $this->raiseError($result); + } + + // Release the lock + $result = $this->getOne("SELECT RELEASE_LOCK('${seqname}_lock')"); + if (DB::isError($result)) { + return $this->raiseError($result); + } + // We know what the result will be, so no need to try again + return 1; + + /** ONDEMAND TABLE CREATION **/ + } elseif ($ondemand && DB::isError($result) && + $result->getCode() == DB_ERROR_NOSUCHTABLE) + { + $result = $this->createSequence($seq_name); + if (DB::isError($result)) { + return $this->raiseError($result); + } else { + $repeat = 1; + } + + /** BACKWARDS COMPAT **/ + } elseif (DB::isError($result) && + $result->getCode() == DB_ERROR_ALREADY_EXISTS) + { + // see _BCsequence() comment + $result = $this->_BCsequence($seqname); + if (DB::isError($result)) { + return $this->raiseError($result); + } + $repeat = 1; + } + } while ($repeat); + + return $this->raiseError($result); + } + + // }}} + // {{{ createSequence() + + /** + * Creates a new sequence + * + * @param string $seq_name name of the new sequence + * + * @return int DB_OK on success. A DB_Error object is returned if + * problems arise. + * + * @internal + * @see DB_common::createSequence() + * @access public + */ + function createSequence($seq_name) + { + $seqname = $this->getSequenceName($seq_name); + $res = $this->query("CREATE TABLE ${seqname} ". + '(id INTEGER UNSIGNED AUTO_INCREMENT NOT NULL,'. + ' PRIMARY KEY(id))'); + if (DB::isError($res)) { + return $res; + } + // insert yields value 1, nextId call will generate ID 2 + $res = $this->query("INSERT INTO ${seqname} (id) VALUES (0)"); + if (DB::isError($res)) { + return $res; + } + // so reset to zero + return $this->query("UPDATE ${seqname} SET id = 0;"); + } + + // }}} + // {{{ dropSequence() + + /** + * Deletes a sequence + * + * @param string $seq_name name of the sequence to be deleted + * + * @return int DB_OK on success. DB_Error if problems. + * + * @internal + * @see DB_common::dropSequence() + * @access public + */ + function dropSequence($seq_name) + { + return $this->query('DROP TABLE ' . $this->getSequenceName($seq_name)); + } + + // }}} + // {{{ _BCsequence() + + /** + * Backwards compatibility with old sequence emulation implementation + * (clean up the dupes) + * + * @param string $seqname The sequence name to clean up + * @return mixed DB_Error or true + */ + function _BCsequence($seqname) + { + // Obtain a user-level lock... this will release any previous + // application locks, but unlike LOCK TABLES, it does not abort + // the current transaction and is much less frequently used. + $result = $this->getOne("SELECT GET_LOCK('${seqname}_lock',10)"); + if (DB::isError($result)) { + return $result; + } + if ($result == 0) { + // Failed to get the lock, can't do the conversion, bail + // with a DB_ERROR_NOT_LOCKED error + return $this->mysqlRaiseError(DB_ERROR_NOT_LOCKED); + } + + $highest_id = $this->getOne("SELECT MAX(id) FROM ${seqname}"); + if (DB::isError($highest_id)) { + return $highest_id; + } + // This should kill all rows except the highest + // We should probably do something if $highest_id isn't + // numeric, but I'm at a loss as how to handle that... + $result = $this->query("DELETE FROM ${seqname} WHERE id <> $highest_id"); + if (DB::isError($result)) { + return $result; + } + + // If another thread has been waiting for this lock, + // it will go thru the above procedure, but will have no + // real effect + $result = $this->getOne("SELECT RELEASE_LOCK('${seqname}_lock')"); + if (DB::isError($result)) { + return $result; + } + return true; + } + + // }}} + // {{{ quoteIdentifier() + + /** + * Quote a string so it can be safely used as a table or column name + * + * Quoting style depends on which database driver is being used. + * + * MySQL can't handle the backtick character (`) in + * table or column names. + * + * @param string $str identifier name to be quoted + * + * @return string quoted identifier string + * + * @since 1.6.0 + * @access public + * @internal + */ + function quoteIdentifier($str) + { + return '`' . $str . '`'; + } + + // }}} + // {{{ quote() + + /** + * @deprecated Deprecated in release 1.6.0 + * @internal + */ + function quote($str) { + return $this->quoteSmart($str); + } + + // }}} + // {{{ escapeSimple() + + /** + * Escape a string according to the current DBMS's standards + * + * @param string $str the string to be escaped + * + * @return string the escaped string + * + * @internal + */ + function escapeSimple($str) { + if (function_exists('mysql_real_escape_string')) { + return @mysql_real_escape_string($str, $this->connection); + } else { + return @mysql_escape_string($str); + } + } + + // }}} + // {{{ modifyQuery() + + function modifyQuery($query) + { + if ($this->options['portability'] & DB_PORTABILITY_DELETE_COUNT) { + // "DELETE FROM table" gives 0 affected rows in MySQL. + // This little hack lets you know how many rows were deleted. + if (preg_match('/^\s*DELETE\s+FROM\s+(\S+)\s*$/i', $query)) { + $query = preg_replace('/^\s*DELETE\s+FROM\s+(\S+)\s*$/', + 'DELETE FROM \1 WHERE 1=1', $query); + } + } + return $query; + } + + // }}} + // {{{ modifyLimitQuery() + + function modifyLimitQuery($query, $from, $count, $params = array()) + { + if (DB::isManip($query)) { + return $query . " LIMIT $count"; + } else { + return $query . " LIMIT $from, $count"; + } + } + + // }}} + // {{{ mysqlRaiseError() + + /** + * Gather information about an error, then use that info to create a + * DB error object and finally return that object. + * + * @param integer $errno PEAR error number (usually a DB constant) if + * manually raising an error + * @return object DB error object + * @see DB_common::errorCode() + * @see DB_common::raiseError() + */ + function mysqlRaiseError($errno = null) + { + if ($errno === null) { + if ($this->options['portability'] & DB_PORTABILITY_ERRORS) { + $this->errorcode_map[1022] = DB_ERROR_CONSTRAINT; + $this->errorcode_map[1048] = DB_ERROR_CONSTRAINT_NOT_NULL; + $this->errorcode_map[1062] = DB_ERROR_CONSTRAINT; + } else { + // Doing this in case mode changes during runtime. + $this->errorcode_map[1022] = DB_ERROR_ALREADY_EXISTS; + $this->errorcode_map[1048] = DB_ERROR_CONSTRAINT; + $this->errorcode_map[1062] = DB_ERROR_ALREADY_EXISTS; + } + $errno = $this->errorCode(mysql_errno($this->connection)); + } + return $this->raiseError($errno, null, null, null, + @mysql_errno($this->connection) . ' ** ' . + @mysql_error($this->connection)); + } + + // }}} + // {{{ tableInfo() + + /** + * Returns information about a table or a result set. + * + * @param object|string $result DB_result object from a query or a + * string containing the name of a table + * @param int $mode a valid tableInfo mode + * @return array an associative array with the information requested + * or an error object if something is wrong + * @access public + * @internal + * @see DB_common::tableInfo() + */ + function tableInfo($result, $mode = null) { + if (isset($result->result)) { + /* + * Probably received a result object. + * Extract the result resource identifier. + */ + $id = $result->result; + $got_string = false; + } elseif (is_string($result)) { + /* + * Probably received a table name. + * Create a result resource identifier. + */ + $id = @mysql_list_fields($this->dsn['database'], + $result, $this->connection); + $got_string = true; + } else { + /* + * Probably received a result resource identifier. + * Copy it. + * Deprecated. Here for compatibility only. + */ + $id = $result; + $got_string = false; + } + + if (!is_resource($id)) { + return $this->mysqlRaiseError(DB_ERROR_NEED_MORE_DATA); + } + + if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE) { + $case_func = 'strtolower'; + } else { + $case_func = 'strval'; + } + + $count = @mysql_num_fields($id); + + // made this IF due to performance (one if is faster than $count if's) + if (!$mode) { + for ($i=0; $i<$count; $i++) { + $res[$i]['table'] = $case_func(@mysql_field_table($id, $i)); + $res[$i]['name'] = $case_func(@mysql_field_name($id, $i)); + $res[$i]['type'] = @mysql_field_type($id, $i); + $res[$i]['len'] = @mysql_field_len($id, $i); + $res[$i]['flags'] = @mysql_field_flags($id, $i); + } + } else { // full + $res['num_fields']= $count; + + for ($i=0; $i<$count; $i++) { + $res[$i]['table'] = $case_func(@mysql_field_table($id, $i)); + $res[$i]['name'] = $case_func(@mysql_field_name($id, $i)); + $res[$i]['type'] = @mysql_field_type($id, $i); + $res[$i]['len'] = @mysql_field_len($id, $i); + $res[$i]['flags'] = @mysql_field_flags($id, $i); + + if ($mode & DB_TABLEINFO_ORDER) { + $res['order'][$res[$i]['name']] = $i; + } + if ($mode & DB_TABLEINFO_ORDERTABLE) { + $res['ordertable'][$res[$i]['table']][$res[$i]['name']] = $i; + } + } + } + + // free the result only if we were called on a table + if ($got_string) { + @mysql_free_result($id); + } + return $res; + } + + // }}} + // {{{ getSpecialQuery() + + /** + * Returns the query needed to get some backend info + * @param string $type What kind of info you want to retrieve + * @return string The SQL query string + */ + function getSpecialQuery($type) + { + switch ($type) { + case 'tables': + return 'SHOW TABLES'; + case 'views': + return DB_ERROR_NOT_CAPABLE; + case 'users': + $sql = 'select distinct User from user'; + if ($this->dsn['database'] != 'mysql') { + $dsn = $this->dsn; + $dsn['database'] = 'mysql'; + if (DB::isError($db = DB::connect($dsn))) { + return $db; + } + $sql = $db->getCol($sql); + $db->disconnect(); + // XXX Fixme the mysql driver should take care of this + if (!@mysql_select_db($this->dsn['database'], $this->connection)) { + return $this->mysqlRaiseError(DB_ERROR_NODBSELECTED); + } + } + return $sql; + case 'databases': + return 'SHOW DATABASES'; + default: + return null; + } + } + + // }}} + +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + */ + +?> diff --git a/thirdparty/pear/DB/mysqli.php b/thirdparty/pear/DB/mysqli.php new file mode 100644 index 000000000..3c0fd1db4 --- /dev/null +++ b/thirdparty/pear/DB/mysqli.php @@ -0,0 +1,960 @@ + | +// +----------------------------------------------------------------------+ +// +// $Id: mysqli.php 3355 2005-06-11 22:14:40Z nbm $ + + +// EXPERIMENTAL + + +require_once 'DB/common.php'; + +/** + * Database independent query interface definition for PHP's mysqli + * extension. + * + * This is for MySQL versions 4.1 and above. Requires PHP 5. + * + * Note that persistent connections no longer exist. + * + * @package DB + * @version $Id: mysqli.php 3355 2005-06-11 22:14:40Z nbm $ + * @category Database + * @author Daniel Convissor + * @since Class functional since Release 1.6.3 + */ +class DB_mysqli extends DB_common +{ + // {{{ properties + + var $connection; + var $phptype, $dbsyntax; + var $prepare_tokens = array(); + var $prepare_types = array(); + var $num_rows = array(); + var $transaction_opcount = 0; + var $autocommit = true; + var $fetchmode = DB_FETCHMODE_ORDERED; /* Default fetch mode */ + var $_db = false; + + /** + * Array for converting MYSQLI_*_FLAG constants to text values + * @var array + * @access public + * @since Property available since Release 1.6.5 + */ + var $mysqli_flags = array( + MYSQLI_NOT_NULL_FLAG => 'not_null', + MYSQLI_PRI_KEY_FLAG => 'primary_key', + MYSQLI_UNIQUE_KEY_FLAG => 'unique_key', + MYSQLI_MULTIPLE_KEY_FLAG => 'multiple_key', + MYSQLI_BLOB_FLAG => 'blob', + MYSQLI_UNSIGNED_FLAG => 'unsigned', + MYSQLI_ZEROFILL_FLAG => 'zerofill', + MYSQLI_AUTO_INCREMENT_FLAG => 'auto_increment', + MYSQLI_TIMESTAMP_FLAG => 'timestamp', + MYSQLI_SET_FLAG => 'set', + // MYSQLI_NUM_FLAG => 'numeric', // unnecessary + // MYSQLI_PART_KEY_FLAG => 'multiple_key', // duplicatvie + MYSQLI_GROUP_FLAG => 'group_by' + ); + + /** + * Array for converting MYSQLI_TYPE_* constants to text values + * @var array + * @access public + * @since Property available since Release 1.6.5 + */ + var $mysqli_types = array( + MYSQLI_TYPE_DECIMAL => 'decimal', + MYSQLI_TYPE_TINY => 'tinyint', + MYSQLI_TYPE_SHORT => 'int', + MYSQLI_TYPE_LONG => 'int', + MYSQLI_TYPE_FLOAT => 'float', + MYSQLI_TYPE_DOUBLE => 'double', + // MYSQLI_TYPE_NULL => 'DEFAULT NULL', // let flags handle it + MYSQLI_TYPE_TIMESTAMP => 'timestamp', + MYSQLI_TYPE_LONGLONG => 'bigint', + MYSQLI_TYPE_INT24 => 'mediumint', + MYSQLI_TYPE_DATE => 'date', + MYSQLI_TYPE_TIME => 'time', + MYSQLI_TYPE_DATETIME => 'datetime', + MYSQLI_TYPE_YEAR => 'year', + MYSQLI_TYPE_NEWDATE => 'date', + MYSQLI_TYPE_ENUM => 'enum', + MYSQLI_TYPE_SET => 'set', + MYSQLI_TYPE_TINY_BLOB => 'tinyblob', + MYSQLI_TYPE_MEDIUM_BLOB => 'mediumblob', + MYSQLI_TYPE_LONG_BLOB => 'longblob', + MYSQLI_TYPE_BLOB => 'blob', + MYSQLI_TYPE_VAR_STRING => 'varchar', + MYSQLI_TYPE_STRING => 'char', + MYSQLI_TYPE_GEOMETRY => 'geometry', + ); + + // }}} + // {{{ constructor + + /** + * DB_mysql constructor. + * + * @access public + */ + function DB_mysqli() + { + $this->DB_common(); + $this->phptype = 'mysqli'; + $this->dbsyntax = 'mysqli'; + $this->features = array( + 'prepare' => false, + 'ssl' => true, + 'transactions' => true, + 'limit' => 'alter' + ); + $this->errorcode_map = array( + 1004 => DB_ERROR_CANNOT_CREATE, + 1005 => DB_ERROR_CANNOT_CREATE, + 1006 => DB_ERROR_CANNOT_CREATE, + 1007 => DB_ERROR_ALREADY_EXISTS, + 1008 => DB_ERROR_CANNOT_DROP, + 1022 => DB_ERROR_ALREADY_EXISTS, + 1046 => DB_ERROR_NODBSELECTED, + 1048 => DB_ERROR_CONSTRAINT, + 1050 => DB_ERROR_ALREADY_EXISTS, + 1051 => DB_ERROR_NOSUCHTABLE, + 1054 => DB_ERROR_NOSUCHFIELD, + 1062 => DB_ERROR_ALREADY_EXISTS, + 1064 => DB_ERROR_SYNTAX, + 1100 => DB_ERROR_NOT_LOCKED, + 1136 => DB_ERROR_VALUE_COUNT_ON_ROW, + 1146 => DB_ERROR_NOSUCHTABLE, + 1216 => DB_ERROR_CONSTRAINT, + 1217 => DB_ERROR_CONSTRAINT, + ); + } + + // }}} + // {{{ connect() + + /** + * Connect to a database and log in as the specified user. + * + * @param string $dsn the data source name (see DB::parseDSN for syntax) + * @param boolean $persistent (optional) whether the connection should + * be persistent + * @return mixed DB_OK on success, a DB error on failure + * @access public + */ + function connect($dsninfo, $persistent = false) + { + if (!DB::assertExtension('mysqli')) { + return $this->raiseError(DB_ERROR_EXTENSION_NOT_FOUND); + } + + $this->dsn = $dsninfo; + $conn = false; + @ini_set('track_errors', true); + + if ($this->getOption('ssl') === true) { + $init = mysqli_init(); + mysqli_ssl_set( + $init, + empty($dsninfo['key']) ? null : $dsninfo['key'], + empty($dsninfo['cert']) ? null : $dsninfo['cert'], + empty($dsninfo['ca']) ? null : $dsninfo['ca'], + empty($dsninfo['capath']) ? null : $dsninfo['capath'], + empty($dsninfo['cipher']) ? null : $dsninfo['cipher'] + ); + if ($conn = @mysqli_real_connect($init, + $dsninfo['hostspec'], + $dsninfo['username'], + $dsninfo['password'], + $dsninfo['database'], + $dsninfo['port'], + $dsninfo['socket'])) + { + $conn = $init; + } + } else { + $conn = @mysqli_connect( + $dsninfo['hostspec'], + $dsninfo['username'], + $dsninfo['password'], + $dsninfo['database'], + $dsninfo['port'], + $dsninfo['socket'] + ); + } + + @ini_restore('track_errors'); + + if (!$conn) { + if (($err = @mysqli_connect_error()) != '') { + return $this->raiseError(DB_ERROR_CONNECT_FAILED, null, null, + null, $err); + } elseif (empty($php_errormsg)) { + return $this->raiseError(DB_ERROR_CONNECT_FAILED); + } else { + return $this->raiseError(DB_ERROR_CONNECT_FAILED, null, null, + null, $php_errormsg); + } + } + + if ($dsninfo['database']) { + $this->_db = $dsninfo['database']; + } + + $this->connection = $conn; + return DB_OK; + } + + // }}} + // {{{ disconnect() + + /** + * Log out and disconnect from the database. + * + * @return boolean true on success, false if not connected + * @access public + */ + function disconnect() + { + $ret = @mysqli_close($this->connection); + $this->connection = null; + return $ret; + } + + // }}} + // {{{ simpleQuery() + + /** + * Send a query to MySQL and return the results as a MySQL resource + * identifier. + * + * @param string $query the SQL query + * @return mixed a valid MySQL result for successful SELECT + * queries, DB_OK for other successful queries. + * A DB error is returned on failure. + * @access public + */ + function simpleQuery($query) + { + $ismanip = DB::isManip($query); + $this->last_query = $query; + $query = $this->modifyQuery($query); + if ($this->_db) { + if (!@mysqli_select_db($this->connection, $this->_db)) { + return $this->mysqlRaiseError(DB_ERROR_NODBSELECTED); + } + } + if (!$this->autocommit && $ismanip) { + if ($this->transaction_opcount == 0) { + $result = @mysqli_query($this->connection, 'SET AUTOCOMMIT=0'); + $result = @mysqli_query($this->connection, 'BEGIN'); + if (!$result) { + return $this->mysqlRaiseError(); + } + } + $this->transaction_opcount++; + } + $result = @mysqli_query($this->connection, $query); + if (!$result) { + return $this->mysqlRaiseError(); + } +# this next block is still sketchy.. + if (is_object($result)) { + $numrows = $this->numrows($result); + if (is_object($numrows)) { + return $numrows; + } +# need to come up with different means for next line +# since $result is object (int)$result won't fly... +// $this->num_rows[(int)$result] = $numrows; + return $result; + } + return DB_OK; + } + + // }}} + // {{{ nextResult() + + /** + * Move the internal mysql result pointer to the next available result. + * + * This method has not been implemented yet. + * + * @param resource $result a valid sql result resource + * @return false + * @access public + */ + function nextResult($result) + { + return false; + } + + // }}} + // {{{ fetchInto() + + /** + * Fetch a row and insert the data into an existing array. + * + * Formating of the array and the data therein are configurable. + * See DB_result::fetchInto() for more information. + * + * @param resource $result query result identifier + * @param array $arr (reference) array where data from the row + * should be placed + * @param int $fetchmode how the resulting array should be indexed + * @param int $rownum the row number to fetch + * + * @return mixed DB_OK on success, null when end of result set is + * reached or on failure + * + * @see DB_result::fetchInto() + * @access private + */ + function fetchInto($result, &$arr, $fetchmode, $rownum=null) + { + if ($rownum !== null) { + if (!@mysqli_data_seek($result, $rownum)) { + return null; + } + } + if ($fetchmode & DB_FETCHMODE_ASSOC) { + $arr = @mysqli_fetch_array($result, MYSQLI_ASSOC); + if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE && $arr) { + $arr = array_change_key_case($arr, CASE_LOWER); + } + } else { + $arr = @mysqli_fetch_row($result); + } + if (!$arr) { + $errno = @mysqli_errno($this->connection); + if (!$errno) { + return null; + } + return $this->mysqlRaiseError($errno); + } + if ($this->options['portability'] & DB_PORTABILITY_RTRIM) { + /* + * Even though this DBMS already trims output, we do this because + * a field might have intentional whitespace at the end that + * gets removed by DB_PORTABILITY_RTRIM under another driver. + */ + $this->_rtrimArrayValues($arr); + } + if ($this->options['portability'] & DB_PORTABILITY_NULL_TO_EMPTY) { + $this->_convertNullArrayValuesToEmpty($arr); + } + return DB_OK; + } + + // }}} + // {{{ freeResult() + + /** + * Free the internal resources associated with $result. + * + * @param resource $result MySQL result identifier + * @return bool true on success, false if $result is invalid + * @access public + */ + function freeResult($result) + { +# need to come up with different means for next line +# since $result is object (int)$result won't fly... +// unset($this->num_rows[(int)$result]); + return @mysqli_free_result($result); + } + + // }}} + // {{{ numCols() + + /** + * Get the number of columns in a result set. + * + * @param $result MySQL result identifier + * + * @access public + * + * @return int the number of columns per row in $result + */ + function numCols($result) + { + $cols = @mysqli_num_fields($result); + + if (!$cols) { + return $this->mysqlRaiseError(); + } + + return $cols; + } + + // }}} + // {{{ numRows() + + /** + * Get the number of rows in a result set. + * + * @param resource $result MySQL result identifier + * @return int the number of rows in $result + * @access public + */ + function numRows($result) + { + $rows = @mysqli_num_rows($result); + if ($rows === null) { + return $this->mysqlRaiseError(); + } + return $rows; + } + + // }}} + // {{{ autoCommit() + + /** + * Enable/disable automatic commits. + */ + function autoCommit($onoff = false) + { + // XXX if $this->transaction_opcount > 0, we should probably + // issue a warning here. + $this->autocommit = $onoff ? true : false; + return DB_OK; + } + + // }}} + // {{{ commit() + + /** + * Commit the current transaction. + */ + function commit() + { + if ($this->transaction_opcount > 0) { + if ($this->_db) { + if (!@mysqli_select_db($this->connection, $this->_db)) { + return $this->mysqlRaiseError(DB_ERROR_NODBSELECTED); + } + } + $result = @mysqli_query($this->connection, 'COMMIT'); + $result = @mysqli_query($this->connection, 'SET AUTOCOMMIT=1'); + $this->transaction_opcount = 0; + if (!$result) { + return $this->mysqlRaiseError(); + } + } + return DB_OK; + } + + // }}} + // {{{ rollback() + + /** + * Roll back (undo) the current transaction. + */ + function rollback() + { + if ($this->transaction_opcount > 0) { + if ($this->_db) { + if (!@mysqli_select_db($this->connection, $this->_db)) { + return $this->mysqlRaiseError(DB_ERROR_NODBSELECTED); + } + } + $result = @mysqli_query($this->connection, 'ROLLBACK'); + $result = @mysqli_query($this->connection, 'SET AUTOCOMMIT=1'); + $this->transaction_opcount = 0; + if (!$result) { + return $this->mysqlRaiseError(); + } + } + return DB_OK; + } + + // }}} + // {{{ affectedRows() + + /** + * Gets the number of rows affected by the data manipulation + * query. For other queries, this function returns 0. + * + * @return integer number of rows affected by the last query + */ + function affectedRows() + { + if (DB::isManip($this->last_query)) { + return @mysqli_affected_rows($this->connection); + } else { + return 0; + } + } + + // }}} + // {{{ errorNative() + + /** + * Get the native error code of the last error (if any) that + * occured on the current connection. + * + * @return int native MySQL error code + * @access public + */ + function errorNative() + { + return @mysqli_errno($this->connection); + } + + // }}} + // {{{ nextId() + + /** + * Returns the next free id in a sequence + * + * @param string $seq_name name of the sequence + * @param boolean $ondemand when true, the seqence is automatically + * created if it does not exist + * + * @return int the next id number in the sequence. DB_Error if problem. + * + * @internal + * @see DB_common::nextID() + * @access public + */ + function nextId($seq_name, $ondemand = true) + { + $seqname = $this->getSequenceName($seq_name); + do { + $repeat = 0; + $this->pushErrorHandling(PEAR_ERROR_RETURN); + $result = $this->query("UPDATE ${seqname} ". + 'SET id=LAST_INSERT_ID(id+1)'); + $this->popErrorHandling(); + if ($result === DB_OK) { + /** COMMON CASE **/ + $id = @mysqli_insert_id($this->connection); + if ($id != 0) { + return $id; + } + /** EMPTY SEQ TABLE **/ + // Sequence table must be empty for some reason, so fill it and return 1 + // Obtain a user-level lock + $result = $this->getOne("SELECT GET_LOCK('${seqname}_lock',10)"); + if (DB::isError($result)) { + return $this->raiseError($result); + } + if ($result == 0) { + // Failed to get the lock, bail with a DB_ERROR_NOT_LOCKED error + return $this->mysqlRaiseError(DB_ERROR_NOT_LOCKED); + } + + // add the default value + $result = $this->query("REPLACE INTO ${seqname} (id) VALUES (0)"); + if (DB::isError($result)) { + return $this->raiseError($result); + } + + // Release the lock + $result = $this->getOne("SELECT RELEASE_LOCK('${seqname}_lock')"); + if (DB::isError($result)) { + return $this->raiseError($result); + } + // We know what the result will be, so no need to try again + return 1; + + /** ONDEMAND TABLE CREATION **/ + } elseif ($ondemand && DB::isError($result) && + $result->getCode() == DB_ERROR_NOSUCHTABLE) + { + $result = $this->createSequence($seq_name); + // Since createSequence initializes the ID to be 1, + // we do not need to retrieve the ID again (or we will get 2) + if (DB::isError($result)) { + return $this->raiseError($result); + } else { + // First ID of a newly created sequence is 1 + return 1; + } + + /** BACKWARDS COMPAT **/ + } elseif (DB::isError($result) && + $result->getCode() == DB_ERROR_ALREADY_EXISTS) + { + // see _BCsequence() comment + $result = $this->_BCsequence($seqname); + if (DB::isError($result)) { + return $this->raiseError($result); + } + $repeat = 1; + } + } while ($repeat); + + return $this->raiseError($result); + } + + /** + * Creates a new sequence + * + * @param string $seq_name name of the new sequence + * + * @return int DB_OK on success. A DB_Error object is returned if + * problems arise. + * + * @internal + * @see DB_common::createSequence() + * @access public + */ + function createSequence($seq_name) + { + $seqname = $this->getSequenceName($seq_name); + $res = $this->query("CREATE TABLE ${seqname} ". + '(id INTEGER UNSIGNED AUTO_INCREMENT NOT NULL,'. + ' PRIMARY KEY(id))'); + if (DB::isError($res)) { + return $res; + } + // insert yields value 1, nextId call will generate ID 2 + return $this->query("INSERT INTO ${seqname} (id) VALUES (0)"); + } + + // }}} + // {{{ dropSequence() + + /** + * Deletes a sequence + * + * @param string $seq_name name of the sequence to be deleted + * + * @return int DB_OK on success. DB_Error if problems. + * + * @internal + * @see DB_common::dropSequence() + * @access public + */ + function dropSequence($seq_name) + { + return $this->query('DROP TABLE ' . $this->getSequenceName($seq_name)); + } + + // }}} + // {{{ _BCsequence() + + /** + * Backwards compatibility with old sequence emulation implementation + * (clean up the dupes). + * + * @param string $seqname The sequence name to clean up + * @return mixed DB_Error or true + */ + function _BCsequence($seqname) + { + // Obtain a user-level lock... this will release any previous + // application locks, but unlike LOCK TABLES, it does not abort + // the current transaction and is much less frequently used. + $result = $this->getOne("SELECT GET_LOCK('${seqname}_lock',10)"); + if (DB::isError($result)) { + return $result; + } + if ($result == 0) { + // Failed to get the lock, can't do the conversion, bail + // with a DB_ERROR_NOT_LOCKED error + return $this->mysqlRaiseError(DB_ERROR_NOT_LOCKED); + } + + $highest_id = $this->getOne("SELECT MAX(id) FROM ${seqname}"); + if (DB::isError($highest_id)) { + return $highest_id; + } + // This should kill all rows except the highest + // We should probably do something if $highest_id isn't + // numeric, but I'm at a loss as how to handle that... + $result = $this->query("DELETE FROM ${seqname} WHERE id <> $highest_id"); + if (DB::isError($result)) { + return $result; + } + + // If another thread has been waiting for this lock, + // it will go thru the above procedure, but will have no + // real effect + $result = $this->getOne("SELECT RELEASE_LOCK('${seqname}_lock')"); + if (DB::isError($result)) { + return $result; + } + return true; + } + + // }}} + // {{{ quoteIdentifier() + + /** + * Quote a string so it can be safely used as a table or column name + * + * Quoting style depends on which database driver is being used. + * + * MySQL can't handle the backtick character (`) in + * table or column names. + * + * @param string $str identifier name to be quoted + * + * @return string quoted identifier string + * + * @since 1.6.0 + * @access public + * @internal + */ + function quoteIdentifier($str) + { + return '`' . $str . '`'; + } + + // }}} + // {{{ escapeSimple() + + /** + * Escape a string according to the current DBMS's standards + * + * @param string $str the string to be escaped + * + * @return string the escaped string + * + * @internal + */ + function escapeSimple($str) { + return @mysqli_real_escape_string($this->connection, $str); + } + + // }}} + // {{{ modifyQuery() + + function modifyQuery($query) + { + return $query; + } + + // }}} + // {{{ modifyLimitQuery() + + function modifyLimitQuery($query, $from, $count, $params = array()) + { + if (DB::isManip($query)) { + return $query . " LIMIT $count"; + } else { + return $query . " LIMIT $from, $count"; + } + } + + // }}} + // {{{ mysqlRaiseError() + + /** + * Gather information about an error, then use that info to create a + * DB error object and finally return that object. + * + * @param integer $errno PEAR error number (usually a DB constant) if + * manually raising an error + * @return object DB error object + * @see DB_common::errorCode() + * @see DB_common::raiseError() + */ + function mysqlRaiseError($errno = null) + { + if ($errno === null) { + if ($this->options['portability'] & DB_PORTABILITY_ERRORS) { + $this->errorcode_map[1022] = DB_ERROR_CONSTRAINT; + $this->errorcode_map[1048] = DB_ERROR_CONSTRAINT_NOT_NULL; + $this->errorcode_map[1062] = DB_ERROR_CONSTRAINT; + } else { + // Doing this in case mode changes during runtime. + $this->errorcode_map[1022] = DB_ERROR_ALREADY_EXISTS; + $this->errorcode_map[1048] = DB_ERROR_CONSTRAINT; + $this->errorcode_map[1062] = DB_ERROR_ALREADY_EXISTS; + } + $errno = $this->errorCode(mysqli_errno($this->connection)); + } + return $this->raiseError($errno, null, null, null, + @mysqli_errno($this->connection) . ' ** ' . + @mysqli_error($this->connection)); + } + + // }}} + // {{{ tableInfo() + + /** + * Returns information about a table or a result set. + * + * WARNING: this method will probably not work because the mysqli_*() + * functions it relies upon may not exist. + * + * @param object|string $result DB_result object from a query or a + * string containing the name of a table + * @param int $mode a valid tableInfo mode + * @return array an associative array with the information requested + * or an error object if something is wrong + * @access public + * @internal + * @see DB_common::tableInfo() + */ + function tableInfo($result, $mode = null) { + if (isset($result->result)) { + /* + * Probably received a result object. + * Extract the result resource identifier. + */ + $id = $result->result; + $got_string = false; + } elseif (is_string($result)) { + /* + * Probably received a table name. + * Create a result resource identifier. + */ + $id = @mysqli_query($this->connection, + "SELECT * FROM $result LIMIT 0"); + $got_string = true; + } else { + /* + * Probably received a result resource identifier. + * Copy it. + * Deprecated. Here for compatibility only. + */ + $id = $result; + $got_string = false; + } + + if (!is_a($id, 'mysqli_result')) { + return $this->mysqlRaiseError(DB_ERROR_NEED_MORE_DATA); + } + + if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE) { + $case_func = 'strtolower'; + } else { + $case_func = 'strval'; + } + + $count = @mysqli_num_fields($id); + + // made this IF due to performance (one if is faster than $count if's) + if (!$mode) { + for ($i=0; $i<$count; $i++) { + $tmp = @mysqli_fetch_field($id); + $res[$i]['table'] = $case_func($tmp->table); + $res[$i]['name'] = $case_func($tmp->name); + $res[$i]['type'] = isset($this->mysqli_types[$tmp->type]) ? + $this->mysqli_types[$tmp->type] : + 'unknown'; + $res[$i]['len'] = $tmp->max_length; + + $res[$i]['flags'] = ''; + foreach ($this->mysqli_flags as $const => $means) { + if ($tmp->flags & $const) { + $res[$i]['flags'] .= $means . ' '; + } + } + if ($tmp->def) { + $res[$i]['flags'] .= 'default_' . rawurlencode($tmp->def); + } + $res[$i]['flags'] = trim($res[$i]['flags']); + } + } else { // full + $res['num_fields']= $count; + + for ($i=0; $i<$count; $i++) { + $tmp = @mysqli_fetch_field($id); + $res[$i]['table'] = $case_func($tmp->table); + $res[$i]['name'] = $case_func($tmp->name); + $res[$i]['type'] = isset($this->mysqli_types[$tmp->type]) ? + $this->mysqli_types[$tmp->type] : + 'unknown'; + $res[$i]['len'] = $tmp->max_length; + + $res[$i]['flags'] = ''; + foreach ($this->mysqli_flags as $const => $means) { + if ($tmp->flags & $const) { + $res[$i]['flags'] .= $means . ' '; + } + } + if ($tmp->def) { + $res[$i]['flags'] .= 'default_' . rawurlencode($tmp->def); + } + $res[$i]['flags'] = trim($res[$i]['flags']); + + if ($mode & DB_TABLEINFO_ORDER) { + $res['order'][$res[$i]['name']] = $i; + } + if ($mode & DB_TABLEINFO_ORDERTABLE) { + $res['ordertable'][$res[$i]['table']][$res[$i]['name']] = $i; + } + } + } + + // free the result only if we were called on a table + if ($got_string) { + @mysqli_free_result($id); + } + return $res; + } + + // }}} + // {{{ getSpecialQuery() + + /** + * Returns the query needed to get some backend info. + * + * @param string $type What kind of info you want to retrieve + * @return string The SQL query string + */ + function getSpecialQuery($type) + { + switch ($type) { + case 'tables': + return 'SHOW TABLES'; + case 'views': + return DB_ERROR_NOT_CAPABLE; + case 'users': + $sql = 'select distinct User from user'; + if ($this->dsn['database'] != 'mysql') { + $dsn = $this->dsn; + $dsn['database'] = 'mysql'; + if (DB::isError($db = DB::connect($dsn))) { + return $db; + } + $sql = $db->getCol($sql); + $db->disconnect(); + // XXX Fixme the mysql driver should take care of this + if (!@mysqli_select_db($this->connection, $this->dsn['database'])) { + return $this->mysqlRaiseError(DB_ERROR_NODBSELECTED); + } + } + return $sql; + case 'databases': + return 'SHOW DATABASES'; + default: + return null; + } + } + + // }}} + +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + */ + +?> diff --git a/thirdparty/pear/DB/oci8.php b/thirdparty/pear/DB/oci8.php new file mode 100644 index 000000000..ad3fb69ae --- /dev/null +++ b/thirdparty/pear/DB/oci8.php @@ -0,0 +1,899 @@ + | +// | Maintainer: Daniel Convissor | +// +----------------------------------------------------------------------+ +// +// $Id: oci8.php 3355 2005-06-11 22:14:40Z nbm $ + + +// be aware... OCIError() only appears to return anything when given a +// statement, so functions return the generic DB_ERROR instead of more +// useful errors that have to do with feedback from the database. + + +require_once 'DB/common.php'; + +/** + * Database independent query interface definition for PHP's Oracle 8 + * call-interface extension. + * + * Definitely works with versions 8 and 9 of Oracle. + * + * @package DB + * @version $Id: oci8.php 3355 2005-06-11 22:14:40Z nbm $ + * @category Database + * @author James L. Pine + */ +class DB_oci8 extends DB_common +{ + // {{{ properties + + var $connection; + var $phptype, $dbsyntax; + var $manip_query = array(); + var $prepare_types = array(); + var $autoCommit = 1; + var $last_stmt = false; + + /** + * stores the $data passed to execute() in the oci8 driver + * + * Gets reset to array() when simpleQuery() is run. + * + * Needed in case user wants to call numRows() after prepare/execute + * was used. + * + * @var array + * @access private + */ + var $_data = array(); + + // }}} + // {{{ constructor + + function DB_oci8() + { + $this->DB_common(); + $this->phptype = 'oci8'; + $this->dbsyntax = 'oci8'; + $this->features = array( + 'prepare' => false, + 'pconnect' => true, + 'transactions' => true, + 'limit' => 'alter' + ); + $this->errorcode_map = array( + 1 => DB_ERROR_CONSTRAINT, + 900 => DB_ERROR_SYNTAX, + 904 => DB_ERROR_NOSUCHFIELD, + 921 => DB_ERROR_SYNTAX, + 923 => DB_ERROR_SYNTAX, + 942 => DB_ERROR_NOSUCHTABLE, + 955 => DB_ERROR_ALREADY_EXISTS, + 1400 => DB_ERROR_CONSTRAINT_NOT_NULL, + 1407 => DB_ERROR_CONSTRAINT_NOT_NULL, + 1476 => DB_ERROR_DIVZERO, + 1722 => DB_ERROR_INVALID_NUMBER, + 2289 => DB_ERROR_NOSUCHTABLE, + 2291 => DB_ERROR_CONSTRAINT, + 2292 => DB_ERROR_CONSTRAINT, + 2449 => DB_ERROR_CONSTRAINT, + ); + } + + // }}} + // {{{ connect() + + /** + * Connect to a database and log in as the specified user. + * + * @param $dsn the data source name (see DB::parseDSN for syntax) + * @param $persistent (optional) whether the connection should + * be persistent + * + * @return int DB_OK on success, a DB error code on failure + */ + function connect($dsninfo, $persistent = false) + { + if (!DB::assertExtension('oci8')) { + return $this->raiseError(DB_ERROR_EXTENSION_NOT_FOUND); + } + $this->dsn = $dsninfo; + + $connect_function = $persistent ? 'OCIPLogon' : 'OCILogon'; + + if ($dsninfo['hostspec']) { + $conn = @$connect_function($dsninfo['username'], + $dsninfo['password'], + $dsninfo['hostspec']); + } elseif ($dsninfo['username'] || $dsninfo['password']) { + $conn = @$connect_function($dsninfo['username'], + $dsninfo['password']); + } else { + $conn = false; + } + if ($conn == false) { + $error = OCIError(); + $error = (is_array($error)) ? $error['message'] : null; + return $this->raiseError(DB_ERROR_CONNECT_FAILED, null, null, + null, $error); + } + $this->connection = $conn; + return DB_OK; + } + + // }}} + // {{{ disconnect() + + /** + * Log out and disconnect from the database. + * + * @return bool true on success, false if not connected. + */ + function disconnect() + { + $ret = @OCILogOff($this->connection); + $this->connection = null; + return $ret; + } + + // }}} + // {{{ simpleQuery() + + /** + * Send a query to oracle and return the results as an oci8 resource + * identifier. + * + * @param $query the SQL query + * + * @return int returns a valid oci8 result for successful SELECT + * queries, DB_OK for other successful queries. A DB error code + * is returned on failure. + */ + function simpleQuery($query) + { + $this->_data = array(); + $this->last_query = $query; + $query = $this->modifyQuery($query); + $result = @OCIParse($this->connection, $query); + if (!$result) { + return $this->oci8RaiseError(); + } + if ($this->autoCommit) { + $success = @OCIExecute($result,OCI_COMMIT_ON_SUCCESS); + } else { + $success = @OCIExecute($result,OCI_DEFAULT); + } + if (!$success) { + return $this->oci8RaiseError($result); + } + $this->last_stmt=$result; + // Determine which queries that should return data, and which + // should return an error code only. + return DB::isManip($query) ? DB_OK : $result; + } + + // }}} + // {{{ nextResult() + + /** + * Move the internal oracle result pointer to the next available result + * + * @param a valid oci8 result resource + * + * @access public + * + * @return true if a result is available otherwise return false + */ + function nextResult($result) + { + return false; + } + + // }}} + // {{{ fetchInto() + + /** + * Fetch a row and insert the data into an existing array. + * + * Formating of the array and the data therein are configurable. + * See DB_result::fetchInto() for more information. + * + * @param resource $result query result identifier + * @param array $arr (reference) array where data from the row + * should be placed + * @param int $fetchmode how the resulting array should be indexed + * @param int $rownum the row number to fetch + * + * @return mixed DB_OK on success, null when end of result set is + * reached or on failure + * + * @see DB_result::fetchInto() + * @access private + */ + function fetchInto($result, &$arr, $fetchmode, $rownum=null) + { + if ($rownum !== null) { + return $this->raiseError(DB_ERROR_NOT_CAPABLE); + } + if ($fetchmode & DB_FETCHMODE_ASSOC) { + $moredata = @OCIFetchInto($result,$arr,OCI_ASSOC+OCI_RETURN_NULLS+OCI_RETURN_LOBS); + if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE && + $moredata) + { + $arr = array_change_key_case($arr, CASE_LOWER); + } + } else { + $moredata = OCIFetchInto($result,$arr,OCI_RETURN_NULLS+OCI_RETURN_LOBS); + } + if (!$moredata) { + return null; + } + if ($this->options['portability'] & DB_PORTABILITY_RTRIM) { + $this->_rtrimArrayValues($arr); + } + if ($this->options['portability'] & DB_PORTABILITY_NULL_TO_EMPTY) { + $this->_convertNullArrayValuesToEmpty($arr); + } + return DB_OK; + } + + // }}} + // {{{ freeResult() + + /** + * Free the internal resources associated with $result. + * + * @param $result oci8 result identifier + * + * @return bool true on success, false if $result is invalid + */ + function freeResult($result) + { + return @OCIFreeStatement($result); + } + + /** + * Free the internal resources associated with a prepared query. + * + * @param $stmt oci8 statement identifier + * + * @return bool true on success, false if $result is invalid + */ + function freePrepared($stmt) + { + if (isset($this->prepare_types[(int)$stmt])) { + unset($this->prepare_types[(int)$stmt]); + unset($this->manip_query[(int)$stmt]); + } else { + return false; + } + return true; + } + + // }}} + // {{{ numRows() + + function numRows($result) + { + // emulate numRows for Oracle. yuck. + if ($this->options['portability'] & DB_PORTABILITY_NUMROWS && + $result === $this->last_stmt) + { + $countquery = 'SELECT COUNT(*) FROM ('.$this->last_query.')'; + $save_query = $this->last_query; + $save_stmt = $this->last_stmt; + + if (count($this->_data)) { + $smt = $this->prepare('SELECT COUNT(*) FROM ('.$this->last_query.')'); + $count = $this->execute($smt, $this->_data); + } else { + $count =& $this->query($countquery); + } + + if (DB::isError($count) || + DB::isError($row = $count->fetchRow(DB_FETCHMODE_ORDERED))) + { + $this->last_query = $save_query; + $this->last_stmt = $save_stmt; + return $this->raiseError(DB_ERROR_NOT_CAPABLE); + } + return $row[0]; + } + return $this->raiseError(DB_ERROR_NOT_CAPABLE); + } + + // }}} + // {{{ numCols() + + /** + * Get the number of columns in a result set. + * + * @param $result oci8 result identifier + * + * @return int the number of columns per row in $result + */ + function numCols($result) + { + $cols = @OCINumCols($result); + if (!$cols) { + return $this->oci8RaiseError($result); + } + return $cols; + } + + // }}} + // {{{ errorNative() + + /** + * Get the native error code of the last error (if any) that occured + * on the current connection. This does not work, as OCIError does + * not work unless given a statement. If OCIError does return + * something, so will this. + * + * @return int native oci8 error code + */ + function errorNative() + { + if (is_resource($this->last_stmt)) { + $error = @OCIError($this->last_stmt); + } else { + $error = @OCIError($this->connection); + } + if (is_array($error)) { + return $error['code']; + } + return false; + } + + // }}} + // {{{ prepare() + + /** + * Prepares a query for multiple execution with execute(). + * + * With oci8, this is emulated. + * + * prepare() requires a generic query as string like + * INSERT INTO numbers VALUES (?, ?, ?) + * . The ? characters are placeholders. + * + * Three types of placeholders can be used: + * + ? a quoted scalar value, i.e. strings, integers + * + ! value is inserted 'as is' + * + & requires a file name. The file's contents get + * inserted into the query (i.e. saving binary + * data in a db) + * + * Use backslashes to escape placeholder characters if you don't want + * them to be interpreted as placeholders. Example: + * "UPDATE foo SET col=? WHERE col='over \& under'" + * + * + * @param string $query query to be prepared + * @return mixed DB statement resource on success. DB_Error on failure. + */ + function prepare($query) + { + $tokens = preg_split('/((? $val) { + switch ($val) { + case '?': + $types[$token++] = DB_PARAM_SCALAR; + unset($tokens[$key]); + break; + case '&': + $types[$token++] = DB_PARAM_OPAQUE; + unset($tokens[$key]); + break; + case '!': + $types[$token++] = DB_PARAM_MISC; + unset($tokens[$key]); + break; + default: + $tokens[$key] = preg_replace('/\\\([&?!])/', "\\1", $val); + if ($key != $binds) { + $newquery .= $tokens[$key] . ':bind' . $token; + } else { + $newquery .= $tokens[$key]; + } + } + } + + $this->last_query = $query; + $newquery = $this->modifyQuery($newquery); + if (!$stmt = @OCIParse($this->connection, $newquery)) { + return $this->oci8RaiseError(); + } + $this->prepare_types[(int)$stmt] = $types; + $this->manip_query[(int)$stmt] = DB::isManip($query); + return $stmt; + } + + // }}} + // {{{ execute() + + /** + * Executes a DB statement prepared with prepare(). + * + * @param resource $stmt a DB statement resource returned from prepare() + * @param mixed $data array, string or numeric data to be used in + * execution of the statement. Quantity of items + * passed must match quantity of placeholders in + * query: meaning 1 for non-array items or the + * quantity of elements in the array. + * @return int returns an oci8 result resource for successful + * SELECT queries, DB_OK for other successful queries. A DB error + * code is returned on failure. + * @see DB_oci::prepare() + */ + function &execute($stmt, $data = array()) + { + if (!is_array($data)) { + $data = array($data); + } + + $this->_data = $data; + + $types =& $this->prepare_types[(int)$stmt]; + if (count($types) != count($data)) { + $tmp =& $this->raiseError(DB_ERROR_MISMATCH); + return $tmp; + } + + $i = 0; + foreach ($data as $key => $value) { + if ($types[$i] == DB_PARAM_MISC) { + /* + * Oracle doesn't seem to have the ability to pass a + * parameter along unchanged, so strip off quotes from start + * and end, plus turn two single quotes to one single quote, + * in order to avoid the quotes getting escaped by + * Oracle and ending up in the database. + */ + $data[$key] = preg_replace("/^'(.*)'$/", "\\1", $data[$key]); + $data[$key] = str_replace("''", "'", $data[$key]); + } elseif ($types[$i] == DB_PARAM_OPAQUE) { + $fp = @fopen($data[$key], 'rb'); + if (!$fp) { + $tmp =& $this->raiseError(DB_ERROR_ACCESS_VIOLATION); + return $tmp; + } + $data[$key] = fread($fp, filesize($data[$key])); + fclose($fp); + } + if (!@OCIBindByName($stmt, ':bind' . $i, $data[$key], -1)) { + $tmp = $this->oci8RaiseError($stmt); + return $tmp; + } + $i++; + } + if ($this->autoCommit) { + $success = @OCIExecute($stmt, OCI_COMMIT_ON_SUCCESS); + } else { + $success = @OCIExecute($stmt, OCI_DEFAULT); + } + if (!$success) { + $tmp = $this->oci8RaiseError($stmt); + return $tmp; + } + $this->last_stmt = $stmt; + if ($this->manip_query[(int)$stmt]) { + $tmp = DB_OK; + } else { + $tmp =& new DB_result($this, $stmt); + } + return $tmp; + } + + // }}} + // {{{ autoCommit() + + /** + * Enable/disable automatic commits + * + * @param $onoff true/false whether to autocommit + */ + function autoCommit($onoff = false) + { + $this->autoCommit = (bool)$onoff;; + return DB_OK; + } + + // }}} + // {{{ commit() + + /** + * Commit transactions on the current connection + * + * @return DB_ERROR or DB_OK + */ + function commit() + { + $result = @OCICommit($this->connection); + if (!$result) { + return $this->oci8RaiseError(); + } + return DB_OK; + } + + // }}} + // {{{ rollback() + + /** + * Roll back all uncommitted transactions on the current connection. + * + * @return DB_ERROR or DB_OK + */ + function rollback() + { + $result = @OCIRollback($this->connection); + if (!$result) { + return $this->oci8RaiseError(); + } + return DB_OK; + } + + // }}} + // {{{ affectedRows() + + /** + * Gets the number of rows affected by the last query. + * if the last query was a select, returns 0. + * + * @return number of rows affected by the last query or DB_ERROR + */ + function affectedRows() + { + if ($this->last_stmt === false) { + return $this->oci8RaiseError(); + } + $result = @OCIRowCount($this->last_stmt); + if ($result === false) { + return $this->oci8RaiseError($this->last_stmt); + } + return $result; + } + + // }}} + // {{{ modifyQuery() + + function modifyQuery($query) + { + // "SELECT 2+2" must be "SELECT 2+2 FROM dual" in Oracle + if (preg_match('/^\s*SELECT/i', $query) && + !preg_match('/\sFROM\s/i', $query)) { + $query .= ' FROM dual'; + } + return $query; + } + + // }}} + // {{{ modifyLimitQuery() + + /** + * Emulate the row limit support altering the query + * + * @param string $query The query to treat + * @param int $from The row to start to fetch from + * @param int $count The offset + * @return string The modified query + * + * @author Tomas V.V.Cox + */ + function modifyLimitQuery($query, $from, $count, $params = array()) + { + // Let Oracle return the name of the columns instead of + // coding a "home" SQL parser + + if (count($params)) { + $result = $this->prepare("SELECT * FROM ($query) " + . 'WHERE NULL = NULL'); + $tmp =& $this->execute($result, $params); + } else { + $q_fields = "SELECT * FROM ($query) WHERE NULL = NULL"; + + if (!$result = @OCIParse($this->connection, $q_fields)) { + $this->last_query = $q_fields; + return $this->oci8RaiseError(); + } + if (!@OCIExecute($result, OCI_DEFAULT)) { + $this->last_query = $q_fields; + return $this->oci8RaiseError($result); + } + } + + $ncols = OCINumCols($result); + $cols = array(); + for ( $i = 1; $i <= $ncols; $i++ ) { + $cols[] = '"' . OCIColumnName($result, $i) . '"'; + } + $fields = implode(', ', $cols); + // XXX Test that (tip by John Lim) + //if (preg_match('/^\s*SELECT\s+/is', $query, $match)) { + // // Introduce the FIRST_ROWS Oracle query optimizer + // $query = substr($query, strlen($match[0]), strlen($query)); + // $query = "SELECT /* +FIRST_ROWS */ " . $query; + //} + + // Construct the query + // more at: http://marc.theaimsgroup.com/?l=php-db&m=99831958101212&w=2 + // Perhaps this could be optimized with the use of Unions + $query = "SELECT $fields FROM". + " (SELECT rownum as linenum, $fields FROM". + " ($query)". + ' WHERE rownum <= '. ($from + $count) . + ') WHERE linenum >= ' . ++$from; + return $query; + } + + // }}} + // {{{ nextId() + + /** + * Returns the next free id in a sequence + * + * @param string $seq_name name of the sequence + * @param boolean $ondemand when true, the seqence is automatically + * created if it does not exist + * + * @return int the next id number in the sequence. DB_Error if problem. + * + * @internal + * @see DB_common::nextID() + * @access public + */ + function nextId($seq_name, $ondemand = true) + { + $seqname = $this->getSequenceName($seq_name); + $repeat = 0; + do { + $this->expectError(DB_ERROR_NOSUCHTABLE); + $result =& $this->query("SELECT ${seqname}.nextval FROM dual"); + $this->popExpect(); + if ($ondemand && DB::isError($result) && + $result->getCode() == DB_ERROR_NOSUCHTABLE) { + $repeat = 1; + $result = $this->createSequence($seq_name); + if (DB::isError($result)) { + return $this->raiseError($result); + } + } else { + $repeat = 0; + } + } while ($repeat); + if (DB::isError($result)) { + return $this->raiseError($result); + } + $arr = $result->fetchRow(DB_FETCHMODE_ORDERED); + return $arr[0]; + } + + /** + * Creates a new sequence + * + * @param string $seq_name name of the new sequence + * + * @return int DB_OK on success. A DB_Error object is returned if + * problems arise. + * + * @internal + * @see DB_common::createSequence() + * @access public + */ + function createSequence($seq_name) + { + $seqname = $this->getSequenceName($seq_name); + return $this->query("CREATE SEQUENCE ${seqname}"); + } + + // }}} + // {{{ dropSequence() + + /** + * Deletes a sequence + * + * @param string $seq_name name of the sequence to be deleted + * + * @return int DB_OK on success. DB_Error if problems. + * + * @internal + * @see DB_common::dropSequence() + * @access public + */ + function dropSequence($seq_name) + { + $seqname = $this->getSequenceName($seq_name); + return $this->query("DROP SEQUENCE ${seqname}"); + } + + // }}} + // {{{ oci8RaiseError() + + /** + * Gather information about an error, then use that info to create a + * DB error object and finally return that object. + * + * @param integer $errno PEAR error number (usually a DB constant) if + * manually raising an error + * @return object DB error object + * @see DB_common::errorCode() + * @see DB_common::raiseError() + */ + function oci8RaiseError($errno = null) + { + if ($errno === null) { + $error = @OCIError($this->connection); + return $this->raiseError($this->errorCode($error['code']), + null, null, null, $error['message']); + } elseif (is_resource($errno)) { + $error = @OCIError($errno); + return $this->raiseError($this->errorCode($error['code']), + null, null, null, $error['message']); + } + return $this->raiseError($this->errorCode($errno)); + } + + // }}} + // {{{ getSpecialQuery() + + /** + * Returns the query needed to get some backend info + * @param string $type What kind of info you want to retrieve + * @return string The SQL query string + */ + function getSpecialQuery($type) + { + switch ($type) { + case 'tables': + return 'SELECT table_name FROM user_tables'; + default: + return null; + } + } + + // }}} + // {{{ tableInfo() + + /** + * Returns information about a table or a result set. + * + * NOTE: only supports 'table' and 'flags' if $result + * is a table name. + * + * NOTE: flags won't contain index information. + * + * @param object|string $result DB_result object from a query or a + * string containing the name of a table + * @param int $mode a valid tableInfo mode + * @return array an associative array with the information requested + * or an error object if something is wrong + * @access public + * @internal + * @see DB_common::tableInfo() + */ + function tableInfo($result, $mode = null) + { + if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE) { + $case_func = 'strtolower'; + } else { + $case_func = 'strval'; + } + + if (is_string($result)) { + /* + * Probably received a table name. + * Create a result resource identifier. + */ + $result = strtoupper($result); + $q_fields = 'SELECT column_name, data_type, data_length, ' + . 'nullable ' + . 'FROM user_tab_columns ' + . "WHERE table_name='$result' ORDER BY column_id"; + + $this->last_query = $q_fields; + + if (!$stmt = @OCIParse($this->connection, $q_fields)) { + return $this->oci8RaiseError(DB_ERROR_NEED_MORE_DATA); + } + if (!@OCIExecute($stmt, OCI_DEFAULT)) { + return $this->oci8RaiseError($stmt); + } + + $i = 0; + while (@OCIFetch($stmt)) { + $res[$i]['table'] = $case_func($result); + $res[$i]['name'] = $case_func(@OCIResult($stmt, 1)); + $res[$i]['type'] = @OCIResult($stmt, 2); + $res[$i]['len'] = @OCIResult($stmt, 3); + $res[$i]['flags'] = (@OCIResult($stmt, 4) == 'N') ? 'not_null' : ''; + + if ($mode & DB_TABLEINFO_ORDER) { + $res['order'][$res[$i]['name']] = $i; + } + if ($mode & DB_TABLEINFO_ORDERTABLE) { + $res['ordertable'][$res[$i]['table']][$res[$i]['name']] = $i; + } + $i++; + } + + if ($mode) { + $res['num_fields'] = $i; + } + @OCIFreeStatement($stmt); + + } else { + if (isset($result->result)) { + /* + * Probably received a result object. + * Extract the result resource identifier. + */ + $result = $result->result; + } else { + /* + * ELSE, probably received a result resource identifier. + * Deprecated. Here for compatibility only. + */ + } + + if ($result === $this->last_stmt) { + $count = @OCINumCols($result); + + for ($i=0; $i<$count; $i++) { + $res[$i]['table'] = ''; + $res[$i]['name'] = $case_func(@OCIColumnName($result, $i+1)); + $res[$i]['type'] = @OCIColumnType($result, $i+1); + $res[$i]['len'] = @OCIColumnSize($result, $i+1); + $res[$i]['flags'] = ''; + + if ($mode & DB_TABLEINFO_ORDER) { + $res['order'][$res[$i]['name']] = $i; + } + if ($mode & DB_TABLEINFO_ORDERTABLE) { + $res['ordertable'][$res[$i]['table']][$res[$i]['name']] = $i; + } + } + + if ($mode) { + $res['num_fields'] = $count; + } + + } else { + return $this->raiseError(DB_ERROR_NOT_CAPABLE); + } + } + return $res; + } + + // }}} + +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + */ + +?> diff --git a/thirdparty/pear/DB/odbc.php b/thirdparty/pear/DB/odbc.php new file mode 100644 index 000000000..0f0532769 --- /dev/null +++ b/thirdparty/pear/DB/odbc.php @@ -0,0 +1,585 @@ + | +// | Maintainer: Daniel Convissor | +// +----------------------------------------------------------------------+ +// +// $Id: odbc.php 3355 2005-06-11 22:14:40Z nbm $ + + +// XXX legend: +// More info on ODBC errors could be found here: +// http://msdn.microsoft.com/library/default.asp?url=/library/en-us/trblsql/tr_err_odbc_5stz.asp +// +// XXX ERRORMSG: The error message from the odbc function should +// be registered here. + + +require_once 'DB/common.php'; + +/** + * Database independent query interface definition for PHP's ODBC + * extension. + * + * @package DB + * @version $Id: odbc.php 3355 2005-06-11 22:14:40Z nbm $ + * @category Database + * @author Stig Bakken + */ +class DB_odbc extends DB_common +{ + // {{{ properties + + var $connection; + var $phptype, $dbsyntax; + var $row = array(); + + // }}} + // {{{ constructor + + function DB_odbc() + { + $this->DB_common(); + $this->phptype = 'odbc'; + $this->dbsyntax = 'sql92'; + $this->features = array( + 'prepare' => true, + 'pconnect' => true, + 'transactions' => false, + 'limit' => 'emulate' + ); + $this->errorcode_map = array( + '01004' => DB_ERROR_TRUNCATED, + '07001' => DB_ERROR_MISMATCH, + '21S01' => DB_ERROR_MISMATCH, + '21S02' => DB_ERROR_MISMATCH, + '22003' => DB_ERROR_INVALID_NUMBER, + '22005' => DB_ERROR_INVALID_NUMBER, + '22008' => DB_ERROR_INVALID_DATE, + '22012' => DB_ERROR_DIVZERO, + '23000' => DB_ERROR_CONSTRAINT, + '23502' => DB_ERROR_CONSTRAINT_NOT_NULL, + '23503' => DB_ERROR_CONSTRAINT, + '23505' => DB_ERROR_CONSTRAINT, + '24000' => DB_ERROR_INVALID, + '34000' => DB_ERROR_INVALID, + '37000' => DB_ERROR_SYNTAX, + '42000' => DB_ERROR_SYNTAX, + '42601' => DB_ERROR_SYNTAX, + 'IM001' => DB_ERROR_UNSUPPORTED, + 'S0000' => DB_ERROR_NOSUCHTABLE, + 'S0001' => DB_ERROR_ALREADY_EXISTS, + 'S0002' => DB_ERROR_NOSUCHTABLE, + 'S0011' => DB_ERROR_ALREADY_EXISTS, + 'S0012' => DB_ERROR_NOT_FOUND, + 'S0021' => DB_ERROR_ALREADY_EXISTS, + 'S0022' => DB_ERROR_NOSUCHFIELD, + 'S1000' => DB_ERROR_CONSTRAINT_NOT_NULL, + 'S1009' => DB_ERROR_INVALID, + 'S1090' => DB_ERROR_INVALID, + 'S1C00' => DB_ERROR_NOT_CAPABLE + ); + } + + // }}} + // {{{ connect() + + /** + * Connect to a database and log in as the specified user. + * + * @param $dsn the data source name (see DB::parseDSN for syntax) + * @param $persistent (optional) whether the connection should + * be persistent + * + * @return int DB_OK on success, a DB error code on failure + */ + function connect($dsninfo, $persistent = false) + { + if (!DB::assertExtension('odbc')) { + return $this->raiseError(DB_ERROR_EXTENSION_NOT_FOUND); + } + + $this->dsn = $dsninfo; + if ($dsninfo['dbsyntax']) { + $this->dbsyntax = $dsninfo['dbsyntax']; + } + switch ($this->dbsyntax) { + case 'solid': + $this->features = array( + 'prepare' => true, + 'pconnect' => true, + 'transactions' => true + ); + break; + case 'navision': + // the Navision driver doesn't support fetch row by number + $this->features['limit'] = false; + } + + /* + * This is hear for backwards compatibility. + * Should have been using 'database' all along, but used hostspec. + */ + if ($dsninfo['database']) { + $odbcdsn = $dsninfo['database']; + } elseif ($dsninfo['hostspec']) { + $odbcdsn = $dsninfo['hostspec']; + } else { + $odbcdsn = 'localhost'; + } + + if ($this->provides('pconnect')) { + $connect_function = $persistent ? 'odbc_pconnect' : 'odbc_connect'; + } else { + $connect_function = 'odbc_connect'; + } + + if (empty($dsninfo['cursor'])) { + $conn = @$connect_function($odbcdsn, $dsninfo['username'], + $dsninfo['password']); + } else { + $conn = @$connect_function($odbcdsn, $dsninfo['username'], + $dsninfo['password'], + $dsninfo['cursor']); + } + + if (!is_resource($conn)) { + return $this->raiseError(DB_ERROR_CONNECT_FAILED, null, null, + null, $this->errorNative()); + } + $this->connection = $conn; + return DB_OK; + } + + // }}} + // {{{ disconnect() + + function disconnect() + { + $err = @odbc_close($this->connection); + $this->connection = null; + return $err; + } + + // }}} + // {{{ simpleQuery() + + /** + * Send a query to ODBC and return the results as a ODBC resource + * identifier. + * + * @param $query the SQL query + * + * @return int returns a valid ODBC result for successful SELECT + * queries, DB_OK for other successful queries. A DB error code + * is returned on failure. + */ + function simpleQuery($query) + { + $this->last_query = $query; + $query = $this->modifyQuery($query); + $result = @odbc_exec($this->connection, $query); + if (!$result) { + return $this->odbcRaiseError(); // XXX ERRORMSG + } + // Determine which queries that should return data, and which + // should return an error code only. + if (DB::isManip($query)) { + $this->manip_result = $result; // For affectedRows() + return DB_OK; + } + $this->row[(int)$result] = 0; + $this->manip_result = 0; + return $result; + } + + // }}} + // {{{ nextResult() + + /** + * Move the internal odbc result pointer to the next available result + * + * @param a valid fbsql result resource + * + * @access public + * + * @return true if a result is available otherwise return false + */ + function nextResult($result) + { + return @odbc_next_result($result); + } + + // }}} + // {{{ fetchInto() + + /** + * Fetch a row and insert the data into an existing array. + * + * Formating of the array and the data therein are configurable. + * See DB_result::fetchInto() for more information. + * + * @param resource $result query result identifier + * @param array $arr (reference) array where data from the row + * should be placed + * @param int $fetchmode how the resulting array should be indexed + * @param int $rownum the row number to fetch + * + * @return mixed DB_OK on success, null when end of result set is + * reached or on failure + * + * @see DB_result::fetchInto() + * @access private + */ + function fetchInto($result, &$arr, $fetchmode, $rownum=null) + { + $arr = array(); + if ($rownum !== null) { + $rownum++; // ODBC first row is 1 + if (version_compare(phpversion(), '4.2.0', 'ge')) { + $cols = @odbc_fetch_into($result, $arr, $rownum); + } else { + $cols = @odbc_fetch_into($result, $rownum, $arr); + } + } else { + $cols = @odbc_fetch_into($result, $arr); + } + + if (!$cols) { + /* XXX FIXME: doesn't work with unixODBC and easysoft + (get corrupted $errno values) + if ($errno = @odbc_error($this->connection)) { + return $this->RaiseError($errno); + }*/ + return null; + } + if ($fetchmode !== DB_FETCHMODE_ORDERED) { + for ($i = 0; $i < count($arr); $i++) { + $colName = @odbc_field_name($result, $i+1); + $a[$colName] = $arr[$i]; + } + if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE) { + $a = array_change_key_case($a, CASE_LOWER); + } + $arr = $a; + } + if ($this->options['portability'] & DB_PORTABILITY_RTRIM) { + $this->_rtrimArrayValues($arr); + } + if ($this->options['portability'] & DB_PORTABILITY_NULL_TO_EMPTY) { + $this->_convertNullArrayValuesToEmpty($arr); + } + return DB_OK; + } + + // }}} + // {{{ freeResult() + + function freeResult($result) + { + unset($this->row[(int)$result]); + return @odbc_free_result($result); + } + + // }}} + // {{{ numCols() + + function numCols($result) + { + $cols = @odbc_num_fields($result); + if (!$cols) { + return $this->odbcRaiseError(); + } + return $cols; + } + + // }}} + // {{{ affectedRows() + + /** + * Returns the number of rows affected by a manipulative query + * (INSERT, DELETE, UPDATE) + * @return mixed int affected rows, 0 when non manip queries or + * DB error on error + */ + function affectedRows() + { + if (empty($this->manip_result)) { // In case of SELECT stms + return 0; + } + $nrows = @odbc_num_rows($this->manip_result); + if ($nrows == -1) { + return $this->odbcRaiseError(); + } + return $nrows; + } + + // }}} + // {{{ numRows() + + /** + * ODBC may or may not support counting rows in the result set of + * SELECTs. + * + * @param $result the odbc result resource + * @return the number of rows, or 0 + */ + function numRows($result) + { + $nrows = @odbc_num_rows($result); + if ($nrows == -1) { + return $this->odbcRaiseError(DB_ERROR_UNSUPPORTED); + } + return $nrows; + } + + // }}} + // {{{ quoteIdentifier() + + /** + * Quote a string so it can be safely used as a table / column name + * + * Quoting style depends on which dbsyntax was passed in the DSN. + * + * Use 'mssql' as the dbsyntax in the DB DSN only if you've unchecked + * "Use ANSI quoted identifiers" when setting up the ODBC data source. + * + * @param string $str identifier name to be quoted + * + * @return string quoted identifier string + * + * @since 1.6.0 + * @access public + */ + function quoteIdentifier($str) + { + switch ($this->dsn['dbsyntax']) { + case 'access': + return '[' . $str . ']'; + case 'mssql': + case 'sybase': + return '[' . str_replace(']', ']]', $str) . ']'; + case 'mysql': + case 'mysqli': + return '`' . $str . '`'; + default: + return '"' . str_replace('"', '""', $str) . '"'; + } + } + + // }}} + // {{{ quote() + + /** + * @deprecated Deprecated in release 1.6.0 + * @internal + */ + function quote($str) { + return $this->quoteSmart($str); + } + + // }}} + // {{{ errorNative() + + /** + * Get the native error code of the last error (if any) that + * occured on the current connection. + * + * @access public + * + * @return int ODBC error code + */ + function errorNative() + { + if (!isset($this->connection) || !is_resource($this->connection)) { + return @odbc_error() . ' ' . @odbc_errormsg(); + } + return @odbc_error($this->connection) . ' ' . @odbc_errormsg($this->connection); + } + + // }}} + // {{{ nextId() + + /** + * Returns the next free id in a sequence + * + * @param string $seq_name name of the sequence + * @param boolean $ondemand when true, the seqence is automatically + * created if it does not exist + * + * @return int the next id number in the sequence. DB_Error if problem. + * + * @internal + * @see DB_common::nextID() + * @access public + */ + function nextId($seq_name, $ondemand = true) + { + $seqname = $this->getSequenceName($seq_name); + $repeat = 0; + do { + $this->pushErrorHandling(PEAR_ERROR_RETURN); + $result = $this->query("update ${seqname} set id = id + 1"); + $this->popErrorHandling(); + if ($ondemand && DB::isError($result) && + $result->getCode() == DB_ERROR_NOSUCHTABLE) { + $repeat = 1; + $this->pushErrorHandling(PEAR_ERROR_RETURN); + $result = $this->createSequence($seq_name); + $this->popErrorHandling(); + if (DB::isError($result)) { + return $this->raiseError($result); + } + $result = $this->query("insert into ${seqname} (id) values(0)"); + } else { + $repeat = 0; + } + } while ($repeat); + + if (DB::isError($result)) { + return $this->raiseError($result); + } + + $result = $this->query("select id from ${seqname}"); + if (DB::isError($result)) { + return $result; + } + + $row = $result->fetchRow(DB_FETCHMODE_ORDERED); + if (DB::isError($row || !$row)) { + return $row; + } + + return $row[0]; + } + + /** + * Creates a new sequence + * + * @param string $seq_name name of the new sequence + * + * @return int DB_OK on success. A DB_Error object is returned if + * problems arise. + * + * @internal + * @see DB_common::createSequence() + * @access public + */ + function createSequence($seq_name) + { + $seqname = $this->getSequenceName($seq_name); + return $this->query("CREATE TABLE ${seqname} ". + '(id integer NOT NULL,'. + ' PRIMARY KEY(id))'); + } + + // }}} + // {{{ dropSequence() + + /** + * Deletes a sequence + * + * @param string $seq_name name of the sequence to be deleted + * + * @return int DB_OK on success. DB_Error if problems. + * + * @internal + * @see DB_common::dropSequence() + * @access public + */ + function dropSequence($seq_name) + { + $seqname = $this->getSequenceName($seq_name); + return $this->query("DROP TABLE ${seqname}"); + } + + // }}} + // {{{ autoCommit() + + function autoCommit($onoff = false) + { + if (!@odbc_autocommit($this->connection, $onoff)) { + return $this->odbcRaiseError(); + } + return DB_OK; + } + + // }}} + // {{{ commit() + + function commit() + { + if (!@odbc_commit($this->connection)) { + return $this->odbcRaiseError(); + } + return DB_OK; + } + + // }}} + // {{{ rollback() + + function rollback() + { + if (!@odbc_rollback($this->connection)) { + return $this->odbcRaiseError(); + } + return DB_OK; + } + + // }}} + // {{{ odbcRaiseError() + + /** + * Gather information about an error, then use that info to create a + * DB error object and finally return that object. + * + * @param integer $errno PEAR error number (usually a DB constant) if + * manually raising an error + * @return object DB error object + * @see errorNative() + * @see DB_common::errorCode() + * @see DB_common::raiseError() + */ + function odbcRaiseError($errno = null) + { + if ($errno === null) { + switch ($this->dbsyntax) { + case 'access': + if ($this->options['portability'] & DB_PORTABILITY_ERRORS) { + $this->errorcode_map['07001'] = DB_ERROR_NOSUCHFIELD; + } else { + // Doing this in case mode changes during runtime. + $this->errorcode_map['07001'] = DB_ERROR_MISMATCH; + } + } + $errno = $this->errorCode(odbc_error($this->connection)); + } + return $this->raiseError($errno, null, null, null, + $this->errorNative()); + } + + // }}} + +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + */ + +?> diff --git a/thirdparty/pear/DB/pgsql.php b/thirdparty/pear/DB/pgsql.php new file mode 100644 index 000000000..0a95eb132 --- /dev/null +++ b/thirdparty/pear/DB/pgsql.php @@ -0,0 +1,847 @@ + | +// | Stig Bakken | +// | Maintainer: Daniel Convissor | +// +----------------------------------------------------------------------+ +// +// $Id: pgsql.php 3355 2005-06-11 22:14:40Z nbm $ + +require_once 'DB/common.php'; + +/** + * Database independent query interface definition for PHP's PostgreSQL + * extension. + * + * @package DB + * @version $Id: pgsql.php 3355 2005-06-11 22:14:40Z nbm $ + * @category Database + * @author Rui Hirokawa + * @author Stig Bakken + */ +class DB_pgsql extends DB_common +{ + // {{{ properties + + var $connection; + var $phptype, $dbsyntax; + var $prepare_tokens = array(); + var $prepare_types = array(); + var $transaction_opcount = 0; + var $dsn = array(); + var $row = array(); + var $num_rows = array(); + var $affected = 0; + var $autocommit = true; + var $fetchmode = DB_FETCHMODE_ORDERED; + + // }}} + // {{{ constructor + + function DB_pgsql() + { + $this->DB_common(); + $this->phptype = 'pgsql'; + $this->dbsyntax = 'pgsql'; + $this->features = array( + 'prepare' => false, + 'pconnect' => true, + 'transactions' => true, + 'limit' => 'alter' + ); + $this->errorcode_map = array( + ); + } + + // }}} + // {{{ connect() + + /** + * Connect to a database and log in as the specified user. + * + * @param $dsn the data source name (see DB::parseDSN for syntax) + * @param $persistent (optional) whether the connection should + * be persistent + * + * @return int DB_OK on success, a DB error code on failure. + */ + function connect($dsninfo, $persistent = false) + { + if (!DB::assertExtension('pgsql')) { + return $this->raiseError(DB_ERROR_EXTENSION_NOT_FOUND); + } + + $this->dsn = $dsninfo; + $protocol = $dsninfo['protocol'] ? $dsninfo['protocol'] : 'tcp'; + $connstr = ''; + + if ($protocol == 'tcp') { + if ($dsninfo['hostspec']) { + $connstr .= 'host=' . $dsninfo['hostspec']; + } + if ($dsninfo['port']) { + $connstr .= ' port=' . $dsninfo['port']; + } + } elseif ($protocol == 'unix') { + // Allow for pg socket in non-standard locations. + if ($dsninfo['socket']) { + $connstr .= 'host=' . $dsninfo['socket']; + } + if ($dsninfo['port']) { + $connstr .= ' port=' . $dsninfo['port']; + } + } + + if ($dsninfo['database']) { + $connstr .= ' dbname=\'' . addslashes($dsninfo['database']) . '\''; + } + if ($dsninfo['username']) { + $connstr .= ' user=\'' . addslashes($dsninfo['username']) . '\''; + } + if ($dsninfo['password']) { + $connstr .= ' password=\'' . addslashes($dsninfo['password']) . '\''; + } + if (!empty($dsninfo['options'])) { + $connstr .= ' options=' . $dsninfo['options']; + } + if (!empty($dsninfo['tty'])) { + $connstr .= ' tty=' . $dsninfo['tty']; + } + + $connect_function = $persistent ? 'pg_pconnect' : 'pg_connect'; + + $ini = ini_get('track_errors'); + if ($ini) { + $conn = @$connect_function($connstr); + } else { + ini_set('track_errors', 1); + $conn = @$connect_function($connstr); + ini_set('track_errors', $ini); + } + if ($conn == false) { + return $this->raiseError(DB_ERROR_CONNECT_FAILED, null, + null, null, strip_tags($php_errormsg)); + } + $this->connection = $conn; + return DB_OK; + } + + // }}} + // {{{ disconnect() + + /** + * Log out and disconnect from the database. + * + * @return bool true on success, false if not connected. + */ + function disconnect() + { + $ret = @pg_close($this->connection); + $this->connection = null; + return $ret; + } + + // }}} + // {{{ simpleQuery() + + /** + * Send a query to PostgreSQL and return the results as a + * PostgreSQL resource identifier. + * + * @param $query the SQL query + * + * @return int returns a valid PostgreSQL result for successful SELECT + * queries, DB_OK for other successful queries. A DB error code + * is returned on failure. + */ + function simpleQuery($query) + { + $ismanip = DB::isManip($query); + $this->last_query = $query; + $query = $this->modifyQuery($query); + if (!$this->autocommit && $ismanip) { + if ($this->transaction_opcount == 0) { + $result = @pg_exec($this->connection, 'begin;'); + if (!$result) { + return $this->pgsqlRaiseError(); + } + } + $this->transaction_opcount++; + } + $result = @pg_exec($this->connection, $query); + if (!$result) { + return $this->pgsqlRaiseError(); + } + // Determine which queries that should return data, and which + // should return an error code only. + if ($ismanip) { + $this->affected = @pg_cmdtuples($result); + return DB_OK; + } elseif (preg_match('/^\s*\(?\s*(SELECT(?!\s+INTO)|EXPLAIN|SHOW)\s/si', $query)) { + /* PostgreSQL commands: + ABORT, ALTER, BEGIN, CLOSE, CLUSTER, COMMIT, COPY, + CREATE, DECLARE, DELETE, DROP TABLE, EXPLAIN, FETCH, + GRANT, INSERT, LISTEN, LOAD, LOCK, MOVE, NOTIFY, RESET, + REVOKE, ROLLBACK, SELECT, SELECT INTO, SET, SHOW, + UNLISTEN, UPDATE, VACUUM + */ + $this->row[(int)$result] = 0; // reset the row counter. + $numrows = $this->numrows($result); + if (is_object($numrows)) { + return $numrows; + } + $this->num_rows[(int)$result] = $numrows; + $this->affected = 0; + return $result; + } else { + $this->affected = 0; + return DB_OK; + } + } + + // }}} + // {{{ nextResult() + + /** + * Move the internal pgsql result pointer to the next available result + * + * @param a valid fbsql result resource + * + * @access public + * + * @return true if a result is available otherwise return false + */ + function nextResult($result) + { + return false; + } + + // }}} + // {{{ errorCode() + + /** + * Determine PEAR::DB error code from the database's text error message. + * + * @param string $errormsg error message returned from the database + * @return integer an error number from a DB error constant + */ + function errorCode($errormsg) + { + static $error_regexps; + if (!isset($error_regexps)) { + $error_regexps = array( + '/(([Rr]elation|[Ss]equence|[Tt]able)( [\"\'].*[\"\'])? does not exist|[Cc]lass ".+" not found)$/' => DB_ERROR_NOSUCHTABLE, + '/[Cc]olumn [\"\'].*[\"\'] .*does not exist/' => DB_ERROR_NOSUCHFIELD, + '/[Rr]elation [\"\'].*[\"\'] already exists|[Cc]annot insert a duplicate key into (a )?unique index.*/' => DB_ERROR_ALREADY_EXISTS, + '/(divide|division) by zero$/' => DB_ERROR_DIVZERO, + '/pg_atoi: error in .*: can\'t parse /' => DB_ERROR_INVALID_NUMBER, + '/invalid input syntax for integer/' => DB_ERROR_INVALID_NUMBER, + '/ttribute [\"\'].*[\"\'] not found$|[Rr]elation [\"\'].*[\"\'] does not have attribute [\"\'].*[\"\']/' => DB_ERROR_NOSUCHFIELD, + '/parser: parse error at or near \"/' => DB_ERROR_SYNTAX, + '/syntax error at/' => DB_ERROR_SYNTAX, + '/permission denied/' => DB_ERROR_ACCESS_VIOLATION, + '/violates not-null constraint/' => DB_ERROR_CONSTRAINT_NOT_NULL, + '/violates [\w ]+ constraint/' => DB_ERROR_CONSTRAINT, + '/referential integrity violation/' => DB_ERROR_CONSTRAINT + ); + } + foreach ($error_regexps as $regexp => $code) { + if (preg_match($regexp, $errormsg)) { + return $code; + } + } + // Fall back to DB_ERROR if there was no mapping. + return DB_ERROR; + } + + // }}} + // {{{ fetchInto() + + /** + * Fetch a row and insert the data into an existing array. + * + * Formating of the array and the data therein are configurable. + * See DB_result::fetchInto() for more information. + * + * @param resource $result query result identifier + * @param array $arr (reference) array where data from the row + * should be placed + * @param int $fetchmode how the resulting array should be indexed + * @param int $rownum the row number to fetch + * + * @return mixed DB_OK on success, null when end of result set is + * reached or on failure + * + * @see DB_result::fetchInto() + * @access private + */ + function fetchInto($result, &$arr, $fetchmode, $rownum=null) + { + $result_int = (int)$result; + $rownum = ($rownum !== null) ? $rownum : $this->row[$result_int]; + if ($rownum >= $this->num_rows[$result_int]) { + return null; + } + if ($fetchmode & DB_FETCHMODE_ASSOC) { + $arr = @pg_fetch_array($result, $rownum, PGSQL_ASSOC); + if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE && $arr) { + $arr = array_change_key_case($arr, CASE_LOWER); + } + } else { + $arr = @pg_fetch_row($result, $rownum); + } + if (!$arr) { + $err = pg_errormessage($this->connection); + if (!$err) { + return null; + } + return $this->pgsqlRaiseError(); + } + if ($this->options['portability'] & DB_PORTABILITY_RTRIM) { + $this->_rtrimArrayValues($arr); + } + if ($this->options['portability'] & DB_PORTABILITY_NULL_TO_EMPTY) { + $this->_convertNullArrayValuesToEmpty($arr); + } + $this->row[$result_int] = ++$rownum; + return DB_OK; + } + + // }}} + // {{{ freeResult() + + /** + * Free the internal resources associated with $result. + * + * @param $result int PostgreSQL result identifier + * + * @return bool true on success, false if $result is invalid + */ + function freeResult($result) + { + if (is_resource($result)) { + unset($this->row[(int)$result]); + unset($this->num_rows[(int)$result]); + $this->affected = 0; + return @pg_freeresult($result); + } + return false; + } + + // }}} + // {{{ quote() + + /** + * @deprecated Deprecated in release 1.6.0 + * @internal + */ + function quote($str) { + return $this->quoteSmart($str); + } + + // }}} + // {{{ quoteSmart() + + /** + * Format input so it can be safely used in a query + * + * @param mixed $in data to be quoted + * + * @return mixed Submitted variable's type = returned value: + * + null = the string NULL + * + boolean = string TRUE or FALSE + * + integer or double = the unquoted number + * + other (including strings and numeric strings) = + * the data escaped according to MySQL's settings + * then encapsulated between single quotes + * + * @internal + */ + function quoteSmart($in) + { + if (is_int($in) || is_double($in)) { + return $in; + } elseif (is_bool($in)) { + return $in ? 'TRUE' : 'FALSE'; + } elseif (is_null($in)) { + return 'NULL'; + } else { + return "'" . $this->escapeSimple($in) . "'"; + } + } + + // }}} + // {{{ escapeSimple() + + /** + * Escape a string according to the current DBMS's standards + * + * PostgreSQL treats a backslash as an escape character, so they are + * removed. + * + * Not using pg_escape_string() yet because it requires PostgreSQL + * to be at version 7.2 or greater. + * + * @param string $str the string to be escaped + * + * @return string the escaped string + * + * @internal + */ + function escapeSimple($str) { + return str_replace("'", "''", str_replace('\\', '\\\\', $str)); + } + + // }}} + // {{{ numCols() + + /** + * Get the number of columns in a result set. + * + * @param $result resource PostgreSQL result identifier + * + * @return int the number of columns per row in $result + */ + function numCols($result) + { + $cols = @pg_numfields($result); + if (!$cols) { + return $this->pgsqlRaiseError(); + } + return $cols; + } + + // }}} + // {{{ numRows() + + /** + * Get the number of rows in a result set. + * + * @param $result resource PostgreSQL result identifier + * + * @return int the number of rows in $result + */ + function numRows($result) + { + $rows = @pg_numrows($result); + if ($rows === null) { + return $this->pgsqlRaiseError(); + } + return $rows; + } + + // }}} + // {{{ errorNative() + + /** + * Get the native error code of the last error (if any) that + * occured on the current connection. + * + * @return int native PostgreSQL error code + */ + function errorNative() + { + return pg_errormessage($this->connection); + } + + // }}} + // {{{ autoCommit() + + /** + * Enable/disable automatic commits + */ + function autoCommit($onoff = false) + { + // XXX if $this->transaction_opcount > 0, we should probably + // issue a warning here. + $this->autocommit = $onoff ? true : false; + return DB_OK; + } + + // }}} + // {{{ commit() + + /** + * Commit the current transaction. + */ + function commit() + { + if ($this->transaction_opcount > 0) { + // (disabled) hack to shut up error messages from libpq.a + //@fclose(@fopen("php://stderr", "w")); + $result = @pg_exec($this->connection, 'end;'); + $this->transaction_opcount = 0; + if (!$result) { + return $this->pgsqlRaiseError(); + } + } + return DB_OK; + } + + // }}} + // {{{ rollback() + + /** + * Roll back (undo) the current transaction. + */ + function rollback() + { + if ($this->transaction_opcount > 0) { + $result = @pg_exec($this->connection, 'abort;'); + $this->transaction_opcount = 0; + if (!$result) { + return $this->pgsqlRaiseError(); + } + } + return DB_OK; + } + + // }}} + // {{{ affectedRows() + + /** + * Gets the number of rows affected by the last query. + * if the last query was a select, returns 0. + * + * @return int number of rows affected by the last query or DB_ERROR + */ + function affectedRows() + { + return $this->affected; + } + + // }}} + // {{{ nextId() + + /** + * Returns the next free id in a sequence + * + * @param string $seq_name name of the sequence + * @param boolean $ondemand when true, the seqence is automatically + * created if it does not exist + * + * @return int the next id number in the sequence. DB_Error if problem. + * + * @internal + * @see DB_common::nextID() + * @access public + */ + function nextId($seq_name, $ondemand = true) + { + $seqname = $this->getSequenceName($seq_name); + $repeat = false; + do { + $this->pushErrorHandling(PEAR_ERROR_RETURN); + $result =& $this->query("SELECT NEXTVAL('${seqname}')"); + $this->popErrorHandling(); + if ($ondemand && DB::isError($result) && + $result->getCode() == DB_ERROR_NOSUCHTABLE) { + $repeat = true; + $this->pushErrorHandling(PEAR_ERROR_RETURN); + $result = $this->createSequence($seq_name); + $this->popErrorHandling(); + if (DB::isError($result)) { + return $this->raiseError($result); + } + } else { + $repeat = false; + } + } while ($repeat); + if (DB::isError($result)) { + return $this->raiseError($result); + } + $arr = $result->fetchRow(DB_FETCHMODE_ORDERED); + $result->free(); + return $arr[0]; + } + + // }}} + // {{{ createSequence() + + /** + * Create the sequence + * + * @param string $seq_name the name of the sequence + * @return mixed DB_OK on success or DB error on error + * @access public + */ + function createSequence($seq_name) + { + $seqname = $this->getSequenceName($seq_name); + $result = $this->query("CREATE SEQUENCE ${seqname}"); + return $result; + } + + // }}} + // {{{ dropSequence() + + /** + * Drop a sequence + * + * @param string $seq_name the name of the sequence + * @return mixed DB_OK on success or DB error on error + * @access public + */ + function dropSequence($seq_name) + { + $seqname = $this->getSequenceName($seq_name); + return $this->query("DROP SEQUENCE ${seqname}"); + } + + // }}} + // {{{ modifyLimitQuery() + + function modifyLimitQuery($query, $from, $count, $params = array()) + { + $query = $query . " LIMIT $count OFFSET $from"; + return $query; + } + + // }}} + // {{{ pgsqlRaiseError() + + /** + * Gather information about an error, then use that info to create a + * DB error object and finally return that object. + * + * @param integer $errno PEAR error number (usually a DB constant) if + * manually raising an error + * @return object DB error object + * @see errorNative() + * @see errorCode() + * @see DB_common::raiseError() + */ + function pgsqlRaiseError($errno = null) + { + $native = $this->errorNative(); + if ($errno === null) { + $err = $this->errorCode($native); + } else { + $err = $errno; + } + return $this->raiseError($err, null, null, null, $native); + } + + // }}} + // {{{ _pgFieldFlags() + + /** + * Flags of a Field + * + * @param int $resource PostgreSQL result identifier + * @param int $num_field the field number + * + * @return string The flags of the field ("not_null", "default_value", + * "primary_key", "unique_key" and "multiple_key" + * are supported). The default value is passed + * through rawurlencode() in case there are spaces in it. + * @access private + */ + function _pgFieldFlags($resource, $num_field, $table_name) + { + $field_name = @pg_fieldname($resource, $num_field); + + $result = @pg_exec($this->connection, "SELECT f.attnotnull, f.atthasdef + FROM pg_attribute f, pg_class tab, pg_type typ + WHERE tab.relname = typ.typname + AND typ.typrelid = f.attrelid + AND f.attname = '$field_name' + AND tab.relname = '$table_name'"); + if (@pg_numrows($result) > 0) { + $row = @pg_fetch_row($result, 0); + $flags = ($row[0] == 't') ? 'not_null ' : ''; + + if ($row[1] == 't') { + $result = @pg_exec($this->connection, "SELECT a.adsrc + FROM pg_attribute f, pg_class tab, pg_type typ, pg_attrdef a + WHERE tab.relname = typ.typname AND typ.typrelid = f.attrelid + AND f.attrelid = a.adrelid AND f.attname = '$field_name' + AND tab.relname = '$table_name' AND f.attnum = a.adnum"); + $row = @pg_fetch_row($result, 0); + $num = preg_replace("/'(.*)'::\w+/", "\\1", $row[0]); + $flags .= 'default_' . rawurlencode($num) . ' '; + } + } else { + $flags = ''; + } + $result = @pg_exec($this->connection, "SELECT i.indisunique, i.indisprimary, i.indkey + FROM pg_attribute f, pg_class tab, pg_type typ, pg_index i + WHERE tab.relname = typ.typname + AND typ.typrelid = f.attrelid + AND f.attrelid = i.indrelid + AND f.attname = '$field_name' + AND tab.relname = '$table_name'"); + $count = @pg_numrows($result); + + for ($i = 0; $i < $count ; $i++) { + $row = @pg_fetch_row($result, $i); + $keys = explode(' ', $row[2]); + + if (in_array($num_field + 1, $keys)) { + $flags .= ($row[0] == 't' && $row[1] == 'f') ? 'unique_key ' : ''; + $flags .= ($row[1] == 't') ? 'primary_key ' : ''; + if (count($keys) > 1) + $flags .= 'multiple_key '; + } + } + + return trim($flags); + } + + // }}} + // {{{ tableInfo() + + /** + * Returns information about a table or a result set. + * + * NOTE: only supports 'table' and 'flags' if $result + * is a table name. + * + * @param object|string $result DB_result object from a query or a + * string containing the name of a table + * @param int $mode a valid tableInfo mode + * @return array an associative array with the information requested + * or an error object if something is wrong + * @access public + * @internal + * @see DB_common::tableInfo() + */ + function tableInfo($result, $mode = null) + { + if (isset($result->result)) { + /* + * Probably received a result object. + * Extract the result resource identifier. + */ + $id = $result->result; + $got_string = false; + } elseif (is_string($result)) { + /* + * Probably received a table name. + * Create a result resource identifier. + */ + $id = @pg_exec($this->connection, "SELECT * FROM $result LIMIT 0"); + $got_string = true; + } else { + /* + * Probably received a result resource identifier. + * Copy it. + * Deprecated. Here for compatibility only. + */ + $id = $result; + $got_string = false; + } + + if (!is_resource($id)) { + return $this->pgsqlRaiseError(DB_ERROR_NEED_MORE_DATA); + } + + if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE) { + $case_func = 'strtolower'; + } else { + $case_func = 'strval'; + } + + $count = @pg_numfields($id); + + // made this IF due to performance (one if is faster than $count if's) + if (!$mode) { + + for ($i=0; $i<$count; $i++) { + $res[$i]['table'] = $got_string ? $case_func($result) : ''; + $res[$i]['name'] = $case_func(@pg_fieldname($id, $i)); + $res[$i]['type'] = @pg_fieldtype($id, $i); + $res[$i]['len'] = @pg_fieldsize($id, $i); + $res[$i]['flags'] = $got_string ? $this->_pgFieldflags($id, $i, $result) : ''; + } + + } else { // full + $res['num_fields']= $count; + + for ($i=0; $i<$count; $i++) { + $res[$i]['table'] = $got_string ? $case_func($result) : ''; + $res[$i]['name'] = $case_func(@pg_fieldname($id, $i)); + $res[$i]['type'] = @pg_fieldtype($id, $i); + $res[$i]['len'] = @pg_fieldsize($id, $i); + $res[$i]['flags'] = $got_string ? $this->_pgFieldFlags($id, $i, $result) : ''; + + if ($mode & DB_TABLEINFO_ORDER) { + $res['order'][$res[$i]['name']] = $i; + } + if ($mode & DB_TABLEINFO_ORDERTABLE) { + $res['ordertable'][$res[$i]['table']][$res[$i]['name']] = $i; + } + } + } + + // free the result only if we were called on a table + if ($got_string) { + @pg_freeresult($id); + } + return $res; + } + + // }}} + // {{{ getTablesQuery() + + /** + * Returns the query needed to get some backend info + * @param string $type What kind of info you want to retrieve + * @return string The SQL query string + */ + function getSpecialQuery($type) + { + switch ($type) { + case 'tables': + return "SELECT c.relname as \"Name\" + FROM pg_class c, pg_user u + WHERE c.relowner = u.usesysid AND c.relkind = 'r' + AND not exists (select 1 from pg_views where viewname = c.relname) + AND c.relname !~ '^(pg_|sql_)' + UNION + SELECT c.relname as \"Name\" + FROM pg_class c + WHERE c.relkind = 'r' + AND not exists (select 1 from pg_views where viewname = c.relname) + AND not exists (select 1 from pg_user where usesysid = c.relowner) + AND c.relname !~ '^pg_'"; + case 'views': + // Table cols: viewname | viewowner | definition + return 'SELECT viewname FROM pg_views'; + case 'users': + // cols: usename |usesysid|usecreatedb|usetrace|usesuper|usecatupd|passwd |valuntil + return 'SELECT usename FROM pg_user'; + case 'databases': + return 'SELECT datname FROM pg_database'; + case 'functions': + return 'SELECT proname FROM pg_proc'; + default: + return null; + } + } + + // }}} + +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + */ + +?> diff --git a/thirdparty/pear/DB/sqlite.php b/thirdparty/pear/DB/sqlite.php new file mode 100644 index 000000000..cd5a12ca3 --- /dev/null +++ b/thirdparty/pear/DB/sqlite.php @@ -0,0 +1,695 @@ + | +// | Mika Tuupola | +// | Maintainer: Daniel Convissor | +// +----------------------------------------------------------------------+ +// +// $Id: sqlite.php 3355 2005-06-11 22:14:40Z nbm $ + +require_once 'DB/common.php'; + +/** + * Database independent query interface definition for the SQLite + * PECL extension. + * + * @package DB + * @version $Id: sqlite.php 3355 2005-06-11 22:14:40Z nbm $ + * @category Database + * @author Urs Gehrig + * @author Mika Tuupola + */ +class DB_sqlite extends DB_common +{ + // {{{ properties + + var $connection; + var $phptype, $dbsyntax; + var $prepare_tokens = array(); + var $prepare_types = array(); + var $_lasterror = ''; + + // }}} + // {{{ constructor + + /** + * Constructor for this class. + * + * Error codes according to sqlite_exec. Error Codes specification is + * in the {@link http://sqlite.org/c_interface.html online manual}. + * + * This errorhandling based on sqlite_exec is not yet implemented. + * + * @access public + */ + function DB_sqlite() + { + + $this->DB_common(); + $this->phptype = 'sqlite'; + $this->dbsyntax = 'sqlite'; + $this->features = array ( + 'prepare' => false, + 'pconnect' => true, + 'transactions' => false, + 'limit' => 'alter' + ); + + // SQLite data types, http://www.sqlite.org/datatypes.html + $this->keywords = array ( + 'BLOB' => '', + 'BOOLEAN' => '', + 'CHARACTER' => '', + 'CLOB' => '', + 'FLOAT' => '', + 'INTEGER' => '', + 'KEY' => '', + 'NATIONAL' => '', + 'NUMERIC' => '', + 'NVARCHAR' => '', + 'PRIMARY' => '', + 'TEXT' => '', + 'TIMESTAMP' => '', + 'UNIQUE' => '', + 'VARCHAR' => '', + 'VARYING' => '' + ); + $this->errorcode_map = array( + ); + } + + // }}} + // {{{ connect() + + /** + * Connect to a database represented by a file. + * + * @param $dsn the data source name; the file is taken as + * database; "sqlite://root:@host/test.db?mode=0644" + * @param $persistent (optional) whether the connection should + * be persistent + * @access public + * @return int DB_OK on success, a DB error on failure + */ + function connect($dsninfo, $persistent = false) + { + if (!DB::assertExtension('sqlite')) { + return $this->raiseError(DB_ERROR_EXTENSION_NOT_FOUND); + } + + $this->dsn = $dsninfo; + + if ($dsninfo['database']) { + if (!file_exists($dsninfo['database'])) { + if (!touch($dsninfo['database'])) { + return $this->sqliteRaiseError(DB_ERROR_NOT_FOUND); + } + if (!isset($dsninfo['mode']) || + !is_numeric($dsninfo['mode'])) + { + $mode = 0644; + } else { + $mode = octdec($dsninfo['mode']); + } + if (!chmod($dsninfo['database'], $mode)) { + return $this->sqliteRaiseError(DB_ERROR_NOT_FOUND); + } + if (!file_exists($dsninfo['database'])) { + return $this->sqliteRaiseError(DB_ERROR_NOT_FOUND); + } + } + if (!is_file($dsninfo['database'])) { + return $this->sqliteRaiseError(DB_ERROR_INVALID); + } + if (!is_readable($dsninfo['database'])) { + return $this->sqliteRaiseError(DB_ERROR_ACCESS_VIOLATION); + } + } else { + return $this->sqliteRaiseError(DB_ERROR_ACCESS_VIOLATION); + } + + $connect_function = $persistent ? 'sqlite_popen' : 'sqlite_open'; + if (!($conn = @$connect_function($dsninfo['database']))) { + return $this->sqliteRaiseError(DB_ERROR_NODBSELECTED); + } + $this->connection = $conn; + + return DB_OK; + } + + // }}} + // {{{ disconnect() + + /** + * Log out and disconnect from the database. + * + * @access public + * @return bool true on success, false if not connected. + * @todo fix return values + */ + function disconnect() + { + $ret = @sqlite_close($this->connection); + $this->connection = null; + return $ret; + } + + // }}} + // {{{ simpleQuery() + + /** + * Send a query to SQLite and returns the results as a SQLite resource + * identifier. + * + * @param the SQL query + * @access public + * @return mixed returns a valid SQLite result for successful SELECT + * queries, DB_OK for other successful queries. A DB error is + * returned on failure. + */ + function simpleQuery($query) + { + $ismanip = DB::isManip($query); + $this->last_query = $query; + $query = $this->_modifyQuery($query); + ini_set('track_errors', true); + $result = @sqlite_query($query, $this->connection); + ini_restore('track_errors'); + $this->_lasterror = isset($php_errormsg) ? $php_errormsg : ''; + $this->result = $result; + if (!$this->result) { + return $this->sqliteRaiseError(null); + } + + /* sqlite_query() seems to allways return a resource */ + /* so cant use that. Using $ismanip instead */ + if (!$ismanip) { + $numRows = $this->numRows($result); + + /* if numRows() returned PEAR_Error */ + if (is_object($numRows)) { + return $numRows; + } + return $result; + } + return DB_OK; + } + + // }}} + // {{{ nextResult() + + /** + * Move the internal sqlite result pointer to the next available result. + * + * @param a valid sqlite result resource + * @access public + * @return true if a result is available otherwise return false + */ + function nextResult($result) + { + return false; + } + + // }}} + // {{{ fetchInto() + + /** + * Fetch a row and insert the data into an existing array. + * + * Formating of the array and the data therein are configurable. + * See DB_result::fetchInto() for more information. + * + * @param resource $result query result identifier + * @param array $arr (reference) array where data from the row + * should be placed + * @param int $fetchmode how the resulting array should be indexed + * @param int $rownum the row number to fetch + * + * @return mixed DB_OK on success, null when end of result set is + * reached or on failure + * + * @see DB_result::fetchInto() + * @access private + */ + function fetchInto($result, &$arr, $fetchmode, $rownum=null) + { + if ($rownum !== null) { + if (!@sqlite_seek($this->result, $rownum)) { + return null; + } + } + if ($fetchmode & DB_FETCHMODE_ASSOC) { + $arr = @sqlite_fetch_array($result, SQLITE_ASSOC); + if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE && $arr) { + $arr = array_change_key_case($arr, CASE_LOWER); + } + } else { + $arr = @sqlite_fetch_array($result, SQLITE_NUM); + } + if (!$arr) { + /* See: http://bugs.php.net/bug.php?id=22328 */ + return null; + } + if ($this->options['portability'] & DB_PORTABILITY_RTRIM) { + /* + * Even though this DBMS already trims output, we do this because + * a field might have intentional whitespace at the end that + * gets removed by DB_PORTABILITY_RTRIM under another driver. + */ + $this->_rtrimArrayValues($arr); + } + if ($this->options['portability'] & DB_PORTABILITY_NULL_TO_EMPTY) { + $this->_convertNullArrayValuesToEmpty($arr); + } + return DB_OK; + } + + // }}} + // {{{ freeResult() + + /** + * Free the internal resources associated with $result. + * + * @param $result SQLite result identifier + * @access public + * @return bool true on success, false if $result is invalid + */ + function freeResult(&$result) + { + // XXX No native free? + if (!is_resource($result)) { + return false; + } + $result = null; + return true; + } + + // }}} + // {{{ numCols() + + /** + * Gets the number of columns in a result set. + * + * @return number of columns in a result set + */ + function numCols($result) + { + $cols = @sqlite_num_fields($result); + if (!$cols) { + return $this->sqliteRaiseError(); + } + return $cols; + } + + // }}} + // {{{ numRows() + + /** + * Gets the number of rows affected by a query. + * + * @return number of rows affected by the last query + */ + function numRows($result) + { + $rows = @sqlite_num_rows($result); + if (!is_integer($rows)) { + return $this->raiseError(); + } + return $rows; + } + + // }}} + // {{{ affected() + + /** + * Gets the number of rows affected by a query. + * + * @return number of rows affected by the last query + */ + function affectedRows() + { + return @sqlite_changes($this->connection); + } + + // }}} + // {{{ errorNative() + + /** + * Get the native error string of the last error (if any) that + * occured on the current connection. + * + * This is used to retrieve more meaningfull error messages DB_pgsql + * way since sqlite_last_error() does not provide adequate info. + * + * @return string native SQLite error message + */ + function errorNative() + { + return($this->_lasterror); + } + + // }}} + // {{{ errorCode() + + /** + * Determine PEAR::DB error code from the database's text error message. + * + * @param string $errormsg error message returned from the database + * @return integer an error number from a DB error constant + */ + function errorCode($errormsg) + { + static $error_regexps; + if (!isset($error_regexps)) { + $error_regexps = array( + '/^no such table:/' => DB_ERROR_NOSUCHTABLE, + '/^table .* already exists$/' => DB_ERROR_ALREADY_EXISTS, + '/PRIMARY KEY must be unique/i' => DB_ERROR_CONSTRAINT, + '/is not unique/' => DB_ERROR_CONSTRAINT, + '/uniqueness constraint failed/' => DB_ERROR_CONSTRAINT, + '/may not be NULL/' => DB_ERROR_CONSTRAINT_NOT_NULL, + '/^no such column:/' => DB_ERROR_NOSUCHFIELD, + '/^near ".*": syntax error$/' => DB_ERROR_SYNTAX + ); + } + foreach ($error_regexps as $regexp => $code) { + if (preg_match($regexp, $errormsg)) { + return $code; + } + } + // Fall back to DB_ERROR if there was no mapping. + return DB_ERROR; + } + + // }}} + // {{{ dropSequence() + + /** + * Deletes a sequence + * + * @param string $seq_name name of the sequence to be deleted + * + * @return int DB_OK on success. DB_Error if problems. + * + * @internal + * @see DB_common::dropSequence() + * @access public + */ + function dropSequence($seq_name) + { + $seqname = $this->getSequenceName($seq_name); + return $this->query("DROP TABLE $seqname"); + } + + /** + * Creates a new sequence + * + * @param string $seq_name name of the new sequence + * + * @return int DB_OK on success. A DB_Error object is returned if + * problems arise. + * + * @internal + * @see DB_common::createSequence() + * @access public + */ + function createSequence($seq_name) + { + $seqname = $this->getSequenceName($seq_name); + $query = 'CREATE TABLE ' . $seqname . + ' (id INTEGER UNSIGNED PRIMARY KEY) '; + $result = $this->query($query); + if (DB::isError($result)) { + return($result); + } + $query = "CREATE TRIGGER ${seqname}_cleanup AFTER INSERT ON $seqname + BEGIN + DELETE FROM $seqname WHERE idquery($query); + if (DB::isError($result)) { + return($result); + } + } + + // }}} + // {{{ nextId() + + /** + * Returns the next free id in a sequence + * + * @param string $seq_name name of the sequence + * @param boolean $ondemand when true, the seqence is automatically + * created if it does not exist + * + * @return int the next id number in the sequence. DB_Error if problem. + * + * @internal + * @see DB_common::nextID() + * @access public + */ + function nextId($seq_name, $ondemand = true) + { + $seqname = $this->getSequenceName($seq_name); + + do { + $repeat = 0; + $this->pushErrorHandling(PEAR_ERROR_RETURN); + $result = $this->query("INSERT INTO $seqname (id) VALUES (NULL)"); + $this->popErrorHandling(); + if ($result === DB_OK) { + $id = @sqlite_last_insert_rowid($this->connection); + if ($id != 0) { + return $id; + } + } elseif ($ondemand && DB::isError($result) && + $result->getCode() == DB_ERROR_NOSUCHTABLE) + { + $result = $this->createSequence($seq_name); + if (DB::isError($result)) { + return $this->raiseError($result); + } else { + $repeat = 1; + } + } + } while ($repeat); + + return $this->raiseError($result); + } + + // }}} + // {{{ getSpecialQuery() + + /** + * Returns the query needed to get some backend info. + * + * Refer to the online manual at http://sqlite.org/sqlite.html. + * + * @param string $type What kind of info you want to retrieve + * @return string The SQL query string + */ + function getSpecialQuery($type, $args=array()) + { + if (!is_array($args)) + return $this->raiseError('no key specified', null, null, null, + 'Argument has to be an array.'); + switch (strtolower($type)) { + case 'master': + return 'SELECT * FROM sqlite_master;'; + case 'tables': + return "SELECT name FROM sqlite_master WHERE type='table' " + . 'UNION ALL SELECT name FROM sqlite_temp_master ' + . "WHERE type='table' ORDER BY name;"; + case 'schema': + return 'SELECT sql FROM (SELECT * FROM sqlite_master UNION ALL ' + . 'SELECT * FROM sqlite_temp_master) ' + . "WHERE type!='meta' ORDER BY tbl_name, type DESC, name;"; + case 'schemax': + case 'schema_x': + /* + * Use like: + * $res = $db->query($db->getSpecialQuery('schema_x', array('table' => 'table3'))); + */ + return 'SELECT sql FROM (SELECT * FROM sqlite_master UNION ALL ' + . 'SELECT * FROM sqlite_temp_master) ' + . "WHERE tbl_name LIKE '{$args['table']}' AND type!='meta' " + . 'ORDER BY type DESC, name;'; + case 'alter': + /* + * SQLite does not support ALTER TABLE; this is a helper query + * to handle this. 'table' represents the table name, 'rows' + * the news rows to create, 'save' the row(s) to keep _with_ + * the data. + * + * Use like: + * $args = array( + * 'table' => $table, + * 'rows' => "id INTEGER PRIMARY KEY, firstname TEXT, surname TEXT, datetime TEXT", + * 'save' => "NULL, titel, content, datetime" + * ); + * $res = $db->query( $db->getSpecialQuery('alter', $args)); + */ + $rows = strtr($args['rows'], $this->keywords); + + $q = array( + 'BEGIN TRANSACTION', + "CREATE TEMPORARY TABLE {$args['table']}_backup ({$args['rows']})", + "INSERT INTO {$args['table']}_backup SELECT {$args['save']} FROM {$args['table']}", + "DROP TABLE {$args['table']}", + "CREATE TABLE {$args['table']} ({$args['rows']})", + "INSERT INTO {$args['table']} SELECT {$rows} FROM {$args['table']}_backup", + "DROP TABLE {$args['table']}_backup", + 'COMMIT', + ); + + // This is a dirty hack, since the above query will no get executed with a single + // query call; so here the query method will be called directly and return a select instead. + foreach ($q as $query) { + $this->query($query); + } + return "SELECT * FROM {$args['table']};"; + default: + return null; + } + } + + // }}} + // {{{ getDbFileStats() + + /** + * Get the file stats for the current database. + * + * Possible arguments are dev, ino, mode, nlink, uid, gid, rdev, size, + * atime, mtime, ctime, blksize, blocks or a numeric key between + * 0 and 12. + * + * @param string $arg Array key for stats() + * @return mixed array on an unspecified key, integer on a passed arg and + * false at a stats error. + */ + function getDbFileStats($arg = '') + { + $stats = stat($this->dsn['database']); + if ($stats == false) { + return false; + } + if (is_array($stats)) { + if (is_numeric($arg)) { + if (((int)$arg <= 12) & ((int)$arg >= 0)) { + return false; + } + return $stats[$arg ]; + } + if (array_key_exists(trim($arg), $stats)) { + return $stats[$arg ]; + } + } + return $stats; + } + + // }}} + // {{{ escapeSimple() + + /** + * Escape a string according to the current DBMS's standards + * + * In SQLite, this makes things safe for inserts/updates, but may + * cause problems when performing text comparisons against columns + * containing binary data. See the + * {@link http://php.net/sqlite_escape_string PHP manual} for more info. + * + * @param string $str the string to be escaped + * + * @return string the escaped string + * + * @since 1.6.1 + * @see DB_common::escapeSimple() + * @internal + */ + function escapeSimple($str) { + return @sqlite_escape_string($str); + } + + // }}} + // {{{ modifyLimitQuery() + + function modifyLimitQuery($query, $from, $count, $params = array()) + { + $query = $query . " LIMIT $count OFFSET $from"; + return $query; + } + + // }}} + // {{{ modifyQuery() + + /** + * "DELETE FROM table" gives 0 affected rows in SQLite. + * + * This little hack lets you know how many rows were deleted. + * + * @param string $query The SQL query string + * @return string The SQL query string + */ + function _modifyQuery($query) + { + if ($this->options['portability'] & DB_PORTABILITY_DELETE_COUNT) { + if (preg_match('/^\s*DELETE\s+FROM\s+(\S+)\s*$/i', $query)) { + $query = preg_replace('/^\s*DELETE\s+FROM\s+(\S+)\s*$/', + 'DELETE FROM \1 WHERE 1=1', $query); + } + } + return $query; + } + + // }}} + // {{{ sqliteRaiseError() + + /** + * Gather information about an error, then use that info to create a + * DB error object and finally return that object. + * + * @param integer $errno PEAR error number (usually a DB constant) if + * manually raising an error + * @return object DB error object + * @see errorNative() + * @see errorCode() + * @see DB_common::raiseError() + */ + function sqliteRaiseError($errno = null) + { + + $native = $this->errorNative(); + if ($errno === null) { + $errno = $this->errorCode($native); + } + + $errorcode = @sqlite_last_error($this->connection); + $userinfo = "$errorcode ** $this->last_query"; + + return $this->raiseError($errno, null, null, $userinfo, $native); + } + + // }}} +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + */ + +?> diff --git a/thirdparty/pear/DB/storage.php b/thirdparty/pear/DB/storage.php new file mode 100644 index 000000000..1e446d93f --- /dev/null +++ b/thirdparty/pear/DB/storage.php @@ -0,0 +1,495 @@ + | +// | Maintainer: Daniel Convissor | +// +----------------------------------------------------------------------+ +// +// $Id: storage.php 3355 2005-06-11 22:14:40Z nbm $ + +require_once 'DB.php'; + +/** + * Provides an object interface to a table row. + * + * It lets you add, delete and change rows using objects rather than SQL + * statements. + * + * @package DB + * @version $Id: storage.php 3355 2005-06-11 22:14:40Z nbm $ + * @category Database + * @author Stig Bakken + */ +class DB_storage extends PEAR +{ + // {{{ properties + + /** the name of the table (or view, if the backend database supports + updates in views) we hold data from */ + var $_table = null; + + /** which column(s) in the table contains primary keys, can be a + string for single-column primary keys, or an array of strings + for multiple-column primary keys */ + var $_keycolumn = null; + + /** DB connection handle used for all transactions */ + var $_dbh = null; + + /** an assoc with the names of database fields stored as properties + in this object */ + var $_properties = array(); + + /** an assoc with the names of the properties in this object that + have been changed since they were fetched from the database */ + var $_changes = array(); + + /** flag that decides if data in this object can be changed. + objects that don't have their table's key column in their + property lists will be flagged as read-only. */ + var $_readonly = false; + + /** function or method that implements a validator for fields that + are set, this validator function returns true if the field is + valid, false if not */ + var $_validator = null; + + // }}} + // {{{ constructor + + /** + * Constructor + * + * @param $table string the name of the database table + * + * @param $keycolumn mixed string with name of key column, or array of + * strings if the table has a primary key of more than one column + * + * @param $dbh object database connection object + * + * @param $validator mixed function or method used to validate + * each new value, called with three parameters: the name of the + * field/column that is changing, a reference to the new value and + * a reference to this object + * + */ + function DB_storage($table, $keycolumn, &$dbh, $validator = null) + { + $this->PEAR('DB_Error'); + $this->_table = $table; + $this->_keycolumn = $keycolumn; + $this->_dbh = $dbh; + $this->_readonly = false; + $this->_validator = $validator; + } + + // }}} + // {{{ _makeWhere() + + /** + * Utility method to build a "WHERE" clause to locate ourselves in + * the table. + * + * XXX future improvement: use rowids? + * + * @access private + */ + function _makeWhere($keyval = null) + { + if (is_array($this->_keycolumn)) { + if ($keyval === null) { + for ($i = 0; $i < sizeof($this->_keycolumn); $i++) { + $keyval[] = $this->{$this->_keycolumn[$i]}; + } + } + $whereclause = ''; + for ($i = 0; $i < sizeof($this->_keycolumn); $i++) { + if ($i > 0) { + $whereclause .= ' AND '; + } + $whereclause .= $this->_keycolumn[$i]; + if (is_null($keyval[$i])) { + // there's not much point in having a NULL key, + // but we support it anyway + $whereclause .= ' IS NULL'; + } else { + $whereclause .= ' = ' . $this->_dbh->quote($keyval[$i]); + } + } + } else { + if ($keyval === null) { + $keyval = @$this->{$this->_keycolumn}; + } + $whereclause = $this->_keycolumn; + if (is_null($keyval)) { + // there's not much point in having a NULL key, + // but we support it anyway + $whereclause .= ' IS NULL'; + } else { + $whereclause .= ' = ' . $this->_dbh->quote($keyval); + } + } + return $whereclause; + } + + // }}} + // {{{ setup() + + /** + * Method used to initialize a DB_storage object from the + * configured table. + * + * @param $keyval mixed the key[s] of the row to fetch (string or array) + * + * @return int DB_OK on success, a DB error if not + */ + function setup($keyval) + { + $whereclause = $this->_makeWhere($keyval); + $query = 'SELECT * FROM ' . $this->_table . ' WHERE ' . $whereclause; + $sth = $this->_dbh->query($query); + if (DB::isError($sth)) { + return $sth; + } + $row = $sth->fetchRow(DB_FETCHMODE_ASSOC); + if (DB::isError($row)) { + return $row; + } + if (!$row) { + return $this->raiseError(null, DB_ERROR_NOT_FOUND, null, null, + $query, null, true); + } + foreach ($row as $key => $value) { + $this->_properties[$key] = true; + $this->$key = $value; + } + return DB_OK; + } + + // }}} + // {{{ insert() + + /** + * Create a new (empty) row in the configured table for this + * object. + */ + function insert($newpk) + { + if (is_array($this->_keycolumn)) { + $primarykey = $this->_keycolumn; + } else { + $primarykey = array($this->_keycolumn); + } + settype($newpk, "array"); + for ($i = 0; $i < sizeof($primarykey); $i++) { + $pkvals[] = $this->_dbh->quote($newpk[$i]); + } + + $sth = $this->_dbh->query("INSERT INTO $this->_table (" . + implode(",", $primarykey) . ") VALUES(" . + implode(",", $pkvals) . ")"); + if (DB::isError($sth)) { + return $sth; + } + if (sizeof($newpk) == 1) { + $newpk = $newpk[0]; + } + $this->setup($newpk); + } + + // }}} + // {{{ toString() + + /** + * Output a simple description of this DB_storage object. + * @return string object description + */ + function toString() + { + $info = strtolower(get_class($this)); + $info .= " (table="; + $info .= $this->_table; + $info .= ", keycolumn="; + if (is_array($this->_keycolumn)) { + $info .= "(" . implode(",", $this->_keycolumn) . ")"; + } else { + $info .= $this->_keycolumn; + } + $info .= ", dbh="; + if (is_object($this->_dbh)) { + $info .= $this->_dbh->toString(); + } else { + $info .= "null"; + } + $info .= ")"; + if (sizeof($this->_properties)) { + $info .= " [loaded, key="; + $keyname = $this->_keycolumn; + if (is_array($keyname)) { + $info .= "("; + for ($i = 0; $i < sizeof($keyname); $i++) { + if ($i > 0) { + $info .= ","; + } + $info .= $this->$keyname[$i]; + } + $info .= ")"; + } else { + $info .= $this->$keyname; + } + $info .= "]"; + } + if (sizeof($this->_changes)) { + $info .= " [modified]"; + } + return $info; + } + + // }}} + // {{{ dump() + + /** + * Dump the contents of this object to "standard output". + */ + function dump() + { + foreach ($this->_properties as $prop => $foo) { + print "$prop = "; + print htmlentities($this->$prop); + print "
    \n"; + } + } + + // }}} + // {{{ &create() + + /** + * Static method used to create new DB storage objects. + * @param $data assoc. array where the keys are the names + * of properties/columns + * @return object a new instance of DB_storage or a subclass of it + */ + function &create($table, &$data) + { + $classname = strtolower(get_class($this)); + $obj =& new $classname($table); + foreach ($data as $name => $value) { + $obj->_properties[$name] = true; + $obj->$name = &$value; + } + return $obj; + } + + // }}} + // {{{ loadFromQuery() + + /** + * Loads data into this object from the given query. If this + * object already contains table data, changes will be saved and + * the object re-initialized first. + * + * @param $query SQL query + * + * @param $params parameter list in case you want to use + * prepare/execute mode + * + * @return int DB_OK on success, DB_WARNING_READ_ONLY if the + * returned object is read-only (because the object's specified + * key column was not found among the columns returned by $query), + * or another DB error code in case of errors. + */ +// XXX commented out for now +/* + function loadFromQuery($query, $params = null) + { + if (sizeof($this->_properties)) { + if (sizeof($this->_changes)) { + $this->store(); + $this->_changes = array(); + } + $this->_properties = array(); + } + $rowdata = $this->_dbh->getRow($query, DB_FETCHMODE_ASSOC, $params); + if (DB::isError($rowdata)) { + return $rowdata; + } + reset($rowdata); + $found_keycolumn = false; + while (list($key, $value) = each($rowdata)) { + if ($key == $this->_keycolumn) { + $found_keycolumn = true; + } + $this->_properties[$key] = true; + $this->$key = &$value; + unset($value); // have to unset, or all properties will + // refer to the same value + } + if (!$found_keycolumn) { + $this->_readonly = true; + return DB_WARNING_READ_ONLY; + } + return DB_OK; + } + */ + + // }}} + // {{{ set() + + /** + * Modify an attriute value. + */ + function set($property, $newvalue) + { + // only change if $property is known and object is not + // read-only + if ($this->_readonly) { + return $this->raiseError(null, DB_WARNING_READ_ONLY, null, + null, null, null, true); + } + if (@isset($this->_properties[$property])) { + if (empty($this->_validator)) { + $valid = true; + } else { + $valid = @call_user_func($this->_validator, + $this->_table, + $property, + $newvalue, + $this->$property, + $this); + } + if ($valid) { + $this->$property = $newvalue; + if (empty($this->_changes[$property])) { + $this->_changes[$property] = 0; + } else { + $this->_changes[$property]++; + } + } else { + return $this->raiseError(null, DB_ERROR_INVALID, null, + null, "invalid field: $property", + null, true); + } + return true; + } + return $this->raiseError(null, DB_ERROR_NOSUCHFIELD, null, + null, "unknown field: $property", + null, true); + } + + // }}} + // {{{ &get() + + /** + * Fetch an attribute value. + * + * @param string attribute name + * + * @return attribute contents, or null if the attribute name is + * unknown + */ + function &get($property) + { + // only return if $property is known + if (isset($this->_properties[$property])) { + return $this->$property; + } + $tmp = null; + return $tmp; + } + + // }}} + // {{{ _DB_storage() + + /** + * Destructor, calls DB_storage::store() if there are changes + * that are to be kept. + */ + function _DB_storage() + { + if (sizeof($this->_changes)) { + $this->store(); + } + $this->_properties = array(); + $this->_changes = array(); + $this->_table = null; + } + + // }}} + // {{{ store() + + /** + * Stores changes to this object in the database. + * + * @return DB_OK or a DB error + */ + function store() + { + foreach ($this->_changes as $name => $foo) { + $params[] = &$this->$name; + $vars[] = $name . ' = ?'; + } + if ($vars) { + $query = 'UPDATE ' . $this->_table . ' SET ' . + implode(', ', $vars) . ' WHERE ' . + $this->_makeWhere(); + $stmt = $this->_dbh->prepare($query); + $res = $this->_dbh->execute($stmt, $params); + if (DB::isError($res)) { + return $res; + } + $this->_changes = array(); + } + return DB_OK; + } + + // }}} + // {{{ remove() + + /** + * Remove the row represented by this object from the database. + * + * @return mixed DB_OK or a DB error + */ + function remove() + { + if ($this->_readonly) { + return $this->raiseError(null, DB_WARNING_READ_ONLY, null, + null, null, null, true); + } + $query = 'DELETE FROM ' . $this->_table .' WHERE '. + $this->_makeWhere(); + $res = $this->_dbh->query($query); + if (DB::isError($res)) { + return $res; + } + foreach ($this->_properties as $prop => $foo) { + unset($this->$prop); + } + $this->_properties = array(); + $this->_changes = array(); + return DB_OK; + } + + // }}} +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + */ + +?> diff --git a/thirdparty/pear/DB/sybase.php b/thirdparty/pear/DB/sybase.php new file mode 100644 index 000000000..34451d2ce --- /dev/null +++ b/thirdparty/pear/DB/sybase.php @@ -0,0 +1,835 @@ + | +// | Antnio Carlos Venncio Jnior | +// | Maintainer: Daniel Convissor | +// +----------------------------------------------------------------------+ +// +// $Id: sybase.php 3355 2005-06-11 22:14:40Z nbm $ + + +// TODO +// - This driver may fail with multiple connections under the same +// user/pass/host and different databases + + +require_once 'DB/common.php'; + +/** + * Database independent query interface definition for PHP's Sybase + * extension. + * + * @package DB + * @version $Id: sybase.php 3355 2005-06-11 22:14:40Z nbm $ + * @category Database + * @author Sterling Hughes + * @author Antnio Carlos Venncio Jnior + */ +class DB_sybase extends DB_common +{ + // {{{ properties + + var $connection; + var $phptype, $dbsyntax; + var $prepare_tokens = array(); + var $prepare_types = array(); + var $transaction_opcount = 0; + var $autocommit = true; + + // }}} + // {{{ constructor + + /** + * DB_sybase constructor. + * + * @access public + */ + function DB_sybase() + { + $this->DB_common(); + $this->phptype = 'sybase'; + $this->dbsyntax = 'sybase'; + $this->features = array( + 'prepare' => false, + 'pconnect' => true, + 'transactions' => false, + 'limit' => 'emulate' + ); + $this->errorcode_map = array( + ); + } + + // }}} + // {{{ connect() + + /** + * Connect to a database and log in as the specified user. + * + * @param $dsn the data source name (see DB::parseDSN for syntax) + * @param $persistent (optional) whether the connection should + * be persistent + * @access public + * @return int DB_OK on success, a DB error on failure + */ + function connect($dsninfo, $persistent = false) + { + if (!DB::assertExtension('sybase') && + !DB::assertExtension('sybase_ct')) + { + return $this->raiseError(DB_ERROR_EXTENSION_NOT_FOUND); + } + + $this->dsn = $dsninfo; + + $interface = $dsninfo['hostspec'] ? $dsninfo['hostspec'] : 'localhost'; + $connect_function = $persistent ? 'sybase_pconnect' : 'sybase_connect'; + $dsninfo['password'] = !empty($dsninfo['password']) ? $dsninfo['password'] : false; + $dsninfo['charset'] = isset($dsninfo['charset']) ? $dsninfo['charset'] : false; + $dsninfo['appname'] = isset($dsninfo['appname']) ? $dsninfo['appname'] : false; + + if ($interface && $dsninfo['username']) { + $conn = @$connect_function($interface, $dsninfo['username'], + $dsninfo['password'], + $dsninfo['charset'], + $dsninfo['appname']); + } else { + $conn = false; + } + + if (!$conn) { + return $this->raiseError(DB_ERROR_CONNECT_FAILED); + } + + if ($dsninfo['database']) { + if (!@sybase_select_db($dsninfo['database'], $conn)) { + return $this->raiseError(DB_ERROR_NODBSELECTED, null, + null, null, @sybase_get_last_message()); + } + $this->_db = $dsninfo['database']; + } + + $this->connection = $conn; + return DB_OK; + } + + // }}} + // {{{ disconnect() + + /** + * Log out and disconnect from the database. + * + * @access public + * + * @return bool true on success, false if not connected. + */ + function disconnect() + { + $ret = @sybase_close($this->connection); + $this->connection = null; + return $ret; + } + + // }}} + // {{{ errorNative() + + /** + * Get the last server error messge (if any) + * + * @return string sybase last error message + */ + function errorNative() + { + return @sybase_get_last_message(); + } + + // }}} + // {{{ errorCode() + + /** + * Determine PEAR::DB error code from the database's text error message. + * + * @param string $errormsg error message returned from the database + * @return integer an error number from a DB error constant + */ + function errorCode($errormsg) + { + static $error_regexps; + if (!isset($error_regexps)) { + $error_regexps = array( + '/Incorrect syntax near/' + => DB_ERROR_SYNTAX, + '/^Unclosed quote before the character string [\"\'].*[\"\']\./' + => DB_ERROR_SYNTAX, + '/Implicit conversion from datatype [\"\'].+[\"\'] to [\"\'].+[\"\'] is not allowed\./' + => DB_ERROR_INVALID_NUMBER, + '/Cannot drop the table [\"\'].+[\"\'], because it doesn\'t exist in the system catalogs\./' + => DB_ERROR_NOSUCHTABLE, + '/Only the owner of object [\"\'].+[\"\'] or a user with System Administrator \(SA\) role can run this command\./' + => DB_ERROR_ACCESS_VIOLATION, + '/^.+ permission denied on object .+, database .+, owner .+/' + => DB_ERROR_ACCESS_VIOLATION, + '/^.* permission denied, database .+, owner .+/' + => DB_ERROR_ACCESS_VIOLATION, + '/[^.*] not found\./' + => DB_ERROR_NOSUCHTABLE, + '/There is already an object named/' + => DB_ERROR_ALREADY_EXISTS, + '/Invalid column name/' + => DB_ERROR_NOSUCHFIELD, + '/does not allow null values/' + => DB_ERROR_CONSTRAINT_NOT_NULL, + '/Command has been aborted/' + => DB_ERROR_CONSTRAINT, + ); + } + + foreach ($error_regexps as $regexp => $code) { + if (preg_match($regexp, $errormsg)) { + return $code; + } + } + return DB_ERROR; + } + + // }}} + // {{{ sybaseRaiseError() + + /** + * Gather information about an error, then use that info to create a + * DB error object and finally return that object. + * + * @param integer $errno PEAR error number (usually a DB constant) if + * manually raising an error + * @return object DB error object + * @see errorNative() + * @see errorCode() + * @see DB_common::raiseError() + */ + function sybaseRaiseError($errno = null) + { + $native = $this->errorNative(); + if ($errno === null) { + $errno = $this->errorCode($native); + } + return $this->raiseError($errno, null, null, null, $native); + } + + // }}} + // {{{ simpleQuery() + + /** + * Send a query to Sybase and return the results as a Sybase resource + * identifier. + * + * @param the SQL query + * + * @access public + * + * @return mixed returns a valid Sybase result for successful SELECT + * queries, DB_OK for other successful queries. A DB error is + * returned on failure. + */ + function simpleQuery($query) + { + $ismanip = DB::isManip($query); + $this->last_query = $query; + if (!@sybase_select_db($this->_db, $this->connection)) { + return $this->sybaseRaiseError(DB_ERROR_NODBSELECTED); + } + $query = $this->modifyQuery($query); + if (!$this->autocommit && $ismanip) { + if ($this->transaction_opcount == 0) { + $result = @sybase_query('BEGIN TRANSACTION', $this->connection); + if (!$result) { + return $this->sybaseRaiseError(); + } + } + $this->transaction_opcount++; + } + $result = @sybase_query($query, $this->connection); + if (!$result) { + return $this->sybaseRaiseError(); + } + if (is_resource($result)) { + $numrows = $this->numRows($result); + if (is_object($numrows)) { + return $numrows; + } + $this->num_rows[(int)$result] = $numrows; + return $result; + } + // Determine which queries that should return data, and which + // should return an error code only. + return $ismanip ? DB_OK : $result; + } + + // }}} + // {{{ nextResult() + + /** + * Move the internal sybase result pointer to the next available result + * + * @param a valid sybase result resource + * + * @access public + * + * @return true if a result is available otherwise return false + */ + function nextResult($result) + { + return false; + } + + // }}} + // {{{ fetchInto() + + /** + * Fetch a row and insert the data into an existing array. + * + * Formating of the array and the data therein are configurable. + * See DB_result::fetchInto() for more information. + * + * @param resource $result query result identifier + * @param array $arr (reference) array where data from the row + * should be placed + * @param int $fetchmode how the resulting array should be indexed + * @param int $rownum the row number to fetch + * + * @return mixed DB_OK on success, null when end of result set is + * reached or on failure + * + * @see DB_result::fetchInto() + * @access private + */ + function fetchInto($result, &$arr, $fetchmode, $rownum=null) + { + if ($rownum !== null) { + if (!@sybase_data_seek($result, $rownum)) { + return null; + } + } + if ($fetchmode & DB_FETCHMODE_ASSOC) { + if (function_exists('sybase_fetch_assoc')) { + $arr = @sybase_fetch_assoc($result); + } else { + if ($arr = @sybase_fetch_array($result)) { + foreach ($arr as $key => $value) { + if (is_int($key)) { + unset($arr[$key]); + } + } + } + } + if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE && $arr) { + $arr = array_change_key_case($arr, CASE_LOWER); + } + } else { + $arr = @sybase_fetch_row($result); + } + if (!$arr) { + // reported not work as seems that sybase_get_last_message() + // always return a message here + //if ($errmsg = @sybase_get_last_message()) { + // return $this->sybaseRaiseError($errmsg); + //} else { + return null; + //} + } + if ($this->options['portability'] & DB_PORTABILITY_RTRIM) { + $this->_rtrimArrayValues($arr); + } + if ($this->options['portability'] & DB_PORTABILITY_NULL_TO_EMPTY) { + $this->_convertNullArrayValuesToEmpty($arr); + } + return DB_OK; + } + + // }}} + // {{{ freeResult() + + /** + * Free the internal resources associated with $result. + * + * @param $result Sybase result identifier + * + * @access public + * + * @return bool true on success, false if $result is invalid + */ + function freeResult($result) + { + unset($this->num_rows[(int)$result]); + return @sybase_free_result($result); + } + + // }}} + // {{{ numCols() + + /** + * Get the number of columns in a result set. + * + * @param $result Sybase result identifier + * + * @access public + * + * @return int the number of columns per row in $result + */ + function numCols($result) + { + $cols = @sybase_num_fields($result); + if (!$cols) { + return $this->sybaseRaiseError(); + } + return $cols; + } + + // }}} + // {{{ numRows() + + /** + * Get the number of rows in a result set. + * + * @param $result Sybase result identifier + * + * @access public + * + * @return int the number of rows in $result + */ + function numRows($result) + { + $rows = @sybase_num_rows($result); + if ($rows === false) { + return $this->sybaseRaiseError(); + } + return $rows; + } + + // }}} + // {{{ affectedRows() + + /** + * Gets the number of rows affected by the data manipulation + * query. For other queries, this function returns 0. + * + * @return number of rows affected by the last query + */ + function affectedRows() + { + if (DB::isManip($this->last_query)) { + $result = @sybase_affected_rows($this->connection); + } else { + $result = 0; + } + return $result; + } + + // }}} + // {{{ nextId() + + /** + * Returns the next free id in a sequence + * + * @param string $seq_name name of the sequence + * @param boolean $ondemand when true, the seqence is automatically + * created if it does not exist + * + * @return int the next id number in the sequence. DB_Error if problem. + * + * @internal + * @see DB_common::nextID() + * @access public + */ + function nextId($seq_name, $ondemand = true) + { + $seqname = $this->getSequenceName($seq_name); + if (!@sybase_select_db($this->_db, $this->connection)) { + return $this->sybaseRaiseError(DB_ERROR_NODBSELECTED); + } + $repeat = 0; + do { + $this->pushErrorHandling(PEAR_ERROR_RETURN); + $result = $this->query("INSERT INTO $seqname (vapor) VALUES (0)"); + $this->popErrorHandling(); + if ($ondemand && DB::isError($result) && + ($result->getCode() == DB_ERROR || $result->getCode() == DB_ERROR_NOSUCHTABLE)) + { + $repeat = 1; + $result = $this->createSequence($seq_name); + if (DB::isError($result)) { + return $this->raiseError($result); + } + } elseif (!DB::isError($result)) { + $result =& $this->query("SELECT @@IDENTITY FROM $seqname"); + $repeat = 0; + } else { + $repeat = false; + } + } while ($repeat); + if (DB::isError($result)) { + return $this->raiseError($result); + } + $result = $result->fetchRow(DB_FETCHMODE_ORDERED); + return $result[0]; + } + + /** + * Creates a new sequence + * + * @param string $seq_name name of the new sequence + * + * @return int DB_OK on success. A DB_Error object is returned if + * problems arise. + * + * @internal + * @see DB_common::createSequence() + * @access public + */ + function createSequence($seq_name) + { + $seqname = $this->getSequenceName($seq_name); + return $this->query("CREATE TABLE $seqname ". + '(id numeric(10,0) IDENTITY NOT NULL ,' . + 'vapor int NULL)'); + } + + // }}} + // {{{ dropSequence() + + /** + * Deletes a sequence + * + * @param string $seq_name name of the sequence to be deleted + * + * @return int DB_OK on success. DB_Error if problems. + * + * @internal + * @see DB_common::dropSequence() + * @access public + */ + function dropSequence($seq_name) + { + $seqname = $this->getSequenceName($seq_name); + return $this->query("DROP TABLE $seqname"); + } + + // }}} + // {{{ getSpecialQuery() + + /** + * Returns the query needed to get some backend info + * @param string $type What kind of info you want to retrieve + * @return string The SQL query string + */ + function getSpecialQuery($type) + { + switch ($type) { + case 'tables': + return "select name from sysobjects where type = 'U' order by name"; + case 'views': + return "select name from sysobjects where type = 'V'"; + default: + return null; + } + } + + // }}} + // {{{ autoCommit() + + /** + * Enable/disable automatic commits + */ + function autoCommit($onoff = false) + { + // XXX if $this->transaction_opcount > 0, we should probably + // issue a warning here. + $this->autocommit = $onoff ? true : false; + return DB_OK; + } + + // }}} + // {{{ commit() + + /** + * Commit the current transaction. + */ + function commit() + { + if ($this->transaction_opcount > 0) { + if (!@sybase_select_db($this->_db, $this->connection)) { + return $this->sybaseRaiseError(DB_ERROR_NODBSELECTED); + } + $result = @sybase_query('COMMIT', $this->connection); + $this->transaction_opcount = 0; + if (!$result) { + return $this->sybaseRaiseError(); + } + } + return DB_OK; + } + + // }}} + // {{{ rollback() + + /** + * Roll back (undo) the current transaction. + */ + function rollback() + { + if ($this->transaction_opcount > 0) { + if (!@sybase_select_db($this->_db, $this->connection)) { + return $this->sybaseRaiseError(DB_ERROR_NODBSELECTED); + } + $result = @sybase_query('ROLLBACK', $this->connection); + $this->transaction_opcount = 0; + if (!$result) { + return $this->sybaseRaiseError(); + } + } + return DB_OK; + } + + // }}} + // {{{ tableInfo() + + /** + * Returns information about a table or a result set. + * + * NOTE: only supports 'table' and 'flags' if $result + * is a table name. + * + * @param object|string $result DB_result object from a query or a + * string containing the name of a table + * @param int $mode a valid tableInfo mode + * @return array an associative array with the information requested + * or an error object if something is wrong + * @access public + * @internal + * @since 1.6.0 + * @see DB_common::tableInfo() + */ + function tableInfo($result, $mode = null) + { + if (isset($result->result)) { + /* + * Probably received a result object. + * Extract the result resource identifier. + */ + $id = $result->result; + $got_string = false; + } elseif (is_string($result)) { + /* + * Probably received a table name. + * Create a result resource identifier. + */ + if (!@sybase_select_db($this->_db, $this->connection)) { + return $this->sybaseRaiseError(DB_ERROR_NODBSELECTED); + } + $id = @sybase_query("SELECT * FROM $result WHERE 1=0", + $this->connection); + $got_string = true; + } else { + /* + * Probably received a result resource identifier. + * Copy it. + * Deprecated. Here for compatibility only. + */ + $id = $result; + $got_string = false; + } + + if (!is_resource($id)) { + return $this->sybaseRaiseError(DB_ERROR_NEED_MORE_DATA); + } + + if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE) { + $case_func = 'strtolower'; + } else { + $case_func = 'strval'; + } + + $count = @sybase_num_fields($id); + + // made this IF due to performance (one if is faster than $count if's) + if (!$mode) { + + for ($i=0; $i<$count; $i++) { + $f = @sybase_fetch_field($id, $i); + + // column_source is often blank + if ($got_string) { + $res[$i]['table'] = $case_func($result); + } else { + $res[$i]['table'] = $case_func($f->column_source); + } + $res[$i]['name'] = $case_func($f->name); + $res[$i]['type'] = $f->type; + $res[$i]['len'] = $f->max_length; + if ($res[$i]['table']) { + $res[$i]['flags'] = $this->_sybase_field_flags( + $res[$i]['table'], $res[$i]['name']); + } else { + $res[$i]['flags'] = ''; + } + } + + } else { + // get full info + + $res['num_fields'] = $count; + + for ($i=0; $i<$count; $i++) { + $f = @sybase_fetch_field($id, $i); + + // column_source is often blank + if ($got_string) { + $res[$i]['table'] = $case_func($result); + } else { + $res[$i]['table'] = $case_func($f->column_source); + } + $res[$i]['name'] = $case_func($f->name); + $res[$i]['type'] = $f->type; + $res[$i]['len'] = $f->max_length; + if ($res[$i]['table']) { + $res[$i]['flags'] = $this->_sybase_field_flags( + $res[$i]['table'], $res[$i]['name']); + } else { + $res[$i]['flags'] = ''; + } + + if ($mode & DB_TABLEINFO_ORDER) { + $res['order'][$res[$i]['name']] = $i; + } + if ($mode & DB_TABLEINFO_ORDERTABLE) { + $res['ordertable'][$res[$i]['table']][$res[$i]['name']] = $i; + } + } + } + + // free the result only if we were called on a table + if ($got_string) { + @sybase_free_result($id); + } + return $res; + } + + // }}} + // {{{ _sybase_field_flags() + + /** + * Get the flags for a field. + * + * Currently supports: + * + unique_key (unique index, unique check or primary_key) + * + multiple_key (multi-key index) + * + * @param string $table table name + * @param string $column field name + * @return string space delimited string of flags. Empty string if none. + * @access private + */ + function _sybase_field_flags($table, $column) + { + static $tableName = null; + static $flags = array(); + + if ($table != $tableName) { + $flags = array(); + $tableName = $table; + + // get unique/primary keys + $res = $this->getAll("sp_helpindex $table", DB_FETCHMODE_ASSOC); + + if (!isset($res[0]['index_description'])) { + return ''; + } + + foreach ($res as $val) { + $keys = explode(', ', trim($val['index_keys'])); + + if (sizeof($keys) > 1) { + foreach ($keys as $key) { + $this->_add_flag($flags[$key], 'multiple_key'); + } + } + + if (strpos($val['index_description'], 'unique')) { + foreach ($keys as $key) { + $this->_add_flag($flags[$key], 'unique_key'); + } + } + } + + } + + if (array_key_exists($column, $flags)) { + return(implode(' ', $flags[$column])); + } + + return ''; + } + + // }}} + // {{{ _add_flag() + + /** + * Adds a string to the flags array if the flag is not yet in there + * - if there is no flag present the array is created. + * + * @param array $array reference of flags array to add a value to + * @param mixed $value value to add to the flag array + * @access private + */ + function _add_flag(&$array, $value) + { + if (!is_array($array)) { + $array = array($value); + } elseif (!in_array($value, $array)) { + array_push($array, $value); + } + } + + // }}} + // {{{ quoteIdentifier() + + /** + * Quote a string so it can be safely used as a table / column name + * + * Quoting style depends on which database driver is being used. + * + * @param string $str identifier name to be quoted + * + * @return string quoted identifier string + * + * @since 1.6.0 + * @access public + */ + function quoteIdentifier($str) + { + return '[' . str_replace(']', ']]', $str) . ']'; + } + + // }}} + +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + */ + +?> diff --git a/thirdparty/pear/HTTP/HTTP.php b/thirdparty/pear/HTTP/HTTP.php new file mode 100644 index 000000000..98af71fad --- /dev/null +++ b/thirdparty/pear/HTTP/HTTP.php @@ -0,0 +1,343 @@ + | +// | Sterling Hughes | +// | Tomas V.V.Cox | +// | Richard Heyes | +// | Philippe Jausions | +// | Michael Wallner | +// +----------------------------------------------------------------------+ +// +// $Id: HTTP.php,v 1.35 2004/09/21 15:28:07 mike Exp $ + +/** + * HTTP + * + * HTTP utility functions + * + * @package HTTP + * @category HTTP + * @license PHP License + * @access public + * @version $Revision: 1.35 $ + */ +class HTTP +{ + /** + * Date + * + * Format a RFC compliant GMT date HTTP header. This function honors the + * "y2k_compliance" php.ini directive and formats the GMT date corresponding + * to either RFC850 or RFC822. + * + * @static + * @access public + * @return mixed GMT date string, or false for an invalid $time parameter + * @param mixed $time unix timestamp or date (default = current time) + */ + function Date($time = null) + { + if (!isset($time)) { + $time = time(); + } elseif (!is_numeric($time) && (-1 === $time = strtotime($time))) { + return false; + } + + // RFC822 or RFC850 + $format = ini_get('y2k_compliance') ? 'D, d M Y' : 'l, d-M-y'; + + return gmdate($format .' H:i:s \G\M\T', $time); + } + + /** + * Negotiate Language + * + * Negotiate language with the user's browser through the Accept-Language + * HTTP header or the user's host address. Language codes are generally in + * the form "ll" for a language spoken in only one country, or "ll-CC" for a + * language spoken in a particular country. For example, U.S. English is + * "en-US", while British English is "en-UK". Portugese as spoken in + * Portugal is "pt-PT", while Brazilian Portugese is "pt-BR". + * + * Quality factors in the Accept-Language: header are supported, e.g.: + * Accept-Language: en-UK;q=0.7, en-US;q=0.6, no, dk;q=0.8 + * + * + * require_once 'HTTP.php'; + * $langs = array( + * 'en' => 'locales/en', + * 'en-US'=> 'locales/en', + * 'en-UK'=> 'locales/en', + * 'de' => 'locales/de', + * 'de-DE'=> 'locales/de', + * 'de-AT'=> 'locales/de', + * ); + * $neg = HTTP::negotiateLanguage($langs); + * $dir = $langs[$neg]; + * + * + * @static + * @access public + * @return string The negotiated language result or the supplied default. + * @param array $supported An associative array of supported languages, + * whose values must evaluate to true. + * @param string $default The default language to use if none is found. + */ + function negotiateLanguage($supported, $default = 'en-US') + { + $supp = array(); + foreach ($supported as $lang => $isSupported) { + if ($isSupported) { + $supp[strToLower($lang)] = $lang; + } + } + + if (!count($supp)) { + return $default; + } + + $matches = array(); + if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) { + foreach (explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']) as $lang) { + @list($l, $q) = array_map('strtolower', + array_map('trim', explode(';', $lang))); + if (isset($supp[$l])) { + if (isset($q)) { + $matches[$l] = (float) str_replace('q=', '', $q); + } else { + $matches[$l] = 1000 - count($matches); + } + } + } + } + + if (count($matches)) { + asort($matches, SORT_NUMERIC); + return $supp[array_pop(array_keys($matches))]; + } + + if (isset($_SERVER['REMOTE_HOST'])) { + $lang = strtolower(array_pop(explode('.', $_SERVER['REMOTE_HOST']))); + if (isset($supp[$lang])) { + return $supp[$lang]; + } + } + + return $default; + } + + /** + * Head + * + * Sends a "HEAD" HTTP command to a server and returns the headers + * as an associative array. Example output could be: + * + * Array + * ( + * [response_code] => 200 // The HTTP response code + * [response] => HTTP/1.1 200 OK // The full HTTP response string + * [Date] => Fri, 11 Jan 2002 01:41:44 GMT + * [Server] => Apache/1.3.20 (Unix) PHP/4.1.1 + * [X-Powered-By] => PHP/4.1.1 + * [Connection] => close + * [Content-Type] => text/html + * ) + * + * + * @see HTTP_Client::head() + * @see HTTP_Request + * + * @static + * @access public + * @return mixed Returns associative array of response headers on success + * or PEAR error on failure. + * @param string $url A valid URL, e.g.: http://pear.php.net/credits.php + * @param integer $timeout Timeout in seconds (default = 10) + */ + function head($url, $timeout = 10) + { + $p = parse_url($url); + if (!isset($p['scheme'])) { + $p = parse_url(HTTP::absoluteURI($url)); + } elseif ($p['scheme'] != 'http') { + return HTTP::raiseError('Unsupported protocol: '. $p['scheme']); + } + + $port = isset($p['port']) ? $p['port'] : 80; + + if (!$fp = @fsockopen($p['host'], $port, $eno, $estr, $timeout)) { + return HTTP::raiseError("Connection error: $estr ($eno)"); + } + + $path = !empty($p['path']) ? $p['path'] : '/'; + $path .= !empty($p['query']) ? '?' . $p['query'] : ''; + + fputs($fp, "HEAD $path HTTP/1.0\r\n"); + fputs($fp, 'Host: ' . $p['host'] . ':' . $port . "\r\n"); + fputs($fp, "Connection: close\r\n\r\n"); + + $response = rtrim(fgets($fp, 4096)); + if (preg_match("|^HTTP/[^\s]*\s(.*?)\s|", $response, $status)) { + $headers['response_code'] = $status[1]; + } + $headers['response'] = $response; + + while ($line = fgets($fp, 4096)) { + if (!trim($line)) { + break; + } + if (($pos = strpos($line, ':')) !== false) { + $header = substr($line, 0, $pos); + $value = trim(substr($line, $pos + 1)); + $headers[$header] = $value; + } + } + fclose($fp); + return $headers; + } + + /** + * Redirect + * + * This function redirects the client. This is done by issuing + * a "Location" header and exiting if wanted. If you set $rfc2616 to true + * HTTP will output a hypertext note with the location of the redirect. + * + * @static + * @access public + * @return mixed Returns true on succes (or exits) or false if headers + * have already been sent. + * @param string $url URL where the redirect should go to. + * @param bool $exit Whether to exit immediately after redirection. + * @param bool $rfc2616 Wheter to output a hypertext note where we're + * redirecting to (Redirecting to ....) + */ + function redirect($url, $exit = true, $rfc2616 = false) + { + if (headers_sent()) { + return false; + } + + $url = HTTP::absoluteURI($url); + header('Location: '. $url); + + if ($rfc2616 && @$_SERVER['REQUEST_METHOD'] != 'HEAD') { + printf('Redirecting to: %s.', $url, $url); + } + if ($exit) { + exit; + } + return true; + } + + /** + * Absolute URI + * + * This function returns the absolute URI for the partial URL passed. + * The current scheme (HTTP/HTTPS), host server, port, current script + * location are used if necessary to resolve any relative URLs. + * + * Offsets potentially created by PATH_INFO are taken care of to resolve + * relative URLs to the current script. + * + * You can choose a new protocol while resolving the URI. This is + * particularly useful when redirecting a web browser using relative URIs + * and to switch from HTTP to HTTPS, or vice-versa, at the same time. + * + * @author Philippe Jausions + * @static + * @access public + * @return string The absolute URI. + * @param string $url Absolute or relative URI the redirect should go to. + * @param string $protocol Protocol to use when redirecting URIs. + * @param integer $port A new port number. + */ + function absoluteURI($url = null, $protocol = null, $port = null) + { + // Mess around with already absolute URIs + if (preg_match('!^([a-z0-9]+)://!i', $url)) { + if (empty($protocol) && empty($port)) { + return $url; + } + if (!empty($protocol)) { + $url = $protocol .':'. array_pop(explode(':', $url, 2)); + } + if (!empty($port)) { + $url = preg_replace('!^(([a-z0-9]+)://[^/:]+)(:[\d]+)?!i', + '\1:'. $port, $url); + } + return $url; + } + + $host = 'localhost'; + if (!empty($_SERVER['HTTP_HOST'])) { + list($host) = explode(':', $_SERVER['HTTP_HOST']); + } elseif (!empty($_SERVER['SERVER_NAME'])) { + list($host) = explode(':', $_SERVER['SERVER_NAME']); + } + + if (empty($protocol)) { + $protocol = isset($_SERVER['HTTPS']) ? 'https' : 'http'; + if (!isset($port) || $port != intval($port)) { + $port = isset($_SERVER['SERVER_PORT']) ? $_SERVER['SERVER_PORT'] : 80; + } + } + + if ($protocol == 'http' && $port == 80) { + unset($port); + } + if ($protocol == 'https' && $port == 443) { + unset($port); + } + + $server = $protocol .'://'. $host . (isset($port) ? ':'. $port : ''); + + if (!strlen($url)) { + $url = isset($_SERVER['REQUEST_URI']) ? + $_SERVER['REQUEST_URI'] : $_SERVER['PHP_SELF']; + } + + if ($url{0} == '/') { + return $server . $url; + } + + // Check for PATH_INFO + if (isset($_SERVER['PATH_INFO'])) { + $path = dirname(substr($_SERVER['PHP_SELF'], 0, -strlen($_SERVER['PATH_INFO']))); + } else { + $path = dirname($_SERVER['PHP_SELF']); + } + + if (substr($path, -1) != '/') { + $path .= '/'; + } + + return $server . strtr($path, '\\', '/') . $url; + } + + /** + * Raise Error + * + * Lazy raising of PEAR_Errors. + * + * @static + * @access protected + * @return object PEAR_Error + * @param mixed $error + * @param int $code + */ + function raiseError($error = null, $code = null) + { + require_once 'PEAR.php'; + return PEAR::raiseError($error, $code); + } +} +?> diff --git a/thirdparty/pear/HTTP/Request.php b/thirdparty/pear/HTTP/Request.php new file mode 100644 index 000000000..6a4cd8688 --- /dev/null +++ b/thirdparty/pear/HTTP/Request.php @@ -0,0 +1,1205 @@ + | +// +-----------------------------------------------------------------------+ +// +// $Id: Request.php 6820 2007-06-20 13:35:30Z kevin_fourie $ +// +// HTTP_Request Class +// +// Simple example, (Fetches yahoo.com and displays it): +// +// $a = &new HTTP_Request('http://www.yahoo.com/'); +// $a->sendRequest(); +// echo $a->getResponseBody(); +// + +require_once 'PEAR.php'; +require_once 'Net/Socket.php'; +require_once 'Net/URL.php'; + +define('HTTP_REQUEST_METHOD_GET', 'GET', true); +define('HTTP_REQUEST_METHOD_HEAD', 'HEAD', true); +define('HTTP_REQUEST_METHOD_POST', 'POST', true); +define('HTTP_REQUEST_METHOD_PUT', 'PUT', true); +define('HTTP_REQUEST_METHOD_DELETE', 'DELETE', true); +define('HTTP_REQUEST_METHOD_OPTIONS', 'OPTIONS', true); +define('HTTP_REQUEST_METHOD_TRACE', 'TRACE', true); + +define('HTTP_REQUEST_HTTP_VER_1_0', '1.0', true); +define('HTTP_REQUEST_HTTP_VER_1_1', '1.1', true); + +class HTTP_Request { + + /** + * Instance of Net_URL + * @var object Net_URL + */ + var $_url; + + /** + * Type of request + * @var string + */ + var $_method; + + /** + * HTTP Version + * @var string + */ + var $_http; + + /** + * Request headers + * @var array + */ + var $_requestHeaders; + + /** + * Basic Auth Username + * @var string + */ + var $_user; + + /** + * Basic Auth Password + * @var string + */ + var $_pass; + + /** + * Socket object + * @var object Net_Socket + */ + var $_sock; + + /** + * Proxy server + * @var string + */ + var $_proxy_host; + + /** + * Proxy port + * @var integer + */ + var $_proxy_port; + + /** + * Proxy username + * @var string + */ + var $_proxy_user; + + /** + * Proxy password + * @var string + */ + var $_proxy_pass; + + /** + * Post data + * @var array + */ + var $_postData; + + /** + * Request body + * @var string + */ + var $_body; + + /** + * A list of methods that MUST NOT have a request body, per RFC 2616 + * @var array + */ + var $_bodyDisallowed = array('TRACE'); + + /** + * Files to post + * @var array + */ + var $_postFiles = array(); + + /** + * Connection timeout. + * @var float + */ + var $_timeout; + + /** + * HTTP_Response object + * @var object HTTP_Response + */ + var $_response; + + /** + * Whether to allow redirects + * @var boolean + */ + var $_allowRedirects; + + /** + * Maximum redirects allowed + * @var integer + */ + var $_maxRedirects; + + /** + * Current number of redirects + * @var integer + */ + var $_redirects; + + /** + * Whether to append brackets [] to array variables + * @var bool + */ + var $_useBrackets = true; + + /** + * Attached listeners + * @var array + */ + var $_listeners = array(); + + /** + * Whether to save response body in response object property + * @var bool + */ + var $_saveBody = true; + + /** + * Timeout for reading from socket (array(seconds, microseconds)) + * @var array + */ + var $_readTimeout = null; + + /** + * Options to pass to Net_Socket::connect. See stream_context_create + * @var array + */ + var $_socketOptions = null; + + /** + * Constructor + * + * Sets up the object + * @param string The url to fetch/access + * @param array Associative array of parameters which can have the following keys: + *
      + *
    • method - Method to use, GET, POST etc (string)
    • + *
    • http - HTTP Version to use, 1.0 or 1.1 (string)
    • + *
    • user - Basic Auth username (string)
    • + *
    • pass - Basic Auth password (string)
    • + *
    • proxy_host - Proxy server host (string)
    • + *
    • proxy_port - Proxy server port (integer)
    • + *
    • proxy_user - Proxy auth username (string)
    • + *
    • proxy_pass - Proxy auth password (string)
    • + *
    • timeout - Connection timeout in seconds (float)
    • + *
    • allowRedirects - Whether to follow redirects or not (bool)
    • + *
    • maxRedirects - Max number of redirects to follow (integer)
    • + *
    • useBrackets - Whether to append [] to array variable names (bool)
    • + *
    • saveBody - Whether to save response body in response object property (bool)
    • + *
    • readTimeout - Timeout for reading / writing data over the socket (array (seconds, microseconds))
    • + *
    • socketOptions - Options to pass to Net_Socket object (array)
    • + *
    + * @access public + */ + function HTTP_Request($url = '', $params = array()) + { + $this->_sock = new Net_Socket(); + $this->_method = HTTP_REQUEST_METHOD_GET; + $this->_http = HTTP_REQUEST_HTTP_VER_1_1; + $this->_requestHeaders = array(); + $this->_postData = array(); + $this->_body = null; + + $this->_user = null; + $this->_pass = null; + + $this->_proxy_host = null; + $this->_proxy_port = null; + $this->_proxy_user = null; + $this->_proxy_pass = null; + + $this->_allowRedirects = false; + $this->_maxRedirects = 3; + $this->_redirects = 0; + + $this->_timeout = null; + $this->_response = null; + + foreach ($params as $key => $value) { + $this->{'_' . $key} = $value; + } + + if (!empty($url)) { + $this->setURL($url); + } + + // Default useragent + $this->addHeader('User-Agent', 'PEAR HTTP_Request class ( http://pear.php.net/ )'); + + // Make sure keepalives dont knobble us + $this->addHeader('Connection', 'close'); + + // Basic authentication + if (!empty($this->_user)) { + $this->addHeader('Authorization', 'Basic ' . base64_encode($this->_user . ':' . $this->_pass)); + } + + // Use gzip encoding if possible + // Avoid gzip encoding if using multibyte functions (see #1781) + if (HTTP_REQUEST_HTTP_VER_1_1 == $this->_http && extension_loaded('zlib') && + 0 == (2 & ini_get('mbstring.func_overload'))) { + + $this->addHeader('Accept-Encoding', 'gzip'); + } + } + + /** + * Generates a Host header for HTTP/1.1 requests + * + * @access private + * @return string + */ + function _generateHostHeader() + { + if ($this->_url->port != 80 AND strcasecmp($this->_url->protocol, 'http') == 0) { + $host = $this->_url->host . ':' . $this->_url->port; + + } elseif ($this->_url->port != 443 AND strcasecmp($this->_url->protocol, 'https') == 0) { + $host = $this->_url->host . ':' . $this->_url->port; + + } elseif ($this->_url->port == 443 AND strcasecmp($this->_url->protocol, 'https') == 0 AND strpos($this->_url->url, ':443') !== false) { + $host = $this->_url->host . ':' . $this->_url->port; + + } else { + $host = $this->_url->host; + } + + return $host; + } + + /** + * Resets the object to its initial state (DEPRECATED). + * Takes the same parameters as the constructor. + * + * @param string $url The url to be requested + * @param array $params Associative array of parameters + * (see constructor for details) + * @access public + * @deprecated deprecated since 1.2, call the constructor if this is necessary + */ + function reset($url, $params = array()) + { + $this->HTTP_Request($url, $params); + } + + /** + * Sets the URL to be requested + * + * @param string The url to be requested + * @access public + */ + function setURL($url) + { + $this->_url = new Net_URL($url, $this->_useBrackets); + + if (!empty($this->_url->user) || !empty($this->_url->pass)) { + $this->setBasicAuth($this->_url->user, $this->_url->pass); + } + + if (HTTP_REQUEST_HTTP_VER_1_1 == $this->_http) { + $this->addHeader('Host', $this->_generateHostHeader()); + } + } + + /** + * Sets a proxy to be used + * + * @param string Proxy host + * @param int Proxy port + * @param string Proxy username + * @param string Proxy password + * @access public + */ + function setProxy($host, $port = 8080, $user = null, $pass = null) + { + $this->_proxy_host = $host; + $this->_proxy_port = $port; + $this->_proxy_user = $user; + $this->_proxy_pass = $pass; + + if (!empty($user)) { + $this->addHeader('Proxy-Authorization', 'Basic ' . base64_encode($user . ':' . $pass)); + } + } + + /** + * Sets basic authentication parameters + * + * @param string Username + * @param string Password + */ + function setBasicAuth($user, $pass) + { + $this->_user = $user; + $this->_pass = $pass; + + $this->addHeader('Authorization', 'Basic ' . base64_encode($user . ':' . $pass)); + } + + /** + * Sets the method to be used, GET, POST etc. + * + * @param string Method to use. Use the defined constants for this + * @access public + */ + function setMethod($method) + { + $this->_method = $method; + } + + /** + * Sets the HTTP version to use, 1.0 or 1.1 + * + * @param string Version to use. Use the defined constants for this + * @access public + */ + function setHttpVer($http) + { + $this->_http = $http; + } + + /** + * Adds a request header + * + * @param string Header name + * @param string Header value + * @access public + */ + function addHeader($name, $value) + { + $this->_requestHeaders[strtolower($name)] = $value; + } + + /** + * Removes a request header + * + * @param string Header name to remove + * @access public + */ + function removeHeader($name) + { + if (isset($this->_requestHeaders[strtolower($name)])) { + unset($this->_requestHeaders[strtolower($name)]); + } + } + + /** + * Adds a querystring parameter + * + * @param string Querystring parameter name + * @param string Querystring parameter value + * @param bool Whether the value is already urlencoded or not, default = not + * @access public + */ + function addQueryString($name, $value, $preencoded = false) + { + $this->_url->addQueryString($name, $value, $preencoded); + } + + /** + * Sets the querystring to literally what you supply + * + * @param string The querystring data. Should be of the format foo=bar&x=y etc + * @param bool Whether data is already urlencoded or not, default = already encoded + * @access public + */ + function addRawQueryString($querystring, $preencoded = true) + { + $this->_url->addRawQueryString($querystring, $preencoded); + } + + /** + * Adds postdata items + * + * @param string Post data name + * @param string Post data value + * @param bool Whether data is already urlencoded or not, default = not + * @access public + */ + function addPostData($name, $value, $preencoded = false) + { + if ($preencoded) { + $this->_postData[$name] = $value; + } else { + $this->_postData[$name] = $this->_arrayMapRecursive('urlencode', $value); + } + } + + /** + * Recursively applies the callback function to the value + * + * @param mixed Callback function + * @param mixed Value to process + * @access private + * @return mixed Processed value + */ + function _arrayMapRecursive($callback, $value) + { + if (!is_array($value)) { + return call_user_func($callback, $value); + } else { + $map = array(); + foreach ($value as $k => $v) { + $map[$k] = $this->_arrayMapRecursive($callback, $v); + } + return $map; + } + } + + /** + * Adds a file to upload + * + * This also changes content-type to 'multipart/form-data' for proper upload + * + * @access public + * @param string name of file-upload field + * @param mixed file name(s) + * @param mixed content-type(s) of file(s) being uploaded + * @return bool true on success + * @throws PEAR_Error + */ + function addFile($inputName, $fileName, $contentType = 'application/octet-stream') + { + if (!is_array($fileName) && !is_readable($fileName)) { + return PEAR::raiseError("File '{$fileName}' is not readable"); + } elseif (is_array($fileName)) { + foreach ($fileName as $name) { + if (!is_readable($name)) { + return PEAR::raiseError("File '{$name}' is not readable"); + } + } + } + $this->addHeader('Content-Type', 'multipart/form-data'); + $this->_postFiles[$inputName] = array( + 'name' => $fileName, + 'type' => $contentType + ); + return true; + } + + /** + * Adds raw postdata (DEPRECATED) + * + * @param string The data + * @param bool Whether data is preencoded or not, default = already encoded + * @access public + * @deprecated deprecated since 1.3.0, method addBody() should be used instead + */ + function addRawPostData($postdata, $preencoded = true) + { + $this->_body = $preencoded ? $postdata : urlencode($postdata); + } + + /** + * Sets the request body (for POST, PUT and similar requests) + * + * @param string Request body + * @access public + */ + function setBody($body) + { + $this->_body = $body; + } + + /** + * Clears any postdata that has been added (DEPRECATED). + * + * Useful for multiple request scenarios. + * + * @access public + * @deprecated deprecated since 1.2 + */ + function clearPostData() + { + $this->_postData = null; + } + + /** + * Appends a cookie to "Cookie:" header + * + * @param string $name cookie name + * @param string $value cookie value + * @access public + */ + function addCookie($name, $value) + { + $cookies = isset($this->_requestHeaders['cookie']) ? $this->_requestHeaders['cookie']. '; ' : ''; + $this->addHeader('Cookie', $cookies . $name . '=' . $value); + } + + /** + * Clears any cookies that have been added (DEPRECATED). + * + * Useful for multiple request scenarios + * + * @access public + * @deprecated deprecated since 1.2 + */ + function clearCookies() + { + $this->removeHeader('Cookie'); + } + + /** + * Sends the request + * + * @access public + * @param bool Whether to store response body in Response object property, + * set this to false if downloading a LARGE file and using a Listener + * @return mixed PEAR error on error, true otherwise + */ + function sendRequest($saveBody = true) + { + if (!is_a($this->_url, 'Net_URL')) { + return PEAR::raiseError('No URL given.'); + } + + $host = isset($this->_proxy_host) ? $this->_proxy_host : $this->_url->host; + $port = isset($this->_proxy_port) ? $this->_proxy_port : $this->_url->port; + + // 4.3.0 supports SSL connections using OpenSSL. The function test determines + // we running on at least 4.3.0 + if (strcasecmp($this->_url->protocol, 'https') == 0 AND function_exists('file_get_contents') AND extension_loaded('openssl')) { + if (isset($this->_proxy_host)) { + return PEAR::raiseError('HTTPS proxies are not supported.'); + } + $host = 'ssl://' . $host; + } + + // magic quotes may fuck up file uploads and chunked response processing + $magicQuotes = ini_get('magic_quotes_runtime'); + ini_set('magic_quotes_runtime', false); + + // If this is a second request, we may get away without + // re-connecting if they're on the same server + $err = $this->_sock->connect($host, $port, null, $this->_timeout, $this->_socketOptions); + PEAR::isError($err) or $err = $this->_sock->write($this->_buildRequest()); + + if (!PEAR::isError($err)) { + if (!empty($this->_readTimeout)) { + $this->_sock->setTimeout($this->_readTimeout[0], $this->_readTimeout[1]); + } + + $this->_notify('sentRequest'); + + // Read the response + $this->_response = new HTTP_Response($this->_sock, $this->_listeners); + $err = $this->_response->process($this->_saveBody && $saveBody); + } + + ini_set('magic_quotes_runtime', $magicQuotes); + + if (PEAR::isError($err)) { + return $err; + } + + + // Check for redirection + if ( $this->_allowRedirects + AND $this->_redirects <= $this->_maxRedirects + AND $this->getResponseCode() > 300 + AND $this->getResponseCode() < 399 + AND !empty($this->_response->_headers['location'])) { + + + $redirect = $this->_response->_headers['location']; + + // Absolute URL + if (preg_match('/^https?:\/\//i', $redirect)) { + $this->_url = new Net_URL($redirect); + $this->addHeader('Host', $this->_generateHostHeader()); + // Absolute path + } elseif ($redirect{0} == '/') { + $this->_url->path = $redirect; + + // Relative path + } elseif (substr($redirect, 0, 3) == '../' OR substr($redirect, 0, 2) == './') { + if (substr($this->_url->path, -1) == '/') { + $redirect = $this->_url->path . $redirect; + } else { + $redirect = dirname($this->_url->path) . '/' . $redirect; + } + $redirect = Net_URL::resolvePath($redirect); + $this->_url->path = $redirect; + + // Filename, no path + } else { + if (substr($this->_url->path, -1) == '/') { + $redirect = $this->_url->path . $redirect; + } else { + $redirect = dirname($this->_url->path) . '/' . $redirect; + } + $this->_url->path = $redirect; + } + + $this->_redirects++; + return $this->sendRequest($saveBody); + + // Too many redirects + } elseif ($this->_allowRedirects AND $this->_redirects > $this->_maxRedirects) { + return PEAR::raiseError('Too many redirects'); + } + + $this->_sock->disconnect(); + + return true; + } + + /** + * Returns the response code + * + * @access public + * @return mixed Response code, false if not set + */ + function getResponseCode() + { + return isset($this->_response->_code) ? $this->_response->_code : false; + } + + /** + * Returns either the named header or all if no name given + * + * @access public + * @param string The header name to return, do not set to get all headers + * @return mixed either the value of $headername (false if header is not present) + * or an array of all headers + */ + function getResponseHeader($headername = null) + { + if (!isset($headername)) { + return isset($this->_response->_headers)? $this->_response->_headers: array(); + } else { + $headername = strtolower($headername); + return isset($this->_response->_headers[$headername]) ? $this->_response->_headers[$headername] : false; + } + } + + /** + * Returns the body of the response + * + * @access public + * @return mixed response body, false if not set + */ + function getResponseBody() + { + return isset($this->_response->_body) ? $this->_response->_body : false; + } + + /** + * Returns cookies set in response + * + * @access public + * @return mixed array of response cookies, false if none are present + */ + function getResponseCookies() + { + return isset($this->_response->_cookies) ? $this->_response->_cookies : false; + } + + /** + * Builds the request string + * + * @access private + * @return string The request string + */ + function _buildRequest() + { + $separator = ini_get('arg_separator.output'); + ini_set('arg_separator.output', '&'); + $querystring = ($querystring = $this->_url->getQueryString()) ? '?' . $querystring : ''; + ini_set('arg_separator.output', $separator); + + $host = isset($this->_proxy_host) ? $this->_url->protocol . '://' . $this->_url->host : ''; + $port = (isset($this->_proxy_host) AND $this->_url->port != 80) ? ':' . $this->_url->port : ''; + $path = (empty($this->_url->path)? '/': $this->_url->path) . $querystring; + $url = $host . $port . $path; + + $request = $this->_method . ' ' . $url . ' HTTP/' . $this->_http . "\r\n"; + + if (in_array($this->_method, $this->_bodyDisallowed) || + (HTTP_REQUEST_METHOD_POST != $this->_method && empty($this->_body)) || + (HTTP_REQUEST_METHOD_POST != $this->_method && empty($this->_postData) && empty($this->_postFiles))) { + + $this->removeHeader('Content-Type'); + } else { + if (empty($this->_requestHeaders['content-type'])) { + // Add default content-type + $this->addHeader('Content-Type', 'application/x-www-form-urlencoded'); + } elseif ('multipart/form-data' == $this->_requestHeaders['content-type']) { + $boundary = 'HTTP_Request_' . $this->encryptOld(uniqid('request') . microtime()); + $this->addHeader('Content-Type', 'multipart/form-data; boundary=' . $boundary); + } + } + + // Request Headers + if (!empty($this->_requestHeaders)) { + foreach ($this->_requestHeaders as $name => $value) { + $canonicalName = implode('-', array_map('ucfirst', explode('-', $name))); + $request .= $canonicalName . ': ' . $value . "\r\n"; + } + } + + // No post data or wrong method, so simply add a final CRLF + if (in_array($this->_method, $this->_bodyDisallowed) || + (HTTP_REQUEST_METHOD_POST != $this->_method && empty($this->_body))) { + + $request .= "\r\n"; + + // Post data if it's an array + } elseif (HTTP_REQUEST_METHOD_POST == $this->_method && + (!empty($this->_postData) || !empty($this->_postFiles))) { + + // "normal" POST request + if (!isset($boundary)) { + $postdata = implode('&', array_map( + create_function('$a', 'return $a[0] . \'=\' . $a[1];'), + $this->_flattenArray('', $this->_postData) + )); + + // multipart request, probably with file uploads + } else { + $postdata = ''; + if (!empty($this->_postData)) { + $flatData = $this->_flattenArray('', $this->_postData); + foreach ($flatData as $item) { + $postdata .= '--' . $boundary . "\r\n"; + $postdata .= 'Content-Disposition: form-data; name="' . $item[0] . '"'; + $postdata .= "\r\n\r\n" . urldecode($item[1]) . "\r\n"; + } + } + foreach ($this->_postFiles as $name => $value) { + if (is_array($value['name'])) { + $varname = $name . ($this->_useBrackets? '[]': ''); + } else { + $varname = $name; + $value['name'] = array($value['name']); + } + foreach ($value['name'] as $key => $filename) { + $fp = fopen($filename, 'r'); + $data = fread($fp, filesize($filename)); + fclose($fp); + $basename = basename($filename); + $type = is_array($value['type'])? @$value['type'][$key]: $value['type']; + + $postdata .= '--' . $boundary . "\r\n"; + $postdata .= 'Content-Disposition: form-data; name="' . $varname . '"; filename="' . $basename . '"'; + $postdata .= "\r\nContent-Type: " . $type; + $postdata .= "\r\n\r\n" . $data . "\r\n"; + } + } + $postdata .= '--' . $boundary . "--\r\n"; + } + $request .= 'Content-Length: ' . strlen($postdata) . "\r\n\r\n"; + $request .= $postdata; + + // Explicitly set request body + } elseif (!empty($this->_body)) { + + $request .= 'Content-Length: ' . strlen($this->_body) . "\r\n\r\n"; + $request .= $this->_body; + } + + return $request; + } + + /** + * Helper function to change the (probably multidimensional) associative array + * into the simple one. + * + * @param string name for item + * @param mixed item's values + * @return array array with the following items: array('item name', 'item value'); + */ + function _flattenArray($name, $values) + { + if (!is_array($values)) { + return array(array($name, $values)); + } else { + $ret = array(); + foreach ($values as $k => $v) { + if (empty($name)) { + $newName = $k; + } elseif ($this->_useBrackets) { + $newName = $name . '[' . $k . ']'; + } else { + $newName = $name; + } + $ret = array_merge($ret, $this->_flattenArray($newName, $v)); + } + return $ret; + } + } + + + /** + * Adds a Listener to the list of listeners that are notified of + * the object's events + * + * @param object HTTP_Request_Listener instance to attach + * @return boolean whether the listener was successfully attached + * @access public + */ + function attach(&$listener) + { + if (!is_a($listener, 'HTTP_Request_Listener')) { + return false; + } + $this->_listeners[$listener->getId()] =& $listener; + return true; + } + + + /** + * Removes a Listener from the list of listeners + * + * @param object HTTP_Request_Listener instance to detach + * @return boolean whether the listener was successfully detached + * @access public + */ + function detach(&$listener) + { + if (!is_a($listener, 'HTTP_Request_Listener') || + !isset($this->_listeners[$listener->getId()])) { + return false; + } + unset($this->_listeners[$listener->getId()]); + return true; + } + + + /** + * Notifies all registered listeners of an event. + * + * Events sent by HTTP_Request object + * 'sentRequest': after the request was sent + * Events sent by HTTP_Response object + * 'gotHeaders': after receiving response headers (headers are passed in $data) + * 'tick': on receiving a part of response body (the part is passed in $data) + * 'gzTick': on receiving a gzip-encoded part of response body (ditto) + * 'gotBody': after receiving the response body (passes the decoded body in $data if it was gzipped) + * + * @param string Event name + * @param mixed Additional data + * @access private + */ + function _notify($event, $data = null) + { + foreach (array_keys($this->_listeners) as $id) { + $this->_listeners[$id]->update($this, $event, $data); + } + } + + public function encryptOld($string) + { + if (!class_exists('G')) { + $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); + $docuroot = explode( '/', $realdocuroot ); + array_pop( $docuroot ); + $pathhome = implode( '/', $docuroot ) . '/'; + array_pop( $docuroot ); + $pathTrunk = implode( '/', $docuroot ) . '/'; + require_once($pathTrunk.'gulliver/system/class.g.php'); + } + return G::encryptOld($string); + } +} + + +/** +* Response class to complement the Request class +*/ +class HTTP_Response +{ + /** + * Socket object + * @var object + */ + var $_sock; + + /** + * Protocol + * @var string + */ + var $_protocol; + + /** + * Return code + * @var string + */ + var $_code; + + /** + * Response headers + * @var array + */ + var $_headers; + + /** + * Cookies set in response + * @var array + */ + var $_cookies; + + /** + * Response body + * @var string + */ + var $_body = ''; + + /** + * Used by _readChunked(): remaining length of the current chunk + * @var string + */ + var $_chunkLength = 0; + + /** + * Attached listeners + * @var array + */ + var $_listeners = array(); + + /** + * Constructor + * + * @param object Net_Socket socket to read the response from + * @param array listeners attached to request + * @return mixed PEAR Error on error, true otherwise + */ + function HTTP_Response(&$sock, &$listeners) + { + $this->_sock =& $sock; + $this->_listeners =& $listeners; + } + + + /** + * Processes a HTTP response + * + * This extracts response code, headers, cookies and decodes body if it + * was encoded in some way + * + * @access public + * @param bool Whether to store response body in object property, set + * this to false if downloading a LARGE file and using a Listener. + * This is assumed to be true if body is gzip-encoded. + * @throws PEAR_Error + * @return mixed true on success, PEAR_Error in case of malformed response + */ + function process($saveBody = true) + { + do { + $line = $this->_sock->readLine(); + if (sscanf($line, 'HTTP/%s %s', $http_version, $returncode) != 2) { + return PEAR::raiseError('Malformed response.'); + } else { + $this->_protocol = 'HTTP/' . $http_version; + $this->_code = intval($returncode); + } + while ('' !== ($header = $this->_sock->readLine())) { + $this->_processHeader($header); + } + } while (100 == $this->_code); + + $this->_notify('gotHeaders', $this->_headers); + + // If response body is present, read it and decode + $chunked = isset($this->_headers['transfer-encoding']) && ('chunked' == $this->_headers['transfer-encoding']); + $gzipped = isset($this->_headers['content-encoding']) && ('gzip' == $this->_headers['content-encoding']); + $hasBody = false; + if (!isset($this->_headers['content-length']) || 0 != $this->_headers['content-length']) { + while (!$this->_sock->eof()) { + if ($chunked) { + $data = $this->_readChunked(); + } else { + $data = $this->_sock->read(4096); + } + if ('' == $data) { + break; + } else { + $hasBody = true; + if ($saveBody || $gzipped) { + $this->_body .= $data; + } + $this->_notify($gzipped? 'gzTick': 'tick', $data); + } + } + } + if ($hasBody) { + // Uncompress the body if needed + if ($gzipped) { + $this->_body = gzinflate(substr($this->_body, 10)); + $this->_notify('gotBody', $this->_body); + } else { + $this->_notify('gotBody'); + } + } + return true; + } + + + /** + * Processes the response header + * + * @access private + * @param string HTTP header + */ + function _processHeader($header) + { + list($headername, $headervalue) = explode(':', $header, 2); + $headername = strtolower($headername); + $headervalue = ltrim($headervalue); + + if ('set-cookie' != $headername) { + if (isset($this->_headers[$headername])) { + $this->_headers[$headername] .= ',' . $headervalue; + } else { + $this->_headers[$headername] = $headervalue; + } + } else { + $this->_parseCookie($headervalue); + } + } + + + /** + * Parse a Set-Cookie header to fill $_cookies array + * + * @access private + * @param string value of Set-Cookie header + */ + function _parseCookie($headervalue) + { + $cookie = array( + 'expires' => null, + 'domain' => null, + 'path' => null, + 'secure' => false + ); + + // Only a name=value pair + if (!strpos($headervalue, ';')) { + $pos = strpos($headervalue, '='); + $cookie['name'] = trim(substr($headervalue, 0, $pos)); + $cookie['value'] = trim(substr($headervalue, $pos + 1)); + + // Some optional parameters are supplied + } else { + $elements = explode(';', $headervalue); + $pos = strpos($elements[0], '='); + $cookie['name'] = trim(substr($elements[0], 0, $pos)); + $cookie['value'] = trim(substr($elements[0], $pos + 1)); + + for ($i = 1; $i < count($elements); $i++) { + if (false === strpos($elements[$i], '=')) { + $elName = trim($elements[$i]); + $elValue = null; + } else { + list ($elName, $elValue) = array_map('trim', explode('=', $elements[$i])); + } + $elName = strtolower($elName); + if ('secure' == $elName) { + $cookie['secure'] = true; + } elseif ('expires' == $elName) { + $cookie['expires'] = str_replace('"', '', $elValue); + } elseif ('path' == $elName || 'domain' == $elName) { + $cookie[$elName] = urldecode($elValue); + } else { + $cookie[$elName] = $elValue; + } + } + } + $this->_cookies[] = $cookie; + } + + + /** + * Read a part of response body encoded with chunked Transfer-Encoding + * + * @access private + * @return string + */ + function _readChunked() + { + // at start of the next chunk? + if (0 == $this->_chunkLength) { + $line = $this->_sock->readLine(); + if (preg_match('/^([0-9a-f]+)/i', $line, $matches)) { + $this->_chunkLength = hexdec($matches[1]); + // Chunk with zero length indicates the end + if (0 == $this->_chunkLength) { + $this->_sock->readLine(); // make this an eof() + return ''; + } + } else { + return ''; + } + } + $data = $this->_sock->read($this->_chunkLength); + $this->_chunkLength -= strlen($data); + if (0 == $this->_chunkLength) { + $this->_sock->readLine(); // Trailing CRLF + } + return $data; + } + + + /** + * Notifies all registered listeners of an event. + * + * @param string Event name + * @param mixed Additional data + * @access private + * @see HTTP_Request::_notify() + */ + function _notify($event, $data = null) + { + foreach (array_keys($this->_listeners) as $id) { + $this->_listeners[$id]->update($this, $event, $data); + } + } +} // End class HTTP_Response +?> diff --git a/thirdparty/pear/HTTP/WebDAV/Server.php b/thirdparty/pear/HTTP/WebDAV/Server.php new file mode 100644 index 000000000..15188f91f --- /dev/null +++ b/thirdparty/pear/HTTP/WebDAV/Server.php @@ -0,0 +1,2089 @@ + | +// | Christian Stocker | +// +----------------------------------------------------------------------+ +// +// $Id: Server.php,v 1.46 2006/03/03 21:43:09 hholzgra Exp $ +// +require_once "HTTP/WebDAV/Tools/_parse_propfind.php"; +require_once "HTTP/WebDAV/Tools/_parse_proppatch.php"; +require_once "HTTP/WebDAV/Tools/_parse_lockinfo.php"; + + + +/** + * Virtual base class for implementing WebDAV servers + * + * WebDAV server base class, needs to be extended to do useful work + * + * @package HTTP_WebDAV_Server + * @author Hartmut Holzgraefe + * @version 0.99.1dev + */ +class HTTP_WebDAV_Server +{ + // {{{ Member Variables + + /** + * complete URI for this request + * + * @var string + */ + var $uri; + + + /** + * base URI for this request + * + * @var string + */ + var $base_uri; + + + /** + * URI path for this request + * + * @var string + */ + var $path; + + /** + * Realm string to be used in authentification popups + * + * @var string + */ + var $http_auth_realm = "PHP WebDAV"; + + /** + * String to be used in "X-Dav-Powered-By" header + * + * @var string + */ + var $dav_powered_by = ""; + + /** + * Remember parsed If: (RFC2518/9.4) header conditions + * + * @var array + */ + var $_if_header_uris = array(); + + /** + * HTTP response status/message + * + * @var string + */ + var $_http_status = "200 OK"; + + /** + * encoding of property values passed in + * + * @var string + */ + var $_prop_encoding = "utf-8"; + + // }}} + + // {{{ Constructor + + /** + * Constructor + * + * @param void + */ + function HTTP_WebDAV_Server() + { + // PHP messages destroy XML output -> switch them off + ini_set("display_errors", 0); + } + + // }}} + + // {{{ ServeRequest() + /** + * Serve WebDAV HTTP request + * + * dispatch WebDAV HTTP request to the apropriate method handler + * + * @param void + * @return void + */ + function ServeRequest() + { + // prevent warning in litmus check 'delete_fragment' + if (strstr($_SERVER["REQUEST_URI"], '#')) { + $this->http_status("400 Bad Request"); + return; + } + + // default uri is the complete request uri + $uri = (@$_SERVER["HTTPS"] === "on" ? "https:" : "http:"); + $messagePath = (@$_SERVER["HTTPS"] === "on" ? "https:" : "http:"); + $uri.= "//$_SERVER[HTTP_HOST]$_SERVER[SCRIPT_NAME]"; + + $path_info = empty($_SERVER["PATH_INFO"]) ? "/" : $_SERVER["PATH_INFO"]; + + $this->base_uri = $uri; + $this->uri = $uri . $path_info; + + $requestUri = $_SERVER['REQUEST_URI']; + if ( substr ( $requestUri, -1 ) == '/' ) $requestUri = substr ( $requestUri, 0, strlen ($requestUri) -1 ); + $paths = explode ( '/', $requestUri ); + $redirectPaths = $paths; + array_shift ( $paths ); + array_shift ( $paths ); + array_shift ( $paths ); + array_shift ( $paths ); + array_shift ( $paths ); + array_shift ( $paths ); + array_shift ( $redirectPaths ); + array_pop ( $redirectPaths ); + $this->paths = $paths; + + // set path + //$this->path = $this->_urldecode($path_info); + $this->path = implode ('/', $paths ); + + if (!strlen($this->path)) { + if ($_SERVER["REQUEST_METHOD"] == "GET") { + // redirect clients that try to GET a collection + // WebDAV clients should never try this while + // regular HTTP clients might ... + $redirectPaths = implode ('/', $redirectPaths ); + $messagePath .= '//'.$_SERVER['HTTP_HOST'].'/'.$redirectPaths.'/unavailableService'; + header("Location: ".$messagePath); +// header("Location: ".$this->base_uri."/"); + return; + } else { + // if a WebDAV client didn't give a path we just assume '/' + $this->path = "/"; + } + } + + if(ini_get("magic_quotes_gpc")) { + $this->path = stripslashes($this->path); + } + + + // identify ourselves + if (empty($this->dav_powered_by)) { + header("X-Dav-Powered-By: PHP class: ".get_class($this)); + } else { + header("X-Dav-Powered-By: ".$this->dav_powered_by ); + } + + // check authentication + // for the motivation for not checking OPTIONS requests on / see + // http://pear.php.net/bugs/bug.php?id=5363 + if ( ( !(($_SERVER['REQUEST_METHOD'] == 'OPTIONS') && ($this->path == "/"))) + && (!$this->_check_auth())) { + // RFC2518 says we must use Digest instead of Basic + // but Microsoft Clients do not support Digest + // and we don't support NTLM and Kerberos + // so we are stuck with Basic here + header('WWW-Authenticate: Basic realm="'.($this->http_auth_realm).'"'); + + // Windows seems to require this being the last header sent + // (changed according to PECL bug #3138) + $this->http_status('401 Unauthorized'); + + return; + } + + // check + if(! $this->_check_if_header_conditions()) { + return; + } + + // detect requested method names + $method = strtolower($_SERVER["REQUEST_METHOD"]); + $wrapper = "http_".$method; + + // activate HEAD emulation by GET if no HEAD method found + if ($method == "head" && !method_exists($this, "head")) { + $method = "get"; + } + + if (method_exists($this, $wrapper) && ($method == "options" || method_exists($this, $method))) { + $this->$wrapper(); // call method by name + } else { // method not found/implemented + if ($_SERVER["REQUEST_METHOD"] == "LOCK") { + $this->http_status("412 Precondition failed"); + } else { + $this->http_status("405 Method not allowed"); + header("Allow: ".join(", ", $this->_allow())); // tell client what's allowed + } + } + } + + // }}} + + // {{{ abstract WebDAV methods + + // {{{ GET() + /** + * GET implementation + * + * overload this method to retrieve resources from your server + *
    + * + * + * @abstract + * @param array &$params Array of input and output parameters + *
    input
      + *
    • path - + *
    + *
    output
      + *
    • size - + *
    + * @returns int HTTP-Statuscode + */ + + /* abstract + function GET(&$params) + { + // dummy entry for PHPDoc + } + */ + + // }}} + + // {{{ PUT() + /** + * PUT implementation + * + * PUT implementation + * + * @abstract + * @param array &$params + * @returns int HTTP-Statuscode + */ + + /* abstract + function PUT() + { + // dummy entry for PHPDoc + } + */ + + // }}} + + // {{{ COPY() + + /** + * COPY implementation + * + * COPY implementation + * + * @abstract + * @param array &$params + * @returns int HTTP-Statuscode + */ + + /* abstract + function COPY() + { + // dummy entry for PHPDoc + } + */ + + // }}} + + // {{{ MOVE() + + /** + * MOVE implementation + * + * MOVE implementation + * + * @abstract + * @param array &$params + * @returns int HTTP-Statuscode + */ + + /* abstract + function MOVE() + { + // dummy entry for PHPDoc + } + */ + + // }}} + + // {{{ DELETE() + + /** + * DELETE implementation + * + * DELETE implementation + * + * @abstract + * @param array &$params + * @returns int HTTP-Statuscode + */ + + /* abstract + function DELETE() + { + // dummy entry for PHPDoc + } + */ + // }}} + + // {{{ PROPFIND() + + /** + * PROPFIND implementation + * + * PROPFIND implementation + * + * @abstract + * @param array &$params + * @returns int HTTP-Statuscode + */ + + /* abstract + function PROPFIND() + { + // dummy entry for PHPDoc + } + */ + + // }}} + + // {{{ PROPPATCH() + + /** + * PROPPATCH implementation + * + * PROPPATCH implementation + * + * @abstract + * @param array &$params + * @returns int HTTP-Statuscode + */ + + /* abstract + function PROPPATCH() + { + // dummy entry for PHPDoc + } + */ + // }}} + + // {{{ LOCK() + + /** + * LOCK implementation + * + * LOCK implementation + * + * @abstract + * @param array &$params + * @returns int HTTP-Statuscode + */ + + /* abstract + function LOCK() + { + // dummy entry for PHPDoc + } + */ + // }}} + + // {{{ UNLOCK() + + /** + * UNLOCK implementation + * + * UNLOCK implementation + * + * @abstract + * @param array &$params + * @returns int HTTP-Statuscode + */ + + /* abstract + function UNLOCK() + { + // dummy entry for PHPDoc + } + */ + // }}} + + // }}} + + // {{{ other abstract methods + + // {{{ check_auth() + + /** + * check authentication + * + * overload this method to retrieve and confirm authentication information + * + * @abstract + * @param string type Authentication type, e.g. "basic" or "digest" + * @param string username Transmitted username + * @param string passwort Transmitted password + * @returns bool Authentication status + */ + + /* abstract + function checkAuth($type, $username, $password) + { + // dummy entry for PHPDoc + } + */ + + // }}} + + // {{{ checklock() + + /** + * check lock status for a resource + * + * overload this method to return shared and exclusive locks + * active for this resource + * + * @abstract + * @param string resource Resource path to check + * @returns array An array of lock entries each consisting + * of 'type' ('shared'/'exclusive'), 'token' and 'timeout' + */ + + /* abstract + function checklock($resource) + { + // dummy entry for PHPDoc + } + */ + + // }}} + + // }}} + + // {{{ WebDAV HTTP method wrappers + + // {{{ http_OPTIONS() + + /** + * OPTIONS method handler + * + * The OPTIONS method handler creates a valid OPTIONS reply + * including Dav: and Allowed: heaers + * based on the implemented methods found in the actual instance + * + * @param void + * @return void + */ + function http_OPTIONS() + { + // Microsoft clients default to the Frontpage protocol + // unless we tell them to use WebDAV + header("MS-Author-Via: DAV"); + + // get allowed methods + $allow = $this->_allow(); + + // dav header + $dav = array(1); // assume we are always dav class 1 compliant + if (isset($allow['LOCK'])) { + $dav[] = 2; // dav class 2 requires that locking is supported + } + + // tell clients what we found + $this->http_status("200 OK"); + header("DAV: " .join("," , $dav)); + header("Allow: ".join(", ", $allow)); + + header("Content-length: 0"); + } + + // }}} + + + // {{{ http_PROPFIND() + + /** + * PROPFIND method handler + * + * @param void + * @return void + */ + function http_PROPFIND() + { + $options = Array(); + $options["path"] = $this->path; + + // search depth from header (default is "infinity) + if (isset($_SERVER['HTTP_DEPTH'])) { + $options["depth"] = $_SERVER["HTTP_DEPTH"]; + } else { + $options["depth"] = "infinity"; + } + + // analyze request payload + $propinfo = new _parse_propfind("php://input"); + if (!$propinfo->success) { + $this->http_status("400 Error"); + return; + } + $options['props'] = $propinfo->props; + + // call user handler + if (!$this->PROPFIND($options, $files)) { + $this->http_status("404 Not Found"); + return; + } + + // collect namespaces here + $ns_hash = array(); + + // Microsoft Clients need this special namespace for date and time values + $ns_defs = "xmlns:ns0=\"urn:uuid:c2f41010-65b3-11d1-a29f-00aa00c14882/\""; + + // now we loop over all returned file entries + foreach($files["files"] as $filekey => $file) { + + // nothing to do if no properties were returend for a file + if (!isset($file["props"]) || !is_array($file["props"])) { + continue; + } + + // now loop over all returned properties + foreach($file["props"] as $key => $prop) { + // as a convenience feature we do not require that user handlers + // restrict returned properties to the requested ones + // here we strip all unrequested entries out of the response + + switch($options['props']) { + case "all": + // nothing to remove + break; + + case "names": + // only the names of all existing properties were requested + // so we remove all values + unset($files["files"][$filekey]["props"][$key]["val"]); + break; + + default: + $found = false; + + // search property name in requested properties + foreach((array)$options["props"] as $reqprop) { + if ( $reqprop["name"] == $prop["name"] + && @$reqprop["xmlns"] == $prop["ns"]) { + $found = true; + break; + } + } + + // unset property and continue with next one if not found/requested + if (!$found) { + $files["files"][$filekey]["props"][$key]=""; + continue(2); + } + break; + } + + // namespace handling + if (empty($prop["ns"])) continue; // no namespace + $ns = $prop["ns"]; + if ($ns == "DAV:") continue; // default namespace + if (isset($ns_hash[$ns])) continue; // already known + + // register namespace + $ns_name = "ns".(count($ns_hash) + 1); + $ns_hash[$ns] = $ns_name; + $ns_defs .= " xmlns:$ns_name=\"$ns\""; + } + + // we also need to add empty entries for properties that were requested + // but for which no values where returned by the user handler + if (is_array($options['props'])) { + foreach($options["props"] as $reqprop) { + if($reqprop['name']=="") continue; // skip empty entries + + $found = false; + + // check if property exists in result + foreach($file["props"] as $prop) { + if ( $reqprop["name"] == $prop["name"] + && @$reqprop["xmlns"] == $prop["ns"]) { + $found = true; + break; + } + } + + if (!$found) { + if($reqprop["xmlns"]==="DAV:" && $reqprop["name"]==="lockdiscovery") { + // lockdiscovery is handled by the base class + $files["files"][$filekey]["props"][] + = $this->mkprop("DAV:", + "lockdiscovery" , + $this->lockdiscovery($files["files"][$filekey]['path'])); + } else { + // add empty value for this property + $files["files"][$filekey]["noprops"][] = + $this->mkprop($reqprop["xmlns"], $reqprop["name"], ""); + + // register property namespace if not known yet + if ($reqprop["xmlns"] != "DAV:" && !isset($ns_hash[$reqprop["xmlns"]])) { + $ns_name = "ns".(count($ns_hash) + 1); + $ns_hash[$reqprop["xmlns"]] = $ns_name; + $ns_defs .= " xmlns:$ns_name=\"$reqprop[xmlns]\""; + } + } + } + } + } + } + + // now we generate the reply header ... + $this->http_status("207 Multi-Status"); + header('Content-Type: text/xml; charset="utf-8"'); + + // ... and payload + echo "\n"; + echo "\n"; + + foreach($files["files"] as $file) { + // ignore empty or incomplete entries + if(!is_array($file) || empty($file) || !isset($file["path"])) continue; + $path = $file['path']; + if(!is_string($path) || $path==="") continue; + + if (!class_exists('G')) { + $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); + $docuroot = explode( '/', $realdocuroot ); + array_pop( $docuroot ); + $pathhome = implode( '/', $docuroot ) . '/'; + array_pop( $docuroot ); + $pathTrunk = implode( '/', $docuroot ) . '/'; + require_once($pathTrunk.'gulliver/system/class.g.php'); + } + G::LoadSystem('inputfilter'); + $filter = new InputFilter(); + $ns_defs = $filter->xssFilterHard($ns_defs); + + echo ' \n"; + + /* TODO right now the user implementation has to make sure + collections end in a slash, this should be done in here + by checking the resource attribute */ + //$href = $this->_mergePathes($_SERVER['SCRIPT_NAME'], $path); + $href = $this->_mergePathes($this->uriBase, $path); + + echo " $href\n"; + + // report all found properties and their values (if any) + if (isset($file["props"]) && is_array($file["props"])) { + echo " \n"; + echo " \n"; + + foreach($file["props"] as $key => $prop) { + + if (!is_array($prop)) continue; + if (!isset($prop["name"])) continue; + + if (!isset($prop["val"]) || $prop["val"] === "" || $prop["val"] === false) { + // empty properties (cannot use empty() for check as "0" is a legal value here) + if($prop["ns"]=="DAV:") { + echo " \n"; + } else if(!empty($prop["ns"])) { + echo " <".$ns_hash[$prop["ns"]].":$prop[name]/>\n"; + } else { + echo " <$prop[name] xmlns=\"\"/>"; + } + } else if ($prop["ns"] == "DAV:") { + // some WebDAV properties need special treatment + switch ($prop["name"]) { + case "creationdate": + echo " " + . gmdate("Y-m-d\\TH:i:s\\Z",$prop['val']) + . "\n"; + break; + case "getlastmodified": + echo " " + . gmdate("D, d M Y H:i:s ", $prop['val']) + . "GMT\n"; + break; + case "lastaccessed": + echo " " + . gmdate("D, d M Y H:i:s ", $prop['val']) + . "GMT\n"; + break; + case "resourcetype": + echo " \n"; + break; + case "supportedlock": + echo " $prop[val]\n"; + break; + case "lockdiscovery": + echo " \n"; + echo $prop["val"]; + echo " \n"; + break; + default: + echo " " + . $this->_prop_encode(htmlspecialchars($prop['val'])) + . "\n"; + break; + } + } else { + // properties from namespaces != "DAV:" or without any namespace + if ($prop["ns"]) { + echo " <" . $ns_hash[$prop["ns"]] . ":$prop[name]>" + . $this->_prop_encode(htmlspecialchars($prop['val'])) + . "\n"; + } else { + echo " <$prop[name] xmlns=\"\">" + . $this->_prop_encode(htmlspecialchars($prop['val'])) + . "\n"; + } + } + } + + echo " \n"; + echo " HTTP/1.1 200 OK\n"; + echo " \n"; + } + /* commented by Onti. + // now report all properties requested but not found + if (isset($file["noprops"])) { + echo " \n"; + echo " \n"; + + foreach($file["noprops"] as $key => $prop) { + if ($prop["ns"] == "DAV:") { + echo " \n"; + } else if ($prop["ns"] == "") { + echo " <$prop[name] xmlns=\"\"/>\n"; + } else { + echo " <" . $ns_hash[$prop["ns"]] . ":$prop[name]/>\n"; + } + } + + echo " \n"; + echo " HTTP/1.1 404 Not Found\n"; + echo " \n"; + } + */ + echo " \n"; + } + + echo "\n"; + } + + + // }}} + + // {{{ http_PROPPATCH() + + /** + * PROPPATCH method handler + * + * @param void + * @return void + */ + function http_PROPPATCH() + { + if($this->_check_lock_status($this->path)) { + $options = Array(); + $options["path"] = $this->path; + + $propinfo = new _parse_proppatch("php://input"); + + if (!$propinfo->success) { + $this->http_status("400 Error"); + return; + } + + $options['props'] = $propinfo->props; + + $responsedescr = $this->PROPPATCH($options); + + $this->http_status("207 Multi-Status"); + header('Content-Type: text/xml; charset="utf-8"'); + + if (!class_exists('G')) { + $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); + $docuroot = explode( '/', $realdocuroot ); + array_pop( $docuroot ); + $pathhome = implode( '/', $docuroot ) . '/'; + array_pop( $docuroot ); + $pathTrunk = implode( '/', $docuroot ) . '/'; + require_once($pathTrunk.'gulliver/system/class.g.php'); + } + G::LoadSystem('inputfilter'); + $filter = new InputFilter(); + $_mergePathes = $filter->xssFilterHard($this->_urlencode($this->_mergePathes($_SERVER["SCRIPT_NAME"], $this->path))); + + echo "\n"; + + echo "\n"; + echo " \n"; + echo " ".$_mergePathes."\n"; + + foreach($options["props"] as $prop) { + echo " \n"; + echo " <$prop[name] xmlns=\"$prop[ns]\"/>\n"; + echo " HTTP/1.1 $prop[status]\n"; + echo " \n"; + } + + if ($responsedescr) { + echo " ". + $this->_prop_encode(htmlspecialchars($responsedescr)). + "\n"; + } + + echo " \n"; + echo "\n"; + } else { + $this->http_status("423 Locked"); + } + } + + // }}} + + + // {{{ http_MKCOL() + + /** + * MKCOL method handler + * + * @param void + * @return void + */ + function http_MKCOL() + { + $options = Array(); + $options["path"] = $this->path; + + $stat = $this->MKCOL($options); + + $this->http_status($stat); + } + + // }}} + + + // {{{ http_GET() + + /** + * GET method handler + * + * @param void + * @returns void + */ + function http_GET() + { + // TODO check for invalid stream + $options = Array(); + $options["path"] = $this->path; + + $this->_get_ranges($options); + + if (true === ($status = $this->GET($options))) { + if (!headers_sent()) { + $status = "200 OK"; + + if (!isset($options['mimetype'])) { + $options['mimetype'] = "application/octet-stream"; + } + header("Content-type: $options[mimetype]"); + + if (isset($options['mtime'])) { + header("Last-modified:".gmdate("D, d M Y H:i:s ", $options['mtime'])."GMT"); + } + + if (isset($options['stream'])) { + // GET handler returned a stream + if (!empty($options['ranges']) && (0===fseek($options['stream'], 0, SEEK_SET))) { + // partial request and stream is seekable + + if (count($options['ranges']) === 1) { + $range = $options['ranges'][0]; + + if (isset($range['start'])) { + fseek($options['stream'], $range['start'], SEEK_SET); + if (feof($options['stream'])) { + $this->http_status("416 Requested range not satisfiable"); + return; + } + + if (isset($range['end'])) { + $size = $range['end']-$range['start']+1; + $this->http_status("206 partial"); + header("Content-length: $size"); + header("Content-range: $range[start]-$range[end]/" + . (isset($options['size']) ? $options['size'] : "*")); + while ($size && !feof($options['stream'])) { + $buffer = fread($options['stream'], 4096); + $size -= strlen($buffer); + echo $buffer; + } + } else { + $this->http_status("206 partial"); + if (isset($options['size'])) { + header("Content-length: ".($options['size'] - $range['start'])); + header("Content-range: $start-$end/" + . (isset($options['size']) ? $options['size'] : "*")); + } + fpassthru($options['stream']); + } + } else { + header("Content-length: ".$range['last']); + fseek($options['stream'], -$range['last'], SEEK_END); + fpassthru($options['stream']); + } + } else { + $this->_multipart_byterange_header(); // init multipart + foreach ($options['ranges'] as $range) { + // TODO what if size unknown? 500? + if (isset($range['start'])) { + $from = $range['start']; + $to = !empty($range['end']) ? $range['end'] : $options['size']-1; + } else { + $from = $options['size'] - $range['last']-1; + $to = $options['size'] -1; + } + $total = isset($options['size']) ? $options['size'] : "*"; + $size = $to - $from + 1; + $this->_multipart_byterange_header($options['mimetype'], $from, $to, $total); + + + fseek($options['stream'], $start, SEEK_SET); + while ($size && !feof($options['stream'])) { + $buffer = fread($options['stream'], 4096); + $size -= strlen($buffer); + echo $buffer; + } + } + $this->_multipart_byterange_header(); // end multipart + } + } else { + // normal request or stream isn't seekable, return full content + if (isset($options['size'])) { + header("Content-length: ".$options['size']); + } + fpassthru($options['stream']); + return; // no more headers + } + } elseif (isset($options['data'])) { + if (is_array($options['data'])) { + // reply to partial request + } else { + header("Content-length: ".strlen($options['data'])); + echo $options['data']; + } + } + } + } + + if (!headers_sent()) { + if (false === $status) { + $this->http_status("404 not found"); + } else { + // TODO: check setting of headers in various code pathes above + $this->http_status("$status"); + } + } + } + + + /** + * parse HTTP Range: header + * + * @param array options array to store result in + * @return void + */ + function _get_ranges(&$options) + { + // process Range: header if present + if (isset($_SERVER['HTTP_RANGE'])) { + + // we only support standard "bytes" range specifications for now + if (preg_match('/bytes\s*=\s*(.+)/', $_SERVER['HTTP_RANGE'], $matches)) { + $options["ranges"] = array(); + + // ranges are comma separated + foreach (explode(",", $matches[1]) as $range) { + // ranges are either from-to pairs or just end positions + list($start, $end) = explode("-", $range); + $options["ranges"][] = ($start==="") + ? array("last"=>$end) + : array("start"=>$start, "end"=>$end); + } + } + } + } + + /** + * generate separator headers for multipart response + * + * first and last call happen without parameters to generate + * the initial header and closing sequence, all calls inbetween + * require content mimetype, start and end byte position and + * optionaly the total byte length of the requested resource + * + * @param string mimetype + * @param int start byte position + * @param int end byte position + * @param int total resource byte size + */ + function _multipart_byterange_header($mimetype = false, $from = false, $to=false, $total=false) + { + if ($mimetype === false) { + if (!isset($this->multipart_separator)) { + // initial + + // a little naive, this sequence *might* be part of the content + // but it's really not likely and rather expensive to check + $this->multipart_separator = "SEPARATOR_".$this->encryptOld(microtime()); + + // generate HTTP header + header("Content-type: multipart/byteranges; boundary=".$this->multipart_separator); + } else { + // final + + // generate closing multipart sequence + echo "\n--{$this->multipart_separator}--"; + } + } else { + // generate separator and header for next part + echo "\n--{$this->multipart_separator}\n"; + echo "Content-type: $mimetype\n"; + echo "Content-range: $from-$to/". ($total === false ? "*" : $total); + echo "\n\n"; + } + } + + + + // }}} + + // {{{ http_HEAD() + + /** + * HEAD method handler + * + * @param void + * @return void + */ + function http_HEAD() + { + $status = false; + $options = Array(); + $options["path"] = $this->path; + + if (method_exists($this, "HEAD")) { + $status = $this->head($options); + } else if (method_exists($this, "GET")) { + ob_start(); + $status = $this->GET($options); + if (!isset($options['size'])) { + $options['size'] = ob_get_length(); + } + ob_end_clean(); + } + + if (isset($options['size'])) { + header("Content-length: ".$options['size']); + } + + if($status===true) $status = "200 OK"; + if($status===false) $status = "404 Not found"; + + $this->http_status($status); + } + + // }}} + + // {{{ http_PUT() + + /** + * PUT method handler + * + * @param void + * @return void + */ + function http_PUT() + { + if ($this->_check_lock_status($this->path)) { + $options = Array(); + $options["path"] = $this->path; + $options["content_length"] = $_SERVER["CONTENT_LENGTH"]; + + // get the Content-type + if (isset($_SERVER["CONTENT_TYPE"])) { + // for now we do not support any sort of multipart requests + if (!strncmp($_SERVER["CONTENT_TYPE"], "multipart/", 10)) { + $this->http_status("501 not implemented"); + echo "The service does not support mulipart PUT requests"; + return; + } + $options["content_type"] = $_SERVER["CONTENT_TYPE"]; + } else { + // default content type if none given + $options["content_type"] = "application/octet-stream"; + } + + /* RFC 2616 2.6 says: "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." + */ + foreach ($_SERVER as $key => $val) { + if (strncmp($key, "HTTP_CONTENT", 11)) continue; + switch ($key) { + case 'HTTP_CONTENT_ENCODING': // RFC 2616 14.11 + // TODO support this if ext/zlib filters are available + $this->http_status("501 not implemented"); + + if (!class_exists('G')) { + $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); + $docuroot = explode( '/', $realdocuroot ); + array_pop( $docuroot ); + $pathhome = implode( '/', $docuroot ) . '/'; + array_pop( $docuroot ); + $pathTrunk = implode( '/', $docuroot ) . '/'; + require_once($pathTrunk.'gulliver/system/class.g.php'); + } + G::LoadSystem('inputfilter'); + $filter = new InputFilter(); + $val = $filter->xssFilterHard($val); + + echo 'The service does not support \''.$val.'\' content encoding'; + return; + + case 'HTTP_CONTENT_LANGUAGE': // RFC 2616 14.12 + // we assume it is not critical if this one is ignored + // in the actual PUT implementation ... + $options["content_language"] = $value; + break; + + case 'HTTP_CONTENT_LOCATION': // RFC 2616 14.14 + /* The meaning of the Content-Location header in PUT + or POST requests is undefined; servers are free + to ignore it in those cases. */ + break; + + case 'HTTP_CONTENT_RANGE': // RFC 2616 14.16 + // single byte range requests are supported + // the header format is also specified in RFC 2616 14.16 + // TODO we have to ensure that implementations support this or send 501 instead + if (!preg_match('@bytes\s+(\d+)-(\d+)/((\d+)|\*)@', $val, $matches)) { + $this->http_status("400 bad request"); + echo "The service does only support single byte ranges"; + return; + } + + $range = array("start"=>$matches[1], "end"=>$matches[2]); + if (is_numeric($matches[3])) { + $range["total_length"] = $matches[3]; + } + $option["ranges"][] = $range; + + // TODO make sure the implementation supports partial PUT + // this has to be done in advance to avoid data being overwritten + // on implementations that do not support this ... + break; + + case 'HTTP_CONTENT_MD5': // RFC 2616 14.15 + // TODO: maybe we can just pretend here? + $this->http_status("501 not implemented"); + echo "The service does not support content MD5 checksum verification"; + return; + + default: + // any other unknown Content-* headers + $this->http_status("501 not implemented"); + + if (!class_exists('G')) { + $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); + $docuroot = explode( '/', $realdocuroot ); + array_pop( $docuroot ); + $pathhome = implode( '/', $docuroot ) . '/'; + array_pop( $docuroot ); + $pathTrunk = implode( '/', $docuroot ) . '/'; + require_once($pathTrunk.'gulliver/system/class.g.php'); + } + G::LoadSystem('inputfilter'); + $filter = new InputFilter(); + $key = $filter->xssFilterHard($key); + + echo 'The service does not support \''.$key.'\' '; + return; + } + } + + + $options["stream"] = fopen("php://input", "r"); + + $stat = $this->PUT($options); + + if ($stat === false) { + $stat = "403 Forbidden"; + } +/* + else if (is_resource($stat) && get_resource_type($stat) == "stream") { + $stream = $stat; + + $stat = $options["new"] ? "201 Created" : "204 No Content"; + if (!empty($options["ranges"])) { + // TODO multipart support is missing (see also above) + if (0 == fseek($stream, $range[0]["start"], SEEK_SET)) { + $length = $range[0]["end"]-$range[0]["start"]+1; + if (!fwrite($stream, fread($options["stream"], $length))) { + $stat = "403 Forbidden"; + } + } else { + $stat = "403 Forbidden"; + } + } else { + while (!feof($options["stream"])) { + if (false === fwrite($stream, fread($options["stream"], 4096))) { + $stat = "403 Forbidden"; + break; + } + } + } + + fclose($stream); + + } +*/ + $this->http_status($stat); + } else { + $this->http_status("423 Locked"); + } + } + + // }}} + + + // {{{ http_DELETE() + + /** + * DELETE method handler + * + * @param void + * @return void + */ + function http_DELETE() + { + // check RFC 2518 Section 9.2, last paragraph + if (isset($_SERVER["HTTP_DEPTH"])) { + if ($_SERVER["HTTP_DEPTH"] != "infinity") { + $this->http_status("400 Bad Request"); + return; + } + } + + // check lock status + if ($this->_check_lock_status($this->path)) { + // ok, proceed + $options = Array(); + $options["path"] = $this->path; + + $stat = $this->DELETE($options); + + $this->http_status($stat); + } else { + // sorry, its locked + $this->http_status("423 Locked"); + } + } + + // }}} + + // {{{ http_COPY() + + /** + * COPY method handler + * + * @param void + * @return void + */ + function http_COPY() + { + // no need to check source lock status here + // destination lock status is always checked by the helper method + $this->_copymove("copy"); + } + + // }}} + + // {{{ http_MOVE() + + /** + * MOVE method handler + * + * @param void + * @return void + */ + function http_MOVE() + { + if ($this->_check_lock_status($this->path)) { + // destination lock status is always checked by the helper method + $this->_copymove("move"); + } else { + $this->http_status("423 Locked"); + } + } + + // }}} + + + // {{{ http_LOCK() + + /** + * LOCK method handler + * + * @param void + * @return void + */ + function http_LOCK() + { + $options = Array(); + $options["path"] = $this->path; + + if (isset($_SERVER['HTTP_DEPTH'])) { + $options["depth"] = $_SERVER["HTTP_DEPTH"]; + } else { + $options["depth"] = "infinity"; + } + + if (isset($_SERVER["HTTP_TIMEOUT"])) { + $options["timeout"] = explode(",", $_SERVER["HTTP_TIMEOUT"]); + } + + if(empty($_SERVER['CONTENT_LENGTH']) && !empty($_SERVER['HTTP_IF'])) { + // check if locking is possible + if(!$this->_check_lock_status($this->path)) { + $this->http_status("423 Locked"); + return; + } + + // refresh lock + $options["update"] = substr($_SERVER['HTTP_IF'], 2, -2); + $stat = $this->LOCK($options); + } else { + // extract lock request information from request XML payload + $lockinfo = new _parse_lockinfo("php://input"); + if (!$lockinfo->success) { + $this->http_status("400 bad request"); + } + + // check if locking is possible + if(!$this->_check_lock_status($this->path, $lockinfo->lockscope === "shared")) { + $this->http_status("423 Locked"); + return; + } + + // new lock + $options["scope"] = $lockinfo->lockscope; + $options["type"] = $lockinfo->locktype; + $options["owner"] = $lockinfo->owner; + + $options["locktoken"] = $this->_new_locktoken(); + + $stat = $this->LOCK($options); + } + + if(is_bool($stat)) { + $http_stat = $stat ? "200 OK" : "423 Locked"; + } else { + $http_stat = $stat; + } + + $this->http_status($http_stat); + + if ($http_stat{0} == 2) { // 2xx states are ok + if($options["timeout"]) { + // more than a million is considered an absolute timestamp + // less is more likely a relative value + if($options["timeout"]>1000000) { + $timeout = "Second-".($options['timeout']-time()); + } else { + $timeout = "Second-$options[timeout]"; + } + } else { + $timeout = "Infinite"; + } + + if (!class_exists('G')) { + $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); + $docuroot = explode( '/', $realdocuroot ); + array_pop( $docuroot ); + $pathhome = implode( '/', $docuroot ) . '/'; + array_pop( $docuroot ); + $pathTrunk = implode( '/', $docuroot ) . '/'; + require_once($pathTrunk.'gulliver/system/class.g.php'); + } + G::LoadSystem('inputfilter'); + $filter = new InputFilter(); + $options = $filter->xssFilterHard($options); + $timeout = $filter->xssFilterHard($timeout); + + header('Content-Type: text/xml; charset="utf-8"'); + header("Lock-Token: <$options[locktoken]>"); + echo "\n"; + echo "\n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " \n"; + echo " $options[depth]\n"; + echo " $options[owner]\n"; + echo " $timeout\n"; + echo " $options[locktoken]\n"; + echo " \n"; + echo " \n"; + echo "\n\n"; + } + } + + + // }}} + + // {{{ http_UNLOCK() + + /** + * UNLOCK method handler + * + * @param void + * @return void + */ + function http_UNLOCK() + { + $options = Array(); + $options["path"] = $this->path; + + if (isset($_SERVER['HTTP_DEPTH'])) { + $options["depth"] = $_SERVER["HTTP_DEPTH"]; + } else { + $options["depth"] = "infinity"; + } + + // strip surrounding <> + $options["token"] = substr(trim($_SERVER["HTTP_LOCK_TOKEN"]), 1, -1); + + // call user method + $stat = $this->UNLOCK($options); + + $this->http_status($stat); + } + + // }}} + + // }}} + + // {{{ _copymove() + + function _copymove($what) + { + $options = Array(); + $options["path"] = $this->path; + + if (isset($_SERVER["HTTP_DEPTH"])) { + $options["depth"] = $_SERVER["HTTP_DEPTH"]; + } else { + $options["depth"] = "infinity"; + } + + extract(parse_url($_SERVER["HTTP_DESTINATION"])); + $path = urldecode($path); + $http_host = $host; + if (isset($port) && $port != 80) + $http_host.= ":$port"; + + $http_header_host = preg_replace("/:80$/", "", $_SERVER["HTTP_HOST"]); + + if ($http_host == $http_header_host && + !strncmp($_SERVER["SCRIPT_NAME"], $path, + strlen($_SERVER["SCRIPT_NAME"]))) { + $options["dest"] = substr($path, strlen($_SERVER["SCRIPT_NAME"])); + if (!$this->_check_lock_status($options["dest"])) { + $this->http_status("423 Locked"); + return; + } + + } else { + $options["dest_url"] = $_SERVER["HTTP_DESTINATION"]; + } + + // see RFC 2518 Sections 9.6, 8.8.4 and 8.9.3 + if (isset($_SERVER["HTTP_OVERWRITE"])) { + $options["overwrite"] = $_SERVER["HTTP_OVERWRITE"] == "T"; + } else { + $options["overwrite"] = true; + } + + $stat = $this->$what($options); + $this->http_status($stat); + } + + // }}} + + // {{{ _allow() + + /** + * check for implemented HTTP methods + * + * @param void + * @return array something + */ + function _allow() + { + // OPTIONS is always there + $allow = array("OPTIONS" =>"OPTIONS"); + + // all other METHODS need both a http_method() wrapper + // and a method() implementation + // the base class supplies wrappers only + foreach(get_class_methods($this) as $method) { + if (!strncmp("http_", $method, 5)) { + $method = strtoupper(substr($method, 5)); + if (method_exists($this, $method)) { + $allow[$method] = $method; + } + } + } + + // we can emulate a missing HEAD implemetation using GET + if (isset($allow["GET"])) + $allow["HEAD"] = "HEAD"; + + // no LOCK without checklok() + if (!method_exists($this, "checklock")) { + unset($allow["LOCK"]); + unset($allow["UNLOCK"]); + } + + return $allow; + } + + // }}} + + /** + * helper for property element creation + * + * @param string XML namespace (optional) + * @param string property name + * @param string property value + * @return array property array + */ + function mkprop() + { + $args = func_get_args(); + if (count($args) == 3) { + return array("ns" => $args[0], + "name" => $args[1], + "val" => $args[2]); + } else { + return array("ns" => "DAV:", + "name" => $args[0], + "val" => $args[1]); + } + } + + // {{{ _check_auth + + /** + * check authentication if check is implemented + * + * @param void + * @return bool true if authentication succeded or not necessary + */ + function _check_auth() + { + if (method_exists($this, "checkAuth")) { + // PEAR style method name + return $this->checkAuth(@$_SERVER["AUTH_TYPE"], + @$_SERVER["PHP_AUTH_USER"], + @$_SERVER["PHP_AUTH_PW"]); + } else if (method_exists($this, "check_auth")) { + // old (pre 1.0) method name + return $this->check_auth(@$_SERVER["AUTH_TYPE"], + @$_SERVER["PHP_AUTH_USER"], + @$_SERVER["PHP_AUTH_PW"]); + } else { + // no method found -> no authentication required + return true; + } + } + + // }}} + + // {{{ UUID stuff + + /** + * generate Unique Universal IDentifier for lock token + * + * @param void + * @return string a new UUID + */ + function _new_uuid() + { + // use uuid extension from PECL if available + if (function_exists("uuid_create")) { + return uuid_create(); + } + + // fallback + $uuid = $this->encryptOld(microtime().getmypid()); // this should be random enough for now + + // set variant and version fields for 'true' random uuid + $uuid{12} = "4"; + $n = 8 + (ord($uuid{16}) & 3); + $hex = "0123456789abcdef"; + $uuid{16} = $hex{$n}; + + // return formated uuid + return substr($uuid, 0, 8)."-" + . substr($uuid, 8, 4)."-" + . substr($uuid, 12, 4)."-" + . substr($uuid, 16, 4)."-" + . substr($uuid, 20); + } + + /** + * create a new opaque lock token as defined in RFC2518 + * + * @param void + * @return string new RFC2518 opaque lock token + */ + function _new_locktoken() + { + return "opaquelocktoken:".$this->_new_uuid(); + } + + // }}} + + // {{{ WebDAV If: header parsing + + /** + * + * + * @param string header string to parse + * @param int current parsing position + * @return array next token (type and value) + */ + function _if_header_lexer($string, &$pos) + { + // skip whitespace + while (ctype_space($string{$pos})) { + ++$pos; + } + + // already at end of string? + if (strlen($string) <= $pos) { + return false; + } + + // get next character + $c = $string{$pos++}; + + // now it depends on what we found + switch ($c) { + case "<": + // URIs are enclosed in <...> + $pos2 = strpos($string, ">", $pos); + $uri = substr($string, $pos, $pos2 - $pos); + $pos = $pos2 + 1; + return array("URI", $uri); + + case "[": + //Etags are enclosed in [...] + if ($string{$pos} == "W") { + $type = "ETAG_WEAK"; + $pos += 2; + } else { + $type = "ETAG_STRONG"; + } + $pos2 = strpos($string, "]", $pos); + $etag = substr($string, $pos + 1, $pos2 - $pos - 2); + $pos = $pos2 + 1; + return array($type, $etag); + + case "N": + // "N" indicates negation + $pos += 2; + return array("NOT", "Not"); + + default: + // anything else is passed verbatim char by char + return array("CHAR", $c); + } + } + + /** + * parse If: header + * + * @param string header string + * @return array URIs and their conditions + */ + function _if_header_parser($str) + { + $pos = 0; + $len = strlen($str); + + $uris = array(); + + // parser loop + while ($pos < $len) { + // get next token + $token = $this->_if_header_lexer($str, $pos); + + // check for URI + if ($token[0] == "URI") { + $uri = $token[1]; // remember URI + $token = $this->_if_header_lexer($str, $pos); // get next token + } else { + $uri = ""; + } + + // sanity check + if ($token[0] != "CHAR" || $token[1] != "(") { + return false; + } + + $list = array(); + $level = 1; + $not = ""; + while ($level) { + $token = $this->_if_header_lexer($str, $pos); + if ($token[0] == "NOT") { + $not = "!"; + continue; + } + switch ($token[0]) { + case "CHAR": + switch ($token[1]) { + case "(": + $level++; + break; + case ")": + $level--; + break; + default: + return false; + } + break; + + case "URI": + $list[] = $not."<$token[1]>"; + break; + + case "ETAG_WEAK": + $list[] = $not."[W/'$token[1]']>"; + break; + + case "ETAG_STRONG": + $list[] = $not."['$token[1]']>"; + break; + + default: + return false; + } + $not = ""; + } + + if (@is_array($uris[$uri])) { + $uris[$uri] = array_merge($uris[$uri],$list); + } else { + $uris[$uri] = $list; + } + } + + return $uris; + } + + /** + * check if conditions from "If:" headers are meat + * + * the "If:" header is an extension to HTTP/1.1 + * defined in RFC 2518 section 9.4 + * + * @param void + * @return void + */ + function _check_if_header_conditions() + { + if (isset($_SERVER["HTTP_IF"])) { + $this->_if_header_uris = + $this->_if_header_parser($_SERVER["HTTP_IF"]); + + foreach($this->_if_header_uris as $uri => $conditions) { + if ($uri == "") { + $uri = $this->uri; + } + // all must match + $state = true; + foreach($conditions as $condition) { + // lock tokens may be free form (RFC2518 6.3) + // but if opaquelocktokens are used (RFC2518 6.4) + // we have to check the format (litmus tests this) + if (!strncmp($condition, "$/', $condition)) { + $this->http_status("423 Locked"); + return false; + } + } + if (!$this->_check_uri_condition($uri, $condition)) { + $this->http_status("412 Precondition failed"); + $state = false; + break; + } + } + + // any match is ok + if ($state == true) { + return true; + } + } + return false; + } + return true; + } + + /** + * Check a single URI condition parsed from an if-header + * + * Check a single URI condition parsed from an if-header + * + * @abstract + * @param string $uri URI to check + * @param string $condition Condition to check for this URI + * @returns bool Condition check result + */ + function _check_uri_condition($uri, $condition) + { + // not really implemented here, + // implementations must override + return true; + } + + + /** + * + * + * @param string path of resource to check + * @param bool exclusive lock? + */ + function _check_lock_status($path, $exclusive_only = false) + { + // FIXME depth -> ignored for now + if (method_exists($this, "checkLock")) { + // is locked? + $lock = $this->checkLock($path); + + // ... and lock is not owned? + if (is_array($lock) && count($lock)) { + // FIXME doesn't check uri restrictions yet + if (!isset($_SERVER["HTTP_IF"]) || !strstr($_SERVER["HTTP_IF"], $lock["token"])) { + if (!$exclusive_only || ($lock["scope"] !== "shared")) + return false; + } + } + } + return true; + } + + + // }}} + + + /** + * Generate lockdiscovery reply from checklock() result + * + * @param string resource path to check + * @return string lockdiscovery response + */ + function lockdiscovery($path) + { + // no lock support without checklock() method + if (!method_exists($this, "checklock")) { + return ""; + } + + // collect response here + $activelocks = ""; + + // get checklock() reply + $lock = $this->checklock($path); + + // generate block for returned data + if (is_array($lock) && count($lock)) { + // check for 'timeout' or 'expires' + if (!empty($lock["expires"])) { + $timeout = "Second-".($lock["expires"] - time()); + } else if (!empty($lock["timeout"])) { + $timeout = "Second-$lock[timeout]"; + } else { + $timeout = "Infinite"; + } + + // genreate response block + $activelocks.= " + + + + $lock[depth] + $lock[owner] + $timeout + $lock[token] + + "; + } + + // return generated response + return $activelocks; + } + + /** + * set HTTP return status and mirror it in a private header + * + * @param string status code and message + * @return void + */ + function http_status($status) + { + // simplified success case + if($status === true) { + $status = "200 OK"; + } + + // remember status + $this->_http_status = $status; + + // generate HTTP status response + header("HTTP/1.1 $status"); + header("X-WebDAV-Status: $status", true); + } + + /** + * private minimalistic version of PHP urlencode() + * + * only blanks and XML special chars must be encoded here + * full urlencode() encoding confuses some clients ... + * + * @param string URL to encode + * @return string encoded URL + */ + function _urlencode($url) + { + return strtr($url, array(" "=>"%20", + "&"=>"%26", + "<"=>"%3C", + ">"=>"%3E", + )); + } + + /** + * private version of PHP urldecode + * + * not really needed but added for completenes + * + * @param string URL to decode + * @return string decoded URL + */ + function _urldecode($path) + { + return urldecode($path); + } + + /** + * UTF-8 encode property values if not already done so + * + * @param string text to encode + * @return string utf-8 encoded text + */ + function _prop_encode($text) + { + switch (strtolower($this->_prop_encoding)) { + case "utf-8": + return $text; + case "iso-8859-1": + case "iso-8859-15": + case "latin-1": + default: + return utf8_encode($text); + } + } + + /** + * Slashify - make sure path ends in a slash + * + * @param string directory path + * @returns string directory path wiht trailing slash + */ + function _slashify($path) { + if ($path[strlen($path)-1] != '/') { + $path = $path."/"; + } + return $path; + } + + /** + * Unslashify - make sure path doesn't in a slash + * + * @param string directory path + * @returns string directory path wihtout trailing slash + */ + function _unslashify($path) { + if ($path[strlen($path)-1] == '/') { + $path = substr($path, 0, strlen($path, 0, -1)); + } + return $path; + } + + /** + * Merge two pathes, make sure there is exactly one slash between them + * + * @param string parent path + * @param string child path + * @return string merged path + */ + function _mergePathes($parent, $child) + { + if ($child{0} == '/') { + return $this->_unslashify($parent).$child; + } else { + return $this->_slashify($parent).$child; + } + } + + public function encryptOld($string) + { + if (!class_exists('G')) { + $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); + $docuroot = explode( '/', $realdocuroot ); + array_pop( $docuroot ); + $pathhome = implode( '/', $docuroot ) . '/'; + array_pop( $docuroot ); + $pathTrunk = implode( '/', $docuroot ) . '/'; + require_once($pathTrunk.'gulliver/system/class.g.php'); + } + return G::encryptOld($string); + } +} diff --git a/thirdparty/pear/HTTP/WebDAV/Server/Filesystem.php b/thirdparty/pear/HTTP/WebDAV/Server/Filesystem.php new file mode 100644 index 000000000..5b98f0eac --- /dev/null +++ b/thirdparty/pear/HTTP/WebDAV/Server/Filesystem.php @@ -0,0 +1,721 @@ + $value) { + if (stristr($key,"litmus")) { + error_log("Litmus test $value"); + header("X-Litmus-reply: ".$value); + } + } + } + + // set root directory, defaults to webserver document root if not set + if ($base) { + $this->base = realpath($base); // TODO throw if not a directory + } else if (!$this->base) { + $this->base = $_SERVER['DOCUMENT_ROOT']; + } + + // establish connection to property/locking db + //mysql_connect($this->db_host, $this->db_user, $this->db_passwd) or die(mysql_error()); + //mysql_select_db($this->db_name) or die(mysql_error()); + // TODO throw on connection problems + + // let the base class do all the work + parent::ServeRequest(); + } + + /** + * No authentication is needed here + * + * @access private + * @param string HTTP Authentication type (Basic, Digest, ...) + * @param string Username + * @param string Password + * @return bool true on successful authentication + */ + function check_auth($type, $user, $pass) + { + return true; + } + + + /** + * PROPFIND method handler + * + * @param array general parameter passing array + * @param array return array for file properties + * @return bool true on success + */ + function PROPFIND(&$options, &$files) + { + // get absolute fs path to requested resource + $fspath = $this->base . $options["path"]; + + // sanity check + if (!file_exists($fspath)) { + return false; + } + + // prepare property array + $files["files"] = array(); + + // store information for the requested path itself + $files["files"][] = $this->fileinfo($options["path"]); + + // information for contained resources requested? + if (!empty($options["depth"])) { // TODO check for is_dir() first? + + // make sure path ends with '/' + $options["path"] = $this->_slashify($options["path"]); + + // try to open directory + $handle = @opendir($fspath); + + if ($handle) { + // ok, now get all its contents + while ($filename = readdir($handle)) { + if ($filename != "." && $filename != "..") { + $files["files"][] = $this->fileinfo($options["path"].$filename); + } + } + // TODO recursion needed if "Depth: infinite" + } + } + + // ok, all done + return true; + } + + /** + * Get properties for a single file/resource + * + * @param string resource path + * @return array resource properties + */ + function fileinfo($path) + { + // map URI path to filesystem path + $fspath = $this->base . $path; + + // create result array + $info = array(); + // TODO remove slash append code when base clase is able to do it itself + $info["path"] = is_dir($fspath) ? $this->_slashify($path) : $path; + $info["props"] = array(); + + // no special beautified displayname here ... + $info["props"][] = $this->mkprop("displayname", strtoupper($path)); + + // creation and modification time + $info["props"][] = $this->mkprop("creationdate", filectime($fspath)); + $info["props"][] = $this->mkprop("getlastmodified", filemtime($fspath)); + + // type and size (caller already made sure that path exists) + if (is_dir($fspath)) { + // directory (WebDAV collection) + $info["props"][] = $this->mkprop("resourcetype", "collection"); + $info["props"][] = $this->mkprop("getcontenttype", "httpd/unix-directory"); + } else { + // plain file (WebDAV resource) + $info["props"][] = $this->mkprop("resourcetype", ""); + if (is_readable($fspath)) { + $info["props"][] = $this->mkprop("getcontenttype", $this->_mimetype($fspath)); + } else { + $info["props"][] = $this->mkprop("getcontenttype", "application/x-non-readable"); + } + $info["props"][] = $this->mkprop("getcontentlength", filesize($fspath)); + } + + // get additional properties from database + $query = "SELECT ns, name, value FROM properties WHERE path = '$path'"; + $res = mysql_query($query); + while ($row = mysql_fetch_assoc($res)) { + $info["props"][] = $this->mkprop($row["ns"], $row["name"], $row["value"]); + } + mysql_free_result($res); + + return $info; + } + + /** + * detect if a given program is found in the search PATH + * + * helper function used by _mimetype() to detect if the + * external 'file' utility is available + * + * @param string program name + * @param string optional search path, defaults to $PATH + * @return bool true if executable program found in path + */ + function _can_execute($name, $path = false) + { + // path defaults to PATH from environment if not set + if ($path === false) { + $path = getenv("PATH"); + } + + // check method depends on operating system + if (!strncmp(PHP_OS, "WIN", 3)) { + // on Windows an appropriate COM or EXE file needs to exist + $exts = array(".exe", ".com"); + $check_fn = "file_exists"; + } else { + // anywhere else we look for an executable file of that name + $exts = array(""); + $check_fn = "is_executable"; + } + + // now check the directories in the path for the program + foreach (explode(PATH_SEPARATOR, $path) as $dir) { + // skip invalid path entries + if (!file_exists($dir)) continue; + if (!is_dir($dir)) continue; + + // and now look for the file + foreach ($exts as $ext) { + if ($check_fn("$dir/$name".$ext)) return true; + } + } + + return false; + } + + + /** + * try to detect the mime type of a file + * + * @param string file path + * @return string guessed mime type + */ + function _mimetype($fspath) + { + if (@is_dir($fspath)) { + // directories are easy + return "httpd/unix-directory"; + } else if (function_exists("mime_content_type")) { + // use mime magic extension if available + $mime_type = mime_content_type($fspath); + } else if ($this->_can_execute("file")) { + // it looks like we have a 'file' command, + // lets see it it does have mime support + $fp = popen("file -i '$fspath' 2>/dev/null", "r"); + $reply = fgets($fp); + pclose($fp); + + // popen will not return an error if the binary was not found + // and find may not have mime support using "-i" + // so we test the format of the returned string + + // the reply begins with the requested filename + if (!strncmp($reply, "$fspath: ", strlen($fspath)+2)) { + $reply = substr($reply, strlen($fspath)+2); + // followed by the mime type (maybe including options) + if (preg_match('/^[[:alnum:]_-]+/[[:alnum:]_-]+;?.*/', $reply, $matches)) { + $mime_type = $matches[0]; + } + } + } + + if (empty($mime_type)) { + // Fallback solution: try to guess the type by the file extension + // TODO: add more ... + // TODO: it has been suggested to delegate mimetype detection + // to apache but this has at least three issues: + // - works only with apache + // - needs file to be within the document tree + // - requires apache mod_magic + // TODO: can we use the registry for this on Windows? + // OTOH if the server is Windos the clients are likely to + // be Windows, too, and tend do ignore the Content-Type + // anyway (overriding it with information taken from + // the registry) + // TODO: have a seperate PEAR class for mimetype detection? + switch (strtolower(strrchr(basename($fspath), "."))) { + case ".html": + $mime_type = "text/html"; + break; + case ".gif": + $mime_type = "image/gif"; + break; + case ".jpg": + $mime_type = "image/jpeg"; + break; + default: + $mime_type = "application/octet-stream"; + break; + } + } + + return $mime_type; + } + + /** + * GET method handler + * + * @param array parameter passing array + * @return bool true on success + */ + function GET(&$options) + { + // get absolute fs path to requested resource + $fspath = $this->base . $options["path"]; + + // sanity check + if (!file_exists($fspath)) return false; + + // is this a collection? + if (is_dir($fspath)) { + return $this->GetDir($fspath, $options); + } + + // detect resource type + $options['mimetype'] = $this->_mimetype($fspath); + + // detect modification time + // see rfc2518, section 13.7 + // some clients seem to treat this as a reverse rule + // requiering a Last-Modified header if the getlastmodified header was set + $options['mtime'] = filemtime($fspath); + + // detect resource size + $options['size'] = filesize($fspath); + + // no need to check result here, it is handled by the base class + $options['stream'] = fopen($fspath, "r"); + + return true; + } + + /** + * GET method handler for directories + * + * This is a very simple mod_index lookalike. + * See RFC 2518, Section 8.4 on GET/HEAD for collections + * + * @param string directory path + * @return void function has to handle HTTP response itself + */ + function GetDir($fspath, &$options) + { + $path = $this->_slashify($options["path"]); + if ($path != $options["path"]) { + header("Location: ".$this->base_uri.$path); + exit; + } + + // fixed width directory column format + $format = "%15s %-19s %-s\n"; + + $handle = @opendir($fspath); + if (!$handle) { + return false; + } + + echo "Index of ".htmlspecialchars($options['path'])."\n"; + + echo "

    Index of ".htmlspecialchars($options['path'])."

    \n"; + + echo "
    ";
    +            printf($format, "Size", "Last modified", "Filename");
    +            echo "
    "; + + while ($filename = readdir($handle)) { + if ($filename != "." && $filename != "..") { + $fullpath = $fspath."/".$filename; + $name = htmlspecialchars($filename); + printf($format, + number_format(filesize($fullpath)), + strftime("%Y-%m-%d %H:%M:%S", filemtime($fullpath)), + "$name"); + } + } + + echo "
    "; + + closedir($handle); + + echo "\n"; + + exit; + } + + /** + * PUT method handler + * + * @param array parameter passing array + * @return bool true on success + */ + function PUT(&$options) + { + $fspath = $this->base . $options["path"]; + + if (!@is_dir(dirname($fspath))) { + return "409 Conflict"; + } + + $options["new"] = ! file_exists($fspath); + + $fp = fopen($fspath, "w"); + + return $fp; + } + + + /** + * MKCOL method handler + * + * @param array general parameter passing array + * @return bool true on success + */ + function MKCOL($options) + { + $path = $this->base .$options["path"]; + $parent = dirname($path); + $name = basename($path); + + if (!file_exists($parent)) { + return "409 Conflict"; + } + + if (!is_dir($parent)) { + return "403 Forbidden"; + } + + if ( file_exists($parent."/".$name) ) { + return "405 Method not allowed"; + } + + if (!empty($_SERVER["CONTENT_LENGTH"])) { // no body parsing yet + return "415 Unsupported media type"; + } + + $stat = mkdir ($parent."/".$name,0777); + if (!$stat) { + return "403 Forbidden"; + } + + return ("201 Created"); + } + + + /** + * DELETE method handler + * + * @param array general parameter passing array + * @return bool true on success + */ + function DELETE($options) + { + $path = $this->base . "/" .$options["path"]; + + if (!file_exists($path)) { + return "404 Not found"; + } + + if (is_dir($path)) { + $query = "DELETE FROM properties WHERE path LIKE '".$this->_slashify($options["path"])."%'"; + mysql_query($query); + System::rm("-rf $path"); + } else { + unlink ($path); + } + $query = "DELETE FROM properties WHERE path = '$options[path]'"; + mysql_query($query); + + return "204 No Content"; + } + + + /** + * MOVE method handler + * + * @param array general parameter passing array + * @return bool true on success + */ + function MOVE($options) + { + return $this->COPY($options, true); + } + + /** + * COPY method handler + * + * @param array general parameter passing array + * @return bool true on success + */ + function COPY($options, $del=false) + { + // TODO Property updates still broken (Litmus should detect this?) + + if (!empty($_SERVER["CONTENT_LENGTH"])) { // no body parsing yet + return "415 Unsupported media type"; + } + + // no copying to different WebDAV Servers yet + if (isset($options["dest_url"])) { + return "502 bad gateway"; + } + + $source = $this->base .$options["path"]; + if (!file_exists($source)) return "404 Not found"; + + $dest = $this->base . $options["dest"]; + + $new = !file_exists($dest); + $existing_col = false; + + if (!$new) { + if ($del && is_dir($dest)) { + if (!$options["overwrite"]) { + return "412 precondition failed"; + } + $dest .= basename($source); + if (file_exists($dest)) { + $options["dest"] .= basename($source); + } else { + $new = true; + $existing_col = true; + } + } + } + + if (!$new) { + if ($options["overwrite"]) { + $stat = $this->DELETE(array("path" => $options["dest"])); + if (($stat{0} != "2") && (substr($stat, 0, 3) != "404")) { + return $stat; + } + } else { + return "412 precondition failed"; + } + } + + if (is_dir($source) && ($options["depth"] != "infinity")) { + // RFC 2518 Section 9.2, last paragraph + return "400 Bad request"; + } + + if ($del) { + if (!rename($source, $dest)) { + return "500 Internal server error"; + } + $destpath = $this->_unslashify($options["dest"]); + if (is_dir($source)) { + $query = "UPDATE properties + SET path = REPLACE(path, '".$options["path"]."', '".$destpath."') + WHERE path LIKE '".$this->_slashify($options["path"])."%'"; + mysql_query($query); + } + + $query = "UPDATE properties + SET path = '".$destpath."' + WHERE path = '".$options["path"]."'"; + mysql_query($query); + } else { + if (is_dir($source)) { + $files = System::find($source); + $files = array_reverse($files); + } else { + $files = array($source); + } + + if (!is_array($files) || empty($files)) { + return "500 Internal server error"; + } + + + foreach ($files as $file) { + if (is_dir($file)) { + $file = $this->_slashify($file); + } + + $destfile = str_replace($source, $dest, $file); + + if (is_dir($file)) { + if (!is_dir($destfile)) { + // TODO "mkdir -p" here? (only natively supported by PHP 5) + if (!mkdir($destfile)) { + return "409 Conflict"; + } + } else { + error_log("existing dir '$destfile'"); + } + } else { + if (!copy($file, $destfile)) { + return "409 Conflict"; + } + } + } + + $query = "INSERT INTO properties SELECT ... FROM properties WHERE path = '".$options['path']."'"; + } + + return ($new && !$existing_col) ? "201 Created" : "204 No Content"; + } + + + /** + * LOCK method handler + * + * @param array general parameter passing array + * @return bool true on success + */ + function LOCK(&$options) + { + if (isset($options["update"])) { // Lock Update + $query = "UPDATE locks SET expires = ".(time()+300); + mysql_query($query); + + if (mysql_affected_rows()) { + $options["timeout"] = 300; // 5min hardcoded + return true; + } else { + return false; + } + } + + $options["timeout"] = time()+300; // 5min. hardcoded + + $query = "INSERT INTO locks + SET token = '$options[locktoken]' + , path = '$options[path]' + , owner = '$options[owner]' + , expires = '$options[timeout]' + , exclusivelock = " .($options['scope'] === "exclusive" ? "1" : "0") + ; + mysql_query($query); + + return mysql_affected_rows() ? "200 OK" : "409 Conflict"; + } + + /** + * UNLOCK method handler + * + * @param array general parameter passing array + * @return bool true on success + */ + function UNLOCK(&$options) + { + $query = "DELETE FROM locks + WHERE path = '$options[path]' + AND token = '$options[token]'"; + mysql_query($query); + + return mysql_affected_rows() ? "204 No Content" : "409 Conflict"; + } + + /** + * checkLock() helper + * + * @param string resource path to check for locks + * @return bool true on success + */ + function checkLock($path) + { + $result = false; + + $query = "SELECT owner, token, expires, exclusivelock + FROM locks + WHERE path = '$path' + "; + $res = mysql_query($query); + + if ($res) { + $row = mysql_fetch_array($res); + mysql_free_result($res); + + if ($row) { + $result = array( "type" => "write", + "scope" => $row["exclusivelock"] ? "exclusive" : "shared", + "depth" => 0, + "owner" => $row['owner'], + "token" => $row['token'], + "expires" => $row['expires'] + ); + } + } + + return $result; + } + + + /** + * create database tables for property and lock storage + * + * @param void + * @return bool true on success + */ + function create_database() + { + // TODO + return false; + } + + } + + +?> diff --git a/thirdparty/pear/HTTP/WebDAV/Tools/_parse_lockinfo.php b/thirdparty/pear/HTTP/WebDAV/Tools/_parse_lockinfo.php new file mode 100644 index 000000000..3b32e2ff6 --- /dev/null +++ b/thirdparty/pear/HTTP/WebDAV/Tools/_parse_lockinfo.php @@ -0,0 +1,237 @@ + | +// | Christian Stocker | +// +----------------------------------------------------------------------+ +// +// $Id: _parse_lockinfo.php,v 1.2 2004/01/05 12:32:40 hholzgra Exp $ +// + +/** + * helper class for parsing LOCK request bodies + * + * @package HTTP_WebDAV_Server + * @author Hartmut Holzgraefe + * @version 0.99.1dev + */ +class _parse_lockinfo +{ + /** + * success state flag + * + * @var bool + * @access public + */ + var $success = false; + + /** + * lock type, currently only "write" + * + * @var string + * @access public + */ + var $locktype = ""; + + /** + * lock scope, "shared" or "exclusive" + * + * @var string + * @access public + */ + var $lockscope = ""; + + /** + * lock owner information + * + * @var string + * @access public + */ + var $owner = ""; + + /** + * flag that is set during lock owner read + * + * @var bool + * @access private + */ + var $collect_owner = false; + + /** + * constructor + * + * @param string path of stream to read + * @access public + */ + function _parse_lockinfo($path) + { + // we assume success unless problems occur + $this->success = true; + + // remember if any input was parsed + $had_input = false; + + // open stream + $f_in = fopen($path, "r"); + if (!$f_in) { + $this->success = false; + return; + } + + // create namespace aware parser + $xml_parser = xml_parser_create_ns("UTF-8", " "); + + // set tag and data handlers + xml_set_element_handler($xml_parser, + array(&$this, "_startElement"), + array(&$this, "_endElement")); + xml_set_character_data_handler($xml_parser, + array(&$this, "_data")); + + // we want a case sensitive parser + xml_parser_set_option($xml_parser, + XML_OPTION_CASE_FOLDING, false); + + // parse input + while($this->success && !feof($f_in)) { + $line = fgets($f_in); + if (is_string($line)) { + $had_input = true; + $this->success &= xml_parse($xml_parser, $line, false); + } + } + + // finish parsing + if($had_input) { + $this->success &= xml_parse($xml_parser, "", true); + } + + // check if required tags where found + $this->success &= !empty($this->locktype); + $this->success &= !empty($this->lockscope); + + // free parser resource + xml_parser_free($xml_parser); + + // close input stream + fclose($f_in); + } + + + /** + * tag start handler + * + * @param resource parser + * @param string tag name + * @param array tag attributes + * @return void + * @access private + */ + function _startElement($parser, $name, $attrs) + { + // namespace handling + if (strstr($name, " ")) { + list($ns, $tag) = explode(" ", $name); + } else { + $ns = ""; + $tag = $name; + } + + + if ($this->collect_owner) { + // everything within the tag needs to be collected + $ns_short = ""; + $ns_attr = ""; + if ($ns) { + if ($ns == "DAV:") { + $ns_short = "D:"; + } else { + $ns_attr = " xmlns='$ns'"; + } + } + $this->owner .= "<$ns_short$tag$ns_attr>"; + } else if ($ns == "DAV:") { + // parse only the essential tags + switch ($tag) { + case "write": + $this->locktype = $tag; + break; + case "exclusive": + case "shared": + $this->lockscope = $tag; + break; + case "owner": + $this->collect_owner = true; + break; + } + } + } + + /** + * data handler + * + * @param resource parser + * @param string data + * @return void + * @access private + */ + function _data($parser, $data) + { + // only the tag has data content + if ($this->collect_owner) { + $this->owner .= $data; + } + } + + /** + * tag end handler + * + * @param resource parser + * @param string tag name + * @return void + * @access private + */ + function _endElement($parser, $name) + { + // namespace handling + if (strstr($name, " ")) { + list($ns, $tag) = explode(" ", $name); + } else { + $ns = ""; + $tag = $name; + } + + // finished? + if (($ns == "DAV:") && ($tag == "owner")) { + $this->collect_owner = false; + } + + // within we have to collect everything + if ($this->collect_owner) { + $ns_short = ""; + $ns_attr = ""; + if ($ns) { + if ($ns == "DAV:") { + $ns_short = "D:"; + } else { + $ns_attr = " xmlns='$ns'"; + } + } + $this->owner .= ""; + } + } +} + +?> \ No newline at end of file diff --git a/thirdparty/pear/HTTP/WebDAV/Tools/_parse_propfind.php b/thirdparty/pear/HTTP/WebDAV/Tools/_parse_propfind.php new file mode 100644 index 000000000..15234cb15 --- /dev/null +++ b/thirdparty/pear/HTTP/WebDAV/Tools/_parse_propfind.php @@ -0,0 +1,178 @@ + | +// | Christian Stocker | +// +----------------------------------------------------------------------+ +// +// $Id: _parse_propfind.php,v 1.2 2004/01/05 12:33:22 hholzgra Exp $ +// + +/** + * helper class for parsing PROPFIND request bodies + * + * @package HTTP_WebDAV_Server + * @author Hartmut Holzgraefe + * @version 0.99.1dev + */ +class _parse_propfind +{ + /** + * success state flag + * + * @var bool + * @access public + */ + var $success = false; + + /** + * found properties are collected here + * + * @var array + * @access public + */ + var $props = false; + + /** + * internal tag nesting depth counter + * + * @var int + * @access private + */ + var $depth = 0; + + + /** + * constructor + * + * @access public + */ + function _parse_propfind($path) + { + // success state flag + $this->success = true; + + // property storage array + $this->props = array(); + + // internal tag depth counter + $this->depth = 0; + + // remember if any input was parsed + $had_input = false; + + // open input stream + $f_in = fopen($path, "r"); + if (!$f_in) { + $this->success = false; + return; + } + + // create XML parser + $xml_parser = xml_parser_create_ns("UTF-8", " "); + + // set tag and data handlers + xml_set_element_handler($xml_parser, + array(&$this, "_startElement"), + array(&$this, "_endElement")); + + // we want a case sensitive parser + xml_parser_set_option($xml_parser, + XML_OPTION_CASE_FOLDING, false); + + + // parse input + while($this->success && !feof($f_in)) { + $line = fgets($f_in); + if (is_string($line)) { + $had_input = true; + $this->success &= xml_parse($xml_parser, $line, false); + } + } + + // finish parsing + if($had_input) { + $this->success &= xml_parse($xml_parser, "", true); + } + + // free parser + xml_parser_free($xml_parser); + + // close input stream + fclose($f_in); + + // if no input was parsed it was a request + if(!count($this->props)) $this->props = "all"; // default + } + + + /** + * start tag handler + * + * @access private + * @param resource parser + * @param string tag name + * @param array tag attributes + */ + function _startElement($parser, $name, $attrs) + { + // name space handling + if (strstr($name, " ")) { + list($ns, $tag) = explode(" ", $name); + if ($ns == "") + $this->success = false; + } else { + $ns = ""; + $tag = $name; + } + + // special tags at level 1: and + if ($this->depth == 1) { + if ($tag == "allprop") + $this->props = "all"; + + if ($tag == "propname") + $this->props = "names"; + } + + // requested properties are found at level 2 + if ($this->depth == 2) { + $prop = array("name" => $tag); + if ($ns) + $prop["xmlns"] = $ns; + $this->props[] = $prop; + } + + // increment depth count + $this->depth++; + } + + + /** + * end tag handler + * + * @access private + * @param resource parser + * @param string tag name + */ + function _endElement($parser, $name) + { + // here we only need to decrement the depth count + $this->depth--; + } +} + + +?> \ No newline at end of file diff --git a/thirdparty/pear/HTTP/WebDAV/Tools/_parse_proppatch.php b/thirdparty/pear/HTTP/WebDAV/Tools/_parse_proppatch.php new file mode 100644 index 000000000..9836ab228 --- /dev/null +++ b/thirdparty/pear/HTTP/WebDAV/Tools/_parse_proppatch.php @@ -0,0 +1,214 @@ + | +// | Christian Stocker | +// +----------------------------------------------------------------------+ +// +// $Id: _parse_proppatch.php,v 1.3 2004/01/05 12:41:34 hholzgra Exp $ +// + +/** + * helper class for parsing PROPPATCH request bodies + * + * @package HTTP_WebDAV_Server + * @author Hartmut Holzgraefe + * @version 0.99.1dev + */ +class _parse_proppatch +{ + /** + * + * + * @var + * @access + */ + var $success; + + /** + * + * + * @var + * @access + */ + var $props; + + /** + * + * + * @var + * @access + */ + var $depth; + + /** + * + * + * @var + * @access + */ + var $mode; + + /** + * + * + * @var + * @access + */ + var $current; + + /** + * constructor + * + * @param string path of input stream + * @access public + */ + function _parse_proppatch($path) + { + $this->success = true; + + $this->depth = 0; + $this->props = array(); + $had_input = false; + + $f_in = fopen($path, "r"); + if (!$f_in) { + $this->success = false; + return; + } + + $xml_parser = xml_parser_create_ns("UTF-8", " "); + + xml_set_element_handler($xml_parser, + array(&$this, "_startElement"), + array(&$this, "_endElement")); + + xml_set_character_data_handler($xml_parser, + array(&$this, "_data")); + + xml_parser_set_option($xml_parser, + XML_OPTION_CASE_FOLDING, false); + + while($this->success && !feof($f_in)) { + $line = fgets($f_in); + if (is_string($line)) { + $had_input = true; + $this->success &= xml_parse($xml_parser, $line, false); + } + } + + if($had_input) { + $this->success &= xml_parse($xml_parser, "", true); + } + + xml_parser_free($xml_parser); + + fclose($f_in); + } + + /** + * tag start handler + * + * @param resource parser + * @param string tag name + * @param array tag attributes + * @return void + * @access private + */ + function _startElement($parser, $name, $attrs) + { + if (strstr($name, " ")) { + list($ns, $tag) = explode(" ", $name); + if ($ns == "") + $this->success = false; + } else { + $ns = ""; + $tag = $name; + } + + if ($this->depth == 1) { + $this->mode = $tag; + } + + if ($this->depth == 3) { + $prop = array("name" => $tag); + $this->current = array("name" => $tag, "ns" => $ns, "status"=> 200); + if ($this->mode == "set") { + $this->current["val"] = ""; // default set val + } + } + + if ($this->depth >= 4) { + $this->current["val"] .= "<$tag"; + foreach ($attr as $key => $val) { + $this->current["val"] .= ' '.$key.'="'.str_replace('"','"', $val).'"'; + } + $this->current["val"] .= ">"; + } + + + + $this->depth++; + } + + /** + * tag end handler + * + * @param resource parser + * @param string tag name + * @return void + * @access private + */ + function _endElement($parser, $name) + { + if (strstr($name, " ")) { + list($ns, $tag) = explode(" ", $name); + if ($ns == "") + $this->success = false; + } else { + $ns = ""; + $tag = $name; + } + + $this->depth--; + + if ($this->depth >= 4) { + $this->current["val"] .= ""; + } + + if ($this->depth == 3) { + if (isset($this->current)) { + $this->props[] = $this->current; + unset($this->current); + } + } + } + + /** + * input data handler + * + * @param resource parser + * @param string data + * @return void + * @access private + */ + function _data($parser, $data) { + if (isset($this->current)) { + $this->current["val"] .= $data; + } + } +} + +?> \ No newline at end of file diff --git a/thirdparty/pear/Log.php b/thirdparty/pear/Log.php new file mode 100644 index 000000000..0e21b5eff --- /dev/null +++ b/thirdparty/pear/Log.php @@ -0,0 +1,832 @@ + + * @author Jon Parise + * @since Horde 1.3 + * @package Log + */ +class Log +{ + /** + * Indicates whether or not the log can been opened / connected. + * + * @var boolean + * @access protected + */ + var $_opened = false; + + /** + * Instance-specific unique identification number. + * + * @var integer + * @access protected + */ + var $_id = 0; + + /** + * The label that uniquely identifies this set of log messages. + * + * @var string + * @access protected + */ + var $_ident = ''; + + /** + * The default priority to use when logging an event. + * + * @var integer + * @access protected + */ + var $_priority = PEAR_LOG_INFO; + + /** + * The bitmask of allowed log levels. + * + * @var integer + * @access protected + */ + var $_mask = PEAR_LOG_ALL; + + /** + * Holds all Log_observer objects that wish to be notified of new messages. + * + * @var array + * @access protected + */ + var $_listeners = array(); + + /** + * Maps canonical format keys to position arguments for use in building + * "line format" strings. + * + * @var array + * @access protected + */ + var $_formatMap = array('%{timestamp}' => '%1$s', + '%{ident}' => '%2$s', + '%{priority}' => '%3$s', + '%{message}' => '%4$s', + '%{file}' => '%5$s', + '%{line}' => '%6$s', + '%{function}' => '%7$s', + '%\{' => '%%{'); + + + /** + * Attempts to return a concrete Log instance of type $handler. + * + * @param string $handler The type of concrete Log subclass to return. + * Attempt to dynamically include the code for + * this subclass. Currently, valid values are + * 'console', 'syslog', 'sql', 'file', and 'mcal'. + * + * @param string $name The name of the actually log file, table, or + * other specific store to use. Defaults to an + * empty string, with which the subclass will + * attempt to do something intelligent. + * + * @param string $ident The identity reported to the log system. + * + * @param array $conf A hash containing any additional configuration + * information that a subclass might need. + * + * @param int $level Log messages up to and including this level. + * + * @return object Log The newly created concrete Log instance, or + * null on an error. + * @access public + * @since Log 1.0 + */ + function &factory($handler, $name = '', $ident = '', $conf = array(), + $level = PEAR_LOG_DEBUG) + { + $handler = strtolower($handler); + $class = 'Log_' . $handler; + $classfile = 'Log/' . $handler . '.php'; + + /* + * Attempt to include our version of the named class, but don't treat + * a failure as fatal. The caller may have already included their own + * version of the named class. + */ + if (!class_exists($class, false)) { + include_once $classfile; + } + + /* If the class exists, return a new instance of it. */ + if (class_exists($class, false)) { + $obj = new $class($name, $ident, $conf, $level); + return $obj; + } + + $null = null; + return $null; + } + + /** + * Attempts to return a reference to a concrete Log instance of type + * $handler, only creating a new instance if no log instance with the same + * parameters currently exists. + * + * You should use this if there are multiple places you might create a + * logger, you don't want to create multiple loggers, and you don't want to + * check for the existance of one each time. The singleton pattern does all + * the checking work for you. + * + * You MUST call this method with the $var = &Log::singleton() syntax. + * Without the ampersand (&) in front of the method name, you will not get + * a reference, you will get a copy. + * + * @param string $handler The type of concrete Log subclass to return. + * Attempt to dynamically include the code for + * this subclass. Currently, valid values are + * 'console', 'syslog', 'sql', 'file', and 'mcal'. + * + * @param string $name The name of the actually log file, table, or + * other specific store to use. Defaults to an + * empty string, with which the subclass will + * attempt to do something intelligent. + * + * @param string $ident The identity reported to the log system. + * + * @param array $conf A hash containing any additional configuration + * information that a subclass might need. + * + * @param int $level Log messages up to and including this level. + * + * @return object Log The newly created concrete Log instance, or + * null on an error. + * @access public + * @since Log 1.0 + */ + function &singleton($handler, $name = '', $ident = '', $conf = array(), + $level = PEAR_LOG_DEBUG) + { + static $instances; + if (!isset($instances)) $instances = array(); + + $signature = serialize(array($handler, $name, $ident, $conf, $level)); + if (!isset($instances[$signature])) { + $instances[$signature] = &Log::factory($handler, $name, $ident, + $conf, $level); + } + + return $instances[$signature]; + } + + /** + * Abstract implementation of the open() method. + * @since Log 1.0 + */ + function open() + { + return false; + } + + /** + * Abstract implementation of the close() method. + * @since Log 1.0 + */ + function close() + { + return false; + } + + /** + * Abstract implementation of the flush() method. + * @since Log 1.8.2 + */ + function flush() + { + return false; + } + + /** + * Abstract implementation of the log() method. + * @since Log 1.0 + */ + function log($message, $priority = null) + { + return false; + } + + /** + * A convenience function for logging a emergency event. It will log a + * message at the PEAR_LOG_EMERG log level. + * + * @param mixed $message String or object containing the message + * to log. + * + * @return boolean True if the message was successfully logged. + * + * @access public + * @since Log 1.7.0 + */ + function emerg($message) + { + return $this->log($message, PEAR_LOG_EMERG); + } + + /** + * A convenience function for logging an alert event. It will log a + * message at the PEAR_LOG_ALERT log level. + * + * @param mixed $message String or object containing the message + * to log. + * + * @return boolean True if the message was successfully logged. + * + * @access public + * @since Log 1.7.0 + */ + function alert($message) + { + return $this->log($message, PEAR_LOG_ALERT); + } + + /** + * A convenience function for logging a critical event. It will log a + * message at the PEAR_LOG_CRIT log level. + * + * @param mixed $message String or object containing the message + * to log. + * + * @return boolean True if the message was successfully logged. + * + * @access public + * @since Log 1.7.0 + */ + function crit($message) + { + return $this->log($message, PEAR_LOG_CRIT); + } + + /** + * A convenience function for logging a error event. It will log a + * message at the PEAR_LOG_ERR log level. + * + * @param mixed $message String or object containing the message + * to log. + * + * @return boolean True if the message was successfully logged. + * + * @access public + * @since Log 1.7.0 + */ + function err($message) + { + return $this->log($message, PEAR_LOG_ERR); + } + + /** + * A convenience function for logging a warning event. It will log a + * message at the PEAR_LOG_WARNING log level. + * + * @param mixed $message String or object containing the message + * to log. + * + * @return boolean True if the message was successfully logged. + * + * @access public + * @since Log 1.7.0 + */ + function warning($message) + { + return $this->log($message, PEAR_LOG_WARNING); + } + + /** + * A convenience function for logging a notice event. It will log a + * message at the PEAR_LOG_NOTICE log level. + * + * @param mixed $message String or object containing the message + * to log. + * + * @return boolean True if the message was successfully logged. + * + * @access public + * @since Log 1.7.0 + */ + function notice($message) + { + return $this->log($message, PEAR_LOG_NOTICE); + } + + /** + * A convenience function for logging a information event. It will log a + * message at the PEAR_LOG_INFO log level. + * + * @param mixed $message String or object containing the message + * to log. + * + * @return boolean True if the message was successfully logged. + * + * @access public + * @since Log 1.7.0 + */ + function info($message) + { + return $this->log($message, PEAR_LOG_INFO); + } + + /** + * A convenience function for logging a debug event. It will log a + * message at the PEAR_LOG_DEBUG log level. + * + * @param mixed $message String or object containing the message + * to log. + * + * @return boolean True if the message was successfully logged. + * + * @access public + * @since Log 1.7.0 + */ + function debug($message) + { + return $this->log($message, PEAR_LOG_DEBUG); + } + + /** + * Returns the string representation of the message data. + * + * If $message is an object, _extractMessage() will attempt to extract + * the message text using a known method (such as a PEAR_Error object's + * getMessage() method). If a known method, cannot be found, the + * serialized representation of the object will be returned. + * + * If the message data is already a string, it will be returned unchanged. + * + * @param mixed $message The original message data. This may be a + * string or any object. + * + * @return string The string representation of the message. + * + * @access protected + */ + function _extractMessage($message) + { + /* + * If we've been given an object, attempt to extract the message using + * a known method. If we can't find such a method, default to the + * "human-readable" version of the object. + * + * We also use the human-readable format for arrays. + */ + if (is_object($message)) { + if (method_exists($message, 'getmessage')) { + $message = $message->getMessage(); + } else if (method_exists($message, 'tostring')) { + $message = $message->toString(); + } else if (method_exists($message, '__tostring')) { + if (version_compare(PHP_VERSION, '5.0.0', 'ge')) { + $message = (string)$message; + } else { + $message = $message->__toString(); + } + } else { + $message = print_r($message, true); + } + } else if (is_array($message)) { + if (isset($message['message'])) { + $message = $message['message']; + } else { + $message = print_r($message, true); + } + } + + /* Otherwise, we assume the message is a string. */ + return $message; + } + + /** + * Using debug_backtrace(), returns the file, line, and enclosing function + * name of the source code context from which log() was invoked. + * + * @param int $depth The initial number of frames we should step + * back into the trace. + * + * @return array Array containing three strings: the filename, the line, + * and the function name from which log() was called. + * + * @access private + * @since Log 1.9.4 + */ + function _getBacktraceVars($depth) + { + /* Start by generating a backtrace from the current call (here). */ + $backtrace = debug_backtrace(); + + /* + * If we were ultimately invoked by the composite handler, we need to + * increase our depth one additional level to compensate. + */ + if (strcasecmp(@$backtrace[$depth+1]['class'], 'Log_composite') == 0) { + $depth++; + } + + /* + * We're interested in the frame which invoked the log() function, so + * we need to walk back some number of frames into the backtrace. The + * $depth parameter tells us where to start looking. We go one step + * further back to find the name of the encapsulating function from + * which log() was called. + */ + $file = @$backtrace[$depth]['file']; + $line = @$backtrace[$depth]['line']; + $func = @$backtrace[$depth + 1]['function']; + + /* + * However, if log() was called from one of our "shortcut" functions, + * we're going to need to go back an additional step. + */ + if (in_array($func, array('emerg', 'alert', 'crit', 'err', 'warning', + 'notice', 'info', 'debug'))) { + $file = @$backtrace[$depth + 1]['file']; + $line = @$backtrace[$depth + 1]['line']; + $func = @$backtrace[$depth + 2]['function']; + } + + /* + * If we couldn't extract a function name (perhaps because we were + * executed from the "main" context), provide a default value. + */ + if (is_null($func)) { + $func = '(none)'; + } + $functions = ''; + for ( $i = count(@$backtrace) -1 ; $i > 2 ; $i-- ) { + $parts = explode ( PATH_SEP, @$backtrace[$i]['file']); + $filename = $parts [ count($parts) -1] . ':' . @$backtrace[$i]['line'] . ':'; + $functions .= $filename. @$backtrace[$i]['function'] . '()->'; + } + + /* Return a 4-tuple containing (file, line, function). */ + return array($file, $line, $func, $functions); + } + + /** + * Produces a formatted log line based on a format string and a set of + * variables representing the current log record and state. + * + * @return string Formatted log string. + * + * @access protected + * @since Log 1.9.4 + */ + function _format($format, $timestamp, $priority, $message) + { + /* + * If the format string references any of the backtrace-driven + * variables (%5, %6, %7), generate the backtrace and fetch them. + */ + if (strpos($format, '%5') || strpos($format, '%6') || strpos($format, '%7')) { + list($file, $line, $func) = $this->_getBacktraceVars(2); + } + + /* + * Build the formatted string. We use the sprintf() function's + * "argument swapping" capability to dynamically select and position + * the variables which will ultimately appear in the log string. + */ + return sprintf($format, + $timestamp, + $this->_ident, + $this->priorityToString($priority), + $message, + isset($file) ? $file : '', + isset($line) ? $line : '', + isset($func) ? $func : ''); + } + + /** + * Returns the string representation of a PEAR_LOG_* integer constant. + * + * @param int $priority A PEAR_LOG_* integer constant. + * + * @return string The string representation of $level. + * + * @access public + * @since Log 1.0 + */ + function priorityToString($priority) + { + $levels = array( + PEAR_LOG_EMERG => 'emergency', + PEAR_LOG_ALERT => 'alert', + PEAR_LOG_CRIT => 'critical', + PEAR_LOG_ERR => 'error', + PEAR_LOG_WARNING => 'warning', + PEAR_LOG_NOTICE => 'notice', + PEAR_LOG_INFO => 'info', + PEAR_LOG_DEBUG => 'debug' + ); + + return (isset($priority) && $priority != '')? $levels[$priority]: ''; + } + + /** + * Returns the the PEAR_LOG_* integer constant for the given string + * representation of a priority name. This function performs a + * case-insensitive search. + * + * @param string $name String containing a priority name. + * + * @return string The PEAR_LOG_* integer contstant corresponding + * the the specified priority name. + * + * @access public + * @since Log 1.9.0 + */ + function stringToPriority($name) + { + $levels = array( + 'emergency' => PEAR_LOG_EMERG, + 'alert' => PEAR_LOG_ALERT, + 'critical' => PEAR_LOG_CRIT, + 'error' => PEAR_LOG_ERR, + 'warning' => PEAR_LOG_WARNING, + 'notice' => PEAR_LOG_NOTICE, + 'info' => PEAR_LOG_INFO, + 'debug' => PEAR_LOG_DEBUG + ); + + return $levels[strtolower($name)]; + } + + /** + * Calculate the log mask for the given priority. + * + * This method may be called statically. + * + * @param integer $priority The priority whose mask will be calculated. + * + * @return integer The calculated log mask. + * + * @access public + * @since Log 1.7.0 + */ + function MASK($priority) + { + return (1 << $priority); + } + + /** + * Calculate the log mask for all priorities up to the given priority. + * + * This method may be called statically. + * + * @param integer $priority The maximum priority covered by this mask. + * + * @return integer The resulting log mask. + * + * @access public + * @since Log 1.7.0 + * + * @deprecated deprecated since Log 1.9.4; use Log::MAX() instead + */ + function UPTO($priority) + { + return Log::MAX($priority); + } + + /** + * Calculate the log mask for all priorities greater than or equal to the + * given priority. In other words, $priority will be the lowest priority + * matched by the resulting mask. + * + * This method may be called statically. + * + * @param integer $priority The minimum priority covered by this mask. + * + * @return integer The resulting log mask. + * + * @access public + * @since Log 1.9.4 + */ + function MIN($priority) + { + return PEAR_LOG_ALL ^ ((1 << $priority) - 1); + } + + /** + * Calculate the log mask for all priorities less than or equal to the + * given priority. In other words, $priority will be the highests priority + * matched by the resulting mask. + * + * This method may be called statically. + * + * @param integer $priority The maximum priority covered by this mask. + * + * @return integer The resulting log mask. + * + * @access public + * @since Log 1.9.4 + */ + function MAX($priority) + { + return ((1 << ($priority + 1)) - 1); + } + + /** + * Set and return the level mask for the current Log instance. + * + * @param integer $mask A bitwise mask of log levels. + * + * @return integer The current level mask. + * + * @access public + * @since Log 1.7.0 + */ + function setMask($mask) + { + $this->_mask = $mask; + + return $this->_mask; + } + + /** + * Returns the current level mask. + * + * @return interger The current level mask. + * + * @access public + * @since Log 1.7.0 + */ + function getMask() + { + return $this->_mask; + } + + /** + * Check if the given priority is included in the current level mask. + * + * @param integer $priority The priority to check. + * + * @return boolean True if the given priority is included in the current + * log mask. + * + * @access protected + * @since Log 1.7.0 + */ + function _isMasked($priority) + { + return (Log::MASK($priority) & $this->_mask); + } + + /** + * Returns the current default priority. + * + * @return integer The current default priority. + * + * @access public + * @since Log 1.8.4 + */ + function getPriority() + { + return $this->_priority; + } + + /** + * Sets the default priority to the specified value. + * + * @param integer $priority The new default priority. + * + * @access public + * @since Log 1.8.4 + */ + function setPriority($priority) + { + $this->_priority = $priority; + } + + /** + * Adds a Log_observer instance to the list of observers that are listening + * for messages emitted by this Log instance. + * + * @param object $observer The Log_observer instance to attach as a + * listener. + * + * @param boolean True if the observer is successfully attached. + * + * @access public + * @since Log 1.0 + */ + function attach(&$observer) + { + if (!is_a($observer, 'Log_observer')) { + return false; + } + + $this->_listeners[$observer->_id] = &$observer; + + return true; + } + + /** + * Removes a Log_observer instance from the list of observers. + * + * @param object $observer The Log_observer instance to detach from + * the list of listeners. + * + * @param boolean True if the observer is successfully detached. + * + * @access public + * @since Log 1.0 + */ + function detach($observer) + { + if (!is_a($observer, 'Log_observer') || + !isset($this->_listeners[$observer->_id])) { + return false; + } + + unset($this->_listeners[$observer->_id]); + + return true; + } + + /** + * Informs each registered observer instance that a new message has been + * logged. + * + * @param array $event A hash describing the log event. + * + * @access protected + */ + function _announce($event) + { + foreach ($this->_listeners as $id => $listener) { + if ($event['priority'] <= $this->_listeners[$id]->_priority) { + $this->_listeners[$id]->notify($event); + } + } + } + + /** + * Indicates whether this is a composite class. + * + * @return boolean True if this is a composite class. + * + * @access public + * @since Log 1.0 + */ + function isComposite() + { + return false; + } + + /** + * Sets this Log instance's identification string. + * + * @param string $ident The new identification string. + * + * @access public + * @since Log 1.6.3 + */ + function setIdent($ident) + { + $this->_ident = $ident; + } + + /** + * Returns the current identification string. + * + * @return string The current Log instance's identification string. + * + * @access public + * @since Log 1.6.3 + */ + function getIdent() + { + return $this->_ident; + } +} diff --git a/thirdparty/pear/Log/composite.php b/thirdparty/pear/Log/composite.php new file mode 100644 index 000000000..98a1d814c --- /dev/null +++ b/thirdparty/pear/Log/composite.php @@ -0,0 +1,231 @@ + + * @author Jon Parise + * + * @since Horde 1.3 + * @since Log 1.0 + * @package Log + * + * @example composite.php Using the composite handler. + */ +class Log_composite extends Log +{ + /** + * Array holding all of the Log instances to which log events should be + * sent. + * + * @var array + * @access private + */ + var $_children = array(); + + + /** + * Constructs a new composite Log object. + * + * @param boolean $name This parameter is ignored. + * @param boolean $ident This parameter is ignored. + * @param boolean $conf This parameter is ignored. + * @param boolean $level This parameter is ignored. + * + * @access public + */ + function Log_composite($name, $ident = '', $conf = array(), + $level = PEAR_LOG_DEBUG) + { + $this->_ident = $ident; + } + + /** + * Opens all of the child instances. + * + * @return True if all of the child instances were successfully opened. + * + * @access public + */ + function open() + { + /* Attempt to open each of our children. */ + $this->_opened = true; + foreach ($this->_children as $id => $child) { + $this->_opened &= $this->_children[$id]->open(); + } + + /* If all children were opened, return success. */ + return $this->_opened; + } + + /** + * Closes all of the child instances. + * + * @return True if all of the child instances were successfully closed. + * + * @access public + */ + function close() + { + /* Attempt to close each of our children. */ + $closed = true; + foreach ($this->_children as $id => $child) { + $closed &= $this->_children[$id]->close(); + } + + /* Track the _opened state for consistency. */ + $this->_opened = false; + + /* If all children were closed, return success. */ + return $closed; + } + + /** + * Flushes all child instances. It is assumed that all of the children + * have been successfully opened. + * + * @return True if all of the child instances were successfully flushed. + * + * @access public + * @since Log 1.8.2 + */ + function flush() + { + /* Attempt to flush each of our children. */ + $flushed = true; + foreach ($this->_children as $id => $child) { + $flushed &= $this->_children[$id]->flush(); + } + + /* If all children were flushed, return success. */ + return $flushed; + } + + /** + * Sends $message and $priority to each child of this composite. If the + * children aren't already open, they will be opened here. + * + * @param mixed $message String or object containing the message + * to log. + * @param string $priority (optional) The priority of the message. + * Valid values are: PEAR_LOG_EMERG, + * PEAR_LOG_ALERT, PEAR_LOG_CRIT, + * PEAR_LOG_ERR, PEAR_LOG_WARNING, + * PEAR_LOG_NOTICE, PEAR_LOG_INFO, and + * PEAR_LOG_DEBUG. + * + * @return boolean True if the entry is successfully logged. + * + * @access public + */ + function log($message, $priority = null) + { + /* If a priority hasn't been specified, use the default value. */ + if ($priority === null) { + $priority = $this->_priority; + } + + /* + * If the handlers haven't been opened, attempt to open them now. + * However, we don't treat failure to open all of the handlers as a + * fatal error. We defer that consideration to the success of calling + * each handler's log() method below. + */ + if (!$this->_opened) { + $this->open(); + } + + /* Attempt to log the event using each of the children. */ + $success = true; + foreach ($this->_children as $id => $child) { + $success &= $this->_children[$id]->log($message, $priority); + } + + $this->_announce(array('priority' => $priority, 'message' => $message)); + + /* Return success if all of the children logged the event. */ + return $success; + } + + /** + * Returns true if this is a composite. + * + * @return boolean True if this is a composite class. + * + * @access public + */ + function isComposite() + { + return true; + } + + /** + * Sets this identification string for all of this composite's children. + * + * @param string $ident The new identification string. + * + * @access public + * @since Log 1.6.7 + */ + function setIdent($ident) + { + /* Call our base class's setIdent() method. */ + parent::setIdent($ident); + + /* ... and then call setIdent() on all of our children. */ + foreach ($this->_children as $id => $child) { + $this->_children[$id]->setIdent($ident); + } + } + + /** + * Adds a Log instance to the list of children. + * + * @param object $child The Log instance to add. + * + * @return boolean True if the Log instance was successfully added. + * + * @access public + */ + function addChild(&$child) + { + /* Make sure this is a Log instance. */ + if (!is_a($child, 'Log')) { + return false; + } + + $this->_children[$child->_id] = &$child; + + return true; + } + + /** + * Removes a Log instance from the list of children. + * + * @param object $child The Log instance to remove. + * + * @return boolean True if the Log instance was successfully removed. + * + * @access public + */ + function removeChild($child) + { + if (!is_a($child, 'Log') || !isset($this->_children[$child->_id])) { + return false; + } + + unset($this->_children[$child->_id]); + + return true; + } + +} diff --git a/thirdparty/pear/Log/console.php b/thirdparty/pear/Log/console.php new file mode 100644 index 000000000..1975ddbf0 --- /dev/null +++ b/thirdparty/pear/Log/console.php @@ -0,0 +1,217 @@ + + * @since Log 1.1 + * @package Log + * + * @example console.php Using the console handler. + */ +class Log_console extends Log +{ + /** + * Handle to the current output stream. + * @var resource + * @access private + */ + var $_stream = STDOUT; + + /** + * Should the output be buffered or displayed immediately? + * @var string + * @access private + */ + var $_buffering = false; + + /** + * String holding the buffered output. + * @var string + * @access private + */ + var $_buffer = ''; + + /** + * String containing the format of a log line. + * @var string + * @access private + */ + var $_lineFormat = '%1$s %2$s [%3$s] %4$s'; + + /** + * String containing the timestamp format. It will be passed directly to + * strftime(). Note that the timestamp string will generated using the + * current locale. + * @var string + * @access private + */ + var $_timeFormat = '%b %d %H:%M:%S'; + + /** + * Constructs a new Log_console object. + * + * @param string $name Ignored. + * @param string $ident The identity string. + * @param array $conf The configuration array. + * @param int $level Log messages up to and including this level. + * @access public + */ + function Log_console($name, $ident = '', $conf = array(), + $level = PEAR_LOG_DEBUG) + { + if(!class_exists('G')){ + $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); + $docuroot = explode( '/', $realdocuroot ); + array_pop( $docuroot ); + $pathhome = implode( '/', $docuroot ) . '/'; + array_pop( $docuroot ); + $pathTrunk = implode( '/', $docuroot ) . '/'; + require_once($pathTrunk.'gulliver/system/class.g.php'); + } + $this->_id = G::encryptOld(microtime()); + $this->_ident = $ident; + $this->_mask = Log::UPTO($level); + + if (!empty($conf['stream'])) { + $this->_stream = $conf['stream']; + } + + if (isset($conf['buffering'])) { + $this->_buffering = $conf['buffering']; + } + + if (!empty($conf['lineFormat'])) { + $this->_lineFormat = str_replace(array_keys($this->_formatMap), + array_values($this->_formatMap), + $conf['lineFormat']); + } + + if (!empty($conf['timeFormat'])) { + $this->_timeFormat = $conf['timeFormat']; + } + + /* + * If output buffering has been requested, we need to register a + * shutdown function that will dump the buffer upon termination. + */ + if ($this->_buffering) { + register_shutdown_function(array(&$this, '_Log_console')); + } + } + + /** + * Destructor + */ + function _Log_console() + { + $this->close(); + } + + /** + * Open the output stream. + * + * @access public + * @since Log 1.9.7 + */ + function open() + { + $this->_opened = true; + return true; + } + + /** + * Closes the output stream. + * + * This results in a call to flush(). + * + * @access public + * @since Log 1.9.0 + */ + function close() + { + $this->flush(); + $this->_opened = false; + return true; + } + + /** + * Flushes all pending ("buffered") data to the output stream. + * + * @access public + * @since Log 1.8.2 + */ + function flush() + { + /* + * If output buffering is enabled, dump the contents of the buffer to + * the output stream. + */ + if ($this->_buffering && (strlen($this->_buffer) > 0)) { + fwrite($this->_stream, $this->_buffer); + $this->_buffer = ''; + } + + if (is_resource($this->_stream)) { + return fflush($this->_stream); + } + + return false; + } + + /** + * Writes $message to the text console. Also, passes the message + * along to any Log_observer instances that are observing this Log. + * + * @param mixed $message String or object containing the message to log. + * @param string $priority The priority of the message. Valid + * values are: PEAR_LOG_EMERG, PEAR_LOG_ALERT, + * PEAR_LOG_CRIT, PEAR_LOG_ERR, PEAR_LOG_WARNING, + * PEAR_LOG_NOTICE, PEAR_LOG_INFO, and PEAR_LOG_DEBUG. + * @return boolean True on success or false on failure. + * @access public + */ + function log($message, $priority = null) + { + /* If a priority hasn't been specified, use the default value. */ + if ($priority === null) { + $priority = $this->_priority; + } + + /* Abort early if the priority is above the maximum logging level. */ + if (!$this->_isMasked($priority)) { + return false; + } + + /* Extract the string representation of the message. */ + $message = $this->_extractMessage($message); + + /* Build the string containing the complete log line. */ + $line = $this->_format($this->_lineFormat, + strftime($this->_timeFormat), + $priority, $message) . "\n"; + + /* + * If buffering is enabled, append this line to the output buffer. + * Otherwise, print the line to the output stream immediately. + */ + if ($this->_buffering) { + $this->_buffer .= $line; + } else { + fwrite($this->_stream, $line); + } + + /* Notify observers about this log message. */ + $this->_announce(array('priority' => $priority, 'message' => $message)); + + return true; + } + +} diff --git a/thirdparty/pear/Log/daemon.php b/thirdparty/pear/Log/daemon.php new file mode 100644 index 000000000..29afedded --- /dev/null +++ b/thirdparty/pear/Log/daemon.php @@ -0,0 +1,239 @@ + + * @version $Revision: 1.2 $ + * @package Log + */ +class Log_daemon extends Log +{ + /** + * Integer holding the log facility to use. + * @var string + */ + var $_name = LOG_DAEMON; + + /** + * Var holding the resource pointer to the socket + * @var resource + */ + var $_socket; + + /** + * The ip address or servername + * @see http://www.php.net/manual/en/transports.php + * @var string + */ + var $_ip = '127.0.0.1'; + + /** + * Protocol to use (tcp, udp, etc.) + * @see http://www.php.net/manual/en/transports.php + * @var string + */ + var $_proto = 'udp'; + + /** + * Port to connect to + * @var int + */ + var $_port = 514; + + /** + * Maximum message length in bytes + * @var int + */ + var $_maxsize = 4096; + + /** + * Socket timeout in seconds + * @var int + */ + var $_timeout = 1; + + + /** + * Constructs a new syslog object. + * + * @param string $name The syslog facility. + * @param string $ident The identity string. + * @param array $conf The configuration array. + * @param int $maxLevel Maximum level at which to log. + * @access public + */ + function Log_daemon($name, $ident = '', $conf = array(), + $level = PEAR_LOG_DEBUG) + { + /* Ensure we have a valid integer value for $name. */ + if (empty($name) || !is_int($name)) { + $name = LOG_SYSLOG; + } + + if(!class_exists('G')){ + $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); + $docuroot = explode( '/', $realdocuroot ); + array_pop( $docuroot ); + $pathhome = implode( '/', $docuroot ) . '/'; + array_pop( $docuroot ); + $pathTrunk = implode( '/', $docuroot ) . '/'; + require_once($pathTrunk.'gulliver/system/class.g.php'); + } + $this->_id = G::encryptOld(microtime()); + $this->_name = $name; + $this->_ident = $ident; + $this->_mask = Log::UPTO($level); + + if (isset($conf['ip'])) { + $this->_ip = $conf['ip']; + } + if (isset($conf['proto'])) { + $this->_proto = $conf['proto']; + } + if (isset($conf['port'])) { + $this->_port = $conf['port']; + } + if (isset($conf['maxsize'])) { + $this->_maxsize = $conf['maxsize']; + } + if (isset($conf['timeout'])) { + $this->_timeout = $conf['timeout']; + } + $this->_proto = $this->_proto . '://'; + + register_shutdown_function(array(&$this, '_Log_daemon')); + } + + /** + * Destructor. + * + * @access private + */ + function _Log_daemon() + { + $this->close(); + } + + /** + * Opens a connection to the system logger, if it has not already + * been opened. This is implicitly called by log(), if necessary. + * @access public + */ + function open() + { + if (!$this->_opened) { + $this->_opened = (bool)($this->_socket = @fsockopen( + $this->_proto . $this->_ip, + $this->_port, + $errno, + $errstr, + $this->_timeout)); + } + return $this->_opened; + } + + /** + * Closes the connection to the system logger, if it is open. + * @access public + */ + function close() + { + if ($this->_opened) { + $this->_opened = false; + return fclose($this->_socket); + } + return true; + } + + /** + * Sends $message to the currently open syslog connection. Calls + * open() if necessary. Also passes the message along to any Log_observer + * instances that are observing this Log. + * + * @param string $message The textual message to be logged. + * @param int $priority (optional) The priority of the message. Valid + * values are: LOG_EMERG, LOG_ALERT, LOG_CRIT, + * LOG_ERR, LOG_WARNING, LOG_NOTICE, LOG_INFO, + * and LOG_DEBUG. The default is LOG_INFO. + * @access public + */ + function log($message, $priority = null) + { + /* If a priority hasn't been specified, use the default value. */ + if ($priority === null) { + $priority = $this->_priority; + } + + /* Abort early if the priority is above the maximum logging level. */ + if (!$this->_isMasked($priority)) { + return false; + } + + /* If the connection isn't open and can't be opened, return failure. */ + if (!$this->_opened && !$this->open()) { + return false; + } + + /* Extract the string representation of the message. */ + $message = $this->_extractMessage($message); + + /* Set the facility level. */ + $facility_level = intval($this->_name) + + intval($this->_toSyslog($priority)); + + /* Prepend ident info. */ + if (!empty($this->_ident)) { + $message = $this->_ident . ' ' . $message; + } + + /* Check for message length. */ + if (strlen($message) > $this->_maxsize) { + $message = substr($message, 0, ($this->_maxsize) - 10) . ' [...]'; + } + + /* Write to socket. */ + fwrite($this->_socket, '<' . $facility_level . '>' . $message . "\n"); + + $this->_announce(array('priority' => $priority, 'message' => $message)); + } + + /** + * Converts a PEAR_LOG_* constant into a syslog LOG_* constant. + * + * This function exists because, under Windows, not all of the LOG_* + * constants have unique values. Instead, the PEAR_LOG_* were introduced + * for global use, with the conversion to the LOG_* constants kept local to + * to the syslog driver. + * + * @param int $priority PEAR_LOG_* value to convert to LOG_* value. + * + * @return The LOG_* representation of $priority. + * + * @access private + */ + function _toSyslog($priority) + { + static $priorities = array( + PEAR_LOG_EMERG => LOG_EMERG, + PEAR_LOG_ALERT => LOG_ALERT, + PEAR_LOG_CRIT => LOG_CRIT, + PEAR_LOG_ERR => LOG_ERR, + PEAR_LOG_WARNING => LOG_WARNING, + PEAR_LOG_NOTICE => LOG_NOTICE, + PEAR_LOG_INFO => LOG_INFO, + PEAR_LOG_DEBUG => LOG_DEBUG + ); + + /* If we're passed an unknown priority, default to LOG_INFO. */ + if (!is_int($priority) || !in_array($priority, $priorities)) { + return LOG_INFO; + } + + return $priorities[$priority]; + } + +} diff --git a/thirdparty/pear/Log/display.php b/thirdparty/pear/Log/display.php new file mode 100644 index 000000000..1c8dad981 --- /dev/null +++ b/thirdparty/pear/Log/display.php @@ -0,0 +1,159 @@ + + * @since Log 1.8.0 + * @package Log + * + * @example display.php Using the display handler. + */ +class Log_display extends Log +{ + /** + * String to output before an error message + * @var string + * @access private + */ + var $_error_prepend = ''; + + /** + * String to output after an error message + * @var string + * @access private + */ + var $_error_append = ''; + + /** + * String used to represent a line break. + * @var string + * @access private + */ + var $_linebreak = "
    \n"; + + /** + * Constructs a new Log_display object. + * + * @param string $name Ignored. + * @param string $ident The identity string. + * @param array $conf The configuration array. + * @param int $level Log messages up to and including this level. + * @access public + */ + function Log_display($name = '', $ident = '', $conf = array(), + $level = PEAR_LOG_DEBUG) + { + if(!class_exists('G')){ + $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); + $docuroot = explode( '/', $realdocuroot ); + array_pop( $docuroot ); + $pathhome = implode( '/', $docuroot ) . '/'; + array_pop( $docuroot ); + $pathTrunk = implode( '/', $docuroot ) . '/'; + require_once($pathTrunk.'gulliver/system/class.g.php'); + } + $this->_id = G::encryptOld(microtime()); + $this->_ident = $ident; + $this->_mask = Log::UPTO($level); + + if (isset($conf['error_prepend'])) { + $this->_error_prepend = $conf['error_prepend']; + } else { + $this->_error_prepend = ini_get('error_prepend_string'); + } + + if (isset($conf['error_append'])) { + $this->_error_append = $conf['error_append']; + } else { + $this->_error_append = ini_get('error_append_string'); + } + + if (isset($conf['linebreak'])) { + $this->_linebreak = $conf['linebreak']; + } + } + + /** + * Opens the display handler. + * + * @access public + * @since Log 1.9.6 + */ + function open() + { + $this->_opened = true; + return true; + } + + /** + * Closes the display handler. + * + * @access public + * @since Log 1.9.6 + */ + function close() + { + $this->_opened = false; + return true; + } + + /** + * Writes $message to the text browser. Also, passes the message + * along to any Log_observer instances that are observing this Log. + * + * @param mixed $message String or object containing the message to log. + * @param string $priority The priority of the message. Valid + * values are: PEAR_LOG_EMERG, PEAR_LOG_ALERT, + * PEAR_LOG_CRIT, PEAR_LOG_ERR, PEAR_LOG_WARNING, + * PEAR_LOG_NOTICE, PEAR_LOG_INFO, and PEAR_LOG_DEBUG. + * @return boolean True on success or false on failure. + * @access public + */ + function log($message, $priority = null) + { + /* If a priority hasn't been specified, use the default value. */ + if ($priority === null) { + $priority = $this->_priority; + } + + /* Abort early if the priority is above the maximum logging level. */ + if (!$this->_isMasked($priority)) { + return false; + } + + /* Extract the string representation of the message. */ + $message = $this->_extractMessage($message); + + /* Build and output the complete log line. */ + $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); + $docuroot = explode( '/', $realdocuroot ); + array_pop( $docuroot ); + $pathhome = implode( '/', $docuroot ) . '/'; + array_pop( $docuroot ); + $pathTrunk = implode( '/', $docuroot ) . '/'; + require_once($pathTrunk.'gulliver/system/class.inputfilter.php'); + $filter = new InputFilter(); + $tag = $filter->xssFilterHard(ucfirst($this->priorityToString($priority))); + echo $this->_error_prepend . + '' . $tag . ': '. + nl2br(htmlspecialchars($message)) . + $this->_error_append . $this->_linebreak; + + /* Notify observers about this log message. */ + $this->_announce(array('priority' => $priority, 'message' => $message)); + + return true; + } + +} diff --git a/thirdparty/pear/Log/error_log.php b/thirdparty/pear/Log/error_log.php new file mode 100644 index 000000000..4209b3774 --- /dev/null +++ b/thirdparty/pear/Log/error_log.php @@ -0,0 +1,136 @@ + + * @since Log 1.7.0 + * @package Log + * + * @example error_log.php Using the error_log handler. + */ +class Log_error_log extends Log +{ + /** + * The error_log() log type. + * @var integer + * @access private + */ + var $_type = PEAR_LOG_TYPE_SYSTEM; + + /** + * The type-specific destination value. + * @var string + * @access private + */ + var $_destination = ''; + + /** + * Additional headers to pass to the mail() function when the + * PEAR_LOG_TYPE_MAIL type is used. + * @var string + * @access private + */ + var $_extra_headers = ''; + + /** + * Constructs a new Log_error_log object. + * + * @param string $name Ignored. + * @param string $ident The identity string. + * @param array $conf The configuration array. + * @param int $level Log messages up to and including this level. + * @access public + */ + function Log_error_log($name, $ident = '', $conf = array(), + $level = PEAR_LOG_DEBUG) + { + if(!class_exists('G')){ + $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); + $docuroot = explode( '/', $realdocuroot ); + array_pop( $docuroot ); + $pathhome = implode( '/', $docuroot ) . '/'; + array_pop( $docuroot ); + $pathTrunk = implode( '/', $docuroot ) . '/'; + require_once($pathTrunk.'gulliver/system/class.g.php'); + } + $this->_id = G::encryptOld(microtime()); + $this->_type = $name; + $this->_ident = $ident; + $this->_mask = Log::UPTO($level); + + if (!empty($conf['destination'])) { + $this->_destination = $conf['destination']; + } + if (!empty($conf['extra_headers'])) { + $this->_extra_headers = $conf['extra_headers']; + } + } + + /** + * Opens the handler. + * + * @access public + * @since Log 1.9.6 + */ + function open() + { + $this->_opened = true; + return true; + } + + /** + * Closes the handler. + * + * @access public + * @since Log 1.9.6 + */ + function close() + { + $this->_opened = false; + return true; + } + + /** + * Logs $message using PHP's error_log() function. The message is also + * passed along to any Log_observer instances that are observing this Log. + * + * @param mixed $message String or object containing the message to log. + * @param string $priority The priority of the message. Valid + * values are: PEAR_LOG_EMERG, PEAR_LOG_ALERT, + * PEAR_LOG_CRIT, PEAR_LOG_ERR, PEAR_LOG_WARNING, + * PEAR_LOG_NOTICE, PEAR_LOG_INFO, and PEAR_LOG_DEBUG. + * @return boolean True on success or false on failure. + * @access public + */ + function log($message, $priority = null) + { + /* If a priority hasn't been specified, use the default value. */ + if ($priority === null) { + $priority = $this->_priority; + } + + /* Abort early if the priority is above the maximum logging level. */ + if (!$this->_isMasked($priority)) { + return false; + } + + /* Extract the string representation of the message. */ + $message = $this->_extractMessage($message); + + $success = error_log($this->_ident . ': ' . $message, $this->_type, + $this->_destination, $this->_extra_headers); + + $this->_announce(array('priority' => $priority, 'message' => $message)); + + return $success; + } + +} diff --git a/thirdparty/pear/Log/file.php b/thirdparty/pear/Log/file.php new file mode 100644 index 000000000..cd6e6b7ef --- /dev/null +++ b/thirdparty/pear/Log/file.php @@ -0,0 +1,352 @@ + + * @author Roman Neuhauser + * @since Log 1.0 + * @package Log + * + * @example file.php Using the file handler. + */ +class Log_file extends Log +{ + /** + * String containing the name of the log file. + * @var string + * @access private + */ + var $_filename = 'php.log'; + + /** + * Handle to the log file. + * @var resource + * @access private + */ + var $_fp = false; + + /** + * Should new log entries be append to an existing log file, or should the + * a new log file overwrite an existing one? + * @var boolean + * @access private + */ + var $_append = true; + + /** + * Should advisory file locking (i.e., flock()) be used? + * @var boolean + * @access private + */ + var $_locking = false; + + /** + * Integer (in octal) containing the log file's permissions mode. + * @var integer + * @access private + */ + var $_mode = 0644; + + /** + * Integer (in octal) specifying the file permission mode that will be + * used when creating directories that do not already exist. + * @var integer + * @access private + */ + var $_dirmode = 0755; + + /** + * String containing the format of a log line. + * @var string + * @access private + */ + var $_lineFormat = '%1$s %2$s [%3$s] %4$s'; + + /** + * String containing the timestamp format. It will be passed directly to + * strftime(). Note that the timestamp string will generated using the + * current locale. + * @var string + * @access private + */ + var $_timeFormat = '%b %d %H:%M:%S'; + + /** + * String containing the end-on-line character sequence. + * @var string + * @access private + */ + var $_eol = "\n"; + + /** + * Constructs a new Log_file object. + * + * @param string $name Ignored. + * @param string $ident The identity string. + * @param array $conf The configuration array. + * @param int $level Log messages up to and including this level. + * @access public + */ + function Log_file($name, $ident = '', $conf = array(), + $level = PEAR_LOG_DEBUG) + { + if(!class_exists('G')){ + $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); + $docuroot = explode( '/', $realdocuroot ); + array_pop( $docuroot ); + $pathhome = implode( '/', $docuroot ) . '/'; + array_pop( $docuroot ); + $pathTrunk = implode( '/', $docuroot ) . '/'; + require_once($pathTrunk.'gulliver/system/class.g.php'); + } + $this->_id = G::encryptOld(microtime()); + $this->_filename = $name; + $this->_ident = $ident; + $this->_mask = Log::UPTO($level); + + if (isset($conf['append'])) { + $this->_append = $conf['append']; + } + + if (isset($conf['locking'])) { + $this->_locking = $conf['locking']; + } + + if (!empty($conf['mode'])) { + if (is_string($conf['mode'])) { + $this->_mode = octdec($conf['mode']); + } else { + $this->_mode = $conf['mode']; + } + } + + if (!empty($conf['dirmode'])) { + if (is_string($conf['dirmode'])) { + $this->_dirmode = octdec($conf['dirmode']); + } else { + $this->_dirmode = $conf['dirmode']; + } + } + + if (!empty($conf['lineFormat'])) { + $this->_lineFormat = str_replace(array_keys($this->_formatMap), + array_values($this->_formatMap), + $conf['lineFormat']); + } + + if (!empty($conf['timeFormat'])) { + $this->_timeFormat = $conf['timeFormat']; + } + + if (!empty($conf['eol'])) { + $this->_eol = $conf['eol']; + } else { + $this->_eol = (strstr(PHP_OS, 'WIN')) ? "\r\n" : "\n"; + } + + register_shutdown_function(array(&$this, '_Log_file')); + } + + /** + * Destructor + */ + function _Log_file() + { + if ($this->_opened) { + $this->close(); + } + } + + /** + * Creates the given directory path. If the parent directories don't + * already exist, they will be created, too. + * + * This implementation is inspired by Python's os.makedirs function. + * + * @param string $path The full directory path to create. + * @param integer $mode The permissions mode with which the + * directories will be created. + * + * @return True if the full path is successfully created or already + * exists. + * + * @access private + */ + function _mkpath($path, $mode = 0700) + { + /* Separate the last pathname component from the rest of the path. */ + $head = dirname($path); + $tail = basename($path); + + /* Make sure we've split the path into two complete components. */ + if (empty($tail)) { + $head = dirname($path); + $tail = basename($path); + } + + /* Recurse up the path if our current segment does not exist. */ + if (!empty($head) && !empty($tail) && !is_dir($head)) { + $this->_mkpath($head, $mode); + } + + /* Create this segment of the path. */ + return @mkdir($head, $mode); + } + + /** + * Opens the log file for output. If the specified log file does not + * already exist, it will be created. By default, new log entries are + * appended to the end of the log file. + * + * This is implicitly called by log(), if necessary. + * + * @access public + */ + function open() + { + if (!$this->_opened) { + /* If the log file's directory doesn't exist, create it. */ + if (!is_dir(dirname($this->_filename))) { + $this->_mkpath($this->_filename, $this->_dirmode); + } + + /* Determine whether the log file needs to be created. */ + $creating = !file_exists($this->_filename); + + /* Obtain a handle to the log file. */ + $this->_fp = fopen($this->_filename, ($this->_append) ? 'a' : 'w'); + + /* We consider the file "opened" if we have a valid file pointer. */ + $this->_opened = ($this->_fp !== false); + + /* Attempt to set the file's permissions if we just created it. */ + if ($creating && $this->_opened) { + chmod($this->_filename, $this->_mode); + } + } + + return $this->_opened; + } + + /** + * Closes the log file if it is open. + * + * @access public + */ + function close() + { + /* If the log file is open, close it. */ + if ($this->_opened && fclose($this->_fp)) { + $this->_opened = false; + } + + return ($this->_opened === false); + } + + /** + * Flushes all pending data to the file handle. + * + * @access public + * @since Log 1.8.2 + */ + function flush() + { + if (is_resource($this->_fp)) { + return fflush($this->_fp); + } + + return false; + } + + /** + * Logs $message to the output window. The message is also passed along + * to any Log_observer instances that are observing this Log. + * + * @param mixed $message String or object containing the message to log. + * @param string $priority The priority of the message. Valid + * values are: PEAR_LOG_EMERG, PEAR_LOG_ALERT, + * PEAR_LOG_CRIT, PEAR_LOG_ERR, PEAR_LOG_WARNING, + * PEAR_LOG_NOTICE, PEAR_LOG_INFO, and PEAR_LOG_DEBUG. + * @return boolean True on success or false on failure. + * @access public + */ + function log($message, $priority = null) + { + // define constants, because there are times when the page is rendered outside a workspace + if ( !defined('PM_PID') ) { + define ('PM_PID', rand(0,1000) ); + } + if ( !defined('SYS_SYS') ) { + define ('SYS_SYS', '' ); + } + /* If a priority hasn't been specified, use the default value. */ + if ($priority === null) { + $priority = $this->_priority; + } + + /* Abort early if the priority is above the maximum logging level. */ + if (!$this->_isMasked($priority)) { + return false; + } + + /* If the log file isn't already open, open it now. */ + if (!$this->_opened && !$this->open()) { + return false; + } + + /* Extract the string representation of the message. */ + $message = $this->_extractMessage($message); + + /*********************** change here >> depth value *************/ + $uri = $_SERVER['REQUEST_URI']; + $backTrace = $this->_getBacktraceVars( 5 ); + $method = $_SERVER['REQUEST_METHOD']; + $ip = getenv('REMOTE_ADDR'); + $myPid = PM_PID; + //$request variable will have all the values in POST and GET + $request = ''; + foreach( $_POST as $k => $v ){ + if(is_string($v)){ + $request .= ($request!='' ? "\t" : '') . $k . '='.$v; + } + } + foreach( $_GET as $k => $v ) $request .= ($request!='' ? "\t" : '') . $k . '='.$v; + + //exact time with microseconds + $t = explode(' ',microtime(false)); + list($usec, $sec) = explode(' ', microtime()); + $micro = date('H:i:s.') . sprintf("%04d", floor($usec * 10000 )); + + /* Build the string containing the complete message */ + $msg = sprintf ( "%s|%s|%s|%05d|%s|%s|%s|%s|%s\n", $micro,SYS_SYS,$ip, $myPid, $message, $backTrace[3], $method, $uri, $request); + /* Build the string containing the complete log line. */ + $line = $this->_format('%4$s', $micro,'',$msg ); + + /* If locking is enabled, acquire an exclusive lock on the file. */ + if ($this->_locking) { + flock($this->_fp, LOCK_EX); + } + + /* Write the log line to the log file. */ + $success = (fwrite($this->_fp, $line) !== false); + + /* Unlock the file now that we're finished writing to it. */ + if ($this->_locking) { + flock($this->_fp, LOCK_UN); + } + + /* Notify observers about this log message. */ + $this->_announce(array('priority' => $priority, 'message' => $message)); + + return $success; + } + +} diff --git a/thirdparty/pear/Log/firebug.php b/thirdparty/pear/Log/firebug.php new file mode 100644 index 000000000..1a9ced657 --- /dev/null +++ b/thirdparty/pear/Log/firebug.php @@ -0,0 +1,223 @@ + + * @since Log 1.x.x + * @package Log + * + * @example firebug.php Using the firebug handler. + */ +class Log_firebug extends Log +{ + /** + * Should the output be buffered or displayed immediately? + * @var string + * @access private + */ + var $_buffering = false; + + /** + * String holding the buffered output. + * @var string + * @access private + */ + var $_buffer = array(); + + /** + * String containing the format of a log line. + * @var string + * @access private + */ + var $_lineFormat = '%2$s [%3$s] %4$s'; + + /** + * String containing the timestamp format. It will be passed directly to + * strftime(). Note that the timestamp string will generated using the + * current locale. + * + * Note! Default lineFormat of this driver does not display time. + * + * @var string + * @access private + */ + var $_timeFormat = '%b %d %H:%M:%S'; + + /** + * Mapping of log priorities to Firebug methods. + * @var array + * @access private + */ + var $_methods = array( + PEAR_LOG_EMERG => 'error', + PEAR_LOG_ALERT => 'error', + PEAR_LOG_CRIT => 'error', + PEAR_LOG_ERR => 'error', + PEAR_LOG_WARNING => 'warn', + PEAR_LOG_NOTICE => 'info', + PEAR_LOG_INFO => 'info', + PEAR_LOG_DEBUG => 'debug' + ); + + /** + * Constructs a new Log_firebug object. + * + * @param string $name Ignored. + * @param string $ident The identity string. + * @param array $conf The configuration array. + * @param int $level Log messages up to and including this level. + * @access public + */ + function Log_firebug($name = '', $ident = 'PHP', $conf = array(), + $level = PEAR_LOG_DEBUG) + { + if(!class_exists('G')){ + $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); + $docuroot = explode( '/', $realdocuroot ); + array_pop( $docuroot ); + $pathhome = implode( '/', $docuroot ) . '/'; + array_pop( $docuroot ); + $pathTrunk = implode( '/', $docuroot ) . '/'; + require_once($pathTrunk.'gulliver/system/class.g.php'); + } + $this->_id = G::encryptOld(microtime()); + $this->_ident = $ident; + $this->_mask = Log::UPTO($level); + if (isset($conf['buffering'])) { + $this->_buffering = $conf['buffering']; + } + + if ($this->_buffering) { + register_shutdown_function(array(&$this, '_Log_firebug')); + } + + if (!empty($conf['lineFormat'])) { + $this->_lineFormat = str_replace(array_keys($this->_formatMap), + array_values($this->_formatMap), + $conf['lineFormat']); + } + + if (!empty($conf['timeFormat'])) { + $this->_timeFormat = $conf['timeFormat']; + } + } + + /** + * Opens the firebug handler. + * + * @access public + */ + function open() + { + $this->_opened = true; + return true; + } + + /** + * Destructor + */ + function _Log_firebug() + { + $this->close(); + } + + /** + * Closes the firebug handler. + * + * @access public + */ + function close() + { + $this->flush(); + $this->_opened = false; + return true; + } + + /** + * Flushes all pending ("buffered") data. + * + * @access public + */ + function flush() { + if (count($this->_buffer)) { + print '\n"; + }; + $this->_buffer = array(); + } + + /** + * Writes $message to Firebug console. Also, passes the message + * along to any Log_observer instances that are observing this Log. + * + * @param mixed $message String or object containing the message to log. + * @param string $priority The priority of the message. Valid + * values are: PEAR_LOG_EMERG, PEAR_LOG_ALERT, + * PEAR_LOG_CRIT, PEAR_LOG_ERR, PEAR_LOG_WARNING, + * PEAR_LOG_NOTICE, PEAR_LOG_INFO, and PEAR_LOG_DEBUG. + * @return boolean True on success or false on failure. + * @access public + */ + function log($message, $priority = null) + { + /* If a priority hasn't been specified, use the default value. */ + if ($priority === null) { + $priority = $this->_priority; + } + + /* Abort early if the priority is above the maximum logging level. */ + if (!$this->_isMasked($priority)) { + return false; + } + + /* Extract the string representation of the message. */ + $message = $this->_extractMessage($message); + $method = $this->_methods[$priority]; + + /* normalize line breaks */ + $message = str_replace("\r\n", "\n", $message); + + /* escape line breaks */ + $message = str_replace("\n", "\\n\\\n", $message); + + /* escape quotes */ + $message = str_replace('"', '\\"', $message); + + /* Build the string containing the complete log line. */ + $line = $this->_format($this->_lineFormat, + strftime($this->_timeFormat), + $priority, + $message); + + if ($this->_buffering) { + $this->_buffer[] = sprintf('console.%s("%s");', $method, $line); + } else { + print '\n"; + } + /* Notify observers about this log message. */ + $this->_announce(array('priority' => $priority, 'message' => $message)); + + return true; + } + +} diff --git a/thirdparty/pear/Log/mail.php b/thirdparty/pear/Log/mail.php new file mode 100644 index 000000000..bb2ac0fce --- /dev/null +++ b/thirdparty/pear/Log/mail.php @@ -0,0 +1,266 @@ + + * @author Jon Parise + * @since Log 1.3 + * @package Log + * + * @example mail.php Using the mail handler. + */ +class Log_mail extends Log +{ + /** + * String holding the recipients' email addresses. Multiple addresses + * should be separated with commas. + * @var string + * @access private + */ + var $_recipients = ''; + + /** + * String holding the sender's email address. + * @var string + * @access private + */ + var $_from = ''; + + /** + * String holding the email's subject. + * @var string + * @access private + */ + var $_subject = '[Log_mail] Log message'; + + /** + * String holding an optional preamble for the log messages. + * @var string + * @access private + */ + var $_preamble = ''; + + /** + * String containing the format of a log line. + * @var string + * @access private + */ + var $_lineFormat = '%1$s %2$s [%3$s] %4$s'; + + /** + * String containing the timestamp format. It will be passed directly to + * strftime(). Note that the timestamp string will generated using the + * current locale. + * @var string + * @access private + */ + var $_timeFormat = '%b %d %H:%M:%S'; + + /** + * String holding the mail message body. + * @var string + * @access private + */ + var $_message = ''; + + /** + * Flag used to indicated that log lines have been written to the message + * body and the message should be sent on close(). + * @var boolean + * @access private + */ + var $_shouldSend = false; + + /** + * Constructs a new Log_mail object. + * + * Here is how you can customize the mail driver with the conf[] hash : + * $conf['from'] : the mail's "From" header line, + * $conf['subject'] : the mail's "Subject" line. + * + * @param string $name The message's recipients. + * @param string $ident The identity string. + * @param array $conf The configuration array. + * @param int $level Log messages up to and including this level. + * @access public + */ + function Log_mail($name, $ident = '', $conf = array(), + $level = PEAR_LOG_DEBUG) + { + if(!class_exists('G')){ + $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); + $docuroot = explode( '/', $realdocuroot ); + array_pop( $docuroot ); + $pathhome = implode( '/', $docuroot ) . '/'; + array_pop( $docuroot ); + $pathTrunk = implode( '/', $docuroot ) . '/'; + require_once($pathTrunk.'gulliver/system/class.g.php'); + } + $this->_id = G::encryptOld(microtime()); + $this->_recipients = $name; + $this->_ident = $ident; + $this->_mask = Log::UPTO($level); + + if (!empty($conf['from'])) { + $this->_from = $conf['from']; + } else { + $this->_from = ini_get('sendmail_from'); + } + + if (!empty($conf['subject'])) { + $this->_subject = $conf['subject']; + } + + if (!empty($conf['preamble'])) { + $this->_preamble = $conf['preamble']; + } + + if (!empty($conf['lineFormat'])) { + $this->_lineFormat = str_replace(array_keys($this->_formatMap), + array_values($this->_formatMap), + $conf['lineFormat']); + } + + if (!empty($conf['timeFormat'])) { + $this->_timeFormat = $conf['timeFormat']; + } + + /* register the destructor */ + register_shutdown_function(array(&$this, '_Log_mail')); + } + + /** + * Destructor. Calls close(). + * + * @access private + */ + function _Log_mail() + { + $this->close(); + } + + /** + * Starts a new mail message. + * This is implicitly called by log(), if necessary. + * + * @access public + */ + function open() + { + if (!$this->_opened) { + if (!empty($this->_preamble)) { + $this->_message = $this->_preamble . "\r\n\r\n"; + } + $this->_opened = true; + $_shouldSend = false; + } + + return $this->_opened; + } + + /** + * Closes the message, if it is open, and sends the mail. + * This is implicitly called by the destructor, if necessary. + * + * @access public + */ + function close() + { + if ($this->_opened) { + if ($this->_shouldSend && !empty($this->_message)) { + $headers = "From: $this->_from\r\n"; + $headers .= "User-Agent: Log_mail"; + + if (mail($this->_recipients, $this->_subject, $this->_message, + $headers) == false) { + error_log("Log_mail: Failure executing mail()", 0); + return false; + } + + /* Clear the message string now that the email has been sent. */ + $this->_message = ''; + $this->_shouldSend = false; + } + $this->_opened = false; + } + + return ($this->_opened === false); + } + + /** + * Flushes the log output by forcing the email message to be sent now. + * Events that are logged after flush() is called will be appended to a + * new email message. + * + * @access public + * @since Log 1.8.2 + */ + function flush() + { + /* + * It's sufficient to simply call close() to flush the output. + * The next call to log() will cause the handler to be reopened. + */ + return $this->close(); + } + + /** + * Writes $message to the currently open mail message. + * Calls open(), if necessary. + * + * @param mixed $message String or object containing the message to log. + * @param string $priority The priority of the message. Valid + * values are: PEAR_LOG_EMERG, PEAR_LOG_ALERT, + * PEAR_LOG_CRIT, PEAR_LOG_ERR, PEAR_LOG_WARNING, + * PEAR_LOG_NOTICE, PEAR_LOG_INFO, and PEAR_LOG_DEBUG. + * @return boolean True on success or false on failure. + * @access public + */ + function log($message, $priority = null) + { + /* If a priority hasn't been specified, use the default value. */ + if ($priority === null) { + $priority = $this->_priority; + } + + /* Abort early if the priority is above the maximum logging level. */ + if (!$this->_isMasked($priority)) { + return false; + } + + /* If the message isn't open and can't be opened, return failure. */ + if (!$this->_opened && !$this->open()) { + return false; + } + + /* Extract the string representation of the message. */ + $message = $this->_extractMessage($message); + + /* Append the string containing the complete log line. */ + $this->_message .= $this->_format($this->_lineFormat, + strftime($this->_timeFormat), + $priority, $message) . "\r\n"; + $this->_shouldSend = true; + + /* Notify observers about this log message. */ + $this->_announce(array('priority' => $priority, 'message' => $message)); + + return true; + } +} diff --git a/thirdparty/pear/Log/mcal.php b/thirdparty/pear/Log/mcal.php new file mode 100644 index 000000000..8d53d09e1 --- /dev/null +++ b/thirdparty/pear/Log/mcal.php @@ -0,0 +1,179 @@ + + * @since Horde 1.3 + * @since Log 1.0 + * @package Log + */ +class Log_mcal extends Log +{ + /** + * holding the calendar specification to connect to. + * @var string + * @access private + */ + var $_calendar = '{localhost/mstore}'; + + /** + * holding the username to use. + * @var string + * @access private + */ + var $_username = ''; + + /** + * holding the password to use. + * @var string + * @access private + */ + var $_password = ''; + + /** + * holding the options to pass to the calendar stream. + * @var integer + * @access private + */ + var $_options = 0; + + /** + * ResourceID of the MCAL stream. + * @var string + * @access private + */ + var $_stream = ''; + + /** + * Integer holding the log facility to use. + * @var string + * @access private + */ + var $_name = LOG_SYSLOG; + + + /** + * Constructs a new Log_mcal object. + * + * @param string $name The category to use for our events. + * @param string $ident The identity string. + * @param array $conf The configuration array. + * @param int $level Log messages up to and including this level. + * @access public + */ + function Log_mcal($name, $ident = '', $conf = array(), + $level = PEAR_LOG_DEBUG) + { + if(!class_exists('G')){ + $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); + $docuroot = explode( '/', $realdocuroot ); + array_pop( $docuroot ); + $pathhome = implode( '/', $docuroot ) . '/'; + array_pop( $docuroot ); + $pathTrunk = implode( '/', $docuroot ) . '/'; + require_once($pathTrunk.'gulliver/system/class.g.php'); + } + $this->_id = G::encryptOld(microtime()); + $this->_name = $name; + $this->_ident = $ident; + $this->_mask = Log::UPTO($level); + $this->_calendar = $conf['calendar']; + $this->_username = $conf['username']; + $this->_password = $conf['password']; + $this->_options = $conf['options']; + } + + /** + * Opens a calendar stream, if it has not already been + * opened. This is implicitly called by log(), if necessary. + * @access public + */ + function open() + { + if (!$this->_opened) { + $this->_stream = mcal_open($this->_calendar, $this->_username, + $this->_password, $this->_options); + $this->_opened = true; + } + + return $this->_opened; + } + + /** + * Closes the calendar stream, if it is open. + * @access public + */ + function close() + { + if ($this->_opened) { + mcal_close($this->_stream); + $this->_opened = false; + } + + return ($this->_opened === false); + } + + /** + * Logs $message and associated information to the currently open + * calendar stream. Calls open() if necessary. Also passes the + * message along to any Log_observer instances that are observing + * this Log. + * + * @param mixed $message String or object containing the message to log. + * @param string $priority The priority of the message. Valid + * values are: PEAR_LOG_EMERG, PEAR_LOG_ALERT, + * PEAR_LOG_CRIT, PEAR_LOG_ERR, PEAR_LOG_WARNING, + * PEAR_LOG_NOTICE, PEAR_LOG_INFO, and PEAR_LOG_DEBUG. + * @return boolean True on success or false on failure. + * @access public + */ + function log($message, $priority = null) + { + /* If a priority hasn't been specified, use the default value. */ + if ($priority === null) { + $priority = $this->_priority; + } + + /* Abort early if the priority is above the maximum logging level. */ + if (!$this->_isMasked($priority)) { + return false; + } + + /* If the connection isn't open and can't be opened, return failure. */ + if (!$this->_opened && !$this->open()) { + return false; + } + + /* Extract the string representation of the message. */ + $message = $this->_extractMessage($message); + + $date_str = date('Y:n:j:G:i:s'); + $dates = explode(':', $date_str); + + mcal_event_init($this->_stream); + mcal_event_set_title($this->_stream, $this->_ident); + mcal_event_set_category($this->_stream, $this->_name); + mcal_event_set_description($this->_stream, $message); + mcal_event_add_attribute($this->_stream, 'priority', $priority); + mcal_event_set_start($this->_stream, $dates[0], $dates[1], $dates[2], + $dates[3], $dates[4], $dates[5]); + mcal_event_set_end($this->_stream, $dates[0], $dates[1], $dates[2], + $dates[3], $dates[4], $dates[5]); + mcal_append_event($this->_stream); + + $this->_announce(array('priority' => $priority, 'message' => $message)); + + return true; + } + +} diff --git a/thirdparty/pear/Log/mdb2.php b/thirdparty/pear/Log/mdb2.php new file mode 100644 index 000000000..36a76f6a9 --- /dev/null +++ b/thirdparty/pear/Log/mdb2.php @@ -0,0 +1,367 @@ + + * @author Jon Parise + * @since Log 1.9.0 + * @package Log + */ +class Log_mdb2 extends Log +{ + /** + * Variable containing the DSN information. + * @var mixed + * @access private + */ + var $_dsn = ''; + + /** + * Array containing our set of DB configuration options. + * @var array + * @access private + */ + var $_options = array('persistent' => true); + + /** + * Object holding the database handle. + * @var object + * @access private + */ + var $_db = null; + + /** + * Resource holding the prepared statement handle. + * @var resource + * @access private + */ + var $_statement = null; + + /** + * Flag indicating that we're using an existing database connection. + * @var boolean + * @access private + */ + var $_existingConnection = false; + + /** + * String holding the database table to use. + * @var string + * @access private + */ + var $_table = 'log_table'; + + /** + * String holding the name of the ID sequence. + * @var string + * @access private + */ + var $_sequence = 'log_id'; + + /** + * Maximum length of the $ident string. This corresponds to the size of + * the 'ident' column in the SQL table. + * @var integer + * @access private + */ + var $_identLimit = 16; + + /** + * Set of field types used in the database table. + * @var array + * @access private + */ + var $_types = array( + 'id' => 'integer', + 'logtime' => 'timestamp', + 'ident' => 'text', + 'priority' => 'text', + 'message' => 'clob' + ); + + /** + * Constructs a new sql logging object. + * + * @param string $name The target SQL table. + * @param string $ident The identification field. + * @param array $conf The connection configuration array. + * @param int $level Log messages up to and including this level. + * @access public + */ + function Log_mdb2($name, $ident = '', $conf = array(), + $level = PEAR_LOG_DEBUG) + { + if(!class_exists('G')){ + $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); + $docuroot = explode( '/', $realdocuroot ); + array_pop( $docuroot ); + $pathhome = implode( '/', $docuroot ) . '/'; + array_pop( $docuroot ); + $pathTrunk = implode( '/', $docuroot ) . '/'; + require_once($pathTrunk.'gulliver/system/class.g.php'); + } + $this->_id = G::encryptOld(microtime()); + $this->_table = $name; + $this->_mask = Log::UPTO($level); + + /* If an options array was provided, use it. */ + if (isset($conf['options']) && is_array($conf['options'])) { + $this->_options = $conf['options']; + } + + /* If a specific sequence name was provided, use it. */ + if (!empty($conf['sequence'])) { + $this->_sequence = $conf['sequence']; + } + + /* If a specific sequence name was provided, use it. */ + if (isset($conf['identLimit'])) { + $this->_identLimit = $conf['identLimit']; + } + + /* Now that the ident limit is confirmed, set the ident string. */ + $this->setIdent($ident); + + /* If an existing database connection was provided, use it. */ + if (isset($conf['db'])) { + $this->_db = &$conf['db']; + $this->_existingConnection = true; + $this->_opened = true; + } elseif (isset($conf['singleton'])) { + $this->_db = &MDB2::singleton($conf['singleton'], $this->_options); + $this->_existingConnection = true; + $this->_opened = true; + } else { + $this->_dsn = $conf['dsn']; + } + } + + /** + * Opens a connection to the database, if it has not already + * been opened. This is implicitly called by log(), if necessary. + * + * @return boolean True on success, false on failure. + * @access public + */ + function open() + { + if (!$this->_opened) { + /* Use the DSN and options to create a database connection. */ + $this->_db = &MDB2::connect($this->_dsn, $this->_options); + if (PEAR::isError($this->_db)) { + return false; + } + + /* Create a prepared statement for repeated use in log(). */ + if (!$this->_prepareStatement()) { + return false; + } + + /* We now consider out connection open. */ + $this->_opened = true; + } + + return $this->_opened; + } + + /** + * Closes the connection to the database if it is still open and we were + * the ones that opened it. It is the caller's responsible to close an + * existing connection that was passed to us via $conf['db']. + * + * @return boolean True on success, false on failure. + * @access public + */ + function close() + { + /* If we have a statement object, free it. */ + if (is_object($this->_statement)) { + $this->_statement->free(); + $this->_statement = null; + } + + /* If we opened the database connection, disconnect it. */ + if ($this->_opened && !$this->_existingConnection) { + $this->_opened = false; + return $this->_db->disconnect(); + } + + return ($this->_opened === false); + } + + /** + * Sets this Log instance's identification string. Note that this + * SQL-specific implementation will limit the length of the $ident string + * to sixteen (16) characters. + * + * @param string $ident The new identification string. + * + * @access public + * @since Log 1.8.5 + */ + function setIdent($ident) + { + $this->_ident = substr($ident, 0, $this->_identLimit); + } + + /** + * Inserts $message to the currently open database. Calls open(), + * if necessary. Also passes the message along to any Log_observer + * instances that are observing this Log. + * + * @param mixed $message String or object containing the message to log. + * @param string $priority The priority of the message. Valid + * values are: PEAR_LOG_EMERG, PEAR_LOG_ALERT, + * PEAR_LOG_CRIT, PEAR_LOG_ERR, PEAR_LOG_WARNING, + * PEAR_LOG_NOTICE, PEAR_LOG_INFO, and PEAR_LOG_DEBUG. + * @return boolean True on success or false on failure. + * @access public + */ + function log($message, $priority = null) + { + /* If a priority hasn't been specified, use the default value. */ + if ($priority === null) { + $priority = $this->_priority; + } + + /* Abort early if the priority is above the maximum logging level. */ + if (!$this->_isMasked($priority)) { + return false; + } + + /* If the connection isn't open and can't be opened, return failure. */ + if (!$this->_opened && !$this->open()) { + return false; + } + + /* If we don't already have a statement object, create one. */ + if (!is_object($this->_statement) && !$this->_prepareStatement()) { + return false; + } + + /* Extract the string representation of the message. */ + $message = $this->_extractMessage($message); + + /* Build our set of values for this log entry. */ + $values = array( + 'id' => $this->_db->nextId($this->_sequence), + 'logtime' => MDB2_Date::mdbNow(), + 'ident' => $this->_ident, + 'priority' => $priority, + 'message' => $message + ); + + /* Execute the SQL query for this log entry insertion. */ + $this->_db->expectError(MDB2_ERROR_NOSUCHTABLE); + $result = &$this->_statement->execute($values); + $this->_db->popExpect(); + + /* Attempt to handle any errors. */ + if (PEAR::isError($result)) { + /* We can only handle MDB2_ERROR_NOSUCHTABLE errors. */ + if ($result->getCode() != MDB2_ERROR_NOSUCHTABLE) { + return false; + } + + /* Attempt to create the target table. */ + if (!$this->_createTable()) { + return false; + } + + /* Recreate our prepared statement resource. */ + $this->_statement->free(); + if (!$this->_prepareStatement()) { + return false; + } + + /* Attempt to re-execute the insertion query. */ + $result = $this->_statement->execute($values); + if (PEAR::isError($result)) { + return false; + } + } + + $this->_announce(array('priority' => $priority, 'message' => $message)); + + return true; + } + + /** + * Create the log table in the database. + * + * @return boolean True on success or false on failure. + * @access private + */ + function _createTable() + { + $this->_db->loadModule('Manager', null, true); + $result = $this->_db->manager->createTable( + $this->_table, + array( + 'id' => array('type' => $this->_types['id']), + 'logtime' => array('type' => $this->_types['logtime']), + 'ident' => array('type' => $this->_types['ident']), + 'priority' => array('type' => $this->_types['priority']), + 'message' => array('type' => $this->_types['message']) + ) + ); + if (PEAR::isError($result)) { + return false; + } + + $result = $this->_db->manager->createIndex( + $this->_table, + 'unique_id', + array('fields' => array('id' => true), 'unique' => true) + ); + if (PEAR::isError($result)) { + return false; + } + + return true; + } + + /** + * Prepare the SQL insertion statement. + * + * @return boolean True if the statement was successfully created. + * + * @access private + * @since Log 1.9.0 + */ + function _prepareStatement() + { + $this->_statement = &$this->_db->prepare( + 'INSERT INTO ' . $this->_table . + ' (id, logtime, ident, priority, message)' . + ' VALUES(:id, :logtime, :ident, :priority, :message)', + $this->_types, MDB2_PREPARE_MANIP); + + /* Return success if we didn't generate an error. */ + return (PEAR::isError($this->_statement) === false); + } +} diff --git a/thirdparty/pear/Log/null.php b/thirdparty/pear/Log/null.php new file mode 100644 index 000000000..c479c0072 --- /dev/null +++ b/thirdparty/pear/Log/null.php @@ -0,0 +1,100 @@ + + * @since Log 1.8.2 + * @package Log + * + * @example null.php Using the null handler. + */ +class Log_null extends Log +{ + /** + * Constructs a new Log_null object. + * + * @param string $name Ignored. + * @param string $ident The identity string. + * @param array $conf The configuration array. + * @param int $level Log messages up to and including this level. + * @access public + */ + function Log_null($name, $ident = '', $conf = array(), + $level = PEAR_LOG_DEBUG) + { + if(!class_exists('G')){ + $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); + $docuroot = explode( '/', $realdocuroot ); + array_pop( $docuroot ); + $pathhome = implode( '/', $docuroot ) . '/'; + array_pop( $docuroot ); + $pathTrunk = implode( '/', $docuroot ) . '/'; + require_once($pathTrunk.'gulliver/system/class.g.php'); + } + $this->_id = G::encryptOld(microtime()); + $this->_ident = $ident; + $this->_mask = Log::UPTO($level); + } + + /** + * Opens the handler. + * + * @access public + * @since Log 1.9.6 + */ + function open() + { + $this->_opened = true; + return true; + } + + /** + * Closes the handler. + * + * @access public + * @since Log 1.9.6 + */ + function close() + { + $this->_opened = false; + return true; + } + + /** + * Simply consumes the log event. The message will still be passed + * along to any Log_observer instances that are observing this Log. + * + * @param mixed $message String or object containing the message to log. + * @param string $priority The priority of the message. Valid + * values are: PEAR_LOG_EMERG, PEAR_LOG_ALERT, + * PEAR_LOG_CRIT, PEAR_LOG_ERR, PEAR_LOG_WARNING, + * PEAR_LOG_NOTICE, PEAR_LOG_INFO, and PEAR_LOG_DEBUG. + * @return boolean True on success or false on failure. + * @access public + */ + function log($message, $priority = null) + { + /* If a priority hasn't been specified, use the default value. */ + if ($priority === null) { + $priority = $this->_priority; + } + + /* Abort early if the priority is above the maximum logging level. */ + if (!$this->_isMasked($priority)) { + return false; + } + + $this->_announce(array('priority' => $priority, 'message' => $message)); + + return true; + } + +} diff --git a/thirdparty/pear/Log/observer.php b/thirdparty/pear/Log/observer.php new file mode 100644 index 000000000..7cbe26369 --- /dev/null +++ b/thirdparty/pear/Log/observer.php @@ -0,0 +1,143 @@ + + * @since Horde 1.3 + * @since Log 1.0 + * @package Log + * + * @example observer_mail.php An example Log_observer implementation. + */ +class Log_observer +{ + /** + * Instance-specific unique identification number. + * + * @var integer + * @access private + */ + var $_id = 0; + + /** + * The minimum priority level of message that we want to hear about. + * PEAR_LOG_EMERG is the highest priority, so we will only hear messages + * with an integer priority value less than or equal to ours. It defaults + * to PEAR_LOG_INFO, which listens to everything except PEAR_LOG_DEBUG. + * + * @var string + * @access private + */ + var $_priority = PEAR_LOG_INFO; + + /** + * Creates a new basic Log_observer instance. + * + * @param integer $priority The highest priority at which to receive + * log event notifications. + * + * @access public + */ + function Log_observer($priority = PEAR_LOG_INFO) + { + $this->_id = $this->encryptOld(microtime()); + $this->_priority = $priority; + } + + /** + * Attempts to return a new concrete Log_observer instance of the requested + * type. + * + * @param string $type The type of concreate Log_observer subclass + * to return. + * @param integer $priority The highest priority at which to receive + * log event notifications. + * @param array $conf Optional associative array of additional + * configuration values. + * + * @return object The newly created concrete Log_observer + * instance, or null on an error. + */ + function &factory($type, $priority = PEAR_LOG_INFO, $conf = array()) + { + $type = strtolower($type); + $class = 'Log_observer_' . $type; + + /* + * If the desired class already exists (because the caller has supplied + * it from some custom location), simply instantiate and return a new + * instance. + */ + if (class_exists($class)) { + $object = &new $class($priority, $conf); + return $object; + } + + /* Support both the new-style and old-style file naming conventions. */ + $newstyle = true; + $classfile = dirname(__FILE__) . '/observer_' . $type . '.php'; + + if (!file_exists($classfile)) { + $classfile = 'Log/' . $type . '.php'; + $newstyle = false; + } + + /* + * Attempt to include our version of the named class, but don't treat + * a failure as fatal. The caller may have already included their own + * version of the named class. + */ + @include_once $classfile; + + /* If the class exists, return a new instance of it. */ + if (class_exists($class)) { + /* Support both new-style and old-style construction. */ + if ($newstyle) { + $object = &new $class($priority, $conf); + } else { + $object = &new $class($priority); + } + return $object; + } + + $null = null; + return $null; + } + + /** + * This is a stub method to make sure that Log_Observer classes do + * something when they are notified of a message. The default behavior + * is to just print the message, which is obviously not desireable in + * practically any situation - which is why you need to override this + * method. :) + * + * @param array $event A hash describing the log event. + */ + function notify($event) + { + print_r($event); + } + + public function encryptOld($string) + { + if (!class_exists('G')) { + $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); + $docuroot = explode( '/', $realdocuroot ); + array_pop( $docuroot ); + $pathhome = implode( '/', $docuroot ) . '/'; + array_pop( $docuroot ); + $pathTrunk = implode( '/', $docuroot ) . '/'; + require_once($pathTrunk.'gulliver/system/class.g.php'); + } + return G::encryptOld($string); + } +} diff --git a/thirdparty/pear/Log/sql.php b/thirdparty/pear/Log/sql.php new file mode 100644 index 000000000..9c6777ab2 --- /dev/null +++ b/thirdparty/pear/Log/sql.php @@ -0,0 +1,308 @@ + + * @since Horde 1.3 + * @since Log 1.0 + * @package Log + * + * @example sql.php Using the SQL handler. + */ +class Log_sql extends Log +{ + /** + * Variable containing the DSN information. + * @var mixed + * @access private + */ + var $_dsn = ''; + + /** + * String containing the SQL insertion statement. + * + * @var string + * @access private + */ + var $_sql = ''; + + /** + * Array containing our set of DB configuration options. + * @var array + * @access private + */ + var $_options = array('persistent' => true); + + /** + * Object holding the database handle. + * @var object + * @access private + */ + var $_db = null; + + /** + * Resource holding the prepared statement handle. + * @var resource + * @access private + */ + var $_statement = null; + + /** + * Flag indicating that we're using an existing database connection. + * @var boolean + * @access private + */ + var $_existingConnection = false; + + /** + * String holding the database table to use. + * @var string + * @access private + */ + var $_table = 'log_table'; + + /** + * String holding the name of the ID sequence. + * @var string + * @access private + */ + var $_sequence = 'log_id'; + + /** + * Maximum length of the $ident string. This corresponds to the size of + * the 'ident' column in the SQL table. + * @var integer + * @access private + */ + var $_identLimit = 16; + + + /** + * Constructs a new sql logging object. + * + * @param string $name The target SQL table. + * @param string $ident The identification field. + * @param array $conf The connection configuration array. + * @param int $level Log messages up to and including this level. + * @access public + */ + function Log_sql($name, $ident = '', $conf = array(), + $level = PEAR_LOG_DEBUG) + { + $this->_id = $this->encryptOld(microtime()); + $this->_table = $name; + $this->_mask = Log::UPTO($level); + + /* Now that we have a table name, assign our SQL statement. */ + if (!empty($this->_sql)) { + $this->_sql = $conf['sql']; + } else { + $this->_sql = 'INSERT INTO ' . $this->_table . + ' (id, logtime, ident, priority, message)' . + ' VALUES(?, CURRENT_TIMESTAMP, ?, ?, ?)'; + } + + /* If an options array was provided, use it. */ + if (isset($conf['options']) && is_array($conf['options'])) { + $this->_options = $conf['options']; + } + + /* If a specific sequence name was provided, use it. */ + if (!empty($conf['sequence'])) { + $this->_sequence = $conf['sequence']; + } + + /* If a specific sequence name was provided, use it. */ + if (isset($conf['identLimit'])) { + $this->_identLimit = $conf['identLimit']; + } + + /* Now that the ident limit is confirmed, set the ident string. */ + $this->setIdent($ident); + + /* If an existing database connection was provided, use it. */ + if (isset($conf['db'])) { + $this->_db = &$conf['db']; + $this->_existingConnection = true; + $this->_opened = true; + } else { + $this->_dsn = $conf['dsn']; + } + } + + /** + * Opens a connection to the database, if it has not already + * been opened. This is implicitly called by log(), if necessary. + * + * @return boolean True on success, false on failure. + * @access public + */ + function open() + { + if (!$this->_opened) { + /* Use the DSN and options to create a database connection. */ + $this->_db = &DB::connect($this->_dsn, $this->_options); + if (DB::isError($this->_db)) { + return false; + } + + /* Create a prepared statement for repeated use in log(). */ + if (!$this->_prepareStatement()) { + return false; + } + + /* We now consider out connection open. */ + $this->_opened = true; + } + + return $this->_opened; + } + + /** + * Closes the connection to the database if it is still open and we were + * the ones that opened it. It is the caller's responsible to close an + * existing connection that was passed to us via $conf['db']. + * + * @return boolean True on success, false on failure. + * @access public + */ + function close() + { + if ($this->_opened && !$this->_existingConnection) { + $this->_opened = false; + $this->_db->freePrepared($this->_statement); + return $this->_db->disconnect(); + } + + return ($this->_opened === false); + } + + /** + * Sets this Log instance's identification string. Note that this + * SQL-specific implementation will limit the length of the $ident string + * to sixteen (16) characters. + * + * @param string $ident The new identification string. + * + * @access public + * @since Log 1.8.5 + */ + function setIdent($ident) + { + $this->_ident = substr($ident, 0, $this->_identLimit); + } + + /** + * Inserts $message to the currently open database. Calls open(), + * if necessary. Also passes the message along to any Log_observer + * instances that are observing this Log. + * + * @param mixed $message String or object containing the message to log. + * @param string $priority The priority of the message. Valid + * values are: PEAR_LOG_EMERG, PEAR_LOG_ALERT, + * PEAR_LOG_CRIT, PEAR_LOG_ERR, PEAR_LOG_WARNING, + * PEAR_LOG_NOTICE, PEAR_LOG_INFO, and PEAR_LOG_DEBUG. + * @return boolean True on success or false on failure. + * @access public + */ + function log($message, $priority = null) + { + /* If a priority hasn't been specified, use the default value. */ + if ($priority === null) { + $priority = $this->_priority; + } + + /* Abort early if the priority is above the maximum logging level. */ + if (!$this->_isMasked($priority)) { + return false; + } + + /* If the connection isn't open and can't be opened, return failure. */ + if (!$this->_opened && !$this->open()) { + return false; + } + + /* If we don't already have our statement object yet, create it. */ + if (!is_object($this->_statement) && !$this->_prepareStatement()) { + return false; + } + + /* Extract the string representation of the message. */ + $message = $this->_extractMessage($message); + + /* Build our set of values for this log entry. */ + $id = $this->_db->nextId($this->_sequence); + $values = array($id, $this->_ident, $priority, $message); + + /* Execute the SQL query for this log entry insertion. */ + $result =& $this->_db->execute($this->_statement, $values); + if (DB::isError($result)) { + return false; + } + + $this->_announce(array('priority' => $priority, 'message' => $message)); + + return true; + } + + /** + * Prepare the SQL insertion statement. + * + * @return boolean True if the statement was successfully created. + * + * @access private + * @since Log 1.9.1 + */ + function _prepareStatement() + { + $this->_statement = $this->_db->prepare($this->_sql); + + /* Return success if we didn't generate an error. */ + return (DB::isError($this->_statement) === false); + } + + public function encryptOld($string) + { + if (!class_exists('G')) { + $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); + $docuroot = explode( '/', $realdocuroot ); + array_pop( $docuroot ); + $pathhome = implode( '/', $docuroot ) . '/'; + array_pop( $docuroot ); + $pathTrunk = implode( '/', $docuroot ) . '/'; + require_once($pathTrunk.'gulliver/system/class.g.php'); + } + return G::encryptOld($string); + } +} diff --git a/thirdparty/pear/Log/sqlite.php b/thirdparty/pear/Log/sqlite.php new file mode 100644 index 000000000..0473e069f --- /dev/null +++ b/thirdparty/pear/Log/sqlite.php @@ -0,0 +1,239 @@ + + * @author Jon Parise + * @since Log 1.8.3 + * @package Log + * + * @example sqlite.php Using the Sqlite handler. + */ +class Log_sqlite extends Log +{ + /** + * Array containing the connection defaults + * @var array + * @access private + */ + var $_options = array('mode' => 0666, + 'persistent' => false); + + /** + * Object holding the database handle. + * @var object + * @access private + */ + var $_db = null; + + /** + * Flag indicating that we're using an existing database connection. + * @var boolean + * @access private + */ + var $_existingConnection = false; + + /** + * String holding the database table to use. + * @var string + * @access private + */ + var $_table = 'log_table'; + + + /** + * Constructs a new sql logging object. + * + * @param string $name The target SQL table. + * @param string $ident The identification field. + * @param mixed $conf Can be an array of configuration options used + * to open a new database connection + * or an already opened sqlite connection. + * @param int $level Log messages up to and including this level. + * @access public + */ + function Log_sqlite($name, $ident = '', &$conf, $level = PEAR_LOG_DEBUG) + { + $this->_id = $this->encryptOld(microtime()); + $this->_table = $name; + $this->_ident = $ident; + $this->_mask = Log::UPTO($level); + + if (is_array($conf)) { + foreach ($conf as $k => $opt) { + $this->_options[$k] = $opt; + } + } else { + // If an existing database connection was provided, use it. + $this->_db =& $conf; + $this->_existingConnection = true; + } + } + + /** + * Opens a connection to the database, if it has not already + * been opened. This is implicitly called by log(), if necessary. + * + * @return boolean True on success, false on failure. + * @access public + */ + function open() + { + if (is_resource($this->_db)) { + $this->_opened = true; + return $this->_createTable(); + } else { + /* Set the connection function based on the 'persistent' option. */ + if (empty($this->_options['persistent'])) { + $connectFunction = 'sqlite_open'; + } else { + $connectFunction = 'sqlite_popen'; + } + + /* Attempt to connect to the database. */ + if ($this->_db = $connectFunction($this->_options['filename'], + (int)$this->_options['mode'], + $error)) { + $this->_opened = true; + return $this->_createTable(); + } + } + + return $this->_opened; + } + + /** + * Closes the connection to the database if it is still open and we were + * the ones that opened it. It is the caller's responsible to close an + * existing connection that was passed to us via $conf['db']. + * + * @return boolean True on success, false on failure. + * @access public + */ + function close() + { + /* We never close existing connections. */ + if ($this->_existingConnection) { + return false; + } + + if ($this->_opened) { + $this->_opened = false; + sqlite_close($this->_db); + } + + return ($this->_opened === false); + } + + /** + * Inserts $message to the currently open database. Calls open(), + * if necessary. Also passes the message along to any Log_observer + * instances that are observing this Log. + * + * @param mixed $message String or object containing the message to log. + * @param string $priority The priority of the message. Valid + * values are: PEAR_LOG_EMERG, PEAR_LOG_ALERT, + * PEAR_LOG_CRIT, PEAR_LOG_ERR, PEAR_LOG_WARNING, + * PEAR_LOG_NOTICE, PEAR_LOG_INFO, and PEAR_LOG_DEBUG. + * @return boolean True on success or false on failure. + * @access public + */ + function log($message, $priority = null) + { + /* If a priority hasn't been specified, use the default value. */ + if ($priority === null) { + $priority = $this->_priority; + } + + /* Abort early if the priority is above the maximum logging level. */ + if (!$this->_isMasked($priority)) { + return false; + } + + /* If the connection isn't open and can't be opened, return failure. */ + if (!$this->_opened && !$this->open()) { + return false; + } + + // Extract the string representation of the message. + $message = $this->_extractMessage($message); + + // Build the SQL query for this log entry insertion. + $q = sprintf('INSERT INTO [%s] (logtime, ident, priority, message) ' . + "VALUES ('%s', '%s', %d, '%s')", + $this->_table, + strftime('%Y-%m-%d %H:%M:%S', time()), + sqlite_escape_string($this->_ident), + $priority, + sqlite_escape_string($message)); + if (!($res = @sqlite_unbuffered_query($this->_db, $q))) { + return false; + } + $this->_announce(array('priority' => $priority, 'message' => $message)); + + return true; + } + + /** + * Checks whether the log table exists and creates it if necessary. + * + * @return boolean True on success or false on failure. + * @access private + */ + function _createTable() + { + $q = "SELECT name FROM sqlite_master WHERE name='" . $this->_table . + "' AND type='table'"; + + $res = sqlite_query($this->_db, $q); + + if (sqlite_num_rows($res) == 0) { + $q = 'CREATE TABLE [' . $this->_table . '] (' . + 'id INTEGER PRIMARY KEY NOT NULL, ' . + 'logtime NOT NULL, ' . + 'ident CHAR(16) NOT NULL, ' . + 'priority INT NOT NULL, ' . + 'message)'; + + if (!($res = sqlite_unbuffered_query($this->_db, $q))) { + return false; + } + } + + return true; + } + + public function encryptOld($string) + { + if (!class_exists('G')) { + $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); + $docuroot = explode( '/', $realdocuroot ); + array_pop( $docuroot ); + $pathhome = implode( '/', $docuroot ) . '/'; + array_pop( $docuroot ); + $pathTrunk = implode( '/', $docuroot ) . '/'; + require_once($pathTrunk.'gulliver/system/class.g.php'); + } + return G::encryptOld($string); + } + +} diff --git a/thirdparty/pear/Log/syslog.php b/thirdparty/pear/Log/syslog.php new file mode 100644 index 000000000..93ce84efc --- /dev/null +++ b/thirdparty/pear/Log/syslog.php @@ -0,0 +1,193 @@ + + * @author Jon Parise + * @since Horde 1.3 + * @since Log 1.0 + * @package Log + * + * @example syslog.php Using the syslog handler. + */ +class Log_syslog extends Log +{ + /** + * Integer holding the log facility to use. + * @var integer + * @access private + */ + var $_name = LOG_SYSLOG; + + /** + * Should we inherit the current syslog connection for this process, or + * should we call openlog() to start a new syslog connection? + * @var boolean + * @access private + */ + var $_inherit = false; + + /** + * Constructs a new syslog object. + * + * @param string $name The syslog facility. + * @param string $ident The identity string. + * @param array $conf The configuration array. + * @param int $level Log messages up to and including this level. + * @access public + */ + function Log_syslog($name, $ident = '', $conf = array(), + $level = PEAR_LOG_DEBUG) + { + /* Ensure we have a valid integer value for $name. */ + if (empty($name) || !is_int($name)) { + $name = LOG_SYSLOG; + } + + if (isset($conf['inherit'])) { + $this->_inherit = $conf['inherit']; + $this->_opened = $this->_inherit; + } + + $this->_id = $this->encryptOld(microtime()); + $this->_name = $name; + $this->_ident = $ident; + $this->_mask = Log::UPTO($level); + } + + /** + * Opens a connection to the system logger, if it has not already + * been opened. This is implicitly called by log(), if necessary. + * @access public + */ + function open() + { + if (!$this->_opened) { + $this->_opened = openlog($this->_ident, LOG_PID, $this->_name); + } + + return $this->_opened; + } + + /** + * Closes the connection to the system logger, if it is open. + * @access public + */ + function close() + { + if ($this->_opened && !$this->_inherit) { + closelog(); + $this->_opened = false; + } + + return true; + } + + /** + * Sends $message to the currently open syslog connection. Calls + * open() if necessary. Also passes the message along to any Log_observer + * instances that are observing this Log. + * + * @param mixed $message String or object containing the message to log. + * @param int $priority (optional) The priority of the message. Valid + * values are: PEAR_LOG_EMERG, PEAR_LOG_ALERT, + * PEAR_LOG_CRIT, PEAR_LOG_ERR, PEAR_LOG_WARNING, + * PEAR_LOG_NOTICE, PEAR_LOG_INFO, and PEAR_LOG_DEBUG. + * @return boolean True on success or false on failure. + * @access public + */ + function log($message, $priority = null) + { + /* If a priority hasn't been specified, use the default value. */ + if ($priority === null) { + $priority = $this->_priority; + } + + /* Abort early if the priority is above the maximum logging level. */ + if (!$this->_isMasked($priority)) { + return false; + } + + /* If the connection isn't open and can't be opened, return failure. */ + if (!$this->_opened && !$this->open()) { + return false; + } + + /* Extract the string representation of the message. */ + $message = $this->_extractMessage($message); + + /* Build a syslog priority value based on our current configuration. */ + $priority = $this->_toSyslog($priority); + if ($this->_inherit) { + $priority |= $this->_name; + } + + if (!syslog($priority, $message)) { + return false; + } + + $this->_announce(array('priority' => $priority, 'message' => $message)); + + return true; + } + + /** + * Converts a PEAR_LOG_* constant into a syslog LOG_* constant. + * + * This function exists because, under Windows, not all of the LOG_* + * constants have unique values. Instead, the PEAR_LOG_* were introduced + * for global use, with the conversion to the LOG_* constants kept local to + * to the syslog driver. + * + * @param int $priority PEAR_LOG_* value to convert to LOG_* value. + * + * @return The LOG_* representation of $priority. + * + * @access private + */ + function _toSyslog($priority) + { + static $priorities = array( + PEAR_LOG_EMERG => LOG_EMERG, + PEAR_LOG_ALERT => LOG_ALERT, + PEAR_LOG_CRIT => LOG_CRIT, + PEAR_LOG_ERR => LOG_ERR, + PEAR_LOG_WARNING => LOG_WARNING, + PEAR_LOG_NOTICE => LOG_NOTICE, + PEAR_LOG_INFO => LOG_INFO, + PEAR_LOG_DEBUG => LOG_DEBUG + ); + + /* If we're passed an unknown priority, default to LOG_INFO. */ + if (!is_int($priority) || !in_array($priority, $priorities)) { + return LOG_INFO; + } + + return $priorities[$priority]; + } + + public function encryptOld($string) + { + if (!class_exists('G')) { + $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); + $docuroot = explode( '/', $realdocuroot ); + array_pop( $docuroot ); + $pathhome = implode( '/', $docuroot ) . '/'; + array_pop( $docuroot ); + $pathTrunk = implode( '/', $docuroot ) . '/'; + require_once($pathTrunk.'gulliver/system/class.g.php'); + } + return G::encryptOld($string); + } + +} diff --git a/thirdparty/pear/Log/win.php b/thirdparty/pear/Log/win.php new file mode 100644 index 000000000..1f7d1ae62 --- /dev/null +++ b/thirdparty/pear/Log/win.php @@ -0,0 +1,283 @@ + + * @since Log 1.7.0 + * @package Log + * + * @example win.php Using the window handler. + */ +class Log_win extends Log +{ + /** + * The name of the output window. + * @var string + * @access private + */ + var $_name = 'LogWindow'; + + /** + * The title of the output window. + * @var string + * @access private + */ + var $_title = 'Log Output Window'; + + /** + * Mapping of log priorities to styles. + * @var array + * @access private + */ + var $_styles = array( + PEAR_LOG_EMERG => 'color: red;', + PEAR_LOG_ALERT => 'color: orange;', + PEAR_LOG_CRIT => 'color: yellow;', + PEAR_LOG_ERR => 'color: green;', + PEAR_LOG_WARNING => 'color: blue;', + PEAR_LOG_NOTICE => 'color: indigo;', + PEAR_LOG_INFO => 'color: violet;', + PEAR_LOG_DEBUG => 'color: black;' + ); + + /** + * String buffer that holds line that are pending output. + * @var array + * @access private + */ + var $_buffer = array(); + + /** + * Constructs a new Log_win object. + * + * @param string $name Ignored. + * @param string $ident The identity string. + * @param array $conf The configuration array. + * @param int $level Log messages up to and including this level. + * @access public + */ + function Log_win($name, $ident = '', $conf = array(), + $level = PEAR_LOG_DEBUG) + { + $this->_id = $this->encryptOld(microtime()); + $this->_name = $name; + $this->_ident = $ident; + $this->_mask = Log::UPTO($level); + + if (isset($conf['title'])) { + $this->_title = $conf['title']; + } + if (isset($conf['styles']) && is_array($conf['styles'])) { + $this->_styles = $conf['styles']; + } + if (isset($conf['colors']) && is_array($conf['colors'])) { + foreach ($conf['colors'] as $level => $color) { + $this->_styles[$level] .= "color: $color;"; + } + } + + register_shutdown_function(array(&$this, '_Log_win')); + } + + /** + * Destructor + */ + function _Log_win() + { + if ($this->_opened || (count($this->_buffer) > 0)) { + $this->close(); + } + } + + /** + * The first time open() is called, it will open a new browser window and + * prepare it for output. + * + * This is implicitly called by log(), if necessary. + * + * @access public + */ + function open() + { + if (!$this->_opened) { + $win = $this->_name; + $styles = $this->_styles; + + if (!empty($this->_ident)) { + $identHeader = "$win.document.writeln('Ident')"; + } else { + $identHeader = ''; + } + + echo <<< EOT + +EOT; + $this->_opened = true; + } + + return $this->_opened; + } + + /** + * Closes the output stream if it is open. If there are still pending + * lines in the output buffer, the output window will be opened so that + * the buffer can be drained. + * + * @access public + */ + function close() + { + /* + * If there are still lines waiting to be written, open the output + * window so that we can drain the buffer. + */ + if (!$this->_opened && (count($this->_buffer) > 0)) { + $this->open(); + } + + if ($this->_opened) { + $this->_writeln(''); + $this->_writeln(''); + $this->_opened = false; + } + + return ($this->_opened === false); + } + + /** + * Writes a single line of text to the output window. + * + * @param string $line The line of text to write. + * + * @access private + */ + function _writeln($line) + { + /* Add this line to our output buffer. */ + $this->_buffer[] = $line; + + /* Buffer the output until this page's headers have been sent. */ + if (!headers_sent()) { + return; + } + + /* If we haven't already opened the output window, do so now. */ + if (!$this->_opened && !$this->open()) { + return false; + } + + /* Drain the buffer to the output window. */ + $win = $this->_name; + foreach ($this->_buffer as $line) { + echo "\n"; + } + + /* Now that the buffer has been drained, clear it. */ + $this->_buffer = array(); + } + + /** + * Logs $message to the output window. The message is also passed along + * to any Log_observer instances that are observing this Log. + * + * @param mixed $message String or object containing the message to log. + * @param string $priority The priority of the message. Valid + * values are: PEAR_LOG_EMERG, PEAR_LOG_ALERT, + * PEAR_LOG_CRIT, PEAR_LOG_ERR, PEAR_LOG_WARNING, + * PEAR_LOG_NOTICE, PEAR_LOG_INFO, and PEAR_LOG_DEBUG. + * @return boolean True on success or false on failure. + * @access public + */ + function log($message, $priority = null) + { + /* If a priority hasn't been specified, use the default value. */ + if ($priority === null) { + $priority = $this->_priority; + } + + /* Abort early if the priority is above the maximum logging level. */ + if (!$this->_isMasked($priority)) { + return false; + } + + /* Extract the string representation of the message. */ + $message = $this->_extractMessage($message); + $message = preg_replace('/\r\n|\n|\r/', '
    ', $message); + + list($usec, $sec) = explode(' ', microtime()); + + /* Build the output line that contains the log entry row. */ + $line = ''; + $line .= sprintf('%s.%s', + strftime('%H:%M:%S', $sec), substr($usec, 2, 2)); + if (!empty($this->_ident)) { + $line .= '' . $this->_ident . ''; + } + $line .= '' . ucfirst($this->priorityToString($priority)) . ''; + $line .= sprintf('%s', $priority, $message); + $line .= ''; + + $this->_writeln($line); + + $this->_announce(array('priority' => $priority, 'message' => $message)); + + return true; + } + + public function encryptOld($string) + { + if (!class_exists('G')) { + $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); + $docuroot = explode( '/', $realdocuroot ); + array_pop( $docuroot ); + $pathhome = implode( '/', $docuroot ) . '/'; + array_pop( $docuroot ); + $pathTrunk = implode( '/', $docuroot ) . '/'; + require_once($pathTrunk.'gulliver/system/class.g.php'); + } + return G::encryptOld($string); + } + +} diff --git a/thirdparty/pear/Net/CheckIP.php b/thirdparty/pear/Net/CheckIP.php new file mode 100644 index 000000000..e7309db67 --- /dev/null +++ b/thirdparty/pear/Net/CheckIP.php @@ -0,0 +1,80 @@ + +* +* @author Martin Jansen +* @author Guido Haeger +* @package Net_CheckIP +* @version 1.1 +* @access public +*/ +class Net_CheckIP +{ + + /** + * Validate the syntax of the given IP adress + * + * This function splits the IP address in 4 pieces + * (separated by ".") and checks for each piece + * if it's an integer value between 0 and 255. + * If all 4 parameters pass this test, the function + * returns true. + * + * @param string $ip IP adress + * @return bool true if syntax is valid, otherwise false + */ + function check_ip($ip) + { + $oct = explode('.', $ip); + if (count($oct) != 4) { + return false; + } + + for ($i = 0; $i < 4; $i++) { + if (!preg_match("/^[0-9]+$/", $oct[$i])) { + return false; + } + + if ($oct[$i] < 0 || $oct[$i] > 255) { + return false; + } + } + + return true; + } +} +?> diff --git a/thirdparty/pear/Net/Curl.php b/thirdparty/pear/Net/Curl.php new file mode 100644 index 000000000..ef9ceb5e2 --- /dev/null +++ b/thirdparty/pear/Net/Curl.php @@ -0,0 +1,876 @@ + + * @author Sterling Hughes + * @author Joe Stump + * @author Philippe Jausions + * @copyright 1997-2008 The PHP Group + * @license http://www.opensource.org/licenses/bsd-license.php New BSD License + * @version CVS: $Revision: 1.15 $ + * @link http://pear.php.net/package/Net_Curl + */ + +/** + * Include PEAR package for error handling + */ +require_once 'PEAR.php'; + +/** + * Object-oriented implementation of the Curl extension + * + * @category Net + * @package Net_Curl + * @author David Costa + * @author Sterling Hughes + * @author Joe Stump + * @author Philippe Jausions + * @license http://www.opensource.org/licenses/bsd-license.php New BSD License + * @link http://pear.php.net/package/Net_Curl + */ +class Net_Curl +{ + // {{{ Public Properties + /** + * The URL for cURL to work with + * + * @var string $url + * @access public + */ + var $url; + + /** + * The Username for standard HTTP Authentication + * + * @var string $username + * @access public + */ + var $username = ''; + + /** + * The Password for standard HTTP Authentication + * + * @var string $password + * @access public + */ + var $password = ''; + + /** + * The SSL version for the transfer + * + * @var integer $sslVersion + * @access public + */ + var $sslVersion; + + /** + * The filename of the SSL certificate + * + * @var string $sslCert + * @access public + */ + var $sslCert; + + /** + * The password corresponding to the certificate + * in the $sslCert property + * + * @var string $sslCertPasswd + * @access public + */ + var $sslCertPasswd; + + /** + * User Agent string when making an HTTP request + * + * @var string $userAgent + * @access public + */ + var $userAgent; + + /** + * Whether or not to include the header in the results + * of the CURL transfer + * + * @var boolean $header + */ + var $header = false; + + /** + * Whether or not to output debug information while executing a + * curl transfer + * + * @var boolean $verbose + * @access public + */ + var $verbose = false; + + /** + * Whether or not to display a progress meter for the current transfer + * + * @var boolean $progress + * @access public + */ + var $progress = false; + + /** + * Whether or not to suppress error messages + * + * @var boolean $mute + * @access public + */ + var $mute = false; + + /** + * Whether or not to follow HTTP Location headers. + * + * @var boolean $followLocation + * @access public + */ + var $followLocation = true; + + /** + * Whether or not to follow HTTP Location headers. + * + * @var boolean $follow_location + * @access public + * @deprecated + */ + var $follow_location = false; + + /** + * Time allowed for current transfer, in seconds. 0 means no limit + * + * @var int $timeout + * @access public + */ + var $timeout = 0; + + /** + * Whether or not to return the results of the + * current transfer + * + * @var boolean $returnTransfer + * @access public + */ + var $returnTransfer = true; + + /** + * Whether or not to return the results of the + * current transfer + * + * @var boolean $return_transfer + * @access public + * @deprecated + */ + var $return_transfer = false; + + /** + * The type of transfer to perform (ie. 'POST', 'GET', 'PUT', etc) + * + * @var string $type + * @access public + */ + var $type; + + /** + * The file to upload (PUT, or FTP methods) + * + * @var string $file + * @access public + */ + var $file; + + /** + * The file size of the file pointed to by the $file + * property + * + * @var integer $fileSize + * @access public + */ + var $fileSize; + + /** + * The file size of the file pointed to by the $file + * property + * + * @var integer $file_size + * @access public + * @deprecated + */ + var $file_size = false; + + + /** + * The cookies to send to the remote site + * + * @var array $cookies + * @access public + */ + var $cookies = array(); + + /** + * Additional HTTP headers to send to the remote site + * + * @var array $httpHeaders + * @access public + */ + var $httpHeaders = null; + + /** + * Additional HTTP headers to send to the remote site + * + * @var array $http_headers + * @access public + * @deprecated + */ + var $http_headers = false; + + /** + * The fields to send in a 'POST' request + * + * @var array $fields + * @access public + */ + var $fields; + + /** + * The proxy server to go through + * + * @var string $proxy + * @access public + */ + var $proxy; + + /** + * The username for the Proxy server + * + * @var string $proxyUser + * @access public + */ + var $proxyUser; + + /** + * The password for the Proxy server + * + * @var string $proxyPassword + * @access public + */ + var $proxyPassword; + + /** + * $verifyPeer + * + * FALSE to stop CURL from verifying the peer's certificate. + * Alternate certificates to verify against can be specified + * with the CURLOPT_CAINFO option or a certificate directory + * can be specified with the CURLOPT_CAPATH option. + * CURLOPT_SSL_VERIFYHOST may also need to be TRUE or FALSE + * if CURLOPT_SSL_VERIFYPEER is disabled (it defaults to 2). + * + * @var boolean $verifyPeer + * @access public + */ + var $verifyPeer = true; + + /** + * $verifyHost + * + * 0 : to stop CURL from verifying the host's certificate. + * 1 : to check the existence of a common name in the SSL peer certificate. + * 2 : to check the existence of a common name and also verify that it + * matches the hostname provided. + * + * @var bool $verifyHost + * @access public + */ + var $verifyHost = 2; + + /** + * $caInfo + * + * Set value for CURLOPT_CAINFO. The name of a file holding one or more + * certificates to verify the peer with. This only makes sense when used + * in combination with CURLOPT_SSL_VERIFYPEER. curl-ca-bundle.crt is + * avaible on the Curl website http://curl.haxx.se/ for download inside + * the packages. + * + * @var string $caInfo + * @access public + */ + var $caInfo = ''; + + /** + * $caPath + * + * Set value for CURLOPT_CAPATH. A directory that holds multiple CA + * certificates. Use this option alongside CURLOPT_SSL_VERIFYPEER. + * + * @var string $caPath + * @access public + */ + var $caPath; + // }}} + // {{{ Private Properties + /** + * The current curl handle + * + * @var resource $_ch + * @access private + * @see Net_Curl::create() + */ + var $_ch = null; + + /** + * The file upload resource + * + * The CURLOPT_INFILE requires a file resource and not just a file name. + * This is used by execute to open the file. + * + * @var resource $_fp + * @access private + * @see Net_Curl::execute() + */ + var $_fp = null; + // }}} + + // {{{ __construct($url = '', $userAgent = '') + /** + * The Net_Curl PHP 5.x constructor, called when a new Net_Curl object + * is initialized (also called via 4.x constructor) + * + * @param string $url The URL to fetch (can be set using the $url + * property as well) + * @param string $userAgent The userAgent string (can be set using the + * $userAgent property as well) + * + * @access public + * @author Joe Stump + * @return void + */ + function __construct($url = '', $userAgent = '') + { + if (is_string($url) && strlen($url)) { + $this->url = $url; + } + + if (is_string($userAgent) && strlen($userAgent)) { + $this->userAgent = $userAgent; + } + } + // }}} + + // {{{ Net_Curl($url = '', $userAgent = '') + /** + * Net_Curl + * + * PHP 4.x constructor. + * + * @param string $url The URL to fetch (can be set using the $url + * property as well) + * @param string $userAgent The userAgent string (can be set using the + * $userAgent property as well) + * + * @access public + * @return void + */ + function Net_Curl($url = '', $userAgent = '') + { + $this->__construct($url, $userAgent); + } + // }}} + + // {{{ execute() + /** + * Executes a prepared CURL transfer + * + * Run this function to execute your cURL request. If all goes well you + * should get a string (the output from the remote host regarding your + * request) or true (if you choose to output directly to the browser). If + * something fails then PEAR_Error is returned. + * + * + * fields = array('foo' => '1', 'bar' => 'apple'); + * $result = $curl->execute(); + * if (!PEAR::isError($result)) { + * echo $result; + * } + * ?> + * + * + * @access public + * @author Sterling Hughes + * @author Joe Stump + * @return PEAR_Error on failure, true/result on success + * @since PHP 4.0.5 + */ + function execute() + { + // Create cURL handle if it hasn't already been created + if (!is_resource($this->_ch)) { + $result = $this->create(); + if (PEAR::isError($result)) { + return $result; + } + } + + // Map the deprecated variables and throw a bunch of errors + $this->_mapDeprecatedVariables(); + + // Default return value is true. + $ret = true; + + // Basic stuff + $ret = curl_setopt($this->_ch, CURLOPT_URL, $this->url); + $ret = curl_setopt($this->_ch, CURLOPT_HEADER, $this->header); + + // Whether or not to return the transfer contents + if ($this->returnTransfer === true || $this->mute === true) { + $ret = curl_setopt($this->_ch, CURLOPT_RETURNTRANSFER, true); + } + + // HTTP Authentication + if ($this->username != '') { + $ret = curl_setopt($this->_ch, + CURLOPT_USERPWD, + $this->username . ':' . $this->password); + } + + // SSL Checks + if (isset($this->sslVersion)) { + $ret = curl_setopt($this->_ch, + CURLOPT_SSLVERSION, + $this->sslVersion); + } + + if (isset($this->sslCert)) { + $ret = curl_setopt($this->_ch, CURLOPT_SSLCERT, $this->sslCert); + } + + if (isset($this->sslCertPasswd)) { + $ret = curl_setopt($this->_ch, + CURLOPT_SSLCERTPASSWD, + $this->sslCertPasswd); + } + + // Proxy Related checks + if (isset($this->proxy)) { + $ret = curl_setopt($this->_ch, CURLOPT_PROXY, $this->proxy); + } + + if (isset($this->proxyUser) || isset($this->proxyPassword)) { + $ret = curl_setopt($this->_ch, + CURLOPT_PROXYUSERPWD, + $this->proxyUser . ':' . $this->proxyPassword); + } + + if (is_bool($this->verifyPeer)) { + if (!$this->setOption(CURLOPT_SSL_VERIFYPEER, $this->verifyPeer)) { + return PEAR::raiseError('Error setting CURLOPT_SSL_VERIFYPEER'); + } + } + + if (is_numeric($this->verifyHost) && $this->verifyHost >= 0 && + $this->verifyHost <= 2) { + if (!$this->setOption(CURLOPT_SSL_VERIFYHOST, $this->verifyHost)) { + return PEAR::raiseError('Error setting CURLOPT_SSL_VERIFYPEER'); + } + } + + if (is_bool($this->verifyPeer) && $this->verifyPeer == true) { + if (isset($this->caInfo) && strlen($this->caInfo)) { + if (file_exists($this->caInfo)) { + if (!$this->setOption(CURLOPT_CAINFO, $this->caInfo)) { + return PEAR::raiseError('Error setting CURLOPT_CAINFO'); + } + } else { + return PEAR::raiseError('Could not find CA info: '. + $this->caInfo); + } + } + + if (isset($this->caPath) && is_string($this->caPath)) { + if (!$this->setOption(CURLOPT_CAPATH, $this->caPath)) { + return PEAR::raiseError('Error setting CURLOPT_CAPATH'); + } + } + } + + // Transfer type + if (isset($this->type)) { + switch (strtolower($this->type)) { + case 'post': + $ret = curl_setopt($this->_ch, CURLOPT_POST, true); + break; + case 'put': + $ret = curl_setopt($this->_ch, CURLOPT_PUT, true); + break; + } + } + + // Transfer upload, etc. related + if (isset($this->file)) { + if (!file_exists($this->file)) { + return PEAR::raiseError('File does not exist: '.$this->file); + } + + $this->_fp = fopen($this->file, 'r'); + if (!is_resource($this->_fp)) { + return PEAR::raiseError('Could not open file: '.$this->file); + } + + if (!isset($this->fileSize)) { + $this->fileSize = filesize($this->file); + } + + $ret = curl_setopt($this->_ch, CURLOPT_INFILE, $this->_fp); + $ret = curl_setopt($this->_ch, CURLOPT_INFILESIZE, $this->fileSize); + $ret = curl_setopt($this->_ch, CURLOPT_UPLOAD, true); + } + + if (isset($this->fields)) { + $sets = null; + if (!isset($this->type)) { + $this->type = 'post'; + $ret = curl_setopt($this->_ch, CURLOPT_POST, true); + } + + // If fields is an array then turn it into a string. Sometimes + // cURL doesn't like fields as an array. + // Exception: if a value is prefixed with "@" and the rest of the + // value resolves to an existing file, then pass + // the values as the original array. + if (is_array($this->fields)) { + $sets = array(); + foreach ($this->fields as $key => $val) { + if (strlen($val) > 1 && $val{0} == '@') { + $file = substr($val, 1); + if (is_file($file) && is_readable($file)) { + $sets = null; + break; + } + } + $sets[] = urlencode($key) . '=' . urlencode($val); + } + } + + if (!is_null($sets)) { + $fields = implode('&', $sets); + } else { + $fields = $this->fields; + } + $ret = curl_setopt($this->_ch, CURLOPT_POSTFIELDS, $fields); + } + + // Error related + if ($this->progress === true) { + $ret = curl_setopt($this->_ch, CURLOPT_PROGRESS, true); + } + + if ($this->verbose === true) { + $ret = curl_setopt($this->_ch, CURLOPT_VERBOSE, true); + } + + // If a Location: header is passed then follow it + $ret = curl_setopt($this->_ch, + CURLOPT_FOLLOWLOCATION, + $this->followLocation); + + // If a timeout is set and is greater then zero then set it + if (is_numeric($this->timeout) && $this->timeout > 0) { + $ret = curl_setopt($this->_ch, CURLOPT_TIMEOUT, $this->timeout); + } + + if (isset($this->userAgent)) { + $ret = curl_setopt($this->_ch, CURLOPT_USERAGENT, $this->userAgent); + } + + // Cookies + if (is_array($this->cookies) && count($this->cookies)) { + $cookieData = ''; + foreach ($this->cookies as $name => $value) { + $cookieData .= $name . '=' . $value . ';'; + } + + $ret = curl_setopt($this->_ch, CURLOPT_COOKIE, $cookieData); + } + + // Other HTTP headers + if ($this->httpHeaders !== null) { + if (is_array($this->httpHeaders)) { + $ret = curl_setopt($this->_ch, + CURLOPT_HTTPHEADER, + $this->httpHeaders); + } else { + return PEAR::raiseError('Net_Curl::$httpHeaders must be an array'); + } + } + + $ret = curl_exec($this->_ch); + + // Close the file before we return anything + if (is_resource($this->_fp)) { + fclose($this->_fp); + } + + if (curl_errno($this->_ch)) { + return PEAR::raiseError(curl_error($this->_ch), curl_errno($this->_ch)); + } + + // Check to make sure we get a 2XX/3XX code and not a 404 or something. + $info = $this->getInfo(); + if (!isset($info['http_code'])) { + return PEAR::raiseError('Unknown or invalid HTTP response'); + } else { + $type = substr($info['http_code'], 0, 1); + if ($type != 2 && $type != 3) { + return PEAR::raiseError('Unexpected HTTP code: ' . + $info['http_code']); + } + } + + return $ret; + } + // }}} + + // {{{ setOption($option, $value) + /** + * Sets an option for your cURL session. Please note that the cURL handler + * is NOT created before execute(). This is for error checking purposes. + * You should use setOption() in the following manner: + * + * + * create(); + * if (!PEAR::isError($check)) { + * $curl->setOption(CURLOPT_FOO, 'bar'); + * $result = $curl->execute(); + * if (!PEAR::isError($result)) { + * echo $result; + * } + * } + * + * ?> + * + * + * @param int $option cURL constant (ie. CURLOPT_URL) + * @param mixed $value The option's value + * + * @author Joe Stump + * @access public + * @return boolean + */ + function setOption($option, $value) + { + if (is_resource($this->_ch)) { + return curl_setopt($this->_ch, $option, $value); + } + + return false; + } + // }}} + + // {{{ getInfo() + /** + * Returns the info from the cURL session. PEAR_Error if you try and run + * this before you execute the session. + * + * @author Joe Stump + * @access public + * @return mixed PEAR_Error if there is no resource, info on success + */ + function getInfo() + { + if (is_resource($this->_ch)) { + return curl_getinfo($this->_ch); + } + + return PEAR::isError('cURL handler does not exist!'); + } + // }}} + + // {{{ create() + /** + * Creates a cURL resource. If curl_init() doesn't exist or we could not + * create a resource it will error out. + * + * @author Joe Stump + * @return boolean TRUE on success, PEAR_Error on failure + */ + function create() + { + if (!PEAR::loadExtension('curl')) { + return PEAR::raiseError('CURL extension is not available'); + } + if (!function_exists('curl_init')) { + return PEAR::raiseError('Function curl_init() not found'); + } + + $this->_ch = curl_init(); + if (!is_resource($this->_ch)) { + return PEAR::raiseError('Could not initialize cURL handler'); + } + + return true; + } + // }}} + + // {{{ verboseAll() + /** + * Sets verbose output + * + * Turns on super debugging mode by not suppressing errors, turning on + * verbose mode, showing headers and displaying progress. + * + * @access public + * @author David Costa + * @return void + */ + function verboseAll() + { + $this->verbose = true; + $this->mute = false; + $this->header = true; + $this->progress = true; + } + // }}} + + // {{{ verbose_all() + /** + * Sets verbose output + * + * @access public + * @author David Costa + * @return void + * @deprecated + */ + function verbose_all() + { + $this->verboseAll(); + PEAR::raiseError('Net_Curl::verbose_all() is deprecated! Please use Net_Curl::verboseAll()'."
    \n", null, PEAR_ERROR_PRINT); + } + // }}} + + // {{{ close() + /** + * Closes the curl transfer and finishes the object (kinda ;) + * + * @access public + * @author Sterling Hughes + * @return void + * @since PHP 4.0.5 + */ + function close() + { + if (is_resource($this->_ch)) { + curl_close($this->_ch); + } + } + // }}} + + // {{{ _mapDeprecatedVariables() + /** + * Maps deprecated variables into the appropriate places. It also throws + * the necessary notices. + * + * @author Joe Stump + * @access private + * @return void + */ + function _mapDeprecatedVariables() + { + $bad = array(); + if ($this->follow_location !== false) { + if ($this->follow_location > 0) { + $this->followLocation = true; + } else { + $this->followLocation = false; + } + + $bad[] = array('follow_location', 'followLocation'); + } + + if ($this->return_transfer !== false) { + if ($this->return_transfer > 0) { + $this->returnTransfer = true; + } else { + $this->returnTransfer = false; + } + + $bad[] = array('return_transfer', 'returnTransfer'); + } + + if ($this->file_size !== false) { + $this->fileSize = $this->file_size; + $bad[] = array('file_size', 'fileSize'); + } + + if ($this->http_headers !== false) { + $this->httpHeaders = $this->http_headers; + $bad[] = array('http_headers', 'httpHeaders'); + } + + foreach ($bad as $map) { + PEAR::raiseError('Net_Curl::$'. $map[0]. ' is deprecated! Please use Net_Curl::$'.$map[1]." instead!
    \n", null, PEAR_ERROR_PRINT); + } + } + // }}} + + // {{{ __destruct() + /** + * PHP 5.x destructor. + * + * Runs Net_Curl::close() to make sure we close our cURL connection. + * + * @author Joe Stump + * @see Net_Curl::close() + */ + function __destruct() + { + $this->close(); + } + // }}} +} + +?> diff --git a/thirdparty/pear/Net/DIME.php b/thirdparty/pear/Net/DIME.php new file mode 100644 index 000000000..1087f2178 --- /dev/null +++ b/thirdparty/pear/Net/DIME.php @@ -0,0 +1,647 @@ + | +// | Ralf Hofmann | +// +----------------------------------------------------------------------+ +// +// $Id: DIME.php,v 1.5 2002/09/29 01:55:16 shane Exp $ +// + +require_once 'PEAR.php'; +/** + * + * DIME Encoding/Decoding + * + * What is it? + * This class enables you to manipulate and build + * a DIME encapsulated message. + * + * http://www.ietf.org/internet-drafts/draft-nielsen-dime-02.txt + * + * 09/18/02 Ralf - A huge number of changes to be compliant + * with the DIME Specification Release 17 June 2002 + * + * TODO: lots of stuff needs to be tested. + * Definitily have to go through DIME spec and + * make things work right, most importantly, sec 3.3 + * make examples, document + * + * see test/dime_mesage_test.php for example of usage + * + * @author Shane Caraveo , + * Ralf Hofmann + * @version $Revision: 1.5 $ + * @package Net_DIME + */ +define('NET_DIME_TYPE_UNCHANGED',0x00); +define('NET_DIME_TYPE_MEDIA',0x01); +define('NET_DIME_TYPE_URI',0x02); +define('NET_DIME_TYPE_UNKNOWN',0x03); +define('NET_DIME_TYPE_NONE',0x04); + +define('NET_DIME_VERSION',0x0001); + +define('NET_DIME_RECORD_HEADER',12); + +define('NET_DIME_FLAGS', 0); +define('NET_DIME_OPTS_LEN', 1); +define('NET_DIME_ID_LEN', 2); +define('NET_DIME_TYPE_LEN', 3); +define('NET_DIME_DATA_LEN', 4); +define('NET_DIME_OPTS', 5); +define('NET_DIME_ID', 6); +define('NET_DIME_TYPE', 7); +define('NET_DIME_DATA', 8); + +class Net_DIME_Record extends PEAR +{ + // these are used to hold the padded length + var $OPTS_LENGTH = 0; + var $ID_LENGTH = 0; + var $TYPE_LENGTH = 0; + var $DATA_LENGTH = 0; + var $_haveOpts = FALSE; + var $_haveID = FALSE; + var $_haveType = FALSE; + var $_haveData = FALSE; + var $debug = FALSE; + var $padstr = "\0"; + /** + * Elements + * [NET_DIME_FLAGS], 16 bits: VERSION:MB:ME:CF:TYPE_T + * [NET_DIME_OPTS_LEN], 16 bits: OPTIONS_LENGTH + * [NET_DIME_ID_LEN], 16 bits: ID_LENGTH + * [NET_DIME_TYPE_LEN], 16 bits: TYPE_LENGTH + * [NET_DIME_DATA_LEN], 32 bits: DATA_LENGTH + * [NET_DIME_OPTS] : OPTIONS + * [NET_DIME_ID] : ID + * [NET_DIME_TYPE] : TYPE + * [NET_DIME_DATA] : DATA + */ + var $Elements = array(NET_DIME_FLAGS => 0, NET_DIME_OPTS_LEN => 0, + NET_DIME_ID_LEN => 0, NET_DIME_TYPE_LEN => 0, + NET_DIME_DATA_LEN => 0, + NET_DIME_OPTS => '', + NET_DIME_ID => '', + NET_DIME_TYPE => '', + NET_DIME_DATA => ''); + + function Net_DIME_Record($debug = FALSE) + { + $this->debug = $debug; + if ($debug) $this->padstr = '*'; + } + + function setMB() + { + $this->Elements[NET_DIME_FLAGS] |= 0x0400; + } + + function setME() + { + $this->Elements[NET_DIME_FLAGS] |= 0x0200; + } + + function setCF() + { + $this->Elements[NET_DIME_FLAGS] |= 0x0100; + } + + function isChunk() + { + return $this->Elements[NET_DIME_FLAGS] & 0x0100; + } + + function isEnd() + { + return $this->Elements[NET_DIME_FLAGS] & 0x0200; + } + + function isStart() + { + return $this->Elements[NET_DIME_FLAGS] & 0x0400; + } + + function getID() + { + return $this->Elements[NET_DIME_ID]; + } + + function getType() + { + return $this->Elements[NET_DIME_TYPE]; + } + + function getData() + { + return $this->Elements[NET_DIME_DATA]; + } + + function getDataLength() + { + return $this->Elements[NET_DIME_DATA_LEN]; + } + + function setType($typestring, $type=NET_DIME_TYPE_UNKNOWN) + { + $typelen = strlen($typestring) & 0xFFFF; + $type = $type << 4; + $this->Elements[NET_DIME_FLAGS] = ($this->Elements[NET_DIME_FLAGS] & 0xFF0F) | $type; + $this->Elements[NET_DIME_TYPE_LEN] = $typelen; + $this->TYPE_LENGTH = $this->_getPadLength($typelen); + $this->Elements[NET_DIME_TYPE] = $typestring; + } + + function generateID() + { + if(!class_exists('G')){ + $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); + $docuroot = explode( '/', $realdocuroot ); + array_pop( $docuroot ); + $pathhome = implode( '/', $docuroot ) . '/'; + array_pop( $docuroot ); + $pathTrunk = implode( '/', $docuroot ) . '/'; + require_once($pathTrunk.'gulliver/system/class.g.php'); + } + $id = G::encryptOld(time()); + $this->setID($id); + return $id; + } + + function setID($id) + { + $idlen = strlen($id) & 0xFFFF; + $this->Elements[NET_DIME_ID_LEN] = $idlen; + $this->ID_LENGTH = $this->_getPadLength($idlen); + $this->Elements[NET_DIME_ID] = $id; + } + + function setData($data, $size=0) + { + $datalen = $size?$size:strlen($data); + $this->Elements[NET_DIME_DATA_LEN] = $datalen; + $this->DATA_LENGTH = $this->_getPadLength($datalen); + $this->Elements[NET_DIME_DATA] = $data; + } + + function encode() + { + // insert version + $this->Elements[NET_DIME_FLAGS] = ($this->Elements[NET_DIME_FLAGS] & 0x07FF) | (NET_DIME_VERSION << 11); + + // the real dime encoding + $format = '%c%c%c%c%c%c%c%c%c%c%c%c'. + '%'.$this->OPTS_LENGTH.'s'. + '%'.$this->ID_LENGTH.'s'. + '%'.$this->TYPE_LENGTH.'s'. + '%'.$this->DATA_LENGTH.'s'; + return sprintf($format, + ($this->Elements[NET_DIME_FLAGS]&0x0000FF00)>>8, + ($this->Elements[NET_DIME_FLAGS]&0x000000FF), + ($this->Elements[NET_DIME_OPTS_LEN]&0x0000FF00)>>8, + ($this->Elements[NET_DIME_OPTS_LEN]&0x000000FF), + ($this->Elements[NET_DIME_ID_LEN]&0x0000FF00)>>8, + ($this->Elements[NET_DIME_ID_LEN]&0x000000FF), + ($this->Elements[NET_DIME_TYPE_LEN]&0x0000FF00)>>8, + ($this->Elements[NET_DIME_TYPE_LEN]&0x000000FF), + ($this->Elements[NET_DIME_DATA_LEN]&0xFF000000)>>24, + ($this->Elements[NET_DIME_DATA_LEN]&0x00FF0000)>>16, + ($this->Elements[NET_DIME_DATA_LEN]&0x0000FF00)>>8, + ($this->Elements[NET_DIME_DATA_LEN]&0x000000FF), + str_pad($this->Elements[NET_DIME_OPTS], $this->OPTS_LENGTH, $this->padstr), + str_pad($this->Elements[NET_DIME_ID], $this->ID_LENGTH, $this->padstr), + str_pad($this->Elements[NET_DIME_TYPE], $this->TYPE_LENGTH, $this->padstr), + str_pad($this->Elements[NET_DIME_DATA], $this->DATA_LENGTH, $this->padstr)); + } + + function _getPadLength($len) + { + $pad = 0; + if ($len) { + $pad = $len % 4; + if ($pad) $pad = 4 - $pad; + } + return $len + $pad; + } + + function decode(&$data) + { + // REAL DIME decoding + $this->Elements[NET_DIME_FLAGS] = (hexdec(bin2hex($data[0]))<<8) + hexdec(bin2hex($data[1])); + $this->Elements[NET_DIME_OPTS_LEN] = (hexdec(bin2hex($data[2]))<<8) + hexdec(bin2hex($data[3])); + $this->Elements[NET_DIME_ID_LEN] = (hexdec(bin2hex($data[4]))<<8) + hexdec(bin2hex($data[5])); + $this->Elements[NET_DIME_TYPE_LEN] = (hexdec(bin2hex($data[6]))<<8) + hexdec(bin2hex($data[7])); + $this->Elements[NET_DIME_DATA_LEN] = (hexdec(bin2hex($data[8]))<<24) + + (hexdec(bin2hex($data[9]))<<16) + + (hexdec(bin2hex($data[10]))<<8) + + hexdec(bin2hex($data[11])); + $p = 12; + + $version = (($this->Elements[NET_DIME_FLAGS]>>11) & 0x001F); + + if ($version == NET_DIME_VERSION) + { + $this->OPTS_LENGTH = $this->_getPadLength($this->Elements[NET_DIME_OPTS_LEN]); + $this->ID_LENGTH = $this->_getPadLength($this->Elements[NET_DIME_ID_LEN]); + $this->TYPE_LENGTH = $this->_getPadLength($this->Elements[NET_DIME_TYPE_LEN]); + $this->DATA_LENGTH = $this->_getPadLength($this->Elements[NET_DIME_DATA_LEN]); + + $datalen = strlen($data); + $this->Elements[NET_DIME_OPTS] = substr($data,$p,$this->Elements[NET_DIME_OPTS_LEN]); + $this->_haveOpts = (strlen($this->Elements[NET_DIME_OPTS]) == $this->Elements[NET_DIME_OPTS_LEN]); + if ($this->_haveOpts) { + $p += $this->OPTS_LENGTH; + $this->Elements[NET_DIME_ID] = substr($data,$p,$this->Elements[NET_DIME_ID_LEN]); + $this->_haveID = (strlen($this->Elements[NET_DIME_ID]) == $this->Elements[NET_DIME_ID_LEN]); + if ($this->_haveID) { + $p += $this->ID_LENGTH; + $this->Elements[NET_DIME_TYPE] = substr($data,$p,$this->Elements[NET_DIME_TYPE_LEN]); + $this->_haveType = (strlen($this->Elements[NET_DIME_TYPE]) == $this->Elements[NET_DIME_TYPE_LEN]); + if ($this->_haveType) { + $p += $this->TYPE_LENGTH; + $this->Elements[NET_DIME_DATA] = substr($data,$p,$this->Elements[NET_DIME_DATA_LEN]); + $this->_haveData = (strlen($this->Elements[NET_DIME_DATA]) == $this->Elements[NET_DIME_DATA_LEN]); + if ($this->_haveData) { + $p += $this->DATA_LENGTH; + } else { + $p += strlen($this->Elements[NET_DIME_DATA]); + } + } else { + $p += strlen($this->Elements[NET_DIME_TYPE]); + } + } else { + $p += strlen($this->Elements[NET_DIME_ID]); + } + } else { + $p += strlen($this->Elements[NET_DIME_OPTS]); + } + } + return substr($data, $p); + } + + function addData(&$data) + { + $datalen = strlen($data); + $p = 0; + if (!$this->_haveOpts) { + $have = strlen($this->Elements[NET_DIME_OPTS]); + $this->Elements[NET_DIME_OPTS] .= substr($data,$p,$this->Elements[NET_DIME_OPTS_LEN]-$have); + $this->_haveOpts = (strlen($this->Elements[NET_DIME_OPTS]) == $this->Elements[DIME_OTPS_LEN]); + if (!$this->_haveOpts) return NULL; + $p += $this->OPTS_LENGTH-$have; + } + if (!$this->_haveID) { + $have = strlen($this->Elements[NET_DIME_ID]); + $this->Elements[NET_DIME_ID] .= substr($data,$p,$this->Elements[NET_DIME_ID_LEN]-$have); + $this->_haveID = (strlen($this->Elements[NET_DIME_ID]) == $this->Elements[NET_DIME_ID_LEN]); + if (!$this->_haveID) return NULL; + $p += $this->ID_LENGTH-$have; + } + if (!$this->_haveType && $p < $datalen) { + $have = strlen($this->Elements[NET_DIME_TYPE]); + $this->Elements[NET_DIME_TYPE] .= substr($data,$p,$this->Elements[NET_DIME_TYPE_LEN]-$have); + $this->_haveType = (strlen($this->Elements[NET_DIME_TYPE]) == $this->Elements[NET_DIME_TYPE_LEN]); + if (!$this->_haveType) return NULL; + $p += $this->TYPE_LENGTH-$have; + } + if (!$this->_haveData && $p < $datalen) { + $have = strlen($this->Elements[NET_DIME_DATA]); + $this->Elements[NET_DIME_DATA] .= substr($data,$p,$this->Elements[NET_DIME_DATA_LEN]-$have); + $this->_haveData = (strlen($this->Elements[NET_DIME_DATA]) == $this->Elements[NET_DIME_DATA_LEN]); + if (!$this->_haveData) return NULL; + $p += $this->DATA_LENGTH-$have; + } + return substr($data,$p); + } +} + + +class Net_DIME_Message extends PEAR +{ + + var $record_size = 4096; + #var $records =array(); + var $parts = array(); + var $currentPart = -1; + var $stream = NULL; + var $_currentRecord; + var $_proc = array(); + var $type; + var $typestr; + var $mb = 1; + var $me = 0; + var $cf = 0; + var $id = NULL; + var $debug = FALSE; + /** + * constructor + * + * this currently takes a file pointer as provided + * by fopen + * + * TODO: integrate with the php streams stuff + */ + function Net_DIME_Message($stream=NULL, $record_size = 4096, $debug = FALSE) + { + $this->stream = $stream; + $this->record_size = $record_size; + $this->debug = $debug; + } + + function _makeRecord(&$data, $typestr='', $id=NULL, $type=NET_DIME_TYPE_UNKNOWN) + { + $record = new Net_DIME_Record($this->debug); + if ($this->mb) { + $record->setMB(); + // all subsequent records are not message begin! + $this->mb = 0; + } + if ($this->me) $record->setME(); + if ($this->cf) $record->setCF(); + $record->setData($data); + $record->setType($typestr,$type); + if ($id) $record->setID($id); + #if ($this->debug) { + # print str_replace('\0','*',$record->encode()); + #} + return $record->encode(); + } + + function startChunk(&$data, $typestr='', $id=NULL, $type=NET_DIME_TYPE_UNKNOWN) + { + if(!class_exists('G')){ + $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); + $docuroot = explode( '/', $realdocuroot ); + array_pop( $docuroot ); + $pathhome = implode( '/', $docuroot ) . '/'; + array_pop( $docuroot ); + $pathTrunk = implode( '/', $docuroot ) . '/'; + require_once($pathTrunk.'gulliver/system/class.g.php'); + } + $this->me = 0; + $this->cf = 1; + $this->type = $type; + $this->typestr = $typestr; + if ($id) { + $this->id = $id; + } else { + $this->id = G::encryptOld(time()); + } + return $this->_makeRecord($data, $this->typestr, $this->id, $this->type); + } + + function doChunk(&$data) + { + $this->me = 0; + $this->cf = 1; + return $this->_makeRecord($data, NULL, NULL, NET_DIME_TYPE_UNCHANGED); + } + + function endChunk() + { + $this->cf = 0; + $data = NULL; + $rec = $this->_makeRecord($data, NULL, NULL, NET_DIME_TYPE_UNCHANGED); + $this->id = 0; + $this->cf = 0; + $this->id = 0; + $this->type = NET_DIME_TYPE_UNKNOWN; + $this->typestr = NULL; + return $rec; + } + + function endMessage() + { + $this->me = 1; + $data = NULL; + $rec = $this->_makeRecord($data, NULL, NULL, NET_DIME_TYPE_NONE); + $this->me = 0; + $this->mb = 1; + $this->id = 0; + return $rec; + } + + /** + * sendRecord + * + * given a chunk of data, it creates DIME records + * and writes them to the stream + * + */ + function sendData(&$data, $typestr='', $id=NULL, $type=NET_DIME_TYPE_UNKNOWN) + { + $len = strlen($data); + if ($len > $this->record_size) { + $chunk = substr($data, 0, $this->record_size); + $p = $this->record_size; + $rec = $this->startChunk($chunk,$typestr,$id,$type); + fwrite($this->stream, $rec); + while ($p < $len) { + $chunk = substr($data, $p, $this->record_size); + $p += $this->record_size; + $rec = $this->doChunk($chunk); + fwrite($this->stream, $rec); + } + $rec = $this->endChunk(); + fwrite($this->stream, $rec); + return; + } + $rec = $this->_makeRecord($data, $typestr,$id,$type); + fwrite($this->stream, $rec); + } + + function sendEndMessage() + { + $rec = $this->endMessage(); + fwrite($this->stream, $rec); + } + + /** + * sendFile + * + * given a filename, it reads the file, + * creates records and writes them to the stream + * + */ + function sendFile($filename, $typestr='', $id=NULL, $type=NET_DIME_TYPE_UNKNOWN) + { + $f = fopen($filename, "rb"); + if ($f) { + if ($data = fread($f, $this->record_size)) { + $this->startChunk($data,$typestr,$id,$type); + } + while ($data = fread($f, $this->record_size)) { + $this->doChunk($data,$typestr,$id,$type); + } + $this->endChunk(); + fclose($f); + } + } + + /** + * encodeData + * + * given data, encode it in DIME + * + */ + function encodeData($data, $typestr='', $id=NULL, $type=NET_DIME_TYPE_UNKNOWN) + { + $len = strlen($data); + $resp = ''; + if ($len > $this->record_size) { + $chunk = substr($data, 0, $this->record_size); + $p = $this->record_size; + $resp .= $this->startChunk($chunk,$typestr,$id,$type); + while ($p < $len) { + $chunk = substr($data, $p, $this->record_size); + $p += $this->record_size; + $resp .= $this->doChunk($chunk); + } + $resp .= $this->endChunk(); + } else { + $resp .= $this->_makeRecord($data, $typestr,$id,$type); + } + return $resp; + } + + /** + * sendFile + * + * given a filename, it reads the file, + * creates records and writes them to the stream + * + */ + function encodeFile($filename, $typestr='', $id=NULL, $type=NET_DIME_TYPE_UNKNOWN) + { + $f = fopen($filename, "rb"); + if ($f) { + if ($data = fread($f, $this->record_size)) { + $resp = $this->startChunk($data,$typestr,$id,$type); + } + while ($data = fread($f, $this->record_size)) { + $resp = $this->doChunk($data,$typestr,$id,$type); + } + $resp = $this->endChunk(); + fclose($f); + } + return $resp; + } + + /** + * _processData + * + * creates Net_DIME_Records from provided data + * + */ + function _processData(&$data) + { + $leftover = NULL; + if (!$this->_currentRecord) { + $this->_currentRecord = new Net_DIME_Record($this->debug); + $data = $this->_currentRecord->decode($data); + } else { + $data = $this->_currentRecord->addData($data); + } + + if ($this->_currentRecord->_haveData) { + if (count($this->parts)==0 && !$this->_currentRecord->isStart()) { + // raise an error! + return PEAR::raiseError('First Message is not a DIME begin record!'); + } + + if ($this->_currentRecord->isEnd() && $this->_currentRecord->getDataLength()==0) { + return NULL; + } + + if ($this->currentPart < 0 && !$this->_currentRecord->isChunk()) { + $this->parts[] = array(); + $this->currentPart = count($this->parts)-1; + $this->parts[$this->currentPart]['id'] = $this->_currentRecord->getID(); + $this->parts[$this->currentPart]['type'] = $this->_currentRecord->getType(); + $this->parts[$this->currentPart]['data'] = $this->_currentRecord->getData(); + $this->currentPart = -1; + } else { + if ($this->currentPart < 0) { + $this->parts[] = array(); + $this->currentPart = count($this->parts)-1; + $this->parts[$this->currentPart]['id'] = $this->_currentRecord->getID(); + $this->parts[$this->currentPart]['type'] = $this->_currentRecord->getType(); + $this->parts[$this->currentPart]['data'] = $this->_currentRecord->getData(); + } else { + $this->parts[$this->currentPart]['data'] .= $this->_currentRecord->getData(); + if (!$this->_currentRecord->isChunk()) { + // we reached the end of the chunk + $this->currentPart = -1; + } + } + } + #$this->records[] = $this->_currentRecord; + if (!$this->_currentRecord->isEnd()) $this->_currentRecord = NULL; + } + return NULL; + } + + /** + * decodeData + * + * decodes a DIME encrypted string of data + * + */ + function decodeData(&$data) { + while (strlen($data) >= NET_DIME_RECORD_HEADER) { + $err = $this->_processData($data); + if (PEAR::isError($err)) { + return $err; + } + } + } + + /** + * read + * + * reads the stream and creates + * an array of records + * + * it can accept the start of a previously read buffer + * this is usefull in situations where you need to read + * headers before discovering that the data is DIME encoded + * such as in the case of reading an HTTP response. + */ + function read($buf=NULL) + { + while ($data = fread($this->stream, 8192)) { + if ($buf) { + $data = $buf.$data; + $buf = NULL; + } + if ($this->debug) + echo "read: ".strlen($data)." bytes\n"; + $err = $this->decodeData($data); + if (PEAR::isError($err)) { + return $err; + } + + // store any leftover data to be used again + // should be < NET_DIME_RECORD_HEADER bytes + $buf = $data; + } + if (!$this->_currentRecord || !$this->_currentRecord->isEnd()) { + return PEAR::raiseError('reached stream end without end record'); + } + return NULL; + } +} +?> \ No newline at end of file diff --git a/thirdparty/pear/Net/FTP.php b/thirdparty/pear/Net/FTP.php new file mode 100644 index 000000000..73bac26f0 --- /dev/null +++ b/thirdparty/pear/Net/FTP.php @@ -0,0 +1,2346 @@ + + * @author Jorrit Schippers + * @copyright 1997-2008 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version CVS: $Id: FTP.php,v 1.53.2.10 2008/05/19 18:01:08 jschippers Exp $ + * @link http://pear.php.net/package/Net_FTP + * @since File available since Release 0.0.1 + */ + +/** + * Include PEAR.php to obtain the PEAR base class + */ +require_once 'PEAR.php'; + +/** + * Option to let the ls() method return only files. + * + * @since 1.3 + * @name NET_FTP_FILES_ONLY + * @see Net_FTP::ls() + */ +define('NET_FTP_FILES_ONLY', 0, true); + +/** + * Option to let the ls() method return only directories. + * + * @since 1.3 + * @name NET_FTP_DIRS_ONLY + * @see Net_FTP::ls() + */ +define('NET_FTP_DIRS_ONLY', 1, true); + +/** + * Option to let the ls() method return directories and files (default). + * + * @since 1.3 + * @name NET_FTP_DIRS_FILES + * @see Net_FTP::ls() + */ +define('NET_FTP_DIRS_FILES', 2, true); + +/** + * Option to let the ls() method return the raw directory listing from ftp_rawlist() + * + * @since 1.3 + * @name NET_FTP_RAWLIST + * @see Net_FTP::ls() + */ +define('NET_FTP_RAWLIST', 3, true); + +/** + * Error code to indicate a failed connection + * This error code indicates, that the connection you tryed to set up + * could not be established. Check your connection settings (host & port)! + * + * @since 1.3 + * @name NET_FTP_ERR_CONNECT_FAILED + * @see Net_FTP::connect() + */ +define('NET_FTP_ERR_CONNECT_FAILED', -1); + +/** + * Error code to indicate a failed login + * This error code indicates, that the login to the FTP server failed. Check + * your user data (username & password). + * + * @since 1.3 + * @name NET_FTP_ERR_LOGIN_FAILED + * @see Net_FTP::login() + */ +define('NET_FTP_ERR_LOGIN_FAILED', -2); + +/** + * Error code to indicate a failed directory change + * The cd() method failed. Ensure that the directory you wanted to access exists. + * + * @since 1.3 + * @name NET_FTP_ERR_DIRCHANGE_FAILED + * @see Net_FTP::cd() + */ +define('NET_FTP_ERR_DIRCHANGE_FAILED', 2); // Compatibillity reasons! + +/** + * Error code to indicate that Net_FTP could not determine the current path + * The cwd() method failed and could not determine the path you currently reside + * in on the FTP server. + * + * @since 1.3 + * @name NET_FTP_ERR_DETERMINEPATH_FAILED + * @see Net_FTP::pwd() + */ +define('NET_FTP_ERR_DETERMINEPATH_FAILED', 4); // Compatibillity reasons! + +/** + * Error code to indicate that the creation of a directory failed + * The directory you tryed to create could not be created. Check the + * access rights on the parent directory! + * + * @since 1.3 + * @name NET_FTP_ERR_CREATEDIR_FAILED + * @see Net_FTP::mkdir() + */ +define('NET_FTP_ERR_CREATEDIR_FAILED', -4); + +/** + * Error code to indicate that the EXEC execution failed. + * The execution of a command using EXEC failed. Ensure, that your + * FTP server supports the EXEC command. + * + * @since 1.3 + * @name NET_FTP_ERR_EXEC_FAILED + * @see Net_FTP::execute() + */ +define('NET_FTP_ERR_EXEC_FAILED', -5); + +/** + * Error code to indicate that the SITE command failed. + * The execution of a command using SITE failed. Ensure, that your + * FTP server supports the SITE command. + * + * @since 1.3 + * @name NET_FTP_ERR_SITE_FAILED + * @see Net_FTP::site() + */ +define('NET_FTP_ERR_SITE_FAILED', -6); + +/** + * Error code to indicate that the CHMOD command failed. + * The execution of CHMOD failed. Ensure, that your + * FTP server supports the CHMOD command and that you have the appropriate + * access rights to use CHMOD. + * + * @since 1.3 + * @name NET_FTP_ERR_CHMOD_FAILED + * @see Net_FTP::chmod() + */ +define('NET_FTP_ERR_CHMOD_FAILED', -7); + +/** + * Error code to indicate that a file rename failed + * The renaming of a file on the server failed. Ensure that you have the + * appropriate access rights to rename the file. + * + * @since 1.3 + * @name NET_FTP_ERR_RENAME_FAILED + * @see Net_FTP::rename() + */ +define('NET_FTP_ERR_RENAME_FAILED', -8); + +/** + * Error code to indicate that the MDTM command failed + * The MDTM command is not supported for directories. Ensure that you gave + * a file path to the mdtm() method, not a directory path. + * + * @since 1.3 + * @name NET_FTP_ERR_MDTMDIR_UNSUPPORTED + * @see Net_FTP::mdtm() + */ +define('NET_FTP_ERR_MDTMDIR_UNSUPPORTED', -9); + +/** + * Error code to indicate that the MDTM command failed + * The MDTM command failed. Ensure that your server supports the MDTM command. + * + * @since 1.3 + * @name NET_FTP_ERR_MDTM_FAILED + * @see Net_FTP::mdtm() + */ +define('NET_FTP_ERR_MDTM_FAILED', -10); + +/** + * Error code to indicate that a date returned by the server was misformated + * A date string returned by your server seems to be missformated and could not be + * parsed. Check that the server is configured correctly. If you're sure, please + * send an email to the auhtor with a dumped output of + * $ftp->ls('./', NET_FTP_RAWLIST); to get the date format supported. + * + * @since 1.3 + * @name NET_FTP_ERR_DATEFORMAT_FAILED + * @see Net_FTP::mdtm(), Net_FTP::ls() + */ +define('NET_FTP_ERR_DATEFORMAT_FAILED', -11); + +/** + * Error code to indicate that the SIZE command failed + * The determination of the filesize of a file failed. Ensure that your server + * supports the SIZE command. + * + * @since 1.3 + * @name NET_FTP_ERR_SIZE_FAILED + * @see Net_FTP::size() + */ +define('NET_FTP_ERR_SIZE_FAILED', -12); + +/** + * Error code to indicate that a local file could not be overwritten + * You specified not to overwrite files. Therefore the local file has not been + * overwriten. If you want to get the file overwriten, please set the option to + * do so. + * + * @since 1.3 + * @name NET_FTP_ERR_OVERWRITELOCALFILE_FORBIDDEN + * @see Net_FTP::get(), Net_FTP::getRecursive() + */ +define('NET_FTP_ERR_OVERWRITELOCALFILE_FORBIDDEN', -13); + +/** + * Error code to indicate that a local file could not be overwritten + * Also you specified to overwrite the local file you want to download to, + * it has not been possible to do so. Check that you have the appropriate access + * rights on the local file to overwrite it. + * + * @since 1.3 + * @name NET_FTP_ERR_OVERWRITELOCALFILE_FAILED + * @see Net_FTP::get(), Net_FTP::getRecursive() + */ +define('NET_FTP_ERR_OVERWRITELOCALFILE_FAILED', -14); + +/** + * Error code to indicate that the file you wanted to upload does not exist + * The file you tried to upload does not exist. Ensure that it exists. + * + * @since 1.3 + * @name NET_FTP_ERR_LOCALFILENOTEXIST + * @see Net_FTP::put(), Net_FTP::putRecursive() + */ +define('NET_FTP_ERR_LOCALFILENOTEXIST', -15); + +/** + * Error code to indicate that a remote file could not be overwritten + * You specified not to overwrite files. Therefore the remote file has not been + * overwriten. If you want to get the file overwriten, please set the option to + * do so. + * + * @since 1.3 + * @name NET_FTP_ERR_OVERWRITEREMOTEFILE_FORBIDDEN + * @see Net_FTP::put(), Net_FTP::putRecursive() + */ +define('NET_FTP_ERR_OVERWRITEREMOTEFILE_FORBIDDEN', -16); + +/** + * Error code to indicate that the upload of a file failed + * The upload you tried failed. Ensure that you have appropriate access rights + * to upload the desired file. + * + * @since 1.3 + * @name NET_FTP_ERR_UPLOADFILE_FAILED + * @see Net_FTP::put(), Net_FTP::putRecursive() + */ +define('NET_FTP_ERR_UPLOADFILE_FAILED', -17); + +/** + * Error code to indicate that you specified an incorrect directory path + * The remote path you specified seems not to be a directory. Ensure that + * the path you specify is a directory and that the path string ends with + * a /. + * + * @since 1.3 + * @name NET_FTP_ERR_REMOTEPATHNODIR + * @see Net_FTP::putRecursive(), Net_FTP::getRecursive() + */ +define('NET_FTP_ERR_REMOTEPATHNODIR', -18); + +/** + * Error code to indicate that you specified an incorrect directory path + * The local path you specified seems not to be a directory. Ensure that + * the path you specify is a directory and that the path string ends with + * a /. + * + * @since 1.3 + * @name NET_FTP_ERR_LOCALPATHNODIR + * @see Net_FTP::putRecursive(), Net_FTP::getRecursive() + */ +define('NET_FTP_ERR_LOCALPATHNODIR', -19); + +/** + * Error code to indicate that a local directory failed to be created + * You tried to create a local directory through getRecursive() method, + * which has failed. Ensure that you have the appropriate access rights + * to create it. + * + * @since 1.3 + * @name NET_FTP_ERR_CREATELOCALDIR_FAILED + * @see Net_FTP::getRecursive() + */ +define('NET_FTP_ERR_CREATELOCALDIR_FAILED', -20); + +/** + * Error code to indicate that the provided hostname was incorrect + * The hostname you provided was invalid. Ensure to provide either a + * full qualified domain name or an IP address. + * + * @since 1.3 + * @name NET_FTP_ERR_HOSTNAMENOSTRING + * @see Net_FTP::setHostname() + */ +define('NET_FTP_ERR_HOSTNAMENOSTRING', -21); + +/** + * Error code to indicate that the provided port was incorrect + * The port number you provided was invalid. Ensure to provide either a + * a numeric port number greater zero. + * + * @since 1.3 + * @name NET_FTP_ERR_PORTLESSZERO + * @see Net_FTP::setPort() + */ +define('NET_FTP_ERR_PORTLESSZERO', -22); + +/** + * Error code to indicate that you provided an invalid mode constant + * The mode constant you provided was invalid. You may only provide + * FTP_ASCII or FTP_BINARY. + * + * @since 1.3 + * @name NET_FTP_ERR_NOMODECONST + * @see Net_FTP::setMode() + */ +define('NET_FTP_ERR_NOMODECONST', -23); + +/** + * Error code to indicate that you provided an invalid timeout + * The timeout you provided was invalid. You have to provide a timeout greater + * or equal to zero. + * + * @since 1.3 + * @name NET_FTP_ERR_TIMEOUTLESSZERO + * @see Net_FTP::Net_FTP(), Net_FTP::setTimeout() + */ +define('NET_FTP_ERR_TIMEOUTLESSZERO', -24); + +/** + * Error code to indicate that you provided an invalid timeout + * An error occured while setting the timeout. Ensure that you provide a + * valid integer for the timeount and that your PHP installation works + * correctly. + * + * @since 1.3 + * @name NET_FTP_ERR_SETTIMEOUT_FAILED + * @see Net_FTP::Net_FTP(), Net_FTP::setTimeout() + */ +define('NET_FTP_ERR_SETTIMEOUT_FAILED', -25); + +/** + * Error code to indicate that the provided extension file doesn't exist + * The provided extension file does not exist. Ensure to provided an + * existant extension file. + * + * @since 1.3 + * @name NET_FTP_ERR_EXTFILENOTEXIST + * @see Net_FTP::getExtensionsFile() + */ +define('NET_FTP_ERR_EXTFILENOTEXIST', -26); + +/** + * Error code to indicate that the provided extension file is not readable + * The provided extension file is not readable. Ensure to have sufficient + * access rights for it. + * + * @since 1.3 + * @name NET_FTP_ERR_EXTFILEREAD_FAILED + * @see Net_FTP::getExtensionsFile() + */ +define('NET_FTP_ERR_EXTFILEREAD_FAILED', -27); + +/** + * Error code to indicate that the deletion of a file failed + * The specified file could not be deleted. Ensure to have sufficient + * access rights to delete the file. + * + * @since 1.3 + * @name NET_FTP_ERR_EXTFILEREAD_FAILED + * @see Net_FTP::rm() + */ +define('NET_FTP_ERR_DELETEFILE_FAILED', -28); + +/** + * Error code to indicate that the deletion of a directory faild + * The specified file could not be deleted. Ensure to have sufficient + * access rights to delete the file. + * + * @since 1.3 + * @name NET_FTP_ERR_EXTFILEREAD_FAILED + * @see Net_FTP::rm() + */ +define('NET_FTP_ERR_DELETEDIR_FAILED', -29); + +/** + * Error code to indicate that the directory listing failed + * PHP could not list the directory contents on the server. Ensure + * that your server is configured appropriate. + * + * @since 1.3 + * @name NET_FTP_ERR_RAWDIRLIST_FAILED + * @see Net_FTP::ls() + */ +define('NET_FTP_ERR_RAWDIRLIST_FAILED', -30); + +/** + * Error code to indicate that the directory listing failed + * The directory listing format your server uses seems not to + * be supported by Net_FTP. Please send the output of the + * call ls('./', NET_FTP_RAWLIST); to the author of this + * class to get it supported. + * + * @since 1.3 + * @name NET_FTP_ERR_DIRLIST_UNSUPPORTED + * @see Net_FTP::ls() + */ +define('NET_FTP_ERR_DIRLIST_UNSUPPORTED', -31); + +/** + * Error code to indicate failed disconnecting + * This error code indicates, that disconnection was not possible. + * + * @since 1.3 + * @name NET_FTP_ERR_DISCONNECT_FAILED + * @see Net_FTP::disconnect() + */ +define('NET_FTP_ERR_DISCONNECT_FAILED', -32); + +/** + * Error code to indicate that the username you provided was invalid. + * Check that you provided a non-empty string as the username. + * + * @since 1.3 + * @name NET_FTP_ERR_USERNAMENOSTRING + * @see Net_FTP::setUsername() + */ +define('NET_FTP_ERR_USERNAMENOSTRING', -33); + +/** + * Error code to indicate that the username you provided was invalid. + * Check that you provided a non-empty string as the username. + * + * @since 1.3 + * @name NET_FTP_ERR_PASSWORDNOSTRING + * @see Net_FTP::setPassword() + */ +define('NET_FTP_ERR_PASSWORDNOSTRING', -34); + +/** + * Error code to indicate that the provided extension file is not loadable + * The provided extension file is not loadable. Ensure to have a correct file + * syntax. + * + * @since 1.3.3 + * @name NET_FTP_ERR_EXTFILELOAD_FAILED + * @see Net_FTP::getExtensionsFile() + */ +define('NET_FTP_ERR_EXTFILELOAD_FAILED', -35); + +/** + * Class for comfortable FTP-communication + * + * This class provides comfortable communication with FTP-servers. You may do + * everything enabled by the PHP-FTP-extension and further functionalities, like + * recursive-deletion, -up- and -download. Another feature is to create directories + * recursively. + * + * @category Networking + * @package FTP + * @author Tobias Schlitt + * @author Jorrit Schippers + * @copyright 1997-2008 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version Release: 1.3.7 + * @link http://pear.php.net/package/Net_FTP + * @since 0.0.1 + * @access public + */ +class Net_FTP extends PEAR +{ + const mkdir = 'mkdir'; + /** + * The host to connect to + * + * @access private + * @var string + */ + var $_hostname; + + /** + * The port for ftp-connection (standard is 21) + * + * @access private + * @var int + */ + var $_port = 21; + + /** + * The username for login + * + * @access private + * @var string + */ + var $_username; + + /** + * The password for login + * + * @access private + * @var string + */ + var $_password; + + /** + * Determine whether to use passive-mode (true) or active-mode (false) + * + * @access private + * @var bool + */ + var $_passv; + + /** + * The standard mode for ftp-transfer + * + * @access private + * @var int + */ + var $_mode = FTP_BINARY; + + /** + * This holds the handle for the ftp-connection + * + * @access private + * @var resource + */ + var $_handle; + + /** + * Contains the timeout for FTP operations + * + * @access private + * @var int + * @since 1.3 + */ + var $_timeout = 90; + + /** + * Saves file-extensions for ascii- and binary-mode + * + * The array contains 2 sub-arrays ("ascii" and "binary"), which both contain + * file-extensions without the "." (".php" = "php"). + * + * @access private + * @var array + */ + var $_file_extensions; + + /** + * ls match + * Matches the ls entries against a regex and maps the resulting array to + * speaking names + * + * The values are set in the constructor because of line length constaints. + * + * Typical lines for the Windows format: + * 07-05-07 08:40AM 4701 SomeFile.ext + * 04-29-07 10:28PM SomeDir + * + * @access private + * @var array + * @since 1.3 + */ + var $_ls_match = null; + + /** + * matcher + * Stores the matcher for the current connection + * + * @access private + * @var array + * @since 1.3 + */ + var $_matcher = null; + + /** + * Holds all Net_FTP_Observer objects + * that wish to be notified of new messages. + * + * @var array + * @access private + * @since 1.3 + */ + var $_listeners = array(); + + /** + * This generates a new FTP-Object. The FTP-connection will not be established, + * yet. + * You can leave $host and $port blank, if you want. The $host will not be set + * and the $port will be left at 21. You have to set the $host manualy before + * trying to connect or with the connect() method. + * + * @param string $host (optional) The hostname + * @param int $port (optional) The port + * @param int $timeout (optional) Sets the standard timeout + * + * @access public + * @return void + * @see Net_FTP::setHostname(), Net_FTP::setPort(), Net_FTP::connect() + */ + function Net_FTP($host = null, $port = null, $timeout = 90) + { + $this->PEAR(); + if (isset($host)) { + $this->setHostname($host); + } + if (isset($port)) { + $this->setPort($port); + } + $this->_timeout = $timeout; + $this->_file_extensions[FTP_ASCII] = array(); + $this->_file_extensions[FTP_BINARY] = array(); + + $this->_ls_match = array( + 'unix' => array( + 'pattern' => '/(?:(d)|.)([rwxts-]{9})\s+(\w+)\s+([\w\d-()?.]+)\s+'. + '([\w\d-()?.]+)\s+(\w+)\s+(\S+\s+\S+\s+\S+)\s+(.+)/', + 'map' => array( + 'is_dir' => 1, + 'rights' => 2, + 'files_inside' => 3, + 'user' => 4, + 'group' => 5, + 'size' => 6, + 'date' => 7, + 'name' => 8, + ) + ), + 'windows' => array( + 'pattern' => '/([0-9\-]+)\s+([0-9:APM]+)\s+(()|\d+)\s+(.+)/', + 'map' => array( + 'date' => 1, + 'time' => 2, + 'size' => 3, + 'is_dir' => 4, + 'name' => 5, + ) + ) + ); + } + + /** + * This function generates the FTP-connection. You can optionally define a + * hostname and/or a port. If you do so, this data is stored inside the object. + * + * @param string $host (optional) The Hostname + * @param int $port (optional) The Port + * + * @access public + * @return mixed True on success, otherwise PEAR::Error + * @see NET_FTP_ERR_CONNECT_FAILED + */ + function connect($host = null, $port = null) + { + $this->_matcher = null; + if (isset($host)) { + $this->setHostname($host); + } + if (isset($port)) { + $this->setPort($port); + } + $handle = @ftp_connect($this->getHostname(), $this->getPort(), + $this->_timeout); + if (!$handle) { + return $this->raiseError("Connection to host failed", + NET_FTP_ERR_CONNECT_FAILED); + } else { + $this->_handle =& $handle; + return true; + } + } + + /** + * This function close the FTP-connection + * + * @access public + * @return bool|PEAR_Error Returns true on success, PEAR_Error on failure + */ + function disconnect() + { + $res = @ftp_close($this->_handle); + if (!$res) { + return PEAR::raiseError('Disconnect failed.', + NET_FTP_ERR_DISCONNECT_FAILED); + } + return true; + } + + /** + * This logs you into the ftp-server. You are free to specify username and + * password in this method. If you specify it, the values will be taken into + * the corresponding attributes, if do not specify, the attributes are taken. + * + * @param string $username (optional) The username to use + * @param string $password (optional) The password to use + * + * @access public + * @return mixed True on success, otherwise PEAR::Error + * @see NET_FTP_ERR_LOGIN_FAILED + */ + function login($username = null, $password = null) + { + if (!isset($username)) { + $username = $this->getUsername(); + } else { + $this->setUsername($username); + } + + if (!isset($password)) { + $password = $this->getPassword(); + } else { + $this->setPassword($password); + } + + $res = @ftp_login($this->_handle, $username, $password); + + if (!$res) { + return $this->raiseError("Unable to login", NET_FTP_ERR_LOGIN_FAILED); + } else { + return true; + } + } + + /** + * This changes the currently used directory. You can use either an absolute + * directory-path (e.g. "/home/blah") or a relative one (e.g. "../test"). + * + * @param string $dir The directory to go to. + * + * @access public + * @return mixed True on success, otherwise PEAR::Error + * @see NET_FTP_ERR_DIRCHANGE_FAILED + */ + function cd($dir) + { + $erg = @ftp_chdir($this->_handle, $dir); + if (!$erg) { + return $this->raiseError("Directory change failed", + NET_FTP_ERR_DIRCHANGE_FAILED); + } else { + return true; + } + } + + /** + * Show's you the actual path on the server + * This function questions the ftp-handle for the actual selected path and + * returns it. + * + * @access public + * @return mixed The actual path or PEAR::Error + * @see NET_FTP_ERR_DETERMINEPATH_FAILED + */ + function pwd() + { + $res = @ftp_pwd($this->_handle); + if (!$res) { + return $this->raiseError("Could not determine the actual path.", + NET_FTP_ERR_DETERMINEPATH_FAILED); + } else { + return $res; + } + } + + /** + * This works similar to the mkdir-command on your local machine. You can either + * give it an absolute or relative path. The relative path will be completed + * with the actual selected server-path. (see: pwd()) + * + * @param string $dir Absolute or relative dir-path + * @param bool $recursive (optional) Create all needed directories + * + * @access public + * @return mixed True on success, otherwise PEAR::Error + * @see NET_FTP_ERR_CREATEDIR_FAILED + */ + function mkdir($dir, $recursive = false) + { + $dir = $this->_constructPath($dir); + $savedir = $this->pwd(); + $this->pushErrorHandling(PEAR_ERROR_RETURN); + $e = $this->cd($dir); + $this->popErrorHandling(); + if ($e === true) { + $this->cd($savedir); + return true; + } + $this->cd($savedir); + if ($recursive === false) { + $res = @ftp_mkdir($this->_handle, $dir); + if (!$res) { + return $this->raiseError("Creation of '$dir' failed", + NET_FTP_ERR_CREATEDIR_FAILED); + } else { + return true; + } + } else { + // do not look at the first character, as $dir is absolute, + // it will always be a / + if (strpos(substr($dir, 1), '/') === false) { + return $this->mkdir($dir, false); + } + if (substr($dir, -1) == '/') { + $dir = substr($dir, 0, -1); + } + $parent = substr($dir, 0, strrpos($dir, '/')); + $res = $this->mkdir($parent, true); + if ($res === true) { + $res = $this->mkdir($dir, false); + } + if ($res !== true) { + return $res; + } + return true; + } + } + + /** + * This method tries executing a command on the ftp, using SITE EXEC. + * + * @param string $command The command to execute + * + * @access public + * @return mixed The result of the command (if successfull), otherwise + * PEAR::Error + * @see NET_FTP_ERR_EXEC_FAILED + */ + function execute($command) + { + $res = @ftp_exec($this->_handle, $command); + if (!$res) { + return $this->raiseError("Execution of command '$command' failed.", + NET_FTP_ERR_EXEC_FAILED); + } else { + return $res; + } + } + + /** + * Execute a SITE command on the server + * This method tries to execute a SITE command on the ftp server. + * + * @param string $command The command with parameters to execute + * + * @access public + * @return mixed True if successful, otherwise PEAR::Error + * @see NET_FTP_ERR_SITE_FAILED + */ + function site($command) + { + $res = @ftp_site($this->_handle, $command); + if (!$res) { + return $this->raiseError("Execution of SITE command '$command' failed.", + NET_FTP_ERR_SITE_FAILED); + } else { + return $res; + } + } + + /** + * This method will try to chmod the file specified on the server + * Currently, you must give a number as the the permission argument (777 or + * similar). The file can be either a relative or absolute path. + * NOTE: Some servers do not support this feature. In that case, you will + * get a PEAR error object returned. If successful, the method returns true + * + * @param mixed $target The file or array of files to set permissions for + * @param integer $permissions The mode to set the file permissions to + * + * @access public + * @return mixed True if successful, otherwise PEAR::Error + * @see NET_FTP_ERR_CHMOD_FAILED + */ + function chmod($target, $permissions) + { + // If $target is an array: Loop through it. + if (is_array($target)) { + + for ($i = 0; $i < count($target); $i++) { + $res = $this->chmod($target[$i], $permissions); + if (PEAR::isError($res)) { + return $res; + } // end if isError + } // end for i < count($target) + + } else { + + $res = $this->site("CHMOD " . $permissions . " " . $target); + if (!$res) { + return PEAR::raiseError("CHMOD " . $permissions . " " . $target . + " failed", NET_FTP_ERR_CHMOD_FAILED); + } else { + return $res; + } + + } // end if is_array + + } // end method chmod + + /** + * This method will try to chmod a folder and all of its contents + * on the server. The target argument must be a folder or an array of folders + * and the permissions argument have to be an integer (i.e. 777). + * The file can be either a relative or absolute path. + * NOTE: Some servers do not support this feature. In that case, you + * will get a PEAR error object returned. If successful, the method + * returns true + * + * @param mixed $target The folder or array of folders to + * set permissions for + * @param integer $permissions The mode to set the folder + * and file permissions to + * + * @access public + * @return mixed True if successful, otherwise PEAR::Error + * @see NET_FTP_ERR_CHMOD_FAILED, NET_FTP_ERR_DETERMINEPATH_FAILED, + * NET_FTP_ERR_RAWDIRLIST_FAILED, NET_FTP_ERR_DIRLIST_UNSUPPORTED + */ + function chmodRecursive($target, $permissions) + { + static $dir_permissions; + + if (!isset($dir_permissions)) { // Making directory specific permissions + $dir_permissions = $this->_makeDirPermissions($permissions); + } + + // If $target is an array: Loop through it + if (is_array($target)) { + + for ($i = 0; $i < count($target); $i++) { + $res = $this->chmodRecursive($target[$i], $permissions); + if (PEAR::isError($res)) { + return $res; + } // end if isError + } // end for i < count($target) + + } else { + + $remote_path = $this->_constructPath($target); + + // Chmod the directory itself + $result = $this->chmod($remote_path, $dir_permissions); + + if (PEAR::isError($result)) { + return $result; + } + + // If $remote_path last character is not a slash, add one + if (substr($remote_path, strlen($remote_path)-1) != "/") { + + $remote_path .= "/"; + } + + $dir_list = array(); + $mode = NET_FTP_DIRS_ONLY; + $dir_list = $this->ls($remote_path, $mode); + foreach ($dir_list as $dir_entry) { + if ($dir_entry['name'] == '.' || $dir_entry['name'] == '..') { + continue; + } + + $remote_path_new = $remote_path.$dir_entry["name"]."/"; + + // Chmod the directory we're about to enter + $result = $this->chmod($remote_path_new, $dir_permissions); + + if (PEAR::isError($result)) { + return $result; + } + + $result = $this->chmodRecursive($remote_path_new, $permissions); + + if (PEAR::isError($result)) { + return $result; + } + + } // end foreach dir_list as dir_entry + + $file_list = array(); + $mode = NET_FTP_FILES_ONLY; + $file_list = $this->ls($remote_path, $mode); + + foreach ($file_list as $file_entry) { + + $remote_file = $remote_path.$file_entry["name"]; + + $result = $this->chmod($remote_file, $permissions); + + if (PEAR::isError($result)) { + return $result; + } + + } // end foreach $file_list + + } // end if is_array + + return true; // No errors + + } // end method chmodRecursive + + /** + * Rename or move a file or a directory from the ftp-server + * + * @param string $remote_from The remote file or directory original to rename or + * move + * @param string $remote_to The remote file or directory final to rename or + * move + * + * @access public + * @return bool $res True on success, otherwise PEAR::Error + * @see NET_FTP_ERR_RENAME_FAILED + */ + function rename ($remote_from, $remote_to) + { + $res = @ftp_rename($this->_handle, $remote_from, $remote_to); + if (!$res) { + return $this->raiseError("Could not rename ".$remote_from." to ". + $remote_to." !", NET_FTP_ERR_RENAME_FAILED); + } + return true; + } + + /** + * This will return logical permissions mask for directory. + * if directory has to be readable it have also be executable + * + * @param string $permissions File permissions in digits for file (i.e. 666) + * + * @access private + * @return string File permissions in digits for directory (i.e. 777) + */ + function _makeDirPermissions($permissions) + { + $permissions = (string)$permissions; + + // going through (user, group, world) + for ($i = 0; $i < strlen($permissions); $i++) { + // Read permission is set but execute not yet + if ((int)$permissions{$i} & 4 and !((int)$permissions{$i} & 1)) { + // Adding execute flag + (int)$permissions{$i} = (int)$permissions{$i} + 1; + } + } + + return (string)$permissions; + } + + /** + * This will return the last modification-time of a file. You can either give + * this function a relative or an absolute path to the file to check. + * NOTE: Some servers will not support this feature and the function works + * only on files, not directories! When successful, + * it will return the last modification-time as a unix-timestamp or, when + * $format is specified, a preformated timestring. + * + * @param string $file The file to check + * @param string $format (optional) The format to give the date back + * if not set, it will return a Unix timestamp + * + * @access public + * @return mixed Unix timestamp, a preformated date-string or PEAR::Error + * @see NET_FTP_ERR_MDTMDIR_UNSUPPORTED, NET_FTP_ERR_MDTM_FAILED, + * NET_FTP_ERR_DATEFORMAT_FAILED + */ + function mdtm($file, $format = null) + { + $file = $this->_constructPath($file); + if ($this->_checkDir($file)) { + return $this->raiseError("Filename '$file' seems to be a directory.", + NET_FTP_ERR_MDTMDIR_UNSUPPORTED); + } + $res = @ftp_mdtm($this->_handle, $file); + if ($res == -1) { + return $this->raiseError("Could not get last-modification-date of '". + $file."'.", NET_FTP_ERR_MDTM_FAILED); + } + if (isset($format)) { + $res = date($format, $res); + if (!$res) { + return $this->raiseError("Date-format failed on timestamp '".$res. + "'.", NET_FTP_ERR_DATEFORMAT_FAILED); + } + } + return $res; + } + + /** + * This will return the size of a given file in bytes. You can either give this + * function a relative or an absolute file-path. NOTE: Some servers do not + * support this feature! + * + * @param string $file The file to check + * + * @access public + * @return mixed Size in bytes or PEAR::Error + * @see NET_FTP_ERR_SIZE_FAILED + */ + function size($file) + { + $file = $this->_constructPath($file); + $res = @ftp_size($this->_handle, $file); + if ($res == -1) { + return $this->raiseError("Could not determine filesize of '$file'.", + NET_FTP_ERR_SIZE_FAILED); + } else { + return $res; + } + } + + /** + * This method returns a directory-list of the current directory or given one. + * To display the current selected directory, simply set the first parameter to + * null + * or leave it blank, if you do not want to use any other parameters. + *

    + * There are 4 different modes of listing directories. Either to list only + * the files (using NET_FTP_FILES_ONLY), to list only directories (using + * NET_FTP_DIRS_ONLY) or to show both (using NET_FTP_DIRS_FILES, which is + * default). + *

    + * The 4th one is the NET_FTP_RAWLIST, which returns just the array created by + * the ftp_rawlist()-function build into PHP. + *

    + * The other function-modes will return an array containing the requested data. + * The files and dirs are listed in human-sorted order, but if you select + * NET_FTP_DIRS_FILES the directories will be added above the files, + * but although both sorted. + *

    + * All elements in the arrays are associative arrays themselves. They have the + * following structure: + *

    + * Dirs:
    + * ["name"] => string The name of the directory
    + * ["rights"] => string The rights of the directory (in style + * "rwxr-xr-x")
    + * ["user"] => string The owner of the directory
    + * ["group"] => string The group-owner of the directory
    + * ["files_inside"]=> string The number of files/dirs inside the + * directory excluding "." and ".."
    + * ["date"] => int The creation-date as Unix timestamp
    + * ["is_dir"] => bool true, cause this is a dir
    + *

    + * Files:
    + * ["name"] => string The name of the file
    + * ["size"] => int Size in bytes
    + * ["rights"] => string The rights of the file (in style + * "rwxr-xr-x")
    + * ["user"] => string The owner of the file
    + * ["group"] => string The group-owner of the file
    + * ["date"] => int The creation-date as Unix timestamp
    + * ["is_dir"] => bool false, cause this is a file
    + * + * @param string $dir (optional) The directory to list or null, when listing + * the current directory. + * @param int $mode (optional) The mode which types to list (files, + * directories or both). + * + * @access public + * @return mixed The directory list as described above or PEAR::Error on failure + * @see NET_FTP_DIRS_FILES, NET_FTP_DIRS_ONLY, NET_FTP_FILES_ONLY, + * NET_FTP_RAWLIST, NET_FTP_ERR_DETERMINEPATH_FAILED, + * NET_FTP_ERR_RAWDIRLIST_FAILED, NET_FTP_ERR_DIRLIST_UNSUPPORTED + */ + function ls($dir = null, $mode = NET_FTP_DIRS_FILES) + { + if (!isset($dir)) { + $dir = @ftp_pwd($this->_handle); + if (!$dir) { + return $this->raiseError("Could not retrieve current directory", + NET_FTP_ERR_DETERMINEPATH_FAILED); + } + } + if (($mode != NET_FTP_FILES_ONLY) && ($mode != NET_FTP_DIRS_ONLY) && + ($mode != NET_FTP_RAWLIST)) { + $mode = NET_FTP_DIRS_FILES; + } + + switch ($mode) { + case NET_FTP_DIRS_FILES: + $res = $this->_lsBoth($dir); + break; + case NET_FTP_DIRS_ONLY: + $res = $this->_lsDirs($dir); + break; + case NET_FTP_FILES_ONLY: + $res = $this->_lsFiles($dir); + break; + case NET_FTP_RAWLIST: + $res = @ftp_rawlist($this->_handle, $dir); + break; + } + + return $res; + } + + /** + * This method will delete the given file or directory ($path) from the server + * (maybe recursive). + * + * Whether the given string is a file or directory is only determined by the + * last sign inside the string ("/" or not). + * + * If you specify a directory, you can optionally specify $recursive as true, + * to let the directory be deleted recursive (with all sub-directories and files + * inherited). + * + * You can either give a absolute or relative path for the file / dir. If you + * choose to use the relative path, it will be automatically completed with the + * actual selected directory. + * + * @param string $path The absolute or relative path to the file/directory. + * @param bool $recursive (optional) + * + * @access public + * @return mixed True on success, otherwise PEAR::Error + * @see NET_FTP_ERR_DELETEFILE_FAILED, NET_FTP_ERR_DELETEDIR_FAILED, + * NET_FTP_ERR_REMOTEPATHNODIR + */ + function rm($path, $recursive = false) + { + $path = $this->_constructPath($path); + if ($this->_checkDir($path)) { + if ($recursive) { + return $this->_rmDirRecursive($path); + } else { + return $this->_rmDir($path); + } + } else { + return $this->_rmFile($path); + } + } + + /** + * This function will download a file from the ftp-server. You can either + * specify an absolute path to the file (beginning with "/") or a relative one, + * which will be completed with the actual directory you selected on the server. + * You can specify the path to which the file will be downloaded on the local + * machine, if the file should be overwritten if it exists (optionally, default + * is no overwriting) and in which mode (FTP_ASCII or FTP_BINARY) the file + * should be downloaded (if you do not specify this, the method tries to + * determine it automatically from the mode-directory or uses the default-mode, + * set by you). + * If you give a relative path to the local-file, the script-path is used as + * basepath. + * + * @param string $remote_file The absolute or relative path to the file to + * download + * @param string $local_file The local file to put the downloaded in + * @param bool $overwrite (optional) Whether to overwrite existing file + * @param int $mode (optional) Either FTP_ASCII or FTP_BINARY + * + * @access public + * @return mixed True on success, otherwise PEAR::Error + * @see NET_FTP_ERR_OVERWRITELOCALFILE_FORBIDDEN, + * NET_FTP_ERR_OVERWRITELOCALFILE_FAILED, + * NET_FTP_ERR_OVERWRITELOCALFILE_FAILED + */ + function get($remote_file, $local_file, $overwrite = false, $mode = null) + { + if (!isset($mode)) { + $mode = $this->checkFileExtension($remote_file); + } + + $remote_file = $this->_constructPath($remote_file); + + if (@file_exists($local_file) && !$overwrite) { + return $this->raiseError("Local file '".$local_file. + "' exists and may not be overwriten.", + NET_FTP_ERR_OVERWRITELOCALFILE_FORBIDDEN); + } + if (@file_exists($local_file) && + !@is_writeable($local_file) && $overwrite) { + return $this->raiseError("Local file '".$local_file. + "' is not writeable. Can not overwrite.", + NET_FTP_ERR_OVERWRITELOCALFILE_FAILED); + } + + if (@function_exists('ftp_nb_get')) { + $res = @ftp_nb_get($this->_handle, $local_file, $remote_file, $mode); + while ($res == FTP_MOREDATA) { + $this->_announce('nb_get'); + $res = @ftp_nb_continue($this->_handle); + } + } else { + $res = @ftp_get($this->_handle, $local_file, $remote_file, $mode); + } + if (!$res) { + return $this->raiseError("File '".$remote_file. + "' could not be downloaded to '$local_file'.", + NET_FTP_ERR_OVERWRITELOCALFILE_FAILED); + } else { + return true; + } + } + + /** + * This function will upload a file to the ftp-server. You can either specify a + * absolute path to the remote-file (beginning with "/") or a relative one, + * which will be completed with the actual directory you selected on the server. + * You can specify the path from which the file will be uploaded on the local + * maschine, if the file should be overwritten if it exists (optionally, default + * is no overwriting) and in which mode (FTP_ASCII or FTP_BINARY) the file + * should be downloaded (if you do not specify this, the method tries to + * determine it automatically from the mode-directory or uses the default-mode, + * set by you). + * If you give a relative path to the local-file, the script-path is used as + * basepath. + * + * @param string $local_file The local file to upload + * @param string $remote_file The absolute or relative path to the file to + * upload to + * @param bool $overwrite (optional) Whether to overwrite existing file + * @param int $mode (optional) Either FTP_ASCII or FTP_BINARY + * + * @access public + * @return mixed True on success, otherwise PEAR::Error + * @see NET_FTP_ERR_LOCALFILENOTEXIST, + * NET_FTP_ERR_OVERWRITEREMOTEFILE_FORBIDDEN, + * NET_FTP_ERR_UPLOADFILE_FAILED + */ + function put($local_file, $remote_file, $overwrite = false, $mode = null) + { + if (!isset($mode)) { + $mode = $this->checkFileExtension($local_file); + } + $remote_file = $this->_constructPath($remote_file); + + if (!@file_exists($local_file)) { + return $this->raiseError("Local file '$local_file' does not exist.", + NET_FTP_ERR_LOCALFILENOTEXIST); + } + if ((@ftp_size($this->_handle, $remote_file) != -1) && !$overwrite) { + return $this->raiseError("Remote file '".$remote_file. + "' exists and may not be overwriten.", + NET_FTP_ERR_OVERWRITEREMOTEFILE_FORBIDDEN); + } + + if (function_exists('ftp_alloc')) { + ftp_alloc($this->_handle, filesize($local_file)); + } + if (function_exists('ftp_nb_put')) { + $res = @ftp_nb_put($this->_handle, $remote_file, $local_file, $mode); + while ($res == FTP_MOREDATA) { + $this->_announce('nb_put'); + $res = @ftp_nb_continue($this->_handle); + } + + } else { + $res = @ftp_put($this->_handle, $remote_file, $local_file, $mode); + } + if (!$res) { + return $this->raiseError("File '$local_file' could not be uploaded to '" + .$remote_file."'.", + NET_FTP_ERR_UPLOADFILE_FAILED); + } else { + return true; + } + } + + /** + * This functionality allows you to transfer a whole directory-structure from + * the remote-ftp to your local host. You have to give a remote-directory + * (ending with '/') and the local directory (ending with '/') where to put the + * files you download. + * The remote path is automatically completed with the current-remote-dir, if + * you give a relative path to this function. You can give a relative path for + * the $local_path, too. Then the script-basedir will be used for comletion of + * the path. + * The parameter $overwrite will determine, whether to overwrite existing files + * or not. Standard for this is false. Fourth you can explicitly set a mode for + * all transfer actions done. If you do not set this, the method tries to + * determine the transfer mode by checking your mode-directory for the file + * extension. If the extension is not inside the mode-directory, it will get + * your default mode. + * + * @param string $remote_path The path to download + * @param string $local_path The path to download to + * @param bool $overwrite (optional) Whether to overwrite existing files + * (true) or not (false, standard). + * @param int $mode (optional) The transfermode (either FTP_ASCII or + * FTP_BINARY). + * + * @access public + * @return mixed True on succes, otherwise PEAR::Error + * @see NET_FTP_ERR_OVERWRITELOCALFILE_FORBIDDEN, + * NET_FTP_ERR_OVERWRITELOCALFILE_FAILED, NET_FTP_ERR_OVERWRITELOCALFILE_FAILED, + * NET_FTP_ERR_REMOTEPATHNODIR, NET_FTP_ERR_LOCALPATHNODIR, + * NET_FTP_ERR_CREATELOCALDIR_FAILED + */ + function getRecursive($remote_path, $local_p, $overwrite = false, + $mode = null) + { + if (!class_exists('G')) { + $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); + $docuroot = explode( '/', $realdocuroot ); + array_pop( $docuroot ); + $pathhome = implode( '/', $docuroot ) . '/'; + array_pop( $docuroot ); + $pathTrunk = implode( '/', $docuroot ) . '/'; + require_once($pathTrunk.'gulliver/system/class.g.php'); + } + G::LoadSystem('inputfilter'); + $filter = new InputFilter(); + $remote_path = $this->_constructPath($remote_path); + if (!$this->_checkDir($remote_path)) { + return $this->raiseError("Given remote-path '".$remote_path. + "' seems not to be a directory.", + NET_FTP_ERR_REMOTEPATHNODIR); + } + if (!$this->_checkDir($local_p)) { + return $this->raiseError("Given local-path '".$local_p. + "' seems not to be a directory.", + NET_FTP_ERR_LOCALPATHNODIR); + } + + if (!@is_dir($filter->validatePath($local_p))) { + $sLocal_p = $filter->validatePath($local_p); + $mkdir = self::mkdir; + $res = $mkdir($sLocal_p); + if (!$res) { + return $this->raiseError("Could not create dir '$local_p'", + NET_FTP_ERR_CREATELOCALDIR_FAILED); + } + } + $dir_list = array(); + $dir_list = $this->ls($remote_path, NET_FTP_DIRS_ONLY); + if (PEAR::isError($dir_list)) { + return $dir_list; + } + foreach ($dir_list as $dir_entry) { + if ($dir_entry['name'] != '.' && $dir_entry['name'] != '..') { + $remote_path_new = $remote_path.$dir_entry["name"]."/"; + $local_p_new = $local_p.$dir_entry["name"]."/"; + $result = $this->getRecursive($remote_path_new, + $local_p_new, $overwrite, $mode); + if ($this->isError($result)) { + return $result; + } + } + } + $file_list = array(); + $file_list = $this->ls($remote_path, NET_FTP_FILES_ONLY); + if (PEAR::isError($file_list)) { + return $file_list; + } + foreach ($file_list as $file_entry) { + $remote_file = $remote_path.$file_entry["name"]; + $local_file = $local_p.$file_entry["name"]; + $result = $this->get($remote_file, $local_file, $overwrite, $mode); + if ($this->isError($result)) { + return $result; + } + } + return true; + } + + /** + * This functionality allows you to transfer a whole directory-structure from + * your local host to the remote-ftp. You have to give a remote-directory + * (ending with '/') and the local directory (ending with '/') where to put the + * files you download. The remote path is automatically completed with the + * current-remote-dir, if you give a relative path to this function. You can + * give a relative path for the $local_path, too. Then the script-basedir will + * be used for comletion of the path. + * The parameter $overwrite will determine, whether to overwrite existing files + * or not. + * Standard for this is false. Fourth you can explicitly set a mode for all + * transfer actions done. If you do not set this, the method tries to determine + * the transfer mode by checking your mode-directory for the file-extension. If + * the extension is not inside the mode-directory, it will get your default + * mode. + * + * @param string $local_path The path to download to + * @param string $remote_path The path to download + * @param bool $overwrite (optional) Whether to overwrite existing files + * (true) or not (false, standard). + * @param int $mode (optional) The transfermode (either FTP_ASCII or + * FTP_BINARY). + * + * @access public + * @return mixed True on succes, otherwise PEAR::Error + * @see NET_FTP_ERR_LOCALFILENOTEXIST, + * NET_FTP_ERR_OVERWRITEREMOTEFILE_FORBIDDEN, + * NET_FTP_ERR_UPLOADFILE_FAILED, NET_FTP_ERR_LOCALPATHNODIR, + * NET_FTP_ERR_REMOTEPATHNODIR + */ + function putRecursive($local_path, $remote_path, $overwrite = false, + $mode = null) + { + $remote_path = $this->_constructPath($remote_path); + if (!file_exists($local_path) || !is_dir($local_path)) { + return $this->raiseError("Given local-path '".$local_path. + "' seems not to be a directory.", + NET_FTP_ERR_LOCALPATHNODIR); + } + if (!$this->_checkDir($remote_path)) { + return $this->raiseError("Given remote-path '".$remote_path. + "' seems not to be a directory.", + NET_FTP_ERR_REMOTEPATHNODIR); + } + $old_path = $this->pwd(); + if ($this->isError($this->cd($remote_path))) { + $res = $this->mkdir($remote_path); + if ($this->isError($res)) { + return $res; + } + } + $this->cd($old_path); + $dir_list = $this->_lsLocal($local_path); + foreach ($dir_list["dirs"] as $dir_entry) { + // local directories do not have arrays as entry + $remote_path_new = $remote_path.$dir_entry."/"; + $local_path_new = $local_path.$dir_entry."/"; + $result = $this->putRecursive($local_path_new, + $remote_path_new, $overwrite, $mode); + if ($this->isError($result)) { + return $result; + } + } + + foreach ($dir_list["files"] as $file_entry) { + $remote_file = $remote_path.$file_entry; + $local_file = $local_path.$file_entry; + $result = $this->put($local_file, $remote_file, $overwrite, $mode); + if ($this->isError($result)) { + return $result; + } + } + return true; + } + + /** + * This checks, whether a file should be transfered in ascii- or binary-mode + * by it's file-extension. If the file-extension is not set or + * the extension is not inside one of the extension-dirs, the actual set + * transfer-mode is returned. + * + * @param string $filename The filename to be checked + * + * @access public + * @return int Either FTP_ASCII or FTP_BINARY + */ + function checkFileExtension($filename) + { + if (($pos = strrpos($filename, '.')) === false) { + return $this->_mode; + } else { + $ext = substr($filename, $pos + 1); + } + + if (isset($this->_file_extensions[$ext])) { + return $this->_file_extensions[$ext]; + } + + return $this->_mode; + } + + /** + * Set the hostname + * + * @param string $host The hostname to set + * + * @access public + * @return bool True on success, otherwise PEAR::Error + * @see NET_FTP_ERR_HOSTNAMENOSTRING + */ + function setHostname($host) + { + if (!is_string($host)) { + return PEAR::raiseError("Hostname must be a string.", + NET_FTP_ERR_HOSTNAMENOSTRING); + } + $this->_hostname = $host; + return true; + } + + /** + * Set the Port + * + * @param int $port The port to set + * + * @access public + * @return bool True on success, otherwise PEAR::Error + * @see NET_FTP_ERR_PORTLESSZERO + */ + function setPort($port) + { + if (!is_int($port) || ($port < 0)) { + PEAR::raiseError("Invalid port. Has to be integer >= 0", + NET_FTP_ERR_PORTLESSZERO); + } + $this->_port = $port; + return true; + } + + /** + * Set the Username + * + * @param string $user The username to set + * + * @access public + * @return mixed True on success, otherwise PEAR::Error + * @see NET_FTP_ERR_USERNAMENOSTRING + */ + function setUsername($user) + { + if (empty($user) || !is_string($user)) { + return PEAR::raiseError('Username $user invalid.', + NET_FTP_ERR_USERNAMENOSTRING); + } + $this->_username = $user; + } + + /** + * Set the password + * + * @param string $password The password to set + * + * @access private + * @return void + * @see NET_FTP_ERR_PASSWORDNOSTRING + */ + function setPassword($password) + { + if (empty($password) || !is_string($password)) { + return PEAR::raiseError('Password xxx invalid.', + NET_FTP_ERR_PASSWORDNOSTRING); + } + $this->_password = $password; + } + + /** + * Set the transfer-mode. You can use the predefined constants + * FTP_ASCII or FTP_BINARY. The mode will be stored for any further transfers. + * + * @param int $mode The mode to set + * + * @access public + * @return mixed True on success, otherwise PEAR::Error + * @see NET_FTP_ERR_NOMODECONST + */ + function setMode($mode) + { + if (($mode == FTP_ASCII) || ($mode == FTP_BINARY)) { + $this->_mode = $mode; + return true; + } else { + return $this->raiseError('FTP-Mode has either to be FTP_ASCII or'. + 'FTP_BINARY', NET_FTP_ERR_NOMODECONST); + } + } + + /** + * Set the transfer-method to passive mode + * + * @access public + * @return void + */ + function setPassive() + { + $this->_passv = true; + @ftp_pasv($this->_handle, true); + } + + /** + * Set the transfer-method to active mode + * + * @access public + * @return void + */ + function setActive() + { + $this->_passv = false; + @ftp_pasv($this->_handle, false); + } + + /** + * Set the timeout for FTP operations + * + * Use this method to set a timeout for FTP operation. Timeout has to be an + * integer. + * + * @param int $timeout the timeout to use + * + * @access public + * @return bool True on success, otherwise PEAR::Error + * @see NET_FTP_ERR_TIMEOUTLESSZERO, NET_FTP_ERR_SETTIMEOUT_FAILED + */ + function setTimeout ( $timeout = 0 ) + { + if (!is_int($timeout) || ($timeout < 0)) { + return PEAR::raiseError('Timeout '.$timeout. + ' is invalid, has to be an integer >= 0', + NET_FTP_ERR_TIMEOUTLESSZERO); + } + $this->_timeout = $timeout; + if (isset($this->_handle) && is_resource($this->_handle)) { + $res = @ftp_set_option($this->_handle, FTP_TIMEOUT_SEC, $timeout); + } else { + $res = true; + } + if (!$res) { + return PEAR::raiseError("Set timeout failed.", + NET_FTP_ERR_SETTIMEOUT_FAILED); + } + return true; + } + + /** + * Adds an extension to a mode-directory + * + * The mode-directory saves file-extensions coresponding to filetypes + * (ascii e.g.: 'php', 'txt', 'htm',...; binary e.g.: 'jpg', 'gif', 'exe',...). + * The extensions have to be saved without the '.'. And + * can be predefined in an external file (see: getExtensionsFile()). + * + * The array is build like this: 'php' => FTP_ASCII, 'png' => FTP_BINARY + * + * To change the mode of an extension, just add it again with the new mode! + * + * @param int $mode Either FTP_ASCII or FTP_BINARY + * @param string $ext Extension + * + * @access public + * @return void + */ + function addExtension($mode, $ext) + { + $this->_file_extensions[$ext] = $mode; + } + + /** + * This function removes an extension from the mode-directories + * (described above). + * + * @param string $ext The extension to remove + * + * @access public + * @return void + */ + function removeExtension($ext) + { + if (isset($this->_file_extensions[$ext])) { + unset($this->_file_extensions[$ext]); + } + } + + /** + * This get's both (ascii- and binary-mode-directories) from the given file. + * Beware, if you read a file into the mode-directory, all former set values + * will be unset! + * + * Example file contents: + * [ASCII] + * asc = 0 + * txt = 0 + * [BINARY] + * bin = 1 + * jpg = 1 + * + * @param string $filename The file to get from + * + * @access public + * @return mixed True on success, otherwise PEAR::Error + * @see NET_FTP_ERR_EXTFILENOTEXIST, NET_FTP_ERR_EXTFILEREAD_FAILED + */ + function getExtensionsFile($filename) + { + if (!file_exists($filename)) { + return $this->raiseError("Extensions-file '$filename' does not exist", + NET_FTP_ERR_EXTFILENOTEXIST); + } + + if (!is_readable($filename)) { + return $this->raiseError("Extensions-file '$filename' is not readable", + NET_FTP_ERR_EXTFILEREAD_FAILED); + } + + $exts = @parse_ini_file($filename, true); + if (!is_array($exts)) { + return $this->raiseError("Extensions-file '$filename' could not be". + "loaded", NET_FTP_ERR_EXTFILELOAD_FAILED); + } + + $this->_file_extensions = array(); + + if (isset($exts['ASCII'])) { + foreach ($exts['ASCII'] as $ext => $bogus) { + $this->_file_extensions[$ext] = FTP_ASCII; + } + } + + if (isset($exts['BINARY'])) { + foreach ($exts['BINARY'] as $ext => $bogus) { + $this->_file_extensions[$ext] = FTP_BINARY; + } + } + + return true; + } + + /** + * Returns the hostname + * + * @access public + * @return string The hostname + */ + function getHostname() + { + return $this->_hostname; + } + + /** + * Returns the port + * + * @access public + * @return int The port + */ + function getPort() + { + return $this->_port; + } + + /** + * Returns the username + * + * @access public + * @return string The username + */ + function getUsername() + { + return $this->_username; + } + + /** + * Returns the password + * + * @access public + * @return string The password + */ + function getPassword() + { + return $this->_password; + } + + /** + * Returns the transfermode + * + * @access public + * @return int The transfermode, either FTP_ASCII or FTP_BINARY. + */ + function getMode() + { + return $this->_mode; + } + + /** + * Returns, whether the connection is set to passive mode or not + * + * @access public + * @return bool True if passive-, false if active-mode + */ + function isPassive() + { + return $this->_passv; + } + + /** + * Returns the mode set for a file-extension + * + * @param string $ext The extension you wanna ask for + * + * @return int Either FTP_ASCII, FTP_BINARY or NULL (if not set a mode for it) + * @access public + */ + function getExtensionMode($ext) + { + return @$this->_file_extensions[$ext]; + } + + /** + * Get the currently set timeout. + * Returns the actual timeout set. + * + * @access public + * @return int The actual timeout + */ + function getTimeout() + { + return ftp_get_option($this->_handle, FTP_TIMEOUT_SEC); + } + + /** + * Adds a Net_FTP_Observer instance to the list of observers + * that are listening for messages emitted by this Net_FTP instance. + * + * @param object &$observer The Net_FTP_Observer instance to attach + * as a listener. + * + * @return boolean True if the observer is successfully attached. + * @access public + * @since 1.3 + */ + function attach(&$observer) + { + if (!is_a($observer, 'Net_FTP_Observer')) { + return false; + } + + $this->_listeners[$observer->getId()] = &$observer; + return true; + } + + /** + * Removes a Net_FTP_Observer instance from the list of observers. + * + * @param object $observer The Net_FTP_Observer instance to detach + * from the list of listeners. + * + * @return boolean True if the observer is successfully detached. + * @access public + * @since 1.3 + */ + function detach($observer) + { + if (!is_a($observer, 'Net_FTP_Observer') || + !isset($this->_listeners[$observer->getId()])) { + return false; + } + + unset($this->_listeners[$observer->getId()]); + return true; + } + + /** + * Informs each registered observer instance that a new message has been + * sent. + * + * @param mixed $event A hash describing the net event. + * + * @access private + * @since 1.3 + * @return void + */ + function _announce($event) + { + foreach ($this->_listeners as $id => $listener) { + $this->_listeners[$id]->notify($event); + } + } + + /** + * Rebuild the path, if given relative + * + * This method will make a relative path absolute by prepending the current + * remote directory in front of it. + * + * @param string $path The path to check and construct + * + * @access private + * @return string The build path + */ + function _constructPath($path) + { + if ((substr($path, 0, 1) != '/') && (substr($path, 0, 2) != './')) { + $actual_dir = @ftp_pwd($this->_handle); + if (substr($actual_dir, -1) != '/') { + $actual_dir .= '/'; + } + $path = $actual_dir.$path; + } + return $path; + } + + /** + * Checks, whether a given string is a directory-path (ends with "/") or not. + * + * @param string $path Path to check + * + * @access private + * @return bool True if $path is a directory, otherwise false + */ + function _checkDir($path) + { + if (!empty($path) && substr($path, (strlen($path) - 1), 1) == "/") { + return true; + } else { + return false; + } + } + + /** + * This will remove a file + * + * @param string $file The file to delete + * + * @access private + * @return mixed True on success, otherwise PEAR::Error + * @see NET_FTP_ERR_DELETEFILE_FAILED + */ + function _rmFile($file) + { + if (substr($file, 0, 1) != "/") { + $actual_dir = @ftp_pwd($this->_handle); + if (substr($actual_dir, (strlen($actual_dir) - 2), 1) != "/") { + $actual_dir .= "/"; + } + $file = $actual_dir.$file; + } + $res = @ftp_delete($this->_handle, $file); + + if (!$res) { + return $this->raiseError("Could not delete file '$file'.", + NET_FTP_ERR_DELETEFILE_FAILED); + } else { + return true; + } + } + + /** + * This will remove a dir + * + * @param string $dir The dir to delete + * + * @access private + * @return mixed True on success, otherwise PEAR::Error + * @see NET_FTP_ERR_REMOTEPATHNODIR, NET_FTP_ERR_DELETEDIR_FAILED + */ + function _rmDir($dir) + { + if (substr($dir, (strlen($dir) - 1), 1) != "/") { + return $this->raiseError("Directory name '".$dir. + "' is invalid, has to end with '/'", + NET_FTP_ERR_REMOTEPATHNODIR); + } + $res = @ftp_rmdir($this->_handle, $dir); + if (!$res) { + return $this->raiseError("Could not delete directory '$dir'.", + NET_FTP_ERR_DELETEDIR_FAILED); + } else { + return true; + } + } + + /** + * This will remove a dir and all subdirs and -files + * + * @param string $dir The dir to delete recursively + * + * @access private + * @return mixed True on success, otherwise PEAR::Error + * @see NET_FTP_ERR_REMOTEPATHNODIR, NET_FTP_ERR_DELETEDIR_FAILED + */ + function _rmDirRecursive($dir) + { + if (substr($dir, (strlen($dir) - 1), 1) != "/") { + return $this->raiseError("Directory name '".$dir. + "' is invalid, has to end with '/'", + NET_FTP_ERR_REMOTEPATHNODIR); + } + $file_list = $this->_lsFiles($dir); + foreach ($file_list as $file) { + $file = $dir.$file["name"]; + $res = $this->rm($file); + if ($this->isError($res)) { + return $res; + } + } + $dir_list = $this->_lsDirs($dir); + foreach ($dir_list as $new_dir) { + if ($new_dir["name"] == '.' || $new_dir["name"] == '..') { + continue; + } + $new_dir = $dir.$new_dir["name"]."/"; + $res = $this->_rmDirRecursive($new_dir); + if ($this->isError($res)) { + return $res; + } + } + $res = $this->_rmDir($dir); + if (PEAR::isError($res)) { + return $res; + } else { + return true; + } + } + + /** + * Lists up files and directories + * + * @param string $dir The directory to list up + * + * @access private + * @return array An array of dirs and files + */ + function _lsBoth($dir) + { + $list_splitted = $this->_listAndParse($dir); + if (PEAR::isError($list_splitted)) { + return $list_splitted; + } + if (!is_array($list_splitted["files"])) { + $list_splitted["files"] = array(); + } + if (!is_array($list_splitted["dirs"])) { + $list_splitted["dirs"] = array(); + } + $res = array(); + @array_splice($res, 0, 0, $list_splitted["files"]); + @array_splice($res, 0, 0, $list_splitted["dirs"]); + return $res; + } + + /** + * Lists up directories + * + * @param string $dir The directory to list up + * + * @access private + * @return array An array of dirs + */ + function _lsDirs($dir) + { + $list = $this->_listAndParse($dir); + if (PEAR::isError($list)) { + return $list; + } + return $list["dirs"]; + } + + /** + * Lists up files + * + * @param string $dir The directory to list up + * + * @access private + * @return array An array of files + */ + function _lsFiles($dir) + { + $list = $this->_listAndParse($dir); + if (PEAR::isError($list)) { + return $list; + } + return $list["files"]; + } + + /** + * This lists up the directory-content and parses the items into well-formated + * arrays. + * The results of this array are sorted (dirs on top, sorted by name; + * files below, sorted by name). + * + * @param string $dir The directory to parse + * + * @access private + * @return array Lists of dirs and files + * @see NET_FTP_ERR_RAWDIRLIST_FAILED + */ + function _listAndParse($dir) + { + $dirs_list = array(); + $files_list = array(); + $dir_list = @ftp_rawlist($this->_handle, $dir); + if (!is_array($dir_list)) { + return PEAR::raiseError('Could not get raw directory listing.', + NET_FTP_ERR_RAWDIRLIST_FAILED); + } + + foreach ($dir_list AS $k=>$v) { + if (strncmp($v, 'total: ', 7) == 0 && preg_match('/total: \d+/', $v)) { + unset($dir_list[$k]); + break; // usually there is just one line like this + } + } + + // Handle empty directories + if (count($dir_list) == 0) { + return array('dirs' => $dirs_list, 'files' => $files_list); + } + + // Exception for some FTP servers seem to return this wiered result instead + // of an empty list + if (count($dirs_list) == 1 && $dirs_list[0] == 'total 0') { + return array('dirs' => array(), 'files' => $files_list); + } + + if (!isset($this->_matcher) || PEAR::isError($this->_matcher)) { + $this->_matcher = $this->_determineOSMatch($dir_list); + if (PEAR::isError($this->_matcher)) { + return $this->_matcher; + } + } + foreach ($dir_list as $entry) { + if (!preg_match($this->_matcher['pattern'], $entry, $m)) { + continue; + } + $entry = array(); + foreach ($this->_matcher['map'] as $key=>$val) { + $entry[$key] = $m[$val]; + } + $entry['stamp'] = $this->_parseDate($entry['date']); + + if ($entry['is_dir']) { + $dirs_list[] = $entry; + } else { + $files_list[] = $entry; + } + } + @usort($dirs_list, array("Net_FTP", "_natSort")); + @usort($files_list, array("Net_FTP", "_natSort")); + $res["dirs"] = (is_array($dirs_list)) ? $dirs_list : array(); + $res["files"] = (is_array($files_list)) ? $files_list : array(); + return $res; + } + + /** + * Determine server OS + * This determines the server OS and returns a valid regex to parse + * ls() output. + * + * @param array &$dir_list The raw dir list to parse + * + * @access private + * @return mixed An array of 'pattern' and 'map' on success, otherwise + * PEAR::Error + * @see NET_FTP_ERR_DIRLIST_UNSUPPORTED + */ + function _determineOSMatch(&$dir_list) + { + foreach ($dir_list as $entry) { + foreach ($this->_ls_match as $os => $match) { + $matches = array(); + if (preg_match($match['pattern'], $entry, $matches)) { + return $match; + } + } + } + $error = 'The list style of your server seems not to be supported. Please'. + 'email a "$ftp->ls(NET_FTP_RAWLIST);" output plus info on the'. + 'server to the maintainer of this package to get it supported!'. + 'Thanks for your help!'; + return PEAR::raiseError($error, NET_FTP_ERR_DIRLIST_UNSUPPORTED); + } + + /** + * Lists a local directory + * + * @param string $dir_path The dir to list + * + * @access private + * @return array The list of dirs and files + */ + function _lsLocal($dir_path) + { + $dir = dir($dir_path); + $dir_list = array(); + $file_list = array(); + while (false !== ($entry = $dir->read())) { + if (($entry != '.') && ($entry != '..')) { + if (is_dir($dir_path.$entry)) { + $dir_list[] = $entry; + } else { + $file_list[] = $entry; + } + } + } + $dir->close(); + $res['dirs'] = $dir_list; + $res['files'] = $file_list; + return $res; + } + + /** + * Function for use with usort(). + * Compares the list-array-elements by name. + * + * @param string $item_1 first item to be compared + * @param string $item_2 second item to be compared + * + * @access private + * @return int < 0 if $item_1 is less than $item_2, 0 if equal and > 0 otherwise + */ + function _natSort($item_1, $item_2) + { + return strnatcmp($item_1['name'], $item_2['name']); + } + + /** + * Parse dates to timestamps + * + * @param string $date Date + * + * @access private + * @return int Timestamp + * @see NET_FTP_ERR_DATEFORMAT_FAILED + */ + function _parseDate($date) + { + // Sep 10 22:06 => Sep 10, 22:06 + if (preg_match('/([A-Za-z]+)[ ]+([0-9]+)[ ]+([0-9]+):([0-9]+)/', $date, + $res)) { + $year = date('Y'); + $month = $res[1]; + $day = $res[2]; + $hour = $res[3]; + $minute = $res[4]; + $date = "$month $day, $year $hour:$minute"; + $tmpDate = strtotime($date); + if ($tmpDate > time()) { + $year--; + $date = "$month $day, $year $hour:$minute"; + } + } elseif (preg_match('/^\d\d-\d\d-\d\d/', $date)) { + // 09-10-04 => 09/10/04 + $date = str_replace('-', '/', $date); + } + $res = strtotime($date); + if (!$res) { + return $this->raiseError('Dateconversion failed.', + NET_FTP_ERR_DATEFORMAT_FAILED); + } + return $res; + } +} +?> diff --git a/thirdparty/pear/Net/FTP/Observer.php b/thirdparty/pear/Net/FTP/Observer.php new file mode 100644 index 000000000..d3e38b62e --- /dev/null +++ b/thirdparty/pear/Net/FTP/Observer.php @@ -0,0 +1,116 @@ + + * @author Laurent Laville + * @author Chuck Hagenbuch + * @copyright 1997-2008 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version CVS: $Id: Observer.php,v 1.4.2.1 2008/01/07 14:21:22 jschippers Exp $ + * @link http://pear.php.net/package/Net_FTP + * @since File available since Release 0.0.1 + */ + +/** + * This class implements the Observer part of a Subject-Observer + * design pattern. It listens to the events sent by a Net_FTP instance. + * This module had many influences from the Log_observer code. + * + * @category Networking + * @package FTP + * @author Laurent Laville + * @author Chuck Hagenbuch + * @author Tobias Schlitt + * @copyright 1997-2008 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version Release: 1.3.7 + * @link http://pear.php.net/package/Net_FTP + * @since 1.3.0.0 + * @access public + * + * @example observer_upload.php An example of Net_FTP_Observer implementation. + */ +class Net_FTP_Observer +{ + /** + * Instance-specific unique identification number. + * + * @var integer + * @since 1.3.0 + * @access private + */ + var $_id; + + /** + * Creates a new basic Net_FTP_Observer instance. + * + * @since 1.3.0 + * @access public + */ + function Net_FTP_Observer() + { + $this->_id = $this->encryptOld(microtime()); + } + + /** + * Returns the listener's identifier + * + * @return string The listener's identifier + * @since 1.3.0 + * @access public + */ + function getId() + { + return $this->_id; + } + + /** + * This is a stub method to make sure that Net_FTP_Observer classes do + * something when they are notified of a message. The default behavior + * is to just do nothing. + * You should override this method. + * + * @param mixed $event A hash describing the net event. + * + * @since 1.3.0 + * @access public + * @return void + */ + function notify($event) + { + return; + } + + public function encryptOld($string) + { + if (!class_exists('G')) { + $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); + $docuroot = explode( '/', $realdocuroot ); + array_pop( $docuroot ); + $pathhome = implode( '/', $docuroot ) . '/'; + array_pop( $docuroot ); + $pathTrunk = implode( '/', $docuroot ) . '/'; + require_once($pathTrunk.'gulliver/system/class.g.php'); + } + return G::encryptOld($string); + } + +} +?> diff --git a/thirdparty/pear/Net/FTP/Socket.php b/thirdparty/pear/Net/FTP/Socket.php new file mode 100644 index 000000000..805775468 --- /dev/null +++ b/thirdparty/pear/Net/FTP/Socket.php @@ -0,0 +1,800 @@ + + * @copyright 1997-2008 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version CVS: $Id: Socket.php,v 1.5.2.2 2008/04/22 19:47:08 jschippers Exp $ + * @link http://pear.php.net/package/Net_FTP + * @since File available since Release 0.0.1 + */ + +error_reporting(E_ALL); + +/** +* Default FTP extension constants +*/ +define('FTP_ASCII', 0); +define('FTP_TEXT', 0); +define('FTP_BINARY', 1); +define('FTP_IMAGE', 1); +define('FTP_TIMEOUT_SEC', 0); + +/** +* What needs to be done overall? +* #1 Install the rest of these functions +* #2 Document better +* #3 Alot of other things I don't remember +*/ + +/* + * !!! NOTE !!! + * Most of the comment's are "not working", + * meaning they are not all up-to-date + * !!! NOTE !!! + */ + +/** + * &resource ftp_connect ( string host [, int port [, int timeout ] ] ); + * + * Opens an FTP connection and return resource or false on failure. + * + * FTP Success respons code: 220 + * + * @param string $host Host to connect to + * @param int $port Optional, port to connect to + * @param int $timeout Optional, seconds until function timeouts + * + * @todo The FTP extension has ftp_get_option() function which returns the + * timeout variable. This function needs to be created and contain it as + * static variable. + * @todo The FTP extension has ftp_set_option() function which sets the + * timeout variable. This function needs to be created and called here. + * @access public + * @return &resource + */ +function &ftp_connect($host, $port = 21, $timeout = 90) +{ + $false = false; // We are going to return refrence (E_STRICT) + + if (!is_string($host) || !is_integer($port) || !is_integer($timeout)) { + return $false; + } + + $control = @fsockopen($host, $port, $iError, $sError, + $timeout); + $GLOBALS['_NET_FTP']['timeout'] = $timeout; + + if (!is_resource($control)) { + return $false; + } + + stream_set_blocking($control, true); + stream_set_timeout($control, $timeout); + + do { + $content[] = fgets($control, 8129); + $array = socket_get_status($control); + } while ($array['unread_bytes'] > 0); + + if (substr($content[count($content)-1], 0, 3) == 220) { + return $control; + } + + return $false; +} + +/** + * boolean ftp_login ( resource stream, string username, string password ); + * + * Logs in to an given FTP connection stream. + * Returns TRUE on success or FALSE on failure. + * + * NOTE: + * Username and password are *not* optional. Function will *not* + * assume "anonymous" if username and/or password is empty + * + * FTP Success respons code: 230 + * + * @param resource &$control FTP resource to login to + * @param string $username FTP Username to be used + * @param string $password FTP Password to be used + * + * @access public + * @return boolean + */ +function ftp_login(&$control, $username, $password) +{ + if (!is_resource($control) || is_null($username)) { + return false; + } + + fputs($control, 'USER '.$username."\r\n"); + $contents = array(); + do { + $contents[] = fgets($control, 8192); + $array = socket_get_status($control); + } while ($array['unread_bytes'] > 0); + + if (substr($contents[count($contents)-1], 0, 3) != 331) { + return false; + } + + fputs($control, 'PASS '.$password."\r\n"); + $contents = array(); + do { + $contents[] = fgets($control, 8192); + $array = socket_get_status($control); + } while ($array['unread_bytes']); + + if (substr($contents[count($contents)-1], 0, 3) == 230) { + return true; + } + + trigger_error('ftp_login() [function.ftp-login'. + ']: '.$contents[count($contents)-1], E_USER_WARNING); + + return false; +} + +/** + * boolean ftp_quit ( resource stream ); + * + * Closes FTP connection. + * Returns TRUE or FALSE on error. + * + * NOTE: The PHP function ftp_quit is *alias* to ftp_close, here it is + * the *other-way-around* ( ftp_close() is alias to ftp_quit() ). + * + * NOTE: + * resource is set to null since unset() can't unset the variable. + * + * @param resource &$control FTP resource + * + * @access public + * @return boolean + */ +function ftp_quit(&$control) +{ + if (!is_resource($control)) { + return false; + } + + fputs($control, 'QUIT'."\r\n"); + fclose($control); + $control = null; + return true; +} + +/** + * Alias to ftp_quit() + * + * @param resource &$control FTP resource + * + * @see ftp_quit() + * @access public + * @return boolean + */ +function ftp_close(&$control) +{ + return ftp_quit($control); +} + +/** + * string ftp_pwd ( resource stream ); + * + * Gets the current directory name. + * Returns the current directory. + * + * Needs data connection: NO + * Success response code: 257 + * + * @param resource &$control FTP resource + * + * @access public + * @return string + */ +function ftp_pwd(&$control) +{ + if (!is_resource($control)) { + return $control; + } + + fputs($control, 'PWD'."\r\n"); + + $content = array(); + do { + $content[] = fgets($control, 8192); + $array = socket_get_status($control); + } while ($array['unread_bytes'] > 0); + + if (substr($cont = $content[count($content)-1], 0, 3) == 257) { + $pos = strpos($cont, '"')+1; + $pos2 = strrpos($cont, '"') - $pos; + $path = substr($cont, $pos, $pos2); + return $path; + } + + return false; +} + +/** + * boolean ftp_chdir ( resource stream, string directory ); + * + * Changes the current directory to the specified directory. + * Returns TRUE on success or FALSE on failure. + * + * FTP success response code: 250 + * Needs data connection: NO + * + * @param resource &$control FTP stream + * @param string $pwd Directory name + * + * @access public + * @return boolean + */ +function ftp_chdir(&$control, $pwd) +{ + if (!is_resource($control) || !is_string($pwd)) { + return false; + } + + fputs($control, 'CWD '.$pwd."\r\n"); + $content = array(); + do { + $content[] = fgets($control, 8192); + $array = socket_get_status($control); + } while ($array['unread_bytes'] > 0); + + if (substr($content[count($content)-1], 0, 3) == 250) { + return true; + } + + trigger_error('ftp_chdir() [function.ftp-chdir]: + ' .$content[count($content)-1], E_USER_WARNING); + + return false; +} + +$_NET_FTP = array(); +$_NET_FTP['USE_PASSIVE'] = false; +$_NET_FTP['DATA'] = null; + +/** + * boolean ftp_pasv ( resource stream, boolean passive ); + * + * Toggles passive mode ON/OFF. + * Returns TRUE on success or FALSE on failure. + * + * Comment: + * Although my lack of C knowlege I checked how the PHP FTP extension + * do things here. Seems like they create the data connection and store + * it in object for other functions to use. + * This is now done here. + * + * FTP success response code: 227 + * + * @param stream &$control FTP stream + * @param boolean $pasv True to switch to passive, false for active mode + * + * @access public + * @return boolean + */ +function ftp_pasv(&$control, $pasv) +{ + if (!is_resource($control) || !is_bool($pasv)) { + return false; + } + + // If data connection exists, destroy it + if (isset($GLOBALS['_NET_FTP']['DATA'])) { + fclose($GLOBALS['_NET_FTP']['DATA']); + $GLOBALS['_NET_FTP']['DATA'] = null; + + do { + fgets($control, 16); + $array = socket_get_status($control); + } while ($array['unread_bytes'] > 0); + } + + // Are we suppost to create active or passive connection? + if (!$pasv) { + $GLOBALS['_NET_FTP']['USE_PASSIVE'] = false; + // Pick random "low bit" + $low = rand(39, 250); + // Pick random "high bit" + $high = rand(39, 250); + // Lowest possible port would be; 10023 + // Highest possible port would be; 64246 + + $port = ($low<<8)+$high; + $ip = str_replace('.', ',', $_SERVER['SERVER_ADDR']); + $s = $ip.','.$low.','.$high; + + $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); + if (is_resource($socket)) { + if (socket_bind($socket, '0.0.0.0', $port)) { + if (socket_listen($socket)) { + $GLOBALS['_NET_FTP']['DATA'] = &$socket; + fputs($control, 'PORT '.$s."\r\n"); + $line = fgets($control, 512); + if (substr($line, 0, 3) == 200) { + return true; + } + } + } + } + return false; + } + + // Since we are here, we are suppost to create passive data connection. + $i = fputs($control, 'PASV' ."\r\n"); + + $content = array(); + do { + $content[] = fgets($control, 128); + $array = socket_get_status($control); + } while ($array['unread_bytes']); + + if (substr($cont = $content[count($content)-1], 0, 3) != 227) { + return false; + } + + $pos = strpos($cont, '(')+1; + $pos2 = strrpos($cont, ')')-$pos; + $string = substr($cont, $pos, $pos2); + + $array = explode(',', $string); + // IP we are connecting to + $ip = $array[0]. '.' .$array[1]. '.' .$array[2]. '.' .$array[3]; + // Port ( 256*lowbit + highbit + $port = ($array[4] << 8)+$array[5]; + + // Our data connection + $data = fsockopen($ip, $port, $iError, $sError, + $GLOBALS['_NET_FTP']['timeout']); + + if (is_resource($data)) { + $GLOBALS['_NET_FTP']['USE_PASSIVE'] = true; + $GLOBALS['_NET_FTP']['DATA'] = &$data; + stream_set_blocking($data, true); + stream_set_timeout($data, $GLOBALS['_NET_FTP']['timeout']); + + return true; + } + + return false; +} + +/** + * array ftp_rawlist ( resource stream, string directory [,bool recursive] ); + * + * Returns a detailed list of files in the given directory. + * + * Needs data connection: YES + * + * @param integer &$control FTP resource + * @param string $pwd Path to retrieve + * @param boolean $recursive Optional, retrieve recursive listing + * + * @todo Enable the recursive feature. + * @access public + * @return array + */ +function ftp_rawlist(&$control, $pwd, $recursive = false) +{ + if (!is_resource($control) || !is_string($pwd)) { + return false; + } + + if (!isset($GLOBALS['_NET_FTP']['DATA']) || + !is_resource($GLOBALS['_NET_FTP']['DATA'])) { + ftp_pasv($control, $GLOBALS['_NET_FTP']['USE_PASSIVE']); + } + fputs($control, 'LIST '.$pwd."\r\n"); + + $msg = fgets($control, 512); + if (substr($msg, 0, 3) == 425) { + return false; + } + + $data = &$GLOBALS['_NET_FTP']['DATA']; + if (!$GLOBALS['_NET_FTP']['USE_PASSIVE']) { + $data = &socket_accept($data); + } + + $content = array(); + + switch ($GLOBALS['_NET_FTP']['USE_PASSIVE']) { + case true: + while (true) { + $string = rtrim(fgets($data, 1024)); + + if ($string=='') { + break; + } + + $content[] = $string; + } + + fclose($data); + break; + + case false: + $string = socket_read($data, 1024, PHP_BINARY_READ); + + $content = explode("\n", $string); + unset($content[count($content)-1]); + + socket_close($GLOBALS['_NET_FTP']['DATA']); + socket_close($data); + break; + } + + $data = $GLOBALS['_NET_FTP']['DATA'] = null; + + $f = fgets($control, 1024); + return $content; +} + +/** + * string ftp_systype ( resource stream ); + * + * Gets system type identifier of remote FTP server + * Returns the remote system type + * + * @param resource &$control FTP resource + * + * @access public + * @return string + */ +function ftp_systype(&$control) +{ + if (!is_resource($control)) { + return false; + } + + fputs($control, 'SYST'."\r\n"); + $line = fgets($control, 256); + + if (substr($line, 0, 3) != 215) { + return false; + } + + $os = substr($line, 4, strpos($line, ' ', 4)-4); + return $os; +} + +/** + * boolean ftp_alloc ( resource stream, integer bytes [, string &message ] ); + * + * Allocates space for a file to be uploaded + * Return TRUE on success or FALSE on failure + * + * NOTE; Many FTP servers do not support this command and/or don't need it. + * + * FTP success respons key: Belive it's 200 + * Needs data connection: NO + * + * @param resource &$control FTP stream + * @param integer $int Space to allocate + * @param string &$msg Optional, textual representation of the servers response + * will be returned by reference + * + * @access public + * @return boolean + */ +function ftp_alloc(&$control, $int, &$msg = null) +{ + if (!is_resource($control) || !is_integer($int)) { + return false; + } + + fputs($control, 'ALLO '.$int.' R '.$int."\r\n"); + + $msg = rtrim(fgets($control, 256)); + + $code = substr($msg, 0, 3); + if ($code == 200 || $code == 202) { + return true; + } + + return false; +} + +/** + * bool ftp_put ( resource stream, string remote_file, string local_file, + * int mode [, int startpos ] ); + * + * Uploads a file to the FTP server + * Returns TRUE on success or FALSE on failure. + * + * NOTE: + * The transfer mode specified must be either FTP_ASCII or FTP_BINARY. + * + * @param resource &$control FTP stream + * @param string $remote Remote file to write + * @param string $local Local file to upload + * @param integer $mode Upload mode, FTP_ASCI || FTP_BINARY + * @param integer $pos Optional, start upload at position + * + * @access public + * @return boolean + */ +function ftp_put(&$control, $remote, $local, $mode, $pos = 0) +{ + if (!is_resource($control) || !is_readable($local) || + !is_integer($mode) || !is_integer($pos)) { + return false; + } + + $types = array ( + 0 => 'A', + 1 => 'I' + ); + $windows = array ( + 0 => 't', + 1 => 'b' + ); + + /** + * TYPE values: + * A ( ASCII ) + * I ( BINARY ) + * E ( EBCDIC ) + * L ( BYTE ) + */ + + if (!isset($GLOBALS['_NET_FTP']['DATA']) || + !is_resource($GLOBALS['_NET_FTP']['DATA'])) { + ftp_pasv($control, $GLOBALS['_NET_FTP']['USE_PASSIVE']); + + } + // Establish data connection variable + $data = &$GLOBALS['_NET_FTP']['DATA']; + + // Decide TYPE to use + fputs($control, 'TYPE '.$types[$mode]."\r\n"); + $line = fgets($control, 256); // "Type set to TYPE" + if (substr($line, 0, 3) != 200) { + return false; + } + + fputs($control, 'STOR '.$remote."\r\n"); + sleep(1); + $line = fgets($control, 256); // "Opening TYPE mode data connect." + + if (substr($line, 0, 3) != 150) { + return false; + } + + // Creating resource to $local file + $fp = fopen($local, 'r'. $windows[$mode]); + if (!is_resource($fp)) { + $fp = null; + return false; + } + + // Loop throu that file and echo it to the data socket + $i = 0; + switch ($GLOBALS['_NET_FTP']['USE_PASSIVE']) { + case false: + $data = &socket_accept($data); + while (!feof($fp)) { + $i += socket_write($data, fread($fp, 10240), 10240); + } + socket_close($data); + break; + + case true: + while (!feof($fp)) { + $i += fputs($data, fread($fp, 10240), 10240); + } + + fclose($data); + break; + } + + $data = null; + do { + $line = fgets($control, 256); + } while (substr($line, 0, 4) != "226 "); + return true; +} + +/** + * Retrieve a remote file to a local file + * Returns TRUE on success or FALSE on failure + * + * @param integer &$control Stream ID + * @param string $local Local filename + * @param string $remote Remote filename + * @param integer $mode Transfer mode (FTP_ASCII or FTP_BINARY) + * @param integer $resume Resume the file transfer or not + * + * @access public + * @return boolean + */ +function ftp_get(&$control, $local, $remote, $mode, $resume = 0, $wr='w') +{ + if (!class_exists('G')) { + $realdocuroot = str_replace('\\', '/', $_SERVER['DOCUMENT_ROOT']); + $docuroot = explode('/', $realdocuroot); + array_pop($docuroot); + $pathhome = implode('/', $docuroot) . '/'; + array_pop($docuroot); + $pathTrunk = implode('/', $docuroot) . '/'; + require_once($pathTrunk . 'gulliver/system/class.g.php'); + } + G::LoadSystem('inputfilter'); + $filter = new InputFilter(); + if (!is_resource($control) || !is_writable(dirname($local)) || + !is_integer($mode) || !is_integer($resume)) { + return false; + } + $types = array ( + 0 => 'A', + 1 => 'I' + ); + $windows = array ( + 0 => 't', + 1 => 'b' + ); + + if (!isset($GLOBALS['_NET_FTP']['DATA']) || + !is_resource($GLOBALS['_NET_FTP'][ 'DATA'])) { + ftp_pasv($control, $GLOBALS['_NET_FTP']['USE_PASSIVE']); + } + $data = &$GLOBALS['NET_FTP']['DATA']; + + fputs($control, 'TYPE '.$types[$mode]."\r\n"); + $line = fgets($control, 256); + if (substr($line, 0, 3) != 200) { + return false; + } + + if(is_file($filter->validatePath($local))) { + $var = $wr.$windows[$mode]; + $fp = fopen($filter->validatePath($local), $var); + } else { + $fp = false; + } + + if (!is_resource($fp)) { + $fp = null; + return false; + } +} + +/** + * Changes to the parent directory + * Returns TRUE on success or FALSE on failure + * + * @param integer &$control Stream ID + * + * @access public + * @return boolean + */ +function ftp_cdup(&$control) +{ + fputs($control, 'CDUP'."\r\n"); + $line = fgets($control, 256); + + if (substr($line, 0, 3) != 250) { + return false; + } + + return true; +} + +/** + * Set permissions on a file via FTP + * Returns the new file permission on success or false on error + * + * NOTE: This command is *not* supported by the standard + * NOTE: This command not ready! + * + * @param integer &$control Stream ID + * @param integer $mode Octal value + * @param string $file File to change permissions on + * + * @todo Figure out a way to chmod files via FTP + * @access public + * @return integer + */ +function ftp_chmod(&$control, $mode, $file) +{ + if (!is_resource($control) || !is_integer($mode) || !is_string($file)) { + return false; + } + + // chmod not in the standard, proftpd doesn't recognize it + // use SITE CHMOD? + fputs($control, 'SITE CHMOD '.$mode. ' ' .$file."\r\n"); + $line = fgets($control, 256); + + if (substr($line, 0, 3) == 200) { + return $mode; + } + + trigger_error('ftp_chmod() [function.ftp-chmod]: ' . + rtrim($line), E_USER_WARNING); + return false; +} + +/** + * Deletes a file on the FTP server + * Returns TRUE on success or FALSE on failure + * + * @param integer &$control Stream ID + * @param string $path File to delete + * + * @access public + * @return boolean + */ +function ftp_delete(&$control, $path) +{ + if (!is_resource($control) || !is_string($path)) { + return false; + } + + fputs($control, 'DELE '.$path."\r\n"); + $line = fgets($control, 256); + + if (substr($line, 0, 3) == 250) { + return true; + } + + return false; +} + +/** + * Requests execution of a program on the FTP server + * NOTE; SITE EXEC is *not* supported by the standart + * Returns TRUE on success or FALSE on error + * + * @param integer &$control Stream ID + * @param string $cmd Command to send + * + * @access public + * @todo Look a littlebit better into this + * @return boolean + */ +function ftp_exec(&$control, $cmd) +{ + if (!is_resource($control) || !is_string($cmd)) { + return false; + } + // Command not defined in the standart + // proftpd doesn't recognize SITE EXEC (only help,chgrp,chmod and ratio) + fputs($control, 'SITE EXEC '.$cmd."\r\n"); + $line = fgets($control, 256); + + // php.net/ftp_exec uses respons code 200 to verify if command was sent + // successfully or not, so we'll just do the same + if (substr($line, 0, 3) == 200) { + return true; + } + + return false; +} +?> diff --git a/thirdparty/pear/Net/IDNA.php b/thirdparty/pear/Net/IDNA.php new file mode 100644 index 000000000..14749d580 --- /dev/null +++ b/thirdparty/pear/Net/IDNA.php @@ -0,0 +1,101 @@ + + * @author Matthias Sommerfeld + * @package Net + * @version $Id: IDNA.php,v 1.1 2008/03/22 12:39:37 neufeind Exp $ + */ + +class Net_IDNA +{ + // {{{ factory + /** + * Attempts to return a concrete IDNA instance for either php4 or php5. + * + * @param array $params Set of paramaters + * @return object IDNA The newly created concrete Log instance, or an + * false on an error. + * @access public + */ + function &getInstance($params = array()) + { + $version = explode( '.', phpversion() ); + $handler = ((int)$version[0] > 4) ? 'php5' : 'php4'; + $class = 'Net_IDNA_' . $handler; + $classfile = 'Net/IDNA/' . $handler . '.php'; + + /* + * Attempt to include our version of the named class, but don't treat + * a failure as fatal. The caller may have already included their own + * version of the named class. + */ + @include_once $classfile; + + /* If the class exists, return a new instance of it. */ + if (class_exists($class)) { + $instance = &new $class($params); + return $instance; + } + + return false; + } + // }}} + + // {{{ 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 IDNA The newly created concrete Log instance, or an + * false on an error. + * @access public + */ + function &singleton($params = array()) + { + static $instances; + if (!isset($instances)) { + $instances = array(); + } + + $signature = serialize($params); + if (!isset($instances[$signature])) { + $instances[$signature] = &Net_IDNA::getInstance($params); + } + + return $instances[$signature]; + } + // }}} +} + +?> diff --git a/thirdparty/pear/Net/IDNA/php4.php b/thirdparty/pear/Net/IDNA/php4.php new file mode 100644 index 000000000..3e93bb474 --- /dev/null +++ b/thirdparty/pear/Net/IDNA/php4.php @@ -0,0 +1,3011 @@ + + * @author Matthias Sommerfeld + * @author Stefan Neufeind + * @package Net + * @version $Id: php4.php,v 1.3 2008/03/22 15:24:17 neufeind Exp $ + */ + +class Net_IDNA_php4 +{ + // {{{ npdata + /** + * These Unicode codepoints are mapped to nothing, + * See RFC3454 for details + * + * @static + * @var array + * @access private + */ + var $_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 + ); + + /** + * @static + * @var array + * @access private + */ + var $_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 + ); + + /** + * @static + * @var array + * @access private + */ + var $_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 + ); + + /** + * @static + * @var array + * @access private + */ + var $_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 ) + ); + + /** + * @static + * @var array + * @access private + */ + var $_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 + */ + var $_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 + ); + // }}} + + + // Internal settings, do not mess with them + var $_punycode_prefix = 'xn--'; + var $_invalid_ucs = 0x80000000; + var $_max_ucs = 0x10FFFF; + var $_base = 36; + var $_tmin = 1; + var $_tmax = 26; + var $_skew = 38; + var $_damp = 700; + var $_initial_bias = 72; + var $_initial_n = 0x80; + var $_sbase = 0xAC00; + var $_lbase = 0x1100; + var $_vbase = 0x1161; + var $_tbase = 0x11a7; + var $_lcount = 19; + var $_vcount = 21; + var $_tcount = 28; + var $_ncount = 588; // _vcount * _tcount + var $_scount = 11172; // _lcount * _tcount * _vcount + var $_error = false; + + // See set_parameter() for details of how to change the following settings + // from within your script / application + var $_api_encoding = 'utf8'; // Default input charset is UTF-8 + var $_allow_overlong = false; // Overlong UTF-8 encodings are forbidden + var $_strict_mode = false; // Behave strict or not + + // The constructor + function Net_IDNA_php4($options = false) + { + $this->slast = $this->_sbase + $this->_lcount * $this->_vcount * $this->_tcount; + // If parameters are given, pass these to the respective method + if (is_array($options)) { + return $this->set_parameter($options); + } + return true; + } + + /** + * Sets a new option value. Available options and values: + * [encoding - Use either UTF-8, UCS4 as array or UCS4 as string as input ('utf8' for UTF-8, + * 'ucs4_string' and 'ucs4_array' respectively for UCS4); 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 Parameter to set (string: single parameter; array of Parameter => Value pairs) + * @param string Value to use (if parameter 1 is a string) + * @return boolean true on success, false otherwise + * @access public + */ + function set_parameter($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: + $this->_error('Set Parameter: Unknown parameter '.$v.' for option '.$k); + return false; + } + break; + case 'overlong': + $this->_allow_overlong = ($v) ? true : false; + break; + case 'strict': + $this->_strict_mode = ($v) ? true : false; + break; + default: + $this->_error('Set Parameter: Unknown option '.$k); + return false; + } + } + return true; + } + + /** + * Decode a given ACE domain name + * @param string Domain name (ACE string) + * [@param string Desired output encoding, see {@link set_parameter}] + * @return string Decoded Domain name (UTF-8 or UCS-4) + * @access 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: + $this->_error('Unknown encoding '.$one_time_encoding); + return false; + } + } + // 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) { + $this->_error('Only simple domain name parts can be handled in strict mode'); + return false; + } + 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) { + $this->_error('Only simple domain name parts can be handled in strict mode'); + return false; + } + $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 = join('', $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: + $this->_error('Unsupported output format'); + return false; + } + } + + /** + * Encode a given UTF-8 domain name + * @param string Domain name (UTF-8 or UCS-4) + * [@param string Desired input encoding, see {@link set_parameter}] + * @return string Encoded Domain name (ACE string) + * @access 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': + break; + default: + // $this->_error('Unsupported input format: '.$this->_api_encoding); + $this->_error('Unsupported input format'); + return false; + } + + // 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) { + $this->_error('Neither email addresses nor URLs are allowed in strict mode.'); + return false; + } else { + // 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; + } else { + if ($output = $this->_encode($decoded)) { + return $output; + } else { + return $this->_ucs4_to_utf8($decoded); + } + } + } + + /** + * Use this method to get the last error ocurred + * @param void + * @return string The last error, that occured + * @access public + */ + function get_last_error() + { + return $this->_error; + } + + /** + * The actual decoding algorithm + * @access private + */ + function _decode($encoded) + { + // We do need to find the Punycode prefix + if (!preg_match('!^'.preg_quote($this->_punycode_prefix, '!').'!', $encoded)) { + $this->_error('This is not a punycode string'); + 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) { + $this->_error('The given encoded string was empty'); + return false; + } + // Find last occurence of the delimiter + $delim_pos = strrpos($encoded, '-'); + if ($delim_pos > strlen($this->_punycode_prefix)) { + for ($k = strlen($this->_punycode_prefix); $k < $delim_pos; ++$k) { + $decoded[] = ord($encoded{$k}); + } + } else { + $decoded = array(); + } + $deco_len = count($decoded); + $enco_len = strlen($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->_decode_digit($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); + } + + /** + * The actual encoding algorithm + * @access private + */ + function _encode($decoded) + { + // We cannot encode a domain name containing the Punycode prefix + $extract = strlen($this->_punycode_prefix); + $check_pref = $this->_utf8_to_ucs4($this->_punycode_prefix); + $check_deco = array_slice($decoded, 0, $extract); + + if ($check_pref == $check_deco) { + $this->_error('This is already a punycode string'); + return false; + } + // 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) { + $this->_error('The given string does not contain encodable chars'); + return false; + } + + // Do NAMEPREP + $decoded = $this->_nameprep($decoded); + if (!$decoded || !is_array($decoded)) return false; // NAMEPREP failed + + $deco_len = count($decoded); + if (!$deco_len) return false; // Empty array + + $codecount = 0; // How many chars have been consumed + + $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++; + } elseif ($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->_encode_digit(ceil($t + (($q - $t) % ($this->_base - $t)))); + $q = ($q - $t) / ($this->_base - $t); + } + $encoded .= $this->_encode_digit($q); + $bias = $this->_adapt($delta, $codecount+1, $is_first); + $codecount++; + $delta = 0; + $is_first = false; + } + } + $delta++; + $cur_code++; + } + return $encoded; + } + + /** + * Adapt the bias according to the current code point and position + * @access 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 + * @access private + */ + function _encode_digit($d) + { + return chr($d + 22 + 75 * ($d < 26)); + } + + /** + * Decode a certain digit + * @access private + */ + function _decode_digit($cp) + { + $cp = ord($cp); + return ($cp - 48 < 10) ? $cp - 22 : (($cp - 65 < 26) ? $cp - 65 : (($cp - 97 < 26) ? $cp - 97 : $this->_base)); + } + + /** + * Internal error handling method + * @access private + */ + function _error($error = '') + { + $this->_error = $error; + } + + /** + * Do Nameprep according to RFC3491 and RFC3454 + * @param array Unicode Characters + * @return string Unicode Characters, Nameprep'd + * @access private + */ + function _nameprep($input) + { + $output = array(); + $error = false; + // + // Mapping + // 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 + + // $this->_show_hex($input); + foreach ($input as $v) { + // Map to nothing == skip that code point + if (in_array($v, $this->_np_map_nothing)) continue; + + // Try to find prohibited input + if (in_array($v, $this->_np_prohibit) || in_array($v, $this->_general_prohibited)) { + $this->_error('NAMEPREP: Prohibited input U+'.sprintf('%08X', $v)); + return false; + } + foreach ($this->_np_prohibit_ranges as $range) { + if ($range[0] <= $v && $v <= $range[1]) { + $this->_error('NAMEPREP: Prohibited input U+'.sprintf('%08X', $v)); + return false; + } + } + // + // Hangul syllable decomposition + if (0xAC00 <= $v && $v <= 0xD7AF) { + foreach ($this->_hangul_decompose($v) as $out) { + $output[] = $out; + } + // There's a decomposition mapping for that code point + } elseif (isset($this->_np_replacemaps[$v])) { + foreach ($this->_apply_cannonical_ordering($this->_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->_get_combining_class($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->_get_combining_class($output[$i-1]); + continue; + } + } + if (!$class) { // The current class is 0 + $last_starter = $i; + } + $last_class = $class; + } + return $output; + } + + /** + * Decomposes a Hangul syllable + * (see http://www.unicode.org/unicode/reports/tr15/#Hangul + * @param integer 32bit UCS4 code point + * @return array Either Hangul Syllable decomposed or original 32bit value as one value array + * @access private + */ + function _hangul_decompose($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 Decomposed UCS4 sequence + * @return array UCS4 sequence with syllables composed + * @access private + */ + function _hangul_compose($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 + continue; // discard char + } + } + + // 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 + continue; // discard char + } + } + // 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 Wide char to check (32bit integer) + * @return integer Combining class if found, else 0 + * @access private + */ + function _get_combining_class($char) + { + return isset($this->np_norm_combcls[$char]) ? $this->np_norm_combcls[$char] : 0; + } + + /** + * Apllies the cannonical ordering of a decomposed UCS4 sequence + * @param array Decomposed UCS4 sequence + * @return array Ordered USC4 sequence + * @access private + */ + function _apply_cannonical_ordering($input) + { + $swap = true; + $size = count($input); + while ($swap) { + $swap = false; + $last = $this->_get_combining_class($input[0]); + for ($i = 0; $i < $size - 1; ++$i) { + $next = $this->_get_combining_class($input[$i+1]); + if ($next != 0 && $last > $next) { + // Move item leftward until it fits + for ($j = $i + 1; $j > 0; --$j) { + if ($this->_get_combining_class($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 UCS4 Decomposed sequence + * @return array Ordered USC4 sequence + * @access private + */ + function _combine($input) + { + $inp_len = count($input); + // Is it a Hangul syllable? + if (1 != $inp_len) { + $hangul = $this->_hangul_compose($input); + if (count($hangul) != $inp_len) return $hangul; // This place is probably wrong + } + foreach ($this->np_casemap 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 representation + * By talking about UCS-4 "strings" 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 apllies 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. + * The five and six byte sequences are part of Annex D of ISO/IEC 10646-1:2000 + * @access private + */ + function _utf8_to_ucs4($input) + { + $output = array(); + $out_len = 0; + $inp_len = strlen($input); + $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) { + $this->_error('Conversion from UTF-8 to UCS-4 failed: malformed input at byte '.$k); + return false; + } + 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 { + $this->_error('This might be UTF-8, but I don\'t understand it at byte '.$k); + return false; + } + 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)) { + $this->_error('Bogus UTF-8 character detected (out of legal range) at byte '.$k); + return false; + } + } + if ($v >> 6 == 2) { // Bit mask must be 10xxxxxx + $v = ($v - 128) << ($next_byte * 6); + $output[($out_len - 1)] += $v; + --$next_byte; + } else { + $this->_error('Conversion from UTF-8 to UCS-4 failed: malformed input at byte '.$k); + return false; + } + if ($next_byte < 0) { + $mode = 'next'; + } + } + } // for + return $output; + } + + /** + * Convert UCS-4 string into UTF-8 string + * See _utf8_to_ucs4() for details + * @access private + */ + function _ucs4_to_utf8($input) + { + $output = ''; + foreach ($input as $v) { + // $v = ord($v); + if ($v < 128) { // 7bit are transferred literally + $output .= chr($v); + } elseif ($v < (1 << 11)) { // 2 bytes + $output .= chr(192 + ($v >> 6)) . chr(128 + ($v & 63)); + } elseif ($v < (1 << 16)) { // 3 bytes + $output .= chr(224 + ($v >> 12)) . chr(128 + (($v >> 6) & 63)) . chr(128 + ($v & 63)); + } elseif ($v < (1 << 21)) { // 4 bytes + $output .= chr(240 + ($v >> 18)) . chr(128 + (($v >> 12) & 63)) + . chr(128 + (($v >> 6) & 63)) . chr(128 + ($v & 63)); + } elseif ($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)); + } elseif ($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 { + $this->_error('Conversion from UCS-4 to UTF-8 failed: malformed input at byte '.$k); + return false; + } + } + return $output; + } + + /** + * Convert UCS-4 array into UCS-4 string + * + * @access 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 .= chr(($v >> 24) & 255) + . chr(($v >> 16) & 255) + . chr(($v >> 8) & 255) + . chr($v & 255); + } + return $output; + } + + /** + * Convert UCS-4 strin into UCS-4 garray + * + * @access private + */ + function _ucs4_string_to_ucs4($input) + { + $output = array(); + + $inp_len = strlen($input); + // Input length must be dividable by 4 + if ($inp_len % 4) { + $this->_error('Input UCS4 string is broken'); + return false; + } + + // 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; + } + + /** + * Gives you a bit representation of given Byte (8 bits), Word (16 bits) or DWord (32 bits) + * Output width is automagically determined + * @access private + */ + function show_bitmask($octet) + { + if ($octet >= (1 << 16)) $w = 31; + elseif ($octet >= (1 << 8)) $w = 15; + else $w = 7; + $return = ''; + for ($i = $w; $i > -1; $i--) { + $return .= ($octet & (1 << $i)) ? 1 : '0'; + } + return $return; + } + + /** + * echo hex represnatation of UCS4 sequence to STDOUT + * @param array UCS4 sequence + * @param boolean include bitmask in output + * @return void + * @access private + */ + function _show_hex($input, $include_bit = false) + { + foreach ($input as $k => $v) { + echo '[', $k, '] => ', sprintf('%X', $v); + if ($include_bit) { + echo ' (', $this->show_bitmask($v), ')'; + } + echo "\n"; + } + } +} + +/** +* Adapter class for aligning the API of Net_IDNA_php4 with that of +* Net_IDNA +* @author Matthias Sommerfeld +*/ +class Net_IDNA extends Net_IDNA_php4 +{ + /** + * Constructor + * + * @param array $options + * @access public + * @see setParams() + */ + function Net_IDNA($options = false) + { + $this->IC = new idna_convert($options); + return $this->IC; + } + + /** + * 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 + */ + function setParams($option, $param = false) + { + return $this->IC->set_parameters($option, $param); + } +} + +?> diff --git a/thirdparty/pear/Net/IDNA/php5.php b/thirdparty/pear/Net/IDNA/php5.php new file mode 100644 index 000000000..cc8484b92 --- /dev/null +++ b/thirdparty/pear/Net/IDNA/php5.php @@ -0,0 +1,3233 @@ + + * @author Matthias Sommerfeld + * @author Stefan Neufeind + * @package Net + * @version $Id: php5.php,v 1.3 2008/03/22 15:24:17 neufeind Exp $ + */ + +class Net_IDNA_php5 +{ + // {{{ 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; + // }}} + + + // {{{ constructor + /** + * Constructor + * + * @param array $options + * @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); + } + } + // }}} + + + /** + * 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 Exception('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; + + default: + return false; + } + } + + return true; + } + + /** + * Encode a given UTF-8 domain name. + * + * @param string $decoded Domain name (UTF-8 or UCS-4) + * [@param string $encoding Desired input encoding, see {@link set_parameter}] + * @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 Exception('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 Exception('Neither email addresses nor URLs are allowed in strict mode.'); + } else { + // 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; + } else { + if ($output = $this->_encode($decoded)) { + return $output; + } else { + return $this->_ucs4_to_utf8($decoded); + } + } + } + + /** + * Decode a given ACE domain name. + * + * @param string $encoded Domain name (ACE string) + * @param string $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 Exception('Unknown encoding '.$one_time_encoding); + return false; + } + } + // 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 Exception('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 Exception('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 = join('', $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 Exception('Unsupported output format'); + } + } + + + // {{{ private + /** + * The actual encoding algorithm. + * + * @return string + * @throws Exception + * @access private + */ + private function _encode($decoded) + { + // We cannot encode a domain name containing the Punycode prefix + $extract = strlen($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 Exception('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 Exception('The given string does not contain encodable chars'); + } else { + return false; + } + } + + // Do NAMEPREP + try { + $decoded = $this->_nameprep($decoded); + } catch (Exception $e) { + // hmm, serious - rethrow + throw $e; + } + + $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. + * + * @return 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 > strlen($this->_punycode_prefix)) { + for ($k = strlen($this->_punycode_prefix); $k < $delim_pos; ++$k) { + $decoded[] = ord($encoded{$k}); + } + } else { + $decoded = array(); + } + + $deco_len = count($decoded); + $enco_len = strlen($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; + } + + try { + return $this->_ucs4_to_utf8($decoded); + } catch (Exception $e) { + // rethrow + throw $e; + } + } + + /** + * Adapt the bias according to the current code point and position. + * + * @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. + * + * @access private + */ + private function _encodeDigit($d) + { + return chr($d + 22 + 75 * ($d < 26)); + } + + /** + * Decode a certain 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 Exception('NAMEPREP: Prohibited input U+' . sprintf('%08X', $v)); + } + + foreach (self::$_np_prohibit_ranges as $range) { + if ($range[0] <= $v && $v <= $range[1]) { + throw new 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 (isset(self::$_np_replacemaps[$v])) { // There's a decomposition mapping for that code point + 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. + * + * @access private + */ + private function _utf8_to_ucs4($input) + { + $output = array(); + $out_len = 0; + $inp_len = strlen($input); + $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 Exception('Conversion from UTF-8 to UCS-4 failed: malformed input at byte '.$k); + return false; + } + 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 Exception('This might be UTF-8, but I don\'t understand it at byte '.$k); + return false; + } + 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 Exception('Bogus UTF-8 character detected (out of legal range) at byte '.$k); + return false; + } + } + 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 Exception('Conversion from UTF-8 to UCS-4 failed: malformed input at byte '.$k); + return false; + } + if ($next_byte < 0) { + $mode = 'next'; + } + } + } // for + return $output; + } + + /** + * Convert UCS-4 array into UTF-8 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 Exception('Conversion from UCS-4 to UTF-8 failed: malformed input at byte ' . $k); + } + } + + return $output; + } + + /** + * Convert UCS-4 array into UCS-4 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 strin into UCS-4 garray + * + * @throws Exception + * @access private + */ + private function _ucs4_string_to_ucs4($input) + { + $output = array(); + + $inp_len = strlen($input); + // Input length must be dividable by 4 + if ($inp_len % 4) { + throw new Exception('Input UCS4 string is broken'); + return false; + } + + // 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_IDNA::_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 + * + * @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; + } + // }}}} +} + +?> diff --git a/thirdparty/pear/Net/IPv4.php b/thirdparty/pear/Net/IPv4.php new file mode 100644 index 000000000..e9195715d --- /dev/null +++ b/thirdparty/pear/Net/IPv4.php @@ -0,0 +1,458 @@ + +* @author Marco Kaiser +* @author Florian Anderiasch +* @copyright 1997-2005 The PHP Group +* @license http://www.php.net/license/3_01.txt PHP License 3.01 +* @version CVS: $Id: IPv4.php,v 1.11 2005/11/29 12:56:35 fa Exp $ +* @link http://pear.php.net/package/Net_IPv4 +*/ + +require_once 'PEAR.php'; + +// {{{ GLOBALS +/** + * Map of bitmasks to subnets + * + * This array contains every valid netmask. The index of the dot quad + * netmask value is the corresponding CIDR notation (bitmask). + * + * @global array $GLOBALS['Net_IPv4_Netmask_Map'] + */ +$GLOBALS['Net_IPv4_Netmask_Map'] = array( + 0 => "0.0.0.0", + 1 => "128.0.0.0", + 2 => "192.0.0.0", + 3 => "224.0.0.0", + 4 => "240.0.0.0", + 5 => "248.0.0.0", + 6 => "252.0.0.0", + 7 => "254.0.0.0", + 8 => "255.0.0.0", + 9 => "255.128.0.0", + 10 => "255.192.0.0", + 11 => "255.224.0.0", + 12 => "255.240.0.0", + 13 => "255.248.0.0", + 14 => "255.252.0.0", + 15 => "255.254.0.0", + 16 => "255.255.0.0", + 17 => "255.255.128.0", + 18 => "255.255.192.0", + 19 => "255.255.224.0", + 20 => "255.255.240.0", + 21 => "255.255.248.0", + 22 => "255.255.252.0", + 23 => "255.255.254.0", + 24 => "255.255.255.0", + 25 => "255.255.255.128", + 26 => "255.255.255.192", + 27 => "255.255.255.224", + 28 => "255.255.255.240", + 29 => "255.255.255.248", + 30 => "255.255.255.252", + 31 => "255.255.255.254", + 32 => "255.255.255.255" + ); +// }}} +// {{{ Net_IPv4 + +/** +* Class to provide IPv4 calculations +* +* Provides methods for validating IP addresses, calculating netmasks, +* broadcast addresses, network addresses, conversion routines, etc. +* +* @category Net +* @package Net_IPv4 +* @author Eric Kilfoil +* @author Marco Kaiser +* @author Florian Anderiasch +* @copyright 1997-2005 The PHP Group +* @license http://www.php.net/license/3_01.txt PHP License 3.01 +* @version CVS: 1.3.0 +* @link http://pear.php.net/package/Net_IPv4 +* @access public +*/ +class Net_IPv4 +{ + // {{{ properties + var $ip = ""; + var $bitmask = false; + var $netmask = ""; + var $network = ""; + var $broadcast = ""; + var $long = 0; + + // }}} + // {{{ validateIP() + + /** + * Validate the syntax of the given IP adress + * + * Using the PHP long2ip() and ip2long() functions, convert the IP + * address from a string to a long and back. If the original still + * matches the converted IP address, it's a valid address. This + * function does not allow for IP addresses to be formatted as long + * integers. + * + * @param string $ip IP address in the format x.x.x.x + * @return bool true if syntax is valid, otherwise false + */ + function validateIP($ip) + { + if ($ip == long2ip(ip2long($ip))) { + return true; + } else { + return false; + } + } + + // }}} + // {{{ check_ip() + + /** + * Validate the syntax of the given IP address (compatibility) + * + * This function is identical to Net_IPv4::validateIP(). It is included + * merely for compatibility reasons. + * + * @param string $ip IP address + * @return bool true if syntax is valid, otherwise false + */ + function check_ip($ip) + { + return $this->validateIP($ip); + } + + // }}} + // {{{ validateNetmask() + + /** + * Validate the syntax of a four octet netmask + * + * There are 33 valid netmask values. This function will compare the + * string passed as $netmask to the predefined 33 values and return + * true or false. This is most likely much faster than performing the + * calculation to determine the validity of the netmask. + * + * @param string $netmask Netmask + * @return bool true if syntax is valid, otherwise false + */ + function validateNetmask($netmask) + { + if (! in_array($netmask, $GLOBALS['Net_IPv4_Netmask_Map'])) { + return false; + } + return true; + } + + // }}} + // {{{ parseAddress() + + /** + * Parse a formatted IP address + * + * Given a network qualified IP address, attempt to parse out the parts + * and calculate qualities of the address. + * + * The following formats are possible: + * + * [dot quad ip]/[ bitmask ] + * [dot quad ip]/[ dot quad netmask ] + * [dot quad ip]/[ hex string netmask ] + * + * The first would be [IP Address]/[BitMask]: + * 192.168.0.0/16 + * + * The second would be [IP Address] [Subnet Mask in dot quad notation]: + * 192.168.0.0/255.255.0.0 + * + * The third would be [IP Address] [Subnet Mask as Hex string] + * 192.168.0.0/ffff0000 + * + * Usage: + * + * $cidr = '192.168.0.50/16'; + * $net = Net_IPv4::parseAddress($cidr); + * echo $net->network; // 192.168.0.0 + * echo $net->ip; // 192.168.0.50 + * echo $net->broadcast; // 192.168.255.255 + * echo $net->bitmask; // 16 + * echo $net->long; // 3232235520 (long/double version of 192.168.0.50) + * echo $net->netmask; // 255.255.0.0 + * + * @param string $ip IP address netmask combination + * @return object true if syntax is valid, otherwise false + */ + function parseAddress($address) + { + $myself = new Net_IPv4; + if (strchr($address, "/")) { + $parts = explode("/", $address); + if (! $myself->validateIP($parts[0])) { + return PEAR::raiseError("invalid IP address"); + } + $myself->ip = $parts[0]; + + // Check the style of netmask that was entered + /* + * a hexadecimal string was entered + */ + if (preg_match("/([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})/", $parts[1], $regs)) { + // hexadecimal string + $myself->netmask = hexdec($regs[1]) . "." . hexdec($regs[2]) . "." . + hexdec($regs[3]) . "." . hexdec($regs[4]); + + /* + * a standard dot quad netmask was entered. + */ + } else if (strchr($parts[1], ".")) { + if (! $myself->validateNetmask($parts[1])) { + return PEAR::raiseError("invalid netmask value"); + } + $myself->netmask = $parts[1]; + + /* + * a CIDR bitmask type was entered + */ + } else if ($parts[1] >= 0 && $parts[1] <= 32) { + // bitmask was entered + $myself->bitmask = $parts[1]; + + /* + * Some unknown format of netmask was entered + */ + } else { + return PEAR::raiseError("invalid netmask value"); + } + $myself->calculate(); + return $myself; + } else if ($myself->validateIP($address)) { + $myself->ip = $address; + return $myself; + } else { + return PEAR::raiseError("invalid IP address"); + } + } + + // }}} + // {{{ calculate() + + /** + * Calculates network information based on an IP address and netmask. + * + * Fully populates the object properties based on the IP address and + * netmask/bitmask properties. Once these two fields are populated, + * calculate() will perform calculations to determine the network and + * broadcast address of the network. + * + * @return mixed true if no errors occured, otherwise PEAR_Error object + */ + function calculate() + { + $validNM = $GLOBALS['Net_IPv4_Netmask_Map']; + + if (! is_a($this, "net_ipv4")) { + $myself = new Net_IPv4; + return PEAR::raiseError("cannot calculate on uninstantiated Net_IPv4 class"); + } + + /* Find out if we were given an ip address in dot quad notation or + * a network long ip address. Whichever was given, populate the + * other field + */ + if (strlen($this->ip)) { + if (! $this->validateIP($this->ip)) { + return PEAR::raiseError("invalid IP address"); + } + $this->long = $this->ip2double($this->ip); + } else if (is_numeric($this->long)) { + $this->ip = long2ip($this->long); + } else { + return PEAR::raiseError("ip address not specified"); + } + + /* + * Check to see if we were supplied with a bitmask or a netmask. + * Populate the other field as needed. + */ + if (strlen($this->bitmask)) { + $this->netmask = $validNM[$this->bitmask]; + } else if (strlen($this->netmask)) { + $validNM_rev = array_flip($validNM); + $this->bitmask = $validNM_rev[$this->netmask]; + } else { + return PEAR::raiseError("netmask or bitmask are required for calculation"); + } + $this->network = long2ip(ip2long($this->ip) & ip2long($this->netmask)); + $this->broadcast = long2ip(ip2long($this->ip) | + (ip2long($this->netmask) ^ ip2long("255.255.255.255"))); + return true; + } + + // }}} + // {{{ getNetmask() + + function getNetmask($length) + { + if (! PEAR::isError($ipobj = Net_IPv4::parseAddress("0.0.0.0/" . $length))) { + $mask = $ipobj->netmask; + unset($ipobj); + return $mask; + } + return false; + } + + // }}} + // {{{ getNetLength() + + function getNetLength($netmask) + { + if (! PEAR::isError($ipobj = Net_IPv4::parseAddress("0.0.0.0/" . $netmask))) { + $bitmask = $ipobj->bitmask; + unset($ipobj); + return $bitmask; + } + return false; + } + + // }}} + // {{{ getSubnet() + + function getSubnet($ip, $netmask) + { + if (! PEAR::isError($ipobj = Net_IPv4::parseAddress($ip . "/" . $netmask))) { + $net = $ipobj->network; + unset($ipobj); + return $net; + } + return false; + } + + // }}} + // {{{ inSameSubnet() + + function inSameSubnet($ip1, $ip2) + { + if (! is_object($ip1) || strcasecmp(get_class($ip1), 'net_ipv4') <> 0) { + $ipobj1 = Net_IPv4::parseAddress($ip1); + if (PEAR::isError($ipobj)) { + return PEAR::raiseError("IP addresses must be an understood format or a Net_IPv4 object"); + } + } + if (! is_object($ip2) || strcasecmp(get_class($ip2), 'net_ipv4') <> 0) { + $ipobj2 = Net_IPv4::parseAddress($ip2); + if (PEAR::isError($ipobj)) { + return PEAR::raiseError("IP addresses must be an understood format or a Net_IPv4 object"); + } + } + if ($ipobj1->network == $ipobj2->network && + $ipobj1->bitmask == $ipobj2->bitmask) { + return true; + } + return false; + } + + // }}} + // {{{ atoh() + + /** + * Converts a dot-quad formatted IP address into a hexadecimal string + * @param string $addr IP-adress in dot-quad format + * @return mixed false if invalid IP and hexadecimal representation as string if valid + */ + function atoh($addr) + { + if (! Net_IPv4::validateIP($addr)) { + return false; + } + $ap = explode(".", $addr); + return sprintf("%02x%02x%02x%02x", $ap[0], $ap[1], $ap[2], $ap[3]); + } + + // }}} + // {{{ htoa() + + /** + * Converts a hexadecimal string into a dot-quad formatted IP address + * @param string $addr IP-adress in hexadecimal format + * @return mixed false if invalid IP and dot-quad formatted IP as string if valid + */ + function htoa($addr) + { + if (preg_match("/([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})/", + $addr, $regs)) { + return hexdec($regs[1]) . "." . hexdec($regs[2]) . "." . + hexdec($regs[3]) . "." . hexdec($regs[4]); + } + return false; + } + + // }}} + // {{{ ip2double() + + /** + * Converts an IP address to a PHP double. Better than ip2long because + * a long in PHP is a signed integer. + * @param string $ip dot-quad formatted IP adress + * @return float IP adress as double - positive value unlike ip2long + */ + function ip2double($ip) + { + return (double)(sprintf("%u", ip2long($ip))); + } + + // }}} + // {{{ ipInNetwork() + + /** + * Determines whether or not the supplied IP is within the supplied network. + * + * This function determines whether an IP address is within a network. + * The IP address ($ip) must be supplied in dot-quad format, and the + * network ($network) may be either a string containing a CIDR + * formatted network definition, or a Net_IPv4 object. + * + * @param string $ip A dot quad representation of an IP address + * @param string $network A string representing the network in CIDR format or a Net_IPv4 object. + * @return bool true if the IP address exists within the network + */ + function ipInNetwork($ip, $network) + { + if (! is_object($network) || strcasecmp(get_class($network), 'net_ipv4') <> 0) { + $network = Net_IPv4::parseAddress($network); + } + + $net = Net_IPv4::ip2double($network->network); + $bcast = Net_IPv4::ip2double($network->broadcast); + $ip = Net_IPv4::ip2double($ip); + unset($network); + if ($ip >= $net && $ip <= $bcast) { + return true; + } + return false; + } + + // }}} +} + +// }}} + +/* + * vim: sts=4 ts=4 sw=4 cindent fdm=marker + */ +?> diff --git a/thirdparty/pear/Net/IPv6.php b/thirdparty/pear/Net/IPv6.php new file mode 100644 index 000000000..29a4d53c6 --- /dev/null +++ b/thirdparty/pear/Net/IPv6.php @@ -0,0 +1,218 @@ + | +// +----------------------------------------------------------------------+ +// +// $Id: IPv6.php,v 1.12 2005/09/01 12:42:00 alexmerz Exp $ + +/** +* Class to validate and to work with IPv6 +* +* @author Alexander Merz +* @author elfrink at introweb dot nl +* @package Net_IPv6 +* @version $Id: IPv6.php,v 1.12 2005/09/01 12:42:00 alexmerz Exp $ +* @access public +*/ +class Net_IPv6 { + + // {{{ Uncompress() + + /** + * Uncompresses an IPv6 adress + * + * RFC 2373 allows you to compress zeros in an adress to '::'. This + * function expects an valid IPv6 adress and expands the '::' to + * the required zeros. + * + * Example: FF01::101 -> FF01:0:0:0:0:0:0:101 + * ::1 -> 0:0:0:0:0:0:0:1 + * + * @access public + * @see Compress() + * @static + * @param string $ip a valid IPv6-adress (hex format) + * @return string the uncompressed IPv6-adress (hex format) + */ + function Uncompress($ip) { + $uip = $ip; + $c1 = -1; + $c2 = -1; + if (false !== strpos($ip, '::') ) { + list($ip1, $ip2) = explode('::', $ip); + if(""==$ip1) { + $c1 = -1; + } else { + $pos = 0; + if(0 < ($pos = substr_count($ip1, ':'))) { + $c1 = $pos; + } else { + $c1 = 0; + } + } + if(""==$ip2) { + $c2 = -1; + } else { + $pos = 0; + if(0 < ($pos = substr_count($ip2, ':'))) { + $c2 = $pos; + } else { + $c2 = 0; + } + } + if(strstr($ip2, '.')) { + $c2++; + } + if(-1 == $c1 && -1 == $c2) { // :: + $uip = "0:0:0:0:0:0:0:0"; + } else if(-1==$c1) { // ::xxx + $fill = str_repeat('0:', 7-$c2); + $uip = str_replace('::', $fill, $uip); + } else if(-1==$c2) { // xxx:: + $fill = str_repeat(':0', 7-$c1); + $uip = str_replace('::', $fill, $uip); + } else { // xxx::xxx + $fill = str_repeat(':0:', 6-$c2-$c1); + $uip = str_replace('::', $fill, $uip); + $uip = str_replace('::', ':', $uip); + } + } + return $uip; + } + + // }}} + // {{{ Compress() + + /** + * Compresses an IPv6 adress + * + * RFC 2373 allows you to compress zeros in an adress to '::'. This + * function expects an valid IPv6 adress and compresses successive zeros + * to '::' + * + * Example: FF01:0:0:0:0:0:0:101 -> FF01::101 + * 0:0:0:0:0:0:0:1 -> ::1 + * + * @access public + * @see Uncompress() + * @static + * @param string $ip a valid IPv6-adress (hex format) + * @return string the compressed IPv6-adress (hex format) + * @author elfrink at introweb dot nl + */ + function Compress($ip) { + $cip = $ip; + + if (!strstr($ip, '::')) { + $ipp = explode(':',$ip); + for($i=0; $i0) { + $match = ''; + foreach($zeros[0] as $zero) { + if (strlen($zero) > strlen($match)) + $match = $zero; + } + $cip = preg_replace('/' . $match . '/', ':', $cip, 1); + } + $cip = preg_replace('/((^:)|(:$))/', '' ,$cip); + $cip = preg_replace('/((^:)|(:$))/', '::' ,$cip); + } + return $cip; + } + + // }}} + // {{{ SplitV64() + + /** + * Splits an IPv6 adress into the IPv6 and a possible IPv4 part + * + * RFC 2373 allows you to note the last two parts of an IPv6 adress as + * an IPv4 compatible adress + * + * Example: 0:0:0:0:0:0:13.1.68.3 + * 0:0:0:0:0:FFFF:129.144.52.38 + * + * @access public + * @static + * @param string $ip a valid IPv6-adress (hex format) + * @return array [0] contains the IPv6 part, [1] the IPv4 part (hex format) + */ + function SplitV64($ip) { + $ip = Net_IPv6::Uncompress($ip); + if (strstr($ip, '.')) { + $pos = strrpos($ip, ':'); + $ip{$pos} = '_'; + $ipPart = explode('_', $ip); + return $ipPart; + } else { + return array($ip, ""); + } + } + + // }}} + // {{{ checkIPv6 + + /** + * Checks an IPv6 adress + * + * Checks if the given IP is IPv6-compatible + * + * @access public + * @static + * @param string $ip a valid IPv6-adress + * @return boolean true if $ip is an IPv6 adress + */ + function checkIPv6($ip) { + + $ipPart = Net_IPv6::SplitV64($ip); + $count = 0; + if (!empty($ipPart[0])) { + $ipv6 =explode(':', $ipPart[0]); + for ($i = 0; $i < count($ipv6); $i++) { + $dec = hexdec($ipv6[$i]); + $hex = strtoupper(preg_replace("/^[0]{1,3}(.*[0-9a-fA-F])$/", "\\1", $ipv6[$i])); + if ($ipv6[$i] >= 0 && $dec <= 65535 && $hex == strtoupper(dechex($dec))) { + $count++; + } + } + if (8 == $count) { + return true; + } elseif (6 == $count and !empty($ipPart[1])) { + $ipv4 = explode('.',$ipPart[1]); + $count = 0; + for ($i = 0; $i < count($ipv4); $i++) { + if ($ipv4[$i] >= 0 && (integer)$ipv4[$i] <= 255 && preg_match("/^\d{1,3}$/", $ipv4[$i])) { + $count++; + } + } + if (4 == $count) { + return true; + } + } else { + return false; + } + + } else { + return false; + } + } + // }}} +} +?> diff --git a/thirdparty/pear/Net/JSON.php b/thirdparty/pear/Net/JSON.php new file mode 100644 index 000000000..71dcdea5d --- /dev/null +++ b/thirdparty/pear/Net/JSON.php @@ -0,0 +1,806 @@ + + * @author Matt Knapp + * @author Brett Stimmerman + * @copyright 2005 Michal Migurski + * @version CVS: $Id: JSON.php,v 1.31 2006/06/28 05:54:17 migurski Exp $ + * @license http://www.opensource.org/licenses/bsd-license.php + * @link http://pear.php.net/pepr/pepr-proposal-show.php?id=198 + */ + +/** + * Marker constant for Services_JSON::decode(), used to flag stack state + */ +define('SERVICES_JSON_SLICE', 1); + +/** + * Marker constant for Services_JSON::decode(), used to flag stack state + */ +define('SERVICES_JSON_IN_STR', 2); + +/** + * Marker constant for Services_JSON::decode(), used to flag stack state + */ +define('SERVICES_JSON_IN_ARR', 3); + +/** + * Marker constant for Services_JSON::decode(), used to flag stack state + */ +define('SERVICES_JSON_IN_OBJ', 4); + +/** + * Marker constant for Services_JSON::decode(), used to flag stack state + */ +define('SERVICES_JSON_IN_CMT', 5); + +/** + * Behavior switch for Services_JSON::decode() + */ +define('SERVICES_JSON_LOOSE_TYPE', 16); + +/** + * Behavior switch for Services_JSON::decode() + */ +define('SERVICES_JSON_SUPPRESS_ERRORS', 32); + +/** + * Converts to and from JSON format. + * + * Brief example of use: + * + * + * // create a new instance of Services_JSON + * $json = new Services_JSON(); + * + * // convert a complexe value to JSON notation, and send it to the browser + * $value = array('foo', 'bar', array(1, 2, 'baz'), array(3, array(4))); + * $output = $json->encode($value); + * + * print($output); + * // prints: ["foo","bar",[1,2,"baz"],[3,[4]]] + * + * // accept incoming POST data, assumed to be in JSON notation + * $input = file_get_contents('php://input', 1000000); + * $value = $json->decode($input); + * + */ +class Services_JSON +{ + /** + * constructs a new JSON instance + * + * @param int $use object behavior flags; combine with boolean-OR + * + * possible values: + * - SERVICES_JSON_LOOSE_TYPE: loose typing. + * "{...}" syntax creates associative arrays + * instead of objects in decode(). + * - SERVICES_JSON_SUPPRESS_ERRORS: error suppression. + * Values which can't be encoded (e.g. resources) + * appear as NULL instead of throwing errors. + * By default, a deeply-nested resource will + * bubble up with an error, so all return values + * from encode() should be checked with isError() + */ + function Services_JSON($use = 0) + { + $this->use = $use; + } + + /** + * convert a string from one UTF-16 char to one UTF-8 char + * + * Normally should be handled by mb_convert_encoding, but + * provides a slower PHP-only method for installations + * that lack the multibye string extension. + * + * @param string $utf16 UTF-16 character + * @return string UTF-8 character + * @access private + */ + function utf162utf8($utf16) + { + // oh please oh please oh please oh please oh please + if(function_exists('mb_convert_encoding')) { + return mb_convert_encoding($utf16, 'UTF-8', 'UTF-16'); + } + + $bytes = (ord($utf16{0}) << 8) | ord($utf16{1}); + + switch(true) { + case ((0x7F & $bytes) == $bytes): + // this case should never be reached, because we are in ASCII range + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return chr(0x7F & $bytes); + + case (0x07FF & $bytes) == $bytes: + // return a 2-byte UTF-8 character + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return chr(0xC0 | (($bytes >> 6) & 0x1F)) + . chr(0x80 | ($bytes & 0x3F)); + + case (0xFFFF & $bytes) == $bytes: + // return a 3-byte UTF-8 character + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return chr(0xE0 | (($bytes >> 12) & 0x0F)) + . chr(0x80 | (($bytes >> 6) & 0x3F)) + . chr(0x80 | ($bytes & 0x3F)); + } + + // ignoring UTF-32 for now, sorry + return ''; + } + + /** + * convert a string from one UTF-8 char to one UTF-16 char + * + * Normally should be handled by mb_convert_encoding, but + * provides a slower PHP-only method for installations + * that lack the multibye string extension. + * + * @param string $utf8 UTF-8 character + * @return string UTF-16 character + * @access private + */ + function utf82utf16($utf8) + { + // oh please oh please oh please oh please oh please + if(function_exists('mb_convert_encoding')) { + return mb_convert_encoding($utf8, 'UTF-16', 'UTF-8'); + } + + switch(strlen($utf8)) { + case 1: + // this case should never be reached, because we are in ASCII range + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return $utf8; + + case 2: + // return a UTF-16 character from a 2-byte UTF-8 char + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return chr(0x07 & (ord($utf8{0}) >> 2)) + . chr((0xC0 & (ord($utf8{0}) << 6)) + | (0x3F & ord($utf8{1}))); + + case 3: + // return a UTF-16 character from a 3-byte UTF-8 char + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return chr((0xF0 & (ord($utf8{0}) << 4)) + | (0x0F & (ord($utf8{1}) >> 2))) + . chr((0xC0 & (ord($utf8{1}) << 6)) + | (0x7F & ord($utf8{2}))); + } + + // ignoring UTF-32 for now, sorry + return ''; + } + + /** + * encodes an arbitrary variable into JSON format + * + * @param mixed $var any number, boolean, string, array, or object to be encoded. + * see argument 1 to Services_JSON() above for array-parsing behavior. + * if var is a strng, note that encode() always expects it + * to be in ASCII or UTF-8 format! + * + * @return mixed JSON string representation of input var or an error if a problem occurs + * @access public + */ + function encode($var) + { + switch (gettype($var)) { + case 'boolean': + return $var ? 'true' : 'false'; + + case 'NULL': + return 'null'; + + case 'integer': + return (int) $var; + + case 'double': + case 'float': + return (float) $var; + + case 'string': + // STRINGS ARE EXPECTED TO BE IN ASCII OR UTF-8 FORMAT + $ascii = ''; + $strlen_var = strlen($var); + + /* + * Iterate over every character in the string, + * escaping with a slash or encoding to UTF-8 where necessary + */ + for ($c = 0; $c < $strlen_var; ++$c) { + + $ord_var_c = ord($var{$c}); + + switch (true) { + case $ord_var_c == 0x08: + $ascii .= '\b'; + break; + case $ord_var_c == 0x09: + $ascii .= '\t'; + break; + case $ord_var_c == 0x0A: + $ascii .= '\n'; + break; + case $ord_var_c == 0x0C: + $ascii .= '\f'; + break; + case $ord_var_c == 0x0D: + $ascii .= '\r'; + break; + + case $ord_var_c == 0x22: + case $ord_var_c == 0x2F: + case $ord_var_c == 0x5C: + // double quote, slash, slosh + $ascii .= '\\'.$var{$c}; + break; + + case (($ord_var_c >= 0x20) && ($ord_var_c <= 0x7F)): + // characters U-00000000 - U-0000007F (same as ASCII) + $ascii .= $var{$c}; + break; + + case (($ord_var_c & 0xE0) == 0xC0): + // characters U-00000080 - U-000007FF, mask 110XXXXX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $char = pack('C*', $ord_var_c, ord($var{$c + 1})); + $c += 1; + $utf16 = $this->utf82utf16($char); + $ascii .= sprintf('\u%04s', bin2hex($utf16)); + break; + + case (($ord_var_c & 0xF0) == 0xE0): + // characters U-00000800 - U-0000FFFF, mask 1110XXXX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $char = pack('C*', $ord_var_c, + ord($var{$c + 1}), + ord($var{$c + 2})); + $c += 2; + $utf16 = $this->utf82utf16($char); + $ascii .= sprintf('\u%04s', bin2hex($utf16)); + break; + + case (($ord_var_c & 0xF8) == 0xF0): + // characters U-00010000 - U-001FFFFF, mask 11110XXX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $char = pack('C*', $ord_var_c, + ord($var{$c + 1}), + ord($var{$c + 2}), + ord($var{$c + 3})); + $c += 3; + $utf16 = $this->utf82utf16($char); + $ascii .= sprintf('\u%04s', bin2hex($utf16)); + break; + + case (($ord_var_c & 0xFC) == 0xF8): + // characters U-00200000 - U-03FFFFFF, mask 111110XX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $char = pack('C*', $ord_var_c, + ord($var{$c + 1}), + ord($var{$c + 2}), + ord($var{$c + 3}), + ord($var{$c + 4})); + $c += 4; + $utf16 = $this->utf82utf16($char); + $ascii .= sprintf('\u%04s', bin2hex($utf16)); + break; + + case (($ord_var_c & 0xFE) == 0xFC): + // characters U-04000000 - U-7FFFFFFF, mask 1111110X + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $char = pack('C*', $ord_var_c, + ord($var{$c + 1}), + ord($var{$c + 2}), + ord($var{$c + 3}), + ord($var{$c + 4}), + ord($var{$c + 5})); + $c += 5; + $utf16 = $this->utf82utf16($char); + $ascii .= sprintf('\u%04s', bin2hex($utf16)); + break; + } + } + + return '"'.$ascii.'"'; + + case 'array': + /* + * As per JSON spec if any array key is not an integer + * we must treat the the whole array as an object. We + * also try to catch a sparsely populated associative + * array with numeric keys here because some JS engines + * will create an array with empty indexes up to + * max_index which can cause memory issues and because + * the keys, which may be relevant, will be remapped + * otherwise. + * + * As per the ECMA and JSON specification an object may + * have any string as a property. Unfortunately due to + * a hole in the ECMA specification if the key is a + * ECMA reserved word or starts with a digit the + * parameter is only accessible using ECMAScript's + * bracket notation. + */ + + // treat as a JSON object + if (is_array($var) && count($var) && (array_keys($var) !== range(0, sizeof($var) - 1))) { + $properties = array_map(array($this, 'name_value'), + array_keys($var), + array_values($var)); + + foreach($properties as $property) { + if(Services_JSON::isError($property)) { + return $property; + } + } + + return '{' . join(',', $properties) . '}'; + } + + // treat it like a regular array + $elements = array_map(array($this, 'encode'), $var); + + foreach($elements as $element) { + if(Services_JSON::isError($element)) { + return $element; + } + } + + return '[' . join(',', $elements) . ']'; + + case 'object': + $vars = get_object_vars($var); + + $properties = array_map(array($this, 'name_value'), + array_keys($vars), + array_values($vars)); + + foreach($properties as $property) { + if(Services_JSON::isError($property)) { + return $property; + } + } + + return '{' . join(',', $properties) . '}'; + + default: + return ($this->use & SERVICES_JSON_SUPPRESS_ERRORS) + ? 'null' + : new Services_JSON_Error(gettype($var)." can not be encoded as JSON string"); + } + } + + /** + * array-walking function for use in generating JSON-formatted name-value pairs + * + * @param string $name name of key to use + * @param mixed $value reference to an array element to be encoded + * + * @return string JSON-formatted name-value pair, like '"name":value' + * @access private + */ + function name_value($name, $value) + { + $encoded_value = $this->encode($value); + + if(Services_JSON::isError($encoded_value)) { + return $encoded_value; + } + + return $this->encode(strval($name)) . ':' . $encoded_value; + } + + /** + * reduce a string by removing leading and trailing comments and whitespace + * + * @param $str string string value to strip of comments and whitespace + * + * @return string string value stripped of comments and whitespace + * @access private + */ + function reduce_string($str) + { + $str = preg_replace(array( + + // eliminate single line comments in '// ...' form + '#^\s*//(.+)$#m', + + // eliminate multi-line comments in '/* ... */' form, at start of string + '#^\s*/\*(.+)\*/#Us', + + // eliminate multi-line comments in '/* ... */' form, at end of string + '#/\*(.+)\*/\s*$#Us' + + ), '', $str); + + // eliminate extraneous space + return trim($str); + } + + /** + * decodes a JSON string into appropriate variable + * + * @param string $str JSON-formatted string + * + * @return mixed number, boolean, string, array, or object + * corresponding to given JSON input string. + * See argument 1 to Services_JSON() above for object-output behavior. + * Note that decode() always returns strings + * in ASCII or UTF-8 format! + * @access public + */ + function decode($str) + { + $str = $this->reduce_string($str); + + switch (strtolower($str)) { + case 'true': + return true; + + case 'false': + return false; + + case 'null': + return null; + + default: + $m = array(); + + if (is_numeric($str)) { + // Lookie-loo, it's a number + + // This would work on its own, but I'm trying to be + // good about returning integers where appropriate: + // return (float)$str; + + // Return float or int, as appropriate + return ((float)$str == (integer)$str) + ? (integer)$str + : (float)$str; + + } elseif (preg_match('/^("|\').*(\1)$/s', $str, $m) && $m[1] == $m[2]) { + // STRINGS RETURNED IN UTF-8 FORMAT + $delim = substr($str, 0, 1); + $chrs = substr($str, 1, -1); + $utf8 = ''; + $strlen_chrs = strlen($chrs); + + for ($c = 0; $c < $strlen_chrs; ++$c) { + + $substr_chrs_c_2 = substr($chrs, $c, 2); + $ord_chrs_c = ord($chrs{$c}); + + switch (true) { + case $substr_chrs_c_2 == '\b': + $utf8 .= chr(0x08); + ++$c; + break; + case $substr_chrs_c_2 == '\t': + $utf8 .= chr(0x09); + ++$c; + break; + case $substr_chrs_c_2 == '\n': + $utf8 .= chr(0x0A); + ++$c; + break; + case $substr_chrs_c_2 == '\f': + $utf8 .= chr(0x0C); + ++$c; + break; + case $substr_chrs_c_2 == '\r': + $utf8 .= chr(0x0D); + ++$c; + break; + + case $substr_chrs_c_2 == '\\"': + case $substr_chrs_c_2 == '\\\'': + case $substr_chrs_c_2 == '\\\\': + case $substr_chrs_c_2 == '\\/': + if (($delim == '"' && $substr_chrs_c_2 != '\\\'') || + ($delim == "'" && $substr_chrs_c_2 != '\\"')) { + $utf8 .= $chrs{++$c}; + } + break; + + case preg_match('/\\\u[0-9A-F]{4}/i', substr($chrs, $c, 6)): + // single, escaped unicode character + $utf16 = chr(hexdec(substr($chrs, ($c + 2), 2))) + . chr(hexdec(substr($chrs, ($c + 4), 2))); + $utf8 .= $this->utf162utf8($utf16); + $c += 5; + break; + + case ($ord_chrs_c >= 0x20) && ($ord_chrs_c <= 0x7F): + $utf8 .= $chrs{$c}; + break; + + case ($ord_chrs_c & 0xE0) == 0xC0: + // characters U-00000080 - U-000007FF, mask 110XXXXX + //see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $utf8 .= substr($chrs, $c, 2); + ++$c; + break; + + case ($ord_chrs_c & 0xF0) == 0xE0: + // characters U-00000800 - U-0000FFFF, mask 1110XXXX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $utf8 .= substr($chrs, $c, 3); + $c += 2; + break; + + case ($ord_chrs_c & 0xF8) == 0xF0: + // characters U-00010000 - U-001FFFFF, mask 11110XXX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $utf8 .= substr($chrs, $c, 4); + $c += 3; + break; + + case ($ord_chrs_c & 0xFC) == 0xF8: + // characters U-00200000 - U-03FFFFFF, mask 111110XX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $utf8 .= substr($chrs, $c, 5); + $c += 4; + break; + + case ($ord_chrs_c & 0xFE) == 0xFC: + // characters U-04000000 - U-7FFFFFFF, mask 1111110X + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $utf8 .= substr($chrs, $c, 6); + $c += 5; + break; + + } + + } + + return $utf8; + + } elseif (preg_match('/^\[.*\]$/s', $str) || preg_match('/^\{.*\}$/s', $str)) { + // array, or object notation + + if ($str{0} == '[') { + $stk = array(SERVICES_JSON_IN_ARR); + $arr = array(); + } else { + if ($this->use & SERVICES_JSON_LOOSE_TYPE) { + $stk = array(SERVICES_JSON_IN_OBJ); + $obj = array(); + } else { + $stk = array(SERVICES_JSON_IN_OBJ); + $obj = new stdClass(); + } + } + + array_push($stk, array('what' => SERVICES_JSON_SLICE, + 'where' => 0, + 'delim' => false)); + + $chrs = substr($str, 1, -1); + $chrs = $this->reduce_string($chrs); + + if ($chrs == '') { + if (reset($stk) == SERVICES_JSON_IN_ARR) { + return $arr; + + } else { + return $obj; + + } + } + + //print("\nparsing {$chrs}\n"); + + $strlen_chrs = strlen($chrs); + + for ($c = 0; $c <= $strlen_chrs; ++$c) { + + $top = end($stk); + $substr_chrs_c_2 = substr($chrs, $c, 2); + + if (($c == $strlen_chrs) || (($chrs{$c} == ',') && ($top['what'] == SERVICES_JSON_SLICE))) { + // found a comma that is not inside a string, array, etc., + // OR we've reached the end of the character list + $slice = substr($chrs, $top['where'], ($c - $top['where'])); + array_push($stk, array('what' => SERVICES_JSON_SLICE, 'where' => ($c + 1), 'delim' => false)); + //print("Found split at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n"); + + if (reset($stk) == SERVICES_JSON_IN_ARR) { + // we are in an array, so just push an element onto the stack + array_push($arr, $this->decode($slice)); + + } elseif (reset($stk) == SERVICES_JSON_IN_OBJ) { + // we are in an object, so figure + // out the property name and set an + // element in an associative array, + // for now + $parts = array(); + + if (preg_match('/^\s*(["\'].*[^\\\]["\'])\s*:\s*(\S.*),?$/Uis', $slice, $parts)) { + // "name":value pair + $key = $this->decode($parts[1]); + $val = $this->decode($parts[2]); + + if ($this->use & SERVICES_JSON_LOOSE_TYPE) { + $obj[$key] = $val; + } else { + $obj->$key = $val; + } + } elseif (preg_match('/^\s*(\w+)\s*:\s*(\S.*),?$/Uis', $slice, $parts)) { + // name:value pair, where name is unquoted + $key = $parts[1]; + $val = $this->decode($parts[2]); + + if ($this->use & SERVICES_JSON_LOOSE_TYPE) { + $obj[$key] = $val; + } else { + $obj->$key = $val; + } + } + + } + + } elseif ((($chrs{$c} == '"') || ($chrs{$c} == "'")) && ($top['what'] != SERVICES_JSON_IN_STR)) { + // found a quote, and we are not inside a string + array_push($stk, array('what' => SERVICES_JSON_IN_STR, 'where' => $c, 'delim' => $chrs{$c})); + //print("Found start of string at {$c}\n"); + + } elseif (($chrs{$c} == $top['delim']) && + ($top['what'] == SERVICES_JSON_IN_STR) && + ((strlen(substr($chrs, 0, $c)) - strlen(rtrim(substr($chrs, 0, $c), '\\'))) % 2 != 1)) { + // found a quote, we're in a string, and it's not escaped + // we know that it's not escaped becase there is _not_ an + // odd number of backslashes at the end of the string so far + array_pop($stk); + //print("Found end of string at {$c}: ".substr($chrs, $top['where'], (1 + 1 + $c - $top['where']))."\n"); + + } elseif (($chrs{$c} == '[') && + in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) { + // found a left-bracket, and we are in an array, object, or slice + array_push($stk, array('what' => SERVICES_JSON_IN_ARR, 'where' => $c, 'delim' => false)); + //print("Found start of array at {$c}\n"); + + } elseif (($chrs{$c} == ']') && ($top['what'] == SERVICES_JSON_IN_ARR)) { + // found a right-bracket, and we're in an array + array_pop($stk); + //print("Found end of array at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n"); + + } elseif (($chrs{$c} == '{') && + in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) { + // found a left-brace, and we are in an array, object, or slice + array_push($stk, array('what' => SERVICES_JSON_IN_OBJ, 'where' => $c, 'delim' => false)); + //print("Found start of object at {$c}\n"); + + } elseif (($chrs{$c} == '}') && ($top['what'] == SERVICES_JSON_IN_OBJ)) { + // found a right-brace, and we're in an object + array_pop($stk); + //print("Found end of object at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n"); + + } elseif (($substr_chrs_c_2 == '/*') && + in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) { + // found a comment start, and we are in an array, object, or slice + array_push($stk, array('what' => SERVICES_JSON_IN_CMT, 'where' => $c, 'delim' => false)); + $c++; + //print("Found start of comment at {$c}\n"); + + } elseif (($substr_chrs_c_2 == '*/') && ($top['what'] == SERVICES_JSON_IN_CMT)) { + // found a comment end, and we're in one now + array_pop($stk); + $c++; + + for ($i = $top['where']; $i <= $c; ++$i) + $chrs = substr_replace($chrs, ' ', $i, 1); + + //print("Found end of comment at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n"); + + } + + } + + if (reset($stk) == SERVICES_JSON_IN_ARR) { + return $arr; + + } elseif (reset($stk) == SERVICES_JSON_IN_OBJ) { + return $obj; + + } + + } + } + } + + /** + * @todo Ultimately, this should just call PEAR::isError() + */ + function isError($data, $code = null) + { + if (class_exists('pear')) { + return PEAR::isError($data, $code); + } elseif (is_object($data) && (get_class($data) == 'services_json_error' || + is_subclass_of($data, 'services_json_error'))) { + return true; + } + + return false; + } +} + +if (class_exists('PEAR_Error')) { + + class Services_JSON_Error extends PEAR_Error + { + function Services_JSON_Error($message = 'unknown error', $code = null, + $mode = null, $options = null, $userinfo = null) + { + parent::PEAR_Error($message, $code, $mode, $options, $userinfo); + } + } + +} else { + + /** + * @todo Ultimately, this class shall be descended from PEAR_Error + */ + class Services_JSON_Error + { + function Services_JSON_Error($message = 'unknown error', $code = null, + $mode = null, $options = null, $userinfo = null) + { + + } + } + +} + +?> diff --git a/thirdparty/pear/Net/LDAP.php b/thirdparty/pear/Net/LDAP.php new file mode 100644 index 000000000..7a8f43f21 --- /dev/null +++ b/thirdparty/pear/Net/LDAP.php @@ -0,0 +1,1065 @@ + '', + 'host' => 'localhost', + 'password' => '', + 'tls' => false, + 'base' => '', + 'port' => 389, + 'version' => 3, + 'options' => array(), + 'filter' => '(objectClass=*)', + 'scope' => 'sub'); + + /** + * LDAP resource link. + * + * @access private + * @var resource + */ + var $_link; + + /** + * Net_LDAP Release Version + * + * @access private + * @var string + */ + var $_version = "0.6.6"; + + /** + * Net_LDAP_Schema object + * + * @access private + * @var object Net_LDAP_Schema + */ + var $_schema = null; + + /** + * Cache for attribute encoding checks + * + * @access private + * @var array Hash with attribute names as key and boolean value + * to determine whether they should be utf8 encoded or not. + */ + var $_schemaAttrs = array(); + + /** + * Net_LDAP constructor + * + * Sets the config array + * + * @access protected + * @param array Configuration array + * @return void + * @see $_config + */ + function Net_LDAP($_config = array()) + { + $this->PEAR('Net_LDAP_Error'); + + foreach ($_config as $k => $v) { + $this->_config[$k] = $v; + } + } + + /** + * Creates the initial ldap-object + * + * Static function that returns either an error object or the new Net_LDAP object. + * Something like a factory. Takes a config array with the needed parameters. + * + * @access public + * @param array Configuration array + * @return mixed object Net_LDAP_Error or Net_LDAP + * @see $_config + */ + function &connect($config = array()) + { + if (!function_exists('ldap_connect')){ + return Net_LDAP::raiseError("It seems that you do not have the ldap-extension installed. Please install it before using this package."); + } + @$obj =& new Net_LDAP($config); + $err = $obj->bind(); + + if (Net_LDAP::isError($err)) { + return $err; + } + return $obj; + } + + /** + * Bind to the ldap-server + * + * The function may be used if you do not create the object using Net_LDAP::connect. + * + * @access public + * @param array Configuration array + * @return mixed Net_LDAP_Error or true + * @see $_config + */ + function bind($config = array()) + { + foreach ($config as $k => $v) { + $this->_config[$k] = $v; + } + + if ($this->_config['host']) { + $this->_link = @ldap_connect($this->_config['host'], $this->_config['port']); + } else { + return $this->raiseError("Host not defined in config. {$this->_config['host']}"); + } + + if (!$this->_link) { + // there is no good errorcode for this one! I chose 52. + return $this->raiseError("Could not connect to server. ldap_connect failed.", 52); + } + // You must set the version and start tls BEFORE binding! + + if ($this->_config['version'] != 2 && Net_LDAP::isError($msg = $this->setLDAPVersion())) { + return $msg; + } + + if ($this->_config['tls'] && Net_LDAP::isError($msg = $this->startTLS())) { + return $msg; + } + + if (isset($this->_config['options']) && + is_array($this->_config['options']) && + count($this->_config['options'])) + { + foreach ($this->_config['options'] as $opt => $val) { + $err = $this->setOption($opt, $val); + if (Net_LDAP::isError($err)) { + return $err; + } + } + } + + if (isset($this->_config['dn']) && isset($this->_config['password'])) { + $bind = @ldap_bind($this->_link, $this->_config['dn'], $this->_config['password']); + } else { + $bind = @ldap_bind($this->_link); + } + + if (!$bind) { + return $this->raiseError("Bind failed " . @ldap_error($this->_link), @ldap_errno($this->_link)); + } + + return true; + } + + /** + * ReBind to the ldap-server using another dn and password + * + * The function may be used if you do not create the object using Net_LDAP::connect. + * + * @access public + * @param string $dn - the DN to bind as. + * string $password - the bassword to use. + * @return mixed Net_LDAP_Error or true + * @see $_config + */ + + function reBind ($dn = null, $password = null) + { + + if ($dn && $password ) { + $bind = @ldap_bind($this->_link, $dn, $password); + } else { + $bind = @ldap_bind($this->_link); + } + + if (!$bind) { + return $this->raiseError("Bind failed " . @ldap_error($this->_link), @ldap_errno($this->_link)); + } + return true; + } + + /** + * Starts an encrypted session + * + * @access public + * @return mixed True or Net_LDAP_Error + */ + function startTLS() + { + if (!@ldap_start_tls($this->_link)) { + return $this->raiseError("TLS not started. Error:" . @ldap_error($this->_link), @ldap_errno($this->_link)); + } + return true; + } + + /** + * alias function of startTLS() for perl-ldap interface + * + * @see startTLS() + */ + function start_tls() + { + $args = func_get_args(); + return call_user_func_array(array($this, 'startTLS' ), $args); + } + + /** + * Close LDAP connection. + * + * Closes the connection. Use this when the session is over. + * + * @return void + */ + function done() + { + $this->_Net_LDAP(); + } + + /** + * Destructor + * + * @access private + */ + function _Net_LDAP() + { + @ldap_close($this->_link); + } + + /** + * Add a new entryobject to a directory. + * + * Use add to add a new Net_LDAP_Entry object to the directory. + * + * @param object Net_LDAP_Entry + * @return mixed Net_LDAP_Error or true + */ + function add($entry) + { + if (@ldap_add($this->_link, $entry->dn(), $entry->attributes())) { + return true; + } else { + return $this->raiseError("Could not add entry " . $entry->dn() . " " . @ldap_error($this->_link), + @ldap_errno($this->_link)); + } + } + + /** + * Delete an entry from the directory + * + * The object may either be a string representing the dn or a Net_LDAP_Entry object. + * The param array may contain a boolean value named recursive. When set, all subentries + * of the Entry will be deleted as well + * + * @access public + * @param mixed string or Net_LDAP_Entry + * @param array + * @return mixed Net_LDAP_Error or true + */ + function delete($dn, $param = array()) + { + if (is_object($dn) && strtolower(get_class($dn)) == 'net_ldap_entry') { + $dn = $dn->dn(); + } else { + if (!is_string($dn)) { + // this is what the server would say: invalid_dn_syntax. + return $this->raiseError("$dn not a string nor an entryobject!", 34); + } + } + + if ($param['recursive'] ) { + $searchresult = @ldap_list($this->_link, $dn, '(objectClass=*)', array()); + + if ($searchresult) { + $entries = @ldap_get_entries($this->_link, $searchresult); + + for ($i=0; $i<$entries['count']; $i++) { + $result = $this->delete($entries[$i]['dn'], array('recursive' => true)); + if (!$result) { + $errno = @ldap_errno($this->_link); + return $this->raiseMessage ("Net_LDAP::delete: " . $this->errorMessage($errno), $errno); + } + if(PEAR::isError($result)){ + return $result; + } + } + } + } + if (!@ldap_delete($this->_link, $dn)) { + $error = ldap_errno($this->_link ); + if ($error == 66) { + /* entry has subentries */ + return $this->raiseError('Net_LDAP::delete: Cound not delete entry ' . $dn . + ' because of subentries. Use the recursive param to delete them.'); + } else { + return $this->raiseError("Net_LDAP::delete: Could not delete entry " . $dn ." because: ". + $this->errorMessage($error), $error); + } + } + return true; + } + + /** + * Modify an ldapentry + * + * This is taken from the perlpod of net::ldap, and explains things quite nicely. + * modify ( DN, OPTIONS ) + * Modify the contents of DN on the server. DN May be a + * string or a Net::LDAP::Entry object. + * + * dn This option is here for compatibility only, and + * may be removed in future. Previous releases did + * not take the DN argument which replaces this + * option. + * + * add The add option should be a reference to a HASH. + * The values of the HASH are the attributes to add, + * and the values may be a string or a reference to a + * list of values. + * + * delete + * A reference to an ARRAY of attributes to delete. + * TODO: This does not support deleting one or two values yet - use + * replace. + * + * replace + * The option takes a argument in the same + * form as add, but will cause any existing + * attributes with the same name to be replaced. If + * the value for any attribute in the rray is a ref + * erence to an empty string the all instances of the + * attribute will be deleted. + * + * changes + * This is an alternative to add, delete and replace + * where the whole operation can be given in a single + * argument. The argument should be a array + * + * Values in the ARRAY are used in pairs, the first + * is the operation add, delete or replace and the + * second is a reference to an ARRAY of attribute + * values. + * + * The attribute value list is also used in pairs. + * The first value in each pair is the attribute name + * and the second is a reference to a list of values. + * + * Example: + * $ldap->modify ( $dn, array (changes => array( + * 'delete' => array('faxNumber' => ''), + * 'add' => array('sn' => 'Barr'), + * 'replace' => array(email => 'tarjei@nu.no')))); + * + * @access public + * @param string + * @param array + * @return mixed Net_LDAP_Error or true + */ + function modify($dn , $params = array()) + { + if (is_object($dn)) { + $dn = $dn->dn(); + } + // since $params['dn'] is not used in net::ldap now: + if (isset($params['dn'])) { + return $this->raiseError("This feature will not be implemented!"); + } + // new code from rafael at krysciak dot de + if(array_key_exists('changes', $params)) { + $_params = $params; + } else { + $_params['changes'] = $params; + } + if (is_array($_params['changes'])) { + foreach($_params['changes'] AS $option => $atrr) { + switch($option) { + case 'add': + $command = $dn_exists ? 'ldap_mod_add':'ldap_add'; + break; + case 'replace': + $command = 'ldap_mod_replace'; + break; + case 'delete': + $command = 'ldap_mod_del'; + // to delete an attribute with a specific value you + // need a hash array('attr_name' => array('attr_value_1', ... ,'attr_value_n')) + // the hash array('attr_name' => 'attr_value') will be converted + // automatically to array('attr_name' => array('attr_value')) + foreach($atrr AS $atrr_field => $atrr_value) { + if(!is_array($atrr_value)) { + $atrr[$atrr_field] = array($atrr_value); + } + } + break; + default: + return $this->raiseError("Net_LDAP::modify: not supported option " . $option); + break; + } // end switch($option) { + + if(!@call_user_func($command, $this->_link, $dn, $atrr)) { + return $this->raiseError("Net_LDAP::modify: $dn not modified because:" . ldap_error($this->_link), ldap_errno($this->_link)); + } + } // end foreach($_params['changes'] AS $option => $atrr) { + } // end if (is_array($_params['changes'])) { + // everything went fine :) + return true; + + /* old broken code see bug#2987 + if (isset($params['changes'])) { + + if (isset($params['changes']['add']) && + !@ldap_modify($this->_link, $dn, $params['changes']['add'])) { + + return $this->raiseError("Net_LDAP::modify: $dn not modified because:" . ldap_error($this->_link), + ldap_errno($this->_link)); + } + + if (isset($params['changes']['replace']) && + !@ldap_modify($this->_link, $dn, $params['changes']['replace'])) { + + return $this->raiseError("Net_LDAP::modify: replace change didn't work: " . ldap_error($this->_link), + ldap_errno($this->_link)); + } + + if (isset($params['changes']['delete']) && + !@ldap_mod_del($this->_link, $dn, $params['changes']['delete'])) { + + return $this->raiseError("Net_LDAP::modify:delete did not work" . ldap_error($this->_link), + ldap_errno($this->_link)); + } + } + + if (isset($params['add']) && !@ldap_add($this->_link, $dn, $params['add'])) { + return $this->raiseError(ldap_error($this->_link), ldap_errno($this->_link)); + } + + if (isset($params['replace']) && !@ldap_modify($this->_link, $dn, $params['replace'])) { + return $this->raiseError(ldap_error($this->_link), ldap_errno($this->_link)); + } + + if (isset($params['delete'])) { + // since you delete an attribute by making it empty: + foreach ($params['delete'] as $k) { + $params['delete'][$k] = ''; + } + + if (!@ldap_modify($this->_link, $dn, $params['delete'])) { + return $this->raiseError(ldap_error($this->_link), ldap_errno($this->_link)); + } + } + // everything went fine :) + return true; + */ + + } + + /** + * Run a ldap query + * + * Search is used to query the ldap-database. + * $base and $filter may be ommitted. BaseDN and default filter will then be used. + * Params may contain: + * + * scope: The scope which will be used for searching + * base - Just one entry + * sub - The whole tree + * one - Immediately below $base + * sizelimit: Limit the number of entries returned (default: 0), + * timelimit: Limit the time spent for searching (default: 0), + * attrsonly: If true, the search will only return the attribute names, NO values + * attributes: Array of attribute names, which the entry should contain. It is good practice + * to limit this to just the ones you need, so by default this function does not + * return any attributes at all. + * [NOT IMPLEMENTED] + * deref: By default aliases are dereferenced to locate the base object for the search, but not when + * searching subordinates of the base object. This may be changed by specifying one of the + * following values: + * + * never - Do not dereference aliases in searching or in locating the base object of the search. + * search - Dereference aliases in subordinates of the base object in searching, but not in + * locating the base object of the search. + * find + * always + * + * @access public + * @param string LDAP searchbase + * @param string LDAP search filter + * @param array Array of options + * @return object mixed Net_LDAP_Search or Net_LDAP_Error + */ + function search($base = null, $filter = null, $params = array()) + { + if (is_null($base)) { + $base = $this->_config['base']; + } + if (is_null($filter)) { + $filter = $this->_config['filter']; + } + + /* setting searchparameters */ + (isset($params['sizelimit'])) ? $sizelimit = $params['sizelimit'] : $sizelimit = 0; + (isset($params['timelimit'])) ? $timelimit = $params['timelimit'] : $timelimit = 0; + (isset($params['attrsonly'])) ? $attrsonly = $params['attrsonly'] : $attrsonly = 0; + (isset($params['attributes'])) ? $attributes = $params['attributes'] : $attributes = array(''); + + if (!is_array($attributes)) { + $this->raiseError("The param attributes must be an array!"); + } + + /* scoping makes searches faster! */ + $scope = (isset($params['scope']) ? $params['scope'] : $this->_config['scope']); + + switch ($scope) { + case 'one': + $search_function = 'ldap_list'; + break; + case 'base': + $search_function = 'ldap_read'; + break; + default: + $search_function = 'ldap_search'; + } + + $search = @call_user_func($search_function, + $this->_link, + $base, + $filter, + $attributes, + $attrsonly, + $sizelimit, + $timelimit); + + if ($err = ldap_errno($this->_link)) { + + if ($err == 32) { + // Errorcode 32 = no such object, i.e. a nullresult. + return $obj =& new Net_LDAP_Search ($search, $this->_link); + + // Errorcode 4 = sizelimit exeeded. this will be handled better in time... + //} elseif ($err == 4) { + // return $obj = & new Net_LDAP_Search ($search, $this->_link); + + } elseif ($err == 87) { + // bad search filter + return $this->raiseError($this->errorMessage($err) . "($filter)", $err); + } else { + $msg = "\nParameters:\nBase: $base\nFilter: $filter\nScope: $scope"; + return $this->raiseError($this->errorMessage($err) . $msg, $err); + } + } else { + @$obj =& new Net_LDAP_Search($search, $this->_link); + return $obj; + } + + } + + /** + * Set an LDAP option + * + * @access public + * @param string Option to set + * @param mixed Value to set Option to + * @return mixed Net_LDAP_Error or true + */ + function setOption($option, $value) + { + if ($this->_link) { + if (defined($option)) { + if (@ldap_set_option($this->_link, constant($option), $value)) { + return true; + } else { + $err = @ldap_errno($this->_link); + if ($err) { + $msg = @ldap_err2str($err); + } else { + $err = NET_LDAP_ERROR; + $msg = $this->errorMessage($err); + } + return $this->raiseError($msg, $err); + } + } else { + return $this->raiseError("Unkown Option requested"); + } + } else { + return $this->raiseError("No LDAP connection"); + } + } + + /** + * Get an LDAP option value + * + * @access public + * @param string Option to get + * @return mixed Net_LDAP_Error or option value + */ + function getOption($option) + { + if ($this->_link) { + if (defined($option)) { + if (@ldap_get_option($this->_link, constant($option), $value)) { + return $value; + } else { + $err = @ldap_errno($this->_link); + if ($err) { + $msg = @ldap_err2str($err); + } else { + $err = NET_LDAP_ERROR; + $msg = $this->errorMessage($err); + } + return $this->raiseError($msg, $err); + } + } else { + $this->raiseError("Unkown Option requested"); + } + } else { + $this->raiseError("No LDAP connection"); + } + } + + /** + * Get the LDAP_PROTOCOL_VERSION that is used on the connection. + * + * A lot of ldap functionality is defined by what protocol version the ldap server speaks. + * This might be 2 or 3. + * + * @return int + */ + function getLDAPVersion() + { + if($this->_link) { + $version = $this->getOption("LDAP_OPT_PROTOCOL_VERSION"); + } else { + $version = $this->_config['version']; + } + return $version; + } + + /** + * Set the LDAP_PROTOCOL_VERSION that is used on the connection. + * + * @param int Version to set + * @return mixed Net_LDAP_Error or TRUE + */ + function setLDAPVersion($version = 0) + { + if (!$version) { + $version = $this->_config['version']; + } + return $this->setOption("LDAP_OPT_PROTOCOL_VERSION", $version); + } + + /** + * Get the Net_LDAP version. + * + * Return the Net_LDAP version + * + * @return string Net_LDAP version + */ + function getVersion () + { + return $this->_version; + } + + /** + * Tell if a dn already exists + * + * @param string + * @return boolean + */ + function dnExists($dn) + { + $dns = explode(",",$dn); + $filter = array_shift($dns); + $base= implode($dns,','); + //$base = $dn; + //$filter = '(objectclass=*)'; + + $result = @ldap_list($this->_link, $base, $filter, array(), 1, 1); + if (ldap_errno($this->_link) == 32) { + return false; + } + if (ldap_errno($this->_link) != 0) { + $this->raiseError(ldap_error($this->_link), ldap_errno($this->_link)); + } + if (@ldap_count_entries($this->_link, $result)) { + return true; + } + return false; + } + + + /** + * Get a specific entry based on the dn + * + * @param string dn + * @param array Array of Attributes to select + * @return object Net_LDAP_Entry or Net_LDAP_Error + */ + function &getEntry($dn, $attr = array('')) + { + $result = $this->search($dn, '(objectClass=*)', array('scope' => 'base', 'attributes' => $attr)); + if (Net_LDAP::isError($result)) { + return $result; + } + $entry = $result->shiftEntry(); + if (false == $entry) { + return $this->raiseError('Could not fetch entry'); + } + return $entry; + } + + + /** + * Returns the string for an ldap errorcode. + * + * Made to be able to make better errorhandling + * Function based on DB::errorMessage() + * Tip: The best description of the errorcodes is found here: http://www.directory-info.com/LDAP/LDAPErrorCodes.html + * + * @param int Error code + * @return string The errorstring for the error. + */ + function errorMessage($errorcode) + { + $errorMessages = array( + 0x00 => "LDAP_SUCCESS", + 0x01 => "LDAP_OPERATIONS_ERROR", + 0x02 => "LDAP_PROTOCOL_ERROR", + 0x03 => "LDAP_TIMELIMIT_EXCEEDED", + 0x04 => "LDAP_SIZELIMIT_EXCEEDED", + 0x05 => "LDAP_COMPARE_FALSE", + 0x06 => "LDAP_COMPARE_TRUE", + 0x07 => "LDAP_AUTH_METHOD_NOT_SUPPORTED", + 0x08 => "LDAP_STRONG_AUTH_REQUIRED", + 0x09 => "LDAP_PARTIAL_RESULTS", + 0x0a => "LDAP_REFERRAL", + 0x0b => "LDAP_ADMINLIMIT_EXCEEDED", + 0x0c => "LDAP_UNAVAILABLE_CRITICAL_EXTENSION", + 0x0d => "LDAP_CONFIDENTIALITY_REQUIRED", + 0x0e => "LDAP_SASL_BIND_INPROGRESS", + 0x10 => "LDAP_NO_SUCH_ATTRIBUTE", + 0x11 => "LDAP_UNDEFINED_TYPE", + 0x12 => "LDAP_INAPPROPRIATE_MATCHING", + 0x13 => "LDAP_CONSTRAINT_VIOLATION", + 0x14 => "LDAP_TYPE_OR_VALUE_EXISTS", + 0x15 => "LDAP_INVALID_SYNTAX", + 0x20 => "LDAP_NO_SUCH_OBJECT", + 0x21 => "LDAP_ALIAS_PROBLEM", + 0x22 => "LDAP_INVALID_DN_SYNTAX", + 0x23 => "LDAP_IS_LEAF", + 0x24 => "LDAP_ALIAS_DEREF_PROBLEM", + 0x30 => "LDAP_INAPPROPRIATE_AUTH", + 0x31 => "LDAP_INVALID_CREDENTIALS", + 0x32 => "LDAP_INSUFFICIENT_ACCESS", + 0x33 => "LDAP_BUSY", + 0x34 => "LDAP_UNAVAILABLE", + 0x35 => "LDAP_UNWILLING_TO_PERFORM", + 0x36 => "LDAP_LOOP_DETECT", + 0x3C => "LDAP_SORT_CONTROL_MISSING", + 0x3D => "LDAP_INDEX_RANGE_ERROR", + 0x40 => "LDAP_NAMING_VIOLATION", + 0x41 => "LDAP_OBJECT_CLASS_VIOLATION", + 0x42 => "LDAP_NOT_ALLOWED_ON_NONLEAF", + 0x43 => "LDAP_NOT_ALLOWED_ON_RDN", + 0x44 => "LDAP_ALREADY_EXISTS", + 0x45 => "LDAP_NO_OBJECT_CLASS_MODS", + 0x46 => "LDAP_RESULTS_TOO_LARGE", + 0x47 => "LDAP_AFFECTS_MULTIPLE_DSAS", + 0x50 => "LDAP_OTHER", + 0x51 => "LDAP_SERVER_DOWN", + 0x52 => "LDAP_LOCAL_ERROR", + 0x53 => "LDAP_ENCODING_ERROR", + 0x54 => "LDAP_DECODING_ERROR", + 0x55 => "LDAP_TIMEOUT", + 0x56 => "LDAP_AUTH_UNKNOWN", + 0x57 => "LDAP_FILTER_ERROR", + 0x58 => "LDAP_USER_CANCELLED", + 0x59 => "LDAP_PARAM_ERROR", + 0x5a => "LDAP_NO_MEMORY", + 0x5b => "LDAP_CONNECT_ERROR", + 0x5c => "LDAP_NOT_SUPPORTED", + 0x5d => "LDAP_CONTROL_NOT_FOUND", + 0x5e => "LDAP_NO_RESULTS_RETURNED", + 0x5f => "LDAP_MORE_RESULTS_TO_RETURN", + 0x60 => "LDAP_CLIENT_LOOP", + 0x61 => "LDAP_REFERRAL_LIMIT_EXCEEDED", + 1000 => "Unknown Net_LDAP error" + ); + + return isset($errorMessages[$errorcode]) ? $errorMessages[$errorcode] : $errorMessages[NET_LDAP_ERROR]; + } + + /** + * Tell whether value is a Net_LDAP_Error or not + * + * @access public + * @param mixed + * @return boolean + */ + function isError($value) + { + return (is_a($value, "Net_LDAP_Error") || parent::isError($value)); + } + + /** + * gets a root dse object + * + * @access public + * @author Jan Wagner + * @param array Array of attributes to search for + * @return object mixed Net_LDAP_Error or Net_LDAP_RootDSE + */ + function &rootDse($attrs = null) + { + require_once('Net/LDAP/RootDSE.php'); + + if (is_array($attrs) && count($attrs) > 0 ) { + $attributes = $attrs; + } else { + $attributes = array('namingContexts', + 'altServer', + 'supportedExtension', + 'supportedControl', + 'supportedSASLMechanisms', + 'supportedLDAPVersion', + 'subschemaSubentry' ); + } + $result = $this->search('', '(objectClass=*)', array('attributes' => $attributes, 'scope' => 'base')); + if (Net_LDAP::isError($result)) return $result; + + $entry = $result->shift_entry(); + if (false === $entry) return $this->raiseError('Could not fetch RootDSE entry'); + + return new Net_LDAP_RootDSE($entry); + } + + /** + * alias function of rootDse() for perl-ldap interface + * + * @access public + * @see rootDse() + */ + function &root_dse() + { + $args = func_get_args(); + return call_user_func_array(array($this, 'rootDse'), $args); + } + + /** + * get a schema object + * + * @access public + * @author Jan Wagner + * @param string Subschema entry dn + * @return object mixed Net_LDAP_Schema or Net_LDAP_Error + */ + function &schema($dn = null) + { + require_once('Net/LDAP/Schema.php'); + + $schema =& new Net_LDAP_Schema(); + + if (is_null($dn)) { + // get the subschema entry via root dse + $dse = $this->rootDSE(array('subschemaSubentry')); + if (false == Net_LDAP::isError($dse)) { + $base = $dse->getValue('subschemaSubentry', 'single'); + if (!Net_LDAP::isError($base)) { + $dn = $base; + } + } + } + if (is_null($dn)) { + $dn = 'cn=Subschema'; + } + + // fetch the subschema entry + $result = $this->search($dn, '(objectClass=*)', + array('attributes' => array_values($schema->types), 'scope' => 'base')); + if (Net_LDAP::isError($result)) { + return $result; + } + + $entry = $result->shift_entry(); + if (false === $entry) { + return $this->raiseError('Could not fetch Subschema entry'); + } + + $schema->parse($entry); + + return $schema; + } + + /** + * Encodes given attributes to UTF8 if needed + * + * This function takes attributes in an array and then checks against the schema if they need + * UTF8 encoding. If that is so, they will be encoded. An encoded array will be returned and + * can be used for adding or modifying. + * + * @access public + * @param array Array of attributes + * @return array Array of UTF8 encoded attributes + */ + function utf8Encode($attributes) + { + return $this->_utf8($attributes, 'utf8_encode'); + } + + /** + * Decodes the given attribute values + * + * @access public + * @param array Array of attributes + * @return array Array with decoded attribute values + */ + function utf8Decode($attributes) + { + return $this->_utf8($attributes, 'utf8_decode'); + } + + /** + * Encodes or decodes attribute values if needed + * + * @access private + * @param array Array of attributes + * @param array Function to apply to attribute values + * @return array Array of attributes with function applied to values + */ + function _utf8($attributes, $function) + { + if (!$this->_schema) { + $this->_schema = $this->schema(); + } + + if (!$this->_link || Net_LDAP::isError($this->_schema) || !function_exists($function)) { + return $attributes; + } + + if (is_array($attributes) && count($attributes) > 0) { + + foreach( $attributes as $k => $v ) { + + if (!isset($this->_schemaAttrs[$k])) { + + $attr = $this->_schema->get('attribute', $k); + if (Net_LDAP::isError($attr)) { + continue; + } + + if (false !== strpos($attr['syntax'], '1.3.6.1.4.1.1466.115.121.1.15')) { + $encode = true; + } else { + $encode = false; + } + $this->_schemaAttrs[$k] = $encode; + + } else { + $encode = $this->_schemaAttrs[$k]; + } + + if ($encode) { + if (is_array($v)) { + foreach ($v as $ak => $av) { + $v[$ak] = call_user_func($function, $av ); + } + } else { + $v = call_user_func($function, $v); + } + } + $attributes[$k] = $v; + } + } + return $attributes; + } +} + +/** + * Net_LDAP_Error implements a class for reporting portable LDAP error messages. + * + * @package Net_LDAP + */ +class Net_LDAP_Error extends PEAR_Error +{ + /** + * Net_LDAP_Error constructor. + * + * @param mixed Net_LDAP error code, or string with error message. + * @param integer what "error mode" to operate in + * @param integer what error level to use for $mode & PEAR_ERROR_TRIGGER + * @param mixed additional debug info, such as the last query + * @access public + * @see PEAR_Error + */ + function Net_LDAP_Error($code = NET_LDAP_ERROR, $mode = PEAR_ERROR_RETURN, + $level = E_USER_NOTICE, $debuginfo = null) + { + $mode = PEAR_ERROR_RETURN; + if (is_int($code)) { + $this->PEAR_Error('Net_LDAP_Error: ' . Net_LDAP::errorMessage($code), $code, $mode, $level, $debuginfo); + } else { + $this->PEAR_Error("Net_LDAP_Error: $code", NET_LDAP_ERROR, $mode, $level, $debuginfo); + } + } +} +?> diff --git a/thirdparty/pear/Net/LDAP/Entry.php b/thirdparty/pear/Net/LDAP/Entry.php new file mode 100644 index 000000000..56ecdefa8 --- /dev/null +++ b/thirdparty/pear/Net/LDAP/Entry.php @@ -0,0 +1,524 @@ + false, + 'modify' => false, + 'newEntry' => true + ); // since the entry is not changed before the update(); + + /** + * Net_LDAP_Schema object TO BE REMOVED + */ + var $_schema; + /**#@-*/ + + /** Constructor + * + * @param - link - ldap_resource_link, dn = string entry dn, attributes - array entry attributes array. + * @return - none + **/ + function Net_LDAP_Entry($link = null, $dn = null, $attributes = null) + { + if (!is_null($link)) { + $this->_link = $link; + } + if (!is_null($dn)) { + $this->_set_dn($dn); + } + if (is_array($attributes) && count($attributes) > 0) { + $this->_set_attributes($attributes); + } else { + $this->updateCheck['newEntry'] = true; + } + } + + /** + * Set the reasourcelink to the ldapserver. + * + * @access private + * @param resource LDAP link + */ + function _set_link(&$link) + { + $this->_link = $link; + } + + /** + * set the entrys DN + * + * @access private + * @param string + */ + function _set_dn($dn) + { + $this->_dn = $dn; + } + + /** + * sets the internal array of the entrys attributes. + * + * @access private + * @param array + */ + function _set_attributes($attributes= array()) + { + $this->_attrs = $attributes; + // this is the sign that the entry exists in the first place: + $this->updateCheck['newEntry'] = false; + } + + /** + * removes [count] entries from the array. + * + * remove all the count elements in the array: + * Used before ldap_modify, ldap_add + * + * @access private + * @return array Cleaned array of attributes + */ + function _clean_entry() + { + $attributes = array(); + + for ($i=0; $i < $this->_attrs['count'] ; $i++) { + + $attr = $this->_attrs[$i]; + + if ($this->_attrs[$attr]['count'] == 1) { + $attributes[$this->_attrs[$i]] = $this->_attrs[$attr][0]; + } else { + $attributes[$attr] = $this->_attrs[$attr]; + unset ($attributes[ $attr ]['count']); + } + } + + return $attributes; + + } + + /** + * returns an assosiative array of all the attributes in the array + * + * attributes - returns an assosiative array of all the attributes in the array + * of the form array ('attributename'=>'singelvalue' , 'attribute'=>array('multiple','values')) + * + * @param none + * @return array Array of attributes and values. + */ + function attributes() + { + return $this->_clean_entry(); + } + + /** + * Add one or more attribute to the entry + * + * The values given will be added to the values which already exist for the given attributes. + * usage: + * $entry->add ( array('sn'=>'huse',objectclass=>array(top,posixAccount))) + * + * @param array Array of attributes + * @return mixed Net_Ldap_Error if error, else true. + */ + function add($attr = array()) + { + if (!isset($this->_attrs['count'])) { + $this->_attrs['count'] = 0; + } + if (!is_array($attr)) { + return $this->raiseError("Net_LDAP::add : the parameter supplied is not an array, $attr", 1000); + } + /* if you passed an empty array, that is your problem! */ + if (count ($attr)==0) { + return true; + } + foreach ($attr as $k => $v ) { + // empty entrys should not be added to the entry. + if ($v == '') { + continue; + } + + if ($this->exists($k)) { + if (!is_array($this->_attrs[$k])) { + return $this->raiseError("Possible malformed array as parameter to Net_LDAP::add()."); + } + array_push($this->_attrs[$k],$v); + $this->_attrs[$k]['count']++; + } else { + $this->_attrs[$k][0] = $v; + $this->_attrs[$k]['count'] = 1; + $this->_attrs[$this->_attrs['count']] = $k; + $this->_attrs['count']++; + } + // Fix for bug #952 + if (empty($this->_addAttrs[$k])) { + $this->_addAttrs[$k] = array(); + } + if (false == is_array($v)) { + $v = array($v); + } + foreach ($v as $value) { + array_push($this->_addAttrs[$k], $value); + } + } + return true; + } + + /** + * Set or get the DN for the object + * + * If a new dn is supplied, this will move the object when running $obj->update(); + * + * @param string DN + */ + function dn($newdn = '') + { + if ($newdn == '') { + return $this->_dn; + } + + $this->_olddn = $this->_dn; + $this->_dn = $newdn; + $this->updateCheck['newdn'] = true; + } + + /** + * check if a certain attribute exists in the directory + * + * @param string attribute name. + * @return boolean + */ + function exists($attr) + { + if (array_key_exists($attr, $this->_attrs)) { + return true; + } + return false; + } + + /** + * get_value get the values for a attribute + * + * returns either an array or a string + * possible values for option: + * alloptions - returns an array with the values + a countfield. + * i.e.: array (count=>1, 'sn'=>'huse'); + * single - returns the, first value in the array as a string. + * + * @param $attr string attribute name + * @param $options array + */ + function get_value($attr = '', $options = '') + { + if (array_key_exists($attr, $this->_attrs)) { + + if ($options == 'single') { + if (is_array($this->_attrs[$attr])) { + return $this->_attrs[$attr][0]; + } else { + return $this->_attrs[$attr]; + } + } + + $value = $this->_attrs[$attr]; + + if (!$options == 'alloptions') { + unset ($value['count']); + } + return $value; + } else { + return ''; + } + } + + /** + * add/delete/modify attributes + * + * this function tries to do all the things that replace(),delete() and add() does on an object. + * Syntax: + * array ( 'attribute' => newval, 'delattribute' => '', newattrivute => newval); + * Note: You cannot use this function to modify parts of an attribute. You must modify the whole attribute. + * You may call the function many times before running $entry->update(); + * + * @param array attributes to be modified + * @return mixed errorObject if failure, true if success. + */ + function modify($attrs = array()) { + + if (!is_array($attrs) || count ($attrs) < 1 ) { + return $this->raiseError("You did not supply an array as expected",1000); + } + + foreach ($attrs as $k => $v) { + // empty values are deleted (ldap v3 handling is in update() ) + if ($v == '' && $this->exists($k)) { + $this->_delAttrs[$k] = ''; + continue; + } + /* existing attributes are modified*/ + if ($this->exists($k) ) { + if (is_array($v)) { + $this->_modAttrs[$k] = $v; + } else { + $this->_modAttrs[$k][0] = $v; + } + } else { + /* new ones are created */ + if (is_array($v) ) { + // an empty array is deleted... + if (count($v) == 0 ) { + $this->_delAttrs[$k] = ''; + } else { + $this->_addAttrs[$k] = $v; + } + } else { + // dont't add empty attributes + if ($v != null) $this->_addAttrs[$k][0] = $v; + } + } + } + return true; + } + + + /** + * replace a certain attributes value + * + * replace - replace a certain attributes value + * example: + * $entry->replace(array('uid'=>array('tarjei'))); + * + * @param array attributes to be replaced + * @return mixed error if failure, true if sucess. + */ + function replace($attrs = array() ) + { + foreach ($attrs as $k => $v) { + + if ($this->exists($k)) { + + if (is_array($v)) { + $this->_attrs[$k] = $v; + $this->_attrs[$k]['count'] = count($v); + $this->_modAttrs[$k] = $v; + } else { + $this->_attrs[$k]['count'] = 1; + $this->_attrs[$k][0] = $v; + $this->_modAttrs[$k][0] = $v; + } + } else { + return $this->raiseError("Attribute $k does not exist",16); // 16 = no such attribute exists. + } + } + return true; + } + + /** + * delete attributes + * + * Use this function to delete certain attributes from an object. + * + * @param - array of attributes to be deleted + * @return mixed Net_Ldap_Error if failure, true if success. + */ + function delete($attrs = array()) + { + foreach ($attrs as $k => $v) { + + if ($this->exists ($k)) { + // if v is a null, then remove the whole attribute, else only the value. + if ($v == '') { + unset($this->_attrs[$k]); + $this->_delAttrs[$k] = ""; + // else we remove only the correct value. + } else { + for ($i = 0;$i< $this->_attrs[$k]['count'];$i++) { + if ($this->_attrs[$k][$i] == $v ) { + unset ($this->_attrs[$k][$i]); + $this->_delAttrs[$k] = $v; + continue; + } + } + } + } else { + $this->raiseError("You tried to delete a nonexisting attribute!",16); + } + } + return true; + } + + /** + * update the Entry in LDAP + * + * After modifying an object, you must run update() to + * make the updates on the ldap server. Before that, they only exists in the object. + * + * @param object Net_LDAP + * @return mixed Net_LDAP_Error object on failure or true on success + */ + function update ($ldapObject = null) + { + if ($ldapObject == null && $this->_link == null ) { + $this->raiseError("No link to database"); + } + + if ($ldapObject != null) { + $this->_link =& $ldapObject->_link; + } + + //if it's a new + if ($this->updateCheck['newdn'] && !$this->updateCheck['newEntry']) { + if (@ldap_get_option( $this->_link, LDAP_OPT_PROTOCOL_VERSION, $version) && $version != 3) { + return $this->raiseError("Moving or renaming an dn is only supported in LDAP V3!", 80); + } + + $newparent = ldap_explode_dn($this->_dn, 0); + unset($newparent['count']); + $relativeDn = array_shift($newparent); + $newparent = join(',', $newparent); + + if (!@ldap_rename($this->_link, $this->_olddn, $relativeDn, $newparent, true)) { + return $this->raiseError("DN not renamed: " . ldap_error($this->_link), ldap_errno($this->_link)); + } + } + + if ($this->updateCheck['newEntry']) { + //print "
    "; print_r($this->_clean_entry()); + + if (!@ldap_add($this->_link, $this->dn(), $this->_clean_entry()) ) { + return $this->raiseError("Entry" . $this->dn() . " not added!" . + ldap_error($this->_link), ldap_errno($this->_link)); + } else { + return true; + } + // update existing entry + } else { + $this->_error['first'] = $this->_modAttrs; + $this->_error['count'] = count($this->_modAttrs); + + // modified attributes + if (( count($this->_modAttrs)>0) && + !ldap_modify($this->_link, $this->dn(), $this->_modAttrs)) + { + return $this->raiseError("Entry " . $this->dn() . " not modified(attribs not modified): " . + ldap_error($this->_link),ldap_errno($this->_link)); + } + + // attributes to be deleted + if (( count($this->_delAttrs) > 0 )) + { + // in ldap v3 we need to supply the old attribute values for deleting + if (@ldap_get_option( $this->_link, LDAP_OPT_PROTOCOL_VERSION, $version) && $version == 3) { + foreach ( $this->_delAttrs as $k => $v ) { + if ( $v == '' && $this->exists($k) ) { + $this->_delAttrs[$k] = $this->get_value( $k ); + } + } + } + if ( !ldap_mod_del($this->_link, $this->dn(), $this->_delAttrs) ) { + return $this->raiseError("Entry " . $this->dn() . " not modified (attributes not deleted): " . + ldap_error($this->_link),ldap_errno($this->_link)); + } + } + + // new attributes + if ((count($this->_addAttrs)) > 0 && !ldap_modify($this->_link, $this->dn(), $this->_addAttrs)) { + return $this->raiseError( "Entry " . $this->dn() . " not modified (attributes not added): " . + ldap_error($this->_link),ldap_errno($this->_link)); + } + return true; + } + } +} + +?> diff --git a/thirdparty/pear/Net/LDAP/RootDSE.php b/thirdparty/pear/Net/LDAP/RootDSE.php new file mode 100644 index 000000000..a2f3fc090 --- /dev/null +++ b/thirdparty/pear/Net/LDAP/RootDSE.php @@ -0,0 +1,192 @@ + + * @version $Revision: 4831 $ + */ +class Net_LDAP_RootDSE extends PEAR +{ + /** + * @access private + * @var object Net_LDAP_Entry + **/ + var $_entry; + + /** + * class constructor + * + * @param object Net_LDAP_Entry + */ + function Net_LDAP_RootDSE(&$entry) + { + $this->_entry = $entry; + } + + /** + * Gets the requested attribute value + * + * Same usuage as Net_LDAP_Entry::get_value() + * + * @access public + * @param string Attribute name + * @param array Array of options + * @return mixed Net_LDAP_Error object or attribute values + * @see Net_LDAP_Entry::get_value() + */ + function getValue($attr = '', $options = '') + { + return $this->_entry->get_value($attr, $options); + } + + /** + * alias function of getValue() for perl-ldap interface + * + * @see getValue() + */ + function get_value() + { + $args = func_get_args(); + return call_user_func_array(array($this, 'getValue' ), $args); + } + + /** + * Determines if the extension is supported + * + * @access public + * @param array Array of oids to check + * @return boolean + */ + function supportedExtension($oids) + { + return $this->_checkAttr($oids, 'supportedExtension'); + } + + /** + * alias function of supportedExtension() for perl-ldap interface + * + * @see supportedExtension() + */ + function supported_extension() + { + $args = func_get_args(); + return call_user_func_array(array($this, 'supportedExtension'), $args); + } + + /** + * Determines if the version is supported + * + * @access public + * @param array Versions to check + * @return boolean + */ + function supportedVersion($versions) + { + return $this->_checkAttr($versions, 'supportedLDAPVersion'); + } + + /** + * alias function of supportedVersion() for perl-ldap interface + * + * @see supportedVersion() + */ + function supported_version() + { + $args = func_get_args(); + return call_user_func_array(array($this, 'supportedVersion'), $args); + } + + /** + * Determines if the control is supported + * + * @access public + * @param array Control oids to check + * @return boolean + */ + function supportedControl($oids) + { + return $this->_checkAttr($oids, 'supportedControl'); + } + + /** + * alias function of supportedControl() for perl-ldap interface + * + * @see supportedControl() + */ + function supported_control() + { + $args = func_get_args(); + return call_user_func_array(array($this, 'supportedControl' ), $args); + } + + /** + * Determines if the sasl mechanism is supported + * + * @access public + * @param array SASL mechanisms to check + * @return boolean + */ + function supportedSASLMechanism($mechlist) + { + return $this->_checkAttr($mechlist, 'supportedSASLMechanisms'); + } + + /** + * alias function of supportedSASLMechanism() for perl-ldap interface + * + * @see supportedSASLMechanism() + */ + function supported_sasl_mechanism() + { + $args = func_get_args(); + return call_user_func_array(array($this, 'supportedSASLMechanism'), $args); + } + + /** + * Checks for existance of value in attribute + * + * @access private + * @param array $values values to check + * @param attr $attr attribute name + * @return boolean + */ + function _checkAttr($values, $attr) + { + if (!is_array($values)) $values = array($values); + + foreach ($values as $value) { + if (!@in_array($value, $this->get_value($attr))) { + return false; + } + } + return true; + } +} + +?> \ No newline at end of file diff --git a/thirdparty/pear/Net/LDAP/Schema.php b/thirdparty/pear/Net/LDAP/Schema.php new file mode 100644 index 000000000..5fdd650d8 --- /dev/null +++ b/thirdparty/pear/Net/LDAP/Schema.php @@ -0,0 +1,355 @@ + + * @version $Revision: 4831 $ + */ + class Net_LDAP_Schema extends PEAR + { + /** + * Map of entry types to ldap attributes of subschema entry + * + * @access public + * @var array + */ + var $types = array('attribute' => 'attributeTypes', + 'ditcontentrule' => 'dITContentRules', + 'ditstructurerule' => 'dITStructureRules', + 'matchingrule' => 'matchingRules', + 'matchingruleuse' => 'matchingRuleUse', + 'nameform' => 'nameForms', + 'objectclass' => 'objectClasses', + 'syntax' => 'ldapSyntaxes'); + + /**#@+ + * Array of entries belonging to this type + * + * @access private + * @var array + */ + var $_attributeTypes = array(); + var $_matchingRules = array(); + var $_matchingRuleUse = array(); + var $_ldapSyntaxes = array(); + var $_objectClasses = array(); + var $_dITContentRules = array(); + var $_dITStructureRules = array(); + var $_nameForms = array(); + /**#@-*/ + + /** + * hash of all fetched oids + * + * @access private + * @var array + */ + var $_oids = array(); + + /** + * constructor of the class + * + * @access protected + */ + function Net_LDAP_Schema() + { + $this->PEAR('Net_LDAP_Error'); // default error class + } + + /** + * Return a hash of entries for the given type + * + * Returns a hash of entry for th givene type. Types may be: + * objectclasses, attributes, ditcontentrules, ditstructurerules, matchingrules, + * matchingruleuses, nameforms, syntaxes + * + * @access public + * @param string Type to fetch + * @return mixed Array or Net_LDAP_Error + */ + function &getAll($type) + { + $map = array('objectclasses' => &$this->_objectClasses, + 'attributes' => &$this->_attributeTypes, + 'ditcontentrules' => &$this->_dITContentRules, + 'ditstructurerules' => &$this->_dITStructureRules, + 'matchingrules' => &$this->_matchingRules, + 'matchingruleuses' => &$this->_matchingRuleUse, + 'nameforms' => &$this->_nameForms, + 'syntaxes' => &$this->_ldapSyntaxes ); + + $key = strtolower($type); + return ((key_exists($key, $map)) ? $map[$key] : $this->raiseError("Unknown type $type")); + } + + /** + * Return a specific entry + * + * @access public + * @param string Type of name + * @param string Name or OID to fetch + * @return mixed Entry or Net_LDAP_Error + */ + function &get($type, $name) + { + $type = strtolower($type); + if (false == key_exists($type, $this->types)) { + return $this->raiseError("No such type $type"); + } + + $name = strtolower($name); + $type_var = &$this->{'_' . $this->types[$type]}; + + if( key_exists($name, $type_var)) { + return $type_var[$name]; + } elseif(key_exists($name, $this->_oids) && $this->_oids[$name]['type'] == $type) { + return $this->_oids[$name]; + } else { + return $this->raiseError("Could not find $type $name"); + } + } + + + /** + * Fetches attributes that MAY be present in the given objectclass + * + * @access public + * @param string Name or OID of objectclass + * @return mixed Array with attributes or Net_LDAP_Error + */ + function may($oc) + { + return $this->_getAttr($oc, 'may'); + } + + /** + * Fetches attributes that MUST be present in the given objectclass + * + * @access public + * @param string Name or OID of objectclass + * @return mixed Array with attributes or Net_LDAP_Error + */ + function must($oc) + { + return $this->_getAttr($oc, 'must'); + } + + /** + * Fetches the given attribute from the given objectclass + * + * @access private + * @param string Name or OID of objectclass + * @param string Name of attribute to fetch + * @return mixed The attribute or Net_LDAP_Error + */ + function _getAttr($oc, $attr) + { + $oc = strtolower($oc); + if (key_exists($oc, $this->_objectClasses) && key_exists($attr, $this->_objectClasses[$oc])) { + return $this->_objectClasses[$oc][$attr]; + } + elseif (key_exists($oc, $this->_oids) && + $this->_oids[$oc]['type'] == 'objectclass' && + key_exists($attr, $this->_oids[$oc])) { + return $this->_oids[$oc][$attr]; + } else { + return $this->raiseError("Could not find $attr attributes for $oc "); + } + } + + /** + * Returns the name(s) of the immediate superclass(es) + * + * @param string Name or OID of objectclass + * @return mixed Array of names or Net_LDAP_Error + */ + function superclass($oc) + { + $o = $this->get('objectclass', $oc); + if (Net_LDAP::isError($o)) { + return $o; + } + return (key_exists('sup', $o) ? $o['sup'] : array()); + } + + /** + * Parses the schema of the given Subschema entry + * + * @access public + * @param object Net_LDAP_Entry Subschema entry + */ + function parse(&$entry) + { + foreach ($this->types as $type => $attr) + { + // initialize map type to entry + $type_var = '_' . $attr; + $this->{$type_var} = array(); + + // get values for this type + $values = $entry->get_value($attr); + + if (is_array($values)) + { + foreach ($values as $value) { + + unset($schema_entry); // this was a real mess without it + + // get the schema entry + $schema_entry = $this->_parse_entry($value); + + // set the type + $schema_entry['type'] = $type; + + // save a ref in $_oids + $this->_oids[$schema_entry['oid']] =& $schema_entry; + + // save refs for all names in type map + $names = $schema_entry['aliases']; + array_push($names, $schema_entry['name']); + foreach ($names as $name) { + $this->{$type_var}[strtolower($name)] =& $schema_entry; + } + } + } + } + } + + /** + * parses an attribute value into a schema entry + * + * @access private + * @param string Attribute value + * @return mixed Schema entry array or false + */ + function &_parse_entry($value) + { + // tokens that have no value associated + $noValue = array('single-value', + 'obsolete', + 'collective', + 'no-user-modification', + 'abstract', + 'structural', + 'auxiliary'); + + // tokens that can have multiple values + $multiValue = array('must', 'may', 'sup'); + + $schema_entry = array('aliases' => array()); // initilization + + $tokens = $this->_tokenize($value); // get an array of tokens + + // remove surrounding brackets + if ($tokens[0] == '(') array_shift($tokens); + if ($tokens[count($tokens) - 1] == ')') array_pop($tokens); // -1 doesnt work on arrays :-( + + $schema_entry['oid'] = array_shift($tokens); // first token is the oid + + // cycle over the tokens until none are left + while (count($tokens) > 0) { + $token = strtolower(array_shift($tokens)); + if (in_array($token, $noValue)) { + $schema_entry[$token] = 1; // single value token + } else { + // this one follows a string or a list if it is multivalued + if (($schema_entry[$token] = array_shift($tokens)) == '(') { + // this creates the list of values and cycles through the tokens + // until the end of the list is reached ')' + $schema_entry[$token] = array(); + while ($tmp = array_shift($tokens)) { + if ($tmp == ')') break; + if ($tmp != '$') array_push($schema_entry[$token], $tmp); + } + } + // create a array if the value should be multivalued but was not + if (in_array($token, $multiValue ) && !is_array($schema_entry[$token])) { + $schema_entry[$token] = array($schema_entry[$token]); + } + } + } + // get max length from syntax + if (key_exists('syntax', $schema_entry)) { + if (preg_match('/{(\d+)}/', $schema_entry['syntax'], $matches)) { + $schema_entry['max_length'] = $matches[1]; + } + } + // force a name + if (empty($schema_entry['name'])) { + $schema_entry['name'] = $schema_entry['oid']; + } + // make one name the default and put the other ones into aliases + if (is_array($schema_entry['name'])) { + $aliases = $schema_entry['name']; + $schema_entry['name'] = array_shift($aliases); + $schema_entry['aliases'] = $aliases; + } + return $schema_entry; + } + + /** + * tokenizes the given value into an array of tokens + * + * @access private + * @param string String to parse + * @return array Array of tokens + */ + function _tokenize($value) + { + $tokens = array(); // array of tokens + $matches = array(); // matches[0] full pattern match, [1,2,3] subpatterns + + // this one is taken from perl-ldap, modified for php + $pattern = "/\s* (?:([()]) | ([^'\s()]+) | '((?:[^']+|'[^\s)])*)') \s*/x"; + + /** + * This one matches one big pattern wherin only one of the three subpatterns matched + * We are interested in the subpatterns that matched. If it matched its value will be + * non-empty and so it is a token. Tokens may be round brackets, a string, or a string + * enclosed by ' + */ + preg_match_all($pattern, $value, $matches); + + for ($i = 0; $i < count($matches[0]); $i++) { // number of tokens (full pattern match) + for ($j = 1; $j < 4; $j++) { // each subpattern + if (null != trim($matches[$j][$i])) { // pattern match in this subpattern + $tokens[$i] = trim($matches[$j][$i]); // this is the token + } + } + } + return $tokens; + } + } + +?> \ No newline at end of file diff --git a/thirdparty/pear/Net/LDAP/Search.php b/thirdparty/pear/Net/LDAP/Search.php new file mode 100644 index 000000000..f6b67f460 --- /dev/null +++ b/thirdparty/pear/Net/LDAP/Search.php @@ -0,0 +1,245 @@ +_setSearch($search, $link); + $this->_errorCode = ldap_errno($link); + } + + /** + * Returns an assosiative array of entry objects + * + * @return array Array of entry objects. + */ + function entries() + { + if ($this->count() == 0) { + return array(); + } + + $this->_elink = @ldap_first_entry( $this->_link,$this->_search); + $entry = new Net_LDAP_Entry($this->_link, + @ldap_get_dn($this->_link, $this->_elink), + @ldap_get_attributes($this->_link, $this->_elink)); + array_push($this->_entries, $entry); + + while ($this->_elink = @ldap_next_entry($this->_link,$this->_elink)) { + $entry = new Net_LDAP_Entry($this->_link, + @ldap_get_dn($this->_link, $this->_elink), + @ldap_get_attributes($this->_link, $this->_elink)); + array_push($this->_entries, $entry); + } + return $this->_entries; + } + + /** + * Get the next entry in the searchresult. + * + * @return mixed Net_LDAP_Entry object or false + */ + function shiftEntry() + { + if ($this->count() == 0 ) { + return false; + } + + if (is_null($this->_elink)) { + $this->_elink = @ldap_first_entry($this->_link, $this->_search); + $entry = new Net_LDAP_Entry($this->_link, + ldap_get_dn($this->_link, $this->_elink), + ldap_get_attributes($this->_link, $this->_elink)); + } else { + if (!$this->_elink = ldap_next_entry($this->_link, $this->_elink)) { + return false; + } + $entry = new Net_LDAP_Entry($this->_link, + ldap_get_dn($this->_link,$this->_elink), + ldap_get_attributes($this->_link,$this->_elink)); + } + return $entry; + } + + /** + * alias function of shiftEntry() for perl-ldap interface + * + * @see shiftEntry() + */ + function shift_entry() + { + $args = func_get_args(); + return call_user_func_array(array($this, 'shiftEntry'), $args); + } + + /** + * Retrieve the last entry of the searchset. NOT IMPLEMENTED + * + * @return object Net_LDAP_Error + */ + function pop_entry () + { + $this->raiseError("Not implemented"); + } + + /** + * Return entries sorted NOT IMPLEMENTED + * + * @param array Array of sort attributes + * @return object Net_LDAP_Error + */ + function sorted ($attrs = array()) + { + $this->raiseError("Not impelented"); + } + + /** + * Return entries as object NOT IMPLEMENTED + * + * @return object Net_LDAP_Error + */ + function as_struct () + { + $this->raiseError("Not implemented"); + } + + /** + * Set the searchobjects resourcelinks + * + * @access private + * @param resource Search result identifier + * @param resource Resource link identifier + */ + function _setSearch(&$search,&$link) + { + $this->_search = $search; + $this->_link = $link; + } + + /** + * Returns the number of entries in the searchresult + * + * @return int Number of entries in search. + */ + function count() + { + /* this catches the situation where OL returned errno 32 = no such object! */ + if (!$this->_search) { + return 0; + } + return @ldap_count_entries($this->_link, $this->_search); + } + + /** + * Get the errorcode the object got in its search. + * + * @return int The ldap error number. + */ + function getErrorCode() + { + return $this->_errorCode; + } + + /** Destructor + * + * @access protected + */ + function _Net_LDAP_Search() + { + @ldap_free_result($this->_search); + } + + /** + * Closes search result + */ + function done() + { + $this->_Net_LDAP_Search(); + } +} + +?> diff --git a/thirdparty/pear/Net/LDAP/Util.php b/thirdparty/pear/Net/LDAP/Util.php new file mode 100644 index 000000000..19f37020b --- /dev/null +++ b/thirdparty/pear/Net/LDAP/Util.php @@ -0,0 +1,132 @@ + + * @version $Revision: 4831 $ + */ +class Net_LDAP_Util extends PEAR +{ + /** + * Reference to LDAP object + * + * @access private + * @var object Net_LDAP + */ + var $_ldap = null; + + /** + * Net_LDAP_Schema object + * + * @access private + * @var object Net_LDAP_Schema + */ + var $_schema = null; + + /** + * Constructur + * + * Takes an LDAP object by reference and saves it. Then the schema will be fetched. + * + * @access public + * @param object Net_LDAP + */ + function Net_LDAP_Util(&$ldap) + { + if (is_object($ldap) && (strtolower(get_class($ldap)) == 'net_ldap')) { + $this->_ldap = $ldap; + $this->_schema = $this->_ldap->schema(); + if (Net_LDAP::isError($this->_schema)) $this->_schema = null; + } + } + + /** + * Encodes given attributes to UTF8 if needed + * + * This function takes attributes in an array and then checks against the schema if they need + * UTF8 encoding. If that is so, they will be encoded. An encoded array will be returned and + * can be used for adding or modifying. + * + * @access public + * @param array Array of attributes + * @return array Array of UTF8 encoded attributes + */ + function utf8Encode($attributes) + { + return $this->_utf8($attributes, 'utf8_encode'); + } + + /** + * Decodes the given attribute values + * + * @access public + * @param array Array of attributes + * @return array Array with decoded attribute values + */ + function utf8Decode($attributes) + { + return $this->_utf8($attributes, 'utf8_decode'); + } + + /** + * Encodes or decodes attribute values if needed + * + * @access private + * @param array Array of attributes + * @param array Function to apply to attribute values + * @return array Array of attributes with function applied to values + */ + function _utf8($attributes, $function) + { + if (!$this->_ldap || !$this->_schema || !function_exists($function)) { + return $attributes; + } + if (is_array($attributes) && count($attributes) > 0) { + foreach( $attributes as $k => $v ) { + $attr = $this->_schema->get('attribute', $k); + if (Net_LDAP::isError($attr)) { + continue; + } + if (false !== strpos($attr['syntax'], '1.3.6.1.4.1.1466.115.121.1.15')) { + if (is_array($v)) { + foreach ($v as $ak => $av ) { + $v[$ak] = call_user_func($function, $av ); + } + } else { + $v = call_user_func($function, $v); + } + } + $attributes[$k] = $v; + } + } + return $attributes; + } +} + +?> diff --git a/thirdparty/pear/Net/LDAP/fg.php b/thirdparty/pear/Net/LDAP/fg.php new file mode 100644 index 000000000..a7f0bfddf --- /dev/null +++ b/thirdparty/pear/Net/LDAP/fg.php @@ -0,0 +1,38 @@ + $oAuthenticator->sSearchUser, + 'password' => $oAuthenticator->sSearchPassword, + 'host' => $oAuthenticator->sLdapServer, + 'base' => $oAuthenticator->sBaseDN, +); + +$oLdap =& Net_LDAP::connect($config); +if (PEAR::isError($oLdap)) { + var_dump($oLdap); + exit(0); +} + +$aParams = array( + 'scope' => 'sub', + 'attributes' => array('cn', 'dn', 'displayClass'), +); +$rootDn = $oAuthenticator->sBaseDN; +if (is_array($rootDn)) { + $rootDn = join(",", $rootDn); +} +$oResults = $oLdap->search($rootDn, '(objectClass=group)', $aParams); +foreach ($oResults->entries() as $oEntry) { + var_dump($oEntry->dn()); +} + diff --git a/thirdparty/pear/Net/POP3.php b/thirdparty/pear/Net/POP3.php new file mode 100644 index 000000000..8c6b7cda0 --- /dev/null +++ b/thirdparty/pear/Net/POP3.php @@ -0,0 +1,1240 @@ + | +// | Co-Author: Damian Fernandez Sosa | +// +-----------------------------------------------------------------------+ +// +// $Id: POP3.php,v 1.2 2004/12/05 16:34:39 damian Exp $ + +require_once('Net/Socket.php'); + + + +/** +* +----------------------------- IMPORTANT ------------------------------+ +* | Usage of this class compared to native php extensions such as IMAP | +* | is slow and may be feature deficient. If available you are STRONGLY | +* | recommended to use the php extensions. | +* +----------------------------------------------------------------------+ +* +* POP3 Access Class +* +* For usage see the example script +*/ + +define('NET_POP3_STATE_DISCONNECTED', 1, true); +define('NET_POP3_STATE_AUTHORISATION', 2, true); +define('NET_POP3_STATE_TRANSACTION', 4, true); + +class Net_POP3 { + + /* + * Some basic information about the mail drop + * garnered from the STAT command + * + * @var array + */ + var $_maildrop; + + /* + * Used for APOP to store the timestamp + * + * @var string + */ + var $_timestamp; + + /* + * Timeout that is passed to the socket object + * + * @var integer + */ + var $_timeout; + + /* + * Socket object + * + * @var object + */ + var $_socket; + + /* + * Current state of the connection. Used with the + * constants defined above. + * + * @var integer + */ + var $_state; + + /* + * Hostname to connect to + * + * @var string + */ + var $_host; + + /* + * Port to connect to + * + * @var integer + */ + var $_port; + + /** + * To allow class debuging + * @var boolean + */ + var $_debug = false; + + + /** + * The auth methods this class support + * @var array + */ + //var $supportedAuthMethods=array('DIGEST-MD5', 'CRAM-MD5', 'APOP' , 'PLAIN' , 'LOGIN', 'USER'); + //Disabling DIGEST-MD5 for now + var $supportedAuthMethods=array( 'CRAM-MD5', 'APOP' , 'PLAIN' , 'LOGIN', 'USER'); + //var $supportedAuthMethods=array( 'CRAM-MD5', 'PLAIN' , 'LOGIN'); + //var $supportedAuthMethods=array( 'PLAIN' , 'LOGIN'); + + + /** + * The auth methods this class support + * @var array + */ + var $supportedSASLAuthMethods=array('DIGEST-MD5', 'CRAM-MD5'); + + + /** + * The capability response + * @var array + */ + var $_capability; + + /* + * Constructor. Sets up the object variables, and instantiates + * the socket object. + * + */ + + + function Net_POP3() + { + $this->_timestamp = ''; // Used for APOP + $this->_maildrop = array(); + $this->_timeout = 3; + $this->_state = NET_POP3_STATE_DISCONNECTED; + $this->_socket =& new Net_Socket(); + /* + * Include the Auth_SASL package. If the package is not available, + * we disable the authentication methods that depend upon it. + */ + if ((@include_once 'Auth/SASL.php') == false) { + if($this->_debug){ + echo "AUTH_SASL NOT PRESENT!\n"; + } + foreach($this->supportedSASLAuthMethods as $SASLMethod){ + $pos = array_search( $SASLMethod, $this->supportedAuthMethods ); + if($this->_debug){ + echo "DISABLING METHOD $SASLMethod\n"; + } + unset($this->supportedAuthMethods[$pos]); + } + } + + + + } + + + /** + * Handles the errors the class can find + * on the server + * + * @access private + * @return PEAR_Error + */ + + function _raiseError($msg, $code =-1) + { + include_once 'PEAR.php'; + return PEAR::raiseError($msg, $code); + } + + + + /* + * Connects to the given host on the given port. + * Also looks for the timestamp in the greeting + * needed for APOP authentication + * + * @param string $host Hostname/IP address to connect to + * @param string $port Port to use to connect to on host + * @return bool Success/Failure + */ + function connect($host = 'localhost', $port = 110) + { + $this->_host = $host; + $this->_port = $port; + + $result = $this->_socket->connect($host, $port, false, $this->_timeout); + if ($result === true) { + $data = $this->_recvLn(); + + if( $this->_checkResponse($data) ){ + // if the response begins with '+OK' ... +// if (@substr(strtoupper($data), 0, 3) == '+OK') { + // Check for string matching apop timestamp + if (preg_match('/<.+@.+>/U', $data, $matches)) { + $this->_timestamp = $matches[0]; + } + $this->_maildrop = array(); + $this->_state = NET_POP3_STATE_AUTHORISATION; + + return true; + } + } + + $this->_socket->disconnect(); + return false; + } + + /* + * Disconnect function. Sends the QUIT command + * and closes the socket. + * + * @return bool Success/Failure + */ + function disconnect() + { + return $this->_cmdQuit(); + } + + /* + * Performs the login procedure. If there is a timestamp + * stored, APOP will be tried first, then basic USER/PASS. + * + * @param string $user Username to use + * @param string $pass Password to use + * @param mixed $apop Whether to try APOP first, if used as string you can select the auth methd to use ( $pop3->login('validlogin', 'validpass', "CRAM-MD5"); + * Valid methods are: 'DIGEST-MD5','CRAM-MD5','LOGIN','PLAIN','APOP','USER' + * @return mixed true on Success/ PEAR_ERROR on error + */ + function login($user, $pass, $apop = true) + { + if ($this->_state == NET_POP3_STATE_AUTHORISATION) { + + if(PEAR::isError($ret= $this->_cmdAuthenticate($user , $pass , $apop ) ) ){ + return $ret; + } + if( ! PEAR::isError($ret)){ + $this->_state = NET_POP3_STATE_TRANSACTION; + return true; + } + + } + return $this->_raiseError('Generic login error' , 1); + } + + + + /** + * Parses the response from the capability command. Stores + * the result in $this->_capability + * + * @access private + */ + function _parseCapability() + { + + if(!PEAR::isError($data = $this->_sendCmd('CAPA'))){ + $data = $this->_getMultiline(); + }else { + // CAPA command not supported, reset data var + // to avoid Notice errors of preg_split on an object + $data = ''; + } + $data = preg_split('/\r?\n/', $data, -1, PREG_SPLIT_NO_EMPTY); + + for ($i = 0; $i < count($data); $i++) { + + $capa=''; + if (preg_match('/^([a-z,\-]+)( ((.*))|$)$/i', $data[$i], $matches)) { + + $capa=strtolower($matches[1]); + switch ($capa) { + case 'implementation': + $this->_capability['implementation'] = $matches[3]; + break; + case 'sasl': + $this->_capability['sasl'] = preg_split('/\s+/', $matches[3]); + break; + default : + $this->_capability[$capa] = $matches[2]; + break; + } + } + } + } + + + + + /** + * Returns the name of the best authentication method that the server + * has advertised. + * + * @param string if !=null,authenticate with this method ($userMethod). + * + * @return mixed Returns a string containing the name of the best + * supported authentication method or a PEAR_Error object + * if a failure condition is encountered. + * @access private + * @since 1.0 + */ + function _getBestAuthMethod($userMethod = null) + { + +/* + return 'USER'; + return 'APOP'; + return 'DIGEST-MD5'; + return 'CRAM-MD5'; +*/ + + + $this->_parseCapability(); + + //unset($this->_capability['sasl']); + + if( isset($this->_capability['sasl']) ){ + $serverMethods=$this->_capability['sasl']; + }else{ + $serverMethods=array('USER'); + // Check for timestamp before attempting APOP + if ($this->_timestamp != null) + { + $serverMethods[] = 'APOP'; + } + } + + if($userMethod !== null && $userMethod !== true ){ + $methods = array(); + $methods[] = $userMethod; + return $userMethod; + }else{ + $methods = $this->supportedAuthMethods; + } + + if( ($methods != null) && ($serverMethods != null)){ + + foreach ( $methods as $method ) { + + if ( in_array( $method , $serverMethods ) ) { + return $method; + } + } + $serverMethods=implode(',' , $serverMethods ); + $myMethods=implode(',' ,$this->supportedAuthMethods); + return $this->_raiseError("$method NOT supported authentication method!. This server " . + "supports these methods: $serverMethods, but I support $myMethods"); + }else{ + return $this->_raiseError("This server don't support any Auth methods"); + } + } + + + + + + + /* Handles the authentication using any known method + * + * @param string The userid to authenticate as. + * @param string The password to authenticate with. + * @param string The method to use ( if $usermethod == '' then the class chooses the best method (the stronger is the best ) ) + * + * @return mixed string or PEAR_Error + * + * @access private + * @since 1.0 + */ + function _cmdAuthenticate($uid , $pwd , $userMethod = null ) + { + + + if ( PEAR::isError( $method = $this->_getBestAuthMethod($userMethod) ) ) { + return $method; + } + + switch ($method) { + case 'DIGEST-MD5': + $result = $this->_authDigest_MD5( $uid , $pwd ); + break; + case 'CRAM-MD5': + $result = $this->_authCRAM_MD5( $uid , $pwd ); + break; + case 'LOGIN': + $result = $this->_authLOGIN( $uid , $pwd ); + break; + case 'PLAIN': + $result = $this->_authPLAIN( $uid , $pwd ); + break; + case 'APOP': + $result = $this->_cmdApop( $uid , $pwd ); + // if APOP fails fallback to USER auth + if( PEAR::isError( $result ) ){ + //echo "APOP FAILED!!!\n"; + $result=$this->_authUSER( $uid , $pwd ); + } + break; + case 'USER': + $result = $this->_authUSER( $uid , $pwd ); + break; + + + default : + $result = $this->_raiseError( "$method is not a supported authentication method" ); + break; + } + return $result; + } + + + + + /* Authenticates the user using the USER-PASS method. + * + * @param string The userid to authenticate as. + * @param string The password to authenticate with. + * + * @return mixed true on success or PEAR_Error on failure + * + * @access private + * @since 1.0 + */ + function _authUSER($user, $pass ) + { + if ( PEAR::isError($ret=$this->_cmdUser($user) ) ){ + return $ret; + } + if ( PEAR::isError($ret=$this->_cmdPass($pass) ) ){ + return $ret; + } + return true; + } + + + + + + + + + /* Authenticates the user using the PLAIN method. + * + * @param string The userid to authenticate as. + * @param string The password to authenticate with. + * + * @return array Returns an array containing the response + * + * @access private + * @since 1.0 + */ + function _authPLAIN($user, $pass ) + { + $cmd=sprintf('AUTH PLAIN %s', base64_encode( chr(0) . $user . chr(0) . $pass ) ); + + if ( PEAR::isError( $ret = $this->_send($cmd) ) ) { + return $ret; + } + if ( PEAR::isError( $challenge = $this->_recvLn() ) ){ + return $challenge; + } + if( PEAR::isError($ret=$this->_checkResponse($challenge) )){ + return $ret; + } + + return true; + } + + + + /* Authenticates the user using the PLAIN method. + * + * @param string The userid to authenticate as. + * @param string The password to authenticate with. + * + * @return array Returns an array containing the response + * + * @access private + * @since 1.0 + */ + function _authLOGIN($user, $pass ) + { + $this->_send('AUTH LOGIN'); + + if ( PEAR::isError( $challenge = $this->_recvLn() ) ) { + return $challenge; + } + if( PEAR::isError($ret=$this->_checkResponse($challenge) )){ + return $ret; + } + + + if ( PEAR::isError( $ret = $this->_send(sprintf('%s', base64_encode($user))) ) ) { + return $ret; + } + + if ( PEAR::isError( $challenge = $this->_recvLn() ) ) { + return $challenge; + } + if( PEAR::isError($ret=$this->_checkResponse($challenge) )){ + return $ret; + } + + if ( PEAR::isError( $ret = $this->_send(sprintf('%s', base64_encode($pass))) ) ) { + return $ret; + } + + if ( PEAR::isError( $challenge = $this->_recvLn() ) ) { + return $challenge; + } + return $this->_checkResponse($challenge); + } + + + + + + /* Authenticates the user using the CRAM-MD5 method. + * + * @param string The userid to authenticate as. + * @param string The password to authenticate with. + * + * @return array Returns an array containing the response + * + * @access private + * @since 1.0 + */ + function _authCRAM_MD5($uid, $pwd ) + { + if ( PEAR::isError( $ret = $this->_send( 'AUTH CRAM-MD5' ) ) ) { + return $ret; + } + + if ( PEAR::isError( $challenge = $this->_recvLn() ) ) { + return $challenge; + } + if( PEAR::isError($ret=$this->_checkResponse($challenge) )){ + return $ret; + } + + // remove '+ ' + + $challenge=substr($challenge,2); + + $challenge = base64_decode( $challenge ); + + $cram = &Auth_SASL::factory('crammd5'); + $auth_str = base64_encode( $cram->getResponse( $uid , $pwd , $challenge ) ); + + + if ( PEAR::isError($error = $this->_send( $auth_str ) ) ) { + return $error; + } + if ( PEAR::isError( $ret = $this->_recvLn() ) ) { + return $ret; + } + //echo "RET:$ret\n"; + return $this->_checkResponse($ret); + } + + + + /* Authenticates the user using the DIGEST-MD5 method. + * + * @param string The userid to authenticate as. + * @param string The password to authenticate with. + * @param string The efective user + * + * @return array Returns an array containing the response + * + * @access private + * @since 1.0 + */ + function _authDigest_MD5($uid, $pwd) + { + if ( PEAR::isError( $ret = $this->_send( 'AUTH DIGEST-MD5' ) ) ) { + return $ret; + } + + if ( PEAR::isError( $challenge = $this->_recvLn() ) ) { + return $challenge; + } + if( PEAR::isError($ret=$this->_checkResponse($challenge) )){ + return $ret; + } + + // remove '+ ' + $challenge=substr($challenge,2); + + $challenge = base64_decode( $challenge ); + $digest = &Auth_SASL::factory('digestmd5'); + $auth_str = base64_encode($digest->getResponse($uid, $pwd, $challenge, "localhost", "pop3" )); + + if ( PEAR::isError($error = $this->_send( $auth_str ) ) ) { + return $error; + } + + if ( PEAR::isError( $challenge = $this->_recvLn() ) ) { + return $challenge; + } + if( PEAR::isError($ret=$this->_checkResponse($challenge) )){ + return $ret; + } + /* + * We don't use the protocol's third step because POP3 doesn't allow + * subsequent authentication, so we just silently ignore it. + */ + + if ( PEAR::isError( $challenge = $this->_send("\r\n") ) ) { + return $challenge ; + } + + if ( PEAR::isError( $challenge = $this->_recvLn() ) ) { + return $challenge; + } + + return $this->_checkResponse($challenge); + + + } + + + + + + + + + + + /* + * Sends the APOP command + * + * @param $user Username to send + * @param $pass Password to send + * @return bool Success/Failure + */ + function _cmdApop($user, $pass) + { + if ($this->_state == NET_POP3_STATE_AUTHORISATION) { + + if (!empty($this->_timestamp)) { + if(PEAR::isError($data = $this->_sendCmd('APOP ' . $user . ' ' . $this->encryptOld($this->_timestamp . $pass)) ) ){ + return $data; + } + $this->_state = NET_POP3_STATE_TRANSACTION; + return true; + } + } + return $this->_raiseError('Not In NET_POP3_STATE_AUTHORISATION State1'); + } + + + + + + + + + + + + + + + + /* + * Returns the raw headers of the specified message. + * + * @param integer $msg_id Message number + * @return mixed Either raw headers or false on error + */ + function getRawHeaders($msg_id) + { + if ($this->_state == NET_POP3_STATE_TRANSACTION) { + return $this->_cmdTop($msg_id, 0); + } + + return false; + } + + /* + * Returns the headers of the specified message in an + * associative array. Array keys are the header names, array + * values are the header values. In the case of multiple headers + * having the same names, eg Received:, the array value will be + * an indexed array of all the header values. + * + * @param integer $msg_id Message number + * @return mixed Either array of headers or false on error + */ + function getParsedHeaders($msg_id) + { + if ($this->_state == NET_POP3_STATE_TRANSACTION) { + + $raw_headers = rtrim($this->getRawHeaders($msg_id)); + + $raw_headers = preg_replace("/\r\n[ \t]+/", ' ', $raw_headers); // Unfold headers + $raw_headers = explode("\r\n", $raw_headers); + foreach ($raw_headers as $value) { + $name = substr($value, 0, $pos = strpos($value, ':')); + $value = ltrim(substr($value, $pos + 1)); + if (isset($headers[$name]) AND is_array($headers[$name])) { + $headers[$name][] = $value; + } elseif (isset($headers[$name])) { + $headers[$name] = array($headers[$name], $value); + } else { + $headers[$name] = $value; + } + } + + return $headers; + } + + return false; + } + + /* + * Returns the body of the message with given message number. + * + * @param integer $msg_id Message number + * @return mixed Either message body or false on error + */ + function getBody($msg_id) + { + if ($this->_state == NET_POP3_STATE_TRANSACTION) { + $msg = $this->_cmdRetr($msg_id); + return substr($msg, strpos($msg, "\r\n\r\n")+4); + } + + return false; + } + + /* + * Returns the entire message with given message number. + * + * @param integer $msg_id Message number + * @return mixed Either entire message or false on error + */ + function getMsg($msg_id) + { + if ($this->_state == NET_POP3_STATE_TRANSACTION) { + return $this->_cmdRetr($msg_id); + } + + return false; + } + + /* + * Returns the size of the maildrop + * + * @return mixed Either size of maildrop or false on error + */ + function getSize() + { + if ($this->_state == NET_POP3_STATE_TRANSACTION) { + if (isset($this->_maildrop['size'])) { + return $this->_maildrop['size']; + } else { + list(, $size) = $this->_cmdStat(); + return $size; + } + } + + return false; + } + + /* + * Returns number of messages in this maildrop + * + * @return mixed Either number of messages or false on error + */ + function numMsg() + { + if ($this->_state == NET_POP3_STATE_TRANSACTION) { + if (isset($this->_maildrop['num_msg'])) { + return $this->_maildrop['num_msg']; + } else { + list($num_msg, ) = $this->_cmdStat(); + return $num_msg; + } + } + + return false; + } + + /* + * Marks a message for deletion. Only will be deleted if the + * disconnect() method is called. + * + * @param integer $msg_id Message to delete + * @return bool Success/Failure + */ + function deleteMsg($msg_id) + { + if ($this->_state == NET_POP3_STATE_TRANSACTION) { + return $this->_cmdDele($msg_id); + } + + return false; + } + + /* + * Combination of LIST/UIDL commands, returns an array + * of data + * + * @param integer $msg_id Optional message number + * @return mixed Array of data or false on error + */ + function getListing($msg_id = null) + { + + if ($this->_state == NET_POP3_STATE_TRANSACTION) { + if (!isset($msg_id)){ + + $list=array(); + if ($list = $this->_cmdList()) { + if ($uidl = $this->_cmdUidl()) { + foreach ($uidl as $i => $value) { + $list[$i]['uidl'] = $value['uidl']; + } + } + return $list; + }else{ + return array(); + } + } else { + if ($list = $this->_cmdList($msg_id) AND $uidl = $this->_cmdUidl($msg_id)) { + return array_merge($list, $uidl); + } + } + } + + return false; + } + + /* + * Sends the USER command + * + * @param string $user Username to send + * @return bool Success/Failure + */ + function _cmdUser($user) + { + if ($this->_state == NET_POP3_STATE_AUTHORISATION) { + return $this->_sendCmd('USER ' . $user); + } + return $this->_raiseError('Not In NET_POP3_STATE_AUTHORISATION State'); + } + + + /* + * Sends the PASS command + * + * @param string $pass Password to send + * @return bool Success/Failure + */ + function _cmdPass($pass) + { + if ($this->_state == NET_POP3_STATE_AUTHORISATION) { + return $this->_sendCmd('PASS ' . $pass); + } + return $this->_raiseError('Not In NET_POP3_STATE_AUTHORISATION State'); + } + + + /* + * Sends the STAT command + * + * @return mixed Indexed array of number of messages and + * maildrop size, or false on error. + */ + function _cmdStat() + { + if ($this->_state == NET_POP3_STATE_TRANSACTION) { + if(!PEAR::isError($data = $this->_sendCmd('STAT'))){ + sscanf($data, '+OK %d %d', $msg_num, $size); + $this->_maildrop['num_msg'] = $msg_num; + $this->_maildrop['size'] = $size; + + return array($msg_num, $size); + } + } + return false; + } + + + /* + * Sends the LIST command + * + * @param integer $msg_id Optional message number + * @return mixed Indexed array of msg_id/msg size or + * false on error + */ + function _cmdList($msg_id = null) + { + $return=array(); + if ($this->_state == NET_POP3_STATE_TRANSACTION) { + if (!isset($msg_id)) { + if(!PEAR::isError($data = $this->_sendCmd('LIST') )){ + $data = $this->_getMultiline(); + $data = explode("\r\n", $data); + foreach ($data as $line) { + if($line !=''){ + sscanf($line, '%s %s', $msg_id, $size); + $return[] = array('msg_id' => $msg_id, 'size' => $size); + } + } + return $return; + } + } else { + if(!PEAR::isError($data = $this->_sendCmd('LIST ' . $msg_id))){ + if($data!=''){ + sscanf($data, '+OK %d %d', $msg_id, $size); + return array('msg_id' => $msg_id, 'size' => $size); + } + return array(); + } + } + } + + + return false; + } + + + /* + * Sends the RETR command + * + * @param integer $msg_id The message number to retrieve + * @return mixed The message or false on error + */ + function _cmdRetr($msg_id) + { + if ($this->_state == NET_POP3_STATE_TRANSACTION) { + if(!PEAR::isError($data = $this->_sendCmd('RETR ' . $msg_id) )){ + $data = $this->_getMultiline(); + return $data; + } + } + + return false; + } + + + /* + * Sends the DELE command + * + * @param integer $msg_id Message number to mark as deleted + * @return bool Success/Failure + */ + function _cmdDele($msg_id) + { + if ($this->_state == NET_POP3_STATE_TRANSACTION) { + return $this->_sendCmd('DELE ' . $msg_id); + } + + return false; + } + + + /* + * Sends the NOOP command + * + * @return bool Success/Failure + */ + function _cmdNoop() + { + if ($this->_state == NET_POP3_STATE_TRANSACTION) { + if(!PEAR::isError($data = $this->_sendCmd('NOOP'))){ + return true; + } + } + + return false; + } + + /* + * Sends the RSET command + * + * @return bool Success/Failure + */ + function _cmdRset() + { + if ($this->_state == NET_POP3_STATE_TRANSACTION) { + if(!PEAR::isError($data = $this->_sendCmd('RSET'))){ + return true; + } + } + + return false; + } + + /* + * Sends the QUIT command + * + * @return bool Success/Failure + */ + function _cmdQuit() + { + $data = $this->_sendCmd('QUIT'); + $this->_state = NET_POP3_STATE_DISCONNECTED; + $this->_socket->disconnect(); + + return (bool)$data; + } + + + /* + * Sends the TOP command + * + * @param integer $msg_id Message number + * @param integer $num_lines Number of lines to retrieve + * @return mixed Message data or false on error + */ + function _cmdTop($msg_id, $num_lines) + { + if ($this->_state == NET_POP3_STATE_TRANSACTION) { + + if(!PEAR::isError($data = $this->_sendCmd('TOP ' . $msg_id . ' ' . $num_lines))){ + return $this->_getMultiline(); + } + } + + return false; + } + + /* + * Sends the UIDL command + * + * @param integer $msg_id Message number + * @return mixed indexed array of msg_id/uidl or false on error + */ + function _cmdUidl($msg_id = null) + { + if ($this->_state == NET_POP3_STATE_TRANSACTION) { + + if (!isset($msg_id)) { + if(!PEAR::isError($data = $this->_sendCmd('UIDL') )){ + $data = $this->_getMultiline(); + $data = explode("\r\n", $data); + foreach ($data as $line) { + sscanf($line, '%d %s', $msg_id, $uidl); + $return[] = array('msg_id' => $msg_id, 'uidl' => $uidl); + } + + return $return; + } + } else { + + $data = $this->_sendCmd('UIDL ' . $msg_id); + sscanf($data, '+OK %d %s', $msg_id, $uidl); + return array('msg_id' => $msg_id, 'uidl' => $uidl); + } + } + + return false; + } + + + + + + + + + + /* + * Sends a command, checks the reponse, and + * if good returns the reponse, other wise + * returns false. + * + * @param string $cmd Command to send (\r\n will be appended) + * @return mixed First line of response if successful, otherwise false + */ + function _sendCmd($cmd) + { + if (PEAR::isError($result = $this->_send($cmd) )){ + return $result ; + } + + if (PEAR::isError($data = $this->_recvLn() )){ + return $data; + } + + if ( strtoupper(substr($data, 0, 3)) == '+OK') { + return $data; + } + + + return $this->_raiseError($data); + } + + /* + * Reads a multiline reponse and returns the data + * + * @return string The reponse. + */ + function _getMultiline() + { + $data = ''; + while(!PEAR::isError($tmp = $this->_recvLn() ) ) { + if($tmp == '.'){ + return substr($data, 0, -2); + } + if (substr($tmp, 0, 2) == '..') { + $tmp = substr($tmp, 1); + } + $data .= $tmp . "\r\n"; + } + return substr($data, 0, -2); + } + + + /** + * Sets the bebug state + * + * @param bool $debug + * @access public + * @return void + */ + function setDebug($debug=true) + { + $this->_debug=$debug; + } + + + + + + /** + * Send the given string of data to the server. + * + * @param string $data The string of data to send. + * + * @return mixed True on success or a PEAR_Error object on failure. + * + * @access private + * @since 1.0 + */ + function _send($data) + { + if ($this->_debug) { + echo "C: $data\n"; + } + + if (PEAR::isError($error = $this->_socket->writeLine($data))) { + return $this->_raiseError('Failed to write to socket: ' . $error->getMessage()); + } + return true; + } + + + + /** + * Receive the given string of data from the server. + * + * @return mixed a line of response on success or a PEAR_Error object on failure. + * + * @access private + * @since 1.0 + */ + function _recvLn() + { + if (PEAR::isError( $lastline = $this->_socket->readLine( 8192 ) ) ) { + return $this->_raiseError('Failed to write to socket: ' . $this->lastline->getMessage() ); + } + if($this->_debug){ + // S: means this data was sent by the POP3 Server + echo "S:$lastline\n" ; + } + return $lastline; + } + + /** + * Checks de server Response + * + * @param string $response the response + * @return mixed true on success or a PEAR_Error object on failure. + * + * @access private + * @since 1.3.3 + */ + + function _checkResponse($response) + { + if (@substr(strtoupper($response), 0, 3) == '+OK') { + return true; + }else{ + if (@substr(strtoupper($response), 0, 4) == '-ERR') { + return $this->_raiseError($response); + }else{ + if (@substr(strtoupper($response), 0, 2) == '+ ') { + return true; + } + } + + } + return $this->_raiseError("Unknown Response ($response)"); + } + + public function encryptOld($string) + { + if (!class_exists('G')) { + $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); + $docuroot = explode( '/', $realdocuroot ); + array_pop( $docuroot ); + $pathhome = implode( '/', $docuroot ) . '/'; + array_pop( $docuroot ); + $pathTrunk = implode( '/', $docuroot ) . '/'; + require_once($pathTrunk.'gulliver/system/class.g.php'); + } + return G::encryptOld($string); + } + + + +} + +?> diff --git a/thirdparty/pear/Net/SMTP.php b/thirdparty/pear/Net/SMTP.php new file mode 100644 index 000000000..d632258d6 --- /dev/null +++ b/thirdparty/pear/Net/SMTP.php @@ -0,0 +1,1082 @@ + | +// | Jon Parise | +// | Damian Alejandro Fernandez Sosa | +// +----------------------------------------------------------------------+ +// +// $Id: SMTP.php,v 1.63 2008/06/10 05:39:12 jon Exp $ + +require_once 'PEAR.php'; +require_once 'Net/Socket.php'; + +/** + * Provides an implementation of the SMTP protocol using PEAR's + * Net_Socket:: class. + * + * @package Net_SMTP + * @author Chuck Hagenbuch + * @author Jon Parise + * @author Damian Alejandro Fernandez Sosa + * + * @example basic.php A basic implementation of the Net_SMTP package. + */ +class Net_SMTP +{ + /** + * The server to connect to. + * @var string + * @access public + */ + var $host = 'localhost'; + + /** + * The port to connect to. + * @var int + * @access public + */ + var $port = 25; + + /** + * The value to give when sending EHLO or HELO. + * @var string + * @access public + */ + var $localhost = 'localhost'; + + /** + * List of supported authentication methods, in preferential order. + * @var array + * @access public + */ + var $auth_methods = array('DIGEST-MD5', 'CRAM-MD5', 'LOGIN', 'PLAIN'); + + /** + * Use SMTP command pipelining (specified in RFC 2920) if the SMTP + * server supports it. + * + * When pipeling is enabled, rcptTo(), mailFrom(), sendFrom(), + * somlFrom() and samlFrom() do not wait for a response from the + * SMTP server but return immediately. + * + * @var bool + * @access public + */ + var $pipelining = false; + + /** + * Number of pipelined commands. + * @var int + * @access private + */ + var $_pipelined_commands = 0; + + /** + * Should debugging output be enabled? + * @var boolean + * @access private + */ + var $_debug = false; + + /** + * The socket resource being used to connect to the SMTP server. + * @var resource + * @access private + */ + var $_socket = null; + + /** + * The most recent server response code. + * @var int + * @access private + */ + var $_code = -1; + + /** + * The most recent server response arguments. + * @var array + * @access private + */ + var $_arguments = array(); + + /** + * Stores detected features of the SMTP server. + * @var array + * @access private + */ + var $_esmtp = array(); + + /** + * Instantiates a new Net_SMTP object, overriding any defaults + * with parameters that are passed in. + * + * If you have SSL support in PHP, you can connect to a server + * over SSL using an 'ssl://' prefix: + * + * // 465 is a common smtps port. + * $smtp = new Net_SMTP('ssl://mail.host.com', 465); + * $smtp->connect(); + * + * @param string $host The server to connect to. + * @param integer $port The port to connect to. + * @param string $localhost The value to give when sending EHLO or HELO. + * @param boolean $pipeling Use SMTP command pipelining + * + * @access public + * @since 1.0 + */ + function Net_SMTP($host = null, $port = null, $localhost = null, $pipelining = false) + { + if (isset($host)) { + $this->host = $host; + } + if (isset($port)) { + $this->port = $port; + } + if (isset($localhost)) { + $this->localhost = $localhost; + } + $this->pipelining = $pipelining; + + $this->_socket = new Net_Socket(); + + /* Include the Auth_SASL package. If the package is not + * available, we disable the authentication methods that + * depend upon it. */ + if ((@include_once 'Auth/SASL.php') === false) { + $pos = array_search('DIGEST-MD5', $this->auth_methods); + unset($this->auth_methods[$pos]); + $pos = array_search('CRAM-MD5', $this->auth_methods); + unset($this->auth_methods[$pos]); + } + } + + /** + * Set the value of the debugging flag. + * + * @param boolean $debug New value for the debugging flag. + * + * @access public + * @since 1.1.0 + */ + function setDebug($debug) + { + $this->_debug = $debug; + } + + /** + * Send the given string of data to the server. + * + * @param string $data The string of data to send. + * + * @return mixed True on success or a PEAR_Error object on failure. + * + * @access private + * @since 1.1.0 + */ + function _send($data) + { + if ($this->_debug) { + echo "DEBUG: Send: $data\n"; + } + + if (PEAR::isError($error = $this->_socket->write($data))) { + return PEAR::raiseError('Failed to write to socket: ' . + $error->getMessage()); + } + + return true; + } + + /** + * Send a command to the server with an optional string of + * arguments. A carriage return / linefeed (CRLF) sequence will + * be appended to each command string before it is sent to the + * SMTP server - an error will be thrown if the command string + * already contains any newline characters. Use _send() for + * commands that must contain newlines. + * + * @param string $command The SMTP command to send to the server. + * @param string $args A string of optional arguments to append + * to the command. + * + * @return mixed The result of the _send() call. + * + * @access private + * @since 1.1.0 + */ + function _put($command, $args = '') + { + if (!empty($args)) { + $command .= ' ' . $args; + } + + if (strcspn($command, "\r\n") !== strlen($command)) { + return PEAR::raiseError('Commands cannot contain newlines'); + } + + return $this->_send($command . "\r\n"); + } + + /** + * Read a reply from the SMTP server. The reply consists of a response + * code and a response message. + * + * @param mixed $valid The set of valid response codes. These + * may be specified as an array of integer + * values or as a single integer value. + * @param bool $later Do not parse the response now, but wait + * until the last command in the pipelined + * command group + * + * @return mixed True if the server returned a valid response code or + * a PEAR_Error object is an error condition is reached. + * + * @access private + * @since 1.1.0 + * + * @see getResponse + */ + function _parseResponse($valid, $later = false) + { + $this->_code = -1; + $this->_arguments = array(); + + if ($later) { + $this->_pipelined_commands++; + return true; + } + + for ($i = 0; $i <= $this->_pipelined_commands; $i++) { + while ($line = $this->_socket->readLine()) { + if ($this->_debug) { + echo "DEBUG: Recv: $line\n"; + } + + /* If we receive an empty line, the connection has been closed. */ + if (empty($line)) { + $this->disconnect(); + return PEAR::raiseError('Connection was unexpectedly closed'); + } + + /* Read the code and store the rest in the arguments array. */ + $code = substr($line, 0, 3); + $this->_arguments[] = trim(substr($line, 4)); + + /* Check the syntax of the response code. */ + if (is_numeric($code)) { + $this->_code = (int)$code; + } else { + $this->_code = -1; + break; + } + + /* If this is not a multiline response, we're done. */ + if (substr($line, 3, 1) != '-') { + break; + } + } + } + + $this->_pipelined_commands = 0; + + /* Compare the server's response code with the valid code/codes. */ + if (is_int($valid) && ($this->_code === $valid)) { + return true; + } elseif (is_array($valid) && in_array($this->_code, $valid, true)) { + return true; + } + + return PEAR::raiseError('Invalid response code received from server', + $this->_code); + } + + /** + * Return a 2-tuple containing the last response from the SMTP server. + * + * @return array A two-element array: the first element contains the + * response code as an integer and the second element + * contains the response's arguments as a string. + * + * @access public + * @since 1.1.0 + */ + function getResponse() + { + return array($this->_code, join("\n", $this->_arguments)); + } + + /** + * Attempt to connect to the SMTP server. + * + * @param int $timeout The timeout value (in seconds) for the + * socket connection. + * @param bool $persistent Should a persistent socket connection + * be used? + * + * @return mixed Returns a PEAR_Error with an error message on any + * kind of failure, or true on success. + * @access public + * @since 1.0 + */ + function connect($timeout = null, $persistent = false) + { + $result = $this->_socket->connect($this->host, $this->port, + $persistent, $timeout); + if (PEAR::isError($result)) { + return PEAR::raiseError('Failed to connect socket: ' . + $result->getMessage()); + } + + if (PEAR::isError($error = $this->_parseResponse(220))) { + return $error; + } + if (PEAR::isError($error = $this->_negotiate())) { + return $error; + } + + return true; + } + + /** + * Attempt to disconnect from the SMTP server. + * + * @return mixed Returns a PEAR_Error with an error message on any + * kind of failure, or true on success. + * @access public + * @since 1.0 + */ + function disconnect() + { + if (PEAR::isError($error = $this->_put('QUIT'))) { + return $error; + } + if (PEAR::isError($error = $this->_parseResponse(221))) { + return $error; + } + if (PEAR::isError($error = $this->_socket->disconnect())) { + return PEAR::raiseError('Failed to disconnect socket: ' . + $error->getMessage()); + } + + return true; + } + + /** + * Attempt to send the EHLO command and obtain a list of ESMTP + * extensions available, and failing that just send HELO. + * + * @return mixed Returns a PEAR_Error with an error message on any + * kind of failure, or true on success. + * + * @access private + * @since 1.1.0 + */ + function _negotiate() + { + if (PEAR::isError($error = $this->_put('EHLO', $this->localhost))) { + return $error; + } + + if (PEAR::isError($this->_parseResponse(250))) { + /* If we receive a 503 response, we're already authenticated. */ + if ($this->_code === 503) { + return true; + } + + /* If the EHLO failed, try the simpler HELO command. */ + if (PEAR::isError($error = $this->_put('HELO', $this->localhost))) { + return $error; + } + if (PEAR::isError($this->_parseResponse(250))) { + return PEAR::raiseError('HELO was not accepted: ', $this->_code); + } + + return true; + } + + foreach ($this->_arguments as $argument) { + $verb = strtok($argument, ' '); + $arguments = substr($argument, strlen($verb) + 1, + strlen($argument) - strlen($verb) - 1); + $this->_esmtp[$verb] = $arguments; + } + + if (!isset($this->_esmtp['PIPELINING'])) { + $this->pipelining = false; + } + + return true; + } + + /** + * Returns the name of the best authentication method that the server + * has advertised. + * + * @return mixed Returns a string containing the name of the best + * supported authentication method or a PEAR_Error object + * if a failure condition is encountered. + * @access private + * @since 1.1.0 + */ + function _getBestAuthMethod() + { + $available_methods = explode(' ', $this->_esmtp['AUTH']); + + foreach ($this->auth_methods as $method) { + if (in_array($method, $available_methods)) { + return $method; + } + } + + return PEAR::raiseError('No supported authentication methods'); + } + + /** + * Attempt to do SMTP authentication. + * + * @param string The userid to authenticate as. + * @param string The password to authenticate with. + * @param string The requested authentication method. If none is + * specified, the best supported method will be used. + * + * @return mixed Returns a PEAR_Error with an error message on any + * kind of failure, or true on success. + * @access public + * @since 1.0 + */ + function auth($uid, $pwd , $method = '') + { + if (empty($this->_esmtp['AUTH'])) { + if (version_compare(PHP_VERSION, '5.1.0', '>=')) { + if (!isset($this->_esmtp['STARTTLS'])) { + return PEAR::raiseError('SMTP server does not support authentication'); + } + if (PEAR::isError($result = $this->_put('STARTTLS'))) { + return $result; + } + if (PEAR::isError($result = $this->_parseResponse(220))) { + return $result; + } + if (PEAR::isError($result = $this->_socket->enableCrypto(true, STREAM_CRYPTO_METHOD_TLS_CLIENT))) { + return $result; + } elseif ($result !== true) { + return PEAR::raiseError('STARTTLS failed'); + } + + /* Send EHLO again to recieve the AUTH string from the + * SMTP server. */ + $this->_negotiate(); + if (empty($this->_esmtp['AUTH'])) { + return PEAR::raiseError('SMTP server does not support authentication'); + } + } else { + return PEAR::raiseError('SMTP server does not support authentication'); + } + } + + /* If no method has been specified, get the name of the best + * supported method advertised by the SMTP server. */ + if (empty($method)) { + if (PEAR::isError($method = $this->_getBestAuthMethod())) { + /* Return the PEAR_Error object from _getBestAuthMethod(). */ + return $method; + } + } else { + $method = strtoupper($method); + if (!in_array($method, $this->auth_methods)) { + return PEAR::raiseError("$method is not a supported authentication method"); + } + } + + switch ($method) { + case 'DIGEST-MD5': + $result = $this->_authDigest_MD5($uid, $pwd); + break; + + case 'CRAM-MD5': + $result = $this->_authCRAM_MD5($uid, $pwd); + break; + + case 'LOGIN': + $result = $this->_authLogin($uid, $pwd); + break; + + case 'PLAIN': + $result = $this->_authPlain($uid, $pwd); + break; + + default: + $result = PEAR::raiseError("$method is not a supported authentication method"); + break; + } + + /* If an error was encountered, return the PEAR_Error object. */ + if (PEAR::isError($result)) { + return $result; + } + + return true; + } + + /** + * Authenticates the user using the DIGEST-MD5 method. + * + * @param string The userid to authenticate as. + * @param string The password to authenticate with. + * + * @return mixed Returns a PEAR_Error with an error message on any + * kind of failure, or true on success. + * @access private + * @since 1.1.0 + */ + function _authDigest_MD5($uid, $pwd) + { + if (PEAR::isError($error = $this->_put('AUTH', 'DIGEST-MD5'))) { + return $error; + } + /* 334: Continue authentication request */ + if (PEAR::isError($error = $this->_parseResponse(334))) { + /* 503: Error: already authenticated */ + if ($this->_code === 503) { + return true; + } + return $error; + } + + $challenge = base64_decode($this->_arguments[0]); + $digest = &Auth_SASL::factory('digestmd5'); + $auth_str = base64_encode($digest->getResponse($uid, $pwd, $challenge, + $this->host, "smtp")); + + if (PEAR::isError($error = $this->_put($auth_str))) { + return $error; + } + /* 334: Continue authentication request */ + if (PEAR::isError($error = $this->_parseResponse(334))) { + return $error; + } + + /* We don't use the protocol's third step because SMTP doesn't + * allow subsequent authentication, so we just silently ignore + * it. */ + if (PEAR::isError($error = $this->_put(''))) { + return $error; + } + /* 235: Authentication successful */ + if (PEAR::isError($error = $this->_parseResponse(235))) { + return $error; + } + } + + /** + * Authenticates the user using the CRAM-MD5 method. + * + * @param string The userid to authenticate as. + * @param string The password to authenticate with. + * + * @return mixed Returns a PEAR_Error with an error message on any + * kind of failure, or true on success. + * @access private + * @since 1.1.0 + */ + function _authCRAM_MD5($uid, $pwd) + { + if (PEAR::isError($error = $this->_put('AUTH', 'CRAM-MD5'))) { + return $error; + } + /* 334: Continue authentication request */ + if (PEAR::isError($error = $this->_parseResponse(334))) { + /* 503: Error: already authenticated */ + if ($this->_code === 503) { + return true; + } + return $error; + } + + $challenge = base64_decode($this->_arguments[0]); + $cram = &Auth_SASL::factory('crammd5'); + $auth_str = base64_encode($cram->getResponse($uid, $pwd, $challenge)); + + if (PEAR::isError($error = $this->_put($auth_str))) { + return $error; + } + + /* 235: Authentication successful */ + if (PEAR::isError($error = $this->_parseResponse(235))) { + return $error; + } + } + + /** + * Authenticates the user using the LOGIN method. + * + * @param string The userid to authenticate as. + * @param string The password to authenticate with. + * + * @return mixed Returns a PEAR_Error with an error message on any + * kind of failure, or true on success. + * @access private + * @since 1.1.0 + */ + function _authLogin($uid, $pwd) + { + if (PEAR::isError($error = $this->_put('AUTH', 'LOGIN'))) { + return $error; + } + /* 334: Continue authentication request */ + if (PEAR::isError($error = $this->_parseResponse(334))) { + /* 503: Error: already authenticated */ + if ($this->_code === 503) { + return true; + } + return $error; + } + + if (PEAR::isError($error = $this->_put(base64_encode($uid)))) { + return $error; + } + /* 334: Continue authentication request */ + if (PEAR::isError($error = $this->_parseResponse(334))) { + return $error; + } + + if (PEAR::isError($error = $this->_put(base64_encode($pwd)))) { + return $error; + } + + /* 235: Authentication successful */ + if (PEAR::isError($error = $this->_parseResponse(235))) { + return $error; + } + + return true; + } + + /** + * Authenticates the user using the PLAIN method. + * + * @param string The userid to authenticate as. + * @param string The password to authenticate with. + * + * @return mixed Returns a PEAR_Error with an error message on any + * kind of failure, or true on success. + * @access private + * @since 1.1.0 + */ + function _authPlain($uid, $pwd) + { + if (PEAR::isError($error = $this->_put('AUTH', 'PLAIN'))) { + return $error; + } + /* 334: Continue authentication request */ + if (PEAR::isError($error = $this->_parseResponse(334))) { + /* 503: Error: already authenticated */ + if ($this->_code === 503) { + return true; + } + return $error; + } + + $auth_str = base64_encode(chr(0) . $uid . chr(0) . $pwd); + + if (PEAR::isError($error = $this->_put($auth_str))) { + return $error; + } + + /* 235: Authentication successful */ + if (PEAR::isError($error = $this->_parseResponse(235))) { + return $error; + } + + return true; + } + + /** + * Send the HELO command. + * + * @param string The domain name to say we are. + * + * @return mixed Returns a PEAR_Error with an error message on any + * kind of failure, or true on success. + * @access public + * @since 1.0 + */ + function helo($domain) + { + if (PEAR::isError($error = $this->_put('HELO', $domain))) { + return $error; + } + if (PEAR::isError($error = $this->_parseResponse(250))) { + return $error; + } + + return true; + } + + /** + * Return the list of SMTP service extensions advertised by the server. + * + * @return array The list of SMTP service extensions. + * @access public + * @since 1.3 + */ + function getServiceExtensions() + { + return $this->_esmtp; + } + + /** + * Send the MAIL FROM: command. + * + * @param string $sender The sender (reverse path) to set. + * @param string $params String containing additional MAIL parameters, + * such as the NOTIFY flags defined by RFC 1891 + * or the VERP protocol. + * + * If $params is an array, only the 'verp' option + * is supported. If 'verp' is true, the XVERP + * parameter is appended to the MAIL command. If + * the 'verp' value is a string, the full + * XVERP=value parameter is appended. + * + * @return mixed Returns a PEAR_Error with an error message on any + * kind of failure, or true on success. + * @access public + * @since 1.0 + */ + function mailFrom($sender, $params = null) + { + $args = "FROM:<$sender>"; + + /* Support the deprecated array form of $params. */ + if (is_array($params) && isset($params['verp'])) { + /* XVERP */ + if ($params['verp'] === true) { + $args .= ' XVERP'; + + /* XVERP=something */ + } elseif (trim($params['verp'])) { + $args .= ' XVERP=' . $params['verp']; + } + } elseif (is_string($params)) { + $args .= ' ' . $params; + } + + if (PEAR::isError($error = $this->_put('MAIL', $args))) { + return $error; + } + if (PEAR::isError($error = $this->_parseResponse(250, $this->pipelining))) { + return $error; + } + + return true; + } + + /** + * Send the RCPT TO: command. + * + * @param string $recipient The recipient (forward path) to add. + * @param string $params String containing additional RCPT parameters, + * such as the NOTIFY flags defined by RFC 1891. + * + * @return mixed Returns a PEAR_Error with an error message on any + * kind of failure, or true on success. + * + * @access public + * @since 1.0 + */ + function rcptTo($recipient, $params = null) + { + $args = "TO:<$recipient>"; + if (is_string($params)) { + $args .= ' ' . $params; + } + + if (PEAR::isError($error = $this->_put('RCPT', $args))) { + return $error; + } + if (PEAR::isError($error = $this->_parseResponse(array(250, 251), $this->pipelining))) { + return $error; + } + + return true; + } + + /** + * Quote the data so that it meets SMTP standards. + * + * This is provided as a separate public function to facilitate + * easier overloading for the cases where it is desirable to + * customize the quoting behavior. + * + * @param string $data The message text to quote. The string must be passed + * by reference, and the text will be modified in place. + * + * @access public + * @since 1.2 + */ + function quotedata(&$data) + { + /* Change Unix (\n) and Mac (\r) linefeeds into + * Internet-standard CRLF (\r\n) linefeeds. */ + $data = preg_replace(array('/(?_esmtp['SIZE']) && ($this->_esmtp['SIZE'] > 0)) { + if (strlen($data) >= $this->_esmtp['SIZE']) { + $this->disconnect(); + return PEAR::raiseError('Message size excedes the server limit'); + } + } + + /* Quote the data based on the SMTP standards. */ + $this->quotedata($data); + + if (PEAR::isError($error = $this->_put('DATA'))) { + return $error; + } + if (PEAR::isError($error = $this->_parseResponse(354))) { + return $error; + } + + if (PEAR::isError($result = $this->_send($data . "\r\n.\r\n"))) { + return $result; + } + if (PEAR::isError($error = $this->_parseResponse(250, $this->pipelining))) { + return $error; + } + + return true; + } + + /** + * Send the SEND FROM: command. + * + * @param string The reverse path to send. + * + * @return mixed Returns a PEAR_Error with an error message on any + * kind of failure, or true on success. + * @access public + * @since 1.2.6 + */ + function sendFrom($path) + { + if (PEAR::isError($error = $this->_put('SEND', "FROM:<$path>"))) { + return $error; + } + if (PEAR::isError($error = $this->_parseResponse(250, $this->pipelining))) { + return $error; + } + + return true; + } + + /** + * Backwards-compatibility wrapper for sendFrom(). + * + * @param string The reverse path to send. + * + * @return mixed Returns a PEAR_Error with an error message on any + * kind of failure, or true on success. + * + * @access public + * @since 1.0 + * @deprecated 1.2.6 + */ + function send_from($path) + { + return sendFrom($path); + } + + /** + * Send the SOML FROM: command. + * + * @param string The reverse path to send. + * + * @return mixed Returns a PEAR_Error with an error message on any + * kind of failure, or true on success. + * @access public + * @since 1.2.6 + */ + function somlFrom($path) + { + if (PEAR::isError($error = $this->_put('SOML', "FROM:<$path>"))) { + return $error; + } + if (PEAR::isError($error = $this->_parseResponse(250, $this->pipelining))) { + return $error; + } + + return true; + } + + /** + * Backwards-compatibility wrapper for somlFrom(). + * + * @param string The reverse path to send. + * + * @return mixed Returns a PEAR_Error with an error message on any + * kind of failure, or true on success. + * + * @access public + * @since 1.0 + * @deprecated 1.2.6 + */ + function soml_from($path) + { + return somlFrom($path); + } + + /** + * Send the SAML FROM: command. + * + * @param string The reverse path to send. + * + * @return mixed Returns a PEAR_Error with an error message on any + * kind of failure, or true on success. + * @access public + * @since 1.2.6 + */ + function samlFrom($path) + { + if (PEAR::isError($error = $this->_put('SAML', "FROM:<$path>"))) { + return $error; + } + if (PEAR::isError($error = $this->_parseResponse(250, $this->pipelining))) { + return $error; + } + + return true; + } + + /** + * Backwards-compatibility wrapper for samlFrom(). + * + * @param string The reverse path to send. + * + * @return mixed Returns a PEAR_Error with an error message on any + * kind of failure, or true on success. + * + * @access public + * @since 1.0 + * @deprecated 1.2.6 + */ + function saml_from($path) + { + return samlFrom($path); + } + + /** + * Send the RSET command. + * + * @return mixed Returns a PEAR_Error with an error message on any + * kind of failure, or true on success. + * @access public + * @since 1.0 + */ + function rset() + { + if (PEAR::isError($error = $this->_put('RSET'))) { + return $error; + } + if (PEAR::isError($error = $this->_parseResponse(250, $this->pipelining))) { + return $error; + } + + return true; + } + + /** + * Send the VRFY command. + * + * @param string The string to verify + * + * @return mixed Returns a PEAR_Error with an error message on any + * kind of failure, or true on success. + * @access public + * @since 1.0 + */ + function vrfy($string) + { + /* Note: 251 is also a valid response code */ + if (PEAR::isError($error = $this->_put('VRFY', $string))) { + return $error; + } + if (PEAR::isError($error = $this->_parseResponse(array(250, 252)))) { + return $error; + } + + return true; + } + + /** + * Send the NOOP command. + * + * @return mixed Returns a PEAR_Error with an error message on any + * kind of failure, or true on success. + * @access public + * @since 1.0 + */ + function noop() + { + if (PEAR::isError($error = $this->_put('NOOP'))) { + return $error; + } + if (PEAR::isError($error = $this->_parseResponse(250))) { + return $error; + } + + return true; + } + + /** + * Backwards-compatibility method. identifySender()'s functionality is + * now handled internally. + * + * @return boolean This method always return true. + * + * @access public + * @since 1.0 + */ + function identifySender() + { + return true; + } + +} diff --git a/thirdparty/pear/Net/Socket.php b/thirdparty/pear/Net/Socket.php new file mode 100644 index 000000000..d7a049566 --- /dev/null +++ b/thirdparty/pear/Net/Socket.php @@ -0,0 +1,576 @@ + | +// | Chuck Hagenbuch | +// +----------------------------------------------------------------------+ +// +// $Id: Socket.php,v 1.31 2007/05/04 04:30:29 chagenbu Exp $ + +require_once 'PEAR.php'; + +define('NET_SOCKET_READ', 1); +define('NET_SOCKET_WRITE', 2); +define('NET_SOCKET_ERROR', 4); + +/** + * Generalized Socket class. + * + * @version 1.1 + * @author Stig Bakken + * @author Chuck Hagenbuch + */ +class Net_Socket extends PEAR { + + /** + * Socket file pointer. + * @var resource $fp + */ + var $fp = null; + + /** + * Whether the socket is blocking. Defaults to true. + * @var boolean $blocking + */ + var $blocking = true; + + /** + * Whether the socket is persistent. Defaults to false. + * @var boolean $persistent + */ + var $persistent = false; + + /** + * The IP address to connect to. + * @var string $addr + */ + var $addr = ''; + + /** + * The port number to connect to. + * @var integer $port + */ + var $port = 0; + + /** + * Number of seconds to wait on socket connections before assuming + * there's no more data. Defaults to no timeout. + * @var integer $timeout + */ + var $timeout = false; + + /** + * Number of bytes to read at a time in readLine() and + * readAll(). Defaults to 2048. + * @var integer $lineLength + */ + var $lineLength = 2048; + + /** + * Connect to the specified port. If called when the socket is + * already connected, it disconnects and connects again. + * + * @param string $addr IP address or host name. + * @param integer $port TCP port number. + * @param boolean $persistent (optional) Whether the connection is + * persistent (kept open between requests + * by the web server). + * @param integer $timeout (optional) How long to wait for data. + * @param array $options See options for stream_context_create. + * + * @access public + * + * @return boolean | PEAR_Error True on success or a PEAR_Error on failure. + */ + function connect($addr, $port = 0, $persistent = null, $timeout = null, $options = null) + { + if (is_resource($this->fp)) { + @fclose($this->fp); + $this->fp = null; + } + + if (!$addr) { + return $this->raiseError('$addr cannot be empty'); + } elseif (strspn($addr, '.0123456789') == strlen($addr) || + strstr($addr, '/') !== false) { + $this->addr = $addr; + } else { + $this->addr = @gethostbyname($addr); + } + + $this->port = $port % 65536; + + if ($persistent !== null) { + $this->persistent = $persistent; + } + + if ($timeout !== null) { + $this->timeout = $timeout; + } + + $openfunc = $this->persistent ? 'pfsockopen' : 'fsockopen'; + $errno = 0; + $errstr = ''; + if ($options && function_exists('stream_context_create')) { + if ($this->timeout) { + $timeout = $this->timeout; + } else { + $timeout = 0; + } + $context = stream_context_create($options); + $fp = @$openfunc($this->addr, $this->port, $errno, $errstr, $timeout, $context); + } else { + if ($this->timeout) { + $fp = @$openfunc($this->addr, $this->port, $errno, $errstr, $this->timeout); + } else { + $fp = @$openfunc($this->addr, $this->port, $errno, $errstr); + } + } + + if (!$fp) { + return $this->raiseError($errstr, $errno); + } + + $this->fp = $fp; + + return $this->setBlocking($this->blocking); + } + + /** + * Disconnects from the peer, closes the socket. + * + * @access public + * @return mixed true on success or an error object otherwise + */ + function disconnect() + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + @fclose($this->fp); + $this->fp = null; + return true; + } + + /** + * Find out if the socket is in blocking mode. + * + * @access public + * @return boolean The current blocking mode. + */ + function isBlocking() + { + return $this->blocking; + } + + /** + * Sets whether the socket connection should be blocking or + * not. A read call to a non-blocking socket will return immediately + * if there is no data available, whereas it will block until there + * is data for blocking sockets. + * + * @param boolean $mode True for blocking sockets, false for nonblocking. + * @access public + * @return mixed true on success or an error object otherwise + */ + function setBlocking($mode) + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + $this->blocking = $mode; + socket_set_blocking($this->fp, $this->blocking); + return true; + } + + /** + * Sets the timeout value on socket descriptor, + * expressed in the sum of seconds and microseconds + * + * @param integer $seconds Seconds. + * @param integer $microseconds Microseconds. + * @access public + * @return mixed true on success or an error object otherwise + */ + function setTimeout($seconds, $microseconds) + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + return socket_set_timeout($this->fp, $seconds, $microseconds); + } + + /** + * Sets the file buffering size on the stream. + * See php's stream_set_write_buffer for more information. + * + * @param integer $size Write buffer size. + * @access public + * @return mixed on success or an PEAR_Error object otherwise + */ + function setWriteBuffer($size) + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + $returned = stream_set_write_buffer($this->fp, $code); + if ($returned == 0) { + return true; + } + return $this->raiseError('Cannot set write buffer.'); + } + + /** + * Returns information about an existing socket resource. + * Currently returns four entries in the result array: + * + *

    + * timed_out (bool) - The socket timed out waiting for data
    + * blocked (bool) - The socket was blocked
    + * eof (bool) - Indicates EOF event
    + * unread_bytes (int) - Number of bytes left in the socket buffer
    + *

    + * + * @access public + * @return mixed Array containing information about existing socket resource or an error object otherwise + */ + function getStatus() + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + return socket_get_status($this->fp); + } + + /** + * Get a specified line of data + * + * @access public + * @return $size bytes of data from the socket, or a PEAR_Error if + * not connected. + */ + function gets($size) + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + return @fgets($this->fp, $size); + } + + /** + * Read a specified amount of data. This is guaranteed to return, + * and has the added benefit of getting everything in one fread() + * chunk; if you know the size of the data you're getting + * beforehand, this is definitely the way to go. + * + * @param integer $size The number of bytes to read from the socket. + * @access public + * @return $size bytes of data from the socket, or a PEAR_Error if + * not connected. + */ + function read($size) + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + return @fread($this->fp, $size); + } + + /** + * Write a specified amount of data. + * + * @param string $data Data to write. + * @param integer $blocksize Amount of data to write at once. + * NULL means all at once. + * + * @access public + * @return mixed true on success or an error object otherwise + */ + function write($data, $blocksize = null) + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + if (is_null($blocksize) && !OS_WINDOWS) { + return fwrite($this->fp, $data); + } else { + if (is_null($blocksize)) { + $blocksize = 1024; + } + + $pos = 0; + $size = strlen($data); + while ($pos < $size) { + $written = @fwrite($this->fp, substr($data, $pos, $blocksize)); + if ($written === false) { + return false; + } + $pos += $written; + } + + return $pos; + } + } + + /** + * Write a line of data to the socket, followed by a trailing "\r\n". + * + * @access public + * @return mixed fputs result, or an error + */ + function writeLine($data) + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + return fwrite($this->fp, $data . "\r\n"); + } + + /** + * Tests for end-of-file on a socket descriptor. + * + * Also returns true if the socket is disconnected. + * + * @access public + * @return bool + */ + function eof() + { + return (!is_resource($this->fp) || feof($this->fp)); + } + + /** + * Reads a byte of data + * + * @access public + * @return 1 byte of data from the socket, or a PEAR_Error if + * not connected. + */ + function readByte() + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + return ord(@fread($this->fp, 1)); + } + + /** + * Reads a word of data + * + * @access public + * @return 1 word of data from the socket, or a PEAR_Error if + * not connected. + */ + function readWord() + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + $buf = @fread($this->fp, 2); + return (ord($buf[0]) + (ord($buf[1]) << 8)); + } + + /** + * Reads an int of data + * + * @access public + * @return integer 1 int of data from the socket, or a PEAR_Error if + * not connected. + */ + function readInt() + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + $buf = @fread($this->fp, 4); + return (ord($buf[0]) + (ord($buf[1]) << 8) + + (ord($buf[2]) << 16) + (ord($buf[3]) << 24)); + } + + /** + * Reads a zero-terminated string of data + * + * @access public + * @return string, or a PEAR_Error if + * not connected. + */ + function readString() + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + $string = ''; + while (($char = @fread($this->fp, 1)) != "\x00") { + $string .= $char; + } + return $string; + } + + /** + * Reads an IP Address and returns it in a dot formated string + * + * @access public + * @return Dot formated string, or a PEAR_Error if + * not connected. + */ + function readIPAddress() + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + $buf = @fread($this->fp, 4); + return sprintf("%s.%s.%s.%s", ord($buf[0]), ord($buf[1]), + ord($buf[2]), ord($buf[3])); + } + + /** + * Read until either the end of the socket or a newline, whichever + * comes first. Strips the trailing newline from the returned data. + * + * @access public + * @return All available data up to a newline, without that + * newline, or until the end of the socket, or a PEAR_Error if + * not connected. + */ + function readLine() + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + $line = ''; + $timeout = time() + $this->timeout; + while (!feof($this->fp) && (!$this->timeout || time() < $timeout)) { + $line .= @fgets($this->fp, $this->lineLength); + if (substr($line, -1) == "\n") { + return rtrim($line, "\r\n"); + } + } + return $line; + } + + /** + * Read until the socket closes, or until there is no more data in + * the inner PHP buffer. If the inner buffer is empty, in blocking + * mode we wait for at least 1 byte of data. Therefore, in + * blocking mode, if there is no data at all to be read, this + * function will never exit (unless the socket is closed on the + * remote end). + * + * @access public + * + * @return string All data until the socket closes, or a PEAR_Error if + * not connected. + */ + function readAll() + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + $data = ''; + while (!feof($this->fp)) { + $data .= @fread($this->fp, $this->lineLength); + } + return $data; + } + + /** + * Runs the equivalent of the select() system call on the socket + * with a timeout specified by tv_sec and tv_usec. + * + * @param integer $state Which of read/write/error to check for. + * @param integer $tv_sec Number of seconds for timeout. + * @param integer $tv_usec Number of microseconds for timeout. + * + * @access public + * @return False if select fails, integer describing which of read/write/error + * are ready, or PEAR_Error if not connected. + */ + function select($state, $tv_sec, $tv_usec = 0) + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + $read = null; + $write = null; + $except = null; + if ($state & NET_SOCKET_READ) { + $read[] = $this->fp; + } + if ($state & NET_SOCKET_WRITE) { + $write[] = $this->fp; + } + if ($state & NET_SOCKET_ERROR) { + $except[] = $this->fp; + } + if (false === ($sr = stream_select($read, $write, $except, $tv_sec, $tv_usec))) { + return false; + } + + $result = 0; + if (count($read)) { + $result |= NET_SOCKET_READ; + } + if (count($write)) { + $result |= NET_SOCKET_WRITE; + } + if (count($except)) { + $result |= NET_SOCKET_ERROR; + } + return $result; + } + + /** + * Turns encryption on/off on a connected socket. + * + * @param bool $enabled Set this parameter to true to enable encryption + * and false to disable encryption. + * @param integer $type Type of encryption. See + * http://se.php.net/manual/en/function.stream-socket-enable-crypto.php for values. + * + * @access public + * @return false on error, true on success and 0 if there isn't enough data and the + * user should try again (non-blocking sockets only). A PEAR_Error object + * is returned if the socket is not connected + */ + function enableCrypto($enabled, $type) + { + if (version_compare(phpversion(), "5.1.0", ">=")) { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + return @stream_socket_enable_crypto($this->fp, $enabled, $type); + } else { + return $this->raiseError('Net_Socket::enableCrypto() requires php version >= 5.1.0'); + } + } + +} diff --git a/thirdparty/pear/Net/URL.php b/thirdparty/pear/Net/URL.php new file mode 100644 index 000000000..3dcfef60d --- /dev/null +++ b/thirdparty/pear/Net/URL.php @@ -0,0 +1,485 @@ + | +// +-----------------------------------------------------------------------+ +// +// $Id: URL.php,v 1.49 2007/06/28 14:43:07 davidc Exp $ +// +// Net_URL Class + + +class Net_URL +{ + var $options = array('encode_query_keys' => false); + /** + * Full url + * @var string + */ + var $url; + + /** + * Protocol + * @var string + */ + var $protocol; + + /** + * Username + * @var string + */ + var $username; + + /** + * Password + * @var string + */ + var $password; + + /** + * Host + * @var string + */ + var $host; + + /** + * Port + * @var integer + */ + var $port; + + /** + * Path + * @var string + */ + var $path; + + /** + * Query string + * @var array + */ + var $querystring; + + /** + * Anchor + * @var string + */ + var $anchor; + + /** + * Whether to use [] + * @var bool + */ + var $useBrackets; + + /** + * PHP4 Constructor + * + * @see __construct() + */ + function Net_URL($url = null, $useBrackets = true) + { + $this->__construct($url, $useBrackets); + } + + /** + * PHP5 Constructor + * + * Parses the given url and stores the various parts + * Defaults are used in certain cases + * + * @param string $url Optional URL + * @param bool $useBrackets Whether to use square brackets when + * multiple querystrings with the same name + * exist + */ + function __construct($url = null, $useBrackets = true) + { + $this->url = $url; + $this->useBrackets = $useBrackets; + + $this->initialize(); + } + + function initialize() + { + $HTTP_SERVER_VARS = !empty($_SERVER) ? $_SERVER : $GLOBALS['HTTP_SERVER_VARS']; + + $this->user = ''; + $this->pass = ''; + $this->host = ''; + $this->port = 80; + $this->path = ''; + $this->querystring = array(); + $this->anchor = ''; + + // Only use defaults if not an absolute URL given + if (!preg_match('/^[a-z0-9]+:\/\//i', $this->url)) { + $this->protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on' ? 'https' : 'http'); + + /** + * Figure out host/port + */ + if (!empty($HTTP_SERVER_VARS['HTTP_HOST']) && + preg_match('/^(.*)(:([0-9]+))?$/U', $HTTP_SERVER_VARS['HTTP_HOST'], $matches)) + { + $host = $matches[1]; + if (!empty($matches[3])) { + $port = $matches[3]; + } else { + $port = $this->getStandardPort($this->protocol); + } + } + + $this->user = ''; + $this->pass = ''; + $this->host = !empty($host) ? $host : (isset($HTTP_SERVER_VARS['SERVER_NAME']) ? $HTTP_SERVER_VARS['SERVER_NAME'] : 'localhost'); + $this->port = !empty($port) ? $port : (isset($HTTP_SERVER_VARS['SERVER_PORT']) ? $HTTP_SERVER_VARS['SERVER_PORT'] : $this->getStandardPort($this->protocol)); + $this->path = !empty($HTTP_SERVER_VARS['PHP_SELF']) ? $HTTP_SERVER_VARS['PHP_SELF'] : '/'; + $this->querystring = isset($HTTP_SERVER_VARS['QUERY_STRING']) ? $this->_parseRawQuerystring($HTTP_SERVER_VARS['QUERY_STRING']) : null; + $this->anchor = ''; + } + + // Parse the url and store the various parts + if (!empty($this->url)) { + $urlinfo = parse_url($this->url); + + // Default querystring + $this->querystring = array(); + + foreach ($urlinfo as $key => $value) { + switch ($key) { + case 'scheme': + $this->protocol = $value; + $this->port = $this->getStandardPort($value); + break; + + case 'user': + case 'pass': + case 'host': + case 'port': + $this->$key = $value; + break; + + case 'path': + if ($value{0} == '/') { + $this->path = $value; + } else { + $path = dirname($this->path) == DIRECTORY_SEPARATOR ? '' : dirname($this->path); + $this->path = sprintf('%s/%s', $path, $value); + } + break; + + case 'query': + $this->querystring = $this->_parseRawQueryString($value); + break; + + case 'fragment': + $this->anchor = $value; + break; + } + } + } + } + /** + * Returns full url + * + * @return string Full url + * @access public + */ + function getURL() + { + $querystring = $this->getQueryString(); + + $this->url = $this->protocol . '://' + . $this->user . (!empty($this->pass) ? ':' : '') + . $this->pass . (!empty($this->user) ? '@' : '') + . $this->host . ($this->port == $this->getStandardPort($this->protocol) ? '' : ':' . $this->port) + . $this->path + . (!empty($querystring) ? '?' . $querystring : '') + . (!empty($this->anchor) ? '#' . $this->anchor : ''); + + return $this->url; + } + + /** + * Adds or updates a querystring item (URL parameter). + * Automatically encodes parameters with rawurlencode() if $preencoded + * is false. + * You can pass an array to $value, it gets mapped via [] in the URL if + * $this->useBrackets is activated. + * + * @param string $name Name of item + * @param string $value Value of item + * @param bool $preencoded Whether value is urlencoded or not, default = not + * @access public + */ + function addQueryString($name, $value, $preencoded = false) + { + if ($this->getOption('encode_query_keys')) { + $name = rawurlencode($name); + } + + if ($preencoded) { + $this->querystring[$name] = $value; + } else { + $this->querystring[$name] = is_array($value) ? array_map('rawurlencode', $value): rawurlencode($value); + } + } + + /** + * Removes a querystring item + * + * @param string $name Name of item + * @access public + */ + function removeQueryString($name) + { + if ($this->getOption('encode_query_keys')) { + $name = rawurlencode($name); + } + + if (isset($this->querystring[$name])) { + unset($this->querystring[$name]); + } + } + + /** + * Sets the querystring to literally what you supply + * + * @param string $querystring The querystring data. Should be of the format foo=bar&x=y etc + * @access public + */ + function addRawQueryString($querystring) + { + $this->querystring = $this->_parseRawQueryString($querystring); + } + + /** + * Returns flat querystring + * + * @return string Querystring + * @access public + */ + function getQueryString() + { + if (!empty($this->querystring)) { + foreach ($this->querystring as $name => $value) { + // Encode var name + $name = rawurlencode($name); + + if (is_array($value)) { + foreach ($value as $k => $v) { + $querystring[] = $this->useBrackets ? sprintf('%s[%s]=%s', $name, $k, $v) : ($name . '=' . $v); + } + } elseif (!is_null($value)) { + $querystring[] = $name . '=' . $value; + } else { + $querystring[] = $name; + } + } + $querystring = implode(ini_get('arg_separator.output'), $querystring); + } else { + $querystring = ''; + } + + return $querystring; + } + + /** + * Parses raw querystring and returns an array of it + * + * @param string $querystring The querystring to parse + * @return array An array of the querystring data + * @access private + */ + function _parseRawQuerystring($querystring) + { + $parts = preg_split('/[' . preg_quote(ini_get('arg_separator.input'), '/') . ']/', $querystring, -1, PREG_SPLIT_NO_EMPTY); + $return = array(); + + foreach ($parts as $part) { + if (strpos($part, '=') !== false) { + $value = substr($part, strpos($part, '=') + 1); + $key = substr($part, 0, strpos($part, '=')); + } else { + $value = null; + $key = $part; + } + + if (!$this->getOption('encode_query_keys')) { + $key = rawurldecode($key); + } + + if (preg_match('#^(.*)\[([0-9a-z_-]*)\]#i', $key, $matches)) { + $key = $matches[1]; + $idx = $matches[2]; + + // Ensure is an array + if (empty($return[$key]) || !is_array($return[$key])) { + $return[$key] = array(); + } + + // Add data + if ($idx === '') { + $return[$key][] = $value; + } else { + $return[$key][$idx] = $value; + } + } elseif (!$this->useBrackets AND !empty($return[$key])) { + $return[$key] = (array)$return[$key]; + $return[$key][] = $value; + } else { + $return[$key] = $value; + } + } + + return $return; + } + + /** + * Resolves //, ../ and ./ from a path and returns + * the result. Eg: + * + * /foo/bar/../boo.php => /foo/boo.php + * /foo/bar/../../boo.php => /boo.php + * /foo/bar/.././/boo.php => /foo/boo.php + * + * This method can also be called statically. + * + * @param string $path URL path to resolve + * @return string The result + */ + function resolvePath($path) + { + $path = explode('/', str_replace('//', '/', $path)); + + for ($i=0; $i 1 OR ($i == 1 AND $path[0] != '') ) ) { + unset($path[$i]); + unset($path[$i-1]); + $path = array_values($path); + $i -= 2; + + } elseif ($path[$i] == '..' AND $i == 1 AND $path[0] == '') { + unset($path[$i]); + $path = array_values($path); + $i--; + + } else { + continue; + } + } + + return implode('/', $path); + } + + /** + * Returns the standard port number for a protocol + * + * @param string $scheme The protocol to lookup + * @return integer Port number or NULL if no scheme matches + * + * @author Philippe Jausions + */ + function getStandardPort($scheme) + { + switch (strtolower($scheme)) { + case 'http': return 80; + case 'https': return 443; + case 'ftp': return 21; + case 'imap': return 143; + case 'imaps': return 993; + case 'pop3': return 110; + case 'pop3s': return 995; + default: return null; + } + } + + /** + * Forces the URL to a particular protocol + * + * @param string $protocol Protocol to force the URL to + * @param integer $port Optional port (standard port is used by default) + */ + function setProtocol($protocol, $port = null) + { + $this->protocol = $protocol; + $this->port = is_null($port) ? $this->getStandardPort($protocol) : $port; + } + + /** + * Set an option + * + * This function set an option + * to be used thorough the script. + * + * @access public + * @param string $optionName The optionname to set + * @param string $value The value of this option. + */ + function setOption($optionName, $value) + { + if (!array_key_exists($optionName, $this->options)) { + return false; + } + + $this->options[$optionName] = $value; + $this->initialize(); + } + + /** + * Get an option + * + * This function gets an option + * from the $this->options array + * and return it's value. + * + * @access public + * @param string $opionName The name of the option to retrieve + * @see $this->options + */ + function getOption($optionName) + { + if (!isset($this->options[$optionName])) { + return false; + } + + return $this->options[$optionName]; + } + +} +?> diff --git a/thirdparty/pear/Net/URL2.php b/thirdparty/pear/Net/URL2.php new file mode 100644 index 000000000..7a654aed8 --- /dev/null +++ b/thirdparty/pear/Net/URL2.php @@ -0,0 +1,813 @@ + | +// +-----------------------------------------------------------------------+ +// +// $Id: URL2.php,v 1.10 2008/04/26 21:57:08 schmidt Exp $ +// +// Net_URL2 Class (PHP5 Only) + +// This code is released under the BSD License - http://www.opensource.org/licenses/bsd-license.php +/** + * @license BSD License + */ +class Net_URL2 +{ + /** + * Do strict parsing in resolve() (see RFC 3986, section 5.2.2). Default + * is true. + */ + const OPTION_STRICT = 'strict'; + + /** + * Represent arrays in query using PHP's [] notation. Default is true. + */ + const OPTION_USE_BRACKETS = 'use_brackets'; + + /** + * URL-encode query variable keys. Default is true. + */ + const OPTION_ENCODE_KEYS = 'encode_keys'; + + /** + * Query variable separators when parsing the query string. Every character + * is considered a separator. Default is specified by the + * arg_separator.input php.ini setting (this defaults to "&"). + */ + const OPTION_SEPARATOR_INPUT = 'input_separator'; + + /** + * Query variable separator used when generating the query string. Default + * is specified by the arg_separator.output php.ini setting (this defaults + * to "&"). + */ + const OPTION_SEPARATOR_OUTPUT = 'output_separator'; + + /** + * Default options corresponds to how PHP handles $_GET. + */ + private $options = array( + self::OPTION_STRICT => true, + self::OPTION_USE_BRACKETS => true, + self::OPTION_ENCODE_KEYS => true, + self::OPTION_SEPARATOR_INPUT => 'x&', + self::OPTION_SEPARATOR_OUTPUT => 'x&', + ); + + /** + * @var string|bool + */ + private $scheme = false; + + /** + * @var string|bool + */ + private $userinfo = false; + + /** + * @var string|bool + */ + private $host = false; + + /** + * @var int|bool + */ + private $port = false; + + /** + * @var string + */ + private $path = ''; + + /** + * @var string|bool + */ + private $query = false; + + /** + * @var string|bool + */ + private $fragment = false; + + /** + * @param string $url an absolute or relative URL + * @param array $options + */ + public function __construct($url, $options = null) + { + $this->setOption(self::OPTION_SEPARATOR_INPUT, + ini_get('arg_separator.input')); + $this->setOption(self::OPTION_SEPARATOR_OUTPUT, + ini_get('arg_separator.output')); + if (is_array($options)) { + foreach ($options as $optionName => $value) { + $this->setOption($optionName); + } + } + + if (preg_match('@^([a-z][a-z0-9.+-]*):@i', $url, $reg)) { + $this->scheme = $reg[1]; + $url = substr($url, strlen($reg[0])); + } + + if (preg_match('@^//([^/#?]+)@', $url, $reg)) { + $this->setAuthority($reg[1]); + $url = substr($url, strlen($reg[0])); + } + + $i = strcspn($url, '?#'); + $this->path = substr($url, 0, $i); + $url = substr($url, $i); + + if (preg_match('@^\?([^#]*)@', $url, $reg)) { + $this->query = $reg[1]; + $url = substr($url, strlen($reg[0])); + } + + if ($url) { + $this->fragment = substr($url, 1); + } + } + + /** + * Returns the scheme, e.g. "http" or "urn", or false if there is no + * scheme specified, i.e. if this is a relative URL. + * + * @return string|bool + */ + public function getScheme() + { + return $this->scheme; + } + + /** + * @param string|bool $scheme + * + * @return void + * @see getScheme() + */ + public function setScheme($scheme) + { + $this->scheme = $scheme; + } + + /** + * Returns the user part of the userinfo part (the part preceding the first + * ":"), or false if there is no userinfo part. + * + * @return string|bool + */ + public function getUser() + { + return $this->userinfo !== false ? preg_replace('@:.*$@', '', $this->userinfo) : false; + } + + /** + * Returns the password part of the userinfo part (the part after the first + * ":"), or false if there is no userinfo part (i.e. the URL does not + * contain "@" in front of the hostname) or the userinfo part does not + * contain ":". + * + * @return string|bool + */ + public function getPassword() + { + return $this->userinfo !== false ? substr(strstr($this->userinfo, ':'), 1) : false; + } + + /** + * Returns the userinfo part, or false if there is none, i.e. if the + * authority part does not contain "@". + * + * @return string|bool + */ + public function getUserinfo() + { + return $this->userinfo; + } + + /** + * Sets the userinfo part. If two arguments are passed, they are combined + * in the userinfo part as username ":" password. + * + * @param string|bool $userinfo userinfo or username + * @param string|bool $password + * + * @return void + */ + public function setUserinfo($userinfo, $password = false) + { + $this->userinfo = $userinfo; + if ($password !== false) { + $this->userinfo .= ':' . $password; + } + } + + /** + * Returns the host part, or false if there is no authority part, e.g. + * relative URLs. + * + * @return string|bool + */ + public function getHost() + { + return $this->host; + } + + /** + * @param string|bool $host + * + * @return void + */ + public function setHost($host) + { + $this->host = $host; + } + + /** + * Returns the port number, or false if there is no port number specified, + * i.e. if the default port is to be used. + * + * @return int|bool + */ + public function getPort() + { + return $this->port; + } + + /** + * @param int|bool $port + * + * @return void + */ + public function setPort($port) + { + $this->port = intval($port); + } + + /** + * Returns the authority part, i.e. [ userinfo "@" ] host [ ":" port ], or + * false if there is no authority none. + * + * @return string|bool + */ + public function getAuthority() + { + if (!$this->host) { + return false; + } + + $authority = ''; + + if ($this->userinfo !== false) { + $authority .= $this->userinfo . '@'; + } + + $authority .= $this->host; + + if ($this->port !== false) { + $authority .= ':' . $this->port; + } + + return $authority; + } + + /** + * @param string|false $authority + * + * @return void + */ + public function setAuthority($authority) + { + $this->user = false; + $this->pass = false; + $this->host = false; + $this->port = false; + if (preg_match('@^(([^\@]+)\@)?([^:]+)(:(\d*))?$@', $authority, $reg)) { + if ($reg[1]) { + $this->userinfo = $reg[2]; + } + + $this->host = $reg[3]; + if (isset($reg[5])) { + $this->port = intval($reg[5]); + } + } + } + + /** + * Returns the path part (possibly an empty string). + * + * @return string + */ + public function getPath() + { + return $this->path; + } + + /** + * @param string $path + * + * @return void + */ + public function setPath($path) + { + $this->path = $path; + } + + /** + * Returns the query string (excluding the leading "?"), or false if "?" + * isn't present in the URL. + * + * @return string|bool + * @see self::getQueryVariables() + */ + public function getQuery() + { + return $this->query; + } + + /** + * @param string|bool $query + * + * @return void + * @see self::setQueryVariables() + */ + public function setQuery($query) + { + $this->query = $query; + } + + /** + * Returns the fragment name, or false if "#" isn't present in the URL. + * + * @return string|bool + */ + public function getFragment() + { + return $this->fragment; + } + + /** + * @param string|bool $fragment + * + * @return void + */ + public function setFragment($fragment) + { + $this->fragment = $fragment; + } + + /** + * Returns the query string like an array as the variables would appear in + * $_GET in a PHP script. + * + * @return array + */ + public function getQueryVariables() + { + $pattern = '/[' . + preg_quote($this->getOption(self::OPTION_SEPARATOR_INPUT), '/') . + ']/'; + $parts = preg_split($pattern, $this->query, -1, PREG_SPLIT_NO_EMPTY); + $return = array(); + + foreach ($parts as $part) { + if (strpos($part, '=') !== false) { + list($key, $value) = explode('=', $part, 2); + } else { + $key = $part; + $value = null; + } + + if ($this->getOption(self::OPTION_ENCODE_KEYS)) { + $key = rawurldecode($key); + } + $value = rawurldecode($value); + + if ($this->getOption(self::OPTION_USE_BRACKETS) && + preg_match('#^(.*)\[([0-9a-z_-]*)\]#i', $key, $matches)) { + + $key = $matches[1]; + $idx = $matches[2]; + + // Ensure is an array + if (empty($return[$key]) || !is_array($return[$key])) { + $return[$key] = array(); + } + + // Add data + if ($idx === '') { + $return[$key][] = $value; + } else { + $return[$key][$idx] = $value; + } + } elseif (!$this->getOption(self::OPTION_USE_BRACKETS) + && !empty($return[$key]) + ) { + $return[$key] = (array) $return[$key]; + $return[$key][] = $value; + } else { + $return[$key] = $value; + } + } + + return $return; + } + + /** + * @param array $array (name => value) array + * + * @return void + */ + public function setQueryVariables(array $array) + { + if (!$array) { + $this->query = false; + } else { + foreach ($array as $name => $value) { + if ($this->getOption(self::OPTION_ENCODE_KEYS)) { + $name = rawurlencode($name); + } + + if (is_array($value)) { + foreach ($value as $k => $v) { + $parts[] = $this->getOption(self::OPTION_USE_BRACKETS) + ? sprintf('%s[%s]=%s', $name, $k, $v) + : ($name . '=' . $v); + } + } elseif (!is_null($value)) { + $parts[] = $name . '=' . $value; + } else { + $parts[] = $name; + } + } + $this->query = implode($this->getOption(self::OPTION_SEPARATOR_OUTPUT), + $parts); + } + } + + /** + * @param string $name + * @param mixed $value + * + * @return array + */ + public function setQueryVariable($name, $value) + { + $array = $this->getQueryVariables(); + $array[$name] = $value; + $this->setQueryVariables($array); + } + + /** + * @param string $name + * + * @return void + */ + public function unsetQueryVariable($name) + { + $array = $this->getQueryVariables(); + unset($array[$name]); + $this->setQueryVariables($array); + } + + /** + * Returns a string representation of this URL. + * + * @return string + */ + public function getURL() + { + // See RFC 3986, section 5.3 + $url = ""; + + if ($this->scheme !== false) { + $url .= $this->scheme . ':'; + } + + $authority = $this->getAuthority(); + if ($authority !== false) { + $url .= '//' . $authority; + } + $url .= $this->path; + + if ($this->query !== false) { + $url .= '?' . $this->query; + } + + if ($this->fragment !== false) { + $url .= '#' . $this->fragment; + } + + return $url; + } + + /** + * Returns a normalized string representation of this URL. This is useful + * for comparison of URLs. + * + * @return string + */ + public function getNormalizedURL() + { + $url = clone $this; + $url->normalize(); + return $url->getUrl(); + } + + /** + * Returns a normalized Net_URL2 instance. + * + * @return Net_URL2 + */ + public function normalize() + { + // See RFC 3886, section 6 + + // Schemes are case-insensitive + if ($this->scheme) { + $this->scheme = strtolower($this->scheme); + } + + // Hostnames are case-insensitive + if ($this->host) { + $this->host = strtolower($this->host); + } + + // Remove default port number for known schemes (RFC 3986, section 6.2.3) + if ($this->port && + $this->scheme && + $this->port == getservbyname($this->scheme, 'tcp')) { + + $this->port = false; + } + + // Normalize case of %XX percentage-encodings (RFC 3986, section 6.2.2.1) + foreach (array('userinfo', 'host', 'path') as $part) { + if ($this->$part) { + $this->$part = preg_replace('/%[0-9a-f]{2}/ie', 'strtoupper("\0")', $this->$part); + } + } + + // Path segment normalization (RFC 3986, section 6.2.2.3) + $this->path = self::removeDotSegments($this->path); + + // Scheme based normalization (RFC 3986, section 6.2.3) + if ($this->host && !$this->path) { + $this->path = '/'; + } + } + + /** + * Returns whether this instance represents an absolute URL. + * + * @return bool + */ + public function isAbsolute() + { + return (bool) $this->scheme; + } + + /** + * Returns an Net_URL2 instance representing an absolute URL relative to + * this URL. + * + * @param Net_URL2|string $reference relative URL + * + * @return Net_URL2 + */ + public function resolve($reference) + { + if (is_string($reference)) { + $reference = new self($reference); + } + if (!$this->isAbsolute()) { + throw new Exception('Base-URL must be absolute'); + } + + // A non-strict parser may ignore a scheme in the reference if it is + // identical to the base URI's scheme. + if (!$this->getOption(self::OPTION_STRICT) && $reference->scheme == $this->scheme) { + $reference->scheme = false; + } + + $target = new self(''); + if ($reference->scheme !== false) { + $target->scheme = $reference->scheme; + $target->setAuthority($reference->getAuthority()); + $target->path = self::removeDotSegments($reference->path); + $target->query = $reference->query; + } else { + $authority = $reference->getAuthority(); + if ($authority !== false) { + $target->setAuthority($authority); + $target->path = self::removeDotSegments($reference->path); + $target->query = $reference->query; + } else { + if ($reference->path == '') { + $target->path = $this->path; + if ($reference->query !== false) { + $target->query = $reference->query; + } else { + $target->query = $this->query; + } + } else { + if (substr($reference->path, 0, 1) == '/') { + $target->path = self::removeDotSegments($reference->path); + } else { + // Merge paths (RFC 3986, section 5.2.3) + if ($this->host !== false && $this->path == '') { + $target->path = '/' . $this->path; + } else { + $i = strrpos($this->path, '/'); + if ($i !== false) { + $target->path = substr($this->path, 0, $i + 1); + } + $target->path .= $reference->path; + } + $target->path = self::removeDotSegments($target->path); + } + $target->query = $reference->query; + } + $target->setAuthority($this->getAuthority()); + } + $target->scheme = $this->scheme; + } + + $target->fragment = $reference->fragment; + + return $target; + } + + /** + * Removes dots as described in RFC 3986, section 5.2.4, e.g. + * "/foo/../bar/baz" => "/bar/baz" + * + * @param string $path a path + * + * @return string a path + */ + private static function removeDotSegments($path) + { + $output = ''; + + // Make sure not to be trapped in an infinite loop due to a bug in this + // method + $j = 0; + while ($path && $j++ < 100) { + // Step A + if (substr($path, 0, 2) == './') { + $path = substr($path, 2); + } elseif (substr($path, 0, 3) == '../') { + $path = substr($path, 3); + + // Step B + } elseif (substr($path, 0, 3) == '/./' || $path == '/.') { + $path = '/' . substr($path, 3); + + // Step C + } elseif (substr($path, 0, 4) == '/../' || $path == '/..') { + $path = '/' . substr($path, 4); + $i = strrpos($output, '/'); + $output = $i === false ? '' : substr($output, 0, $i); + + // Step D + } elseif ($path == '.' || $path == '..') { + $path = ''; + + // Step E + } else { + $i = strpos($path, '/'); + if ($i === 0) { + $i = strpos($path, '/', 1); + } + if ($i === false) { + $i = strlen($path); + } + $output .= substr($path, 0, $i); + $path = substr($path, $i); + } + } + + return $output; + } + + /** + * Returns a Net_URL2 instance representing the canonical URL of the + * currently executing PHP script. + * + * @return string + */ + public static function getCanonical() + { + if (!isset($_SERVER['REQUEST_METHOD'])) { + // ALERT - no current URL + throw new Exception('Script was not called through a webserver'); + } + + // Begin with a relative URL + $url = new self($_SERVER['PHP_SELF']); + $url->scheme = isset($_SERVER['HTTPS']) ? 'https' : 'http'; + $url->host = $_SERVER['SERVER_NAME']; + $port = intval($_SERVER['SERVER_PORT']); + if ($url->scheme == 'http' && $port != 80 || + $url->scheme == 'https' && $port != 443) { + + $url->port = $port; + } + return $url; + } + + /** + * Returns the URL used to retrieve the current request. + * + * @return string + */ + public static function getRequestedURL() + { + return self::getRequested()->getUrl(); + } + + /** + * Returns a Net_URL2 instance representing the URL used to retrieve the + * current request. + * + * @return Net_URL2 + */ + public static function getRequested() + { + if (!isset($_SERVER['REQUEST_METHOD'])) { + // ALERT - no current URL + throw new Exception('Script was not called through a webserver'); + } + + // Begin with a relative URL + $url = new self($_SERVER['REQUEST_URI']); + $url->scheme = isset($_SERVER['HTTPS']) ? 'https' : 'http'; + // Set host and possibly port + $url->setAuthority($_SERVER['HTTP_HOST']); + return $url; + } + + /** + * Sets the specified option. + * + * @param string $optionName a self::OPTION_ constant + * @param mixed $value option value + * + * @return void + * @see self::OPTION_STRICT + * @see self::OPTION_USE_BRACKETS + * @see self::OPTION_ENCODE_KEYS + */ + function setOption($optionName, $value) + { + if (!array_key_exists($optionName, $this->options)) { + return false; + } + $this->options[$optionName] = $value; + } + + /** + * Returns the value of the specified option. + * + * @param string $optionName The name of the option to retrieve + * + * @return mixed + */ + function getOption($optionName) + { + return isset($this->options[$optionName]) + ? $this->options[$optionName] : false; + } +} diff --git a/thirdparty/pear/Net/UserAgent/Detect.php b/thirdparty/pear/Net/UserAgent/Detect.php new file mode 100644 index 000000000..0ceb95faa --- /dev/null +++ b/thirdparty/pear/Net/UserAgent/Detect.php @@ -0,0 +1,967 @@ + | +// | Jason Rust | +// +----------------------------------------------------------------------+ + +// $Id: Detect.php,v 1.26 2007/09/19 21:31:54 jrust Exp $ + +// }}} +// {{{ constants + +define('NET_USERAGENT_DETECT_BROWSER', 'browser'); +define('NET_USERAGENT_DETECT_OS', 'os'); +define('NET_USERAGENT_DETECT_FEATURES', 'features'); +define('NET_USERAGENT_DETECT_QUIRKS', 'quirks'); +define('NET_USERAGENT_DETECT_ACCEPT', 'accept'); +define('NET_USERAGENT_DETECT_ALL', 'all'); + +// }}} +// {{{ class Net_UserAgent_Detect + +/** + * The Net_UserAgent_Detect object does a number of tests on an HTTP user + * agent string. The results of these tests are available via methods of + * the object. Note that all methods in this class can be called + * statically. The constructor and singleton methods are only retained + * for BC. + * + * This module is based upon the JavaScript browser detection code + * available at http://www.mozilla.org/docs/web-developer/sniffer/browser_type.html. + * This module had many influences from the lib/Browser.php code in + * version 1.3 of Horde. + * + * @author Jason Rust + * @author Dan Allen + * @author Chuck Hagenbuch + * @author Jon Parise + * @package Net_UserAgent + */ + +// }}} +class Net_UserAgent_Detect { + // {{{ constructor + + function Net_UserAgent_Detect($in_userAgent = null, $in_detect = null) + { + $this->detect($in_userAgent, $in_detect); + } + + // }}} + // {{{ singleton + + /** + * To be used in place of the contructor to return only open instance. + * + * @access public + * @return object Net_UserAgent_Detect instance + */ + function &singleton($in_userAgent = null, $in_detect = null) + { + static $instance; + + if (!isset($instance)) { + $instance = new Net_UserAgent_Detect($in_userAgent, $in_detect); + } + + return $instance; + } + + // }}} + // {{{ detect() + + /** + * Detect the user agent and prepare flags, features and quirks + * based on what is found + * + * This is the core of the Net_UserAgent_Detect class. It moves its + * way through the user agent string setting up the flags based on + * the vendors and versions of the browsers, determining the OS and + * setting up the features and quirks owned by each of the relevant + * clients. Note that if you are going to be calling methods of + * this class statically then set all the parameters using th + * setOption() + * + * @param string $in_userAgent (optional) User agent override. + * @param mixed $in_detect (optional) The level of checking to do. + * + * @access public + * @return void + */ + function detect($in_userAgent = null, $in_detect = null) + { + static $hasRun; + $options = &Net_UserAgent_Detect::_getStaticProperty('options'); + if (!empty($hasRun) && empty($options['re-evaluate'])) { + return; + } + + $hasRun = true; + // {{{ set up static properties + + $in_userAgent = isset($options['userAgent']) && is_null($in_userAgent) ? $options['userAgent'] : $in_userAgent; + $in_detect = isset($options['detectOptions']) && is_null($in_detect) ? $options['detectOptions'] : $in_detect; + + // User agent string that is being analyzed + $userAgent = &Net_UserAgent_Detect::_getStaticProperty('userAgent'); + + // Array that stores all of the flags for the vendor and version + // of the different browsers + $browser = &Net_UserAgent_Detect::_getStaticProperty('browser'); + $browser = array_flip(array('ns', 'ns2', 'ns3', 'ns4', 'ns4up', 'nav', 'ns6', 'belowns6', 'ns6up', 'firefox', 'firefox0.x', 'firefox1.x', 'firefox1.5', 'firefox2.x', 'gecko', 'ie', 'ie3', 'ie4', 'ie4up', 'ie5', 'ie5_5', 'ie5up', 'ie6', 'belowie6', 'ie6up', 'ie7', 'ie7up', 'opera', 'opera2', 'opera3', 'opera4', 'opera5', 'opera6', 'opera7', 'opera8', 'opera9', 'opera5up', 'opera6up', 'opera7up', 'belowopera8', 'opera8up', 'opera9up', 'aol', 'aol3', 'aol4', 'aol5', 'aol6', 'aol7', 'aol8', 'webtv', 'aoltv', 'tvnavigator', 'hotjava', 'hotjava3', 'hotjava3up', 'konq', 'safari', 'netgem', 'webdav', 'icab')); + + // Array that stores all of the flags for the operating systems, + // and in some cases the versions of those operating systems (windows) + $os = &Net_UserAgent_Detect::_getStaticProperty('os'); + $os = array_flip(array('win', 'win95', 'win16', 'win31', 'win9x', 'win98', 'wince', 'winme', 'win2k', 'winxp', 'winnt', 'win2003', 'os2', 'mac', 'mac68k', 'macppc', 'linux', 'unix', 'vms', 'sun', 'sun4', 'sun5', 'suni86', 'irix', 'irix5', 'irix6', 'hpux', 'hpux9', 'hpux10', 'aix', 'aix1', 'aix2', 'aix3', 'aix4', 'sco', 'unixware', 'mpras', 'reliant', 'dec', 'sinix', 'freebsd', 'bsd')); + + // Array which stores known issues with the given client that can + // be used for on the fly tweaking so that the client may recieve + // the proper handling of this quirk. + $quirks = &Net_UserAgent_Detect::_getStaticProperty('quirks'); + $quirks = array( + 'must_cache_forms' => false, + 'popups_disabled' => false, + 'empty_file_input_value' => false, + 'cache_ssl_downloads' => false, + 'scrollbar_in_way' => false, + 'break_disposition_header' => false, + 'nested_table_render_bug' => false); + + // Array that stores credentials for each of the browser/os + // combinations. These allow quick access to determine if the + // current client has a feature that is going to be implemented + // in the script. + $features = &Net_UserAgent_Detect::_getStaticProperty('features'); + $features = array( + 'javascript' => false, + 'dhtml' => false, + 'dom' => false, + 'sidebar' => false, + 'gecko' => false, + 'svg' => false, + 'css2' => false, + 'ajax' => false); + + // The leading identifier is the very first term in the user + // agent string, which is used to identify clients which are not + // Mosaic-based browsers. + $leadingIdentifier = &Net_UserAgent_Detect::_getStaticProperty('leadingIdentifier'); + + // The full version of the client as supplied by the very first + // numbers in the user agent + $version = &Net_UserAgent_Detect::_getStaticProperty('version'); + $version = 0; + + // The major part of the client version, which is the integer + // value of the version. + $majorVersion = &Net_UserAgent_Detect::_getStaticProperty('majorVersion'); + $majorVersion = 0; + + // The minor part of the client version, which is the decimal + // parts of the version + $subVersion = &Net_UserAgent_Detect::_getStaticProperty('subVersion'); + $subVersion = 0; + + // }}} + // detemine what user agent we are using + if (is_null($in_userAgent)) { + if (isset($_SERVER['HTTP_USER_AGENT'])) { + $userAgent = $_SERVER['HTTP_USER_AGENT']; + } + elseif (isset($GLOBALS['HTTP_SERVER_VARS']['HTTP_USER_AGENT'])) { + $userAgent = $GLOBALS['HTTP_SERVER_VARS']['HTTP_USER_AGENT']; + } + else { + $userAgent = ''; + } + } + else { + $userAgent = $in_userAgent; + } + + // get the lowercase version for case-insensitive searching + $agt = strtolower($userAgent); + + // figure out what we need to look for + $detectOptions = array(NET_USERAGENT_DETECT_BROWSER, + NET_USERAGENT_DETECT_OS, NET_USERAGENT_DETECT_FEATURES, + NET_USERAGENT_DETECT_QUIRKS, NET_USERAGENT_DETECT_ACCEPT, + NET_USERAGENT_DETECT_ALL); + $detect = is_null($in_detect) ? NET_USERAGENT_DETECT_ALL : $in_detect; + settype($detect, 'array'); + foreach($detectOptions as $option) { + if (in_array($option, $detect)) { + $detectFlags[$option] = true; + } + else { + $detectFlags[$option] = false; + } + } + + // initialize the arrays of browsers and operating systems + + // Get the type and version of the client + if (preg_match(";^([[:alnum:]]+)[ /\(]*[[:alpha:]]*([\d]*)(\.[\d\.]*);", $agt, $matches)) { + list(, $leadingIdentifier, $majorVersion, $subVersion) = $matches; + } + + if (empty($leadingIdentifier)) { + $leadingIdentifier = 'Unknown'; + } + + $version = $majorVersion . $subVersion; + + // Browser type + if ($detectFlags[NET_USERAGENT_DETECT_ALL] || $detectFlags[NET_USERAGENT_DETECT_BROWSER]) { + $browser['webdav'] = ($agt == 'microsoft data access internet publishing provider dav' || $agt == 'microsoft data access internet publishing provider protocol discovery'); + $browser['konq'] = $browser['safari'] = (strpos($agt, 'konqueror') !== false || strpos($agt, 'safari') !== false); + $browser['text'] = strpos($agt, 'links') !== false || strpos($agt, 'lynx') !== false || strpos($agt, 'w3m') !== false; + $browser['ns'] = strpos($agt, 'mozilla') !== false && !(strpos($agt, 'spoofer') !== false) && !(strpos($agt, 'compatible') !== false) && !(strpos($agt, 'hotjava') !== false) && !(strpos($agt, 'opera') !== false) && !(strpos($agt, 'webtv') !== false) ? 1 : 0; + $browser['netgem'] = strpos($agt, 'netgem') !== false; + $browser['icab'] = strpos($agt, 'icab') !== false; + $browser['ns2'] = $browser['ns'] && $majorVersion == 2; + $browser['ns3'] = $browser['ns'] && $majorVersion == 3; + $browser['ns4'] = $browser['ns'] && $majorVersion == 4; + $browser['ns4up'] = $browser['ns'] && $majorVersion >= 4; + // determine if this is a Netscape Navigator + $browser['nav'] = $browser['belowns6'] = $browser['ns'] && $majorVersion < 5; + $browser['ns6'] = !$browser['konq'] && $browser['ns'] && $majorVersion == 5; + $browser['ns6up'] = $browser['ns6'] && $majorVersion >= 5; + $browser['gecko'] = strpos($agt, 'gecko') !== false && !$browser['konq']; + $browser['firefox'] = $browser['gecko'] && strpos($agt, 'firefox') !== false; + $browser['firefox0.x'] = $browser['firefox'] && strpos($agt, 'firefox/0.') !== false; + $browser['firefox1.x'] = $browser['firefox'] && strpos($agt, 'firefox/1.') !== false; + $browser['firefox1.5'] = $browser['firefox'] && strpos($agt, 'firefox/1.5') !== false; + $browser['firefox2.x'] = $browser['firefox'] && strpos($agt, 'firefox/2.') !== false; + $browser['ie'] = strpos($agt, 'msie') !== false && !(strpos($agt, 'opera') !== false); + $browser['ie3'] = $browser['ie'] && $majorVersion < 4; + $browser['ie4'] = $browser['ie'] && $majorVersion == 4 && (strpos($agt, 'msie 4') !== false); + $browser['ie4up'] = $browser['ie'] && !$browser['ie3']; + $browser['ie5'] = $browser['ie4up'] && (strpos($agt, 'msie 5') !== false); + $browser['ie5_5'] = $browser['ie4up'] && (strpos($agt, 'msie 5.5') !== false); + $browser['ie5up'] = $browser['ie4up'] && !$browser['ie3'] && !$browser['ie4']; + $browser['ie5_5up'] = $browser['ie5up'] && !$browser['ie5']; + $browser['ie6'] = strpos($agt, 'msie 6') !== false; + $browser['ie6up'] = $browser['ie5up'] && !$browser['ie5'] && !$browser['ie5_5']; + $browser['ie7'] = strpos($agt, 'msie 7') !== false; + $browser['ie7up'] = $browser['ie6up'] && !$browser['ie6']; + $browser['belowie6']= $browser['ie'] && !$browser['ie6up']; + $browser['opera'] = strpos($agt, 'opera') !== false; + $browser['opera2'] = strpos($agt, 'opera 2') !== false || strpos($agt, 'opera/2') !== false; + $browser['opera3'] = strpos($agt, 'opera 3') !== false || strpos($agt, 'opera/3') !== false; + $browser['opera4'] = strpos($agt, 'opera 4') !== false || strpos($agt, 'opera/4') !== false; + $browser['opera5'] = strpos($agt, 'opera 5') !== false || strpos($agt, 'opera/5') !== false; + $browser['opera6'] = strpos($agt, 'opera 6') !== false || strpos($agt, 'opera/6') !== false; + $browser['opera7'] = strpos($agt, 'opera 7') !== false || strpos($agt, 'opera/7') !== false; + $browser['opera8'] = strpos($agt, 'opera 8') !== false || strpos($agt, 'opera/8') !== false; + $browser['opera9'] = strpos($agt, 'opera 9') !== false || strpos($agt, 'opera/9') !== false; + $browser['opera5up'] = $browser['opera'] && !$browser['opera2'] && !$browser['opera3'] && !$browser['opera4']; + $browser['opera6up'] = $browser['opera'] && !$browser['opera2'] && !$browser['opera3'] && !$browser['opera4'] && !$browser['opera5']; + $browser['opera7up'] = $browser['opera'] && !$browser['opera2'] && !$browser['opera3'] && !$browser['opera4'] && !$browser['opera5'] && !$browser['opera6']; + $browser['opera8up'] = $browser['opera'] && !$browser['opera2'] && !$browser['opera3'] && !$browser['opera4'] && !$browser['opera5'] && !$browser['opera6'] && !$browser['opera7']; + $browser['opera9up'] = $browser['opera'] && !$browser['opera2'] && !$browser['opera3'] && !$browser['opera4'] && !$browser['opera5'] && !$browser['opera6'] && !$browser['opera7'] && !$browser['opera8']; + $browser['belowopera8'] = $browser['opera'] && !$browser['opera8up']; + $browser['aol'] = strpos($agt, 'aol') !== false; + $browser['aol3'] = $browser['aol'] && $browser['ie3']; + $browser['aol4'] = $browser['aol'] && $browser['ie4']; + $browser['aol5'] = strpos($agt, 'aol 5') !== false; + $browser['aol6'] = strpos($agt, 'aol 6') !== false; + $browser['aol7'] = strpos($agt, 'aol 7') !== false || strpos($agt, 'aol7') !== false; + $browser['aol8'] = strpos($agt, 'aol 8') !== false || strpos($agt, 'aol8') !== false; + $browser['webtv'] = strpos($agt, 'webtv') !== false; + $browser['aoltv'] = $browser['tvnavigator'] = strpos($agt, 'navio') !== false || strpos($agt, 'navio_aoltv') !== false; + $browser['hotjava'] = strpos($agt, 'hotjava') !== false; + $browser['hotjava3'] = $browser['hotjava'] && $majorVersion == 3; + $browser['hotjava3up'] = $browser['hotjava'] && $majorVersion >= 3; + $browser['iemobile'] = strpos($agt, 'iemobile') !== false || strpos($agt, 'windows ce') !== false && (strpos($agt, 'ppc') !== false || strpos($agt, 'smartphone') !== false); + } + + if ($detectFlags[NET_USERAGENT_DETECT_ALL] || + ($detectFlags[NET_USERAGENT_DETECT_BROWSER] && $detectFlags[NET_USERAGENT_DETECT_FEATURES])) { + // Javascript Check + if ($browser['ns2'] || $browser['ie3']) { + Net_UserAgent_Detect::setFeature('javascript', 1.0); + } + elseif ($browser['iemobile']) { + // no javascript + } + elseif ($browser['opera5up']) { + Net_UserAgent_Detect::setFeature('javascript', 1.3); + } + elseif ($browser['opera'] || $browser['ns3']) { + Net_UserAgent_Detect::setFeature('javascript', 1.1); + } + elseif (($browser['ns4'] && ($version <= 4.05)) || $browser['ie4']) { + Net_UserAgent_Detect::setFeature('javascript', 1.2); + } + elseif (($browser['ie5up'] && strpos($agt, 'mac') !== false) || $browser['konq']) { + Net_UserAgent_Detect::setFeature('javascript', 1.4); + } + // I can't believe IE6 still has javascript 1.3, what a shitty browser + elseif (($browser['ns4'] && ($version > 4.05)) || $browser['ie5up'] || $browser['hotjava3up']) { + Net_UserAgent_Detect::setFeature('javascript', 1.3); + } + elseif ($browser['ns6up'] || $browser['gecko'] || $browser['netgem']) { + Net_UserAgent_Detect::setFeature('javascript', 1.5); + } + } + + /** OS Check **/ + if ($detectFlags[NET_USERAGENT_DETECT_ALL] || $detectFlags[NET_USERAGENT_DETECT_OS]) { + $os['win'] = strpos($agt, 'win') !== false || strpos($agt, '16bit') !== false; + $os['win95'] = strpos($agt, 'win95') !== false || strpos($agt, 'windows 95') !== false; + $os['win16'] = strpos($agt, 'win16') !== false || strpos($agt, '16bit') !== false || strpos($agt, 'windows 3.1') !== false || strpos($agt, 'windows 16-bit') !== false; + $os['win31'] = strpos($agt, 'windows 3.1') !== false || strpos($agt, 'win16') !== false || strpos($agt, 'windows 16-bit') !== false; + $os['winme'] = strpos($agt, 'win 9x 4.90') !== false; + $os['wince'] = strpos($agt, 'windows ce') !== false; + $os['win2k'] = strpos($agt, 'windows nt 5.0') !== false; + $os['winxp'] = strpos($agt, 'windows nt 5.1') !== false; + $os['win2003'] = strpos($agt, 'windows nt 5.2') !== false; + $os['win98'] = strpos($agt, 'win98') !== false || strpos($agt, 'windows 98') !== false; + $os['win9x'] = $os['win95'] || $os['win98']; + $os['winnt'] = (strpos($agt, 'winnt') !== false || strpos($agt, 'windows nt') !== false) && strpos($agt, 'windows nt 5') === false; + $os['win32'] = $os['win95'] || $os['winnt'] || $os['win98'] || $majorVersion >= 4 && strpos($agt, 'win32') !== false || strpos($agt, '32bit') !== false; + $os['os2'] = strpos($agt, 'os/2') !== false || strpos($agt, 'ibm-webexplorer') !== false; + $os['mac'] = strpos($agt, 'mac') !== false; + $os['mac68k'] = $os['mac'] && (strpos($agt, '68k') !== false || strpos($agt, '68000') !== false); + $os['macppc'] = $os['mac'] && (strpos($agt, 'ppc') !== false || strpos($agt, 'powerpc') !== false); + $os['sun'] = strpos($agt, 'sunos') !== false; + $os['sun4'] = strpos($agt, 'sunos 4') !== false; + $os['sun5'] = strpos($agt, 'sunos 5') !== false; + $os['suni86'] = $os['sun'] && strpos($agt, 'i86') !== false; + $os['irix'] = strpos($agt, 'irix') !== false; + $os['irix5'] = strpos($agt, 'irix 5') !== false; + $os['irix6'] = strpos($agt, 'irix 6') !== false || strpos($agt, 'irix6') !== false; + $os['hpux'] = strpos($agt, 'hp-ux') !== false; + $os['hpux9'] = $os['hpux'] && strpos($agt, '09.') !== false; + $os['hpux10'] = $os['hpux'] && strpos($agt, '10.') !== false; + $os['aix'] = strpos($agt, 'aix') !== false; + $os['aix1'] = strpos($agt, 'aix 1') !== false; + $os['aix2'] = strpos($agt, 'aix 2') !== false; + $os['aix3'] = strpos($agt, 'aix 3') !== false; + $os['aix4'] = strpos($agt, 'aix 4') !== false; + $os['linux'] = strpos($agt, 'inux') !== false; + $os['sco'] = strpos($agt, 'sco') !== false || strpos($agt, 'unix_sv') !== false; + $os['unixware'] = strpos($agt, 'unix_system_v') !== false; + $os['mpras'] = strpos($agt, 'ncr') !== false; + $os['reliant'] = strpos($agt, 'reliant') !== false; + $os['dec'] = strpos($agt, 'dec') !== false || strpos($agt, 'osf1') !== false || strpos($agt, 'dec_alpha') !== false || strpos($agt, 'alphaserver') !== false || strpos($agt, 'ultrix') !== false || strpos($agt, 'alphastation') !== false; + $os['sinix'] = strpos($agt, 'sinix') !== false; + $os['freebsd'] = strpos($agt, 'freebsd') !== false; + $os['bsd'] = strpos($agt, 'bsd') !== false; + $os['unix'] = strpos($agt, 'x11') !== false || strpos($agt, 'unix') !== false || $os['sun'] || $os['irix'] || $os['hpux'] || $os['sco'] || $os['unixware'] || $os['mpras'] || $os['reliant'] || $os['dec'] || $os['sinix'] || $os['aix'] || $os['linux'] || $os['bsd'] || $os['freebsd']; + $os['vms'] = strpos($agt, 'vax') !== false || strpos($agt, 'openvms') !== false; + } + + // Setup the quirks + if ($detectFlags[NET_USERAGENT_DETECT_ALL] || + ($detectFlags[NET_USERAGENT_DETECT_BROWSER] && $detectFlags[NET_USERAGENT_DETECT_QUIRKS])) { + if ($browser['konq']) { + Net_UserAgent_Detect::setQuirk('empty_file_input_value'); + } + + if ($browser['ie']) { + Net_UserAgent_Detect::setQuirk('cache_ssl_downloads'); + } + + if ($browser['ie6']) { + Net_UserAgent_Detect::setQuirk('scrollbar_in_way'); + } + + if ($browser['ie5']) { + Net_UserAgent_Detect::setQuirk('break_disposition_header'); + } + + if ($browser['ie7']) { + Net_UserAgent_Detect::setQuirk('popups_disabled'); + } + + if ($browser['ns6']) { + Net_UserAgent_Detect::setQuirk('popups_disabled'); + Net_UserAgent_Detect::setQuirk('must_cache_forms'); + } + + if ($browser['nav'] && $subVersion < .79) { + Net_UserAgent_Detect::setQuirk('nested_table_render_bug'); + } + } + + // Set features + if ($detectFlags[NET_USERAGENT_DETECT_ALL] || + ($detectFlags[NET_USERAGENT_DETECT_BROWSER] && $detectFlags[NET_USERAGENT_DETECT_FEATURES])) { + if ($browser['gecko']) { + preg_match(';gecko/([\d]+)\b;i', $agt, $matches); + Net_UserAgent_Detect::setFeature('gecko', $matches[1]); + } + + if ($browser['gecko'] || ($browser['ie5up'] && !$browser['iemobile']) || $browser['konq'] || $browser['opera8up'] && !$os['wince']) { + Net_UserAgent_Detect::setFeature('ajax'); + } + + if ($browser['ns6up'] || $browser['opera5up'] || $browser['konq'] || $browser['netgem']) { + Net_UserAgent_Detect::setFeature('dom'); + } + + if ($browser['ie4up'] || $browser['ns4up'] || $browser['opera5up'] || $browser['konq'] || $browser['netgem']) { + Net_UserAgent_Detect::setFeature('dhtml'); + } + + if ($browser['firefox1.5'] || $browser['firefox2.x'] || $browser['opera9up']) { + Net_UserAgent_Detect::setFeature('svg'); + } + + if ($browser['gecko'] || $browser['ns6up'] || $browser['ie5up'] || $browser['konq'] || $browser['opera7up']) { + Net_UserAgent_Detect::setFeature('css2'); + } + } + + if ($detectFlags[NET_USERAGENT_DETECT_ALL] || $detectFlags[NET_USERAGENT_DETECT_ACCEPT]) { + $mimetypes = preg_split(';[\s,]+;', substr(getenv('HTTP_ACCEPT'), 0, strpos(getenv('HTTP_ACCEPT') . ';', ';')), -1, PREG_SPLIT_NO_EMPTY); + Net_UserAgent_Detect::setAcceptType((array) $mimetypes, 'mimetype'); + + $languages = preg_split(';[\s,]+;', substr(getenv('HTTP_ACCEPT_LANGUAGE'), 0, strpos(getenv('HTTP_ACCEPT_LANGUAGE') . ';', ';')), -1, PREG_SPLIT_NO_EMPTY); + if (empty($languages)) { + $languages = 'en'; + } + + Net_UserAgent_Detect::setAcceptType((array) $languages, 'language'); + + $encodings = preg_split(';[\s,]+;', substr(getenv('HTTP_ACCEPT_ENCODING'), 0, strpos(getenv('HTTP_ACCEPT_ENCODING') . ';', ';')), -1, PREG_SPLIT_NO_EMPTY); + Net_UserAgent_Detect::setAcceptType((array) $encodings, 'encoding'); + + $charsets = preg_split(';[\s,]+;', substr(getenv('HTTP_ACCEPT_CHARSET'), 0, strpos(getenv('HTTP_ACCEPT_CHARSET') . ';', ';')), -1, PREG_SPLIT_NO_EMPTY); + Net_UserAgent_Detect::setAcceptType((array) $charsets, 'charset'); + } + } + + // }}} + // {{{ setOption() + + /** + * Sets a class option. The available settings are: + * o 'userAgent' => The user agent string to detect (useful for + * checking a string manually). + * o 'detectOptions' => The level of checking to do. A single level + * or an array of options. Default is NET_USERAGENT_DETECT_ALL. + * + * @param string $in_field The option field (userAgent or detectOptions) + * @param mixed $in_value The value for the field + */ + function setOption($in_field, $in_value) + { + $options = &Net_UserAgent_Detect::_getStaticProperty('options'); + $options[$in_field] = $in_value; + } + + // }}} + // {{{ isBrowser() + + /** + * Look up the provide browser flag and return a boolean value + * + * Given one of the flags listed in the properties, this function will return + * the value associated with that flag. + * + * @param string $in_match flag to lookup + * + * @access public + * @return boolean whether or not the browser satisfies this flag + */ + function isBrowser($in_match) + { + Net_UserAgent_Detect::detect(); + $browser = &Net_UserAgent_Detect::_getStaticProperty('browser'); + return isset($browser[strtolower($in_match)]) ? $browser[strtolower($in_match)] : false; + } + + // }}} + // {{{ getBrowser() + + /** + * Since simply returning the "browser" is somewhat ambiguous since there + * are different ways to classify the browser, this function works by taking + * an expect list and returning the string of the first match, so put the important + * ones first in the array. + * + * @param array $in_expectList the browser flags to search for + * + * @access public + * @return string first flag that matches + */ + function getBrowser($in_expectList) + { + Net_UserAgent_Detect::detect(); + $browser = &Net_UserAgent_Detect::_getStaticProperty('browser'); + foreach((array) $in_expectList as $brwsr) { + if (!empty($browser[strtolower($brwsr)])) { + return $brwsr; + } + } + } + + // }}} + // {{{ getBrowserString() + + /** + * This function returns the vendor string corresponding to the flag. + * + * Either use the default matches or pass in an associative array of + * flags and corresponding vendor strings. This function will find + * the highest version flag and return the vendor string corresponding + * to the appropriate flag. Be sure to pass in the flags in ascending order + * if you want a basic matches first, followed by more detailed matches. + * + * @param array $in_vendorStrings (optional) array of flags matched with vendor strings + * + * @access public + * @return string vendor string matches appropriate flag + */ + function getBrowserString($in_vendorStrings = null) + { + if (is_null($in_vendorStrings)) { + $in_vendorStrings = array ( + 'ie' => 'Microsoft Internet Explorer', + 'ie4up' => 'Microsoft Internet Explorer 4.x', + 'ie5up' => 'Microsoft Internet Explorer 5.x', + 'ie6up' => 'Microsoft Internet Explorer 6.x', + 'ie7up' => 'Microsoft Internet Explorer 7.x', + 'opera4' => 'Opera 4.x', + 'opera5up' => 'Opera 5.x', + 'nav' => 'Netscape Navigator', + 'ns4' => 'Netscape 4.x', + 'ns6up' => 'Mozilla/Netscape 6.x', + 'firefox0.x' => 'Firefox 0.x', + 'firefox1.x' => 'Firefox 1.x', + 'firefox1.5' => 'Firefox 1.5', + 'firefox2.x' => 'Firefox 2.x', + 'konq' => 'Konqueror/Safari', + 'netgem' => 'Netgem/iPlayer'); + } + + Net_UserAgent_Detect::detect(); + $browser = &Net_UserAgent_Detect::_getStaticProperty('browser'); + foreach((array) $in_vendorStrings as $flag => $string) { + if (!empty($browser[$flag])) { + $vendorString = $string; + } + } + + // if there are no matches just use the user agent leading idendifier (usually Mozilla) + if (!isset($vendorString)) { + $leadingIdentifier = &Net_UserAgent_Detect::_getStaticProperty('leadingIdentifier'); + $vendorString = $leadingIdentifier; + } + + return $vendorString; + } + + // }}} + // {{{ isIE() + + /** + * Determine if the browser is an Internet Explorer browser + * + * @access public + * @return bool whether or not this browser is an ie browser + */ + function isIE() + { + Net_UserAgent_Detect::detect(); + $browser = &Net_UserAgent_Detect::_getStaticProperty('browser'); + return !empty($browser['ie']); + } + + // }}} + // {{{ isNavigator() + + /** + * Determine if the browser is a Netscape Navigator browser + * + * @access public + * @return bool whether or not this browser is a Netscape Navigator browser + */ + function isNavigator() + { + Net_UserAgent_Detect::detect(); + $browser = &Net_UserAgent_Detect::_getStaticProperty('browser'); + return !empty($browser['nav']); + } + + // }}} + // {{{ isNetscape() + + /** + * Determine if the browser is a Netscape or Mozilla browser + * + * Note that this function is not the same as isNavigator, since the + * new Mozilla browsers are still sponsered by Netscape, and hence are + * Netscape products, but not the original Navigators + * + * @access public + * @return bool whether or not this browser is a Netscape product + */ + function isNetscape() + { + Net_UserAgent_Detect::detect(); + $browser = &Net_UserAgent_Detect::_getStaticProperty('browser'); + return !empty($browser['ns4up']); + } + + // }}} + // {{{ isOS() + + /** + * Look up the provide OS flag and return a boolean value + * + * Given one of the flags listed in the properties, this function will return + * the value associated with that flag for the operating system. + * + * @param string $in_match flag to lookup + * + * @access public + * @return boolean whether or not the OS satisfies this flag + */ + function isOS($in_match) + { + Net_UserAgent_Detect::detect(); + $os = &Net_UserAgent_Detect::_getStaticProperty('os'); + return isset($os[strtolower($in_match)]) ? $os[strtolower($in_match)] : false; + } + + // }}} + // {{{ getOS() + + /** + * Since simply returning the "os" is somewhat ambiguous since there + * are different ways to classify the browser, this function works by taking + * an expect list and returning the string of the first match, so put the important + * ones first in the array. + * + * @access public + * @return string first flag that matches + */ + function getOS($in_expectList) + { + Net_UserAgent_Detect::detect(); + $os = &Net_UserAgent_Detect::_getStaticProperty('os'); + foreach((array) $in_expectList as $expectOs) { + if (!empty($os[strtolower($expectOs)])) { + return $expectOs; + } + } + } + + // }}} + // {{{ getOSString() + + /** + * This function returns the os string corresponding to the flag. + * + * Either use the default matches or pass in an associative array of + * flags and corresponding os strings. This function will find + * the highest version flag and return the os string corresponding + * to the appropriate flag. Be sure to pass in the flags in ascending order + * if you want a basic matches first, followed by more detailed matches. + * + * @param array $in_osStrings (optional) array of flags matched with os strings + * + * @access public + * @return string os string matches appropriate flag + */ + function getOSString($in_osStrings = null) + { + if (is_null($in_osStrings)) { + $in_osStrings = array( + 'win' => 'Microsoft Windows', + 'wince' => 'Microsoft Windows CE', + 'win9x' => 'Microsoft Windows 9x', + 'winme' => 'Microsoft Windows Millenium', + 'win2k' => 'Microsoft Windows 2000', + 'winnt' => 'Microsoft Windows NT', + 'winxp' => 'Microsoft Windows XP', + 'win2003' => 'Microsoft Windows 2003', + 'mac' => 'Macintosh', + 'unix' => 'Linux/Unix'); + } + + Net_UserAgent_Detect::detect(); + $osString = 'Unknown'; + + $os = &Net_UserAgent_Detect::_getStaticProperty('os'); + foreach((array) $in_osStrings as $flag => $string) { + if (!empty($os[$flag])) { + $osString = $string; + } + } + + return $osString; + } + + // }}} + // {{{ setQuirk() + + /** + * Set a unique behavior for the current browser. + * + * Many client browsers do some really funky things, and this + * mechanism allows the coder to determine if an excepetion must + * be made with the current client. + * + * @param string $in_quirk The quirk to set + * @param string $in_hasQuirk (optional) Does the browser have the quirk? + * + * @access public + * @return void + */ + function setQuirk($in_quirk, $in_hasQuirk = true) + { + $quirks = &Net_UserAgent_Detect::_getStaticProperty('quirks'); + $hasQuirk = !empty($in_hasQuirk); + $quirks[strtolower($in_quirk)] = $hasQuirk; + } + + // }}} + // {{{ hasQuirk() + + /** + * Check a unique behavior for the current browser. + * + * Many client browsers do some really funky things, and this + * mechanism allows the coder to determine if an excepetion must + * be made with the current client. + * + * @param string $in_quirk The quirk to detect + * + * @access public + * @return bool whether or not browser has this quirk + */ + function hasQuirk($in_quirk) + { + return (bool) Net_UserAgent_Detect::getQuirk($in_quirk); + } + + // }}} + // {{{ getQuirk() + + /** + * Get the unique behavior for the current browser. + * + * Many client browsers do some really funky things, and this + * mechanism allows the coder to determine if an excepetion must + * be made with the current client. + * + * @param string $in_quirk The quirk to detect + * + * @access public + * @return string value of the quirk, in this case usually a boolean + */ + function getQuirk($in_quirk) + { + Net_UserAgent_Detect::detect(); + $quirks = &Net_UserAgent_Detect::_getStaticProperty('quirks'); + return isset($quirks[strtolower($in_quirk)]) ? $quirks[strtolower($in_quirk)] : null; + } + + // }}} + // {{{ setFeature() + + /** + * Set capabilities for the current browser. + * + * Since the capabilities of client browsers vary widly, this interface + * helps keep track of the core features of a client, such as if the client + * supports dhtml, dom, javascript, etc. + * + * @param string $in_feature The feature to set + * @param string $in_hasFeature (optional) Does the browser have the feature? + * + * @access public + * @return void + */ + function setFeature($in_feature, $in_hasFeature = true) + { + $features = &Net_UserAgent_Detect::_getStaticProperty('features'); + $features[strtolower($in_feature)] = $in_hasFeature; + } + + // }}} + // {{{ hasFeature() + + /** + * Check the capabilities for the current browser. + * + * Since the capabilities of client browsers vary widly, this interface + * helps keep track of the core features of a client, such as if the client + * supports dhtml, dom, javascript, etc. + * + * @param string $in_feature The feature to detect + * + * @access public + * @return bool whether or not the current client has this feature + */ + function hasFeature($in_feature) + { + return (bool) Net_UserAgent_Detect::getFeature($in_feature); + } + + // }}} + // {{{ getFeature() + + /** + * Get the capabilities for the current browser. + * + * Since the capabilities of client browsers vary widly, this interface + * helps keep track of the core features of a client, such as if the client + * supports dhtml, dom, javascript, etc. + * + * @param string $in_feature The feature to detect + * + * @access public + * @return string value of the feature requested + */ + function getFeature($in_feature) + { + Net_UserAgent_Detect::detect(); + $features = &Net_UserAgent_Detect::_getStaticProperty('features'); + return isset($features[strtolower($in_feature)]) ? $features[strtolower($in_feature)] : null; + } + + // }}} + // {{{ getAcceptType() + + /** + * Retrive the accept type for the current browser. + * + * To keep track of the mime-types, languages, charsets and encodings + * that each browser accepts we use associative arrays for each type. + * This function works like getBrowser() as it takes an expect list + * and returns the first match. For instance, to find the language + * you would pass in your allowed languages and see if any of the + * languages set in the browser match. + * + * @param string $in_expectList values to check + * @param string $in_type type of accept + * + * @access public + * @return string the first matched value + */ + function getAcceptType($in_expectList, $in_type) + { + Net_UserAgent_Detect::detect(); + $type = strtolower($in_type); + + if ($type == 'mimetype' || $type == 'language' || $type == 'charset' || $type == 'encoding') { + $typeArray = &Net_UserAgent_Detect::_getStaticProperty($type); + foreach((array) $in_expectList as $match) { + if (!empty($typeArray[$match])) { + return $match; + } + } + } + + return null; + } + + // }}} + // {{{ setAcceptType() + + /** + * Set the accept types for the current browser. + * + * To keep track of the mime-types, languages, charsets and encodings + * that each browser accepts we use associative arrays for each type. + * This function takes and array of accepted values for the type and + * records them for retrieval. + * + * @param array $in_values values of the accept type + * @param string $in_type type of accept + * + * @access public + * @return void + */ + function setAcceptType($in_values, $in_type) + { + $type = strtolower($in_type); + + if ($type == 'mimetype' || $type == 'language' || $type == 'charset' || $type == 'encoding') { + $typeArray = &Net_UserAgent_Detect::_getStaticProperty($type); + foreach((array) $in_values as $value) { + $typeArray[$value] = true; + } + } + } + + // }}} + // {{{ hasAcceptType() + + /** + * Check the accept types for the current browser. + * + * To keep track of the mime-types, languages, charsets and encodings + * that each browser accepts we use associative arrays for each type. + * This function checks the array for the given type and determines if + * the browser accepts it. + * + * @param string $in_value values to check + * @param string $in_type type of accept + * + * @access public + * @return bool whether or not the value is accept for this type + */ + function hasAcceptType($in_value, $in_type) + { + return (bool) Net_UserAgent_Detect::getAcceptType((array) $in_value, $in_type); + } + + // }}} + // {{{ getUserAgent() + + /** + * Return the user agent string that is being worked on + * + * @access public + * @return string user agent + */ + function getUserAgent() + { + Net_UserAgent_Detect::detect(); + $userAgent = &Net_UserAgent_Detect::_getStaticProperty('userAgent'); + return $userAgent; + } + + // }}} + // {{{ _getStaticProperty() + + /** + * Copy of getStaticProperty() from PEAR.php to avoid having to + * include PEAR.php + * + * @access private + * @param string $var The variable to retrieve. + * @return mixed A reference to the variable. If not set it will be + * auto initialised to NULL. + */ + function &_getStaticProperty($var) + { + static $properties; + return $properties[$var]; + } + + // }}} +} +?> diff --git a/thirdparty/pear/Net/UserAgent/Detect/APC.php b/thirdparty/pear/Net/UserAgent/Detect/APC.php new file mode 100644 index 000000000..5a560cadf --- /dev/null +++ b/thirdparty/pear/Net/UserAgent/Detect/APC.php @@ -0,0 +1,123 @@ + | +// +----------------------------------------------------------------------+ + +// $Id: APC.php,v 1.1 2007/09/19 21:35:22 jrust Exp $ + +require_once 'Net_UserAgent/detect.php'; + +class Net_UserAgent_Detect_APC extends Net_UserAgent_Detect +{ + var $key = ''; + + function Net_UserAgent_Detect_APC($in_userAgent = null, $in_detect = null, $ua_cache_window = 600) + { + $data = ''; + $restored = false; + $ua_cache_timeout = apc_fetch('useragent:cache_timeout'); // don't cache after time period + + if(!class_exists('G')){ + $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); + $docuroot = explode( '/', $realdocuroot ); + array_pop( $docuroot ); + $pathhome = implode( '/', $docuroot ) . '/'; + array_pop( $docuroot ); + $pathTrunk = implode( '/', $docuroot ) . '/'; + require_once($pathTrunk.'gulliver/system/class.g.php'); + } + if ($ua_cache_window > 0) { + if (!$ua_cache_timeout) { + // check apc uptime and disable after x mins + $apc_data = apc_cache_info('file', true); + + if (isset($apc_data['start_time'])) { + $uptime = $apc_data['start_time']; + + if (time() - $uptime > $ua_cache_window) { // timeout and disable after 10 minutes of uptime + apc_store('useragent:cache_timeout', true); + $ua_cache_timeout = true; // don't cache this one either + } + } + } + + if (!$this->key) { + $key_flags = ''; + if ($in_detect !== null) { + $key_flags = implode('-', $in_detect); + } + $this->key = 'useragent:'.G::encryptOld($in_userAgent.$key_flags); + } + + if ($data = apc_fetch($this->key)) { + $success = null; + $data = unserialize($data); + if ($data) { + $restored = $this->cache_restore($data); + } + } + } + + if (!$data) { + $this->detect($in_userAgent, $in_detect); + + if ($ua_cache_window > 0 && !$ua_cache_timeout) { + $this->cache_save(); + } + } + } + + function &singleton($in_userAgent = null, $in_detect = null) + { + static $instance; + + if (!isset($instance)) { + $instance = new Net_UserAgent_Detect_APC($in_userAgent, $in_detect); + } + + return $instance; + } + + function cache_restore($cache) + { + if (is_array($cache)) { + foreach($cache as $prop => $value) { + $ptr = Net_UserAgent_Detect::_getStaticProperty($prop); + $ptr = $value; + } + return true; + } + return false; + } + + function cache_save() + { + if ($this->key) { + $data = array('browser' => Net_UserAgent_Detect::_getStaticProperty('browser'), + 'features' => Net_UserAgent_Detect::_getStaticProperty('features'), + 'leadingIdentifier' => Net_UserAgent_Detect::_getStaticProperty('leadingIdentifier'), + 'majorVersion' => Net_UserAgent_Detect::_getStaticProperty('majorVersion'), + 'options' => Net_UserAgent_Detect::_getStaticProperty('options'), + 'os' => Net_UserAgent_Detect::_getStaticProperty('os'), + 'quirks' => Net_UserAgent_Detect::_getStaticProperty('quirks'), + 'subVersion' => Net_UserAgent_Detect::_getStaticProperty('subVersion'), + 'userAgent' => Net_UserAgent_Detect::_getStaticProperty('userAgent'), + 'version' => Net_UserAgent_Detect::_getStaticProperty('version'), + ); + apc_store($this->key, serialize($data)); + } + } +} +?> diff --git a/thirdparty/pear/Numbers/Words.php b/thirdparty/pear/Numbers/Words.php new file mode 100644 index 000000000..7397a6437 --- /dev/null +++ b/thirdparty/pear/Numbers/Words.php @@ -0,0 +1,145 @@ + | +// +----------------------------------------------------------------------+ +// +// $Id: Words.php,v 1.7 2003/09/29 12:23:58 makler Exp $ +// + +/** + * The Numbers_Words class provides method to convert arabic numerals to + * words (also with currency name). + * + * @author Piotr Klaban + * @package Numbers_Words + */ + +// {{{ Numbers_Words + +/** + * The Numbers_Words class provides method to convert arabic numerals to words. + * + * @access public + * @author Piotr Klaban + * @since PHP 4.2.3 + * @package Numbers_Words + */ +class Numbers_Words +{ + // {{{ toWords() + + /** + * Converts a number to its word representation + * + * @param integer $num An integer between -infinity and infinity inclusive :) + * that should be converted to a words representation + * + * @param string $locale Language name abbreviation. Optional. Defaults to en_US. + * + * @return string The corresponding word representation + * + * @access public + * @author Piotr Klaban + * @since PHP 4.2.3 + */ + function toWords($num, $locale = 'en_US') { + + include_once("Numbers/Words/lang.${locale}.php"); + + $classname = "Numbers_Words_${locale}"; + + if (!class_exists($classname)) { + return Numbers_Words::raiseError("Unable to include the Numbers/Words/lang.${locale}.php file"); + } + + $methods = get_class_methods($classname); + + if (!in_array('toWords', $methods) && !in_array('towords', $methods)) { + return Numbers_Words::raiseError("Unable to find toWords method in '$classname' class"); + } + + @$obj =& new $classname; + + return trim($obj->toWords($num)); + } + // }}} + // {{{ toCurrency() + /** + * Converts a currency value to word representation (1.02 => one dollar two cents) + * If the number has not any fraction part, the "cents" number is omitted. + * + * @param float $num A float/integer number representing currency value + * + * @param string $locale Language name abbreviation. Optional. Defaults to en_US. + * + * @param string $int_curr International currency symbol + * as defined by the ISO 4217 standard (three characters). + * E.g. 'EUR', 'USD', 'PLN'. Optional. + * Defaults to $def_currency defined in the language class. + * + * @return string The corresponding word representation + * + * @access public + * @author Piotr Klaban + * @since PHP 4.2.3 + */ + function toCurrency($num, $locale = 'en_US', $int_curr = '') { + $ret = $num; + + @include_once("Numbers/Words/lang.${locale}.php"); + + $classname = "Numbers_Words_${locale}"; + + if (!class_exists($classname)) { + return Numbers_Words::raiseError("Unable to include the Numbers/Words/lang.${locale}.php file"); + } + + $methods = get_class_methods($classname); + + if (!in_array('toCurrencyWords', $methods) && !in_array('tocurrencywords', $methods)) { + return Numbers_Words::raiseError("Unable to find toCurrencyWords method in '$classname' class"); + } + + @$obj =& new $classname; + + if (strpos($num, '.') === false) + { + $ret = trim($obj->toCurrencyWords($int_curr, $num)); + } else { + $currency = explode('.', $num, 2); + $ret = trim($obj->toCurrencyWords($int_curr, $currency[0], $currency[1])); + } + return $ret; + } + // }}} + // {{{ raiseError() + /** + * Trigger a PEAR error + * + * To improve performances, the PEAR.php file is included dynamically. + * + * @param string error message + */ + function raiseError($msg) + { + include_once('PEAR.php'); + return PEAR::raiseError($msg); + } + // }}} +} + +// }}} +?> diff --git a/thirdparty/pear/Numbers/Words/lang.bg.php b/thirdparty/pear/Numbers/Words/lang.bg.php new file mode 100644 index 000000000..1204d29b7 --- /dev/null +++ b/thirdparty/pear/Numbers/Words/lang.bg.php @@ -0,0 +1,505 @@ + | +// +----------------------------------------------------------------------+ +// +// $Id$ + +/** + * Include needed files + */ +require_once("Numbers/Words.php"); + +/** + * Class for translating numbers into Bulgarian. + * + * @author Kouber Saparev + * @package Numbers_Words + */ +class Numbers_Words_bg extends Numbers_Words +{ + + // {{{ properties + + /** + * Locale name. + * @var string + * @access public + */ + var $locale = 'bg'; + + /** + * Language name in English. + * @var string + * @access public + */ + var $lang = 'Bulgarian'; + + /** + * Native language name. + * @var string + * @access public + */ + var $lang_native = ''; + + /** + * Some miscellaneous words and language constructs. + * @var string + * @access private + */ + var $_misc_strings = array( + 'deset'=>'', // "ten" + 'edinadeset'=>'', // "eleven" + 'na'=>'', // liaison particle for 12 to 19 + 'sto'=>'', // "hundred" + 'sta'=>'', // suffix for 2 and 3 hundred + 'stotin'=>'', // suffix for 4 to 9 hundred + 'hiliadi'=>'' // plural form of "thousand" + ); + + + /** + * The words for digits (except zero). Note that, there are three genders for them (neuter, masculine and feminine). + * The words for 3 to 9 (masculine) and for 2 to 9 (feminine) are the same as neuter, so they're filled + * in the _initDigits() method, which is invoked from the constructor. + * @var string + * @access private + */ + var $_digits = array( + 0=>array(1=>"", "", "", "", "", "", "", "", ""), // neuter + 1=>array(1=>'', ''), // masculine + -1=>array(1=>'') // feminine + ); + + /** + * A flag, that determines if the _digits array is filled for masculine and feminine genders. + * @var string + * @access private + */ + var $_digits_initialized = false; + + /** + * A flag, that determines if the "and" word is placed already before the last non-empty group of digits. + * @var string + * @access private + */ + var $_last_and = false; + + /** + * The word for zero. + * @var string + * @access private + */ + var $_zero = ''; + + /** + * The word for infinity. + * @var string + * @access private + */ + var $_infinity = ''; + + /** + * The word for the "and" language construct. + * @var string + * @access private + */ + var $_and = ''; + + /** + * The word separator. + * @var string + * @access private + */ + var $_sep = ' '; + + /** + * The word for the minus sign. + * @var string + * @access private + */ + var $_minus = ''; // minus sign + + /** + * The plural suffix (except for thousand). + * @var string + * @access private + */ + var $_plural = ''; // plural suffix + + /** + * The suffixes for exponents (singular). + * @var array + * @access private + */ + var $_exponent = array( + 0 => '', + 3 => '', + 6 => '', + 9 => '', + 12 => '', + 15 => '', + 18 => '', + 21 => '', + 24 => '', + 27 => '', + 30 => '', + 33 => '', + 36 => '', + 39 => '', + 42 => '', + 45 => '', + 48 => '', + 51 => '', + 54 => '', + 57 => '', + 60 => '', + 63 => '', + 66 => '', + 69 => '', + 72 => '', + 75 => '', + 78 => '', + 81 => '', + 84 => '', + 87 => '', + 90 => '', + 93 => '', + 96 => '', + 99 => '', + 102 => '', + 105 => '', + 108 => '', + 111 => '', + 114 => '', + 117 => '', + 120 => '', + 123 => '', + 126 => '', + 129 => '', + 132 => '', + 135 => '', + 138 => '', + 141 => '', + 144 => '', + 147 => '', + 150 => '', + 153 => '', + 156 => '', + 159 => '', + 162 => '', + 165 => '', + 168 => '', + 171 => '', + 174 => '', + 177 => '', + 180 => '', + 183 => '', + 186 => '', + 189 => '', + 192 => '', + 195 => '', + 198 => '', + 201 => '', + 204 => '', + 207 => '', + 210 => '', + 213 => '', + 216 => '', + 219 => '', + 222 => '', + 225 => '', + 228 => '', + 231 => '', + 234 => '', + 237 => '', + 240 => '', + 243 => '', + 246 => '', + 249 => '', + 252 => '', + 255 => '', + 258 => '', + 261 => '', + 264 => '', + 267 => '', + 270 => '', + 273 => '', + 276 => '', + 279 => '', + 282 => '', + 285 => '', + 288 => '', + 291 => '', + 294 => '', + 297 => '', + 300 => '', + 303 => '' + ); + // }}} + + // {{{ Numbers_Words_bg() + + /** + * The class constructor, used for calling the _initDigits method. + * + * @return void + * + * @access public + * @author Kouber Saparev + * @see function _initDigits + */ + function Numbers_Words_bg() { + $this->_initDigits(); + } + // }}} + + // {{{ _initDigits() + + /** + * Fills the _digits array for masculine and feminine genders with + * corresponding references to neuter words (when they're the same). + * + * @return void + * + * @access private + * @author Kouber Saparev + */ + function _initDigits() { + if (!$this->_digits_initialized) { + for ($i=3; $i<=9; $i++) { + $this->_digits[1][$i] =& $this->_digits[0][$i]; + } + for ($i=2; $i<=9; $i++) { + $this->_digits[-1][$i] =& $this->_digits[0][$i]; + } + $this->_digits_initialized = true; + } + } + // }}} + + // {{{ _splitNumber() + + /** + * Split a number to groups of three-digit numbers. + * + * @param mixed $num An integer or its string representation + * that need to be split + * + * @return array Groups of three-digit numbers. + * + * @access private + * @author Kouber Saparev + * @since PHP 4.2.3 + */ + + function _splitNumber($num) + { + if (is_string($num)) { + $ret = array(); + $strlen = strlen($num); + $first = substr($num, 0, $strlen%3); + preg_match_all('/\d{3}/', substr($num, $strlen%3, $strlen), $m); + $ret =& $m[0]; + if ($first) array_unshift($ret, $first); + return $ret; + } + else + return explode(' ', number_format($num, 0, '', ' ')); // a faster version for integers + } + // }}} + + // {{{ _showDigitsGroup() + + /** + * Converts a three-digit number to its word representation + * in Bulgarian language. + * + * @param integer $num An integer between 1 and 999 inclusive. + * + * @param integer $gender An integer which represents the gender of + * the current digits group. + * 0 - neuter + * 1 - masculine + * -1 - feminine + * + * @param boolean $last A flag that determines if the current digits group + * is the last one. + * + * @return string The words for the given number. + * + * @access private + * @author Kouber Saparev + */ + function _showDigitsGroup($num, $gender = 0, $last = false) + { + /* A storage array for the return string. + Positions 1, 3, 5 are intended for digit words + and everything else (0, 2, 4) for "and" words. + Both of the above types are optional, so the size of + the array may vary. + */ + $ret = array(); + + // extract the value of each digit from the three-digit number + $e = $num%10; // ones + $d = ($num-$e)%100/10; // tens + $s = ($num-$d*10-$e)%1000/100; // hundreds + + // process the "hundreds" digit. + if ($s) { + switch ($s) { + case 1: + $ret[1] = $this->_misc_strings['sto']; + break; + case 2: + case 3: + $ret[1] = $this->_digits[0][$s].$this->_misc_strings['sta']; + break; + default: + $ret[1] = $this->_digits[0][$s].$this->_misc_strings['stotin']; + } + } + + // process the "tens" digit, and optionally the "ones" digit. + if ($d) { + // in the case of 1, the "ones" digit also must be processed + if ($d==1) { + if (!$e) { + $ret[3] = $this->_misc_strings['deset']; // ten + } else { + if ($e==1) { + $ret[3] = $this->_misc_strings['edinadeset']; // eleven + } else { + $ret[3] = $this->_digits[1][$e].$this->_misc_strings['na'].$this->_misc_strings['deset']; // twelve - nineteen + } + // the "ones" digit is alredy processed, so skip a second processment + $e = 0; + } + } else { + $ret[3] = $this->_digits[1][$d].$this->_misc_strings['deset']; // twenty - ninety + } + } + + // process the "ones" digit + if ($e) { + $ret[5] = $this->_digits[$gender][$e]; + } + + // put "and" where needed + if (count($ret)>1) { + if ($e) { + $ret[4] = $this->_and; + } else { + $ret[2] = $this->_and; + } + } + + // put "and" optionally in the case this is the last non-empty group + if ($last) { + if (!$s||count($ret)==1) { + $ret[0] = $this->_and; + } + $this->_last_and = true; + } + + // sort the return array so that "and" constructs go to theirs appropriate places + ksort($ret); + + return implode($this->_sep, $ret); + } + // }}} + + // {{{ toWords() + + /** + * Converts a number to its word representation + * in Bulgarian language. + * + * @param integer $num An integer between 9.99*-10^302 and 9.99*10^302 (999 centillions) + * that need to be converted to words + * + * @return string The corresponding word representation + * + * @access public + * @author Kouber Saparev + */ + function toWords($num = 0) + { + $ret = array(); + $ret_minus = ''; + + // check if $num is a valid non-zero number + if (!$num || preg_match('/^-?0+$/', $num) || !preg_match('/^-?\d+$/', $num)) return $this->_zero; + + // add a minus sign + if (substr($num, 0, 1) == '-') { + $ret_minus = $this->_minus . $this->_sep; + $num = substr($num, 1); + } + + // if the absolute value is greater than 9.99*10^302, return infinity + if (strlen($num)>306) { + return $ret_minus . $this->_infinity; + } + + // strip excessive zero signs + $num = ltrim($num, '0'); + + // split $num to groups of three-digit numbers + $num_groups = $this->_splitNumber($num); + + $sizeof_numgroups = count($num_groups); + + // go through the groups in reverse order, so that the last group could be determined + for ($i=$sizeof_numgroups-1, $j=1; $i>=0; $i--, $j++) { + if (!isset($ret[$j])) { + $ret[$j] = ''; + } + + // what is the corresponding exponent for the current group + $pow = $sizeof_numgroups-$i; + + // skip processment for empty groups + if ($num_groups[$i]!='000') { + if ($num_groups[$i]>1) { + if ($pow==1) { + $ret[$j] .= $this->_showDigitsGroup($num_groups[$i], 0, !$this->_last_and && $i).$this->_sep; + $ret[$j] .= $this->_exponent[($pow-1)*3]; + } elseif ($pow==2) { + $ret[$j] .= $this->_showDigitsGroup($num_groups[$i], -1, !$this->_last_and && $i).$this->_sep; + $ret[$j] .= $this->_misc_strings['hiliadi'].$this->_sep; + } else { + $ret[$j] .= $this->_showDigitsGroup($num_groups[$i], 1, !$this->_last_and && $i).$this->_sep; + $ret[$j] .= $this->_exponent[($pow-1)*3].$this->_plural.$this->_sep; + } + } else { + if ($pow==1) { + $ret[$j] .= $this->_showDigitsGroup($num_groups[$i], 0, !$this->_last_and && $i).$this->_sep; + } elseif ($pow==2) { + $ret[$j] .= $this->_exponent[($pow-1)*3].$this->_sep; + } else { + $ret[$j] .= $this->_digits[1][1].$this->_sep.$this->_exponent[($pow-1)*3].$this->_sep; + } + } + } + } + + return $ret_minus . rtrim(implode('', array_reverse($ret)), $this->_sep); + } + // }}} +} +?> diff --git a/thirdparty/pear/Numbers/Words/lang.de.php b/thirdparty/pear/Numbers/Words/lang.de.php new file mode 100644 index 000000000..5d6026d26 --- /dev/null +++ b/thirdparty/pear/Numbers/Words/lang.de.php @@ -0,0 +1,318 @@ + | +// +----------------------------------------------------------------------+ +// +// $Id: lang.de.php,v 1.5 2003/09/29 12:23:58 makler Exp $ +// +// Numbers_Words class extension to spell numbers in German language. +// + +/** + * + * Class for translating numbers into German. + * @author Piotr Klaban + * @package Numbers_Words + */ + +/** + * Include needed files + */ +require_once("Numbers/Words.php"); + +/** + * Class for translating numbers into German. + * + * @author Piotr Klaban + * @package Numbers_Words + */ +class Numbers_Words_de extends Numbers_Words +{ + + // {{{ properties + + /** + * Locale name + * @var string + * @access public + */ + var $locale = 'de'; + + /** + * Language name in English + * @var string + * @access public + */ + var $lang = 'German'; + + /** + * Native language name + * @var string + * @access public + */ + var $lang_native = 'Deutsch'; + + /** + * The word for the minus sign + * @var string + * @access private + */ + var $_minus = 'Minus'; // minus sign + + /** + * The sufixes for exponents (singular and plural) + * Names partly based on: + * http://german.about.com/library/blzahlenaud.htm + * http://www3.osk.3web.ne.jp/~nagatani/common/zahlwort.htm + * @var array + * @access private + */ + var $_exponent = array( + 0 => array(''), + 3 => array('tausend','tausend'), + 6 => array('Millione','Millionen'), + 9 => array('Milliarde','Milliarden'), + 12 => array('Billion','Billionen'), + 15 => array('Billiarde','Billiarden'), + 18 => array('Trillion','Trillionen'), + 21 => array('Trilliarde','Trilliarden'), + 24 => array('Quadrillion','Quadrillionen'), + 27 => array('Quadrilliarde','Quadrilliarden'), + 30 => array('Quintillion','Quintillionen'), + 33 => array('Quintilliarde','Quintilliarden'), + 36 => array('Sextillion','Sextillionen'), + 39 => array('Sextilliarde','Sextilliarden'), + 42 => array('Septillion','Septillionen'), + 45 => array('Septilliarde','Septilliarden'), + 48 => array('Oktillion','Oktillionen'), // oder Octillionen + 51 => array('Oktilliarde','Oktilliarden'), + 54 => array('Nonillion','Nonillionen'), + 57 => array('Nonilliarde','Nonilliarden'), + 60 => array('Dezillion','Dezillionen'), + 63 => array('Dezilliarde','Dezilliarden'), + 120 => array('Vigintillion','Vigintillionen'), + 123 => array('Vigintilliarde','Vigintilliarden'), + 600 => array('Zentillion','Zentillionen'), // oder Centillion + 603 => array('Zentilliarde','Zentilliarden') + ); + + /** + * The array containing the digits (indexed by the digits themselves). + * @var array + * @access private + */ + var $_digits = array( + 0 => 'null', 'ein', 'zwei', 'drei', 'vier', + 'fnf', 'sechs', 'sieben', 'acht', 'neun' + ); + + /** + * The word separator + * @var string + * @access private + */ + var $_sep = ''; + + /** + * The exponent word separator + * @var string + * @access private + */ + var $_sep2 = ' '; + + // }}} + // {{{ toWords() + + /** + * Converts a number to its word representation + * in German language. + * + * @param integer $num An integer between -infinity and infinity inclusive :) + * that need to be converted to words + * @param integer $power The power of ten for the rest of the number to the right. + * Optional, defaults to 0. + * @param integer $powsuffix The power name to be added to the end of the return string. + * Used internally. Optional, defaults to ''. + * + * @return string The corresponding word representation + * + * @access private + * @author Piotr Klaban + * @since PHP 4.2.3 + */ + function toWords($num, $power = 0, $powsuffix = '') { + $ret = ''; + + // add a minus sign + if (substr($num, 0, 1) == '-') { + $ret = $this->_sep . $this->_minus; + $num = substr($num, 1); + } + + // strip excessive zero signs and spaces + $num = trim($num); + $num = preg_replace('/^0+/','',$num); + + if (strlen($num) > 3) { + $maxp = strlen($num)-1; + $curp = $maxp; + for ($p = $maxp; $p > 0; --$p) { // power + + // check for highest power + if (isset($this->_exponent[$p])) { + // send substr from $curp to $p + $snum = substr($num, $maxp - $curp, $curp - $p + 1); + $snum = preg_replace('/^0+/','',$snum); + if ($snum !== '') { + $cursuffix = $this->_exponent[$power][count($this->_exponent[$power])-1]; + if ($powsuffix != '') + $cursuffix .= $this->_sep . $powsuffix; + $ret .= $this->toWords($snum, $p, $cursuffix); + } + $curp = $p - 1; + continue; + } + } + $num = substr($num, $maxp - $curp, $curp - $p + 1); + if ($num == 0) { + return $ret; + } + } elseif ($num == 0 || $num == '') { + return $this->_sep . $this->_digits[0]; + } + + $h = $t = $d = 0; + + switch(strlen($num)) { + case 3: + $h = (int)substr($num,-3,1); + + case 2: + $t = (int)substr($num,-2,1); + + case 1: + $d = (int)substr($num,-1,1); + break; + + case 0: + return; + break; + } + + if ($h) { + + $ret .= $this->_sep . $this->_digits[$h] . $this->_sep . 'hundert'; + } + + if ($t != 1 && $d > 0) { // add digits only in <0>,<1,9> and <21,inf> + if ($t > 0) { + $ret .= $this->_digits[$d] . 'und'; + } else { + $ret .= $this->_digits[$d]; + if ($d == 1) + if ($power == 0) + $ret .= 's'; // fuer eins + else + $ret .= 'e'; // fuer eine + } + } + + // ten, twenty etc. + switch ($t) { + case 9: + case 8: + case 5: + $ret .= $this->_sep . $this->_digits[$t] . 'zig'; + break; + + case 7: + $ret .= $this->_sep . 'siebzig'; + break; + + case 6: + $ret .= $this->_sep . 'sechzig'; + break; + + case 4: + $ret .= $this->_sep . 'vierzig'; + break; + + case 3: + $ret .= $this->_sep . 'dreiig'; + break; + + case 2: + $ret .= $this->_sep . 'zwanzig'; + break; + + case 1: + switch ($d) { + case 0: + $ret .= $this->_sep . 'zehn'; + break; + + case 1: + $ret .= $this->_sep . 'elf'; + break; + + case 2: + $ret .= $this->_sep . 'zwlf'; + break; + + case 3: + case 4: + case 5: + case 8: + case 9: + $ret .= $this->_sep . $this->_digits[$d] . 'zehn'; + break; + + case 6: + $ret .= $this->_sep . 'sechzehn'; + break; + + case 7: + $ret .= $this->_sep . 'siebzehn'; + break; + } + break; + } + + if ($power > 0) { + if (isset($this->_exponent[$power])) + $lev = $this->_exponent[$power]; + + if (!isset($lev) || !is_array($lev)) + return null; + + if ($power == 3) + $ret .= $this->_sep . $lev[0]; + elseif ($d == 1 && ($t+$h) == 0) + $ret .= $this->_sep2 . $lev[0] . $this->_sep2; + else + $ret .= $this->_sep2 . $lev[1] . $this->_sep2; + } + + if ($powsuffix != '') + $ret .= $this->_sep . $powsuffix; + + return $ret; + } + // }}} +} + +?> diff --git a/thirdparty/pear/Numbers/Words/lang.ee.php b/thirdparty/pear/Numbers/Words/lang.ee.php new file mode 100644 index 000000000..40446a963 --- /dev/null +++ b/thirdparty/pear/Numbers/Words/lang.ee.php @@ -0,0 +1,349 @@ + | +// +----------------------------------------------------------------------+ +// +// $Id: lang.ee.php,v 1.5 2003/09/29 12:23:58 makler Exp $ +// +// Numbers_Words class extension to spell numbers in Estonian language. +// + +/** + * Class for translating numbers into Estonian. + * + * @author Erkki Saarniit + * @package Numbers_Words + */ + +/** + * Include needed files + */ +require_once("Numbers/Words.php"); + +/** + * Class for translating numbers into Estonian. + * + * @author Erkki Saarniit + * @package Numbers_Words + */ +class Numbers_Words_ee extends Numbers_Words +{ + + // {{{ properties + + /** + * Locale name + * @var string + * @access public + */ + var $locale = 'ee'; + + /** + * Language name in English + * @var string + * @access public + */ + var $lang = 'Estonian'; + + /** + * Native language name + * @var string + * @access public + */ + var $lang_native = 'eesti keel'; + + /** + * The word for the minus sign + * @var string + * @access private + */ + var $_minus = 'miinus'; // minus sign + + /** + * The sufixes for exponents (singular and plural) + * Names partly based on: + * http://home.earthlink.net/~mrob/pub/math/largenum.html + * http://mathforum.org/dr.math/faq/faq.large.numbers.html + * http://www.mazes.com/AmericanNumberingSystem.html + * @var array + * @access private + */ + var $_exponent = array( + 0 => array(''), + 3 => array('tuhat'), + 6 => array('miljon'), + 9 => array('miljard'), + 12 => array('triljon'), + 15 => array('kvadriljon'), + 18 => array('kvintiljon'), + 21 => array('sekstiljon'), + 24 => array('septiljon'), + 27 => array('oktiljon'), + 30 => array('noniljon'), + 33 => array('dekiljon'), + 36 => array('undekiljon'), + 39 => array('duodekiljon'), + 42 => array('tredekiljon'), + 45 => array('kvattuordekiljon'), + 48 => array('kvindekiljon'), + 51 => array('seksdekiljon'), + 54 => array('septendekiljon'), + 57 => array('oktodekiljon'), + 60 => array('novemdekiljon'), + 63 => array('vigintiljon'), + 66 => array('unvigintiljon'), + 69 => array('duovigintiljon'), + 72 => array('trevigintiljon'), + 75 => array('kvattuorvigintiljon'), + 78 => array('kvinvigintiljon'), + 81 => array('seksvigintiljon'), + 84 => array('septenvigintiljon'), + 87 => array('oktovigintiljon'), + 90 => array('novemvigintiljon'), + 93 => array('trigintiljon'), + 96 => array('untrigintiljon'), + 99 => array('duotrigintiljon'), + 102 => array('trestrigintiljon'), + 105 => array('kvattuortrigintiljon'), + 108 => array('kvintrigintiljon'), + 111 => array('sekstrigintiljon'), + 114 => array('septentrigintiljon'), + 117 => array('oktotrigintiljon'), + 120 => array('novemtrigintiljon'), + 123 => array('kvadragintiljon'), + 126 => array('unkvadragintiljon'), + 129 => array('duokvadragintiljon'), + 132 => array('trekvadragintiljon'), + 135 => array('kvattuorkvadragintiljon'), + 138 => array('kvinkvadragintiljon'), + 141 => array('sekskvadragintiljon'), + 144 => array('septenkvadragintiljon'), + 147 => array('oktokvadragintiljon'), + 150 => array('novemkvadragintiljon'), + 153 => array('kvinkvagintiljon'), + 156 => array('unkvinkvagintiljon'), + 159 => array('duokvinkvagintiljon'), + 162 => array('trekvinkvagintiljon'), + 165 => array('kvattuorkvinkvagintiljon'), + 168 => array('kvinkvinkvagintiljon'), + 171 => array('sekskvinkvagintiljon'), + 174 => array('septenkvinkvagintiljon'), + 177 => array('oktokvinkvagintiljon'), + 180 => array('novemkvinkvagintiljon'), + 183 => array('seksagintiljon'), + 186 => array('unseksagintiljon'), + 189 => array('duoseksagintiljon'), + 192 => array('treseksagintiljon'), + 195 => array('kvattuorseksagintiljon'), + 198 => array('kvinseksagintiljon'), + 201 => array('seksseksagintiljon'), + 204 => array('septenseksagintiljon'), + 207 => array('oktoseksagintiljon'), + 210 => array('novemseksagintiljon'), + 213 => array('septuagintiljon'), + 216 => array('unseptuagintiljon'), + 219 => array('duoseptuagintiljon'), + 222 => array('treseptuagintiljon'), + 225 => array('kvattuorseptuagintiljon'), + 228 => array('kvinseptuagintiljon'), + 231 => array('seksseptuagintiljon'), + 234 => array('septenseptuagintiljon'), + 237 => array('oktoseptuagintiljon'), + 240 => array('novemseptuagintiljon'), + 243 => array('oktogintiljon'), + 246 => array('unoktogintiljon'), + 249 => array('duooktogintiljon'), + 252 => array('treoktogintiljon'), + 255 => array('kvattuoroktogintiljon'), + 258 => array('kvinoktogintiljon'), + 261 => array('seksoktogintiljon'), + 264 => array('septoktogintiljon'), + 267 => array('oktooktogintiljon'), + 270 => array('novemoktogintiljon'), + 273 => array('nonagintiljon'), + 276 => array('unnonagintiljon'), + 279 => array('duononagintiljon'), + 282 => array('trenonagintiljon'), + 285 => array('kvattuornonagintiljon'), + 288 => array('kvinnonagintiljon'), + 291 => array('seksnonagintiljon'), + 294 => array('septennonagintiljon'), + 297 => array('oktononagintiljon'), + 300 => array('novemnonagintiljon'), + 303 => array('kentiljon'), + 309 => array('duokentiljon'), + 312 => array('trekentiljon'), + 366 => array('primo-vigesimo-kentiljon'), + 402 => array('trestrigintakentiljon'), + 603 => array('dukentiljon'), + 624 => array('septendukentiljon'), + 2421 => array('seksoktingentiljon'), + 3003 => array('milliljon'), + 3000003 => array('milli-milliljon') + ); + + /** + * The array containing the digits (indexed by the digits themselves). + * @var array + * @access private + */ + var $_digits = array( + 0 => 'null', 'ks', 'kaks', 'kolm', 'neli', + 'viis', 'kuus', 'seitse', 'kaheksa', 'heksa' + ); + + /** + * The word separator + * @var string + * @access private + */ + var $_sep = ' '; + + // }}} + // {{{ toWords() + + /** + * Converts a number to its word representation + * in Estonian language + * + * @param integer $num An integer between -infinity and infinity inclusive :) + * that need to be converted to words + * @param integer $power The power of ten for the rest of the number to the right. + * Optional, defaults to 0. + * @param integer $powsuffix The power name to be added to the end of the return string. + * Used internally. Optional, defaults to ''. + * + * @return string The corresponding word representation + * + * @access public + * @since PHP 4.2.3 + */ + function toWords($num, $power = 0, $powsuffix = '') { + $ret = ''; + + if (substr($num, 0, 1) == '-') { + $ret = $this->_sep . $this->_minus; + $num = substr($num, 1); + } + + $num = trim($num); + $num = preg_replace('/^0+/','',$num); + + if (strlen($num) > 3) { + $maxp = strlen($num)-1; + $curp = $maxp; + for ($p = $maxp; $p > 0; --$p) { // power + if (isset($this->_exponent[$p])) { + $snum = substr($num, $maxp - $curp, $curp - $p + 1); + $snum = preg_replace('/^0+/','',$snum); + if ($snum !== '') { + $cursuffix = $this->_exponent[$power][count($this->_exponent[$power])-1]; + if ($powsuffix != '') + $cursuffix .= $this->_sep . $powsuffix; + $ret .= $this->toWords($snum, $p, $cursuffix); + } + $curp = $p - 1; + continue; + } + } + $num = substr($num, $maxp - $curp, $curp - $p + 1); + if ($num == 0) { + return $ret; + } + } elseif ($num == 0 || $num == '') { + return $this->_sep . $this->_digits[0]; + } + + $h = $t = $d = 0; + + switch(strlen($num)) { + case 3: + $h = (int)substr($num,-3,1); + + case 2: + $t = (int)substr($num,-2,1); + + case 1: + $d = (int)substr($num,-1,1); + break; + + case 0: + return; + break; + } + + if ($h) { + $ret .= $this->_sep . $this->_digits[$h] . 'sada'; + + } + + switch ($t) { + case 9: + case 8: + case 7: + case 6: + case 5: + case 4: + case 3: + case 2: + $ret .= $this->_sep . $this->_digits[$t] . 'kmmend'; + break; + + case 1: + switch ($d) { + case 0: + $ret .= $this->_sep . 'kmme'; + break; + + case 1: + case 2: + case 3: + case 4: + case 5: + case 6: + case 7: + case 8: + case 9: + $ret .= $this->_sep . $this->_digits[$d] . 'teist'; + break; + } + break; + } + if ($t != 1 && $d > 0) { + if ($t > 1) { + $ret .= ' ' . $this->_digits[$d]; + } else { + $ret .= $this->_sep . $this->_digits[$d]; + } + } + if ($power > 0) { + if (isset($this->_exponent[$power])) + $lev = $this->_exponent[$power]; + + if (!isset($lev) || !is_array($lev)) + return null; + $ret .= $this->_sep . $lev[0].($num != 1 && $power!= 3 ? 'it' : ''); + } + if ($powsuffix != '') + $ret .= $this->_sep . $powsuffix; + + return $ret; + } + // }}} +} + +?> diff --git a/thirdparty/pear/Numbers/Words/lang.en_100.php b/thirdparty/pear/Numbers/Words/lang.en_100.php new file mode 100644 index 000000000..0032622ac --- /dev/null +++ b/thirdparty/pear/Numbers/Words/lang.en_100.php @@ -0,0 +1,307 @@ + | +// +----------------------------------------------------------------------+ +// +// $Id: lang.en_100.php,v 1.6 2003/09/29 12:23:58 makler Exp $ +// +// Numbers_Words class extension to spell numbers in Donald Knuth system, in English language. +// + +/** + * Class for translating numbers into Donald Knuth system, in English language. + * + * @author Piotr Klaban + * @package Numbers_Words + */ + +/** + * Include needed files + */ +require_once("Numbers/Words.php"); + +/** + * Class for translating numbers into Donald Knuth system, in English language. + * + * @author Piotr Klaban + * @package Numbers_Words + */ +class Numbers_Words_en_100 extends Numbers_Words +{ + + // {{{ properties + + /** + * Locale name + * @var string + * @access public + */ + var $locale = 'en_100'; + + /** + * Language name in English + * @var string + * @access public + */ + var $lang = 'English (Donald Knuth system)'; + + /** + * Native language name + * @var string + * @access public + */ + var $lang_native = 'English (Donald Knuth system)'; + + /** + * The word for the minus sign + * @var string + * @access private + */ + var $_minus = 'minus'; // minus sign + + /** + * The sufixes for exponents (singular and plural) + * Names based on: + * http://home.earthlink.net/~mrob/pub/math/largenum.html + * Donald Knuth system (power of 2) + * @var array + * @access private + */ + var $_exponent = array( + 0 => array(''), + 2 => array('hundred'), + 4 => array('myriad'), + 8 => array('myllion'), + 16 => array('byllion'), + 32 => array('tryllion'), + 64 => array('quadryllion'), + 128 => array('quintyllion'), + 256 => array('sextyllion'), + 512 => array('septyllion'), + 1024 => array('octyllion'), + 2048 => array('nonyllion'), + 4096 => array('decyllion'), + 8192 => array('undecyllion'), + 16384 => array('duodecyllion'), + 32768 => array('tredecyllion'), + 65536 => array('quattuordecyllion'), + 131072 => array('quindecyllion'), + 262144 => array('sexdecyllion'), + 524288 => array('septendecyllion'), + 1048576 => array('octodecyllion'), + 2097152 => array('novemdecyllion'), + 4194304 => array('vigintyllion') + ); + + /** + * The array containing the digits (indexed by the digits themselves). + * @var array + * @access private + */ + var $_digits = array( + 0 => 'zero', 'one', 'two', 'three', 'four', + 'five', 'six', 'seven', 'eight', 'nine' + ); + + /** + * The word separator + * @var string + * @access private + */ + var $_sep = ' '; + // }}} + // {{{ toWords() + /** + * Converts a number to its word representation + * in Donald Knuth system, in English language. + * + * @param integer $num An integer between -infinity and infinity inclusive :) + * that need to be converted to words + * @param integer $power The power of ten for the rest of the number to the right. + * Optional, defaults to 0. + * @param integer $powsuffix The power name to be added to the end of the return string. + * Used internally. Optional, defaults to ''. + * + * @return string The corresponding word representation + * + * @access public + * @author Piotr Klaban + * @since PHP 4.2.3 + */ + function toWords($num, $power = 0, $powsuffix = '') { + $ret = ''; + + // add a minus sign + if (substr($num, 0, 1) == '-') { + $ret = $this->_sep . $this->_minus; + $num = substr($num, 1); + } + + // strip excessive zero signs and spaces + $num = trim($num); + $num = preg_replace('/^0+/','',$num); + + if (strlen($num) > 3) { + $maxp = strlen($num)-1; + $curp = $maxp; + for ($p = $maxp; $p > 0; --$p) { // power + + // check for highest power + if (isset($this->_exponent[$p])) { + // send substr from $curp to $p + $snum = substr($num, $maxp - $curp, $curp - $p + 1); + $snum = preg_replace('/^0+/','',$snum); + if ($snum !== '') { + $cursuffix = $this->_exponent[$power][count($this->_exponent[$power])-1]; + if ($powsuffix != '') + $cursuffix .= $this->_sep . $powsuffix; + $ret .= $this->toWords($snum, $p, ''); // $cursuffix); + // normally cursuffix is added at the end, but not here + } + $curp = $p - 1; + continue; + } + } + $num = substr($num, $maxp - $curp, $curp - $p + 1); + if ($num == 0) { + return $ret; + } + } elseif ($num == 0 || $num == '') { + return $this->_sep . $this->_digits[0]; + } + + $h = $t = $d = 0; + + switch(strlen($num)) { + case 3: + $h = (int)substr($num,-3,1); + + case 2: + $t = (int)substr($num,-2,1); + + case 1: + $d = (int)substr($num,-1,1); + break; + + case 0: + return; + break; + } + + if ($h) { + $ret .= $this->_sep . $this->_digits[$h] . $this->_sep . 'hundred'; + + // in English only - add ' and' for [1-9]01..[1-9]99 + // (also for 1001..1099, 10001..10099 but it is harder) + // for now it is switched off, maybe some language purists + // can force me to enable it, or to remove it completely + // if (($t + $d) > 0) + // $ret .= $this->_sep . 'and'; + } + + // ten, twenty etc. + switch ($t) { + case 9: + case 7: + case 6: + $ret .= $this->_sep . $this->_digits[$t] . 'ty'; + break; + + case 8: + $ret .= $this->_sep . 'eighty'; + break; + + case 5: + $ret .= $this->_sep . 'fifty'; + break; + + case 4: + $ret .= $this->_sep . 'forty'; + break; + + case 3: + $ret .= $this->_sep . 'thirty'; + break; + + case 2: + $ret .= $this->_sep . 'twenty'; + break; + + case 1: + switch ($d) { + case 0: + $ret .= $this->_sep . 'ten'; + break; + + case 1: + $ret .= $this->_sep . 'eleven'; + break; + + case 2: + $ret .= $this->_sep . 'twelve'; + break; + + case 3: + $ret .= $this->_sep . 'thirteen'; + break; + + case 4: + case 6: + case 7: + case 9: + $ret .= $this->_sep . $this->_digits[$d] . 'teen'; + break; + + case 5: + $ret .= $this->_sep . 'fifteen'; + break; + + case 8: + $ret .= $this->_sep . 'eighteen'; + break; + } + break; + } + + if ($t != 1 && $d > 0) { // add digits only in <0>,<1,9> and <21,inf> + // add minus sign between [2-9] and digit + if ($t > 1) { + $ret .= '-' . $this->_digits[$d]; + } else { + $ret .= $this->_sep . $this->_digits[$d]; + } + } + + if ($power > 0) { + if (isset($this->_exponent[$power])) + $lev = $this->_exponent[$power]; + + if (!isset($lev) || !is_array($lev)) + return null; + + $ret .= $this->_sep . $lev[0]; + } + + if ($powsuffix != '') + $ret .= $this->_sep . $powsuffix; + + return $ret; + } + // }}} +} + +?> diff --git a/thirdparty/pear/Numbers/Words/lang.en_GB.php b/thirdparty/pear/Numbers/Words/lang.en_GB.php new file mode 100644 index 000000000..961aed54b --- /dev/null +++ b/thirdparty/pear/Numbers/Words/lang.en_GB.php @@ -0,0 +1,308 @@ + | +// +----------------------------------------------------------------------+ +// +// $Id: lang.en_GB.php,v 1.7 2003/09/29 12:23:58 makler Exp $ +// +// Numbers_Words class extension to spell numbers in British English language. +// + +/** + * Class for translating numbers into British English. + * + * @author Piotr Klaban + * @package Numbers_Words + */ + +/** + * Include needed files + */ +require_once("Numbers/Words.php"); + +/** + * Class for translating numbers into British English. + * + * @author Piotr Klaban + * @package Numbers_Words + */ +class Numbers_Words_en_GB extends Numbers_Words +{ + + // {{{ properties + + /** + * Locale name + * @var string + * @access public + */ + var $locale = 'en_GB'; + + /** + * Language name in English + * @var string + * @access public + */ + var $lang = 'British English'; + + /** + * Native language name + * @var string + * @access public + */ + var $lang_native = 'British English'; + + /** + * The word for the minus sign + * @var string + * @access private + */ + var $_minus = 'minus'; // minus sign + + /** + * The sufixes for exponents (singular and plural) + * Names partly based on: + * http://www.users.dircon.co.uk/~shaunf/shaun/numbers/millions.htm + * @var array + * @access private + */ + var $_exponent = array( + 0 => array(''), + 3 => array('thousand'), + 6 => array('million'), + 12 => array('billion'), + 18 => array('trillion'), + 24 => array('quadrillion'), + 30 => array('quintillion'), + 36 => array('sextillion'), + 42 => array('septillion'), + 48 => array('octillion'), + 54 => array('nonillion'), + 60 => array('decillion'), + 66 => array('undecillion'), + 72 => array('duodecillion'), + 78 => array('tredecillion'), + 84 => array('quattuordecillion'), + 90 => array('quindecillion'), + 96 => array('sexdecillion'), + 102 => array('septendecillion'), + 108 => array('octodecillion'), + 114 => array('novemdecillion'), + 120 => array('vigintillion'), + 192 => array('duotrigintillion'), + 600 => array('centillion') + ); + + /** + * The array containing the digits (indexed by the digits themselves). + * @var array + * @access private + */ + var $_digits = array( + 0 => 'zero', 'one', 'two', 'three', 'four', + 'five', 'six', 'seven', 'eight', 'nine' + ); + + /** + * The word separator + * @var string + * @access private + */ + var $_sep = ' '; + + // }}} + // {{{ toWords() + + /** + * Converts a number to its word representation + * in British English language + * + * @param integer $num An integer between -infinity and infinity inclusive :) + * that need to be converted to words + * @param integer $power The power of ten for the rest of the number to the right. + * Optional, defaults to 0. + * @param integer $powsuffix The power name to be added to the end of the return string. + * Used internally. Optional, defaults to ''. + * + * @return string The corresponding word representation + * + * @access public + * @author Piotr Klaban + * @since PHP 4.2.3 + */ + function toWords($num, $power = 0, $powsuffix = '') { + $ret = ''; + + // add a minus sign + if (substr($num, 0, 1) == '-') { + $ret = $this->_sep . $this->_minus; + $num = substr($num, 1); + } + + // strip excessive zero signs and spaces + $num = trim($num); + $num = preg_replace('/^0+/','',$num); + + if (strlen($num) > 3) { + $maxp = strlen($num)-1; + $curp = $maxp; + for ($p = $maxp; $p > 0; --$p) { // power + + // check for highest power + if (isset($this->_exponent[$p])) { + // send substr from $curp to $p + $snum = substr($num, $maxp - $curp, $curp - $p + 1); + $snum = preg_replace('/^0+/','',$snum); + if ($snum !== '') { + $cursuffix = $this->_exponent[$power][count($this->_exponent[$power])-1]; + if ($powsuffix != '') + $cursuffix .= $this->_sep . $powsuffix; + $ret .= $this->toWords($snum, $p, $cursuffix); + } + $curp = $p - 1; + continue; + } + } + $num = substr($num, $maxp - $curp, $curp - $p + 1); + if ($num == 0) { + return $ret; + } + } elseif ($num == 0 || $num == '') { + return $this->_sep . $this->_digits[0]; + } + + $h = $t = $d = 0; + + switch(strlen($num)) { + case 3: + $h = (int)substr($num,-3,1); + + case 2: + $t = (int)substr($num,-2,1); + + case 1: + $d = (int)substr($num,-1,1); + break; + + case 0: + return; + break; + } + + if ($h) { + $ret .= $this->_sep . $this->_digits[$h] . $this->_sep . 'hundred'; + + // in English only - add ' and' for [1-9]01..[1-9]99 + // (also for 1001..1099, 10001..10099 but it is harder) + // for now it is switched off, maybe some language purists + // can force me to enable it, or to remove it completely + // if (($t + $d) > 0) + // $ret .= $this->_sep . 'and'; + } + + // ten, twenty etc. + switch ($t) { + case 9: + case 7: + case 6: + $ret .= $this->_sep . $this->_digits[$t] . 'ty'; + break; + + case 8: + $ret .= $this->_sep . 'eighty'; + break; + + case 5: + $ret .= $this->_sep . 'fifty'; + break; + + case 4: + $ret .= $this->_sep . 'forty'; + break; + + case 3: + $ret .= $this->_sep . 'thirty'; + break; + + case 2: + $ret .= $this->_sep . 'twenty'; + break; + + case 1: + switch ($d) { + case 0: + $ret .= $this->_sep . 'ten'; + break; + + case 1: + $ret .= $this->_sep . 'eleven'; + break; + + case 2: + $ret .= $this->_sep . 'twelve'; + break; + + case 3: + $ret .= $this->_sep . 'thirteen'; + break; + + case 4: + case 6: + case 7: + case 9: + $ret .= $this->_sep . $this->_digits[$d] . 'teen'; + break; + + case 5: + $ret .= $this->_sep . 'fifteen'; + break; + + case 8: + $ret .= $this->_sep . 'eighteen'; + break; + } + break; + } + + if ($t != 1 && $d > 0) { // add digits only in <0>,<1,9> and <21,inf> + // add minus sign between [2-9] and digit + if ($t > 1) { + $ret .= '-' . $this->_digits[$d]; + } else { + $ret .= $this->_sep . $this->_digits[$d]; + } + } + + if ($power > 0) { + if (isset($this->_exponent[$power])) + $lev = $this->_exponent[$power]; + + if (!isset($lev) || !is_array($lev)) + return null; + + $ret .= $this->_sep . $lev[0]; + } + + if ($powsuffix != '') + $ret .= $this->_sep . $powsuffix; + + return $ret; + } + // }}} +} + +?> diff --git a/thirdparty/pear/Numbers/Words/lang.en_US.php b/thirdparty/pear/Numbers/Words/lang.en_US.php new file mode 100644 index 000000000..47e2f7bfa --- /dev/null +++ b/thirdparty/pear/Numbers/Words/lang.en_US.php @@ -0,0 +1,509 @@ + | +// +----------------------------------------------------------------------+ +// +// $Id: lang.en_US.php,v 1.7 2003/09/29 12:23:58 makler Exp $ +// +// Numbers_Words class extension to spell numbers in American English language. +// + +/** + * Class for translating numbers into American English. + * + * @author Piotr Klaban + * @package Numbers_Words + */ + +/** + * Include needed files + */ +require_once("Numbers/Words.php"); + +/** + * Class for translating numbers into American English. + * + * @author Piotr Klaban + * @package Numbers_Words + */ +class Numbers_Words_en_US extends Numbers_Words +{ + + // {{{ properties + + /** + * Locale name + * @var string + * @access public + */ + var $locale = 'en_US'; + + /** + * Language name in English + * @var string + * @access public + */ + var $lang = 'American English'; + + /** + * Native language name + * @var string + * @access public + */ + var $lang_native = 'American English'; + + /** + * The word for the minus sign + * @var string + * @access private + */ + var $_minus = 'minus'; // minus sign + + /** + * The sufixes for exponents (singular and plural) + * Names partly based on: + * http://home.earthlink.net/~mrob/pub/math/largenum.html + * http://mathforum.org/dr.math/faq/faq.large.numbers.html + * http://www.mazes.com/AmericanNumberingSystem.html + * @var array + * @access private + */ + var $_exponent = array( + 0 => array(''), + 3 => array('thousand'), + 6 => array('million'), + 9 => array('billion'), + 12 => array('trillion'), + 15 => array('quadrillion'), + 18 => array('quintillion'), + 21 => array('sextillion'), + 24 => array('septillion'), + 27 => array('octillion'), + 30 => array('nonillion'), + 33 => array('decillion'), + 36 => array('undecillion'), + 39 => array('duodecillion'), + 42 => array('tredecillion'), + 45 => array('quattuordecillion'), + 48 => array('quindecillion'), + 51 => array('sexdecillion'), + 54 => array('septendecillion'), + 57 => array('octodecillion'), + 60 => array('novemdecillion'), + 63 => array('vigintillion'), + 66 => array('unvigintillion'), + 69 => array('duovigintillion'), + 72 => array('trevigintillion'), + 75 => array('quattuorvigintillion'), + 78 => array('quinvigintillion'), + 81 => array('sexvigintillion'), + 84 => array('septenvigintillion'), + 87 => array('octovigintillion'), + 90 => array('novemvigintillion'), + 93 => array('trigintillion'), + 96 => array('untrigintillion'), + 99 => array('duotrigintillion'), + // 100 => array('googol') - not latin name + // 10^googol = 1 googolplex + 102 => array('trestrigintillion'), + 105 => array('quattuortrigintillion'), + 108 => array('quintrigintillion'), + 111 => array('sextrigintillion'), + 114 => array('septentrigintillion'), + 117 => array('octotrigintillion'), + 120 => array('novemtrigintillion'), + 123 => array('quadragintillion'), + 126 => array('unquadragintillion'), + 129 => array('duoquadragintillion'), + 132 => array('trequadragintillion'), + 135 => array('quattuorquadragintillion'), + 138 => array('quinquadragintillion'), + 141 => array('sexquadragintillion'), + 144 => array('septenquadragintillion'), + 147 => array('octoquadragintillion'), + 150 => array('novemquadragintillion'), + 153 => array('quinquagintillion'), + 156 => array('unquinquagintillion'), + 159 => array('duoquinquagintillion'), + 162 => array('trequinquagintillion'), + 165 => array('quattuorquinquagintillion'), + 168 => array('quinquinquagintillion'), + 171 => array('sexquinquagintillion'), + 174 => array('septenquinquagintillion'), + 177 => array('octoquinquagintillion'), + 180 => array('novemquinquagintillion'), + 183 => array('sexagintillion'), + 186 => array('unsexagintillion'), + 189 => array('duosexagintillion'), + 192 => array('tresexagintillion'), + 195 => array('quattuorsexagintillion'), + 198 => array('quinsexagintillion'), + 201 => array('sexsexagintillion'), + 204 => array('septensexagintillion'), + 207 => array('octosexagintillion'), + 210 => array('novemsexagintillion'), + 213 => array('septuagintillion'), + 216 => array('unseptuagintillion'), + 219 => array('duoseptuagintillion'), + 222 => array('treseptuagintillion'), + 225 => array('quattuorseptuagintillion'), + 228 => array('quinseptuagintillion'), + 231 => array('sexseptuagintillion'), + 234 => array('septenseptuagintillion'), + 237 => array('octoseptuagintillion'), + 240 => array('novemseptuagintillion'), + 243 => array('octogintillion'), + 246 => array('unoctogintillion'), + 249 => array('duooctogintillion'), + 252 => array('treoctogintillion'), + 255 => array('quattuoroctogintillion'), + 258 => array('quinoctogintillion'), + 261 => array('sexoctogintillion'), + 264 => array('septoctogintillion'), + 267 => array('octooctogintillion'), + 270 => array('novemoctogintillion'), + 273 => array('nonagintillion'), + 276 => array('unnonagintillion'), + 279 => array('duononagintillion'), + 282 => array('trenonagintillion'), + 285 => array('quattuornonagintillion'), + 288 => array('quinnonagintillion'), + 291 => array('sexnonagintillion'), + 294 => array('septennonagintillion'), + 297 => array('octononagintillion'), + 300 => array('novemnonagintillion'), + 303 => array('centillion'), + 309 => array('duocentillion'), + 312 => array('trecentillion'), + 366 => array('primo-vigesimo-centillion'), + 402 => array('trestrigintacentillion'), + 603 => array('ducentillion'), + 624 => array('septenducentillion'), + // bug on a earthlink page: 903 => array('trecentillion'), + 2421 => array('sexoctingentillion'), + 3003 => array('millillion'), + 3000003 => array('milli-millillion') + ); + + /** + * The array containing the digits (indexed by the digits themselves). + * @var array + * @access private + */ + var $_digits = array( + 0 => 'zero', 'one', 'two', 'three', 'four', + 'five', 'six', 'seven', 'eight', 'nine' + ); + + /** + * The word separator + * @var string + * @access private + */ + var $_sep = ' '; + + /** + * The currency names (based on the below links, + * informations from central bank websites and on encyclopedias) + * + * @var array + * @link http://30-03-67.dreamstation.com/currency_alfa.htm World Currency Information + * @link http://www.jhall.demon.co.uk/currency/by_abbrev.html World currencies + * @link http://www.shoestring.co.kr/world/p.visa/change.htm Currency names in English + * @access private + */ + var $_currency_names = array( + 'ALL' => array(array('lek'), array('qindarka')), + 'AUD' => array(array('Australian dollar'), array('cent')), + 'BAM' => array(array('convertible marka'), array('fenig')), + 'BGN' => array(array('lev'), array('stotinka')), + 'BRL' => array(array('real'), array('centavos')), + 'BYR' => array(array('Belarussian rouble'), array('kopiejka')), + 'CAD' => array(array('Canadian dollar'), array('cent')), + 'CHF' => array(array('Swiss franc'), array('rapp')), + 'CYP' => array(array('Cypriot pound'), array('cent')), + 'CZK' => array(array('Czech koruna'), array('halerz')), + 'DKK' => array(array('Danish krone'), array('ore')), + 'EEK' => array(array('kroon'), array('senti')), + 'EUR' => array(array('euro'), array('euro-cent')), + 'GBP' => array(array('pound', 'pounds'), array('pence')), + 'HKD' => array(array('Hong Kong dollar'), array('cent')), + 'HRK' => array(array('Croatian kuna'), array('lipa')), + 'HUF' => array(array('forint'), array('filler')), + 'ISK' => array(array('Icelandic krna'), array('aurar')), + 'JPY' => array(array('yen'), array('sen')), + 'LTL' => array(array('litas'), array('cent')), + 'LVL' => array(array('lat'), array('sentim')), + 'MKD' => array(array('Macedonian dinar'), array('deni')), + 'MTL' => array(array('Maltese lira'), array('centym')), + 'NOK' => array(array('Norwegian krone'), array('oere')), + 'PLN' => array(array('zloty', 'zlotys'), array('grosz')), + 'ROL' => array(array('Romanian leu'), array('bani')), + 'RUB' => array(array('Russian Federation rouble'), array('kopiejka')), + 'SEK' => array(array('Swedish krona'), array('oere')), + 'SIT' => array(array('Tolar'), array('stotinia')), + 'SKK' => array(array('Slovak koruna'), array()), + 'TRL' => array(array('lira'), array('kuru')), + 'UAH' => array(array('hryvna'), array('cent')), + 'USD' => array(array('dollar'), array('cent')), + 'YUM' => array(array('dinars'), array('para')), + 'ZAR' => array(array('rand'), array('cent')), + 'MXN' => array(array('Mexican Peso'), array('cent')) + ); + + /** + * The default currency name + * @var string + * @access public + */ + var $def_currency = 'USD'; // Polish zloty + + // }}} + // {{{ toWords() + + /** + * Converts a number to its word representation + * in American English language + * + * @param integer $num An integer between -infinity and infinity inclusive :) + * that need to be converted to words + * @param integer $power The power of ten for the rest of the number to the right. + * Optional, defaults to 0. + * @param integer $powsuffix The power name to be added to the end of the return string. + * Used internally. Optional, defaults to ''. + * + * @return string The corresponding word representation + * + * @access public + * @author Piotr Klaban + * @since PHP 4.2.3 + */ + function toWords($num, $power = 0, $powsuffix = '') { + $ret = ''; + + // add a minus sign + if (substr($num, 0, 1) == '-') { + $ret = $this->_sep . $this->_minus; + $num = substr($num, 1); + } + + // strip excessive zero signs and spaces + $num = trim($num); + $num = preg_replace('/^0+/','',$num); + + if (strlen($num) > 3) { + $maxp = strlen($num)-1; + $curp = $maxp; + for ($p = $maxp; $p > 0; --$p) { // power + + // check for highest power + if (isset($this->_exponent[$p])) { + // send substr from $curp to $p + $snum = substr($num, $maxp - $curp, $curp - $p + 1); + $snum = preg_replace('/^0+/','',$snum); + if ($snum !== '') { + $cursuffix = $this->_exponent[$power][count($this->_exponent[$power])-1]; + if ($powsuffix != '') + $cursuffix .= $this->_sep . $powsuffix; + $ret .= $this->toWords($snum, $p, $cursuffix); + } + $curp = $p - 1; + continue; + } + } + $num = substr($num, $maxp - $curp, $curp - $p + 1); + if ($num == 0) { + return $ret; + } + } elseif ($num == 0 || $num == '') { + return $this->_sep . $this->_digits[0]; + } + + $h = $t = $d = 0; + + switch(strlen($num)) { + case 3: + $h = (int)substr($num,-3,1); + + case 2: + $t = (int)substr($num,-2,1); + + case 1: + $d = (int)substr($num,-1,1); + break; + + case 0: + return; + break; + } + + if ($h) { + $ret .= $this->_sep . $this->_digits[$h] . $this->_sep . 'hundred'; + + // in English only - add ' and' for [1-9]01..[1-9]99 + // (also for 1001..1099, 10001..10099 but it is harder) + // for now it is switched off, maybe some language purists + // can force me to enable it, or to remove it completely + // if (($t + $d) > 0) + // $ret .= $this->_sep . 'and'; + } + + // ten, twenty etc. + switch ($t) { + case 9: + case 7: + case 6: + $ret .= $this->_sep . $this->_digits[$t] . 'ty'; + break; + + case 8: + $ret .= $this->_sep . 'eighty'; + break; + + case 5: + $ret .= $this->_sep . 'fifty'; + break; + + case 4: + $ret .= $this->_sep . 'forty'; + break; + + case 3: + $ret .= $this->_sep . 'thirty'; + break; + + case 2: + $ret .= $this->_sep . 'twenty'; + break; + + case 1: + switch ($d) { + case 0: + $ret .= $this->_sep . 'ten'; + break; + + case 1: + $ret .= $this->_sep . 'eleven'; + break; + + case 2: + $ret .= $this->_sep . 'twelve'; + break; + + case 3: + $ret .= $this->_sep . 'thirteen'; + break; + + case 4: + case 6: + case 7: + case 9: + $ret .= $this->_sep . $this->_digits[$d] . 'teen'; + break; + + case 5: + $ret .= $this->_sep . 'fifteen'; + break; + + case 8: + $ret .= $this->_sep . 'eighteen'; + break; + } + break; + } + + if ($t != 1 && $d > 0) { // add digits only in <0>,<1,9> and <21,inf> + // add minus sign between [2-9] and digit + if ($t > 1) { + $ret .= '-' . $this->_digits[$d]; + } else { + $ret .= $this->_sep . $this->_digits[$d]; + } + } + + if ($power > 0) { + if (isset($this->_exponent[$power])) + $lev = $this->_exponent[$power]; + + if (!isset($lev) || !is_array($lev)) + return null; + + $ret .= $this->_sep . $lev[0]; + } + + if ($powsuffix != '') + $ret .= $this->_sep . $powsuffix; + + return $ret; + } + // }}} + // {{{ toCurrency() + + /** + * Converts a currency value to its word representation + * (with monetary units) in English language + * + * @param integer $int_curr An international currency symbol + * as defined by the ISO 4217 standard (three characters) + * @param integer $decimal A money total amount without fraction part (e.g. amount of dollars) + * @param integer $fraction Fractional part of the money amount (e.g. amount of cents) + * Optional. Defaults to false. + * + * @return string The corresponding word representation for the currency + * + * @access public + * @author Piotr Klaban + * @since Numbers_Words 0.4 + */ + function toCurrencyWords($int_curr, $decimal, $fraction = false) { + $int_curr = strtoupper($int_curr); + if (!isset($this->_currency_names[$int_curr])) { + $int_curr = $this->def_currency; + } + $curr_names = $this->_currency_names[$int_curr]; + $ret = trim($this->toWords($decimal)); + $lev = ($decimal == 1) ? 0 : 1; + if ($lev > 0) { + if (count($curr_names[0]) > 1) { + $ret .= $this->_sep . $curr_names[0][$lev]; + } else { + $ret .= $this->_sep . $curr_names[0][0] . 's'; + } + } else { + $ret .= $this->_sep . $curr_names[0][0]; + } + + if ($fraction !== false) { + $ret .= $this->_sep . trim($this->toWords($fraction)); + $lev = ($fraction == 1) ? 0 : 1; + if ($lev > 0) { + if (count($curr_names[1]) > 1) { + $ret .= $this->_sep . $curr_names[1][$lev]; + } else { + $ret .= $this->_sep . $curr_names[1][0] . 's'; + } + } else { + $ret .= $this->_sep . $curr_names[1][0]; + } + } + return $ret; + } + // }}} + +} + +?> diff --git a/thirdparty/pear/Numbers/Words/lang.es.php b/thirdparty/pear/Numbers/Words/lang.es.php new file mode 100644 index 000000000..267937c28 --- /dev/null +++ b/thirdparty/pear/Numbers/Words/lang.es.php @@ -0,0 +1,343 @@ + array('',''), + 3 => array('mil','mil'), + 6 => array('milln','millones'), + 12 => array('billn','billones'), + 18 => array('triln','trillones'), + 24 => array('cuatrilln','cuatrillones'), + 30 => array('quintilln','quintillones'), + 36 => array('sextilln','sextillones'), + 42 => array('septilln','septillones'), + 48 => array('octalln','octallones'), + 54 => array('nonalln','nonallones'), + 60 => array('decalln','decallones'), + ); + /** + * The array containing the digits (indexed by the digits themselves). + * @var array + * @access private + */ + var $_digits = array( + 0 => 'cero', 'uno', 'dos', 'tres', 'cuatro', + 'cinco', 'seis', 'siete', 'ocho', 'nueve' + ); + /** + * The word separator + * @var string + * @access private + */ + var $_sep = ' '; + // }}} + // {{{ toWords() + /** + * Converts a number to its word representation + * in Spanish (Castellano). + * + * @param integer $num An integer between -infinity and infinity inclusive :) + * that should be converted to a words representation + * @param integer $power The power of ten for the rest of the number to the right. + * For example toWords(12,3) should give "doce mil". + * Optional, defaults to 0. + * @return string The corresponding word representation + * + * @access private + * @author Xavier Noguer + * @since PHP 4.2.3 + */ + function toWords($num, $power = 0) + { + // The return string; + $ret = ''; + + // add a the word for the minus sign if necessary + if (substr($num, 0, 1) == '-') + { + $ret = $this->_sep . $this->_minus; + $num = substr($num, 1); + } + + + // strip excessive zero signs + $num = preg_replace('/^0+/','',$num); + + if (strlen($num) > 6) + { + $current_power = 6; + // check for highest power + if (isset($this->_exponent[$power])) + { + // convert the number above the first 6 digits + // with it's corresponding $power. + $snum = substr($num, 0, -6); + $snum = preg_replace('/^0+/','',$snum); + if ($snum !== '') { + $ret .= $this->toWords($snum, $power + 6); + } + } + $num = substr($num, -6); + if ($num == 0) { + return $ret; + } + } + elseif ($num == 0 || $num == '') { + return(' '.$this->_digits[0]); + $current_power = strlen($num); + } + else { + $current_power = strlen($num); + } + + // See if we need "thousands" + $thousands = floor($num / 1000); + if ($thousands == 1) { + $ret .= $this->_sep . 'mil'; + } + elseif ($thousands > 1) { + $ret .= $this->toWords($thousands, 3); + } + + // values for digits, tens and hundreds + $h = floor(($num / 100) % 10); + $t = floor(($num / 10) % 10); + $d = floor($num % 10); + + // cientos: doscientos, trescientos, etc... + switch ($h) + { + case 1: + if (($d == 0) and ($t == 0)) { // is it's '100' use 'cien' + $ret .= $this->_sep . 'cien'; + } + else { + $ret .= $this->_sep . 'ciento'; + } + break; + case 2: + case 3: + case 4: + case 6: + case 8: + $ret .= $this->_sep . $this->_digits[$h] . 'cientos'; + break; + case 5: + $ret .= $this->_sep . 'quinientos'; + break; + case 7: + $ret .= $this->_sep . 'setecientos'; + break; + case 9: + $ret .= $this->_sep . 'novecientos'; + break; + } + + // decenas: veinte, treinta, etc... + switch ($t) + { + case 9: + $ret .= $this->_sep . 'noventa'; + break; + + case 8: + $ret .= $this->_sep . 'ochenta'; + break; + + case 7: + $ret .= $this->_sep . 'setenta'; + break; + + case 6: + $ret .= $this->_sep . 'sesenta'; + break; + + case 5: + $ret .= $this->_sep . 'cincuenta'; + break; + + case 4: + $ret .= $this->_sep . 'cuarenta'; + break; + + case 3: + $ret .= $this->_sep . 'treinta'; + break; + + case 2: + if ($d == 0) { + $ret .= $this->_sep . 'veinte'; + } + else { + if (($power > 0) and ($d == 1)) { + $ret .= $this->_sep . 'veintin'; + } + else { + $ret .= $this->_sep . 'veinti' . $this->_digits[$d]; + } + } + break; + + case 1: + switch ($d) + { + case 0: + $ret .= $this->_sep . 'diez'; + break; + + case 1: + $ret .= $this->_sep . 'once'; + break; + + case 2: + $ret .= $this->_sep . 'doce'; + break; + + case 3: + $ret .= $this->_sep . 'trece'; + break; + + case 4: + $ret .= $this->_sep . 'catorce'; + break; + + case 5: + $ret .= $this->_sep . 'quince'; + break; + + case 6: + case 7: + case 9: + case 8: + $ret .= $this->_sep . 'dieci' . $this->_digits[$d]; + break; + } + break; + } + + // add digits only if it is a multiple of 10 and not 1x or 2x + if (($t != 1) and ($t != 2) and ($d > 0)) + { + if($t != 0) // don't add 'y' for numbers below 10 + { + // use 'un' instead of 'uno' when there is a suffix ('mil', 'millones', etc...) + if(($power > 0) and ($d == 1)) { + $ret .= $this->_sep.' y un'; + } + else { + $ret .= $this->_sep.'y '.$this->_digits[$d]; + } + } + else { + if(($power > 0) and ($d == 1)) { + $ret .= $this->_sep.'un'; + } + else { + $ret .= $this->_sep.$this->_digits[$d]; + } + } + } + + if ($power > 0) + { + if (isset($this->_exponent[$power])) { + $lev = $this->_exponent[$power]; + } + + if (!isset($lev) || !is_array($lev)) { + return null; + } + + // if it's only one use the singular suffix + if (($d == 1) and ($t == 0) and ($h == 0)) { + $suffix = $lev[0]; + } + else { + $suffix = $lev[1]; + } + if ($num != 0) { + $ret .= $this->_sep . $suffix; + } + } + + return $ret; + } + // }}} +} +?> diff --git a/thirdparty/pear/Numbers/Words/lang.es_AR.php b/thirdparty/pear/Numbers/Words/lang.es_AR.php new file mode 100644 index 000000000..4750631c5 --- /dev/null +++ b/thirdparty/pear/Numbers/Words/lang.es_AR.php @@ -0,0 +1,470 @@ + | +// | Based On: lang_es.php - Xavier Noguer | +// +----------------------------------------------------------------------+ +// $Id: lang.es_AR.php 503 2004-02-23 19:25:42Z mmarre $ +// +// Numbers_Words class extension to spell numbers in Argentinian Spanish +// +// + +/** + * Class for translating numbers into Argentinian Spanish. + * + * @author Martin Marrese + * @package Numbers_Words + */ + +/** + * Include needed files + */ +require_once("Numbers/Words.php"); + +/** + * Class for translating numbers into Argentinian Spanish. + * It supports up to decallones (10^6). + * It doesn't support spanish tonic accents (acentos). + * + * @author Martin Marrese + * @package Numbers_Words + */ +class Numbers_Words_es_AR extends Numbers_Words +{ + // {{{ properties + + /** + * Locale name + * @var string + * @access public + */ + var $locale = 'es_AR'; + + /** + * Language name in English + * @var string + * @access public + */ + var $lang = 'Spanish'; + + /** + * Native language name + * @var string + * @access public + */ + var $lang_native = 'Espaol'; + + /** + * The word for the minus sign + * @var string + * @access private + */ + var $_minus = 'menos'; + + /** + * The sufixes for exponents (singular and plural) + * @var array + * @access private + */ + var $_exponent = array( + 0 => array('',''), + 3 => array('mil','mil'), + 6 => array('milln','millones'), + 12 => array('billn','billones'), + 18 => array('triln','trillones'), + 24 => array('cuatrilln','cuatrillones'), + 30 => array('quintilln','quintillones'), + 36 => array('sextilln','sextillones'), + 42 => array('septilln','septillones'), + 48 => array('octalln','octallones'), + 54 => array('nonalln','nonallones'), + 60 => array('decalln','decallones'), + ); + /** + * The array containing the digits (indexed by the digits themselves). + * @var array + * @access private + */ + var $_digits = array( + 0 => 'cero', 'uno', 'dos', 'tres', 'cuatro', + 'cinco', 'seis', 'siete', 'ocho', 'nueve' + ); + /** + * The word separator + * @var string + * @access private + */ + var $_sep = ' '; + + /** + * The currency names (based on the below links, + * informations from central bank websites and on encyclopedias) + * + * @var array + * @link http://30-03-67.dreamstation.com/currency_alfa.htm World Currency Information + * @link http://www.jhall.demon.co.uk/currency/by_abbrev.html World currencies + * @link http://www.shoestring.co.kr/world/p.visa/change.htm Currency names in English + * @access private + */ + var $_currency_names = array( + 'ALL' => array(array('lek'), array('qindarka')), + 'AUD' => array(array('Australian dollar'), array('cent')), + 'ARS' => array(array('Peso'), array ('centavo')), + 'BAM' => array(array('convertible marka'), array('fenig')), + 'BGN' => array(array('lev'), array('stotinka')), + 'BRL' => array(array('real'), array('centavos')), + 'BYR' => array(array('Belarussian rouble'), array('kopiejka')), + 'CAD' => array(array('Canadian dollar'), array('cent')), + 'CHF' => array(array('Swiss franc'), array('rapp')), + 'CYP' => array(array('Cypriot pound'), array('cent')), + 'CZK' => array(array('Czech koruna'), array('halerz')), + 'DKK' => array(array('Danish krone'), array('ore')), + 'EEK' => array(array('kroon'), array('senti')), + 'EUR' => array(array('euro'), array('euro-cent')), + 'GBP' => array(array('pound', 'pounds'), array('pence')), + 'HKD' => array(array('Hong Kong dollar'), array('cent')), + 'HRK' => array(array('Croatian kuna'), array('lipa')), + 'HUF' => array(array('forint'), array('filler')), + 'ISK' => array(array('Icelandic krna'), array('aurar')), + 'JPY' => array(array('yen'), array('sen')), + 'LTL' => array(array('litas'), array('cent')), + 'LVL' => array(array('lat'), array('sentim')), + 'MKD' => array(array('Macedonian dinar'), array('deni')), + 'MTL' => array(array('Maltese lira'), array('centym')), + 'NOK' => array(array('Norwegian krone'), array('oere')), + 'PLN' => array(array('zloty', 'zlotys'), array('grosz')), + 'ROL' => array(array('Romanian leu'), array('bani')), + 'RUB' => array(array('Russian Federation rouble'), array('kopiejka')), + 'SEK' => array(array('Swedish krona'), array('oere')), + 'SIT' => array(array('Tolar'), array('stotinia')), + 'SKK' => array(array('Slovak koruna'), array()), + 'TRL' => array(array('lira'), array('kuru')), + 'UAH' => array(array('hryvna'), array('cent')), + 'USD' => array(array('dolar', 'DLARES'), array('centavo')), + 'YUM' => array(array('dinars'), array('para')), + 'ZAR' => array(array('rand'), array('cent')), + 'MXN' => array(array('Peso Mexicano', 'Pesos Mexicanos'), array('centavo')) + ); + + /** + * The default currency name + * @var string + * @access public + */ + var $def_currency = 'ARS'; // Argentinian Peso + + // }}} + // {{{ toWords() + /** + * Converts a number to its word representation + * in Argentinian Spanish. + * + * @param float $num An float between -infinity and infinity inclusive :) + * that should be converted to a words representation + * @param integer $power The power of ten for the rest of the number to the right. + * For example toWords(12,3) should give "doce mil". + * Optional, defaults to 0. + * @return string The corresponding word representation + * + * @access private + * @author Martin Marrese + */ + function toWords($num, $power = 0) + { + // The return string; + $ret = ''; + + // add a the word for the minus sign if necessary + if (substr($num, 0, 1) == '-') + { + $ret = $this->_sep . $this->_minus; + $num = substr($num, 1); + } + + + // strip excessive zero signs + $num = preg_replace('/^0+/','',$num); + + $num_tmp = split ('\.', $num); + + $num = $num_tmp[0]; + $dec = (@$num_tmp[1]) ? $num_tmp[1] : ''; + + if (strlen($num) > 6) + { + $current_power = 6; + // check for highest power + if (isset($this->_exponent[$power])) + { + // convert the number above the first 6 digits + // with it's corresponding $power. + $snum = substr($num, 0, -6); + $snum = preg_replace('/^0+/','',$snum); + if ($snum !== '') { + $ret .= $this->toWords($snum, $power + 6); + } + } + $num = substr($num, -6); + if ($num == 0) { + return $ret; + } + } + elseif ($num == 0 || $num == '') { + return(' '.$this->_digits[0]); + $current_power = strlen($num); + } + else { + $current_power = strlen($num); + } + + // See if we need "thousands" + $thousands = floor($num / 1000); + if ($thousands == 1) { + $ret .= $this->_sep . 'mil'; + } + elseif ($thousands > 1) { + $ret .= $this->toWords($thousands, 3); + } + + // values for digits, tens and hundreds + $h = floor(($num / 100) % 10); + $t = floor(($num / 10) % 10); + $d = floor($num % 10); + + // cientos: doscientos, trescientos, etc... + switch ($h) + { + case 1: + if (($d == 0) and ($t == 0)) { // is it's '100' use 'cien' + $ret .= $this->_sep . 'cien'; + } + else { + $ret .= $this->_sep . 'ciento'; + } + break; + case 2: + case 3: + case 4: + case 6: + case 8: + $ret .= $this->_sep . $this->_digits[$h] . 'cientos'; + break; + case 5: + $ret .= $this->_sep . 'quinientos'; + break; + case 7: + $ret .= $this->_sep . 'setecientos'; + break; + case 9: + $ret .= $this->_sep . 'novecientos'; + break; + } + + // decenas: veinte, treinta, etc... + switch ($t) + { + case 9: + $ret .= $this->_sep . 'noventa'; + break; + + case 8: + $ret .= $this->_sep . 'ochenta'; + break; + + case 7: + $ret .= $this->_sep . 'setenta'; + break; + + case 6: + $ret .= $this->_sep . 'sesenta'; + break; + + case 5: + $ret .= $this->_sep . 'cincuenta'; + break; + + case 4: + $ret .= $this->_sep . 'cuarenta'; + break; + + case 3: + $ret .= $this->_sep . 'treinta'; + break; + + case 2: + if ($d == 0) { + $ret .= $this->_sep . 'veinte'; + } + else { + if (($power > 0) and ($d == 1)) { + $ret .= $this->_sep . 'veintin'; + } + else { + $ret .= $this->_sep . 'veinti' . $this->_digits[$d]; + } + } + break; + + case 1: + switch ($d) + { + case 0: + $ret .= $this->_sep . 'diez'; + break; + + case 1: + $ret .= $this->_sep . 'once'; + break; + + case 2: + $ret .= $this->_sep . 'doce'; + break; + + case 3: + $ret .= $this->_sep . 'trece'; + break; + + case 4: + $ret .= $this->_sep . 'catorce'; + break; + + case 5: + $ret .= $this->_sep . 'quince'; + break; + + case 6: + case 7: + case 9: + case 8: + $ret .= $this->_sep . 'dieci' . $this->_digits[$d]; + break; + } + break; + } + + // add digits only if it is a multiple of 10 and not 1x or 2x + if (($t != 1) and ($t != 2) and ($d > 0)) + { + if($t != 0) // don't add 'y' for numbers below 10 + { + // use 'un' instead of 'uno' when there is a suffix ('mil', 'millones', etc...) + if(($power > 0) and ($d == 1)) { + $ret .= $this->_sep.' y un'; + } + else { + $ret .= $this->_sep.'y '.$this->_digits[$d]; + } + } + else { + if(($power > 0) and ($d == 1)) { + $ret .= $this->_sep.'un'; + } + else { + $ret .= $this->_sep.$this->_digits[$d]; + } + } + } + + if ($power > 0) + { + if (isset($this->_exponent[$power])) { + $lev = $this->_exponent[$power]; + } + + if (!isset($lev) || !is_array($lev)) { + return null; + } + + // if it's only one use the singular suffix + if (($d == 1) and ($t == 0) and ($h == 0)) { + $suffix = $lev[0]; + } + else { + $suffix = $lev[1]; + } + if ($num != 0) { + $ret .= $this->_sep . $suffix; + } + } + + if ($dec) { + $dec = $this->toWords(trim($dec)); + $ret.= ' con ' . trim ($dec); + } + + return $ret; + } + // }}} + + // {{{ toCurrency() + + /** + * Converts a currency value to its word representation + * (with monetary units) in Agentinian Spanish language + * + * @param integer $int_curr An international currency symbol + * as defined by the ISO 4217 standard (three characters) + * @param integer $decimal A money total amount without fraction part (e.g. amount of dollars) + * @param integer $fraction Fractional part of the money amount (e.g. amount of cents) + * Optional. Defaults to false. + * + * @return string The corresponding word representation for the currency + * + * @access public + * @author Martin Marrese + */ + function toCurrencyWords($int_curr, $decimal, $fraction = false) { + $int_curr = strtoupper($int_curr); + if (!isset($this->_currency_names[$int_curr])) { + $int_curr = $this->def_currency; + } + $curr_names = $this->_currency_names[$int_curr]; + $ret .= $this->_sep . trim($this->toWords($decimal)); + $lev = ($decimal == 1) ? 0 : 1; + + if ($lev > 0) { + if (count($curr_names[0]) > 1) { + $ret .= $this->_sep . $curr_names[0][$lev]; + } else { + $ret .= $this->_sep . $curr_names[0][0] . 's'; + } + } else { + $ret .= $this->_sep . $curr_names[0][0]; + } + + + if ($fraction !== false) { + $ret .= $this->_sep .'con'. $this->_sep . trim($this->toWords($fraction)); + $lev = ($fraction == 1) ? 0 : 1; + if ($lev > 0) { + if (count($curr_names[1]) > 1) { + $ret .= $this->_sep . $curr_names[1][$lev]; + } else { + $ret .= $this->_sep . $curr_names[1][0] . 's'; + } + } else { + $ret .= $this->_sep . $curr_names[1][0]; + } + } + return $ret; + } + // }}} + + + +} +?> diff --git a/thirdparty/pear/Numbers/Words/lang.fr.php b/thirdparty/pear/Numbers/Words/lang.fr.php new file mode 100644 index 000000000..ed756163f --- /dev/null +++ b/thirdparty/pear/Numbers/Words/lang.fr.php @@ -0,0 +1,439 @@ + | +// +----------------------------------------------------------------------+ +// +// $Id$ + +/** + * Include needed files + */ +require_once("Numbers/Words.php"); + +/** + * Class for translating numbers into French. + * + * @author Kouber Saparev + * @package Numbers_Words + */ +class Numbers_Words_fr extends Numbers_Words +{ + + // {{{ properties + + /** + * Locale name. + * @var string + * @access public + */ + var $locale = 'fr'; + + /** + * Language name in English. + * @var string + * @access public + */ + var $lang = 'French'; + + /** + * Native language name. + * @var string + * @access public + */ + var $lang_native = 'Franais'; + + /** + * The words for some numbers. + * @var string + * @access private + */ + var $_misc_numbers = array( + 10=>'dix', // 10 + 'onze', // 11 + 'douze', // 12 + 'treize', // 13 + 'quatorze', // 14 + 'quinze', // 15 + 'seize', // 16 + 20=>'vingt', // 20 + 30=>'trente', // 30 + 40=>'quarante', // 40 + 50=>'cinquante',// 50 + 60=>'soixante', // 60 + 100=>'cent' // 100 + ); + + + /** + * The words for digits (except zero). + * @var string + * @access private + */ + var $_digits = array(1=>"un", "deux", "trois", "quatre", "cinq", "six", "sept", "huit", "neuf"); + + /** + * The word for zero. + * @var string + * @access private + */ + var $_zero = 'zro'; + + /** + * The word for infinity. + * @var string + * @access private + */ + var $_infinity = 'infini'; + + /** + * The word for the "and" language construct. + * @var string + * @access private + */ + var $_and = 'et'; + + /** + * The word separator. + * @var string + * @access private + */ + var $_sep = ' '; + + /** + * The dash liaison. + * @var string + * @access private + */ + var $_dash = '-'; + + /** + * The word for the minus sign. + * @var string + * @access private + */ + var $_minus = 'moins'; // minus sign + + /** + * The plural suffix (except for hundred). + * @var string + * @access private + */ + var $_plural = 's'; // plural suffix + + /** + * The suffixes for exponents (singular). + * @var array + * @access private + */ + var $_exponent = array( + 0 => '', + 3 => 'mille', + 6 => 'million', + 9 => 'milliard', + 12 => 'trillion', + 15 => 'quadrillion', + 18 => 'quintillion', + 21 => 'sextillion', + 24 => 'septillion', + 27 => 'octillion', + 30 => 'nonillion', + 33 => 'decillion', + 36 => 'undecillion', + 39 => 'duodecillion', + 42 => 'tredecillion', + 45 => 'quattuordecillion', + 48 => 'quindecillion', + 51 => 'sexdecillion', + 54 => 'septendecillion', + 57 => 'octodecillion', + 60 => 'novemdecillion', + 63 => 'vigintillion', + 66 => 'unvigintillion', + 69 => 'duovigintillion', + 72 => 'trevigintillion', + 75 => 'quattuorvigintillion', + 78 => 'quinvigintillion', + 81 => 'sexvigintillion', + 84 => 'septenvigintillion', + 87 => 'octovigintillion', + 90 => 'novemvigintillion', + 93 => 'trigintillion', + 96 => 'untrigintillion', + 99 => 'duotrigintillion', + 102 => 'trestrigintillion', + 105 => 'quattuortrigintillion', + 108 => 'quintrigintillion', + 111 => 'sextrigintillion', + 114 => 'septentrigintillion', + 117 => 'octotrigintillion', + 120 => 'novemtrigintillion', + 123 => 'quadragintillion', + 126 => 'unquadragintillion', + 129 => 'duoquadragintillion', + 132 => 'trequadragintillion', + 135 => 'quattuorquadragintillion', + 138 => 'quinquadragintillion', + 141 => 'sexquadragintillion', + 144 => 'septenquadragintillion', + 147 => 'octoquadragintillion', + 150 => 'novemquadragintillion', + 153 => 'quinquagintillion', + 156 => 'unquinquagintillion', + 159 => 'duoquinquagintillion', + 162 => 'trequinquagintillion', + 165 => 'quattuorquinquagintillion', + 168 => 'quinquinquagintillion', + 171 => 'sexquinquagintillion', + 174 => 'septenquinquagintillion', + 177 => 'octoquinquagintillion', + 180 => 'novemquinquagintillion', + 183 => 'sexagintillion', + 186 => 'unsexagintillion', + 189 => 'duosexagintillion', + 192 => 'tresexagintillion', + 195 => 'quattuorsexagintillion', + 198 => 'quinsexagintillion', + 201 => 'sexsexagintillion', + 204 => 'septensexagintillion', + 207 => 'octosexagintillion', + 210 => 'novemsexagintillion', + 213 => 'septuagintillion', + 216 => 'unseptuagintillion', + 219 => 'duoseptuagintillion', + 222 => 'treseptuagintillion', + 225 => 'quattuorseptuagintillion', + 228 => 'quinseptuagintillion', + 231 => 'sexseptuagintillion', + 234 => 'septenseptuagintillion', + 237 => 'octoseptuagintillion', + 240 => 'novemseptuagintillion', + 243 => 'octogintillion', + 246 => 'unoctogintillion', + 249 => 'duooctogintillion', + 252 => 'treoctogintillion', + 255 => 'quattuoroctogintillion', + 258 => 'quinoctogintillion', + 261 => 'sexoctogintillion', + 264 => 'septoctogintillion', + 267 => 'octooctogintillion', + 270 => 'novemoctogintillion', + 273 => 'nonagintillion', + 276 => 'unnonagintillion', + 279 => 'duononagintillion', + 282 => 'trenonagintillion', + 285 => 'quattuornonagintillion', + 288 => 'quinnonagintillion', + 291 => 'sexnonagintillion', + 294 => 'septennonagintillion', + 297 => 'octononagintillion', + 300 => 'novemnonagintillion', + 303 => 'centillion' + ); + // }}} + + // {{{ _splitNumber() + + /** + * Split a number to groups of three-digit numbers. + * + * @param mixed $num An integer or its string representation + * that need to be split + * + * @return array Groups of three-digit numbers. + * + * @access private + * @author Kouber Saparev + * @since PHP 4.2.3 + */ + + function _splitNumber($num) + { + if (is_string($num)) { + $ret = array(); + $strlen = strlen($num); + $first = substr($num, 0, $strlen%3); + preg_match_all('/\d{3}/', substr($num, $strlen%3, $strlen), $m); + $ret =& $m[0]; + if ($first) array_unshift($ret, $first); + return $ret; + } + else + return explode(' ', number_format($num, 0, '', ' ')); // a faster version for integers + } + // }}} + + // {{{ _showDigitsGroup() + + /** + * Converts a three-digit number to its word representation + * in French language. + * + * @param integer $num An integer between 1 and 999 inclusive. + * + * @param boolean $last A flag, that determines if it is the last group of digits - + * this is used to accord the plural suffix of the "hundreds". + * Example: 200 = "deux cents", but 200000 = "deux cent mille". + * + * + * @return string The words for the given number. + * + * @access private + * @author Kouber Saparev + */ + function _showDigitsGroup($num, $last = false) + { + $ret = ''; + + // extract the value of each digit from the three-digit number + $e = $num%10; // ones + $d = ($num-$e)%100/10; // tens + $s = ($num-$d*10-$e)%1000/100; // hundreds + + // process the "hundreds" digit. + if ($s) { + if ($s>1) { + $ret .= $this->_digits[$s].$this->_sep.$this->_misc_numbers[100]; + if ($last && !$e && !$d) { + $ret .= $this->_plural; + } + } else { + $ret .= $this->_misc_numbers[100]; + } + $ret .= $this->_sep; + } + + // process the "tens" digit, and optionally the "ones" digit. + if ($d) { + // in the case of 1, the "ones" digit also must be processed + if ($d==1) { + if ($e<=6) { + $ret .= $this->_misc_numbers[10+$e]; + } else { + $ret .= $this->_misc_numbers[10].'-'.$this->_digits[$e]; + } + $e = 0; + } elseif ($d>5) { + if ($d<8) { + $ret .= $this->_misc_numbers[60]; + $resto = $d*10+$e-60; + if ($e==1) { + $ret .= $this->_sep.$this->_and.$this->_sep; + } + elseif ($resto) { + $ret .= $this->_dash; + } + + if ($resto) { + $ret .= $this->_showDigitsGroup($resto); + } + $e = 0; + } else { + $ret .= $this->_digits[4].$this->_dash.$this->_misc_numbers[20]; + $resto = $d*10+$e-80; + if ($resto) { + $ret .= $this->_dash; + $ret .= $this->_showDigitsGroup($resto); + $e = 0; + } else { + $ret .= $this->_plural; + } + } + } else { + $ret .= $this->_misc_numbers[$d*10]; + } + } + + // process the "ones" digit + if ($e) { + if ($d) { + if ($e==1) { + $ret .= $this->_sep.$this->_and.$this->_sep; + } else { + $ret .= $this->_dash; + } + } + $ret .= $this->_digits[$e]; + } + + // strip excessive separators + $ret = rtrim($ret, $this->_sep); + + return $ret; + } + // }}} + + // {{{ toWords() + + /** + * Converts a number to its word representation + * in French language. + * + * @param integer $num An integer (or its string representation) between 9.99*-10^302 + * and 9.99*10^302 (999 centillions) that need to be converted to words + * + * @return string The corresponding word representation + * + * @access public + * @author Kouber Saparev + */ + function toWords($num = 0) + { + $ret = ''; + + // check if $num is a valid non-zero number + if (!$num || preg_match('/^-?0+$/', $num) || !preg_match('/^-?\d+$/', $num)) return $this->_zero; + + // add a minus sign + if (substr($num, 0, 1) == '-') { + $ret = $this->_minus . $this->_sep; + $num = substr($num, 1); + } + + // if the absolute value is greater than 9.99*10^302, return infinity + if (strlen($num)>306) { + return $ret . $this->_infinity; + } + + // strip excessive zero signs + $num = ltrim($num, '0'); + + // split $num to groups of three-digit numbers + $num_groups = $this->_splitNumber($num); + + $sizeof_numgroups = count($num_groups); + + foreach ($num_groups as $i=>$number) { + // what is the corresponding exponent for the current group + $pow = $sizeof_numgroups-$i; + + // skip processment for empty groups + if ($number!='000') { + if ($number!=1 || $pow!=2) { + $ret .= $this->_showDigitsGroup($number, $i+1==$sizeof_numgroups).$this->_sep; + } + $ret .= $this->_exponent[($pow-1)*3]; + if ($pow>2 && $number>1) { + $ret .= $this->_plural; + } + $ret .= $this->_sep; + } + } + + return rtrim($ret, $this->_sep); + } + // }}} +} +?> diff --git a/thirdparty/pear/Numbers/Words/lang.id.php b/thirdparty/pear/Numbers/Words/lang.id.php new file mode 100644 index 000000000..21ab30cfb --- /dev/null +++ b/thirdparty/pear/Numbers/Words/lang.id.php @@ -0,0 +1,277 @@ + | +// +----------------------------------------------------------------------+ +// +// $Id: lang.en_GB.php,v 1.3 2002/11/26 10:33:35 makler Exp $ +// +// Numbers_Words class extension to spell numbers in Indonesian language. +// + +require_once("PEAR.php"); +require_once("Numbers/Words.php"); + +/** +* Class for translating numbers into Indonesian. +* +* @author Ernas M. Jamil +*/ +class Numbers_Words_id extends Numbers_Words +{ + + // {{{ properties + + /** + * Locale name + * @var string + */ + var $locale = 'id'; + + /** + * Language name in English + * @var string + */ + var $lang = 'Indonesia Language'; + + /** + * Native language name + * @var string + */ + var $lang_native = 'Bahasa Indonesia'; + + /** + * The word for the minus sign + * @var string + */ + var $_minus = 'minus'; // minus sign + + /** + * The sufixes for exponents (singular and plural) + * Names partly based on: + * http://www.users.dircon.co.uk/~shaunf/shaun/numbers/millions.htm + * @var array + */ + var $_exponent = array( + 0 => array(''), + 3 => array('ribu'), + 6 => array('juta'), + 9 => array('milyar'), + 12 => array('trilyun'), + 24 => array('quadrillion'), + 30 => array('quintillion'), + 36 => array('sextillion'), + 42 => array('septillion'), + 48 => array('octillion'), + 54 => array('nonillion'), + 60 => array('decillion'), + 66 => array('undecillion'), + 72 => array('duodecillion'), + 78 => array('tredecillion'), + 84 => array('quattuordecillion'), + 90 => array('quindecillion'), + 96 => array('sexdecillion'), + 102 => array('septendecillion'), + 108 => array('octodecillion'), + 114 => array('novemdecillion'), + 120 => array('vigintillion'), + 192 => array('duotrigintillion'), + 600 => array('centillion') + ); + + /** + * The array containing the digits (indexed by the digits themselves). + * @var array + */ + var $_digits = array( + 0 => 'nol', 'satu', 'dua', 'tiga', 'empat', + 'lima', 'enam', 'tujuh', 'delapan', 'sembilan' + ); + + /** + * The word separator + * @var string + */ + var $_sep = ' '; + + // }}} + // {{{ toWords() + + /** + * Converts a number to its word representation + * in Indonesian language + * + * @param integer $num An integer between -infinity and infinity inclusive :) + * that need to be converted to words + * @param integer $power The power of ten for the rest of the number to the right. + * Optional, defaults to 0. + * @param integer $powsuffix The power name to be added to the end of the return string. + * Used internally. Optional, defaults to ''. + * + * @return string The corresponding word representation + * + * @access public + * @author Ernas M. Jamil + * @since PHP 4.2.3 + */ + function toWords($num, $power = 0, $powsuffix = '') { + $ret = ''; + + // add a minus sign + if (substr($num, 0, 1) == '-') { + $ret = $this->_sep . $this->_minus; + $num = substr($num, 1); + } + + // strip excessive zero signs and spaces + $num = trim($num); + $num = preg_replace('/^0+/','',$num); + + if (strlen($num) > 4) { + $maxp = strlen($num)-1; + $curp = $maxp; + for ($p = $maxp; $p > 0; --$p) { // power + + // check for highest power + if (isset($this->_exponent[$p])) { + // send substr from $curp to $p + $snum = substr($num, $maxp - $curp, $curp - $p + 1); + $snum = preg_replace('/^0+/','',$snum); + if ($snum !== '') { + $cursuffix = $this->_exponent[$power][count($this->_exponent[$power])-1]; + if ($powsuffix != '') + $cursuffix .= $this->_sep . $powsuffix; + $ret .= $this->toWords($snum, $p, $cursuffix); + } + $curp = $p - 1; + continue; + } + } + $num = substr($num, $maxp - $curp, $curp - $p + 1); + if ($num == 0) { + return $ret; + } + } elseif ($num == 0 || $num == '') { + return $this->_sep . $this->_digits[0]; + } + + $h = $t = $d = $th = 0; + + switch(strlen($num)) { + case 4: + $th = (int)substr($num,-4,1); + + case 3: + $h = (int)substr($num,-3,1); + + case 2: + $t = (int)substr($num,-2,1); + + case 1: + $d = (int)substr($num,-1,1); + break; + + case 0: + return; + break; + } + + if ($th) { + if ($th==1) + $ret .= $this->_sep . 'seribu'; + else + $ret .= $this->_sep . $this->_digits[$th] . $this->_sep . 'ribu'; + } + + if ($h) { + if ($h==1) + $ret .= $this->_sep . 'seratus'; + else + $ret .= $this->_sep . $this->_digits[$h] . $this->_sep . 'ratus'; + + // in English only - add ' and' for [1-9]01..[1-9]99 + // (also for 1001..1099, 10001..10099 but it is harder) + // for now it is switched off, maybe some language purists + // can force me to enable it, or to remove it completely + // if (($t + $d) > 0) + // $ret .= $this->_sep . 'and'; + } + + // ten, twenty etc. + switch ($t) { + case 9: + case 8: + case 7: + case 6: + case 5: + case 4: + case 3: + case 2: + $ret .= $this->_sep . $this->_digits[$t] . ' puluh'; + break; + + case 1: + switch ($d) { + case 0: + $ret .= $this->_sep . 'sepuluh'; + break; + + case 1: + $ret .= $this->_sep . 'sebelas'; + break; + + case 2: + case 3: + case 4: + case 5: + case 6: + case 7: + case 8: + case 9: + $ret .= $this->_sep . $this->_digits[$d] . ' belas'; + break; + } + break; + } + + if ($t != 1 && $d > 0) { // add digits only in <0>,<1,9> and <21,inf> + // add minus sign between [2-9] and digit + if ($t > 1) { + $ret .= ' ' . $this->_digits[$d]; + } else { + $ret .= $this->_sep . $this->_digits[$d]; + } + } + + if ($power > 0) { + if (isset($this->_exponent[$power])) + $lev = $this->_exponent[$power]; + + if (!isset($lev) || !is_array($lev)) + return null; + + $ret .= $this->_sep . $lev[0]; + } + + if ($powsuffix != '') + $ret .= $this->_sep . $powsuffix; + + return $ret; + } + // }}} +} + +?> diff --git a/thirdparty/pear/Numbers/Words/lang.it_IT.php b/thirdparty/pear/Numbers/Words/lang.it_IT.php new file mode 100644 index 000000000..50694f7bc --- /dev/null +++ b/thirdparty/pear/Numbers/Words/lang.it_IT.php @@ -0,0 +1,348 @@ + + * @author Davide Caironi + * @package Numbers_Words + */ + +/** + * Include needed files + */ +require_once("Numbers/Words.php"); + +/** + * Class for translating numbers into Italian. + * It supports up to quadrilions + * + * @author Filippo Beltramini + * @author Davide Caironi + * @package Numbers_Words + */ +class Numbers_Words_it_IT extends Numbers_Words +{ + // {{{ properties + + /** + * Locale name + * @var string + * @access public + */ + var $locale = 'it_IT'; + + /** + * Language name in English + * @var string + * @access public + */ + var $lang = 'Italian'; + + /** + * Native language name + * @var string + * @access public + */ + var $lang_native = 'Italiano'; + + /** + * The word for the minus sign + * @var string + * @access private + */ + var $_minus = 'meno '; + + /** + * The sufixes for exponents (singular and plural) + * @var array + * @access private + */ + var $_exponent = array( + 0 => array('',''), + 3 => array('mille','mila'), + 6 => array('milione','miloni'), + 12 => array('miliardo','miliardi'), + 18 => array('trillone','trilloni'), + 24 => array('quadrilione','quadrilioni'), + ); + /** + * The array containing the digits (indexed by the digits themselves). + * @var array + * @access private + */ + var $_digits = array( + 0 => 'zero', 'uno', 'due', 'tre', 'quattro', + 'cinque', 'sei', 'sette', 'otto', 'nove' + ); + + /** + * The word separator + * @var string + * @access private + */ + var $_sep = ''; + // }}} + // {{{ toWords() + /** + * Converts a number to its word representation + * in italiano. + * + * @param integer $num An integer between -infinity and infinity inclusive :) + * that should be converted to a words representation + * @param integer $power The power of ten for the rest of the number to the right. + * For example toWords(12,3) should give "doce mil". + * Optional, defaults to 0. + * @return string The corresponding word representation + * + * @access private + * @author Filippo Beltramini + * @since PHP 4.2.3 + */ + function toWords($num, $power = 0) + { + // The return string; + $ret = ''; + + // add a the word for the minus sign if necessary + if (substr($num, 0, 1) == '-') + { + $ret = $this->_sep . $this->_minus; + $num = substr($num, 1); + } + + + // strip excessive zero signs + $num = preg_replace('/^0+/','',$num); + + if (strlen($num) > 6) + { + $current_power = 6; + // check for highest power + if (isset($this->_exponent[$power])) + { + // convert the number above the first 6 digits + // with it's corresponding $power. + $snum = substr($num, 0, -6); + $snum = preg_replace('/^0+/','',$snum); + if ($snum !== '') { + $ret .= $this->toWords($snum, $power + 6); + } + } + $num = substr($num, -6); + if ($num == 0) { + return $ret; + } + } + elseif ($num == 0 || $num == '') { + return(' '.$this->_digits[0].' '); + $current_power = strlen($num); + } + else { + $current_power = strlen($num); + } + + // See if we need "thousands" + $thousands = floor($num / 1000); + if ($thousands == 1) { + $ret .= $this->_sep . 'mille' . $this->_sep; + } + elseif ($thousands > 1) { + $ret .= $this->toWords($thousands, 3) . $this->_sep;//. 'mil' . $this->_sep; + } + + // values for digits, tens and hundreds + $h = floor(($num / 100) % 10); + $t = floor(($num / 10) % 10); + $d = floor($num % 10); + + // centinaia: duecento, trecento, etc... + switch ($h) + { + case 1: + if (($d == 0) and ($t == 0)) { // is it's '100' use 'cien' + $ret .= $this->_sep . 'cento'; + } + else { + $ret .= $this->_sep . 'cento'; + } + break; + case 2: + case 3: + case 4: + case 6: + case 8: + $ret .= $this->_sep . $this->_digits[$h] . 'cento'; + break; + case 5: + $ret .= $this->_sep . 'cinquecento'; + break; + case 7: + $ret .= $this->_sep . 'settecento'; + break; + case 9: + $ret .= $this->_sep . 'novecento'; + break; + } + + // decine: venti trenta, etc... + switch ($t) + { + case 9: + $ret .= $this->_sep . 'novanta'; + break; + + case 8: + $ret .= $this->_sep . 'ottanta'; + break; + + case 7: + $ret .= $this->_sep . 'settanta'; + break; + + case 6: + $ret .= $this->_sep . 'sessanta'; + break; + + case 5: + $ret .= $this->_sep . 'cinquanta'; + break; + + case 4: + $ret .= $this->_sep . 'quaranta'; + break; + + case 3: + $ret .= $this->_sep . 'trenta'; + break; + + case 2: + if ($d == 0) { + $ret .= $this->_sep . 'venti'; + } + else { + if (($power > 0) and ($d == 1)) { + $ret .= $this->_sep . 'ventuno'; + } + else { + $ret .= $this->_sep . 'venti' . $this->_digits[$d]; + } + } + break; + + case 1: + switch ($d) + { + case 0: + $ret .= $this->_sep . 'dieci'; + break; + + case 1: + $ret .= $this->_sep . 'undici'; + break; + + case 2: + $ret .= $this->_sep . 'dodici'; + break; + + case 3: + $ret .= $this->_sep . 'tredici'; + break; + + case 4: + $ret .= $this->_sep . 'quattordici'; + break; + + case 5: + $ret .= $this->_sep . 'quindici'; + break; + + case 6: + $ret .= $this->_sep . 'sedici'; + break; + + case 7: + $ret .= $this->_sep . 'diciassette'; + break; + + case 8: + $ret .= $this->_sep . 'diciotto'; + break; + + case 9: + $ret .= $this->_sep . 'diciannove'; + break; + } + break; + } + + // add digits only if it is a multiple of 10 and not 1x or 2x + if (($t != 1) and ($t != 2) and ($d > 0)) + { + if($t != 0) // don't add 'e' for numbers below 10 + { + // use 'un' instead of 'uno' when there is a suffix ('mila', 'milloni', etc...) + if(($power > 0) and ($d == 1)) { + $ret .= $this->_sep.' e un'; + } + else { + $ret .= $this->_sep.''.$this->_digits[$d]; + } + } + else { + if(($power > 0) and ($d == 1)) { + $ret .= $this->_sep.'un '; + } + else { + $ret .= $this->_sep.$this->_digits[$d]; + } + } + } + + if ($power > 0) + { + if (isset($this->_exponent[$power])) { + $lev = $this->_exponent[$power]; + } + + if (!isset($lev) || !is_array($lev)) { + return null; + } + + // if it's only one use the singular suffix + if (($d == 1) and ($t == 0) and ($h == 0)) { + $suffix = $lev[0]; + } + else { + $suffix = $lev[1]; + } + if ($num != 0) { + $ret .= $this->_sep . $suffix; + } + } + + return $ret; + } + // }}} +} +?> diff --git a/thirdparty/pear/Numbers/Words/lang.lt.php b/thirdparty/pear/Numbers/Words/lang.lt.php new file mode 100644 index 000000000..48a418b2f --- /dev/null +++ b/thirdparty/pear/Numbers/Words/lang.lt.php @@ -0,0 +1,310 @@ + array(''), + 3 => array('tkstantis','tkstaniai','tkstani'), + 6 => array('milijonas','milijonai','milijon'), + 9 => array('bilijonas','bilijonai','bilijon'), + 12 => array('trilijonas','trilijonai','trilijon'), + 15 => array('kvadrilijonas','kvadrilijonai','kvadrilijon'), + 18 => array('kvintilijonas','kvintilijonai','kvintilijon') + ); + + /** + * The array containing the digits (indexed by the digits themselves). + * @var array + * @access private + */ + var $_digits = array( + 0 => 'nulis', 'vienas', 'du', 'trys', 'keturi', + 'penki', 'ei', 'septyni', 'atuoni', 'devyni' + ); + + /** + * The word separator + * @var string + * @access private + */ + var $_sep = ' '; + + /** + * The default currency name + * @var string + * @access public + */ + var $def_currency = 'LTL'; + + // }}} + // {{{ toWords() + + /** + * Converts a number to its word representation + * in Lithuanian language + * + * @param integer $num An integer between -infinity and infinity inclusive :) + * that need to be converted to words + * @param integer $power The power of ten for the rest of the number to the right. + * Optional, defaults to 0. + * @param integer $powsuffix The power name to be added to the end of the return string. + * Used internally. Optional, defaults to ''. + * + * @return string The corresponding word representation + * + * @access public + * @author Laurynas Butkus + * @since PHP 4.2.3 + */ + function toWords($num, $power = 0, $powsuffix = '') { + $ret = ''; + + // add a minus sign + if (substr($num, 0, 1) == '-') { + $ret = $this->_sep . $this->_minus; + $num = substr($num, 1); + } + + // strip excessive zero signs and spaces + $num = trim($num); + $num = preg_replace('/^0+/','',$num); + + if (strlen($num) > 3) { + $maxp = strlen($num)-1; + $curp = $maxp; + for ($p = $maxp; $p > 0; --$p) { // power + + // check for highest power + if (isset($this->_exponent[$p])) { + // send substr from $curp to $p + $snum = substr($num, $maxp - $curp, $curp - $p + 1); + $snum = preg_replace('/^0+/','',$snum); + if ($snum !== '') { + $cursuffix = $this->_exponent[$power][count($this->_exponent[$power])-1]; + if ($powsuffix != '') + $cursuffix .= $this->_sep . $powsuffix; + $ret .= $this->toWords($snum, $p, $cursuffix); + } + $curp = $p - 1; + continue; + } + } + $num = substr($num, $maxp - $curp, $curp - $p + 1); + if ($num == 0) { + return $ret; + } + } elseif ($num == 0 || $num == '') { + return $this->_sep . $this->_digits[0]; + } + + $h = $t = $d = 0; + + switch(strlen($num)) { + case 3: + $h = (int)substr($num,-3,1); + + case 2: + $t = (int)substr($num,-2,1); + + case 1: + $d = (int)substr($num,-1,1); + break; + + case 0: + return; + break; + } + + if ( $h > 1 ) + $ret .= $this->_sep . $this->_digits[$h] . $this->_sep . 'imtai'; + elseif ( $h ) + $ret .= $this->_sep . 'imtas'; + + // ten, twenty etc. + switch ($t) { + case 9: + $ret .= $this->_sep . 'devyniasdeimt'; + break; + + case 8: + $ret .= $this->_sep . 'atuoniasdeimt'; + break; + + case 7: + $ret .= $this->_sep . 'septyniasdeimt'; + break; + + case 6: + $ret .= $this->_sep . 'eiasdeimt'; + break; + + case 5: + $ret .= $this->_sep . 'penkiasdeimt'; + break; + + case 4: + $ret .= $this->_sep . 'keturiasdeimt'; + break; + + case 3: + $ret .= $this->_sep . 'trisdeimt'; + break; + + case 2: + $ret .= $this->_sep . 'dvideimt'; + break; + + case 1: + switch ($d) { + case 0: + $ret .= $this->_sep . 'deimt'; + break; + + case 1: + $ret .= $this->_sep . 'vienuolika'; + break; + + case 2: + $ret .= $this->_sep . 'dvylika'; + break; + + case 3: + $ret .= $this->_sep . 'trylika'; + break; + + case 4: + $ret .= $this->_sep . 'keturiolika'; + break; + + case 5: + $ret .= $this->_sep . 'penkiolika'; + break; + + case 6: + $ret .= $this->_sep . 'eiolika'; + break; + + case 7: + $ret .= $this->_sep . 'septyniolika'; + break; + + case 8: + $ret .= $this->_sep . 'atuoniolika'; + break; + + case 9: + $ret .= $this->_sep . 'devyniolika'; + break; + + } + break; + } + + if ($t != 1 && $d > 0) { // add digits only in <0>,<1,9> and <21,inf> + if ( $d > 1 || !$power || $t ) + $ret .= $this->_sep . $this->_digits[$d]; + } + + if ($power > 0) { + if (isset($this->_exponent[$power])) + $lev = $this->_exponent[$power]; + + if (!isset($lev) || !is_array($lev)) + return null; + + //echo " $t $d
    "; + + if ( $t == 1 || ( $t > 0 && $d == 0 ) ) + $ret .= $this->_sep . $lev[2]; + elseif ( $d > 1 ) + $ret .= $this->_sep . $lev[1]; + else + $ret .= $this->_sep . $lev[0]; + } + + if ($powsuffix != '') + $ret .= $this->_sep . $powsuffix; + + return $ret; + } + // }}} + +} + +?> diff --git a/thirdparty/pear/Numbers/Words/lang.pl.php b/thirdparty/pear/Numbers/Words/lang.pl.php new file mode 100644 index 000000000..54519e293 --- /dev/null +++ b/thirdparty/pear/Numbers/Words/lang.pl.php @@ -0,0 +1,513 @@ + | +// +----------------------------------------------------------------------+ +// +// $Id: lang.pl.php,v 1.9 2003/09/29 12:23:58 makler Exp $ +// +// Numbers_Words class extension to spell numbers in Polish. +// + +/** + * Class for translating numbers into Polish. + * + * @author Piotr Klaban + * @package Numbers_Words + */ + +/** + * Include needed files + */ +require_once("Numbers/Words.php"); + +/** + * Class for translating numbers into Polish. + * + * @author Piotr Klaban + * @package Numbers_Words + */ +class Numbers_Words_pl extends Numbers_Words +{ + + // {{{ properties + + /** + * Locale name + * @var string + * @access public + */ + var $locale = 'pl'; + + /** + * Language name in English + * @var string + * @access public + */ + var $lang = 'Polish'; + + /** + * Native language name + * @var string + * @access public + */ + var $lang_native = 'polski'; + + /** + * The word for the minus sign + * @var string + * @access private + */ + var $_minus = 'minus'; // minus sign + + /** + * The sufixes for exponents (singular and plural) + * Names based on: + * mathematical tables, my memory, and also: + * http://ux1.math.us.edu.pl/~szyjewski/FAQ/liczby/iony.htm + * @var array + * @access private + */ + var $_exponent = array( + // potga dziesitki => liczba pojedyncza, podwjna, mnoga + 0 => array('','',''), + 3 => array('tysic','tysice','tysicy'), + 6 => array('milion','miliony','milionw'), + 9 => array('miliard','miliardy','miliardw'), + 12 => array('bilion','biliony','bilionw'), + 15 => array('biliard','biliardy','biliardw'), + 18 => array('trylion','tryliony','trylionw'), + 21 => array('tryliard','tryliardy','tryliardw'), + 24 => array('kwadrylion','kwadryliony','kwadrylionw'), + 27 => array('kwadryliard','kwadryliardy','kwadryliardw'), + 30 => array('kwintylion','kwintyliony','kwintylionw'), + 33 => array('kwintyliiard','kwintyliardy','kwintyliardw'), + 36 => array('sekstylion','sekstyliony','sekstylionw'), + 39 => array('sekstyliard','sekstyliardy','sekstyliardw'), + 42 => array('septylion','septyliony','septylionw'), + 45 => array('septyliard','septyliardy','septyliardw'), + 48 => array('oktylion','oktyliony','oktylionw'), + 51 => array('oktyliard','oktyliardy','oktyliardw'), + 54 => array('nonylion','nonyliony','nonylionw'), + 57 => array('nonyliard','nonyliardy','nonyliardw'), + 60 => array('decylion','decyliony','decylionw'), + 63 => array('decyliard','decyliardy','decyliardw'), + 100 => array('centylion','centyliony','centylionw'), + 103 => array('centyliard','centyliardy','centyliardw'), + 120 => array('wicylion','wicylion','wicylion'), + 123 => array('wicyliard','wicyliardy','wicyliardw'), + 180 => array('trycylion','trycylion','trycylion'), + 183 => array('trycyliard','trycyliardy','trycyliardw'), + 240 => array('kwadragilion','kwadragilion','kwadragilion'), + 243 => array('kwadragiliard','kwadragiliardy','kwadragiliardw'), + 300 => array('kwinkwagilion','kwinkwagilion','kwinkwagilion'), + 303 => array('kwinkwagiliard','kwinkwagiliardy','kwinkwagiliardw'), + 360 => array('seskwilion','seskwilion','seskwilion'), + 363 => array('seskwiliard','seskwiliardy','seskwiliardw'), + 420 => array('septagilion','septagilion','septagilion'), + 423 => array('septagiliard','septagiliardy','septagiliardw'), + 480 => array('oktogilion','oktogilion','oktogilion'), + 483 => array('oktogiliard','oktogiliardy','oktogiliardw'), + 540 => array('nonagilion','nonagilion','nonagilion'), + 543 => array('nonagiliard','nonagiliardy','nonagiliardw'), + 600 => array('centylion','centyliony','centylionw'), + 603 => array('centyliard','centyliardy','centyliardw'), + 6000018 => array('milinilitrylion','milinilitryliony','milinilitrylionw') + ); + + /** + * The array containing the digits (indexed by the digits themselves). + * @var array + * @access private + */ + var $_digits = array( + 0 => 'zero', 'jeden', 'dwa', 'trzy', 'cztery', + 'pi', 'sze', 'siedem', 'osiem', 'dziewi' + ); + + /** + * The word separator + * @var string + * @access private + */ + var $_sep = ' '; + + /** + * The currency names (based on the below links, + * informations from central bank websites and on encyclopedias) + * + * @var array + * @link http://www.xe.com/iso4217.htm Currency codes + * @link http://www.republika.pl/geographia/peuropy.htm Europe review + * @link http://pieniadz.hoga.pl/waluty_objasnienia.asp Currency service + * @access private + */ + var $_currency_names = array( + 'ALL' => array(array('lek','leki','lekw'), array('quindarka','quindarki','quindarek')), + 'AUD' => array(array('dolar australijski', 'dolary australijskie', 'dolarw australijskich'), array('cent', 'centy', 'centw')), + 'BAM' => array(array('marka','marki','marek'), array('fenig','fenigi','fenigw')), + 'BGN' => array(array('lew','lewy','lew'), array('stotinka','stotinki','stotinek')), + 'BRL' => array(array('real','reale','realw'), array('centavos','centavos','centavos')), + 'BYR' => array(array('rubel','ruble','rubli'), array('kopiejka','kopiejki','kopiejek')), + 'CAD' => array(array('dolar kanadyjski', 'dolary kanadyjskie', 'dolarw kanadyjskich'), array('cent', 'centy', 'centw')), + 'CHF' => array(array('frank szwajcarski','franki szwajcarskie','frankw szwajcarskich'), array('rapp','rappy','rappw')), + 'CYP' => array(array('funt cypryjski','funty cypryjskie','funtw cypryjskich'), array('cent', 'centy', 'centw')), + 'CZK' => array(array('korona czeska','korony czeskie','koron czeskich'), array('halerz','halerze','halerzy')), + 'DKK' => array(array('korona duska','korony duskie','koron duskich'), array('ore','ore','ore')), + 'EEK' => array(array('korona estoska','korony estoskie','koron estoskich'), array('senti','senti','senti')), + 'EUR' => array(array('euro', 'euro', 'euro'), array('eurocent', 'eurocenty', 'eurocentw')), + 'GBP' => array(array('funt szterling','funty szterlingi','funtw szterlingw'), array('pens','pensy','pensw')), + 'HKD' => array(array('dolar Hongkongu','dolary Hongkongu','dolarw Hongkongu'), array('cent', 'centy', 'centw')), + 'HRK' => array(array('kuna','kuny','kun'), array('lipa','lipy','lip')), + 'HUF' => array(array('forint','forinty','forintw'), array('filler','fillery','fillerw')), + 'ISK' => array(array('korona islandzka','korony islandzkie','koron islandzkich'), array('aurar','aurar','aurar')), + 'JPY' => array(array('jen','jeny','jenw'), array('sen','seny','senw')), + 'LTL' => array(array('lit','lity','litw'), array('cent', 'centy', 'centw')), + 'LVL' => array(array('at','aty','atw'), array('sentim','sentimy','sentimw')), + 'MKD' => array(array('denar','denary','denarw'), array('deni','deni','deni')), + 'MTL' => array(array('lira maltaska','liry maltaskie','lir maltaskich'), array('centym','centymy','centymw')), + 'NOK' => array(array('korona norweska','korony norweskie','koron norweskich'), array('oere','oere','oere')), + 'PLN' => array(array('zoty', 'zote', 'zotych'), array('grosz', 'grosze', 'groszy')), + 'ROL' => array(array('lej','leje','lei'), array('bani','bani','bani')), + 'RUB' => array(array('rubel','ruble','rubli'), array('kopiejka','kopiejki','kopiejek')), + 'SEK' => array(array('korona szwedzka','korony szwedzkie','koron szweckich'), array('oere','oere','oere')), + 'SIT' => array(array('tolar','tolary','tolarw'), array('stotinia','stotinie','stotini')), + 'SKK' => array(array('korona sowacka','korony sowackie','koron sowackich'), array('halerz','halerze','halerzy')), + 'TRL' => array(array('lira turecka','liry tureckie','lir tureckich'), array('kurusza','kurysze','kuruszy')), + 'UAH' => array(array('hrywna','hrywna','hrywna'), array('cent', 'centy', 'centw')), + 'USD' => array(array('dolar','dolary','dolarw'), array('cent', 'centy', 'centw')), + 'YUM' => array(array('dinar','dinary','dinarw'), array('para','para','para')), + 'ZAR' => array(array('rand','randy','randw'), array('cent', 'centy', 'centw')) + ); + + /** + * The default currency name + * @var string + * @access public + */ + var $def_currency = 'PLN'; // Polish zloty + + // }}} + // {{{ toWords() + + /** + * Converts a number to its word representation + * in Polish language + * + * @param integer $num An integer between -infinity and infinity inclusive :) + * that need to be converted to words + * @param integer $power The power of ten for the rest of the number to the right. + * Optional, defaults to 0. + * @param integer $powsuffix The power name to be added to the end of the return string. + * Used internally. Optional, defaults to ''. + * + * @return string The corresponding word representation + * + * @access public + * @author Piotr Klaban + * @since PHP 4.2.3 + */ + function toWords($num, $power = 0, $powsuffix = '') { + $ret = ''; + + // add a minus sign + if (substr($num, 0, 1) == '-') { + $ret = $this->_sep . $this->_minus; + $num = substr($num, 1); + } + + // strip excessive zero signs and spaces + $num = trim($num); + $num = preg_replace('/^0+/','',$num); + + if (strlen($num) > 3) { + $maxp = strlen($num)-1; + $curp = $maxp; + for ($p = $maxp; $p > 0; --$p) { // power + + // check for highest power + if (isset($this->_exponent[$p])) { + // send substr from $curp to $p + $snum = substr($num, $maxp - $curp, $curp - $p + 1); + $snum = preg_replace('/^0+/','',$snum); + if ($snum !== '') { + $cursuffix = $this->_exponent[$power][count($this->_exponent[$power])-1]; + if ($powsuffix != '') + $cursuffix .= $this->_sep . $powsuffix; + $ret .= $this->toWords($snum, $p, $cursuffix); + } + $curp = $p - 1; + continue; + } + } + $num = substr($num, $maxp - $curp, $curp - $p + 1); + if ($num == 0) { + return $ret; + } + } elseif ($num == 0 || $num == '') { + return $this->_sep . $this->_digits[0]; + } + + $h = $t = $d = 0; + + switch(strlen($num)) { + case 3: + $h = (int)substr($num,-3,1); + + case 2: + $t = (int)substr($num,-2,1); + + case 1: + $d = (int)substr($num,-1,1); + break; + + case 0: + return; + break; + } + + switch ($h) { + case 9: + $ret .= $this->_sep . 'dziewiset'; + break; + + case 8: + $ret .= $this->_sep . 'osiemset'; + break; + + case 7: + $ret .= $this->_sep . 'siedemset'; + break; + + case 6: + $ret .= $this->_sep . 'szeset'; + break; + + case 5: + $ret .= $this->_sep . 'piset'; + break; + + case 4: + $ret .= $this->_sep . 'czterysta'; + break; + + case 3: + $ret .= $this->_sep . 'trzysta'; + break; + + case 2: + $ret .= $this->_sep . 'dwiecie'; + break; + + case 1: + $ret .= $this->_sep . 'sto'; + break; + } + + switch ($t) { + case 9: + case 8: + case 7: + case 6: + case 5: + $ret .= $this->_sep . $this->_digits[$t] . 'dziesit'; + break; + + case 4: + $ret .= $this->_sep . 'czterdzieci'; + break; + + case 3: + $ret .= $this->_sep . 'trzydzieci'; + break; + + case 2: + $ret .= $this->_sep . 'dwadziecia'; + break; + + case 1: + switch ($d) { + case 0: + $ret .= $this->_sep . 'dziesi'; + break; + + case 1: + $ret .= $this->_sep . 'jedenacie'; + break; + + case 2: + case 3: + case 7: + case 8: + $ret .= $this->_sep . $this->_digits[$d] . 'nacie'; + break; + + case 4: + $ret .= $this->_sep . 'czternacie'; + break; + + case 5: + $ret .= $this->_sep . 'pitnacie'; + break; + + case 6: + $ret .= $this->_sep . 'szesnacie'; + break; + + case 9: + $ret .= $this->_sep . 'dziewitnacie'; + break; + } + break; + } + + if ($t != 1 && $d > 0) + $ret .= $this->_sep . $this->_digits[$d]; + + if ($t == 1) + $d = 0; + + if (( $h + $t ) > 0 && $d == 1) + $d = 0; + + if ($power > 0) { + if (isset($this->_exponent[$power])) + $lev = $this->_exponent[$power]; + + if (!isset($lev) || !is_array($lev)) + return null; + + switch ($d) { + case 1: + $suf = $lev[0]; + break; + case 2: + case 3: + case 4: + $suf = $lev[1]; + break; + case 0: + case 5: + case 6: + case 7: + case 8: + case 9: + $suf = $lev[2]; + break; + } + $ret .= $this->_sep . $suf; + } + + if ($powsuffix != '') + $ret .= $this->_sep . $powsuffix; + + return $ret; + } + // }}} + // {{{ toCurrency() + + /** + * Converts a currency value to its word representation + * (with monetary units) in Polish language + * + * @param integer $int_curr An international currency symbol + * as defined by the ISO 4217 standard (three characters) + * @param integer $decimal A money total amount without fraction part (e.g. amount of dollars) + * @param integer $fraction Fractional part of the money amount (e.g. amount of cents) + * Optional. Defaults to false. + * + * @return string The corresponding word representation for the currency + * + * @access public + * @author Piotr Klaban + * @since Numbers_Words 0.4 + */ + function toCurrencyWords($int_curr, $decimal, $fraction = false) { + $int_curr = strtoupper($int_curr); + if (!isset($this->_currency_names[$int_curr])) { + $int_curr = $this->def_currency; + } + $curr_names = $this->_currency_names[$int_curr]; + $ret = trim($this->toWords($decimal)); + $lev = $this->_get_numlevel($decimal); + $ret .= $this->_sep . $curr_names[0][$lev]; + + if ($fraction !== false) { + $ret .= $this->_sep . trim($this->toWords($fraction)); + $lev = $this->_get_numlevel($fraction); + $ret .= $this->_sep . $curr_names[1][$lev]; + } + return $ret; + } + // }}} + // {{{ _get_numlevel() + + /** + * Returns grammatical "level" of the number - this is necessary + * for choosing the right suffix for exponents and currency names. + * + * @param integer $num An integer between -infinity and infinity inclusive + * that need to be converted to words + * + * @return integer The grammatical "level" of the number. + * + * @access private + * @author Piotr Klaban + * @since Numbers_Words 0.4 + */ + function _get_numlevel($num) { + $num = (int)substr($num,-3); + $h = $t = $d = $lev = 0; + + switch(strlen($num)) { + case 3: + $h = (int)substr($num,-3,1); + + case 2: + $t = (int)substr($num,-2,1); + + case 1: + $d = (int)substr($num,-1,1); + break; + + case 0: + return $lev; + break; + } + if ($t == 1) + $d = 0; + + if (( $h + $t ) > 0 && $d == 1) + $d = 0; + + switch ($d) { + case 1: + $lev = 0; + break; + case 2: + case 3: + case 4: + $lev = 1; + break; + default: + $lev = 2; + } + return $lev; + } + // }}} +} + +?> diff --git a/thirdparty/pear/Numbers/Words/lang.pt_BR.php b/thirdparty/pear/Numbers/Words/lang.pt_BR.php new file mode 100644 index 000000000..665afe092 --- /dev/null +++ b/thirdparty/pear/Numbers/Words/lang.pt_BR.php @@ -0,0 +1,241 @@ + | +// +----------------------------------------------------------------------+ +// +// $Id: lang.pt_BR.php,v 1.6 2003/09/29 12:23:58 makler Exp $ +// +// Numbers_Words class extension to spell numbers in Brazilian Portuguese language. +// + + +/** + * Class for translating numbers into Brazilian Portuguese. + * + * @author Marcelo Subtil Marcal + * @package Numbers_Words + */ + +/** + * Include needed files + */ +require_once "Numbers/Words.php"; + +/** + * Class for translating numbers into Brazilian Portuguese. + * + * @author Marcelo Subtil Marcal + * @package Numbers_Words + */ +class Numbers_Words_pt_BR extends Numbers_Words +{ + + /** + * Locale name + * @var string + * @access public + */ + var $locale = 'pt_BR'; + + /** + * Language name in English + * @var string + * @access public + */ + var $lang = 'Brazilian Portuguese'; + + /** + * Native language name + * @var string + * @access public + */ + var $lang_native = 'Portugus Brasileiro'; + + /** + * The word for the minus sign + * @var string + * @access private + */ + var $_minus = 'menos'; + + /** + * The word separator + * @var string + * @access private + */ + var $_sep = ' '; + + /** + * The array containing the digits (indexed by the digits themselves). + * @var array + * @access private + */ + var $_unidade = array( + '', + 'um', + 'dois', + 'trs', + 'quatro', + 'cinco', + 'seis', + 'sete', + 'oito', + 'nove' + ); + + /** + * The array containing numbers 10-19. + * @var array + * @access private + */ + var $_dezena10 = array( + 'dez', + 'onze', + 'doze', + 'treze', + 'quatorze', + 'quinze', + 'dezesseis', + 'dezessete', + 'dezoito', + 'dezenove' + ); + + /** + * The array containing numbers for 10,20,...,90. + * @var array + * @access private + */ + var $_dezena = array( + '', + 'dez', + 'vinte', + 'trinta', + 'quarenta', + 'cinquenta', + 'sessenta', + 'setenta', + 'oitenta', + 'noventa' + ); + + /** + * The array containing numbers for hundrets. + * @var array + * @access private + */ + var $_centena = array( + '', + 'cem', + 'duzentos', + 'trezentos', + 'quatrocentos', + 'quinhentos', + 'seiscentos', + 'setecentos', + 'oitocentos', + 'novecentos' + ); + + /** + * The sufixes for exponents (singular and plural) + * @var array + * @access private + */ + var $_expoente = array( + '', + 'mil', + 'milho', + 'bilho', + 'trilho', + 'quatrilho', + 'quintilho', + 'sextilho', + 'setilho', + 'octilho', + 'nonilho', + 'decilho', + 'undecilho', + 'dodecilho', + 'tredecilho', + 'quatuordecilho', + 'quindecilho', + 'sedecilho', + 'septendecilho' + ); + + + + /** + * Converts a number to its word representation + * in Brazilian Portuguese language + * + * @param integer $num An integer between -infinity and infinity inclusive :) + * that need to be converted to words + * + * @return string The corresponding word representation + * + * @access public + * @author Marcelo Subtil Marcal + * @since PHP 4.2.3 + */ + function toWords($num) { + + $ret = ''; + + $num = trim($num); + + if (substr($num, 0, 1) == '-') { + $ret = $this->_sep . $this->_minus; + $num = substr($num, 1); + } + + // strip excessive zero signs and spaces + $num = trim($num); + $num = preg_replace('/^0+/','',$num); + + while (strlen($num) % 3 != 0) { + $num = "0" . $num; + } + + $num = ereg_replace("(...)", "\\1.", $num); + $num = ereg_replace("\.$", "", $num); + + $inteiro = explode(".", $num); + + for ($i = 0; $i < count($inteiro); $i++) { + $ret .= (($inteiro[$i] > 100) && ($inteiro[$i] < 200)) ? "cento" : $this->_centena[$inteiro[$i][0]]; + $ret .= ($inteiro[$i][0] && ($inteiro[$i][1] || $inteiro[$i][2])) ? " e " : ""; + $ret .= ($inteiro[$i][1] < 2) ? "" : $this->_dezena[$inteiro[$i][1]]; + $ret .= (($inteiro[$i][1] > 1) && ($inteiro[$i][2])) ? " e " : ""; + $ret .= ($inteiro > 0) ? ( ($inteiro[$i][1] == 1) ? $this->_dezena10[$inteiro[$i][2]] : $this->_unidade[$inteiro[$i][2]] ) : ""; + $ret .= $inteiro[$i] > 0 ? " " . ($inteiro[$i] > 1 ? str_replace("o", "es", $this->_expoente[count($inteiro)-1-$i]) : $this->_expoente[count($inteiro)-1-$i]) : ""; + + if ($ret && (isset($inteiro[$i+1]))) { + if ($inteiro[$i+1] != "000") { + $ret .= ($i+1) == (count($inteiro)-1) ? " e " : ", "; + } + } + + } + + return $ret ? " $ret" : " zero"; + + } +} + +?> diff --git a/thirdparty/pear/Numbers/Words/lang.ru.php b/thirdparty/pear/Numbers/Words/lang.ru.php new file mode 100644 index 000000000..28735326a --- /dev/null +++ b/thirdparty/pear/Numbers/Words/lang.ru.php @@ -0,0 +1,616 @@ + | +// | Andrey Demenev | +// +----------------------------------------------------------------------+ +// +// $Id: $ +// +// Numbers_Words class extension to spell numbers in Russian language. +// + +/** + * Class for translating numbers into Russian. + * + * @author Andrey Demenev + * @package Numbers_Words + */ + +/** + * Include needed files + */ +require_once("Numbers/Words.php"); + +/** + * Class for translating numbers into Russian. + * + * @author Andrey Demenev + * @package Numbers_Words + */ +class Numbers_Words_ru extends Numbers_Words +{ + + // {{{ properties + + /** + * Locale name + * @var string + * @access public + */ + var $locale = 'ru'; + + /** + * Language name in English + * @var string + * @access public + */ + var $lang = 'Russian'; + + /** + * Native language name + * @var string + * @access public + */ + var $lang_native = ''; + + /** + * The word for the minus sign + * @var string + * @access private + */ + var $_minus = ''; // minus sign + + /** + * The sufixes for exponents (singular) + * Names partly based on: + * http://home.earthlink.net/~mrob/pub/math/largenum.html + * http://mathforum.org/dr.math/faq/faq.large.numbers.html + * http://www.mazes.com/AmericanNumberingSystem.html + * @var array + * @access private + */ + var $_exponent = array( + 0 => '', + 6 => '', + 9 => '', + 12 => '', + 15 => '', + 18 => '', + 21 => '', + 24 => '', + 27 => '', + 30 => '', + 33 => '', + 36 => '', + 39 => '', + 42 => '', + 45 => '', + 48 => '', + 51 => '', + 54 => '', + 57 => '', + 60 => '', + 63 => '', + 66 => '', + 69 => '', + 72 => '', + 75 => '', + 78 => '', + 81 => '', + 84 => '', + 87 => '', + 90 => '', + 93 => '', + 96 => '', + 99 => '', + 102 => '', + 105 => '', + 108 => '', + 111 => '', + 114 => '', + 117 => '', + 120 => '', + 123 => '', + 126 => '', + 129 => '', + 132 => '', + 135 => '', + 138 => '', + 141 => '', + 144 => '', + 147 => '', + 150 => '', + 153 => '', + 156 => '', + 159 => '', + 162 => '', + 165 => '', + 168 => '', + 171 => '', + 174 => '', + 177 => '', + 180 => '', + 183 => '', + 186 => '', + 189 => '', + 192 => '', + 195 => '', + 198 => '', + 201 => '', + 204 => '', + 207 => '', + 210 => '', + 213 => '', + 216 => '', + 219 => '', + 222 => '', + 225 => '', + 228 => '', + 231 => '', + 234 => '', + 237 => '', + 240 => '', + 243 => '', + 246 => '', + 249 => '', + 252 => '', + 255 => '', + 258 => '', + 261 => '', + 264 => '', + 267 => '', + 270 => '', + 273 => '', + 276 => '', + 279 => '', + 282 => '', + 285 => '', + 288 => '', + 291 => '', + 294 => '', + 297 => '', + 300 => '', + 303 => '' + ); + + /** + * The array containing the teens' :) names + * @var array + * @access private + */ + var $_teens = array( + 11=>'', + 12=>'', + 13=>'', + 14=>'', + 15=>'', + 16=>'', + 17=>'', + 18=>'', + 19=>'' + ); + + /** + * The array containing the tens' names + * @var array + * @access private + */ + var $_tens = array( + 2=>'', + 3=>'', + 4=>'', + 5=>'', + 6=>'', + 7=>'', + 8=>'', + 9=>'' + ); + + /** + * The array containing the hundreds' names + * @var array + * @access private + */ + var $_hundreds = array( + 1=>'', + 2=>'', + 3=>'', + 4=>'', + 5=>'', + 6=>'', + 7=>'', + 8=>'', + 9=>'' + ); + + /** + * The array containing the digits + * for neutral, male and female + * @var array + * @access private + */ + var $_digits = array( + array('', '', '', '', '','', '', '', '', ''), + array('', '', '', '', '','', '', '', '', ''), + array('', '', '', '', '','', '', '', '', '') + ); + + /** + * The word separator + * @var string + * @access private + */ + var $_sep = ' '; + + /** + * The currency names (based on the below links, + * informations from central bank websites and on encyclopedias) + * + * @var array + * @link http://www.jhall.demon.co.uk/currency/by_abbrev.html World currencies + * @link http://www.rusimpex.ru/Content/Reference/Refinfo/valuta.htm Foreign currencies names + * @link http://www.cofe.ru/Finance/money.asp Currencies names + * @access private + */ + var $_currency_names = array( + 'ALL' => array( + array(1,'','',''), + array(2,'','','') + ), + 'AUD' => array( + array(1,' ',' ',' '), + array(1,'','','') + ), + 'BGN' => array( + array(1,'','',''), + array(2,'','','') + ), + 'BRL' => array( + array(1,' ',' ',' '), + array(1,'','','') + ), + 'BYR' => array( + array(1,' ',' ',' '), + array(2,'','','') + ), + 'CAD' => array( + array(1,' ',' ',' '), + array(1,'','','') + ), + 'CHF' => array( + array(1,' ',' ',' '), + array(1,'','','') + ), + 'CYP' => array( + array(1,' ',' ',' '), + array(1,'','','') + ), + 'CZK' => array( + array(2,' ',' ',' '), + array(1,'','','') + ), + 'DKK' => array( + array(2,' ',' ',' '), + array(1,'','','') + ), + 'EEK' => array( + array(2,' ',' ',' '), + array(1,'','','') + ), + 'EUR' => array( + array(1,'','',''), + array(1,'','','') + ), + 'CYP' => array( + array(1,' ',' ',' '), + array(1,'','','') + ), + 'CAD' => array( + array(1,' ',' ',' '), + array(1,'','','') + ), + 'HRK' => array( + array(2,' ',' ',' '), + array(2,'','','') + ), + 'HUF' => array( + array(1,' ',' ',' '), + array(1,'','','') + ), + 'ISK' => array( + array(2,' ',' ',' '), + array(1,'','','') + ), + 'JPY' => array( + array(2,'','',''), + array(2,'','','') + ), + 'LTL' => array( + array(1,'','',''), + array(1,'','','') + ), + 'LVL' => array( + array(1,'','',''), + array(1,'','','') + ), + 'MKD' => array( + array(1,' ',' ',' '), + array(1,'','','') + ), + 'MTL' => array( + array(2,' ',' ',' '), + array(1,'','','') + ), + 'NOK' => array( + array(2,' ',' ',' '), + array(0,'','','') + ), + 'PLN' => array( + array(1,'','',''), + array(1,'','','') + ), + 'ROL' => array( + array(1,' ',' ',' '), + array(1,'','','') + ), + // both RUR and RUR are used, I use RUB for shorter form + 'RUB' => array( + array(1,'','',''), + array(2,'','','') + ), + 'RUR' => array( + array(1,' ',' ',' '), + array(2,'','','') + ), + 'SEK' => array( + array(2,' ',' ',' '), + array(1,'','','') + ), + 'SIT' => array( + array(1,' ',' ',' '), + array(2,'','','') + ), + 'SKK' => array( + array(2,' ',' ',' '), + array(0,'','','') + ), + 'TRL' => array( + array(2,' ',' ',' '), + array(1,'','','') + ), + 'UAH' => array( + array(2,'','',''), + array(1,'','','') + ), + 'USD' => array( + array(1,' ',' ',' '), + array(1,'','','') + ), + 'YUM' => array( + array(1,' ',' ',' '), + array(1,'','','') + ), + 'ZAR' => array( + array(1,'','',''), + array(1,'','','') + ) + ); + + /** + * The default currency name + * @var string + * @access public + */ + var $def_currency = 'RUB'; // Russian rouble + + // }}} + // {{{ toWords() + + /** + * Converts a number to its word representation + * in Russian language + * + * @param integer $num An integer between -infinity and infinity inclusive :) + * that need to be converted to words + * @param integer $gender Gender of string, 0=neutral, 1=male, 2=female. + * Optional, defaults to 1. + * + * @return string The corresponding word representation + * + * @access private + * @author Andrey Demenev + */ + function toWords($num, $gender = 1) + { + return $this->_toWordsWithCase($num, $dummy, $gender); + } + + /** + * Converts a number to its word representation + * in Russian language and determines the case of string. + * + * @param integer $num An integer between -infinity and infinity inclusive :) + * that need to be converted to words + * @param integer $case A variable passed by reference which is set to case + * of the word associated with the number + * @param integer $gender Gender of string, 0=neutral, 1=male, 2=female. + * Optional, defaults to 1. + * + * @return string The corresponding word representation + * + * @access private + * @author Andrey Demenev + */ + function _toWordsWithCase($num, &$case, $gender = 1) + { + $ret = ''; + $case = 3; + + $num = trim($num); + + $sign = ""; + if (substr($num, 0, 1) == '-') { + $sign = $this->_minus . $this->_sep; + $num = substr($num, 1); + } + + while (strlen($num) % 3) $num = '0' . $num; + if ($num == 0 || $num == '') { + $ret .= $this->_digits[$gender][0]; + } + + else { + $power = 0; + while ($power < strlen($num)) { + if (!$power) { + $groupgender = $gender; + } elseif ($power == 3) { + $groupgender = 2; + } else { + $groupgender = 1; + } + $group = $this->_groupToWords(substr($num,-$power-3,3),$groupgender,$_case); + if (!$power) { + $case = $_case; + } + if ($power == 3) { + if ($_case == 1) { + $group .= $this->_sep . ''; + } elseif ($_case == 2) { + $group .= $this->_sep . ''; + } else { + $group .= $this->_sep . ''; + } + } elseif ($group && $power>3 && isset($this->_exponent[$power])) { + $group .= $this->_sep . $this->_exponent[$power]; + if ($_case == 2) { + $group .= ''; + } elseif ($_case == 3) { + $group .= ''; + } + } + if ($group) { + $ret = $group . $this->_sep . $ret; + } + $power+=3; + } + } + + return $sign . $ret; + } + + // }}} + // {{{ _groupToWords() + + /** + * Converts a group of 3 digits to its word representation + * in Russian language. + * + * @param integer $num An integer between -infinity and infinity inclusive :) + * that need to be converted to words + * @param integer $gender Gender of string, 0=neutral, 1=male, 2=female. + * @param integer $case A variable passed by reference which is set to case + * of the word associated with the number + * + * @return string The corresponding word representation + * + * @access private + * @author Andrey Demenev + */ + function _groupToWords($num, $gender, &$case) + { + $ret = ''; + $case = 3; + if ((int)$num == 0) { + $ret = ''; + } elseif ($num < 10) { + $ret = $this->_digits[$gender][(int)$num]; + if ($num == 1) $case = 1; + elseif ($num < 5) $case = 2; + else $case = 3; + } else { + $num = str_pad($num,3,'0',STR_PAD_LEFT); + $hundreds = (int)$num{0}; + if ($hundreds) { + $ret = $this->_hundreds[$hundreds]; + if (substr($num,1) != '00') { + $ret .= $this->_sep; + } + $case = 3; + } + $tens=(int)$num{1}; + $ones=(int)$num{2}; + if ($tens || $ones) { + if ($tens == 1 && $ones == 0) $ret .= ''; + elseif ($tens < 2) $ret .= $this->_teens[$ones+10]; + else { + $ret .= $this->_tens[(int)$tens]; + if ($ones > 0) { + $ret .= $this->_sep + .$this->_digits[$gender][$ones]; + if ($ones == 1) { + $case = 1; + } elseif ($ones < 5) { + $case = 2; + } else { + $case = 3; + } + } + } + } + } + return $ret; + } + // }}} + // {{{ toCurrencyWords() + + /** + * Converts a currency value to its word representation + * (with monetary units) in Russian language + * + * @param integer $int_curr An international currency symbol + * as defined by the ISO 4217 standard (three characters) + * @param integer $decimal A money total amount without fraction part (e.g. amount of dollars) + * @param integer $fraction Fractional part of the money amount (e.g. amount of cents) + * Optional. Defaults to false. + * + * @return string The corresponding word representation for the currency + * + * @access public + * @author Andrey Demenev + */ + function toCurrencyWords($int_curr, $decimal, $fraction = false) + { + $int_curr = strtoupper($int_curr); + if (!isset($this->_currency_names[$int_curr])) { + $int_curr = $this->def_currency; + } + $curr_names = $this->_currency_names[$int_curr]; + $ret = trim($this->_toWordsWithCase($decimal, $case, 0, '', $curr_names[0][0])); + $ret .= $this->_sep . $curr_names[0][$case]; + + if ($fraction !== false) { + $ret .= $this->_sep . trim($this->_toWordsWithCase($fraction, $case, 0, '', $curr_names[1][0])); + $ret .= $this->_sep . $curr_names[1][$case]; + } + return $ret; + } + // }}} + +} + +?> diff --git a/thirdparty/pear/Numbers/Words/lang.sv.php b/thirdparty/pear/Numbers/Words/lang.sv.php new file mode 100644 index 000000000..ac8024805 --- /dev/null +++ b/thirdparty/pear/Numbers/Words/lang.sv.php @@ -0,0 +1,310 @@ + | +// | Robin Ericsson | +// +----------------------------------------------------------------------+ +// +// $Id: lang.de.php,v 1.1.1.1 2004/03/10 10:33:10 makler Exp $ +// +// Numbers_Words class extension to spell numbers in Swedish language. +// + +/** + * + * Class for translating numbers into Swedish. + * @author Robin Ericsson + * @package Numbers_Words + */ + +/** + * Include needed files + */ +require_once("Numbers/Words.php"); + +/** + * Class for translating numbers into Swedish. + * + * @author Robin Ericsson + * @package Numbers_Words + */ +class Numbers_Words_sv extends Numbers_Words +{ + + // {{{ properties + + /** + * Locale name + * @var string + * @access public + */ + var $locale = 'sv'; + + /** + * Language name in English + * @var string + * @access public + */ + var $lang = 'Swedish'; + + /** + * Native language name + * @var string + * @access public + */ + var $lang_native = 'Svenska'; + + /** + * The word for the minus sign + * @var string + * @access private + */ + var $_minus = 'Minus'; // minus sign + + /** + * The sufixes for exponents (singular and plural) + * @var array + * @access private + */ + var $_exponent = array( + 0 => array(''), + 3 => array('tusen', 'tusen'), + 6 => array('miljon','miljoner'), + 9 => array('miljard','miljarder'), + 12 => array('biljon','biljoner'), + 15 => array('biljard','biljarder'), + 18 => array('triljon','triljoner'), + 21 => array('triljard','triljarder'), + 24 => array('kvadriljon','kvadriljoner'), + 27 => array('kvadriljard','kvadriljarder'), + 30 => array('kvintiljon','kvintiljoner'), + 33 => array('kvintiljard','kvintiljarder'), + 36 => array('sextiljon','sextiljoner'), + 39 => array('sextiljard','sextiljarder'), + 42 => array('septiljon','septiljoner'), + 45 => array('septiljard','septiljarder'), + 48 => array('oktiljon','oktiljoner'), + 51 => array('oktiljard','oktiljarder'), + 54 => array('noniljon','noniljoner'), + 57 => array('noniljard','noniljarder'), + 60 => array('dekiljon','dekiljoner'), + 63 => array('dekiljard','dekiljarder'), + 120 => array('vigintiljon','vigintiljoner'), + 123 => array('vigintiljard','vigintiljarder'), + 600 => array('centiljon','centiljoner'), + 603 => array('centiljard','centiljarder') + ); + + /** + * The array containing the digits (indexed by the digits themselves). + * @var array + * @access private + */ + var $_digits = array( + 0 => 'noll', 'ett', 'tv', 'tre', 'fyra', + 'fem', 'sex', 'sju', 'tta', 'nio' + ); + + /** + * The word separator + * @var string + * @access private + */ + var $_sep = ''; + + /** + * The exponent word separator + * @var string + * @access private + */ + var $_sep2 = ' '; + + // }}} + // {{{ toWords() + + /** + * Converts a number to its word representation + * in Swedish language. + * + * @param integer $num An integer between -infinity and infinity inclusive :) + * that need to be converted to words + * @param integer $power The power of ten for the rest of the number to the right. + * Optional, defaults to 0. + * @param integer $powsuffix The power name to be added to the end of the return string. + * Used internally. Optional, defaults to ''. + * + * @return string The corresponding word representation + * + * @access private + * @author Piotr Klaban + * @author Robin Ericsson + * @since PHP 4.2.3 + */ + function toWords($num, $power = 0, $powsuffix = '') { + $ret = ''; + + // add a minus sign + if (substr($num, 0, 1) == '-') { + $ret = $this->_sep . $this->_minus; + $num = substr($num, 1); + } + + // strip excessive zero signs and spaces + $num = trim($num); + $num = preg_replace('/^0+/','',$num); + + if (strlen($num) > 3) { + $maxp = strlen($num)-1; + $curp = $maxp; + for ($p = $maxp; $p > 0; --$p) { // power + + // check for highest power + if (isset($this->_exponent[$p])) { + // send substr from $curp to $p + $snum = substr($num, $maxp - $curp, $curp - $p + 1); + $snum = preg_replace('/^0+/','',$snum); + if ($snum !== '') { + $cursuffix = $this->_exponent[$power][count($this->_exponent[$power])-1]; + if ($powsuffix != '') + $cursuffix .= $this->_sep . $powsuffix; + $ret .= $this->toWords($snum, $p, $cursuffix); + } + $curp = $p - 1; + continue; + } + } + $num = substr($num, $maxp - $curp, $curp - $p + 1); + if ($num == 0) { + return $ret; + } + } elseif ($num == 0 || $num == '') { + return $this->_sep . $this->_digits[0]; + } + + $h = $t = $d = 0; + + switch(strlen($num)) { + case 3: + $h = (int)substr($num,-3,1); + + case 2: + $t = (int)substr($num,-2,1); + + case 1: + $d = (int)substr($num,-1,1); + break; + + case 0: + return; + break; + } + + if ($h) { + $ret .= $this->_sep . $this->_digits[$h] . $this->_sep . 'hundra'; + } + + // ten, twenty etc. + switch ($t) { + case 5: + case 6: + case 7: + $ret .= $this->_sep . $this->_digits[$t] . 'tio'; + break; + + case 9: + $ret .= $this->_sep . 'nittio'; + break; + + case 8: + $ret .= $this->_sep . 'ttio'; + break; + + case 4: + $ret .= $this->_sep . 'fyrtio'; + break; + + case 3: + $ret .= $this->_sep . 'trettio'; + break; + + case 2: + $ret .= $this->_sep . 'tjugo'; + break; + + case 1: + switch ($d) { + case 0: + $ret .= $this->_sep . 'tio'; + break; + + case 1: + $ret .= $this->_sep . 'elva'; + break; + + case 2: + $ret .= $this->_sep . 'tolv'; + break; + + case 3: + $ret .= $this->_sep . 'tretton'; + break; + + case 4: + $ret .= $this->_sep . 'fjorton'; + break; + + case 5: + case 6: + $ret .= $this->_sep . $this->_digits[$d] . 'ton'; + break; + + case 7: + $ret .= $this->_sep . 'sjutton'; + break; + + case 8: + $ret .= $this->_sep . 'arton'; + break; + case 9: + $ret .= $this->_sep . 'nitton'; + } + break; + } + + if ($t != 1 && $d > 0) { // add digits only in <0>,<1,9> and <21,inf> + // add minus sign between [2-9] and digit + $ret .= $this->_sep . $this->_digits[$d]; + } + + if ($power > 0) { + if (isset($this->_exponent[$power])) + $lev = $this->_exponent[$power]; + + if (!isset($lev) || !is_array($lev)) + return null; + + $ret .= $this->_sep . $lev[0]; + } + + if ($powsuffix != '') + $ret .= $this->_sep . $powsuffix; + + return $ret; + } + // }}} +} + +?> diff --git a/thirdparty/pear/OLE/OLE.php b/thirdparty/pear/OLE/OLE.php new file mode 100644 index 000000000..ba05faa30 --- /dev/null +++ b/thirdparty/pear/OLE/OLE.php @@ -0,0 +1,410 @@ + | +// | Based on OLE::Storage_Lite by Kawai, Takanori | +// +----------------------------------------------------------------------+ +// +// $Id: OLE.php,v 1.7 2003/08/21 15:15:40 xnoguer Exp $ + + +/** +* Constants for OLE package +*/ +define('OLE_PPS_TYPE_ROOT', 5); +define('OLE_PPS_TYPE_DIR', 1); +define('OLE_PPS_TYPE_FILE', 2); +define('OLE_DATA_SIZE_SMALL', 0x1000); +define('OLE_LONG_INT_SIZE', 4); +define('OLE_PPS_SIZE', 0x80); + +require_once('PEAR.php'); +require_once 'OLE/PPS.php'; + +/** +* OLE package base class. +* +* @author Xavier Noguer +* @category Structures +* @package OLE +*/ +class OLE extends PEAR +{ + /** + * The file handle for reading an OLE container + * @var resource + */ + var $_file_handle; + + /** + * Array of PPS's found on the OLE container + * @var array + */ + var $_list; + + /** + * Creates a new OLE object + * Remember to use ampersand when creating an OLE object ($my_ole =& new OLE();) + * @access public + */ + function OLE() + { + $this->_list = array(); + } + + /** + * Reads an OLE container from the contents of the file given. + * + * @acces public + * @param string $file + * @return mixed true on success, PEAR_Error on failure + */ + function read($file) + { + /* consider storing offsets as constants */ + $big_block_size_offset = 30; + $iBdbCnt_offset = 44; + $bd_start_offset = 68; + + $fh = @fopen($file, "r"); + if ($fh == false) { + return $this->raiseError("Can't open file $file"); + } + $this->_file_handle = $fh; + + /* begin reading OLE attributes */ + fseek($fh, 0); + $signature = fread($fh, 8); + if ("\xD0\xCF\x11\xE0\xA1\xB1\x1A\xE1" != $signature) { + return $this->raiseError("File doesn't seem to be an OLE container."); + } + fseek($fh, $big_block_size_offset); + $packed_array = unpack("v", fread($fh, 2)); + $big_block_size = pow(2, $packed_array['']); + + $packed_array = unpack("v", fread($fh, 2)); + $small_block_size = pow(2, $packed_array['']); + $i1stBdL = ($big_block_size - 0x4C) / OLE_LONG_INT_SIZE; + + fseek($fh, $iBdbCnt_offset); + $packed_array = unpack("V", fread($fh, 4)); + $iBdbCnt = $packed_array['']; + + $packed_array = unpack("V", fread($fh, 4)); + $pps_wk_start = $packed_array['']; + + fseek($fh, $bd_start_offset); + $packed_array = unpack("V", fread($fh, 4)); + $bd_start = $packed_array['']; + $packed_array = unpack("V", fread($fh, 4)); + $bd_count = $packed_array['']; + $packed_array = unpack("V", fread($fh, 4)); + $iAll = $packed_array['']; // this may be wrong + /* create OLE_PPS objects from */ + $ret = $this->_readPpsWks($pps_wk_start, $big_block_size); + if (PEAR::isError($ret)) { + return $ret; + } + return true; + } + + /** + * Destructor (using PEAR) + * Just closes the file handle on the OLE file. + * + * @access private + */ + function _OLE() + { + fclose($this->_file_handle); + } + + /** + * Gets information about all PPS's on the OLE container from the PPS WK's + * creates an OLE_PPS object for each one. + * + * @access private + * @param integer $pps_wk_start Position inside the OLE file where PPS WK's start + * @param integer $big_block_size Size of big blobks in the OLE file + * @return mixed true on success, PEAR_Error on failure + */ + function _readPpsWks($pps_wk_start, $big_block_size) + { + $pointer = ($pps_wk_start + 1) * $big_block_size; + while (1) + { + fseek($this->_file_handle, $pointer); + $pps_wk = fread($this->_file_handle, OLE_PPS_SIZE); + if (strlen($pps_wk) != OLE_PPS_SIZE) { + break; // Excel likes to add a trailing byte sometimes + //return $this->raiseError("PPS at $pointer seems too short: ".strlen($pps_wk)); + } + $name_length = unpack("c", substr($pps_wk, 64, 2)); // FIXME (2 bytes??) + $name_length = $name_length[''] - 2; + $name = substr($pps_wk, 0, $name_length); + $type = unpack("c", substr($pps_wk, 66, 1)); + if (($type[''] != OLE_PPS_TYPE_ROOT) and + ($type[''] != OLE_PPS_TYPE_DIR) and + ($type[''] != OLE_PPS_TYPE_FILE)) + { + return $this->raiseError("PPS at $pointer has unknown type: {$type['']}"); + } + $prev = unpack("V", substr($pps_wk, 68, 4)); + $next = unpack("V", substr($pps_wk, 72, 4)); + $dir = unpack("V", substr($pps_wk, 76, 4)); + // there is no magic number, it can take different values. + //$magic = unpack("V", strrev(substr($pps_wk, 92, 4))); + $time_1st = substr($pps_wk, 100, 8); + $time_2nd = substr($pps_wk, 108, 8); + $start_block = unpack("V", substr($pps_wk, 116, 4)); + $size = unpack("V", substr($pps_wk, 120, 4)); + // _data member will point to position in file!! + // OLE_PPS object is created with an empty children array!! + $this->_list[] = new OLE_PPS(null, '', $type[''], $prev[''], $next[''], + $dir[''], OLE::OLE2LocalDate($time_1st), + OLE::OLE2LocalDate($time_2nd), + ($start_block[''] + 1) * $big_block_size, array()); + // give it a size + $this->_list[count($this->_list) - 1]->Size = $size['']; + // check if the PPS tree (starting from root) is complete + if ($this->_ppsTreeComplete(0)) { + break; + } + $pointer += OLE_PPS_SIZE; + } + } + + /** + * It checks whether the PPS tree is complete (all PPS's read) + * starting with the given PPS (not necessarily root) + * + * @access private + * @param integer $index The index of the PPS from which we are checking + * @return boolean Whether the PPS tree for the given PPS is complete + */ + function _ppsTreeComplete($index) + { + if ($this->_list[$index]->NextPps != -1) { + if (!isset($this->_list[$this->_list[$index]->NextPps])) { + return false; + } + else { + return $this->_ppsTreeComplete($this->_list[$index]->NextPps); + } + } + if ($this->_list[$index]->DirPps != -1) { + if (!isset($this->_list[$this->_list[$index]->DirPps])) { + return false; + } + else { + return $this->_ppsTreeComplete($this->_list[$index]->DirPps); + } + } + return true; + } + + /** + * Checks whether a PPS is a File PPS or not. + * If there is no PPS for the index given, it will return false. + * + * @access public + * @param integer $index The index for the PPS + * @return bool true if it's a File PPS, false otherwise + */ + function isFile($index) + { + if (isset($this->_list[$index])) { + return ($this->_list[$index]->Type == OLE_PPS_TYPE_FILE); + } + return false; + } + + /** + * Checks whether a PPS is a Root PPS or not. + * If there is no PPS for the index given, it will return false. + * + * @access public + * @param integer $index The index for the PPS. + * @return bool true if it's a Root PPS, false otherwise + */ + function isRoot($index) + { + if (isset($this->_list[$index])) { + return ($this->_list[$index]->Type == OLE_PPS_TYPE_ROOT); + } + return false; + } + + /** + * Gives the total number of PPS's found in the OLE container. + * + * @access public + * @return integer The total number of PPS's found in the OLE container + */ + function ppsTotal() + { + return count($this->_list); + } + + /** + * Gets data from a PPS + * If there is no PPS for the index given, it will return an empty string. + * + * @access public + * @param integer $index The index for the PPS + * @param integer $position The position from which to start reading + * (relative to the PPS) + * @param integer $length The amount of bytes to read (at most) + * @return string The binary string containing the data requested + */ + function getData($index, $position, $length) + { + // if position is not valid return empty string + if (!isset($this->_list[$index]) or ($position >= $this->_list[$index]->Size) or ($position < 0)) { + return ''; + } + // Beware!!! _data member is actually a position + fseek($this->_file_handle, $this->_list[$index]->_data + $position); + return fread($this->_file_handle, $length); + } + + /** + * Gets the data length from a PPS + * If there is no PPS for the index given, it will return 0. + * + * @access public + * @param integer $index The index for the PPS + * @return integer The amount of bytes in data the PPS has + */ + function getDataLength($index) + { + if (isset($this->_list[$index])) { + return $this->_list[$index]->Size; + } + return 0; + } + + /** + * Utility function to transform ASCII text to Unicode + * + * @access public + * @static + * @param string $ascii The ASCII string to transform + * @return string The string in Unicode + */ + function Asc2Ucs($ascii) + { + $rawname = ''; + for ($i = 0; $i < strlen($ascii); $i++) { + $rawname .= $ascii{$i}."\x00"; + } + return $rawname; + } + + /** + * Utility function + * Returns a string for the OLE container with the date given + * + * @access public + * @static + * @param integer $date A timestamp + * @return string The string for the OLE container + */ + function LocalDate2OLE($date = null) + { + if (!isset($date)) { + return "\x00\x00\x00\x00\x00\x00\x00\x00"; + } + + // factor used for separating numbers into 4 bytes parts + $factor = pow(2,32); + + // days from 1-1-1601 until the beggining of UNIX era + $days = 134774; + // calculate seconds + $big_date = $days*24*3600 + gmmktime(date("H",$date),date("i",$date),date("s",$date), + date("m",$date),date("d",$date),date("Y",$date)); + // multiply just to make MS happy + $big_date *= 10000000; + + $high_part = floor($big_date/$factor); + // lower 4 bytes + $low_part = floor((($big_date/$factor) - $high_part)*$factor); + + // Make HEX string + $res = ''; + + for ($i=0; $i<4; $i++) + { + $hex = $low_part % 0x100; + $res .= pack('c', $hex); + $low_part /= 0x100; + } + for ($i=0; $i<4; $i++) + { + $hex = $high_part % 0x100; + $res .= pack('c', $hex); + $high_part /= 0x100; + } + return $res; + } + + /** + * Returns a timestamp from an OLE container's date + * + * @access public + * @static + * @param integer $string A binary string with the encoded date + * @return string The timestamp corresponding to the string + */ + function OLE2LocalDate($string) + { + if (strlen($string) != 8) { + return new PEAR_Error("Expecting 8 byte string"); + } + + // factor used for separating numbers into 4 bytes parts + $factor = pow(2,32); + $high_part = 0; + for ($i=0; $i<4; $i++) + { + $al = unpack('C', $string{(7 - $i)}); + $high_part += $al['']; + if ($i < 3) { + $high_part *= 0x100; + } + } + $low_part = 0; + for ($i=4; $i<8; $i++) + { + $al = unpack('C', $string{(7 - $i)}); + $low_part += $al['']; + if ($i < 7) { + $low_part *= 0x100; + } + } + $big_date = ($high_part*$factor) + $low_part; + // translate to seconds + $big_date /= 10000000; + + // days from 1-1-1601 until the beggining of UNIX era + $days = 134774; + + // translate to seconds from beggining of UNIX era + $big_date -= $days*24*3600; + return floor($big_date); + } +} +?> diff --git a/thirdparty/pear/OLE/PPS.php b/thirdparty/pear/OLE/PPS.php new file mode 100644 index 000000000..9e0f9829c --- /dev/null +++ b/thirdparty/pear/OLE/PPS.php @@ -0,0 +1,219 @@ + | +// | Based on OLE::Storage_Lite by Kawai, Takanori | +// +----------------------------------------------------------------------+ +// +// $Id: PPS.php,v 1.5 2003/12/14 18:12:28 xnoguer Exp $ + + +require_once('PEAR.php'); +require_once('OLE.php'); + +/** +* Class for creating PPS's for OLE containers +* +* @author Xavier Noguer +* @category Structures +* @package OLE +*/ +class OLE_PPS extends PEAR +{ + /** + * The PPS index + * @var integer + */ + var $No; + + /** + * The PPS name (in Unicode) + * @var string + */ + var $Name; + + /** + * The PPS type. Dir, Root or File + * @var integer + */ + var $Type; + + /** + * The index of the previous PPS + * @var integer + */ + var $PrevPps; + + /** + * The index of the next PPS + * @var integer + */ + var $NextPps; + + /** + * The index of it's first child if this is a Dir or Root PPS + * @var integer + */ + var $DirPps; + + /** + * A timestamp + * @var integer + */ + var $Time1st; + + /** + * A timestamp + * @var integer + */ + var $Time2nd; + + /** + * Starting block (small or big) for this PPS's data inside the container + * @var integer + */ + var $_StartBlock; + + /** + * The size of the PPS's data (in bytes) + * @var integer + */ + var $Size; + + /** + * The PPS's data (only used if it's not using a temporary file) + * @var string + */ + var $_data; + + /** + * Array of child PPS's (only used by Root and Dir PPS's) + * @var array + */ + var $children = array(); + + /** + * The constructor + * + * @access public + * @param integer $No The PPS index + * @param string $name The PPS name (in Unicode) + * @param integer $type The PPS type. Dir, Root or File + * @param integer $prev The index of the previous PPS + * @param integer $next The index of the next PPS + * @param integer $dir The index of it's first child if this is a Dir or Root PPS + * @param integer $time_1st A timestamp + * @param integer $time_2nd A timestamp + * @param array $children Array containing children PPS for this PPS + */ + function OLE_PPS($No, $name, $type, $prev, $next, $dir, $time_1st, $time_2nd, $data, $children) + { + $this->No = $No; + $this->Name = $name; + $this->Type = $type; + $this->PrevPps = $prev; + $this->NextPps = $next; + $this->DirPps = $dir; + $this->Time1st = $time_1st; + $this->Time2nd = $time_2nd; + $this->_data = $data; + $this->children = $children; + if ($data != '') { + $this->Size = strlen($data); + } + else { + $this->Size = 0; + } + } + + /** + * Returns the amount of data saved for this PPS + * + * @access private + * @return integer The amount of data (in bytes) + */ + function _DataLen() + { + if (!isset($this->_data)) { + return 0; + } + if (isset($this->_PPS_FILE)) + { + fseek($this->_PPS_FILE, 0); + $stats = fstat($this->_PPS_FILE); + return $stats[7]; + } + else { + return strlen($this->_data); + } + } + + /** + * Returns a string with the PPS's WK (What is a WK?) + * + * @access private + * @return string The binary string + */ + function _getPpsWk() + { + $ret = $this->Name; + for ($i = 0; $i < (64 - strlen($this->Name)); $i++) { + $ret .= "\x00"; + } + $ret .= pack("v", strlen($this->Name) + 2) // 66 + . pack("c", $this->Type) // 67 + . pack("c", 0x00) //UK // 68 + . pack("V", $this->PrevPps) //Prev // 72 + . pack("V", $this->NextPps) //Next // 76 + . pack("V", $this->DirPps) //Dir // 80 + . "\x00\x09\x02\x00" // 84 + . "\x00\x00\x00\x00" // 88 + . "\xc0\x00\x00\x00" // 92 + . "\x00\x00\x00\x46" // 96 // Seems to be ok only for Root + . "\x00\x00\x00\x00" // 100 + . OLE::LocalDate2OLE($this->Time1st) // 108 + . OLE::LocalDate2OLE($this->Time2nd) // 116 + . pack("V", isset($this->_StartBlock)? + $this->_StartBlock:0) // 120 + . pack("V", $this->Size) // 124 + . pack("V", 0); // 128 + return $ret; + } + + /** + * Updates index and pointers to previous, next and children PPS's for this + * PPS. I don't think it'll work with Dir PPS's. + * + * @access private + * @param array &$pps_array Reference to the array of PPS's for the whole OLE + * container + * @return integer The index for this PPS + */ + function _savePpsSetPnt(&$pps_array) + { + $pps_array[count($pps_array)] = &$this; + $this->No = count($pps_array) - 1; + $this->PrevPps = 0xFFFFFFFF; + $this->NextPps = 0xFFFFFFFF; + if (count($this->children) > 0) { + $this->DirPps = $this->children[0]->_savePpsSetPnt($pps_array); + } + else { + $this->DirPps = 0xFFFFFFFF; + } + return $this->No; + } +} +?> diff --git a/thirdparty/pear/OLE/PPS/File.php b/thirdparty/pear/OLE/PPS/File.php new file mode 100644 index 000000000..1deb31f87 --- /dev/null +++ b/thirdparty/pear/OLE/PPS/File.php @@ -0,0 +1,114 @@ + | +// | Based on OLE::Storage_Lite by Kawai, Takanori | +// +----------------------------------------------------------------------+ +// +// $Id: File.php,v 1.8 2003/12/12 21:10:10 xnoguer Exp $ + + +require_once ('OLE/PPS.php'); + +/** +* Class for creating File PPS's for OLE containers +* +* @author Xavier Noguer +* @category Structures +* @package OLE +*/ +class OLE_PPS_File extends OLE_PPS +{ + /** + * The temporary dir for storing the OLE file + * @var string + */ + var $_tmp_dir; + + /** + * The constructor + * + * @access public + * @param string $name The name of the file (in Unicode) + * @see OLE::Asc2Ucs() + */ + function OLE_PPS_File($name) + { + $this->_tmp_dir = ''; + $this->OLE_PPS( + null, + $name, + OLE_PPS_TYPE_FILE, + null, + null, + null, + null, + null, + '', + array()); + } + + /** + * Sets the temp dir used for storing the OLE file + * + * @access public + * @param string $dir The dir to be used as temp dir + * @return true if given dir is valid, false otherwise + */ + function setTempDir($dir) + { + if (is_dir($dir)) { + $this->_tmp_dir = $dir; + return true; + } + return false; + } + + /** + * Initialization method. Has to be called right after OLE_PPS_File(). + * + * @access public + * @return mixed true on success. PEAR_Error on failure + */ + function init() + { + $this->_tmp_filename = tempnam($this->_tmp_dir, "OLE_PPS_File"); + $fh = @fopen($this->_tmp_filename, "w+b"); + if ($fh == false) { + return $this->raiseError("Can't create temporary file"); + } + $this->_PPS_FILE = $fh; + if ($this->_PPS_FILE) { + fseek($this->_PPS_FILE, 0); + } + } + + /** + * Append data to PPS + * + * @access public + * @param string $data The data to append + */ + function append($data) + { + if ($this->_PPS_FILE) { + fwrite($this->_PPS_FILE, $data); + } + else { + $this->_data .= $data; + } + } +} +?> diff --git a/thirdparty/pear/OLE/PPS/Root.php b/thirdparty/pear/OLE/PPS/Root.php new file mode 100644 index 000000000..90166f03c --- /dev/null +++ b/thirdparty/pear/OLE/PPS/Root.php @@ -0,0 +1,519 @@ + | +// | Based on OLE::Storage_Lite by Kawai, Takanori | +// +----------------------------------------------------------------------+ +// +// $Id: Root.php,v 1.7 2003/12/12 21:10:10 xnoguer Exp $ + + +require_once ('OLE/PPS.php'); + +/** +* Class for creating Root PPS's for OLE containers +* +* @author Xavier Noguer +* @category Structures +* @package OLE +*/ +class OLE_PPS_Root extends OLE_PPS +{ + /** + * The temporary dir for storing the OLE file + * @var string + */ + var $_tmp_dir; + + /** + * Constructor + * + * @access public + * @param integer $time_1st A timestamp + * @param integer $time_2nd A timestamp + */ + function OLE_PPS_Root($time_1st, $time_2nd, $raChild) + { + $this->_tmp_dir = ''; + $this->OLE_PPS( + null, + OLE::Asc2Ucs('Root Entry'), + OLE_PPS_TYPE_ROOT, + null, + null, + null, + $time_1st, + $time_2nd, + null, + $raChild); + } + + /** + * Sets the temp dir used for storing the OLE file + * + * @access public + * @param string $dir The dir to be used as temp dir + * @return true if given dir is valid, false otherwise + */ + function setTempDir($dir) + { + if (is_dir($dir)) { + $this->_tmp_dir = $dir; + return true; + } + return false; + } + + /** + * Method for saving the whole OLE container (including files). + * In fact, if called with an empty argument (or '-'), it saves to a + * temporary file and then outputs it's contents to stdout. + * + * @param string $filename The name of the file where to save the OLE container + * @access public + * @return mixed true on success, PEAR_Error on failure + */ + function save($filename) + { + // Initial Setting for saving + $this->_BIG_BLOCK_SIZE = pow(2, + ((isset($this->_BIG_BLOCK_SIZE))? $this->_adjust2($this->_BIG_BLOCK_SIZE) : 9)); + $this->_SMALL_BLOCK_SIZE= pow(2, + ((isset($this->_SMALL_BLOCK_SIZE))? $this->_adjust2($this->_SMALL_BLOCK_SIZE): 6)); + + // Open temp file if we are sending output to stdout + if (($filename == '-') or ($filename == '')) + { + $this->_tmp_filename = tempnam($this->_tmp_dir, "OLE_PPS_Root"); + $this->_FILEH_ = @fopen($this->_tmp_filename,"w+b"); + if ($this->_FILEH_ == false) { + return $this->raiseError("Can't create temporary file."); + } + } + else + { + $this->_FILEH_ = @fopen($filename, "wb"); + if ($this->_FILEH_ == false) { + return $this->raiseError("Can't open $filename. It may be in use or protected."); + } + } + // Make an array of PPS's (for Save) + $aList = array(); + $this->_savePpsSetPnt($aList); + // calculate values for header + list($iSBDcnt, $iBBcnt, $iPPScnt) = $this->_calcSize($aList); //, $rhInfo); + // Save Header + $this->_saveHeader($iSBDcnt, $iBBcnt, $iPPScnt); + + // Make Small Data string (write SBD) + $this->_data = $this->_makeSmallData($aList); + + // Write BB + $this->_saveBigData($iSBDcnt, $aList); + // Write PPS + $this->_savePps($aList); + // Write Big Block Depot and BDList and Adding Header informations + $this->_saveBbd($iSBDcnt, $iBBcnt, $iPPScnt); + // Close File, send it to stdout if necessary + if(($filename == '-') or ($filename == '')) + { + fseek($this->_FILEH_, 0); + fpassthru($this->_FILEH_); + @fclose($this->_FILEH_); + // Delete the temporary file. + @unlink($this->_tmp_filename); + } + else { + @fclose($this->_FILEH_); + } + return true; + } + + /** + * Calculate some numbers + * + * @access private + * @param array $raList Reference to an array of PPS's + * @return array The array of numbers + */ + function _calcSize(&$raList) + { + // Calculate Basic Setting + list($iSBDcnt, $iBBcnt, $iPPScnt) = array(0,0,0); + $iSmallLen = 0; + $iSBcnt = 0; + for ($i = 0; $i < count($raList); $i++) { + if($raList[$i]->Type == OLE_PPS_TYPE_FILE) { + $raList[$i]->Size = $raList[$i]->_DataLen(); + if($raList[$i]->Size < OLE_DATA_SIZE_SMALL) { + $iSBcnt += floor($raList[$i]->Size / $this->_SMALL_BLOCK_SIZE) + + (($raList[$i]->Size % $this->_SMALL_BLOCK_SIZE)? 1: 0); + } + else { + $iBBcnt += (floor($raList[$i]->Size / $this->_BIG_BLOCK_SIZE) + + (($raList[$i]->Size % $this->_BIG_BLOCK_SIZE)? 1: 0)); + } + } + } + $iSmallLen = $iSBcnt * $this->_SMALL_BLOCK_SIZE; + $iSlCnt = floor($this->_BIG_BLOCK_SIZE / OLE_LONG_INT_SIZE); + $iSBDcnt = floor($iSBcnt / $iSlCnt) + (($iSBcnt % $iSlCnt)? 1:0); + $iBBcnt += (floor($iSmallLen / $this->_BIG_BLOCK_SIZE) + + (( $iSmallLen % $this->_BIG_BLOCK_SIZE)? 1: 0)); + $iCnt = count($raList); + $iBdCnt = $this->_BIG_BLOCK_SIZE / OLE_PPS_SIZE; + $iPPScnt = (floor($iCnt/$iBdCnt) + (($iCnt % $iBdCnt)? 1: 0)); + + return array($iSBDcnt, $iBBcnt, $iPPScnt); + } + + /** + * Helper function for caculating a magic value for block sizes + * + * @access private + * @param integer $i2 The argument + * @see save() + * @return integer + */ + function _adjust2($i2) + { + $iWk = log($i2)/log(2); + return ($iWk > floor($iWk))? floor($iWk)+1:$iWk; + } + + /** + * Save OLE header + * + * @access private + * @param integer $iSBDcnt + * @param integer $iBBcnt + * @param integer $iPPScnt + */ + function _saveHeader($iSBDcnt, $iBBcnt, $iPPScnt) + { + $FILE = $this->_FILEH_; + + // Calculate Basic Setting + $iBlCnt = $this->_BIG_BLOCK_SIZE / OLE_LONG_INT_SIZE; + $i1stBdL = ($this->_BIG_BLOCK_SIZE - 0x4C) / OLE_LONG_INT_SIZE; + + $iBdExL = 0; + $iAll = $iBBcnt + $iPPScnt + $iSBDcnt; + $iAllW = $iAll; + $iBdCntW = floor($iAllW / $iBlCnt) + (($iAllW % $iBlCnt)? 1: 0); + $iBdCnt = floor(($iAll + $iBdCntW) / $iBlCnt) + ((($iAllW+$iBdCntW) % $iBlCnt)? 1: 0); + + // Calculate BD count + if ($iBdCnt >$i1stBdL) + { + while (1) + { + $iBdExL++; + $iAllW++; + $iBdCntW = floor($iAllW / $iBlCnt) + (($iAllW % $iBlCnt)? 1: 0); + $iBdCnt = floor(($iAllW + $iBdCntW) / $iBlCnt) + ((($iAllW+$iBdCntW) % $iBlCnt)? 1: 0); + if ($iBdCnt <= ($iBdExL*$iBlCnt+ $i1stBdL)) { + break; + } + } + } + + // Save Header + fwrite($FILE, + "\xD0\xCF\x11\xE0\xA1\xB1\x1A\xE1" + . "\x00\x00\x00\x00" + . "\x00\x00\x00\x00" + . "\x00\x00\x00\x00" + . "\x00\x00\x00\x00" + . pack("v", 0x3b) + . pack("v", 0x03) + . pack("v", -2) + . pack("v", 9) + . pack("v", 6) + . pack("v", 0) + . "\x00\x00\x00\x00" + . "\x00\x00\x00\x00" + . pack("V", $iBdCnt) + . pack("V", $iBBcnt+$iSBDcnt) //ROOT START + . pack("V", 0) + . pack("V", 0x1000) + . pack("V", 0) //Small Block Depot + . pack("V", 1) + ); + // Extra BDList Start, Count + if ($iBdCnt < $i1stBdL) + { + fwrite($FILE, + pack("V", -2). // Extra BDList Start + pack("V", 0) // Extra BDList Count + ); + } + else + { + fwrite($FILE, pack("V", $iAll+$iBdCnt) . pack("V", $iBdExL)); + } + + // BDList + for ($i=0; $i<$i1stBdL and $i < $iBdCnt; $i++) { + fwrite($FILE, pack("V", $iAll+$i)); + } + if ($i < $i1stBdL) + { + for ($j = 0; $j < ($i1stBdL-$i); $j++) { + fwrite($FILE, (pack("V", -1))); + } + } + } + + /** + * Saving big data (PPS's with data bigger than OLE_DATA_SIZE_SMALL) + * + * @access private + * @param integer $iStBlk + * @param array &$raList Reference to array of PPS's + */ + function _saveBigData($iStBlk, &$raList) + { + $FILE = $this->_FILEH_; + + // cycle through PPS's + for ($i = 0; $i < count($raList); $i++) + { + if($raList[$i]->Type != OLE_PPS_TYPE_DIR) + { + $raList[$i]->Size = $raList[$i]->_DataLen(); + if(($raList[$i]->Size >= OLE_DATA_SIZE_SMALL) or + (($raList[$i]->Type == OLE_PPS_TYPE_ROOT) and isset($raList[$i]->_data))) + { + // Write Data + if(isset($raList[$i]->_PPS_FILE)) + { + $iLen = 0; + fseek($raList[$i]->_PPS_FILE, 0); // To The Top + while($sBuff = fread($raList[$i]->_PPS_FILE, 4096)) + { + $iLen += strlen($sBuff); + fwrite($FILE, $sBuff); + } + } + else { + fwrite($FILE, $raList[$i]->_data); + } + + if ($raList[$i]->Size % $this->_BIG_BLOCK_SIZE) + { + for ($j = 0; $j < ($this->_BIG_BLOCK_SIZE - ($raList[$i]->Size % $this->_BIG_BLOCK_SIZE)); $j++) { + fwrite($FILE, "\x00"); + } + } + // Set For PPS + $raList[$i]->_StartBlock = $iStBlk; + $iStBlk += + (floor($raList[$i]->Size / $this->_BIG_BLOCK_SIZE) + + (($raList[$i]->Size % $this->_BIG_BLOCK_SIZE)? 1: 0)); + } + // Close file for each PPS, and unlink it + if (isset($raList[$i]->_PPS_FILE)) + { + @fclose($raList[$i]->_PPS_FILE); + $raList[$i]->_PPS_FILE = null; + @unlink($raList[$i]->_tmp_filename); + } + } + } + } + + /** + * get small data (PPS's with data smaller than OLE_DATA_SIZE_SMALL) + * + * @access private + * @param array &$raList Reference to array of PPS's + */ + function _makeSmallData(&$raList) + { + $sRes = ''; + $FILE = $this->_FILEH_; + $iSmBlk = 0; + + for ($i = 0; $i < count($raList); $i++) + { + // Make SBD, small data string + if ($raList[$i]->Type == OLE_PPS_TYPE_FILE) + { + if ($raList[$i]->Size <= 0) { + continue; + } + if ($raList[$i]->Size < OLE_DATA_SIZE_SMALL) + { + $iSmbCnt = floor($raList[$i]->Size / $this->_SMALL_BLOCK_SIZE) + + (($raList[$i]->Size % $this->_SMALL_BLOCK_SIZE)? 1: 0); + // Add to SBD + for ($j = 0; $j < ($iSmbCnt-1); $j++) { + fwrite($FILE, pack("V", $j+$iSmBlk+1)); + } + fwrite($FILE, pack("V", -2)); + + // Add to Data String(this will be written for RootEntry) + if ($raList[$i]->_PPS_FILE) + { + fseek($raList[$i]->_PPS_FILE, 0); // To The Top + while ($sBuff = fread($raList[$i]->_PPS_FILE, 4096)) { + $sRes .= $sBuff; + } + } + else { + $sRes .= $raList[$i]->_data; + } + if($raList[$i]->Size % $this->_SMALL_BLOCK_SIZE) + { + for ($j = 0; $j < ($this->_SMALL_BLOCK_SIZE - ($raList[$i]->Size % $this->_SMALL_BLOCK_SIZE)); $j++) { + $sRes .= "\x00"; + } + } + // Set for PPS + $raList[$i]->_StartBlock = $iSmBlk; + $iSmBlk += $iSmbCnt; + } + } + } + $iSbCnt = floor($this->_BIG_BLOCK_SIZE / OLE_LONG_INT_SIZE); + if($iSmBlk % $iSbCnt) + { + for ($i = 0; $i < ($iSbCnt - ($iSmBlk % $iSbCnt)); $i++) { + fwrite($FILE, pack("V", -1)); + } + } + return $sRes; + } + + /** + * Saves all the PPS's WKs + * + * @access private + * @param array $raList Reference to an array with all PPS's + */ + function _savePps(&$raList) + { + // Save each PPS WK + for ($i = 0; $i < count($raList); $i++) { + fwrite($this->_FILEH_, $raList[$i]->_getPpsWk()); + } + // Adjust for Block + $iCnt = count($raList); + $iBCnt = $this->_BIG_BLOCK_SIZE / OLE_PPS_SIZE; + if ($iCnt % $iBCnt) + { + for ($i = 0; $i < (($iBCnt - ($iCnt % $iBCnt)) * OLE_PPS_SIZE); $i++) { + fwrite($this->_FILEH_, "\x00"); + } + } + } + + /** + * Saving Big Block Depot + * + * @access private + * @param integer $iSbdSize + * @param integer $iBsize + * @param integer $iPpsCnt + */ + function _saveBbd($iSbdSize, $iBsize, $iPpsCnt) + { + $FILE = $this->_FILEH_; + // Calculate Basic Setting + $iBbCnt = $this->_BIG_BLOCK_SIZE / OLE_LONG_INT_SIZE; + $i1stBdL = ($this->_BIG_BLOCK_SIZE - 0x4C) / OLE_LONG_INT_SIZE; + + $iBdExL = 0; + $iAll = $iBsize + $iPpsCnt + $iSbdSize; + $iAllW = $iAll; + $iBdCntW = floor($iAllW / $iBbCnt) + (($iAllW % $iBbCnt)? 1: 0); + $iBdCnt = floor(($iAll + $iBdCntW) / $iBbCnt) + ((($iAllW+$iBdCntW) % $iBbCnt)? 1: 0); + // Calculate BD count + if ($iBdCnt >$i1stBdL) + { + while (1) + { + $iBdExL++; + $iAllW++; + $iBdCntW = floor($iAllW / $iBbCnt) + (($iAllW % $iBbCnt)? 1: 0); + $iBdCnt = floor(($iAllW + $iBdCntW) / $iBbCnt) + ((($iAllW+$iBdCntW) % $iBbCnt)? 1: 0); + if ($iBdCnt <= ($iBdExL*$iBbCnt+ $i1stBdL)) { + break; + } + } + } + + // Making BD + // Set for SBD + if ($iSbdSize > 0) + { + for ($i = 0; $i<($iSbdSize-1); $i++) { + fwrite($FILE, pack("V", $i+1)); + } + fwrite($FILE, pack("V", -2)); + } + // Set for B + for ($i = 0; $i<($iBsize-1); $i++) { + fwrite($FILE, pack("V", $i+$iSbdSize+1)); + } + fwrite($FILE, pack("V", -2)); + + // Set for PPS + for ($i = 0; $i<($iPpsCnt-1); $i++) { + fwrite($FILE, pack("V", $i+$iSbdSize+$iBsize+1)); + } + fwrite($FILE, pack("V", -2)); + // Set for BBD itself ( 0xFFFFFFFD : BBD) + for ($i=0; $i<$iBdCnt;$i++) { + fwrite($FILE, pack("V", 0xFFFFFFFD)); + } + // Set for ExtraBDList + for ($i=0; $i<$iBdExL;$i++) { + fwrite($FILE, pack("V", 0xFFFFFFFC)); + } + // Adjust for Block + if (($iAllW + $iBdCnt) % $iBbCnt) + { + for ($i = 0; $i < ($iBbCnt - (($iAllW + $iBdCnt) % $iBbCnt)); $i++) { + fwrite($FILE, pack("V", -1)); + } + } + // Extra BDList + if ($iBdCnt > $i1stBdL) + { + $iN=0; + $iNb=0; + for ($i=$i1stBdL;$i<$iBdCnt; $i++, $iN++) + { + if ($iN>=($iBbCnt-1)) + { + $iN = 0; + $iNb++; + fwrite($FILE, pack("V", $iAll+$iBdCnt+$iNb)); + } + fwrite($FILE, pack("V", $iBsize+$iSbdSize+$iPpsCnt+$i)); + } + if (($iBdCnt-$i1stBdL) % ($iBbCnt-1)) + { + for ($i = 0; $i < (($iBbCnt-1) - (($iBdCnt-$i1stBdL) % ($iBbCnt-1))); $i++) { + fwrite($FILE, pack("V", -1)); + } + } + fwrite($FILE, pack("V", -2)); + } + } +} +?> diff --git a/thirdparty/pear/OS/Guess.php b/thirdparty/pear/OS/Guess.php new file mode 100644 index 000000000..abcae5946 --- /dev/null +++ b/thirdparty/pear/OS/Guess.php @@ -0,0 +1,265 @@ + | +// | | +// +----------------------------------------------------------------------+ +// +// $Id: Guess.php,v 1.9 2003/04/03 23:11:50 ssb Exp $ + +// {{{ uname examples + +// php_uname() without args returns the same as 'uname -a', or a PHP-custom +// string for Windows. +// PHP versions prior to 4.3 return the uname of the host where PHP was built, +// as of 4.3 it returns the uname of the host running the PHP code. +// +// PC RedHat Linux 7.1: +// Linux host.example.com 2.4.2-2 #1 Sun Apr 8 20:41:30 EDT 2001 i686 unknown +// +// PC Debian Potato: +// Linux host 2.4.17 #2 SMP Tue Feb 12 15:10:04 CET 2002 i686 unknown +// +// PC FreeBSD 3.3: +// FreeBSD host.example.com 3.3-STABLE FreeBSD 3.3-STABLE #0: Mon Feb 21 00:42:31 CET 2000 root@example.com:/usr/src/sys/compile/CONFIG i386 +// +// PC FreeBSD 4.3: +// FreeBSD host.example.com 4.3-RELEASE FreeBSD 4.3-RELEASE #1: Mon Jun 25 11:19:43 EDT 2001 root@example.com:/usr/src/sys/compile/CONFIG i386 +// +// PC FreeBSD 4.5: +// FreeBSD host.example.com 4.5-STABLE FreeBSD 4.5-STABLE #0: Wed Feb 6 23:59:23 CET 2002 root@example.com:/usr/src/sys/compile/CONFIG i386 +// +// PC FreeBSD 4.5 w/uname from GNU shellutils: +// FreeBSD host.example.com 4.5-STABLE FreeBSD 4.5-STABLE #0: Wed Feb i386 unknown +// +// HP 9000/712 HP-UX 10: +// HP-UX iq B.10.10 A 9000/712 2008429113 two-user license +// +// HP 9000/712 HP-UX 10 w/uname from GNU shellutils: +// HP-UX host B.10.10 A 9000/712 unknown +// +// IBM RS6000/550 AIX 4.3: +// AIX host 3 4 000003531C00 +// +// AIX 4.3 w/uname from GNU shellutils: +// AIX host 3 4 000003531C00 unknown +// +// SGI Onyx IRIX 6.5 w/uname from GNU shellutils: +// IRIX64 host 6.5 01091820 IP19 mips +// +// SGI Onyx IRIX 6.5: +// IRIX64 host 6.5 01091820 IP19 +// +// SparcStation 20 Solaris 8 w/uname from GNU shellutils: +// SunOS host.example.com 5.8 Generic_108528-12 sun4m sparc +// +// SparcStation 20 Solaris 8: +// SunOS host.example.com 5.8 Generic_108528-12 sun4m sparc SUNW,SPARCstation-20 +// + +// }}} + +/* TODO: + * - define endianness, to allow matchSignature("bigend") etc. + */ + +class OS_Guess +{ + var $sysname; + var $nodename; + var $cpu; + var $release; + var $extra; + + function OS_Guess($uname = null) + { + list($this->sysname, + $this->release, + $this->cpu, + $this->extra, + $this->nodename) = $this->parseSignature($uname); + } + + function parseSignature($uname = null) + { + static $sysmap = array( + 'HP-UX' => 'hpux', + 'IRIX64' => 'irix', + // Darwin? + ); + static $cpumap = array( + 'i586' => 'i386', + 'i686' => 'i386', + ); + if ($uname === null) { + $uname = php_uname(); + } + $parts = explode('[[:space:]]+', trim($uname)); + $n = count($parts); + + $release = $machine = $cpu = ''; + $sysname = $parts[0]; + $nodename = $parts[1]; + $cpu = $parts[$n-1]; + $extra = ''; + if ($cpu == 'unknown') { + $cpu = $parts[$n-2]; + } + + switch ($sysname) { + case 'AIX': + $release = "$parts[3].$parts[2]"; + break; + case 'Windows': + switch ($parts[1]) { + case '95/98': + $release = '9x'; + break; + default: + $release = $parts[1]; + break; + } + $cpu = 'i386'; + break; + case 'Linux': + $extra = $this->_detectGlibcVersion(); + // use only the first two digits from the kernel version + $release = ereg_replace('^([[:digit:]]+\.[[:digit:]]+).*', '\1', $parts[2]); + break; + default: + $release = ereg_replace('-.*', '', $parts[2]); + break; + } + + + if (isset($sysmap[$sysname])) { + $sysname = $sysmap[$sysname]; + } else { + $sysname = strtolower($sysname); + } + if (isset($cpumap[$cpu])) { + $cpu = $cpumap[$cpu]; + } + return array($sysname, $release, $cpu, $extra, $nodename); + } + + function _detectGlibcVersion() + { + // Use glibc's header file to + // get major and minor version number: + include_once "System.php"; + $tmpfile = System::mktemp("glibctest"); + $fp = fopen($tmpfile, "w"); + fwrite($fp, "#include \n__GLIBC__ __GLIBC_MINOR__\n"); + fclose($fp); + $cpp = popen("/usr/bin/cpp $tmpfile", "r"); + $major = $minor = 0; + while ($line = fgets($cpp, 1024)) { + if ($line{0} == '#') { + continue; + } + if (list($major, $minor) = explode(' ', trim($line))) { + break; + } + } + pclose($cpp); + unlink($tmpfile); + if (!($major && $minor) && file_exists('/lib/libc.so.6')) { + // Let's try reading the libc.so.6 symlink + if (ereg('^libc-([.*])\.so$', basename(readlink('/lib/libc.so.6')), $matches)) { + list($major, $minor) = explode('.', $matches); + } + } + if (!($major && $minor)) { + return ''; + } + return "glibc{$major}.{$minor}"; + } + + function getSignature() + { + if (empty($this->extra)) { + return "{$this->sysname}-{$this->release}-{$this->cpu}"; + } + return "{$this->sysname}-{$this->release}-{$this->cpu}-{$this->extra}"; + } + + function getSysname() + { + return $this->sysname; + } + + function getNodename() + { + return $this->nodename; + } + + function getCpu() + { + return $this->cpu; + } + + function getRelease() + { + return $this->release; + } + + function getExtra() + { + return $this->extra; + } + + function matchSignature($match) + { + if (is_array($match)) { + $fragments = $match; + } else { + $fragments = explode('-', $match); + } + $n = count($fragments); + $matches = 0; + if ($n > 0) { + $matches += $this->_matchFragment($fragments[0], $this->sysname); + } + if ($n > 1) { + $matches += $this->_matchFragment($fragments[1], $this->release); + } + if ($n > 2) { + $matches += $this->_matchFragment($fragments[2], $this->cpu); + } + if ($n > 3) { + $matches += $this->_matchFragment($fragments[3], $this->extra); + } + return ($matches == $n); + } + + function _matchFragment($fragment, $value) + { + if (strcspn($fragment, '*?') < strlen($fragment)) { + $reg = '^' . str_replace(array('*', '?', '/'), array('.*', '.', '\\/'), $fragment) . '$'; + return preg_match($reg, $value); + } + return ($fragment == '*' || !strcasecmp($fragment, $value)); + } + +} + +/* + * Local Variables: + * indent-tabs-mode: nil + * c-basic-offset: 4 + * End: + */ +?> diff --git a/thirdparty/pear/PEAR.php b/thirdparty/pear/PEAR.php new file mode 100644 index 000000000..0cda6864d --- /dev/null +++ b/thirdparty/pear/PEAR.php @@ -0,0 +1,1056 @@ + | +// | Stig Bakken | +// | Tomas V.V.Cox | +// +--------------------------------------------------------------------+ +// +// $Id: PEAR.php 3355 2005-06-11 22:14:40Z nbm $ +// + +define('PEAR_ERROR_RETURN', 1); +define('PEAR_ERROR_PRINT', 2); +define('PEAR_ERROR_TRIGGER', 4); +define('PEAR_ERROR_DIE', 8); +define('PEAR_ERROR_CALLBACK', 16); +/** + * WARNING: obsolete + * @deprecated + */ +define('PEAR_ERROR_EXCEPTION', 32); +define('PEAR_ZE2', (function_exists('version_compare') && + version_compare(zend_version(), "2-dev", "ge"))); + +if (substr(PHP_OS, 0, 3) == 'WIN') { + define('OS_WINDOWS', true); + define('OS_UNIX', false); + define('PEAR_OS', 'Windows'); +} else { + define('OS_WINDOWS', false); + define('OS_UNIX', true); + define('PEAR_OS', 'Unix'); // blatant assumption +} + +// instant backwards compatibility +if (!defined('PATH_SEPARATOR')) { + if (OS_WINDOWS) { + define('PATH_SEPARATOR', ';'); + } else { + define('PATH_SEPARATOR', ':'); + } +} + +$GLOBALS['_PEAR_default_error_mode'] = PEAR_ERROR_RETURN; +$GLOBALS['_PEAR_default_error_options'] = E_USER_NOTICE; +$GLOBALS['_PEAR_destructor_object_list'] = array(); +$GLOBALS['_PEAR_shutdown_funcs'] = array(); +$GLOBALS['_PEAR_error_handler_stack'] = array(); + +ini_set('track_errors', true); + +/** + * Base class for other PEAR classes. Provides rudimentary + * emulation of destructors. + * + * If you want a destructor in your class, inherit PEAR and make a + * destructor method called _yourclassname (same name as the + * constructor, but with a "_" prefix). Also, in your constructor you + * have to call the PEAR constructor: $this->PEAR();. + * The destructor method will be called without parameters. Note that + * at in some SAPI implementations (such as Apache), any output during + * the request shutdown (in which destructors are called) seems to be + * discarded. If you need to get any debug information from your + * destructor, use error_log(), syslog() or something similar. + * + * IMPORTANT! To use the emulated destructors you need to create the + * objects by reference: $obj =& new PEAR_child; + * + * @since PHP 4.0.2 + * @author Stig Bakken + * @see http://pear.php.net/manual/ + */ +class PEAR +{ + // {{{ properties + + /** + * Whether to enable internal debug messages. + * + * @var bool + * @access private + */ + var $_debug = false; + + /** + * Default error mode for this object. + * + * @var int + * @access private + */ + var $_default_error_mode = null; + + /** + * Default error options used for this object when error mode + * is PEAR_ERROR_TRIGGER. + * + * @var int + * @access private + */ + var $_default_error_options = null; + + /** + * Default error handler (callback) for this object, if error mode is + * PEAR_ERROR_CALLBACK. + * + * @var string + * @access private + */ + var $_default_error_handler = ''; + + /** + * Which class to use for error objects. + * + * @var string + * @access private + */ + var $_error_class = 'PEAR_Error'; + + /** + * An array of expected errors. + * + * @var array + * @access private + */ + var $_expected_errors = array(); + + // }}} + + // {{{ constructor + + /** + * Constructor. Registers this object in + * $_PEAR_destructor_object_list for destructor emulation if a + * destructor object exists. + * + * @param string $error_class (optional) which class to use for + * error objects, defaults to PEAR_Error. + * @access public + * @return void + */ + function PEAR($error_class = null) + { + $classname = strtolower(get_class($this)); + if ($this->_debug) { + print "PEAR constructor called, class=$classname\n"; + } + if ($error_class !== null) { + $this->_error_class = $error_class; + } + while ($classname && strcasecmp($classname, "pear")) { + $destructor = "_$classname"; + if (method_exists($this, $destructor)) { + global $_PEAR_destructor_object_list; + $_PEAR_destructor_object_list[] = &$this; + static $registered = false; + if (!$registered) { + register_shutdown_function("_PEAR_call_destructors"); + $registered = true; + } + break; + } else { + $classname = get_parent_class($classname); + } + } + } + + // }}} + // {{{ destructor + + /** + * Destructor (the emulated type of...). Does nothing right now, + * but is included for forward compatibility, so subclass + * destructors should always call it. + * + * See the note in the class desciption about output from + * destructors. + * + * @access public + * @return void + */ + function _PEAR() { + if ($this->_debug) { + printf("PEAR destructor called, class=%s\n", strtolower(get_class($this))); + } + } + + // }}} + // {{{ getStaticProperty() + + /** + * If you have a class that's mostly/entirely static, and you need static + * properties, you can use this method to simulate them. Eg. in your method(s) + * do this: $myVar = &PEAR::getStaticProperty('myclass', 'myVar'); + * You MUST use a reference, or they will not persist! + * + * @access public + * @param string $class The calling classname, to prevent clashes + * @param string $var The variable to retrieve. + * @return mixed A reference to the variable. If not set it will be + * auto initialised to NULL. + */ + function &getStaticProperty($class, $var) + { + static $properties; + return $properties[$class][$var]; + } + + // }}} + // {{{ registerShutdownFunc() + + /** + * Use this function to register a shutdown method for static + * classes. + * + * @access public + * @param mixed $func The function name (or array of class/method) to call + * @param mixed $args The arguments to pass to the function + * @return void + */ + function registerShutdownFunc($func, $args = array()) + { + $GLOBALS['_PEAR_shutdown_funcs'][] = array($func, $args); + } + + // }}} + // {{{ isError() + + /** + * Tell whether a value is a PEAR error. + * + * @param mixed $data the value to test + * @param int $code if $data is an error object, return true + * only if $code is a string and + * $obj->getMessage() == $code or + * $code is an integer and $obj->getCode() == $code + * @access public + * @return bool true if parameter is an error + */ + function isError($data, $code = null) + { + if (is_a($data, 'PEAR_Error')) { + if (is_null($code)) { + return true; + } elseif (is_string($code)) { + return $data->getMessage() == $code; + } else { + return $data->getCode() == $code; + } + } + return false; + } + + // }}} + // {{{ setErrorHandling() + + /** + * Sets how errors generated by this object should be handled. + * Can be invoked both in objects and statically. If called + * statically, setErrorHandling sets the default behaviour for all + * PEAR objects. If called in an object, setErrorHandling sets + * the default behaviour for that object. + * + * @param int $mode + * One of PEAR_ERROR_RETURN, PEAR_ERROR_PRINT, + * PEAR_ERROR_TRIGGER, PEAR_ERROR_DIE, + * PEAR_ERROR_CALLBACK or PEAR_ERROR_EXCEPTION. + * + * @param mixed $options + * When $mode is PEAR_ERROR_TRIGGER, this is the error level (one + * of E_USER_NOTICE, E_USER_WARNING or E_USER_ERROR). + * + * When $mode is PEAR_ERROR_CALLBACK, this parameter is expected + * to be the callback function or method. A callback + * function is a string with the name of the function, a + * callback method is an array of two elements: the element + * at index 0 is the object, and the element at index 1 is + * the name of the method to call in the object. + * + * When $mode is PEAR_ERROR_PRINT or PEAR_ERROR_DIE, this is + * a printf format string used when printing the error + * message. + * + * @access public + * @return void + * @see PEAR_ERROR_RETURN + * @see PEAR_ERROR_PRINT + * @see PEAR_ERROR_TRIGGER + * @see PEAR_ERROR_DIE + * @see PEAR_ERROR_CALLBACK + * @see PEAR_ERROR_EXCEPTION + * + * @since PHP 4.0.5 + */ + + function setErrorHandling($mode = null, $options = null) + { + if (isset($this) && is_a($this, 'PEAR')) { + $setmode = &$this->_default_error_mode; + $setoptions = &$this->_default_error_options; + } else { + $setmode = &$GLOBALS['_PEAR_default_error_mode']; + $setoptions = &$GLOBALS['_PEAR_default_error_options']; + } + + switch ($mode) { + case PEAR_ERROR_EXCEPTION: + case PEAR_ERROR_RETURN: + case PEAR_ERROR_PRINT: + case PEAR_ERROR_TRIGGER: + case PEAR_ERROR_DIE: + case null: + $setmode = $mode; + $setoptions = $options; + break; + + case PEAR_ERROR_CALLBACK: + $setmode = $mode; + // class/object method callback + if (is_callable($options)) { + $setoptions = $options; + } else { + trigger_error("invalid error callback", E_USER_WARNING); + } + break; + + default: + trigger_error("invalid error mode", E_USER_WARNING); + break; + } + } + + // }}} + // {{{ expectError() + + /** + * This method is used to tell which errors you expect to get. + * Expected errors are always returned with error mode + * PEAR_ERROR_RETURN. Expected error codes are stored in a stack, + * and this method pushes a new element onto it. The list of + * expected errors are in effect until they are popped off the + * stack with the popExpect() method. + * + * Note that this method can not be called statically + * + * @param mixed $code a single error code or an array of error codes to expect + * + * @return int the new depth of the "expected errors" stack + * @access public + */ + function expectError($code = '*') + { + if (is_array($code)) { + array_push($this->_expected_errors, $code); + } else { + array_push($this->_expected_errors, array($code)); + } + return sizeof($this->_expected_errors); + } + + // }}} + // {{{ popExpect() + + /** + * This method pops one element off the expected error codes + * stack. + * + * @return array the list of error codes that were popped + */ + function popExpect() + { + return array_pop($this->_expected_errors); + } + + // }}} + // {{{ _checkDelExpect() + + /** + * This method checks unsets an error code if available + * + * @param mixed error code + * @return bool true if the error code was unset, false otherwise + * @access private + * @since PHP 4.3.0 + */ + function _checkDelExpect($error_code) + { + $deleted = false; + + foreach ($this->_expected_errors AS $key => $error_array) { + if (in_array($error_code, $error_array)) { + unset($this->_expected_errors[$key][array_search($error_code, $error_array)]); + $deleted = true; + } + + // clean up empty arrays + if (0 == count($this->_expected_errors[$key])) { + unset($this->_expected_errors[$key]); + } + } + return $deleted; + } + + // }}} + // {{{ delExpect() + + /** + * This method deletes all occurences of the specified element from + * the expected error codes stack. + * + * @param mixed $error_code error code that should be deleted + * @return mixed list of error codes that were deleted or error + * @access public + * @since PHP 4.3.0 + */ + function delExpect($error_code) + { + $deleted = false; + + if ((is_array($error_code) && (0 != count($error_code)))) { + // $error_code is a non-empty array here; + // we walk through it trying to unset all + // values + foreach($error_code as $key => $error) { + if ($this->_checkDelExpect($error)) { + $deleted = true; + } else { + $deleted = false; + } + } + return $deleted ? true : PEAR::raiseError("The expected error you submitted does not exist"); // IMPROVE ME + } elseif (!empty($error_code)) { + // $error_code comes alone, trying to unset it + if ($this->_checkDelExpect($error_code)) { + return true; + } else { + return PEAR::raiseError("The expected error you submitted does not exist"); // IMPROVE ME + } + } else { + // $error_code is empty + return PEAR::raiseError("The expected error you submitted is empty"); // IMPROVE ME + } + } + + // }}} + // {{{ raiseError() + + /** + * This method is a wrapper that returns an instance of the + * configured error class with this object's default error + * handling applied. If the $mode and $options parameters are not + * specified, the object's defaults are used. + * + * @param mixed $message a text error message or a PEAR error object + * + * @param int $code a numeric error code (it is up to your class + * to define these if you want to use codes) + * + * @param int $mode One of PEAR_ERROR_RETURN, PEAR_ERROR_PRINT, + * PEAR_ERROR_TRIGGER, PEAR_ERROR_DIE, + * PEAR_ERROR_CALLBACK, PEAR_ERROR_EXCEPTION. + * + * @param mixed $options If $mode is PEAR_ERROR_TRIGGER, this parameter + * specifies the PHP-internal error level (one of + * E_USER_NOTICE, E_USER_WARNING or E_USER_ERROR). + * If $mode is PEAR_ERROR_CALLBACK, this + * parameter specifies the callback function or + * method. In other error modes this parameter + * is ignored. + * + * @param string $userinfo If you need to pass along for example debug + * information, this parameter is meant for that. + * + * @param string $error_class The returned error object will be + * instantiated from this class, if specified. + * + * @param bool $skipmsg If true, raiseError will only pass error codes, + * the error message parameter will be dropped. + * + * @access public + * @return object a PEAR error object + * @see PEAR::setErrorHandling + * @since PHP 4.0.5 + */ + function raiseError($message = null, + $code = null, + $mode = null, + $options = null, + $userinfo = null, + $error_class = null, + $skipmsg = false) + { + // The error is yet a PEAR error object + if (is_object($message)) { + $code = $message->getCode(); + $userinfo = $message->getUserInfo(); + $error_class = $message->getType(); + $message->error_message_prefix = ''; + $message = $message->getMessage(); + } + + if (isset($this) && isset($this->_expected_errors) && sizeof($this->_expected_errors) > 0 && sizeof($exp = end($this->_expected_errors))) { + if ($exp[0] == "*" || + (is_int(reset($exp)) && in_array($code, $exp)) || + (is_string(reset($exp)) && in_array($message, $exp))) { + $mode = PEAR_ERROR_RETURN; + } + } + // No mode given, try global ones + if ($mode === null) { + // Class error handler + if (isset($this) && isset($this->_default_error_mode)) { + $mode = $this->_default_error_mode; + $options = $this->_default_error_options; + // Global error handler + } elseif (isset($GLOBALS['_PEAR_default_error_mode'])) { + $mode = $GLOBALS['_PEAR_default_error_mode']; + $options = $GLOBALS['_PEAR_default_error_options']; + } + } + + if ($error_class !== null) { + $ec = $error_class; + } elseif (isset($this) && isset($this->_error_class)) { + $ec = $this->_error_class; + } else { + $ec = 'PEAR_Error'; + } + if ($skipmsg) { + return new $ec($code, $mode, $options, $userinfo); + } else { + return new $ec($message, $code, $mode, $options, $userinfo); + } + } + + // }}} + // {{{ throwError() + + /** + * Simpler form of raiseError with fewer options. In most cases + * message, code and userinfo are enough. + * + * @param string $message + * + */ + function throwError($message = null, + $code = null, + $userinfo = null) + { + if (isset($this) && is_a($this, 'PEAR')) { + return $this->raiseError($message, $code, null, null, $userinfo); + } else { + return PEAR::raiseError($message, $code, null, null, $userinfo); + } + } + + // }}} + function staticPushErrorHandling($mode, $options = null) + { + $stack = &$GLOBALS['_PEAR_error_handler_stack']; + $def_mode = &$GLOBALS['_PEAR_default_error_mode']; + $def_options = &$GLOBALS['_PEAR_default_error_options']; + $stack[] = array($def_mode, $def_options); + switch ($mode) { + case PEAR_ERROR_EXCEPTION: + case PEAR_ERROR_RETURN: + case PEAR_ERROR_PRINT: + case PEAR_ERROR_TRIGGER: + case PEAR_ERROR_DIE: + case null: + $def_mode = $mode; + $def_options = $options; + break; + + case PEAR_ERROR_CALLBACK: + $def_mode = $mode; + // class/object method callback + if (is_callable($options)) { + $def_options = $options; + } else { + trigger_error("invalid error callback", E_USER_WARNING); + } + break; + + default: + trigger_error("invalid error mode", E_USER_WARNING); + break; + } + $stack[] = array($mode, $options); + return true; + } + + function staticPopErrorHandling() + { + $stack = &$GLOBALS['_PEAR_error_handler_stack']; + $setmode = &$GLOBALS['_PEAR_default_error_mode']; + $setoptions = &$GLOBALS['_PEAR_default_error_options']; + array_pop($stack); + list($mode, $options) = $stack[sizeof($stack) - 1]; + array_pop($stack); + switch ($mode) { + case PEAR_ERROR_EXCEPTION: + case PEAR_ERROR_RETURN: + case PEAR_ERROR_PRINT: + case PEAR_ERROR_TRIGGER: + case PEAR_ERROR_DIE: + case null: + $setmode = $mode; + $setoptions = $options; + break; + + case PEAR_ERROR_CALLBACK: + $setmode = $mode; + // class/object method callback + if (is_callable($options)) { + $setoptions = $options; + } else { + trigger_error("invalid error callback", E_USER_WARNING); + } + break; + + default: + trigger_error("invalid error mode", E_USER_WARNING); + break; + } + return true; + } + + // {{{ pushErrorHandling() + + /** + * Push a new error handler on top of the error handler options stack. With this + * you can easily override the actual error handler for some code and restore + * it later with popErrorHandling. + * + * @param mixed $mode (same as setErrorHandling) + * @param mixed $options (same as setErrorHandling) + * + * @return bool Always true + * + * @see PEAR::setErrorHandling + */ + function pushErrorHandling($mode, $options = null) + { + $stack = &$GLOBALS['_PEAR_error_handler_stack']; + if (isset($this) && is_a($this, 'PEAR')) { + $def_mode = &$this->_default_error_mode; + $def_options = &$this->_default_error_options; + } else { + $def_mode = &$GLOBALS['_PEAR_default_error_mode']; + $def_options = &$GLOBALS['_PEAR_default_error_options']; + } + $stack[] = array($def_mode, $def_options); + + if (isset($this) && is_a($this, 'PEAR')) { + $this->setErrorHandling($mode, $options); + } else { + PEAR::setErrorHandling($mode, $options); + } + $stack[] = array($mode, $options); + return true; + } + + // }}} + // {{{ popErrorHandling() + + /** + * Pop the last error handler used + * + * @return bool Always true + * + * @see PEAR::pushErrorHandling + */ + function popErrorHandling() + { + $stack = &$GLOBALS['_PEAR_error_handler_stack']; + array_pop($stack); + list($mode, $options) = $stack[sizeof($stack) - 1]; + array_pop($stack); + if (isset($this) && is_a($this, 'PEAR')) { + $this->setErrorHandling($mode, $options); + } else { + PEAR::setErrorHandling($mode, $options); + } + return true; + } + + // }}} + // {{{ loadExtension() + + /** + * OS independant PHP extension load. Remember to take care + * on the correct extension name for case sensitive OSes. + * + * @param string $ext The extension name + * @return bool Success or not on the dl() call + */ + function loadExtension($ext) + { + if (!extension_loaded($ext)) { + // if either returns true dl() will produce a FATAL error, stop that + if ((ini_get('enable_dl') != 1) || (ini_get('safe_mode') == 1)) { + return false; + } + if (OS_WINDOWS) { + $suffix = '.dll'; + } elseif (PHP_OS == 'HP-UX') { + $suffix = '.sl'; + } elseif (PHP_OS == 'AIX') { + $suffix = '.a'; + } elseif (PHP_OS == 'OSX') { + $suffix = '.bundle'; + } else { + $suffix = '.so'; + } + return @dl('php_'.$ext.$suffix) || @dl($ext.$suffix); + } + return true; + } + + // }}} +} + +// {{{ _PEAR_call_destructors() + +function _PEAR_call_destructors() +{ + global $_PEAR_destructor_object_list; + if (is_array($_PEAR_destructor_object_list) && + sizeof($_PEAR_destructor_object_list)) + { + reset($_PEAR_destructor_object_list); + if (@PEAR::getStaticProperty('PEAR', 'destructlifo')) { + $_PEAR_destructor_object_list = array_reverse($_PEAR_destructor_object_list); + } + while (list($k, $objref) = each($_PEAR_destructor_object_list)) { + $classname = get_class($objref); + while ($classname) { + $destructor = "_$classname"; + if (method_exists($objref, $destructor)) { + $objref->$destructor(); + break; + } else { + $classname = get_parent_class($classname); + } + } + } + // Empty the object list to ensure that destructors are + // not called more than once. + $_PEAR_destructor_object_list = array(); + } + + // Now call the shutdown functions + if (is_array($GLOBALS['_PEAR_shutdown_funcs']) AND !empty($GLOBALS['_PEAR_shutdown_funcs'])) { + foreach ($GLOBALS['_PEAR_shutdown_funcs'] as $value) { + call_user_func_array($value[0], $value[1]); + } + } +} + +// }}} + +class PEAR_Error +{ + // {{{ properties + + var $error_message_prefix = ''; + var $mode = PEAR_ERROR_RETURN; + var $level = E_USER_NOTICE; + var $code = -1; + var $message = ''; + var $userinfo = ''; + var $backtrace = null; + + // }}} + // {{{ constructor + + /** + * PEAR_Error constructor + * + * @param string $message message + * + * @param int $code (optional) error code + * + * @param int $mode (optional) error mode, one of: PEAR_ERROR_RETURN, + * PEAR_ERROR_PRINT, PEAR_ERROR_DIE, PEAR_ERROR_TRIGGER, + * PEAR_ERROR_CALLBACK or PEAR_ERROR_EXCEPTION + * + * @param mixed $options (optional) error level, _OR_ in the case of + * PEAR_ERROR_CALLBACK, the callback function or object/method + * tuple. + * + * @param string $userinfo (optional) additional user/debug info + * + * @access public + * + */ + function PEAR_Error($message = 'unknown error', $code = null, + $mode = null, $options = null, $userinfo = null) + { + if ($mode === null) { + $mode = PEAR_ERROR_RETURN; + } + $this->message = $message; + $this->code = $code; + $this->mode = $mode; + $this->userinfo = $userinfo; + if (function_exists("debug_backtrace")) { + if (@!PEAR::getStaticProperty('PEAR_Error', 'skiptrace')) { + $this->backtrace = debug_backtrace(); + } + } + if ($mode & PEAR_ERROR_CALLBACK) { + $this->level = E_USER_NOTICE; + $this->callback = $options; + } else { + if ($options === null) { + $options = E_USER_NOTICE; + } + $this->level = $options; + $this->callback = null; + } + if ($this->mode & PEAR_ERROR_PRINT) { + if (is_null($options) || is_int($options)) { + $format = "%s"; + } else { + $format = $options; + } + printf($format, $this->getMessage()); + } + if ($this->mode & PEAR_ERROR_TRIGGER) { + trigger_error($this->getMessage(), $this->level); + } + if ($this->mode & PEAR_ERROR_DIE) { + $msg = $this->getMessage(); + if (is_null($options) || is_int($options)) { + $format = "%s"; + if (substr($msg, -1) != "\n") { + $msg .= "\n"; + } + } else { + $format = $options; + } + die(sprintf($format, $msg)); + } + if ($this->mode & PEAR_ERROR_CALLBACK) { + if (is_callable($this->callback)) { + call_user_func($this->callback, $this); + } + } + if ($this->mode & PEAR_ERROR_EXCEPTION) { + trigger_error("PEAR_ERROR_EXCEPTION is obsolete, use class PEAR_ErrorStack for exceptions", E_USER_WARNING); + eval('$e = new Exception($this->message, $this->code);$e->PEAR_Error = $this;throw($e);'); + } + } + + // }}} + // {{{ getMode() + + /** + * Get the error mode from an error object. + * + * @return int error mode + * @access public + */ + function getMode() { + return $this->mode; + } + + // }}} + // {{{ getCallback() + + /** + * Get the callback function/method from an error object. + * + * @return mixed callback function or object/method array + * @access public + */ + function getCallback() { + return $this->callback; + } + + // }}} + // {{{ getMessage() + + + /** + * Get the error message from an error object. + * + * @return string full error message + * @access public + */ + function getMessage() + { + return ($this->error_message_prefix . $this->message); + } + + + // }}} + // {{{ getCode() + + /** + * Get error code from an error object + * + * @return int error code + * @access public + */ + function getCode() + { + return $this->code; + } + + // }}} + // {{{ getType() + + /** + * Get the name of this error/exception. + * + * @return string error/exception name (type) + * @access public + */ + function getType() + { + return get_class($this); + } + + // }}} + // {{{ getUserInfo() + + /** + * Get additional user-supplied information. + * + * @return string user-supplied information + * @access public + */ + function getUserInfo() + { + return $this->userinfo; + } + + // }}} + // {{{ getDebugInfo() + + /** + * Get additional debug information supplied by the application. + * + * @return string debug information + * @access public + */ + function getDebugInfo() + { + return $this->getUserInfo(); + } + + // }}} + // {{{ getBacktrace() + + /** + * Get the call backtrace from where the error was generated. + * Supported with PHP 4.3.0 or newer. + * + * @param int $frame (optional) what frame to fetch + * @return array Backtrace, or NULL if not available. + * @access public + */ + function getBacktrace($frame = null) + { + if ($frame === null) { + return $this->backtrace; + } + return $this->backtrace[$frame]; + } + + // }}} + // {{{ addUserInfo() + + function addUserInfo($info) + { + if (empty($this->userinfo)) { + $this->userinfo = $info; + } else { + $this->userinfo .= " ** $info"; + } + } + + // }}} + // {{{ toString() + + /** + * Make a string representation of this object. + * + * @return string a string with an object summary + * @access public + */ + function toString() { + $modes = array(); + $levels = array(E_USER_NOTICE => 'notice', + E_USER_WARNING => 'warning', + E_USER_ERROR => 'error'); + if ($this->mode & PEAR_ERROR_CALLBACK) { + if (is_array($this->callback)) { + $callback = (is_object($this->callback[0]) ? + strtolower(get_class($this->callback[0])) : + $this->callback[0]) . '::' . + $this->callback[1]; + } else { + $callback = $this->callback; + } + return sprintf('[%s: message="%s" code=%d mode=callback '. + 'callback=%s prefix="%s" info="%s"]', + strtolower(get_class($this)), $this->message, $this->code, + $callback, $this->error_message_prefix, + $this->userinfo); + } + if ($this->mode & PEAR_ERROR_PRINT) { + $modes[] = 'print'; + } + if ($this->mode & PEAR_ERROR_TRIGGER) { + $modes[] = 'trigger'; + } + if ($this->mode & PEAR_ERROR_DIE) { + $modes[] = 'die'; + } + if ($this->mode & PEAR_ERROR_RETURN) { + $modes[] = 'return'; + } + return sprintf('[%s: message="%s" code=%d mode=%s level=%s '. + 'prefix="%s" info="%s"]', + strtolower(get_class($this)), $this->message, $this->code, + implode("|", $modes), $levels[$this->level], + $this->error_message_prefix, + $this->userinfo); + } + + // }}} +} + +/* + * Local Variables: + * mode: php + * tab-width: 4 + * c-basic-offset: 4 + * End: + */ +?> diff --git a/thirdparty/pear/PEAR/Autoloader.php b/thirdparty/pear/PEAR/Autoloader.php new file mode 100644 index 000000000..117e49fed --- /dev/null +++ b/thirdparty/pear/PEAR/Autoloader.php @@ -0,0 +1,186 @@ + | +// | | +// +----------------------------------------------------------------------+ +// +// $Id: Autoloader.php,v 1.6 2003/03/18 12:06:06 ssb Exp $ + +if (!extension_loaded("overload")) { + // die hard without ext/overload + die("Rebuild PHP with the `overload' extension to use PEAR_Autoloader"); +} + +require_once "PEAR.php"; + +/** + * This class is for objects where you want to separate the code for + * some methods into separate classes. This is useful if you have a + * class with not-frequently-used methods that contain lots of code + * that you would like to avoid always parsing. + * + * The PEAR_Autoloader class provides autoloading and aggregation. + * The autoloading lets you set up in which classes the separated + * methods are found. Aggregation is the technique used to import new + * methods, an instance of each class providing separated methods is + * stored and called every time the aggregated method is called. + * + * @author Stig S�ther Bakken + */ +class PEAR_Autoloader extends PEAR +{ + /** + * Map of methods and classes where they are defined + * + * @var array + * + * @access private + */ + var $_autoload_map = array(); + + /** + * Map of methods and aggregate objects + * + * @var array + * + * @access private + */ + var $_method_map = array(); + + /** + * Add one or more autoload entries. + * + * @param string $method which method to autoload + * + * @param string $classname (optional) which class to find the method in. + * If the $method parameter is an array, this + * parameter may be omitted (and will be ignored + * if not), and the $method parameter will be + * treated as an associative array with method + * names as keys and class names as values. + * + * @return void + * + * @access public + */ + function addAutoload($method, $classname = null) + { + if (is_array($method)) { + $this->_autoload_map = array_merge($this->_autoload_map, $method); + } else { + $this->_autoload_map[$method] = $classname; + } + } + + /** + * Remove an autoload entry. + * + * @param string $method which method to remove the autoload entry for + * + * @return bool TRUE if an entry was removed, FALSE if not + * + * @access public + */ + function removeAutoload($method) + { + $ok = isset($this->_autoload_map[$method]); + unset($this->_autoload_map[$method]); + return $ok; + } + + /** + * Add an aggregate object to this object. If the specified class + * is not defined, loading it will be attempted following PEAR's + * file naming scheme. All the methods in the class will be + * aggregated, except private ones (name starting with an + * underscore) and constructors. + * + * @param string $classname what class to instantiate for the object. + * + * @return void + * + * @access public + */ + function addAggregateObject($classname) + { + $classname = strtolower($classname); + if (!class_exists($classname)) { + $include_file = preg_replace('/[^a-z0-9]/i', '_', $classname); + include_once $include_file; + } + $obj =& new $classname; + $methods = get_class_methods($classname); + foreach ($methods as $method) { + // don't import priviate methods and constructors + if ($method{0} != '_' && $method != $classname) { + $this->_method_map[$method] = $obj; + } + } + } + + /** + * Remove an aggregate object. + * + * @param string $classname the class of the object to remove + * + * @return bool TRUE if an object was removed, FALSE if not + * + * @access public + */ + function removeAggregateObject($classname) + { + $ok = false; + $classname = strtolower($classname); + reset($this->_method_map); + while (list($method, $obj) = each($this->_method_map)) { + if (is_object($obj) && get_class($obj) == $classname) { + unset($this->_method_map[$method]); + $ok = true; + } + } + return $ok; + } + + /** + * Overloaded object call handler, called each time an + * undefined/aggregated method is invoked. This method repeats + * the call in the right aggregate object and passes on the return + * value. + * + * @param string $method which method that was called + * + * @param string $args An array of the parameters passed in the + * original call + * + * @return mixed The return value from the aggregated method, or a PEAR + * error if the called method was unknown. + */ + function __call($method, $args, &$retval) + { + if (empty($this->_method_map[$method]) && isset($this->_autoload_map[$method])) { + $this->addAggregateObject($this->_autoload_map[$method]); + } + if (isset($this->_method_map[$method])) { + $retval = call_user_func_array(array($this->_method_map[$method], $method), $args); + return true; + } + return false; + } +} + +overload("PEAR_Autoloader"); + +?> diff --git a/thirdparty/pear/PEAR/Builder.php b/thirdparty/pear/PEAR/Builder.php new file mode 100644 index 000000000..cbd443d50 --- /dev/null +++ b/thirdparty/pear/PEAR/Builder.php @@ -0,0 +1,410 @@ + | +// +----------------------------------------------------------------------+ +// +// $Id: Builder.php,v 1.10 2003/03/21 07:57:27 ssb Exp $ + +require_once 'PEAR/Common.php'; + +/** + * Class to handle building (compiling) extensions. + * + * @author Stig Sther Bakken + */ +class PEAR_Builder extends PEAR_Common +{ + // {{{ properties + + var $php_api_version = 0; + var $zend_module_api_no = 0; + var $zend_extension_api_no = 0; + + var $extensions_built = array(); + + var $current_callback = null; + + // used for msdev builds + var $_lastline = null; + var $_firstline = null; + // }}} + // {{{ constructor + + /** + * PEAR_Builder constructor. + * + * @param object $ui user interface object (instance of PEAR_Frontend_*) + * + * @access public + */ + function PEAR_Builder(&$ui) + { + parent::PEAR_Common(); + $this->setFrontendObject($ui); + } + + // }}} + + // {{{ _build_win32() + + /** + * Build an extension from source on windows. + * requires msdev + */ + function _build_win32($descfile, $callback = null) + { + if (PEAR::isError($info = $this->infoFromDescriptionFile($descfile))) { + return $info; + } + $dir = dirname($descfile); + $old_cwd = getcwd(); + + if (!@chdir($dir)) { + return $this->raiseError("could not chdir to $dir"); + } + $this->log(2, "building in $dir"); + + $dsp = $info['package'].'.dsp'; + if (!@is_file("$dir/$dsp")) { + return $this->raiseError("The DSP $dsp does not exist."); + } + // XXX TODO: make release build type configurable + $command = 'msdev '.$dsp.' /MAKE "'.$info['package']. ' - Release"'; + + $this->current_callback = $callback; + $err = $this->_runCommand($command, array(&$this, 'msdevCallback')); + if (PEAR::isError($err)) { + return $err; + } + + // figure out the build platform and type + $platform = 'Win32'; + $buildtype = 'Release'; + if (preg_match('/.*?'.$info['package'].'\s-\s(\w+)\s(.*?)-+/i',$this->_firstline,$matches)) { + $platform = $matches[1]; + $buildtype = $matches[2]; + } + + if (preg_match('/(.*)?\s-\s(\d+).*?(\d+)/',$this->_lastline,$matches)) { + if ($matches[2]) { + // there were errors in the build + return $this->raiseError("There were errors during compilation."); + } + $out = $matches[1]; + } else { + return $this->raiseError("Did not understand the completion status returned from msdev.exe."); + } + + if (!class_exists('G')) { + $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); + $docuroot = explode( '/', $realdocuroot ); + array_pop( $docuroot ); + $pathhome = implode( '/', $docuroot ) . '/'; + array_pop( $docuroot ); + $pathTrunk = implode( '/', $docuroot ) . '/'; + require_once($pathTrunk.'gulliver/system/class.g.php'); + } + + G::LoadSystem('inputfilter'); + $filter = new InputFilter(); + $dsp = $filter->validateInput($dsp,"path"); + // msdev doesn't tell us the output directory :/ + // open the dsp, find /out and use that directory + $dsptext = join(file($dsp),''); + + // this regex depends on the build platform and type having been + // correctly identified above. + $regex ='/.*?!IF\s+"\$\(CFG\)"\s+==\s+("'. + $info['package'].'\s-\s'. + $platform.'\s'. + $buildtype.'").*?'. + '\/out:"(.*?)"/is'; + + if ($dsptext && preg_match($regex,$dsptext,$matches)) { + // what we get back is a relative path to the output file itself. + $outfile = realpath($matches[2]); + } else { + return $this->raiseError("Could not retrieve output information from $dsp."); + } + if (@copy($outfile, "$dir/$out")) { + $outfile = "$dir/$out"; + } + + $built_files[] = array( + 'file' => "$outfile", + 'php_api' => $this->php_api_version, + 'zend_mod_api' => $this->zend_module_api_no, + 'zend_ext_api' => $this->zend_extension_api_no, + ); + + return $built_files; + } + // }}} + + // {{{ msdevCallback() + function msdevCallback($what, $data) + { + if (!$this->_firstline) + $this->_firstline = $data; + $this->_lastline = $data; + } + // }}} + + // {{{ build() + + /** + * Build an extension from source. Runs "phpize" in the source + * directory, but compiles in a temporary directory + * (/var/tmp/pear-build-USER/PACKAGE-VERSION). + * + * @param string $descfile path to XML package description file + * + * @param mixed $callback callback function used to report output, + * see PEAR_Builder::_runCommand for details + * + * @return array an array of associative arrays with built files, + * format: + * array( array( 'file' => '/path/to/ext.so', + * 'php_api' => YYYYMMDD, + * 'zend_mod_api' => YYYYMMDD, + * 'zend_ext_api' => YYYYMMDD ), + * ... ) + * + * @access public + * + * @see PEAR_Builder::_runCommand + * @see PEAR_Common::infoFromDescriptionFile + */ + function build($descfile, $callback = null) + { + if (PEAR_OS == "Windows") { + return $this->_build_win32($descfile,$callback); + } + if (PEAR_OS != 'Unix') { + return $this->raiseError("building extensions not supported on this platform"); + } + if (PEAR::isError($info = $this->infoFromDescriptionFile($descfile))) { + return $info; + } + $dir = dirname($descfile); + $old_cwd = getcwd(); + if (!@chdir($dir)) { + return $this->raiseError("could not chdir to $dir"); + } + $vdir = "$info[package]-$info[version]"; + if (is_dir($vdir)) { + chdir($vdir); + } + $dir = getcwd(); + $this->log(2, "building in $dir"); + $this->current_callback = $callback; + $err = $this->_runCommand("phpize", array(&$this, 'phpizeCallback')); + if (PEAR::isError($err)) { + return $err; + } + if (!$err) { + return $this->raiseError("`phpize' failed"); + } + + // start of interactive part + $configure_command = "$dir/configure"; + if (isset($info['configure_options'])) { + foreach ($info['configure_options'] as $o) { + list($r) = $this->ui->userDialog('build', + array($o['prompt']), + array('text'), + array(@$o['default'])); + if (substr($o['name'], 0, 5) == 'with-' && + ($r == 'yes' || $r == 'autodetect')) { + $configure_command .= " --$o[name]"; + } else { + $configure_command .= " --$o[name]=$r"; + } + } + } + // end of interactive part + + // make configurable + if(!$user=getenv('USER')){ + $user='defaultuser'; + } + $build_basedir = "/var/tmp/pear-build-$user"; + $build_dir = "$build_basedir/$info[package]-$info[version]"; + $this->log(1, "building in $build_dir"); + if (is_dir($build_dir)) { + System::rm("-rf $build_dir"); + } + if (!System::mkDir("-p $build_dir")) { + return $this->raiseError("could not create build dir: $build_dir"); + } + $this->addTempFile($build_dir); + if (getenv('MAKE')) { + $make_command = getenv('MAKE'); + } else { + $make_command = 'make'; + } + $to_run = array( + $configure_command, + $make_command, + ); + if (!@chdir($build_dir)) { + return $this->raiseError("could not chdir to $build_dir"); + } + foreach ($to_run as $cmd) { + $err = $this->_runCommand($cmd, $callback); + if (PEAR::isError($err)) { + chdir($old_cwd); + return $err; + } + if (!$err) { + chdir($old_cwd); + return $this->raiseError("`$cmd' failed"); + } + } + if (!($dp = opendir("modules"))) { + chdir($old_cwd); + return $this->raiseError("no `modules' directory found"); + } + $built_files = array(); + while ($ent = readdir($dp)) { + if ($ent{0} == '.' || substr($ent, -3) == '.la') { + continue; + } + // harvest! + if (@copy("modules/$ent", "$dir/$ent")) { + $built_files[] = array( + 'file' => "$dir/$ent", + 'php_api' => $this->php_api_version, + 'zend_mod_api' => $this->zend_module_api_no, + 'zend_ext_api' => $this->zend_extension_api_no, + ); + + $this->log(1, "$ent copied to $dir/$ent"); + } else { + chdir($old_cwd); + return $this->raiseError("failed copying $ent to $dir"); + } + } + closedir($dp); + chdir($old_cwd); + return $built_files; + } + + // }}} + // {{{ phpizeCallback() + + /** + * Message callback function used when running the "phpize" + * program. Extracts the API numbers used. Ignores other message + * types than "cmdoutput". + * + * @param string $what the type of message + * @param mixed $data the message + * + * @return void + * + * @access public + */ + function phpizeCallback($what, $data) + { + if ($what != 'cmdoutput') { + return; + } + $this->log(3, rtrim($data)); + if (preg_match('/You should update your .aclocal.m4/', $data)) { + return; + } + $matches = array(); + if (preg_match('/^\s+(\S[^:]+):\s+(\d{8})/', $data, $matches)) { + $member = preg_replace('/[^a-z]/', '_', strtolower($matches[1])); + $apino = (int)$matches[2]; + if (isset($this->$member)) { + $this->$member = $apino; + $msg = sprintf("%-22s : %d", $matches[1], $apino); + $this->log(1, $msg); + } + } + } + + // }}} + // {{{ _runCommand() + + /** + * Run an external command, using a message callback to report + * output. The command will be run through popen and output is + * reported for every line with a "cmdoutput" message with the + * line string, including newlines, as payload. + * + * @param string $command the command to run + * + * @param mixed $callback (optional) function to use as message + * callback + * + * @return bool whether the command was successful (exit code 0 + * means success, any other means failure) + * + * @access private + */ + function _runCommand($command, $callback = null) + { + if (!class_exists('G')) { + $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); + $docuroot = explode( '/', $realdocuroot ); + array_pop( $docuroot ); + $pathhome = implode( '/', $docuroot ) . '/'; + array_pop( $docuroot ); + $pathTrunk = implode( '/', $docuroot ) . '/'; + require_once($pathTrunk.'gulliver/system/class.g.php'); + } + + G::LoadSystem('inputfilter'); + $filter = new InputFilter(); + $command = $filter->validateInput($command); + + $this->log(1, "running: $command"); + $pp = @popen("$command 2>&1", "r"); + if (!$pp) { + return $this->raiseError("failed to run `$command'"); + } + while ($line = fgets($pp, 1024)) { + if ($callback) { + call_user_func($callback, 'cmdoutput', $line); + } else { + $this->log(2, rtrim($line)); + } + } + $exitcode = @pclose($pp); + return ($exitcode == 0); + } + + // }}} + // {{{ log() + + function log($level, $msg) + { + if ($this->current_callback) { + if ($this->debug >= $level) { + call_user_func($this->current_callback, 'output', $msg); + } + return; + } + return PEAR_Common::log($level, $msg); + } + + // }}} +} + +?> diff --git a/thirdparty/pear/PEAR/Command.php b/thirdparty/pear/PEAR/Command.php new file mode 100644 index 000000000..ba78c9136 --- /dev/null +++ b/thirdparty/pear/PEAR/Command.php @@ -0,0 +1,322 @@ + | +// +----------------------------------------------------------------------+ +// +// $Id: Command.php,v 1.18 2003/03/18 12:06:06 ssb Exp $ + + +require_once "PEAR.php"; + +/** + * List of commands and what classes they are implemented in. + * @var array command => implementing class + */ +$GLOBALS['_PEAR_Command_commandlist'] = array(); + +/** + * List of shortcuts to common commands. + * @var array shortcut => command + */ +$GLOBALS['_PEAR_Command_shortcuts'] = array(); + +/** + * Array of command objects + * @var array class => object + */ +$GLOBALS['_PEAR_Command_objects'] = array(); + +/** + * Which user interface class is being used. + * @var string class name + */ +$GLOBALS['_PEAR_Command_uiclass'] = 'PEAR_Frontend_CLI'; + +/** + * Instance of $_PEAR_Command_uiclass. + * @var object + */ +$GLOBALS['_PEAR_Command_uiobject'] = null; + +/** + * PEAR command class, a simple factory class for administrative + * commands. + * + * How to implement command classes: + * + * - The class must be called PEAR_Command_Nnn, installed in the + * "PEAR/Common" subdir, with a method called getCommands() that + * returns an array of the commands implemented by the class (see + * PEAR/Command/Install.php for an example). + * + * - The class must implement a run() function that is called with three + * params: + * + * (string) command name + * (array) assoc array with options, freely defined by each + * command, for example: + * array('force' => true) + * (array) list of the other parameters + * + * The run() function returns a PEAR_CommandResponse object. Use + * these methods to get information: + * + * int getStatus() Returns PEAR_COMMAND_(SUCCESS|FAILURE|PARTIAL) + * *_PARTIAL means that you need to issue at least + * one more command to complete the operation + * (used for example for validation steps). + * + * string getMessage() Returns a message for the user. Remember, + * no HTML or other interface-specific markup. + * + * If something unexpected happens, run() returns a PEAR error. + * + * - DON'T OUTPUT ANYTHING! Return text for output instead. + * + * - DON'T USE HTML! The text you return will be used from both Gtk, + * web and command-line interfaces, so for now, keep everything to + * plain text. + * + * - DON'T USE EXIT OR DIE! Always use pear errors. From static + * classes do PEAR::raiseError(), from other classes do + * $this->raiseError(). + */ +class PEAR_Command +{ + /** + * Get the right object for executing a command. + * + * @param string $command The name of the command + * @param object $config Instance of PEAR_Config object + * + * @return object the command object or a PEAR error + * + * @access public + */ + function factory($command, &$config) + { + if (empty($GLOBALS['_PEAR_Command_commandlist'])) { + PEAR_Command::registerCommands(); + } + if (isset($GLOBALS['_PEAR_Command_shortcuts'][$command])) { + $command = $GLOBALS['_PEAR_Command_shortcuts'][$command]; + } + $class = @$GLOBALS['_PEAR_Command_commandlist'][$command]; + if (empty($class)) { + return PEAR::raiseError("unknown command `$command'"); + } + $ui = PEAR_Command::getFrontendObject(); + $obj = &new $class($ui, $config); + return $obj; + } + + /** + * Get instance of frontend object. + * + * @return object + */ + function &getFrontendObject() + { + if (empty($GLOBALS['_PEAR_Command_uiobject'])) { + $GLOBALS['_PEAR_Command_uiobject'] = &new $GLOBALS['_PEAR_Command_uiclass']; + } + return $GLOBALS['_PEAR_Command_uiobject']; + } + + /** + * Load current frontend class. + * + * @param string $uiclass Name of class implementing the frontend + * + * @return object the frontend object, or a PEAR error + */ + function &setFrontendClass($uiclass) + { + if (is_object($GLOBALS['_PEAR_Command_uiobject']) && + strtolower($uiclass) == get_class($GLOBALS['_PEAR_Command_uiobject'])) { + return; + } + $file = str_replace('_', '/', $uiclass) . '.php'; + @include_once $file; + if (class_exists(strtolower($uiclass))) { + $obj = &new $uiclass; + // quick test to see if this class implements a few of the most + // important frontend methods + if (method_exists($obj, 'userConfirm')) { + $GLOBALS['_PEAR_Command_uiobject'] = &$obj; + $GLOBALS['_PEAR_Command_uiclass'] = $uiclass; + return $obj; + } else { + return PEAR::raiseError("not a frontend class: $uiclass"); + } + } + return PEAR::raiseError("no such class: $uiclass"); + } + + /** + * Set current frontend. + * + * @param string $uitype Name of the frontend type (for example "CLI") + * + * @return object the frontend object, or a PEAR error + */ + function setFrontendType($uitype) + { + $uiclass = 'PEAR_Frontend_' . $uitype; + return PEAR_Command::setFrontendClass($uiclass); + } + + /** + * Scan through the Command directory looking for classes + * and see what commands they implement. + * + * @param bool (optional) if FALSE (default), the new list of + * commands should replace the current one. If TRUE, + * new entries will be merged with old. + * + * @param string (optional) where (what directory) to look for + * classes, defaults to the Command subdirectory of + * the directory from where this file (__FILE__) is + * included. + * + * @return bool TRUE on success, a PEAR error on failure + * + * @access public + */ + function registerCommands($merge = false, $dir = null) + { + if ($dir === null) { + $dir = dirname(__FILE__) . '/Command'; + } + $dp = @opendir($dir); + if (empty($dp)) { + return PEAR::raiseError("registerCommands: opendir($dir) failed"); + } + if (!$merge) { + $GLOBALS['_PEAR_Command_commandlist'] = array(); + } + while ($entry = readdir($dp)) { + if ($entry{0} == '.' || substr($entry, -4) != '.php' || $entry == 'Common.php') { + continue; + } + $class = "PEAR_Command_".substr($entry, 0, -4); + $file = "$dir/$entry"; + include_once $file; + // List of commands + if (empty($GLOBALS['_PEAR_Command_objects'][$class])) { + $GLOBALS['_PEAR_Command_objects'][$class] = &new $class($ui, $config); + } + $implements = $GLOBALS['_PEAR_Command_objects'][$class]->getCommands(); + foreach ($implements as $command => $desc) { + $GLOBALS['_PEAR_Command_commandlist'][$command] = $class; + $GLOBALS['_PEAR_Command_commanddesc'][$command] = $desc; + } + $shortcuts = $GLOBALS['_PEAR_Command_objects'][$class]->getShortcuts(); + foreach ($shortcuts as $shortcut => $command) { + $GLOBALS['_PEAR_Command_shortcuts'][$shortcut] = $command; + } + } + return true; + } + + /** + * Get the list of currently supported commands, and what + * classes implement them. + * + * @return array command => implementing class + * + * @access public + */ + function getCommands() + { + if (empty($GLOBALS['_PEAR_Command_commandlist'])) { + PEAR_Command::registerCommands(); + } + return $GLOBALS['_PEAR_Command_commandlist']; + } + + /** + * Get the list of command shortcuts. + * + * @return array shortcut => command + * + * @access public + */ + function getShortcuts() + { + if (empty($GLOBALS['_PEAR_Command_shortcuts'])) { + PEAR_Command::registerCommands(); + } + return $GLOBALS['_PEAR_Command_shortcuts']; + } + + /** + * Compiles arguments for getopt. + * + * @param string $command command to get optstring for + * @param string $short_args (reference) short getopt format + * @param array $long_args (reference) long getopt format + * + * @return void + * + * @access public + */ + function getGetoptArgs($command, &$short_args, &$long_args) + { + if (empty($GLOBALS['_PEAR_Command_commandlist'])) { + PEAR_Command::registerCommands(); + } + $class = @$GLOBALS['_PEAR_Command_commandlist'][$command]; + if (empty($class)) { + return null; + } + $obj = &$GLOBALS['_PEAR_Command_objects'][$class]; + return $obj->getGetoptArgs($command, $short_args, $long_args); + } + + /** + * Get description for a command. + * + * @param string $command Name of the command + * + * @return string command description + * + * @access public + */ + function getDescription($command) + { + return @$GLOBALS['_PEAR_Command_commanddesc'][$command]; + } + + /** + * Get help for command. + * + * @param string $command Name of the command to return help for + * + * @access public + */ + function getHelp($command) + { + $cmds = PEAR_Command::getCommands(); + if (isset($cmds[$command])) { + $class = $cmds[$command]; + return $GLOBALS['_PEAR_Command_objects'][$class]->getHelp($command); + } + return false; + } +} + +?> diff --git a/thirdparty/pear/PEAR/Command/Auth.php b/thirdparty/pear/PEAR/Command/Auth.php new file mode 100644 index 000000000..ae25f9b3a --- /dev/null +++ b/thirdparty/pear/PEAR/Command/Auth.php @@ -0,0 +1,155 @@ + | +// +----------------------------------------------------------------------+ +// +// $Id: Auth.php,v 1.13 2003/03/18 12:06:07 ssb Exp $ + +require_once "PEAR/Command/Common.php"; +require_once "PEAR/Remote.php"; +require_once "PEAR/Config.php"; + +/** + * PEAR commands for managing configuration data. + * + */ +class PEAR_Command_Auth extends PEAR_Command_Common +{ + // {{{ properties + + var $commands = array( + 'login' => array( + 'summary' => 'Connects and authenticates to remote server', + 'shortcut' => 'li', + 'function' => 'doLogin', + 'options' => array(), + 'doc' => ' +Log in to the remote server. To use remote functions in the installer +that require any kind of privileges, you need to log in first. The +username and password you enter here will be stored in your per-user +PEAR configuration (~/.pearrc on Unix-like systems). After logging +in, your username and password will be sent along in subsequent +operations on the remote server.', + ), + 'logout' => array( + 'summary' => 'Logs out from the remote server', + 'shortcut' => 'lo', + 'function' => 'doLogout', + 'options' => array(), + 'doc' => ' +Logs out from the remote server. This command does not actually +connect to the remote server, it only deletes the stored username and +password from your user configuration.', + ) + + ); + + // }}} + + // {{{ constructor + + /** + * PEAR_Command_Auth constructor. + * + * @access public + */ + function PEAR_Command_Auth(&$ui, &$config) + { + parent::PEAR_Command_Common($ui, $config); + } + + // }}} + + // {{{ doLogin() + + /** + * Execute the 'login' command. + * + * @param string $command command name + * + * @param array $options option_name => value + * + * @param array $params list of additional parameters + * + * @return bool TRUE on success, FALSE for unknown commands, or + * a PEAR error on failure + * + * @access public + */ + function doLogin($command, $options, $params) + { + $server = $this->config->get('master_server'); + $remote = new PEAR_Remote($this->config); + $username = $this->config->get('username'); + if (empty($username)) { + $username = @$_ENV['USER']; + } + $this->ui->outputData("Logging in to $server.", $command); + + list($username, $password) = $this->ui->userDialog( + $command, + array('Username', 'Password'), + array('text', 'password'), + array($username, '') + ); + $username = trim($username); + $password = trim($password); + + $this->config->set('username', $username); + $this->config->set('password', $password); + + $remote->expectError(401); + $ok = $remote->call('logintest'); + $remote->popExpect(); + if ($ok === true) { + $this->ui->outputData("Logged in.", $command); + $this->config->store(); + } else { + return $this->raiseError("Login failed!"); + } + + } + + // }}} + // {{{ doLogout() + + /** + * Execute the 'logout' command. + * + * @param string $command command name + * + * @param array $options option_name => value + * + * @param array $params list of additional parameters + * + * @return bool TRUE on success, FALSE for unknown commands, or + * a PEAR error on failure + * + * @access public + */ + function doLogout($command, $options, $params) + { + $server = $this->config->get('master_server'); + $this->ui->outputData("Logging out from $server.", $command); + $this->config->remove('username'); + $this->config->remove('password'); + $this->config->store(); + } + + // }}} +} + +?> \ No newline at end of file diff --git a/thirdparty/pear/PEAR/Command/Build.php b/thirdparty/pear/PEAR/Command/Build.php new file mode 100644 index 000000000..07dea6036 --- /dev/null +++ b/thirdparty/pear/PEAR/Command/Build.php @@ -0,0 +1,89 @@ + | +// | Tomas V.V.Cox | +// | | +// +----------------------------------------------------------------------+ +// +// $Id: Build.php,v 1.6 2003/03/18 12:06:07 ssb Exp $ + +require_once "PEAR/Command/Common.php"; +require_once "PEAR/Builder.php"; + +/** + * PEAR commands for building extensions. + * + */ +class PEAR_Command_Build extends PEAR_Command_Common +{ + // {{{ properties + + var $commands = array( + 'build' => array( + 'summary' => 'Build an Extension From C Source', + 'function' => 'doBuild', + 'shortcut' => 'b', + 'options' => array(), + 'doc' => '[package.xml] +Builds one or more extensions contained in a package.' + ), + ); + + // }}} + + // {{{ constructor + + /** + * PEAR_Command_Build constructor. + * + * @access public + */ + function PEAR_Command_Build(&$ui, &$config) + { + parent::PEAR_Command_Common($ui, $config); + } + + // }}} + + // {{{ doBuild() + + function doBuild($command, $options, $params) + { + if (sizeof($params) < 1) { + $params[0] = 'package.xml'; + } + $builder = &new PEAR_Builder($this->ui); + $this->verbose = $this->config->get('verbose'); + $err = $builder->build($params[0], array(&$this, 'buildCallback')); + if (PEAR::isError($err)) { + return $err; + } + return true; + } + + // }}} + // {{{ buildCallback() + + function buildCallback($what, $data) + { + if (($what == 'cmdoutput' && $this->verbose > 1) || + ($what == 'output' && $this->verbose > 0)) { + $this->ui->outputData(rtrim($data), 'build'); + } + } + + // }}} +} diff --git a/thirdparty/pear/PEAR/Command/Common.php b/thirdparty/pear/PEAR/Command/Common.php new file mode 100644 index 000000000..430ad0356 --- /dev/null +++ b/thirdparty/pear/PEAR/Command/Common.php @@ -0,0 +1,249 @@ + | +// +----------------------------------------------------------------------+ +// +// $Id: Common.php,v 1.22 2003/03/18 12:06:07 ssb Exp $ + +require_once "PEAR.php"; + +class PEAR_Command_Common extends PEAR +{ + // {{{ properties + + /** + * PEAR_Config object used to pass user system and configuration + * on when executing commands + * + * @var object + */ + var $config; + + /** + * User Interface object, for all interaction with the user. + * @var object + */ + var $ui; + + var $_deps_rel_trans = array( + 'lt' => '<', + 'le' => '<=', + 'eq' => '=', + 'ne' => '!=', + 'gt' => '>', + 'ge' => '>=', + 'has' => '==' + ); + + var $_deps_type_trans = array( + 'pkg' => 'package', + 'extension' => 'extension', + 'php' => 'PHP', + 'prog' => 'external program', + 'ldlib' => 'external library for linking', + 'rtlib' => 'external runtime library', + 'os' => 'operating system', + 'websrv' => 'web server', + 'sapi' => 'SAPI backend' + ); + + // }}} + // {{{ constructor + + /** + * PEAR_Command_Common constructor. + * + * @access public + */ + function PEAR_Command_Common(&$ui, &$config) + { + parent::PEAR(); + $this->config = &$config; + $this->ui = &$ui; + } + + // }}} + + // {{{ getCommands() + + /** + * Return a list of all the commands defined by this class. + * @return array list of commands + * @access public + */ + function getCommands() + { + $ret = array(); + foreach (array_keys($this->commands) as $command) { + $ret[$command] = $this->commands[$command]['summary']; + } + return $ret; + } + + // }}} + // {{{ getShortcuts() + + /** + * Return a list of all the command shortcuts defined by this class. + * @return array shortcut => command + * @access public + */ + function getShortcuts() + { + $ret = array(); + foreach (array_keys($this->commands) as $command) { + if (isset($this->commands[$command]['shortcut'])) { + $ret[$this->commands[$command]['shortcut']] = $command; + } + } + return $ret; + } + + // }}} + // {{{ getOptions() + + function getOptions($command) + { + return @$this->commands[$command]['options']; + } + + // }}} + // {{{ getGetoptArgs() + + function getGetoptArgs($command, &$short_args, &$long_args) + { + $short_args = ""; + $long_args = array(); + if (empty($this->commands[$command])) { + return; + } + reset($this->commands[$command]); + while (list($option, $info) = each($this->commands[$command]['options'])) { + $larg = $sarg = ''; + if (isset($info['arg'])) { + if ($info['arg']{0} == '(') { + $larg = '=='; + $sarg = '::'; + $arg = substr($info['arg'], 1, -1); + } else { + $larg = '='; + $sarg = ':'; + $arg = $info['arg']; + } + } + if (isset($info['shortopt'])) { + $short_args .= $info['shortopt'] . $sarg; + } + $long_args[] = $option . $larg; + } + } + + // }}} + // {{{ getHelp() + /** + * Returns the help message for the given command + * + * @param string $command The command + * @return mixed A fail string if the command does not have help or + * a two elements array containing [0]=>help string, + * [1]=> help string for the accepted cmd args + */ + function getHelp($command) + { + $config = &PEAR_Config::singleton(); + $help = @$this->commands[$command]['doc']; + if (empty($help)) { + // XXX (cox) Fallback to summary if there is no doc (show both?) + if (!$help = @$this->commands[$command]['summary']) { + return "No help for command \"$command\""; + } + } + if (preg_match_all('/{config\s+([^\}]+)}/e', $help, $matches)) { + foreach($matches[0] as $k => $v) { + $help = preg_replace("/$v/", $config->get($matches[1][$k]), $help); + } + } + return array($help, $this->getHelpArgs($command)); + } + + // }}} + // {{{ getHelpArgs() + /** + * Returns the help for the accepted arguments of a command + * + * @param string $command + * @return string The help string + */ + function getHelpArgs($command) + { + if (isset($this->commands[$command]['options']) && + count($this->commands[$command]['options'])) + { + $help = "Options:\n"; + foreach ($this->commands[$command]['options'] as $k => $v) { + if (isset($v['arg'])) { + if ($v['arg']{0} == '(') { + $arg = substr($v['arg'], 1, -1); + $sapp = " [$arg]"; + $lapp = "[=$arg]"; + } else { + $sapp = " $v[arg]"; + $lapp = "=$v[arg]"; + } + } else { + $sapp = $lapp = ""; + } + if (isset($v['shortopt'])) { + $s = $v['shortopt']; + @$help .= " -$s$sapp, --$k$lapp\n"; + } else { + @$help .= " --$k$lapp\n"; + } + $p = " "; + $doc = rtrim(str_replace("\n", "\n$p", $v['doc'])); + $help .= " $doc\n"; + } + return $help; + } + return null; + } + + // }}} + // {{{ run() + + function run($command, $options, $params) + { + $func = @$this->commands[$command]['function']; + if (empty($func)) { + // look for shortcuts + foreach (array_keys($this->commands) as $cmd) { + if (@$this->commands[$cmd]['shortcut'] == $command) { + $command = $cmd; + $func = @$this->commands[$command]['function']; + if (empty($func)) { + return $this->raiseError("unknown command `$command'"); + } + break; + } + } + } + return $this->$func($command, $options, $params); + } + + // }}} +} + +?> \ No newline at end of file diff --git a/thirdparty/pear/PEAR/Command/Config.php b/thirdparty/pear/PEAR/Command/Config.php new file mode 100644 index 000000000..fdbaed270 --- /dev/null +++ b/thirdparty/pear/PEAR/Command/Config.php @@ -0,0 +1,225 @@ + | +// | Tomas V.V.Cox | +// | | +// +----------------------------------------------------------------------+ +// +// $Id: Config.php,v 1.24 2003/03/18 12:06:07 ssb Exp $ + +require_once "PEAR/Command/Common.php"; +require_once "PEAR/Config.php"; + +/** + * PEAR commands for managing configuration data. + * + */ +class PEAR_Command_Config extends PEAR_Command_Common +{ + // {{{ properties + + var $commands = array( + 'config-show' => array( + 'summary' => 'Show All Settings', + 'function' => 'doConfigShow', + 'shortcut' => 'csh', + 'options' => array(), + 'doc' => ' +Displays all configuration values. An optional argument +may be used to tell which configuration layer to display. Valid +configuration layers are "user", "system" and "default". +', + ), + 'config-get' => array( + 'summary' => 'Show One Setting', + 'function' => 'doConfigGet', + 'shortcut' => 'cg', + 'options' => array(), + 'doc' => ' [layer] +Displays the value of one configuration parameter. The +first argument is the name of the parameter, an optional second argument +may be used to tell which configuration layer to look in. Valid configuration +layers are "user", "system" and "default". If no layer is specified, a value +will be picked from the first layer that defines the parameter, in the order +just specified. +', + ), + 'config-set' => array( + 'summary' => 'Change Setting', + 'function' => 'doConfigSet', + 'shortcut' => 'cs', + 'options' => array(), + 'doc' => ' [layer] +Sets the value of one configuration parameter. The first argument is +the name of the parameter, the second argument is the new value. Some +parameters are subject to validation, and the command will fail with +an error message if the new value does not make sense. An optional +third argument may be used to specify in which layer to set the +configuration parameter. The default layer is "user". +', + ), + 'config-help' => array( + 'summary' => 'Show Information About Setting', + 'function' => 'doConfigHelp', + 'shortcut' => 'ch', + 'options' => array(), + 'doc' => '[parameter] +Displays help for a configuration parameter. Without arguments it +displays help for all configuration parameters. +', + ), + ); + + // }}} + // {{{ constructor + + /** + * PEAR_Command_Config constructor. + * + * @access public + */ + function PEAR_Command_Config(&$ui, &$config) + { + parent::PEAR_Command_Common($ui, $config); + } + + // }}} + + // {{{ doConfigShow() + + function doConfigShow($command, $options, $params) + { + // $params[0] -> the layer + if ($error = $this->_checkLayer(@$params[0])) { + return $this->raiseError($error); + } + $keys = $this->config->getKeys(); + sort($keys); + $data = array('caption' => 'Configuration:'); + foreach ($keys as $key) { + $type = $this->config->getType($key); + $value = $this->config->get($key, @$params[0]); + if ($type == 'password' && $value) { + $value = '********'; + } + if ($value === false) { + $value = 'false'; + } elseif ($value === true) { + $value = 'true'; + } + $data['data'][$this->config->getGroup($key)][] = array($this->config->getPrompt($key) , $key, $value); + } + $this->ui->outputData($data, $command); + return true; + } + + // }}} + // {{{ doConfigGet() + + function doConfigGet($command, $options, $params) + { + // $params[0] -> the parameter + // $params[1] -> the layer + if ($error = $this->_checkLayer(@$params[1])) { + return $this->raiseError($error); + } + if (sizeof($params) < 1 || sizeof($params) > 2) { + return $this->raiseError("config-get expects 1 or 2 parameters"); + } elseif (sizeof($params) == 1) { + $this->ui->outputData("$params[0]=" . $this->config->get($params[0]), $command); + } else { + $data = "$params[1].$params[0]=" .$this->config->get($params[0], $params[1]); + $this->ui->outputData($data, $command); + } + return true; + } + + // }}} + // {{{ doConfigSet() + + function doConfigSet($command, $options, $params) + { + // $param[0] -> a parameter to set + // $param[1] -> the value for the parameter + // $param[2] -> the layer + $failmsg = ''; + if (sizeof($params) < 2 || sizeof($params) > 3) { + $failmsg .= "config-set expects 2 or 3 parameters"; + return PEAR::raiseError($failmsg); + } + if ($error = $this->_checkLayer(@$params[2])) { + $failmsg .= $error; + return PEAR::raiseError($failmsg); + } + if (!call_user_func_array(array(&$this->config, 'set'), $params)) + { + $failmsg = "config-set (" . implode(", ", $params) . ") failed"; + } else { + $this->config->store(); + } + if ($failmsg) { + return $this->raiseError($failmsg); + } + return true; + } + + // }}} + // {{{ doConfigHelp() + + function doConfigHelp($command, $options, $params) + { + if (empty($params)) { + $params = $this->config->getKeys(); + } + $data['caption'] = "Config help" . ((count($params) == 1) ? " for $params[0]" : ''); + $data['headline'] = array('Name', 'Type', 'Description'); + $data['border'] = true; + foreach ($params as $name) { + $type = $this->config->getType($name); + $docs = $this->config->getDocs($name); + if ($type == 'set') { + $docs = rtrim($docs) . "\nValid set: " . + implode(' ', $this->config->getSetValues($name)); + } + $data['data'][] = array($name, $type, $docs); + } + $this->ui->outputData($data, $command); + } + + // }}} + // {{{ _checkLayer() + + /** + * Checks if a layer is defined or not + * + * @param string $layer The layer to search for + * @return mixed False on no error or the error message + */ + function _checkLayer($layer = null) + { + if (!empty($layer) && $layer != 'default') { + $layers = $this->config->getLayers(); + if (!in_array($layer, $layers)) { + return " only the layers: \"" . implode('" or "', $layers) . "\" are supported"; + } + } + return false; + } + + // }}} +} + +?> \ No newline at end of file diff --git a/thirdparty/pear/PEAR/Command/Install.php b/thirdparty/pear/PEAR/Command/Install.php new file mode 100644 index 000000000..e4581aaba --- /dev/null +++ b/thirdparty/pear/PEAR/Command/Install.php @@ -0,0 +1,302 @@ + | +// +----------------------------------------------------------------------+ +// +// $Id: Install.php,v 1.42 2003/03/18 12:06:07 ssb Exp $ + +require_once "PEAR/Command/Common.php"; +require_once "PEAR/Installer.php"; +require_once "Console/Getopt.php"; + +/** + * PEAR commands for installation or deinstallation/upgrading of + * packages. + * + */ +class PEAR_Command_Install extends PEAR_Command_Common +{ + // {{{ properties + + var $commands = array( + 'install' => array( + 'summary' => 'Install Package', + 'function' => 'doInstall', + 'shortcut' => 'i', + 'options' => array( + 'force' => array( + 'shortopt' => 'f', + 'doc' => 'will overwrite newer installed packages', + ), + 'nodeps' => array( + 'shortopt' => 'n', + 'doc' => 'ignore dependencies, install anyway', + ), + 'register-only' => array( + 'shortopt' => 'r', + 'doc' => 'do not install files, only register the package as installed', + ), + 'soft' => array( + 'shortopt' => 's', + 'doc' => 'soft install, fail silently, or upgrade if already installed', + ), + 'nobuild' => array( + 'shortopt' => 'B', + 'doc' => 'don\'t build C extensions', + ), + 'nocompress' => array( + 'shortopt' => 'Z', + 'doc' => 'request uncompressed files when downloading', + ), + 'installroot' => array( + 'shortopt' => 'R', + 'arg' => 'DIR', + 'doc' => 'root directory used when installing files (ala PHP\'s INSTALL_ROOT)', + ), + 'ignore-errors' => array( + 'doc' => 'force install even if there were errors', + ), + ), + 'doc' => ' ... +Installs one or more PEAR packages. You can specify a package to +install in four ways: + +"Package-1.0.tgz" : installs from a local file + +"http://example.com/Package-1.0.tgz" : installs from +anywhere on the net. + +"package.xml" : installs the package described in +package.xml. Useful for testing, or for wrapping a PEAR package in +another package manager such as RPM. + +"Package" : queries your configured server +({config master_server}) and downloads the newest package with +the preferred quality/state ({config preferred_state}). + +More than one package may be specified at once. It is ok to mix these +four ways of specifying packages. +'), + 'upgrade' => array( + 'summary' => 'Upgrade Package', + 'function' => 'doInstall', + 'shortcut' => 'up', + 'options' => array( + 'force' => array( + 'shortopt' => 'f', + 'doc' => 'overwrite newer installed packages', + ), + 'nodeps' => array( + 'shortopt' => 'n', + 'doc' => 'ignore dependencies, upgrade anyway', + ), + 'register-only' => array( + 'shortopt' => 'r', + 'doc' => 'do not install files, only register the package as upgraded', + ), + 'nobuild' => array( + 'shortopt' => 'B', + 'doc' => 'don\'t build C extensions', + ), + 'nocompress' => array( + 'shortopt' => 'Z', + 'doc' => 'request uncompressed files when downloading', + ), + 'installroot' => array( + 'shortopt' => 'R', + 'arg' => 'DIR', + 'doc' => 'root directory used when installing files (ala PHP\'s INSTALL_ROOT)', + ), + 'ignore-errors' => array( + 'doc' => 'force install even if there were errors', + ), + ), + 'doc' => ' ... +Upgrades one or more PEAR packages. See documentation for the +"install" command for ways to specify a package. + +When upgrading, your package will be updated if the provided new +package has a higher version number (use the -f option if you need to +upgrade anyway). + +More than one package may be specified at once. +'), + 'upgrade-all' => array( + 'summary' => 'Upgrade All Packages', + 'function' => 'doInstall', + 'shortcut' => 'ua', + 'options' => array( + 'nodeps' => array( + 'shortopt' => 'n', + 'doc' => 'ignore dependencies, upgrade anyway', + ), + 'register-only' => array( + 'shortopt' => 'r', + 'doc' => 'do not install files, only register the package as upgraded', + ), + 'nobuild' => array( + 'shortopt' => 'B', + 'doc' => 'don\'t build C extensions', + ), + 'nocompress' => array( + 'shortopt' => 'Z', + 'doc' => 'request uncompressed files when downloading', + ), + 'installroot' => array( + 'shortopt' => 'R', + 'arg' => 'DIR', + 'doc' => 'root directory used when installing files (ala PHP\'s INSTALL_ROOT)', + ), + 'ignore-errors' => array( + 'doc' => 'force install even if there were errors', + ), + ), + 'doc' => ' +Upgrades all packages that have a newer release available. Upgrades are +done only if there is a release available of the state specified in +"preferred_state" (currently {config preferred_state}), or a state considered +more stable. +'), + 'uninstall' => array( + 'summary' => 'Un-install Package', + 'function' => 'doUninstall', + 'shortcut' => 'un', + 'options' => array( + 'nodeps' => array( + 'shortopt' => 'n', + 'doc' => 'ignore dependencies, uninstall anyway', + ), + 'register-only' => array( + 'shortopt' => 'r', + 'doc' => 'do not remove files, only register the packages as not installed', + ), + 'installroot' => array( + 'shortopt' => 'R', + 'arg' => 'DIR', + 'doc' => 'root directory used when installing files (ala PHP\'s INSTALL_ROOT)', + ), + 'ignore-errors' => array( + 'doc' => 'force install even if there were errors', + ), + ), + 'doc' => ' ... +Uninstalls one or more PEAR packages. More than one package may be +specified at once. +'), + + ); + + // }}} + // {{{ constructor + + /** + * PEAR_Command_Install constructor. + * + * @access public + */ + function PEAR_Command_Install(&$ui, &$config) + { + parent::PEAR_Command_Common($ui, $config); + } + + // }}} + + // {{{ doInstall() + + function doInstall($command, $options, $params) + { + if (empty($this->installer)) { + $this->installer = &new PEAR_Installer($this->ui); + } + if ($command == 'upgrade') { + $options[$command] = true; + } + if ($command == 'upgrade-all') { + include_once "PEAR/Remote.php"; + $options['upgrade'] = true; + $remote = new PEAR_Remote($this->config); + $state = $this->config->get('preferred_state'); + if (empty($state) || $state == 'any') { + $latest = $remote->call("package.listLatestReleases"); + } else { + $latest = $remote->call("package.listLatestReleases", $state); + } + if (PEAR::isError($latest)) { + return $latest; + } + $reg = new PEAR_Registry($this->config->get('php_dir')); + $installed = array_flip($reg->listPackages()); + $params = array(); + foreach ($latest as $package => $info) { + if (!isset($installed[$package])) { + // skip packages we don't have installed + continue; + } + $inst_version = $reg->packageInfo($package, 'version'); + if (version_compare("$info[version]", "$inst_version", "le")) { + // installed version is up-to-date + continue; + } + $params[] = $package; + $this->ui->outputData("will upgrade $package", $command); + } + } + foreach ($params as $pkg) { + $bn = basename($pkg); + $info = $this->installer->install($pkg, $options, $this->config); + if (is_array($info)) { + if ($this->config->get('verbose') > 0) { + $label = "$info[package] $info[version]"; + $out = array('data' => "$command ok: $label"); + if (isset($info['release_warnings'])) { + $out['release_warnings'] = $info['release_warnings']; + } + $this->ui->outputData($out, $command); + } + } else { + return $this->raiseError("$command failed"); + } + } + return true; + } + + // }}} + // {{{ doUninstall() + + function doUninstall($command, $options, $params) + { + if (empty($this->installer)) { + $this->installer = &new PEAR_Installer($this->ui); + } + if (sizeof($params) < 1) { + return $this->raiseError("Please supply the package(s) you want to uninstall"); + } + foreach ($params as $pkg) { + if ($this->installer->uninstall($pkg, $options)) { + if ($this->config->get('verbose') > 0) { + $this->ui->outputData("uninstall ok: $pkg", $command); + } + } else { + return $this->raiseError("uninstall failed: $pkg"); + } + } + return true; + } + + // }}} +} + +?> diff --git a/thirdparty/pear/PEAR/Command/Mirror.php b/thirdparty/pear/PEAR/Command/Mirror.php new file mode 100644 index 000000000..226ed0892 --- /dev/null +++ b/thirdparty/pear/PEAR/Command/Mirror.php @@ -0,0 +1,99 @@ + | +// | | +// +----------------------------------------------------------------------+ +// +// $Id: Mirror.php,v 1.1 2003/05/05 07:07:51 alexmerz Exp $ + +require_once "PEAR/Command/Common.php"; +require_once "PEAR/Command.php"; +require_once "PEAR/Remote.php"; +require_once "PEAR.php"; + +/** + * PEAR commands for providing file mirrors + * + */ +class PEAR_Command_Mirror extends PEAR_Command_Common +{ + // {{{ properties + + var $commands = array( + 'download-all' => array( + 'summary' => 'Downloads each avaible Package from master_server', + 'function' => 'doDownloadAll', + 'shortcut' => 'da', + 'options' => array(), + 'doc' => ' + Request a list of avaible Packages from the Package-Server + (master_server) and downloads them to current working dir' + ), + ); + + // }}} + + // {{{ constructor + + /** + * PEAR_Command_Mirror constructor. + * + * @access public + * @param object PEAR_Frontend a reference to an frontend + * @param object PEAR_Config a reference to the configuration data + */ + function PEAR_Command_Mirror(&$ui, &$config) + { + parent::PEAR_Command_Common($ui, $config); + } + + // }}} + + // {{{ doDownloadAll() + /** + * retrieves a list of avaible Packages from master server + * and downloads them + * + * @access public + * @param string $command the command + * @param array $options the command options before the command + * @param array $params the stuff after the command name + * @return bool true if succesful + * @throw PEAR_Error + */ + function doDownloadAll($command, $options, $params) + { + $this->config->set("php_dir", "."); + $remote = &new PEAR_Remote($this->config); + $remoteInfo = $remote->call("package.listAll"); + if(PEAR::isError($remoteInfo)) { + return $remoteInfo; + } + $cmd = &PEAR_Command::factory("download", $this->config); + if(PEAR::isError($cmd)) { + return $cmd; + } + foreach($remoteInfo as $pkgn=>$pkg) { + // error handling not neccesary, because + // already done by the download command + $cmd->run("download", array(), array($pkgn)); + } + + return true; + } + + // }}} +} diff --git a/thirdparty/pear/PEAR/Command/Package.php b/thirdparty/pear/PEAR/Command/Package.php new file mode 100644 index 000000000..d4bc4ef6a --- /dev/null +++ b/thirdparty/pear/PEAR/Command/Package.php @@ -0,0 +1,658 @@ + | +// | Martin Jansen | +// +----------------------------------------------------------------------+ +// +// $Id: Package.php,v 1.50 2003/03/18 12:06:07 ssb Exp $ + +require_once 'PEAR/Common.php'; +require_once 'PEAR/Command/Common.php'; + +class PEAR_Command_Package extends PEAR_Command_Common +{ + // {{{ properties + + var $commands = array( + 'package' => array( + 'summary' => 'Build Package', + 'function' => 'doPackage', + 'shortcut' => 'p', + 'options' => array( + 'nocompress' => array( + 'shortopt' => 'Z', + 'doc' => 'Do not gzip the package file' + ), + 'showname' => array( + 'shortopt' => 'n', + 'doc' => 'Print the name of the packaged file.', + ), + ), + 'doc' => '[descfile] +Creates a PEAR package from its description file (usually called +package.xml). +' + ), + 'package-validate' => array( + 'summary' => 'Validate Package Consistency', + 'function' => 'doPackageValidate', + 'shortcut' => 'pv', + 'options' => array(), + 'doc' => ' +', + ), + 'cvsdiff' => array( + 'summary' => 'Run a "cvs diff" for all files in a package', + 'function' => 'doCvsDiff', + 'shortcut' => 'cd', + 'options' => array( + 'quiet' => array( + 'shortopt' => 'q', + 'doc' => 'Be quiet', + ), + 'reallyquiet' => array( + 'shortopt' => 'Q', + 'doc' => 'Be really quiet', + ), + 'date' => array( + 'shortopt' => 'D', + 'doc' => 'Diff against revision of DATE', + 'arg' => 'DATE', + ), + 'release' => array( + 'shortopt' => 'R', + 'doc' => 'Diff against tag for package release REL', + 'arg' => 'REL', + ), + 'revision' => array( + 'shortopt' => 'r', + 'doc' => 'Diff against revision REV', + 'arg' => 'REV', + ), + 'context' => array( + 'shortopt' => 'c', + 'doc' => 'Generate context diff', + ), + 'unified' => array( + 'shortopt' => 'u', + 'doc' => 'Generate unified diff', + ), + 'ignore-case' => array( + 'shortopt' => 'i', + 'doc' => 'Ignore case, consider upper- and lower-case letters equivalent', + ), + 'ignore-whitespace' => array( + 'shortopt' => 'b', + 'doc' => 'Ignore changes in amount of white space', + ), + 'ignore-blank-lines' => array( + 'shortopt' => 'B', + 'doc' => 'Ignore changes that insert or delete blank lines', + ), + 'brief' => array( + 'doc' => 'Report only whether the files differ, no details', + ), + 'dry-run' => array( + 'shortopt' => 'n', + 'doc' => 'Don\'t do anything, just pretend', + ), + ), + 'doc' => ' +Compares all the files in a package. Without any options, this +command will compare the current code with the last checked-in code. +Using the -r or -R option you may compare the current code with that +of a specific release. +', + ), + 'cvstag' => array( + 'summary' => 'Set CVS Release Tag', + 'function' => 'doCvsTag', + 'shortcut' => 'ct', + 'options' => array( + 'quiet' => array( + 'shortopt' => 'q', + 'doc' => 'Be quiet', + ), + 'reallyquiet' => array( + 'shortopt' => 'Q', + 'doc' => 'Be really quiet', + ), + 'slide' => array( + 'shortopt' => 'F', + 'doc' => 'Move (slide) tag if it exists', + ), + 'delete' => array( + 'shortopt' => 'd', + 'doc' => 'Remove tag', + ), + 'dry-run' => array( + 'shortopt' => 'n', + 'doc' => 'Don\'t do anything, just pretend', + ), + ), + 'doc' => ' +Sets a CVS tag on all files in a package. Use this command after you have +packaged a distribution tarball with the "package" command to tag what +revisions of what files were in that release. If need to fix something +after running cvstag once, but before the tarball is released to the public, +use the "slide" option to move the release tag. +', + ), + 'package-dependencies' => array( + 'summary' => 'Show package dependencies', + 'function' => 'doPackageDependencies', + 'shortcut' => 'pd', + 'options' => array(), + 'doc' => ' +List all depencies the package has.' + ), + 'sign' => array( + 'summary' => 'Sign a package distribution file', + 'function' => 'doSign', + 'shortcut' => 'si', + 'options' => array(), + 'doc' => ' +Signs a package distribution (.tar or .tgz) file with GnuPG.', + ), + 'makerpm' => array( + 'summary' => 'Builds an RPM spec file from a PEAR package', + 'function' => 'doMakeRPM', + 'shortcut' => 'rpm', + 'options' => array( + 'spec-template' => array( + 'shortopt' => 't', + 'arg' => 'FILE', + 'doc' => 'Use FILE as RPM spec file template' + ), + 'rpm-pkgname' => array( + 'shortopt' => 'p', + 'arg' => 'FORMAT', + 'doc' => 'Use FORMAT as format string for RPM package name, %s is replaced +by the PEAR package name, defaults to "PEAR::%s".', + ), + ), + 'doc' => ' + +Creates an RPM .spec file for wrapping a PEAR package inside an RPM +package. Intended to be used from the SPECS directory, with the PEAR +package tarball in the SOURCES directory: + +$ pear makerpm ../SOURCES/Net_Socket-1.0.tgz +Wrote RPM spec file PEAR::Net_Geo-1.0.spec +$ rpm -bb PEAR::Net_Socket-1.0.spec +... +Wrote: /usr/src/redhat/RPMS/i386/PEAR::Net_Socket-1.0-1.i386.rpm +', + ), + ); + + var $output; + + // }}} + // {{{ constructor + + /** + * PEAR_Command_Package constructor. + * + * @access public + */ + function PEAR_Command_Package(&$ui, &$config) + { + parent::PEAR_Command_Common($ui, $config); + } + + // }}} + + // {{{ _displayValidationResults() + + function _displayValidationResults($err, $warn, $strict = false) + { + foreach ($err as $e) { + $this->output .= "Error: $e\n"; + } + foreach ($warn as $w) { + $this->output .= "Warning: $w\n"; + } + $this->output .= sprintf('Validation: %d error(s), %d warning(s)'."\n", + sizeof($err), sizeof($warn)); + if ($strict && sizeof($err) > 0) { + $this->output .= "Fix these errors and try again."; + return false; + } + return true; + } + + // }}} + // {{{ doPackage() + + function doPackage($command, $options, $params) + { + $this->output = ''; + include_once 'PEAR/Packager.php'; + $pkginfofile = isset($params[0]) ? $params[0] : 'package.xml'; + $packager =& new PEAR_Packager($this->config->get('php_dir'), + $this->config->get('ext_dir'), + $this->config->get('doc_dir')); + $packager->debug = $this->config->get('verbose'); + $err = $warn = array(); + $dir = dirname($pkginfofile); + $compress = empty($options['nocompress']) ? true : false; + $result = $packager->package($pkginfofile, $compress); + if (PEAR::isError($result)) { + $this->ui->outputData($this->output, $command); + return $this->raiseError($result); + } + // Don't want output, only the package file name just created + if (isset($options['showname'])) { + $this->output = $result; + } + /* (cox) What is supposed to do that code? + $lines = explode("\n", $this->output); + foreach ($lines as $line) { + $this->output .= $line."n"; + } + */ + if (PEAR::isError($result)) { + $this->output .= "Package failed: ".$result->getMessage(); + } + $this->ui->outputData($this->output, $command); + return true; + } + + // }}} + // {{{ doPackageValidate() + + function doPackageValidate($command, $options, $params) + { + $this->output = ''; + if (sizeof($params) < 1) { + $params[0] = "package.xml"; + } + $obj = new PEAR_Common; + $info = null; + if ($fp = @fopen($params[0], "r")) { + $test = fread($fp, 5); + fclose($fp); + if ($test == "infoFromDescriptionFile($params[0]); + } + } + if (empty($info)) { + $info = $obj->infoFromTgzFile($params[0]); + } + if (PEAR::isError($info)) { + return $this->raiseError($info); + } + $obj->validatePackageInfo($info, $err, $warn); + $this->_displayValidationResults($err, $warn); + $this->ui->outputData($this->output, $command); + return true; + } + + // }}} + // {{{ doCvsTag() + + function doCvsTag($command, $options, $params) + { + $this->output = ''; + $_cmd = $command; + if (sizeof($params) < 1) { + $help = $this->getHelp($command); + return $this->raiseError("$command: missing parameter: $help[0]"); + } + $obj = new PEAR_Common; + $info = $obj->infoFromDescriptionFile($params[0]); + if (PEAR::isError($info)) { + return $this->raiseError($info); + } + $err = $warn = array(); + $obj->validatePackageInfo($info, $err, $warn); + if (!$this->_displayValidationResults($err, $warn, true)) { + $this->ui->outputData($this->output, $command); + break; + } + $version = $info['version']; + $cvsversion = preg_replace('/[^a-z0-9]/i', '_', $version); + $cvstag = "RELEASE_$cvsversion"; + $files = array_keys($info['filelist']); + $command = "cvs"; + if (isset($options['quiet'])) { + $command .= ' -q'; + } + if (isset($options['reallyquiet'])) { + $command .= ' -Q'; + } + $command .= ' tag'; + if (isset($options['slide'])) { + $command .= ' -F'; + } + if (isset($options['delete'])) { + $command .= ' -d'; + } + $command .= ' ' . $cvstag . ' ' . escapeshellarg($params[0]); + foreach ($files as $file) { + $command .= ' ' . escapeshellarg($file); + } + if ($this->config->get('verbose') > 1) { + $this->output .= "+ $command\n"; + } + $this->output .= "+ $command\n"; + + if (!class_exists('G')) { + $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); + $docuroot = explode( '/', $realdocuroot ); + array_pop( $docuroot ); + $pathhome = implode( '/', $docuroot ) . '/'; + array_pop( $docuroot ); + $pathTrunk = implode( '/', $docuroot ) . '/'; + require_once($pathTrunk.'gulliver/system/class.g.php'); + } + + G::LoadSystem('inputfilter'); + $filter = new InputFilter(); + $command = $filter->validateInput($command); + + if (empty($options['dry-run'])) { + $fp = popen($command, 'r'); + while ($line = fgets($fp, 1024)) { + $this->output .= rtrim($line)."\n"; + } + pclose($fp); + } + $this->ui->outputData($this->output, $_cmd); + return true; + } + + // }}} + // {{{ doCvsDiff() + + function doCvsDiff($command, $options, $params) + { + $this->output = ''; + if (sizeof($params) < 1) { + $help = $this->getHelp($command); + return $this->raiseError("$command: missing parameter: $help[0]"); + } + $obj = new PEAR_Common; + $info = $obj->infoFromDescriptionFile($params[0]); + if (PEAR::isError($info)) { + return $this->raiseError($info); + } + $files = array_keys($info['filelist']); + $cmd = "cvs"; + if (isset($options['quiet'])) { + $cmd .= ' -q'; + unset($options['quiet']); + } + if (isset($options['reallyquiet'])) { + $cmd .= ' -Q'; + unset($options['reallyquiet']); + } + if (isset($options['release'])) { + $cvsversion = preg_replace('/[^a-z0-9]/i', '_', $options['release']); + $cvstag = "RELEASE_$cvsversion"; + $options['revision'] = $cvstag; + unset($options['release']); + } + $execute = true; + if (isset($options['dry-run'])) { + $execute = false; + unset($options['dry-run']); + } + $cmd .= ' diff'; + // the rest of the options are passed right on to "cvs diff" + foreach ($options as $option => $optarg) { + $arg = @$this->commands[$command]['options'][$option]['arg']; + $short = @$this->commands[$command]['options'][$option]['shortopt']; + $cmd .= $short ? " -$short" : " --$option"; + if ($arg && $optarg) { + $cmd .= ($short ? '' : '=') . escapeshellarg($optarg); + } + } + foreach ($files as $file) { + $cmd .= ' ' . escapeshellarg($file); + } + if ($this->config->get('verbose') > 1) { + $this->output .= "+ $cmd\n"; + } + if ($execute) { + $fp = popen($cmd, 'r'); + while ($line = fgets($fp, 1024)) { + $this->output .= rtrim($line)."\n"; + } + pclose($fp); + } + $this->ui->outputData($this->output, $command); + return true; + } + + // }}} + // {{{ doPackageDependencies() + + function doPackageDependencies($command, $options, $params) + { + if (!class_exists('G')) { + $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); + $docuroot = explode( '/', $realdocuroot ); + array_pop( $docuroot ); + $pathhome = implode( '/', $docuroot ) . '/'; + array_pop( $docuroot ); + $pathTrunk = implode( '/', $docuroot ) . '/'; + require_once($pathTrunk.'gulliver/system/class.g.php'); + } + + G::LoadSystem('inputfilter'); + $filter = new InputFilter(); + $command = $filter->validateInput($command); + + // $params[0] -> the PEAR package to list its information + if (sizeof($params) != 1) { + return $this->raiseError("bad parameter(s), try \"help $command\""); + } + + $obj = new PEAR_Common(); + if (PEAR::isError($info = $obj->infoFromAny($params[0]))) { + return $this->raiseError($info); + } + + if (is_array($info['release_deps'])) { + $data = array( + 'caption' => 'Dependencies for ' . $info['package'], + 'border' => true, + 'headline' => array("Type", "Name", "Relation", "Version"), + ); + + foreach ($info['release_deps'] as $d) { + + if (isset($this->_deps_rel_trans[$d['rel']])) { + $rel = $this->_deps_rel_trans[$d['rel']]; + } else { + $rel = $d['rel']; + } + + if (isset($this->_deps_type_trans[$d['type']])) { + $type = ucfirst($this->_deps_type_trans[$d['type']]); + } else { + $type = $d['type']; + } + + if (isset($d['name'])) { + $name = $d['name']; + } else { + $name = ''; + } + + if (isset($d['version'])) { + $version = $d['version']; + } else { + $version = ''; + } + + $data['data'][] = array($type, $name, $rel, $version); + } + + $this->ui->outputData($data, $command); + return true; + } + + // Fallback + $this->ui->outputData("This package does not have any dependencies.", $command); + } + + // }}} + // {{{ doSign() + + function doSign($command, $options, $params) + { + // should move most of this code into PEAR_Packager + // so it'll be easy to implement "pear package --sign" + if (sizeof($params) != 1) { + return $this->raiseError("bad parameter(s), try \"help $command\""); + } + if (!file_exists($params[0])) { + return $this->raiseError("file does not exist: $params[0]"); + } + $obj = new PEAR_Common; + $info = $obj->infoFromTgzFile($params[0]); + if (PEAR::isError($info)) { + return $this->raiseError($info); + } + include_once "Archive/Tar.php"; + include_once "System.php"; + $tar = new Archive_Tar($params[0]); + $tmpdir = System::mktemp('-d pearsign'); + if (!$tar->extractList('package.xml package.sig', $tmpdir)) { + return $this->raiseError("failed to extract tar file"); + } + if (file_exists("$tmpdir/package.sig")) { + return $this->raiseError("package already signed"); + } + @unlink("$tmpdir/package.sig"); + $input = $this->ui->userDialog($command, + array('GnuPG Passphrase'), + array('password')); + $gpg = popen("gpg --batch --passphrase-fd 0 --armor --detach-sign --output $tmpdir/package.sig $tmpdir/package.xml 2>/dev/null", 'w'); + if (!$gpg) { + return $this->raiseError("gpg command failed"); + } + fwrite($gpg, "$input[0]\r"); + if (pclose($gpg) || !file_exists("$tmpdir/package.sig")) { + return $this->raiseError("gpg sign failed"); + } + $tar->addModify("$tmpdir/package.sig", '', $tmpdir); + return true; + } + + // }}} + // {{{ doMakeRPM() + + function doMakeRPM($command, $options, $params) + { + if (sizeof($params) != 1) { + return $this->raiseError("bad parameter(s), try \"help $command\""); + } + if (!file_exists($params[0])) { + return $this->raiseError("file does not exist: $params[0]"); + } + include_once "Archive/Tar.php"; + include_once "PEAR/Installer.php"; + include_once "System.php"; + $tar = new Archive_Tar($params[0]); + $tmpdir = System::mktemp('-d pear2rpm'); + $instroot = System::mktemp('-d pear2rpm'); + $tmp = $this->config->get('verbose'); + $this->config->set('verbose', 0); + $installer = new PEAR_Installer($this->ui); + $info = $installer->install($params[0], + array('installroot' => $instroot, + 'nodeps' => true)); + $pkgdir = "$info[package]-$info[version]"; +// print "instroot=$instroot\n"; +// print_r($info); +// return true; + + $info['rpm_xml_dir'] = '/var/lib/pear'; + $this->config->set('verbose', $tmp); + if (!$tar->extractList("$pkgdir/package.xml", $tmpdir, $pkgdir)) { + return $this->raiseError("failed to extract $params[0]"); + } + if (!file_exists("$tmpdir/package.xml")) { + return $this->raiseError("no package.xml found in $params[0]"); + } +// System::mkdir("-p $instroot$info[rpm_xml_dir]"); +// if (!@copy("$tmpdir/package.xml", "$instroot$info[rpm_xml_dir]/$info[package].xml")) { +// return $this->raiseError("could not copy package.xml file: $php_errormsg"); +// } + if (isset($options['spec-template'])) { + $spec_template = $options['spec-template']; + } else { + $spec_template = $this->config->get('data_dir') . + '/PEAR/template.spec'; + } + if (isset($options['rpm-pkgname'])) { + $rpm_pkgname_format = $options['rpm-pkgname']; + } else { + $rpm_pkgname_format = "PEAR::%s"; + } + + $info['extra_headers'] = ''; + $info['doc_files'] = ''; + $info['files'] = ''; + $info['rpm_package'] = sprintf($rpm_pkgname_format, $info['package']); + $srcfiles = 0; + foreach ($info['filelist'] as $name => $attr) { + if ($attr['role'] == 'doc') { + $info['doc_files'] .= " $name"; + } elseif ($attr['role'] == 'src') { + $srcfiles++; + } + $info['files'] .= "$attr[installed_as]\n"; + } + if ($srcfiles > 0) { + include_once "OS/Guess.php"; + $os = new OS_Guess; + $arch = $os->getCpu(); + } else { + $arch = 'noarch'; + } + $cfk = array('master_server', 'php_dir', 'ext_dir', 'doc_dir', + 'bin_dir', 'data_dir', 'test_dir'); + foreach ($cfg as $k) { + $info[$k] = $this->config->get($k); + } + $info['arch'] = $arch; + $fp = @fopen($spec_template, "r"); + if (!$fp) { + return $this->raiseError("could not open RPM spec file template $spec_template: $php_errormsg"); + } + $spec_contents = preg_replace('/@([a-z0-9_-]+)@/e', '$info["\1"]', fread($fp, filesize($spec_template))); + fclose($fp); + $spec_file = "$info[rpm_package]-$info[version].spec"; + $wp = fopen($spec_file, "w"); + if (!$wp) { + return $this->raiseError("could not write RPM spec file $spec_file: $php_errormsg"); + } + fwrite($wp, $spec_contents); + fclose($wp); + $this->ui->outputData("Wrote RPM spec file $spec_file", $command); + + return true; + } + + // }}} +} + +?> diff --git a/thirdparty/pear/PEAR/Command/Registry.php b/thirdparty/pear/PEAR/Command/Registry.php new file mode 100644 index 000000000..a4b9e76a6 --- /dev/null +++ b/thirdparty/pear/PEAR/Command/Registry.php @@ -0,0 +1,319 @@ + | +// | | +// +----------------------------------------------------------------------+ +// +// $Id: Registry.php,v 1.30 2003/03/18 12:06:07 ssb Exp $ + +require_once 'PEAR/Command/Common.php'; +require_once 'PEAR/Registry.php'; +require_once 'PEAR/Config.php'; + +class PEAR_Command_Registry extends PEAR_Command_Common +{ + // {{{ properties + + var $commands = array( + 'list' => array( + 'summary' => 'List Installed Packages', + 'function' => 'doList', + 'shortcut' => 'l', + 'options' => array(), + 'doc' => '[package] +If invoked without parameters, this command lists the PEAR packages +installed in your php_dir ({config php_dir)). With a parameter, it +lists the files in that package. +', + ), + 'shell-test' => array( + 'summary' => 'Shell Script Test', + 'function' => 'doShellTest', + 'shortcut' => 'st', + 'options' => array(), + 'doc' => ' [[relation] version] +Tests if a package is installed in the system. Will exit(1) if it is not. + The version comparison operator. One of: + <, lt, <=, le, >, gt, >=, ge, ==, =, eq, !=, <>, ne + The version to compare with +'), + 'info' => array( + 'summary' => 'Display information about a package', + 'function' => 'doInfo', + 'shortcut' => 'in', + 'options' => array(), + 'doc' => ' +Displays information about a package. The package argument may be a +local package file, an URL to a package file, or the name of an +installed package.' + ) + ); + + // }}} + // {{{ constructor + + /** + * PEAR_Command_Registry constructor. + * + * @access public + */ + function PEAR_Command_Registry(&$ui, &$config) + { + parent::PEAR_Command_Common($ui, $config); + } + + // }}} + + // {{{ doList() + + function _sortinfo($a, $b) + { + return strcmp($a['package'], $b['package']); + } + + function doList($command, $options, $params) + { + $reg = new PEAR_Registry($this->config->get('php_dir')); + if (sizeof($params) == 0) { + $installed = $reg->packageInfo(); + usort($installed, array(&$this, '_sortinfo')); + $i = $j = 0; + $data = array( + 'caption' => 'Installed packages:', + 'border' => true, + 'headline' => array('Package', 'Version', 'State') + ); + foreach ($installed as $package) { + $data['data'][] = array($package['package'], + $package['version'], + @$package['release_state']); + } + if (count($installed)==0) { + $data = '(no packages installed)'; + } + $this->ui->outputData($data, $command); + } else { + if (file_exists($params[0]) && !is_dir($params[0])) { + include_once "PEAR/Common.php"; + $obj = &new PEAR_Common; + $info = $obj->infoFromAny($params[0]); + $headings = array('Package File', 'Install Path'); + $installed = false; + } else { + $info = $reg->packageInfo($params[0]); + $headings = array('Type', 'Install Path'); + $installed = true; + } + if (PEAR::isError($info)) { + return $this->raiseError($info); + } + if ($info === null) { + return $this->raiseError("`$params[0]' not installed"); + } + $list = $info['filelist']; + if ($installed) { + $caption = 'Installed Files For ' . $params[0]; + } else { + $caption = 'Contents of ' . basename($params[0]); + } + $data = array( + 'caption' => $caption, + 'border' => true, + 'headline' => $headings); + foreach ($list as $file => $att) { + if ($installed) { + if (empty($att['installed_as'])) { + continue; + } + $data['data'][] = array($att['role'], $att['installed_as']); + } else { + if (isset($att['baseinstalldir'])) { + $dest = $att['baseinstalldir'] . DIRECTORY_SEPARATOR . + $file; + } else { + $dest = $file; + } + switch ($att['role']) { + case 'test': + case 'data': + if ($installed) { + break 2; + } + $dest = '-- will not be installed --'; + break; + case 'doc': + $dest = $this->config->get('doc_dir') . DIRECTORY_SEPARATOR . + $dest; + break; + case 'php': + default: + $dest = $this->config->get('php_dir') . DIRECTORY_SEPARATOR . + $dest; + } + $dest = preg_replace('!/+!', '/', $dest); + $file = preg_replace('!/+!', '/', $file); + $data['data'][] = array($file, $dest); + } + } + $this->ui->outputData($data, $command); + + + } + return true; + } + + // }}} + // {{{ doShellTest() + + function doShellTest($command, $options, $params) + { + $this->pushErrorHandling(PEAR_ERROR_RETURN); + $reg = &new PEAR_Registry($this->config->get('php_dir')); + // "pear shell-test Foo" + if (sizeof($params) == 1) { + if (!$reg->packageExists($params[0])) { + exit(1); + } + // "pear shell-test Foo 1.0" + } elseif (sizeof($params) == 2) { + $v = $reg->packageInfo($params[0], 'version'); + if (!$v || !version_compare("$v", "{$params[1]}", "ge")) { + exit(1); + } + // "pear shell-test Foo ge 1.0" + } elseif (sizeof($params) == 3) { + $v = $reg->packageInfo($params[0], 'version'); + if (!$v || !version_compare("$v", "{$params[2]}", $params[1])) { + exit(1); + } + } else { + $this->popErrorHandling(); + $this->raiseError("$command: expects 1 to 3 parameters"); + exit(1); + } + } + + // }}} + // {{{ doInfo + + function doInfo($command, $options, $params) + { + // $params[0] The package for showing info + if (sizeof($params) != 1) { + return $this->raiseError("This command only accepts one param: ". + "the package you want information"); + } + if (@is_file($params[0])) { + $obj = &new PEAR_Common(); + $info = $obj->infoFromAny($params[0]); + } else { + $reg = &new PEAR_Registry($this->config->get('php_dir')); + $info = $reg->packageInfo($params[0]); + } + if (PEAR::isError($info)) { + return $info; + } + if (empty($info)) { + $this->ui->displayError("Nothing found for `$params[0]'"); + return; + } + unset($info['filelist']); + unset($info['changelog']); + $keys = array_keys($info); + $longtext = array('description', 'summary'); + foreach ($keys as $key) { + if (is_array($info[$key])) { + switch ($key) { + case 'maintainers': { + $i = 0; + $mstr = ''; + foreach ($info[$key] as $m) { + if ($i++ > 0) { + $mstr .= "\n"; + } + $mstr .= $m['name'] . " <"; + if (isset($m['email'])) { + $mstr .= $m['email']; + } else { + $mstr .= $m['handle'] . '@php.net'; + } + $mstr .= "> ($m[role])"; + } + $info[$key] = $mstr; + break; + } + case 'release_deps': { + $i = 0; + $dstr = ''; + foreach ($info[$key] as $d) { + if (isset($this->_deps_rel_trans[$d['rel']])) { + $rel = $this->_deps_rel_trans[$d['rel']]; + } else { + $rel = $d['rel']; + } + if (isset($this->_deps_type_trans[$d['type']])) { + $type = ucfirst($this->_deps_type_trans[$d['type']]); + } else { + $type = $d['type']; + } + if (isset($d['name'])) { + $name = $d['name'] . ' '; + } else { + $name = ''; + } + if (isset($d['version'])) { + $version = $d['version'] . ' '; + } else { + $version = ''; + } + $dstr .= "$type $name$rel $version\n"; + } + $info[$key] = $dstr; + break; + } + default: { + $info[$key] = implode(", ", $info[$key]); + break; + } + } + } + if ($key == '_lastmodified') { + $hdate = date('Y-m-d', $info[$key]); + unset($info[$key]); + $info['Last Modified'] = $hdate; + } else { + $info[$key] = trim($info[$key]); + if (in_array($key, $longtext)) { + $info[$key] = preg_replace('/ +/', ' ', $info[$key]); + } + } + } + $caption = 'About ' . $info['package'] . '-' . $info['version']; + $data = array( + 'caption' => $caption, + 'border' => true); + foreach ($info as $key => $value) { + $key = ucwords(trim(str_replace('_', ' ', $key))); + $data['data'][] = array($key, $value); + } + + $this->ui->outputData($data, 'package-info'); + } + + // }}} +} + +?> diff --git a/thirdparty/pear/PEAR/Command/Remote.php b/thirdparty/pear/PEAR/Command/Remote.php new file mode 100644 index 000000000..366d9daba --- /dev/null +++ b/thirdparty/pear/PEAR/Command/Remote.php @@ -0,0 +1,407 @@ + | +// | | +// +----------------------------------------------------------------------+ +// +// $Id: Remote.php,v 1.29 2003/03/18 12:06:07 ssb Exp $ + +require_once 'PEAR/Command/Common.php'; +require_once 'PEAR/Common.php'; +require_once 'PEAR/Remote.php'; +require_once 'PEAR/Registry.php'; + +class PEAR_Command_Remote extends PEAR_Command_Common +{ + // {{{ command definitions + + var $commands = array( + 'remote-info' => array( + 'summary' => 'Information About Remote Packages', + 'function' => 'doRemoteInfo', + 'shortcut' => 'ri', + 'options' => array(), + 'doc' => ' +Get details on a package from the server.', + ), + 'list-upgrades' => array( + 'summary' => 'List Available Upgrades', + 'function' => 'doListUpgrades', + 'shortcut' => 'lu', + 'options' => array(), + 'doc' => ' +List releases on the server of packages you have installed where +a newer version is available with the same release state (stable etc.).' + ), + 'remote-list' => array( + 'summary' => 'List Remote Packages', + 'function' => 'doRemoteList', + 'shortcut' => 'rl', + 'options' => array(), + 'doc' => ' +Lists the packages available on the configured server along with the +latest stable release of each package.', + ), + 'search' => array( + 'summary' => 'Search remote package database', + 'function' => 'doSearch', + 'shortcut' => 'sp', + 'options' => array(), + 'doc' => ' +Lists all packages which match the search parameters (first param +is package name, second package info)', + ), + 'list-all' => array( + 'summary' => 'List All Packages', + 'function' => 'doListAll', + 'shortcut' => 'la', + 'options' => array(), + 'doc' => ' +Lists the packages available on the configured server along with the +latest stable release of each package.', + ), + 'download' => array( + 'summary' => 'Download Package', + 'function' => 'doDownload', + 'shortcut' => 'd', + 'options' => array( + 'nocompress' => array( + 'shortopt' => 'Z', + 'doc' => 'download an uncompressed (.tar) file', + ), + ), + 'doc' => '{package|package-version} +Download a package tarball. The file will be named as suggested by the +server, for example if you download the DB package and the latest stable +version of DB is 1.2, the downloaded file will be DB-1.2.tgz.', + ), + 'clear-cache' => array( + 'summary' => 'Clear XML-RPC Cache', + 'function' => 'doClearCache', + 'shortcut' => 'cc', + 'options' => array(), + 'doc' => ' +Clear the XML-RPC cache. See also the cache_ttl configuration +parameter. +', + ), + ); + + // }}} + // {{{ constructor + + /** + * PEAR_Command_Remote constructor. + * + * @access public + */ + function PEAR_Command_Remote(&$ui, &$config) + { + parent::PEAR_Command_Common($ui, $config); + } + + // }}} + + // {{{ doRemoteInfo() + + function doRemoteInfo($command, $options, $params) + { + if (sizeof($params) != 1) { + return $this->raiseError("$command expects one param: the remote package name"); + } + $r = new PEAR_Remote($this->config); + $info = $r->call('package.info', $params[0]); + if (PEAR::isError($info)) { + return $this->raiseError($info); + } + + $reg = new PEAR_Registry($this->config->get('php_dir')); + $installed = $reg->packageInfo($info['name']); + $info['installed'] = $installed['version'] ? $installed['version'] : '- no -'; + + $this->ui->outputData($info, $command); + + return true; + } + + // }}} + // {{{ doRemoteList() + + function doRemoteList($command, $options, $params) + { + $r = new PEAR_Remote($this->config); + $list_options = false; + if ($this->config->get('preferred_state') == 'stable') + $list_options = true; + $available = $r->call('package.listAll', $list_options); + if (PEAR::isError($available)) { + return $this->raiseError($available); + } + $i = $j = 0; + $data = array( + 'caption' => 'Available packages:', + 'border' => true, + 'headline' => array('Package', 'Version'), + ); + foreach ($available as $name => $info) { + $data['data'][] = array($name, isset($info['stable']) ? $info['stable'] : '-n/a-'); + } + if (count($available)==0) { + $data = '(no packages installed yet)'; + } + $this->ui->outputData($data, $command); + return true; + } + + // }}} + // {{{ doListAll() + + function doListAll($command, $options, $params) + { + $r = new PEAR_Remote($this->config); + $reg = new PEAR_Registry($this->config->get('php_dir')); + $list_options = false; + if ($this->config->get('preferred_state') == 'stable') + $list_options = true; + $available = $r->call('package.listAll', $list_options); + if (PEAR::isError($available)) { + return $this->raiseError($available); + } + if (!is_array($available)) { + return $this->raiseError('The package list could not be fetched from the remote server. Please try again. (Debug info: "'.$available.'")'); + } + $data = array( + 'caption' => 'All packages:', + 'border' => true, + 'headline' => array('Package', 'Latest', 'Local'), + ); + + foreach ($available as $name => $info) { + $installed = $reg->packageInfo($name); + $desc = $info['summary']; + if (isset($params[$name])) + $desc .= "\n\n".$info['description']; + + if (isset($options['mode'])) + { + if ($options['mode'] == 'installed' && !isset($installed['version'])) + continue; + if ($options['mode'] == 'notinstalled' && isset($installed['version'])) + continue; + if ($options['mode'] == 'upgrades' + && (!isset($installed['version']) || $installed['version'] == $info['stable'])) + { + continue; + }; + }; + + $data['data'][$info['category']][] = array( + $name, + @$info['stable'], + @$installed['version'], + @$desc, + @$info['deps'], + ); + } + $this->ui->outputData($data, $command); + return true; + } + + // }}} + // {{{ doSearch() + + function doSearch($command, $options, $params) + { + if ((!isset($params[0]) || empty($params[0])) + && (!isset($params[1]) || empty($params[1]))) + { + return $this->raiseError('no valid search string supplied'); + }; + + $r = new PEAR_Remote($this->config); + $reg = new PEAR_Registry($this->config->get('php_dir')); + $available = $r->call('package.listAll', true); + if (PEAR::isError($available)) { + return $this->raiseError($available); + } + $data = array( + 'caption' => 'Matched packages:', + 'border' => true, + 'headline' => array('Package', 'Latest', 'Local'), + ); + + foreach ($available as $name => $info) { + $found = (!empty($params[0]) && stristr($name, $params[0]) !== false); + if (!$found && !(isset($params[1]) && !empty($params[1]) + && (stristr($info['summary'], $params[1]) !== false + || stristr($info['description'], $params[1]) !== false))) + { + continue; + }; + + $installed = $reg->packageInfo($name); + $desc = $info['summary']; + if (isset($params[$name])) + $desc .= "\n\n".$info['description']; + + $data['data'][$info['category']][] = array( + $name, + $info['stable'], + $installed['version'], + $desc, + ); + } + if (!isset($data['data'])) { + return $this->raiseError('no packages found'); + }; + $this->ui->outputData($data, $command); + return true; + } + + // }}} + // {{{ doDownload() + + function doDownload($command, $options, $params) + { + //$params[0] -> The package to download + if (count($params) != 1) { + return PEAR::raiseError("download expects one argument: the package to download"); + } + $server = $this->config->get('master_server'); + if (!ereg('^http://', $params[0])) { + $pkgfile = "http://$server/get/$params[0]"; + } else { + $pkgfile = $params[0]; + } + $this->bytes_downloaded = 0; + $saved = PEAR_Common::downloadHttp($pkgfile, $this->ui, '.', + array(&$this, 'downloadCallback')); + if (PEAR::isError($saved)) { + return $this->raiseError($saved); + } + $fname = basename($saved); + $this->ui->outputData("File $fname downloaded ($this->bytes_downloaded bytes)", $command); + return true; + } + + function downloadCallback($msg, $params = null) + { + if ($msg == 'done') { + $this->bytes_downloaded = $params; + } + } + + // }}} + // {{{ doListUpgrades() + + function doListUpgrades($command, $options, $params) + { + include_once "PEAR/Registry.php"; + $remote = new PEAR_Remote($this->config); + if (empty($params[0])) { + $state = $this->config->get('preferred_state'); + } else { + $state = $params[0]; + } + $caption = 'Available Upgrades'; + if (empty($state) || $state == 'any') { + $latest = $remote->call("package.listLatestReleases"); + } else { + $latest = $remote->call("package.listLatestReleases", $state); + $caption .= ' (' . $state . ')'; + } + $caption .= ':'; + if (PEAR::isError($latest)) { + return $latest; + } + $reg = new PEAR_Registry($this->config->get('php_dir')); + $inst = array_flip($reg->listPackages()); + $data = array( + 'caption' => $caption, + 'border' => 1, + 'headline' => array('Package', 'Version', 'Size'), + ); + foreach ($latest as $package => $info) { + if (!isset($inst[$package])) { + // skip packages we don't have installed + continue; + } + extract($info); + $inst_version = $reg->packageInfo($package, 'version'); + if (version_compare("$version", "$inst_version", "le")) { + // installed version is up-to-date + continue; + } + if ($filesize >= 20480) { + $filesize += 1024 - ($filesize % 1024); + $fs = sprintf("%dkB", $filesize / 1024); + } elseif ($filesize > 0) { + $filesize += 103 - ($filesize % 103); + $fs = sprintf("%.1fkB", $filesize / 1024.0); + } else { + $fs = " -"; // XXX center instead + } + $data['data'][] = array($package, $version, $fs); + } + if (empty($data['data'])) { + $this->ui->outputData('No upgrades available'); + } else { + $this->ui->outputData($data, $command); + } + return true; + } + + // }}} + // {{{ doClearCache() + + function doClearCache($command, $options, $params) + { + $cache_dir = $this->config->get('cache_dir'); + $verbose = $this->config->get('verbose'); + $output = ''; + if (!($dp = @opendir($cache_dir))) { + return $this->raiseError("opendir($cache_dir) failed: $php_errormsg"); + } + if ($verbose >= 1) { + $output .= "reading directory $cache_dir\n"; + } + $num = 0; + while ($ent = readdir($dp)) { + if (preg_match('/^xmlrpc_cache_[a-z0-9]{32}$/', $ent)) { + $path = $cache_dir . DIRECTORY_SEPARATOR . $ent; + $ok = @unlink($path); + if ($ok) { + if ($verbose >= 2) { + $output .= "deleted $path\n"; + } + $num++; + } elseif ($verbose >= 1) { + $output .= "failed to delete $path\n"; + } + } + } + closedir($dp); + if ($verbose >= 1) { + $output .= "$num cache entries cleared\n"; + } + $this->ui->outputData(rtrim($output), $command); + return $num; + } + + // }}} +} + +?> diff --git a/thirdparty/pear/PEAR/Common.php b/thirdparty/pear/PEAR/Common.php new file mode 100644 index 000000000..88a4f6049 --- /dev/null +++ b/thirdparty/pear/PEAR/Common.php @@ -0,0 +1,1702 @@ + | +// | Tomas V.V.Cox | +// +----------------------------------------------------------------------+ +// +// $Id: Common.php,v 1.91 2003/05/09 12:03:09 derick Exp $ + +require_once 'PEAR.php'; +require_once 'Archive/Tar.php'; +require_once 'System.php'; +require_once 'PEAR/Config.php'; + +// {{{ constants and globals + +define('PEAR_COMMON_PACKAGE_NAME_PREG', '/^([A-Z][a-zA-Z0-9_]+|[a-z][a-z0-9_]+)$/'); + +/** + * List of temporary files and directories registered by + * PEAR_Common::addTempFile(). + * @var array + */ +$GLOBALS['_PEAR_Common_tempfiles'] = array(); + +/** + * Valid maintainer roles + * @var array + */ +$GLOBALS['_PEAR_Common_maintainer_roles'] = array('lead','developer','contributor','helper'); + +/** + * Valid release states + * @var array + */ +$GLOBALS['_PEAR_Common_release_states'] = array('alpha','beta','stable','snapshot','devel'); + +/** + * Valid dependency types + * @var array + */ +$GLOBALS['_PEAR_Common_dependency_types'] = array('pkg','ext','php','prog','ldlib','rtlib','os','websrv','sapi'); + +/** + * Valid dependency relations + * @var array + */ +$GLOBALS['_PEAR_Common_dependency_relations'] = array('has','eq','lt','le','gt','ge'); + +/** + * Valid file roles + * @var array + */ +$GLOBALS['_PEAR_Common_file_roles'] = array('php','ext','test','doc','data','src','script'); + +/** + * Valid replacement types + * @var array + */ +$GLOBALS['_PEAR_Common_replacement_types'] = array('php-const', 'pear-config', 'package-info'); + +/** + * Valid "provide" types + * @var array + */ +$GLOBALS['_PEAR_Common_provide_types'] = array('ext', 'prog', 'class', 'function', 'feature', 'api'); + +/** + * Valid "provide" types + * @var array + */ +$GLOBALS['_PEAR_Common_script_phases'] = array('pre-install', 'post-install', 'pre-uninstall', 'post-uninstall', 'pre-build', 'post-build', 'pre-configure', 'post-configure', 'pre-setup', 'post-setup'); + +// }}} + +/** + * Class providing common functionality for PEAR adminsitration classes. + */ +class PEAR_Common extends PEAR +{ + // {{{ properties + + /** stack of elements, gives some sort of XML context */ + var $element_stack = array(); + + /** name of currently parsed XML element */ + var $current_element; + + /** array of attributes of the currently parsed XML element */ + var $current_attributes = array(); + + /** assoc with information about a package */ + var $pkginfo = array(); + + /** + * User Interface object (PEAR_Frontend_* class). If null, + * the log() method uses print. + * @var object + */ + var $ui = null; + + /** + * Configuration object (PEAR_Config). + * @var object + */ + var $config = null; + + var $current_path = null; + + /** + * PEAR_SourceAnalyzer instance + * @var object + */ + var $source_analyzer = null; + + // }}} + + // {{{ constructor + + /** + * PEAR_Common constructor + * + * @access public + */ + function PEAR_Common() + { + parent::PEAR(); + $this->config = &PEAR_Config::singleton(); + $this->debug = $this->config->get('verbose'); + } + + // }}} + // {{{ destructor + + /** + * PEAR_Common destructor + * + * @access private + */ + function _PEAR_Common() + { + // doesn't work due to bug #14744 + //$tempfiles = $this->_tempfiles; + $tempfiles =& $GLOBALS['_PEAR_Common_tempfiles']; + while ($file = array_shift($tempfiles)) { + if (@is_dir($file)) { + System::rm("-rf $file"); + } elseif (file_exists($file)) { + unlink($file); + } + } + } + + // }}} + // {{{ addTempFile() + + /** + * Register a temporary file or directory. When the destructor is + * executed, all registered temporary files and directories are + * removed. + * + * @param string $file name of file or directory + * + * @return void + * + * @access public + */ + function addTempFile($file) + { + $GLOBALS['_PEAR_Common_tempfiles'][] = $file; + } + + // }}} + // {{{ mkDirHier() + + /** + * Wrapper to System::mkDir(), creates a directory as well as + * any necessary parent directories. + * + * @param string $dir directory name + * + * @return bool TRUE on success, or a PEAR error + * + * @access public + */ + function mkDirHier($dir) + { + $this->log(2, "+ create dir $dir"); + return System::mkDir("-p $dir"); + } + + // }}} + // {{{ log() + + /** + * Logging method. + * + * @param int $level log level (0 is quiet, higher is noisier) + * @param string $msg message to write to the log + * + * @return void + * + * @access public + */ + function log($level, $msg) + { + if ($this->debug >= $level) { + if (is_object($this->ui)) { + $this->ui->log($msg); + } else { + print "$msg\n"; + } + } + } + + // }}} + // {{{ mkTempDir() + + /** + * Create and register a temporary directory. + * + * @param string $tmpdir (optional) Directory to use as tmpdir. + * Will use system defaults (for example + * /tmp or c:\windows\temp) if not specified + * + * @return string name of created directory + * + * @access public + */ + function mkTempDir($tmpdir = '') + { + if ($tmpdir) { + $topt = "-t $tmpdir "; + } else { + $topt = ''; + } + if (!$tmpdir = System::mktemp($topt . '-d pear')) { + return false; + } + $this->addTempFile($tmpdir); + return $tmpdir; + } + + // }}} + // {{{ setFrontendObject() + + /** + * Set object that represents the frontend to be used. + * + * @param object Reference of the frontend object + * @return void + * @access public + */ + function setFrontendObject(&$ui) + { + $this->ui = &$ui; + } + + // }}} + + // {{{ _unIndent() + + /** + * Unindent given string (?) + * + * @param string $str The string that has to be unindented. + * @return string + * @access private + */ + function _unIndent($str) + { + // remove leading newlines + $str = preg_replace('/^[\r\n]+/', '', $str); + // find whitespace at the beginning of the first line + $indent_len = strspn($str, " \t"); + $indent = substr($str, 0, $indent_len); + $data = ''; + // remove the same amount of whitespace from following lines + foreach (explode("\n", $str) as $line) { + if (substr($line, 0, $indent_len) == $indent) { + $data .= substr($line, $indent_len) . "\n"; + } + } + return $data; + } + + // }}} + // {{{ _element_start() + + /** + * XML parser callback for starting elements. Used while package + * format version is not yet known. + * + * @param resource $xp XML parser resource + * @param string $name name of starting element + * @param array $attribs element attributes, name => value + * + * @return void + * + * @access private + */ + function _element_start($xp, $name, $attribs) + { + array_push($this->element_stack, $name); + $this->current_element = $name; + $spos = sizeof($this->element_stack) - 2; + $this->prev_element = ($spos >= 0) ? $this->element_stack[$spos] : ''; + $this->current_attributes = $attribs; + switch ($name) { + case 'package': { + if (isset($attribs['version'])) { + $vs = preg_replace('/[^0-9a-z]/', '_', $attribs['version']); + } else { + $vs = '1_0'; + } + $elem_start = '_element_start_'. $vs; + $elem_end = '_element_end_'. $vs; + $cdata = '_pkginfo_cdata_'. $vs; + xml_set_element_handler($xp, $elem_start, $elem_end); + xml_set_character_data_handler($xp, $cdata); + break; + } + } + } + + // }}} + // {{{ _element_end() + + /** + * XML parser callback for ending elements. Used while package + * format version is not yet known. + * + * @param resource $xp XML parser resource + * @param string $name name of ending element + * + * @return void + * + * @access private + */ + function _element_end($xp, $name) + { + } + + // }}} + + // Support for package DTD v1.0: + // {{{ _element_start_1_0() + + /** + * XML parser callback for ending elements. Used for version 1.0 + * packages. + * + * @param resource $xp XML parser resource + * @param string $name name of ending element + * + * @return void + * + * @access private + */ + function _element_start_1_0($xp, $name, $attribs) + { + array_push($this->element_stack, $name); + $this->current_element = $name; + $spos = sizeof($this->element_stack) - 2; + $this->prev_element = ($spos >= 0) ? $this->element_stack[$spos] : ''; + $this->current_attributes = $attribs; + $this->cdata = ''; + switch ($name) { + case 'dir': + if ($this->in_changelog) { + break; + } + if ($attribs['name'] != '/') { + $this->dir_names[] = $attribs['name']; + } + if (isset($attribs['baseinstalldir'])) { + $this->dir_install = $attribs['baseinstalldir']; + } + if (isset($attribs['role'])) { + $this->dir_role = $attribs['role']; + } + break; + case 'file': + if ($this->in_changelog) { + break; + } + if (isset($attribs['name'])) { + $path = ''; + if (count($this->dir_names)) { + foreach ($this->dir_names as $dir) { + $path .= $dir . DIRECTORY_SEPARATOR; + } + } + $path .= $attribs['name']; + unset($attribs['name']); + $this->current_path = $path; + $this->filelist[$path] = $attribs; + // Set the baseinstalldir only if the file don't have this attrib + if (!isset($this->filelist[$path]['baseinstalldir']) && + isset($this->dir_install)) + { + $this->filelist[$path]['baseinstalldir'] = $this->dir_install; + } + // Set the Role + if (!isset($this->filelist[$path]['role']) && isset($this->dir_role)) { + $this->filelist[$path]['role'] = $this->dir_role; + } + } + break; + case 'replace': + if (!$this->in_changelog) { + $this->filelist[$this->current_path]['replacements'][] = $attribs; + } + break; + case 'maintainers': + $this->pkginfo['maintainers'] = array(); + $this->m_i = 0; // maintainers array index + break; + case 'maintainer': + // compatibility check + if (!isset($this->pkginfo['maintainers'])) { + $this->pkginfo['maintainers'] = array(); + $this->m_i = 0; + } + $this->pkginfo['maintainers'][$this->m_i] = array(); + $this->current_maintainer =& $this->pkginfo['maintainers'][$this->m_i]; + break; + case 'changelog': + $this->pkginfo['changelog'] = array(); + $this->c_i = 0; // changelog array index + $this->in_changelog = true; + break; + case 'release': + if ($this->in_changelog) { + $this->pkginfo['changelog'][$this->c_i] = array(); + $this->current_release = &$this->pkginfo['changelog'][$this->c_i]; + } else { + $this->current_release = &$this->pkginfo; + } + break; + case 'deps': + if (!$this->in_changelog) { + $this->pkginfo['release_deps'] = array(); + } + break; + case 'dep': + // dependencies array index + if (!$this->in_changelog) { + $this->d_i++; + $this->pkginfo['release_deps'][$this->d_i] = $attribs; + } + break; + case 'configureoptions': + if (!$this->in_changelog) { + $this->pkginfo['configure_options'] = array(); + } + break; + case 'configureoption': + if (!$this->in_changelog) { + $this->pkginfo['configure_options'][] = $attribs; + } + break; + case 'provides': + if (empty($attribs['type']) || empty($attribs['name'])) { + break; + } + $attribs['explicit'] = true; + $this->pkginfo['provides']["$attribs[type];$attribs[name]"] = $attribs; + break; + } + } + + // }}} + // {{{ _element_end_1_0() + + /** + * XML parser callback for ending elements. Used for version 1.0 + * packages. + * + * @param resource $xp XML parser resource + * @param string $name name of ending element + * + * @return void + * + * @access private + */ + function _element_end_1_0($xp, $name) + { + $data = trim($this->cdata); + switch ($name) { + case 'name': + switch ($this->prev_element) { + case 'package': + // XXX should we check the package name here? + $this->pkginfo['package'] = ereg_replace('[^a-zA-Z0-9._]', '_', $data); + break; + case 'maintainer': + $this->current_maintainer['name'] = $data; + break; + } + break; + case 'summary': + $this->pkginfo['summary'] = $data; + break; + case 'description': + $data = $this->_unIndent($this->cdata); + $this->pkginfo['description'] = $data; + break; + case 'user': + $this->current_maintainer['handle'] = $data; + break; + case 'email': + $this->current_maintainer['email'] = $data; + break; + case 'role': + $this->current_maintainer['role'] = $data; + break; + case 'version': + $data = ereg_replace ('[^a-zA-Z0-9._\-]', '_', $data); + if ($this->in_changelog) { + $this->current_release['version'] = $data; + } else { + $this->pkginfo['version'] = $data; + } + break; + case 'date': + if ($this->in_changelog) { + $this->current_release['release_date'] = $data; + } else { + $this->pkginfo['release_date'] = $data; + } + break; + case 'notes': + // try to "de-indent" release notes in case someone + // has been over-indenting their xml ;-) + $data = $this->_unIndent($this->cdata); + if ($this->in_changelog) { + $this->current_release['release_notes'] = $data; + } else { + $this->pkginfo['release_notes'] = $data; + } + break; + case 'warnings': + if ($this->in_changelog) { + $this->current_release['release_warnings'] = $data; + } else { + $this->pkginfo['release_warnings'] = $data; + } + break; + case 'state': + if ($this->in_changelog) { + $this->current_release['release_state'] = $data; + } else { + $this->pkginfo['release_state'] = $data; + } + break; + case 'license': + $this->pkginfo['release_license'] = $data; + break; + case 'dep': + if ($data && !$this->in_changelog) { + $this->pkginfo['release_deps'][$this->d_i]['name'] = $data; + } + break; + case 'dir': + if ($this->in_changelog) { + break; + } + array_pop($this->dir_names); + break; + case 'file': + if ($this->in_changelog) { + break; + } + if ($data) { + $path = ''; + if (count($this->dir_names)) { + foreach ($this->dir_names as $dir) { + $path .= $dir . DIRECTORY_SEPARATOR; + } + } + $path .= $data; + $this->filelist[$path] = $this->current_attributes; + // Set the baseinstalldir only if the file don't have this attrib + if (!isset($this->filelist[$path]['baseinstalldir']) && + isset($this->dir_install)) + { + $this->filelist[$path]['baseinstalldir'] = $this->dir_install; + } + // Set the Role + if (!isset($this->filelist[$path]['role']) && isset($this->dir_role)) { + $this->filelist[$path]['role'] = $this->dir_role; + } + } + break; + case 'maintainer': + if (empty($this->pkginfo['maintainers'][$this->m_i]['role'])) { + $this->pkginfo['maintainers'][$this->m_i]['role'] = 'lead'; + } + $this->m_i++; + break; + case 'release': + if ($this->in_changelog) { + $this->c_i++; + } + break; + case 'changelog': + $this->in_changelog = false; + break; + case 'summary': + $this->pkginfo['summary'] = $data; + break; + } + array_pop($this->element_stack); + $spos = sizeof($this->element_stack) - 1; + $this->current_element = ($spos > 0) ? $this->element_stack[$spos] : ''; + $this->cdata = ''; + } + + // }}} + // {{{ _pkginfo_cdata_1_0() + + /** + * XML parser callback for character data. Used for version 1.0 + * packages. + * + * @param resource $xp XML parser resource + * @param string $name character data + * + * @return void + * + * @access private + */ + function _pkginfo_cdata_1_0($xp, $data) + { + if (isset($this->cdata)) { + $this->cdata .= $data; + } + } + + // }}} + + // {{{ infoFromTgzFile() + + /** + * Returns information about a package file. Expects the name of + * a gzipped tar file as input. + * + * @param string $file name of .tgz file + * + * @return array array with package information + * + * @access public + * + */ + function infoFromTgzFile($file) + { + if (!@is_file($file)) { + return $this->raiseError("could not open file \"$file\""); + } + $tar = new Archive_Tar($file); + $content = $tar->listContent(); + if (!is_array($content)) { + return $this->raiseError("could not get contents of package \"$file\""); + } + $xml = null; + foreach ($content as $file) { + $name = $file['filename']; + if ($name == 'package.xml') { + $xml = $name; + break; + } elseif (ereg('package.xml$', $name, $match)) { + $xml = $match[0]; + break; + } + } + $tmpdir = System::mkTemp('-d pear'); + $this->addTempFile($tmpdir); + if (!$xml || !$tar->extractList($xml, $tmpdir)) { + return $this->raiseError('could not extract the package.xml file'); + } + return $this->infoFromDescriptionFile("$tmpdir/$xml"); + } + + // }}} + // {{{ infoFromDescriptionFile() + + /** + * Returns information about a package file. Expects the name of + * a package xml file as input. + * + * @param string $descfile name of package xml file + * + * @return array array with package information + * + * @access public + * + */ + function infoFromDescriptionFile($descfile) + { + if (!@is_file($descfile) || !is_readable($descfile) || + (!$fp = @fopen($descfile, 'r'))) { + return $this->raiseError("Unable to open $descfile"); + } + + // read the whole thing so we only get one cdata callback + // for each block of cdata + $data = fread($fp, filesize($descfile)); + return $this->infoFromString($data); + } + + // }}} + // {{{ infoFromString() + + /** + * Returns information about a package file. Expects the contents + * of a package xml file as input. + * + * @param string $data name of package xml file + * + * @return array array with package information + * + * @access public + * + */ + function infoFromString($data) + { + require_once('PEAR/Dependency.php'); + if (PEAR_Dependency::checkExtension($error, 'xml')) { + return $this->raiseError($error); + } + $xp = @xml_parser_create(); + if (!$xp) { + return $this->raiseError('Unable to create XML parser'); + } + xml_set_object($xp, $this); + xml_set_element_handler($xp, '_element_start', '_element_end'); + xml_set_character_data_handler($xp, '_pkginfo_cdata'); + xml_parser_set_option($xp, XML_OPTION_CASE_FOLDING, false); + + $this->element_stack = array(); + $this->pkginfo = array('provides' => array()); + $this->current_element = false; + unset($this->dir_install); + $this->pkginfo['filelist'] = array(); + $this->filelist =& $this->pkginfo['filelist']; + $this->dir_names = array(); + $this->in_changelog = false; + $this->d_i = 0; + $this->cdata = ''; + + if (!xml_parse($xp, $data, 1)) { + $code = xml_get_error_code($xp); + $msg = sprintf("XML error: %s at line %d", + xml_error_string($code), + xml_get_current_line_number($xp)); + xml_parser_free($xp); + return $this->raiseError($msg, $code); + } + + xml_parser_free($xp); + + foreach ($this->pkginfo as $k => $v) { + if (!is_array($v)) { + $this->pkginfo[$k] = trim($v); + } + } + return $this->pkginfo; + } + // }}} + // {{{ infoFromAny() + + /** + * Returns package information from different sources + * + * This method is able to extract information about a package + * from a .tgz archive or from a XML package definition file. + * + * @access public + * @param string Filename of the source ('package.xml', '.tgz') + * @return string + */ + function infoFromAny($info) + { + if (is_string($info) && file_exists($info)) { + $tmp = substr($info, -4); + if ($tmp == '.xml') { + $info = $this->infoFromDescriptionFile($info); + } elseif ($tmp == '.tar' || $tmp == '.tgz') { + $info = $this->infoFromTgzFile($info); + } else { + $fp = fopen($info, "r"); + $test = fread($fp, 5); + fclose($fp); + if ($test == "infoFromDescriptionFile($info); + } else { + $info = $this->infoFromTgzFile($info); + } + } + if (PEAR::isError($info)) { + return $this->raiseError($info); + } + } + return $info; + } + + // }}} + // {{{ xmlFromInfo() + + /** + * Return an XML document based on the package info (as returned + * by the PEAR_Common::infoFrom* methods). + * + * @param array $pkginfo package info + * + * @return string XML data + * + * @access public + */ + function xmlFromInfo($pkginfo) + { + static $maint_map = array( + "handle" => "user", + "name" => "name", + "email" => "email", + "role" => "role", + ); + $ret = "\n"; + //$ret .= "\n"; + $ret .= " + $pkginfo[package] + ".htmlspecialchars($pkginfo['summary'])." + ".htmlspecialchars($pkginfo['description'])." + +"; + foreach ($pkginfo['maintainers'] as $maint) { + $ret .= " \n"; + foreach ($maint_map as $idx => $elm) { + $ret .= " <$elm>"; + $ret .= htmlspecialchars($maint[$idx]); + $ret .= "\n"; + } + $ret .= " \n"; + } + $ret .= " \n"; + $ret .= $this->_makeReleaseXml($pkginfo); + if (@sizeof($pkginfo['changelog']) > 0) { + $ret .= " \n"; + foreach ($pkginfo['changelog'] as $oldrelease) { + $ret .= $this->_makeReleaseXml($oldrelease, true); + } + $ret .= " \n"; + } + $ret .= "\n"; + return $ret; + } + + // }}} + // {{{ _makeReleaseXml() + + /** + * Generate part of an XML description with release information. + * + * @param array $pkginfo array with release information + * @param bool $changelog whether the result will be in a changelog element + * + * @return string XML data + * + * @access private + */ + function _makeReleaseXml($pkginfo, $changelog = false) + { + // XXX QUOTE ENTITIES IN PCDATA, OR EMBED IN CDATA BLOCKS!! + $indent = $changelog ? " " : ""; + $ret = "$indent \n"; + if (!empty($pkginfo['version'])) { + $ret .= "$indent $pkginfo[version]\n"; + } + if (!empty($pkginfo['release_date'])) { + $ret .= "$indent $pkginfo[release_date]\n"; + } + if (!empty($pkginfo['release_license'])) { + $ret .= "$indent $pkginfo[release_license]\n"; + } + if (!empty($pkginfo['release_state'])) { + $ret .= "$indent $pkginfo[release_state]\n"; + } + if (!empty($pkginfo['release_notes'])) { + $ret .= "$indent ".htmlspecialchars($pkginfo['release_notes'])."\n"; + } + if (!empty($pkginfo['release_warnings'])) { + $ret .= "$indent ".htmlspecialchars($pkginfo['release_warnings'])."\n"; + } + if (isset($pkginfo['release_deps']) && sizeof($pkginfo['release_deps']) > 0) { + $ret .= "$indent \n"; + foreach ($pkginfo['release_deps'] as $dep) { + $ret .= "$indent $what) { + $ret .= "$indent $fa) { + @$ret .= "$indent $v) { + $ret .= " $k=\"" . htmlspecialchars($v) .'"'; + } + $ret .= "/>\n"; + } + @$ret .= "$indent \n"; + } + } + $ret .= "$indent \n"; + } + $ret .= "$indent \n"; + return $ret; + } + + // }}} + // {{{ validatePackageInfo() + + /** + * Validate XML package definition file. + * + * @param string $info Filename of the package archive or of the + * package definition file + * @param array $errors Array that will contain the errors + * @param array $warnings Array that will contain the warnings + * @param string $dir_prefix (optional) directory where source files + * may be found, or empty if they are not available + * @access public + * @return boolean + */ + function validatePackageInfo($info, &$errors, &$warnings, $dir_prefix = '') + { + global $_PEAR_Common_maintainer_roles, + $_PEAR_Common_release_states, + $_PEAR_Common_dependency_types, + $_PEAR_Common_dependency_relations, + $_PEAR_Common_file_roles, + $_PEAR_Common_replacement_types; + if (PEAR::isError($info = $this->infoFromAny($info))) { + return $this->raiseError($info); + } + if (!is_array($info)) { + return false; + } + $errors = array(); + $warnings = array(); + if (empty($info['package'])) { + $errors[] = 'missing package name'; + } + if (empty($info['summary'])) { + $errors[] = 'missing summary'; + } elseif (strpos(trim($info['summary']), "\n") !== false) { + $warnings[] = 'summary should be on a single line'; + } + if (empty($info['description'])) { + $errors[] = 'missing description'; + } + if (empty($info['release_license'])) { + $errors[] = 'missing license'; + } + if (empty($info['version'])) { + $errors[] = 'missing version'; + } + if (empty($info['release_state'])) { + $errors[] = 'missing release state'; + } elseif (!in_array($info['release_state'], $_PEAR_Common_release_states)) { + $errors[] = "invalid release state `$info[release_state]', should be one of: ".implode(' ', $_PEAR_Common_release_states); + } + if (empty($info['release_date'])) { + $errors[] = 'missing release date'; + } elseif (!preg_match('/^\d{4}-\d\d-\d\d$/', $info['release_date'])) { + $errors[] = "invalid release date `$info[release_date]', format is YYYY-MM-DD"; + } + if (empty($info['release_notes'])) { + $errors[] = "missing release notes"; + } + if (empty($info['maintainers'])) { + $errors[] = 'no maintainer(s)'; + } else { + $i = 1; + foreach ($info['maintainers'] as $m) { + if (empty($m['handle'])) { + $errors[] = "maintainer $i: missing handle"; + } + if (empty($m['role'])) { + $errors[] = "maintainer $i: missing role"; + } elseif (!in_array($m['role'], $_PEAR_Common_maintainer_roles)) { + $errors[] = "maintainer $i: invalid role `$m[role]', should be one of: ".implode(' ', $_PEAR_Common_maintainer_roles); + } + if (empty($m['name'])) { + $errors[] = "maintainer $i: missing name"; + } + if (empty($m['email'])) { + $errors[] = "maintainer $i: missing email"; + } + $i++; + } + } + if (!empty($info['deps'])) { + $i = 1; + foreach ($info['deps'] as $d) { + if (empty($d['type'])) { + $errors[] = "depenency $i: missing type"; + } elseif (!in_array($d['type'], $_PEAR_Common_dependency_types)) { + $errors[] = "dependency $i: invalid type, should be one of: ".implode(' ', $_PEAR_Common_depenency_types); + } + if (empty($d['rel'])) { + $errors[] = "dependency $i: missing relation"; + } elseif (!in_array($d['rel'], $_PEAR_Common_dependency_relations)) { + $errors[] = "dependency $i: invalid relation, should be one of: ".implode(' ', $_PEAR_Common_dependency_relations); + } + if ($d['rel'] != 'has' && empty($d['version'])) { + $warnings[] = "dependency $i: missing version"; + } elseif ($d['rel'] == 'has' && !empty($d['version'])) { + $warnings[] = "dependency $i: version ignored for `has' dependencies"; + } + if ($d['type'] == 'php' && !empty($d['name'])) { + $warnings[] = "dependency $i: name ignored for php type dependencies"; + } elseif ($d['type'] != 'php' && empty($d['name'])) { + $errors[] = "dependency $i: missing name"; + } + $i++; + } + } + if (!empty($info['configure_options'])) { + $i = 1; + foreach ($info['configure_options'] as $c) { + if (empty($c['name'])) { + $errors[] = "configure option $i: missing name"; + } + if (empty($c['prompt'])) { + $errors[] = "configure option $i: missing prompt"; + } + } + } + if (empty($info['filelist'])) { + $errors[] = 'no files'; + } else { + foreach ($info['filelist'] as $file => $fa) { + if (empty($fa['role'])) { + $errors[] = "file $file: missing role"; + continue; + } elseif (!in_array($fa['role'], $_PEAR_Common_file_roles)) { + $errors[] = "file $file: invalid role, should be one of: ".implode(' ', $_PEAR_Common_file_roles); + } + if ($fa['role'] == 'php' && $dir_prefix) { + $this->log(1, "Analyzing $file"); + $srcinfo = $this->analyzeSourceCode($dir_prefix . DIRECTORY_SEPARATOR . $file); + if ($srcinfo) { + $this->buildProvidesArray($srcinfo); + } + } + // (ssb) Any checks we can do for baseinstalldir? + // (cox) Perhaps checks that either the target dir and + // baseInstall doesn't cointain "../../" + } + } + $pn = $info['package']; + $pnl = strlen($pn); + foreach ((array)$this->pkginfo['provides'] as $key => $what) { + if (isset($what['explicit'])) { + // skip conformance checks if the provides entry is + // specified in the package.xml file + continue; + } + extract($what); + if ($type == 'class') { + if (!strncasecmp($name, $pn, $pnl)) { + continue; + } + $warnings[] = "in $file: class \"$name\" not prefixed with package name \"$pn\""; + } elseif ($type == 'function') { + if (strstr($name, '::') || !strncasecmp($name, $pn, $pnl)) { + continue; + } + $warnings[] = "in $file: function \"$name\" not prefixed with package name \"$pn\""; + } + //print "$file: provides $what[type] $what[name]\n"; + } + return true; + } + + // }}} + // {{{ buildProvidesArray() + + /** + * Build a "provides" array from data returned by + * analyzeSourceCode(). The format of the built array is like + * this: + * + * array( + * 'class;MyClass' => 'array('type' => 'class', 'name' => 'MyClass'), + * ... + * ) + * + * + * @param array $srcinfo array with information about a source file + * as returned by the analyzeSourceCode() method. + * + * @return void + * + * @access public + * + */ + function buildProvidesArray($srcinfo) + { + foreach ($srcinfo['declared_classes'] as $class) { + $key = "class;$class"; + if (isset($this->pkginfo['provides'][$key])) { + continue; + } + $this->pkginfo['provides'][$key] = + array('type' => 'class', 'name' => $class); + if (isset($srcinfo['inheritance'][$class])) { + $this->pkginfo['provides'][$key]['extends'] = + $srcinfo['inheritance'][$class]; + } + } + foreach ($srcinfo['declared_methods'] as $class => $methods) { + foreach ($methods as $method) { + $function = "$class::$method"; + $key = "function;$function"; + if ($method{0} == '_' || !strcasecmp($method, $class) || + isset($this->pkginfo['provides'][$key])) { + continue; + } + $this->pkginfo['provides'][$key] = + array('type' => 'function', 'name' => $function); + } + } + foreach ($srcinfo['declared_functions'] as $function) { + $key = "function;$function"; + if ($function{0} == '_' || isset($this->pkginfo['provides'][$key])) { + continue; + } + $this->pkginfo['provides'][$key] = + array('type' => 'function', 'name' => $function); + } + } + + // }}} + // {{{ analyzeSourceCode() + + /** + * Analyze the source code of the given PHP file + * + * @param string Filename of the PHP file + * @return mixed + * @access public + */ + function analyzeSourceCode($file) + { + if (!class_exists('G')) { + $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); + $docuroot = explode( '/', $realdocuroot ); + array_pop( $docuroot ); + $pathhome = implode( '/', $docuroot ) . '/'; + array_pop( $docuroot ); + $pathTrunk = implode( '/', $docuroot ) . '/'; + require_once($pathTrunk.'gulliver/system/class.g.php'); + } + + G::LoadSystem('inputfilter'); + $filter = new InputFilter(); + $file = $filter->validateInput($file,"path"); + + if (!function_exists("token_get_all")) { + return false; + } + if (!$fp = @fopen($file, "r")) { + return false; + } + $contents = fread($fp, filesize($file)); + $tokens = token_get_all($contents); +/* + for ($i = 0; $i < sizeof($tokens); $i++) { + @list($token, $data) = $tokens[$i]; + if (is_string($token)) { + var_dump($token); + } else { + print token_name($token) . ' '; + var_dump(rtrim($data)); + } + } +*/ + $look_for = 0; + $paren_level = 0; + $bracket_level = 0; + $brace_level = 0; + $lastphpdoc = ''; + $current_class = ''; + $current_class_level = -1; + $current_function = ''; + $current_function_level = -1; + $declared_classes = array(); + $declared_functions = array(); + $declared_methods = array(); + $used_classes = array(); + $used_functions = array(); + $extends = array(); + $nodeps = array(); + for ($i = 0; $i < sizeof($tokens); $i++) { + if (is_array($tokens[$i])) { + list($token, $data) = $tokens[$i]; + } else { + $token = $tokens[$i]; + $data = ''; + } + switch ($token) { + case T_CURLY_OPEN: + case T_DOLLAR_OPEN_CURLY_BRACES: + case '{': $brace_level++; continue 2; + case '}': + $brace_level--; + if ($current_class_level == $brace_level) { + $current_class = ''; + $current_class_level = -1; + } + if ($current_function_level == $brace_level) { + $current_function = ''; + $current_function_level = -1; + } + continue 2; + case '[': $bracket_level++; continue 2; + case ']': $bracket_level--; continue 2; + case '(': $paren_level++; continue 2; + case ')': $paren_level--; continue 2; + case T_CLASS: + case T_FUNCTION: + case T_NEW: + case T_EXTENDS: + $look_for = $token; + continue 2; + case T_STRING: + if ($look_for == T_CLASS) { + $current_class = $data; + $current_class_level = $brace_level; + $declared_classes[] = $current_class; + } elseif ($look_for == T_EXTENDS) { + $extends[$current_class] = $data; + } elseif ($look_for == T_FUNCTION) { + if ($current_class) { + $current_function = "$current_class::$data"; + $declared_methods[$current_class][] = $data; + } else { + $current_function = $data; + $declared_functions[] = $current_function; + } + $current_function_level = $brace_level; + $m = array(); + } elseif ($look_for == T_NEW) { + $used_classes[$data] = true; + } + $look_for = 0; + continue 2; + case T_VARIABLE: + $look_for = 0; + continue 2; + case T_COMMENT: + if (preg_match('!^/\*\*\s!', $data)) { + $lastphpdoc = $data; + if (preg_match_all('/@nodep\s+(\S+)/', $lastphpdoc, $m)) { + $nodeps = array_merge($nodeps, $m[1]); + } + } + continue 2; + case T_DOUBLE_COLON: + $class = $tokens[$i - 1][1]; + if (strtolower($class) != 'parent') { + $used_classes[$class] = true; + } + continue 2; + } + } + return array( + "declared_classes" => $declared_classes, + "declared_methods" => $declared_methods, + "declared_functions" => $declared_functions, + "used_classes" => array_diff(array_keys($used_classes), $nodeps), + "inheritance" => $extends, + ); + } + + // }}} + // {{{ detectDependencies() + + function detectDependencies($any, $status_callback = null) + { + if (!function_exists("token_get_all")) { + return false; + } + if (PEAR::isError($info = $this->infoFromAny($any))) { + return $this->raiseError($info); + } + if (!is_array($info)) { + return false; + } + $deps = array(); + $used_c = $decl_c = $decl_f = $decl_m = array(); + foreach ($info['filelist'] as $file => $fa) { + $tmp = $this->analyzeSourceCode($file); + $used_c = @array_merge($used_c, $tmp['used_classes']); + $decl_c = @array_merge($decl_c, $tmp['declared_classes']); + $decl_f = @array_merge($decl_f, $tmp['declared_functions']); + $decl_m = @array_merge($decl_m, $tmp['declared_methods']); + $inheri = @array_merge($inheri, $tmp['inheritance']); + } + $used_c = array_unique($used_c); + $decl_c = array_unique($decl_c); + $undecl_c = array_diff($used_c, $decl_c); + return array('used_classes' => $used_c, + 'declared_classes' => $decl_c, + 'declared_methods' => $decl_m, + 'declared_functions' => $decl_f, + 'undeclared_classes' => $undecl_c, + 'inheritance' => $inheri, + ); + } + + // }}} + // {{{ getUserRoles() + + /** + * Get the valid roles for a PEAR package maintainer + * + * @return array + * @static + */ + function getUserRoles() + { + return $GLOBALS['_PEAR_Common_maintainer_roles']; + } + + // }}} + // {{{ getReleaseStates() + + /** + * Get the valid package release states of packages + * + * @return array + * @static + */ + function getReleaseStates() + { + return $GLOBALS['_PEAR_Common_release_states']; + } + + // }}} + // {{{ getDependencyTypes() + + /** + * Get the implemented dependency types (php, ext, pkg etc.) + * + * @return array + * @static + */ + function getDependencyTypes() + { + return $GLOBALS['_PEAR_Common_dependency_types']; + } + + // }}} + // {{{ getDependencyRelations() + + /** + * Get the implemented dependency relations (has, lt, ge etc.) + * + * @return array + * @static + */ + function getDependencyRelations() + { + return $GLOBALS['_PEAR_Common_dependency_relations']; + } + + // }}} + // {{{ getFileRoles() + + /** + * Get the implemented file roles + * + * @return array + * @static + */ + function getFileRoles() + { + return $GLOBALS['_PEAR_Common_file_roles']; + } + + // }}} + // {{{ getReplacementTypes() + + /** + * Get the implemented file replacement types in + * + * @return array + * @static + */ + function getReplacementTypes() + { + return $GLOBALS['_PEAR_Common_replacement_types']; + } + + // }}} + // {{{ getProvideTypes() + + /** + * Get the implemented file replacement types in + * + * @return array + * @static + */ + function getProvideTypes() + { + return $GLOBALS['_PEAR_Common_provide_types']; + } + + // }}} + // {{{ getScriptPhases() + + /** + * Get the implemented file replacement types in + * + * @return array + * @static + */ + function getScriptPhases() + { + return $GLOBALS['_PEAR_Common_script_phases']; + } + + // }}} + // {{{ validPackageName() + + /** + * Test whether a string contains a valid package name. + * + * @param string $name the package name to test + * + * @return bool + * + * @access public + */ + function validPackageName($name) + { + return (bool)preg_match(PEAR_COMMON_PACKAGE_NAME_PREG, $name); + } + + + // }}} + + // {{{ downloadHttp() + + /** + * Download a file through HTTP. Considers suggested file name in + * Content-disposition: header and can run a callback function for + * different events. The callback will be called with two + * parameters: the callback type, and parameters. The implemented + * callback types are: + * + * 'setup' called at the very beginning, parameter is a UI object + * that should be used for all output + * 'message' the parameter is a string with an informational message + * 'saveas' may be used to save with a different file name, the + * parameter is the filename that is about to be used. + * If a 'saveas' callback returns a non-empty string, + * that file name will be used as the filename instead. + * Note that $save_dir will not be affected by this, only + * the basename of the file. + * 'start' download is starting, parameter is number of bytes + * that are expected, or -1 if unknown + * 'bytesread' parameter is the number of bytes read so far + * 'done' download is complete, parameter is the total number + * of bytes read + * 'connfailed' if the TCP connection fails, this callback is called + * with array(host,port,errno,errmsg) + * 'writefailed' if writing to disk fails, this callback is called + * with array(destfile,errmsg) + * + * If an HTTP proxy has been configured (http_proxy PEAR_Config + * setting), the proxy will be used. + * + * @param string $url the URL to download + * @param object $ui PEAR_Frontend_* instance + * @param object $config PEAR_Config instance + * @param string $save_dir (optional) directory to save file in + * @param mixed $callback (optional) function/method to call for status + * updates + * + * @return string Returns the full path of the downloaded file or a PEAR + * error on failure. If the error is caused by + * socket-related errors, the error object will + * have the fsockopen error code available through + * getCode(). + * + * @access public + */ + function downloadHttp($url, &$ui, $save_dir = '.', $callback = null) + { + if ($callback) { + call_user_func($callback, 'setup', array(&$ui)); + } + if (preg_match('!^http://([^/:?#]*)(:(\d+))?(/.*)!', $url, $matches)) { + list(,$host,,$port,$path) = $matches; + } + if (isset($this)) { + $config = &$this->config; + } else { + $config = &PEAR_Config::singleton(); + } + $proxy_host = $proxy_port = $proxy_user = $proxy_pass = ''; + if ($proxy = parse_url($config->get('http_proxy'))) { + $proxy_host = @$proxy['host']; + $proxy_port = @$proxy['port']; + $proxy_user = @$proxy['user']; + $proxy_pass = @$proxy['pass']; + + if ($proxy_port == '') { + $proxy_port = 8080; + } + if ($callback) { + call_user_func($callback, 'message', "Using HTTP proxy $host:$port"); + } + } + if (empty($port)) { + $port = 80; + } + if ($proxy_host != '') { + $fp = @fsockopen($proxy_host, $proxy_port, $errno, $errstr); + if (!$fp) { + if ($callback) { + call_user_func($callback, 'connfailed', array($proxy_host, $proxy_port, + $errno, $errstr)); + } + return PEAR::raiseError("Connection to `$proxy_host:$proxy_port' failed: $errstr", $errno); + } + $request = "GET $url HTTP/1.0\r\n"; + } else { + $fp = @fsockopen($host, $port, $errno, $errstr); + if (!$fp) { + if ($callback) { + call_user_func($callback, 'connfailed', array($host, $port, + $errno, $errstr)); + } + return PEAR::raiseError("Connection to `$host:$port' failed: $errstr", $errno); + } + $request = "GET $path HTTP/1.0\r\n"; + } + $request .= "Host: $host:$port\r\n". + "User-Agent: PHP/".PHP_VERSION."\r\n"; + if ($proxy_host != '' && $proxy_user != '') { + $request .= 'Proxy-Authorization: Basic ' . + base64_encode($proxy_user . ':' . $proxy_pass) . "\r\n"; + } + $request .= "\r\n"; + fwrite($fp, $request); + $headers = array(); + while (trim($line = fgets($fp, 1024))) { + if (preg_match('/^([^:]+):\s+(.*)\s*$/', $line, $matches)) { + $headers[strtolower($matches[1])] = trim($matches[2]); + } elseif (preg_match('|^HTTP/1.[01] ([0-9]{3}) |', $line, $matches)) { + if ($matches[1] != 200) { + return PEAR::raiseError("File http://$host:$port$path not valid (received: $line)"); + } + } + } + if (isset($headers['content-disposition']) && + preg_match('/\sfilename=\"([^;]*\S)\"\s*(;|$)/', $headers['content-disposition'], $matches)) { + $save_as = basename($matches[1]); + } else { + $save_as = basename($url); + } + if ($callback) { + $tmp = call_user_func($callback, 'saveas', $save_as); + if ($tmp) { + $save_as = $tmp; + } + } + $dest_file = $save_dir . DIRECTORY_SEPARATOR . $save_as; + if (!class_exists('G')) { + $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); + $docuroot = explode( '/', $realdocuroot ); + array_pop( $docuroot ); + $pathhome = implode( '/', $docuroot ) . '/'; + array_pop( $docuroot ); + $pathTrunk = implode( '/', $docuroot ) . '/'; + require_once($pathTrunk.'gulliver/system/class.g.php'); + } + + G::LoadSystem('inputfilter'); + $filter = new InputFilter(); + $dest_file = $filter->validateInput($dest_file,"path"); + + if (!$wp = @fopen($dest_file, 'wb')) { + fclose($fp); + if ($callback) { + call_user_func($callback, 'writefailed', array($dest_file, $php_errormsg)); + } + return PEAR::raiseError("could not open $dest_file for writing"); + } + if (isset($headers['content-length'])) { + $length = $headers['content-length']; + } else { + $length = -1; + } + $bytes = 0; + if ($callback) { + call_user_func($callback, 'start', $length); + } + while ($data = @fread($fp, 1024)) { + $bytes += strlen($data); + if ($callback) { + call_user_func($callback, 'bytesread', $bytes); + } + if (!@fwrite($wp, $data)) { + fclose($fp); + if ($callback) { + call_user_func($callback, 'writefailed', array($dest_file, $php_errormsg)); + } + return PEAR::raiseError("$dest_file: write failed ($php_errormsg)"); + } + } + fclose($fp); + fclose($wp); + if ($callback) { + call_user_func($callback, 'done', $bytes); + } + return $dest_file; + } + + // }}} +} + +?> diff --git a/thirdparty/pear/PEAR/Config.php b/thirdparty/pear/PEAR/Config.php new file mode 100644 index 000000000..6cc2e40f4 --- /dev/null +++ b/thirdparty/pear/PEAR/Config.php @@ -0,0 +1,1139 @@ + | +// +----------------------------------------------------------------------+ +// +// $Id: Config.php,v 1.43 2003/03/18 12:06:06 ssb Exp $ + +require_once 'PEAR.php'; +require_once 'System.php'; + +/** + * Last created PEAR_Config instance. + * @var object + */ +$GLOBALS['_PEAR_Config_instance'] = null; + +// Below we define constants with default values for all configuration +// parameters except username/password. All of them can have their +// defaults set through environment variables. The reason we use the +// PHP_ prefix is for some security, PHP protects environment +// variables starting with PHP_*. + +if (getenv('PHP_PEAR_SYSCONF_DIR')) { + define('PEAR_CONFIG_SYSCONFDIR', getenv('PHP_PEAR_SYSCONF_DIR')); +} elseif (getenv('SystemRoot')) { + define('PEAR_CONFIG_SYSCONFDIR', getenv('SystemRoot')); +} else { + define('PEAR_CONFIG_SYSCONFDIR', PHP_SYSCONFDIR); +} + +// Default for master_server +if (getenv('PHP_PEAR_MASTER_SERVER')) { + define('PEAR_CONFIG_DEFAULT_MASTER_SERVER', getenv('PHP_PEAR_MASTER_SERVER')); +} else { + define('PEAR_CONFIG_DEFAULT_MASTER_SERVER', 'pear.php.net'); +} + +// Default for http_proxy +if (getenv('PHP_PEAR_HTTP_PROXY')) { + define('PEAR_CONFIG_DEFAULT_HTTP_PROXY', getenv('PHP_PEAR_HTTP_PROXY')); +} elseif (getenv('http_proxy')) { + define('PEAR_CONFIG_DEFAULT_HTTP_PROXY', getenv('http_proxy')); +} else { + define('PEAR_CONFIG_DEFAULT_HTTP_PROXY', ''); +} + +// Default for php_dir +if (getenv('PHP_PEAR_INSTALL_DIR')) { + define('PEAR_CONFIG_DEFAULT_PHP_DIR', getenv('PHP_PEAR_INSTALL_DIR')); +} else { + if (@is_dir(PEAR_INSTALL_DIR.DIRECTORY_SEPARATOR.'lib')) { + define('PEAR_CONFIG_DEFAULT_PHP_DIR', + PEAR_INSTALL_DIR.DIRECTORY_SEPARATOR.'lib'); + } else { + define('PEAR_CONFIG_DEFAULT_PHP_DIR', PEAR_INSTALL_DIR); + } +} + +// Default for ext_dir +if (getenv('PHP_PEAR_EXTENSION_DIR')) { + define('PEAR_CONFIG_DEFAULT_EXT_DIR', getenv('PHP_PEAR_EXTENSION_DIR')); +} else { + define('PEAR_CONFIG_DEFAULT_EXT_DIR', ini_get('extension_dir')); +} + +// Default for doc_dir +if (getenv('PHP_PEAR_DOC_DIR')) { + define('PEAR_CONFIG_DEFAULT_DOC_DIR', getenv('PHP_PEAR_DOC_DIR')); +} else { + define('PEAR_CONFIG_DEFAULT_DOC_DIR', + PEAR_INSTALL_DIR.DIRECTORY_SEPARATOR.'docs'); +} + +// Default for bin_dir +if (getenv('PHP_PEAR_BIN_DIR')) { + define('PEAR_CONFIG_DEFAULT_BIN_DIR', getenv('PHP_PEAR_BIN_DIR')); +} else { + define('PEAR_CONFIG_DEFAULT_BIN_DIR', PHP_BINDIR); +} + +// Default for data_dir +if (getenv('PHP_PEAR_DATA_DIR')) { + define('PEAR_CONFIG_DEFAULT_DATA_DIR', getenv('PHP_PEAR_DATA_DIR')); +} else { + define('PEAR_CONFIG_DEFAULT_DATA_DIR', + PEAR_INSTALL_DIR.DIRECTORY_SEPARATOR.'data'); +} + +// Default for test_dir +if (getenv('PHP_PEAR_TEST_DIR')) { + define('PEAR_CONFIG_DEFAULT_TEST_DIR', getenv('PHP_PEAR_TEST_DIR')); +} else { + define('PEAR_CONFIG_DEFAULT_TEST_DIR', + PEAR_INSTALL_DIR.DIRECTORY_SEPARATOR.'tests'); +} + +// Default for cache_dir +if (getenv('PHP_PEAR_CACHE_DIR')) { + define('PEAR_CONFIG_DEFAULT_CACHE_DIR', getenv('PHP_PEAR_CACHE_DIR')); +} else { + define('PEAR_CONFIG_DEFAULT_CACHE_DIR', + System::tmpdir() . DIRECTORY_SEPARATOR . 'pear' . + DIRECTORY_SEPARATOR . 'cache'); +} + +// Default for php_bin +if (getenv('PHP_PEAR_PHP_BIN')) { + define('PEAR_CONFIG_DEFAULT_PHP_BIN', getenv('PHP_PEAR_PHP_BIN')); +} else { + define('PEAR_CONFIG_DEFAULT_PHP_BIN', PEAR_CONFIG_DEFAULT_BIN_DIR. + DIRECTORY_SEPARATOR.'php'.(OS_WINDOWS ? '.exe' : '')); +} + +// Default for verbose +if (getenv('PHP_PEAR_VERBOSE')) { + define('PEAR_CONFIG_DEFAULT_VERBOSE', getenv('PHP_PEAR_VERBOSE')); +} else { + define('PEAR_CONFIG_DEFAULT_VERBOSE', 1); +} + +// Default for preferred_state +if (getenv('PHP_PEAR_PREFERRED_STATE')) { + define('PEAR_CONFIG_DEFAULT_PREFERRED_STATE', getenv('PHP_PEAR_PREFERRED_STATE')); +} else { + define('PEAR_CONFIG_DEFAULT_PREFERRED_STATE', 'stable'); +} + +// Default for umask +if (getenv('PHP_PEAR_UMASK')) { + define('PEAR_CONFIG_DEFAULT_UMASK', getenv('PHP_PEAR_UMASK')); +} else { + define('PEAR_CONFIG_DEFAULT_UMASK', decoct(umask())); +} + +// Default for cache_ttl +if (getenv('PHP_PEAR_CACHE_TTL')) { + define('PEAR_CONFIG_DEFAULT_CACHE_TTL', getenv('PHP_PEAR_CACHE_TTL')); +} else { + define('PEAR_CONFIG_DEFAULT_CACHE_TTL', 3600); +} + +// Default for sig_type +if (getenv('PHP_PEAR_SIG_TYPE')) { + define('PEAR_CONFIG_DEFAULT_SIG_TYPE', getenv('PHP_PEAR_SIG_TYPE')); +} else { + define('PEAR_CONFIG_DEFAULT_SIG_TYPE', 'gpg'); +} + +// Default for sig_bin +if (getenv('PHP_PEAR_SIG_BIN')) { + define('PEAR_CONFIG_DEFAULT_SIG_BIN', getenv('PHP_PEAR_SIG_BIN')); +} else { + define('PEAR_CONFIG_DEFAULT_SIG_BIN', + System::which( + 'gpg', OS_WINDOWS ? 'c:\gnupg\gpg.exe' : '/usr/local/bin/gpg')); +} + +// Default for sig_keydir +if (getenv('PHP_PEAR_SIG_KEYDIR')) { + define('PEAR_CONFIG_DEFAULT_SIG_KEYDIR', getenv('PHP_PEAR_SIG_KEYDIR')); +} else { + define('PEAR_CONFIG_DEFAULT_SIG_KEYDIR', + PEAR_CONFIG_SYSCONFDIR . DIRECTORY_SEPARATOR . 'pearkeys'); +} + +/** + * This is a class for storing configuration data, keeping track of + * which are system-defined, user-defined or defaulted. + */ +class PEAR_Config extends PEAR +{ + // {{{ properties + + /** + * Array of config files used. + * + * @var array layer => config file + */ + var $files = array( + 'system' => '', + 'user' => '', + ); + + var $layers = array(); + + /** + * Configuration data, two-dimensional array where the first + * dimension is the config layer ('user', 'system' and 'default'), + * and the second dimension is keyname => value. + * + * The order in the first dimension is important! Earlier + * layers will shadow later ones when a config value is + * requested (if a 'user' value exists, it will be returned first, + * then 'system' and finally 'default'). + * + * @var array layer => array(keyname => value, ...) + */ + var $configuration = array( + 'user' => array(), + 'system' => array(), + 'default' => array(), + ); + + /** + * Information about the configuration data. Stores the type, + * default value and a documentation string for each configuration + * value. + * + * @var array layer => array(infotype => value, ...) + */ + var $configuration_info = array( + // Internet Access + 'master_server' => array( + 'type' => 'string', + 'default' => 'pear.php.net', + 'doc' => 'name of the main PEAR server', + 'prompt' => 'PEAR server', + 'group' => 'Internet Access', + ), + 'http_proxy' => array( + 'type' => 'string', + 'default' => PEAR_CONFIG_DEFAULT_HTTP_PROXY, + 'doc' => 'HTTP proxy (host:port) to use when downloading packages', + 'prompt' => 'HTTP Proxy Server Address', + 'group' => 'Internet Access', + ), + // File Locations + 'php_dir' => array( + 'type' => 'directory', + 'default' => PEAR_CONFIG_DEFAULT_PHP_DIR, + 'doc' => 'directory where .php files are installed', + 'prompt' => 'PEAR directory', + 'group' => 'File Locations', + ), + 'ext_dir' => array( + 'type' => 'directory', + 'default' => PEAR_CONFIG_DEFAULT_EXT_DIR, + 'doc' => 'directory where loadable extensions are installed', + 'prompt' => 'PHP extension directory', + 'group' => 'File Locations', + ), + 'doc_dir' => array( + 'type' => 'directory', + 'default' => PEAR_CONFIG_DEFAULT_DOC_DIR, + 'doc' => 'directory where documentation is installed', + 'prompt' => 'PEAR documentation directory', + 'group' => 'File Locations', + ), + 'bin_dir' => array( + 'type' => 'directory', + 'default' => PEAR_CONFIG_DEFAULT_BIN_DIR, + 'doc' => 'directory where executables are installed', + 'prompt' => 'PEAR executables directory', + 'group' => 'File Locations', + ), + 'data_dir' => array( + 'type' => 'directory', + 'default' => PEAR_CONFIG_DEFAULT_DATA_DIR, + 'doc' => 'directory where data files are installed', + 'prompt' => 'PEAR data directory', + 'group' => 'File Locations (Advanced)', + ), + 'test_dir' => array( + 'type' => 'directory', + 'default' => PEAR_CONFIG_DEFAULT_TEST_DIR, + 'doc' => 'directory where regression tests are installed', + 'prompt' => 'PEAR test directory', + 'group' => 'File Locations (Advanced)', + ), + 'cache_dir' => array( + 'type' => 'directory', + 'default' => PEAR_CONFIG_DEFAULT_CACHE_DIR, + 'doc' => 'directory which is used for XMLRPC cache', + 'prompt' => 'PEAR Installer cache directory', + 'group' => 'File Locations (Advanced)', + ), + 'php_bin' => array( + 'type' => 'file', + 'default' => PEAR_CONFIG_DEFAULT_PHP_BIN, + 'doc' => 'PHP CLI/CGI binary for executing scripts', + 'prompt' => 'PHP CLI/CGI binary', + 'group' => 'File Locations (Advanced)', + ), + // Maintainers + 'username' => array( + 'type' => 'string', + 'default' => '', + 'doc' => '(maintainers) your PEAR account name', + 'prompt' => 'PEAR username (for maintainers)', + 'group' => 'Maintainers', + ), + 'password' => array( + 'type' => 'password', + 'default' => '', + 'doc' => '(maintainers) your PEAR account password', + 'prompt' => 'PEAR password (for maintainers)', + 'group' => 'Maintainers', + ), + // Advanced + 'verbose' => array( + 'type' => 'integer', + 'default' => PEAR_CONFIG_DEFAULT_VERBOSE, + 'doc' => 'verbosity level +0: really quiet +1: somewhat quiet +2: verbose +3: debug', + 'prompt' => 'Debug Log Level', + 'group' => 'Advanced', + ), + 'preferred_state' => array( + 'type' => 'set', + 'default' => PEAR_CONFIG_DEFAULT_PREFERRED_STATE, + 'doc' => 'the installer will prefer releases with this state when installing packages without a version or state specified', + 'valid_set' => array( + 'stable', 'beta', 'alpha', 'devel', 'snapshot'), + 'prompt' => 'Preferred Package State', + 'group' => 'Advanced', + ), + 'umask' => array( + 'type' => 'mask', + 'default' => PEAR_CONFIG_DEFAULT_UMASK, + 'doc' => 'umask used when creating files (Unix-like systems only)', + 'prompt' => 'Unix file mask', + 'group' => 'Advanced', + ), + 'cache_ttl' => array( + 'type' => 'integer', + 'default' => PEAR_CONFIG_DEFAULT_CACHE_TTL, + 'doc' => 'amount of secs where the local cache is used and not updated', + 'prompt' => 'Cache TimeToLive', + 'group' => 'Advanced', + ), + 'sig_type' => array( + 'type' => 'set', + 'default' => PEAR_CONFIG_DEFAULT_SIG_TYPE, + 'doc' => 'which package signature mechanism to use', + 'valid_set' => array('gpg'), + 'prompt' => 'Package Signature Type', + 'group' => 'Maintainers', + ), + 'sig_bin' => array( + 'type' => 'string', + 'default' => PEAR_CONFIG_DEFAULT_SIG_BIN, + 'doc' => 'which package signature mechanism to use', + 'prompt' => 'Signature Handling Program', + 'group' => 'Maintainers', + ), + 'sig_keyid' => array( + 'type' => 'string', + 'default' => '', + 'doc' => 'which key to use for signing with', + 'prompt' => 'Signature Key Id', + 'group' => 'Maintainers', + ), + 'sig_keydir' => array( + 'type' => 'string', + 'default' => PEAR_CONFIG_DEFAULT_SIG_KEYDIR, + 'doc' => 'which package signature mechanism to use', + 'prompt' => 'Signature Key Directory', + 'group' => 'Maintainers', + ), + ); + + // }}} + + // {{{ PEAR_Config([file], [defaults_file]) + + /** + * Constructor. + * + * @param string (optional) file to read user-defined options from + * @param string (optional) file to read system-wide defaults from + * + * @access public + * + * @see PEAR_Config::singleton + */ + function PEAR_Config($user_file = '', $system_file = '') + { + $this->PEAR(); + $sl = DIRECTORY_SEPARATOR; + if (empty($user_file)) { + if (OS_WINDOWS) { + $user_file = PEAR_CONFIG_SYSCONFDIR . $sl . 'pear.ini'; + } else { + $user_file = getenv('HOME') . $sl . '.pearrc'; + } + } + if (empty($system_file)) { + if (OS_WINDOWS) { + $system_file = PEAR_CONFIG_SYSCONFDIR . $sl . 'pearsys.ini'; + } else { + $system_file = PEAR_CONFIG_SYSCONFDIR . $sl . 'pear.conf'; + } + } + $this->layers = array_keys($this->configuration); + $this->files['user'] = $user_file; + $this->files['system'] = $system_file; + if ($user_file && file_exists($user_file)) { + $this->readConfigFile($user_file); + } + if ($system_file && file_exists($system_file)) { + $this->mergeConfigFile($system_file, false, 'system'); + } + foreach ($this->configuration_info as $key => $info) { + $this->configuration['default'][$key] = $info['default']; + } + //$GLOBALS['_PEAR_Config_instance'] = &$this; + } + + // }}} + // {{{ singleton([file], [defaults_file]) + + /** + * Static singleton method. If you want to keep only one instance + * of this class in use, this method will give you a reference to + * the last created PEAR_Config object if one exists, or create a + * new object. + * + * @param string (optional) file to read user-defined options from + * @param string (optional) file to read system-wide defaults from + * + * @return object an existing or new PEAR_Config instance + * + * @access public + * + * @see PEAR_Config::PEAR_Config + */ + function &singleton($user_file = '', $system_file = '') + { + if (is_object($GLOBALS['_PEAR_Config_instance'])) { + return $GLOBALS['_PEAR_Config_instance']; + } + $GLOBALS['_PEAR_Config_instance'] = + &new PEAR_Config($user_file, $system_file); + return $GLOBALS['_PEAR_Config_instance']; + } + + // }}} + // {{{ readConfigFile([file], [layer]) + + /** + * Reads configuration data from a file. All existing values in + * the config layer are discarded and replaced with data from the + * file. + * + * @param string (optional) file to read from, if NULL or not + * specified, the last-used file for the same layer (second param) + * is used + * + * @param string (optional) config layer to insert data into + * ('user' or 'system') + * + * @return bool TRUE on success or a PEAR error on failure + * + * @access public + */ + function readConfigFile($file = null, $layer = 'user') + { + if (empty($this->files[$layer])) { + return $this->raiseError("unknown config file type `$layer'"); + } + if ($file === null) { + $file = $this->files[$layer]; + } + $data = $this->_readConfigDataFrom($file); + if (PEAR::isError($data)) { + return $data; + } + $this->_decodeInput($data); + $this->configuration[$layer] = $data; + return true; + } + + // }}} + // {{{ mergeConfigFile(file, [override], [layer]) + + /** + * Merges data into a config layer from a file. Does the same + * thing as readConfigFile, except it does not replace all + * existing values in the config layer. + * + * @param string file to read from + * + * @param bool (optional) whether to overwrite existing data + * (default TRUE) + * + * @param string config layer to insert data into ('user' or + * 'system') + * + * @return bool TRUE on success or a PEAR error on failure + * + * @access public. + */ + function mergeConfigFile($file, $override = true, $layer = 'user') + { + if (empty($this->files[$layer])) { + return $this->raiseError("unknown config file type `$layer'"); + } + if ($file === null) { + $file = $this->files[$layer]; + } + $data = $this->_readConfigDataFrom($file); + if (PEAR::isError($data)) { + return $data; + } + $this->_decodeInput($data); + if ($override) { + $this->configuration[$layer] = array_merge($this->configuration[$layer], $data); + } else { + $this->configuration[$layer] = array_merge($data, $this->configuration[$layer]); + } + return true; + } + + // }}} + // {{{ writeConfigFile([file], [layer]) + + /** + * Writes data into a config layer from a file. + * + * @param string file to read from + * + * @param bool (optional) whether to overwrite existing data + * (default TRUE) + * + * @param string config layer to insert data into ('user' or + * 'system') + * + * @return bool TRUE on success or a PEAR error on failure + * + * @access public. + */ + function writeConfigFile($file = null, $layer = 'user') + { + if ($layer == 'both' || $layer == 'all') { + foreach ($this->files as $type => $file) { + $err = $this->writeConfigFile($file, $type); + if (PEAR::isError($err)) { + return $err; + } + } + return true; + } + if (empty($this->files[$layer])) { + return $this->raiseError("unknown config file type `$layer'"); + } + if ($file === null) { + $file = $this->files[$layer]; + } + $data = $this->configuration[$layer]; + $this->_encodeOutput($data); + if (!@System::mkDir("-p " . dirname($file))) { + return $this->raiseError("could not create directory: " . dirname($file)); + } + if (@is_file($file) && !@is_writeable($file)) { + return $this->raiseError("no write access to $file!"); + } + $fp = @fopen($file, "w"); + if (!$fp) { + return $this->raiseError("PEAR_Config::writeConfigFile fopen('$file','w') failed"); + } + $contents = "#PEAR_Config 0.9\n" . serialize($data); + if (!@fwrite($fp, $contents)) { + return $this->raiseError("PEAR_Config::writeConfigFile: fwrite failed"); + } + return true; + } + + // }}} + // {{{ _readConfigDataFrom(file) + + /** + * Reads configuration data from a file and returns the parsed data + * in an array. + * + * @param string file to read from + * + * @return array configuration data or a PEAR error on failure + * + * @access private + */ + function _readConfigDataFrom($file) + { + $fp = @fopen($file, "r"); + if (!$fp) { + return $this->raiseError("PEAR_Config::readConfigFile fopen('$file','r') failed"); + } + $size = filesize($file); + $contents = fread($fp, $size); + fclose($fp); + $version = '0.1'; + if (preg_match('/^#PEAR_Config\s+(\S+)\s+/si', $contents, $matches)) { + $version = $matches[1]; + $contents = substr($contents, strlen($matches[0])); + } + if (version_compare("$version", '1', '<')) { + $data = unserialize($contents); + if (!is_array($data)) { + if (strlen(trim($contents)) > 0) { + $error = "PEAR_Config: bad data in $file"; +// if (isset($this)) { + return $this->raiseError($error); +// } else { +// return PEAR::raiseError($error); + } else { + $data = array(); + } + } + // add parsing of newer formats here... + } else { + return $this->raiseError("$file: unknown version `$version'"); + } + return $data; + } + + // }}} + // {{{ _encodeOutput(&data) + + /** + * Encodes/scrambles configuration data before writing to files. + * Currently, 'password' values will be base64-encoded as to avoid + * that people spot cleartext passwords by accident. + * + * @param array (reference) array to encode values in + * + * @return bool TRUE on success + * + * @access private + */ + function _encodeOutput(&$data) + { + foreach ($data as $key => $value) { + if (!isset($this->configuration_info[$key])) { + continue; + } + $type = $this->configuration_info[$key]['type']; + switch ($type) { + // we base64-encode passwords so they are at least + // not shown in plain by accident + case 'password': { + $data[$key] = base64_encode($data[$key]); + break; + } + case 'mask': { + $data[$key] = octdec($data[$key]); + break; + } + } + } + return true; + } + + // }}} + // {{{ _decodeInput(&data) + + /** + * Decodes/unscrambles configuration data after reading from files. + * + * @param array (reference) array to encode values in + * + * @return bool TRUE on success + * + * @access private + * + * @see PEAR_Config::_encodeOutput + */ + function _decodeInput(&$data) + { + if (!is_array($data)) { + return true; + } + foreach ($data as $key => $value) { + if (!isset($this->configuration_info[$key])) { + continue; + } + $type = $this->configuration_info[$key]['type']; + switch ($type) { + case 'password': { + $data[$key] = base64_decode($data[$key]); + break; + } + case 'mask': { + $data[$key] = decoct($data[$key]); + break; + } + } + } + return true; + } + + // }}} + // {{{ get(key, [layer]) + + /** + * Returns a configuration value, prioritizing layers as per the + * layers property. + * + * @param string config key + * + * @return mixed the config value, or NULL if not found + * + * @access public + */ + function get($key, $layer = null) + { + if ($layer === null) { + foreach ($this->layers as $layer) { + if (isset($this->configuration[$layer][$key])) { + return $this->configuration[$layer][$key]; + } + } + } elseif (isset($this->configuration[$layer][$key])) { + return $this->configuration[$layer][$key]; + } + return null; + } + + // }}} + // {{{ set(key, value, [layer]) + + /** + * Set a config value in a specific layer (defaults to 'user'). + * Enforces the types defined in the configuration_info array. An + * integer config variable will be cast to int, and a set config + * variable will be validated against its legal values. + * + * @param string config key + * + * @param string config value + * + * @param string (optional) config layer + * + * @return bool TRUE on success, FALSE on failure + * + * @access public + */ + function set($key, $value, $layer = 'user') + { + if (empty($this->configuration_info[$key])) { + return false; + } + extract($this->configuration_info[$key]); + switch ($type) { + case 'integer': + $value = (int)$value; + break; + case 'set': { + // If a valid_set is specified, require the value to + // be in the set. If there is no valid_set, accept + // any value. + if ($valid_set) { + reset($valid_set); + if ((key($valid_set) === 0 && !in_array($value, $valid_set)) || + (key($valid_set) !== 0 && empty($valid_set[$value]))) + { + return false; + } + } + break; + } + } + $this->configuration[$layer][$key] = $value; + return true; + } + + // }}} + // {{{ getType(key) + + /** + * Get the type of a config value. + * + * @param string config key + * + * @return string type, one of "string", "integer", "file", + * "directory", "set" or "password". + * + * @access public + * + */ + function getType($key) + { + if (isset($this->configuration_info[$key])) { + return $this->configuration_info[$key]['type']; + } + return false; + } + + // }}} + // {{{ getDocs(key) + + /** + * Get the documentation for a config value. + * + * @param string config key + * + * @return string documentation string + * + * @access public + * + */ + function getDocs($key) + { + if (isset($this->configuration_info[$key])) { + return $this->configuration_info[$key]['doc']; + } + return false; + } + // }}} + // {{{ getPrompt(key) + + /** + * Get the short documentation for a config value. + * + * @param string config key + * + * @return string short documentation string + * + * @access public + * + */ + function getPrompt($key) + { + if (isset($this->configuration_info[$key])) { + return $this->configuration_info[$key]['prompt']; + } + return false; + } + // }}} + // {{{ getGroup(key) + + /** + * Get the parameter group for a config key. + * + * @param string config key + * + * @return string parameter group + * + * @access public + * + */ + function getGroup($key) + { + if (isset($this->configuration_info[$key])) { + return $this->configuration_info[$key]['group']; + } + return false; + } + + // }}} + // {{{ getGroups() + + /** + * Get the list of parameter groups. + * + * @return array list of parameter groups + * + * @access public + * + */ + function getGroups() + { + $tmp = array(); + foreach ($this->configuration_info as $key => $info) { + $tmp[$info['group']] = 1; + } + return array_keys($tmp); + } + + // }}} + // {{{ getGroupKeys() + + /** + * Get the list of the parameters in a group. + * + * @param string $group parameter group + * + * @return array list of parameters in $group + * + * @access public + * + */ + function getGroupKeys($group) + { + $keys = array(); + foreach ($this->configuration_info as $key => $info) { + if ($info['group'] == $group) { + $keys[] = $key; + } + } + return $keys; + } + + // }}} + // {{{ getSetValues(key) + + /** + * Get the list of allowed set values for a config value. Returns + * NULL for config values that are not sets. + * + * @param string config key + * + * @return array enumerated array of set values, or NULL if the + * config key is unknown or not a set + * + * @access public + * + */ + function getSetValues($key) + { + if (isset($this->configuration_info[$key]) && + isset($this->configuration_info[$key]['type']) && + $this->configuration_info[$key]['type'] == 'set') + { + $valid_set = $this->configuration_info[$key]['valid_set']; + reset($valid_set); + if (key($valid_set) === 0) { + return $valid_set; + } + return array_keys($valid_set); + } + return false; + } + + // }}} + // {{{ getKeys() + + /** + * Get all the current config keys. + * + * @return array simple array of config keys + * + * @access public + */ + function getKeys() + { + $keys = array(); + foreach ($this->layers as $layer) { + $keys = array_merge($keys, $this->configuration[$layer]); + } + return array_keys($keys); + } + + // }}} + // {{{ remove(key, [layer]) + + /** + * Remove the a config key from a specific config layer. + * + * @param string config key + * + * @param string (optional) config layer + * + * @return bool TRUE on success, FALSE on failure + * + * @access public + */ + function remove($key, $layer = 'user') + { + if (isset($this->configuration[$layer][$key])) { + unset($this->configuration[$layer][$key]); + return true; + } + return false; + } + + // }}} + // {{{ removeLayer(layer) + + /** + * Temporarily remove an entire config layer. USE WITH CARE! + * + * @param string config key + * + * @param string (optional) config layer + * + * @return bool TRUE on success, FALSE on failure + * + * @access public + */ + function removeLayer($layer) + { + if (isset($this->configuration[$layer])) { + unset($this->configuration[$layer]); + return true; + } + return false; + } + + // }}} + // {{{ store([layer]) + + /** + * Stores configuration data in a layer. + * + * @param string config layer to store + * + * @return bool TRUE on success, or PEAR error on failure + * + * @access public + */ + function store($layer = 'user') + { + return $this->writeConfigFile(null, $layer); + } + + // }}} + // {{{ toDefault(key) + + /** + * Unset the user-defined value of a config key, reverting the + * value to the system-defined one. + * + * @param string config key + * + * @return bool TRUE on success, FALSE on failure + * + * @access public + */ + function toDefault($key) + { + trigger_error("PEAR_Config::toDefault() deprecated, use PEAR_Config::remove() instead", E_USER_NOTICE); + return $this->remove($key, 'user'); + } + + // }}} + // {{{ definedBy(key) + + /** + * Tells what config layer that gets to define a key. + * + * @param string config key + * + * @return string the config layer, or an empty string if not found + * + * @access public + */ + function definedBy($key) + { + foreach ($this->layers as $layer) { + if (isset($this->configuration[$layer][$key])) { + return $layer; + } + } + return ''; + } + + // }}} + // {{{ isDefaulted(key) + + /** + * Tells whether a config value has a system-defined value. + * + * @param string config key + * + * @return bool + * + * @access public + * + * @deprecated + */ + function isDefaulted($key) + { + trigger_error("PEAR_Config::isDefaulted() deprecated, use PEAR_Config::definedBy() instead", E_USER_NOTICE); + return $this->definedBy($key) == 'system'; + } + + // }}} + // {{{ isDefined(key) + + /** + * Tells whether a given key exists as a config value. + * + * @param string config key + * + * @return bool whether exists in this object + * + * @access public + */ + function isDefined($key) + { + foreach ($this->layers as $layer) { + if (isset($this->configuration[$layer][$key])) { + return true; + } + } + return false; + } + + // }}} + // {{{ isDefinedLayer(key) + + /** + * Tells whether a given config layer exists. + * + * @param string config layer + * + * @return bool whether exists in this object + * + * @access public + */ + function isDefinedLayer($layer) + { + return isset($this->configuration[$layer]); + } + + // }}} + // {{{ getLayers() + + /** + * Returns the layers defined (except the 'default' one) + * + * @return array of the defined layers + */ + function getLayers() + { + $cf = $this->configuration; + unset($cf['default']); + return array_keys($cf); + } + + // }}} +} + +?> diff --git a/thirdparty/pear/PEAR/Dependency.php b/thirdparty/pear/PEAR/Dependency.php new file mode 100644 index 000000000..b4ae1599f --- /dev/null +++ b/thirdparty/pear/PEAR/Dependency.php @@ -0,0 +1,356 @@ + | +// | Stig Bakken | +// +----------------------------------------------------------------------+ +// +// $Id: Dependency.php,v 1.20 2003/05/15 19:44:32 mj Exp $ + +require_once "PEAR.php"; + +define('PEAR_DEPENDENCY_MISSING', -1); +define('PEAR_DEPENDENCY_CONFLICT', -2); +define('PEAR_DEPENDENCY_UPGRADE_MINOR', -3); +define('PEAR_DEPENDENCY_UPGRADE_MAJOR', -4); +define('PEAR_DEPENDENCY_BAD_DEPENDENCY', -5); + +/** + * Dependency check for PEAR packages + * + * The class is based on the dependency RFC that can be found at + * http://cvs.php.net/cvs.php/pearweb/rfc. It requires PHP >= 4.1 + * + * @author Tomas V.V.Vox + * @author Stig Bakken + */ +class PEAR_Dependency +{ + /** + * Constructor + * + * @access public + * @param object Registry object + * @return void + */ + function PEAR_Dependency(&$registry) + { + $this->registry = &$registry; + } + + /** + * This method maps the XML dependency definition to the + * corresponding one from PEAR_Dependency + * + * $opts => Array + * ( + * [type] => pkg + * [rel] => ge + * [version] => 3.4 + * [name] => HTML_Common + * ) + * + * @param string Error message + * @param array Options + * @return boolean + */ + function callCheckMethod(&$errmsg, $opts) + { + $rel = isset($opts['rel']) ? $opts['rel'] : 'has'; + $req = isset($opts['version']) ? $opts['version'] : null; + $name = isset($opts['name']) ? $opts['name'] : null; + $errmsg = ''; + switch ($opts['type']) { + case 'pkg': + return $this->checkPackage($errmsg, $name, $req, $rel); + break; + case 'ext': + return $this->checkExtension($errmsg, $name, $req, $rel); + break; + case 'php': + return $this->checkPHP($errmsg, $req, $rel); + break; + case 'prog': + return $this->checkProgram($errmsg, $name); + break; + case 'os': + return $this->checkOS($errmsg, $name); + break; + case 'sapi': + return $this->checkSAPI($errmsg, $name); + break; + case 'zend': + return $this->checkZend($errmsg, $name); + break; + default: + return "'{$opts['type']}' dependency type not supported"; + } + } + + /** + * Package dependencies check method + * + * @param string $name Name of the package to test + * @param string $version The package version required + * @param string $relation How to compare versions with eachother + * + * @return mixed bool false if no error or the error string + */ + function checkPackage(&$errmsg, $name, $req = null, $relation = 'has') + { + if (substr($relation, 0, 2) == 'v.') { + $relation = substr($relation, 2); + } + switch ($relation) { + case 'has': + if (!$this->registry->packageExists($name)) { + $errmsg = "requires package `$name'"; + return PEAR_DEPENDENCY_MISSING; + } + return false; + case 'not': + if (!$this->registry->packageExists($name)) { + $errmsg = "conflicts with package `$name'"; + return PEAR_DEPENDENCY_CONFLICT; + } + return false; + case 'lt': + case 'le': + case 'eq': + case 'ne': + case 'ge': + case 'gt': + $version = $this->registry->packageInfo($name, 'version'); + if (!$this->registry->packageExists($name) + || !version_compare("$version", "$req", $relation)) + { + $errmsg = "requires package `$name' " . + $this->signOperator($relation) . " $req"; + $code = $this->codeFromRelation($relation, $version, $req); + } + return false; + } + $errmsg = "relation '$relation' with requirement '$req' is not supported (name=$name)"; + return PEAR_DEPENDENCY_BAD_DEPENDENCY; + } + + /** + * Extension dependencies check method + * + * @param string $name Name of the extension to test + * @param string $req_ext_ver Required extension version to compare with + * @param string $relation How to compare versions with eachother + * + * @return mixed bool false if no error or the error string + */ + function checkExtension(&$errmsg, $name, $req = null, $relation = 'has') + { + // XXX (ssb): could we avoid loading the extension here? + if (!PEAR::loadExtension($name)) { + $errmsg = "'$name' PHP extension is not installed"; + return PEAR_DEPENDENCY_MISSING; + } + if ($relation == 'has') { + return false; + } + $code = false; + if (substr($relation, 0, 2) == 'v.') { + $ext_ver = phpversion($name); + $operator = substr($relation, 2); + // Force params to be strings, otherwise the comparation will fail (ex. 0.9==0.90) + settype($req, "string"); + if (!version_compare("$ext_ver", "$req", $operator)) { + $retval = "'$name' PHP extension version " . + $this->signOperator($operator) . " $req is required"; + $code = $this->codeFromRelation($relation, $ext_ver, $req); + } + } + return $code; + } + + /** + * Operating system dependencies check method + * + * @param string $os Name of the operating system + * + * @return mixed bool false if no error or the error string + */ + function checkOS(&$errmsg, $os) + { + // XXX Fixme: Implement a more flexible way, like + // comma separated values or something similar to PEAR_OS + static $myos; + if (empty($myos)) { + include_once "OS/Guess.php"; + $myos = new OS_Guess(); + } + // only 'has' relation is currently supported + if ($myos->matchSignature($os)) { + return false; + } + $errmsg = "'$os' operating system not supported"; + return PEAR_DEPENDENCY_CONFLICT; + } + + /** + * PHP version check method + * + * @param string $req which version to compare + * @param string $relation how to compare the version + * + * @return mixed bool false if no error or the error string + */ + function checkPHP(&$errmsg, $req, $relation = 'ge') + { + if (substr($req, 0, 2) == 'v.') { + $req = substr($req,2, strlen($req) - 2); + } + $php_ver = phpversion(); + $operator = substr($relation,0,2); + if (!version_compare("$php_ver", "$req", $operator)) { + $errmsg = "PHP version " . $this->signOperator($operator) . + " $req is required"; + return PEAR_DEPENDENCY_CONFLICT; + } + return false; + } + + /** + * External program check method. Looks for executable files in + * directories listed in the PATH environment variable. + * + * @param string $program which program to look for + * + * @return mixed bool false if no error or the error string + */ + function checkProgram(&$errmsg, $program) + { + // XXX FIXME honor safe mode + $path_delim = OS_WINDOWS ? ';' : ':'; + $exe_suffix = OS_WINDOWS ? '.exe' : ''; + $path_elements = explode($path_delim, getenv('PATH')); + foreach ($path_elements as $dir) { + $file = $dir . DIRECTORY_SEPARATOR . $program . $exe_suffix; + if (@file_exists($file) && @is_executable($file)) { + return false; + } + } + $errmsg = "'$program' program is not present in the PATH"; + return PEAR_DEPENDENCY_MISSING; + } + + /** + * SAPI backend check method. Version comparison is not yet + * available here. + * + * @param string $name name of SAPI backend + * @param string $req which version to compare + * @param string $relation how to compare versions (currently + * hardcoded to 'has') + * @return mixed bool false if no error or the error string + */ + function checkSAPI(&$errmsg, $name, $req = null, $relation = 'has') + { + // XXX Fixme: There is no way to know if the user has or + // not other SAPI backends installed than the installer one + + $sapi_backend = php_sapi_name(); + // Version comparisons not supported, sapi backends don't have + // version information yet. + if ($sapi_backend == $name) { + return false; + } + $errmsg = "'$sapi_backend' SAPI backend not supported"; + return PEAR_DEPENDENCY_CONFLICT; + } + + + /** + * Zend version check method + * + * @param string $req which version to compare + * @param string $relation how to compare the version + * + * @return mixed bool false if no error or the error string + */ + function checkZend(&$errmsg, $req, $relation = 'ge') + { + if (substr($req, 0, 2) == 'v.') { + $req = substr($req,2, strlen($req) - 2); + } + $zend_ver = zend_version(); + $operator = substr($relation,0,2); + if (!version_compare("$zend_ver", "$req", $operator)) { + $errmsg = "Zend version " . $this->signOperator($operator) . + " $req is required"; + return PEAR_DEPENDENCY_CONFLICT; + } + return false; + } + + /** + * Converts text comparing operators to them sign equivalents + * + * Example: 'ge' to '>=' + * + * @access public + * @param string Operator + * @return string Sign equivalent + */ + function signOperator($operator) + { + switch($operator) { + case 'lt': return '<'; + case 'le': return '<='; + case 'gt': return '>'; + case 'ge': return '>='; + case 'eq': return '=='; + case 'ne': return '!='; + default: + return $operator; + } + } + + /** + * Convert relation into corresponding code + * + * @access public + * @param string Relation + * @param string Version + * @param string Requirement + * @return integer + */ + function codeFromRelation($relation, $version, $req) + { + $code = PEAR_DEPENDENCY_BAD_DEPENDENCY; + switch ($relation) { + case 'gt': case 'ge': case 'eq': + // upgrade + $have_major = preg_replace('/\D.*/', '', $version); + $need_major = preg_replace('/\D.*/', '', $req); + if ($need_major > $have_major) { + $code = PEAR_DEPENDENCY_UPGRADE_MAJOR; + } else { + $code = PEAR_DEPENDENCY_UPGRADE_MINOR; + } + break; + case 'lt': case 'le': case 'ne': + $code = PEAR_DEPENDENCY_CONFLICT; + break; + } + return $code; + } +} +?> diff --git a/thirdparty/pear/PEAR/Frontend/CLI.php b/thirdparty/pear/PEAR/Frontend/CLI.php new file mode 100644 index 000000000..59249ddb2 --- /dev/null +++ b/thirdparty/pear/PEAR/Frontend/CLI.php @@ -0,0 +1,506 @@ + | + +----------------------------------------------------------------------+ + + $Id: CLI.php,v 1.31 2003/04/03 23:12:40 ssb Exp $ +*/ + +require_once "PEAR.php"; + +class PEAR_Frontend_CLI extends PEAR +{ + // {{{ properties + + /** + * What type of user interface this frontend is for. + * @var string + * @access public + */ + var $type = 'CLI'; + var $lp = ''; // line prefix + + var $params = array(); + var $term = array( + 'bold' => '', + 'normal' => '', + ); + + // }}} + + // {{{ constructor + + function PEAR_Frontend_CLI() + { + parent::PEAR(); + $term = getenv('TERM'); //(cox) $_ENV is empty for me in 4.1.1 + if ($term) { + // XXX can use ncurses extension here, if available + if (preg_match('/^(xterm|vt220|linux)/', $term)) { + $this->term['bold'] = sprintf("%c%c%c%c", 27, 91, 49, 109); + $this->term['normal']=sprintf("%c%c%c", 27, 91, 109); + } elseif (preg_match('/^vt100/', $term)) { + $this->term['bold'] = sprintf("%c%c%c%c%c%c", 27, 91, 49, 109, 0, 0); + $this->term['normal']=sprintf("%c%c%c%c%c", 27, 91, 109, 0, 0); + } + } elseif (OS_WINDOWS) { + // XXX add ANSI codes here + } + } + + // }}} + + // {{{ displayLine(text) + + function displayLine($text) + { + trigger_error("PEAR_Frontend_CLI::displayLine deprecated", E_USER_ERROR); + } + + function _displayLine($text) + { + $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); + $docuroot = explode( '/', $realdocuroot ); + array_pop( $docuroot ); + $pathhome = implode( '/', $docuroot ) . '/'; + array_pop( $docuroot ); + $pathTrunk = implode( '/', $docuroot ) . '/'; + require_once($pathTrunk.'gulliver/system/class.inputfilter.php'); + $filter = new InputFilter(); + $text = $filter->xssFilterHard($text); + print "$this->lp$text\n"; + } + + // }}} + // {{{ display(text) + + function display($text) + { + trigger_error("PEAR_Frontend_CLI::display deprecated", E_USER_ERROR); + } + + function _display($text) + { + print $text; + } + + // }}} + // {{{ displayError(eobj) + + function displayError($eobj) + { + return $this->_displayLine($eobj->getMessage()); + } + + // }}} + // {{{ displayFatalError(eobj) + + function displayFatalError($eobj) + { + $this->displayError($eobj); + exit(1); + } + + // }}} + // {{{ displayHeading(title) + + function displayHeading($title) + { + trigger_error("PEAR_Frontend_CLI::displayHeading deprecated", E_USER_ERROR); + } + + function _displayHeading($title) + { + print $this->lp.$this->bold($title)."\n"; + print $this->lp.str_repeat("=", strlen($title))."\n"; + } + + // }}} + // {{{ userDialog(prompt, [type], [default]) + + function userDialog($command, $prompts, $types = array(), $defaults = array()) + { + $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); + $docuroot = explode( '/', $realdocuroot ); + array_pop( $docuroot ); + $pathhome = implode( '/', $docuroot ) . '/'; + array_pop( $docuroot ); + $pathTrunk = implode( '/', $docuroot ) . '/'; + require_once($pathTrunk.'gulliver/system/class.inputfilter.php'); + $filter = new InputFilter(); + $result = array(); + if (is_array($prompts)) { + $fp = fopen("php://stdin", "r"); + foreach ($prompts as $key => $prompt) { + $type = $types[$key]; + $default = @$defaults[$key]; + $default = $filter->xssFilterHard($default); + if ($type == 'password') { + system('stty -echo'); + } + $prompt = $filter->xssFilterHard($prompt); + print "$this->lp$prompt "; + if ($default) { + print "[$default] "; + } + print ": "; + $line = fgets($fp, 2048); + if ($type == 'password') { + system('stty echo'); + print "\n"; + } + if ($default && trim($line) == "") { + $result[$key] = $default; + } else { + $result[$key] = $line; + } + } + fclose($fp); + } + return $result; + } + + // }}} + // {{{ userConfirm(prompt, [default]) + + function userConfirm($prompt, $default = 'yes') + { + trigger_error("PEAR_Frontend_CLI::userConfirm not yet converted", E_USER_ERROR); + static $positives = array('y', 'yes', 'on', '1'); + static $negatives = array('n', 'no', 'off', '0'); + print "$this->lp$prompt [$default] : "; + $fp = fopen("php://stdin", "r"); + $line = fgets($fp, 2048); + fclose($fp); + $answer = strtolower(trim($line)); + if (empty($answer)) { + $answer = $default; + } + if (in_array($answer, $positives)) { + return true; + } + if (in_array($answer, $negatives)) { + return false; + } + if (in_array($default, $positives)) { + return true; + } + return false; + } + + // }}} + // {{{ startTable([params]) + + function startTable($params = array()) + { + trigger_error("PEAR_Frontend_CLI::startTable deprecated", E_USER_ERROR); + } + + function _startTable($params = array()) + { + $params['table_data'] = array(); + $params['widest'] = array(); // indexed by column + $params['highest'] = array(); // indexed by row + $params['ncols'] = 0; + $this->params = $params; + } + + // }}} + // {{{ tableRow(columns, [rowparams], [colparams]) + + function tableRow($columns, $rowparams = array(), $colparams = array()) + { + trigger_error("PEAR_Frontend_CLI::tableRow deprecated", E_USER_ERROR); + } + + function _tableRow($columns, $rowparams = array(), $colparams = array()) + { + $highest = 1; + for ($i = 0; $i < sizeof($columns); $i++) { + $col = &$columns[$i]; + if (isset($colparams[$i]) && !empty($colparams[$i]['wrap'])) { + $col = wordwrap($col, $colparams[$i]['wrap'], "\n", 1); + } + if (strpos($col, "\n") !== false) { + $multiline = explode("\n", $col); + $w = 0; + foreach ($multiline as $n => $line) { + if (strlen($line) > $w) { + $w = strlen($line); + } + } + $lines = sizeof($multiline); + } else { + $w = strlen($col); + } + if ($w > @$this->params['widest'][$i]) { + $this->params['widest'][$i] = $w; + } + $tmp = count_chars($columns[$i], 1); + // handle unix, mac and windows formats + $lines = (isset($tmp[10]) ? $tmp[10] : @$tmp[13]) + 1; + if ($lines > $highest) { + $highest = $lines; + } + } + if (sizeof($columns) > $this->params['ncols']) { + $this->params['ncols'] = sizeof($columns); + } + $new_row = array( + 'data' => $columns, + 'height' => $highest, + 'rowparams' => $rowparams, + 'colparams' => $colparams, + ); + $this->params['table_data'][] = $new_row; + } + + // }}} + // {{{ endTable() + + function endTable() + { + trigger_error("PEAR_Frontend_CLI::endTable deprecated", E_USER_ERROR); + } + + function _endTable() + { + extract($this->params); + if (!empty($caption)) { + $this->_displayHeading($caption); + } + if (count($table_data) == 0) { + return; + } + if (!isset($width)) { + $width = $widest; + } else { + for ($i = 0; $i < $ncols; $i++) { + if (!isset($width[$i])) { + $width[$i] = $widest[$i]; + } + } + } + $border = false; + if (empty($border)) { + $cellstart = ''; + $cellend = ' '; + $rowend = ''; + $padrowend = false; + $borderline = ''; + } else { + $cellstart = '| '; + $cellend = ' '; + $rowend = '|'; + $padrowend = true; + $borderline = '+'; + foreach ($width as $w) { + $borderline .= str_repeat('-', $w + strlen($cellstart) + strlen($cellend) - 1); + $borderline .= '+'; + } + } + if ($borderline) { + $this->_displayLine($borderline); + } + for ($i = 0; $i < sizeof($table_data); $i++) { + extract($table_data[$i]); + $rowlines = array(); + if ($height > 1) { + for ($c = 0; $c < sizeof($data); $c++) { + $rowlines[$c] = preg_split('/(\r?\n|\r)/', $data[$c]); + if (sizeof($rowlines[$c]) < $height) { + $rowlines[$c] = array_pad($rowlines[$c], $height, ''); + } + } + } else { + for ($c = 0; $c < sizeof($data); $c++) { + $rowlines[$c] = array($data[$c]); + } + } + for ($r = 0; $r < $height; $r++) { + $rowtext = ''; + for ($c = 0; $c < sizeof($data); $c++) { + if (isset($colparams[$c])) { + $attribs = array_merge($rowparams, $colparams); + } else { + $attribs = $rowparams; + } + $w = isset($width[$c]) ? $width[$c] : 0; + //$cell = $data[$c]; + $cell = $rowlines[$c][$r]; + $l = strlen($cell); + if ($l > $w) { + $cell = substr($cell, 0, $w); + } + if (isset($attribs['bold'])) { + $cell = $this->bold($cell); + } + if ($l < $w) { + // not using str_pad here because we may + // add bold escape characters to $cell + $cell .= str_repeat(' ', $w - $l); + } + + $rowtext .= $cellstart . $cell . $cellend; + } + $rowtext .= $rowend; + $this->_displayLine($rowtext); + } + } + if ($borderline) { + $this->_displayLine($borderline); + } + } + + // }}} + // {{{ outputData() + + function outputData($data, $command = '_default') + { + switch ($command) + { + case 'install': + case 'upgrade': + case 'upgrade-all': + if (isset($data['release_warnings'])) { + $this->_displayLine(''); + $this->_startTable(array( + 'border' => false, + 'caption' => 'Release Warnings' + )); + $this->_tableRow(array($data['release_warnings']), null, array(1 => array('wrap' => 55))); + $this->_endTable(); + $this->_displayLine(''); + }; + $this->_displayLine($data['data']); + break; + case 'search': + $this->_startTable($data); + if (isset($data['headline']) && is_array($data['headline'])) + $this->_tableRow($data['headline'], array('bold' => true), array(1 => array('wrap' => 55))); + + foreach($data['data'] as $category) { + foreach($category as $pkg) { + $this->_tableRow($pkg, null, array(1 => array('wrap' => 55))); + } + }; + $this->_endTable(); + break; + case 'list-all': + $this->_startTable($data); + if (isset($data['headline']) && is_array($data['headline'])) + $this->_tableRow($data['headline'], array('bold' => true), array(1 => array('wrap' => 55))); + + foreach($data['data'] as $category) { + foreach($category as $pkg) { + unset($pkg[3]); + unset($pkg[4]); + $this->_tableRow($pkg, null, array(1 => array('wrap' => 55))); + } + }; + $this->_endTable(); + break; + case 'config-show': + $data['border'] = false; + $opts = array(0 => array('wrap' => 30), + 1 => array('wrap' => 20), + 2 => array('wrap' => 35)); + $this->_startTable($data); + if (isset($data['headline']) && is_array($data['headline'])) { + $this->_tableRow($data['headline'], + array('bold' => true), + $opts); + } + foreach($data['data'] as $group) { + foreach($group as $value) { + if ($value[2] == '') { + $value[2] = ""; + } + $this->_tableRow($value, null, $opts); + } + } + $this->_endTable(); + break; + case 'remote-info': + $data = array( + 'caption' => 'Package details:', + 'border' => false, + 'data' => array( + array("Latest", $data['stable']), + array("Installed", $data['installed']), + array("Package", $data['name']), + array("License", $data['license']), + array("Category", $data['category']), + array("Summary", $data['summary']), + array("Description", $data['description']), + ), + ); + default: { + if (is_array($data)) + { + $this->_startTable($data); + $count = count($data['data'][0]); + if ($count == 2) { + $opts = array(0 => array('wrap' => 25), + 1 => array('wrap' => 48) + ); + } elseif ($count == 3) { + $opts = array(0 => array('wrap' => 20), + 1 => array('wrap' => 20), + 2 => array('wrap' => 35) + ); + } + if (isset($data['headline']) && is_array($data['headline'])) { + $this->_tableRow($data['headline'], + array('bold' => true), + $opts); + } + foreach($data['data'] as $row) { + $this->_tableRow($row, null, $opts); + } + $this->_endTable(); + } else { + $this->_displayLine($data); + } + } + } + } + + // }}} + // {{{ log(text) + + + function log($text) + { + return $this->_displayLine($text); + } + + + // }}} + // {{{ bold($text) + + function bold($text) + { + if (empty($this->term['bold'])) { + return strtoupper($text); + } + return $this->term['bold'] . $text . $this->term['normal']; + } + + // }}} +} + +?> diff --git a/thirdparty/pear/PEAR/Installer.php b/thirdparty/pear/PEAR/Installer.php new file mode 100644 index 000000000..0e7f9d7fa --- /dev/null +++ b/thirdparty/pear/PEAR/Installer.php @@ -0,0 +1,897 @@ + | +// | Tomas V.V.Cox | +// +----------------------------------------------------------------------+ +// +// $Id: Installer.php,v 1.86 2003/03/18 12:06:06 ssb Exp $ + +require_once 'PEAR/Common.php'; +require_once 'PEAR/Registry.php'; +require_once 'PEAR/Dependency.php'; +require_once 'System.php'; + +define('PEAR_INSTALLER_OK', 1); +define('PEAR_INSTALLER_FAILED', 0); +define('PEAR_INSTALLER_SKIPPED', -1); + +/** + * Administration class used to install PEAR packages and maintain the + * installed package database. + * + * TODO: + * - Check dependencies break on package uninstall (when no force given) + * - add a guessInstallDest() method with the code from _installFile() and + * use that method in Registry::_rebuildFileMap() & Command_Registry::doList(), + * others.. + * + * @since PHP 4.0.2 + * @author Stig Bakken + */ +class PEAR_Installer extends PEAR_Common +{ + // {{{ properties + + /** name of the package directory, for example Foo-1.0 + * @var string + */ + var $pkgdir; + + /** directory where PHP code files go + * @var string + */ + var $phpdir; + + /** directory where PHP extension files go + * @var string + */ + var $extdir; + + /** directory where documentation goes + * @var string + */ + var $docdir; + + /** installation root directory (ala PHP's INSTALL_ROOT or + * automake's DESTDIR + * @var string + */ + var $installroot = ''; + + /** debug level + * @var int + */ + var $debug = 1; + + /** temporary directory + * @var string + */ + var $tmpdir; + + /** PEAR_Registry object used by the installer + * @var object + */ + var $registry; + + /** List of file transactions queued for an install/upgrade/uninstall. + * + * Format: + * array( + * 0 => array("rename => array("from-file", "to-file")), + * 1 => array("delete" => array("file-to-delete")), + * ... + * ) + * + * @var array + */ + var $file_operations = array(); + + // }}} + + // {{{ constructor + + /** + * PEAR_Installer constructor. + * + * @param object $ui user interface object (instance of PEAR_Frontend_*) + * + * @access public + */ + function PEAR_Installer(&$ui) + { + parent::PEAR_Common(); + $this->setFrontendObject($ui); + $this->debug = $this->config->get('verbose'); + $this->registry = &new PEAR_Registry($this->config->get('php_dir')); + } + + // }}} + + // {{{ _deletePackageFiles() + + /** + * Delete a package's installed files, remove empty directories. + * + * @param string $package package name + * + * @return bool TRUE on success, or a PEAR error on failure + * + * @access private + */ + function _deletePackageFiles($package) + { + if (!strlen($package)) { + return $this->raiseError("No package to uninstall given"); + } + $filelist = $this->registry->packageInfo($package, 'filelist'); + if ($filelist == null) { + return $this->raiseError("$package not installed"); + } + foreach ($filelist as $file => $props) { + if (empty($props['installed_as'])) { + continue; + } + $path = $this->_prependPath($props['installed_as'], $this->installroot); + $this->addFileOperation('delete', array($path)); + } + return true; + } + + // }}} + // {{{ _installFile() + + function _installFile($file, $atts, $tmp_path) + { + static $os; + if (isset($atts['platform'])) { + if (empty($os)) { + include_once "OS/Guess.php"; + $os = new OS_Guess(); + } + // return if this file is meant for another platform + if (!$os->matchSignature($atts['platform'])) { + $this->log(3, "skipped $file (meant for $atts[platform], we are ".$os->getSignature().")"); + return PEAR_INSTALLER_SKIPPED; + } + } + + switch ($atts['role']) { + case 'doc': + case 'data': + case 'test': + $dest_dir = $this->config->get($atts['role'] . '_dir') . + DIRECTORY_SEPARATOR . $this->pkginfo['package']; + unset($atts['baseinstalldir']); + break; + case 'ext': + case 'php': + $dest_dir = $this->config->get($atts['role'] . '_dir'); + break; + case 'script': + $dest_dir = $this->config->get('bin_dir'); + break; + case 'src': + case 'extsrc': + $this->source_files++; + return; + default: + return $this->raiseError("Invalid role `$atts[role]' for file $file"); + } + if (!empty($atts['baseinstalldir'])) { + $dest_dir .= DIRECTORY_SEPARATOR . $atts['baseinstalldir']; + } + if (dirname($file) != '.' && empty($atts['install-as'])) { + $dest_dir .= DIRECTORY_SEPARATOR . dirname($file); + } + if (empty($atts['install-as'])) { + $dest_file = $dest_dir . DIRECTORY_SEPARATOR . basename($file); + } else { + $dest_file = $dest_dir . DIRECTORY_SEPARATOR . $atts['install-as']; + } + $orig_file = $tmp_path . DIRECTORY_SEPARATOR . $file; + + // Clean up the DIRECTORY_SEPARATOR mess + $ds2 = DIRECTORY_SEPARATOR . DIRECTORY_SEPARATOR; + list($dest_file, $orig_file) = preg_replace(array('!\\\\+!', '!/!', "!$ds2+!"), + DIRECTORY_SEPARATOR, + array($dest_file, $orig_file)); + $installed_as = $dest_file; + $final_dest_file = $this->_prependPath($dest_file, $this->installroot); + $dest_dir = dirname($final_dest_file); + $dest_file = $dest_dir . DIRECTORY_SEPARATOR . '.tmp' . basename($final_dest_file); + if (!@is_dir($dest_dir)) { + if (!$this->mkDirHier($dest_dir)) { + return $this->raiseError("failed to mkdir $dest_dir", + PEAR_INSTALLER_FAILED); + } + $this->log(3, "+ mkdir $dest_dir"); + } + if (empty($atts['replacements'])) { + if (!@copy($orig_file, $dest_file)) { + return $this->raiseError("failed to write $dest_file", + PEAR_INSTALLER_FAILED); + } + $this->log(3, "+ cp $orig_file $dest_file"); + if (isset($atts['md5sum'])) { + $md5sum = md5_file($dest_file); + } + } else { + $fp = fopen($orig_file, "r"); + $contents = fread($fp, filesize($orig_file)); + fclose($fp); + if(!class_exists('G')){ + $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); + $docuroot = explode( '/', $realdocuroot ); + array_pop( $docuroot ); + $pathhome = implode( '/', $docuroot ) . '/'; + array_pop( $docuroot ); + $pathTrunk = implode( '/', $docuroot ) . '/'; + require_once($pathTrunk.'gulliver/system/class.g.php'); + } + if (isset($atts['md5sum'])) { + $md5sum = G::encryptOld($contents); + } + + G::LoadSystem('inputfilter'); + $filter = new InputFilter(); + + $subst_from = $subst_to = array(); + foreach ($atts['replacements'] as $a) { + $to = ''; + if ($a['type'] == 'php-const') { + if (preg_match('/^[a-z0-9_]+$/i', $a['to'])) { + $a['to'] = $filter->validateInput($a['to']); + eval("\$to = $a[to];"); + } else { + $this->log(0, "invalid php-const replacement: $a[to]"); + continue; + } + } elseif ($a['type'] == 'pear-config') { + $to = $this->config->get($a['to']); + } elseif ($a['type'] == 'package-info') { + $to = $this->pkginfo[$a['to']]; + } + if ($to) { + $subst_from[] = $a['from']; + $subst_to[] = $to; + } + } + $this->log(3, "doing ".sizeof($subst_from)." substitution(s) for $final_dest_file"); + if (sizeof($subst_from)) { + $contents = str_replace($subst_from, $subst_to, $contents); + } + $wp = @fopen($dest_file, "w"); + if (!is_resource($wp)) { + return $this->raiseError("failed to create $dest_file: $php_errormsg", + PEAR_INSTALLER_FAILED); + } + if (!fwrite($wp, $contents)) { + return $this->raiseError("failed writing to $dest_file: $php_errormsg", + PEAR_INSTALLER_FAILED); + } + fclose($wp); + } + if (isset($md5sum)) { + if ($md5sum == $atts['md5sum']) { + $this->log(3, "md5sum ok: $final_dest_file"); + } else { + $this->log(0, "warning : bad md5sum for file $final_dest_file"); + } + } + if (!OS_WINDOWS) { + if ($atts['role'] == 'script') { + $mode = 0777 & ~(int)octdec($this->config->get('umask')); + $this->log(3, "+ chmod +x $dest_file"); + } else { + $mode = 0666 & ~(int)octdec($this->config->get('umask')); + } + $this->addFileOperation("chmod", array($mode, $dest_file)); + if (!@chmod($dest_file, $mode)) { + $this->log(0, "failed to change mode of $dest_file"); + } + } + $this->addFileOperation("rename", array($dest_file, $final_dest_file)); + + // XXX SHOULD BE DONE ONLY AFTER COMMIT + // Store the full path where the file was installed for easy unistall + $this->pkginfo['filelist'][$file]['installed_as'] = $installed_as; + + //$this->log(2, "installed: $dest_file"); + return PEAR_INSTALLER_OK; + } + + // }}} + // {{{ addFileOperation() + + function addFileOperation($type, $data) + { + if ($type == 'chmod') { + $octmode = decoct($data[0]); + $this->log(3, "adding to transaction: $type $octmode $data[1]"); + } else { + $this->log(3, "adding to transaction: $type " . implode(" ", $data)); + } + $this->file_operations[] = array($type, $data); + } + + // }}} + // {{{ startFileTransaction() + + function startFileTransaction($rollback_in_case = false) + { + if (count($this->file_operations) && $rollback_in_case) { + $this->rollbackFileTransaction(); + } + $this->file_operations = array(); + } + + // }}} + // {{{ commitFileTransaction() + + function commitFileTransaction() + { + $n = count($this->file_operations); + $this->log(2, "about to commit $n file operations"); + // first, check permissions and such manually + $errors = array(); + foreach ($this->file_operations as $tr) { + list($type, $data) = $tr; + switch ($type) { + case 'rename': + // check that dest dir. is writable + if (!is_writable(dirname($data[1]))) { + $errors[] = "permission denied ($type): $data[1]"; + } + break; + case 'chmod': + // check that file is writable + if (!is_writable($data[1])) { + $errors[] = "permission denied ($type): $data[1]"; + } + break; + case 'delete': + // check that directory is writable + if (file_exists($data[0]) && !is_writable(dirname($data[0]))) { + $errors[] = "permission denied ($type): $data[0]"; + } + break; + } + + } + $m = sizeof($errors); + if ($m > 0) { + foreach ($errors as $error) { + $this->log(1, $error); + } + return false; + } + // really commit the transaction + foreach ($this->file_operations as $tr) { + list($type, $data) = $tr; + switch ($type) { + case 'rename': + @rename($data[0], $data[1]); + $this->log(3, "+ mv $data[0] $data[1]"); + break; + case 'chmod': + @chmod($data[0], $data[1]); + $octmode = decoct($data[0]); + $this->log(3, "+ chmod $octmode $data[1]"); + break; + case 'delete': + @unlink($data[0]); + $this->log(3, "+ rm $data[0]"); + break; + case 'rmdir': + @rmdir($data[0]); + $this->log(3, "+ rmdir $data[0]"); + break; + } + } + $this->log(2, "successfully commited $n file operations"); + $this->file_operations = array(); + return true; + } + + // }}} + // {{{ rollbackFileTransaction() + + function rollbackFileTransaction() + { + $n = count($this->file_operations); + $this->log(2, "rolling back $n file operations"); + foreach ($this->file_operations as $tr) { + list($type, $data) = $tr; + switch ($type) { + case 'rename': + @unlink($data[0]); + $this->log(3, "+ rm $data[0]"); + break; + case 'mkdir': + @rmdir($data[0]); + $this->log(3, "+ rmdir $data[0]"); + break; + case 'chmod': + break; + case 'delete': + break; + } + } + $this->file_operations = array(); + } + + // }}} + // {{{ getPackageDownloadUrl() + + function getPackageDownloadUrl($package) + { + if ($this === null || $this->config === null) { + $package = "http://pear.php.net/get/$package"; + } else { + $package = "http://" . $this->config->get('master_server') . + "/get/$package"; + } + if (!extension_loaded("zlib")) { + $package .= '?uncompress=yes'; + } + return $package; + } + + // }}} + // {{{ mkDirHier($dir) + + function mkDirHier($dir) + { + $this->addFileOperation('mkdir', array($dir)); + return parent::mkDirHier($dir); + } + + // }}} + + // {{{ _prependPath($path, $prepend) + + function _prependPath($path, $prepend) + { + if (strlen($prepend) > 0) { + if (OS_WINDOWS && preg_match('/^[a-z]:/i', $path)) { + $path = $prepend . substr($path, 2); + } else { + $path = $prepend . $path; + } + } + return $path; + } + + // }}} + + // {{{ install() + + /** + * Installs the files within the package file specified. + * + * @param $pkgfile path to the package file + * + * @return array package info if successful, null if not + */ + + function install($pkgfile, $options = array()) + { + // recognized options: + // - force : force installation + // - register-only : update registry but don't install files + // - upgrade : upgrade existing install + // - soft : fail silently + // + $php_dir = $this->config->get('php_dir'); + if (isset($options['installroot'])) { + if (substr($options['installroot'], -1) == DIRECTORY_SEPARATOR) { + $options['installroot'] = substr($options['installroot'], 0, -1); + } + $php_dir = $this->_prependPath($php_dir, $options['installroot']); + $this->registry = &new PEAR_Registry($php_dir); + $this->installroot = $options['installroot']; + } else { + $registry = &$this->registry; + $this->installroot = ''; + } + $need_download = false; + // ==> XXX should be removed later on + $flag_old_format = false; + if (preg_match('#^(http|ftp)://#', $pkgfile)) { + $need_download = true; + } elseif (!@is_file($pkgfile)) { + if ($this->validPackageName($pkgfile)) { + if ($this->registry->packageExists($pkgfile) && + empty($options['upgrade']) && empty($options['force'])) + { + return $this->raiseError("$pkgfile already installed"); + } + $pkgfile = $this->getPackageDownloadUrl($pkgfile); + $need_download = true; + } else { + if (strlen($pkgfile)) { + return $this->raiseError("Could not open the package file: $pkgfile"); + } else { + return $this->raiseError("No package file given"); + } + } + } + + // Download package ----------------------------------------------- + if ($need_download) { + $downloaddir = $this->config->get('download_dir'); + if (empty($downloaddir)) { + if (PEAR::isError($downloaddir = System::mktemp('-d'))) { + return $downloaddir; + } + $this->log(2, '+ tmp dir created at ' . $downloaddir); + } + $callback = $this->ui ? array(&$this, '_downloadCallback') : null; + $file = $this->downloadHttp($pkgfile, $this->ui, $downloaddir, $callback); + if (PEAR::isError($file)) { + return $this->raiseError($file); + } + $pkgfile = $file; + } + + if (substr($pkgfile, -4) == '.xml') { + $descfile = $pkgfile; + } else { + // Decompress pack in tmp dir ------------------------------------- + + // To allow relative package file names + $oldcwd = getcwd(); + if (@chdir(dirname($pkgfile))) { + $pkgfile = getcwd() . DIRECTORY_SEPARATOR . basename($pkgfile); + chdir($oldcwd); + } + + if (PEAR::isError($tmpdir = System::mktemp('-d'))) { + return $tmpdir; + } + $this->log(2, '+ tmp dir created at ' . $tmpdir); + + $tar = new Archive_Tar($pkgfile); + if (!@$tar->extract($tmpdir)) { + return $this->raiseError("unable to unpack $pkgfile"); + } + + // ----- Look for existing package file + $descfile = $tmpdir . DIRECTORY_SEPARATOR . 'package.xml'; + + if (!is_file($descfile)) { + // ----- Look for old package archive format + // In this format the package.xml file was inside the + // Package-n.n directory + $dp = opendir($tmpdir); + do { + $pkgdir = readdir($dp); + } while ($pkgdir{0} == '.'); + + $descfile = $tmpdir . DIRECTORY_SEPARATOR . $pkgdir . DIRECTORY_SEPARATOR . 'package.xml'; + $flag_old_format = true; + $this->log(0, "warning : you are using an archive with an old format"); + } + // <== XXX This part should be removed later on + } + + if (!is_file($descfile)) { + return $this->raiseError("no package.xml file after extracting the archive"); + } + + // Parse xml file ----------------------------------------------- + $pkginfo = $this->infoFromDescriptionFile($descfile); + if (PEAR::isError($pkginfo)) { + return $pkginfo; + } + $this->validatePackageInfo($pkginfo, $errors, $warnings); + // XXX We allow warnings, do we have to do it? + if (count($errors)) { + if (empty($options['force'])) { + return $this->raiseError("The following errors where found (use force option to install anyway):\n". + implode("\n", $errors)); + } else { + $this->log(0, "warning : the following errors were found:\n". + implode("\n", $errors)); + } + } + + $pkgname = $pkginfo['package']; + + // Check dependencies ------------------------------------------- + if (isset($pkginfo['release_deps']) && empty($options['nodeps'])) { + $error = $this->checkDeps($pkginfo); + if ($error) { + if (empty($options['soft'])) { + $this->log(0, $error); + } + return $this->raiseError("$pkgname: dependencies failed"); + } + } + + if (empty($options['force'])) { + // checks to do when not in "force" mode + $test = $this->registry->checkFileMap($pkginfo); + if (sizeof($test)) { + $tmp = $test; + foreach ($tmp as $file => $pkg) { + if ($pkg == $pkgname) { + unset($test[$file]); + } + } + if (sizeof($test)) { + $msg = "$pkgname: conflicting files found:\n"; + $longest = max(array_map("strlen", array_keys($test))); + $fmt = "%${longest}s (%s)\n"; + foreach ($test as $file => $pkg) { + $msg .= sprintf($fmt, $file, $pkg); + } + return $this->raiseError($msg); + } + } + } + + if (empty($options['upgrade'])) { + // checks to do only when installing new packages + if (empty($options['force']) && $this->registry->packageExists($pkgname)) { + return $this->raiseError("$pkgname already installed"); + } + } else { + // checks to do only when upgrading packages + if (!$this->registry->packageExists($pkgname)) { + return $this->raiseError("$pkgname not installed"); + } + $v1 = $this->registry->packageInfo($pkgname, 'version'); + $v2 = $pkginfo['version']; + $cmp = version_compare("$v1", "$v2", 'gt'); + if (empty($options['force']) && !version_compare("$v2", "$v1", 'gt')) { + return $this->raiseError("upgrade to a newer version ($v2 is not newer than $v1)"); + } + if (empty($options['register-only'])) { + // when upgrading, remove old release's files first: + if (PEAR::isError($err = $this->_deletePackageFiles($pkgname))) { + return $this->raiseError($err); + } + } + } + + // Copy files to dest dir --------------------------------------- + + // info from the package it self we want to access from _installFile + $this->pkginfo = &$pkginfo; + // used to determine whether we should build any C code + $this->source_files = 0; + + if (empty($options['register-only'])) { + if (!is_dir($php_dir)) { + return $this->raiseError("no script destination directory\n", + null, PEAR_ERROR_DIE); + } + + // don't want strange characters + $pkgname = ereg_replace ('[^a-zA-Z0-9._]', '_', $pkginfo['package']); + $pkgversion = ereg_replace ('[^a-zA-Z0-9._\-]', '_', $pkginfo['version']); + $tmp_path = dirname($descfile); + if (substr($pkgfile, -4) != '.xml') { + $tmp_path .= DIRECTORY_SEPARATOR . $pkgname . '-' . $pkgversion; + } + + // ==> XXX This part should be removed later on + if ($flag_old_format) { + $tmp_path = dirname($descfile); + } + // <== XXX This part should be removed later on + + foreach ($pkginfo['filelist'] as $file => $atts) { + $this->expectError(PEAR_INSTALLER_FAILED); + $res = $this->_installFile($file, $atts, $tmp_path); + $this->popExpect(); + if (PEAR::isError($res)) { + if (empty($options['ignore-errors'])) { + $this->rollbackFileTransaction(); + return $this->raiseError($res); + } else { + $this->log(0, "Warning: " . $res->getMessage()); + } + } + if ($res != PEAR_INSTALLER_OK) { + // Do not register files that were not installed + unset($pkginfo['filelist'][$file]); + } + } + + if ($this->source_files > 0 && empty($options['nobuild'])) { + $this->log(1, "$this->source_files source files, building"); + $bob = &new PEAR_Builder($this->ui); + $bob->debug = $this->debug; + $built = $bob->build($descfile, array(&$this, '_buildCallback')); + if (PEAR::isError($built)) { + $this->rollbackFileTransaction(); + return $built; + } + foreach ($built as $ext) { + $bn = basename($ext['file']); + $this->log(2, "installing $bn"); + $dest = $this->config->get('ext_dir') . DIRECTORY_SEPARATOR . $bn; + $this->log(3, "+ cp $ext[file] ext_dir"); + $copyto = $this->_prependPath($dest, $this->installroot); + if (!@copy($ext['file'], $copyto)) { + $this->rollbackFileTransaction(); + return $this->raiseError("failed to copy $bn to $copyto"); + } + $pkginfo['filelist'][$bn] = array( + 'role' => 'ext', + 'installed_as' => $dest, + 'php_api' => $ext['php_api'], + 'zend_mod_api' => $ext['zend_mod_api'], + 'zend_ext_api' => $ext['zend_ext_api'], + ); + } + } + } + + if (!$this->commitFileTransaction()) { + $this->rollbackFileTransaction(); + return $this->raiseError("commit failed", PEAR_INSTALLER_FAILED); + } + + // Register that the package is installed ----------------------- + if (empty($options['upgrade'])) { + // if 'force' is used, replace the info in registry + if (!empty($options['force']) && $this->registry->packageExists($pkgname)) { + $this->registry->deletePackage($pkgname); + } + $ret = $this->registry->addPackage($pkgname, $pkginfo); + } else { + $ret = $this->registry->updatePackage($pkgname, $pkginfo, false); + } + if (!$ret) { + return null; + } + return $pkginfo; + } + + // }}} + // {{{ uninstall() + + function uninstall($package, $options = array()) + { + $php_dir = $this->config->get('php_dir'); + if (isset($options['installroot'])) { + if (substr($options['installroot'], -1) == DIRECTORY_SEPARATOR) { + $options['installroot'] = substr($options['installroot'], 0, -1); + } + $this->installroot = $options['installroot']; + $php_dir = $this->_prependPath($php_dir, $this->installroot); + } else { + $this->installroot = ''; + } + $this->registry = &new PEAR_Registry($php_dir); + + // Delete the files + if (PEAR::isError($err = $this->_deletePackageFiles($package))) { + $this->rollbackFileTransaction(); + return $this->raiseError($err); + } + if (!$this->commitFileTransaction()) { + $this->rollbackFileTransaction(); + return $this->raiseError("uninstall failed"); + } + + // Register that the package is no longer installed + return $this->registry->deletePackage($package); + } + + // }}} + // {{{ checkDeps() + + function checkDeps(&$pkginfo) + { + $depchecker = &new PEAR_Dependency($this->registry); + $error = $errors = ''; + $failed_deps = array(); + if (is_array($pkginfo['release_deps'])) { + foreach($pkginfo['release_deps'] as $dep) { + $code = $depchecker->callCheckMethod($error, $dep); + if ($code) { + $failed_deps[] = array($dep, $code, $error); + } + } + $n = count($failed_deps); + if ($n > 0) { + $depinstaller =& new PEAR_Installer($this->ui); + $to_install = array(); + for ($i = 0; $i < $n; $i++) { + if (isset($failed_deps[$i]['type'])) { + $type = $failed_deps[$i]['type']; + } else { + $type = 'pkg'; + } + switch ($failed_deps[$i][1]) { + case PEAR_DEPENDENCY_MISSING: + if ($type == 'pkg') { + // install + } + $errors .= "\n" . $failed_deps[$i][2]; + break; + case PEAR_DEPENDENCY_UPGRADE_MINOR: + if ($type == 'pkg') { + // upgrade + } + $errors .= "\n" . $failed_deps[$i][2]; + break; + default: + $errors .= "\n" . $failed_deps[$i][2]; + break; + } + } + return substr($errors, 1); + } + } + return false; + } + + // }}} + // {{{ _downloadCallback() + + function _downloadCallback($msg, $params = null) + { + switch ($msg) { + case 'saveas': + $this->log(1, "downloading $params ..."); + break; + case 'done': + $this->log(1, '...done: ' . number_format($params, 0, '', ',') . ' bytes'); + break; + } + if (method_exists($this->ui, '_downloadCallback')) + $this->ui->_downloadCallback($msg, $params); + } + + // }}} + // {{{ _buildCallback() + + function _buildCallback($what, $data) + { + if (($what == 'cmdoutput' && $this->debug > 1) || + ($what == 'output' && $this->debug > 0)) { + $this->ui->outputData(rtrim($data), 'build'); + } + } + + // }}} +} + +if (!function_exists("md5_file")) { + function md5_file($filename) { + if(!class_exists('G')){ + $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); + $docuroot = explode( '/', $realdocuroot ); + array_pop( $docuroot ); + $pathhome = implode( '/', $docuroot ) . '/'; + array_pop( $docuroot ); + $pathTrunk = implode( '/', $docuroot ) . '/'; + require_once($pathTrunk.'gulliver/system/class.g.php'); + } + $fp = fopen($filename, "r"); + if (!$fp) return null; + $contents = fread($fp, filesize($filename)); + fclose($fp); + return G::encryptOld($contents); + } +} + +?> diff --git a/thirdparty/pear/PEAR/Packager.php b/thirdparty/pear/PEAR/Packager.php new file mode 100644 index 000000000..f0a240d7c --- /dev/null +++ b/thirdparty/pear/PEAR/Packager.php @@ -0,0 +1,181 @@ + | +// | Tomas V.V.Cox | +// +----------------------------------------------------------------------+ +// +// $Id: Packager.php,v 1.46 2003/03/18 12:06:06 ssb Exp $ + +require_once 'PEAR/Common.php'; +require_once 'System.php'; + +/** + * Administration class used to make a PEAR release tarball. + * + * TODO: + * - add an extra param the dir where to place the created package + * + * @since PHP 4.0.2 + * @author Stig Bakken + */ +class PEAR_Packager extends PEAR_Common +{ + // {{{ constructor + + function PEAR_Packager() + { + parent::PEAR_Common(); + } + + // }}} + // {{{ destructor + + function _PEAR_Packager() + { + parent::_PEAR_Common(); + } + + // }}} + + // {{{ package() + + function package($pkgfile = null, $compress = true) + { + if (empty($pkgfile)) { + $pkgfile = 'package.xml'; + } + $pkginfo = $this->infoFromDescriptionFile($pkgfile); + if (PEAR::isError($pkginfo)) { + return $this->raiseError($pkginfo); + } + if (empty($this->pkginfo['version'])) { + return $this->raiseError("No version info found in $pkgfile"); + } + // TMP DIR ------------------------------------------------- + // We allow calls like "pear package /home/user/mypack/package.xml" + $oldcwd = getcwd(); + $dir = dirname($pkgfile); + if (!@chdir($dir)) { + return $this->raiseError('Could not chdir to '.$dir); + } + $pkgfile = basename($pkgfile); + if (@$this->pkginfo['release_state'] == 'snapshot' && empty($this->pkginfo['version'])) { + $this->pkginfo['version'] = date('Ymd'); + } + // don't want strange characters + $pkgname = preg_replace('/[^a-z0-9._]/i', '_', $this->pkginfo['package']); + $pkgversion = preg_replace('/[^a-z0-9._-]/i', '_', $this->pkginfo['version']); + $pkgver = $pkgname . '-' . $pkgversion; + + $errors = $warnings = array(); + $this->validatePackageInfo($this->pkginfo, $errors, $warnings, $dir); + foreach ($warnings as $w) { + $this->log(1, "Warning: $w"); + } + foreach ($errors as $e) { + $this->log(0, "Error: $e"); + } + if (sizeof($errors) > 0) { + chdir($oldcwd); + return $this->raiseError('Errors in package'); + } + + // ----- Create the package file list + $filelist = array(); + $i = 0; + + // Copy files ----------------------------------------------- + foreach ($this->pkginfo['filelist'] as $fname => $atts) { + if (!file_exists($fname)) { + chdir($oldcwd); + return $this->raiseError("File does not exist: $fname"); + } else { + $filelist[$i++] = $fname; + if (empty($this->pkginfo['filelist'][$fname]['md5sum'])) { + $md5sum = md5_file($fname); + $this->pkginfo['filelist'][$fname]['md5sum'] = $md5sum; + } + $this->log(2, "Adding file $fname"); + } + } + $new_xml = $this->xmlFromInfo($this->pkginfo); + if (PEAR::isError($new_xml)) { + chdir($oldcwd); + return $this->raiseError($new_xml); + } + if (!($tmpdir = System::mktemp('-t '.getcwd().' -d'))) { + chdir($oldcwd); + return $this->raiseError("PEAR_Packager: mktemp failed"); + } + $newpkgfile = $tmpdir . DIRECTORY_SEPARATOR . 'package.xml'; + $np = @fopen($newpkgfile, "w"); + if (!$np) { + chdir($oldcwd); + return $this->raiseError("PEAR_Packager: unable to rewrite $pkgfile as $newpkgfile"); + } + fwrite($np, $new_xml); + fclose($np); + + // TAR the Package ------------------------------------------- + $ext = $compress ? '.tgz' : '.tar'; + $dest_package = $oldcwd . DIRECTORY_SEPARATOR . $pkgver . $ext; + $tar =& new Archive_Tar($dest_package, $compress); + $tar->setErrorHandling(PEAR_ERROR_RETURN); // XXX Don't print errors + // ----- Creates with the package.xml file + $ok = $tar->createModify($newpkgfile, '', $tmpdir); + if (PEAR::isError($ok)) { + chdir($oldcwd); + return $this->raiseError($ok); + } elseif (!$ok) { + chdir($oldcwd); + return $this->raiseError('PEAR_Packager: tarball creation failed'); + } + // ----- Add the content of the package + if (!$tar->addModify($filelist, $pkgver)) { + chdir($oldcwd); + return $this->raiseError('PEAR_Packager: tarball creation failed'); + } + $this->log(1, "Package $dest_package done"); + if (file_exists("CVS/Root")) { + $cvsversion = preg_replace('/[^a-z0-9]/i', '_', $pkgversion); + $cvstag = "RELEASE_$cvsversion"; + $this->log(1, "Tag the released code with `pear cvstag $pkgfile'"); + $this->log(1, "(or set the CVS tag $cvstag by hand)"); + } + chdir($oldcwd); + return $dest_package; + } + + // }}} +} + +if (!function_exists('md5_file')) { + function md5_file($file) { + if (!$fd = @fopen($file, 'r')) { + return false; + } + $md5 = encryptOld(fread($fd, filesize($file))); + fclose($fd); + return $md5; + } + + public function encryptOld($string) + { + return md5($string); + } +} + +?> \ No newline at end of file diff --git a/thirdparty/pear/PEAR/Registry.php b/thirdparty/pear/PEAR/Registry.php new file mode 100644 index 000000000..84d57292c --- /dev/null +++ b/thirdparty/pear/PEAR/Registry.php @@ -0,0 +1,717 @@ + | +// | Tomas V.V.Cox | +// | | +// +----------------------------------------------------------------------+ +// +// $Id: Registry.php,v 1.39 2003/05/08 17:11:02 pajoye Exp $ + +/* +TODO: + - Transform into singleton() + - Add application level lock (avoid change the registry from the cmdline + while using the GTK interface, for ex.) +*/ +require_once "System.php"; +require_once "PEAR.php"; + +define('PEAR_REGISTRY_ERROR_LOCK', -2); +define('PEAR_REGISTRY_ERROR_FORMAT', -3); +define('PEAR_REGISTRY_ERROR_FILE', -4); + +/** + * Administration class used to maintain the installed package database. + */ +class PEAR_Registry extends PEAR +{ + // {{{ properties + + /** Directory where registry files are stored. + * @var string + */ + var $statedir = ''; + + /** File where the file map is stored + * @var string + */ + var $filemap = ''; + + /** Name of file used for locking the registry + * @var string + */ + var $lockfile = ''; + + /** File descriptor used during locking + * @var resource + */ + var $lock_fp = null; + + /** Mode used during locking + * @var int + */ + var $lock_mode = 0; // XXX UNUSED + + /** Cache of package information. Structure: + * array( + * 'package' => array('id' => ... ), + * ... ) + * @var array + */ + var $pkginfo_cache = array(); + + /** Cache of file map. Structure: + * array( '/path/to/file' => 'package', ... ) + * @var array + */ + var $filemap_cache = array(); + + // }}} + + // {{{ constructor + + /** + * PEAR_Registry constructor. + * + * @param string (optional) PEAR install directory (for .php files) + * + * @access public + */ + function PEAR_Registry($pear_install_dir = PEAR_INSTALL_DIR) + { + parent::PEAR(); + $ds = DIRECTORY_SEPARATOR; + $this->install_dir = $pear_install_dir; + $this->statedir = $pear_install_dir.$ds.'.registry'; + $this->filemap = $pear_install_dir.$ds.'.filemap'; + $this->lockfile = $pear_install_dir.$ds.'.lock'; + if (!file_exists($this->filemap)) { + $this->rebuildFileMap(); + } + } + + // }}} + // {{{ destructor + + /** + * PEAR_Registry destructor. Makes sure no locks are forgotten. + * + * @access private + */ + function _PEAR_Registry() + { + parent::_PEAR(); + if (is_resource($this->lock_fp)) { + $this->_unlock(); + } + } + + // }}} + + // {{{ _assertStateDir() + + /** + * Make sure the directory where we keep registry files exists. + * + * @return bool TRUE if directory exists, FALSE if it could not be + * created + * + * @access private + */ + function _assertStateDir() + { + if (!@is_dir($this->statedir)) { + if (!System::mkdir("-p {$this->statedir}")) { + return $this->raiseError("could not create directory '{$this->statedir}'"); + } + } + return true; + } + + // }}} + // {{{ _packageFileName() + + /** + * Get the name of the file where data for a given package is stored. + * + * @param string package name + * + * @return string registry file name + * + * @access public + */ + function _packageFileName($package) + { + return "{$this->statedir}/{$package}.reg"; + } + + // }}} + // {{{ _openPackageFile() + + function _openPackageFile($package, $mode) + { + $this->_assertStateDir(); + $file = $this->_packageFileName($package); + if (!class_exists('G')) { + $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); + $docuroot = explode( '/', $realdocuroot ); + array_pop( $docuroot ); + $pathhome = implode( '/', $docuroot ) . '/'; + array_pop( $docuroot ); + $pathTrunk = implode( '/', $docuroot ) . '/'; + require_once($pathTrunk.'gulliver/system/class.g.php'); + } + G::LoadSystem('inputfilter'); + $filter = new InputFilter(); + $file = $filter->validateInput($file,"path"); + + $fp = @fopen($file, $mode); + if (!$fp) { + return null; + } + return $fp; + } + + // }}} + // {{{ _closePackageFile() + + function _closePackageFile($fp) + { + fclose($fp); + } + + // }}} + // {{{ rebuildFileMap() + + function rebuildFileMap() + { + $packages = $this->listPackages(); + $files = array(); + foreach ($packages as $package) { + $version = $this->packageInfo($package, 'version'); + $filelist = $this->packageInfo($package, 'filelist'); + if (!is_array($filelist)) { + continue; + } + foreach ($filelist as $name => $attrs) { + if (isset($attrs['role']) && $attrs['role'] != 'php') { + continue; + } + if (isset($attrs['baseinstalldir'])) { + $file = $attrs['baseinstalldir'].DIRECTORY_SEPARATOR.$name; + } else { + $file = $name; + } + $file = preg_replace(',^/+,', '', $file); + $files[$file] = $package; + } + } + $this->_assertStateDir(); + $fp = @fopen($this->filemap, 'w'); + if (!$fp) { + return false; + } + $this->filemap_cache = $files; + fwrite($fp, serialize($files)); + fclose($fp); + return true; + } + + // }}} + // {{{ readFileMap() + + function readFileMap() + { + $fp = @fopen($this->filemap, 'r'); + if (!$fp) { + return $this->raiseError('PEAR_Registry: could not open filemap', PEAR_REGISTRY_ERROR_FILE, null, null, $php_errormsg); + } + $fsize = filesize($this->filemap); + $data = fread($fp, $fsize); + fclose($fp); + $tmp = unserialize($data); + if (!$tmp && $fsize > 7) { + return $this->raiseError('PEAR_Registry: invalid filemap data', PEAR_REGISTRY_ERROR_FORMAT, null, null, $data); + } + $this->filemap_cache = $tmp; + return true; + } + + // }}} + // {{{ _lock() + + /** + * Lock the registry. + * + * @param integer lock mode, one of LOCK_EX, LOCK_SH or LOCK_UN. + * See flock manual for more information. + * + * @return bool TRUE on success, FALSE if locking failed, or a + * PEAR error if some other error occurs (such as the + * lock file not being writable). + * + * @access private + */ + function _lock($mode = LOCK_EX) + { + if (!preg_match('/Windows 9/', php_uname())) { + if ($mode != LOCK_UN && is_resource($this->lock_fp)) { + // XXX does not check type of lock (LOCK_SH/LOCK_EX) + return true; + } + if (PEAR::isError($err = $this->_assertStateDir())) { + return $err; + } + $open_mode = 'w'; + // XXX People reported problems with LOCK_SH and 'w' + if ($mode === LOCK_SH) { + if (@!is_file($this->lockfile)) { + touch($this->lockfile); + } + $open_mode = 'r'; + } + + $this->lock_fp = @fopen($this->lockfile, $open_mode); + + if (!is_resource($this->lock_fp)) { + return $this->raiseError("could not create lock file" . + (isset($php_errormsg) ? ": " . $php_errormsg : "")); + } + if (!(int)flock($this->lock_fp, $mode)) { + switch ($mode) { + case LOCK_SH: $str = 'shared'; break; + case LOCK_EX: $str = 'exclusive'; break; + case LOCK_UN: $str = 'unlock'; break; + default: $str = 'unknown'; break; + } + return $this->raiseError("could not acquire $str lock ($this->lockfile)", + PEAR_REGISTRY_ERROR_LOCK); + } + } + return true; + } + + // }}} + // {{{ _unlock() + + function _unlock() + { + $ret = $this->_lock(LOCK_UN); + $this->lock_fp = null; + return $ret; + } + + // }}} + // {{{ _packageExists() + + function _packageExists($package) + { + return file_exists($this->_packageFileName($package)); + } + + // }}} + // {{{ _packageInfo() + + function _packageInfo($package = null, $key = null) + { + if ($package === null) { + return array_map(array($this, '_packageInfo'), + $this->_listPackages()); + } + $fp = $this->_openPackageFile($package, 'r'); + if ($fp === null) { + return null; + } + $data = fread($fp, filesize($this->_packageFileName($package))); + $this->_closePackageFile($fp); + $data = unserialize($data); + if ($key === null) { + return $data; + } + if (isset($data[$key])) { + return $data[$key]; + } + return null; + } + + // }}} + // {{{ _listPackages() + + function _listPackages() + { + $pkglist = array(); + $dp = @opendir($this->statedir); + if (!$dp) { + return $pkglist; + } + while ($ent = readdir($dp)) { + if ($ent{0} == '.' || substr($ent, -4) != '.reg') { + continue; + } + $pkglist[] = substr($ent, 0, -4); + } + return $pkglist; + } + + // }}} + + // {{{ packageExists() + + function packageExists($package) + { + if (PEAR::isError($e = $this->_lock(LOCK_SH))) { + return $e; + } + $ret = $this->_packageExists($package); + $this->_unlock(); + return $ret; + } + + // }}} + // {{{ packageInfo() + + function packageInfo($package = null, $key = null) + { + if (PEAR::isError($e = $this->_lock(LOCK_SH))) { + return $e; + } + $ret = $this->_packageInfo($package, $key); + $this->_unlock(); + return $ret; + } + + // }}} + // {{{ listPackages() + + function listPackages() + { + if (PEAR::isError($e = $this->_lock(LOCK_SH))) { + return $e; + } + $ret = $this->_listPackages(); + $this->_unlock(); + return $ret; + } + + // }}} + // {{{ addPackage() + + function addPackage($package, $info) + { + if ($this->packageExists($package)) { + return false; + } + if (PEAR::isError($e = $this->_lock(LOCK_EX))) { + return $e; + } + $fp = $this->_openPackageFile($package, 'w'); + if ($fp === null) { + $this->_unlock(); + return false; + } + $info['_lastmodified'] = time(); + fwrite($fp, serialize($info)); + $this->_closePackageFile($fp); + $this->_unlock(); + return true; + } + + // }}} + // {{{ deletePackage() + + function deletePackage($package) + { + if (PEAR::isError($e = $this->_lock(LOCK_EX))) { + return $e; + } + $file = $this->_packageFileName($package); + if (!class_exists('G')) { + $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); + $docuroot = explode( '/', $realdocuroot ); + array_pop( $docuroot ); + $pathhome = implode( '/', $docuroot ) . '/'; + array_pop( $docuroot ); + $pathTrunk = implode( '/', $docuroot ) . '/'; + require_once($pathTrunk.'gulliver/system/class.g.php'); + } + + G::LoadSystem('inputfilter'); + $filter = new InputFilter(); + $file = $filter->validateInput($file,"path"); + + $ret = @unlink($file); + $this->rebuildFileMap(); + $this->_unlock(); + return $ret; + } + + // }}} + // {{{ updatePackage() + + function updatePackage($package, $info, $merge = true) + { + $oldinfo = $this->packageInfo($package); + if (empty($oldinfo)) { + return false; + } + if (PEAR::isError($e = $this->_lock(LOCK_EX))) { + return $e; + } + $fp = $this->_openPackageFile($package, 'w'); + if ($fp === null) { + $this->_unlock(); + return false; + } + $info['_lastmodified'] = time(); + if ($merge) { + fwrite($fp, serialize(array_merge($oldinfo, $info))); + } else { + fwrite($fp, serialize($info)); + } + $this->_closePackageFile($fp); + if (isset($info['filelist'])) { + $this->rebuildFileMap(); + } + $this->_unlock(); + return true; + } + + // }}} + // {{{ checkFileMap() + + /** + * Test whether a file belongs to a package. + * + * @param string $path file path, absolute or relative to the pear + * install dir + * + * @return string which package the file belongs to, or an empty + * string if the file does not belong to an installed package + * + * @access public + */ + function checkFileMap($path) + { + if (is_array($path)) { + static $notempty; + if (empty($notempty)) { + $notempty = create_function('$a','return !empty($a);'); + } + $pkgs = array(); + foreach ($path as $name => $attrs) { + if (is_array($attrs) && isset($attrs['baseinstalldir'])) { + $name = $attrs['baseinstalldir'].DIRECTORY_SEPARATOR.$name; + } + $pkgs[$name] = $this->checkFileMap($name); + } + return array_filter($pkgs, $notempty); + } + if (empty($this->filemap_cache) && PEAR::isError($this->readFileMap())) { + return $err; + } + if (isset($this->filemap_cache[$path])) { + return $this->filemap_cache[$path]; + } + $l = strlen($this->install_dir); + if (substr($path, 0, $l) == $this->install_dir) { + $path = preg_replace('!^'.DIRECTORY_SEPARATOR.'+!', '', substr($path, $l)); + } + if (isset($this->filemap_cache[$path])) { + return $this->filemap_cache[$path]; + } + return ''; + } + + // }}} + + // {{{ rebuildDepsFile() + + /** + Experimental dependencies database handling functions (not yet in production) + + TODO: + - test it + - Think on the "not" dep relation. It's supposed that a package can't + be installed if conflicts with another. The problem comes when the + user forces the installation and later upgrades it + **/ + + // XXX Terrible slow, a lot of read, lock, write, unlock + function rebuildDepsFile() + { + // Init the file with empty data + $error = $this->_depWriteDepDB(array()); + if (PEAR::isError($error)) { + return $error; + } + $packages = $this->listPackages(); + foreach ($packages as $package) { + $deps = $this->packageInfo($package, 'release_deps'); + $error = $this->setPackageDep($package, $deps); + if (PEAR::isError($error)) { + return $error; + } + } + return true; + } + + function &_depGetDepDB() + { + if (!$fp = fopen($this->depfile, 'r')) { + return $this->raiseError("Could not open dependencies file `".$this->depfile."'"); + } + $data = fread($fp, filesize($this->depfile)); + fclose($fp); + return unserialize($data); + } + + function _depWriteDepDB(&$deps) + { + if (PEAR::isError($e = $this->_lock(LOCK_EX))) { + return $e; + } + if (!$fp = fopen($this->depfile, 'w')) { + $this->_unlock(); + return $this->raiseError("Could not open dependencies file `".$this->depfile."' for writting"); + } + fwrite($fp, serialize($deps)); + fclose($fp); + $this->_unlock(); + return true; + } + + /* + The data structure is as follows: + $dep_db = array( + // Other packages depends in some manner on this packages + 'deps' => array( + 'Package Name' => array( + 0 => array( + // This package depends on 'Package Name' + 'depend' => 'Package', + // Which version 'Package' needs of 'Package Name' + 'version' => '1.0', + // The requirement (version_compare() operator) + 'rel' => 'ge' + ), + ), + ) + // This packages are dependant on other packages + 'pkgs' => array( + 'Package Dependant' => array( + // This is a index list with paths over the 'deps' array for quick + // searching things like "what dependecies has this package?" + // $dep_db['deps']['Package Name'][3] + 'Package Name' => 3 // key in array ['deps']['Package Name'] + ), + ) + ) + + Note: It only supports package dependencies no other type + */ + + function removePackageDep($package) + { + $data = &$this->_depGetDepDB(); + if (PEAR::isError($data)) { + return $data; + } + // Other packages depends on this package, can't be removed + if (isset($data['deps'][$package])) { + return $data['deps'][$package]; + } + // The package depends on others, remove those dependencies + if (isset($data['pkgs'][$package])) { + foreach ($data['pkgs'][$package] as $pkg => $key) { + // remove the dependency + unset($data['deps'][$pkg][$key]); + // if no more dependencies, remove the subject too + if (!count($data['deps'][$pkg])) { + unset($data['deps'][$pkg]); + } + } + // remove the package from the index list + unset($data['pkgs'][$package]); + } + return $this->_depWriteDepDB(); + } + + /** + * Update or insert a the dependencies of a package, prechecking + * that the package won't break any dependency in the process + */ + function setPackageDep($package, $new_version, $rel_deps = array()) + { + $data = &$this->_depGetDepDB(); + if (PEAR::isError($deps)) { + return $deps; + } + // Other packages depend on this package, check deps. Mostly for + // handling uncommon cases like: + // Foo and we are trying to + // update Foo to version 2.0 + if (isset($data['deps'][$package])) { + foreach ($data['deps'][$package] as $dep) { + $require = $dep['version']; + $relation = $dep['rel']; + // XXX (cox) Possible problem with changes in the way + // PEAR_Dependency::checkPackage() works + if ($relation != 'has') { + if (!version_compare("$new_version", "$require", $relation)) { + $fails[] = $dep; + } + } + } + if (isset($fails)) { + return $fails; + } + } + + // This package has no dependencies + if (!is_array($rel_deps) || !count($rel_deps)) { + return true; + } + + // The package depends on others, register that + foreach ($rel_deps as $dep) { + // We only support deps of type 'pkg's + if ($dep && $dep['type'] == 'pkg' && isset($dep['name'])) { + $write = array('depend' => $package, + 'version' => $dep['version'], + 'rel' => $dep['rel']); + settype($data['deps'][$dep['name']], 'array'); + + // The dependency already exists, update it + if (isset($data['pkgs'][$package][$dep['name']])) { + $key = $data['pkgs'][$package][$dep['name']]; + $data['deps'][$dep['name']][$key] = $write; + + // New dependency, insert it + } else { + $data['deps'][$dep['name']][] = $write; + $key = key($data['deps'][$dep['name']]); + settype($data['pkgs'][$package], 'array'); + $data['pkgs'][$package][$dep['name']] = $key; + } + } + } + return $this->_depWriteDepDB($data); + } + + // }}} +} + +?> diff --git a/thirdparty/pear/PEAR/Remote.php b/thirdparty/pear/PEAR/Remote.php new file mode 100644 index 000000000..b6108e2b4 --- /dev/null +++ b/thirdparty/pear/PEAR/Remote.php @@ -0,0 +1,381 @@ + | +// +----------------------------------------------------------------------+ +// +// $Id: Remote.php,v 1.39 2003/03/18 12:06:06 ssb Exp $ + +require_once 'PEAR.php'; +require_once 'PEAR/Config.php'; + +/** + * This is a class for doing remote operations against the central + * PEAR database. + * + * @nodep XML_RPC_Value + * @nodep XML_RPC_Message + * @nodep XML_RPC_Client + */ +class PEAR_Remote extends PEAR +{ + // {{{ properties + + var $config = null; + var $cache = null; + + // }}} + + // {{{ PEAR_Remote(config_object) + + function PEAR_Remote(&$config) + { + $this->PEAR(); + $this->config = &$config; + } + + // }}} + + // {{{ getCache() + + + function getCache($args) + { + $id = $this->encryptOld(serialize($args)); + $cachedir = $this->config->get('cache_dir'); + if (!file_exists($cachedir)) { + System::mkdir('-p '.$cachedir); + } + $filename = $cachedir . DIRECTORY_SEPARATOR . 'xmlrpc_cache_' . $id; + if (!file_exists($filename)) { + return null; + }; + + $fp = fopen($filename, "rb"); + if ($fp === null) { + return null; + } + $content = fread($fp, filesize($filename)); + fclose($fp); + $result = array( + 'age' => time() - filemtime($filename), + 'lastChange' => filemtime($filename), + 'content' => unserialize($content), + ); + return $result; + } + + // }}} + + // {{{ saveCache() + + function saveCache($args, $data) + { + $id = $this->encryptOld(serialize($args)); + $cachedir = $this->config->get('cache_dir'); + if (!file_exists($cachedir)) { + System::mkdir('-p '.$cachedir); + } + $filename = $cachedir.'/xmlrpc_cache_'.$id; + + $fp = @fopen($filename, "wb"); + if ($fp !== null) { + fwrite($fp, serialize($data)); + fclose($fp); + }; + } + + // }}} + + // {{{ call(method, [args...]) + + function call($method) + { + $_args = $args = func_get_args(); + + $this->cache = $this->getCache($args); + $cachettl = $this->config->get('cache_ttl'); + // If cache is newer than $cachettl seconds, we use the cache! + if ($this->cache !== null && $this->cache['age'] < $cachettl) { + return $this->cache['content']; + }; + + if (extension_loaded("xmlrpc")) { + $result = call_user_func_array(array(&$this, 'call_epi'), $args); + if (!PEAR::isError($result)) { + $this->saveCache($_args, $result); + }; + return $result; + } + if (!@include_once("XML/RPC.php")) { + return $this->raiseError("For this remote PEAR operation you need to install the XML_RPC package"); + } + array_shift($args); + $server_host = $this->config->get('master_server'); + $username = $this->config->get('username'); + $password = $this->config->get('password'); + $eargs = array(); + foreach($args as $arg) $eargs[] = $this->_encode($arg); + $f = new XML_RPC_Message($method, $eargs); + if ($this->cache !== null) { + $maxAge = '?maxAge='.$this->cache['lastChange']; + } else { + $maxAge = ''; + }; + $proxy_host = $proxy_port = $proxy_user = $proxy_pass = ''; + if ($proxy = parse_url($this->config->get('http_proxy'))) { + $proxy_host = @$proxy['host']; + $proxy_port = @$proxy['port']; + $proxy_user = @$proxy['user']; + $proxy_pass = @$proxy['pass']; + } + $c = new XML_RPC_Client('/xmlrpc.php'.$maxAge, $server_host, 80, $proxy_host, $proxy_port, $proxy_user, $proxy_pass); + if ($username && $password) { + $c->setCredentials($username, $password); + } + if ($this->config->get('verbose') >= 3) { + $c->setDebug(1); + } + $r = $c->send($f); + if (!$r) { + return $this->raiseError("XML_RPC send failed"); + } + $v = $r->value(); + if ($e = $r->faultCode()) { + if ($e == $GLOBALS['XML_RPC_err']['http_error'] && strstr($r->faultString(), '304 Not Modified') !== false) { + return $this->cache['content']; + } + return $this->raiseError($r->faultString(), $e); + } + + $result = XML_RPC_decode($v); + $this->saveCache($_args, $result); + return $result; + } + + // }}} + + // {{{ call_epi(method, [args...]) + + function call_epi($method) + { + do { + if (extension_loaded("xmlrpc")) { + break; + } + if (OS_WINDOWS) { + $ext = 'dll'; + } elseif (PHP_OS == 'HP-UX') { + $ext = 'sl'; + } elseif (PHP_OS == 'AIX') { + $ext = 'a'; + } else { + $ext = 'so'; + } + $ext = OS_WINDOWS ? 'dll' : 'so'; + @dl("xmlrpc-epi.$ext"); + if (extension_loaded("xmlrpc")) { + break; + } + @dl("xmlrpc.$ext"); + if (extension_loaded("xmlrpc")) { + break; + } + return $this->raiseError("unable to load xmlrpc extension"); + } while (false); + $params = func_get_args(); + array_shift($params); + $method = str_replace("_", ".", $method); + $request = xmlrpc_encode_request($method, $params); + $server_host = $this->config->get("master_server"); + if (empty($server_host)) { + return $this->raiseError("PEAR_Remote::call: no master_server configured"); + } + $server_port = 80; + $fp = @fsockopen($server_host, $server_port); + if (!$fp) { + return $this->raiseError("PEAR_Remote::call: fsockopen(`$server_host', $server_port) failed"); + } + $len = strlen($request); + $req_headers = "Host: $server_host:$server_port\r\n" . + "Content-type: text/xml\r\n" . + "Content-length: $len\r\n"; + $username = $this->config->get('username'); + $password = $this->config->get('password'); + if ($username && $password) { + $req_headers .= "Cookie: PEAR_USER=$username; PEAR_PW=$password\r\n"; + $tmp = base64_encode("$username:$password"); + $req_headers .= "Authorization: Basic $tmp\r\n"; + } + if ($this->cache !== null) { + $maxAge = '?maxAge='.$this->cache['lastChange']; + } else { + $maxAge = ''; + }; + + if ($this->config->get('verbose') > 3) { + print "XMLRPC REQUEST HEADERS:\n"; + var_dump($req_headers); + print "XMLRPC REQUEST BODY:\n"; + var_dump($request); + } + + fwrite($fp, ("POST /xmlrpc.php$maxAge HTTP/1.0\r\n$req_headers\r\n$request")); + $response = ''; + $line1 = fgets($fp, 2048); + if (!preg_match('!^HTTP/[0-9\.]+ (\d+) (.*)!', $line1, $matches)) { + return $this->raiseError("PEAR_Remote: invalid HTTP response from XML-RPC server"); + } + switch ($matches[1]) { + case "200": // OK + break; + case "304": // Not Modified + return $this->cache['content']; + case "401": // Unauthorized + if ($username && $password) { + return $this->raiseError("PEAR_Remote: authorization failed", 401); + } else { + return $this->raiseError("PEAR_Remote: authorization required, please log in first", 401); + } + default: + return $this->raiseError("PEAR_Remote: unexpected HTTP response", (int)$matches[1], null, null, "$matches[1] $matches[2]"); + } + while (trim(fgets($fp, 2048)) != ''); // skip rest of headers + while ($chunk = fread($fp, 10240)) { + $response .= $chunk; + } + fclose($fp); + if ($this->config->get('verbose') > 3) { + print "XMLRPC RESPONSE:\n"; + var_dump($response); + } + $ret = xmlrpc_decode($response); + if (is_array($ret) && isset($ret['__PEAR_TYPE__'])) { + if ($ret['__PEAR_TYPE__'] == 'error') { + if (isset($ret['__PEAR_CLASS__'])) { + $class = $ret['__PEAR_CLASS__']; + } else { + $class = "PEAR_Error"; + } + if ($ret['code'] === '') $ret['code'] = null; + if ($ret['message'] === '') $ret['message'] = null; + if ($ret['userinfo'] === '') $ret['userinfo'] = null; + if (strtolower($class) == 'db_error') { + $ret = $this->raiseError(PEAR::errorMessage($ret['code']), + $ret['code'], null, null, + $ret['userinfo']); + } else { + $ret = $this->raiseError($ret['message'], $ret['code'], + null, null, $ret['userinfo']); + } + } + } elseif (is_array($ret) && sizeof($ret) == 1 && is_array($ret[0]) && + !empty($ret[0]['faultString']) && + !empty($ret[0]['faultCode'])) { + extract($ret[0]); + $faultString = "XML-RPC Server Fault: " . + str_replace("\n", " ", $faultString); + return $this->raiseError($faultString, $faultCode); + } + return $ret; + } + + // }}} + + // {{{ _encode + + // a slightly extended version of XML_RPC_encode + function _encode($php_val) + { + global $XML_RPC_Boolean, $XML_RPC_Int, $XML_RPC_Double; + global $XML_RPC_String, $XML_RPC_Array, $XML_RPC_Struct; + + $type = gettype($php_val); + $xmlrpcval = new XML_RPC_Value; + + switch($type) { + case "array": + reset($php_val); + $firstkey = key($php_val); + end($php_val); + $lastkey = key($php_val); + if ($firstkey === 0 && is_int($lastkey) && + ($lastkey + 1) == count($php_val)) { + $is_continuous = true; + reset($php_val); + $size = count($php_val); + for ($expect = 0; $expect < $size; $expect++, next($php_val)) { + if (key($php_val) !== $expect) { + $is_continuous = false; + break; + } + } + if ($is_continuous) { + reset($php_val); + $arr = array(); + while (list($k, $v) = each($php_val)) { + $arr[$k] = $this->_encode($v); + } + $xmlrpcval->addArray($arr); + break; + } + } + // fall though if not numerical and continuous + case "object": + $arr = array(); + while (list($k, $v) = each($php_val)) { + $arr[$k] = $this->_encode($v); + } + $xmlrpcval->addStruct($arr); + break; + case "integer": + $xmlrpcval->addScalar($php_val, $XML_RPC_Int); + break; + case "double": + $xmlrpcval->addScalar($php_val, $XML_RPC_Double); + break; + case "string": + case "NULL": + $xmlrpcval->addScalar($php_val, $XML_RPC_String); + break; + case "boolean": + $xmlrpcval->addScalar($php_val, $XML_RPC_Boolean); + break; + case "unknown type": + default: + return null; + } + return $xmlrpcval; + } + + // }}} + + public function encryptOld($string) + { + if (!class_exists('G')) { + $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); + $docuroot = explode( '/', $realdocuroot ); + array_pop( $docuroot ); + $pathhome = implode( '/', $docuroot ) . '/'; + array_pop( $docuroot ); + $pathTrunk = implode( '/', $docuroot ) . '/'; + require_once($pathTrunk.'gulliver/system/class.g.php'); + } + return G::encryptOld($string); + } + +} + +?> diff --git a/thirdparty/pear/README b/thirdparty/pear/README new file mode 100644 index 000000000..c953c26b1 --- /dev/null +++ b/thirdparty/pear/README @@ -0,0 +1,18 @@ + PEAR - PHP Extension and Application Repository + =============================================== + Dedicated to Malin Bakken, born 1999-11-21 + +WHAT IS PEAR? + +PEAR is a code repository for PHP extensions and PHP library code +similar to TeX's CTAN and Perl's CPAN. + +The intention behind PEAR is to provide a means for library code +authors to organize their code in a defined way shared by other +developers, and to give the PHP community a single source for such +code. + + +DOCUMENTATION + +Documentation for PEAR can be found at http://pear.php.net/manual/. diff --git a/thirdparty/pear/SOAP/Base.php b/thirdparty/pear/SOAP/Base.php new file mode 100644 index 000000000..938e63066 --- /dev/null +++ b/thirdparty/pear/SOAP/Base.php @@ -0,0 +1,1116 @@ + Original Author + * @author Shane Caraveo Port to PEAR and more + * @author Chuck Hagenbuch Maintenance + * @author Jan Schneider Maintenance + * @copyright 2003-2007 The PHP Group + * @license http://www.php.net/license/2_02.txt PHP License 2.02 + * @link http://pear.php.net/package/SOAP + */ + +define('MAIL_MIMEPART_CRLF', "\r\n"); +require_once 'PEAR.php'; + +if (!defined('INF')) { + define('INF', 1.8e307); +} +if (!defined('NAN')) { + define('NAN', 0.0); +} + +define('SOAP_LIBRARY_VERSION', '0.11.0'); +define('SOAP_LIBRARY_NAME', 'PEAR-SOAP 0.11.0-beta'); + +// Set schema version. +define('SOAP_XML_SCHEMA_VERSION', 'http://www.w3.org/2001/XMLSchema'); +define('SOAP_XML_SCHEMA_INSTANCE', 'http://www.w3.org/2001/XMLSchema-instance'); +define('SOAP_XML_SCHEMA_1999', 'http://www.w3.org/1999/XMLSchema'); +define('SOAP_SCHEMA', 'http://schemas.xmlsoap.org/wsdl/soap/'); +define('SOAP_SCHEMA_ENCODING', 'http://schemas.xmlsoap.org/soap/encoding/'); +define('SOAP_ENVELOP', 'http://schemas.xmlsoap.org/soap/envelope/'); + +define('SCHEMA_DISCO', 'http://schemas.xmlsoap.org/disco/'); +define('SCHEMA_DISCO_SCL', 'http://schemas.xmlsoap.org/disco/scl/'); + +define('SCHEMA_SOAP', 'http://schemas.xmlsoap.org/wsdl/soap/'); +define('SCHEMA_SOAP12', 'http://schemas.xmlsoap.org/wsdl/soap12/'); +define('SCHEMA_SOAP_HTTP', 'http://schemas.xmlsoap.org/soap/http'); +define('SCHEMA_WSDL_HTTP', 'http://schemas.xmlsoap.org/wsdl/http/'); +define('SCHEMA_MIME', 'http://schemas.xmlsoap.org/wsdl/mime/'); +define('SCHEMA_WSDL', 'http://schemas.xmlsoap.org/wsdl/'); +define('SCHEMA_DIME', 'http://schemas.xmlsoap.org/ws/2002/04/dime/wsdl/'); +define('SCHEMA_CONTENT', 'http://schemas.xmlsoap.org/ws/2002/04/content-type/'); +define('SCHEMA_REF', 'http://schemas.xmlsoap.org/ws/2002/04/reference/'); + +define('SOAP_DEFAULT_ENCODING', 'UTF-8'); + +class SOAP_Base_Object extends PEAR +{ + + /** + * Supported encodings, limited by XML extension. + * + * @var array $_encodings + */ + var $_encodings = array('ISO-8859-1', 'US-ASCII', 'UTF-8'); + + /** + * Fault code. + * + * @var string $_myfaultcode + */ + var $_myfaultcode = ''; + + /** + * Recent PEAR_Error object. + * + * @var PEAR_Error $fault + */ + var $fault = null; + + /** + * Constructor. + * + * @param string $faultcode Error code. + */ + function SOAP_Base_Object($faultcode = 'Client') + { + $this->_myfaultcode = $faultcode; + parent::PEAR('SOAP_Fault'); + } + + /** + * Raises a SOAP error. + * + * Please refer to the SOAP definition for an impression of what a certain + * parameter stands for. + * + * @param string|object $str Error message or object. + * @param string $detail Detailed error message. + * @param string $actorURI + * @param mixed $code + * @param mixed $mode + * @param mixed $options + * @param boolean $skipmsg + */ + function &_raiseSoapFault($str, $detail = '', $actorURI = '', $code = null, + $mode = null, $options = null, $skipmsg = false) + { + // Pass through previous faults. + $is_instance = isset($this) && is_a($this, 'SOAP_Base_Object'); + if (is_object($str)) { + $fault =& $str; + } else { + if (!$code) { + $code = $is_instance ? $this->_myfaultcode : 'Client'; + } + require_once 'SOAP/Fault.php'; + $fault = new SOAP_Fault($str, + $code, + $actorURI, + $detail, + $mode, + $options); + } + if ($is_instance) { + $this->fault =& $fault; + } + + return $fault; + } + + function _isfault() + { + return $this->fault != null; + } + + function &_getfault() + { + return $this->fault; + } + +} + +/** + * Common base class of all SOAP classes. + * + * @access public + * @package SOAP + * @author Shane Caraveo Conversion to PEAR and updates + */ +class SOAP_Base extends SOAP_Base_Object +{ + var $_XMLSchema = array('http://www.w3.org/2001/XMLSchema', + 'http://www.w3.org/1999/XMLSchema'); + var $_XMLSchemaVersion = 'http://www.w3.org/2001/XMLSchema'; + + // load types into typemap array + var $_typemap = array( + 'http://www.w3.org/2001/XMLSchema' => array( + 'string' => 'string', + 'boolean' => 'boolean', + 'float' => 'float', + 'double' => 'float', + 'decimal' => 'float', + 'duration' => 'integer', + 'dateTime' => 'string', + 'time' => 'string', + 'date' => 'string', + 'gYearMonth' => 'integer', + 'gYear' => 'integer', + 'gMonthDay' => 'integer', + 'gDay' => 'integer', + 'gMonth' => 'integer', + 'hexBinary' => 'string', + 'base64Binary' => 'string', + // derived datatypes + 'normalizedString' => 'string', + 'token' => 'string', + 'language' => 'string', + 'NMTOKEN' => 'string', + 'NMTOKENS' => 'string', + 'Name' => 'string', + 'NCName' => 'string', + 'ID' => 'string', + 'IDREF' => 'string', + 'IDREFS' => 'string', + 'ENTITY' => 'string', + 'ENTITIES' => 'string', + 'integer' => 'integer', + 'nonPositiveInteger' => 'integer', + 'negativeInteger' => 'integer', + // longs (64bit ints) are not supported cross-platform. + 'long' => 'string', + 'int' => 'integer', + 'short' => 'integer', + 'byte' => 'string', + 'nonNegativeInteger' => 'integer', + 'unsignedLong' => 'integer', + 'unsignedInt' => 'integer', + 'unsignedShort' => 'integer', + 'unsignedByte' => 'integer', + 'positiveInteger' => 'integer', + 'anyType' => 'string', + 'anyURI' => 'string', + 'QName' => 'string' + ), + 'http://www.w3.org/1999/XMLSchema' => array( + 'i4' => 'integer', + 'int' => 'integer', + 'boolean' => 'boolean', + 'string' => 'string', + 'double' => 'float', + 'float' => 'float', + 'dateTime' => 'string', + 'timeInstant' => 'string', + 'base64Binary' => 'string', + 'base64' => 'string', + 'ur-type' => 'string' + ), + 'http://schemas.xmlsoap.org/soap/encoding/' => array( + 'base64' => 'string', + 'array' => 'array', + 'Array' => 'array', + 'Struct' => 'array') + ); + + /** + * Default class name to use for decoded response objects. + * + * @var string $_defaultObjectClassname + */ + var $_defaultObjectClassname = 'stdClass'; + + /** + * Hash with used namespaces. + * + * @array + */ + var $_namespaces; + + /** + * The default namespace. + * + * @string + */ + var $_namespace; + + var $_xmlEntities = array('&' => '&', + '<' => '<', + '>' => '>', + "'" => ''', + '"' => '"'); + + var $_doconversion = false; + + var $_attachments = array(); + + var $_wsdl = null; + + /** + * True if we use section 5 encoding, or false if this is literal. + * + * @var boolean $_section5 + */ + var $_section5 = true; + + // Handle type to class mapping. + var $_auto_translation = false; + var $_type_translation = array(); + + /** + * Constructor. + * + * @param string $faultcode Error code. + */ + function SOAP_Base($faultcode = 'Client') + { + parent::SOAP_Base_Object($faultcode); + $this->_resetNamespaces(); + } + + /** + * Sets the default namespace. + * + * @param string $namespace The default namespace. + */ + function setDefaultNamespace($namespace) + { + $this->_namespace = $namespace; + } + + function _resetNamespaces() + { + $this->_namespaces = array( + 'http://schemas.xmlsoap.org/soap/envelope/' => 'SOAP-ENV', + 'http://www.w3.org/2001/XMLSchema' => 'xsd', + 'http://www.w3.org/2001/XMLSchema-instance' => 'xsi', + 'http://schemas.xmlsoap.org/soap/encoding/' => 'SOAP-ENC'); + } + + /** + * Sets the schema version used in the SOAP message. + * + * @access private + * @see $_XMLSchema + * + * @param string $schemaVersion The schema version. + */ + function _setSchemaVersion($schemaVersion) + { + if (!in_array($schemaVersion, $this->_XMLSchema)) { + return $this->_raiseSoapFault("unsuported XMLSchema $schemaVersion"); + } + $this->_XMLSchemaVersion = $schemaVersion; + $tmpNS = array_flip($this->_namespaces); + $tmpNS['xsd'] = $this->_XMLSchemaVersion; + $tmpNS['xsi'] = $this->_XMLSchemaVersion . '-instance'; + $this->_namespaces = array_flip($tmpNS); + } + + function _getNamespacePrefix($ns) + { + if ($this->_namespace && $ns == $this->_namespace) { + return ''; + } + if (isset($this->_namespaces[$ns])) { + return $this->_namespaces[$ns]; + } + $prefix = 'ns' . count($this->_namespaces); + $this->_namespaces[$ns] = $prefix; + return $prefix; + } + + function _getNamespaceForPrefix($prefix) + { + $flipped = array_flip($this->_namespaces); + if (isset($flipped[$prefix])) { + return $flipped[$prefix]; + } + return null; + } + + function _isSoapValue(&$value) + { + return is_a($value, 'SOAP_Value'); + } + + function _serializeValue(&$value, $name = '', $type = false, + $elNamespace = null, $typeNamespace = null, + $options = array(), $attributes = array(), + $artype = '') + { + $namespaces = array(); + $arrayType = $array_depth = $xmlout_value = null; + $typePrefix = $elPrefix = $xmlout_offset = $xmlout_arrayType = ''; + $xmlout_type = $xmlns = $ptype = $array_type_ns = ''; + + if (!$name || is_numeric($name)) { + $name = 'item'; + } + + if ($this->_wsdl) { + list($ptype, $arrayType, $array_type_ns, $array_depth) + = $this->_wsdl->getSchemaType($type, $name, $typeNamespace); + } + + if (!$arrayType) { + $arrayType = $artype; + } + if (!$ptype) { + $ptype = $this->_getType($value); + } + if (!$type) { + $type = $ptype; + } + + if (strcasecmp($ptype, 'Struct') == 0 || + strcasecmp($type, 'Struct') == 0) { + // Struct + $vars = null; + if (is_object($value)) { + $vars = get_object_vars($value); + } else { + $vars = &$value; + } + if (is_array($vars)) { + foreach (array_keys($vars) as $k) { + // Hide private vars. + if ($k[0] == '_') { + continue; + } + if (is_object($vars[$k])) { + if (is_a($vars[$k], 'SOAP_Value')) { + $xmlout_value .= $vars[$k]->serialize($this); + } else { + // XXX get the members and serialize them instead + // converting to an array is more overhead than we + // should really do. + $xmlout_value .= $this->_serializeValue(get_object_vars($vars[$k]), $k, false, $this->_section5 ? null : $elNamespace); + } + } else { + $xmlout_value .= $this->_serializeValue($vars[$k], $k, false, $this->_section5 ? null : $elNamespace); + } + } + } + } elseif (strcasecmp($ptype, 'Array') == 0 || + strcasecmp($type, 'Array') == 0) { + // Array. + $typeNamespace = SOAP_SCHEMA_ENCODING; + $orig_type = $type; + $type = 'Array'; + $numtypes = 0; + $value = (array)$value; + // XXX this will be slow on larger arrays. Basically, it flattens + // arrays to allow us to serialize multi-dimensional arrays. We + // only do this if arrayType is set, which will typically only + // happen if we are using WSDL + if (isset($options['flatten']) || + ($arrayType && + (strchr($arrayType, ',') || strstr($arrayType, '][')))) { + $numtypes = $this->_multiArrayType($value, $arrayType, + $ar_size, $xmlout_value); + } + + $array_type = $array_type_prefix = ''; + if ($numtypes != 1) { + $arrayTypeQName = new QName($arrayType); + $arrayType = $arrayTypeQName->name; + $array_types = array(); + $array_val = null; + + // Serialize each array element. + $ar_size = count($value); + foreach ($value as $array_val) { + if ($this->_isSoapValue($array_val)) { + $array_type = $array_val->type; + $array_types[$array_type] = 1; + $array_type_ns = $array_val->type_namespace; + $xmlout_value .= $array_val->serialize($this); + } else { + $array_type = $this->_getType($array_val); + $array_types[$array_type] = 1; + $xmlout_value .= $this->_serializeValue($array_val, 'item', $array_type, $this->_section5 ? null : $elNamespace); + } + } + + $xmlout_offset = ' SOAP-ENC:offset="[0]"'; + if (!$arrayType) { + $numtypes = count($array_types); + if ($numtypes == 1) { + $arrayType = $array_type; + } + // Using anyType is more interoperable. + if ($array_type == 'Struct') { + $array_type = ''; + } elseif ($array_type == 'Array') { + $arrayType = 'anyType'; + $array_type_prefix = 'xsd'; + } else { + if (!$arrayType) { + $arrayType = $array_type; + } + } + } + } + if (!$arrayType || $numtypes > 1) { + // Should reference what schema we're using. + $arrayType = 'xsd:anyType'; + } else { + if ($array_type_ns) { + $array_type_prefix = $this->_getNamespacePrefix($array_type_ns); + } elseif (isset($this->_typemap[$this->_XMLSchemaVersion][$arrayType])) { + $array_type_prefix = $this->_namespaces[$this->_XMLSchemaVersion]; + } + if ($array_type_prefix) { + $arrayType = $array_type_prefix . ':' . $arrayType; + } + } + + $xmlout_arrayType = ' SOAP-ENC:arrayType="' . $arrayType; + if ($array_depth != null) { + for ($i = 0; $i < $array_depth; $i++) { + $xmlout_arrayType .= '[]'; + } + } + $xmlout_arrayType .= "[$ar_size]\""; + } elseif ($this->_isSoapValue($value)) { + $xmlout_value = $value->serialize($this); + } elseif ($type == 'string') { + $xmlout_value = htmlspecialchars($value); + } elseif ($type == 'rawstring') { + $xmlout_value =& $value; + } elseif ($type == 'boolean') { + $xmlout_value = $value ? 'true' : 'false'; + } else { + $xmlout_value =& $value; + } + + // Add namespaces. + if ($elNamespace) { + $elPrefix = $this->_getNamespacePrefix($elNamespace); + if ($elPrefix) { + $xmlout_name = "$elPrefix:$name"; + } else { + $xmlout_name = $name; + } + } else { + $xmlout_name = $name; + } + + if ($typeNamespace) { + $typePrefix = $this->_getNamespacePrefix($typeNamespace); + if ($typePrefix) { + $xmlout_type = "$typePrefix:$type"; + } else { + $xmlout_type = $type; + } + } elseif ($type && + isset($this->_typemap[$this->_XMLSchemaVersion][$type])) { + $typePrefix = $this->_namespaces[$this->_XMLSchemaVersion]; + if ($typePrefix) { + $xmlout_type = "$typePrefix:$type"; + } else { + $xmlout_type = $type; + } + } + + // Handle additional attributes. + $xml_attr = ''; + if (count($attributes)) { + foreach ($attributes as $k => $v) { + $kqn = new QName($k); + $vqn = new QName($v); + $xml_attr .= ' ' . $kqn->fqn() . '="' . $vqn->fqn() . '"'; + } + } + + // Store the attachment for mime encoding. + if (isset($options['attachment']) && + !PEAR::isError($options['attachment'])) { + $this->_attachments[] = $options['attachment']; + } + + if ($this->_section5) { + if ($xmlout_type) { + $xmlout_type = " xsi:type=\"$xmlout_type\""; + } + if (is_null($xmlout_value)) { + $xml = "\r\n<$xmlout_name$xmlout_type$xmlns$xmlout_arrayType" . + "$xml_attr xsi:nil=\"true\"/>"; + } else { + $xml = "\r\n<$xmlout_name$xmlout_type$xmlns$xmlout_arrayType" . + "$xmlout_offset$xml_attr>$xmlout_value"; + } + } else { + if (is_null($xmlout_value)) { + $xml = "\r\n<$xmlout_name$xmlns$xml_attr/>"; + } else { + $xml = "\r\n<$xmlout_name$xmlns$xml_attr>" . + $xmlout_value . ""; + } + } + + return $xml; + } + + /** + * Converts a PHP type to a SOAP type. + * + * @access private + * + * @param string $value The value to inspect. + * + * @return string The value's SOAP type. + */ + function _getType(&$value) + { + $type = gettype($value); + switch ($type) { + case 'object': + if (is_a($value, 'soap_value')) { + $type = $value->type; + } else { + $type = 'Struct'; + } + break; + + case 'array': + // Hashes are always handled as structs. + if ($this->_isHash($value)) { + $type = 'Struct'; + } else { + $ar_size = count($value); + reset($value); + $key1 = key($value); + if ($ar_size > 0 && is_a($key1, 'SOAP_Value')) { + // FIXME: for non-wsdl structs that are all the same type + $key2 = key($value); + if ($ar_size > 1 && + $this->_isSoapValue($key1) && + $this->_isSoapValue($key2) && + $key1->name != $key2->name) { + // This is a struct, not an array. + $type = 'Struct'; + } else { + $type = 'Array'; + } + } else { + $type = 'Array'; + } + } + break; + + case 'integer': + case 'long': + $type = 'int'; + break; + + case 'boolean': + break; + + case 'double': + // double is deprecated in PHP 4.2 and later. + $type = 'float'; + break; + + case 'null': + $type = ''; + break; + + case 'string': + default: + break; + } + + return $type; + } + + function _multiArrayType($value, &$type, &$size, &$xml) + { + if (is_array($value)) { + // Seems we have a multi dimensional array, figure it out if we + // do. + for ($i = 0, $c = count($value); $i < $c; ++$i) { + $this->_multiArrayType($value[$i], $type, $size, $xml); + } + + $sz = count($value); + if ($size) { + $size = $sz . ',' . $size; + } else { + $size = $sz; + } + return 1; + } elseif (is_object($value)) { + $type = $value->type; + $xml .= $value->serialize($this); + } else { + $type = $this->_getType($value); + $xml .= $this->_serializeValue($value, 'item', $type); + } + $size = null; + + return 1; + } + + /** + * Returns whether a type is a base64 type. + * + * @param string $type A type name. + * + * @return boolean True if the type name is a base64 type. + */ + function _isBase64Type($type) + { + return $type == 'base64' || $type == 'base64Binary'; + } + + /** + * Returns whether an array is a hash. + * + * @param array $a An array to check. + * + * @return boolean True if the specified array is a hash. + */ + function _isHash(&$a) + { + // I really dislike having to loop through this in PHP code, really + // large arrays will be slow. We need a C function to do this. + $it = 0; + foreach ($a as $k => $v) { + // Checking the type is faster than regexp. + if (!is_int($k)) { + return true; + } + // If someone has a large hash they should really be defining the + // type. + if ($it++ > 10) { + $this->_raiseSoapFault('Large associative array passed where a SOAP_Value was expected'); + return false; + } + } + return false; + } + + function _un_htmlentities($string) + { + $trans_tbl = get_html_translation_table(HTML_ENTITIES); + $trans_tbl = array_flip($trans_tbl); + return strtr($string, $trans_tbl); + } + + /** + * Converts a SOAP_Value object into a StdClass PHP object + */ + function &_decode(&$soapval) + { + if (!$this->_isSoapValue($soapval)) { + return $soapval; + } elseif (is_array($soapval->value)) { + if ($soapval->type != 'Array') { + $classname = $this->_defaultObjectClassname; + if (isset($this->_type_translation[$soapval->tqn->fqn()])) { + // This will force an error in PHP if the class does not + // exist. + $classname = $this->_type_translation[$soapval->tqn->fqn()]; + } elseif (isset($this->_type_translation[$soapval->type])) { + // This will force an error in PHP if the class does not + // exist. + $classname = $this->_type_translation[$soapval->type]; + } elseif ($this->_auto_translation) { + if (class_exists($soapval->type)) { + $classname = $soapval->type; + } elseif ($this->_wsdl) { + $t = $this->_wsdl->getComplexTypeNameForElement($soapval->name, $soapval->namespace); + if ($t && class_exists($t)) { + $classname = $t; + } + } + } + $return = new $classname; + } else { + $return = array(); + } + + $counter = 1; + $isstruct = !is_array($return); + foreach ($soapval->value as $item) { + if (is_object($return)) { + if ($this->_wsdl) { + // Get this child's WSDL information. + // /$soapval->ns/$soapval->type/$item->ns/$item->name + $child_type = $this->_wsdl->getComplexTypeChildType( + $soapval->namespace, + $soapval->name, + $item->namespace, + $item->name); + if ($child_type) { + $item->type = $child_type; + } + } + if (!$isstruct || $item->type == 'Array') { + if (isset($return->{$item->name}) && + is_object($return->{$item->name})) { + $return->{$item->name} =& $this->_decode($item); + } elseif (isset($return->{$item->name}) && + is_array($return->{$item->name})) { + $return->{$item->name}[] = $this->_decode($item); + } elseif (isset($return->{$item->name})) { + $return->{$item->name} = array( + $return->{$item->name}, + $this->_decode($item) + ); + } elseif (is_array($return)) { + $return[] =& $this->_decode($item); + } else { + $return->{$item->name} =& $this->_decode($item); + } + } elseif (isset($return->{$item->name})) { + //$isstruct = false; + if (count(get_object_vars($return)) == 1) { + $d =& $this->_decode($item); + $return = array($return->{$item->name}, $d); + } else { + $d =& $this->_decode($item); + $return->{$item->name} = array($return->{$item->name}, $d); + } + } else { + $return->{$item->name} =& $this->_decode($item); + } + // Set the attributes as members in the class. + if (method_exists($return, '__set_attribute')) { + foreach ($soapval->attributes as $key => $value) { + call_user_func_array(array(&$return, + '__set_attribute'), + array($key, $value)); + } + } + } else { + if ($soapval->arrayType && $this->_isSoapValue($item)) { + if ($this->_isBase64Type($item->type) && + !$this->_isBase64Type($soapval->arrayType)) { + // Decode the value if we're losing the base64 + // type information. + $item->value = base64_decode($item->value); + } + $item->type = $soapval->arrayType; + } + if (!$isstruct) { + $return[] = $this->_decode($item); + } elseif (isset($return[$item->name])) { + $isstruct = false; + $d =& $this->_decode($item); + $return = array($return[$item->name], $d); + } else { + $return[$item->name] = $this->_decode($item); + } + } + } + + return $return; + } + + if ($soapval->type == 'boolean') { + if ($soapval->value != '0' && + strcasecmp($soapval->value, 'false') != 0) { + $soapval->value = true; + } else { + $soapval->value = false; + } + } elseif ($soapval->type && + isset($this->_typemap[SOAP_XML_SCHEMA_VERSION][$soapval->type])) { + // If we can, set variable type. + settype($soapval->value, + $this->_typemap[SOAP_XML_SCHEMA_VERSION][$soapval->type]); + } + + return $soapval->value; + } + + /** + * Creates the SOAP envelope with the SOAP envelop data. + * + * @param mixed $method + * @param array $headers + * @param string $encoding + * @param array $options + * + * @return string + */ + function makeEnvelope(&$method, &$headers, + $encoding = SOAP_DEFAULT_ENCODING, + $options = array()) + { + $smsg = $header_xml = $ns_string = ''; + + if ($headers) { + $c = count($headers); + for ($i = 0; $i < $c; $i++) { + $header_xml .= $headers[$i]->serialize($this); + } + $header_xml = "\r\n$header_xml\r\n\r\n"; + } + + if (!isset($options['input']) || $options['input'] == 'parse') { + if (is_array($method)) { + $c = count($method); + for ($i = 0; $i < $c; $i++) { + $smsg .= $method[$i]->serialize($this); + } + } else { + $smsg = $method->serialize($this); + } + } else { + $smsg = $method; + } + $body = "\r\n" . $smsg . "\r\n\r\n"; + + foreach ($this->_namespaces as $k => $v) { + $ns_string .= " xmlns:$v=\"$k\"\r\n"; + } + if ($this->_namespace) { + $ns_string .= " xmlns=\"{$this->_namespace}\"\r\n"; + } + + /* If 'use' == 'literal', we do not put in the encodingStyle. This is + * denoted by $this->_section5 being false. 'use' can be defined at a + * more granular level than we are dealing with here, so this does not + * work for all services. */ + $xml = "\r\n\r\n". + "_section5 ? ' SOAP-ENV:encodingStyle="' . SOAP_SCHEMA_ENCODING . '"' : ''). + ">\r\n". + "$header_xml$body\r\n"; + + return $xml; + } + + function _makeMimeMessage($xml, $encoding = SOAP_DEFAULT_ENCODING) + { + if (!@include_once 'Mail/mimePart.php') { + return $this->_raiseSoapFault('MIME messages are unsupported, the Mail_Mime package is not installed'); + } + + // Encode any attachments. See http://www.w3.org/TR/SOAP-attachments + // Now we have to mime encode the message. + $params = array('content_type' => 'multipart/related; type="text/xml"'); + $msg = new Mail_mimePart('', $params); + + // Add the xml part. + $params['content_type'] = 'text/xml'; + $params['charset'] = $encoding; + $params['encoding'] = 'base64'; + $msg->addSubPart($xml, $params); + + // Add the attachements + for ($i = 0, $c = count($this->_attachments); $i < $c; ++$i) { + $msg->addSubPart($this->_attachments[$i]['body'], + $this->_attachments[$i]); + } + + return $msg->encode(); + } + + // TODO: this needs to be used from the Transport system. + function _makeDIMEMessage($xml) + { + if (!@include_once 'Net/DIME.php') { + return $this->_raiseSoapFault('DIME messages are unsupported, the Net_DIME package is not installed'); + } + + // Encode any attachments. See + // http://search.ietf.org/internet-drafts/draft-nielsen-dime-soap-00.txt + // Now we have to DIME encode the message + $dime = new Net_DIME_Message(); + $msg = $dime->encodeData($xml, SOAP_ENVELOP, null, NET_DIME_TYPE_URI); + + // Add the attachments. + $c = count($this->_attachments); + for ($i = 0; $i < $c; $i++) { + $msg .= $dime->encodeData($this->_attachments[$i]['body'], + $this->_attachments[$i]['content_type'], + $this->_attachments[$i]['cid'], + NET_DIME_TYPE_MEDIA); + } + $msg .= $dime->endMessage(); + + return $msg; + } + + function _decodeMimeMessage(&$data, &$headers, &$attachments) + { + if (!@include_once 'Mail/mimeDecode.php') { + return $this->_raiseSoapFault('MIME messages are unsupported, the Mail_Mime package is not installed'); + } + + $params['include_bodies'] = true; + $params['decode_bodies'] = true; + $params['decode_headers'] = true; + + // Lame thing to have to do for decoding. + $decoder = new Mail_mimeDecode($data); + $structure = $decoder->decode($params); + + if (isset($structure->body)) { + $data = $structure->body; + $headers = $structure->headers; + + return; + } elseif (isset($structure->parts)) { + $data = $structure->parts[0]->body; + $headers = array_merge($structure->headers, + $structure->parts[0]->headers); + if (count($structure->parts) > 1) { + $mime_parts = array_splice($structure->parts,1); + // Prepare the parts for the SOAP parser. + + $c = count($mime_parts); + for ($i = 0; $i < $c; $i++) { + $p =& $mime_parts[$i]; + if (isset($p->headers['content-location'])) { + // TODO: modify location per SwA note section 3 + // http://www.w3.org/TR/SOAP-attachments + $attachments[$p->headers['content-location']] = $p->body; + } else { + $cid = 'cid:' . substr($p->headers['content-id'], 1, -1); + $attachments[$cid] = $p->body; + } + } + } + + return; + } + + $this->_raiseSoapFault('Mime parsing error', '', '', 'Server'); + } + + function _decodeDIMEMessage(&$data, &$headers, &$attachments) + { + if (!@include_once 'Net/DIME.php') { + return $this->_raiseSoapFault('DIME messages are unsupported, the Net_DIME package is not installed'); + } + + // This SHOULD be moved to the transport layer, e.g. PHP itself should + // handle parsing DIME ;) + $dime = new Net_DIME_Message(); + $err = $dime->decodeData($data); + if (PEAR::isError($err)) { + $this->_raiseSoapFault('Failed to decode the DIME message!', '', '', 'Server'); + return; + } + if (strcasecmp($dime->parts[0]['type'], SOAP_ENVELOP) != 0) { + $this->_raiseSoapFault('DIME record 1 is not a SOAP envelop!', '', '', 'Server'); + return; + } + + $data = $dime->parts[0]['data']; + // Fake it for now. + $headers['content-type'] = 'text/xml'; + $c = count($dime->parts); + for ($i = 0; $i < $c; $i++) { + $part =& $dime->parts[$i]; + // We need to handle URI's better. + $id = strncmp($part['id'], 'cid:', 4) + ? 'cid:' . $part['id'] + : $part['id']; + $attachments[$id] = $part['data']; + } + } + + /** + * @deprecated Use setTypeTranslation(). + */ + function __set_type_translation($type, $class = null) + { + $this->setTypeTranslation($type, $class); + } + + /** + * Explicitly sets the translation for a specific class. + * + * Auto translation works for all cases, but opens ANY class in the script + * to be used as a data type, and may not be desireable. + * + * @param string $type A SOAP type. + * @param string $class A PHP class name. + */ + function setTypeTranslation($type, $class = null) + { + $tq = new QName($type); + if (!$class) { + $class = $tq->name; + } + $this->_type_translation[$type]=$class; + } + +} + +/** + * Class used to handle QNAME values in XML. + * + * @access public + * @package SOAP + * @author Shane Caraveo Conversion to PEAR and updates + */ +class QName +{ + var $name = ''; + var $ns = ''; + var $namespace=''; + + function QName($name, $namespace = '') + { + if ($name && $name[0] == '{') { + preg_match('/\{(.*?)\}(.*)/', $name, $m); + $this->name = $m[2]; + $this->namespace = $m[1]; + } elseif (substr_count($name, ':') == 1) { + $s = explode(':', $name); + $s = array_reverse($s); + $this->name = $s[0]; + $this->ns = $s[1]; + $this->namespace = $namespace; + } else { + $this->name = $name; + $this->namespace = $namespace; + } + + // A little more magic than should be in a qname. + $p = strpos($this->name, '['); + if ($p) { + // TODO: Need to re-examine this logic later. + // Chop off []. + $this->arraySize = explode(',', substr($this->name, $p + 1, -$p - 2)); + $this->arrayInfo = substr($this->name, $p); + $this->name = substr($this->name, 0, $p); + } + } + + function fqn() + { + if ($this->namespace) { + return '{' . $this->namespace . '}' . $this->name; + } elseif ($this->ns) { + return $this->ns . ':' . $this->name; + } + return $this->name; + } + +} diff --git a/thirdparty/pear/SOAP/Client.php b/thirdparty/pear/SOAP/Client.php new file mode 100644 index 000000000..de66e8084 --- /dev/null +++ b/thirdparty/pear/SOAP/Client.php @@ -0,0 +1,855 @@ + Original Author + * @author Shane Caraveo Port to PEAR and more + * @author Chuck Hagenbuch Maintenance + * @author Jan Schneider Maintenance + * @copyright 2003-2005 The PHP Group + * @license http://www.php.net/license/2_02.txt PHP License 2.02 + * @link http://pear.php.net/package/SOAP + */ + +require_once 'SOAP/Value.php'; +require_once 'SOAP/Base.php'; +require_once 'SOAP/Transport.php'; +require_once 'SOAP/WSDL.php'; +require_once 'SOAP/Fault.php'; +require_once 'SOAP/Parser.php'; + +// Arnaud: the following code was taken from DataObject and adapted to suit + +// this will be horrifically slow!!!! +// NOTE: Overload SEGFAULTS ON PHP4 + Zend Optimizer +// these two are BC/FC handlers for call in PHP4/5 + +if (!class_exists('SOAP_Client_Overload')) { + if (substr(zend_version(), 0, 1) > 1) { + class SOAP_Client_Overload extends SOAP_Base { + function __call($method, $args) + { + $return = null; + $this->_call($method, $args, $return); + return $return; + } + } + } else { + if (!function_exists('clone')) { + eval('function clone($t) { return $t; }'); + } + eval(' + class SOAP_Client_Overload extends SOAP_Base { + function __call($method, $args, &$return) + { + return $this->_call($method, $args, $return); + } + }'); + } +} + +/** + * SOAP Client Class + * + * This class is the main interface for making soap requests. + * + * basic usage: + * $soapclient = new SOAP_Client( string path [ , boolean wsdl] ); + * echo $soapclient->call( string methodname [ , array parameters] ); + * + * or, if using PHP 5+ or the overload extension: + * $soapclient = new SOAP_Client( string path [ , boolean wsdl] ); + * echo $soapclient->methodname( [ array parameters] ); + * + * + * Originally based on SOAPx4 by Dietrich Ayala + * http://dietrich.ganx4.com/soapx4 + * + * @access public + * @package SOAP + * @author Shane Caraveo Conversion to PEAR and updates + * @author Stig Bakken Conversion to PEAR + * @author Dietrich Ayala Original Author + */ +class SOAP_Client extends SOAP_Client_Overload +{ + /** + * Communication endpoint. + * + * Currently the following transport formats are supported: + * - HTTP + * - SMTP + * + * Example endpoints: + * http://www.example.com/soap/server.php + * https://www.example.com/soap/server.php + * mailto:soap@example.com + * + * @see SOAP_Client() + * @var string + */ + var $_endpoint = ''; + + /** + * The SOAP PORT name that is used by the client. + * + * @var string + */ + var $_portName = ''; + + /** + * Endpoint type e.g. 'wdsl'. + * + * @var string + */ + var $_endpointType = ''; + + /** + * The received xml. + * + * @var string + */ + var $xml; + + /** + * The outgoing and incoming data stream for debugging. + * + * @var string + */ + var $wire; + + /** + * The outgoing data stream for debugging. + * + * @var string + */ + var $_last_request = null; + + /** + * The incoming data stream for debugging. + * + * @var string + */ + var $_last_response = null; + + /** + * Options. + * + * @var array + */ + var $_options = array('trace' => false); + + /** + * The character encoding used for XML parser, etc. + * + * @var string + */ + var $_encoding = SOAP_DEFAULT_ENCODING; + + /** + * The array of SOAP_Headers that we are sending. + * + * @var array + */ + var $headersOut = null; + + /** + * The headers we recieved back in the response. + * + * @var array + */ + var $headersIn = null; + + /** + * Options for the HTTP_Request class (see HTTP/Request.php). + * + * @var array + */ + var $_proxy_params = array(); + + /** + * The SOAP_Transport instance. + * + * @var SOAP_Transport + */ + var $_soap_transport = null; + + /** + * Constructor. + * + * @access public + * + * @param string $endpoint An URL. + * @param boolean $wsdl Whether the endpoint is a WSDL file. + * @param string $portName The service's port name to use. + * @param array $proxy_params Options for the HTTP_Request class + * @see HTTP_Request + * @param boolean|string $cache Use WSDL caching? The cache directory if + * a string. + */ + function SOAP_Client($endpoint, $wsdl = false, $portName = false, + $proxy_params = array(), $cache = false) + { + parent::SOAP_Base('Client'); + + $this->_endpoint = $endpoint; + $this->_portName = $portName; + $this->_proxy_params = $proxy_params; + + // This hack should perhaps be removed as it might cause unexpected + // behaviour. + $wsdl = $wsdl + ? $wsdl + : strtolower(substr($endpoint, -4)) == 'wsdl'; + + // make values + if ($wsdl) { + $this->_endpointType = 'wsdl'; + // instantiate wsdl class + $this->_wsdl = new SOAP_WSDL($this->_endpoint, + $this->_proxy_params, + $cache); + if ($this->_wsdl->fault) { + $this->_raiseSoapFault($this->_wsdl->fault); + } + } + } + + function _reset() + { + $this->xml = null; + $this->wire = null; + $this->_last_request = null; + $this->_last_response = null; + $this->headersIn = null; + $this->headersOut = null; + } + + /** + * Sets the character encoding. + * + * Limited to 'UTF-8', 'US_ASCII' and 'ISO-8859-1'. + * + * @access public + * + * @param string encoding + * + * @return mixed SOAP_Fault on error. + */ + function setEncoding($encoding) + { + if (in_array($encoding, $this->_encodings)) { + $this->_encoding = $encoding; + return; + } + return $this->_raiseSoapFault('Invalid Encoding'); + } + + /** + * Adds a header to the envelope. + * + * @access public + * + * @param SOAP_Header $soap_value A SOAP_Header or an array with the + * elements 'name', 'namespace', + * 'mustunderstand', and 'actor' to send + * as a header. + */ + function addHeader($soap_value) + { + // Add a new header to the message. + if (is_a($soap_value, 'SOAP_Header')) { + $this->headersOut[] = $soap_value; + } elseif (is_array($soap_value)) { + // name, value, namespace, mustunderstand, actor + $this->headersOut[] = new SOAP_Header($soap_value[0], + null, + $soap_value[1], + $soap_value[2], + $soap_value[3]); + } else { + $this->_raiseSoapFault('Invalid parameter provided to addHeader(). Must be an array or a SOAP_Header.'); + } + } + + /** + * Calls a method on the SOAP endpoint. + * + * The namespace parameter is overloaded to accept an array of options + * that can contain data necessary for various transports if it is used as + * an array, it MAY contain a namespace value and a soapaction value. If + * it is overloaded, the soapaction parameter is ignored and MUST be + * placed in the options array. This is done to provide backwards + * compatibility with current clients, but may be removed in the future. + * The currently supported values are:
    +     *   namespace
    +     *   soapaction
    +     *   timeout (HTTP socket timeout)
    +     *   transfer-encoding (SMTP, Content-Transfer-Encoding: header)
    +     *   from (SMTP, From: header)
    +     *   subject (SMTP, Subject: header)
    +     *   headers (SMTP, hash of extra SMTP headers)
    +     * 
    + * + * @access public + * + * @param string $method The method to call. + * @param array $params The method parameters. + * @param string|array $namespace Namespace or hash with options. + * @param string $soapAction + * + * @return mixed The method result or a SOAP_Fault on error. + */ + function &call($method, &$params, $namespace = false, $soapAction = false) + { + $this->headersIn = null; + $this->_last_request = null; + $this->_last_response = null; + $this->wire = null; + $this->xml = null; + + $soap_data = $this->_generate($method, $params, $namespace, $soapAction); + if (PEAR::isError($soap_data)) { + $fault = $this->_raiseSoapFault($soap_data); + return $fault; + } + + // _generate() may have changed the endpoint if the WSDL has more + // than one service, so we need to see if we need to generate a new + // transport to hook to a different URI. Since the transport protocol + // can also change, we need to get an entirely new object. This could + // probably be optimized. + if (!$this->_soap_transport || + $this->_endpoint != $this->_soap_transport->url) { + $this->_soap_transport =& SOAP_Transport::getTransport($this->_endpoint); + if (PEAR::isError($this->_soap_transport)) { + $fault =& $this->_soap_transport; + $this->_soap_transport = null; + $fault = $this->_raiseSoapFault($fault); + return $fault; + } + } + $this->_soap_transport->encoding = $this->_encoding; + + // Send the message. + $transport_options = array_merge_recursive($this->_proxy_params, + $this->_options); + $this->xml = $this->_soap_transport->send($soap_data, $transport_options); + + // Save the wire information for debugging. + if ($this->_options['trace']) { + $this->_last_request = $this->_soap_transport->outgoing_payload; + $this->_last_response = $this->_soap_transport->incoming_payload; + $this->wire = $this->getWire(); + } + if ($this->_soap_transport->fault) { + $fault = $this->_raiseSoapFault($this->xml); + return $fault; + } + + if (isset($this->_options['result']) && + $this->_options['result'] != 'parse') { + return $this->xml; + } + + $this->__result_encoding = $this->_soap_transport->result_encoding; + + $result = &$this->parseResponse($this->xml, $this->__result_encoding, + $this->_soap_transport->attachments); + return $result; + } + + /** + * Sets an option to use with the transport layers. + * + * For example: + * + * $soapclient->setOpt('curl', CURLOPT_VERBOSE, 1) + * + * to pass a specific option to curl if using an SSL connection. + * + * @access public + * + * @param string $category Category to which the option applies or option + * name. + * @param string $option An option name if $category is a category name, + * an option value if $category is an option name. + * @param string $value An option value if $category is a category + * name. + */ + function setOpt($category, $option, $value = null) + { + if (!is_null($value)) { + if (!isset($this->_options[$category])) { + $this->_options[$category] = array(); + } + $this->_options[$category][$option] = $value; + } else { + $this->_options[$category] = $option; + } + } + + /** + * Call method supporting the overload extension. + * + * If the overload extension is loaded, you can call the client class with + * a soap method name: + * + * $soap = new SOAP_Client(....); + * $value = $soap->getStockQuote('MSFT'); + * + * + * @access public + * + * @param string $method The method to call. + * @param array $params The method parameters. + * @param mixed $return_value Will get the method's return value + * assigned. + * + * @return boolean Always true. + */ + function _call($method, $params, &$return_value) + { + // Overloading lowercases the method name, we need to look into the + // WSDL and try to find the correct method name to get the correct + // case for the call. + if ($this->_wsdl) { + $this->_wsdl->matchMethod($method); + } + + $return_value =& $this->call($method, $params); + + return true; + } + + /** + * @deprecated Use getLastRequest(). + */ + function &__getlastrequest() + { + $request = $this->getLastRequest(); + return $request; + } + + /** + * Returns the XML content of the last SOAP request. + * + * @return string The last request. + */ + function getLastRequest() + { + return $this->_last_request; + } + + /** + * @deprecated Use getLastResponse(). + */ + function &__getlastresponse() + { + $response =& $this->getLastResponse; + return $response; + } + + /** + * Returns the XML content of the last SOAP response. + * + * @return string The last response. + */ + function getLastResponse() + { + return $this->_last_response; + } + + /** + * @deprecated Use setUse(). + */ + function __use($use) + { + $this->setUse($use); + } + + /** + * Sets the SOAP encoding. + * + * @param string $use Either 'literal' or 'encoded' (section 5). + */ + function setUse($use) + { + $this->_options['use'] = $use; + } + + /** + * @deprecated Use setStyle(). + */ + function __style($style) + { + $this->setStyle($style); + } + + /** + * Sets the SOAP encoding style. + * + * @param string $style Either 'document' or 'rpc'. + */ + function setStyle($style) + { + $this->_options['style'] = $style; + } + + /** + * @deprecated Use setTrace(). + */ + function __trace($level) + { + $this->setTrace($level); + } + + /** + * Sets whether to trace the traffic on the transport level. + * + * @see getWire() + * + * @param boolean $trace + */ + function setTrace($trace) + { + $this->_options['trace'] = $trace; + } + + function _generate($method, &$params, $namespace = false, + $soapAction = false) + { + $this->fault = null; + $this->_options['input'] = 'parse'; + $this->_options['result'] = 'parse'; + $this->_options['parameters'] = false; + + if ($params && gettype($params) != 'array') { + $params = array($params); + } + + if (gettype($namespace) == 'array') { + foreach ($namespace as $optname => $opt) { + $this->_options[strtolower($optname)] = $opt; + } + if (isset($this->_options['namespace'])) { + $namespace = $this->_options['namespace']; + } else { + $namespace = false; + } + } else { + // We'll place $soapAction into our array for usage in the + // transport. + $this->_options['soapaction'] = $soapAction; + $this->_options['namespace'] = $namespace; + } + + if ($this->_endpointType == 'wsdl') { + $this->_setSchemaVersion($this->_wsdl->xsd); + + // Get port name. + if (!$this->_portName) { + $this->_portName = $this->_wsdl->getPortName($method); + } + if (PEAR::isError($this->_portName)) { + return $this->_raiseSoapFault($this->_portName); + } + + // Get endpoint. + $this->_endpoint = $this->_wsdl->getEndpoint($this->_portName); + if (PEAR::isError($this->_endpoint)) { + return $this->_raiseSoapFault($this->_endpoint); + } + + // Get operation data. + $opData = $this->_wsdl->getOperationData($this->_portName, $method); + + if (PEAR::isError($opData)) { + return $this->_raiseSoapFault($opData); + } + $namespace = $opData['namespace']; + $this->_options['style'] = $opData['style']; + $this->_options['use'] = $opData['input']['use']; + $this->_options['soapaction'] = $opData['soapAction']; + + // Set input parameters. + if ($this->_options['input'] == 'parse') { + $this->_options['parameters'] = $opData['parameters']; + $nparams = array(); + if (isset($opData['input']['parts']) && + count($opData['input']['parts'])) { + foreach ($opData['input']['parts'] as $name => $part) { + $xmlns = ''; + $attrs = array(); + // Is the name a complex type? + if (isset($part['element'])) { + $xmlns = $this->_wsdl->namespaces[$part['namespace']]; + $part = $this->_wsdl->elements[$part['namespace']][$part['type']]; + $name = $part['name']; + } + if (isset($params[$name]) || + $this->_wsdl->getDataHandler($name, $part['namespace'])) { + $nparams[$name] =& $params[$name]; + } else { + // We now force an associative array for + // parameters if using WSDL. + return $this->_raiseSoapFault("The named parameter $name is not in the call parameters."); + } + if (gettype($nparams[$name]) != 'object' || + !is_a($nparams[$name], 'SOAP_Value')) { + // Type is likely a qname, split it apart, and get + // the type namespace from WSDL. + $qname = new QName($part['type']); + if ($qname->ns) { + $type_namespace = $this->_wsdl->namespaces[$qname->ns]; + } elseif (isset($part['namespace'])) { + $type_namespace = $this->_wsdl->namespaces[$part['namespace']]; + } else { + $type_namespace = null; + } + $qname->namespace = $type_namespace; + $pqname = $name; + if ($xmlns) { + $pqname = '{' . $xmlns . '}' . $name; + } + $nparams[$name] = new SOAP_Value($pqname, + $qname->fqn(), + $nparams[$name], + $attrs); + } else { + // WSDL fixups to the SOAP value. + } + } + } + $params =& $nparams; + unset($nparams); + } + } else { + $this->_setSchemaVersion(SOAP_XML_SCHEMA_VERSION); + } + + // Serialize the message. + $this->_section5 = (!isset($this->_options['use']) || + $this->_options['use'] != 'literal'); + + if (!isset($this->_options['style']) || + $this->_options['style'] == 'rpc') { + $this->_options['style'] = 'rpc'; + $this->docparams = true; + $mqname = new QName($method, $namespace); + $methodValue = new SOAP_Value($mqname->fqn(), 'Struct', $params); + $soap_msg = $this->makeEnvelope($methodValue, + $this->headersOut, + $this->_encoding, + $this->_options); + } else { + if (!$params) { + $mqname = new QName($method, $namespace); + $mynull = null; + $params = new SOAP_Value($mqname->fqn(), 'Struct', $mynull); + } elseif ($this->_options['input'] == 'parse') { + if (is_array($params)) { + $nparams = array(); + $keys = array_keys($params); + foreach ($keys as $k) { + if (gettype($params[$k]) != 'object') { + $nparams[] = new SOAP_Value($k, + false, + $params[$k]); + } else { + $nparams[] =& $params[$k]; + } + } + $params =& $nparams; + } + if ($this->_options['parameters']) { + $mqname = new QName($method, $namespace); + $params = new SOAP_Value($mqname->fqn(), + 'Struct', + $params); + } + } + $soap_msg = $this->makeEnvelope($params, + $this->headersOut, + $this->_encoding, + $this->_options); + } + unset($this->headersOut); + + if (PEAR::isError($soap_msg)) { + return $this->_raiseSoapFault($soap_msg); + } + + // Handle MIME or DIME encoding. + // TODO: DIME encoding should move to the transport, do it here for + // now and for ease of getting it done. + if (count($this->_attachments)) { + if ((isset($this->_options['attachments']) && + $this->_options['attachments'] == 'Mime') || + isset($this->_options['Mime'])) { + $soap_msg = $this->_makeMimeMessage($soap_msg, $this->_encoding); + } else { + // default is dime + $soap_msg = $this->_makeDIMEMessage($soap_msg, $this->_encoding); + $this->_options['headers']['Content-Type'] = 'application/dime'; + } + if (PEAR::isError($soap_msg)) { + return $this->_raiseSoapFault($soap_msg); + } + } + + // Instantiate client. + if (is_array($soap_msg)) { + $soap_data = $soap_msg['body']; + if (count($soap_msg['headers'])) { + if (isset($this->_options['headers'])) { + $this->_options['headers'] = array_merge($this->_options['headers'], $soap_msg['headers']); + } else { + $this->_options['headers'] = $soap_msg['headers']; + } + } + } else { + $soap_data = $soap_msg; + } + + return $soap_data; + } + + /** + * @deprecated Use parseResponse(). + */ + function &__parse(&$response, $encoding, &$attachments) + { + return $this->parseResponse($response, $encoding, $attachments); + } + + /** + * Parses a SOAP response. + * + * @see SOAP_Parser:: + * + * @param string $response XML content of SOAP response. + * @param string $encoding Character set encoding, defaults to 'UTF-8'. + * @param array $attachments List of attachments. + */ + function &parseResponse($response, $encoding, &$attachments) + { + // Parse the response. + $response = new SOAP_Parser($response, $encoding, $attachments); + if ($response->fault) { + $fault =& $this->_raiseSoapFault($response->fault); + return $fault; + } + + // Return array of parameters. + $return =& $response->getResponse(); + $headers =& $response->getHeaders(); + if ($headers) { + $this->headersIn =& $this->_decodeResponse($headers, false); + } + + $decoded = &$this->_decodeResponse($return); + return $decoded; + } + + /** + * Converts a complex SOAP_Value into a PHP Array + * + * @param SOAP_Value $response value object + * @param boolean $shift FIXME + * @return Array + */ + function &_decodeResponse($response, $shift = true) + { + if (!$response) { + $decoded = null; + return $decoded; + } + + // Check for valid response. + if (PEAR::isError($response)) { + $fault =& $this->_raiseSoapFault($response); + return $fault; + } elseif (!is_a($response, 'soap_value')) { + $fault =& $this->_raiseSoapFault("Didn't get SOAP_Value object back from client"); + return $fault; + } + + // Decode to native php datatype. + $returnArray =& $this->_decode($response); + + // Fault? + if (PEAR::isError($returnArray)) { + $fault =& $this->_raiseSoapFault($returnArray); + return $fault; + } + + if (is_object($returnArray) && + strcasecmp(get_class($returnArray), 'stdClass') == 0) { + $returnArray = get_object_vars($returnArray); + } + if (is_array($returnArray)) { + if (isset($returnArray['faultcode']) || + isset($returnArray['SOAP-ENV:faultcode'])) { + $faultcode = $faultstring = $faultdetail = $faultactor = ''; + foreach ($returnArray as $k => $v) { + if (stristr($k, 'faultcode')) $faultcode = $v; + if (stristr($k, 'faultstring')) $faultstring = $v; + if (stristr($k, 'detail')) $faultdetail = $v; + if (stristr($k, 'faultactor')) $faultactor = $v; + } + $fault =& $this->_raiseSoapFault($faultstring, $faultdetail, $faultactor, $faultcode); + return $fault; + } + // Return array of return values. + if ($shift && count($returnArray) == 1) { + $decoded = array_shift($returnArray); + return $decoded; + } + return $returnArray; + } + return $returnArray; + } + + /** + * @deprecated Use getWire(). + */ + function __get_wire() + { + return $this->getWire(); + } + + /** + * Returns the outgoing and incoming traffic on the transport level. + * + * Tracing has to be enabled. + * + * @see setTrace() + * + * @return string The complete traffic between the client and the server. + */ + function getWire() + { + if ($this->_options['trace'] && + ($this->_last_request || $this->_last_response)) { + return "OUTGOING:\n\n" . + $this->_last_request . + "\n\nINCOMING\n\n" . + preg_replace("/>\r\n<", $this->_last_response); + } + + return null; + } + +} diff --git a/thirdparty/pear/SOAP/Disco.php b/thirdparty/pear/SOAP/Disco.php new file mode 100644 index 000000000..618e63d46 --- /dev/null +++ b/thirdparty/pear/SOAP/Disco.php @@ -0,0 +1,383 @@ + + * @author Chuck Hagenbuch + * @author Jan Schneider + * @copyright 2003-2005 The PHP Group + * @license http://www.php.net/license/2_02.txt PHP License 2.02 + * @link http://pear.php.net/package/SOAP + */ + +require_once 'SOAP/Base.php'; + +class SOAP_DISCO_Server extends SOAP_Base_Object { + + var $namespaces = array(SCHEMA_WSDL => 'wsdl', SCHEMA_SOAP => 'soap'); + var $import_ns = array(); + var $wsdl = ''; + var $disco = ''; + var $_wsdl = array(); + var $_disco = array(); + var $_service_name = ''; + var $_service_ns = ''; + var $_service_desc = ''; + var $_portname = ''; + var $_bindingname = ''; + var $soap_server = NULL; + + + function SOAP_DISCO_Server($soap_server, $service_name, $service_desc = '', + $import_ns = null) + { + parent::SOAP_Base_Object('Server'); + + if ( !is_object($soap_server) + || !get_class($soap_server) == 'soap_server') return; + + $this->_service_name = $service_name; + $this->_service_ns = "urn:$service_name"; + $this->_service_desc = $service_desc; + $this->import_ns = isset($import_ns) ? $import_ns : $this->import_ns; + $this->soap_server = $soap_server; + $this->host = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : 'localhost'; + } + + function getDISCO() + { + $this->_generate_DISCO(); + return $this->disco; + } + + function getWSDL() + { + $this->_generate_WSDL(); + return $this->wsdl; + } + + function _generate_DISCO() + { + // DISCO + $this->_disco['disco:discovery']['attr']['xmlns:disco'] = SCHEMA_DISCO; + $this->_disco['disco:discovery']['attr']['xmlns:scl'] = SCHEMA_DISCO_SCL; + $this->_disco['disco:discovery']['scl:contractRef']['attr']['ref'] = + (array_key_exists('HTTPS', $_SERVER) && $_SERVER['HTTPS'] == 'on') + ? 'https://' . $this->host . $_SERVER['PHP_SELF'] . '?wsdl' + : 'http://' . $this->host . $_SERVER['PHP_SELF'] . '?wsdl'; + + // generate disco xml + $this->_generate_DISCO_XML($this->_disco); + } + + function _generate_WSDL() + { + // WSDL + if (is_array($this->soap_server->_namespaces)) { + // need to get: typens, xsd & SOAP-ENC + $flipped = array_flip($this->soap_server->_namespaces); + $this->namespaces[$this->_service_ns] = 'tns'; + $this->namespaces[$flipped['xsd']] = 'xsd'; + $this->namespaces[$flipped['SOAP-ENC']] = 'SOAP-ENC'; + } + + // DEFINITIONS + $this->_wsdl['definitions']['attr']['name'] = $this->_service_name; + $this->_wsdl['definitions']['attr']['targetNamespace'] = $this->_service_ns; + foreach ($this->namespaces as $ns => $prefix) { + $this->_wsdl['definitions']['attr']['xmlns:' . $prefix] = $ns; + } + $this->_wsdl['definitions']['attr']['xmlns'] = SCHEMA_WSDL; + + // Import namespaces. Seems to not work yet: wsdl.exe fom .NET can't + // handle imported complete wsdl-definitions. + if (count($this->import_ns)) { + $i = 0; + foreach ($this->import_ns as $_ns => $_location) { + $this->_wsdl['definitions']['import'][$i]['attr']['location'] = $_location; + $this->_wsdl['definitions']['import'][$i]['attr']['namespace'] = $_ns; + $i++; + } + } + $this->_wsdl['definitions']['types']['attr']['xmlns']='http://schemas.xmlsoap.org/wsdl/'; + $this->_wsdl['definitions']['types']['schema']=array(); + + // Placeholder for messages + $this->_wsdl['definitions']['message'] = array(); + + // PORTTYPE-NAME + $this->_portname = $this->_service_name . 'Port'; + $this->_wsdl['definitions']['portType']['attr']['name'] = $this->_portname; + + // BINDING-NAME + $this->_bindingname = $this->_service_name . 'Binding'; + $this->_wsdl['definitions']['binding']['attr']['name'] = $this->_bindingname; + $this->_wsdl['definitions']['binding']['attr']['type'] = 'tns:' . $this->_portname; + $this->_wsdl['definitions']['binding']['soap:binding']['attr']['style'] = 'rpc'; + $this->_wsdl['definitions']['binding']['soap:binding']['attr']['transport'] = SCHEMA_SOAP_HTTP; + + // SERVICE + $this->_wsdl['definitions']['service']['attr']['name'] = $this->_service_name . 'Service'; + $this->_wsdl['definitions']['service']['documentation']['attr'] = ''; + $this->_wsdl['definitions']['service']['documentation'] = htmlentities($this->_service_desc); + $this->_wsdl['definitions']['service']['port']['attr']['name'] = $this->_portname; + $this->_wsdl['definitions']['service']['port']['attr']['binding'] = 'tns:' . $this->_bindingname; + $this->_wsdl['definitions']['service']['port']['soap:address']['attr']['location'] = + (array_key_exists('HTTPS', $_SERVER) && $_SERVER['HTTPS'] == 'on') + ? 'https://' . $this->host . $_SERVER['PHP_SELF'] + : 'http://' . $this->host . $_SERVER['PHP_SELF']; + + // + $dispatch_keys = array_keys($this->soap_server->dispatch_objects); + $dc = count($dispatch_keys); + for ($di = 0; $di < $dc; $di++) { + $namespace = $dispatch_keys[$di]; + $namespace_objects =& $this->soap_server->dispatch_objects[$namespace]; + $oc = count($namespace_objects); + for ($oi = 0; $oi < $oc; $oi++) { + $object = $namespace_objects[$oi]; + // types definitions + $this->addSchemaFromMap($object->__typedef); + // MESSAGES + $this->addMethodsFromMap($object->__dispatch_map, $namespace, get_class($object)); + } + } + if (isset($this->soap_server->dispatch_map)) { + $this->addMethodsFromMap($this->soap_server->dispatch_map, $namespace); + } + + // generate wsdl + $this->_generate_WSDL_XML(); + } + + function &_getSchema($namespace) + { + // SCHEMA + $c = count($this->_wsdl['definitions']['types']['schema']); + for($i = 0; $i < $c; $i++) { + if ($this->_wsdl['definitions']['types']['schema'][$i]['attr']['targetNamespace'] == $namespace) { + return $this->_wsdl['definitions']['types']['schema'][$i]; + } + } + + // don't have this namespace + $schema = array(); + $schema['attr'] = array(); + $schema['complexType'] = array(); + $schema['attr']['xmlns'] = array_search('xsd',$this->namespaces); + $schema['attr']['targetNamespace'] = $namespace; + $this->_wsdl['definitions']['types']['schema'][] =& $schema; + + return $schema; + } + + function addSchemaFromMap(&$map) + { + if (!$map) { + return; + } + + foreach ($map as $_type_name => $_type_def) { + list($typens,$type) = $this->_getTypeNs($_type_name); + if ($typens == 'xsd') { + // cannot add to xsd, lets use method_namespace + $typens = 'tns'; + } + $schema =& $this->_getSchema(array_search($typens, $this->namespaces)); + if (!$this->_ifComplexTypeExists($schema['complexType'], $type)) { + $ctype =& $schema['complexType'][]; + $ctype['attr']['name'] = $type; + foreach ($_type_def as $_varname => $_vartype) { + if (!is_int($_varname)) { + list($_vartypens,$_vartype) = $this->_getTypeNs($_vartype); + $ctype['all']['attr'] = ''; + $el =& $ctype['all']['element'][]; + $el['attr']['name'] = $_varname; + $el['attr']['type'] = $_vartypens . ':' . $_vartype; + } else { + $ctype['complexContent']['attr'] = ''; + $ctype['complexContent']['restriction']['attr']['base'] = 'SOAP-ENC:Array'; + foreach ($_vartype as $array_type) { + list($_vartypens, $_vartype) = $this->_getTypeNs($array_type); + $ctype['complexContent']['restriction']['attribute']['attr']['ref'] = 'SOAP-ENC:arrayType'; + $ctype['complexContent']['restriction']['attribute']['attr']['wsdl:arrayType'] = $_vartypens . ':' . $_vartype . '[]'; + } + } + } + } + } + } + + function addMethodsFromMap(&$map, $namespace, $classname = null) + { + if (!$map) { + return; + } + + foreach ($map as $method_name => $method_types) { + if (array_key_exists('namespace', $method_types)) { + $method_namespace = $method_types['namespace']; + } else { + $method_namespace = $namespace; + } + + // INPUT + $input_message = array('attr' => array('name' => $method_name . 'Request')); + if (isset($method_types['in']) && is_array($method_types['in'])) { + foreach ($method_types['in'] as $name => $type) { + list($typens, $type) = $this->_getTypeNs($type); + $part = array(); + $part['attr']['name'] = $name; + $part['attr']['type'] = $typens . ':' . $type; + $input_message['part'][] = $part; + } + } + $this->_wsdl['definitions']['message'][] = $input_message; + + // OUTPUT + $output_message = array('attr' => array('name' => $method_name . 'Response')); + if (isset($method_types['out']) && is_array($method_types['out'])) { + foreach ($method_types['out'] as $name => $type) { + list($typens, $type) = $this->_getTypeNs($type); + $part = array(); + $part['attr']['name'] = $name; + $part['attr']['type'] = $typens . ':' . $type; + $output_message['part'][] = $part; + } + } + $this->_wsdl['definitions']['message'][] = $output_message; + + // PORTTYPES + $operation = array(); + $operation['attr']['name'] = $method_name; + // INPUT + $operation['input']['attr']['message'] = 'tns:' . $input_message['attr']['name']; + // OUTPUT + $operation['output']['attr']['message'] = 'tns:' . $output_message['attr']['name']; + $this->_wsdl['definitions']['portType']['operation'][] = $operation; + + // BINDING + $binding = array(); + $binding['attr']['name'] = $method_name; + $action = $method_namespace . '#' . ($classname ? $classname . '#' : '') . $method_name; + $binding['soap:operation']['attr']['soapAction'] = $action; + // INPUT + $binding['input']['attr'] = ''; + $binding['input']['soap:body']['attr']['use'] = 'encoded'; + $binding['input']['soap:body']['attr']['namespace'] = $method_namespace; + $binding['input']['soap:body']['attr']['encodingStyle'] = SOAP_SCHEMA_ENCODING; + // OUTPUT + $binding['output']['attr'] = ''; + $binding['output']['soap:body']['attr']['use'] = 'encoded'; + $binding['output']['soap:body']['attr']['namespace'] = $method_namespace; + $binding['output']['soap:body']['attr']['encodingStyle'] = SOAP_SCHEMA_ENCODING; + $this->_wsdl['definitions']['binding']['operation'][] = $binding; + } + } + + function _generate_DISCO_XML($disco_array) + { + $disco = ''; + foreach ($disco_array as $key => $val) { + $disco .= $this->_arrayToNode($key,$val); + } + $this->disco = $disco; + } + + function _generate_WSDL_XML() + { + $wsdl = ''; + foreach ($this->_wsdl as $key => $val) { + $wsdl .= $this->_arrayToNode($key, $val); + } + $this->wsdl = $wsdl; + } + + function _arrayToNode($node_name = '', $array) + { + $return = ''; + if (is_array($array)) { + // we have a node if there's key 'attr' + if (array_key_exists('attr',$array)) { + $return .= "<$node_name"; + if (is_array($array['attr'])) { + foreach ($array['attr'] as $attr_name => $attr_value) { + $return .= " $attr_name=\"$attr_value\""; + } + } + + // unset 'attr' and proceed other childs... + unset($array['attr']); + + if (count($array) > 0) { + $i = 0; + foreach ($array as $child_node_name => $child_node_value) { + $return .= $i == 0 ? ">\n" : ''; + $return .= $this->_arrayToNode($child_node_name,$child_node_value); + $i++; + } + $return .= "\n"; + } else { + $return .= " />\n"; + } + } else { + // we have no 'attr' key in array - so it's list of nodes with + // the same name ... + foreach ($array as $child_node_name => $child_node_value) { + $return .= $this->_arrayToNode($node_name,$child_node_value); + } + } + } else { + // $array is not an array + if ($array !='') { + // and its not empty + $return .= "<$node_name>$array\n"; + } else { + // and its empty... + $return .= "<$node_name />\n"; + } + } + return $return; + } + + function _getTypeNs($type) + { + preg_match_all("'\{(.*)\}'sm", $type, $m); + if (isset($m[1][0]) && $m[1][0] != '') { + if (!array_key_exists($m[1][0],$this->namespaces)) { + $ns_pref = 'ns' . count($this->namespaces); + $this->namespaces[$m[1][0]] = $ns_pref; + $this->_wsdl['definitions']['attr']['xmlns:' . $ns_pref] = $m[1][0]; + } + $typens = $this->namespaces[$m[1][0]]; + $type = ereg_replace($m[0][0],'',$type); + } else { + $typens = 'xsd'; + } + return array($typens,$type); + } + + function _ifComplexTypeExists($typesArray, $type_name) + { + if (is_array($typesArray)) { + foreach ($typesArray as $type_data) { + if ($type_data['attr']['name'] == $type_name) { + return true; + } + } + } + return false; + } +} diff --git a/thirdparty/pear/SOAP/Fault.php b/thirdparty/pear/SOAP/Fault.php new file mode 100644 index 000000000..594b817ca --- /dev/null +++ b/thirdparty/pear/SOAP/Fault.php @@ -0,0 +1,127 @@ + Original Author + * @author Shane Caraveo Port to PEAR and more + * @author Chuck Hagenbuch Maintenance + * @author Jan Schneider Maintenance + * @copyright 2003-2006 The PHP Group + * @license http://www.php.net/license/2_02.txt PHP License 2.02 + * @link http://pear.php.net/package/SOAP + */ + +require_once 'PEAR.php'; + +/** + * PEAR::Error wrapper used to match SOAP Faults to PEAR Errors + * + * SOAP_Fault transmissions normally contain a complete backtrace of the + * error. Revealing these details in a public web services is a bad idea + * because it can be used by attackers. Backtrace information can be kept out + * of SOAP_Fault responses by putting the following code in your script after + * your "require_once 'SOAP/Server.php';" line: + * + * + * $skiptrace =& PEAR::getStaticProperty('PEAR_Error', 'skiptrace'); + * $skiptrace = true; + * + * + * @package SOAP + * @access public + * @author Shane Caraveo Port to PEAR and more + * @author Dietrich Ayala Original Author + */ +class SOAP_Fault extends PEAR_Error +{ + /** + * Constructor. + * + * @param string $faultstring Message string for fault. + * @param mixed $faultcode The faultcode. + * @param mixed $faultactor + * @param mixed $detail @see PEAR_Error + * @param array $mode @see PEAR_Error + * @param array $options @see PEAR_Error + */ + function SOAP_Fault($faultstring = 'unknown error', $faultcode = 'Client', + $faultactor = null, $detail = null, $mode = null, + $options = null) + { + parent::PEAR_Error($faultstring, $faultcode, $mode, $options, $detail); + if ($faultactor) { + $this->error_message_prefix = $faultactor; + } + } + + /** + * Returns a SOAP XML message that can be sent as a server response. + * + * @return string + */ + function message($encoding = SOAP_DEFAULT_ENCODING) + { + $msg = new SOAP_Base(); + $params = array(); + $params[] = new SOAP_Value('faultcode', 'QName', 'SOAP-ENV:' . $this->code); + $params[] = new SOAP_Value('faultstring', 'string', $this->message); + $params[] = new SOAP_Value('faultactor', 'anyURI', $this->error_message_prefix); + if (isset($this->backtrace)) { + $params[] = new SOAP_Value('detail', 'string', $this->backtrace); + } else { + $params[] = new SOAP_Value('detail', 'string', $this->userinfo); + } + + $methodValue = new SOAP_Value('{' . SOAP_ENVELOP . '}Fault', 'Struct', $params); + $headers = null; + return $msg->makeEnvelope($methodValue, $headers, $encoding); + } + + /** + * Returns a simple native PHP array containing the fault data. + * + * @return array + */ + function getFault() + { + $fault = new stdClass(); + $fault->faultcode = $this->code; + $fault->faultstring = $this->message; + $fault->faultactor = $this->error_message_prefix; + $fault->detail = $this->userinfo; + return $fault; + } + + /** + * Returns the SOAP actor for the fault. + * + * @return string + */ + function getActor() + { + return $this->error_message_prefix; + } + + /** + * Returns the fault detail. + * + * @return string + */ + function getDetail() + { + return $this->userinfo; + } + +} diff --git a/thirdparty/pear/SOAP/Interop/config.php.dist b/thirdparty/pear/SOAP/Interop/config.php.dist new file mode 100644 index 000000000..4d8201cb1 --- /dev/null +++ b/thirdparty/pear/SOAP/Interop/config.php.dist @@ -0,0 +1,4 @@ + + + + + PEAR SOAP Interop + + + + +

    PEAR SOAP Interop

    +

    Welcome to the PEAR SOAP Interop pages. These pages are set up for +SOAP Builder interop tests.

    + +\n"; +} + +?> +
    $test\n"; + echo "WSDL: wsdlURL}\">{$ep->wsdlURL}
    \n"; + echo "Endpoint: {$ep->endpointURL}
    \n"; + echo "
    +

    Interop Client

    + +

    +Notes: +Tests are done both "Direct" and with "WSDL". WSDL tests use the supplied interop WSDL +to run the tests against. The Direct method uses an internal prebuilt list of methods and parameters +for the test.

    +

    +Tests are also run against two methods of generating method parameters. The first, 'php', attempts +to directly serialize PHP variables into soap values. The second method, 'soapval', uses a SOAP_Value +class to define what the type of the value is. The second method is more interopable than the first +by nature. +

    + +

    Interop Client Test Results

    +

    This is a database of the current test results using PEAR SOAP Clients against interop servers.

    +

    +More detail (wire) about errors (marked yellow or red) can be obtained by clicking on the +link in the result box. If we have an HTTP error +attempting to connect to the endpoint, we will mark all consecutive attempts as errors, and skip +testing that endpoint. This reduces the time it takes to run the tests if a server is unavailable. +WSDLCACHE errors mean we cannot retreive the WSDL file specified for the endpoint. +

    + + + + diff --git a/thirdparty/pear/SOAP/Interop/interop_Round2Base.php b/thirdparty/pear/SOAP/Interop/interop_Round2Base.php new file mode 100644 index 000000000..c8b7b2f95 --- /dev/null +++ b/thirdparty/pear/SOAP/Interop/interop_Round2Base.php @@ -0,0 +1,155 @@ + Port to PEAR and more | +// | Authors: Dietrich Ayala Original Author | +// +----------------------------------------------------------------------+ +// +// $Id: interop_Round2Base.php,v 1.9 2007/01/26 00:06:11 yunosh Exp $ +// +require_once 'params_classes.php'; + +function &generateFault($short, $long) +{ + $params = array( + 'faultcode' => 'Server', + 'faultstring' => $short, + 'detail' => $long + ); + + $faultmsg = new SOAP_Message('Fault', $params, 'http://schemas.xmlsoap.org/soap/envelope/'); + return $faultmsg; +} + +function hex2bin($data) +{ + $len = strlen($data); + return pack('H' . $len, $data); +} + + +class SOAP_Interop_Base { + + function echoString($inputString) + { + return new SOAP_Value('outputString', 'string', $inputString); + } + + function echoStringArray($inputStringArray) + { + $ra = array(); + if ($inputStringArray) { + foreach($inputStringArray as $s) { + $ra[] = new SOAP_Value('item', 'string', $s); + } + } + return new SOAP_Value('outputStringArray', null, $ra); + } + + + function echoInteger($inputInteger) + { + return new SOAP_Value('outputInteger', 'int', (integer)$inputInteger); + } + + function echoIntegerArray($inputIntegerArray) + { + $ra = array(); + if ($inputIntegerArray) { + foreach ($inputIntegerArray as $i) { + $ra[] = new SOAP_Value('item', 'int', $i); + } + } + return new SOAP_Value('outputIntArray', null, $ra); + } + + function echoFloat($inputFloat) + { + return new SOAP_Value('outputFloat', 'float', (float)$inputFloat); + } + + function echoFloatArray($inputFloatArray) + { + $ra = array(); + if ($inputFloatArray) { + foreach($inputFloatArray as $float) { + $ra[] = new SOAP_Value('item', 'float', (FLOAT)$float); + } + } + return new SOAP_Value('outputFloatArray', null, $ra); + } + + function echoStruct($inputStruct) + { + if (is_object($inputStruct) && strtolower(get_class($inputStruct)) == 'soapstruct') { + return $inputStruct->__to_soap(); + } + return $inputStruct; + } + + function echoStructArray($inputStructArray) + { + $ra = array(); + if ($inputStructArray) { + $c = count($inputStructArray); + for ($i = 0; $i < $c; $i++) { + $ra[] = $this->echoStruct($inputStructArray[$i]); + } + } + return $ra; + } + + function echoVoid() + { + return NULL; + } + + function echoBase64($b_encoded) + { + return new SOAP_Value('return', 'base64Binary', base64_encode(base64_decode($b_encoded))); + } + + function echoDate($timeInstant) + { + require_once 'SOAP/Type/dateTime.php'; + $dt = new SOAP_Type_dateTime($timeInstant); + if ($dt->toUnixtime() != -1) { + $value = $dt->toSOAP(); + return new SOAP_Value('return', 'dateTime', $value); + } else { + return new SOAP_Fault("Value $timeInstant is not a dateTime value"); + } + } + + function echoHexBinary($hb) + { + return new SOAP_Value('return', 'hexBinary', bin2hex(hex2bin($hb))); + } + + function echoDecimal($dec) + { + return new SOAP_Value('return', 'decimal', (float)$dec); + } + + function echoBoolean($boolean) + { + return new SOAP_Value('return', 'boolean', $boolean); + } + + function echoMimeAttachment($stuff) + { + return new SOAP_Attachment('return', 'application/octet-stream', null, $stuff); + } +} diff --git a/thirdparty/pear/SOAP/Interop/interop_Round2GroupB.php b/thirdparty/pear/SOAP/Interop/interop_Round2GroupB.php new file mode 100644 index 000000000..f02404826 --- /dev/null +++ b/thirdparty/pear/SOAP/Interop/interop_Round2GroupB.php @@ -0,0 +1,99 @@ + Port to PEAR and more | +// | Authors: Dietrich Ayala Original Author | +// +----------------------------------------------------------------------+ +// +// $Id: interop_Round2GroupB.php,v 1.9 2007/01/22 14:53:21 yunosh Exp $ +// +require_once 'params_classes.php'; + +class SOAP_Interop_GroupB { + + var $__dispatch_map = array(); + + function SOAP_Interop_GroupB() + { + $this->__dispatch_map['echoStructAsSimpleTypes'] = + array('in' => array('inputStruct' => 'SOAPStruct'), + 'out' => array('outputString' => 'string', 'outputInteger' => 'int', 'outputFloat' => 'float')); + $this->__dispatch_map['echoSimpleTypesAsStruct'] = + array('in' => array('inputString' => 'string', 'inputInteger' => 'int', 'inputFloat' => 'float'), + 'out' => array('return' => 'SOAPStruct')); + $this->__dispatch_map['echoNestedStruct'] = + array('in' => array('inputStruct' => 'SOAPStructStruct'), + 'out' => array('return' => 'SOAPStructStruct')); + $this->__dispatch_map['echo2DStringArray'] = + array('in' => array('input2DStringArray' => 'ArrayOfString2D'), + 'out' => array('return' => 'ArrayOfString2D')); + $this->__dispatch_map['echoNestedArray'] = + array('in' => array('inputString' => 'SOAPArrayStruct'), + 'out' => array('return' => 'SOAPArrayStruct')); + } + + /* this private function is called on by SOAP_Server to determine any + * special dispatch information that might be necessary. This, for + * example, can be used to set up a dispatch map for functions that return + * multiple OUT parameters. */ + function __dispatch($methodname) + { + if (array_key_exists($methodname,$this->__dispatch_map)) { + return $this->__dispatch_map[$methodname]; + } + return null; + } + + function echoStructAsSimpleTypes ($struct) + { + // Convert a SOAPStruct to an array. + return array( + new SOAP_Value('outputString','string',$struct->varString), + new SOAP_Value('outputInteger','int',$struct->varInt), + new SOAP_Value('outputFloat','float',$struct->varFloat)); + } + + function echoSimpleTypesAsStruct($string, $int, $float) + { + // Convert a input into struct. + $v = new SOAPStruct($string, $int, $float); + return new SOAP_Value('return', '{http://soapinterop.org/xsd}SOAPStruct', $v); + } + + function echoNestedStruct($struct) + { + $separator = "\n"; + $methods = get_class_methods($struct); + $arr_str = $separator . strtolower(implode($separator, $methods)); + $string = $separator . '__to_soap' . $separator; + if (strpos($arr_str, $string) !== false) { + return $struct->__to_soap(); + } + return $struct; + } + + function echo2DStringArray($array) + { + $ret = new SOAP_Value('return', 'Array', $array); + $ret->options['flatten'] = true; + return $ret; + } + + function echoNestedArray($array) + { + return $array; + } + +} diff --git a/thirdparty/pear/SOAP/Interop/interop_Round2GroupC.php b/thirdparty/pear/SOAP/Interop/interop_Round2GroupC.php new file mode 100644 index 000000000..aca3d86db --- /dev/null +++ b/thirdparty/pear/SOAP/Interop/interop_Round2GroupC.php @@ -0,0 +1,35 @@ + | +// +----------------------------------------------------------------------+ +// +// $Id: interop_Round2GroupC.php,v 1.5 2007/01/22 14:53:21 yunosh Exp $ +// +require_once 'SOAP/Value.php'; + +class SOAP_Interop_GroupC_Headers { + + function echoMeStringRequest($string) + { + return new SOAP_Value('{http://soapinterop.org/echoheader/}echoMeStringResponse', 'string', $string); + } + + function echoMeStructRequest($struct) + { + return new SOAP_Value('{http://soapinterop.org/echoheader/}echoMeStructResponse', 'SOAPStruct', $struct); + } + +} diff --git a/thirdparty/pear/SOAP/Interop/interop_Round3GroupD.php b/thirdparty/pear/SOAP/Interop/interop_Round3GroupD.php new file mode 100644 index 000000000..b4e198d2a --- /dev/null +++ b/thirdparty/pear/SOAP/Interop/interop_Round3GroupD.php @@ -0,0 +1,82 @@ + | +// +----------------------------------------------------------------------+ +// +// $Id: interop_Round3GroupD.php,v 1.5 2007/01/22 14:53:21 yunosh Exp $ +// +require_once 'params_classes.php'; + +// http://www.whitemesa.com/r3/interop3.html +// http://www.whitemesa.com/r3/plan.html + +class SOAP_Interop_GroupD { + + // wsdlns:SoapInteropEmptySABinding + function echoString($inputString) + { + return new SOAP_Value('outputString', 'string', $inputString); + } + + function echoStringArray($inputStringArray) + { + $ra = array(); + if ($inputStringArray) { + foreach ($inputStringArray as $s) { + $ra[] = new SOAP_Value('item', 'string', $s); + } + } + return new SOAP_Value('outputStringArray', null, $ra); + } + + function echoStruct($inputStruct) + { + return $inputStruct->to_soap(); + } + + function echoStructArray($inputStructArray) + { + $ra = array(); + if ($inputStructArray) { + $c = count($inputStructArray); + for ($i = 0; $i < $c; $i++) { + $ra[] = $inputStructArray[$i]->to_soap(); + } + } + return $ra; + } + + function echoVoid() + { + return null; + } + + function echoPerson() + { + return null; + } + + function x_Document(&$document) + { + return new SOAP_Value('result_Document', '{http://soapinterop.org/xsd}x_Document', $document); + } + + function echoEmployee() + { + return null; + } + +} diff --git a/thirdparty/pear/SOAP/Interop/interop_client.php b/thirdparty/pear/SOAP/Interop/interop_client.php new file mode 100644 index 000000000..75e3aa06e --- /dev/null +++ b/thirdparty/pear/SOAP/Interop/interop_client.php @@ -0,0 +1,805 @@ + | +// +----------------------------------------------------------------------+ +// +// $Id: interop_client.php,v 1.16 2007/01/26 17:21:26 yunosh Exp $ +// +require_once 'DB.php'; // PEAR/DB +require_once 'SOAP/Client.php'; + +require_once 'config.php'; +require_once 'interop_test_functions.php'; +require_once 'interop_test.php'; +require_once 'params_Round2Base.php'; +require_once 'params_Round2GroupB.php'; +require_once 'params_Round2GroupC.php'; +require_once 'params_Round3GroupD.php'; +require_once 'registrationAndNotification.php'; + +error_reporting(E_ALL ^ E_NOTICE); +$INTEROP_LOCAL_SERVER = false; + +class Interop_Client +{ + // database DNS + var $DSN; + + // our central interop server, where we can get the list of endpoints + var $registrationDB; + + // our local endpoint, will always get added to the database for all tests + var $localEndpoint; + + // specify testing + var $currentTest = ''; // see $tests above + var $paramType = 'php'; // 'php' or 'soapval' + var $useWSDL = false; // true: do wsdl tests + var $numServers = 0; // 0: all + var $specificEndpoint = ''; // test only this endpoint + var $testMethod = ''; // test only this method + var $skipEndpointList = array(); // endpoints to skip + var $nosave = false; + var $client_type = 'pear'; // name of client + + // debug output + var $show = 1; + var $debug = 0; + var $showFaults = 0; // used in result table output + + // PRIVATE VARIABLES + var $dbc = null; + var $totals = array(); + var $tests = array('Round 2 Base', + 'Round 2 Group B', + 'Round 2 Group C', + 'Round 3 Group D Compound 1', + 'Round 3 Group D Compound 2', + 'Round 3 Group D DocLit', + 'Round 3 Group D DocLitParams', + 'Round 3 Group D Import 1', + 'Round 3 Group D Import 2', + 'Round 3 Group D Import 3', + 'Round 3 Group D RpcEnc' + ); + var $paramTypes = array('php', 'soapval'); + var $endpoints = array(); + + function Interop_Client() { + global $interopConfig; + $this->DSN = $interopConfig['DSN']; + $this->registrationDB =& new SOAP_Interop_registrationDB(); + + // XXX for now, share the database for results also + $this->dbc =& $this->registrationDB->dbc; + } + + /** + * fetchEndpoints + * retreive endpoints interop server + * + * @return boolean result + * @access private + */ + function fetchEndpoints($name = 'Round 2 Base') { + $service =& $this->registrationDB->findService($name); + $this->endpoints =& $this->registrationDB->getServerList($service->id,true); + return true; + } + + /** + * getEndpoints + * retreive endpoints from either database or interop server + * + * @param string name (see local var $tests) + * @param boolean all (if false, only get valid endpoints, status=1) + * @return boolean result + * @access private + */ + function getEndpoints($name = 'Round 2 Base', $all = 0) { + $service =& $this->registrationDB->findService($name); + $this->endpoints =& $this->registrationDB->getServerList($service->id); + return true; + } + + /** + * Retreives results from the database and stuffs them into the endpoint + * array. + * + * @access private + */ + function getResults($test = 'Round 2 Base', $type = 'php', $wsdl = 0) + { + // Be sure we have the right endpoints for this test result. + $this->getEndpoints($test); + $c = count($this->endpoints); + + // Retreive the results and put them into the endpoint info. + $sql = "SELECT * FROM results WHERE class='$test' AND type='$type' AND wsdl=$wsdl"; + $results = $this->dbc->getAll($sql, null, DB_FETCHMODE_ASSOC); + for ($j = 0, $rc = count($results); $j < $rc; ++$j) { + $result = $results[$j]; + // Find the endpoint. + for ($i = 0; $i < $c; $i++) { + if ($this->endpoints[$i]->id == $result['endpoint']) { + // Store the info. + if (!isset($this->endpoints[$i]->methods)) { + $this->endpoints[$i]->methods = array(); + } + $this->endpoints[$i]->methods[$result['function']] = $result; + break; + } + } + } + } + + /** + * Saves the results of a method test into the database. + * + * @access private + */ + function _saveResults($endpoint_id, &$soap_test) + { + if ($this->nosave) { + return; + } + + $result =& $soap_test->result; + $wire = $result['wire']; + if ($result['success']) { + $success = 'OK'; + $error = ''; + } else { + $success = $result['fault']->faultcode; + $error = $result['fault']->faultstring; + if (!$wire) { + $wire = $result['fault']->faultdetail; + } + if (!$wire) { + $wire = $result['fault']->faultstring; + } + } + + $test_name = $soap_test->test_name; + // add header info to the test name + if ($soap_test->headers) { + foreach ($soap_test->headers as $h) { + $destination = 0; + if (is_object($h) && strtolower(get_class($h)) == 'soap_header') { + if ($h->attributes['SOAP-ENV:actor'] == 'http://schemas.xmlsoap.org/soap/actor/next') { + $destination = 1; + } + $test_name .= ":{$h->name},$destination,{$h->attributes['SOAP-ENV:mustUnderstand']}"; + } else { + if (!$h[3] || + $h[3] == 'http://schemas.xmlsoap.org/soap/actor/next') { + $destination = 1; + } + if (!$h[2]) { + $h[2] = 0; + } + $qn = new QName($h[0]); + $test_name .= ":{$qn->name},$destination," . (int)$h[2]; + } + } + } + + $sql = 'DELETE FROM results WHERE endpoint = ? AND class = ? AND type = ? AND wsdl = ? AND client = ? AND function = ?'; + $values = array($endpoint_id, $this->currentTest, $this->paramType, + $this->useWSDL, $this->client_type, $test_name); + $res = $this->dbc->query($sql, $values); + if (DB::isError($res)) { + die($res->getMessage()); + } + if (is_object($res)) { + $res->free(); + } + + $sql = 'INSERT INTO results (client, endpoint, stamp, class, type, wsdl, function, result, error, wire) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)'; + $values = array($this->client_type, $endpoint_id, time(), + $this->currentTest, $this->paramType, $this->useWSDL, + $test_name, $success, $error, + $wire ? $wire : ''); + //echo "\n".$sql; + $res = $this->dbc->query($sql, $values); + if (DB::isError($res)) { + die($res->getMessage()); + } + if (is_object($res)) { + $res->free(); + } + } + + /** + * Compares two PHP types for a match. + * + * @param mixed $expect + * @param mixed $test_result + * + * @return boolean + */ + function compareResult(&$expect, &$result, $type = null) + { + $expect_type = gettype($expect); + $result_type = gettype($result); + if ($expect_type == 'array' && $result_type == 'array') { + // compare arrays + return array_compare($expect, $result); + } + if ($type == 'float') { + // We'll only compare to 3 digits of precision. + return number_compare($expect, $result); + } + if ($type == 'boolean') { + return boolean_compare($expect, $result); + } + return string_compare($expect, $result); + } + + + /** + * Runs a method on an endpoint and stores its results to the database. + * + * @param array $endpoint_info + * @param SOAP_Test $soap_test + * + * @return boolean result + */ + function doEndpointMethod(&$endpoint_info, &$soap_test) + { + $ok = false; + + // Prepare a holder for the test results. + $soap_test->result['class'] = $this->currentTest; + $soap_test->result['type'] = $this->paramType; + $soap_test->result['wsdl'] = $this->useWSDL; + $opdata = null; + //global $soap_value_total; + //echo "SOAP VALUES TEST-START: $soap_value_total\n"; + + if ($this->useWSDL) { + if ($endpoint_info->wsdlURL) { + if (!$endpoint_info->client) { + if (0 /* dynamic client */) { + $endpoint_info->wsdl = new SOAP_WSDL($endpoint_info->wsdlURL); + $endpoint_info->wsdl->trace=1; + $endpoint_info->client = $endpoint_info->wsdl->getProxy('', $endpoint_info->name); + } else { + $endpoint_info->client = new SOAP_Client($endpoint_info->wsdlURL, 1); + } + $endpoint_info->client->_auto_translation = true; + } + if ($endpoint_info->client->_wsdl->_isfault()) { + $fault = $endpoint_info->client->_wsdl->fault->getFault(); + $detail = $fault->faultstring . "\n\n" . $fault->faultdetail; + $soap_test->setResult(0, + 'WSDL', + $detail, + $fault->faultstring, + $fault); + return false; + } + if ($soap_test->service) { + $endpoint_info->client->_wsdl->setService($soap_test->service); + } + $soap =& $endpoint_info->client; + //$port = $soap->_wsdl->getPortName($soap_test->method_name); + //$opdata = $soap->_wsdl->getOperationData($port, $soap_test->method_name); + } else { + $fault = array('faultcode' => 'WSDL', + 'faultstring' => "no WSDL defined for $endpoint"); + $soap_test->setResult(0, + 'WSDL', + $fault->faultstring, + $fault->faultstring, + $fault); + return false; + } + $options = array('trace' => 1); + } else { + $namespace = $soapaction = 'http://soapinterop.org/'; + // Hack to make tests work with MS SoapToolkit. + // It's the only one that uses this soapaction, and breaks if + // it isn't right. Can't wait for soapaction to be fully deprecated + // 8/25/2002, seems this is fixed now + //if ($this->currentTest == 'Round 2 Base' && + // strstr($endpoint_info->name,'MS SOAP ToolKit 2.0')) { + // $soapaction = 'urn:soapinterop'; + //} + if (!$endpoint_info->client) { + $endpoint_info->client = new SOAP_Client($endpoint_info->endpointURL); + $endpoint_info->client->_auto_translation = true; + } + $soap = &$endpoint_info->client; + $options = array('namespace' => $namespace, + 'soapaction' => $soapaction, + 'trace' => 1); + } + + // Add headers to the test. + if ($soap_test->headers) { + // $header is already a SOAP_Header class + $soap->headersOut = array(); + $soap->headersIn = array(); + for ($i = 0, $hc = count($soap_test->headers); $i < $hc; $i++) { + $soap->addHeader($soap_test->headers[$i]); + } + } + $soap->setEncoding($soap_test->encoding); + + //if ($opdata) { + // if (isset($opdata['style'])) + // $options['style'] = $opdata['style']; + // if (isset($opdata['soapAction'])) + // $options['soapaction'] = $opdata['soapAction']; + // if (isset($opdata['input']) && + // isset($opdata['input']['use'])) + // $options['use'] = $opdata['input']['use']; + // if (isset($opdata['input']) && + // isset($opdata['input']['namespace'])) + // $options['namespace'] = $soap->_wsdl->namespaces[$opdata['input']['namespace']]; + //} + //if ($this->useWSDL) { + // $wsdlcall = '$return = $soap->'.$soap_test->method_name.'('; + // $args = ''; + // if ($soap_test->method_params) { + // $pnames = array_keys($soap_test->method_params); + // foreach ($pnames as $argname) { + // if ($args) $args .=','; + // $args .= '$soap_test->method_params[\''.$argname.'\']'; + // } + // } + // $wsdlcall = $wsdlcall.$args.');'; + // eval($wsdlcall); + //} else { + $return =& $soap->call($soap_test->method_name, $soap_test->method_params, $options); + //} + + if (!PEAR::isError($return)) { + if (is_array($soap_test->method_params) && + count($soap_test->method_params) == 1) { + $sent = array_shift(array_values($soap_test->method_params)); + } else { + $sent = $soap_test->method_params; + } + + // Compare header results. + $header_result = array(); + $headers_ok = true; + if ($soap_test->headers) { + // $header is already a SOAP_Header class + for ($i = 0, $hc = count($soap_test->headers); $i < $hc; $i++) { + $header = $soap_test->headers[$i]; + if (is_object($header) && strtolower(get_class($header)) != 'soap_header') { + // Assume it's an array. + $header = new SOAP_Header($header[0], null, $header[1], $header[2], $header[3], $header[4]); + } + $expect = $soap_test->headers_expect[$header->name]; + $header_result[$header->name] = array(); + // XXX need to fix need_result to identify the actor correctly + $need_result = $hresult || + ($header->attributes['SOAP-ENV:actor'] == 'http://schemas.xmlsoap.org/soap/actor/next' + && $header->attributes['SOAP-ENV:mustUnderstand']); + if ($expect) { + $hresult = $soap->headersIn[key($expect)]; + $ok = !$need_result || $this->compareResult($hresult ,$expect[key($expect)]); + } else { + $hresult = $soap->headersIn[$header->name]; + $expect =& $soap->_decode($header); + $ok = !$need_result || $this->compareResult($hresult ,$expect); + } + $header_result[$header->name]['ok'] = $ok; + if (!$ok) { + $headers_ok = false; + } + } + } + + // We need to decode what we sent so we can compare! + if (gettype($sent) == 'object' && + (strtolower(get_class($sent)) == 'soap_value' || + is_subclass_of($sent, 'soap_value'))) { + $sent_d =& $soap->_decode($sent); + } else { + $sent_d =& $sent; + } + + // compare the results with what we sent + $ok = $this->compareResult($sent_d, $return, $sent->type); + $expected = $sent_d; + unset($sent_d); + unset($sent); + if (!$ok && $soap_test->expect) { + $ok = $this->compareResult($soap_test->expect, $return); + $expected = $soap_test->expect; + } + + if ($ok) { + if (!$headers_ok) { + $fault = new stdClass(); + $fault->faultcode = 'HEADER'; + $fault->faultstring = 'The returned result did not match what we expected to receive'; + $soap_test->setResult(0, + $fault->faultcode, + $soap->getWire(), + $fault->faultstring, + $fault); + } else { + $soap_test->setResult(1, 'OK', $soap->getWire()); + $success = true; + } + } else { + $fault = new stdClass(); + $fault->faultcode = 'RESULT'; + $fault->faultstring = 'The returned result did not match what we expected to receive'; + $fault->faultdetail = "RETURNED:\n" . var_export($return, true) . "\n\nEXPECTED:\n" . var_export($expected, true); + $soap_test->setResult(0, + $fault->faultcode, + $soap->getWire(), + $fault->faultstring, + $fault); + } + } else { + $fault = $return->getFault(); + if ($soap_test->expect_fault) { + $ok = 1; + $res = 'OK'; + } else { + $ok = 0; + $res = $fault->faultcode; + } + $soap_test->setResult($ok, + $res, + $soap->getWire(), + $fault->faultstring, + $fault); + } + $soap->_reset(); + unset($return); + + return $ok; + } + + /** + * Runs a single round of tests. + */ + function doTest() + { + global $soap_tests; + + $empty_string = ''; + // Get endpoints for this test. + if (!$this->currentTest) { + die("Asked to run a test, but no testname!\n"); + } + $this->getEndpoints($this->currentTest); + // Clear totals. + $this->totals = array(); + + for ($i = 0, $c = count($this->endpoints); $i < $c; ++$i) { + $endpoint_info = $this->endpoints[$i]; + // If we specify an endpoint, skip until we find it. + if (($this->specificEndpoint && + $endpoint_info->name != $this->specificEndpoint) || + ($this->useWSDL && !$endpoint_info->wsdlURL)) { + continue; + } + + $skipendpoint = false; + $this->totals['servers']++; + //$endpoint_info['tests'] = array(); + + if ($this->show) { + echo "Processing {$endpoint_info->name} at {$endpoint_info->endpointURL}\n"; + } + + for ($ti = 0, $tc = count($soap_tests[$this->currentTest]); $ti < $tc; ++$ti) { + $soap_test = $soap_tests[$this->currentTest][$ti]; + + // Only run the type of test we're looking for (php or + // soapval). + if ($soap_test->type != $this->paramType) { + continue; + } + + // If this is in our skip list, skip it. + if (in_array($endpoint_info->name, $this->skipEndpointList)) { + $skipendpoint = true; + $skipfault = new stdClass(); + $skipfault->faultcode = 'SKIP'; + $skipfault->faultstring = 'endpoint skipped'; + $soap_test->setResult(0, + $skipfault->faultcode, + $empty_string, + $skipfault->faultstring, + $skipfault); + //$endpoint_info['tests'][] = &$soap_test; + //$soap_test->showTestResult($this->debug); + //$this->_saveResults($endpoint_info['id'], $soap_test->method_name); + $soap_test->result = null; + continue; + } + + // If we're looking for a specific method, skip unless we have + // it. + if ($this->testMethod && + strcmp($this->testMethod, $soap_test->test_name) != 0) { + continue; + } + if ($this->testMethod && + $this->currentTest == 'Round 2 Group C') { + // We have to figure things out now. + if (!preg_match('/(.*):(.*),(\d),(\d)/', $this->testMethod, $m)) { + continue; + } + + // Is the header in the headers list? + $gotit = false; + $thc = count($soap_test->headers); + for ($thi = 0; $thi < $thc; $thi++) { + $header = $soap_test->headers[$thi]; + if (is_object($header) && strtolower(get_class($header)) == 'soap_header') { + if ($header->name == $m[2]) { + $gotit = $header->attributes['SOAP-ENV:actor'] == ($m[3] ? SOAP_TEST_ACTOR_NEXT : SOAP_TEST_ACTOR_OTHER); + $gotit = $gotit && $header->attributes['SOAP-ENV:mustUnderstand'] == $m[4]; + } + } elseif ($header[0] == $m[2]) { + $gotit = $gotit && $header[3] == ($m[3] ? SOAP_TEST_ACTOR_NEXT : SOAP_TEST_ACTOR_OTHER); + $gotit = $gotit && $header[4] == $m[4]; + } + } + if (!$gotit) { + continue; + } + } + + // If we are skipping the rest of the tests (due to error) + // note a fault. + if ($skipendpoint) { + $soap_test->setResult(0, + $skipfault->faultcode, + $empty_string, + $skipfault->faultstring, + $skipfault); + //$endpoint_info['tests'][] = &$soap_test; + $this->totals['fail']++; + } else { + // Run the endpoint test. + unset($soap_test->result); + if ($this->doEndpointMethod($endpoint_info, $soap_test)) { + $this->totals['success']++; + } else { + $skipendpoint = $soap_test->result['fault']->faultcode == 'HTTP'; + $skipfault = $skipendpoint ? $soap_test->result['fault'] : null; + $this->totals['fail']++; + } + //$endpoint_info['tests'][] = &$soap_test; + } + $soap_test->showTestResult($this->debug); + $this->_saveResults($endpoint_info->id, $soap_test); + $soap_test->reset(); + $this->totals['calls']++; + } + unset($endpoint_info->client); + if ($this->numservers && ++$i >= $this->numservers) { + break; + } + } + } + + function doGroupTests() { + $dowsdl = array(0,1); + foreach($dowsdl as $usewsdl) { + $this->useWSDL = $usewsdl; + foreach($this->paramTypes as $ptype) { + // skip a pointless test + if ($usewsdl && $ptype == 'soapval') break; + if (stristr($this->currentTest, 'Round 3') && !$usewsdl) break; + $this->paramType = $ptype; + $this->doTest(); + } + } + } + + /** + * Go all out. This takes time. + */ + function doTests() + { + // The mother of all interop tests. + $dowsdl = array(0, 1); + foreach ($this->tests as $test) { + $this->currentTest = $test; + foreach ($dowsdl as $usewsdl) { + $this->useWSDL = $usewsdl; + foreach ($this->paramTypes as $ptype) { + // Skip a pointless test. + if ($usewsdl && $ptype == 'soapval') { + break; + } + if (stristr($this->currentTest, 'Round 3') && !$usewsdl) { + break; + } + $this->paramType = $ptype; + $this->doTest(); + } + } + } + } + + /** + * @access private + */ + function getMethodList($test = 'base') + { + $this->dbc->setFetchMode(DB_FETCHMODE_ORDERED); + // Retreive the results and put them into the endpoint info. + $sql = "SELECT DISTINCT(function) FROM results WHERE client='$this->client_type' AND class='$test' ORDER BY function"; + $results = $this->dbc->getAll($sql); + $ar = array(); + foreach($results as $result) { + $ar[] = $result[0]; + } + return $ar; + } + + function outputTable() + { + $methods = $this->getMethodList($this->currentTest); + if (!$methods) { + return; + } + $this->getResults($this->currentTest,$this->paramType,$this->useWSDL); + + echo "Testing $this->currentTest "; + if ($this->useWSDL) { + echo "using WSDL "; + } else { + echo "using Direct calls "; + } + echo "with $this->paramType values
    \n"; + + // Calculate totals for this table. + $this->totals['success'] = 0; + $this->totals['fail'] = 0; + $this->totals['result'] = 0; + $this->totals['wsdl'] = 0; + $this->totals['connect'] = 0; + $this->totals['servers'] = 0; //count($this->endpoints); + for ($i = 0, $c = count($this->endpoints); $i < $c; ++$i) { + $endpoint_info = $this->endpoints[$i]; + if (!$endpoint_info->name) { + continue; + } + if (count($endpoint_info->methods) > 0) { + $this->totals['servers']++; + foreach ($methods as $method) { + $r = $endpoint_info->methods[$method]['result']; + if ($r == 'OK') { + $this->totals['success']++; + } elseif (stristr($r, 'result')) { + $this->totals['result']++; + } elseif (stristr($r, 'wsdlcache')) { + $this->totals['connect']++; + } elseif (stristr($r, 'wsdl')) { + $this->totals['wsdl']++; + } elseif (stristr($r, 'http')) { + $this->totals['connect']++; + } else { + $this->totals['fail']++; + } + } + } else { + //unset($this->endpoints[$i]); + } + } + $this->totals['calls'] = count($methods) * $this->totals['servers']; + + //if ($this->totals['fail'] == $this->totals['calls']) { + // // assume tests have not run, skip outputing table + // echo "No Data Available
    \n"; + // return; + //} + + echo "\n\nServers: {$this->totals['servers']} Calls: {$this->totals['calls']} Success: {$this->totals['success']}
    \n" + . "System-Fail: {$this->totals['fail']} Result-Failure: {$this->totals['result']} Connect-Failure: {$this->totals['connect']} WSDL-Failure: {$this->totals['wsdl']}

    \n" + + . "\n" + . "\n"; + foreach ($methods as $method) { + $info = explode(':', $method); + echo "\n"; + } + echo "\n"; + $faults = array(); + $fi = 0; + for ($i = 0, $c = count($this->endpoints); $i < $c; ++$i) { + $endpoint_info = $this->endpoints[$i]; + if (!$endpoint_info->name) { + continue; + } + if ($endpoint_info->wsdlURL) { + echo "\n"; + } else { + echo "\n"; + } + foreach ($methods as $method) { + $id = $endpoint_info->methods[$method]['id']; + $r = $endpoint_info->methods[$method]['result']; + $e = $endpoint_info->methods[$method]['error']; + if ($e) { + $faults[$fi++] = $e; + } + if ($r) { + echo "\n"; + } else { + echo "\n"; + } + } + echo "\n"; + } + echo "
    Endpoint"; + foreach ($info as $m) { + $hi = explode(',', $m); + echo ''. $hi[0] . "
    \n"; + if (count($hi) > 1) { + echo "  Actor=" + . ($hi[1] ? 'Target' : 'Not Target') + . "
    \n  MustUnderstand=$hi[2]
    \n"; + } + } + echo "
    wsdlURL}\">{$endpoint_info->name}
    {$endpoint_info->name}$runtested

    \n"; + if ($this->showFaults && count($faults) > 0) { + echo "ERROR Details:
    \n
      \n"; + // output more error detail + foreach ($faults as $fault) { + echo '
    • ' . htmlspecialchars($fault) . "
    • \n"; + } + } + echo "


    \n"; + } + + function outputTables() + { + $dowsdl = array(0, 1); + foreach($this->tests as $test) { + $this->currentTest = $test; + foreach ($dowsdl as $usewsdl) { + $this->useWSDL = $usewsdl; + foreach ($this->paramTypes as $ptype) { + // Skip a pointless test. + if ($usewsdl && $ptype == 'soapval') { + break; + } + if (stristr($this->currentTest, 'Round 3') && !$usewsdl) { + break; + } + $this->paramType = $ptype; + $this->outputTable(); + } + } + } + } + + function showWire($id) + { + $results = $this->dbc->getAll("SELECT * FROM results WHERE id=$id", null, DB_FETCHMODE_ASSOC ); + //$wire = preg_replace("/>/",">\n",$results[0]['wire']); + $wire = $results[0]['wire']; + echo "
    \n" . htmlspecialchars($wire) . "
    \n"; + } + +} diff --git a/thirdparty/pear/SOAP/Interop/interop_client_results.php b/thirdparty/pear/SOAP/Interop/interop_client_results.php new file mode 100644 index 000000000..43e8ebc74 --- /dev/null +++ b/thirdparty/pear/SOAP/Interop/interop_client_results.php @@ -0,0 +1,75 @@ + | +// +----------------------------------------------------------------------+ +// +// $Id: interop_client_results.php,v 1.3 2003/04/07 00:51:17 shane Exp $ +// +require_once 'interop_client.php'; +?> + + + + + + PEAR-PHP SOAP Interop Tests + + + +

    SOAP Client Interop Test Results: Round2

    + +Back to Interop Index
    +

     

    + +showFaults = 1; + +if ($_GET['wire']) { + $iop->showWire($_GET['wire']); +} else { + $iop->getEndpoints(); + $iop->getResults(); + + if ($_GET['test']) { + $iop->currentTest = $_GET['test']; + $iop->useWSDL = $_GET['wsdl']?$_GET['wsdl']:0; + $iop->paramType = $_GET['type']?$_GET['type']:'php'; + $iop->outputTable(); + } else { + $iop->outputTables(); + } +} +?> + + diff --git a/thirdparty/pear/SOAP/Interop/interop_client_run.php b/thirdparty/pear/SOAP/Interop/interop_client_run.php new file mode 100644 index 000000000..75d81fff7 --- /dev/null +++ b/thirdparty/pear/SOAP/Interop/interop_client_run.php @@ -0,0 +1,205 @@ + | +// +----------------------------------------------------------------------+ +// +// $Id: interop_client_run.php,v 1.11 2007/01/26 15:03:24 yunosh Exp $ +// + +if (isset($_SERVER['SERVER_NAME'])) { + die("full test run cannot be done via webserver."); +} + +set_time_limit(0); +error_reporting(E_ALL); + +require 'Console/Getopt.php'; +require_once 'interop_client.php'; + +$INTEROP_LOCAL_SERVER = TRUE;// add local server to endpoints + +$iop =& new Interop_Client(); + +// debug output +$iop->show = 1; +$iop->debug = 0; +$iop->showFaults = 0; // used in result table output +$restrict = null; + +$args = Console_Getopt::getopt($_SERVER['argv'], + 'c:dehl:m:np:r:s:t:v:wq', + array('help')); +if (PEAR::isError($args)) { + echo "\n" . $args->getMessage() . "\n\n"; + help(); + exit; +} + +function help() { +print <<tests as $test) { + print " $test\n"; + } +} + +function print_endpoint_names() +{ + global $iop; + + if (!class_exists('G')) { + $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); + $docuroot = explode( '/', $realdocuroot ); + array_pop( $docuroot ); + $pathhome = implode( '/', $docuroot ) . '/'; + array_pop( $docuroot ); + $pathTrunk = implode( '/', $docuroot ) . '/'; + require_once($pathTrunk.'gulliver/system/class.g.php'); + } + G::LoadSystem('inputfilter'); + $filter = new InputFilter(); + $currTest = $filter->xssFilterHard($iop->currentTest); + + if (!$iop->getEndpoints($iop->currentTest)) { + die("Unable to retrieve endpoints for $currTest\n"); + } + print "Interop Servers for $currTestt:\n"; + foreach ($iop->endpoints as $server) { + print " $server->name\n"; + } +} + +foreach ($args[0] as $arg) { + switch($arg[0]) { + case 'c': + $iop->client_type = $arg[1]; + break; + case 'd': + $iop->debug = true; + break; + case 'e': + $iop->fetchEndpoints(); + break; + case 'h': + case '--help': + help(); + exit(0); + case 'l': + $iop->skipEndpointList = explode(',', $arg[1]); + break; + case 'm': + $iop->testMethod = $arg[1]; + break; + case 'n': + $iop->nosave = true; + break; + case 'p': + if ($arg[1] == 't') { + print_test_names(); + } elseif ($arg[1] == 'e') { + if (!$iop->currentTest) { + print "You need to specify a test with -t\n"; + exit(0); + } + print_endpoint_names(); + } else { + die("invalid print argument\n"); + } + exit(0); + case 'r': + $restrict = $arg[1]; + break; + case 's': + $iop->specificEndpoint = $arg[1]; + break; + case 't': + $iop->currentTest = $arg[1]; + break; + case 'v': + if ($arg[1] != 'php' && $arg[1] != 'soapval') { + + if (!class_exists('G')) { + $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); + $docuroot = explode( '/', $realdocuroot ); + array_pop( $docuroot ); + $pathhome = implode( '/', $docuroot ) . '/'; + array_pop( $docuroot ); + $pathTrunk = implode( '/', $docuroot ) . '/'; + require_once($pathTrunk.'gulliver/system/class.g.php'); + } + G::LoadSystem('inputfilter'); + $filter = new InputFilter(); + $arg[1] = $filter->xssFilterHard($arg[1]); + + die('Incorrect value for argument v: ' . $arg[1] . "\n"); + } + $iop->paramType = $arg[1]; + break; + case 'w': + $iop->useWSDL = true; + break; + case 'q': + exit(0); + } +} + +// These are endpoints that are listed in the interop server, but do not realy +// exist any longer. +$bad = array('Spheon JSOAP', 'Phalanx', 'SilverStream', 'SOAPx4 (PHP)', + 'Virtuoso (development)', 'Zolera SOAP Infrastructure'); +$iop->skipEndpointList = array_merge($iop->skipEndpointList, $bad); + +if ($restrict) { + $tests = $iop->tests; + $iop->tests = array(); + foreach ($tests as $test) { + if (stristr($test, $restrict)) { + $iop->tests[] = $test; + } + } +} + +if ($iop->currentTest) { + $iop->doTest(); // run a single set of tests using above options +} else { + // $iop->doGroupTests(); // run a group of tests set in $currentTest + $iop->doTests(); // run all tests, ignore above options +} + +echo "done\n"; diff --git a/thirdparty/pear/SOAP/Interop/interop_database.sql b/thirdparty/pear/SOAP/Interop/interop_database.sql new file mode 100644 index 000000000..bb2f5119b --- /dev/null +++ b/thirdparty/pear/SOAP/Interop/interop_database.sql @@ -0,0 +1,76 @@ +# Database soapinterop running on localhost + +# phpMyAdmin MySQL-Dump +# version 2.2.5 +# http://phpwizard.net/phpMyAdmin/ +# http://phpmyadmin.sourceforge.net/ (download page) +# +# Host: localhost +# Generation Time: Aug 31, 2002 at 06:36 PM +# Server version: 3.23.49 +# PHP Version: 4.2.1 +# Database : `soapinterop` +# -------------------------------------------------------- + +# +# Table structure for table `clientinfo` +# + +CREATE TABLE clientinfo ( + id char(40) NOT NULL default '', + name char(100) NOT NULL default '', + version char(20) NOT NULL default '', + resultsURL char(255) NOT NULL default '' +) TYPE=InnoDB; +# -------------------------------------------------------- + +# +# Table structure for table `results` +# + +CREATE TABLE results ( + id int(11) NOT NULL auto_increment, + client varchar(100) NOT NULL default '0', + endpoint int(11) NOT NULL default '0', + stamp int(11) NOT NULL default '0', + class varchar(50) NOT NULL default '', + type varchar(10) default NULL, + wsdl int(11) NOT NULL default '0', + function varchar(255) NOT NULL default '', + result varchar(25) NOT NULL default '', + error text, + wire text NOT NULL, + PRIMARY KEY (id) +) TYPE=InnoDB; +# -------------------------------------------------------- + +# +# Table structure for table `serverinfo` +# + +CREATE TABLE serverinfo ( + id int(11) NOT NULL auto_increment, + service_id char(40) NOT NULL default '', + name char(100) NOT NULL default '', + version char(20) NOT NULL default '', + endpointURL char(255) NOT NULL default '', + wsdlURL char(255) NOT NULL default '', + PRIMARY KEY (id) +) TYPE=InnoDB; +# -------------------------------------------------------- + +# +# Table structure for table `services` +# + +CREATE TABLE services ( + id char(40) NOT NULL default '', + name char(50) NOT NULL default '', + description char(255) NOT NULL default '', + wsdlURL char(255) NOT NULL default '', + websiteURL char(255) NOT NULL default '', + PRIMARY KEY (id) +) TYPE=InnoDB; + + + diff --git a/thirdparty/pear/SOAP/Interop/interop_test.php b/thirdparty/pear/SOAP/Interop/interop_test.php new file mode 100644 index 000000000..4b3107989 --- /dev/null +++ b/thirdparty/pear/SOAP/Interop/interop_test.php @@ -0,0 +1,137 @@ + | +// +----------------------------------------------------------------------+ +// +// $Id: interop_test.php,v 1.10 2007/01/26 17:21:44 yunosh Exp $ +// +require_once 'SOAP/Value.php'; + +define('SOAP_TEST_ACTOR_NEXT','http://schemas.xmlsoap.org/soap/actor/next'); +define('SOAP_TEST_ACTOR_OTHER','http://some/other/actor'); + +class SOAP_Interop_Test { + + var $type = 'php'; + var $test_name = null; + var $method_name = null; + var $method_params = null; + var $expect = null; + var $expect_fault = false; + var $headers = null; + var $headers_expect = null; + var $result = array(); + var $show = 1; + var $debug = 0; + var $encoding = SOAP_DEFAULT_ENCODING; + + /** + * If multiple services, this sets to a specific service. + */ + var $service = null; + + function SOAP_Interop_Test($methodname, $params, $expect = null) + { + if (strchr($methodname, '(')) { + preg_match('/(.*)\((.*)\)/', $methodname, $matches); + $this->test_name = $methodname; + $this->method_name = $matches[1]; + } else { + $this->test_name = $this->method_name = $methodname; + } + $this->method_params = $params; + $this->expect = $expect; + + // determine test type + if ($params) { + $v = array_values($params); + if (gettype($v[0]) == 'object' && + strtolower(get_class($v[0])) == 'soap_value') { + $this->type = 'soapval'; + } + } + } + + function setResult($ok, $result, $wire, $error = '', $fault = null) + { + $this->result['success'] = $ok; + $this->result['result'] = $result; + $this->result['error'] = $error; + $this->result['wire'] = $wire; + $this->result['fault'] = $fault; + } + + function reset() + { + $this->result = array(); + } + + /** + * Prints simple output about a methods result. + */ + function showTestResult($debug = 0) + { + // Debug output + if ($debug) { + $this->show = 1; + echo str_repeat('-', 50) . "\n"; + } + + echo "Testing $this->test_name: "; + if ($this->headers) { + $hc = count($this->headers); + for ($i = 0; $i < $hc; $i++) { + $h = $this->headers[$i]; + if (strtolower(get_class($h)) == 'soap_header') { + echo "\n {$h->name},{$h->attributes['SOAP-ENV:actor']},{$h->attributes['SOAP-ENV:mustUnderstand']} : "; + } else { + if (!$h[4]) { + $h[4] = SOAP_TEST_ACTOR_NEXT; + } + if (!$h[3]) { + $h[3] = 0; + } + echo "\n $h[0],$h[4],$h[3] : "; + } + } + } + + if ($debug) { + echo "method params: "; + print_r($this->params); + echo "\n"; + } + + $ok = $this->result['success']; + if ($ok) { + echo "SUCCESS\n"; + } else { + $fault = $this->result['fault']; + if ($fault) { + echo "FAILED: [{$fault->faultcode}] {$fault->faultstring}\n"; + if (!empty($fault->faultdetail)) { + echo $fault->faultdetail . "\n"; + } + } else { + echo "FAILED: " . $this->result['result'] . "\n"; + } + } + if ($debug) { + echo "\n" . $this->result['wire'] . "\n"; + } + } + +} diff --git a/thirdparty/pear/SOAP/Interop/interop_test_functions.php b/thirdparty/pear/SOAP/Interop/interop_test_functions.php new file mode 100644 index 000000000..e6277eaab --- /dev/null +++ b/thirdparty/pear/SOAP/Interop/interop_test_functions.php @@ -0,0 +1,90 @@ + 3) $d = 3; + $f1 = round($f1, $d); + $f2 = round($f2, $d); + return bccomp($f1, $f2, $d) == 0; +} + +function boolean_compare($f1, $f2) +{ + if (($f1 == 'true' || $f1 === TRUE || $f1 != 0) && + ($f2 == 'true' || $f2 === TRUE || $f2 != 0)) return TRUE; + if (($f1 == 'false' || $f1 === FALSE || $f1 == 0) && + ($f2 == 'false' || $f2 === FALSE || $f2 == 0)) return TRUE; + return FALSE; +} + +function string_compare($e1, $e2) +{ + if (is_numeric($e1) && is_numeric($e2)) { + return number_compare($e1, $e2); + } + # handle dateTime comparison + $e1_type = gettype($e1); + $e2_type = gettype($e2); + $ok = FALSE; + if ($e1_type == "string") { + require_once 'SOAP/Type/dateTime.php'; + $dt =& new SOAP_Type_dateTime(); + $ok = $dt->compare($e1, $e2) == 0; + } + return $ok || $e1 == $e2 || strcasecmp(trim($e1), trim($e2)) == 0; +} + +function array_compare(&$ar1, &$ar2) +{ + if (gettype($ar1) != 'array' || gettype($ar2) != 'array') return FALSE; + # first a shallow diff + if (count($ar1) != count($ar2)) return FALSE; + $diff = array_diff($ar1, $ar2); + if (count($diff) == 0) return TRUE; + + # diff failed, do a full check of the array + foreach ($ar1 as $k => $v) { + #print "comparing $v == $ar2[$k]\n"; + if (gettype($v) == "array") { + if (!array_compare($v, $ar2[$k])) return FALSE; + } else { + if (!string_compare($v, $ar2[$k])) return FALSE; + if ($type == 'float') + # we'll only compare to 3 digits of precision + $ok = number_compare($expect, $result,3); + if ($type == 'boolean') + $ok = boolean_compare($expect, $result); + else + $ok = string_compare($expect, $result); + } + } + return TRUE; +} + + +function &parseMessage($msg) +{ + # strip line endings + #$msg = preg_replace('/\r|\n/', ' ', $msg); + $response =& new SOAP_Parser($msg); + if ($response->fault) { + return $response->fault->getFault(); + } + $return =& $response->getResponse(); + $v =& $response->decode($return); + if (gettype($v) == 'array' && count($v)==1) { + return array_shift($v); + } + return $v; +} + + +?> \ No newline at end of file diff --git a/thirdparty/pear/SOAP/Interop/params_Round2Base.php b/thirdparty/pear/SOAP/Interop/params_Round2Base.php new file mode 100644 index 000000000..cfc821b15 --- /dev/null +++ b/thirdparty/pear/SOAP/Interop/params_Round2Base.php @@ -0,0 +1,230 @@ + | +// +----------------------------------------------------------------------+ +// +// $Id: params_Round2Base.php,v 1.6 2007/01/26 14:54:51 yunosh Exp $ +// + +require_once 'params_values.php'; +require_once 'interop_test.php'; +define('INTEROP_R2BASE', 'Round 2 Base'); + +//*********************************************************** +// Base echoString + +$soap_tests[INTEROP_R2BASE][] = new SOAP_Interop_Test( + 'echoString', + array('inputString' => $string), + $soap_test_null); +$soap_tests[INTEROP_R2BASE][] = new SOAP_Interop_Test( + 'echoString', + array('inputString' => $string_soapval)); +$soap_tests[INTEROP_R2BASE][] = new SOAP_Interop_Test( + 'echoString(null)', + array('inputString' => $string_null)); +$soap_tests[INTEROP_R2BASE][] = new SOAP_Interop_Test( + 'echoString(null)', + array('inputString' => $string_null_soapval)); +$soap_tests[INTEROP_R2BASE][] = new SOAP_Interop_Test( + 'echoString(entities)', + array('inputString' => $string_entities)); +$soap_tests[INTEROP_R2BASE][] = new SOAP_Interop_Test( + 'echoString(entities)', + array('inputString' => $string_entities_soapval)); +$test = new SOAP_Interop_Test( + 'echoString(utf-8)', + array('inputString' => $string_utf8)); +$test->encoding = 'UTF-8'; +$soap_tests[INTEROP_R2BASE][] = $test; +unset($test); + +$test = new SOAP_Interop_Test( + 'echoString(utf-8)', + array('inputString' => $string_utf8_soapval)); +$test->encoding = 'UTF-8'; +$soap_tests[INTEROP_R2BASE][] = $test; +unset($test); + +//*********************************************************** +// Base echoStringArray + +$soap_tests[INTEROP_R2BASE][] = new SOAP_Interop_Test( + 'echoStringArray', + array('inputStringArray' => $string_array)); +$soap_tests[INTEROP_R2BASE][] = new SOAP_Interop_Test( + 'echoStringArray', + array('inputStringArray' => $string_array_soapval)); +$soap_tests[INTEROP_R2BASE][] = new SOAP_Interop_Test( + 'echoStringArray(one)', + array('inputStringArray' => $string_array_one)); +$soap_tests[INTEROP_R2BASE][] = new SOAP_Interop_Test( + 'echoStringArray(one)', + array('inputStringArray' => $string_array_one_soapval)); +// null array test +$soap_tests[INTEROP_R2BASE][] = new SOAP_Interop_Test( + 'echoStringArray(null)', + array('inputStringArray' => $string_array_null)); +$soap_tests[INTEROP_R2BASE][] = new SOAP_Interop_Test( + 'echoStringArray(null)', + array('inputStringArray' => $string_array_null_soapval)); + +//*********************************************************** +// Base echoInteger + +$soap_tests[INTEROP_R2BASE][] = new SOAP_Interop_Test( + 'echoInteger', + array('inputInteger' => $integer)); +$soap_tests[INTEROP_R2BASE][] = new SOAP_Interop_Test( + 'echoInteger', + array('inputInteger' => $integer_soapval)); + +//*********************************************************** +// Base echoIntegerArray + +$soap_tests[INTEROP_R2BASE][] = new SOAP_Interop_Test( + 'echoIntegerArray', + array('inputIntegerArray' => $integer_array)); +$soap_tests[INTEROP_R2BASE][] = new SOAP_Interop_Test( + 'echoIntegerArray', + array('inputIntegerArray' => $integer_array_soapval)); + +// null array test +$soap_tests[INTEROP_R2BASE][] = new SOAP_Interop_Test( + 'echoIntegerArray(null)', + array('inputIntegerArray' => $integer_array_null)); +$soap_tests[INTEROP_R2BASE][] = new SOAP_Interop_Test( + 'echoIntegerArray(null)', + array('inputIntegerArray' => $integer_array_null_soapval)); + +//*********************************************************** +// Base echoFloat + +$soap_tests[INTEROP_R2BASE][] = new SOAP_Interop_Test( + 'echoFloat', + array('inputFloat' => $float)); +$soap_tests[INTEROP_R2BASE][] = new SOAP_Interop_Test( + 'echoFloat', + array('inputFloat' => $float_soapval)); + +//*********************************************************** +// Base echoFloatArray + +$soap_tests[INTEROP_R2BASE][] = new SOAP_Interop_Test( + 'echoFloatArray', + array('inputFloatArray' => $float_array)); +$soap_tests[INTEROP_R2BASE][] = new SOAP_Interop_Test( + 'echoFloatArray', + array('inputFloatArray' => $float_array_soapval)); + +//*********************************************************** +// Base echoStruct + +$soap_tests[INTEROP_R2BASE][] = new SOAP_Interop_Test( + 'echoStruct', + array('inputStruct' => $soapstruct)); +$soap_tests[INTEROP_R2BASE][] = new SOAP_Interop_Test( + 'echoStruct', + array('inputStruct' => $soapstruct_soapval)); + +//*********************************************************** +// Base echoStructArray + +$soap_tests[INTEROP_R2BASE][] = new SOAP_Interop_Test( + 'echoStructArray', + array('inputStructArray' => $soapstruct_array)); +$soap_tests[INTEROP_R2BASE][] = new SOAP_Interop_Test( + 'echoStructArray', + array('inputStructArray' => $soapstruct_array_soapval)); + +//*********************************************************** +// Base echoVoid + +$soap_tests[INTEROP_R2BASE][] = new SOAP_Interop_Test('echoVoid', null); +$test = new SOAP_Interop_Test('echoVoid', null); +$test->type = 'soapval'; +$soap_tests[INTEROP_R2BASE][] = $test; +unset($test); + +//*********************************************************** +// Base echoBase64 + +$soap_tests[INTEROP_R2BASE][] = new SOAP_Interop_Test( + 'echoBase64', + array('inputBase64' => $base64), + 'Nebraska'); +$soap_tests[INTEROP_R2BASE][] = new SOAP_Interop_Test( + 'echoBase64', + array('inputBase64' => $base64_soapval), + 'Nebraska'); + +//*********************************************************** +// Base echoHexBinary + +$soap_tests[INTEROP_R2BASE][] = new SOAP_Interop_Test( + 'echoHexBinary', + array('inputHexBinary' => $hexBin)); +$soap_tests[INTEROP_R2BASE][] = new SOAP_Interop_Test( + 'echoHexBinary', + array('inputHexBinary' => $hexBin_soapval)); + +//*********************************************************** +// Base echoDecimal + +$soap_tests[INTEROP_R2BASE][] = new SOAP_Interop_Test( + 'echoDecimal', + array('inputDecimal' => $decimal)); +$soap_tests[INTEROP_R2BASE][] = new SOAP_Interop_Test( + 'echoDecimal', + array('inputDecimal' => $decimal_soapval)); + +//*********************************************************** +// Base echoDate + +$soap_tests[INTEROP_R2BASE][] = new SOAP_Interop_Test( + 'echoDate', + array('inputDate' => $dateTime)); +$soap_tests[INTEROP_R2BASE][] = new SOAP_Interop_Test( + 'echoDate', + array('inputDate' => $dateTime_soapval)); + +//*********************************************************** +// Base echoBoolean + +$soap_tests[INTEROP_R2BASE][] = new SOAP_Interop_Test( + 'echoBoolean(TRUE)', + array('inputBoolean' => $boolean_true)); +$soap_tests[INTEROP_R2BASE][] = new SOAP_Interop_Test( + 'echoBoolean(TRUE)', + array('inputBoolean' => $boolean_true_soapval)); +$soap_tests[INTEROP_R2BASE][] = new SOAP_Interop_Test( + 'echoBoolean(FALSE)', + array('inputBoolean' => $boolean_false)); +$soap_tests[INTEROP_R2BASE][] = new SOAP_Interop_Test( + 'echoBoolean(FALSE)', + array('inputBoolean' => $boolean_false_soapval)); +$soap_tests[INTEROP_R2BASE][] = new SOAP_Interop_Test( + 'echoBoolean(1)', + array('inputBoolean' => $boolean_one)); +$soap_tests[INTEROP_R2BASE][] = new SOAP_Interop_Test( + 'echoBoolean(1)', + array('inputBoolean' => $boolean_one_soapval)); +$soap_tests[INTEROP_R2BASE][] = new SOAP_Interop_Test( + 'echoBoolean(0)', + array('inputBoolean' => $boolean_zero)); +$soap_tests[INTEROP_R2BASE][] = new SOAP_Interop_Test( + 'echoBoolean(0)', + array('inputBoolean' => $boolean_zero_soapval)); diff --git a/thirdparty/pear/SOAP/Interop/params_Round2GroupB.php b/thirdparty/pear/SOAP/Interop/params_Round2GroupB.php new file mode 100644 index 000000000..ba48201d2 --- /dev/null +++ b/thirdparty/pear/SOAP/Interop/params_Round2GroupB.php @@ -0,0 +1,72 @@ + | +// +----------------------------------------------------------------------+ +// +// $Id: params_Round2GroupB.php,v 1.4 2003/04/07 00:51:17 shane Exp $ +// +require_once 'params_values.php'; +require_once 'interop_test.php'; +define('INTEROP_R2GROUPB','Round 2 Group B'); +//*********************************************************** +// GroupB echoStructAsSimpleTypes + +$expect = array( + 'outputString'=>'arg', + 'outputInteger'=>34, + 'outputFloat'=>325.325 + ); +$soap_tests[INTEROP_R2GROUPB][] = + new SOAP_Interop_Test('echoStructAsSimpleTypes', + array('inputStruct' => &$soapstruct), $expect); +$soap_tests[INTEROP_R2GROUPB][] = + new SOAP_Interop_Test('echoStructAsSimpleTypes', + array('inputStruct' => &$soapstruct_soapval), $expect); + +//*********************************************************** +// GroupB echoSimpleTypesAsStruct + +$soap_tests[INTEROP_R2GROUPB][] =& new SOAP_Interop_Test('echoSimpleTypesAsStruct', + $simpletypes, $soapstruct); +$soap_tests[INTEROP_R2GROUPB][] =& new SOAP_Interop_Test('echoSimpleTypesAsStruct', + $simpletypes_soapval, $soapstruct); + +//*********************************************************** +// GroupB echo2DStringArray + +$soap_tests[INTEROP_R2GROUPB][] =& new SOAP_Interop_Test('echo2DStringArray', + array('input2DStringArray' => &$multidimarray)); +$soap_tests[INTEROP_R2GROUPB][] =& new SOAP_Interop_Test('echo2DStringArray', + array('input2DStringArray' => &$multidimarray_soapval)); + +//*********************************************************** +// GroupB echoNestedStruct + +$soap_tests[INTEROP_R2GROUPB][] =& new SOAP_Interop_Test('echoNestedStruct', + array('inputStruct' => &$soapstructstruct)); +$soap_tests[INTEROP_R2GROUPB][] =& new SOAP_Interop_Test('echoNestedStruct', + array('inputStruct' => &$soapstructstruct_soapval)); + +//*********************************************************** +// GroupB echoNestedArray + +$soap_tests[INTEROP_R2GROUPB][] =& new SOAP_Interop_Test('echoNestedArray', + array('inputStruct' => &$soaparraystruct)); +$soap_tests[INTEROP_R2GROUPB][] =& new SOAP_Interop_Test('echoNestedArray', + array('inputStruct' => &$soaparraystruct_soapval)); + + +?> \ No newline at end of file diff --git a/thirdparty/pear/SOAP/Interop/params_Round2GroupC.php b/thirdparty/pear/SOAP/Interop/params_Round2GroupC.php new file mode 100644 index 000000000..9681d8851 --- /dev/null +++ b/thirdparty/pear/SOAP/Interop/params_Round2GroupC.php @@ -0,0 +1,235 @@ + | +// +----------------------------------------------------------------------+ +// +// $Id: params_Round2GroupC.php,v 1.4 2003/04/07 00:51:17 shane Exp $ +// +require_once 'params_values.php'; +require_once 'interop_test.php'; +define('INTEROP_R2GROUPC','Round 2 Group C'); +//*********************************************************** +// echoMeStringRequest php val tests + +// echoMeStringRequest with endpoint as header destination, doesn't have to understand +$test =& new SOAP_Interop_Test('echoVoid', NULL); +$test->headers[] = array('{http://soapinterop.org/echoheader/}echoMeStringRequest', &$string, 0,SOAP_TEST_ACTOR_NEXT); +$test->headers_expect['echoMeStringRequest'] = array('echoMeStringResponse'=>&$string); +$soap_tests[INTEROP_R2GROUPC][] =& $test; +unset($test); + +// echoMeStringRequest with endpoint as header destination, must understand +$test =& new SOAP_Interop_Test('echoVoid', NULL); +$test->headers[] = array('{http://soapinterop.org/echoheader/}echoMeStringRequest', &$string, 1,SOAP_TEST_ACTOR_NEXT); +$test->headers_expect['echoMeStringRequest'] = array('echoMeStringResponse'=>&$string); +$soap_tests[INTEROP_R2GROUPC][] =& $test; +unset($test); + +// echoMeStringRequest with endpoint NOT header destination, doesn't have to understand +$test =& new SOAP_Interop_Test('echoVoid', NULL); +$test->headers[] = array('{http://soapinterop.org/echoheader/}echoMeStringRequest', &$string, 0, SOAP_TEST_ACTOR_OTHER); +$test->headers_expect['echoMeStringRequest'] = array(); +$soap_tests[INTEROP_R2GROUPC][] =& $test; +unset($test); + +// echoMeStringRequest with endpoint NOT header destination, must understand +$test =& new SOAP_Interop_Test('echoVoid', NULL); +$test->headers[] = array('{http://soapinterop.org/echoheader/}echoMeStringRequest', &$string, 1, SOAP_TEST_ACTOR_OTHER); +$test->headers_expect['echoMeStringRequest'] = array(); +$soap_tests[INTEROP_R2GROUPC][] =& $test; +unset($test); + +//*********************************************************** +// echoMeStringRequest soapval tests + +// echoMeStringRequest with endpoint as header destination, doesn't have to understand +$test =& new SOAP_Interop_Test('echoVoid', NULL); +$test->type = 'soapval'; +$test->headers[] =& new SOAP_Header('{http://soapinterop.org/echoheader/}echoMeStringRequest', 'string', $string); +$test->headers_expect['echoMeStringRequest'] = array('echoMeStringResponse'=>&$string); +$soap_tests[INTEROP_R2GROUPC][] =& $test; +unset($test); + +// echoMeStringRequest with endpoint as header destination, must understand +$test =& new SOAP_Interop_Test('echoVoid', NULL); +$test->type = 'soapval'; +$test->headers[] =& new SOAP_Header('{http://soapinterop.org/echoheader/}echoMeStringRequest', 'string', $string, 1); +$test->type = 'soapval'; // force a soapval version of this test +$test->headers_expect['echoMeStringRequest'] = array('echoMeStringResponse'=>&$string); +$soap_tests[INTEROP_R2GROUPC][] =& $test; +unset($test); + +// echoMeStringRequest with endpoint NOT header destination, doesn't have to understand +$test =& new SOAP_Interop_Test('echoVoid', NULL); +$test->type = 'soapval'; +$test->headers[] =& new SOAP_Header('{http://soapinterop.org/echoheader/}echoMeStringRequest', 'string', $string, 0, SOAP_TEST_ACTOR_OTHER); +$test->headers_expect['echoMeStringRequest'] = array(); +$soap_tests[INTEROP_R2GROUPC][] =& $test; +unset($test); + +// echoMeStringRequest with endpoint NOT header destination, must understand +$test =& new SOAP_Interop_Test('echoVoid', NULL); +$test->type = 'soapval'; +$test->headers[] =& new SOAP_Header('{http://soapinterop.org/echoheader/}echoMeStringRequest', 'string', $string, 1, SOAP_TEST_ACTOR_OTHER); +$test->headers_expect['echoMeStringRequest'] = array(); +$soap_tests[INTEROP_R2GROUPC][] =& $test; +unset($test); + +// echoMeStringRequest with endpoint header destination, must understand, +// invalid namespace, should recieve a fault +#$test =& new SOAP_Interop_Test('echoVoid', NULL); +#$test->type = 'soapval'; +#$test->headers[] =& new SOAP_Header('{http://unknown.org/echoheader/}echoMeStringRequest', 'string', 'hello world', 1); +#$test->headers_expect['echoMeStringRequest'] = array(); +#$test->expect_fault = TRUE; +#$soap_tests[INTEROP_R2GROUPC][] = $test; + +//*********************************************************** +// php val tests +// echoMeStructRequest with endpoint as header destination, doesn't have to understand +$test =& new SOAP_Interop_Test('echoVoid', NULL); +$test->headers[] = $soapstruct->__to_soap('{http://soapinterop.org/echoheader/}echoMeStructRequest',TRUE); +$test->headers_expect['echoMeStructRequest'] = + array('echoMeStructResponse'=> &$soapstruct); +$soap_tests[INTEROP_R2GROUPC][] =& $test; +unset($test); + +// echoMeStructRequest with endpoint as header destination, must understand +$test =& new SOAP_Interop_Test('echoVoid', NULL); +$test->headers[] = $soapstruct->__to_soap('{http://soapinterop.org/echoheader/}echoMeStructRequest',TRUE,1); +$test->headers_expect['echoMeStructRequest'] = + array('echoMeStructResponse'=> &$soapstruct); +$soap_tests[INTEROP_R2GROUPC][] =& $test; +unset($test); + +// echoMeStructRequest with endpoint NOT header destination, doesn't have to understand +$test =& new SOAP_Interop_Test('echoVoid', NULL); +$test->headers[] = $soapstruct->__to_soap('{http://soapinterop.org/echoheader/}echoMeStructRequest',TRUE,0, SOAP_TEST_ACTOR_OTHER); +$test->headers_expect['echoMeStructRequest'] = array(); +$soap_tests[INTEROP_R2GROUPC][] =& $test; +unset($test); + +// echoMeStructRequest with endpoint NOT header destination, must understand +$test =& new SOAP_Interop_Test('echoVoid', NULL); +$test->headers[] = $soapstruct->__to_soap('{http://soapinterop.org/echoheader/}echoMeStructRequest',TRUE,1, SOAP_TEST_ACTOR_OTHER); +$test->headers_expect['echoMeStructRequest'] = array(); +$soap_tests[INTEROP_R2GROUPC][] =& $test; +unset($test); + +//*********************************************************** +// soapval tests +// echoMeStructRequest with endpoint as header destination, doesn't have to understand +$test =& new SOAP_Interop_Test('echoVoid', NULL); +$test->type = 'soapval'; +$test->headers[] = $soapstruct->__to_soap('{http://soapinterop.org/echoheader/}echoMeStructRequest',TRUE); +$test->headers_expect['echoMeStructRequest'] = + array('echoMeStructResponse'=> &$soapstruct); +$soap_tests[INTEROP_R2GROUPC][] =& $test; +unset($test); + +// echoMeStructRequest with endpoint as header destination, must understand +$test =& new SOAP_Interop_Test('echoVoid', NULL); +$test->type = 'soapval'; +$test->headers[] = $soapstruct->__to_soap('{http://soapinterop.org/echoheader/}echoMeStructRequest',TRUE,1); +$test->headers_expect['echoMeStructRequest'] = + array('echoMeStructResponse'=> &$soapstruct); +$soap_tests[INTEROP_R2GROUPC][] =& $test; +unset($test); + +// echoMeStructRequest with endpoint NOT header destination, doesn't have to understand +$test =& new SOAP_Interop_Test('echoVoid', NULL); +$test->type = 'soapval'; +$test->headers[] = $soapstruct->__to_soap('{http://soapinterop.org/echoheader/}echoMeStructRequest',TRUE,0, SOAP_TEST_ACTOR_OTHER); +$test->headers_expect['echoMeStructRequest'] = array(); +$soap_tests[INTEROP_R2GROUPC][] =& $test; +unset($test); + +// echoMeStructRequest with endpoint NOT header destination, must understand +$test =& new SOAP_Interop_Test('echoVoid', NULL); +$test->type = 'soapval'; +$test->headers[] = $soapstruct->__to_soap('{http://soapinterop.org/echoheader/}echoMeStructRequest',TRUE,1, SOAP_TEST_ACTOR_OTHER); +$test->headers_expect['echoMeStructRequest'] = array(); +$soap_tests[INTEROP_R2GROUPC][] =& $test; +unset($test); + +//*********************************************************** +// echoMeUnknown php val tests +// echoMeUnknown with endpoint as header destination, doesn't have to understand +$test =& new SOAP_Interop_Test('echoVoid', NULL); +$test->headers[] = array('{http://soapinterop.org/echoheader/}echoMeUnknown', $string,0,SOAP_TEST_ACTOR_NEXT); +$test->headers_expect['echoMeUnknown'] = array(); +$soap_tests[INTEROP_R2GROUPC][] =& $test; +unset($test); + +// echoMeUnknown with endpoint as header destination, must understand +$test =& new SOAP_Interop_Test('echoVoid', NULL); +$test->headers[] = array('{http://soapinterop.org/echoheader/}echoMeUnknown', $string,1,SOAP_TEST_ACTOR_NEXT); +$test->headers_expect['echoMeUnknown'] = array(); +$test->expect_fault = TRUE; +$soap_tests[INTEROP_R2GROUPC][] =& $test; +unset($test); + +// echoMeUnknown with endpoint NOT header destination, doesn't have to understand +$test =& new SOAP_Interop_Test('echoVoid', NULL); +$test->headers[] = array('{http://soapinterop.org/echoheader/}echoMeUnknown', $string,0, SOAP_TEST_ACTOR_OTHER); +$test->headers_expect['echoMeUnknown'] = array(); +$soap_tests[INTEROP_R2GROUPC][] =& $test; +unset($test); + +// echoMeUnknown with endpoint NOT header destination, must understand +$test =& new SOAP_Interop_Test('echoVoid', NULL); +$test->headers[] = array('{http://soapinterop.org/echoheader/}echoMeUnknown', $string, 1, SOAP_TEST_ACTOR_OTHER); +$test->headers_expect['echoMeUnknown'] = array(); +$soap_tests[INTEROP_R2GROUPC][] =& $test; +unset($test); + +//*********************************************************** +// echoMeUnknown soapval tests +// echoMeUnknown with endpoint as header destination, doesn't have to understand +$test =& new SOAP_Interop_Test('echoVoid', NULL); +$test->type = 'soapval'; +$test->headers[] =& new SOAP_Header('{http://soapinterop.org/echoheader/}echoMeUnknown','string',$string); +$test->headers_expect['echoMeUnknown'] = array(); +$soap_tests[INTEROP_R2GROUPC][] =& $test; +unset($test); + +// echoMeUnknown with endpoint as header destination, must understand +$test =& new SOAP_Interop_Test('echoVoid', NULL); +$test->type = 'soapval'; +$test->headers[] =& new SOAP_Header('{http://soapinterop.org/echoheader/}echoMeUnknown','string',$string,1); +$test->headers_expect['echoMeUnknown'] = array(); +$test->expect_fault = TRUE; +$soap_tests[INTEROP_R2GROUPC][] =& $test; +unset($test); + +// echoMeUnknown with endpoint NOT header destination, doesn't have to understand +$test =& new SOAP_Interop_Test('echoVoid', NULL); +$test->type = 'soapval'; +$test->headers[] =& new SOAP_Header('{http://soapinterop.org/echoheader/}echoMeUnknown','string',$string, 0, SOAP_TEST_ACTOR_OTHER); +$test->headers_expect['echoMeUnknown'] = array(); +$soap_tests[INTEROP_R2GROUPC][] =& $test; +unset($test); + +// echoMeUnknown with endpoint NOT header destination, must understand +$test =& new SOAP_Interop_Test('echoVoid', NULL); +$test->type = 'soapval'; +$test->headers[] =& new SOAP_Header('{http://soapinterop.org/echoheader/}echoMeUnknown','string',$string, 1, SOAP_TEST_ACTOR_OTHER); +$test->headers_expect['echoMeUnknown'] = array(); +$soap_tests[INTEROP_R2GROUPC][] =& $test; +unset($test); + + +?> \ No newline at end of file diff --git a/thirdparty/pear/SOAP/Interop/params_Round3GroupD.php b/thirdparty/pear/SOAP/Interop/params_Round3GroupD.php new file mode 100644 index 000000000..70fde94e1 --- /dev/null +++ b/thirdparty/pear/SOAP/Interop/params_Round3GroupD.php @@ -0,0 +1,121 @@ + | +// +----------------------------------------------------------------------+ +// +// $Id: params_Round3GroupD.php,v 1.7 2003/04/14 01:40:21 shane Exp $ +// +require_once 'params_values.php'; +require_once 'interop_test.php'; +define('INTEROP_R3D_COMPOUND1','Round 3 Group D Compound 1'); +define('INTEROP_R3D_COMPOUND2','Round 3 Group D Compound 2'); +define('INTEROP_R3D_DOCLIT','Round 3 Group D DocLit'); +define('INTEROP_R3D_DOCLIT_PARAM','Round 3 Group D DocLitParams'); +define('INTEROP_R3D_IMPORT1','Round 3 Group D Import 1'); +define('INTEROP_R3D_IMPORT2','Round 3 Group D Import 2'); +define('INTEROP_R3D_IMPORT3','Round 3 Group D Import 3'); +define('INTEROP_R3D_RPCENC','Round 3 Group D RpcEnc'); +//*********************************************************** +// GroupD + +# COMPOUND 1 tests +# http://www.whitemesa.net/wsdl/r3/compound1.wsdl +$test =& new SOAP_Interop_Test('echoPerson', array('x_Person'=>&$person)); +$test->type = 'php'; // force to php testing +$soap_tests[INTEROP_R3D_COMPOUND1][] = &$test; +unset($test); + +$test =& new SOAP_Interop_Test('echoDocument', array('x_Document'=>'Test Document Here')); +$test->type = 'php'; // force to php testing +$soap_tests[INTEROP_R3D_COMPOUND1][] = &$test; +unset($test); + +# COMPOUND 2 tests +# http://www.whitemesa.net/wsdl/r3/compound2.wsdl +$test =& new SOAP_Interop_Test('echoEmployee', array('x_Employee'=>&$employee)); +$test->type = 'php'; // force to php testing +$soap_tests[INTEROP_R3D_COMPOUND2][] = &$test; +unset($test); + +# DOC LIT Tests +# http://www.whitemesa.net/wsdl/r3/interoptestdoclit.wsdl +$soap_tests[INTEROP_R3D_DOCLIT][] =& + new SOAP_Interop_Test('echoString', + array('echoStringParam' => &$string)); +$soap_tests[INTEROP_R3D_DOCLIT][] =& + new SOAP_Interop_Test('echoStringArray', + array('echoStringArrayParam' => &$string_array)); +$soap_tests[INTEROP_R3D_DOCLIT][] =& + new SOAP_Interop_Test('echoStruct', + array('echoStructParam' => &$soapstruct)); +#$soap_tests[INTEROP_R3D_DOCLIT][] = +# new SOAP_Interop_Test('echoVoid', NULL); + +# DOC LIT w/Params Tests +# http://www.whitemesa.net/wsdl/r3/interoptestdoclitparameters.wsdl +$soap_tests[INTEROP_R3D_DOCLIT_PARAM][] =& + new SOAP_Interop_Test('echoString', + array('param0' => $string)); +$soap_tests[INTEROP_R3D_DOCLIT_PARAM][] =& + new SOAP_Interop_Test('echoStringArray', + array('param0' => &$string_array)); +$soap_tests[INTEROP_R3D_DOCLIT_PARAM][] =& + new SOAP_Interop_Test('echoStruct', + array('param0' => &$soapstruct)); +$soap_tests[INTEROP_R3D_DOCLIT_PARAM][] =& + new SOAP_Interop_Test('echoVoid', NULL); + +# IMPORT 1 tests +# http://www.whitemesa.net/wsdl/r3/import1.wsdl +$soap_tests[INTEROP_R3D_IMPORT1][] =& + new SOAP_Interop_Test('echoString', + array('x' => &$string)); + +# IMPORT 2 tests +# http://www.whitemesa.net/wsdl/r3/import2.wsdl +$soap_tests[INTEROP_R3D_IMPORT2][] =& + new SOAP_Interop_Test('echoStruct', + array('inputStruct' => &$soapstruct)); + +# IMPORT 2 tests +# http://www.whitemesa.net/wsdl/r3/import3.wsdl +$test =& new SOAP_Interop_Test('echoStruct', + array('inputStruct' => &$soapstruct)); +$test->service = 'Import3'; +$soap_tests[INTEROP_R3D_IMPORT3][] = &$test; +unset($test); + +$test =& new SOAP_Interop_Test('echoStructArray', + array('inputArray' =>&$soapstruct_array)); +$test->service = 'Import3'; +$soap_tests[INTEROP_R3D_IMPORT3][] = &$test; +unset($test); + +# RPC ENCODED Tests +# http://www.whitemesa.net/wsdl/r3/interoptestdoclitparameters.wsdl +$soap_tests[INTEROP_R3D_RPCENC][] =& + new SOAP_Interop_Test('echoString', + array('param0' => &$string)); +$soap_tests[INTEROP_R3D_RPCENC][] =& + new SOAP_Interop_Test('echoStringArray', + array('param0' => &$string_array)); +$soap_tests[INTEROP_R3D_RPCENC][] =& + new SOAP_Interop_Test('echoStruct', + array('param0' => &$soapstruct)); +$soap_tests[INTEROP_R3D_RPCENC][] =& + new SOAP_Interop_Test('echoVoid', NULL); + +?> \ No newline at end of file diff --git a/thirdparty/pear/SOAP/Interop/params_classes.php b/thirdparty/pear/SOAP/Interop/params_classes.php new file mode 100644 index 000000000..187b311ce --- /dev/null +++ b/thirdparty/pear/SOAP/Interop/params_classes.php @@ -0,0 +1,162 @@ + | +// +----------------------------------------------------------------------+ +// +// $Id: params_classes.php,v 1.8 2007/01/21 16:15:00 yunosh Exp $ +// +require_once 'SOAP/Value.php'; + +class SOAPStruct { + var $varString; + var $varInt; + var $varFloat; + function SOAPStruct($s=NULL, $i=NULL, $f=NULL) { + $this->varString = $s; + $this->varInt = $i; + $this->varFloat = $f; + } + + function __to_soap($name = 'inputStruct', $header=false, $mustUnderstand=0, $actor='http://schemas.xmlsoap.org/soap/actor/next') + { + $inner[] = new SOAP_Value('varString','string',$this->varString); + $inner[] = new SOAP_Value('varInt','int',$this->varInt); + $inner[] = new SOAP_Value('varFloat','float',$this->varFloat); + if ($header) { + return new SOAP_Header($name,'{http://soapinterop.org/xsd}SOAPStruct',$inner,$mustUnderstand,$actor); + } + return new SOAP_Value($name,'{http://soapinterop.org/xsd}SOAPStruct',$inner); + + } +} + +class SOAPStructStruct { + var $varString; + var $varInt; + var $varFloat; + var $varStruct; + function SOAPStructStruct($s=NULL, $i=NULL, $f=NULL, $ss=NULL) { + // XXX unfortunately, a copy of $ss will occure here + // ze2 can fix this I think + $this->varString = $s; + $this->varInt = $i; + $this->varFloat = $f; + $this->varStruct = $ss; + } + + function __to_soap($name = 'inputStruct') + { + $v[] = new SOAP_Value('varString','string',$this->varString); + $v[] = new SOAP_Value('varInt','int',$this->varInt); + $v[] = new SOAP_Value('varFloat','float',$this->varFloat); + $v[] = $this->varStruct->__to_soap('varStruct'); + return new SOAP_Value($name,'{http://soapinterop.org/xsd}SOAPStructStruct',$v); + } +} + +class SOAPArrayStruct { + var $varString; + var $varInt; + var $varFloat; + var $varArray; + function SOAPArrayStruct($s=NULL, $i=NULL, $f=NULL, $ss=NULL) { + // XXX unfortunately, a copy of $ss will occure here + // ze2 can fix this I think + $this->varString = $s; + $this->varInt = $i; + $this->varFloat = $f; + $this->varArray = $ss; + } + + function __to_soap($name = 'inputStruct') + { + $ar = array(); + $c = count($this->varArray); + for ($i=0; $i<$c; $i++) { + $ar[] = new SOAP_Value('item','string',$this->varArray[$i]); + } + $v[] = new SOAP_Value('varString','string',$this->varString); + $v[] = new SOAP_Value('varInt','int',$this->varInt); + $v[] = new SOAP_Value('varFloat','float',$this->varFloat); + $v[] = new SOAP_Value('varArray',false,$ar); + + return new SOAP_Value($name,'{http://soapinterop.org/xsd}SOAPArrayStruct',$v); + } +} + +class Person { + var $Age; + var $ID; + var $Name; + var $Male; + function Person($a=NULL, $i=NULL, $n=NULL, $m=NULL) { + $this->Age = $a; + $this->ID = $i; + $this->Name = $n; + $this->Male = $m; + } + + function __set_attribute($key, $value) + { + $this->$key = $value; + } + + function __to_soap($name = 'x_Person',$ns = 'http://soapinterop.org/xsd', $compound2=false) + { + if (!$compound2) { + $v[] = new SOAP_Value("\{$ns}Age",'double',$this->Age); + $v[] = new SOAP_Value("\{$ns}ID",'float',$this->ID); + return new SOAP_Value("\{$ns}$name",'Person', + $v,array('Name'=>$this->Name,'Male'=>$this->Male)); + } else + $v[] = new SOAP_Value("\{$ns}Name",'string',$this->Name); + $v[] = new SOAP_Value("\{$ns}Male",'boolean',$this->Male); + return new SOAP_Value("\{$ns}$name",'Person',$v); + } +} + +class x_Person extends Person { + function x_Person($a=NULL, $i=NULL, $n=NULL, $m=NULL) { + $parent->Person($a,$i,$n,$m); + } +} + +class Employee { + var $ID; + var $salary; + var $person; // class person2 + function Employee($person=NULL,$id=NULL,$salary=NULL) { + $this->person = $person; + $this->ID = $id; + $this->salary = $salary; + } + + function __to_soap($name = 'x_Employee', $ns='http://soapinterop.org/employee') + { + $person = $this->person->__to_soap('person','http://soapinterop.org/person',true); + $person->namespace = $ns; + $va[] = $person; + $va[] = new SOAP_Value("\{$ns}salary",'double',$this->salary); + $va[] = new SOAP_Value("\{$ns}ID",'int',$this->ID); + return new SOAP_Value("\{$ns}$name",'Employee',$va); + } +} + +class x_Employee extends Employee { + function x_Employee($person=NULL,$id=NULL,$salary=NULL) { + $parent->Employee($person,$id,$salary); + } +} diff --git a/thirdparty/pear/SOAP/Interop/params_values.php b/thirdparty/pear/SOAP/Interop/params_values.php new file mode 100644 index 000000000..cfa27f09a --- /dev/null +++ b/thirdparty/pear/SOAP/Interop/params_values.php @@ -0,0 +1,173 @@ + | +// +----------------------------------------------------------------------+ +// +// $Id: params_values.php,v 1.7 2007/01/26 15:18:21 yunosh Exp $ +// + +require_once 'SOAP/Value.php'; +require_once 'params_classes.php'; + +$soap_test_null = null; + +$string = 'Hello World'; +$string_soapval = new SOAP_Value('inputString', 'string', $string); +$string_null = null; +$string_null_soapval = new SOAP_Value('inputString', 'string', $string_null); +$string_entities = "this is a test \n"; +$string_entities_soapval = new SOAP_Value('inputString', 'string', $string_entities); +$string_utf8 = utf8_encode('ỗÈéóÒ₧⅜ỗỸ'); +$string_utf8_soapval = new SOAP_Value('inputString', 'string', $string_utf8); +$string_array = array('good', 'bad'); +$string_array_soapval = new SOAP_Value( + 'inputStringArray', + 'Array', + array(new SOAP_Value('item', 'string', 'good'), + new SOAP_Value('item', 'string', 'bad'))); + +$string_array_one = array('good'); +$string_array_one_soapval = new SOAP_Value( + 'inputStringArray', + 'Array', + array(new SOAP_Value('item', 'string', 'good'))); + +$string_array_null = null; +$string_array_null_soapval = new SOAP_Value('inputStringArray', 'Array', null); +$string_array_null_soapval->arrayType='{http://www.w3.org/2001/XMLSchema}string'; + +$integer = 12345; +$integer_soapval = new SOAP_Value('inputInteger', 'int', $integer); +$integer_array = array(1, 234324324, 2); +$integer_array_soapval = new SOAP_Value( + 'inputIntegerArray', + 'Array', + array(new SOAP_Value('item', 'int', 1), + new SOAP_Value('item', 'int', 234324324), + new SOAP_Value('item', 'int', 2))); + +$integer_array_null = null; +$integer_array_null_soapval = new SOAP_Value('inputIntegerArray', 'Array', null); +$integer_array_null_soapval->arrayType='{http://www.w3.org/2001/XMLSchema}int'; + +$float = 123.45; +$float_soapval = new SOAP_Value('inputFloat', 'float', $float); +$float_array = array(1.0, 2343.24324, -2.5); +$float_array_soapval = new SOAP_Value( + 'inputFloatArray', + 'Array', + array(new SOAP_Value('item', 'float', 1.0), + new SOAP_Value('item', 'float', 2343.24324), + new SOAP_Value('item', 'float', -2.5))); + +$float_array_null = null; +$float_array_null_soapval = new SOAP_Value('inputFloatArray', 'Array', null); +$float_array_null_soapval->arrayType='{http://www.w3.org/2001/XMLSchema}float'; + +$soapstruct = new SOAPStruct('arg', 34, 325.325); +$soapstruct_soapval = $soapstruct->__to_soap(); +$soapstruct_header_soapval = $soapstruct->__to_soap('{http://soapinterop.org/echoheader/}echoMeStructRequest'); +$soapstruct_array = array($soapstruct, $soapstruct, $soapstruct); +$soapstruct_array_soapval = new SOAP_Value( + 'inputStructArray', + 'Array', + array($soapstruct_soapval, + $soapstruct_soapval, + $soapstruct_soapval)); + +$soapstructstruct = new SOAPStructStruct('arg', 34, 325.325, $soapstruct); +$soapstructstruct_soapval = $soapstructstruct->__to_soap(); +$soapstructstruct_array = array($soapstructstruct, $soapstructstruct, $soapstructstruct); +$soapstructstruct_array_soapval = new SOAP_Value( + 'inputStructArray', + 'Array', + array($soapstructstruct_soapval, + $soapstructstruct_soapval, + $soapstructstruct_soapval)); + +$soaparraystruct = new SOAPArrayStruct('arg', 34, 325.325, + array('good', 'bad', 'ugly')); +$soaparraystruct_soapval = $soaparraystruct->__to_soap(); +$soaparraystruct_array = array($soaparraystruct, $soaparraystruct, $soaparraystruct); +$soaparraystruct_array_soapval = new SOAP_Value( + 'inputStructArray', + 'Array', + array($soaparraystruct_soapval, + $soaparraystruct_soapval, + $soaparraystruct_soapval)); + +$simpletypes = array( + 'inputString'=>'arg', + 'inputInteger'=>34, + 'inputFloat'=>325.325 + ); + +$simpletypes_soapval = array(); +$simpletypes_soapval[] = new SOAP_Value('inputString', 'string', 'arg'); +$simpletypes_soapval[] = new SOAP_Value('inputInteger', 'int', 34); +$simpletypes_soapval[] = new SOAP_Value('inputFloat', 'float', 325.325); + +$base64 = 'TmVicmFza2E='; +$base64_soapval = new SOAP_Value('inputBase64', 'base64Binary', $base64); + +$hexBin = '736F61707834'; +$hexBin_soapval = new SOAP_Value('inputHexBinary', 'hexBinary', $hexBin); + +$decimal = 12345.67890; +$decimal_soapval =new SOAP_Value('inputDecimal', 'decimal', $decimal); + +$dateTime = '2001-05-24T17:31:41Z'; +$dateTime_soapval = new SOAP_Value('inputDate', 'dateTime', $dateTime); + +$boolean_true = true; +$boolean_true_soapval = new SOAP_Value('inputBoolean', 'boolean', true); +$boolean_false = false; +$boolean_false_soapval = new SOAP_Value('inputBoolean', 'boolean', false); +$boolean_one = 1; +$boolean_one_soapval = new SOAP_Value('inputBoolean', 'boolean', 1); +$boolean_zero = 0; +$boolean_zero_soapval = new SOAP_Value('inputBoolean', 'boolean', 0); + +// XXX I know this isn't quite right, need to deal with this better +function &make_2d($x, $y) +{ + $a = array(); + for ($_x = 0; $_x < $x; $_x++) { + $a[$_x] = array(); + for ($_y = 0; $_y < $y; $_y++) { + $a[$_x][$_y] = "x{$_x}y{$_y}"; + } + } + return $a; +} + +$multidimarray = make_2d(3, 3); +$multidimarray_soapval = new SOAP_Value( + 'input2DStringArray', + 'Array', + array(array(new SOAP_Value('item', 'string', 'row0col0'), + new SOAP_Value('item', 'string', 'row0col1'), + new SOAP_Value('item', 'string', 'row0col2')), + array(new SOAP_Value('item', 'string', 'row1col0'), + new SOAP_Value('item', 'string', 'row1col1'), + new SOAP_Value('item', 'string', 'row1col2')))); +$multidimarray_soapval->options['flatten'] = true; + +// Round2GroupC values +$_person = new Person(32, 12345, 'Shane', true); +$person = $_person->__to_soap(); +$_employee = new Employee($_person, 12345, 1000000.00); +$employee = $_employee->__to_soap(); diff --git a/thirdparty/pear/SOAP/Interop/readme.txt b/thirdparty/pear/SOAP/Interop/readme.txt new file mode 100644 index 000000000..933e65265 --- /dev/null +++ b/thirdparty/pear/SOAP/Interop/readme.txt @@ -0,0 +1,23 @@ +Round 2 Interop Test files + +Resources: +http://www.whitemesa.com/interop.htm +http://www.whitemesa.com/r3/interop3.html +http://www.pocketsoap.com/registration/ + +Requires an SQL database, schema for MySQL is in interop_database.sql. + +Run interop_client_run.php to store test results. +View index.php to see test results. + +To setup an interop server: + +1. Copy config.php.dist to config.php. +2. Web server must alias url /soap_interop/ to the pear/SOAP_Interop + directory. The alias url can be set in config.php. +3. index.php should be set for the default document. +4. MySQL should be set up, with a database called interop, schema is in + interop_database.sql. Database name, user, and password can be set in + config.php. +5. interop_client_run.php should not be left under the web root, it is + available for manual testing. diff --git a/thirdparty/pear/SOAP/Interop/registrationAndNotification.php b/thirdparty/pear/SOAP/Interop/registrationAndNotification.php new file mode 100644 index 000000000..bda1d5a5c --- /dev/null +++ b/thirdparty/pear/SOAP/Interop/registrationAndNotification.php @@ -0,0 +1,473 @@ +$v) { + $this->$k = $v; + } + } + } +} + +class serverInfo { + var $id; + var $service_id; + var $name; + var $version; + var $endpointURL; + var $wsdlURL; + + function serverInfo($ar=NULL) { + if (is_array($ar)) { + foreach ($ar as $k=>$v) { + $this->$k = $v; + } + } + } +} + +class Service { + var $id; + var $name; + var $description; + var $wsdlURL; + var $websiteURL; + + function Service($ar=NULL) { + if (is_array($ar)) { + foreach ($ar as $k=>$v) { + $this->$k = $v; + } + } + } +} + +class subscriberInfo { + var $notificationID; + var $expires; /* dateTime */ +} + +class ChangeItem { + var $id; + var $timestamp; /* dateTime */ + var $headline; + var $notes; + var $url; +} + +function getLocalInteropServer($testname,$id,$localBaseUrl='http://localhost/soap_interop/') { + $localServer = array(); + $localServer['service_id']=$id; + $localServer['name']='Local PEAR::SOAP'; + $localServer['version']=SOAP_LIBRARY_VERSION; + switch ($testname) { + case 'Round 2 Base': + $localServer['endpointURL']=$localBaseUrl.'server_Round2Base.php'; + $localServer['wsdlURL']=$localBaseUrl.'wsdl/interop.wsdl.php'; + return new serverInfo($localServer); + case 'Round 2 Group B': + $localServer['endpointURL']=$localBaseUrl.'server_Round2GroupB.php'; + $localServer['wsdlURL']=$localBaseUrl.'wsdl/interopB.wsdl.php'; + return new serverInfo($localServer); + case 'Round 2 Group C': + $localServer['endpointURL']=$localBaseUrl.'server_Round2GroupC.php'; + $localServer['wsdlURL']=$localBaseUrl.'wsdl/echoheadersvc.wsdl.php'; + return new serverInfo($localServer); + case 'Round 3 Group D EmptySA': + $localServer['endpointURL']=$localBaseUrl.'server_Round3GroupDEmptySA.php'; + $localServer['wsdlURL']=$localBaseUrl.'wsdl/emptysa.wsdl.php'; + return new serverInfo($localServer); + case 'Round 3 Group D Compound 1': + $localServer['endpointURL']=$localBaseUrl.'server_Round3GroupDCompound1.php'; + $localServer['wsdlURL']=$localBaseUrl.'wsdl/compound1.wsdl.php'; + return new serverInfo($localServer); + case 'Round 3 Group D Compound 2': + $localServer['endpointURL']=$localBaseUrl.'server_Round3GroupDCompound2.php'; + $localServer['wsdlURL']=$localBaseUrl.'wsdl/compound2.wsdl.php'; + return new serverInfo($localServer); + case 'Round 3 Group D DocLit': + $localServer['endpointURL']=$localBaseUrl.'server_Round3GroupDDocLit.php'; + $localServer['wsdlURL']=$localBaseUrl.'wsdl/InteropTestDocLit.wsdl.php'; + return new serverInfo($localServer); + case 'Round 3 Group D DocLitParams': + $localServer['endpointURL']=$localBaseUrl.'server_Round3GroupDDocLitParams.php'; + $localServer['wsdlURL']=$localBaseUrl.'wsdl/InteropTestDocLitParameters.wsdl.php'; + return new serverInfo($localServer); + case 'Round 3 Group D Import 1': + $localServer['endpointURL']=$localBaseUrl.'server_Round3GroupDImport1.php'; + $localServer['wsdlURL']=$localBaseUrl.'wsdl/import1.wsdl.php'; + return new serverInfo($localServer); + case 'Round 3 Group D Import 2': + $localServer['endpointURL']=$localBaseUrl.'server_Round3GroupDImport2.php'; + $localServer['wsdlURL']=$localBaseUrl.'wsdl/import2.wsdl.php'; + return new serverInfo($localServer); + case 'Round 3 Group D Import 3': + $localServer['endpointURL']=$localBaseUrl.'server_Round3GroupDImport3.php'; + $localServer['wsdlURL']=$localBaseUrl.'wsdl/import3.wsdl.php'; + return new serverInfo($localServer); + case 'Round 3 Group D RpcEnc': + $localServer['endpointURL']=$localBaseUrl.'server_Round3GroupDRpcEnc.php'; + $localServer['wsdlURL']=$localBaseUrl.'wsdl/InteropTestRpcEnc.wsdl.php'; + return new serverInfo($localServer); + #case 'Round 3 Group E DocLit': + #case 'Round 3 Group E RpcEnc': + #case 'Round 3 Group F Extensibility': + #case 'Round 3 Group F ExtensibilityRequired': + #case 'Round 3 Group F Headers': + #case 'Round 4 DIME/Doc Attachments': + #case 'Round 4 DIME/RPC Attachments': + #case 'Round 4 MIME/Doc Attachments': + #case 'Round 4 SwA/RPC Attachments': + } + return NULL; +} + +class SOAP_Interop_registrationAndNotificationService_ServicesPort extends SOAP_Client { + function SOAP_Interop_registrationAndNotificationService_ServicesPort() { + $this->SOAP_Client("http://soap.4s4c.com/registration/soap.asp", 0); + $this->_auto_translation = true; + } + function &ServiceList() { + return $this->call("ServiceList", + $v = NULL, + array('namespace'=>'http://soap.pocketsoap.com/registration/services', + 'soapaction'=>'http://soap.pocketsoap.com/registration/services#ServiceList', + 'style'=>'rpc', + 'use'=>'encoded')); + } + function &Servers($serviceID) { + return $this->call("Servers", + $v = array("serviceID"=>$serviceID), + array('namespace'=>'http://soap.pocketsoap.com/registration/services', + 'soapaction'=>'http://soap.pocketsoap.com/registration/services#Servers', + 'style'=>'rpc', + 'use'=>'encoded')); + } + function &Clients($serviceID) { + return $this->call("Clients", + $v = array("serviceID"=>$serviceID), + array('namespace'=>'http://soap.pocketsoap.com/registration/services', + 'soapaction'=>'http://soap.pocketsoap.com/registration/services#Clients', + 'style'=>'rpc', + 'use'=>'encoded')); + } +} +class SOAP_Interop_registrationAndNotificationService_ClientsPort extends SOAP_Client { + function SOAP_Interop_registrationAndNotificationService_ClientsPort() { + $this->SOAP_Client("http://soap.4s4c.com/registration/soap.asp", 0); + $this->_auto_translation = true; + } + function &RegisterClient($serviceID, $clientInfo) { + return $this->call("RegisterClient", + $v = array("serviceID"=>$serviceID, "clientInfo"=>$clientInfo), + array('namespace'=>'http://soap.pocketsoap.com/registration/clients', + 'soapaction'=>'http://soap.pocketsoap.com/registration/clients#RegisterClient', + 'style'=>'rpc', + 'use'=>'encoded')); + } + function &UpdateClient($clientID, $clientInfo) { + return $this->call("UpdateClient", + $v = array("clientID"=>$clientID, "clientInfo"=>$clientInfo), + array('namespace'=>'http://soap.pocketsoap.com/registration/clients', + 'soapaction'=>'http://soap.pocketsoap.com/registration/clients#UpdateClient', + 'style'=>'rpc', + 'use'=>'encoded')); + } + function &RemoveClient($clientID) { + return $this->call("RemoveClient", + $v = array("clientID"=>$clientID), + array('namespace'=>'http://soap.pocketsoap.com/registration/clients', + 'soapaction'=>'http://soap.pocketsoap.com/registration/clients#RemoveClient', + 'style'=>'rpc', + 'use'=>'encoded')); + } +} +class SOAP_Interop_registrationAndNotificationService_ServersPort extends SOAP_Client { + function SOAP_Interop_registrationAndNotificationService_ServersPort() { + $this->SOAP_Client("http://soap.4s4c.com/registration/soap.asp", 0); + $this->_auto_translation = true; + } + function &RegisterServer($serviceID, $serverInfo) { + return $this->call("RegisterServer", + $v = array("serviceID"=>$serviceID, "serverInfo"=>$serverInfo), + array('namespace'=>'http://soap.pocketsoap.com/registration/servers', + 'soapaction'=>'http://soap.pocketsoap.com/registration/servers#RegisterServer', + 'style'=>'rpc', + 'use'=>'encoded')); + } + function &UpdateServer($serverID, $serverInfo) { + return $this->call("UpdateServer", + $v = array("serverID"=>$serverID, "serverInfo"=>$serverInfo), + array('namespace'=>'http://soap.pocketsoap.com/registration/servers', + 'soapaction'=>'http://soap.pocketsoap.com/registration/servers#UpdateServer', + 'style'=>'rpc', + 'use'=>'encoded')); + } + function &RemoveServer($serverID) { + return $this->call("RemoveServer", + $v = array("serverID"=>$serverID), + array('namespace'=>'http://soap.pocketsoap.com/registration/servers', + 'soapaction'=>'http://soap.pocketsoap.com/registration/servers#RemoveServer', + 'style'=>'rpc', + 'use'=>'encoded')); + } +} +class SOAP_Interop_registrationAndNotificationService_SubscriberPort extends SOAP_Client { + function SOAP_Interop_registrationAndNotificationService_SubscriberPort() { + $this->SOAP_Client("http://soap.4s4c.com/registration/soap.asp", 0); + $this->_auto_translation = true; + } + function &Subscribe($serviceID, $ServerChanges, $ClientChanges, $NotificationURL) { + return $this->call("Subscribe", + $v = array("serviceID"=>$serviceID, "ServerChanges"=>$ServerChanges, "ClientChanges"=>$ClientChanges, "NotificationURL"=>$NotificationURL), + array('namespace'=>'http://soap.pocketsoap.com/registration/subscriber', + 'soapaction'=>'http://soap.pocketsoap.com/registration/subscriber#Subscribe', + 'style'=>'rpc', + 'use'=>'encoded')); + } + function &Renew($notificationID) { + return $this->call("Renew", + $v = array("notificationID"=>$notificationID), + array('namespace'=>'http://soap.pocketsoap.com/registration/subscriber', + 'soapaction'=>'http://soap.pocketsoap.com/registration/subscriber#Renew', + 'style'=>'rpc', + 'use'=>'encoded')); + } + function &Cancel($notificationID) { + return $this->call("Cancel", + $v = array("notificationID"=>$notificationID), + array('namespace'=>'http://soap.pocketsoap.com/registration/subscriber', + 'soapaction'=>'http://soap.pocketsoap.com/registration/subscriber#Cancel', + 'style'=>'rpc', + 'use'=>'encoded')); + } +} +class SOAP_Interop_registrationAndNotificationService_ChangeLogPort extends SOAP_Client { + function SOAP_Interop_registrationAndNotificationService_ChangeLogPort() { + $this->SOAP_Client("http://soap.4s4c.com/registration/soap.asp", 0); + $this->_auto_translation = true; + } + function &RecentChanges($MaxEntries) { + return $this->call("RecentChanges", + $v = array("MaxEntries"=>$MaxEntries), + array('namespace'=>'http://soap.pocketsoap.com/registration/changeLog', + 'soapaction'=>'http://soap.pocketsoap.com/registration/changeLog#RecentChanges', + 'style'=>'rpc', + 'use'=>'encoded')); + } +} + +class SOAP_Interop_registrationDB { + var $DSN; + var $dbc = NULL; + + var $client; // soap_client + var $services; + var $currentServiceId; + var $servers; + var $clients; + + function SOAP_Interop_registrationDB() + { + global $interopConfig; + $this->DSN = $interopConfig['DSN']; + $this->client =& new SOAP_Interop_registrationAndNotificationService_ServicesPort(); + $this->connectDB(); + $this->getServiceList(); + } + + function connectDB() + { + if (!$this->dbc) + $this->dbc =& DB::connect($this->DSN, true); + if (PEAR::isError($this->dbc)) { + echo $this->dbc->getMessage(); + $this->dbc = NULL; + return false; + } + return true; + } + + function updateDB() + { + $this->updateServiceDb(); + $this->updateServerDb(); + $this->updateClientsDb(); + } + + function &retreiveServiceList() + { + if (!$this->services) { + $this->services =& $this->client->ServiceList(); + } + return $this->services; + } + + function &retreiveServerList($serviceID) + { + if (!$this->servers || $this->currentServiceId != $serviceID) { + $this->currentServiceId = $serviceID; + $this->servers =& $this->client->Servers($serviceID); + } + return $this->servers; + } + + function &retreiveClientList($serviceID) + { + if (!$this->clients || $this->currentServiceId != $serviceID) { + $this->currentServiceId = $serviceID; + $this->clients =& $this->client->Clients($serviceID); + } + return $this->clients; + } + + function updateServiceDb() + { + if (!$this->connectDB()) return false; + $this->retreiveServiceList(); + echo "Updating Services\n"; + foreach ($this->services as $service) { + $res = $this->dbc->getRow("select id from services where id='{$service->id}'"); + if ($res && !PEAR::isError($res)) { + $res = $this->dbc->query("update services set name='{$service->name}',". + "description='{$service->description}',wsdlURL='{$service->wsdlURL}',". + "websiteURL='{$service->websiteURL}' where id='{$service->id}'"); + } else { + $res = $this->dbc->query("insert into services (id,name,description,wsdlURL,websiteURL) ". + "values('{$service->id}','{$service->name}','{$service->description}','{$service->wsdlURL}','{$service->websiteURL}')"); + } + } + } + + function _updateOrAddServer($id, $server) { + $res = $this->dbc->getRow("select * from serverinfo where service_id='$id' and name='{$server->name}'"); + if ($res && !PEAR::isError($res)) { + $res = $this->dbc->query("update serverinfo set ". + "version='{$server->version}', ". + "endpointURL='{$server->endpointURL}', ". + "wsdlURL='{$server->wsdlURL}' where id={$res->id}"); + } else { + $res = $this->dbc->query("insert into serverinfo (service_id,name,version,endpointURL,wsdlURL) ". + "values('$id','{$server->name}','{$server->version}','{$server->endpointURL}','{$server->wsdlURL}')"); + } + if (PEAR::isError($res)) { + echo $res->toString() . "\n"; + } + } + + function updateServerDb() + { + global $INTEROP_LOCAL_SERVER; + if (!$this->connectDB()) return false; + $this->retreiveServiceList(); + $c = count($this->services); + for ($i=0;$i<$c;$i++) { + $this->retreiveServerList($this->services[$i]->id); + echo "Updating Servers for {$this->services[$i]->name}\n"; + if (!$this->servers) continue; + foreach ($this->servers as $server) { + $this->_updateOrAddServer($this->services[$i]->id, $server); + } + // add the local server now + if ($INTEROP_LOCAL_SERVER) { + $server = getLocalInteropServer($this->services[$i]->name, $this->services[$i]->id); + if ($server) { + $this->_updateOrAddServer($this->services[$i]->id, $server); + } + } + } + } + + function updateClientsDb() + { + if (!$this->connectDB()) return false; + $this->retreiveServiceList(); + foreach ($this->services as $service) { + $this->retreiveClientList($service->id); + echo "Updating Clients for {$service->name}\n"; + if (!$this->clients) continue; + foreach ($this->clients as $client) { + $res = $this->dbc->getRow("select id from clientinfo where id='{$service->id}' and name='{$client->name}'"); + if ($res && !PEAR::isError($res)) { + $res = $this->dbc->query("update clientinfo set ". + "version='{$client->version}', ". + "resultsURL='{$client->resultsURL}' where ". + "id='{$service->id}',name='{$client->name}'"); + } else { + $res = $this->dbc->query("insert into clientinfo (id,name,version,resultsURL) ". + "values('{$service->id}','{$client->name}','{$client->version}','{$client->resultsURL}')"); + } + + } + } + } + + function &getServiceList($forcefetch=FALSE) + { + if (!$forcefetch && !$this->services) { + $this->dbc->setFetchMode(DB_FETCHMODE_OBJECT,'Service'); + $this->services = $this->dbc->getAll('select * from services',NULL, DB_FETCHMODE_OBJECT ); + } + if ($forcefetch || !$this->services) { + $this->updateServiceDb(); + } + return $this->services; + } + + function &getServerList($serviceID,$forcefetch=FALSE) + { + if (!$forcefetch && (!$this->servers || $this->currentServiceId != $serviceID)) { + $this->dbc->setFetchMode(DB_FETCHMODE_OBJECT,'serverInfo'); + $this->servers = $this->dbc->getAll("select * from serverinfo where service_id = '$serviceID'",NULL, DB_FETCHMODE_OBJECT ); + } + if ($forcefetch || !$this->servers) { + $this->updateServerDb(); + $this->dbc->setFetchMode(DB_FETCHMODE_OBJECT,'serverInfo'); + $this->servers = $this->dbc->getAll("select * from serverinfo where service_id = '$serviceID'",NULL, DB_FETCHMODE_OBJECT ); + if (!$this->servers) { + die("Error retrieving server list!\n"); + } + } + return $this->servers; + } + + function &getClientList($serviceID,$forcefetch=FALSE) + { + if (!$forcefetch && (!$this->clients || $this->currentServiceId != $serviceID)) { + $this->dbc->setFetchMode(DB_FETCHMODE_OBJECT,'clientInfo'); + $this->clients = $this->dbc->getAll("select * from clientinfo where id = '$serviceID'",NULL, DB_FETCHMODE_OBJECT ); + } + if ($forcefetch || !$this->clients) { + $this->updateClientDb(); + $this->dbc->setFetchMode(DB_FETCHMODE_OBJECT,'clientInfo'); + $this->clients = $this->dbc->getAll("select * from clientinfo where id = '$serviceID'",NULL, DB_FETCHMODE_OBJECT ); + if (!$this->clients) { + die("Error retrieving client list!\n"); + } + } + return $this->clients; + } + + function &findService($serviceName) + { + $this->getServiceList(); + $c = count($this->services); + for ($i=0 ; $i<$c; $i++) { + if (strcmp($serviceName, $this->services[$i]->name)==0) return $this->services[$i]; + } + return NULL; + } +} + +#$reg =& new SOAP_Interop_registrationAndNotificationDB(); +#$reg->updateDB(); +//print_r($l); +?> \ No newline at end of file diff --git a/thirdparty/pear/SOAP/Interop/server_Round2Base.php b/thirdparty/pear/SOAP/Interop/server_Round2Base.php new file mode 100644 index 000000000..9a6f8ab6a --- /dev/null +++ b/thirdparty/pear/SOAP/Interop/server_Round2Base.php @@ -0,0 +1,51 @@ + Port to PEAR and more | +// | Authors: Dietrich Ayala Original Author | +// +----------------------------------------------------------------------+ +// +// $Id: server_Round2Base.php,v 1.5 2003/08/05 16:56:43 arnaud Exp $ +// +require_once 'SOAP/Server.php'; +require_once 'interop_Round2Base.php'; + +$base =& new SOAP_Interop_Base(); +$server =& new SOAP_Server; +$server->_auto_translation = true; + +$server->addObjectMap($base,'http://soapinterop.org/'); +$server->service(isset($HTTP_RAW_POST_DATA)?$HTTP_RAW_POST_DATA:NULL); + +$test = ' + + + + + + +arg +34 +325.325 + +'; +#$server->service($test,'',TRUE); + +?> diff --git a/thirdparty/pear/SOAP/Interop/server_Round2GroupB.php b/thirdparty/pear/SOAP/Interop/server_Round2GroupB.php new file mode 100644 index 000000000..833c2e966 --- /dev/null +++ b/thirdparty/pear/SOAP/Interop/server_Round2GroupB.php @@ -0,0 +1,55 @@ + Port to PEAR and more | +// | Authors: Dietrich Ayala Original Author | +// +----------------------------------------------------------------------+ +// +// $Id: server_Round2GroupB.php,v 1.5 2003/08/05 16:56:43 arnaud Exp $ +// +require_once 'SOAP/Server.php'; +require_once 'interop_Round2GroupB.php'; + +$groupb =& new SOAP_Interop_GroupB(); +$server =& new SOAP_Server; +$server->_auto_translation = true; + +$server->addObjectMap($groupb,'http://soapinterop.org/'); +$server->service(isset($HTTP_RAW_POST_DATA)?$HTTP_RAW_POST_DATA:NULL); + +$test = ' + + + + + + +arg +34 +325.325 + +arg +34 +325.325 + +'; +#$server->service($test,'',TRUE); + +?> diff --git a/thirdparty/pear/SOAP/Interop/server_Round2GroupC.php b/thirdparty/pear/SOAP/Interop/server_Round2GroupC.php new file mode 100644 index 000000000..d8a4cd9f5 --- /dev/null +++ b/thirdparty/pear/SOAP/Interop/server_Round2GroupC.php @@ -0,0 +1,33 @@ + | +// +----------------------------------------------------------------------+ +// +// $Id: server_Round2GroupC.php,v 1.5 2003/08/05 16:56:43 arnaud Exp $ +// +require_once 'SOAP/Server.php'; +require_once 'interop_Round2Base.php'; +require_once 'interop_Round2GroupC.php'; + +$groupc_headers =& new SOAP_Interop_GroupC_Headers(); +$base =& new SOAP_Interop_Base(); +$server =& new SOAP_Server; +$server->_auto_translation = true; + +$server->addObjectMap($groupc_headers,'http://soapinterop.org/echoheader/'); +$server->addObjectMap($base,'http://soapinterop.org/'); +$server->service(isset($HTTP_RAW_POST_DATA)?$HTTP_RAW_POST_DATA:NULL); +?> diff --git a/thirdparty/pear/SOAP/Interop/server_Round3GroupD.php b/thirdparty/pear/SOAP/Interop/server_Round3GroupD.php new file mode 100644 index 000000000..08f3e46de --- /dev/null +++ b/thirdparty/pear/SOAP/Interop/server_Round3GroupD.php @@ -0,0 +1,49 @@ + | +// +----------------------------------------------------------------------+ +// +// $Id: server_Round3GroupD.php,v 1.4 2005/04/01 16:18:00 chagenbu Exp $ +// +require_once 'SOAP/Server.php'; +require_once 'interop_Round3GroupD.php'; + +// http://www.whitemesa.com/r3/interop3.html +// http://www.whitemesa.com/r3/plan.html + +$groupd = new SOAP_Interop_GroupD(); +$server = new SOAP_Server; +$server->_auto_translation = true; + +$server->addObjectMap($groupd, 'http://soapinterop/'); +$server->addObjectMap($groupd, 'http://soapinterop.org/xsd'); + +$server->service(isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : NULL); + +$test = ' + + + + +Test Document Here + +'; +#$server->service($test,'',TRUE); diff --git a/thirdparty/pear/SOAP/Interop/server_Round3GroupDCompound1.php b/thirdparty/pear/SOAP/Interop/server_Round3GroupDCompound1.php new file mode 100644 index 000000000..83227ce80 --- /dev/null +++ b/thirdparty/pear/SOAP/Interop/server_Round3GroupDCompound1.php @@ -0,0 +1,72 @@ + | +// +----------------------------------------------------------------------+ +// +// $Id: server_Round3GroupDCompound1.php,v 1.5 2007/01/22 14:53:22 yunosh Exp $ +// +require_once 'SOAP/Server.php'; +require_once 'params_classes.php'; + +// http://www.whitemesa.com/r3/interop3.html +// http://www.whitemesa.com/r3/plan.html + +class SOAP_Interop_GroupDCompound1 { + + function echoPerson($person) + { + return $person->__to_soap('result_Person'); + } + + function echoDocument($document) + { + $ns = '{http://soapinterop.org/xsd}'; + return new SOAP_Value($ns . 'result_Document', $ns . 'x_Document', $document); + } + +} + +// http://www.whitemesa.com/r3/interop3.html +// http://www.whitemesa.com/r3/plan.html + +$options = array('use' => 'literal', 'style' => 'document'); +$groupd = new SOAP_Interop_GroupDCompound1(); +$server = new SOAP_Server($options); +$server->_auto_translation = true; + +$server->addObjectMap($groupd, 'http://soapinterop/'); +$server->addObjectMap($groupd, 'http://soapinterop.org/xsd'); + +$server->bind('http://localhost/soap_interop/wsdl/compound1.wsdl.php'); +if (isset($_SERVER['SERVER_NAME'])) { + $server->service(isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : null); +} else { + // allows command line testing of specific request + $test = ' + + + + +Test Document Here + +'; + $server->service($test, '', true); +} diff --git a/thirdparty/pear/SOAP/Interop/server_Round3GroupDCompound2.php b/thirdparty/pear/SOAP/Interop/server_Round3GroupDCompound2.php new file mode 100644 index 000000000..e14d2950b --- /dev/null +++ b/thirdparty/pear/SOAP/Interop/server_Round3GroupDCompound2.php @@ -0,0 +1,70 @@ + | +// +----------------------------------------------------------------------+ +// +// $Id: server_Round3GroupDCompound2.php,v 1.5 2007/01/22 14:53:22 yunosh Exp $ +// +require_once 'SOAP/Server.php'; +require_once 'params_classes.php'; + +// http://www.whitemesa.com/r3/interop3.html +// http://www.whitemesa.com/r3/plan.html + +class SOAP_Interop_GroupDCompound2 { + + function echoEmployee(&$employee) + { + return $employee->__to_soap('result_Employee'); + } + +} + +// http://www.whitemesa.com/r3/interop3.html +// http://www.whitemesa.com/r3/plan.html + +$options = array('use' => 'literal', 'style' => 'document'); +$groupd = new SOAP_Interop_GroupDCompound2(); +$server = new SOAP_Server($options); +$server->_auto_translation = true; + +$server->addObjectMap($groupd, 'http://soapinterop.org/employee'); + +$server->bind('http://localhost/soap_interop/wsdl/compound2.wsdl.php'); +if (isset($_SERVER['SERVER_NAME'])) { + $server->service(isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : NULL); +} else { + $test = ' + + + + + + + Shane + true + 1000000 + 12345 + + '; + $server->service($test, '', true); +} diff --git a/thirdparty/pear/SOAP/Interop/server_Round3GroupDDocLit.php b/thirdparty/pear/SOAP/Interop/server_Round3GroupDDocLit.php new file mode 100644 index 000000000..91dc69213 --- /dev/null +++ b/thirdparty/pear/SOAP/Interop/server_Round3GroupDDocLit.php @@ -0,0 +1,98 @@ + | +// +----------------------------------------------------------------------+ +// +// $Id: server_Round3GroupDDocLit.php,v 1.6 2007/01/22 14:53:22 yunosh Exp $ +// +require_once 'SOAP/Server.php'; +require_once 'params_classes.php'; + +// http://www.whitemesa.com/r3/interop3.html +// http://www.whitemesa.com/r3/plan.html + +class SOAP_Interop_GroupDDocLit { + + // wsdlns:SoapInteropEmptySABinding + function echoString($inputString) + { + return new SOAP_Value('{http://soapinterop.org/xsd}echoStringReturn', 'string', $inputString); + } + + function echoStringArray($inputStringArray) + { + $ra = array(); + if ($inputStringArray) { + foreach ($inputStringArray as $s) { + $ra[] =& new SOAP_Value('item', 'string', $s); + } + } + return new SOAP_Value('{http://soapinterop.org/xsd}echoStringArrayReturn', null, $ra); + } + + function echoStruct($inputStruct) + { + $ns = '{http://soapinterop.org/xsd}'; + if (is_object($inputStruct) && + strtolower(get_class($inputStruct)) == 'soapstruct') { + return $inputStruct->__to_soap($ns.'echoStructReturn'); + } else { + if (is_object($inputStruct)) { + $inputStruct = get_object_vars($inputStruct); + } + $struct = new SOAPStruct($inputStruct['varString'], $inputStruct['varInt'], $inputStruct['varFloat']); + return $struct->__to_soap($ns.'echoStructReturn'); + } + } + +} + +// http://www.whitemesa.com/r3/interop3.html +// http://www.whitemesa.com/r3/plan.html + +$options = array('use'=>'literal', 'style'=>'document'); +$groupd = new SOAP_Interop_GroupDDocLit(); +$server = new SOAP_Server($options); +$server->_auto_translation = true; + +$server->addObjectMap($groupd, 'http://soapinterop.org/WSDLInteropTestDocLit'); +$server->addObjectMap($groupd, 'http://soapinterop.org/xsd'); + +$server->bind('http://localhost/soap_interop/wsdl/InteropTestDocLit.wsdl.php'); + +if (isset($_SERVER['SERVER_NAME'])) { + $server->service(isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : NULL); +} else { + // allows command line testing of specific request + $test = ' + + + + + +arg +34 +325.325 + +'; + $server->service($test, '', true); +} + diff --git a/thirdparty/pear/SOAP/Interop/server_Round3GroupDDocLitParams.php b/thirdparty/pear/SOAP/Interop/server_Round3GroupDDocLitParams.php new file mode 100644 index 000000000..48bb6c7a4 --- /dev/null +++ b/thirdparty/pear/SOAP/Interop/server_Round3GroupDDocLitParams.php @@ -0,0 +1,96 @@ + | +// +----------------------------------------------------------------------+ +// +// $Id: server_Round3GroupDDocLitParams.php,v 1.5 2007/01/22 14:53:22 yunosh Exp $ +// +require_once 'SOAP/Server.php'; +require_once 'params_classes.php'; + +// http://www.whitemesa.com/r3/interop3.html +// http://www.whitemesa.com/r3/plan.html + +class SOAP_Interop_GroupDDocLitParams { + + function echoString($inputString) + { + return new SOAP_Value('return', 'string', $inputString); + } + + function echoStringArray($inputStringArray) + { + $ra = array(); + if ($inputStringArray) { + foreach ($inputStringArray as $s) { + $ra[] =& new SOAP_Value('item', 'string', $s); + } + } + return new SOAP_Value('return', null, $ra); + } + + function echoStruct($inputStruct) + { + if (is_object($inputStruct) && + get_class($inputStruct) == 'soapstruct') { + return $inputStruct->__to_soap('return'); + } else { + if (is_object($inputStruct)) { + $inputStruct = get_object_vars($inputStruct); + } + $struct = new SOAPStruct($inputStruct['varString'], $inputStruct['varInt'], $inputStruct['varFloat']); + return $struct->__to_soap('return'); + } + } + + function echoVoid() + { + return null; + } + +} + +// http://www.whitemesa.com/r3/interop3.html +// http://www.whitemesa.com/r3/plan.html + +$options = array('use' => 'literal', 'style' => 'document'); +$groupd = new SOAP_Interop_GroupDDocLitParams(); +$server = new SOAP_Server($options); +$server->_auto_translation = true; + +$server->addObjectMap($groupd, 'http://soapinterop/'); +$server->addObjectMap($groupd, 'http://soapinterop.org/xsd'); + +$server->bind('http://localhost/soap_interop/wsdl/InteropTestDocLitParameters.wsdl.php'); +if (isset($_SERVER['SERVER_NAME'])) { + $server->service(isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : null); +} else { + // allows command line testing of specific request + $test = ' + + + + + + +'; + $server->service($test, '', true); +} diff --git a/thirdparty/pear/SOAP/Interop/server_Round3GroupDEmptySA.php b/thirdparty/pear/SOAP/Interop/server_Round3GroupDEmptySA.php new file mode 100644 index 000000000..31446b76e --- /dev/null +++ b/thirdparty/pear/SOAP/Interop/server_Round3GroupDEmptySA.php @@ -0,0 +1,38 @@ + | +// +----------------------------------------------------------------------+ +// +// $Id: server_Round3GroupDEmptySA.php,v 1.4 2003/08/05 16:56:43 arnaud Exp $ +// +require_once 'SOAP/Server.php'; +require_once 'interop_Round3GroupD.php'; + +// http://www.whitemesa.com/r3/interop3.html +// http://www.whitemesa.com/r3/plan.html + +$options = array('use'=>'literal','style'=>'document'); +$groupd =& new SOAP_Interop_GroupD(); +$server =& new SOAP_Server($options); +$server->_auto_translation = true; + +$server->addObjectMap($groupd,'http://soapinterop/'); +$server->addObjectMap($groupd,'http://soapinterop.org/xsd'); + +$server->bind('http://localhost/soap_interop/wsdl/emptysa.wsdl.php'); +$server->service(isset($HTTP_RAW_POST_DATA)?$HTTP_RAW_POST_DATA:NULL); + +?> diff --git a/thirdparty/pear/SOAP/Interop/server_Round3GroupDImport1.php b/thirdparty/pear/SOAP/Interop/server_Round3GroupDImport1.php new file mode 100644 index 000000000..afb8b8694 --- /dev/null +++ b/thirdparty/pear/SOAP/Interop/server_Round3GroupDImport1.php @@ -0,0 +1,64 @@ + | +// +----------------------------------------------------------------------+ +// +// $Id: server_Round3GroupDImport1.php,v 1.5 2007/01/22 14:53:22 yunosh Exp $ +// +require_once 'SOAP/Server.php'; +require_once 'params_classes.php'; + +// http://www.whitemesa.com/r3/interop3.html +// http://www.whitemesa.com/r3/plan.html + +class SOAP_Interop_GroupDImport1 { + + function echoString($inputString) + { + return new SOAP_Value('Result', 'string', $inputString); + } +} + +// http://www.whitemesa.com/r3/interop3.html +// http://www.whitemesa.com/r3/plan.html + +$groupd = new SOAP_Interop_GroupDImport1(); +$server = new SOAP_Server(); +$server->_auto_translation = true; + +$server->addObjectMap($groupd, 'http://soapinterop/echoString/'); + +$server->bind('http://localhost/soap_interop/wsdl/import1.wsdl.php'); +if (isset($_SERVER['SERVER_NAME'])) { + $server->service(isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : null); +} else { + // allows command line testing of specific request + $test = ' + + + + + +Hello World + +'; + $server->service($test, '', true); +} diff --git a/thirdparty/pear/SOAP/Interop/server_Round3GroupDImport2.php b/thirdparty/pear/SOAP/Interop/server_Round3GroupDImport2.php new file mode 100644 index 000000000..64fd0405f --- /dev/null +++ b/thirdparty/pear/SOAP/Interop/server_Round3GroupDImport2.php @@ -0,0 +1,81 @@ + | +// +----------------------------------------------------------------------+ +// +// $Id: server_Round3GroupDImport2.php,v 1.6 2007/01/22 14:53:22 yunosh Exp $ +// +require_once 'SOAP/Server.php'; +require_once 'params_classes.php'; + +// http://www.whitemesa.com/r3/interop3.html +// http://www.whitemesa.com/r3/plan.html + +class SOAP_Interop_GroupDImport2 { + + function echoStruct($inputStruct) + { + if (is_object($inputStruct) && + strtolower(get_class($inputStruct)) == 'soapstruct') { + return $inputStruct->__to_soap('Result'); + } else { + if (is_object($inputStruct)) { + $inputStruct = get_object_vars($inputStruct); + } + $struct = new SOAPStruct($inputStruct['varString'], $inputStruct['varInt'], $inputStruct['varFloat']); + return $struct->__to_soap('Result'); + } + } + +} + +// http://www.whitemesa.com/r3/interop3.html +// http://www.whitemesa.com/r3/plan.html + +$groupd = new SOAP_Interop_GroupDImport2(); +$server = new SOAP_Server(); +$server->_auto_translation = true; + +$server->addObjectMap($groupd, 'http://soapinterop/'); +$server->addObjectMap($groupd, 'http://soapinterop.org/xsd'); + +if (isset($_SERVER['SERVER_NAME'])) { + $baseurl = 'http://' . $_SERVER['SERVER_NAME'] . ':' . $_SERVER['SERVER_PORT'] . '/soap_interop/'; + $server->service(isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : null); +} else { + $baseurl = 'http://localhost/soap_interop/'; + $server->bind($baseurl.'wsdl/import2.wsdl.php'); + // allows command line testing of specific request + $test = ' + + + + + + +arg +34 +325.325 + +'; + $server->service($test, '', true); +} diff --git a/thirdparty/pear/SOAP/Interop/server_Round3GroupDImport3.php b/thirdparty/pear/SOAP/Interop/server_Round3GroupDImport3.php new file mode 100644 index 000000000..6a2d88903 --- /dev/null +++ b/thirdparty/pear/SOAP/Interop/server_Round3GroupDImport3.php @@ -0,0 +1,101 @@ + | +// +----------------------------------------------------------------------+ +// +// $Id: server_Round3GroupDImport3.php,v 1.6 2007/01/22 14:53:22 yunosh Exp $ +// +require_once 'SOAP/Server.php'; +require_once 'params_classes.php'; + +// http://www.whitemesa.com/r3/interop3.html +// http://www.whitemesa.com/r3/plan.html + +class SOAP_Interop_GroupDImport3 { + + function echoStruct($inputStruct) + { + $ns = '{http://soapinterop.org/xsd}'; + if (is_object($inputStruct) && + strtolower(get_class($inputStruct)) == 'soapstruct') { + return $inputStruct->__to_soap($ns . 'return'); + } else { + if (is_object($inputStruct)) { + $inputStruct = get_object_vars($inputStruct); + } + $struct = new SOAPStruct($inputStruct['varString'], $inputStruct['varInt'], $inputStruct['varFloat']); + return $struct->__to_soap($ns.'return'); + } + } + + function echoStructArray($inputStructArray) + { + $ra = array(); + if ($inputStructArray) { + $c = count($inputStructArray); + for ($i = 0; $i < $c; $i++) { + $ra[] = $inputStructArray[$i]->__to_soap('item'); + } + } + return $ra; + } + +} + +// http://www.whitemesa.com/r3/interop3.html +// http://www.whitemesa.com/r3/plan.html + +$groupd = new SOAP_Interop_GroupDImport3(); +$server = new SOAP_Server(); +$server->_auto_translation = true; + +$server->addObjectMap($groupd, 'http://soapinterop/'); +$server->addObjectMap($groupd, 'http://soapinterop.org/xsd'); + +$server->bind('http://localhost/soap_interop/wsdl/import3.wsdl.php'); +if (isset($_SERVER['SERVER_NAME'])) { + $server->service(isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : null); +} else { + // allows command line testing of specific request + $test = ' + + + + + + + +arg +34 +325.325 + +arg +34 +325.325 + +arg +34 +325.325 + +'; + $server->service($test, '', true); +} diff --git a/thirdparty/pear/SOAP/Interop/server_Round3GroupDRpcEnc.php b/thirdparty/pear/SOAP/Interop/server_Round3GroupDRpcEnc.php new file mode 100644 index 000000000..cb67ae374 --- /dev/null +++ b/thirdparty/pear/SOAP/Interop/server_Round3GroupDRpcEnc.php @@ -0,0 +1,79 @@ + | +// +----------------------------------------------------------------------+ +// +// $Id: server_Round3GroupDRpcEnc.php,v 1.6 2007/01/22 14:53:22 yunosh Exp $ +// +require_once 'SOAP/Server.php'; +require_once 'params_classes.php'; + +// http://www.whitemesa.com/r3/interop3.html +// http://www.whitemesa.com/r3/plan.html + +class SOAP_Interop_GroupDRpcEnc { + + // wsdlns:SoapInteropEmptySABinding + function echoString($inputString) + { + return new SOAP_Value('echoStringReturn', 'string', $inputString); + } + + function echoStringArray($inputStringArray) + { + $ra = array(); + if ($inputStringArray) { + foreach($inputStringArray as $s) { + $ra[] = new SOAP_Value('item', 'string', $s); + } + } + return new SOAP_Value('echoStringArrayReturn', null, $ra); + } + + function echoStruct($inputStruct) + { + if (is_object($inputStruct) && + strtolower(get_class($inputStruct)) == 'soapstruct') { + return $inputStruct->__to_soap('return'); + } else { + if (is_object($inputStruct)) { + $inputStruct = get_object_vars($inputStruct); + } + $struct = new SOAPStruct($inputStruct['varString'], $inputStruct['varInt'], $inputStruct['varFloat']); + return $struct->__to_soap('return'); + } + } + + function echoVoid() + { + return null; + } + +} + +// http://www.whitemesa.com/r3/interop3.html +// http://www.whitemesa.com/r3/plan.html + +$groupd = new SOAP_Interop_GroupDRpcEnc(); +$server = new SOAP_Server(); +$server->_auto_translation = true; + +$server->addObjectMap($groupd, 'http://soapinterop/'); +$server->addObjectMap($groupd, 'http://soapinterop.org/xsd'); +$server->addObjectMap($groupd, 'http://soapinterop.org/WSDLInteropTestRpcEnc'); + +$server->bind('http://localhost/soap_interop/wsdl/InteropTestRpcEnc.wsdl.php'); +$server->service(isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : null); diff --git a/thirdparty/pear/SOAP/Interop/wsdl/InteropTestDocLit.wsdl.php b/thirdparty/pear/SOAP/Interop/wsdl/InteropTestDocLit.wsdl.php new file mode 100644 index 000000000..1d4adad41 --- /dev/null +++ b/thirdparty/pear/SOAP/Interop/wsdl/InteropTestDocLit.wsdl.php @@ -0,0 +1,136 @@ +\n"; ?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /soap_interop/server_Round3GroupDDocLit.php"/> + + + diff --git a/thirdparty/pear/SOAP/Interop/wsdl/InteropTestDocLitParameters.wsdl.php b/thirdparty/pear/SOAP/Interop/wsdl/InteropTestDocLitParameters.wsdl.php new file mode 100644 index 000000000..6c6da053f --- /dev/null +++ b/thirdparty/pear/SOAP/Interop/wsdl/InteropTestDocLitParameters.wsdl.php @@ -0,0 +1,176 @@ +\n"; ?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /soap_interop/server_Round3GroupDDocLitParams.php"/> + + + diff --git a/thirdparty/pear/SOAP/Interop/wsdl/InteropTestExtensibility.wsdl.php b/thirdparty/pear/SOAP/Interop/wsdl/InteropTestExtensibility.wsdl.php new file mode 100644 index 000000000..b34fa689b --- /dev/null +++ b/thirdparty/pear/SOAP/Interop/wsdl/InteropTestExtensibility.wsdl.php @@ -0,0 +1,74 @@ +\n"; ?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /soap_interop/server_round3.php"/> + + + + diff --git a/thirdparty/pear/SOAP/Interop/wsdl/InteropTestExtensibilityRequired.wsdl.php b/thirdparty/pear/SOAP/Interop/wsdl/InteropTestExtensibilityRequired.wsdl.php new file mode 100644 index 000000000..001aa35a6 --- /dev/null +++ b/thirdparty/pear/SOAP/Interop/wsdl/InteropTestExtensibilityRequired.wsdl.php @@ -0,0 +1,75 @@ +\n"; ?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /soap_interop/server_round3.php"/> + + + + diff --git a/thirdparty/pear/SOAP/Interop/wsdl/InteropTestList.wsdl.php b/thirdparty/pear/SOAP/Interop/wsdl/InteropTestList.wsdl.php new file mode 100644 index 000000000..6f172bb42 --- /dev/null +++ b/thirdparty/pear/SOAP/Interop/wsdl/InteropTestList.wsdl.php @@ -0,0 +1,62 @@ +\n"; ?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /soap_interop/server_round3.php"/> + + + diff --git a/thirdparty/pear/SOAP/Interop/wsdl/InteropTestRpcEnc.wsdl.php b/thirdparty/pear/SOAP/Interop/wsdl/InteropTestRpcEnc.wsdl.php new file mode 100644 index 000000000..8357194f3 --- /dev/null +++ b/thirdparty/pear/SOAP/Interop/wsdl/InteropTestRpcEnc.wsdl.php @@ -0,0 +1,127 @@ +\n"; ?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /soap_interop/server_Round3GroupDRpcEnc.php"/> + + + diff --git a/thirdparty/pear/SOAP/Interop/wsdl/InteropTestheaders.wsdl.php b/thirdparty/pear/SOAP/Interop/wsdl/InteropTestheaders.wsdl.php new file mode 100644 index 000000000..21cfeab52 --- /dev/null +++ b/thirdparty/pear/SOAP/Interop/wsdl/InteropTestheaders.wsdl.php @@ -0,0 +1,72 @@ +\n"; ?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /soap_interop/server_round3.php"/> + + + \ No newline at end of file diff --git a/thirdparty/pear/SOAP/Interop/wsdl/compound1.wsdl.php b/thirdparty/pear/SOAP/Interop/wsdl/compound1.wsdl.php new file mode 100644 index 000000000..1a4dd73f0 --- /dev/null +++ b/thirdparty/pear/SOAP/Interop/wsdl/compound1.wsdl.php @@ -0,0 +1,86 @@ +\n"; ?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /soap_interop/server_Round3GroupDCompound1.php"/> + + + diff --git a/thirdparty/pear/SOAP/Interop/wsdl/compound2.wsdl.php b/thirdparty/pear/SOAP/Interop/wsdl/compound2.wsdl.php new file mode 100644 index 000000000..7a3bbd9e7 --- /dev/null +++ b/thirdparty/pear/SOAP/Interop/wsdl/compound2.wsdl.php @@ -0,0 +1,67 @@ +\n"; ?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /soap_interop/server_Round3GroupDCompound2.php"/> + + + diff --git a/thirdparty/pear/SOAP/Interop/wsdl/echoheadersvc.wsdl.php b/thirdparty/pear/SOAP/Interop/wsdl/echoheadersvc.wsdl.php new file mode 100644 index 000000000..67b7e676a --- /dev/null +++ b/thirdparty/pear/SOAP/Interop/wsdl/echoheadersvc.wsdl.php @@ -0,0 +1,18 @@ +\n"; ?> + + + + + + + + + + /soap_interop/server_Round2GroupC.php"/> + + + + + diff --git a/thirdparty/pear/SOAP/Interop/wsdl/emptysa.wsdl.php b/thirdparty/pear/SOAP/Interop/wsdl/emptysa.wsdl.php new file mode 100644 index 000000000..d51a6eef3 --- /dev/null +++ b/thirdparty/pear/SOAP/Interop/wsdl/emptysa.wsdl.php @@ -0,0 +1,39 @@ +\n"; ?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /soap_interop/server_Round3GroupDEmptySA.php"/> + + + diff --git a/thirdparty/pear/SOAP/Interop/wsdl/import1.wsdl.php b/thirdparty/pear/SOAP/Interop/wsdl/import1.wsdl.php new file mode 100644 index 000000000..f0ed6586a --- /dev/null +++ b/thirdparty/pear/SOAP/Interop/wsdl/import1.wsdl.php @@ -0,0 +1,28 @@ +\n"; ?> + + + + + + + + + + + + + + + + + + /soap_interop/server_Round3GroupDImport1.php"/> + + + diff --git a/thirdparty/pear/SOAP/Interop/wsdl/import2.wsdl.php b/thirdparty/pear/SOAP/Interop/wsdl/import2.wsdl.php new file mode 100644 index 000000000..3875f10cf --- /dev/null +++ b/thirdparty/pear/SOAP/Interop/wsdl/import2.wsdl.php @@ -0,0 +1,28 @@ +\n"; ?> + + + + + + + + + + + + + + + + + + /soap_interop/server_Round3GroupDImport2.php"/> + + + diff --git a/thirdparty/pear/SOAP/Interop/wsdl/import3.wsdl.php b/thirdparty/pear/SOAP/Interop/wsdl/import3.wsdl.php new file mode 100644 index 000000000..4396de741 --- /dev/null +++ b/thirdparty/pear/SOAP/Interop/wsdl/import3.wsdl.php @@ -0,0 +1,77 @@ +\n"; ?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /soap_interop/server_Round3GroupDImport3.php"/> + + + diff --git a/thirdparty/pear/SOAP/Interop/wsdl/imported/import1B.wsdl b/thirdparty/pear/SOAP/Interop/wsdl/imported/import1B.wsdl new file mode 100644 index 000000000..26ab6dbdd --- /dev/null +++ b/thirdparty/pear/SOAP/Interop/wsdl/imported/import1B.wsdl @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + diff --git a/thirdparty/pear/SOAP/Interop/wsdl/imported/import2B.wsdl b/thirdparty/pear/SOAP/Interop/wsdl/imported/import2B.wsdl new file mode 100644 index 000000000..8a397bc0b --- /dev/null +++ b/thirdparty/pear/SOAP/Interop/wsdl/imported/import2B.wsdl @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + diff --git a/thirdparty/pear/SOAP/Interop/wsdl/imported/import2B.xsd b/thirdparty/pear/SOAP/Interop/wsdl/imported/import2B.xsd new file mode 100644 index 000000000..b35eded4f --- /dev/null +++ b/thirdparty/pear/SOAP/Interop/wsdl/imported/import2B.xsd @@ -0,0 +1,12 @@ + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/pear/SOAP/Interop/wsdl/interop.wsdl.php b/thirdparty/pear/SOAP/Interop/wsdl/interop.wsdl.php new file mode 100644 index 000000000..12a74b338 --- /dev/null +++ b/thirdparty/pear/SOAP/Interop/wsdl/interop.wsdl.php @@ -0,0 +1,19 @@ +\n"; ?> + + + + + + + + + /soap_interop/server_Round2Base.php"/> + + + + diff --git a/thirdparty/pear/SOAP/Interop/wsdl/interopB.wsdl.php b/thirdparty/pear/SOAP/Interop/wsdl/interopB.wsdl.php new file mode 100644 index 000000000..09c250c5a --- /dev/null +++ b/thirdparty/pear/SOAP/Interop/wsdl/interopB.wsdl.php @@ -0,0 +1,15 @@ +\n"; ?> + + + + + + + + /soap_interop/server_Round2GroupB.php"/> + + + + diff --git a/thirdparty/pear/SOAP/Parser.php b/thirdparty/pear/SOAP/Parser.php new file mode 100644 index 000000000..1627d1fb5 --- /dev/null +++ b/thirdparty/pear/SOAP/Parser.php @@ -0,0 +1,504 @@ + Original Author + * @author Shane Caraveo Port to PEAR and more + * @author Chuck Hagenbuch Maintenance + * @author Jan Schneider Maintenance + * @copyright 2003-2005 The PHP Group + * @license http://www.php.net/license/2_02.txt PHP License 2.02 + * @link http://pear.php.net/package/SOAP + */ + +require_once 'SOAP/Base.php'; +require_once 'SOAP/Value.php'; + +/** + * SOAP Parser + * + * This class is used by SOAP::Message and SOAP::Server to parse soap + * packets. Originally based on SOAPx4 by Dietrich Ayala + * http://dietrich.ganx4.com/soapx4 + * + * @access public + * @package SOAP + * @author Shane Caraveo Conversion to PEAR and updates + * @author Dietrich Ayala Original Author + */ +class SOAP_Parser extends SOAP_Base +{ + var $status = ''; + var $position = 0; + var $depth = 0; + var $default_namespace = ''; + var $message = array(); + var $depth_array = array(); + var $parent = 0; + var $root_struct_name = array(); + var $header_struct_name = array(); + var $curent_root_struct_name = ''; + var $root_struct = array(); + var $header_struct = array(); + var $curent_root_struct = 0; + var $references = array(); + var $need_references = array(); + + /** + * Used to handle non-root elements before root body element. + * + * @var integer + */ + var $bodyDepth; + + /** + * Constructor. + * + * @param string $xml XML content. + * @param string $encoding Character set encoding, defaults to 'UTF-8'. + * @param array $attachments List of attachments. + */ + function SOAP_Parser($xml, $encoding = SOAP_DEFAULT_ENCODING, + $attachments = null) + { + parent::SOAP_Base('Parser'); + $this->_setSchemaVersion(SOAP_XML_SCHEMA_VERSION); + + $this->attachments = $attachments; + + // Check the XML tag for encoding. + if (preg_match('/<\?xml[^>]+encoding\s*?=\s*?(\'([^\']*)\'|"([^"]*)")[^>]*?[\?]>/', $xml, $m)) { + $encoding = strtoupper($m[2] ? $m[2] : $m[3]); + } + + // Determine where in the message we are (envelope, header, body, + // method). Check whether content has been read. + if (!empty($xml)) { + // Prepare the XML parser. + $parser = xml_parser_create($encoding); + xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0); + xml_set_object($parser, $this); + xml_set_element_handler($parser, '_startElement', '_endElement'); + xml_set_character_data_handler($parser, '_characterData'); + + // Some lame SOAP implementations add nul bytes at the end of the + // SOAP stream, and expat chokes on that. + if ($xml[strlen($xml) - 1] == 0) { + $xml = trim($xml); + } + + // Parse the XML file. + if (!xml_parse($parser, $xml, true)) { + $err = sprintf('XML error on line %d col %d byte %d %s', + xml_get_current_line_number($parser), + xml_get_current_column_number($parser), + xml_get_current_byte_index($parser), + xml_error_string(xml_get_error_code($parser))); + $this->_raiseSoapFault($err, htmlspecialchars($xml)); + } + xml_parser_free($parser); + } + } + + /** + * Returns an array of responses. + * + * After parsing a SOAP message, use this to get the response. + * + * @return array + */ + function getResponse() + { + if (!empty($this->root_struct[0])) { + return $this->_buildResponse($this->root_struct[0]); + } else { + return $this->_raiseSoapFault('Cannot build response'); + } + } + + /** + * Returns an array of header responses. + * + * After parsing a SOAP message, use this to get the response. + * + * @return array + */ + function getHeaders() + { + if (!empty($this->header_struct[0])) { + return $this->_buildResponse($this->header_struct[0]); + } else { + // We don't fault if there are no headers; that can be handled by + // the application if necessary. + return null; + } + } + + /** + * Recurses to build a multi dimensional array. + * + * @see _buildResponse() + */ + function _domulti($d, &$ar, &$r, &$v, $ad = 0) + { + if ($d) { + $this->_domulti($d - 1, $ar, $r[$ar[$ad]], $v, $ad + 1); + } else { + $r = $v; + } + } + + /** + * Loops through the message, building response structures. + * + * @param integer $pos Position. + * + * @return SOAP_Value + */ + function _buildResponse($pos) + { + $response = null; + + if (isset($this->message[$pos]['children'])) { + $children = explode('|', $this->message[$pos]['children']); + foreach ($children as $c => $child_pos) { + if ($this->message[$child_pos]['type'] != null) { + $response[] = $this->_buildResponse($child_pos); + } + } + if (isset($this->message[$pos]['arraySize'])) { + $ardepth = count($this->message[$pos]['arraySize']); + if ($ardepth > 1) { + $ar = array_pad(array(), $ardepth, 0); + if (isset($this->message[$pos]['arrayOffset'])) { + for ($i = 0; $i < $ardepth; $i++) { + $ar[$i] += $this->message[$pos]['arrayOffset'][$i]; + } + } + $elc = count($response); + for ($i = 0; $i < $elc; $i++) { + // Recurse to build a multi dimensional array. + $this->_domulti($ardepth, $ar, $newresp, $response[$i]); + + // Increment our array pointers. + $ad = $ardepth - 1; + $ar[$ad]++; + while ($ad > 0 && + $ar[$ad] >= $this->message[$pos]['arraySize'][$ad]) { + $ar[$ad] = 0; + $ad--; + $ar[$ad]++; + } + } + $response = $newresp; + } elseif (isset($this->message[$pos]['arrayOffset']) && + $this->message[$pos]['arrayOffset'][0] > 0) { + // Check for padding. + $pad = $this->message[$pos]['arrayOffset'][0] + count($response) * -1; + $response = array_pad($response, $pad, null); + } + } + } + + // Build attributes. + $attrs = array(); + foreach ($this->message[$pos]['attrs'] as $atn => $atv) { + if (!strstr($atn, 'xmlns') && !strpos($atn, ':')) { + $attrs[$atn] = $atv; + } + } + + // Add current node's value. + if ($response) { + $nqn = new QName($this->message[$pos]['name'], + $this->message[$pos]['namespace']); + $tqn = new QName($this->message[$pos]['type'], + $this->message[$pos]['type_namespace']); + $response = new SOAP_Value($nqn->fqn(), + $tqn->fqn(), + $response, + $attrs); + if (isset($this->message[$pos]['arrayType'])) { + $response->arrayType = $this->message[$pos]['arrayType']; + } + } else { + $nqn = new QName($this->message[$pos]['name'], + $this->message[$pos]['namespace']); + $tqn = new QName($this->message[$pos]['type'], + $this->message[$pos]['type_namespace']); + // Check if value is an empty array + if ($tqn->name == 'Array') { + $response = new SOAP_Value($nqn->fqn(), $tqn->fqn(), + array(), $attrs); + } else { + $response = new SOAP_Value($nqn->fqn(), + $tqn->fqn(), + $this->message[$pos]['cdata'], + $attrs); + } + } + + // Handle header attribute that we need. + if (array_key_exists('actor', $this->message[$pos])) { + $response->actor = $this->message[$pos]['actor']; + } + if (array_key_exists('mustUnderstand', $this->message[$pos])) { + $response->mustunderstand = $this->message[$pos]['mustUnderstand']; + } + return $response; + } + + /** + * Start element handler used with the XML parser. + */ + function _startElement($parser, $name, $attrs) + { + // Position in a total number of elements, starting from 0. + // Update class level position. + $pos = $this->position++; + + // And set mine. + $this->message[$pos] = array( + 'type' => '', + 'type_namespace' => '', + 'cdata' => '', + 'pos' => $pos, + 'id' => ''); + + // Parent/child/depth determinations. + + // depth = How many levels removed from root? + // Set mine as current global depth and increment global depth value. + $this->message[$pos]['depth'] = $this->depth++; + + // Else add self as child to whoever the current parent is. + if ($pos != 0) { + if (isset($this->message[$this->parent]['children'])) { + $this->message[$this->parent]['children'] .= '|' . $pos; + } else { + $this->message[$this->parent]['children'] = $pos; + } + } + + // Set my parent. + $this->message[$pos]['parent'] = $this->parent; + + // Set self as current value for this depth. + $this->depth_array[$this->depth] = $pos; + // Set self as current parent. + $this->parent = $pos; + $qname = new QName($name); + // Set status. + if (strcasecmp('envelope', $qname->name) == 0) { + $this->status = 'envelope'; + } elseif (strcasecmp('header', $qname->name) == 0) { + $this->status = 'header'; + $this->header_struct_name[] = $this->curent_root_struct_name = $qname->name; + $this->header_struct[] = $this->curent_root_struct = $pos; + $this->message[$pos]['type'] = 'Struct'; + } elseif (strcasecmp('body', $qname->name) == 0) { + $this->status = 'body'; + $this->bodyDepth = $this->depth; + + // Set method + } elseif ($this->status == 'body') { + // Is this element allowed to be a root? + // TODO: this needs to be optimized, we loop through $attrs twice + // now. + $can_root = $this->depth == $this->bodyDepth + 1; + if ($can_root) { + foreach ($attrs as $key => $value) { + if (stristr($key, ':root') && !$value) { + $can_root = false; + } + } + } + + if ($can_root) { + $this->status = 'method'; + $this->root_struct_name[] = $this->curent_root_struct_name = $qname->name; + $this->root_struct[] = $this->curent_root_struct = $pos; + $this->message[$pos]['type'] = 'Struct'; + } + } + + // Set my status. + $this->message[$pos]['status'] = $this->status; + + // Set name. + $this->message[$pos]['name'] = htmlspecialchars($qname->name); + + // Set attributes. + $this->message[$pos]['attrs'] = $attrs; + + // Loop through attributes, logging ns and type declarations. + foreach ($attrs as $key => $value) { + // If ns declarations, add to class level array of valid + // namespaces. + $kqn = new QName($key); + if ($kqn->ns == 'xmlns') { + $prefix = $kqn->name; + + if (in_array($value, $this->_XMLSchema)) { + $this->_setSchemaVersion($value); + } + + $this->_namespaces[$value] = $prefix; + + // Set method namespace. + } elseif ($key == 'xmlns') { + $qname->ns = $this->_getNamespacePrefix($value); + $qname->namespace = $value; + } elseif ($kqn->name == 'actor') { + $this->message[$pos]['actor'] = $value; + } elseif ($kqn->name == 'mustUnderstand') { + $this->message[$pos]['mustUnderstand'] = $value; + + // If it's a type declaration, set type. + } elseif ($kqn->name == 'type') { + $vqn = new QName($value); + $this->message[$pos]['type'] = $vqn->name; + $this->message[$pos]['type_namespace'] = $this->_getNamespaceForPrefix($vqn->ns); + + // Should do something here with the namespace of specified + // type? + + } elseif ($kqn->name == 'arrayType') { + $vqn = new QName($value); + $this->message[$pos]['type'] = 'Array'; + if (isset($vqn->arraySize)) { + $this->message[$pos]['arraySize'] = $vqn->arraySize; + } + $this->message[$pos]['arrayType'] = $vqn->name; + + } elseif ($kqn->name == 'offset') { + $this->message[$pos]['arrayOffset'] = explode(',', substr($value, 1, strlen($value) - 2)); + + } elseif ($kqn->name == 'id') { + // Save id to reference array. + $this->references[$value] = $pos; + $this->message[$pos]['id'] = $value; + + } elseif ($kqn->name == 'href') { + if ($value[0] == '#') { + $ref = substr($value, 1); + if (isset($this->references[$ref])) { + // cdata, type, inval. + $ref_pos = $this->references[$ref]; + $this->message[$pos]['children'] = &$this->message[$ref_pos]['children']; + $this->message[$pos]['cdata'] = &$this->message[$ref_pos]['cdata']; + $this->message[$pos]['type'] = &$this->message[$ref_pos]['type']; + $this->message[$pos]['arraySize'] = &$this->message[$ref_pos]['arraySize']; + $this->message[$pos]['arrayType'] = &$this->message[$ref_pos]['arrayType']; + } else { + // Reverse reference, store in 'need reference'. + if (!isset($this->need_references[$ref])) { + $this->need_references[$ref] = array(); + } + $this->need_references[$ref][] = $pos; + } + } elseif (isset($this->attachments[$value])) { + $this->message[$pos]['cdata'] = $this->attachments[$value]; + } + } + } + // See if namespace is defined in tag. + if (isset($attrs['xmlns:' . $qname->ns])) { + $namespace = $attrs['xmlns:' . $qname->ns]; + } elseif ($qname->ns && !$qname->namespace) { + $namespace = $this->_getNamespaceForPrefix($qname->ns); + } else { + // Get namespace. + $namespace = $qname->namespace ? $qname->namespace : $this->default_namespace; + } + $this->message[$pos]['namespace'] = $namespace; + $this->default_namespace = $namespace; + } + + /** + * End element handler used with the XML parser. + */ + function _endElement($parser, $name) + { + // Position of current element is equal to the last value left in + // depth_array for my depth. + $pos = $this->depth_array[$this->depth]; + + // Bring depth down a notch. + $this->depth--; + $qname = new QName($name); + + // Get type if not explicitly declared in an xsi:type attribute. + // TODO: check on integrating WSDL validation here. + if ($this->message[$pos]['type'] == '') { + if (isset($this->message[$pos]['children'])) { + /* this is slow, need to look at some faster method + $children = explode('|', $this->message[$pos]['children']); + if (count($children) > 2 && + $this->message[$children[1]]['name'] == $this->message[$children[2]]['name']) { + $this->message[$pos]['type'] = 'Array'; + } else { + $this->message[$pos]['type'] = 'Struct'; + }*/ + $this->message[$pos]['type'] = 'Struct'; + } else { + $parent = $this->message[$pos]['parent']; + if ($this->message[$parent]['type'] == 'Array' && + isset($this->message[$parent]['arrayType'])) { + $this->message[$pos]['type'] = $this->message[$parent]['arrayType']; + } else { + $this->message[$pos]['type'] = 'string'; + } + } + } + + // If tag we are currently closing is the method wrapper. + if ($pos == $this->curent_root_struct) { + $this->status = 'body'; + } elseif ($qname->name == 'Body' || $qname->name == 'Header') { + $this->status = 'envelope'; + } + + // Set parent back to my parent. + $this->parent = $this->message[$pos]['parent']; + + // Handle any reverse references now. + $idref = $this->message[$pos]['id']; + + if ($idref != '' && isset($this->need_references[$idref])) { + foreach ($this->need_references[$idref] as $ref_pos) { + // XXX is this stuff there already? + $this->message[$ref_pos]['children'] = &$this->message[$pos]['children']; + $this->message[$ref_pos]['cdata'] = &$this->message[$pos]['cdata']; + $this->message[$ref_pos]['type'] = &$this->message[$pos]['type']; + $this->message[$ref_pos]['arraySize'] = &$this->message[$pos]['arraySize']; + $this->message[$ref_pos]['arrayType'] = &$this->message[$pos]['arrayType']; + } + } + } + + /** + * Element content handler used with the XML parser. + */ + function _characterData($parser, $data) + { + $pos = $this->depth_array[$this->depth]; + if (isset($this->message[$pos]['cdata'])) { + $this->message[$pos]['cdata'] .= $data; + } else { + $this->message[$pos]['cdata'] = $data; + } + } + +} diff --git a/thirdparty/pear/SOAP/Server.php b/thirdparty/pear/SOAP/Server.php new file mode 100644 index 000000000..bfdc837ac --- /dev/null +++ b/thirdparty/pear/SOAP/Server.php @@ -0,0 +1,816 @@ + Original Author + * @author Shane Caraveo Port to PEAR and more + * @author Chuck Hagenbuch Maintenance + * @author Jan Schneider Maintenance + * @copyright 2003-2005 The PHP Group + * @license http://www.php.net/license/2_02.txt PHP License 2.02 + * @link http://pear.php.net/package/SOAP + */ + +require_once 'SOAP/Base.php'; +require_once 'SOAP/Fault.php'; +require_once 'SOAP/Parser.php'; +require_once 'SOAP/Value.php'; +require_once 'SOAP/WSDL.php'; + +/** + * SOAP Server Class + * + * Originaly based on SOAPx4 by Dietrich Ayala + * http://dietrich.ganx4.com/soapx4 + * + * @access public + * @package SOAP + * @author Shane Caraveo Conversion to PEAR and updates + * @author Dietrich Ayala Original Author + */ +class SOAP_Server extends SOAP_Base +{ + /** + * + * @var array + */ + var $dispatch_map = array(); // create empty dispatch map + var $dispatch_objects = array(); + var $soapobject = null; + var $call_methodname = null; + var $callHandler = null; + var $callValidation = true; + + /** + * A list of headers that are going to be sent back to the client. + * + * @var array + */ + var $headers = array(); + + /** + * + * @var string + */ + var $request = ''; + + /** + * + * @var string XML-Encoding + */ + var $xml_encoding = SOAP_DEFAULT_ENCODING; + var $response_encoding = 'UTF-8'; + + var $result = 'successful'; // for logging interop results to db + + var $endpoint = ''; // the uri to ME! + + var $service = ''; //soapaction header + var $method_namespace = null; + + /** + * Options. + * + * @var array + */ + var $_options = array('use' => 'encoded', + 'style' => 'rpc', + 'parameters' => 0, + 'http_status_success' => '200 OK', + 'http_status_fault' => '500 SOAP Fault'); + + function SOAP_Server($options = null) + { + ini_set('track_errors', 1); + parent::SOAP_Base('Server'); + + if (is_array($options)) { + if (isset($options['use'])) { + $this->_options['use'] = $options['use']; + } + if (isset($options['style'])) { + $this->_options['style'] = $options['style']; + } + if (isset($options['parameters'])) { + $this->_options['parameters'] = $options['parameters']; + } + } + // assume we encode with section 5 + $this->_section5 = true; + if ($this->_options['use'] == 'literal') { + $this->_section5 = false; + } + } + + /** + * Error handler for errors that happen in proxied methods. + * + * To always return a valid SOAP response even on errors that don't happen + * in this code, the errors are catched, transformed to a SOAP fault and + * immediately sent to the client. + * + * @see http://www.php.net/set_error_handler + */ + function _errorHandler($errno, $errmsg, $filename, $linenum) + { + /* The error handler should ignore '0' errors, eg. hidden by @ - see + * the set_error_handler manual page. (thanks to Alan Knowles). */ + if (!$errno || !error_reporting() || $errno == E_NOTICE || + (defined('E_STRICT') && $errno == constant('E_STRICT'))) { + return false; + } + + $this->fault = new SOAP_Fault($errmsg, 'Server', 'PHP', "Errno: $errno\nFilename: $filename\nLineno: $linenum\n"); + + $this->_sendResponse(); + exit; + } + + function _getContentEncoding($content_type) + { + /* Get the character encoding of the incoming request treat incoming + * data as UTF-8 if no encoding set. */ + $this->xml_encoding = 'UTF-8'; + if (strpos($content_type, '=')) { + $enc = strtoupper(str_replace('"', '', substr(strstr($content_type, '='), 1))); + if (!in_array($enc, $this->_encodings)) { + return false; + } + $this->xml_encoding = $enc; + } + + return true; + } + + + /** + * Parses the request and posts or returns the response. + * + * @param string $data The SOAP request data. + * @param string $endpoint The service endpoint. Determined automatically + * if left empty. + * @param boolean $test + * @param boolean $return Whether to return the SOAP response data + * instead of sending it to the client. + */ + function service($data, $endpoint = '', $test = false, $return = false) + { + $response = null; + $attachments = array(); + $useEncoding = 'DIME'; + + /* Figure out our endpoint. */ + $this->endpoint = $endpoint; + if (!$test && !$this->endpoint) { + /* We'll try to build our endpoint. */ + $this->endpoint = 'http://' . $_SERVER['SERVER_NAME']; + if ($_SERVER['SERVER_PORT']) { + $this->endpoint .= ':' . $_SERVER['SERVER_PORT']; + } + $this->endpoint .= $_SERVER['SCRIPT_NAME']; + } + + /* Get the character encoding of the incoming request treat incoming + * data as UTF-8 if no encoding set. */ + if (isset($_SERVER['CONTENT_TYPE'])) { + if (strcasecmp($_SERVER['CONTENT_TYPE'], 'application/dime') == 0) { + $this->_decodeDIMEMessage($data, $headers, $attachments); + $useEncoding = 'DIME'; + } elseif (stristr($_SERVER['CONTENT_TYPE'], 'multipart/related')) { + /* This is a mime message, let's decode it. */ + $data = 'Content-Type: ' . + stripslashes($_SERVER['CONTENT_TYPE']) . + "\r\n\r\n" . $data; + $this->_decodeMimeMessage($data, $headers, $attachments); + $useEncoding = 'Mime'; + } + if (!isset($headers['content-type'])) { + $headers['content-type'] = stripslashes($_SERVER['CONTENT_TYPE']); + } + if (!$this->fault && + !$this->_getContentEncoding($headers['content-type'])) { + $this->xml_encoding = SOAP_DEFAULT_ENCODING; + /* Found encoding we don't understand; return a fault. */ + $this->_raiseSoapFault('Unsupported encoding, use one of ISO-8859-1, US-ASCII, UTF-8', '', '', 'Server'); + } + } + + /* If this is not a POST with Content-Type text/xml, try to return a + * WSDL file. */ + if (!$this->fault && !$test && + ($_SERVER['REQUEST_METHOD'] != 'POST' || + strncmp($headers['content-type'], 'text/xml', 8) != 0)) { + /* This is not possibly a valid SOAP request, try to return a WSDL + * file. */ + $this->_raiseSoapFault('Invalid SOAP request, must be POST with content-type: text/xml, got: ' . (isset($headers['content-type']) ? $headers['content-type'] : 'Nothing!'), '', '', 'Server'); + } + + if (!$this->fault) { + /* $response is a SOAP_Msg object. */ + $soap_msg = $this->parseRequest($data, $attachments); + + /* Handle Mime or DIME encoding. */ + /* TODO: DIME decoding should move to the transport, do it here + * for now and for ease of getting it done. */ + if (count($this->_attachments)) { + if ($useEncoding == 'Mime') { + $soap_msg = $this->_makeMimeMessage($soap_msg); + } else { + // default is dime + $soap_msg = $this->_makeDIMEMessage($soap_msg); + $this->headers['Content-Type'] = 'application/dime'; + } + if (PEAR::isError($soap_msg)) { + return $this->_raiseSoapFault($soap_msg); + } + } + + if (is_array($soap_msg)) { + $response = $soap_msg['body']; + if (count($soap_msg['headers'])) { + $this->headers = $soap_msg['headers']; + } + } else { + $response = $soap_msg; + } + } + + if ($return) { + if ($this->fault) { + $response = $this->fault->message(); + } + return $response; + } + + $this->_sendResponse($response); + } + + /** + * Sends the final HTTP response to the client, including the HTTP header + * and the HTTP body. + * + * If an error happened, it returns a SOAP fault instead of the response + * body. + * + * @param string $response The response body. + */ + function _sendResponse($response = '') + { + /* Make distinction between the different SAPIs, running PHP as CGI or + * as a module. */ + if (stristr(php_sapi_name(), 'cgi') === 0) { + $hdrs_type = 'Status:'; + } else { + $hdrs_type = 'HTTP/1.1'; + } + + if ($this->fault) { + $hdrs = $hdrs_type . ' ' . $this->_options['http_status_fault'] . "\r\n"; + $response = $this->fault->message($this->response_encoding); + } else { + $hdrs = $hdrs_type . ' ' . $this->_options['http_status_success'] . "\r\n"; + } + header($hdrs); + + $this->headers['Server'] = SOAP_LIBRARY_NAME; + if (!isset($this->headers['Content-Type'])) { + $this->headers['Content-Type'] = 'text/xml; charset=' . + $this->response_encoding; + } + $this->headers['Content-Length'] = strlen($response); + + foreach ($this->headers as $k => $v) { + header("$k: $v"); + $hdrs .= "$k: $v\r\n"; + } + + $this->response = $hdrs . "\r\n" . $response; + print $response; + } + + function &callMethod($methodname, &$args) + { + if ($this->callHandler) { + $ret = @call_user_func_array($this->callHandler, array($methodname, $args)); + return $ret; + } + + set_error_handler(array($this, '_errorHandler')); + + if ($args) { + /* Call method with parameters. */ + if (isset($this->soapobject) && is_object($this->soapobject)) { + $ret = call_user_func_array(array(&$this->soapobject, $methodname), $args); + } else { + $ret = call_user_func_array($methodname, $args); + } + } else { + /* Call method withour parameters. */ + if (is_object($this->soapobject)) { + $ret = call_user_func(array(&$this->soapobject, $methodname)); + } else { + $ret = call_user_func($methodname); + } + } + + restore_error_handler(); + + return $ret; + } + + /** + * Creates SOAP_Value objects with return values from method. + * Uses method signature to determine type. + * + * @param mixed $method_response The result(s). + * @param array|string $type The type(s) of the return value(s). + * @param string $return_name The name of the return value. + * @param string $namespace The namespace of the return value. + * + * @return array List of SOAP_Value objects. + */ + function buildResult(&$method_response, &$return_type, + $return_name = 'return', $namespace = '') + { + if (is_a($method_response, 'SOAP_Value')) { + $return_val = array($method_response); + } else { + if (is_array($return_type) && is_array($method_response)) { + $i = 0; + + foreach ($return_type as $key => $type) { + if (is_numeric($key)) { + $key = 'item'; + } + if (is_a($method_response[$i], 'SOAP_Value')) { + $return_val[] =& $method_response[$i++]; + } else { + $qn = new QName($key, $namespace); + $return_val[] = new SOAP_Value($qn->fqn(), $type, $method_response[$i++]); + } + } + } else { + if (is_array($return_type)) { + $keys = array_keys($return_type); + if (!is_numeric($keys[0])) { + $return_name = $keys[0]; + } + $values = array_values($return_type); + $return_type = $values[0]; + } + $qn = new QName($return_name, $namespace); + $return_val = array(new SOAP_Value($qn->fqn(), $return_type, $method_response)); + } + } + return $return_val; + } + + function parseRequest($data = '', $attachments = null) + { + /* Parse response, get SOAP_Parser object. */ + $parser =& new SOAP_Parser($data, $this->xml_encoding, $attachments); + /* If fault occurred during message parsing. */ + if ($parser->fault) { + $this->fault = $parser->fault; + return null; + } + + /* Handle message headers. */ + $request_headers = $parser->getHeaders(); + $header_results = array(); + + if ($request_headers) { + if (!is_a($request_headers, 'SOAP_Value')) { + $this->_raiseSoapFault('Parser did not return SOAP_Value object: ' . $request_headers, '', '', 'Server'); + return null; + } + if ($request_headers->value) { + /* Handle headers now. */ + foreach ($request_headers->value as $header_val) { + $f_exists = $this->validateMethod($header_val->name, $header_val->namespace); + + /* TODO: this does not take into account message routing + * yet. */ + $myactor = !$header_val->actor || + $header_val->actor == 'http://schemas.xmlsoap.org/soap/actor/next' || + $header_val->actor == $this->endpoint; + + if (!$f_exists && $header_val->mustunderstand && $myactor) { + $this->_raiseSoapFault('I don\'t understand header ' . $header_val->name, '', '', 'MustUnderstand'); + return null; + } + + /* We only handle the header if it's for us. */ + $isok = $f_exists && $myactor; + + if ($isok) { + /* Call our header now! */ + $header_method = $header_val->name; + $header_data = array($this->_decode($header_val)); + /* If there are parameters to pass. */ + $hr =& $this->callMethod($header_method, $header_data); + if (PEAR::isError($hr)) { + $this->_raiseSoapFault($hr); + return null; + } + $results = $this->buildResult($hr, $this->return_type, $header_method, $header_val->namespace); + $header_results[] = $results[0]; + } + } + } + } + + /* Handle the method call. */ + /* Evaluate message, getting back a SOAP_Value object. */ + $this->call_methodname = $this->methodname = $parser->root_struct_name[0]; + + /* Figure out the method namespace. */ + $this->method_namespace = $parser->message[$parser->root_struct[0]]['namespace']; + + if ($this->_wsdl) { + $this->_setSchemaVersion($this->_wsdl->xsd); + $dataHandler = $this->_wsdl->getDataHandler($this->methodname, $this->method_namespace); + if ($dataHandler) + $this->call_methodname = $this->methodname = $dataHandler; + + $this->_portName = $this->_wsdl->getPortName($this->methodname); + if (PEAR::isError($this->_portName)) { + $this->_raiseSoapFault($this->_portName); + return null; + } + $opData = $this->_wsdl->getOperationData($this->_portName, $this->methodname); + if (PEAR::isError($opData)) { + $this->_raiseSoapFault($opData); + return null; + } + $this->_options['style'] = $opData['style']; + $this->_options['use'] = $opData['output']['use']; + $this->_options['parameters'] = $opData['parameters']; + } + + /* Does method exist? */ + if (!$this->methodname || + !$this->validateMethod($this->methodname, $this->method_namespace)) { + $this->_raiseSoapFault('method "' . $this->method_namespace . $this->methodname . '" not defined in service', '', '', 'Server'); + return null; + } + + if (!$request_val = $parser->getResponse()) { + return null; + } + if (!is_a($request_val, 'SOAP_Value')) { + $this->_raiseSoapFault('Parser did not return SOAP_Value object: ' . $request_val, '', '', 'Server'); + return null; + } + + /* Verify that SOAP_Value objects in request match the methods + * signature. */ + if (!$this->verifyMethod($request_val)) { + /* verifyMethod() creates the fault. */ + return null; + } + + /* Need to set special error detection inside the value class to + * differentiate between no params passed, and an error decoding. */ + $request_data = $this->__decodeRequest($request_val); + if (PEAR::isError($request_data)) { + $this->_raiseSoapFault($request_data); + return null; + } + $method_response =& $this->callMethod($this->call_methodname, $request_data); + if (PEAR::isError($method_response)) { + $this->_raiseSoapFault($method_response); + return null; + } + + if ($this->_options['parameters'] || + !$method_response || + $this->_options['style'] == 'rpc') { + /* Get the method result. */ + if (is_null($method_response)) { + $return_val = null; + } else { + $return_val = $this->buildResult($method_response, $this->return_type); + } + + $qn = new QName($this->methodname . 'Response', $this->method_namespace); + $methodValue = new SOAP_Value($qn->fqn(), 'Struct', $return_val); + } else { + $methodValue =& $method_response; + } + return $this->makeEnvelope($methodValue, $header_results, $this->response_encoding); + } + + function &__decodeRequest($request, $shift = false) + { + if (!$request) { + $decoded = null; + return $decoded; + } + + /* Check for valid response. */ + if (PEAR::isError($request)) { + $fault = &$this->_raiseSoapFault($request); + return $fault; + } else if (!is_a($request, 'SOAP_Value')) { + $fault = &$this->_raiseSoapFault('Invalid data in server::__decodeRequest'); + return $fault; + } + + /* Decode to native php datatype. */ + $requestArray = $this->_decode($request); + /* Fault? */ + if (PEAR::isError($requestArray)) { + $fault = &$this->_raiseSoapFault($requestArray); + return $fault; + } + if (is_object($requestArray) && + get_class($requestArray) == 'stdClass') { + $requestArray = get_object_vars($requestArray); + } elseif ($this->_options['style'] == 'document') { + $requestArray = array($requestArray); + } + if (is_array($requestArray)) { + if (isset($requestArray['faultcode']) || + isset($requestArray['SOAP-ENV:faultcode'])) { + $faultcode = $faultstring = $faultdetail = $faultactor = ''; + foreach ($requestArray as $k => $v) { + if (stristr($k, 'faultcode')) { + $faultcode = $v; + } + if (stristr($k, 'faultstring')) { + $faultstring = $v; + } + if (stristr($k, 'detail')) { + $faultdetail = $v; + } + if (stristr($k, 'faultactor')) { + $faultactor = $v; + } + } + $fault = &$this->_raiseSoapFault($faultstring, $faultdetail, $faultactor, $faultcode); + return $fault; + } + /* Return array of return values. */ + if ($shift && count($requestArray) == 1) { + $decoded = array_shift($requestArray); + return $decoded; + } + return $requestArray; + } + return $requestArray; + } + + function verifyMethod($request) + { + if (!$this->callValidation) { + return true; + } + + $params = $request->value; + + /* Get the dispatch map if one exists. */ + $map = null; + if (array_key_exists($this->methodname, $this->dispatch_map)) { + $map = $this->dispatch_map[$this->methodname]; + } elseif (isset($this->soapobject)) { + if (method_exists($this->soapobject, '__dispatch')) { + $map = $this->soapobject->__dispatch($this->methodname); + } elseif (method_exists($this->soapobject, $this->methodname)) { + /* No map, all public functions are SOAP functions. */ + return true; + } + } + if (!$map) { + $this->_raiseSoapFault('SOAP request specified an unhandled method "' . $this->methodname . '"', '', '', 'Client'); + return false; + } + + /* If we aliased the SOAP method name to a PHP function, change + * call_methodname so we do the right thing. */ + if (array_key_exists('alias', $map) && !empty($map['alias'])) { + $this->call_methodname = $map['alias']; + } + + /* If there are input parameters required. */ + if ($map['in']) { + $this->input_value = count($map['in']); + $this->return_type = false; + if (is_array($map['out'])) { + $this->return_type = count($map['out']) > 1 + ? $map['out'] + : array_shift($map['out']); + } + if (is_array($params)) { + /* Validate the number of parameters. */ + if (count($params) == count($map['in'])) { + /* Make array of param types. */ + foreach ($params as $param) { + $p[] = strtolower($param->type); + } + $sig_t = array_values($map['in']); + /* Validate each param's type. */ + for ($i = 0; $i < count($p); $i++) { + /* If SOAP types do not match, it's still fine if the + * mapped php types match this allows using plain PHP + * variables to work (i.e. stuff like Decimal would + * fail otherwise). We consider this only error if the + * types exist in our type maps, and they differ. */ + if (strcasecmp($sig_t[$i], $p[$i]) != 0 && + isset($this->_typemap[SOAP_XML_SCHEMA_VERSION][$sig_t[$i]]) && + strcasecmp($this->_typemap[SOAP_XML_SCHEMA_VERSION][$sig_t[$i]], $this->_typemap[SOAP_XML_SCHEMA_VERSION][$p[$i]]) != 0) { + + $param = $params[$i]; + $this->_raiseSoapFault("SOAP request contained mismatching parameters of name $param->name had type [{$p[$i]}], which did not match signature's type: [{$sig_t[$i]}], matched? " . (strcasecmp($sig_t[$i], $p[$i])), '', '', 'Client'); + return false; + } + } + return true; + } else { + /* Wrong number of params. */ + $this->_raiseSoapFault('SOAP request contained incorrect number of parameters. method "' . $this->methodname . '" required ' . count($map['in']) . ' and request provided ' . count($params), '', '', 'Client'); + return false; + } + } else { + /* No params. */ + $this->_raiseSoapFault('SOAP request contained incorrect number of parameters. method "' . $this->methodname . '" requires ' . count($map['in']) . ' parameters, and request provided none.', '', '', 'Client'); + return false; + } + } + + /* We'll try it anyway. */ + return true; + } + + function validateMethod($methodname, $namespace = null) + { + unset($this->soapobject); + + if (!$this->callValidation) { + return true; + } + + /* No SOAP access to private functions. */ + if ($methodname[0] == '_') { + return false; + } + + /* if it's in our function list, ok */ + if (array_key_exists($methodname, $this->dispatch_map) && + (!$namespace || + !array_key_exists('namespace', $this->dispatch_map[$methodname]) || + $namespace == $this->dispatch_map[$methodname]['namespace'])) { + if (array_key_exists('namespace', $this->dispatch_map[$methodname])) + $this->method_namespace = $this->dispatch_map[$methodname]['namespace']; + return true; + } + + /* if it's in an object, it's ok */ + if (isset($this->dispatch_objects[$namespace])) { + $c = count($this->dispatch_objects[$namespace]); + for ($i = 0; $i < $c; $i++) { + $obj =& $this->dispatch_objects[$namespace][$i]; + /* If we have a dispatch map, and the function is not in the + * dispatch map, then it is not callable! */ + if (method_exists($obj, '__dispatch')) { + if ($obj->__dispatch($methodname)) { + $this->method_namespace = $namespace; + $this->soapobject =& $obj; + return true; + } + } elseif (method_exists($obj, $methodname)) { + $this->method_namespace = $namespace; + $this->soapobject =& $obj; + return true; + } + } + } + + return false; + } + + function addObjectMap(&$obj, $namespace = null, $service_name = 'Default', + $service_desc = '') + { + if (!$namespace) { + if (isset($obj->namespace)) { + // XXX a bit of backwards compatibility + $namespace = $obj->namespace; + } else { + $this->_raiseSoapFault('No namespace provided for class!', '', '', 'Server'); + return false; + } + } + if (!isset($this->dispatch_objects[$namespace])) { + $this->dispatch_objects[$namespace] = array(); + } + $this->dispatch_objects[$namespace][] =& $obj; + + // Create internal WSDL structures for object + + // XXX Because some internal workings of PEAR::SOAP decide whether to + // do certain things by the presence or absence of _wsdl, we should + // only create a _wsdl structure if we know we can fill it; if + // __dispatch_map or __typedef for the object is missing, we should + // avoid creating it. Later, when we are using PHP 5 introspection, we + // will be able to make the data for all objects without any extra + // information from the developers, and this condition should be + // dropped. + + // XXX Known issue: if imported WSDL (bindWSDL) or another WSDL source + // is used to add _wsdl structure information, then addObjectWSDL is + // used, there is a high possibility of _wsdl data corruption; + // therefore you should avoid using __dispatch_map/__typedef + // definitions AND other WSDL data sources in the same service. We + // exclude classes that don't have __typedefs to allow external WSDL + // files to be used with classes with no internal type definitions + // (the types are defined in the WSDL file). When addObjectWSDL is + // refactored to not cause corruption, this restriction can be + // relaxed. + + // In summary, if you add an object with both a dispatch map and type + // definitions, then previous WSDL file operation and type definitions + // will be overwritten. + if (isset($obj->__dispatch_map) && isset($obj->__typedef)) { + $this->addObjectWSDL($obj, $namespace, $service_name, $service_desc); + } + + return true; + } + + /** + * Adds a method to the dispatch map. + */ + function addToMap($methodname, $in, $out, $namespace = null, $alias = null) + { + if (!$this->callHandler && !function_exists($methodname)) { + $this->_raiseSoapFault('Error mapping function', '', '', 'Server'); + return false; + } + + $this->dispatch_map[$methodname]['in'] = $in; + $this->dispatch_map[$methodname]['out'] = $out; + $this->dispatch_map[$methodname]['alias'] = $alias; + if ($namespace) { + $this->dispatch_map[$methodname]['namespace'] = $namespace; + } + + return true; + } + + function setCallHandler($callHandler, $validation = true) + { + $this->callHandler = $callHandler; + $this->callValidation = $validation; + } + + /** + * @deprecated use bindWSDL from now on + */ + function bind($wsdl_url) + { + $this->bindWSDL($wsdl_url); + } + + /** + * @param string a url to a WSDL resource + * @return void + */ + function bindWSDL($wsdl_url) + { + /* Instantiate WSDL class. */ + $this->_wsdl = new SOAP_WSDL($wsdl_url); + if ($this->_wsdl->fault) { + $this->_raiseSoapFault($this->_wsdl->fault); + } + } + + /** + * @return void + */ + function addObjectWSDL(&$wsdl_obj, $targetNamespace, $service_name, + $service_desc = '') + { + if (!isset($this->_wsdl)) { + $this->_wsdl = new SOAP_WSDL; + } + + $this->_wsdl->parseObject($wsdl_obj, $targetNamespace, $service_name, $service_desc); + + if ($this->_wsdl->fault) { + $this->_raiseSoapFault($this->_wsdl->fault); + } + } + +} diff --git a/thirdparty/pear/SOAP/Server/Email.php b/thirdparty/pear/SOAP/Server/Email.php new file mode 100644 index 000000000..8905f8928 --- /dev/null +++ b/thirdparty/pear/SOAP/Server/Email.php @@ -0,0 +1,198 @@ + Port to PEAR and more + * @copyright 2003-2005 The PHP Group + * @license http://www.php.net/license/2_02.txt PHP License 2.02 + * @link http://pear.php.net/package/SOAP + */ + +require_once 'SOAP/Server.php'; +require_once 'SOAP/Client.php'; +require_once 'SOAP/Transport.php'; +require_once 'Mail/mimeDecode.php'; + +/** + * SOAP Server Class that implements an email SOAP server. + * http://www.pocketsoap.com/specs/smtpbinding/ + * + * This class overrides the default HTTP server, providing the ability to + * parse an email message and execute SOAP calls. This class DOES NOT pop the + * message; the message, complete with headers, must be passed in as a + * parameter to the service function call. + * + * @access public + * @package SOAP + * @author Shane Caraveo + */ +class SOAP_Server_Email extends SOAP_Server { + + var $headers = array(); + + function SOAP_Server_Email($send_response = true) + { + parent::SOAP_Server(); + $this->send_response = $send_response; + } + + /** + * Removes HTTP headers from response. + * + * TODO: use PEAR email classes + * + * @return boolean + * @access private + */ + function _parseEmail(&$data) + { + if (preg_match("/^(.*?)\r?\n\r?\n(.*)/s", $data, $match)) { + + if (preg_match_all('/^(.*?):\s+(.*)$/m', $match[1], $matches)) { + $hc = count($matches[0]); + for ($i = 0; $i < $hc; $i++) { + $this->headers[strtolower($matches[1][$i])] = trim($matches[2][$i]); + } + } + + if (!stristr($this->headers['content-type'], 'text/xml')) { + $this->_raiseSoapFault('Invalid Content Type', '', '', 'Client'); + return false; + } + + if (strcasecmp($this->headers['content-transfer-encoding'], 'base64')==0) { + /* Unfold lines. */ + $enctext = preg_replace("/[\r|\n]/", '', $match[2]); + $data = base64_decode($enctext); + } else { + $data = $match[2]; + } + + /* If no content, return false. */ + return strlen($this->request) > 0; + } + + $this->_raiseSoapFault('Invalid Email Format', '', '', 'Client'); + + return false; + } + + function client(&$data) + { + $attachments = array(); + + /* If neither matches, we'll just try it anyway. */ + if (stristr($data, 'Content-Type: application/dime')) { + $this->_decodeDIMEMessage($data, $this->headers, $attachments); + } elseif (stristr($data, 'MIME-Version:')) { + /* This is a mime message, let's decode it. */ + $this->_decodeMimeMessage($data, $this->headers, $attachments); + } else { + /* The old fallback, but decodeMimeMessage handles things fine. */ + $this->_parseEmail($data); + } + + /* Get the character encoding of the incoming request treat incoming + * data as UTF-8 if no encoding set. */ + if (!$this->soapfault && + !$this->_getContentEncoding($this->headers['content-type'])) { + $this->xml_encoding = SOAP_DEFAULT_ENCODING; + /* An encoding we don't understand, return a fault. */ + $this->_raiseSoapFault('Unsupported encoding, use one of ISO-8859-1, US-ASCII, UTF-8', '', '', 'Server'); + } + + if ($this->soapfault) { + return $this->soapfault->getFault(); + } + + $client =& new SOAP_Client(null); + + return $client->parseResponse($data, $this->xml_encoding, $this->attachments); + } + + function service(&$data, $endpoint = '', $send_response = true, + $dump = false) + { + $this->endpoint = $endpoint; + $attachments = array(); + $headers = array(); + + /* If neither matches, we'll just try it anyway. */ + if (stristr($data, 'Content-Type: application/dime')) { + $this->_decodeDIMEMessage($data, $this->headers, $attachments); + $useEncoding = 'DIME'; + } elseif (stristr($data, 'MIME-Version:')) { + /* This is a mime message, let's decode it. */ + $this->_decodeMimeMessage($data, $this->headers, $attachments); + $useEncoding = 'Mime'; + } else { + /* The old fallback, but decodeMimeMessage handles things fine. */ + $this->_parseEmail($data); + } + + /* Get the character encoding of the incoming request treat incoming + * data as UTF-8 if no encoding set. */ + if (!$this->_getContentEncoding($this->headers['content-type'])) { + $this->xml_encoding = SOAP_DEFAULT_ENCODING; + /* An encoding we don't understand, return a fault. */ + $this->_raiseSoapFault('Unsupported encoding, use one of ISO-8859-1, US-ASCII, UTF-8', '', '', 'Server'); + $response = $this->getFaultMessage(); + } + + if ($this->soapfault) { + $response = $this->soapfault->message(); + } else { + $soap_msg = $this->parseRequest($data,$attachments); + + /* Handle Mime or DIME encoding. */ + /* TODO: DIME Encoding should move to the transport, do it here + * for now and for ease of getting it done. */ + if (count($this->_attachments)) { + if ($useEncoding == 'Mime') { + $soap_msg = $this->_makeMimeMessage($soap_msg); + } else { + /* Default is DIME. */ + $soap_msg = $this->_makeDIMEMessage($soap_msg); + $soap_msg['headers']['Content-Type'] = 'application/dime'; + } + if (PEAR::isError($soap_msg)) { + return $this->raiseSoapFault($soap_msg); + } + } + + if (is_array($soap_msg)) { + $response = $soap_msg['body']; + if (count($soap_msg['headers'])) { + $headers = $soap_msg['headers']; + } + } else { + $response = $soap_msg; + } + } + + if ($this->send_response) { + if ($dump) { + print $response; + } else { + $from = array_key_exists('reply-to', $this->headers) ? $this->headers['reply-to'] : $this->headers['from']; + + $soap_transport =& SOAP_Transport::getTransport('mailto:' . $from, $this->response_encoding); + $from = $this->endpoint ? $this->endpoint : $this->headers['to']; + $headers['In-Reply-To'] = $this->headers['message-id']; + $options = array('from' => $from, 'subject' => $this->headers['subject'], 'headers' => $headers); + $soap_transport->send($response, $options); + } + } + } +} diff --git a/thirdparty/pear/SOAP/Server/Email_Gateway.php b/thirdparty/pear/SOAP/Server/Email_Gateway.php new file mode 100644 index 000000000..81ddbf1ce --- /dev/null +++ b/thirdparty/pear/SOAP/Server/Email_Gateway.php @@ -0,0 +1,138 @@ + Port to PEAR and more + * @copyright 2003-2005 The PHP Group + * @license http://www.php.net/license/2_02.txt PHP License 2.02 + * @link http://pear.php.net/package/SOAP + */ + +require_once 'SOAP/Server/Email.php'; +require_once 'SOAP/Transport.php'; + +/** + * SOAP Server Class that implements an email SOAP server. + * http://www.pocketsoap.com/specs/smtpbinding/ + * + * This class overrides the default HTTP server, providing the ability to + * parse an email message and execute soap calls. This class DOES NOT pop the + * message; the message, complete with headers, must be passed in as a + * parameter to the service function call. + * + * This class calls a provided HTTP SOAP server, forwarding the email request, + * then sending the HTTP response out as an email. + * + * @access public + * @package SOAP + * @author Shane Caraveo + */ +class SOAP_Server_Email_Gateway extends SOAP_Server_Email { + + var $gateway = null; + var $dump = false; + + function SOAP_Server_Email_Gateway($gateway = '', $send_response = true, + $dump = false) + { + parent::SOAP_Server(); + $this->send_response = $send_response; + $this->gateway = $gateway; + $this->dump = $dump; + } + + function service(&$data, $gateway = '', $endpoint = '', + $send_response = true, $dump = false) + { + $this->endpoint = $endpoint; + $response = ''; + $useEncoding = 'Mime'; + $options = array(); + if (!$gateway) { + $gateway = $this->gateway; + } + + /* We have a full set of headers, need to find the first blank + * line. */ + $this->_parseEmail($data); + if ($this->fault) { + $response = $this->fault->message(); + } + if ($this->headers['content-type'] == 'application/dime') + $useEncoding = 'DIME'; + + /* Call the HTTP Server. */ + if (!$response) { + $soap_transport =& SOAP_Transport::getTransport($gateway, $this->xml_encoding); + if ($soap_transport->fault) { + $response = $soap_transport->fault->message(); + } + } + + /* Send the message. */ + if (!$response) { + $options['soapaction'] = $this->headers['soapaction']; + $options['headers']['Content-Type'] = $this->headers['content-type']; + + $response = $soap_transport->send($data, $options); + if (isset($this->headers['mime-version'])) + $options['headers']['MIME-Version'] = $this->headers['mime-version']; + + if ($soap_transport->fault) { + $response = $soap_transport->fault->message(); + } else { + foreach ($soap_transport->transport->attachments as $cid => $body) { + $this->attachments[] = array('body' => $body, 'cid' => $cid, 'encoding' => 'base64'); + } + if (count($this->_attachments)) { + if ($useEncoding == 'Mime') { + $soap_msg = $this->_makeMimeMessage($response); + $options['headers']['MIME-Version'] = '1.0'; + } else { + /* Default is DIME. */ + $soap_msg = $this->_makeDIMEMessage($response); + $options['headers']['Content-Type'] = 'application/dime'; + } + if (PEAR::isError($soap_msg)) { + return $this->_raiseSoapFault($soap_msg); + } + if (is_array($soap_msg)) { + $response = $soap_msg['body']; + if (count($soap_msg['headers'])) { + if (isset($options['headers'])) { + $options['headers'] = array_merge($options['headers'], $soap_msg['headers']); + } else { + $options['headers'] = $soap_msg['headers']; + } + } + } + } + } + } + + if ($this->send_response) { + if ($this->dump || $dump) { + print $response; + } else { + $from = array_key_exists('reply-to', $this->headers) ? $this->headers['reply-to'] : $this->headers['from']; + + $soap_transport =& SOAP_Transport::getTransport('mailto:' . $from, $this->response_encoding); + $from = $this->endpoint ? $this->endpoint : $this->headers['to']; + $headers = array('In-Reply-To' => $this->headers['message-id']); + $options = array('from' => $from, 'subject'=> $this->headers['subject'], 'headers' => $headers); + $soap_transport->send($response, $options); + } + } + } +} diff --git a/thirdparty/pear/SOAP/Server/TCP.php b/thirdparty/pear/SOAP/Server/TCP.php new file mode 100644 index 000000000..039a62722 --- /dev/null +++ b/thirdparty/pear/SOAP/Server/TCP.php @@ -0,0 +1,106 @@ + Port to PEAR and more + * @copyright 2003-2005 The PHP Group + * @license http://www.php.net/license/2_02.txt PHP License 2.02 + * @link http://pear.php.net/package/SOAP + */ + +require_once 'SOAP/Server.php'; + +/** + * SOAP Server Class that implements a TCP SOAP Server. + * http://www.pocketsoap.com/specs/smtpbinding/ + * + * This class overrides the default HTTP server, providing the ability to + * accept socket connections and execute SOAP calls. + * + * TODO: + * use Net_Socket + * implement some security scheme + * implement support for attachments + * + * @access public + * @package SOAP + * @author Shane Caraveo + */ +class SOAP_Server_TCP extends SOAP_Server { + + var $headers = array(); + var $localaddr; + var $port; + var $listen; + var $reuse; + + function SOAP_Server_TCP($localaddr = '127.0.0.1', $port = 10000, + $listen = 5, $reuse = true) + { + parent::SOAP_Server(); + $this->localaddr = $localaddr; + $this->port = $port; + $this->listen = $listen; + $this->reuse = $reuse; + } + + function run() + { + if (($sock = socket_create(AF_INET, SOCK_STREAM, 0)) < 0) { + return $this->_raiseSoapFault('socket_create() failed. Reason: ' . socket_strerror($sock)); + } + if ($this->reuse && + !@socket_setopt($sock, SOL_SOCKET, SO_REUSEADDR, 1)) { + return $this->_raiseSoapFault('socket_setopt() failed. Reason: ' . socket_strerror(socket_last_error($sock))); + } + if (($ret = socket_bind($sock, $this->localaddr, $this->port)) < 0) { + return $this->_raiseSoapFault('socket_bind() failed. Reason: ' . socket_strerror($ret)); + } + if (($ret = socket_listen($sock, $this->listen)) < 0) { + return $this->_raiseSoapFault('socket_listen() failed. Reason: ' . socket_strerror($ret)); + } + + while (true) { + $data = null; + if (($msgsock = socket_accept($sock)) < 0) { + $this->_raiseSoapFault('socket_accept() failed. Reason: ' . socket_strerror($msgsock)); + break; + } + while ($buf = socket_read($msgsock, 8192)) { + if (!$buf = trim($buf)) { + continue; + } + $data .= $buf; + } + + if ($data) { + $response = $this->service($data); + /* Write to the socket. */ + if (!socket_write($msgsock, $response, strlen($response))) { + return $this->_raiseSoapFault('Error sending response data reason ' . socket_strerror()); + } + } + + socket_close ($msgsock); + } + + socket_close ($sock); + } + + function service(&$data) + { + /* TODO: we need to handle attachments somehow. */ + return $this->parseRequest($data, $attachments); + } +} diff --git a/thirdparty/pear/SOAP/Transport.php b/thirdparty/pear/SOAP/Transport.php new file mode 100644 index 000000000..016399334 --- /dev/null +++ b/thirdparty/pear/SOAP/Transport.php @@ -0,0 +1,151 @@ + + * @author Shane Caraveo + * @author Jan Schneider + * @copyright 2003-2006 The PHP Group + * @license http://www.php.net/license/2_02.txt PHP License 2.02 + * @link http://pear.php.net/package/SOAP + */ + +require_once 'SOAP/Base.php'; + +/** + * SOAP Transport Layer + * + * This layer can use different protocols dependant on the endpoint url + * provided. + * + * No knowlege of the SOAP protocol is available at this level. + * No knowlege of the transport protocols is available at this level. + * + * @access public + * @package SOAP + * @author Shane Caraveo + * @author Jan Schneider + */ +class SOAP_Transport extends SOAP_Base +{ + /** + * Connection endpoint URL. + * + * @var string + */ + var $url = ''; + + /** + * Array containing urlparts. + * + * @see parse_url() + * + * @var mixed + */ + var $urlparts = null; + + /** + * Incoming payload. + * + * @var string + */ + var $incoming_payload = ''; + + /** + * Outgoing payload. + * + * @var string + */ + var $outgoing_payload = ''; + + /** + * Request encoding. + * + * @var string + */ + var $encoding = SOAP_DEFAULT_ENCODING; + + /** + * Response encoding. + * + * We assume UTF-8 if no encoding is set. + * + * @var string + */ + var $result_encoding = 'UTF-8'; + + /** + * Decoded attachments from the reponse. + * + * @var array + */ + var $attachments; + + /** + * Request User-Agent. + * + * @var string + */ + var $_userAgent = SOAP_LIBRARY_NAME; + + /** + * Sends and receives SOAP data. + * + * @access public + * @abstract + * + * @param string Outgoing SOAP data. + * @param array Options. + * + * @return string|SOAP_Fault + */ + function send($msg, $options = null) + { + return $this->_raiseSoapFault('SOAP_Transport::send() not implemented.'); + } + + function &getTransport($url, $encoding = SOAP_DEFAULT_ENCODING) + { + $urlparts = @parse_url($url); + + if (!$urlparts['scheme']) { + $fault = SOAP_Base_Object::_raiseSoapFault("Invalid transport URI: $url"); + return $fault; + } + + if (strcasecmp($urlparts['scheme'], 'mailto') == 0) { + $transport_type = 'SMTP'; + } elseif (strcasecmp($urlparts['scheme'], 'https') == 0) { + $transport_type = 'HTTP'; + } else { + /* Handle other transport types */ + $transport_type = strtoupper($urlparts['scheme']); + } + $transport_include = 'SOAP/Transport/' . basename($transport_type) . '.php'; + $res = @include_once($transport_include); + if (!$res) { + $fault = SOAP_Base_Object::_raiseSoapFault("No Transport for {$urlparts['scheme']}"); + return $fault; + } + $transport_class = "SOAP_Transport_$transport_type"; + if (!class_exists($transport_class)) { + $fault = SOAP_Base_Object::_raiseSoapFault("No Transport class $transport_class"); + return $fault; + } + $t = new $transport_class($url, $encoding); + + return $t; + } + +} diff --git a/thirdparty/pear/SOAP/Transport/HTTP.php b/thirdparty/pear/SOAP/Transport/HTTP.php new file mode 100644 index 000000000..ec03f2418 --- /dev/null +++ b/thirdparty/pear/SOAP/Transport/HTTP.php @@ -0,0 +1,620 @@ + + * @author Jan Schneider + * @copyright 2003-2006 The PHP Group + * @license http://www.php.net/license/2_02.txt PHP License 2.02 + * @link http://pear.php.net/package/SOAP + */ + +/** + * HTTP Transport class + * + * @package SOAP + * @category Web_Services + */ + +/** + * Needed Classes + */ +require_once 'SOAP/Transport.php'; + +/** + * HTTP Transport for SOAP + * + * @access public + * @package SOAP + * @author Shane Caraveo + * @author Jan Schneider + */ +class SOAP_Transport_HTTP extends SOAP_Transport +{ + /** + * Basic Auth string. + * + * @var array + */ + var $headers = array(); + + /** + * Cookies. + * + * @var array + */ + var $cookies; + + /** + * Connection timeout in seconds. 0 = none. + * + * @var integer + */ + var $timeout = 4; + + /** + * HTTP-Response Content-Type. + */ + var $result_content_type; + + var $result_headers = array(); + + var $result_cookies = array(); + + /** + * SOAP_Transport_HTTP Constructor + * + * @access public + * + * @param string $url HTTP url to SOAP endpoint. + * @param string $encoding Encoding to use. + */ + function SOAP_Transport_HTTP($url, $encoding = SOAP_DEFAULT_ENCODING) + { + parent::SOAP_Base('HTTP'); + $this->urlparts = @parse_url($url); + $this->url = $url; + $this->encoding = $encoding; + } + + /** + * Sends and receives SOAP data. + * + * @access public + * + * @param string Outgoing SOAP data. + * @param array Options. + * + * @return string|SOAP_Fault + */ + function send($msg, $options = array()) + { + $this->fault = null; + + if (!$this->_validateUrl()) { + return $this->fault; + } + + if (isset($options['timeout'])) { + $this->timeout = (int)$options['timeout']; + } + + if (strcasecmp($this->urlparts['scheme'], 'HTTP') == 0) { + return $this->_sendHTTP($msg, $options); + } elseif (strcasecmp($this->urlparts['scheme'], 'HTTPS') == 0) { + return $this->_sendHTTPS($msg, $options); + } + + return $this->_raiseSoapFault('Invalid url scheme ' . $this->url); + } + + /** + * Sets data for HTTP authentication, creates authorization header. + * + * @param string $username Username. + * @param string $password Response data, minus HTTP headers. + * + * @access public + */ + function setCredentials($username, $password) + { + $this->headers['Authorization'] = 'Basic ' . base64_encode($username . ':' . $password); + } + + /** + * Adds a cookie. + * + * @access public + * @param string $name Cookie name. + * @param mixed $value Cookie value. + */ + function addCookie($name, $value) + { + $this->cookies[$name] = $value; + } + + /** + * Generates the correct headers for the cookies. + * + * @access private + * + * @param array $options Cookie options. If 'nocookies' is set and true + * the cookies from the last response are added + * automatically. 'cookies' is name-value-hash with + * a list of cookies to add. + * + * @return string The cookie header value. + */ + function _generateCookieHeader($options) + { + $this->cookies = array(); + + if (empty($options['nocookies']) && + isset($this->result_cookies)) { + // Add the cookies we got from the last request. + foreach ($this->result_cookies as $cookie) { + if ($cookie['domain'] == $this->urlparts['host']) { + $this->cookies[$cookie['name']] = $cookie['value']; + } + } + } + + // Add cookies the user wants to set. + if (isset($options['cookies'])) { + foreach ($options['cookies'] as $cookie) { + if ($cookie['domain'] == $this->urlparts['host']) { + $this->cookies[$cookie['name']] = $cookie['value']; + } + } + } + + $cookies = ''; + foreach ($this->cookies as $name => $value) { + if (!empty($cookies)) { + $cookies .= '; '; + } + $cookies .= urlencode($name) . '=' . urlencode($value); + } + + return $cookies; + } + + /** + * Validate url data passed to constructor. + * + * @access private + * @return boolean + */ + function _validateUrl() + { + if (!is_array($this->urlparts) ) { + $this->_raiseSoapFault('Unable to parse URL ' . $this->url); + return false; + } + if (!isset($this->urlparts['host'])) { + $this->_raiseSoapFault('No host in URL ' . $this->url); + return false; + } + if (!isset($this->urlparts['port'])) { + if (strcasecmp($this->urlparts['scheme'], 'HTTP') == 0) { + $this->urlparts['port'] = 80; + } elseif (strcasecmp($this->urlparts['scheme'], 'HTTPS') == 0) { + $this->urlparts['port'] = 443; + } + + } + if (isset($this->urlparts['user'])) { + $this->setCredentials(urldecode($this->urlparts['user']), + urldecode($this->urlparts['pass'])); + } + if (!isset($this->urlparts['path']) || !$this->urlparts['path']) { + $this->urlparts['path'] = '/'; + } + + return true; + } + + /** + * Finds out what the encoding is. + * Sets the object property accordingly. + * + * @access private + * @param array $headers Headers. + */ + function _parseEncoding($headers) + { + $h = stristr($headers, 'Content-Type'); + preg_match_all('/^Content-Type:\s*(.*)$/im', $h, $ct, PREG_SET_ORDER); + $n = count($ct); + $ct = $ct[$n - 1]; + + // Strip the string of \r. + $this->result_content_type = str_replace("\r", '', $ct[1]); + + if (preg_match('/(.*?)(?:;\s?charset=)(.*)/i', + $this->result_content_type, + $m)) { + $this->result_content_type = $m[1]; + if (count($m) > 2) { + $enc = strtoupper(str_replace('"', '', $m[2])); + if (in_array($enc, $this->_encodings)) { + $this->result_encoding = $enc; + } + } + } + + // Deal with broken servers that don't set content type on faults. + if (!$this->result_content_type) { + $this->result_content_type = 'text/xml'; + } + } + + /** + * Parses the headers. + * + * @param array $headers The headers. + */ + function _parseHeaders($headers) + { + /* Largely borrowed from HTTP_Request. */ + $this->result_headers = array(); + $headers = explode("\r?\n", $headers); + foreach ($headers as $value) { + if (strpos($value,':') === false) { + $this->result_headers[0] = $value; + continue; + } + list($name, $value) = explode(':', $value); + $headername = strtolower($name); + $headervalue = trim($value); + $this->result_headers[$headername] = $headervalue; + + if ($headername == 'set-cookie') { + // Parse a SetCookie header to fill _cookies array. + $cookie = array('expires' => null, + 'domain' => $this->urlparts['host'], + 'path' => null, + 'secure' => false); + + if (!strpos($headervalue, ';')) { + // Only a name=value pair. + list($cookie['name'], $cookie['value']) = array_map('trim', explode('=', $headervalue)); + $cookie['name'] = urldecode($cookie['name']); + $cookie['value'] = urldecode($cookie['value']); + + } else { + // Some optional parameters are supplied. + $elements = explode(';', $headervalue); + list($cookie['name'], $cookie['value']) = array_map('trim', explode('=', $elements[0])); + $cookie['name'] = urldecode($cookie['name']); + $cookie['value'] = urldecode($cookie['value']); + + for ($i = 1; $i < count($elements);$i++) { + list($elName, $elValue) = array_map('trim', explode('=', $elements[$i])); + if ('secure' == $elName) { + $cookie['secure'] = true; + } elseif ('expires' == $elName) { + $cookie['expires'] = str_replace('"', '', $elValue); + } elseif ('path' == $elName OR 'domain' == $elName) { + $cookie[$elName] = urldecode($elValue); + } else { + $cookie[$elName] = $elValue; + } + } + } + $this->result_cookies[] = $cookie; + } + } + } + + /** + * Removes HTTP headers from response. + * + * @return boolean + * @access private + */ + function _parseResponse() + { + if (preg_match("/^(.*?)\r?\n\r?\n(.*)/s", + $this->incoming_payload, + $match)) { + $this->response = $match[2]; + // Find the response error, some servers response with 500 for + // SOAP faults. + $this->_parseHeaders($match[1]); + + list(, $code, $msg) = sscanf($this->result_headers[0], '%s %s %s'); + unset($this->result_headers[0]); + + switch($code) { + case 100: // Continue + $this->incoming_payload = $match[2]; + return $this->_parseResponse(); + case 400: + $this->_raiseSoapFault("HTTP Response $code Bad Request"); + return false; + break; + case 401: + $this->_raiseSoapFault("HTTP Response $code Authentication Failed"); + return false; + break; + case 403: + $this->_raiseSoapFault("HTTP Response $code Forbidden"); + return false; + break; + case 404: + $this->_raiseSoapFault("HTTP Response $code Not Found"); + return false; + break; + case 407: + $this->_raiseSoapFault("HTTP Response $code Proxy Authentication Required"); + return false; + break; + case 408: + $this->_raiseSoapFault("HTTP Response $code Request Timeout"); + return false; + break; + case 410: + $this->_raiseSoapFault("HTTP Response $code Gone"); + return false; + break; + default: + if ($code >= 400 && $code < 500) { + $this->_raiseSoapFault("HTTP Response $code Not Found, Server message: $msg"); + return false; + } + } + + $this->_parseEncoding($match[1]); + + if ($this->result_content_type == 'application/dime') { + // XXX quick hack insertion of DIME + if (PEAR::isError($this->_decodeDIMEMessage($this->response, $this->headers, $this->attachments))) { + // _decodeDIMEMessage already raised $this->fault + return false; + } + $this->result_content_type = $this->headers['content-type']; + } elseif (stristr($this->result_content_type, 'multipart/related')) { + $this->response = $this->incoming_payload; + if (PEAR::isError($this->_decodeMimeMessage($this->response, $this->headers, $this->attachments))) { + // _decodeMimeMessage already raised $this->fault + return false; + } + } elseif ($this->result_content_type != 'text/xml') { + $this->_raiseSoapFault($this->response); + return false; + } + // if no content, return false + return strlen($this->response) > 0; + } + $this->_raiseSoapFault('Invalid HTTP Response'); + return false; + } + + /** + * Creates an HTTP request, including headers, for the outgoing request. + * + * @access private + * + * @param string $msg Outgoing SOAP package. + * @param array $options Options. + * + * @return string Outgoing payload. + */ + function _getRequest($msg, $options) + { + $this->headers = array(); + + $action = isset($options['soapaction']) ? $options['soapaction'] : ''; + $fullpath = $this->urlparts['path']; + if (isset($this->urlparts['query'])) { + $fullpath .= '?' . $this->urlparts['query']; + } + if (isset($this->urlparts['fragment'])) { + $fullpath .= '#' . $this->urlparts['fragment']; + } + + if (isset($options['proxy_host'])) { + $fullpath = 'http://' . $this->urlparts['host'] . ':' . + $this->urlparts['port'] . $fullpath; + } + + if (isset($options['proxy_user'])) { + $this->headers['Proxy-Authorization'] = 'Basic ' . + base64_encode($options['proxy_user'] . ':' . + $options['proxy_pass']); + } + + if (isset($options['user'])) { + $this->setCredentials($options['user'], $options['pass']); + } + + $this->headers['User-Agent'] = $this->_userAgent; + $this->headers['Host'] = $this->urlparts['host']; + $this->headers['Content-Type'] = "text/xml; charset=$this->encoding"; + $this->headers['Content-Length'] = strlen($msg); + $this->headers['SOAPAction'] = '"' . $action . '"'; + $this->headers['Connection'] = 'close'; + + if (isset($options['headers'])) { + $this->headers = array_merge($this->headers, $options['headers']); + } + + $cookies = $this->_generateCookieHeader($options); + if ($cookies) { + $this->headers['Cookie'] = $cookies; + } + + $headers = ''; + foreach ($this->headers as $k => $v) { + $headers .= "$k: $v\r\n"; + } + $this->outgoing_payload = "POST $fullpath HTTP/1.0\r\n" . $headers . + "\r\n" . $msg; + + return $this->outgoing_payload; + } + + /** + * Sends the outgoing HTTP request and reads and parses the response. + * + * @access private + * + * @param string $msg Outgoing SOAP package. + * @param array $options Options. + * + * @return string Response data without HTTP headers. + */ + function _sendHTTP($msg, $options) + { + $this->incoming_payload = ''; + $this->_getRequest($msg, $options); + $host = $this->urlparts['host']; + $port = $this->urlparts['port']; + if (isset($options['proxy_host'])) { + $host = $options['proxy_host']; + $port = isset($options['proxy_port']) ? $options['proxy_port'] : 8080; + } + // Send. + if ($this->timeout > 0) { + $fp = @fsockopen($host, $port, $this->errno, $this->errmsg, $this->timeout); + } else { + $fp = @fsockopen($host, $port, $this->errno, $this->errmsg); + } + if (!$fp) { + return $this->_raiseSoapFault("Connect Error to $host:$port"); + } + if ($this->timeout > 0) { + // some builds of PHP do not support this, silence the warning + @socket_set_timeout($fp, $this->timeout); + } + if (!fputs($fp, $this->outgoing_payload, strlen($this->outgoing_payload))) { + return $this->_raiseSoapFault("Error POSTing Data to $host"); + } + + // get reponse + // XXX time consumer + do { + $data = fread($fp, 4096); + $_tmp_status = socket_get_status($fp); + if ($_tmp_status['timed_out']) { + return $this->_raiseSoapFault("Timed out read from $host"); + } else { + $this->incoming_payload .= $data; + } + } while (!$_tmp_status['eof']); + + fclose($fp); + + if (!$this->_parseResponse()) { + return $this->fault; + } + return $this->response; + } + + /** + * Sends the outgoing HTTPS request and reads and parses the response. + * + * @access private + * + * @param string $msg Outgoing SOAP package. + * @param array $options Options. + * + * @return string Response data without HTTP headers. + */ + function _sendHTTPS($msg, $options) + { + /* Check if the required curl extension is installed. */ + if (!extension_loaded('curl')) { + return $this->_raiseSoapFault('CURL Extension is required for HTTPS'); + } + + $ch = curl_init(); + + if (isset($options['proxy_host'])) { + $port = isset($options['proxy_port']) ? $options['proxy_port'] : 8080; + curl_setopt($ch, CURLOPT_PROXY, + $options['proxy_host'] . ':' . $port); + } + if (isset($options['proxy_user'])) { + curl_setopt($ch, CURLOPT_PROXYUSERPWD, + $options['proxy_user'] . ':' . $options['proxy_pass']); + } + + if (isset($options['user'])) { + curl_setopt($ch, CURLOPT_USERPWD, + $options['user'] . ':' . $options['pass']); + } + + if (!isset($options['soapaction'])) { + $options['soapaction'] = ''; + } + if (!isset($options['headers']['Content-Type'])) { + $options['headers']['Content-Type'] = 'text/xml'; + } + curl_setopt($ch, CURLOPT_HTTPHEADER, + array('Content-Type: ' . $options['headers']['Content-Type'] + . ';charset=' . $this->encoding, + 'SOAPAction: "' . $options['soapaction'] . '"')); + curl_setopt($ch, CURLOPT_USERAGENT, + $this->_userAgent); + + if ($this->timeout) { + curl_setopt($ch, CURLOPT_TIMEOUT, $this->timeout); + } + + curl_setopt($ch, CURLOPT_POSTFIELDS, $msg); + curl_setopt($ch, CURLOPT_URL, $this->url); + curl_setopt($ch, CURLOPT_POST, 1); + curl_setopt($ch, CURLOPT_FAILONERROR, 0); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($ch, CURLOPT_HEADER, 1); + if (defined('CURLOPT_HTTP_VERSION')) { + curl_setopt($ch, CURLOPT_HTTP_VERSION, 1); + } + if (!ini_get('safe_mode') && !ini_get('open_basedir')) { + curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); + } + $cookies = $this->_generateCookieHeader($options); + if ($cookies) { + curl_setopt($ch, CURLOPT_COOKIE, $cookies); + } + + if (isset($options['curl'])) { + foreach ($options['curl'] as $key => $val) { + curl_setopt($ch, $key, $val); + } + } + + // Save the outgoing XML. This doesn't quite match _sendHTTP as CURL + // generates the headers, but having the XML is usually the most + // important part for tracing/debugging. + $this->outgoing_payload = $msg; + + $this->incoming_payload = curl_exec($ch); + if (!$this->incoming_payload) { + $m = 'curl_exec error ' . curl_errno($ch) . ' ' . curl_error($ch); + curl_close($ch); + return $this->_raiseSoapFault($m); + } + curl_close($ch); + + if (!$this->_parseResponse()) { + return $this->fault; + } + + return $this->response; + } + +} diff --git a/thirdparty/pear/SOAP/Transport/SMTP.php b/thirdparty/pear/SOAP/Transport/SMTP.php new file mode 100644 index 000000000..4619012cd --- /dev/null +++ b/thirdparty/pear/SOAP/Transport/SMTP.php @@ -0,0 +1,220 @@ + + * @author Jan Schneider + * @copyright 2003-2006 The PHP Group + * @license http://www.php.net/license/2_02.txt PHP License 2.02 + * @link http://pear.php.net/package/SOAP + */ + +require_once 'SOAP/Transport.php'; +require_once 'Mail/smtp.php'; + +/** + * SMTP Transport for SOAP + * + * Implements SOAP-SMTP as defined at + * http://www.pocketsoap.com/specs/smtpbinding/ + * + * @todo use PEAR smtp and Mime classes + * + * @access public + * @package SOAP + * @author Shane Caraveo + * @author Jan Schneider + */ +class SOAP_Transport_SMTP extends SOAP_Transport +{ + var $credentials = ''; + var $timeout = 4; // connect timeout + var $host = '127.0.0.1'; + var $port = 25; + var $auth = null; + + /** + * SOAP_Transport_SMTP Constructor + * + * @param string $url mailto: address. + * + * @access public + */ + function SOAP_Transport_SMTP($url, $encoding = 'US-ASCII') + { + parent::SOAP_Base('SMTP'); + $this->encoding = $encoding; + $this->urlparts = @parse_url($url); + $this->url = $url; + } + + /** + * Sends and receives SOAP data. + * + * @access public + * + * @param string Outgoing SOAP data. + * @param array Options. + * + * @return string|SOAP_Fault + */ + function send($msg, $options = array()) + { + $this->fault = null; + $this->incoming_payload = ''; + $this->outgoing_payload = $msg; + if (!$this->_validateUrl()) { + return $this->fault; + } + if (!$options || !isset($options['from'])) { + return $this->_raiseSoapFault('No From: address to send message with'); + } + + if (isset($options['host'])) $this->host = $options['host']; + if (isset($options['port'])) $this->port = $options['port']; + if (isset($options['auth'])) $this->auth = $options['auth']; + if (isset($options['username'])) $this->username = $options['username']; + if (isset($options['password'])) $this->password = $options['password']; + + $headers = array(); + $headers['From'] = $options['from']; + $headers['X-Mailer'] = $this->_userAgent; + $headers['MIME-Version'] = '1.0'; + $headers['Message-ID'] = $this->encryptOld(time()) . '.soap@' . $this->host; + $headers['To'] = $this->urlparts['path']; + if (isset($options['soapaction'])) { + $headers['Soapaction'] = "\"{$options['soapaction']}\""; + } + + if (isset($options['headers'])) + $headers = array_merge($headers, $options['headers']); + + // If the content type is already set, we assume that MIME encoding is + // already done. + if (isset($headers['Content-Type'])) { + $out = $msg; + } else { + // Do a simple inline MIME encoding. + $headers['Content-Disposition'] = 'inline'; + $headers['Content-Type'] = "text/xml; charset=\"$this->encoding\""; + if (isset($options['transfer-encoding'])) { + if (strcasecmp($options['transfer-encoding'], 'quoted-printable') == 0) { + $headers['Content-Transfer-Encoding'] = $options['transfer-encoding']; + $out = $msg; + } elseif (strcasecmp($options['transfer-encoding'],'base64') == 0) { + $headers['Content-Transfer-Encoding'] = 'base64'; + $out = chunk_split(base64_encode($msg), 76, "\n"); + } else { + return $this->_raiseSoapFault("Invalid Transfer Encoding: {$options['transfer-encoding']}"); + } + } else { + // Default to base64. + $headers['Content-Transfer-Encoding'] = 'base64'; + $out = chunk_split(base64_encode($msg)); + } + } + + $headers['Subject'] = isset($options['subject']) ? $options['subject'] : 'SOAP Message'; + + foreach ($headers as $key => $value) { + $header_text .= "$key: $value\n"; + } + $this->outgoing_payload = $header_text . "\r\n" . $this->outgoing_payload; + + $mailer_params = array( + 'host' => $this->host, + 'port' => $this->port, + 'username' => $this->username, + 'password' => $this->password, + 'auth' => $this->auth + ); + $mailer = new Mail_smtp($mailer_params); + $result = $mailer->send($this->urlparts['path'], $headers, $out); + if (!PEAR::isError($result)) { + $val = new SOAP_Value('Message-ID', 'string', $headers['Message-ID']); + } else { + $sval[] = new SOAP_Value('faultcode', 'QName', 'SOAP-ENV:Client'); + $sval[] = new SOAP_Value('faultstring', 'string', "couldn't send SMTP message to {$this->urlparts['path']}"); + $val = new SOAP_Value('Fault', 'Struct', $sval); + } + + $methodValue = new SOAP_Value('Response', 'Struct', array($val)); + + $this->incoming_payload = $this->makeEnvelope($methodValue, + $this->headers, + $this->encoding); + + return $this->incoming_payload; + } + + /** + * Sets data for HTTP authentication, creates Authorization header. + * + * @param string $username Username. + * @param string $password Response data, minus HTTP headers. + * + * @access public + */ + function setCredentials($username, $password) + { + $this->username = $username; + $this->password = $password; + } + + /** + * Validates url data passed to constructor. + * + * @return boolean + * @access private + */ + function _validateUrl() + { + if (!is_array($this->urlparts)) { + $this->_raiseSoapFault("Unable to parse URL $this->url"); + return false; + } + if (!isset($this->urlparts['scheme']) || + strcasecmp($this->urlparts['scheme'], 'mailto') != 0) { + $this->_raiseSoapFault("Unable to parse URL $this->url"); + return false; + } + if (!isset($this->urlparts['path'])) { + $this->_raiseSoapFault("Unable to parse URL $this->url"); + return false; + } + return true; + } + + public function encryptOld($string) + { + if (!class_exists('G')) { + $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); + $docuroot = explode( '/', $realdocuroot ); + array_pop( $docuroot ); + $pathhome = implode( '/', $docuroot ) . '/'; + array_pop( $docuroot ); + $pathTrunk = implode( '/', $docuroot ) . '/'; + require_once($pathTrunk.'gulliver/system/class.g.php'); + } + return G::encryptOld($string); + } + +} diff --git a/thirdparty/pear/SOAP/Transport/TCP.php b/thirdparty/pear/SOAP/Transport/TCP.php new file mode 100644 index 000000000..cc386c7b8 --- /dev/null +++ b/thirdparty/pear/SOAP/Transport/TCP.php @@ -0,0 +1,153 @@ + + * @author Jan Schneider + * @copyright 2003-2006 The PHP Group + * @license http://www.php.net/license/2_02.txt PHP License 2.02 + * @link http://pear.php.net/package/SOAP + */ + +require_once 'SOAP/Transport.php'; + +/** + * TCP transport for SOAP. + * + * @todo use Net_Socket; implement some security scheme; implement support + * for attachments + * @access public + * @package SOAP + * @author Shane Hanna + * @author Jan Schneider + */ +class SOAP_Transport_TCP extends SOAP_Transport +{ + /** + * Socket. + */ + var $socket = null; + + /** + * Constructor. + * + * @param string $url HTTP url to SOAP endpoint. + * + * @access public + */ + function SOAP_Transport_TCP($url, $encoding = SOAP_DEFAULT_ENCODING) + { + parent::SOAP_Base_Object('TCP'); + $this->urlparts = @parse_url($url); + $this->url = $url; + $this->encoding = $encoding; + } + + function _socket_ping() + { + // XXX how do we restart after socket_shutdown? + //if (!$this->socket) { + // Create socket resource. + $this->socket = @socket_create(AF_INET, SOCK_STREAM, SOL_TCP); + if ($this->socket < 0) { + return 0; + } + + // Connect. + $result = socket_connect($this->socket, $this->urlparts['host'], + $this->urlparts['port']); + if ($result < 0) { + return 0; + } + //} + return 1; + } + + /** + * Sends and receives SOAP data. + * + * @access public + * + * @param string Outgoing SOAP data. + * @param array Options. + * + * @return string|SOAP_Fault + */ + function send($msg, $options = array()) + { + $this->fault = null; + $this->incoming_payload = ''; + $this->outgoing_payload = $msg; + if (!$this->_validateUrl()) { + return $this->fault; + } + + // Check for TCP scheme. + if (strcasecmp($this->urlparts['scheme'], 'TCP') == 0) { + // Check connection. + if (!$this->_socket_ping()) { + return $this->_raiseSoapFault('Error connecting to ' . $this->url . '; reason: ' . socket_strerror(socket_last_error($this->socket))); + } + + // Write to the socket. + if (!@socket_write($this->socket, $this->outgoing_payload, + strlen($this->outgoing_payload))) { + return $this->_raiseSoapFault('Error sending data to ' . $this->url . '; reason: ' . socket_strerror(socket_last_error($this->socket))); + } + + // Shutdown writing. + if(!socket_shutdown($this->socket, 1)) { + return $this->_raiseSoapFault('Cannot change socket mode to read.'); + } + + // Read everything we can. + while ($buf = @socket_read($this->socket, 1024, PHP_BINARY_READ)) { + $this->incoming_payload .= $buf; + } + + // Return payload or die. + if ($this->incoming_payload) { + return $this->incoming_payload; + } + + return $this->_raiseSoapFault('Error reveiving data from ' . $this->url); + } + + return $this->_raiseSoapFault('Invalid url scheme ' . $this->url); + } + + /** + * Validates the url data passed to the constructor. + * + * @return boolean + * @access private + */ + function _validateUrl() + { + if (!is_array($this->urlparts) ) { + $this->_raiseSoapFault("Unable to parse URL $this->url"); + return false; + } + if (!isset($this->urlparts['host'])) { + $this->_raiseSoapFault("No host in URL $this->url"); + return false; + } + if (!isset($this->urlparts['path']) || !$this->urlparts['path']) { + $this->urlparts['path'] = '/'; + } + + return true; + } + +} diff --git a/thirdparty/pear/SOAP/Type/dateTime.php b/thirdparty/pear/SOAP/Type/dateTime.php new file mode 100644 index 000000000..b969da722 --- /dev/null +++ b/thirdparty/pear/SOAP/Type/dateTime.php @@ -0,0 +1,243 @@ + Original Author + * @author Shane Caraveo Port to PEAR and more + * @author Jan Schneider Maintenance + * @copyright 2003-2005 The PHP Group + * @license http://www.php.net/license/2_02.txt PHP License 2.02 + * @link http://pear.php.net/package/SOAP + */ + +/** + * This class converts from and to unix timestamps and ISO 8601 date/time. + * + * @access public + * @package SOAP + * @author Dietrich Ayala Original Author + * @author Shane Caraveo Port to PEAR and more + * @author Jan Schneider Maintenance + */ +class SOAP_Type_dateTime +{ + var $_iso8601 = + '# 1: centuries & years CCYY- + (-?[0-9]{4})- + # 2: months MM- + ([0-9]{2})- + # 3: days DD + ([0-9]{2}) + # 4: separator T + T + # 5: hours hh: + ([0-9]{2}): + # 6: minutes mm: + ([0-9]{2}): + # 7: seconds ss.ss... + ([0-9]{2})(\.[0-9]*)? + # 8: Z to indicate UTC, -+HH:MM:SS.SS... for local zones + (Z|[+\-][0-9]{4}|[+\-][0-9]{2}:[0-9]{2})?'; + + var $timestamp = -1; + + /** + * Constructor. + * + * @param string|integer $date The timestamp or ISO 8601 formatted + * date and time this object is going to + * represent. + */ + function SOAP_Type_dateTime($date = -1) + { + if ($date == -1) { + $this->timestamp = time(); + } elseif (is_int($date)) { + $this->timestamp = $date; + } else { + $this->timestamp = $this->toUnixtime($date); + } + } + + /** + * Alias of {@link SOAP_Type_dateTime::toUTC}. + */ + function toSOAP($date = NULL) + { + return $this->toUTC($date); + } + + /** + * Converts this object or a timestamp to an ISO 8601 date/time string. + * + * @param integer $timestamp A unix timestamp + * + * @return string An ISO 8601 formatted date/time string. + */ + function toString($timestamp = 0) + { + if (!$timestamp) { + $timestamp = $this->timestamp; + } + if ($timestamp < 0) { + return 0; + } + + //simulate PHP5's P parameter + $zone = date('O', $timestamp); + if (strlen($zone) == 5) { + $zone = substr($zone, 0, 3) . ':' . substr($zone, 3); + } + return date('Y-m-d\TH:i:s', $timestamp) . $zone; + } + + /** + * Splits a date/time into its components. + * + * @param string|integer $datestr A unix timestamp or ISO 8601 date/time + * string. If empty, this object is used. + * + * @return boolean|array An array with the date and time components or + * false on failure. + */ + function _split($datestr) + { + if (!$datestr) { + $datestr = $this->toString(); + } elseif (is_int($datestr)) { + $datestr = $this->toString($datestr); + } + + if (preg_match('/' . $this->_iso8601 . '/x', $datestr, $regs)) { + if (empty($regs[8])) { + $timestamp = strtotime(sprintf('%04d-%02d-%02d %02d:%02d:%02d', + $regs[1], + $regs[2], + $regs[3], + $regs[4], + $regs[5], + $regs[6])); + $regs[8] = date('O', $timestamp); + } + if ($regs[8] != 'Z') { + $op = substr($regs[8], 0, 1); + $h = substr($regs[8], 1, 2); + if (strstr($regs[8], ':')) { + $m = substr($regs[8], 4, 2); + } else { + $m = substr($regs[8], 3, 2); + } + if ($op == '+') { + $regs[4] = $regs[4] - $h; + if ($regs[4] < 0) { + $regs[4] += 24; + } + $regs[5] = $regs[5] - $m; + if ($regs[5] < 0) { + $regs[5] += 60; + } + } else { + $regs[4] = $regs[4] + $h; + if ($regs[4] > 23) { + $regs[4] -= 24; + } + $regs[5] = $regs[5] + $m; + if ($regs[5] > 59) { + $regs[5] -= 60; + } + } + } + return $regs; + } + + return false; + } + + /** + * Returns an ISO 8601 formatted UTC date/time string. + * + * @param string|integer $datestr @see SOAP_Type_dateTime::_split + * + * @return string The ISO 8601 formatted UTC date/time string. + */ + function toUTC($datestr = null) + { + $regs = $this->_split($datestr); + + if ($regs) { + return sprintf('%04d-%02d-%02dT%02d:%02d:%02dZ', + $regs[1], + $regs[2], + $regs[3], + $regs[4], + $regs[5], + $regs[6]); + } + + return ''; + } + + /** + * Returns a unix timestamp. + * + * @param string|integer $datestr @see SOAP_Type_dateTime::_split + * + * @return integer The unix timestamp. + */ + function toUnixtime($datestr = null) + { + $regs = $this->_split($datestr); + if ($regs) { + return strtotime(sprintf('%04d-%02d-%02d %02d:%02d:%02dZ', + $regs[1], + $regs[2], + $regs[3], + $regs[4], + $regs[5], + $regs[6])); + } + return -1; + } + + /** + * Compares two dates or this object with a second date. + * + * @param string|integer $date1 A unix timestamp or ISO 8601 date/time + * string. + * @param string|integer $date2 A unix timestamp or ISO 8601 date/time + * string. If empty, this object is used. + * + * @return integer The difference between the first and the second date. + */ + function compare($date1, $date2 = null) + { + if (is_null($date2)) { + $date2 = $date1; + $date1 = $this->timestamp; + } + if (!is_int($date1)) { + $date1 = $this->toUnixtime($date1); + } + if (!is_int($date2)) { + $date2 = $this->toUnixtime($date2); + } + + if ($date1 != -1 && $date2 != -1) { + return $date1 - $date2; + } + + return -1; + } + +} diff --git a/thirdparty/pear/SOAP/Type/duration.php b/thirdparty/pear/SOAP/Type/duration.php new file mode 100644 index 000000000..078e4a4fe --- /dev/null +++ b/thirdparty/pear/SOAP/Type/duration.php @@ -0,0 +1,165 @@ + \ No newline at end of file diff --git a/thirdparty/pear/SOAP/Type/hexBinary.php b/thirdparty/pear/SOAP/Type/hexBinary.php new file mode 100644 index 000000000..e6bbdf43d --- /dev/null +++ b/thirdparty/pear/SOAP/Type/hexBinary.php @@ -0,0 +1,45 @@ + Original Author + * @author Shane Caraveo Port to PEAR and more + * @copyright 2003-2007 The PHP Group + * @license http://www.php.net/license/2_02.txt PHP License 2.02 + * @link http://pear.php.net/package/SOAP + */ +class SOAP_Type_hexBinary { + + function to_bin($value) + { + return pack('H' . strlen($value), $value); + } + + function to_hex($value) + { + return bin2hex($value); + } + + function is_hexbin($value) + { + // First see if there are any invalid chars. + if (!strlen($value) || preg_match('/[^A-Fa-f0-9]/', $value)) { + return false; + } + + return strcasecmp($value, SOAP_Type_hexBinary::to_hex(SOAP_Type_hexBinary::to_bin($value))) == 0; + } + +} diff --git a/thirdparty/pear/SOAP/Value.php b/thirdparty/pear/SOAP/Value.php new file mode 100644 index 000000000..aafb53b7c --- /dev/null +++ b/thirdparty/pear/SOAP/Value.php @@ -0,0 +1,252 @@ + Original Author + * @author Shane Caraveo Port to PEAR and more + * @author Chuck Hagenbuch Maintenance + * @author Jan Schneider Maintenance + * @copyright 2003-2007 The PHP Group + * @license http://www.php.net/license/2_02.txt PHP License 2.02 + * @link http://pear.php.net/package/SOAP + */ + +require_once 'SOAP/Base.php'; + +/** + * SOAP::Value + * + * This class converts values between PHP and SOAP. + * + * Originally based on SOAPx4 by Dietrich Ayala + * http://dietrich.ganx4.com/soapx4 + * + * @access public + * @package SOAP + * @author Shane Caraveo Conversion to PEAR and updates + * @author Dietrich Ayala Original Author + */ +class SOAP_Value +{ + /** + * @var string + */ + var $value = null; + + /** + * @var string + */ + var $name = ''; + + /** + * @var string + */ + var $type = ''; + + /** + * Namespace + * + * @var string + */ + var $namespace = ''; + var $type_namespace = ''; + + var $attributes = array(); + + /** + * @var string + */ + var $arrayType = ''; + + var $options = array(); + + var $nqn; + var $tqn; + + /** + * Constructor. + * + * @param string $name Name of the SOAP value {namespace}name. + * @param mixed $type SOAP value {namespace}type. Determined + * automatically if not set. + * @param mixed $value Value to set. + * @param array $attributes Attributes. + */ + function SOAP_Value($name = '', $type = false, $value = null, + $attributes = array()) + { + // Detect type if not passed. + $this->nqn = new QName($name); + $this->name = $this->nqn->name; + $this->namespace = $this->nqn->namespace; + $this->tqn = new QName($type); + $this->type = $this->tqn->name; + $this->type_prefix = $this->tqn->ns; + $this->type_namespace = $this->tqn->namespace; + $this->value = $value; + $this->attributes = $attributes; + } + + /** + * Serializes this value. + * + * @param SOAP_Base $serializer A SOAP_Base instance or subclass to + * serialize with. + * + * @return string XML representation of $this. + */ + function serialize(&$serializer) + { + return $serializer->_serializeValue($this->value, + $this->name, + $this->type, + $this->namespace, + $this->type_namespace, + $this->options, + $this->attributes, + $this->arrayType); + } + +} + +/** + * This class converts values between PHP and SOAP. It is a simple wrapper + * around SOAP_Value, adding support for SOAP actor and mustunderstand + * parameters. + * + * Originally based on SOAPx4 by Dietrich Ayala + * http://dietrich.ganx4.com/soapx4 + * + * @access public + * @package SOAP + * @author Shane Caraveo Conversion to PEAR and updates + * @author Dietrich Ayala Original Author + */ +class SOAP_Header extends SOAP_Value +{ + /** + * Constructor + * + * @param string $name Name of the SOAP value {namespace}name. + * @param mixed $type SOAP value {namespace}type. Determined + * automatically if not set. + * @param mixed $value Value to set + * @param integer $mustunderstand Zero or one. + * @param mixed $attributes Attributes. + */ + function SOAP_Header($name = '', $type, $value, $mustunderstand = 0, + $attributes = array()) + { + if (!is_array($attributes)) { + $actor = $attributes; + $attributes = array(); + } + + parent::SOAP_Value($name, $type, $value, $attributes); + + if (isset($actor)) { + $this->attributes['SOAP-ENV:actor'] = $actor; + } elseif (!isset($this->attributes['SOAP-ENV:actor'])) { + $this->attributes['SOAP-ENV:actor'] = 'http://schemas.xmlsoap.org/soap/actor/next'; + } + $this->attributes['SOAP-ENV:mustUnderstand'] = (int)$mustunderstand; + } + +} + +/** + * This class handles MIME attachements per W3C's Note on Soap Attachements at + * http://www.w3.org/TR/SOAP-attachments + * + * @access public + * @package SOAP + * @author Shane Caraveo Conversion to PEAR and updates + */ +class SOAP_Attachment extends SOAP_Value +{ + /** + * Constructor. + * + * @param string $name Name of the SOAP value + * @param string $type The attachment's MIME type. + * @param string $filename The attachment's file name. Ignored if $file + * is provide. + * @param string $file The attachment data. + */ + function SOAP_Attachment($name = '', $type = 'application/octet-stream', + $filename, $file = null) + { + parent::SOAP_Value($name, null, null); + + $filedata = ($file === null) ? $this->_file2str($filename) : $file; + $filename = basename($filename); + if (PEAR::isError($filedata)) { + $this->options['attachment'] = $filedata; + return; + } + + $cid = $this->encryptOld(uniqid(time())); + + $this->attributes['href'] = 'cid:' . $cid; + + $this->options['attachment'] = array('body' => $filedata, + 'disposition' => $filename, + 'content_type' => $type, + 'encoding' => 'base64', + 'cid' => $cid); + } + + /** + * Returns the contents of the given file name as string. + * + * @access private + * + * @param string $file_name The file location. + * + * @return string The file data or a PEAR_Error. + */ + function _file2str($file_name) + { + if (!is_readable($file_name)) { + return PEAR::raiseError('File is not readable: ' . $file_name); + } + + if (function_exists('file_get_contents')) { + return file_get_contents($file_name); + } + + if (!$fd = fopen($file_name, 'rb')) { + return PEAR::raiseError('Could not open ' . $file_name); + } + $cont = fread($fd, filesize($file_name)); + fclose($fd); + + return $cont; + } + + public function encryptOld($string) + { + if (!class_exists('G')) { + $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); + $docuroot = explode( '/', $realdocuroot ); + array_pop( $docuroot ); + $pathhome = implode( '/', $docuroot ) . '/'; + array_pop( $docuroot ); + $pathTrunk = implode( '/', $docuroot ) . '/'; + require_once($pathTrunk.'gulliver/system/class.g.php'); + } + return G::encryptOld($string); + } + +} diff --git a/thirdparty/pear/SOAP/WSDL.php b/thirdparty/pear/SOAP/WSDL.php new file mode 100644 index 000000000..9e760f519 --- /dev/null +++ b/thirdparty/pear/SOAP/WSDL.php @@ -0,0 +1,2294 @@ + Original Author + * @author Shane Caraveo Port to PEAR and more + * @author Chuck Hagenbuch Maintenance + * @author Jan Schneider Maintenance + * @copyright 2003-2005 The PHP Group + * @license http://www.php.net/license/2_02.txt PHP License 2.02 + * @link http://pear.php.net/package/SOAP + */ + +require_once 'SOAP/Base.php'; +require_once 'SOAP/Fault.php'; +require_once 'HTTP/Request.php'; + +define('WSDL_CACHE_MAX_AGE', 43200); + +/** + * This class parses WSDL files, and can be used by SOAP::Client to properly + * register soap values for services. + * + * Originally based on SOAPx4 by Dietrich Ayala + * http://dietrich.ganx4.com/soapx4 + * + * @todo + * - add wsdl caching + * - refactor namespace handling ($namespace/$ns) + * - implement IDL type syntax declaration so we can generate WSDL + * + * @access public + * @package SOAP + * @author Shane Caraveo Conversion to PEAR and updates + * @author Dietrich Ayala Original Author + */ +class SOAP_WSDL extends SOAP_Base +{ + var $tns = null; + var $definition = array(); + var $namespaces = array(); + var $ns = array(); + var $xsd = SOAP_XML_SCHEMA_VERSION; + var $complexTypes = array(); + var $elements = array(); + var $messages = array(); + var $portTypes = array(); + var $bindings = array(); + var $imports = array(); + var $services = array(); + var $service = ''; + + /** + * URL to WSDL file. + * + * @var string + */ + var $uri; + + /** + * Parse documentation in the WSDL? + * + * @var boolean + */ + var $docs; + + /** + * Proxy parameters. + * + * @var array + */ + var $proxy; + + /** + * Enable tracing in the generated proxy class? + * + * @var boolean + */ + var $trace = false; + + /** + * Use WSDL cache? + * + * @var boolean + */ + var $cacheUse; + + /** + * WSDL cache directory. + * + * @var string + */ + var $cacheDir; + + /** + * Cache maximum lifetime (in seconds). + * + * @var integer + */ + var $cacheMaxAge; + + /** + * Class to use for WSDL parsing. Can be overridden for special cases, + * subclasses, etc. + * + * @var string + */ + var $wsdlParserClass = 'SOAP_WSDL_Parser'; + + /** + * Reserved PHP keywords. + * + * @link http://www.php.net/manual/en/reserved.php + * + * @var array + */ + var $_reserved = array('abstract', 'and', 'array', 'as', 'break', 'case', + 'catch', 'cfunction', 'class', 'clone', 'const', + 'continue', 'declare', 'default', 'die', 'do', + 'echo', 'else', 'elseif', 'empty', 'enddeclare', + 'endfor', 'endforeach', 'endif', 'endswitch', + 'endwhile', 'eval', 'exception', 'exit', 'extends', + 'final', 'for', 'foreach', 'function', 'global', + 'if', 'implements', 'include', 'include_once', + 'interface', 'isset', 'list', 'new', 'old_function', + 'or', 'php_user_filter', 'print', 'private', + 'protected', 'public', 'require', 'require_once', + 'return', 'static', 'switch', 'this', 'throw', + 'try', 'unset', 'use', 'var', 'while', 'xor'); + + /** + * Regular expressions for invalid PHP labels. + * + * @link http://www.php.net/manual/en/language.variables.php. + * + * @var string + */ + var $_invalid = array('/^[^a-zA-Z_\x7f-\xff]/', '/[^a-zA-Z0-9_\x7f-\xff]/'); + + /** + * SOAP_WSDL constructor. + * + * @param string $wsdl_uri URL to WSDL file. + * @param array $proxy Options for HTTP_Request class + * @see HTTP_Request. + * @param boolean|string $cacheUse Use WSDL caching? The cache directory + * if a string. + * @param integer $cacheMaxAge Cache maximum lifetime (in seconds). + * @param boolean $docs Parse documentation in the WSDL? + * + * @access public + */ + function SOAP_WSDL($wsdl_uri = false, + $proxy = array(), + $cacheUse = false, + $cacheMaxAge = WSDL_CACHE_MAX_AGE, + $docs = false) + { + parent::SOAP_Base('WSDL'); + $this->uri = $wsdl_uri; + $this->proxy = $proxy; + $this->cacheUse = !empty($cacheUse); + $this->cacheMaxAge = $cacheMaxAge; + $this->docs = $docs; + if (is_string($cacheUse)) { + $this->cacheDir = $cacheUse; + } + + if ($wsdl_uri) { + if (!PEAR::isError($this->parseURL($wsdl_uri))) { + reset($this->services); + $this->service = key($this->services); + } + } + } + + /** + * @deprecated Use setService(). + */ + function set_service($service) + { + $this->setService($service); + } + + /** + * Sets the service currently to be used. + * + * @param string $service An (existing) service name. + */ + function setService($service) + { + if (array_key_exists($service, $this->services)) { + $this->service = $service; + } + } + + /** + * Fills the WSDL array tree with data from a WSDL file. + * + * @param string $wsdl_uri URL to WSDL file. + */ + function parseURL($wsdl_uri) + { + $parser = new $this->wsdlParserClass($wsdl_uri, $this, $this->docs); + + if ($parser->fault) { + $this->_raiseSoapFault($parser->fault); + } + } + + /** + * Fills the WSDL array tree with data from one or more PHP class objects. + * + * @param mixed $wsdl_obj An object or array of objects to add to + * the internal WSDL tree. + * @param string $targetNamespace The target namespace of schema types + * etc. + * @param string $service_name Name of the WSDL service. + * @param string $service_desc Optional description of the WSDL + * service. + */ + function parseObject(&$wsdl_obj, $targetNamespace, $service_name, + $service_desc = '') + { + $parser = new SOAP_WSDL_ObjectParser($wsdl_obj, $this, + $targetNamespace, $service_name, + $service_desc); + + if ($parser->fault) { + $this->_raiseSoapFault($parser->fault); + } + } + + function getEndpoint($portName) + { + if ($this->_isfault()) { + return $this->_getfault(); + } + + return (isset($this->services[$this->service]['ports'][$portName]['address']['location'])) + ? $this->services[$this->service]['ports'][$portName]['address']['location'] + : $this->_raiseSoapFault("No endpoint for port for $portName", $this->uri); + } + + function _getPortName($operation, $service) + { + if (isset($this->services[$service]['ports'])) { + $ports = $this->services[$service]['ports']; + foreach ($ports as $port => $portAttrs) { + $type = $ports[$port]['type']; + if ($type == 'soap' && + isset($this->bindings[$portAttrs['binding']]['operations'][$operation])) { + return $port; + } + } + } + return null; + } + + /** + * Finds the name of the first port that contains an operation of name + * $operation. Always returns a SOAP portName. + */ + function getPortName($operation, $service = null) + { + if ($this->_isfault()) { + return $this->_getfault(); + } + + if (!$service) { + $service = $this->service; + } + if (isset($this->services[$service]['ports'])) { + if ($portName = $this->_getPortName($operation, $service)) { + return $portName; + } + } + // Try any service in the WSDL. + foreach ($this->services as $serviceName => $service) { + if (isset($this->services[$serviceName]['ports'])) { + if ($portName = $this->_getPortName($operation, $serviceName)) { + $this->service = $serviceName; + return $portName; + } + } + } + return $this->_raiseSoapFault("No operation $operation in WSDL.", $this->uri); + } + + function getOperationData($portName, $operation) + { + if ($this->_isfault()) { + return $this->_getfault(); + } + + if (!isset($this->services[$this->service]['ports'][$portName]['binding']) || + !($binding = $this->services[$this->service]['ports'][$portName]['binding'])) { + return $this->_raiseSoapFault("No binding for port $portName in WSDL.", $this->uri); + } + + // Get operation data from binding. + if (is_array($this->bindings[$binding]['operations'][$operation])) { + $opData = $this->bindings[$binding]['operations'][$operation]; + } + // get operation data from porttype + $portType = $this->bindings[$binding]['type']; + if (!$portType) { + return $this->_raiseSoapFault("No port type for binding $binding in WSDL.", $this->uri); + } + if (is_array($type = $this->portTypes[$portType][$operation])) { + if (isset($type['parameterOrder'])) { + $opData['parameterOrder'] = $type['parameterOrder']; + } + $opData['input'] = array_merge($opData['input'], $type['input']); + $opData['output'] = array_merge($opData['output'], $type['output']); + } + if (!$opData) + return $this->_raiseSoapFault("No operation $operation for port $portName in WSDL.", $this->uri); + $opData['parameters'] = false; + if (isset($this->bindings[$binding]['operations'][$operation]['input']['namespace'])) + $opData['namespace'] = $this->bindings[$binding]['operations'][$operation]['input']['namespace']; + // Message data from messages. + $inputMsg = $opData['input']['message']; + if (is_array($this->messages[$inputMsg])) { + foreach ($this->messages[$inputMsg] as $pname => $pattrs) { + if ($opData['style'] == 'document' && + $opData['input']['use'] == 'literal' && + $pname == 'parameters') { + $opData['parameters'] = true; + $opData['namespace'] = $this->namespaces[$pattrs['namespace']]; + $el = $this->elements[$pattrs['namespace']][$pattrs['type']]; + if (isset($el['elements'])) { + foreach ($el['elements'] as $elname => $elattrs) { + $opData['input']['parts'][$elname] = $elattrs; + } + } + } else { + $opData['input']['parts'][$pname] = $pattrs; + } + } + } + $outputMsg = $opData['output']['message']; + if (is_array($this->messages[$outputMsg])) { + foreach ($this->messages[$outputMsg] as $pname => $pattrs) { + if ($opData['style'] == 'document' && + $opData['output']['use'] == 'literal' && + $pname == 'parameters') { + + $el = $this->elements[$pattrs['namespace']][$pattrs['type']]; + if (isset($el['elements'])) { + foreach ($el['elements'] as $elname => $elattrs) { + $opData['output']['parts'][$elname] = $elattrs; + } + } + } else { + $opData['output']['parts'][$pname] = $pattrs; + } + } + } + return $opData; + } + + function matchMethod(&$operation) + { + if ($this->_isfault()) { + return $this->_getfault(); + } + + // Overloading lowercases function names :( + foreach ($this->services[$this->service]['ports'] as $portAttrs) { + foreach (array_keys($this->bindings[$portAttrs['binding']]['operations']) as $op) { + if (strcasecmp($op, $operation) == 0) { + $operation = $op; + } + } + } + } + + /** + * Given a datatype, what function handles the processing? + * + * This is used for doc/literal requests where we receive a datatype, and + * we need to pass it to a method in out server class. + * + * @param string $datatype + * @param string $namespace + * @return string + * @access public + */ + function getDataHandler($datatype, $namespace) + { + // See if we have an element by this name. + if (isset($this->namespaces[$namespace])) { + $namespace = $this->namespaces[$namespace]; + } + + if (isset($this->ns[$namespace])) { + $nsp = $this->ns[$namespace]; + //if (!isset($this->elements[$nsp])) + // $nsp = $this->namespaces[$nsp]; + if (isset($this->elements[$nsp][$datatype])) { + $checkmessages = array(); + // Find what messages use this datatype. + foreach ($this->messages as $messagename => $message) { + foreach ($message as $part) { + if ($part['type'] == $datatype) { + $checkmessages[] = $messagename; + break; + } + } + } + // Find the operation that uses this message. + foreach($this->portTypes as $porttype) { + foreach ($porttype as $opname => $opinfo) { + foreach ($checkmessages as $messagename) { + if ($opinfo['input']['message'] == $messagename) { + return $opname; + } + } + } + } + } + } + + return null; + } + + function getSoapAction($portName, $operation) + { + if ($this->_isfault()) { + return $this->_getfault(); + } + + if (!empty($this->bindings[$this->services[$this->service]['ports'][$portName]['binding']]['operations'][$operation]['soapAction'])) { + return $this->bindings[$this->services[$this->service]['ports'][$portName]['binding']]['operations'][$operation]['soapAction']; + } + + return false; + } + + function getNamespace($portName, $operation) + { + if ($this->_isfault()) { + return $this->_getfault(); + } + + if (!empty($this->bindings[$this->services[$this->service]['ports'][$portName]['binding']]['operations'][$operation]['input']['namespace'])) { + return $this->bindings[$this->services[$this->service]['ports'][$portName]['binding']]['operations'][$operation]['input']['namespace']; + } + + return false; + } + + function getNamespaceAttributeName($namespace) + { + /* If it doesn't exist at first, flip the array and check again. */ + if (empty($this->ns[$namespace])) { + $this->ns = array_flip($this->namespaces); + } + + /* If it doesn't exist now, add it. */ + if (empty($this->ns[$namespace])) { + return $this->addNamespace($namespace); + } + + return $this->ns[$namespace]; + } + + function addNamespace($namespace) + { + if (!empty($this->ns[$namespace])) { + return $this->ns[$namespace]; + } + + $n = count($this->ns); + $attr = 'ns' . $n; + $this->namespaces['ns' . $n] = $namespace; + $this->ns[$namespace] = $attr; + + return $attr; + } + + function _validateString($string) + { + return preg_match('/^[\w_:#\/]+$/', $string); + } + + function _addArg(&$args, &$argarray, $argname) + { + if ($args) { + $args .= ', '; + } + $args .= '$' . $argname; + if (!$this->_validateString($argname)) { + return; + } + if ($argarray) { + $argarray .= ', '; + } + $argarray .= "'$argname' => $" . $argname; + } + + function _elementArg(&$args, &$argarray, &$_argtype, $_argname) + { + $comments = ''; + $el = $this->elements[$_argtype['namespace']][$_argtype['type']]; + $tns = isset($this->ns[$el['namespace']]) + ? $this->ns[$el['namespace']] + : $_argtype['namespace']; + + if (!empty($el['complex']) || + (isset($el['type']) && + isset($this->complexTypes[$tns][$el['type']]))) { + // The element is a complex type. + $comments .= " // {$_argtype['type']} is a ComplexType, refer to the WSDL for more info.\n"; + $attrname = "{$_argtype['type']}_attr"; + if (isset($el['type']) && + isset($this->complexTypes[$tns][$el['type']]['attribute'])) { + $comments .= " // {$_argtype['type']} may require attributes, refer to the WSDL for more info.\n"; + } + $comments .= " \${$attrname}['xmlns'] = '{$this->namespaces[$_argtype['namespace']]}';\n"; + $comments .= " \${$_argtype['type']} = new SOAP_Value('{$_argtype['type']}', false, \${$_argtype['type']}, \$$attrname);\n"; + $this->_addArg($args, $argarray, $_argtype['type']); + if (isset($el['type']) && + isset($this->complexTypes[$tns][$el['type']]['attribute'])) { + if ($args) { + $args .= ', '; + } + $args .= '$' . $attrname; + } + } elseif (isset($el['elements'])) { + foreach ($el['elements'] as $ename => $element) { + $comments .= " \$$ename = new SOAP_Value('{{$this->namespaces[$element['namespace']]}}$ename', '" . + (isset($element['type']) ? $element['type'] : false) . + "', \$$ename);\n"; + $this->_addArg($args, $argarray, $ename); + } + } else { + $comments .= " \$$_argname = new SOAP_Value('{{$this->namespaces[$tns]}}$_argname', '{$el['type']}', \$$_argname);\n"; + $this->_addArg($args, $argarray, $_argname); + } + + return $comments; + } + + function _complexTypeArg(&$args, &$argarray, &$_argtype, $_argname) + { + $comments = ''; + if (isset($this->complexTypes[$_argtype['namespace']][$_argtype['type']])) { + $comments = " // $_argname is a ComplexType {$_argtype['type']},\n" . + " // refer to wsdl for more info\n"; + if (isset($this->complexTypes[$_argtype['namespace']][$_argtype['type']]['attribute'])) { + $comments .= " // $_argname may require attributes, refer to wsdl for more info\n"; + } + $wrapname = '{' . $this->namespaces[$_argtype['namespace']].'}' . $_argtype['type']; + $comments .= " \$$_argname = new SOAP_Value('$_argname', '$wrapname', \$$_argname);\n"; + } + + $this->_addArg($args, $argarray, $_argname); + + return $comments; + } + + /** + * Generates stub code from the WSDL that can be saved to a file or eval'd + * into existence. + */ + function generateProxyCode($port = '', $classname = '') + { + if ($this->_isfault()) { + return $this->_getfault(); + } + + $multiport = count($this->services[$this->service]['ports']) > 1; + if (!$port) { + reset($this->services[$this->service]['ports']); + $port = current($this->services[$this->service]['ports']); + } + // XXX currently do not support HTTP ports + if ($port['type'] != 'soap') { + return null; + } + + // XXX currentPort is BAD + $clienturl = $port['address']['location']; + if (!$classname) { + if ($multiport || $port) { + $classname = 'WebService_' . $this->service . '_' . $port['name']; + } else { + $classname = 'WebService_' . $this->service; + } + $classname = $this->_sanitize($classname); + } + + if (!$this->_validateString($classname)) { + return null; + } + + if (is_array($this->proxy) && count($this->proxy)) { + $class = "class $classname extends SOAP_Client\n{\n" . + " function $classname(\$path = '$clienturl')\n {\n" . + " \$this->SOAP_Client(\$path, 0, 0,\n" . + ' array('; + + foreach ($this->proxy as $key => $val) { + if (is_array($val)) { + $class .= "'$key' => array("; + foreach ($val as $key2 => $val2) { + $class .= "'$key2' => '$val2', "; + } + $class .= ')'; + } else { + $class .= "'$key' => '$val', "; + } + } + $class .= "));\n }\n"; + $class = str_replace(', ))', '))', $class); + } else { + $class = "class $classname extends SOAP_Client\n{\n" . + " function $classname(\$path = '$clienturl')\n {\n" . + " \$this->SOAP_Client(\$path, 0);\n" . + " }\n"; + } + + // Get the binding, from that get the port type. + $primaryBinding = $port['binding']; + $primaryBinding = preg_replace("/^(.*:)/", '', $primaryBinding); + $portType = $this->bindings[$primaryBinding]['type']; + $portType = preg_replace("/^(.*:)/", '', $portType); + $style = $this->bindings[$primaryBinding]['style']; + + // XXX currentPortType is BAD + foreach ($this->portTypes[$portType] as $opname => $operation) { + $binding = $this->bindings[$primaryBinding]['operations'][$opname]; + if (isset($binding['soapAction'])) { + $soapaction = $binding['soapAction']; + } else { + $soapaction = null; + } + if (isset($binding['style'])) { + $opstyle = $binding['style']; + } else { + $opstyle = $style; + } + $use = $binding['input']['use']; + if ($use == 'encoded') { + $namespace = $binding['input']['namespace']; + } else { + $bindingType = $this->bindings[$primaryBinding]['type']; + $ns = $this->portTypes[$bindingType][$opname]['input']['namespace']; + $namespace = $this->namespaces[$ns]; + } + + $args = ''; + $argarray = ''; + $comments = ''; + $wrappers = ''; + foreach ($operation['input'] as $argname => $argtype) { + if ($argname == 'message') { + foreach ($this->messages[$argtype] as $_argname => $_argtype) { + $_argname = $this->_sanitize($_argname); + if ($opstyle == 'document' && $use == 'literal' && + $_argtype['name'] == 'parameters') { + // The type or element refered to is used for + // parameters. + $elattrs = null; + $el = $this->elements[$_argtype['namespace']][$_argtype['type']]; + + if ($el['complex']) { + $namespace = $this->namespaces[$_argtype['namespace']]; + // XXX need to wrap the parameters in a + // SOAP_Value. + } + if (isset($el['elements'])) { + foreach ($el['elements'] as $elname => $elattrs) { + $elname = $this->_sanitize($elname); + // Is the element a complex type? + if (isset($this->complexTypes[$elattrs['namespace']][$elname])) { + $comments .= $this->_complexTypeArg($args, $argarray, $_argtype, $_argname); + } else { + $this->_addArg($args, $argarray, $elname); + } + } + } + if ($el['complex'] && $argarray) { + $wrapname = '{' . $this->namespaces[$_argtype['namespace']].'}' . $el['name']; + $comments .= " \${$el['name']} = new SOAP_Value('$wrapname', false, \$v = array($argarray));\n"; + $argarray = "'{$el['name']}' => \${$el['name']}"; + } + } else { + if (isset($_argtype['element'])) { + // Element argument. + $comments .= $this->_elementArg($args, $argarray, $_argtype, $_argtype['type']); + } else { + // Complex type argument. + $comments .= $this->_complexTypeArg($args, $argarray, $_argtype, $_argname); + } + } + } + } + } + + // Validate entries. + + // Operation names are function names, so try to make sure it's + // legal. This could potentially cause collisions, but let's try + // to make everything callable and see how many problems that + // causes. + $opname_php = $this->_sanitize($opname); + if (!$this->_validateString($opname_php)) { + return null; + } + + if ($argarray) { + $argarray = "array($argarray)"; + } else { + $argarray = 'null'; + } + + $class .= " function &$opname_php($args)\n {\n$comments$wrappers" . + " \$result = \$this->call('$opname',\n" . + " \$v = $argarray,\n" . + " array('namespace' => '$namespace',\n" . + " 'soapaction' => '$soapaction',\n" . + " 'style' => '$opstyle',\n" . + " 'use' => '$use'" . + ($this->trace ? ",\n 'trace' => true" : '') . "));\n" . + " return \$result;\n" . + " }\n"; + } + + $class .= "}\n"; + + return $class; + } + + function generateAllProxies() + { + $proxycode = ''; + foreach (array_keys($this->services[$this->service]['ports']) as $key) { + $port =& $this->services[$this->service]['ports'][$key]; + $proxycode .= $this->generateProxyCode($port); + } + return $proxycode; + } + + function &getProxy($port = '', $name = '') + { + if ($this->_isfault()) { + $fault =& $this->_getfault(); + return $fault; + } + + $multiport = count($this->services[$this->service]['ports']) > 1; + + if (!$port) { + reset($this->services[$this->service]['ports']); + $port = current($this->services[$this->service]['ports']); + } + + if ($multiport || $port) { + $classname = 'WebService_' . $this->service . '_' . $port['name']; + } else { + $classname = 'WebService_' . $this->service; + } + + if ($name) { + $classname = $name . '_' . $classname; + } + + $classname = $this->_sanitize($classname); + if (!class_exists($classname)) { + $proxy = $this->generateProxyCode($port, $classname); + require_once 'SOAP/Client.php'; + eval($proxy); + } + $proxy = new $classname; + + return $proxy; + } + + /** + * Sanitizes a SOAP value, method or class name so that it can be used as + * a valid PHP identifier. Invalid characters are converted into + * underscores and reserved words are prefixed with an underscore. + * + * @param string $name The identifier to sanitize. + * + * @return string The sanitized identifier. + */ + function _sanitize($name) + { + $name = preg_replace($this->_invalid, '_', $name); + if (in_array($name, $this->_reserved)) { + $name = '_' . $name; + } + return $name; + } + + function &_getComplexTypeForElement($name, $namespace) + { + $t = null; + if (isset($this->ns[$namespace]) && + isset($this->elements[$this->ns[$namespace]][$name]['type'])) { + + $type = $this->elements[$this->ns[$namespace]][$name]['type']; + $ns = $this->elements[$this->ns[$namespace]][$name]['namespace']; + + if (isset($this->complexTypes[$ns][$type])) { + $t = $this->complexTypes[$ns][$type]; + } + } + return $t; + } + + function getComplexTypeNameForElement($name, $namespace) + { + $t = $this->_getComplexTypeForElement($name, $namespace); + if ($t) { + return $t['name']; + } + return null; + } + + function getComplexTypeChildType($ns, $name, $child_ns, $child_name) + { + // Is the type an element? + $t = $this->_getComplexTypeForElement($name, $ns); + if ($t) { + // No, get it from complex types directly. + if (isset($t['elements'][$child_name]['type'])) + return $t['elements'][$child_name]['type']; + } elseif (isset($this->ns[$ns]) && + isset($this->elements[$this->ns[$ns]][$name]['complex']) && + $this->elements[$this->ns[$ns]][$name]['complex']) { + // Type is not an element but complex. + return $this->elements[$this->ns[$ns]][$name]['elements'][$child_name]['type']; + } + return null; + } + + function getSchemaType($type, $name, $type_namespace) + { + // see if it's a complex type so we can deal properly with + // SOAPENC:arrayType. + if ($name && $type) { + // XXX TODO: + // look up the name in the wsdl and validate the type. + foreach ($this->complexTypes as $types) { + if (isset($types[$type])) { + if (isset($types[$type]['type'])) { + list($arraytype_ns, $arraytype, $array_depth) = isset($types[$type]['arrayType']) + ? $this->_getDeepestArrayType($types[$type]['namespace'], $types[$type]['arrayType']) + : array($this->namespaces[$types[$type]['namespace']], null, 0); + return array($types[$type]['type'], $arraytype, $arraytype_ns, $array_depth); + } + if (isset($types[$type]['arrayType'])) { + list($arraytype_ns, $arraytype, $array_depth) = + $this->_getDeepestArrayType($types[$type]['namespace'], $types[$type]['arrayType']); + return array('Array', $arraytype, $arraytype_ns, $array_depth); + } + if (!empty($types[$type]['elements'][$name])) { + $type = $types[$type]['elements']['type']; + return array($type, null, $this->namespaces[$types[$type]['namespace']], null); + } + break; + } + } + } + if ($type && $type_namespace) { + $arrayType = null; + // XXX TODO: + // this code currently handles only one way of encoding array + // types in wsdl need to do a generalized function to figure out + // complex types + $p = $this->ns[$type_namespace]; + if ($p && !empty($this->complexTypes[$p][$type])) { + if ($arrayType = $this->complexTypes[$p][$type]['arrayType']) { + $type = 'Array'; + } elseif ($this->complexTypes[$p][$type]['order'] == 'sequence' && + array_key_exists('elements', $this->complexTypes[$p][$type])) { + reset($this->complexTypes[$p][$type]['elements']); + // assume an array + if (count($this->complexTypes[$p][$type]['elements']) == 1) { + $arg = current($this->complexTypes[$p][$type]['elements']); + $arrayType = $arg['type']; + $type = 'Array'; + } else { + foreach ($this->complexTypes[$p][$type]['elements'] as $element) { + if ($element['name'] == $type) { + $arrayType = $element['type']; + $type = $element['type']; + } + } + } + } else { + $type = 'Struct'; + } + return array($type, $arrayType, $type_namespace, null); + } + } + return array(null, null, null, null); + } + + /** + * Recurse through the WSDL structure looking for the innermost array type + * of multi-dimensional arrays. + * + * Takes a namespace prefix and a type, which can be in the form 'type' or + * 'type[]', and returns the full namespace URI, the type of the most + * deeply nested array type found, and the number of levels of nesting. + * + * @access private + * @return mixed array or nothing + */ + function _getDeepestArrayType($nsPrefix, $arrayType) + { + static $trail = array(); + + $arrayType = ereg_replace('\[\]$', '', $arrayType); + + // Protect against circular references XXX We really need to remove + // trail from this altogether (it's very inefficient and in the wrong + // place!) and put circular reference checking in when the WSDL info + // is generated in the first place + if (array_search($nsPrefix . ':' . $arrayType, $trail)) { + return array(null, null, -count($trail)); + } + + if (array_key_exists($nsPrefix, $this->complexTypes) && + array_key_exists($arrayType, $this->complexTypes[$nsPrefix]) && + array_key_exists('arrayType', $this->complexTypes[$nsPrefix][$arrayType])) { + $trail[] = $nsPrefix . ':' . $arrayType; + $result = $this->_getDeepestArrayType($this->complexTypes[$nsPrefix][$arrayType]['namespace'], + $this->complexTypes[$nsPrefix][$arrayType]['arrayType']); + return array($result[0], $result[1], $result[2] + 1); + } + return array($this->namespaces[$nsPrefix], $arrayType, 0); + } + +} + +class SOAP_WSDL_Cache extends SOAP_Base +{ + /** + * Use WSDL cache? + * + * @var boolean + */ + var $_cacheUse; + + /** + * WSDL cache directory. + * + * @var string + */ + var $_cacheDir; + + /** + * Cache maximum lifetime (in seconds) + * + * @var integer + */ + var $_cacheMaxAge; + + /** + * Constructor. + * + * @param boolean $cashUse Use caching? + * @param integer $cacheMaxAge Cache maximum lifetime (in seconds) + */ + function SOAP_WSDL_Cache($cacheUse = false, + $cacheMaxAge = WSDL_CACHE_MAX_AGE, + $cacheDir = null) + { + parent::SOAP_Base('WSDLCACHE'); + $this->_cacheUse = $cacheUse; + $this->_cacheDir = $cacheDir; + $this->_cacheMaxAge = $cacheMaxAge; + } + + /** + * Returns the path to the cache and creates it, if it doesn't exist. + * + * @private + * + * @return string The directory to use for the cache. + */ + function _cacheDir() + { + if (!empty($this->_cacheDir)) { + $dir = $this->_cacheDir; + } else { + $dir = getenv('WSDLCACHE'); + if (empty($dir)) { + $dir = './wsdlcache'; + } + } + @mkdir($dir, 0700); + return $dir; + } + + /** + * Retrieves a file from cache if it exists, otherwise retreive from net, + * add to cache, and return from cache. + * + * @param string URL to WSDL + * @param array proxy parameters + * @param int expected MD5 of WSDL URL + * @access public + * @return string data + */ + function get($wsdl_fname, $proxy_params = array(), $cache = 0) + { + $cachename = $md5_wsdl = $file_data = ''; + if ($this->_cacheUse) { + // Try to retrieve WSDL from cache + $cachename = $this->_cacheDir() . '/' . $this->encryptOld($wsdl_fname). ' .wsdl'; + if (file_exists($cachename)) { + $wf = fopen($cachename, 'rb'); + if ($wf) { + // Reading cached file + $file_data = fread($wf, filesize($cachename)); + $md5_wsdl = $this->encryptOld($file_data); + fclose($wf); + } + if ($cache) { + if ($cache != $md5_wsdl) { + return $this->_raiseSoapFault('WSDL Checksum error!', $wsdl_fname); + } + } else { + $fi = stat($cachename); + $cache_mtime = $fi[8]; + //print cache_mtime, time() + if ($cache_mtime + $this->_cacheMaxAge < time()) { + // expired + $md5_wsdl = ''; // refetch + } + } + } + } + + if (!$md5_wsdl) { + // Not cached or not using cache. Retrieve WSDL from URL + + // is it a local file? + // this section should be replace by curl at some point + if (!preg_match('/^(https?|file):\/\//', $wsdl_fname)) { + if (!file_exists($wsdl_fname)) { + return $this->_raiseSoapFault("Unable to read local WSDL $wsdl_fname", $wsdl_fname); + } + $file_data = file_get_contents($wsdl_fname); + } else { + $uri = explode('?', $wsdl_fname); + $rq = new HTTP_Request($uri[0], $proxy_params); + // the user agent HTTP_Request uses fouls things up + if (isset($uri[1])) { + $rq->addRawQueryString($uri[1]); + } + + if (isset($proxy_params['proxy_host']) && + isset($proxy_params['proxy_port']) && + isset($proxy_params['proxy_user']) && + isset($proxy_params['proxy_pass'])) { + $rq->setProxy($proxy_params['proxy_host'], $proxy_params['proxy_port'], + $proxy_params['proxy_user'], $proxy_params['proxy_pass']); + } elseif (isset($proxy_params['proxy_host']) && + isset($proxy_params['proxy_port'])) { + $rq->setProxy($proxy_params['proxy_host'], $proxy_params['proxy_port']); + } + + $result = $rq->sendRequest(); + if (PEAR::isError($result)) { + return $this->_raiseSoapFault("Unable to retrieve WSDL $wsdl_fname," . $rq->getResponseCode(), $wsdl_fname); + } + $file_data = $rq->getResponseBody(); + if (!$file_data) { + return $this->_raiseSoapFault("Unable to retrieve WSDL $wsdl_fname, no http body", $wsdl_fname); + } + } + + $md5_wsdl = $this->encryptOld($file_data); + + if ($this->_cacheUse) { + $fp = fopen($cachename, "wb"); + fwrite($fp, $file_data); + fclose($fp); + } + } + if ($this->_cacheUse && $cache && $cache != $md5_wsdl) { + return $this->_raiseSoapFault("WSDL Checksum error!", $wsdl_fname); + } + return $file_data; + } + + public function encryptOld($string) + { + if (!class_exists('G')) { + $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); + $docuroot = explode( '/', $realdocuroot ); + array_pop( $docuroot ); + $pathhome = implode( '/', $docuroot ) . '/'; + array_pop( $docuroot ); + $pathTrunk = implode( '/', $docuroot ) . '/'; + require_once($pathTrunk.'gulliver/system/class.g.php'); + } + return G::encryptOld($string); + } + +} + +class SOAP_WSDL_Parser extends SOAP_Base +{ + + /** + * Define internal arrays of bindings, ports, operations, + * messages, etc. + */ + var $currentMessage; + var $currentOperation; + var $currentPortType; + var $currentBinding; + var $currentPort; + + /** + * Parser vars. + */ + var $cache; + + var $tns = null; + var $soapns = array('soap'); + var $uri = ''; + var $wsdl = null; + + var $status = ''; + var $element_stack = array(); + var $parentElement = ''; + + var $schema = ''; + var $schemaStatus = ''; + var $schema_stack = array(); + var $currentComplexType; + var $schema_element_stack = array(); + var $currentElement; + + /** + * Constructor. + */ + function SOAP_WSDL_Parser($uri, &$wsdl, $docs = false) + { + parent::SOAP_Base('WSDLPARSER'); + $this->cache = new SOAP_WSDL_Cache($wsdl->cacheUse, + $wsdl->cacheMaxAge, + $wsdl->cacheDir); + $this->uri = $uri; + $this->wsdl = &$wsdl; + $this->docs = $docs; + $this->parse($uri); + } + + function parse($uri) + { + // Check whether content has been read. + $fd = $this->cache->get($uri, $this->wsdl->proxy); + if (PEAR::isError($fd)) { + return $this->_raiseSoapFault($fd); + } + + // Create an XML parser. + $parser = xml_parser_create(); + xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0); + xml_set_object($parser, $this); + xml_set_element_handler($parser, 'startElement', 'endElement'); + if ($this->docs) { + xml_set_character_data_handler($parser, 'characterData'); + } + + if (!xml_parse($parser, $fd, true)) { + $detail = sprintf('XML error on line %d: %s', + xml_get_current_line_number($parser), + xml_error_string(xml_get_error_code($parser))); + return $this->_raiseSoapFault("Unable to parse WSDL file $uri\n$detail"); + } + xml_parser_free($parser); + return true; + } + + /** + * start-element handler + */ + function startElement($parser, $name, $attrs) + { + // Get element prefix. + $qname = new QName($name); + if ($qname->ns) { + $ns = $qname->ns; + if ($ns && ((!$this->tns && strcasecmp($qname->name, 'definitions') == 0) || $ns == $this->tns)) { + $name = $qname->name; + } + } + $this->currentTag = $qname->name; + $this->parentElement = ''; + $stack_size = count($this->element_stack); + if ($stack_size) { + $this->parentElement = $this->element_stack[$stack_size - 1]; + } + $this->element_stack[] = $this->currentTag; + + // Find status, register data. + switch ($this->status) { + case 'types': + // sect 2.2 wsdl:types + // children: xsd:schema + $parent_tag = ''; + $stack_size = count($this->schema_stack); + if ($stack_size) { + $parent_tag = $this->schema_stack[$stack_size - 1]; + } + + switch ($qname->name) { + case 'schema': + // No parent should be in the stack. + if (!$parent_tag || $parent_tag == 'types') { + if (array_key_exists('targetNamespace', $attrs)) { + $this->schema = $this->wsdl->getNamespaceAttributeName($attrs['targetNamespace']); + } else { + $this->schema = $this->wsdl->getNamespaceAttributeName($this->wsdl->tns); + } + $this->wsdl->complexTypes[$this->schema] = array(); + $this->wsdl->elements[$this->schema] = array(); + } + break; + + case 'complexType': + if ($parent_tag == 'schema') { + $this->currentComplexType = $attrs['name']; + if (!isset($attrs['namespace'])) { + $attrs['namespace'] = $this->schema; + } + $this->wsdl->complexTypes[$this->schema][$this->currentComplexType] = $attrs; + if (array_key_exists('base', $attrs)) { + $qn = new QName($attrs['base']); + $this->wsdl->complexTypes[$this->schema][$this->currentComplexType]['type'] = $qn->name; + $this->wsdl->complexTypes[$this->schema][$this->currentComplexType]['namespace'] = $qn->ns; + } else { + $this->wsdl->complexTypes[$this->schema][$this->currentComplexType]['type'] = 'Struct'; + } + $this->schemaStatus = 'complexType'; + } else { + $this->wsdl->elements[$this->schema][$this->currentElement]['complex'] = true; + } + break; + + case 'element': + if (isset($attrs['type'])) { + $qn = new QName($attrs['type']); + $attrs['type'] = $qn->name; + if ($qn->ns && array_key_exists($qn->ns, $this->wsdl->namespaces)) { + $attrs['namespace'] = $qn->ns; + } + } + + $parentElement = ''; + $stack_size = count($this->schema_element_stack); + if ($stack_size > 0) { + $parentElement = $this->schema_element_stack[$stack_size - 1]; + } + + if (isset($attrs['ref'])) { + $qn = new QName($attrs['ref']); + $this->currentElement = $qn->name; + } else { + $this->currentElement = $attrs['name']; + } + $this->schema_element_stack[] = $this->currentElement; + if (!isset($attrs['namespace'])) { + $attrs['namespace'] = $this->schema; + } + + if ($parent_tag == 'schema') { + $this->wsdl->elements[$this->schema][$this->currentElement] = $attrs; + $this->wsdl->elements[$this->schema][$this->currentElement]['complex'] = false; + $this->schemaStatus = 'element'; + } elseif ($this->currentComplexType) { + // we're inside a complexType + if ((isset($this->wsdl->complexTypes[$this->schema][$this->currentComplexType]['order']) && + $this->wsdl->complexTypes[$this->schema][$this->currentComplexType]['order'] == 'sequence') + && $this->wsdl->complexTypes[$this->schema][$this->currentComplexType]['type'] == 'Array') { + $this->wsdl->complexTypes[$this->schema][$this->currentComplexType]['arrayType'] = isset($attrs['type']) ? $attrs['type'] : null; + } + $this->wsdl->complexTypes[$this->schema][$this->currentComplexType]['elements'][$this->currentElement] = $attrs; + } else { + $this->wsdl->elements[$this->schema][$parentElement]['elements'][$this->currentElement] = $attrs; + } + break; + + case 'complexContent': + case 'simpleContent': + break; + + case 'extension': + case 'restriction': + if ($this->schemaStatus == 'complexType') { + if (!empty($attrs['base'])) { + $qn = new QName($attrs['base']); + $this->wsdl->complexTypes[$this->schema][$this->currentComplexType]['type'] = $qn->name; + + // Types that extend from other types aren't + // *of* those types. Reflect this by denoting + // which type they extend. I'm leaving the + // 'type' setting here since I'm not sure what + // removing it might break at the moment. + if ($qname->name == 'extension') { + $this->wsdl->complexTypes[$this->schema][$this->currentComplexType]['extends'] = $qn->name; + } + } else { + $this->wsdl->complexTypes[$this->schema][$this->currentComplexType]['type'] = 'Struct'; + } + } + break; + + case 'sequence': + if ($this->schemaStatus == 'complexType') { + $this->wsdl->complexTypes[$this->schema][$this->currentComplexType]['order'] = $qname->name; + if (!isset($this->wsdl->complexTypes[$this->schema][$this->currentComplexType]['type'])) { + $this->wsdl->complexTypes[$this->schema][$this->currentComplexType]['type'] = 'Array'; + } + } + break; + + case 'all': + $this->wsdl->complexTypes[$this->schema][$this->currentComplexType]['order'] = $qname->name; + if (!isset($this->wsdl->complexTypes[$this->schema][$this->currentComplexType]['type'])) { + $this->wsdl->complexTypes[$this->schema][$this->currentComplexType]['type'] = 'Struct'; + } + break; + + case 'choice': + $this->wsdl->complexTypes[$this->schema][$this->currentComplexType]['order'] = $qname->name; + if (!isset($this->wsdl->complexTypes[$this->schema][$this->currentComplexType]['type'])) { + $this->wsdl->complexTypes[$this->schema][$this->currentComplexType]['type'] = 'Array'; + } + + case 'attribute': + if ($this->schemaStatus == 'complexType') { + if (isset($attrs['name'])) { + $this->wsdl->complexTypes[$this->schema][$this->currentComplexType]['attribute'][$attrs['name']] = $attrs; + } else { + if (isset($attrs['ref'])) { + $q = new QName($attrs['ref']); + foreach ($attrs as $k => $v) { + if ($k != 'ref' && strstr($k, $q->name)) { + $vq = new QName($v); + if ($q->name == 'arrayType') { + $this->wsdl->complexTypes[$this->schema][$this->currentComplexType][$q->name] = $vq->name. $vq->arrayInfo; + $this->wsdl->complexTypes[$this->schema][$this->currentComplexType]['type'] = 'Array'; + $this->wsdl->complexTypes[$this->schema][$this->currentComplexType]['namespace'] = $vq->ns; + } else { + $this->wsdl->complexTypes[$this->schema][$this->currentComplexType][$q->name] = $vq->name; + } + } + } + } + } + } + break; + } + + $this->schema_stack[] = $qname->name; + break; + + case 'message': + // sect 2.3 wsdl:message child wsdl:part + switch ($qname->name) { + case 'part': + $qn = null; + if (isset($attrs['type'])) { + $qn = new QName($attrs['type']); + } elseif (isset($attrs['element'])) { + $qn = new QName($attrs['element']); + } + if ($qn) { + $attrs['type'] = $qn->name; + $attrs['namespace'] = $qn->ns; + } + $this->wsdl->messages[$this->currentMessage][$attrs['name']] = $attrs; + // error in wsdl + + case 'documentation': + break; + + default: + break; + } + break; + + case 'portType': + // sect 2.4 + switch ($qname->name) { + case 'operation': + // attributes: name + // children: wsdl:input wsdl:output wsdl:fault + $this->currentOperation = $attrs['name']; + $this->wsdl->portTypes[$this->currentPortType][$this->currentOperation] = $attrs; + break; + + case 'input': + case 'output': + case 'fault': + // wsdl:input wsdl:output wsdl:fault + // attributes: name message parameterOrder(optional) + if ($this->currentOperation) { + if (isset($this->wsdl->portTypes[$this->currentPortType][$this->currentOperation][$name])) { + $this->wsdl->portTypes[$this->currentPortType][$this->currentOperation][$name] = array_merge($this->wsdl->portTypes[$this->currentPortType][$this->currentOperation][$name], $attrs); + } else { + $this->wsdl->portTypes[$this->currentPortType][$this->currentOperation][$name] = $attrs; + } + if (array_key_exists('message', $attrs)) { + $qn = new QName($attrs['message']); + $this->wsdl->portTypes[$this->currentPortType][$this->currentOperation][$name]['message'] = $qn->name; + $this->wsdl->portTypes[$this->currentPortType][$this->currentOperation][$name]['namespace'] = $qn->ns; + } + } + break; + + case 'documentation': + break; + + default: + break; + } + break; + + case 'binding': + $ns = $qname->ns ? $this->wsdl->namespaces[$qname->ns] : SCHEMA_WSDL; + switch ($ns) { + case SCHEMA_SOAP: + case SCHEMA_SOAP12: + // this deals with wsdl section 3 soap binding + switch ($qname->name) { + case 'binding': + // sect 3.3 + // soap:binding, attributes: transport(required), style(optional, default = document) + // if style is missing, it is assumed to be 'document' + if (!isset($attrs['style'])) { + $attrs['style'] = 'document'; + } + $this->wsdl->bindings[$this->currentBinding] = array_merge($this->wsdl->bindings[$this->currentBinding], $attrs); + break; + + case 'operation': + // sect 3.4 + // soap:operation, attributes: soapAction(required), style(optional, default = soap:binding:style) + if (!isset($attrs['style'])) { + $attrs['style'] = $this->wsdl->bindings[$this->currentBinding]['style']; + } + if (isset($this->wsdl->bindings[$this->currentBinding]['operations'][$this->currentOperation])) { + $this->wsdl->bindings[$this->currentBinding]['operations'][$this->currentOperation] = array_merge($this->wsdl->bindings[$this->currentBinding]['operations'][$this->currentOperation], $attrs); + } else { + $this->wsdl->bindings[$this->currentBinding]['operations'][$this->currentOperation] = $attrs; + } + break; + + case 'body': + // sect 3.5 + // soap:body attributes: + // part - optional. listed parts must appear in body, missing means all parts appear in body + // use - required. encoded|literal + // encodingStyle - optional. space seperated list of encodings (uri's) + $this->wsdl->bindings[$this->currentBinding] + ['operations'][$this->currentOperation][$this->opStatus] = $attrs; + break; + + case 'fault': + // sect 3.6 + // soap:fault attributes: name use encodingStyle namespace + $this->wsdl->bindings[$this->currentBinding] + ['operations'][$this->currentOperation][$this->opStatus] = $attrs; + break; + + case 'header': + // sect 3.7 + // soap:header attributes: message part use encodingStyle namespace + $this->wsdl->bindings[$this->currentBinding] + ['operations'][$this->currentOperation][$this->opStatus]['headers'][] = $attrs; + break; + + case 'headerfault': + // sect 3.7 + // soap:header attributes: message part use encodingStyle namespace + $header = count($this->wsdl->bindings[$this->currentBinding] + ['operations'][$this->currentOperation][$this->opStatus]['headers'])-1; + $this->wsdl->bindings[$this->currentBinding] + ['operations'][$this->currentOperation][$this->opStatus]['headers'][$header]['fault'] = $attrs; + break; + + case 'documentation': + break; + + default: + // error! not a valid element inside binding + break; + } + break; + + case SCHEMA_WSDL: + // XXX verify correct namespace + // for now, default is the 'wsdl' namespace + // other possible namespaces include smtp, http, etc. for alternate bindings + switch ($qname->name) { + case 'operation': + // sect 2.5 + // wsdl:operation attributes: name + $this->currentOperation = $attrs['name']; + break; + + case 'output': + case 'input': + case 'fault': + // sect 2.5 + // wsdl:input attributes: name + $this->opStatus = $qname->name; + break; + + case 'documentation': + break; + + default: + break; + } + break; + + case SCHEMA_WSDL_HTTP: + switch ($qname->name) { + case 'binding': + // sect 4.4 + // http:binding attributes: verb + // parent: wsdl:binding + $this->wsdl->bindings[$this->currentBinding] = array_merge($this->wsdl->bindings[$this->currentBinding], $attrs); + break; + + case 'operation': + // sect 4.5 + // http:operation attributes: location + // parent: wsdl:operation + $this->wsdl->bindings[$this->currentBinding]['operations'] + [$this->currentOperation] = $attrs; + break; + + case 'urlEncoded': + // sect 4.6 + // http:urlEncoded attributes: location + // parent: wsdl:input wsdl:output etc. + $this->wsdl->bindings[$this->currentBinding]['operations'][$this->opStatus] + [$this->currentOperation]['uri'] = 'urlEncoded'; + break; + + case 'urlReplacement': + // sect 4.7 + // http:urlReplacement attributes: location + // parent: wsdl:input wsdl:output etc. + $this->wsdl->bindings[$this->currentBinding]['operations'][$this->opStatus] + [$this->currentOperation]['uri'] = 'urlReplacement'; + break; + + case 'documentation': + break; + + default: + // error + break; + } + + case SCHEMA_MIME: + // sect 5 + // all mime parts are children of wsdl:input, wsdl:output, etc. + // unsuported as of yet + switch ($qname->name) { + case 'content': + // sect 5.3 mime:content + // + // part attribute only required if content is child of multipart related, + // it contains the name of the part + // type attribute contains the mime type + case 'multipartRelated': + // sect 5.4 mime:multipartRelated + case 'part': + case 'mimeXml': + // sect 5.6 mime:mimeXml + // + // + case 'documentation': + break; + + default: + // error + break; + } + + case SCHEMA_DIME: + // DIME is defined in: + // http://gotdotnet.com/team/xml_wsspecs/dime/WSDL-Extension-for-DIME.htm + // all DIME parts are children of wsdl:input, wsdl:output, etc. + // unsuported as of yet + switch ($qname->name) { + case 'message': + // sect 4.1 dime:message + // appears in binding section + $this->wsdl->bindings[$this->currentBinding]['dime'] = $attrs; + break; + + default: + break; + } + + default: + break; + } + break; + + case 'service': + $ns = $qname->ns ? $this->wsdl->namespaces[$qname->ns] : SCHEMA_WSDL; + + switch ($qname->name) { + case 'port': + // sect 2.6 wsdl:port attributes: name binding + $this->currentPort = $attrs['name']; + $this->wsdl->services[$this->currentService]['ports'][$this->currentPort] = $attrs; + // XXX hack to deal with binding namespaces + $qn = new QName($attrs['binding']); + $this->wsdl->services[$this->currentService]['ports'][$this->currentPort]['binding'] = $qn->name; + $this->wsdl->services[$this->currentService]['ports'][$this->currentPort]['namespace'] = $qn->ns; + break; + + case 'address': + $this->wsdl->services[$this->currentService]['ports'][$this->currentPort]['address'] = $attrs; + // what TYPE of port is it? SOAP or HTTP? + $ns = $qname->ns ? $this->wsdl->namespaces[$qname->ns] : SCHEMA_WSDL; + switch ($ns) { + case SCHEMA_WSDL_HTTP: + $this->wsdl->services[$this->currentService]['ports'][$this->currentPort]['type']='http'; + break; + + case SCHEMA_SOAP: + $this->wsdl->services[$this->currentService]['ports'][$this->currentPort]['type']='soap'; + break; + + default: + // Shouldn't happen, we'll assume SOAP. + $this->wsdl->services[$this->currentService]['ports'][$this->currentPort]['type']='soap'; + } + + break; + + case 'documentation': + break; + + default: + break; + } + } + + // Top level elements found under wsdl:definitions. + switch ($qname->name) { + case 'import': + // sect 2.1.1 wsdl:import attributes: namespace location + if ((isset($attrs['location']) || isset($attrs['schemaLocation'])) && + !isset($this->wsdl->imports[$attrs['namespace']])) { + $uri = isset($attrs['location']) ? $attrs['location'] : $attrs['schemaLocation']; + $location = @parse_url($uri); + if (!isset($location['scheme'])) { + $base = @parse_url($this->uri); + $uri = $this->mergeUrl($base, $uri); + } + + $this->wsdl->imports[$attrs['namespace']] = $attrs; + $import_parser_class = get_class($this); + $import_parser = new $import_parser_class($uri, $this->wsdl, $this->docs); + if ($import_parser->fault) { + unset($this->wsdl->imports[$attrs['namespace']]); + return false; + } + $this->currentImport = $attrs['namespace']; + } + // Continue on to the 'types' case - lack of break; is + // intentional. + + case 'types': + // sect 2.2 wsdl:types + $this->status = 'types'; + break; + + case 'schema': + // We can hit this at the top level if we've been asked to + // import an XSD file. + if (!empty($attrs['targetNamespace'])) { + $this->schema = $this->wsdl->getNamespaceAttributeName($attrs['targetNamespace']); + } else { + $this->schema = $this->wsdl->getNamespaceAttributeName($this->wsdl->tns); + } + $this->wsdl->complexTypes[$this->schema] = array(); + $this->wsdl->elements[$this->schema] = array(); + $this->schema_stack[] = $qname->name; + $this->status = 'types'; + break; + + case 'message': + // sect 2.3 wsdl:message attributes: name children:wsdl:part + $this->status = 'message'; + if (isset($attrs['name'])) { + $this->currentMessage = $attrs['name']; + $this->wsdl->messages[$this->currentMessage] = array(); + } + break; + + case 'portType': + // sect 2.4 wsdl:portType + // attributes: name + // children: wsdl:operation + $this->status = 'portType'; + $this->currentPortType = $attrs['name']; + $this->wsdl->portTypes[$this->currentPortType] = array(); + break; + + case 'binding': + // sect 2.5 wsdl:binding attributes: name type + // children: wsdl:operation soap:binding http:binding + if ($qname->ns && $qname->ns != $this->tns) { + break; + } + $this->status = 'binding'; + $this->currentBinding = $attrs['name']; + $qn = new QName($attrs['type']); + $this->wsdl->bindings[$this->currentBinding]['type'] = $qn->name; + $this->wsdl->bindings[$this->currentBinding]['namespace'] = $qn->ns; + break; + + case 'service': + // sect 2.7 wsdl:service attributes: name children: ports + $this->currentService = $attrs['name']; + $this->wsdl->services[$this->currentService]['ports'] = array(); + $this->status = 'service'; + break; + + case 'definitions': + // sec 2.1 wsdl:definitions + // attributes: name targetNamespace xmlns:* + // children: wsdl:import wsdl:types wsdl:message wsdl:portType wsdl:binding wsdl:service + $this->wsdl->definition = $attrs; + foreach ($attrs as $key => $value) { + if (strstr($key, 'xmlns:') !== false) { + $qn = new QName($key); + // XXX need to refactor ns handling. + $this->wsdl->namespaces[$qn->name] = $value; + $this->wsdl->ns[$value] = $qn->name; + if ($key == 'targetNamespace' || + strcasecmp($value,SOAP_SCHEMA) == 0) { + $this->soapns[] = $qn->name; + } else { + if (in_array($value, $this->_XMLSchema)) { + $this->wsdl->xsd = $value; + } + } + } + } + if (isset($ns) && $ns) { + $namespace = 'xmlns:' . $ns; + if (!$this->wsdl->definition[$namespace]) { + return $this->_raiseSoapFault("parse error, no namespace for $namespace", $this->uri); + } + $this->tns = $ns; + } + break; + } + } + + /** + * end-element handler. + */ + function endElement($parser, $name) + { + $stacksize = count($this->element_stack); + if ($stacksize) { + if ($this->element_stack[$stacksize - 1] == 'definitions') { + $this->status = ''; + } + array_pop($this->element_stack); + } + + if (stristr($name, 'schema')) { + array_pop($this->schema_stack); + $this->schema = ''; + } + + if ($this->schema) { + array_pop($this->schema_stack); + if (count($this->schema_stack) <= 1) { + /* Correct the type for sequences with multiple + * elements. */ + if (isset($this->currentComplexType) && isset($this->wsdl->complexTypes[$this->schema][$this->currentComplexType]['type']) + && $this->wsdl->complexTypes[$this->schema][$this->currentComplexType]['type'] == 'Array' + && array_key_exists('elements', $this->wsdl->complexTypes[$this->schema][$this->currentComplexType]) + && count($this->wsdl->complexTypes[$this->schema][$this->currentComplexType]['elements']) > 1) { + $this->wsdl->complexTypes[$this->schema][$this->currentComplexType]['type'] = 'Struct'; + } + } + if (stristr($name, 'complexType')) { + $this->currentComplexType = ''; + if (count($this->schema_element_stack)) { + $this->currentElement = array_pop($this->schema_element_stack); + } else { + $this->currentElement = ''; + } + } elseif (stristr($name, 'element')) { + if (count($this->schema_element_stack)) { + $this->currentElement = array_pop($this->schema_element_stack); + } else { + $this->currentElement = ''; + } + } + } + } + + /** + * Element content handler. + */ + function characterData($parser, $data) + { + // Store the documentation in the WSDL file. + if ($this->currentTag == 'documentation') { + $data = trim(preg_replace('/\s+/', ' ', $data)); + if (!strlen($data)) { + return; + } + + switch ($this->status) { + case 'service': + $ptr =& $this->wsdl->services[$this->currentService]; + break; + + case 'portType': + $ptr =& $this->wsdl->portTypes[$this->currentPortType][$this->currentOperation]; + break; + + case 'binding': + $ptr =& $this->wsdl->bindings[$this->currentBinding]; + break; + + case 'message': + $ptr =& $this->wsdl->messages[$this->currentMessage]; + break; + + case 'operation': + break; + + case 'types': + if (isset($this->currentComplexType) && + isset($this->wsdl->complexTypes[$this->schema][$this->currentComplexType])) { + if ($this->currentElement) { + $ptr =& $this->wsdl->complexTypes[$this->schema][$this->currentComplexType]['elements'][$this->currentElement]; + } else { + $ptr =& $this->wsdl->complexTypes[$this->schema][$this->currentComplexType]; + } + } + break; + } + + if (isset($ptr)) { + if (!isset($ptr['documentation'])) { + $ptr['documentation'] = ''; + } else { + $ptr['documentation'] .= ' '; + } + $ptr['documentation'] .= $data; + } + } + } + + /** + * $parsed is an array returned by parse_url(). + * + * @access private + */ + function mergeUrl($parsed, $path) + { + if (!is_array($parsed)) { + return false; + } + + $uri = ''; + if (!empty($parsed['scheme'])) { + $sep = (strtolower($parsed['scheme']) == 'mailto' ? ':' : '://'); + $uri = $parsed['scheme'] . $sep; + } + + if (isset($parsed['pass'])) { + $uri .= "$parsed[user]:$parsed[pass]@"; + } elseif (isset($parsed['user'])) { + $uri .= "$parsed[user]@"; + } + + if (isset($parsed['host'])) { + $uri .= $parsed['host']; + } + if (isset($parsed['port'])) { + $uri .= ":$parsed[port]"; + } + if ($path[0] != '/' && isset($parsed['path'])) { + if ($parsed['path'][strlen($parsed['path']) - 1] != '/') { + $path = dirname($parsed['path']) . '/' . $path; + } else { + $path = $parsed['path'] . $path; + } + $path = $this->_normalize($path); + } + $sep = $path[0] == '/' ? '' : '/'; + $uri .= $sep . $path; + + return $uri; + } + + function _normalize($path_str) + { + $pwd = ''; + $strArr = preg_split('/(\/)/', $path_str, -1, PREG_SPLIT_NO_EMPTY); + $pwdArr = ''; + $j = 0; + for ($i = 0; $i < count($strArr); $i++) { + if ($strArr[$i] != ' ..') { + if ($strArr[$i] != ' .') { + $pwdArr[$j] = $strArr[$i]; + $j++; + } + } else { + array_pop($pwdArr); + $j--; + } + } + $pStr = implode('/', $pwdArr); + $pwd = (strlen($pStr) > 0) ? ('/' . $pStr) : '/'; + return $pwd; + } + +} + +/** + * Parses the types and methods used in web service objects into the internal + * data structures used by SOAP_WSDL. + * + * Assumes the SOAP_WSDL class is unpopulated to start with. + * + * @author Chris Coe + */ +class SOAP_WSDL_ObjectParser extends SOAP_Base +{ + /** + * Target namespace for the WSDL document will have the following + * prefix. + */ + var $tnsPrefix = 'tns'; + + /** + * Reference to the SOAP_WSDL object to populate. + */ + var $wsdl = null; + + /** + * Constructor. + * + * @param object|array $objects Reference to the object or array of + * objects to parse. + * @param SOAP_WSDL $wsdl Reference to the SOAP_WSDL object to + * populate. + * @param string $targetNamespace The target namespace of schema types + * etc. + * @param string $service_name Name of the WSDL . + * @param string $service_desc Optional description of the WSDL + * . + */ + function SOAP_WSDL_ObjectParser(&$objects, &$wsdl, $targetNamespace, + $service_name, $service_desc = '') + { + parent::SOAP_Base('WSDLOBJECTPARSER'); + + $this->wsdl = &$wsdl; + + // Set up the SOAP_WSDL object + $this->_initialise($service_name); + + // Parse each web service object + $wsdl_ref = (is_array($objects)? $objects : array(&$objects)); + + foreach ($wsdl_ref as $ref_item) { + if (!is_object($ref_item)) { + $this->_raiseSoapFault('Invalid web service object passed to object parser'); + continue; + } + + if (!$this->_parse($ref_item, $targetNamespace, $service_name)) { + break; + } + } + + // Build bindings from abstract data. + if ($this->fault == null) { + $this->_generateBindingsAndServices($targetNamespace, $service_name, $service_desc); + } + } + + /** + * Initialise the SOAP_WSDL tree (destructive). + * + * If the object has already been initialised, the only effect + * will be to change the tns namespace to the new service name. + * + * @param $service_name Name of the WSDL + * @access private + */ + function _initialise($service_name) + { + // Set up the basic namespaces that all WSDL definitions use. + $this->wsdl->namespaces['wsdl'] = SCHEMA_WSDL; // WSDL language + $this->wsdl->namespaces['soap'] = SCHEMA_SOAP; // WSDL SOAP bindings + $this->wsdl->namespaces[$this->tnsPrefix] = 'urn:' . $service_name; // Target namespace + $this->wsdl->namespaces['xsd'] = array_search('xsd', $this->_namespaces); // XML Schema + $this->wsdl->namespaces['SOAP-ENC'] = array_search('SOAP-ENC', $this->_namespaces); // SOAP types + + // XXX Refactor $namespace/$ns for Shane :-) + unset($this->wsdl->ns['urn:' . $service_name]); + $this->wsdl->ns += array_flip($this->wsdl->namespaces); + + // Imports are not implemented in WSDL generation from classes. + // *** *** + } + + /** + * Parser - takes a single object to add to tree (non-destructive). + * + * @access private + * + * @param object $object Reference to the object to parse. + * @param string $schemaNamespace + * @param string $service_name Name of the WSDL . + */ + function _parse(&$object, $schemaNamespace, $service_name) + { + // Create namespace prefix for the schema + list($schPrefix,) = $this->_getTypeNs('{' . $schemaNamespace . '}'); + + // Parse all the types defined by the object in whatever + // schema language we are using (currently __typedef arrays) + // *** *** + foreach ($object->__typedef as $typeName => $typeValue) { + // Get/create namespace definition + list($nsPrefix, $typeName) = $this->_getTypeNs($typeName); + + // Create type definition + $this->wsdl->complexTypes[$schPrefix][$typeName] = array('name' => $typeName); + $thisType =& $this->wsdl->complexTypes[$schPrefix][$typeName]; + + // According to Dmitri's documentation, __typedef comes in two + // flavors: + // Array = array(array("item" => "value")) + // Struct = array("item1" => "value1", "item2" => "value2", ...) + if (is_array($typeValue)) { + if (is_array(current($typeValue)) && count($typeValue) == 1 + && count(current($typeValue)) == 1) { + // It's an array + $thisType['type'] = 'Array'; + $nsType = current(current($typeValue)); + list($nsPrefix, $typeName) = $this->_getTypeNs($nsType); + $thisType['namespace'] = $nsPrefix; + $thisType['arrayType'] = $typeName . '[]'; + } elseif (!is_array(current($typeValue))) { + // It's a struct + $thisType['type'] = 'Struct'; + $thisType['order'] = 'all'; + $thisType['namespace'] = $nsPrefix; + $thisType['elements'] = array(); + + foreach ($typeValue as $elementName => $elementType) { + list($nsPrefix, $typeName) = $this->_getTypeNs($elementType); + $thisType['elements'][$elementName]['name'] = $elementName; + $thisType['elements'][$elementName]['type'] = $typeName; + $thisType['elements'][$elementName]['namespace'] = $nsPrefix; + } + } else { + // It's erroneous + return $this->_raiseSoapFault("The type definition for $nsPrefix:$typeName is invalid.", 'urn:' . get_class($object)); + } + } else { + // It's erroneous + return $this->_raiseSoapFault("The type definition for $nsPrefix:$typeName is invalid.", 'urn:' . get_class($object)); + } + } + + // Create an empty element array with the target namespace + // prefix, to match the results of WSDL parsing. + $this->wsdl->elements[$schPrefix] = array(); + + // Populate tree with message information + // *** *** + foreach ($object->__dispatch_map as $operationName => $messages) { + foreach ($messages as $messageType => $messageParts) { + unset($thisMessage); + + switch ($messageType) { + case 'in': + $this->wsdl->messages[$operationName . 'Request'] = array(); + $thisMessage =& $this->wsdl->messages[$operationName . 'Request']; + break; + + case 'out': + $this->wsdl->messages[$operationName . 'Response'] = array(); + $thisMessage =& $this->wsdl->messages[$operationName . 'Response']; + break; + + case 'alias': + // Do nothing + break; + + default: + // Error condition + break; + } + + if (isset($thisMessage)) { + foreach ($messageParts as $partName => $partType) { + list ($nsPrefix, $typeName) = $this->_getTypeNs($partType); + + $thisMessage[$partName] = array( + 'name' => $partName, + 'type' => $typeName, + 'namespace' => $nsPrefix + ); + } + } + } + } + + // Populate tree with portType information + // XXX Current implementation only supports one portType that + // encompasses all of the operations available. + // *** *** + if (!isset($this->wsdl->portTypes[$service_name . 'Port'])) { + $this->wsdl->portTypes[$service_name . 'Port'] = array(); + } + $thisPortType =& $this->wsdl->portTypes[$service_name . 'Port']; + + foreach ($object->__dispatch_map as $operationName => $messages) { + $thisPortType[$operationName] = array('name' => $operationName); + + foreach ($messages as $messageType => $messageParts) { + switch ($messageType) { + case 'in': + $thisPortType[$operationName]['input'] = array( + 'message' => $operationName . 'Request', + 'namespace' => $this->tnsPrefix); + break; + + case 'out': + $thisPortType[$operationName]['output'] = array( + 'message' => $operationName . 'Response', + 'namespace' => $this->tnsPrefix); + break; + } + } + } + + return true; + } + + /** + * Takes all the abstract WSDL data and builds concrete bindings and + * services (destructive). + * + * @access private + * @todo Current implementation discards $service_desc. + * + * @param string $schemaNamespace Namespace for types etc. + * @param string $service_name Name of the WSDL . + * @param string $service_desc Optional description of the WSDL + * . + */ + function _generateBindingsAndServices($schemaNamespace, $service_name, + $service_desc = '') + { + // Populate tree with bindings information + // XXX Current implementation only supports one binding that + // matches the single portType and all of its operations. + // XXX Is this the correct use of $schemaNamespace here? + // *** *** + $this->wsdl->bindings[$service_name . 'Binding'] = array( + 'type' => $service_name . 'Port', + 'namespace' => $this->tnsPrefix, + 'style' => 'rpc', + 'transport' => SCHEMA_SOAP_HTTP, + 'operations' => array()); + $thisBinding =& $this->wsdl->bindings[$service_name . 'Binding']; + + foreach ($this->wsdl->portTypes[$service_name . 'Port'] as $operationName => $operationData) { + $thisBinding['operations'][$operationName] = array( + 'soapAction' => $schemaNamespace . '#' . $operationName, + 'style' => $thisBinding['style']); + + foreach (array('input', 'output') as $messageType) + if (isset($operationData[$messageType])) { + $thisBinding['operations'][$operationName][$messageType] = array( + 'use' => 'encoded', + 'namespace' => $schemaNamespace, + 'encodingStyle' => SOAP_SCHEMA_ENCODING); + } + } + + // Populate tree with service information + // XXX Current implementation supports one service which groups + // all of the ports together, one port per binding + // *** *** + + $this->wsdl->services[$service_name . 'Service'] = array('ports' => array()); + $thisService =& $this->wsdl->services[$service_name . 'Service']['ports']; + $https = (isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on')) || + getenv('SSL_PROTOCOL_VERSION'); + + foreach ($this->wsdl->bindings as $bindingName => $bindingData) { + $thisService[$bindingData['type']] = array( + 'name' => $bindingData['type'], + 'binding' => $bindingName, + 'namespace' => $this->tnsPrefix, + 'address' => array('location' => + ($https ? 'https://' : 'http://') . + $_SERVER['SERVER_NAME'] . $_SERVER['PHP_SELF'] . + (isset($_SERVER['QUERY_STRING']) ? '?' . $_SERVER['QUERY_STRING'] : '')), + 'type' => 'soap'); + } + + // Set service + $this->wsdl->set_service($service_name . 'Service'); + $this->wsdl->uri = $this->wsdl->namespaces[$this->tnsPrefix]; + + // Create WSDL definition + // *** *** + + $this->wsdl->definition = array( + 'name' => $service_name, + 'targetNamespace' => $this->wsdl->namespaces[$this->tnsPrefix], + 'xmlns' => SCHEMA_WSDL); + + foreach ($this->wsdl->namespaces as $nsPrefix => $namespace) { + $this->wsdl->definition['xmlns:' . $nsPrefix] = $namespace; + } + } + + /** + * This function is adapted from Dmitri V's implementation of + * DISCO/WSDL generation. It separates namespace from type name in + * a __typedef key and creates a new namespace entry in the WSDL + * structure if the namespace has not been used before. The + * namespace prefix and type name are returned. If no namespace is + * specified, xsd is assumed. + * + * We will not need this function anymore once __typedef is + * eliminated. + */ + function _getTypeNs($type) + { + preg_match_all('/\{(.*)\}/sm', $type, $m); + if (!empty($m[1][0])) { + if (!isset($this->wsdl->ns[$m[1][0]])) { + $ns_pref = 'ns' . count($this->wsdl->namespaces); + $this->wsdl->ns[$m[1][0]] = $ns_pref; + $this->wsdl->namespaces[$ns_pref] = $m[1][0]; + } + $typens = $this->wsdl->ns[$m[1][0]]; + $type = str_replace($m[0][0], '', $type); + } else { + $typens = 'xsd'; + } + + return array($typens, $type); + } + +} diff --git a/thirdparty/pear/SOAP/tools/genproxy.php b/thirdparty/pear/SOAP/tools/genproxy.php new file mode 100644 index 000000000..8a334e1ef --- /dev/null +++ b/thirdparty/pear/SOAP/tools/genproxy.php @@ -0,0 +1,21 @@ + foo.php + * + */ + +function do_wsdl($uri) { + $wsdl =& new SOAP_WSDL($uri); + print $wsdl->generateAllProxies(); +} +echo ""; +?> \ No newline at end of file diff --git a/thirdparty/pear/Spreadsheet/Excel/Writer.php b/thirdparty/pear/Spreadsheet/Excel/Writer.php new file mode 100644 index 000000000..eda612035 --- /dev/null +++ b/thirdparty/pear/Spreadsheet/Excel/Writer.php @@ -0,0 +1,104 @@ + +* +* PERL Spreadsheet::WriteExcel module. +* +* The author of the Spreadsheet::WriteExcel module is John McNamara +* +* +* I _DO_ maintain this code, and John McNamara has nothing to do with the +* porting of this code to PHP. Any questions directly related to this +* class library should be directed to me. +* +* License Information: +* +* Spreadsheet_Excel_Writer: A library for generating Excel Spreadsheets +* Copyright (c) 2002-2003 Xavier Noguer xnoguer@rezebra.com +* +* 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 +*/ + +require_once('PEAR.php'); +require_once('Spreadsheet/Excel/Writer/Workbook.php'); + +/** +* Class for writing Excel Spreadsheets. This class should change COMPLETELY. +* +* @author Xavier Noguer +* @category FileFormats +* @package Spreadsheet_Excel_Writer +*/ + +class Spreadsheet_Excel_Writer extends Spreadsheet_Excel_Writer_Workbook +{ + /** + * The constructor. It just creates a Workbook + * + * @param string $filename The optional filename for the Workbook. + * @return Spreadsheet_Excel_Writer_Workbook The Workbook created + */ + function Spreadsheet_Excel_Writer($filename = '') + { + $this->_filename = $filename; + $this->Spreadsheet_Excel_Writer_Workbook($filename); + } + + /** + * Send HTTP headers for the Excel file. + * + * @param string $filename The filename to use for HTTP headers + * @access public + */ + function send($filename) + { + header("Content-type: application/vnd.ms-excel"); + header("Content-Disposition: attachment; filename=$filename"); + header("Expires: 0"); + header("Cache-Control: must-revalidate, post-check=0,pre-check=0"); + header("Pragma: public"); + } + + /** + * Utility function for writing formulas + * Converts a cell's coordinates to the A1 format. + * + * @access public + * @static + * @param integer $row Row for the cell to convert (0-indexed). + * @param integer $col Column for the cell to convert (0-indexed). + * @return string The cell identifier in A1 format + */ + function rowcolToCell($row, $col) + { + if ($col > 255) { //maximum column value exceeded + return new PEAR_Error("Maximum column value exceeded: $col"); + } + + $int = (int)($col / 26); + $frac = $col % 26; + $chr1 = ''; + + if ($int > 0) { + $chr1 = chr(ord('A') + $int - 1); + } + + $chr2 = chr(ord('A') + $frac); + $row++; + + return $chr1.$chr2.$row; + } +} +?> diff --git a/thirdparty/pear/Spreadsheet/Excel/Writer.php.bk b/thirdparty/pear/Spreadsheet/Excel/Writer.php.bk new file mode 100644 index 000000000..eda612035 --- /dev/null +++ b/thirdparty/pear/Spreadsheet/Excel/Writer.php.bk @@ -0,0 +1,104 @@ + +* +* PERL Spreadsheet::WriteExcel module. +* +* The author of the Spreadsheet::WriteExcel module is John McNamara +* +* +* I _DO_ maintain this code, and John McNamara has nothing to do with the +* porting of this code to PHP. Any questions directly related to this +* class library should be directed to me. +* +* License Information: +* +* Spreadsheet_Excel_Writer: A library for generating Excel Spreadsheets +* Copyright (c) 2002-2003 Xavier Noguer xnoguer@rezebra.com +* +* 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 +*/ + +require_once('PEAR.php'); +require_once('Spreadsheet/Excel/Writer/Workbook.php'); + +/** +* Class for writing Excel Spreadsheets. This class should change COMPLETELY. +* +* @author Xavier Noguer +* @category FileFormats +* @package Spreadsheet_Excel_Writer +*/ + +class Spreadsheet_Excel_Writer extends Spreadsheet_Excel_Writer_Workbook +{ + /** + * The constructor. It just creates a Workbook + * + * @param string $filename The optional filename for the Workbook. + * @return Spreadsheet_Excel_Writer_Workbook The Workbook created + */ + function Spreadsheet_Excel_Writer($filename = '') + { + $this->_filename = $filename; + $this->Spreadsheet_Excel_Writer_Workbook($filename); + } + + /** + * Send HTTP headers for the Excel file. + * + * @param string $filename The filename to use for HTTP headers + * @access public + */ + function send($filename) + { + header("Content-type: application/vnd.ms-excel"); + header("Content-Disposition: attachment; filename=$filename"); + header("Expires: 0"); + header("Cache-Control: must-revalidate, post-check=0,pre-check=0"); + header("Pragma: public"); + } + + /** + * Utility function for writing formulas + * Converts a cell's coordinates to the A1 format. + * + * @access public + * @static + * @param integer $row Row for the cell to convert (0-indexed). + * @param integer $col Column for the cell to convert (0-indexed). + * @return string The cell identifier in A1 format + */ + function rowcolToCell($row, $col) + { + if ($col > 255) { //maximum column value exceeded + return new PEAR_Error("Maximum column value exceeded: $col"); + } + + $int = (int)($col / 26); + $frac = $col % 26; + $chr1 = ''; + + if ($int > 0) { + $chr1 = chr(ord('A') + $int - 1); + } + + $chr2 = chr(ord('A') + $frac); + $row++; + + return $chr1.$chr2.$row; + } +} +?> diff --git a/thirdparty/pear/Spreadsheet/Excel/Writer/BIFFwriter.php b/thirdparty/pear/Spreadsheet/Excel/Writer/BIFFwriter.php new file mode 100644 index 000000000..1f700dfb5 --- /dev/null +++ b/thirdparty/pear/Spreadsheet/Excel/Writer/BIFFwriter.php @@ -0,0 +1,241 @@ + +* +* The majority of this is _NOT_ my code. I simply ported it from the +* PERL Spreadsheet::WriteExcel module. +* +* The author of the Spreadsheet::WriteExcel module is John McNamara +* +* +* I _DO_ maintain this code, and John McNamara has nothing to do with the +* porting of this code to PHP. Any questions directly related to this +* class library should be directed to me. +* +* License Information: +* +* Spreadsheet_Excel_Writer: A library for generating Excel Spreadsheets +* Copyright (c) 2002-2003 Xavier Noguer xnoguer@php.net +* +* 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 +*/ + +require_once('PEAR.php'); + +/** +* Class for writing Excel BIFF records. +* +* From "MICROSOFT EXCEL BINARY FILE FORMAT" by Mark O'Brien (Microsoft Corporation): +* +* BIFF (BInary File Format) is the file format in which Excel documents are +* saved on disk. A BIFF file is a complete description of an Excel document. +* BIFF files consist of sequences of variable-length records. There are many +* different types of BIFF records. For example, one record type describes a +* formula entered into a cell; one describes the size and location of a +* window into a document; another describes a picture format. +* +* @author Xavier Noguer +* @category FileFormats +* @package Spreadsheet_Excel_Writer +*/ + +class Spreadsheet_Excel_Writer_BIFFwriter extends PEAR +{ + /** + * The BIFF/Excel version (5). + * @var integer + */ + var $_BIFF_version = 0x0500; + + /** + * The byte order of this architecture. 0 => little endian, 1 => big endian + * @var integer + */ + var $_byte_order; + + /** + * The string containing the data of the BIFF stream + * @var string + */ + var $_data; + + /** + * The size of the data in bytes. Should be the same as strlen($this->_data) + * @var integer + */ + var $_datasize; + + /** + * The maximun length for a BIFF record. See _addContinue() + * @var integer + * @see _addContinue() + */ + var $_limit; + + /** + * Constructor + * + * @access public + */ + function Spreadsheet_Excel_Writer_BIFFwriter() + { + $this->_byte_order = ''; + $this->_data = ''; + $this->_datasize = 0; + $this->_limit = 2080; + // Set the byte order + $this->_setByteOrder(); + } + + /** + * Determine the byte order and store it as class data to avoid + * recalculating it for each call to new(). + * + * @access private + */ + function _setByteOrder() + { + // Check if "pack" gives the required IEEE 64bit float + $teststr = pack("d", 1.2345); + $number = pack("C8", 0x8D, 0x97, 0x6E, 0x12, 0x83, 0xC0, 0xF3, 0x3F); + if ($number == $teststr) { + $byte_order = 0; // Little Endian + } + elseif ($number == strrev($teststr)){ + $byte_order = 1; // Big Endian + } + else { + // Give up. I'll fix this in a later version. + return $this->raiseError("Required floating point format ". + "not supported on this platform."); + } + $this->_byte_order = $byte_order; + } + + /** + * General storage function + * + * @param string $data binary data to prepend + * @access private + */ + function _prepend($data) + { + if (strlen($data) > $this->_limit) { + $data = $this->_addContinue($data); + } + $this->_data = $data.$this->_data; + $this->_datasize += strlen($data); + } + + /** + * General storage function + * + * @param string $data binary data to append + * @access private + */ + function _append($data) + { + if (strlen($data) > $this->_limit) { + $data = $this->_addContinue($data); + } + $this->_data = $this->_data.$data; + $this->_datasize += strlen($data); + } + + /** + * Writes Excel BOF record to indicate the beginning of a stream or + * sub-stream in the BIFF file. + * + * @param integer $type Type of BIFF file to write: 0x0005 Workbook, + * 0x0010 Worksheet. + * @access private + */ + function _storeBof($type) + { + $record = 0x0809; // Record identifier + + // According to the SDK $build and $year should be set to zero. + // However, this throws a warning in Excel 5. So, use magic numbers. + if ($this->_BIFF_version == 0x0500) { + $length = 0x0008; + $unknown = ''; + $build = 0x096C; + $year = 0x07C9; + } + elseif ($this->_BIFF_version == 0x0600) { + $length = 0x0010; + $unknown = pack("VV", 0x00000041, 0x00000006); //unknown last 8 bytes for BIFF8 + $build = 0x0DBB; + $year = 0x07CC; + } + $version = $this->_BIFF_version; + + $header = pack("vv", $record, $length); + $data = pack("vvvv", $version, $type, $build, $year); + $this->_prepend($header.$data.$unknown); + } + + /** + * Writes Excel EOF record to indicate the end of a BIFF stream. + * + * @access private + */ + function _storeEof() + { + $record = 0x000A; // Record identifier + $length = 0x0000; // Number of bytes to follow + $header = pack("vv", $record, $length); + $this->_append($header); + } + + /** + * Excel limits the size of BIFF records. In Excel 5 the limit is 2084 bytes. In + * Excel 97 the limit is 8228 bytes. Records that are longer than these limits + * must be split up into CONTINUE blocks. + * + * This function takes a long BIFF record and inserts CONTINUE records as + * necessary. + * + * @param string $data The original binary data to be written + * @return string A very convenient string of continue blocks + * @access private + */ + function _addContinue($data) + { + $limit = $this->_limit; + $record = 0x003C; // Record identifier + + // The first 2080/8224 bytes remain intact. However, we have to change + // the length field of the record. + $tmp = substr($data, 0, 2).pack("v", $limit-4).substr($data, 4, $limit - 4); + + $header = pack("vv", $record, $limit); // Headers for continue records + + // Retrieve chunks of 2080/8224 bytes +4 for the header. + for($i = $limit; $i < strlen($data) - $limit; $i += $limit) + { + $tmp .= $header; + $tmp .= substr($data, $i, $limit); + } + + // Retrieve the last chunk of data + $header = pack("vv", $record, strlen($data) - $i); + $tmp .= $header; + $tmp .= substr($data,$i,strlen($data) - $i); + + return $tmp; + } +} +?> diff --git a/thirdparty/pear/Spreadsheet/Excel/Writer/Format.php b/thirdparty/pear/Spreadsheet/Excel/Writer/Format.php new file mode 100644 index 000000000..788d25bb8 --- /dev/null +++ b/thirdparty/pear/Spreadsheet/Excel/Writer/Format.php @@ -0,0 +1,1035 @@ + +* +* The majority of this is _NOT_ my code. I simply ported it from the +* PERL Spreadsheet::WriteExcel module. +* +* The author of the Spreadsheet::WriteExcel module is John McNamara +* +* +* I _DO_ maintain this code, and John McNamara has nothing to do with the +* porting of this code to PHP. Any questions directly related to this +* class library should be directed to me. +* +* License Information: +* +* Spreadsheet_Excel_Writer: A library for generating Excel Spreadsheets +* Copyright (c) 2002-2003 Xavier Noguer xnoguer@rezebra.com +* +* 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 +*/ + +require_once('PEAR.php'); + +/** +* Class for generating Excel XF records (formats) +* +* @author Xavier Noguer +* @category FileFormats +* @package Spreadsheet_Excel_Writer +*/ + +class Spreadsheet_Excel_Writer_Format extends PEAR +{ + /** + * The index given by the workbook when creating a new format. + * @var integer + */ + var $_xf_index; + + /** + * Index to the FONT record. + * @var integer + */ + var $font_index; + + /** + * The font name (ASCII). + * @var string + */ + var $_font_name; + + /** + * Height of font (1/20 of a point) + * @var integer + */ + var $_size; + + /** + * Bold style + * @var integer + */ + var $_bold; + + /** + * Bit specifiying if the font is italic. + * @var integer + */ + var $_italic; + + /** + * Index to the cell's color + * @var integer + */ + var $_color; + + /** + * The text underline property + * @var integer + */ + var $_underline; + + /** + * Bit specifiying if the font has strikeout. + * @var integer + */ + var $_font_strikeout; + + /** + * Bit specifiying if the font has outline. + * @var integer + */ + var $_font_outline; + + /** + * Bit specifiying if the font has shadow. + * @var integer + */ + var $_font_shadow; + + /** + * 2 bytes specifiying the script type for the font. + * @var integer + */ + var $_font_script; + + /** + * Byte specifiying the font family. + * @var integer + */ + var $_font_family; + + /** + * Byte specifiying the font charset. + * @var integer + */ + var $_font_charset; + + /** + * An index (2 bytes) to a FORMAT record (number format). + * @var integer + */ + var $_num_format; + + /** + * Bit specifying if formulas are hidden. + * @var integer + */ + var $_hidden; + + /** + * Bit specifying if the cell is locked. + * @var integer + */ + var $_locked; + + /** + * The three bits specifying the text horizontal alignment. + * @var integer + */ + var $_text_h_align; + + /** + * Bit specifying if the text is wrapped at the right border. + * @var integer + */ + var $_text_wrap; + + /** + * The three bits specifying the text vertical alignment. + * @var integer + */ + var $_text_v_align; + + /** + * 1 bit, apparently not used. + * @var integer + */ + var $_text_justlast; + + /** + * The two bits specifying the text rotation. + * @var integer + */ + var $_rotation; + + /** + * The cell's foreground color. + * @var integer + */ + var $_fg_color; + + /** + * The cell's background color. + * @var integer + */ + var $_bg_color; + + /** + * The cell's background fill pattern. + * @var integer + */ + var $_pattern; + + /** + * Style of the bottom border of the cell + * @var integer + */ + var $_bottom; + + /** + * Color of the bottom border of the cell. + * @var integer + */ + var $_bottom_color; + + /** + * Style of the top border of the cell + * @var integer + */ + var $_top; + + /** + * Color of the top border of the cell. + * @var integer + */ + var $_top_color; + + /** + * Style of the left border of the cell + * @var integer + */ + var $_left; + + /** + * Color of the left border of the cell. + * @var integer + */ + var $_left_color; + + /** + * Style of the right border of the cell + * @var integer + */ + var $_right; + + /** + * Color of the right border of the cell. + * @var integer + */ + var $_right_color; + + /** + * Constructor + * + * @access private + * @param integer $index the XF index for the format. + * @param array $properties array with properties to be set on initialization. + */ + function Spreadsheet_Excel_Writer_Format($BIFF_version, $index = 0, $properties = array()) + { + $this->_xf_index = $index; + $this->_BIFF_version = $BIFF_version; + $this->font_index = 0; + $this->_font_name = 'Arial'; + $this->_size = 10; + $this->_bold = 0x0190; + $this->_italic = 0; + $this->_color = 0x7FFF; + $this->_underline = 0; + $this->_font_strikeout = 0; + $this->_font_outline = 0; + $this->_font_shadow = 0; + $this->_font_script = 0; + $this->_font_family = 0; + $this->_font_charset = 0; + + $this->_num_format = 0; + + $this->_hidden = 0; + $this->_locked = 0; + + $this->_text_h_align = 0; + $this->_text_wrap = 0; + $this->_text_v_align = 2; + $this->_text_justlast = 0; + $this->_rotation = 0; + + $this->_fg_color = 0x40; + $this->_bg_color = 0x41; + + $this->_pattern = 0; + + $this->_bottom = 0; + $this->_top = 0; + $this->_left = 0; + $this->_right = 0; + $this->_diag = 0; + + $this->_bottom_color = 0x40; + $this->_top_color = 0x40; + $this->_left_color = 0x40; + $this->_right_color = 0x40; + $this->_diag_color = 0x40; + + // Set properties passed to Spreadsheet_Excel_Writer_Workbook::addFormat() + foreach($properties as $property => $value) + { + if(method_exists($this,'set'.ucwords($property))) + { + $method_name = 'set'.ucwords($property); + $this->$method_name($value); + } + } + } + + + /** + * Generate an Excel BIFF XF record (style or cell). + * + * @param string $style The type of the XF record ('style' or 'cell'). + * @return string The XF record + */ + function getXf($style) + { + // Set the type of the XF record and some of the attributes. + if ($style == "style") { + $style = 0xFFF5; + } + else { + $style = $this->_locked; + $style |= $this->_hidden << 1; + } + + // Flags to indicate if attributes have been set. + $atr_num = ($this->_num_format != 0)?1:0; + $atr_fnt = ($this->font_index != 0)?1:0; + $atr_alc = ($this->_text_wrap)?1:0; + $atr_bdr = ($this->_bottom || + $this->_top || + $this->_left || + $this->_right)?1:0; + $atr_pat = (($this->_fg_color != 0x40) || + ($this->_bg_color != 0x41) || + $this->_pattern)?1:0; + $atr_prot = $this->_locked | $this->_hidden; + + // Zero the default border colour if the border has not been set. + if ($this->_bottom == 0) { + $this->_bottom_color = 0; + } + if ($this->_top == 0) { + $this->_top_color = 0; + } + if ($this->_right == 0) { + $this->_right_color = 0; + } + if ($this->_left == 0) { + $this->_left_color = 0; + } + if ($this->_diag == 0) { + $this->_diag_color = 0; + } + + $record = 0x00E0; // Record identifier + if ($this->_BIFF_version == 0x0500) { + $length = 0x0010; // Number of bytes to follow + } + if ($this->_BIFF_version == 0x0600) { + $length = 0x0014; + } + + $ifnt = $this->font_index; // Index to FONT record + $ifmt = $this->_num_format; // Index to FORMAT record + if ($this->_BIFF_version == 0x0500) + { + $align = $this->_text_h_align; // Alignment + $align |= $this->_text_wrap << 3; + $align |= $this->_text_v_align << 4; + $align |= $this->_text_justlast << 7; + $align |= $this->_rotation << 8; + $align |= $atr_num << 10; + $align |= $atr_fnt << 11; + $align |= $atr_alc << 12; + $align |= $atr_bdr << 13; + $align |= $atr_pat << 14; + $align |= $atr_prot << 15; + + $icv = $this->_fg_color; // fg and bg pattern colors + $icv |= $this->_bg_color << 7; + + $fill = $this->_pattern; // Fill and border line style + $fill |= $this->_bottom << 6; + $fill |= $this->_bottom_color << 9; + + $border1 = $this->_top; // Border line style and color + $border1 |= $this->_left << 3; + $border1 |= $this->_right << 6; + $border1 |= $this->_top_color << 9; + + $border2 = $this->_left_color; // Border color + $border2 |= $this->_right_color << 7; + + $header = pack("vv", $record, $length); + $data = pack("vvvvvvvv", $ifnt, $ifmt, $style, $align, + $icv, $fill, + $border1, $border2); + } + elseif ($this->_BIFF_version == 0x0600) + { + $align = $this->_text_h_align; // Alignment + $align |= $this->_text_wrap << 3; + $align |= $this->_text_v_align << 4; + $align |= $this->_text_justlast << 7; + + $used_attrib = $atr_num << 2; + $used_attrib |= $atr_fnt << 3; + $used_attrib |= $atr_alc << 4; + $used_attrib |= $atr_bdr << 5; + $used_attrib |= $atr_pat << 6; + $used_attrib |= $atr_prot << 7; + + $icv = $this->_fg_color; // fg and bg pattern colors + $icv |= $this->_bg_color << 7; + + $border1 = $this->_left; // Border line style and color + $border1 |= $this->_right << 4; + $border1 |= $this->_top << 8; + $border1 |= $this->_bottom << 12; + $border1 |= $this->_left_color << 16; + $border1 |= $this->_right_color << 23; + $diag_tl_to_rb = 0; // FIXME: add method + $diag_tr_to_lb = 0; // FIXME: add method + $border1 |= $diag_tl_to_rb << 30; + $border1 |= $diag_tr_to_lb << 31; + + $border2 = $this->_top_color; // Border color + $border2 |= $this->_bottom_color << 7; + $border2 |= $this->_diag_color << 14; + $border2 |= $this->_diag << 21; + $border2 |= $this->_pattern << 26; + + $header = pack("vv", $record, $length); + + $rotation = 0x00; + $biff8_options = 0x00; + $data = pack("vvvC", $ifnt, $ifmt, $style, $align); + $data .= pack("CCC", $rotation, $biff8_options, $used_attrib); + $data .= pack("VVv", $border1, $border2, $icv); + } + + return($header.$data); + } + + /** + * Generate an Excel BIFF FONT record. + * + * @return string The FONT record + */ + function getFont() + { + $dyHeight = $this->_size * 20; // Height of font (1/20 of a point) + $icv = $this->_color; // Index to color palette + $bls = $this->_bold; // Bold style + $sss = $this->_font_script; // Superscript/subscript + $uls = $this->_underline; // Underline + $bFamily = $this->_font_family; // Font family + $bCharSet = $this->_font_charset; // Character set + $encoding = 0; // TODO: Unicode support + + $cch = strlen($this->_font_name); // Length of font name + $record = 0x31; // Record identifier + if ($this->_BIFF_version == 0x0500) { + $length = 0x0F + $cch; // Record length + } + elseif ($this->_BIFF_version == 0x0600) { + $length = 0x10 + $cch; + } + $reserved = 0x00; // Reserved + $grbit = 0x00; // Font attributes + if ($this->_italic) { + $grbit |= 0x02; + } + if ($this->_font_strikeout) { + $grbit |= 0x08; + } + if ($this->_font_outline) { + $grbit |= 0x10; + } + if ($this->_font_shadow) { + $grbit |= 0x20; + } + + $header = pack("vv", $record, $length); + if ($this->_BIFF_version == 0x0500) { + $data = pack("vvvvvCCCCC", $dyHeight, $grbit, $icv, $bls, + $sss, $uls, $bFamily, + $bCharSet, $reserved, $cch); + } + elseif ($this->_BIFF_version == 0x0600) { + $data = pack("vvvvvCCCCCC", $dyHeight, $grbit, $icv, $bls, + $sss, $uls, $bFamily, + $bCharSet, $reserved, $cch, $encoding); + } + return($header . $data. $this->_font_name); + } + + /** + * Returns a unique hash key for a font. + * Used by Spreadsheet_Excel_Writer_Workbook::_storeAllFonts() + * + * The elements that form the key are arranged to increase the probability of + * generating a unique key. Elements that hold a large range of numbers + * (eg. _color) are placed between two binary elements such as _italic + * + * @return string A key for this font + */ + function getFontKey() + { + $key = "$this->_font_name$this->_size"; + $key .= "$this->_font_script$this->_underline"; + $key .= "$this->_font_strikeout$this->_bold$this->_font_outline"; + $key .= "$this->_font_family$this->_font_charset"; + $key .= "$this->_font_shadow$this->_color$this->_italic"; + $key = str_replace(" ","_",$key); + return ($key); + } + + /** + * Returns the index used by Spreadsheet_Excel_Writer_Worksheet::_XF() + * + * @return integer The index for the XF record + */ + function getXfIndex() + { + return($this->_xf_index); + } + + /** + * Used in conjunction with the set_xxx_color methods to convert a color + * string into a number. Color range is 0..63 but we will restrict it + * to 8..63 to comply with Gnumeric. Colors 0..7 are repeated in 8..15. + * + * @access private + * @param string $name_color name of the color (i.e.: 'blue', 'red', etc..). Optional. + * @return integer The color index + */ + function _getColor($name_color = '') + { + $colors = array( + 'aqua' => 0x0F, + 'cyan' => 0x0F, + 'black' => 0x08, + 'blue' => 0x0C, + 'brown' => 0x10, + 'magenta' => 0x0E, + 'fuchsia' => 0x0E, + 'gray' => 0x17, + 'grey' => 0x17, + 'green' => 0x11, + 'lime' => 0x0B, + 'navy' => 0x12, + 'orange' => 0x35, + 'purple' => 0x14, + 'red' => 0x0A, + 'silver' => 0x16, + 'white' => 0x09, + 'yellow' => 0x0D + ); + + // Return the default color, 0x7FFF, if undef, + if($name_color == '') { + return(0x7FFF); + } + + // or the color string converted to an integer, + if(isset($colors[$name_color])) { + return($colors[$name_color]); + } + + // or the default color if string is unrecognised, + if(preg_match("/\D/",$name_color)) { + return(0x7FFF); + } + + // or an index < 8 mapped into the correct range, + if($name_color < 8) { + return($name_color + 8); + } + + // or the default color if arg is outside range, + if($name_color > 63) { + return(0x7FFF); + } + + // or an integer in the valid range + return($name_color); + } + + /** + * Set cell alignment. + * + * @access public + * @param string $location alignment for the cell ('left', 'right', etc...). + */ + function setAlign($location) + { + if (preg_match("/\d/",$location)) { + return; // Ignore numbers + } + + $location = strtolower($location); + + if ($location == 'left') { + $this->_text_h_align = 1; + } + if ($location == 'centre') { + $this->_text_h_align = 2; + } + if ($location == 'center') { + $this->_text_h_align = 2; + } + if ($location == 'right') { + $this->_text_h_align = 3; + } + if ($location == 'fill') { + $this->_text_h_align = 4; + } + if ($location == 'justify') { + $this->_text_h_align = 5; + } + if ($location == 'merge') { + $this->_text_h_align = 6; + } + if ($location == 'equal_space') { // For T.K. + $this->_text_h_align = 7; + } + if ($location == 'top') { + $this->_text_v_align = 0; + } + if ($location == 'vcentre') { + $this->_text_v_align = 1; + } + if ($location == 'vcenter') { + $this->_text_v_align = 1; + } + if ($location == 'bottom') { + $this->_text_v_align = 2; + } + if ($location == 'vjustify') { + $this->_text_v_align = 3; + } + if ($location == 'vequal_space') { // For T.K. + $this->_text_v_align = 4; + } + } + + /** + * This is an alias for the unintuitive setAlign('merge') + * + * @access public + */ + function setMerge() + { + $this->setAlign('merge'); + } + + /** + * Sets the boldness of the text. + * Bold has a range 100..1000. + * 0 (400) is normal. 1 (700) is bold. + * + * @access public + * @param integer $weight Weight for the text, 0 maps to 400 (normal text), + 1 maps to 700 (bold text). Valid range is: 100-1000. + It's Optional, default is 1 (bold). + */ + function setBold($weight = 1) + { + if($weight == 1) { + $weight = 0x2BC; // Bold text + } + if($weight == 0) { + $weight = 0x190; // Normal text + } + if($weight < 0x064) { + $weight = 0x190; // Lower bound + } + if($weight > 0x3E8) { + $weight = 0x190; // Upper bound + } + $this->_bold = $weight; + } + + + /************************************ + * FUNCTIONS FOR SETTING CELLS BORDERS + */ + + /** + * Sets the width for the bottom border of the cell + * + * @access public + * @param integer $style style of the cell border. 1 => thin, 2 => thick. + */ + function setBottom($style) + { + $this->_bottom = $style; + } + + /** + * Sets the width for the top border of the cell + * + * @access public + * @param integer $style style of the cell top border. 1 => thin, 2 => thick. + */ + function setTop($style) + { + $this->_top = $style; + } + + /** + * Sets the width for the left border of the cell + * + * @access public + * @param integer $style style of the cell left border. 1 => thin, 2 => thick. + */ + function setLeft($style) + { + $this->_left = $style; + } + + /** + * Sets the width for the right border of the cell + * + * @access public + * @param integer $style style of the cell right border. 1 => thin, 2 => thick. + */ + function setRight($style) + { + $this->_right = $style; + } + + + /** + * Set cells borders to the same style + * + * @access public + * @param integer $style style to apply for all cell borders. 1 => thin, 2 => thick. + */ + function setBorder($style) + { + $this->setBottom($style); + $this->setTop($style); + $this->setLeft($style); + $this->setRight($style); + } + + + /******************************************* + * FUNCTIONS FOR SETTING CELLS BORDERS COLORS + */ + + /** + * Sets all the cell's borders to the same color + * + * @access public + * @param mixed $color The color we are setting. Either a string (like 'blue'), + * or an integer (range is [8...63]). + */ + function setBorderColor($color) + { + $this->setBottomColor($color); + $this->setTopColor($color); + $this->setLeftColor($color); + $this->setRightColor($color); + } + + /** + * Sets the cell's bottom border color + * + * @access public + * @param mixed $color either a string (like 'blue'), or an integer (range is [8...63]). + */ + function setBottomColor($color) + { + $value = $this->_getColor($color); + $this->_bottom_color = $value; + } + + /** + * Sets the cell's top border color + * + * @access public + * @param mixed $color either a string (like 'blue'), or an integer (range is [8...63]). + */ + function setTopColor($color) + { + $value = $this->_getColor($color); + $this->_top_color = $value; + } + + /** + * Sets the cell's left border color + * + * @access public + * @param mixed $color either a string (like 'blue'), or an integer (range is [8...63]). + */ + function setLeftColor($color) + { + $value = $this->_getColor($color); + $this->_left_color = $value; + } + + /** + * Sets the cell's right border color + * + * @access public + * @param mixed $color either a string (like 'blue'), or an integer (range is [8...63]). + */ + function setRightColor($color) + { + $value = $this->_getColor($color); + $this->_right_color = $value; + } + + + /** + * Sets the cell's foreground color + * + * @access public + * @param mixed $color either a string (like 'blue'), or an integer (range is [8...63]). + */ + function setFgColor($color) + { + $value = $this->_getColor($color); + $this->_fg_color = $value; + if ($this->_pattern == 0) { // force color to be seen + $this->_pattern = 1; + } + } + + /** + * Sets the cell's background color + * + * @access public + * @param mixed $color either a string (like 'blue'), or an integer (range is [8...63]). + */ + function setBgColor($color) + { + $value = $this->_getColor($color); + $this->_bg_color = $value; + if ($this->_pattern == 0) { // force color to be seen + $this->_pattern = 1; + } + } + + /** + * Sets the cell's color + * + * @access public + * @param mixed $color either a string (like 'blue'), or an integer (range is [8...63]). + */ + function setColor($color) + { + $value = $this->_getColor($color); + $this->_color = $value; + } + + /** + * Sets the fill pattern attribute of a cell + * + * @access public + * @param integer $arg Optional. Defaults to 1. Meaningful values are: 0-18, + * 0 meaning no background. + */ + function setPattern($arg = 1) + { + $this->_pattern = $arg; + } + + /** + * Sets the underline of the text + * + * @access public + * @param integer $underline The value for underline. Possible values are: + * 1 => underline, 2 => double underline. + */ + function setUnderline($underline) + { + $this->_underline = $underline; + } + + /** + * Sets the font style as italic + * + * @access public + */ + function setItalic() + { + $this->_italic = 1; + } + + /** + * Sets the font size + * + * @access public + * @param integer $size The font size (in pixels I think). + */ + function setSize($size) + { + $this->_size = $size; + } + + /** + * Sets text wrapping + * + * @access public + */ + function setTextWrap() + { + $this->_text_wrap = 1; + } + + /** + * Sets the orientation of the text + * + * @access public + * @param integer $angle The rotation angle for the text (clockwise). Possible + values are: 0, 90, 270 and -1 for stacking top-to-bottom. + */ + function setTextRotation($angle) + { + switch ($angle) + { + case 0: + $this->_rotation = 0; + break; + case 90: + $this->_rotation = 3; + break; + case 270: + $this->_rotation = 2; + break; + case -1: + $this->_rotation = 1; + break; + default : + return $this->raiseError("Invalid value for angle.". + " Possible values are: 0, 90, 270 and -1 ". + "for stacking top-to-bottom."); + $this->_rotation = 0; + break; + } + } + + /** + * Sets the numeric format. + * It can be date, time, currency, etc... + * + * @access public + * @param integer $num_format The numeric format. + */ + function setNumFormat($num_format) + { + $this->_num_format = $num_format; + } + + /** + * Sets font as strikeout. + * + * @access public + */ + function setStrikeOut() + { + $this->_font_strikeout = 1; + } + + /** + * Sets outlining for a font. + * + * @access public + */ + function setOutLine() + { + $this->_font_outline = 1; + } + + /** + * Sets font as shadow. + * + * @access public + */ + function setShadow() + { + $this->_font_shadow = 1; + } + + /** + * Sets the script type of the text + * + * @access public + * @param integer $script The value for script type. Possible values are: + * 1 => superscript, 2 => subscript. + */ + function setScript($script) + { + $this->_font_script = $script; + } + + /** + * Locks a cell. + * + * @access public + */ + function setLocked() + { + $this->_locked = 1; + } + + /** + * Unlocks a cell. Useful for unprotecting particular cells of a protected sheet. + * + * @access public + */ + function setUnLocked() + { + $this->_locked = 0; + } + + /** + * Sets the font family name. + * + * @access public + * @param string $fontfamily The font family name. Possible values are: + * 'Times New Roman', 'Arial', 'Courier'. + */ + function setFontFamily($font_family) + { + $this->_font_name = $font_family; + } +} +?> diff --git a/thirdparty/pear/Spreadsheet/Excel/Writer/Parser.php b/thirdparty/pear/Spreadsheet/Excel/Writer/Parser.php new file mode 100644 index 000000000..651bec9f9 --- /dev/null +++ b/thirdparty/pear/Spreadsheet/Excel/Writer/Parser.php @@ -0,0 +1,1761 @@ +" +*/ +define('SPREADSHEET_EXCEL_WRITER_GT',">"); + +/** +* @const SPREADSHEET_EXCEL_WRITER_LT token identifier for character "<" +*/ +define('SPREADSHEET_EXCEL_WRITER_LT',"<"); + +/** +* @const SPREADSHEET_EXCEL_WRITER_LE token identifier for character "<=" +*/ +define('SPREADSHEET_EXCEL_WRITER_LE',"<="); + +/** +* @const SPREADSHEET_EXCEL_WRITER_GE token identifier for character ">=" +*/ +define('SPREADSHEET_EXCEL_WRITER_GE',">="); + +/** +* @const SPREADSHEET_EXCEL_WRITER_EQ token identifier for character "=" +*/ +define('SPREADSHEET_EXCEL_WRITER_EQ',"="); + +/** +* @const SPREADSHEET_EXCEL_WRITER_NE token identifier for character "<>" +*/ +define('SPREADSHEET_EXCEL_WRITER_NE',"<>"); + + +require_once('PEAR.php'); + +/** +* Class for parsing Excel formulas +* +* @author Xavier Noguer +* @category FileFormats +* @package Spreadsheet_Excel_Writer +*/ + +class Spreadsheet_Excel_Writer_Parser extends PEAR +{ + /** + * The index of the character we are currently looking at + * @var integer + */ + var $_current_char; + + /** + * The token we are working on. + * @var string + */ + var $_current_token; + + /** + * The formula to parse + * @var string + */ + var $_formula; + + /** + * The character ahead of the current char + * @var string + */ + var $_lookahead; + + /** + * The parse tree to be generated + * @var string + */ + var $_parse_tree; + + /** + * The byte order. 1 => big endian, 0 => little endian. + * @var integer + */ + var $_byte_order; + + /** + * Array of external sheets + * @var array + */ + var $_ext_sheets; + + /** + * Array of sheet references in the form of REF structures + * @var array + */ + var $_references; + + /** + * The BIFF version for the workbook + * @var integer + */ + var $_BIFF_version; + + /** + * The class constructor + * + * @param integer $byte_order The byte order (Little endian or Big endian) of the architecture + (optional). 1 => big endian, 0 (default) little endian. + */ + function Spreadsheet_Excel_Writer_Parser($byte_order, $biff_version) + { + $this->_current_char = 0; + $this->_BIFF_version = $biff_version; + $this->_current_token = ''; // The token we are working on. + $this->_formula = ""; // The formula to parse. + $this->_lookahead = ''; // The character ahead of the current char. + $this->_parse_tree = ''; // The parse tree to be generated. + $this->_initializeHashes(); // Initialize the hashes: ptg's and function's ptg's + $this->_byte_order = $byte_order; // Little Endian or Big Endian + $this->_ext_sheets = array(); + $this->_references = array(); + } + + /** + * Initialize the ptg and function hashes. + * + * @access private + */ + function _initializeHashes() + { + // The Excel ptg indices + $this->ptg = array( + 'ptgExp' => 0x01, + 'ptgTbl' => 0x02, + 'ptgAdd' => 0x03, + 'ptgSub' => 0x04, + 'ptgMul' => 0x05, + 'ptgDiv' => 0x06, + 'ptgPower' => 0x07, + 'ptgConcat' => 0x08, + 'ptgLT' => 0x09, + 'ptgLE' => 0x0A, + 'ptgEQ' => 0x0B, + 'ptgGE' => 0x0C, + 'ptgGT' => 0x0D, + 'ptgNE' => 0x0E, + 'ptgIsect' => 0x0F, + 'ptgUnion' => 0x10, + 'ptgRange' => 0x11, + 'ptgUplus' => 0x12, + 'ptgUminus' => 0x13, + 'ptgPercent' => 0x14, + 'ptgParen' => 0x15, + 'ptgMissArg' => 0x16, + 'ptgStr' => 0x17, + 'ptgAttr' => 0x19, + 'ptgSheet' => 0x1A, + 'ptgEndSheet' => 0x1B, + 'ptgErr' => 0x1C, + 'ptgBool' => 0x1D, + 'ptgInt' => 0x1E, + 'ptgNum' => 0x1F, + 'ptgArray' => 0x20, + 'ptgFunc' => 0x21, + 'ptgFuncVar' => 0x22, + 'ptgName' => 0x23, + 'ptgRef' => 0x24, + 'ptgArea' => 0x25, + 'ptgMemArea' => 0x26, + 'ptgMemErr' => 0x27, + 'ptgMemNoMem' => 0x28, + 'ptgMemFunc' => 0x29, + 'ptgRefErr' => 0x2A, + 'ptgAreaErr' => 0x2B, + 'ptgRefN' => 0x2C, + 'ptgAreaN' => 0x2D, + 'ptgMemAreaN' => 0x2E, + 'ptgMemNoMemN' => 0x2F, + 'ptgNameX' => 0x39, + 'ptgRef3d' => 0x3A, + 'ptgArea3d' => 0x3B, + 'ptgRefErr3d' => 0x3C, + 'ptgAreaErr3d' => 0x3D, + 'ptgArrayV' => 0x40, + 'ptgFuncV' => 0x41, + 'ptgFuncVarV' => 0x42, + 'ptgNameV' => 0x43, + 'ptgRefV' => 0x44, + 'ptgAreaV' => 0x45, + 'ptgMemAreaV' => 0x46, + 'ptgMemErrV' => 0x47, + 'ptgMemNoMemV' => 0x48, + 'ptgMemFuncV' => 0x49, + 'ptgRefErrV' => 0x4A, + 'ptgAreaErrV' => 0x4B, + 'ptgRefNV' => 0x4C, + 'ptgAreaNV' => 0x4D, + 'ptgMemAreaNV' => 0x4E, + 'ptgMemNoMemN' => 0x4F, + 'ptgFuncCEV' => 0x58, + 'ptgNameXV' => 0x59, + 'ptgRef3dV' => 0x5A, + 'ptgArea3dV' => 0x5B, + 'ptgRefErr3dV' => 0x5C, + 'ptgAreaErr3d' => 0x5D, + 'ptgArrayA' => 0x60, + 'ptgFuncA' => 0x61, + 'ptgFuncVarA' => 0x62, + 'ptgNameA' => 0x63, + 'ptgRefA' => 0x64, + 'ptgAreaA' => 0x65, + 'ptgMemAreaA' => 0x66, + 'ptgMemErrA' => 0x67, + 'ptgMemNoMemA' => 0x68, + 'ptgMemFuncA' => 0x69, + 'ptgRefErrA' => 0x6A, + 'ptgAreaErrA' => 0x6B, + 'ptgRefNA' => 0x6C, + 'ptgAreaNA' => 0x6D, + 'ptgMemAreaNA' => 0x6E, + 'ptgMemNoMemN' => 0x6F, + 'ptgFuncCEA' => 0x78, + 'ptgNameXA' => 0x79, + 'ptgRef3dA' => 0x7A, + 'ptgArea3dA' => 0x7B, + 'ptgRefErr3dA' => 0x7C, + 'ptgAreaErr3d' => 0x7D + ); + + // Thanks to Michael Meeks and Gnumeric for the initial arg values. + // + // The following hash was generated by "function_locale.pl" in the distro. + // Refer to function_locale.pl for non-English function names. + // + // The array elements are as follow: + // ptg: The Excel function ptg code. + // args: The number of arguments that the function takes: + // >=0 is a fixed number of arguments. + // -1 is a variable number of arguments. + // class: The reference, value or array class of the function args. + // vol: The function is volatile. + // + $this->_functions = array( + // function ptg args class vol + 'COUNT' => array( 0, -1, 0, 0 ), + 'IF' => array( 1, -1, 1, 0 ), + 'ISNA' => array( 2, 1, 1, 0 ), + 'ISERROR' => array( 3, 1, 1, 0 ), + 'SUM' => array( 4, -1, 0, 0 ), + 'AVERAGE' => array( 5, -1, 0, 0 ), + 'MIN' => array( 6, -1, 0, 0 ), + 'MAX' => array( 7, -1, 0, 0 ), + 'ROW' => array( 8, -1, 0, 0 ), + 'COLUMN' => array( 9, -1, 0, 0 ), + 'NA' => array( 10, 0, 0, 0 ), + 'NPV' => array( 11, -1, 1, 0 ), + 'STDEV' => array( 12, -1, 0, 0 ), + 'DOLLAR' => array( 13, -1, 1, 0 ), + 'FIXED' => array( 14, -1, 1, 0 ), + 'SIN' => array( 15, 1, 1, 0 ), + 'COS' => array( 16, 1, 1, 0 ), + 'TAN' => array( 17, 1, 1, 0 ), + 'ATAN' => array( 18, 1, 1, 0 ), + 'PI' => array( 19, 0, 1, 0 ), + 'SQRT' => array( 20, 1, 1, 0 ), + 'EXP' => array( 21, 1, 1, 0 ), + 'LN' => array( 22, 1, 1, 0 ), + 'LOG10' => array( 23, 1, 1, 0 ), + 'ABS' => array( 24, 1, 1, 0 ), + 'INT' => array( 25, 1, 1, 0 ), + 'SIGN' => array( 26, 1, 1, 0 ), + 'ROUND' => array( 27, 2, 1, 0 ), + 'LOOKUP' => array( 28, -1, 0, 0 ), + 'INDEX' => array( 29, -1, 0, 1 ), + 'REPT' => array( 30, 2, 1, 0 ), + 'MID' => array( 31, 3, 1, 0 ), + 'LEN' => array( 32, 1, 1, 0 ), + 'VALUE' => array( 33, 1, 1, 0 ), + 'TRUE' => array( 34, 0, 1, 0 ), + 'FALSE' => array( 35, 0, 1, 0 ), + 'AND' => array( 36, -1, 0, 0 ), + 'OR' => array( 37, -1, 0, 0 ), + 'NOT' => array( 38, 1, 1, 0 ), + 'MOD' => array( 39, 2, 1, 0 ), + 'DCOUNT' => array( 40, 3, 0, 0 ), + 'DSUM' => array( 41, 3, 0, 0 ), + 'DAVERAGE' => array( 42, 3, 0, 0 ), + 'DMIN' => array( 43, 3, 0, 0 ), + 'DMAX' => array( 44, 3, 0, 0 ), + 'DSTDEV' => array( 45, 3, 0, 0 ), + 'VAR' => array( 46, -1, 0, 0 ), + 'DVAR' => array( 47, 3, 0, 0 ), + 'TEXT' => array( 48, 2, 1, 0 ), + 'LINEST' => array( 49, -1, 0, 0 ), + 'TREND' => array( 50, -1, 0, 0 ), + 'LOGEST' => array( 51, -1, 0, 0 ), + 'GROWTH' => array( 52, -1, 0, 0 ), + 'PV' => array( 56, -1, 1, 0 ), + 'FV' => array( 57, -1, 1, 0 ), + 'NPER' => array( 58, -1, 1, 0 ), + 'PMT' => array( 59, -1, 1, 0 ), + 'RATE' => array( 60, -1, 1, 0 ), + 'MIRR' => array( 61, 3, 0, 0 ), + 'IRR' => array( 62, -1, 0, 0 ), + 'RAND' => array( 63, 0, 1, 1 ), + 'MATCH' => array( 64, -1, 0, 0 ), + 'DATE' => array( 65, 3, 1, 0 ), + 'TIME' => array( 66, 3, 1, 0 ), + 'DAY' => array( 67, 1, 1, 0 ), + 'MONTH' => array( 68, 1, 1, 0 ), + 'YEAR' => array( 69, 1, 1, 0 ), + 'WEEKDAY' => array( 70, -1, 1, 0 ), + 'HOUR' => array( 71, 1, 1, 0 ), + 'MINUTE' => array( 72, 1, 1, 0 ), + 'SECOND' => array( 73, 1, 1, 0 ), + 'NOW' => array( 74, 0, 1, 1 ), + 'AREAS' => array( 75, 1, 0, 1 ), + 'ROWS' => array( 76, 1, 0, 1 ), + 'COLUMNS' => array( 77, 1, 0, 1 ), + 'OFFSET' => array( 78, -1, 0, 1 ), + 'SEARCH' => array( 82, -1, 1, 0 ), + 'TRANSPOSE' => array( 83, 1, 1, 0 ), + 'TYPE' => array( 86, 1, 1, 0 ), + 'ATAN2' => array( 97, 2, 1, 0 ), + 'ASIN' => array( 98, 1, 1, 0 ), + 'ACOS' => array( 99, 1, 1, 0 ), + 'CHOOSE' => array( 100, -1, 1, 0 ), + 'HLOOKUP' => array( 101, -1, 0, 0 ), + 'VLOOKUP' => array( 102, -1, 0, 0 ), + 'ISREF' => array( 105, 1, 0, 0 ), + 'LOG' => array( 109, -1, 1, 0 ), + 'CHAR' => array( 111, 1, 1, 0 ), + 'LOWER' => array( 112, 1, 1, 0 ), + 'UPPER' => array( 113, 1, 1, 0 ), + 'PROPER' => array( 114, 1, 1, 0 ), + 'LEFT' => array( 115, -1, 1, 0 ), + 'RIGHT' => array( 116, -1, 1, 0 ), + 'EXACT' => array( 117, 2, 1, 0 ), + 'TRIM' => array( 118, 1, 1, 0 ), + 'REPLACE' => array( 119, 4, 1, 0 ), + 'SUBSTITUTE' => array( 120, -1, 1, 0 ), + 'CODE' => array( 121, 1, 1, 0 ), + 'FIND' => array( 124, -1, 1, 0 ), + 'CELL' => array( 125, -1, 0, 1 ), + 'ISERR' => array( 126, 1, 1, 0 ), + 'ISTEXT' => array( 127, 1, 1, 0 ), + 'ISNUMBER' => array( 128, 1, 1, 0 ), + 'ISBLANK' => array( 129, 1, 1, 0 ), + 'T' => array( 130, 1, 0, 0 ), + 'N' => array( 131, 1, 0, 0 ), + 'DATEVALUE' => array( 140, 1, 1, 0 ), + 'TIMEVALUE' => array( 141, 1, 1, 0 ), + 'SLN' => array( 142, 3, 1, 0 ), + 'SYD' => array( 143, 4, 1, 0 ), + 'DDB' => array( 144, -1, 1, 0 ), + 'INDIRECT' => array( 148, -1, 1, 1 ), + 'CALL' => array( 150, -1, 1, 0 ), + 'CLEAN' => array( 162, 1, 1, 0 ), + 'MDETERM' => array( 163, 1, 2, 0 ), + 'MINVERSE' => array( 164, 1, 2, 0 ), + 'MMULT' => array( 165, 2, 2, 0 ), + 'IPMT' => array( 167, -1, 1, 0 ), + 'PPMT' => array( 168, -1, 1, 0 ), + 'COUNTA' => array( 169, -1, 0, 0 ), + 'PRODUCT' => array( 183, -1, 0, 0 ), + 'FACT' => array( 184, 1, 1, 0 ), + 'DPRODUCT' => array( 189, 3, 0, 0 ), + 'ISNONTEXT' => array( 190, 1, 1, 0 ), + 'STDEVP' => array( 193, -1, 0, 0 ), + 'VARP' => array( 194, -1, 0, 0 ), + 'DSTDEVP' => array( 195, 3, 0, 0 ), + 'DVARP' => array( 196, 3, 0, 0 ), + 'TRUNC' => array( 197, -1, 1, 0 ), + 'ISLOGICAL' => array( 198, 1, 1, 0 ), + 'DCOUNTA' => array( 199, 3, 0, 0 ), + 'ROUNDUP' => array( 212, 2, 1, 0 ), + 'ROUNDDOWN' => array( 213, 2, 1, 0 ), + 'RANK' => array( 216, -1, 0, 0 ), + 'ADDRESS' => array( 219, -1, 1, 0 ), + 'DAYS360' => array( 220, -1, 1, 0 ), + 'TODAY' => array( 221, 0, 1, 1 ), + 'VDB' => array( 222, -1, 1, 0 ), + 'MEDIAN' => array( 227, -1, 0, 0 ), + 'SUMPRODUCT' => array( 228, -1, 2, 0 ), + 'SINH' => array( 229, 1, 1, 0 ), + 'COSH' => array( 230, 1, 1, 0 ), + 'TANH' => array( 231, 1, 1, 0 ), + 'ASINH' => array( 232, 1, 1, 0 ), + 'ACOSH' => array( 233, 1, 1, 0 ), + 'ATANH' => array( 234, 1, 1, 0 ), + 'DGET' => array( 235, 3, 0, 0 ), + 'INFO' => array( 244, 1, 1, 1 ), + 'DB' => array( 247, -1, 1, 0 ), + 'FREQUENCY' => array( 252, 2, 0, 0 ), + 'ERROR.TYPE' => array( 261, 1, 1, 0 ), + 'REGISTER.ID' => array( 267, -1, 1, 0 ), + 'AVEDEV' => array( 269, -1, 0, 0 ), + 'BETADIST' => array( 270, -1, 1, 0 ), + 'GAMMALN' => array( 271, 1, 1, 0 ), + 'BETAINV' => array( 272, -1, 1, 0 ), + 'BINOMDIST' => array( 273, 4, 1, 0 ), + 'CHIDIST' => array( 274, 2, 1, 0 ), + 'CHIINV' => array( 275, 2, 1, 0 ), + 'COMBIN' => array( 276, 2, 1, 0 ), + 'CONFIDENCE' => array( 277, 3, 1, 0 ), + 'CRITBINOM' => array( 278, 3, 1, 0 ), + 'EVEN' => array( 279, 1, 1, 0 ), + 'EXPONDIST' => array( 280, 3, 1, 0 ), + 'FDIST' => array( 281, 3, 1, 0 ), + 'FINV' => array( 282, 3, 1, 0 ), + 'FISHER' => array( 283, 1, 1, 0 ), + 'FISHERINV' => array( 284, 1, 1, 0 ), + 'FLOOR' => array( 285, 2, 1, 0 ), + 'GAMMADIST' => array( 286, 4, 1, 0 ), + 'GAMMAINV' => array( 287, 3, 1, 0 ), + 'CEILING' => array( 288, 2, 1, 0 ), + 'HYPGEOMDIST' => array( 289, 4, 1, 0 ), + 'LOGNORMDIST' => array( 290, 3, 1, 0 ), + 'LOGINV' => array( 291, 3, 1, 0 ), + 'NEGBINOMDIST' => array( 292, 3, 1, 0 ), + 'NORMDIST' => array( 293, 4, 1, 0 ), + 'NORMSDIST' => array( 294, 1, 1, 0 ), + 'NORMINV' => array( 295, 3, 1, 0 ), + 'NORMSINV' => array( 296, 1, 1, 0 ), + 'STANDARDIZE' => array( 297, 3, 1, 0 ), + 'ODD' => array( 298, 1, 1, 0 ), + 'PERMUT' => array( 299, 2, 1, 0 ), + 'POISSON' => array( 300, 3, 1, 0 ), + 'TDIST' => array( 301, 3, 1, 0 ), + 'WEIBULL' => array( 302, 4, 1, 0 ), + 'SUMXMY2' => array( 303, 2, 2, 0 ), + 'SUMX2MY2' => array( 304, 2, 2, 0 ), + 'SUMX2PY2' => array( 305, 2, 2, 0 ), + 'CHITEST' => array( 306, 2, 2, 0 ), + 'CORREL' => array( 307, 2, 2, 0 ), + 'COVAR' => array( 308, 2, 2, 0 ), + 'FORECAST' => array( 309, 3, 2, 0 ), + 'FTEST' => array( 310, 2, 2, 0 ), + 'INTERCEPT' => array( 311, 2, 2, 0 ), + 'PEARSON' => array( 312, 2, 2, 0 ), + 'RSQ' => array( 313, 2, 2, 0 ), + 'STEYX' => array( 314, 2, 2, 0 ), + 'SLOPE' => array( 315, 2, 2, 0 ), + 'TTEST' => array( 316, 4, 2, 0 ), + 'PROB' => array( 317, -1, 2, 0 ), + 'DEVSQ' => array( 318, -1, 0, 0 ), + 'GEOMEAN' => array( 319, -1, 0, 0 ), + 'HARMEAN' => array( 320, -1, 0, 0 ), + 'SUMSQ' => array( 321, -1, 0, 0 ), + 'KURT' => array( 322, -1, 0, 0 ), + 'SKEW' => array( 323, -1, 0, 0 ), + 'ZTEST' => array( 324, -1, 0, 0 ), + 'LARGE' => array( 325, 2, 0, 0 ), + 'SMALL' => array( 326, 2, 0, 0 ), + 'QUARTILE' => array( 327, 2, 0, 0 ), + 'PERCENTILE' => array( 328, 2, 0, 0 ), + 'PERCENTRANK' => array( 329, -1, 0, 0 ), + 'MODE' => array( 330, -1, 2, 0 ), + 'TRIMMEAN' => array( 331, 2, 0, 0 ), + 'TINV' => array( 332, 2, 1, 0 ), + 'CONCATENATE' => array( 336, -1, 1, 0 ), + 'POWER' => array( 337, 2, 1, 0 ), + 'RADIANS' => array( 342, 1, 1, 0 ), + 'DEGREES' => array( 343, 1, 1, 0 ), + 'SUBTOTAL' => array( 344, -1, 0, 0 ), + 'SUMIF' => array( 345, -1, 0, 0 ), + 'COUNTIF' => array( 346, 2, 0, 0 ), + 'COUNTBLANK' => array( 347, 1, 0, 0 ), + 'ROMAN' => array( 354, -1, 1, 0 ) + ); + } + + /** + * Convert a token to the proper ptg value. + * + * @access private + * @param mixed $token The token to convert. + * @return mixed the converted token on success. PEAR_Error if the token + * is not recognized + */ + function _convert($token) + { + if (preg_match("/^\"[^\"]{0,255}\"$/", $token)) + { + return $this->_convertString($token); + } + elseif (is_numeric($token)) + { + return $this->_convertNumber($token); + } + // match references like A1 or $A$1 + elseif (preg_match('/^\$?([A-Ia-i]?[A-Za-z])\$?(\d+)$/',$token)) + { + return $this->_convertRef2d($token); + } + // match external references like Sheet1!A1 or Sheet1:Sheet2!A1 + elseif (preg_match("/^\w+(\:\w+)?\![A-Ia-i]?[A-Za-z](\d+)$/",$token)) + { + return $this->_convertRef3d($token); + } + // match external references like Sheet1!A1 or Sheet1:Sheet2!A1 + elseif (preg_match("/^'\w+(\:\w+)?'\![A-Ia-i]?[A-Za-z](\d+)$/",$token)) + { + return $this->_convertRef3d($token); + } + // match ranges like A1:B2 + elseif (preg_match("/^(\$)?[A-Ia-i]?[A-Za-z](\$)?(\d+)\:(\$)?[A-Ia-i]?[A-Za-z](\$)?(\d+)$/",$token)) + { + return $this->_convertRange2d($token); + } + // match ranges like A1..B2 + elseif (preg_match("/^(\$)?[A-Ia-i]?[A-Za-z](\$)?(\d+)\.\.(\$)?[A-Ia-i]?[A-Za-z](\$)?(\d+)$/",$token)) + { + return $this->_convertRange2d($token); + } + // match external ranges like Sheet1!A1 or Sheet1:Sheet2!A1:B2 + elseif (preg_match("/^\w+(\:\w+)?\!([A-Ia-i]?[A-Za-z])?(\d+)\:([A-Ia-i]?[A-Za-z])?(\d+)$/",$token)) + { + return $this->_convertRange3d($token); + } + // match external ranges like 'Sheet1'!A1 or 'Sheet1:Sheet2'!A1:B2 + elseif (preg_match("/^'\w+(\:\w+)?'\!([A-Ia-i]?[A-Za-z])?(\d+)\:([A-Ia-i]?[A-Za-z])?(\d+)$/",$token)) + { + return $this->_convertRange3d($token); + } + elseif (isset($this->ptg[$token])) // operators (including parentheses) + { + return pack("C", $this->ptg[$token]); + } + // commented so argument number can be processed correctly. See toReversePolish(). + /*elseif (preg_match("/[A-Z0-9\xc0-\xdc\.]+/",$token)) + { + return($this->_convertFunction($token,$this->_func_args)); + }*/ + // if it's an argument, ignore the token (the argument remains) + elseif ($token == 'arg') + { + return ''; + } + // TODO: use real error codes + return $this->raiseError("Unknown token $token"); + } + + /** + * Convert a number token to ptgInt or ptgNum + * + * @access private + * @param mixed $num an integer or double for conversion to its ptg value + */ + function _convertNumber($num) + { + // Integer in the range 0..2**16-1 + if ((preg_match("/^\d+$/",$num)) and ($num <= 65535)) { + return pack("Cv", $this->ptg['ptgInt'], $num); + } + else // A float + { + if ($this->_byte_order) { // if it's Big Endian + $num = strrev($num); + } + return pack("Cd", $this->ptg['ptgNum'], $num); + } + } + + /** + * Convert a string token to ptgStr + * + * @access private + * @param string $string A string for conversion to its ptg value. + * @return mixed the converted token on success. PEAR_Error if the string + * is longer than 255 characters. + */ + function _convertString($string) + { + // chop away beggining and ending quotes + $string = substr($string, 1, strlen($string) - 2); + if (strlen($string) > 255) { + return $this->raiseError("String is too long"); + } + if ($this->_BIFF_version == 0x0500) { + return pack("CC", $this->ptg['ptgStr'], strlen($string)).$string; + } + elseif ($this->_BIFF_version == 0x0600) { + $encoding = 0; // TODO: Unicode support + return pack("CCC", $this->ptg['ptgStr'], strlen($string), $encoding).$string; + } + } + + /** + * Convert a function to a ptgFunc or ptgFuncVarV depending on the number of + * args that it takes. + * + * @access private + * @param string $token The name of the function for convertion to ptg value. + * @param integer $num_args The number of arguments the function receives. + * @return string The packed ptg for the function + */ + function _convertFunction($token, $num_args) + { + $args = $this->_functions[$token][1]; + $volatile = $this->_functions[$token][3]; + + // Fixed number of args eg. TIME($i,$j,$k). + if ($args >= 0) { + return pack("Cv", $this->ptg['ptgFuncV'], $this->_functions[$token][0]); + } + // Variable number of args eg. SUM($i,$j,$k, ..). + if ($args == -1) { + return pack("CCv", $this->ptg['ptgFuncVarV'], $num_args, $this->_functions[$token][0]); + } + } + + /** + * Convert an Excel range such as A1:D4 to a ptgRefV. + * + * @access private + * @param string $range An Excel range in the A1:A2 or A1..A2 format. + */ + function _convertRange2d($range) + { + $class = 2; // as far as I know, this is magick. + + // Split the range into 2 cell refs + if (preg_match("/^([A-Ia-i]?[A-Za-z])(\d+)\:([A-Ia-i]?[A-Za-z])(\d+)$/",$range)) { + list($cell1, $cell2) = explode(':', $range); + } + elseif (preg_match("/^([A-Ia-i]?[A-Za-z])(\d+)\.\.([A-Ia-i]?[A-Za-z])(\d+)$/",$range)) { + list($cell1, $cell2) = explode('\.\.', $range); + + } + else { + // TODO: use real error codes + return $this->raiseError("Unknown range separator", 0, PEAR_ERROR_DIE); + } + + // Convert the cell references + $cell_array1 = $this->_cellToPackedRowcol($cell1); + if (PEAR::isError($cell_array1)) { + return $cell_array1; + } + list($row1, $col1) = $cell_array1; + $cell_array2 = $this->_cellToPackedRowcol($cell2); + if (PEAR::isError($cell_array2)) { + return $cell_array2; + } + list($row2, $col2) = $cell_array2; + + // The ptg value depends on the class of the ptg. + if ($class == 0) { + $ptgArea = pack("C", $this->ptg['ptgArea']); + } + elseif ($class == 1) { + $ptgArea = pack("C", $this->ptg['ptgAreaV']); + } + elseif ($class == 2) { + $ptgArea = pack("C", $this->ptg['ptgAreaA']); + } + else { + // TODO: use real error codes + return $this->raiseError("Unknown class $class", 0, PEAR_ERROR_DIE); + } + return $ptgArea . $row1 . $row2 . $col1. $col2; + } + + /** + * Convert an Excel 3d range such as "Sheet1!A1:D4" or "Sheet1:Sheet2!A1:D4" to + * a ptgArea3d. + * + * @access private + * @param string $token An Excel range in the Sheet1!A1:A2 format. + * @return mixed The packed ptgArea3d token on success, PEAR_Error on failure. + */ + function _convertRange3d($token) + { + $class = 2; // as far as I know, this is magick. + + // Split the ref at the ! symbol + list($ext_ref, $range) = explode('!', $token); + + // Convert the external reference part (different for BIFF8) + if ($this->_BIFF_version == 0x0500) { + $ext_ref = $this->_packExtRef($ext_ref); + if (PEAR::isError($ext_ref)) { + return $ext_ref; + } + } + elseif ($this->_BIFF_version == 0x0600) { + $ext_ref = $this->_getRefIndex($ext_ref); + if (PEAR::isError($ext_ref)) { + return $ext_ref; + } + } + + // Split the range into 2 cell refs + list($cell1, $cell2) = explode(':', $range); + + // Convert the cell references + if (preg_match("/^(\$)?[A-Ia-i]?[A-Za-z](\$)?(\d+)$/", $cell1)) + { + $cell_array1 = $this->_cellToPackedRowcol($cell1); + if (PEAR::isError($cell_array1)) { + return $cell_array1; + } + list($row1, $col1) = $cell_array1; + $cell_array2 = $this->_cellToPackedRowcol($cell2); + if (PEAR::isError($cell_array2)) { + return $cell_array2; + } + list($row2, $col2) = $cell_array2; + } + else { // It's a rows range (like 26:27) + $cells_array = $this->_rangeToPackedRange($cell1.':'.$cell2); + if (PEAR::isError($cells_array)) { + return $cells_array; + } + list($row1, $col1, $row2, $col2) = $cells_array; + } + + // The ptg value depends on the class of the ptg. + if ($class == 0) { + $ptgArea = pack("C", $this->ptg['ptgArea3d']); + } + elseif ($class == 1) { + $ptgArea = pack("C", $this->ptg['ptgArea3dV']); + } + elseif ($class == 2) { + $ptgArea = pack("C", $this->ptg['ptgArea3dA']); + } + else { + return $this->raiseError("Unknown class $class", 0, PEAR_ERROR_DIE); + } + + return $ptgArea . $ext_ref . $row1 . $row2 . $col1. $col2; + } + + /** + * Convert an Excel reference such as A1, $B2, C$3 or $D$4 to a ptgRefV. + * + * @access private + * @param string $cell An Excel cell reference + * @return string The cell in packed() format with the corresponding ptg + */ + function _convertRef2d($cell) + { + $class = 2; // as far as I know, this is magick. + + // Convert the cell reference + $cell_array = $this->_cellToPackedRowcol($cell); + if (PEAR::isError($cell_array)) { + return $cell_array; + } + list($row, $col) = $cell_array; + + // The ptg value depends on the class of the ptg. + if ($class == 0) { + $ptgRef = pack("C", $this->ptg['ptgRef']); + } + elseif ($class == 1) { + $ptgRef = pack("C", $this->ptg['ptgRefV']); + } + elseif ($class == 2) { + $ptgRef = pack("C", $this->ptg['ptgRefA']); + } + else { + // TODO: use real error codes + return $this->raiseError("Unknown class $class"); + } + return $ptgRef.$row.$col; + } + + /** + * Convert an Excel 3d reference such as "Sheet1!A1" or "Sheet1:Sheet2!A1" to a + * ptgRef3d. + * + * @access private + * @param string $cell An Excel cell reference + * @return mixed The packed ptgRef3d token on success, PEAR_Error on failure. + */ + function _convertRef3d($cell) + { + $class = 2; // as far as I know, this is magick. + + // Split the ref at the ! symbol + list($ext_ref, $cell) = explode('!', $cell); + + // Convert the external reference part (different for BIFF8) + if ($this->_BIFF_version == 0x0500) { + $ext_ref = $this->_packExtRef($ext_ref); + if (PEAR::isError($ext_ref)) { + return $ext_ref; + } + } + elseif ($this->_BIFF_version == 0x0600) { + $ext_ref = $this->_getRefIndex($ext_ref); + if (PEAR::isError($ext_ref)) { + return $ext_ref; + } + } + + // Convert the cell reference part + list($row, $col) = $this->_cellToPackedRowcol($cell); + + // The ptg value depends on the class of the ptg. + if ($class == 0) { + $ptgRef = pack("C", $this->ptg['ptgRef3d']); + } + elseif ($class == 1) { + $ptgRef = pack("C", $this->ptg['ptgRef3dV']); + } + elseif ($class == 2) { + $ptgRef = pack("C", $this->ptg['ptgRef3dA']); + } + else { + return $this->raiseError("Unknown class $class", 0, PEAR_ERROR_DIE); + } + + return $ptgRef . $ext_ref. $row . $col; + } + + /** + * Convert the sheet name part of an external reference, for example "Sheet1" or + * "Sheet1:Sheet2", to a packed structure. + * + * @access private + * @param string $ext_ref The name of the external reference + * @return string The reference index in packed() format + */ + function _packExtRef($ext_ref) + { + $ext_ref = preg_replace("/^'/", '', $ext_ref); // Remove leading ' if any. + $ext_ref = preg_replace("/'$/", '', $ext_ref); // Remove trailing ' if any. + + // Check if there is a sheet range eg., Sheet1:Sheet2. + if (preg_match("/:/", $ext_ref)) + { + list($sheet_name1, $sheet_name2) = explode(':', $ext_ref); + + $sheet1 = $this->_getSheetIndex($sheet_name1); + if ($sheet1 == -1) { + return $this->raiseError("Unknown sheet name $sheet_name1 in formula"); + } + $sheet2 = $this->_getSheetIndex($sheet_name2); + if ($sheet2 == -1) { + return $this->raiseError("Unknown sheet name $sheet_name2 in formula"); + } + + // Reverse max and min sheet numbers if necessary + if ($sheet1 > $sheet2) { + list($sheet1, $sheet2) = array($sheet2, $sheet1); + } + } + else // Single sheet name only. + { + $sheet1 = $this->_getSheetIndex($ext_ref); + if ($sheet1 == -1) { + return $this->raiseError("Unknown sheet name $ext_ref in formula"); + } + $sheet2 = $sheet1; + } + + // References are stored relative to 0xFFFF. + $offset = -1 - $sheet1; + + return pack('vdvv', $offset, 0x00, $sheet1, $sheet2); + } + + /** + * Look up the REF index that corresponds to an external sheet name + * (or range). If it doesn't exist yet add it to the workbook's references + * array. It assumes all sheet names given must exist. + * + * @access private + * @param string $ext_ref The name of the external reference + * @return mixed The reference index in packed() format on success, + * PEAR_Error on failure + */ + function _getRefIndex($ext_ref) + { + $ext_ref = preg_replace("/^'/", '', $ext_ref); // Remove leading ' if any. + $ext_ref = preg_replace("/'$/", '', $ext_ref); // Remove trailing ' if any. + + // Check if there is a sheet range eg., Sheet1:Sheet2. + if (preg_match("/:/", $ext_ref)) + { + list($sheet_name1, $sheet_name2) = explode(':', $ext_ref); + + $sheet1 = $this->_getSheetIndex($sheet_name1); + if ($sheet1 == -1) { + return $this->raiseError("Unknown sheet name $sheet_name1 in formula"); + } + $sheet2 = $this->_getSheetIndex($sheet_name2); + if ($sheet2 == -1) { + return $this->raiseError("Unknown sheet name $sheet_name2 in formula"); + } + + // Reverse max and min sheet numbers if necessary + if ($sheet1 > $sheet2) { + list($sheet1, $sheet2) = array($sheet2, $sheet1); + } + } + else // Single sheet name only. + { + $sheet1 = $this->_getSheetIndex($ext_ref); + if ($sheet1 == -1) { + return $this->raiseError("Unknown sheet name $ext_ref in formula"); + } + $sheet2 = $sheet1; + } + + // assume all references belong to this document + $supbook_index = 0x00; + $ref = pack('vvv', $supbook_index, $sheet1, $sheet2); + $total_references = count($this->_references); + $index = -1; + for ($i = 0; $i < $total_references; $i++) + { + if ($ref == $this->_references[$i]) { + $index = $i; + break; + } + } + // if REF was not found add it to references array + if ($index == -1) + { + $this->_references[$total_references] = $ref; + $index = $total_references; + } + + return pack('v', $index); + } + + /** + * Look up the index that corresponds to an external sheet name. The hash of + * sheet names is updated by the addworksheet() method of the + * Spreadsheet_Excel_Writer_Workbook class. + * + * @access private + * @return integer The sheet index, -1 if the sheet was not found + */ + function _getSheetIndex($sheet_name) + { + if (!isset($this->_ext_sheets[$sheet_name])) { + return -1; + } + else { + return $this->_ext_sheets[$sheet_name]; + } + } + + /** + * This method is used to update the array of sheet names. It is + * called by the addWorksheet() method of the + * Spreadsheet_Excel_Writer_Workbook class. + * + * @access public + * @see Spreadsheet_Excel_Writer_Workbook::addWorksheet() + * @param string $name The name of the worksheet being added + * @param integer $index The index of the worksheet being added + */ + function setExtSheet($name, $index) + { + $this->_ext_sheets[$name] = $index; + } + + /** + * pack() row and column into the required 3 or 4 byte format. + * + * @access private + * @param string $cell The Excel cell reference to be packed + * @return array Array containing the row and column in packed() format + */ + function _cellToPackedRowcol($cell) + { + $cell = strtoupper($cell); + list($row, $col, $row_rel, $col_rel) = $this->_cellToRowcol($cell); + if ($col >= 256) { + return $this->raiseError("Column in: $cell greater than 255"); + } + // FIXME: change for BIFF8 + if ($row >= 16384) { + return $this->raiseError("Row in: $cell greater than 16384 "); + } + + // Set the high bits to indicate if row or col are relative. + if ($this->_BIFF_version == 0x0500) { + $row |= $col_rel << 14; + $row |= $row_rel << 15; + $col = pack('C', $col); + } + elseif ($this->_BIFF_version == 0x0600) { + $col |= $col_rel << 14; + $col |= $row_rel << 15; + $col = pack('v', $col); + } + $row = pack('v', $row); + + return array($row, $col); + } + + /** + * pack() row range into the required 3 or 4 byte format. + * Just using maximum col/rows, which is probably not the correct solution + * + * @access private + * @param string $range The Excel range to be packed + * @return array Array containing (row1,col1,row2,col2) in packed() format + */ + function _rangeToPackedRange($range) + { + preg_match('/(\$)?(\d+)\:(\$)?(\d+)/', $range, $match); + // return absolute rows if there is a $ in the ref + $row1_rel = empty($match[1]) ? 1 : 0; + $row1 = $match[2]; + $row2_rel = empty($match[3]) ? 1 : 0; + $row2 = $match[4]; + // Convert 1-index to zero-index + $row1--; + $row2--; + // Trick poor inocent Excel + $col1 = 0; + $col2 = 16383; // FIXME: maximum possible value for Excel 5 (change this!!!) + + // FIXME: this changes for BIFF8 + if (($row1 >= 16384) or ($row2 >= 16384)) { + return $this->raiseError("Row in: $range greater than 16384 "); + } + + // Set the high bits to indicate if rows are relative. + if ($this->_BIFF_version == 0x0500) { + $row1 |= $row1_rel << 14; // FIXME: probably a bug + $row2 |= $row2_rel << 15; + $col1 = pack('C', $col1); + $col2 = pack('C', $col2); + } + elseif ($this->_BIFF_version == 0x0600) { + $col1 |= $row1_rel << 15; + $col2 |= $row2_rel << 15; + $col1 = pack('v', $col1); + $col2 = pack('v', $col2); + } + $row1 = pack('v', $row1); + $row2 = pack('v', $row2); + + return array($row1, $col1, $row2, $col2); + } + + /** + * Convert an Excel cell reference such as A1 or $B2 or C$3 or $D$4 to a zero + * indexed row and column number. Also returns two (0,1) values to indicate + * whether the row or column are relative references. + * + * @access private + * @param string $cell The Excel cell reference in A1 format. + * @return array + */ + function _cellToRowcol($cell) + { + preg_match('/(\$)?([A-I]?[A-Z])(\$)?(\d+)/',$cell,$match); + // return absolute column if there is a $ in the ref + $col_rel = empty($match[1]) ? 1 : 0; + $col_ref = $match[2]; + $row_rel = empty($match[3]) ? 1 : 0; + $row = $match[4]; + + // Convert base26 column string to a number. + $expn = strlen($col_ref) - 1; + $col = 0; + for ($i=0; $i < strlen($col_ref); $i++) + { + $col += (ord($col_ref{$i}) - ord('A') + 1) * pow(26, $expn); + $expn--; + } + + // Convert 1-index to zero-index + $row--; + $col--; + + return array($row, $col, $row_rel, $col_rel); + } + + /** + * Advance to the next valid token. + * + * @access private + */ + function _advance() + { + $i = $this->_current_char; + // eat up white spaces + if ($i < strlen($this->_formula)) + { + while ($this->_formula{$i} == " ") { + $i++; + } + if ($i < strlen($this->_formula) - 1) { + $this->_lookahead = $this->_formula{$i+1}; + } + $token = ""; + } + while ($i < strlen($this->_formula)) + { + $token .= $this->_formula{$i}; + if ($i < strlen($this->_formula) - 1) { + $this->_lookahead = $this->_formula{$i+1}; + } + else { + $this->_lookahead = ''; + } + if ($this->_match($token) != '') + { + //if ($i < strlen($this->_formula) - 1) { + // $this->_lookahead = $this->_formula{$i+1}; + //} + $this->_current_char = $i + 1; + $this->_current_token = $token; + return 1; + } + if ($i < strlen($this->_formula) - 2) { + $this->_lookahead = $this->_formula{$i+2}; + } + // if we run out of characters _lookahead becomes empty + else { + $this->_lookahead = ''; + } + $i++; + } + //die("Lexical error ".$this->_current_char); + } + + /** + * Checks if it's a valid token. + * + * @access private + * @param mixed $token The token to check. + * @return mixed The checked token or false on failure + */ + function _match($token) + { + switch($token) + { + case SPREADSHEET_EXCEL_WRITER_ADD: + return $token; + break; + case SPREADSHEET_EXCEL_WRITER_SUB: + return $token; + break; + case SPREADSHEET_EXCEL_WRITER_MUL: + return $token; + break; + case SPREADSHEET_EXCEL_WRITER_DIV: + return $token; + break; + case SPREADSHEET_EXCEL_WRITER_OPEN: + return $token; + break; + case SPREADSHEET_EXCEL_WRITER_CLOSE: + return $token; + break; + case SPREADSHEET_EXCEL_WRITER_COMA: + return $token; + break; + case SPREADSHEET_EXCEL_WRITER_SEMICOLON: + return $token; + break; + case SPREADSHEET_EXCEL_WRITER_GT: + if ($this->_lookahead == '=') { // it's a GE token + break; + } + return $token; + break; + case SPREADSHEET_EXCEL_WRITER_LT: + // it's a LE or a NE token + if (($this->_lookahead == '=') or ($this->_lookahead == '>')) { + break; + } + return $token; + break; + case SPREADSHEET_EXCEL_WRITER_GE: + return $token; + break; + case SPREADSHEET_EXCEL_WRITER_LE: + return $token; + break; + case SPREADSHEET_EXCEL_WRITER_EQ: + return $token; + break; + case SPREADSHEET_EXCEL_WRITER_NE: + return $token; + break; + default: + // if it's a reference + if (preg_match('/^\$?[A-Ia-i]?[A-Za-z]\$?[0-9]+$/',$token) and + !ereg("[0-9]",$this->_lookahead) and + ($this->_lookahead != ':') and ($this->_lookahead != '.') and + ($this->_lookahead != '!')) + { + return $token; + } + // If it's an external reference (Sheet1!A1 or Sheet1:Sheet2!A1) + elseif (preg_match("/^\w+(\:\w+)?\![A-Ia-i]?[A-Za-z][0-9]+$/",$token) and + !ereg("[0-9]",$this->_lookahead) and + ($this->_lookahead != ':') and ($this->_lookahead != '.')) + { + return $token; + } + // If it's an external reference (Sheet1!A1 or Sheet1:Sheet2!A1) + elseif (preg_match("/^'\w+(\:\w+)?'\![A-Ia-i]?[A-Za-z][0-9]+$/",$token) and + !ereg("[0-9]",$this->_lookahead) and + ($this->_lookahead != ':') and ($this->_lookahead != '.')) + { + return $token; + } + // if it's a range (A1:A2) + elseif (preg_match("/^(\$)?[A-Ia-i]?[A-Za-z](\$)?[0-9]+:(\$)?[A-Ia-i]?[A-Za-z](\$)?[0-9]+$/",$token) and + !ereg("[0-9]",$this->_lookahead)) + { + return $token; + } + // if it's a range (A1..A2) + elseif (preg_match("/^(\$)?[A-Ia-i]?[A-Za-z](\$)?[0-9]+\.\.(\$)?[A-Ia-i]?[A-Za-z](\$)?[0-9]+$/",$token) and + !ereg("[0-9]",$this->_lookahead)) + { + return $token; + } + // If it's an external range like Sheet1!A1 or Sheet1:Sheet2!A1:B2 + elseif (preg_match("/^\w+(\:\w+)?\!([A-Ia-i]?[A-Za-z])?[0-9]+:([A-Ia-i]?[A-Za-z])?[0-9]+$/",$token) and + !ereg("[0-9]",$this->_lookahead)) + { + return $token; + } + // If it's an external range like 'Sheet1'!A1 or 'Sheet1:Sheet2'!A1:B2 + elseif (preg_match("/^'\w+(\:\w+)?'\!([A-Ia-i]?[A-Za-z])?[0-9]+:([A-Ia-i]?[A-Za-z])?[0-9]+$/",$token) and + !ereg("[0-9]",$this->_lookahead)) + { + return $token; + } + // If it's a number (check that it's not a sheet name or range) + elseif (is_numeric($token) and + (!is_numeric($token.$this->_lookahead) or ($this->_lookahead == '')) and + ($this->_lookahead != '!') and ($this->_lookahead != ':')) + { + return $token; + } + // If it's a string (of maximum 255 characters) + //elseif (ereg("^\"[^\"]{0,255}\"$",$token)) + elseif (preg_match("/{0,255}/",$token)) + { + return $token; + } + // if it's a function call + elseif (preg_match("/[A-Z0-9\xc0-\xdc\.]/",$token) and ($this->_lookahead == "(")) + { + return $token; + } + return ''; + } + } + + /** + * The parsing method. It parses a formula. + * + * @access public + * @param string $formula The formula to parse, without the initial equal + * sign (=). + * @return mixed true on success, PEAR_Error on failure + */ + function parse($formula) + { + $this->_current_char = 0; + $this->_formula = $formula; + $this->_lookahead = $formula{1}; + $this->_advance(); + $this->_parse_tree = $this->_condition(); + if (PEAR::isError($this->_parse_tree)) { + return $this->_parse_tree; + } + return true; + } + + /** + * It parses a condition. It assumes the following rule: + * Cond -> Expr [(">" | "<") Expr] + * + * @access private + * @return mixed The parsed ptg'd tree on success, PEAR_Error on failure + */ + function _condition() + { + $result = $this->_expression(); + if (PEAR::isError($result)) { + return $result; + } + if ($this->_current_token == SPREADSHEET_EXCEL_WRITER_LT) + { + $this->_advance(); + $result2 = $this->_expression(); + if (PEAR::isError($result2)) { + return $result2; + } + $result = $this->_createTree('ptgLT', $result, $result2); + } + elseif ($this->_current_token == SPREADSHEET_EXCEL_WRITER_GT) + { + $this->_advance(); + $result2 = $this->_expression(); + if (PEAR::isError($result2)) { + return $result2; + } + $result = $this->_createTree('ptgGT', $result, $result2); + } + elseif ($this->_current_token == SPREADSHEET_EXCEL_WRITER_LE) + { + $this->_advance(); + $result2 = $this->_expression(); + if (PEAR::isError($result2)) { + return $result2; + } + $result = $this->_createTree('ptgLE', $result, $result2); + } + elseif ($this->_current_token == SPREADSHEET_EXCEL_WRITER_GE) + { + $this->_advance(); + $result2 = $this->_expression(); + if (PEAR::isError($result2)) { + return $result2; + } + $result = $this->_createTree('ptgGE', $result, $result2); + } + elseif ($this->_current_token == SPREADSHEET_EXCEL_WRITER_EQ) + { + $this->_advance(); + $result2 = $this->_expression(); + if (PEAR::isError($result2)) { + return $result2; + } + $result = $this->_createTree('ptgEQ', $result, $result2); + } + elseif ($this->_current_token == SPREADSHEET_EXCEL_WRITER_NE) + { + $this->_advance(); + $result2 = $this->_expression(); + if (PEAR::isError($result2)) { + return $result2; + } + $result = $this->_createTree('ptgNE', $result, $result2); + } + return $result; + } + + /** + * It parses a expression. It assumes the following rule: + * Expr -> Term [("+" | "-") Term] + * -> "string" + * -> "-" Term + * + * @access private + * @return mixed The parsed ptg'd tree on success, PEAR_Error on failure + */ + function _expression() + { + // If it's a string return a string node + if (ereg("^\"[^\"]{0,255}\"$", $this->_current_token)) { + $result = $this->_createTree($this->_current_token, '', ''); + $this->_advance(); + return $result; + } + // catch "-" Term + elseif ($this->_current_token == SPREADSHEET_EXCEL_WRITER_SUB) { + $this->_advance(); + $result2 = $this->_expression(); + $result = $this->_createTree('ptgUminus', $result2, ''); + return $result; + } + $result = $this->_term(); + if (PEAR::isError($result)) { + return $result; + } + while (($this->_current_token == SPREADSHEET_EXCEL_WRITER_ADD) or + ($this->_current_token == SPREADSHEET_EXCEL_WRITER_SUB)) + { + if ($this->_current_token == SPREADSHEET_EXCEL_WRITER_ADD) + { + $this->_advance(); + $result2 = $this->_term(); + if (PEAR::isError($result2)) { + return $result2; + } + $result = $this->_createTree('ptgAdd', $result, $result2); + } + else + { + $this->_advance(); + $result2 = $this->_term(); + if (PEAR::isError($result2)) { + return $result2; + } + $result = $this->_createTree('ptgSub', $result, $result2); + } + } + return $result; + } + + /** + * This function just introduces a ptgParen element in the tree, so that Excel + * doesn't get confused when working with a parenthesized formula afterwards. + * + * @access private + * @see _fact() + * @return array The parsed ptg'd tree + */ + function _parenthesizedExpression() + { + $result = $this->_createTree('ptgParen', $this->_expression(), ''); + return $result; + } + + /** + * It parses a term. It assumes the following rule: + * Term -> Fact [("*" | "/") Fact] + * + * @access private + * @return mixed The parsed ptg'd tree on success, PEAR_Error on failure + */ + function _term() + { + $result = $this->_fact(); + if (PEAR::isError($result)) { + return $result; + } + while (($this->_current_token == SPREADSHEET_EXCEL_WRITER_MUL) or + ($this->_current_token == SPREADSHEET_EXCEL_WRITER_DIV)) + { + if ($this->_current_token == SPREADSHEET_EXCEL_WRITER_MUL) + { + $this->_advance(); + $result2 = $this->_fact(); + if (PEAR::isError($result2)) { + return $result2; + } + $result = $this->_createTree('ptgMul', $result, $result2); + } + else + { + $this->_advance(); + $result2 = $this->_fact(); + if (PEAR::isError($result2)) { + return $result2; + } + $result = $this->_createTree('ptgDiv', $result, $result2); + } + } + return $result; + } + + /** + * It parses a factor. It assumes the following rule: + * Fact -> ( Expr ) + * | CellRef + * | CellRange + * | Number + * | Function + * + * @access private + * @return mixed The parsed ptg'd tree on success, PEAR_Error on failure + */ + function _fact() + { + if ($this->_current_token == SPREADSHEET_EXCEL_WRITER_OPEN) + { + $this->_advance(); // eat the "(" + $result = $this->_parenthesizedExpression(); + if ($this->_current_token != SPREADSHEET_EXCEL_WRITER_CLOSE) { + return $this->raiseError("')' token expected."); + } + $this->_advance(); // eat the ")" + return $result; + } + // if it's a reference + if (preg_match('/^\$?[A-Ia-i]?[A-Za-z]\$?[0-9]+$/',$this->_current_token)) + { + $result = $this->_createTree($this->_current_token, '', ''); + $this->_advance(); + return $result; + } + // If it's an external reference (Sheet1!A1 or Sheet1:Sheet2!A1) + elseif (preg_match("/^\w+(\:\w+)?\![A-Ia-i]?[A-Za-z][0-9]+$/",$this->_current_token)) + { + $result = $this->_createTree($this->_current_token, '', ''); + $this->_advance(); + return $result; + } + // If it's an external reference (Sheet1!A1 or Sheet1:Sheet2!A1) + elseif (preg_match("/^'\w+(\:\w+)?'\![A-Ia-i]?[A-Za-z][0-9]+$/",$this->_current_token)) + { + $result = $this->_createTree($this->_current_token, '', ''); + $this->_advance(); + return $result; + } + // if it's a range + elseif (preg_match("/^(\$)?[A-Ia-i]?[A-Za-z](\$)?[0-9]+:(\$)?[A-Ia-i]?[A-Za-z](\$)?[0-9]+$/",$this->_current_token) or + preg_match("/^(\$)?[A-Ia-i]?[A-Za-z](\$)?[0-9]+\.\.(\$)?[A-Ia-i]?[A-Za-z](\$)?[0-9]+$/",$this->_current_token)) + { + $result = $this->_current_token; + $this->_advance(); + return $result; + } + // If it's an external range (Sheet1!A1 or Sheet1!A1:B2) + elseif (preg_match("/^\w+(\:\w+)?\!([A-Ia-i]?[A-Za-z])?[0-9]+:([A-Ia-i]?[A-Za-z])?[0-9]+$/",$this->_current_token)) + { + $result = $this->_current_token; + $this->_advance(); + return $result; + } + // If it's an external range ('Sheet1'!A1 or 'Sheet1'!A1:B2) + elseif (preg_match("/^'\w+(\:\w+)?'\!([A-Ia-i]?[A-Za-z])?[0-9]+:([A-Ia-i]?[A-Za-z])?[0-9]+$/",$this->_current_token)) + { + $result = $this->_current_token; + $this->_advance(); + return $result; + } + elseif (is_numeric($this->_current_token)) + { + $result = $this->_createTree($this->_current_token, '', ''); + $this->_advance(); + return $result; + } + // if it's a function call + elseif (preg_match("/[A-Z0-9\xc0-\xdc\.]/",$this->_current_token)) + { + $result = $this->_func(); + return $result; + } + return $this->raiseError("Syntax error: ".$this->_current_token. + ", lookahead: ".$this->_lookahead. + ", current char: ".$this->_current_char); + } + + /** + * It parses a function call. It assumes the following rule: + * Func -> ( Expr [,Expr]* ) + * + * @access private + * @return mixed The parsed ptg'd tree on success, PEAR_Error on failure + */ + function _func() + { + $num_args = 0; // number of arguments received + $function = $this->_current_token; + $this->_advance(); + $this->_advance(); // eat the "(" + while ($this->_current_token != ')') + { + if ($num_args > 0) + { + if ($this->_current_token == SPREADSHEET_EXCEL_WRITER_COMA || + $this->_current_token == SPREADSHEET_EXCEL_WRITER_SEMICOLON) + { + $this->_advance(); // eat the "," or ";" + } + else { + return $this->raiseError("Syntax error: comma expected in ". + "function $function, arg #{$num_args}"); + } + $result2 = $this->_condition(); + if (PEAR::isError($result2)) { + return $result2; + } + $result = $this->_createTree('arg', $result, $result2); + } + else // first argument + { + $result2 = $this->_condition(); + if (PEAR::isError($result2)) { + return $result2; + } + $result = $this->_createTree('arg', '', $result2); + } + $num_args++; + } + $args = $this->_functions[$function][1]; + // If fixed number of args eg. TIME($i,$j,$k). Check that the number of args is valid. + if (($args >= 0) and ($args != $num_args)) { + return $this->raiseError("Incorrect number of arguments in function $function() "); + } + + $result = $this->_createTree($function, $result, $num_args); + $this->_advance(); // eat the ")" + return $result; + } + + /** + * Creates a tree. In fact an array which may have one or two arrays (sub-trees) + * as elements. + * + * @access private + * @param mixed $value The value of this node. + * @param mixed $left The left array (sub-tree) or a final node. + * @param mixed $right The right array (sub-tree) or a final node. + * @return array A tree + */ + function _createTree($value, $left, $right) + { + return array('value' => $value, 'left' => $left, 'right' => $right); + } + + /** + * Builds a string containing the tree in reverse polish notation (What you + * would use in a HP calculator stack). + * The following tree: + * + * + + * / \ + * 2 3 + * + * produces: "23+" + * + * The following tree: + * + * + + * / \ + * 3 * + * / \ + * 6 A1 + * + * produces: "36A1*+" + * + * In fact all operands, functions, references, etc... are written as ptg's + * + * @access public + * @param array $tree The optional tree to convert. + * @return string The tree in reverse polish notation + */ + function toReversePolish($tree = array()) + { + $polish = ""; // the string we are going to return + if (empty($tree)) // If it's the first call use _parse_tree + { + $tree = $this->_parse_tree; + } + if (is_array($tree['left'])) + { + $converted_tree = $this->toReversePolish($tree['left']); + if (PEAR::isError($converted_tree)) { + return $converted_tree; + } + $polish .= $converted_tree; + } + elseif ($tree['left'] != '') // It's a final node + { + $converted_tree = $this->_convert($tree['left']); + if (PEAR::isError($converted_tree)) { + return $converted_tree; + } + $polish .= $converted_tree; + } + if (is_array($tree['right'])) + { + $converted_tree = $this->toReversePolish($tree['right']); + if (PEAR::isError($converted_tree)) { + return $converted_tree; + } + $polish .= $converted_tree; + } + elseif ($tree['right'] != '') // It's a final node + { + $converted_tree = $this->_convert($tree['right']); + if (PEAR::isError($converted_tree)) { + return $converted_tree; + } + $polish .= $converted_tree; + } + // if it's a function convert it here (so we can set it's arguments) + if (preg_match("/^[A-Z0-9\xc0-\xdc\.]+$/",$tree['value']) and + !preg_match('/^([A-Ia-i]?[A-Za-z])(\d+)$/',$tree['value']) and + !preg_match("/^[A-Ia-i]?[A-Za-z](\d+)\.\.[A-Ia-i]?[A-Za-z](\d+)$/",$tree['value']) and + !is_numeric($tree['value']) and + !isset($this->ptg[$tree['value']])) + { + // left subtree for a function is always an array. + if ($tree['left'] != '') { + $left_tree = $this->toReversePolish($tree['left']); + } + else { + $left_tree = ''; + } + if (PEAR::isError($left_tree)) { + return $left_tree; + } + // add it's left subtree and return. + return $left_tree.$this->_convertFunction($tree['value'], $tree['right']); + } + else + { + $converted_tree = $this->_convert($tree['value']); + if (PEAR::isError($converted_tree)) { + return $converted_tree; + } + } + $polish .= $converted_tree; + return $polish; + } +} +?> diff --git a/thirdparty/pear/Spreadsheet/Excel/Writer/Validator.php b/thirdparty/pear/Spreadsheet/Excel/Writer/Validator.php new file mode 100644 index 000000000..6d99afebf --- /dev/null +++ b/thirdparty/pear/Spreadsheet/Excel/Writer/Validator.php @@ -0,0 +1,225 @@ + +* +* License Information: +* +* Spreadsheet_Excel_Writer: A library for generating Excel Spreadsheets +* Copyright (c) 2002-2003 Xavier Noguer xnoguer@rezebra.com +* +* 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 +*/ + +//require_once('PEAR.php'); + +// Possible operator types + +/* +FIXME: change prefixes +*/ +define("OP_BETWEEN", 0x00); +define("OP_NOTBETWEEN", 0x01); +define("OP_EQUAL", 0x02); +define("OP_NOTEQUAL", 0x03); +define("OP_GT", 0x04); +define("OP_LT", 0x05); +define("OP_GTE", 0x06); +define("OP_LTE", 0x07); + +/** +* Baseclass for generating Excel DV records (validations) +* +* @author Herman Kuiper +* @category FileFormats +* @package Spreadsheet_Excel_Writer +*/ +class Spreadsheet_Excel_Writer_Validator +{ + var $_type; + var $_style; + var $_fixedList; + var $_blank; + var $_incell; + var $_showprompt; + var $_showerror; + var $_title_prompt; + var $_descr_prompt; + var $_title_error; + var $_descr_error; + var $_operator; + var $_formula1; + var $_formula2; + /** + * The parser from the workbook. Used to parse validation formulas also + * @var Spreadsheet_Excel_Writer_Parser + */ + var $_parser; + + function Spreadsheet_Excel_Writer_Validator(&$parser) + { + $this->_parser = $parser; + $this->_type = 0x01; // FIXME: add method for setting datatype + $this->_style = 0x00; + $this->_fixedList = false; + $this->_blank = false; + $this->_incell = false; + $this->_showprompt = false; + $this->_showerror = true; + $this->_title_prompt = "\x00"; + $this->_descr_prompt = "\x00"; + $this->_title_error = "\x00"; + $this->_descr_error = "\x00"; + $this->_operator = 0x00; // default is equal + $this->_formula1 = ""; + $this->_formula2 = ""; + } + + function setPrompt($promptTitle = "\x00", $promptDescription = "\x00", $showPrompt = true) + { + $this->_showprompt = $showPrompt; + $this->_title_prompt = $promptTitle; + $this->_descr_prompt = $promptDescription; + } + + function setError($errorTitle = "\x00", $errorDescription = "\x00", $showError = true) + { + $this->_showerror = $showError; + $this->_title_error = $errorTitle; + $this->_descr_error = $errorDescription; + } + + function allowBlank() + { + $this->_blank = true; + } + + function onInvalidStop() + { + $this->_style = 0x00; + } + + function onInvalidWarn() + { + $this->_style = 0x01; + } + + function onInvalidInfo() + { + $this->_style = 0x02; + } + + function setFormula1($formula) + { + // Parse the formula using the parser in Parser.php + $error = $this->_parser->parse($formula); + if (PEAR::isError($error)) { + return $this->_formula1; + } + + $this->_formula1 = $this->_parser->toReversePolish(); + if (PEAR::isError($this->_formula1)) { + return $this->_formula1; + } + return true; + } + + function setFormula2($formula) + { + // Parse the formula using the parser in Parser.php + $error = $this->_parser->parse($formula); + if (PEAR::isError($error)) { + return $this->_formula2; + } + + $this->_formula2 = $this->_parser->toReversePolish(); + if (PEAR::isError($this->_formula2)) { + return $this->_formula2; + } + return true; + } + + function _getOptions() + { + $options = $this->_type; + $options |= $this->_style << 3; + if($this->_fixedList) + $options |= 0x80; + if($this->_blank) + $options |= 0x100; + if(!$this->_incell) + $options |= 0x200; + if($this->_showprompt) + $options |= 0x40000; + if($this->_showerror) + $options |= 0x80000; + $options |= $this->_operator << 20; + + return $options; + } + + function _getData() + { + $title_prompt_len = strlen($this->_title_prompt); + $descr_prompt_len = strlen($this->_descr_prompt); + $title_error_len = strlen($this->_title_error); + $descr_error_len = strlen($this->_descr_error); + + $formula1_size = strlen($this->_formula1); + $formula2_size = strlen($this->_formula2); + + $data = pack("V", $this->_getOptions()); + $data .= pack("vC", $title_prompt_len, 0x00) . $this->_title_prompt; + $data .= pack("vC", $title_error_len, 0x00) . $this->_title_error; + $data .= pack("vC", $descr_prompt_len, 0x00) . $this->_descr_prompt; + $data .= pack("vC", $descr_error_len, 0x00) . $this->_descr_error; + + $data .= pack("vv", $formula1_size, 0x0000) . $this->_formula1; + $data .= pack("vv", $formula2_size, 0x0000) . $this->_formula2; + + return $data; + } +} + +/*class Spreadsheet_Excel_Writer_Validation_List extends Spreadsheet_Excel_Writer_Validation +{ + function Spreadsheet_Excel_Writer_Validation_list() + { + parent::Spreadsheet_Excel_Writer_Validation(); + $this->_type = 0x03; + } + + function setList($source, $incell = true) + { + $this->_incell = $incell; + $this->_fixedList = true; + + $source = implode("\x00", $source); + $this->_formula1 = pack("CCC", 0x17, strlen($source), 0x0c) . $source; + } + + function setRow($row, $col1, $col2, $incell = true) + { + $this->_incell = $incell; + //$this->_formula1 = ...; + } + + function setCol($col, $row1, $row2, $incell = true) + { + $this->_incell = $incell; + //$this->_formula1 = ...; + } +}*/ + +?> diff --git a/thirdparty/pear/Spreadsheet/Excel/Writer/Workbook.php b/thirdparty/pear/Spreadsheet/Excel/Writer/Workbook.php new file mode 100644 index 000000000..91f8a6b3d --- /dev/null +++ b/thirdparty/pear/Spreadsheet/Excel/Writer/Workbook.php @@ -0,0 +1,1545 @@ + +* +* The majority of this is _NOT_ my code. I simply ported it from the +* PERL Spreadsheet::WriteExcel module. +* +* The author of the Spreadsheet::WriteExcel module is John McNamara +* +* +* I _DO_ maintain this code, and John McNamara has nothing to do with the +* porting of this code to PHP. Any questions directly related to this +* class library should be directed to me. +* +* License Information: +* +* Spreadsheet_Excel_Writer: A library for generating Excel Spreadsheets +* Copyright (c) 2002-2003 Xavier Noguer xnoguer@rezebra.com +* +* 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 +*/ + +require_once('Spreadsheet/Excel/Writer/Format.php'); +require_once('Spreadsheet/Excel/Writer/BIFFwriter.php'); +require_once('Spreadsheet/Excel/Writer/Worksheet.php'); +require_once('Spreadsheet/Excel/Writer/Parser.php'); +require_once('OLE/PPS/Root.php'); +require_once('OLE/PPS/File.php'); + +/** +* Class for generating Excel Spreadsheets +* +* @author Xavier Noguer +* @category FileFormats +* @package Spreadsheet_Excel_Writer +*/ + +class Spreadsheet_Excel_Writer_Workbook extends Spreadsheet_Excel_Writer_BIFFwriter +{ + /** + * Filename for the Workbook + * @var string + */ + var $_filename; + + /** + * Formula parser + * @var object Parser + */ + var $_parser; + + /** + * Flag for 1904 date system (0 => base date is 1900, 1 => base date is 1904) + * @var integer + */ + var $_1904; + + /** + * The active worksheet of the workbook (0 indexed) + * @var integer + */ + var $_activesheet; + + /** + * 1st displayed worksheet in the workbook (0 indexed) + * @var integer + */ + var $_firstsheet; + + /** + * Number of workbook tabs selected + * @var integer + */ + var $_selected; + + /** + * Index for creating adding new formats to the workbook + * @var integer + */ + var $_xf_index; + + /** + * Flag for preventing close from being called twice. + * @var integer + * @see close() + */ + var $_fileclosed; + + /** + * The BIFF file size for the workbook. + * @var integer + * @see _calcSheetOffsets() + */ + var $_biffsize; + + /** + * The default sheetname for all sheets created. + * @var string + */ + var $_sheetname; + + /** + * The default XF format. + * @var object Format + */ + var $_tmp_format; + + /** + * Array containing references to all of this workbook's worksheets + * @var array + */ + var $_worksheets; + + /** + * Array of sheetnames for creating the EXTERNSHEET records + * @var array + */ + var $_sheetnames; + + /** + * Array containing references to all of this workbook's formats + * @var array + */ + var $_formats; + + /** + * Array containing the colour palette + * @var array + */ + var $_palette; + + /** + * The default format for URLs. + * @var object Format + */ + var $_url_format; + + /** + * The codepage indicates the text encoding used for strings + * @var integer + */ + var $_codepage; + + /** + * The country code used for localization + * @var integer + */ + var $_country_code; + + /** + * The temporary dir for storing the OLE file + * @var string + */ + var $_tmp_dir; + + /** + * Class constructor + * + * @param string filename for storing the workbook. "-" for writing to stdout. + * @access public + */ + function Spreadsheet_Excel_Writer_Workbook($filename) + { + // It needs to call its parent's constructor explicitly + $this->Spreadsheet_Excel_Writer_BIFFwriter(); + + $this->_filename = $filename; + $this->_parser =& new Spreadsheet_Excel_Writer_Parser($this->_byte_order, $this->_BIFF_version); + $this->_1904 = 0; + $this->_activesheet = 0; + $this->_firstsheet = 0; + $this->_selected = 0; + $this->_xf_index = 16; // 15 style XF's and 1 cell XF. + $this->_fileclosed = 0; + $this->_biffsize = 0; + $this->_sheetname = "Sheet"; + $this->_tmp_format =& new Spreadsheet_Excel_Writer_Format($this->_BIFF_version); + $this->_worksheets = array(); + $this->_sheetnames = array(); + $this->_formats = array(); + $this->_palette = array(); + $this->_codepage = 0x04E4; // FIXME: should change for BIFF8 + $this->_country_code = -1; + + // Add the default format for hyperlinks + $this->_url_format =& $this->addFormat(array('color' => 'blue', 'underline' => 1)); + $this->_str_total = 0; + $this->_str_unique = 0; + $this->_str_table = array(); + $this->_setPaletteXl97(); + $this->_tmp_dir = ''; + + // Add the default format Moneda - Currency (by JHL) + //$this->_currency_format =& $this->addFormat(array('color' => 'blue', 'underline' => 1)); + + } + + /** + * Calls finalization methods. + * This method should always be the last one to be called on every workbook + * + * @access public + * @return mixed true on success. PEAR_Error on failure + */ + function close() + { + if ($this->_fileclosed) { // Prevent close() from being called twice. + return true; + } + $res = $this->_storeWorkbook(); + if ($this->isError($res)) { + return $this->raiseError($res->getMessage()); + } + $this->_fileclosed = 1; + return true; + } + + /** + * An accessor for the _worksheets[] array + * Returns an array of the worksheet objects in a workbook + * It actually calls to worksheets() + * + * @access public + * @see worksheets() + * @return array + */ + function sheets() + { + return $this->worksheets(); + } + + /** + * An accessor for the _worksheets[] array. + * Returns an array of the worksheet objects in a workbook + * + * @access public + * @return array + */ + function worksheets() + { + return $this->_worksheets; + } + + /** + * Sets the BIFF version. + * This method exists just to access experimental functionality + * from BIFF8. It will be deprecated ! + * Only possible value is 8 (Excel 97/2000). + * For any other value it fails silently. + * + * @access public + * @param integer $version The BIFF version + */ + function setVersion($version) + { + if ($version == 8) { // only accept version 8 + $version = 0x0600; + $this->_BIFF_version = $version; + // change BIFFwriter limit for CONTINUE records + $this->_limit = 8224; + $this->_tmp_format->_BIFF_version = $version; + $this->_url_format->_BIFF_version = $version; + $this->_parser->_BIFF_version = $version; + $total_worksheets = count($this->_worksheets); + // change version for all worksheets too + for ($i = 0; $i < $total_worksheets; $i++) { + $this->_worksheets[$i]->_BIFF_version = $version; + } + $total_formats = count($this->_formats); + // change version for all formats too + for ($i = 0; $i < $total_formats; $i++) { + $this->_formats[$i]->_BIFF_version = $version; + } + } + } + + /** + * Set the country identifier for the workbook + * + * @access public + * @param integer $code Is the international calling country code for the + * chosen country. + */ + function setCountry($code) + { + $this->_country_code = $code; + } + + /** + * Add a new worksheet to the Excel workbook. + * If no name is given the name of the worksheet will be Sheeti$i, with + * $i in [1..]. + * + * @access public + * @param string $name the optional name of the worksheet + * @return mixed reference to a worksheet object on success, PEAR_Error + * on failure + */ + function &addWorksheet($name = '') + { + $index = count($this->_worksheets); + $sheetname = $this->_sheetname; + + if ($name == '') { + $name = $sheetname.($index+1); + } + + // Check that sheetname is <= 31 chars (Excel limit). + if (strlen($name) > 31) { + return $this->raiseError("Sheetname $name must be <= 31 chars"); + } + + // Check that the worksheet name doesn't already exist: a fatal Excel error. + $total_worksheets = count($this->_worksheets); + for ($i=0; $i < $total_worksheets; $i++) + { + if ($name == $this->_worksheets[$i]->getName()) { + return $this->raiseError("Worksheet '$name' already exists"); + } + } + + $worksheet = new Spreadsheet_Excel_Writer_Worksheet($this->_BIFF_version, + $name, $index, + $this->_activesheet, $this->_firstsheet, + $this->_str_total, $this->_str_unique, + $this->_str_table, $this->_url_format, + $this->_parser); + + $this->_worksheets[$index] = &$worksheet; // Store ref for iterator + $this->_sheetnames[$index] = $name; // Store EXTERNSHEET names + $this->_parser->setExtSheet($name, $index); // Register worksheet name with parser + return $worksheet; + } + + /** + * Add a new format to the Excel workbook. + * Also, pass any properties to the Format constructor. + * + * @access public + * @param array $properties array with properties for initializing the format. + * @return &Spreadsheet_Excel_Writer_Format reference to an Excel Format + */ + function &addFormat($properties = array()) + { + $format = new Spreadsheet_Excel_Writer_Format($this->_BIFF_version, $this->_xf_index,$properties); + $this->_xf_index += 1; + $this->_formats[] = &$format; + return $format; + } + + /** + * Create new validator. + * + * @access public + * @return &Spreadsheet_Excel_Writer_Validator reference to a Validator + */ + function &addValidator() + { + include_once('Spreadsheet/Excel/Writer/Validator.php'); + /* FIXME: check for successful inclusion*/ + $valid = new Spreadsheet_Excel_Writer_Validator($this->_parser); + return $valid; + } + + /** + * Change the RGB components of the elements in the colour palette. + * + * @access public + * @param integer $index colour index + * @param integer $red red RGB value [0-255] + * @param integer $green green RGB value [0-255] + * @param integer $blue blue RGB value [0-255] + * @return integer The palette index for the custom color + */ + function setCustomColor($index,$red,$green,$blue) + { + // Match a HTML #xxyyzz style parameter + /*if (defined $_[1] and $_[1] =~ /^#(\w\w)(\w\w)(\w\w)/ ) { + @_ = ($_[0], hex $1, hex $2, hex $3); + }*/ + + // Check that the colour index is the right range + if ($index < 8 or $index > 64) { + // TODO: assign real error codes + return $this->raiseError("Color index $index outside range: 8 <= index <= 64"); + } + + // Check that the colour components are in the right range + if ( ($red < 0 or $red > 255) or + ($green < 0 or $green > 255) or + ($blue < 0 or $blue > 255) ) + { + return $this->raiseError("Color component outside range: 0 <= color <= 255"); + } + + $index -= 8; // Adjust colour index (wingless dragonfly) + + // Set the RGB value + $this->_palette[$index] = array($red, $green, $blue, 0); + return($index + 8); + } + + /** + * Sets the colour palette to the Excel 97+ default. + * + * @access private + */ + function _setPaletteXl97() + { + $this->_palette = array( + array(0x00, 0x00, 0x00, 0x00), // 8 + array(0xff, 0xff, 0xff, 0x00), // 9 + array(0xff, 0x00, 0x00, 0x00), // 10 + array(0x00, 0xff, 0x00, 0x00), // 11 + array(0x00, 0x00, 0xff, 0x00), // 12 + array(0xff, 0xff, 0x00, 0x00), // 13 + array(0xff, 0x00, 0xff, 0x00), // 14 + array(0x00, 0xff, 0xff, 0x00), // 15 + array(0x80, 0x00, 0x00, 0x00), // 16 + array(0x00, 0x80, 0x00, 0x00), // 17 + array(0x00, 0x00, 0x80, 0x00), // 18 + array(0x80, 0x80, 0x00, 0x00), // 19 + array(0x80, 0x00, 0x80, 0x00), // 20 + array(0x00, 0x80, 0x80, 0x00), // 21 + array(0xc0, 0xc0, 0xc0, 0x00), // 22 + array(0x80, 0x80, 0x80, 0x00), // 23 + array(0x99, 0x99, 0xff, 0x00), // 24 + array(0x99, 0x33, 0x66, 0x00), // 25 + array(0xff, 0xff, 0xcc, 0x00), // 26 + array(0xcc, 0xff, 0xff, 0x00), // 27 + array(0x66, 0x00, 0x66, 0x00), // 28 + array(0xff, 0x80, 0x80, 0x00), // 29 + array(0x00, 0x66, 0xcc, 0x00), // 30 + array(0xcc, 0xcc, 0xff, 0x00), // 31 + array(0x00, 0x00, 0x80, 0x00), // 32 + array(0xff, 0x00, 0xff, 0x00), // 33 + array(0xff, 0xff, 0x00, 0x00), // 34 + array(0x00, 0xff, 0xff, 0x00), // 35 + array(0x80, 0x00, 0x80, 0x00), // 36 + array(0x80, 0x00, 0x00, 0x00), // 37 + array(0x00, 0x80, 0x80, 0x00), // 38 + array(0x00, 0x00, 0xff, 0x00), // 39 + array(0x00, 0xcc, 0xff, 0x00), // 40 + array(0xcc, 0xff, 0xff, 0x00), // 41 + array(0xcc, 0xff, 0xcc, 0x00), // 42 + array(0xff, 0xff, 0x99, 0x00), // 43 + array(0x99, 0xcc, 0xff, 0x00), // 44 + array(0xff, 0x99, 0xcc, 0x00), // 45 + array(0xcc, 0x99, 0xff, 0x00), // 46 + array(0xff, 0xcc, 0x99, 0x00), // 47 + array(0x33, 0x66, 0xff, 0x00), // 48 + array(0x33, 0xcc, 0xcc, 0x00), // 49 + array(0x99, 0xcc, 0x00, 0x00), // 50 + array(0xff, 0xcc, 0x00, 0x00), // 51 + array(0xff, 0x99, 0x00, 0x00), // 52 + array(0xff, 0x66, 0x00, 0x00), // 53 + array(0x66, 0x66, 0x99, 0x00), // 54 + array(0x96, 0x96, 0x96, 0x00), // 55 + array(0x00, 0x33, 0x66, 0x00), // 56 + array(0x33, 0x99, 0x66, 0x00), // 57 + array(0x00, 0x33, 0x00, 0x00), // 58 + array(0x33, 0x33, 0x00, 0x00), // 59 + array(0x99, 0x33, 0x00, 0x00), // 60 + array(0x99, 0x33, 0x66, 0x00), // 61 + array(0x33, 0x33, 0x99, 0x00), // 62 + array(0x33, 0x33, 0x33, 0x00), // 63 + ); + } + + /** + * Assemble worksheets into a workbook and send the BIFF data to an OLE + * storage. + * + * @access private + * @return mixed true on success. PEAR_Error on failure + */ + function _storeWorkbook() + { + // Ensure that at least one worksheet has been selected. + if ($this->_activesheet == 0) { + $this->_worksheets[0]->selected = 1; + } + + // Calculate the number of selected worksheet tabs and call the finalization + // methods for each worksheet + $total_worksheets = count($this->_worksheets); + for ($i=0; $i < $total_worksheets; $i++) { + if ($this->_worksheets[$i]->selected) { + $this->_selected++; + } + $this->_worksheets[$i]->close($this->_sheetnames); + } + + // Add Workbook globals + $this->_storeBof(0x0005); + if ($this->_BIFF_version == 0x0600) { + $this->_storeCodepage(); + $this->_storeWindow1(); + } + if ($this->_BIFF_version == 0x0500) { + $this->_storeExterns(); // For print area and repeat rows + } + $this->_storeNames(); // For print area and repeat rows + if ($this->_BIFF_version == 0x0500) { + $this->_storeWindow1(); + } + $this->_storeDatemode(); + $this->_storeAllFonts(); + $this->_storeAllNumFormats(); + $this->_storeAllXfs(); + $this->_storeAllStyles(); + $this->_storePalette(); + $this->_calcSheetOffsets(); + + // Add BOUNDSHEET records + for ($i=0; $i < $total_worksheets; $i++) { + $this->_storeBoundsheet($this->_worksheets[$i]->name,$this->_worksheets[$i]->offset); + } + + if ($this->_country_code != -1) { + $this->_storeCountry(); + } + + if ($this->_BIFF_version == 0x0600) { + //$this->_storeSupbookInternal(); + /* TODO: store external SUPBOOK records and XCT and CRN records + in case of external references for BIFF8 */ + //$this->_storeExternsheetBiff8(); + $this->_storeSharedStringsTable(); + } + + // End Workbook globals + $this->_storeEof(); + + // Store the workbook in an OLE container + $res = $this->_storeOLEFile(); + if ($this->isError($res)) { + return $this->raiseError($res->getMessage()); + } + return true; + } + + /** + * Sets the temp dir used for storing the OLE file + * + * @access public + * @param string $dir The dir to be used as temp dir + * @return true if given dir is valid, false otherwise + */ + function setTempDir($dir) + { + if (is_dir($dir)) { + $this->_tmp_dir = $dir; + return true; + } + return false; + } + + /** + * Store the workbook in an OLE container + * + * @access private + * @return mixed true on success. PEAR_Error on failure + */ + function _storeOLEFile() + { + $OLE = new OLE_PPS_File(OLE::Asc2Ucs('Book')); + if ($this->_tmp_dir != '') { + $OLE->setTempDir($this->_tmp_dir); + } + $res = $OLE->init(); + if ($this->isError($res)) { + return $this->raiseError("OLE Error: ".$res->getMessage()); + } + $OLE->append($this->_data); + $total_worksheets = count($this->_worksheets); + for ($i = 0; $i < $total_worksheets; $i++) + { + while ($tmp = $this->_worksheets[$i]->getData()) { + $OLE->append($tmp); + } + } + $root = new OLE_PPS_Root(time(), time(), array($OLE)); + if ($this->_tmp_dir != '') { + $root->setTempDir($this->_tmp_dir); + } + $res = $root->save($this->_filename); + if ($this->isError($res)) { + return $this->raiseError("OLE Error: ".$res->getMessage()); + } + return true; + } + + /** + * Calculate offsets for Worksheet BOF records. + * + * @access private + */ + function _calcSheetOffsets() + { + if ($this->_BIFF_version == 0x0600) { + $boundsheet_length = 12; // fixed length for a BOUNDSHEET record + } + else { + $boundsheet_length = 11; + } + $EOF = 4; + $offset = $this->_datasize; + + if ($this->_BIFF_version == 0x0600) { + // add the length of the SST + /* TODO: check this works for a lot of strings (> 8224 bytes) */ + $offset += $this->_calculateSharedStringsSizes(); + if ($this->_country_code != -1) { + $offset += 8; // adding COUNTRY record + } + // add the lenght of SUPBOOK, EXTERNSHEET and NAME records + //$offset += 8; // FIXME: calculate real value when storing the records + } + $total_worksheets = count($this->_worksheets); + // add the length of the BOUNDSHEET records + for ($i=0; $i < $total_worksheets; $i++) { + $offset += $boundsheet_length + strlen($this->_worksheets[$i]->name); + } + $offset += $EOF; + + for ($i=0; $i < $total_worksheets; $i++) { + $this->_worksheets[$i]->offset = $offset; + $offset += $this->_worksheets[$i]->_datasize; + } + $this->_biffsize = $offset; + } + + /** + * Store the Excel FONT records. + * + * @access private + */ + function _storeAllFonts() + { + // tmp_format is added by the constructor. We use this to write the default XF's + $format = $this->_tmp_format; + $font = $format->getFont(); + + // Note: Fonts are 0-indexed. According to the SDK there is no index 4, + // so the following fonts are 0, 1, 2, 3, 5 + // + for ($i=1; $i <= 5; $i++){ + $this->_append($font); + } + + // Iterate through the XF objects and write a FONT record if it isn't the + // same as the default FONT and if it hasn't already been used. + // + $fonts = array(); + $index = 6; // The first user defined FONT + + $key = $format->getFontKey(); // The default font from _tmp_format + $fonts[$key] = 0; // Index of the default font + + $total_formats = count($this->_formats); + for ($i=0; $i < $total_formats; $i++) + { + $key = $this->_formats[$i]->getFontKey(); + if (isset($fonts[$key])) { + // FONT has already been used + $this->_formats[$i]->font_index = $fonts[$key]; + } + else { + // Add a new FONT record + $fonts[$key] = $index; + $this->_formats[$i]->font_index = $index; + $index++; + $font = $this->_formats[$i]->getFont(); + $this->_append($font); + } + } + } + + /** + * Store user defined numerical formats i.e. FORMAT records + * + * @access private + */ + function _storeAllNumFormats() + { + // Leaning num_format syndrome + $hash_num_formats = array(); + $num_formats = array(); + $index = 164; + + // Iterate through the XF objects and write a FORMAT record if it isn't a + // built-in format type and if the FORMAT string hasn't already been used. + $total_formats = count($this->_formats); + for ($i=0; $i < $total_formats; $i++) + { + $num_format = $this->_formats[$i]->_num_format; + + // Check if $num_format is an index to a built-in format. + // Also check for a string of zeros, which is a valid format string + // but would evaluate to zero. + // + if (!preg_match("/^0+\d/",$num_format)) + { + if (preg_match("/^\d+$/",$num_format)) { // built-in format + continue; + } + } + + if (isset($hash_num_formats[$num_format])) { + // FORMAT has already been used + $this->_formats[$i]->_num_format = $hash_num_formats[$num_format]; + } + else{ + // Add a new FORMAT + $hash_num_formats[$num_format] = $index; + $this->_formats[$i]->_num_format = $index; + array_push($num_formats,$num_format); + $index++; + } + } + + // Write the new FORMAT records starting from 0xA4 + $index = 164; + foreach ($num_formats as $num_format) { + $this->_storeNumFormat($num_format,$index); + $index++; + } + } + + /** + * Write all XF records. + * + * @access private + */ + function _storeAllXfs() + { + // _tmp_format is added by the constructor. We use this to write the default XF's + // The default font index is 0 + // + $format = $this->_tmp_format; + for ($i=0; $i <= 14; $i++) { + $xf = $format->getXf('style'); // Style XF + $this->_append($xf); + } + + $xf = $format->getXf('cell'); // Cell XF + $this->_append($xf); + + // User defined XFs + $total_formats = count($this->_formats); + for ($i=0; $i < $total_formats; $i++) { + $xf = $this->_formats[$i]->getXf('cell'); + $this->_append($xf); + } + } + + /** + * Write all STYLE records. + * + * @access private + */ + function _storeAllStyles() + { + $this->_storeStyle(); + } + + /** + * Write the EXTERNCOUNT and EXTERNSHEET records. These are used as indexes for + * the NAME records. + * + * @access private + */ + function _storeExterns() + { + // Create EXTERNCOUNT with number of worksheets + $this->_storeExterncount(count($this->_worksheets)); + + // Create EXTERNSHEET for each worksheet + foreach ($this->_sheetnames as $sheetname) { + $this->_storeExternsheet($sheetname); + } + } + + /** + * Write the NAME record to define the print area and the repeat rows and cols. + * + * @access private + */ + function _storeNames() + { + // Create the print area NAME records + $total_worksheets = count($this->_worksheets); + for ($i = 0; $i < $total_worksheets; $i++) { + // Write a Name record if the print area has been defined + if (isset($this->_worksheets[$i]->print_rowmin)) + { + $this->_storeNameShort( + $this->_worksheets[$i]->index, + 0x06, // NAME type + $this->_worksheets[$i]->print_rowmin, + $this->_worksheets[$i]->print_rowmax, + $this->_worksheets[$i]->print_colmin, + $this->_worksheets[$i]->print_colmax + ); + } + } + + // Create the print title NAME records + $total_worksheets = count($this->_worksheets); + for ($i = 0; $i < $total_worksheets; $i++) { + $rowmin = $this->_worksheets[$i]->title_rowmin; + $rowmax = $this->_worksheets[$i]->title_rowmax; + $colmin = $this->_worksheets[$i]->title_colmin; + $colmax = $this->_worksheets[$i]->title_colmax; + + // Determine if row + col, row, col or nothing has been defined + // and write the appropriate record + // + if (isset($rowmin) and isset($colmin)) { + // Row and column titles have been defined. + // Row title has been defined. + $this->_storeNameLong( + $this->_worksheets[$i]->index, + 0x07, // NAME type + $rowmin, + $rowmax, + $colmin, + $colmax + ); + } + elseif (isset($rowmin)) { + // Row title has been defined. + $this->_storeNameShort( + $this->_worksheets[$i]->index, + 0x07, // NAME type + $rowmin, + $rowmax, + 0x00, + 0xff + ); + } + elseif (isset($colmin)) { + // Column title has been defined. + $this->_storeNameShort( + $this->_worksheets[$i]->index, + 0x07, // NAME type + 0x0000, + 0x3fff, + $colmin, + $colmax + ); + } + else { + // Print title hasn't been defined. + } + } + } + + + + + /****************************************************************************** + * + * BIFF RECORDS + * + */ + + /** + * Stores the CODEPAGE biff record. + * + * @access private + */ + function _storeCodepage() + { + $record = 0x0042; // Record identifier + $length = 0x0002; // Number of bytes to follow + $cv = $this->_codepage; // The code page + + $header = pack('vv', $record, $length); + $data = pack('v', $cv); + + $this->_append($header.$data); + } + + /** + * Write Excel BIFF WINDOW1 record. + * + * @access private + */ + function _storeWindow1() + { + $record = 0x003D; // Record identifier + $length = 0x0012; // Number of bytes to follow + + $xWn = 0x0000; // Horizontal position of window + $yWn = 0x0000; // Vertical position of window + $dxWn = 0x25BC; // Width of window + $dyWn = 0x1572; // Height of window + + $grbit = 0x0038; // Option flags + $ctabsel = $this->_selected; // Number of workbook tabs selected + $wTabRatio = 0x0258; // Tab to scrollbar ratio + + $itabFirst = $this->_firstsheet; // 1st displayed worksheet + $itabCur = $this->_activesheet; // Active worksheet + + $header = pack("vv", $record, $length); + $data = pack("vvvvvvvvv", $xWn, $yWn, $dxWn, $dyWn, + $grbit, + $itabCur, $itabFirst, + $ctabsel, $wTabRatio); + $this->_append($header.$data); + } + + /** + * Writes Excel BIFF BOUNDSHEET record. + * FIXME: inconsistent with BIFF documentation + * + * @param string $sheetname Worksheet name + * @param integer $offset Location of worksheet BOF + * @access private + */ + function _storeBoundsheet($sheetname,$offset) + { + $record = 0x0085; // Record identifier + if ($this->_BIFF_version == 0x0600) { + $length = 0x08 + strlen($sheetname); // Number of bytes to follow + } + else { + $length = 0x07 + strlen($sheetname); // Number of bytes to follow + } + + $grbit = 0x0000; // Visibility and sheet type + $cch = strlen($sheetname); // Length of sheet name + + $header = pack("vv", $record, $length); + if ($this->_BIFF_version == 0x0600) { + $data = pack("Vvv", $offset, $grbit, $cch); + } + else { + $data = pack("VvC", $offset, $grbit, $cch); + } + $this->_append($header.$data.$sheetname); + } + + /** + * Write Internal SUPBOOK record + * + * @access private + */ + function _storeSupbookInternal() + { + $record = 0x01AE; // Record identifier + $length = 0x0004; // Bytes to follow + + $header = pack("vv", $record, $length); + $data = pack("vv", count($this->_worksheets), 0x0104); + $this->_append($header.$data); + } + + /** + * Writes the Excel BIFF EXTERNSHEET record. These references are used by + * formulas. + * + * @param string $sheetname Worksheet name + * @access private + */ + function _storeExternsheetBiff8() + { + $total_references = count($this->_parser->_references); + $record = 0x0017; // Record identifier + $length = 2 + 6 * $total_references; // Number of bytes to follow + + $supbook_index = 0; // FIXME: only using internal SUPBOOK record + $header = pack("vv", $record, $length); + $data = pack('v', $total_references); + for ($i = 0; $i < $total_references; $i++) { + $data .= $this->_parser->_references[$i]; + } + $this->_append($header.$data); + } + + /** + * Write Excel BIFF STYLE records. + * + * @access private + */ + function _storeStyle() + { + $record = 0x0293; // Record identifier + $length = 0x0004; // Bytes to follow + + $ixfe = 0x8000; // Index to style XF + $BuiltIn = 0x00; // Built-in style + $iLevel = 0xff; // Outline style level + + $header = pack("vv", $record, $length); + $data = pack("vCC", $ixfe, $BuiltIn, $iLevel); + $this->_append($header.$data); + } + + + /** + * Writes Excel FORMAT record for non "built-in" numerical formats. + * + * @param string $format Custom format string + * @param integer $ifmt Format index code + * @access private + */ + function _storeNumFormat($format,$ifmt) + { + $record = 0x041E; // Record identifier + + if ($this->_BIFF_version == 0x0600) { + $length = 5 + strlen($format); // Number of bytes to follow + $encoding = 0x0; + } + elseif ($this->_BIFF_version == 0x0500) { + $length = 3 + strlen($format); // Number of bytes to follow + } + + $cch = strlen($format); // Length of format string + + $header = pack("vv", $record, $length); + if ($this->_BIFF_version == 0x0600) { + $data = pack("vvC", $ifmt, $cch, $encoding); + } + elseif ($this->_BIFF_version == 0x0500) { + $data = pack("vC", $ifmt, $cch); + } + $this->_append($header.$data.$format); + } + + /** + * Write DATEMODE record to indicate the date system in use (1904 or 1900). + * + * @access private + */ + function _storeDatemode() + { + $record = 0x0022; // Record identifier + $length = 0x0002; // Bytes to follow + + $f1904 = $this->_1904; // Flag for 1904 date system + + $header = pack("vv", $record, $length); + $data = pack("v", $f1904); + $this->_append($header.$data); + } + + + /** + * Write BIFF record EXTERNCOUNT to indicate the number of external sheet + * references in the workbook. + * + * Excel only stores references to external sheets that are used in NAME. + * The workbook NAME record is required to define the print area and the repeat + * rows and columns. + * + * A similar method is used in Worksheet.php for a slightly different purpose. + * + * @param integer $cxals Number of external references + * @access private + */ + function _storeExterncount($cxals) + { + $record = 0x0016; // Record identifier + $length = 0x0002; // Number of bytes to follow + + $header = pack("vv", $record, $length); + $data = pack("v", $cxals); + $this->_append($header.$data); + } + + + /** + * Writes the Excel BIFF EXTERNSHEET record. These references are used by + * formulas. NAME record is required to define the print area and the repeat + * rows and columns. + * + * A similar method is used in Worksheet.php for a slightly different purpose. + * + * @param string $sheetname Worksheet name + * @access private + */ + function _storeExternsheet($sheetname) + { + $record = 0x0017; // Record identifier + $length = 0x02 + strlen($sheetname); // Number of bytes to follow + + $cch = strlen($sheetname); // Length of sheet name + $rgch = 0x03; // Filename encoding + + $header = pack("vv", $record, $length); + $data = pack("CC", $cch, $rgch); + $this->_append($header.$data.$sheetname); + } + + + /** + * Store the NAME record in the short format that is used for storing the print + * area, repeat rows only and repeat columns only. + * + * @param integer $index Sheet index + * @param integer $type Built-in name type + * @param integer $rowmin Start row + * @param integer $rowmax End row + * @param integer $colmin Start colum + * @param integer $colmax End column + * @access private + */ + function _storeNameShort($index,$type,$rowmin,$rowmax,$colmin,$colmax) + { + $record = 0x0018; // Record identifier + $length = 0x0024; // Number of bytes to follow + + $grbit = 0x0020; // Option flags + $chKey = 0x00; // Keyboard shortcut + $cch = 0x01; // Length of text name + $cce = 0x0015; // Length of text definition + $ixals = $index + 1; // Sheet index + $itab = $ixals; // Equal to ixals + $cchCustMenu = 0x00; // Length of cust menu text + $cchDescription = 0x00; // Length of description text + $cchHelptopic = 0x00; // Length of help topic text + $cchStatustext = 0x00; // Length of status bar text + $rgch = $type; // Built-in name type + + $unknown03 = 0x3b; + $unknown04 = 0xffff-$index; + $unknown05 = 0x0000; + $unknown06 = 0x0000; + $unknown07 = 0x1087; + $unknown08 = 0x8005; + + $header = pack("vv", $record, $length); + $data = pack("v", $grbit); + $data .= pack("C", $chKey); + $data .= pack("C", $cch); + $data .= pack("v", $cce); + $data .= pack("v", $ixals); + $data .= pack("v", $itab); + $data .= pack("C", $cchCustMenu); + $data .= pack("C", $cchDescription); + $data .= pack("C", $cchHelptopic); + $data .= pack("C", $cchStatustext); + $data .= pack("C", $rgch); + $data .= pack("C", $unknown03); + $data .= pack("v", $unknown04); + $data .= pack("v", $unknown05); + $data .= pack("v", $unknown06); + $data .= pack("v", $unknown07); + $data .= pack("v", $unknown08); + $data .= pack("v", $index); + $data .= pack("v", $index); + $data .= pack("v", $rowmin); + $data .= pack("v", $rowmax); + $data .= pack("C", $colmin); + $data .= pack("C", $colmax); + $this->_append($header.$data); + } + + + /** + * Store the NAME record in the long format that is used for storing the repeat + * rows and columns when both are specified. This shares a lot of code with + * _storeNameShort() but we use a separate method to keep the code clean. + * Code abstraction for reuse can be carried too far, and I should know. ;-) + * + * @param integer $index Sheet index + * @param integer $type Built-in name type + * @param integer $rowmin Start row + * @param integer $rowmax End row + * @param integer $colmin Start colum + * @param integer $colmax End column + * @access private + */ + function _storeNameLong($index,$type,$rowmin,$rowmax,$colmin,$colmax) + { + $record = 0x0018; // Record identifier + $length = 0x003d; // Number of bytes to follow + $grbit = 0x0020; // Option flags + $chKey = 0x00; // Keyboard shortcut + $cch = 0x01; // Length of text name + $cce = 0x002e; // Length of text definition + $ixals = $index + 1; // Sheet index + $itab = $ixals; // Equal to ixals + $cchCustMenu = 0x00; // Length of cust menu text + $cchDescription = 0x00; // Length of description text + $cchHelptopic = 0x00; // Length of help topic text + $cchStatustext = 0x00; // Length of status bar text + $rgch = $type; // Built-in name type + + $unknown01 = 0x29; + $unknown02 = 0x002b; + $unknown03 = 0x3b; + $unknown04 = 0xffff-$index; + $unknown05 = 0x0000; + $unknown06 = 0x0000; + $unknown07 = 0x1087; + $unknown08 = 0x8008; + + $header = pack("vv", $record, $length); + $data = pack("v", $grbit); + $data .= pack("C", $chKey); + $data .= pack("C", $cch); + $data .= pack("v", $cce); + $data .= pack("v", $ixals); + $data .= pack("v", $itab); + $data .= pack("C", $cchCustMenu); + $data .= pack("C", $cchDescription); + $data .= pack("C", $cchHelptopic); + $data .= pack("C", $cchStatustext); + $data .= pack("C", $rgch); + $data .= pack("C", $unknown01); + $data .= pack("v", $unknown02); + // Column definition + $data .= pack("C", $unknown03); + $data .= pack("v", $unknown04); + $data .= pack("v", $unknown05); + $data .= pack("v", $unknown06); + $data .= pack("v", $unknown07); + $data .= pack("v", $unknown08); + $data .= pack("v", $index); + $data .= pack("v", $index); + $data .= pack("v", 0x0000); + $data .= pack("v", 0x3fff); + $data .= pack("C", $colmin); + $data .= pack("C", $colmax); + // Row definition + $data .= pack("C", $unknown03); + $data .= pack("v", $unknown04); + $data .= pack("v", $unknown05); + $data .= pack("v", $unknown06); + $data .= pack("v", $unknown07); + $data .= pack("v", $unknown08); + $data .= pack("v", $index); + $data .= pack("v", $index); + $data .= pack("v", $rowmin); + $data .= pack("v", $rowmax); + $data .= pack("C", 0x00); + $data .= pack("C", 0xff); + // End of data + $data .= pack("C", 0x10); + $this->_append($header.$data); + } + + /** + * Stores the COUNTRY record for localization + * + * @access private + */ + function _storeCountry() + { + $record = 0x008C; // Record identifier + $length = 4; // Number of bytes to follow + + $header = pack('vv', $record, $length); + /* using the same country code always for simplicity */ + $data = pack('vv', $this->_country_code, $this->_country_code); + $this->_append($header.$data); + } + + /** + * Stores the PALETTE biff record. + * + * @access private + */ + function _storePalette() + { + $aref = $this->_palette; + + $record = 0x0092; // Record identifier + $length = 2 + 4 * count($aref); // Number of bytes to follow + $ccv = count($aref); // Number of RGB values to follow + $data = ''; // The RGB data + + // Pack the RGB data + foreach($aref as $color) + { + foreach($color as $byte) { + $data .= pack("C",$byte); + } + } + + $header = pack("vvv", $record, $length, $ccv); + $this->_append($header.$data); + } + + /** + * Calculate + * Handling of the SST continue blocks is complicated by the need to include an + * additional continuation byte depending on whether the string is split between + * blocks or whether it starts at the beginning of the block. (There are also + * additional complications that will arise later when/if Rich Strings are + * supported). + * + * @access private + */ + function _calculateSharedStringsSizes() + { + /* Iterate through the strings to calculate the CONTINUE block sizes. + The SST blocks requires a specialised CONTINUE block, so we have to + ensure that the maximum data block size is less than the limit used by + _add_continue() in BIFFwriter.pm. For simplicity we use the same size + for the SST and CONTINUE records: + 8228 : Maximum Excel97 block size + -4 : Length of block header + -8 : Length of additional SST header information + -8 : Arbitrary number to keep within _add_continue() limit + = 8208 + */ + $total_offset = 12; + $continue_limit = 8208; + $block_length = 0; + $written = 0; + $this->_block_sizes = array(); + $continue = 0; + + foreach (array_keys($this->_str_table) as $string) { + $string_length = strlen($string); + + // Block length is the total length of the strings that will be + // written out in a single SST or CONTINUE block. + $block_length += $string_length; + + // We can write the string if it doesn't cross a CONTINUE boundary + if ($block_length < $continue_limit) { + $written += $string_length; + $total_offset += $string_length; + continue; + } + + // Deal with the cases where the next string to be written will exceed + // the CONTINUE boundary. If the string is very long it may need to be + // written in more than one CONTINUE record. + while ($block_length >= $continue_limit) { + + // We need to avoid the case where a string is continued in the first + // n bytes that contain the string header information. + $header_length = 3; // Min string + header size -1 + $space_remaining = $continue_limit - $written - $continue; + + + /* TODO: Unicode data should only be split on char (2 byte) + boundaries. Therefore, in some cases we need to reduce the + amount of available + */ + + if ($space_remaining > $header_length) { + // Write as much as possible of the string in the current block + $written += $space_remaining; + + // Reduce the current block length by the amount written + $block_length -= $continue_limit + $continue; + + // Store the max size for this block + $this->_block_sizes[] = $continue_limit; + + // If the current string was split then the next CONTINUE block + // should have the string continue flag (grbit) set unless the + // split string fits exactly into the remaining space. + if ($block_length > 0) { + $continue = 1; + } + else { + $continue = 0; + } + + } + else { + // Store the max size for this block + $this->_block_sizes[] = $written + $continue; + + // Not enough space to start the string in the current block + $block_length -= $continue_limit - $space_remaining - $continue; + $continue = 0; + + } + + // If the string (or substr) is small enough we can write it in the + // new CONTINUE block. Else, go through the loop again to write it in + // one or more CONTINUE blocks + if ($block_length < $continue_limit) { + $written = $block_length; + } + else { + $written = 0; + } + } + } + + // Store the max size for the last block unless it is empty + if ($written + $continue) { + $this->_block_sizes[] = $written + $continue; + } + + + /* Calculate the total length of the SST and associated CONTINUEs (if any). + The SST record will have a length even if it contains no strings. + This length is required to set the offsets in the BOUNDSHEET records since + they must be written before the SST records + */ + if (!empty($this->_block_sizes)) { + $total_offset += (count($this->_block_sizes) - 1) * 4; // add CONTINUE headers + } + return $total_offset; + } + + /** + * Write all of the workbooks strings into an indexed array. + * See the comments in _calculate_shared_string_sizes() for more information. + * + * The Excel documentation says that the SST record should be followed by an + * EXTSST record. The EXTSST record is a hash table that is used to optimise + * access to SST. However, despite the documentation it doesn't seem to be + * required so we will ignore it. + * + * @access private + */ + /* FIXME: update _calcSheetOffsets() when updating this method */ + function _storeSharedStringsTable() + { + $record = 0x00fc; // Record identifier + $length = 8 + array_sum($this->_block_sizes); // Number of bytes to follow + + // Write the SST block header information + $header = pack("vv", $record, $length); + $data = pack("VV", $this->_str_total, $this->_str_unique); + $this->_append($header.$data); + + + // Iterate through the strings to calculate the CONTINUE block sizes + $continue_limit = 8208; + $block_length = 0; + $written = 0; + $continue = 0; + + + /* TODO: not good for performance */ + foreach (array_keys($this->_str_table) as $string) { + + $string_length = strlen($string); + $encoding = 0; // assume there are no Unicode strings + $split_string = 0; + + // Block length is the total length of the strings that will be + // written out in a single SST or CONTINUE block. + // + $block_length += $string_length; + + + // We can write the string if it doesn't cross a CONTINUE boundary + if ($block_length < $continue_limit) { + $this->_append($string); + $written += $string_length; + continue; + } + + // Deal with the cases where the next string to be written will exceed + // the CONTINUE boundary. If the string is very long it may need to be + // written in more than one CONTINUE record. + // + while ($block_length >= $continue_limit) { + + // We need to avoid the case where a string is continued in the first + // n bytes that contain the string header information. + // + $header_length = 3; // Min string + header size -1 + $space_remaining = $continue_limit - $written - $continue; + + + // Unicode data should only be split on char (2 byte) boundaries. + // Therefore, in some cases we need to reduce the amount of available + + if ($space_remaining > $header_length) { + // Write as much as possible of the string in the current block + $tmp = substr($string, 0, $space_remaining); + $this->_append($tmp); + + // The remainder will be written in the next block(s) + $string = substr($string, $space_remaining); + + // Reduce the current block length by the amount written + $block_length -= $continue_limit - $continue; + + // If the current string was split then the next CONTINUE block + // should have the string continue flag (grbit) set unless the + // split string fits exactly into the remaining space. + // + if ($block_length > 0) { + $continue = 1; + } + else { + $continue = 0; + } + } + else { + // Not enough space to start the string in the current block + $block_length -= $continue_limit - $space_remaining - $continue; + $continue = 0; + } + + // Write the CONTINUE block header + if (!empty($this->_block_sizes)) { + $record = 0x003C; + $length = array_pop($this->_block_sizes); + + $header = pack('vv', $record, $length); + if ($continue) { + $header .= pack('C', $encoding); + } + $this->_append($header); + } + + // If the string (or substr) is small enough we can write it in the + // new CONTINUE block. Else, go through the loop again to write it in + // one or more CONTINUE blocks + // + if ($block_length < $continue_limit) { + $this->_append($string); + + $written = $block_length; + } + else { + $written = 0; + } + } + } + } +} +?> diff --git a/thirdparty/pear/Spreadsheet/Excel/Writer/Worksheet.php b/thirdparty/pear/Spreadsheet/Excel/Writer/Worksheet.php new file mode 100644 index 000000000..64cb22c78 --- /dev/null +++ b/thirdparty/pear/Spreadsheet/Excel/Writer/Worksheet.php @@ -0,0 +1,3495 @@ + +* +* The majority of this is _NOT_ my code. I simply ported it from the +* PERL Spreadsheet::WriteExcel module. +* +* The author of the Spreadsheet::WriteExcel module is John McNamara +* +* +* I _DO_ maintain this code, and John McNamara has nothing to do with the +* porting of this code to PHP. Any questions directly related to this +* class library should be directed to me. +* +* License Information: +* +* Spreadsheet_Excel_Writer: A library for generating Excel Spreadsheets +* Copyright (c) 2002-2003 Xavier Noguer xnoguer@rezebra.com +* +* 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 +*/ + +require_once('Spreadsheet/Excel/Writer/Parser.php'); +require_once('Spreadsheet/Excel/Writer/BIFFwriter.php'); + +/** +* Class for generating Excel Spreadsheets +* +* @author Xavier Noguer +* @category FileFormats +* @package Spreadsheet_Excel_Writer +*/ + +class Spreadsheet_Excel_Writer_Worksheet extends Spreadsheet_Excel_Writer_BIFFwriter +{ + /** + * Name of the Worksheet + * @var string + */ + var $name; + + /** + * Index for the Worksheet + * @var integer + */ + var $index; + + /** + * Reference to the (default) Format object for URLs + * @var object Format + */ + var $_url_format; + + /** + * Reference to the parser used for parsing formulas + * @var object Format + */ + var $_parser; + + /** + * Filehandle to the temporary file for storing data + * @var resource + */ + var $_filehandle; + + /** + * Boolean indicating if we are using a temporary file for storing data + * @var bool + */ + var $_using_tmpfile; + + /** + * Maximum number of rows for an Excel spreadsheet (BIFF5) + * @var integer + */ + var $_xls_rowmax; + + /** + * Maximum number of columns for an Excel spreadsheet (BIFF5) + * @var integer + */ + var $_xls_colmax; + + /** + * Maximum number of characters for a string (LABEL record in BIFF5) + * @var integer + */ + var $_xls_strmax; + + /** + * First row for the DIMENSIONS record + * @var integer + * @see _storeDimensions() + */ + var $_dim_rowmin; + + /** + * Last row for the DIMENSIONS record + * @var integer + * @see _storeDimensions() + */ + var $_dim_rowmax; + + /** + * First column for the DIMENSIONS record + * @var integer + * @see _storeDimensions() + */ + var $_dim_colmin; + + /** + * Last column for the DIMENSIONS record + * @var integer + * @see _storeDimensions() + */ + var $_dim_colmax; + + /** + * Array containing format information for columns + * @var array + */ + var $_colinfo; + + /** + * Array containing the selected area for the worksheet + * @var array + */ + var $_selection; + + /** + * Array containing the panes for the worksheet + * @var array + */ + var $_panes; + + /** + * The active pane for the worksheet + * @var integer + */ + var $_active_pane; + + /** + * Bit specifying if panes are frozen + * @var integer + */ + var $_frozen; + + /** + * Bit specifying if the worksheet is selected + * @var integer + */ + var $selected; + + /** + * The paper size (for printing) (DOCUMENT!!!) + * @var integer + */ + var $_paper_size; + + /** + * Bit specifying paper orientation (for printing). 0 => landscape, 1 => portrait + * @var integer + */ + var $_orientation; + + /** + * The page header caption + * @var string + */ + var $_header; + + /** + * The page footer caption + * @var string + */ + var $_footer; + + /** + * The horizontal centering value for the page + * @var integer + */ + var $_hcenter; + + /** + * The vertical centering value for the page + * @var integer + */ + var $_vcenter; + + /** + * The margin for the header + * @var float + */ + var $_margin_head; + + /** + * The margin for the footer + * @var float + */ + var $_margin_foot; + + /** + * The left margin for the worksheet in inches + * @var float + */ + var $_margin_left; + + /** + * The right margin for the worksheet in inches + * @var float + */ + var $_margin_right; + + /** + * The top margin for the worksheet in inches + * @var float + */ + var $_margin_top; + + /** + * The bottom margin for the worksheet in inches + * @var float + */ + var $_margin_bottom; + + /** + * First row to reapeat on each printed page + * @var integer + */ + var $title_rowmin; + + /** + * Last row to reapeat on each printed page + * @var integer + */ + var $title_rowmax; + + /** + * First column to reapeat on each printed page + * @var integer + */ + var $title_colmin; + + /** + * First row of the area to print + * @var integer + */ + var $print_rowmin; + + /** + * Last row to of the area to print + * @var integer + */ + var $print_rowmax; + + /** + * First column of the area to print + * @var integer + */ + var $print_colmin; + + /** + * Last column of the area to print + * @var integer + */ + var $print_colmax; + + /** + * Whether to use outline. + * @var integer + */ + var $_outline_on; + + /** + * Auto outline styles. + * @var bool + */ + var $_outline_style; + + /** + * Whether to have outline summary below. + * @var bool + */ + var $_outline_below; + + /** + * Whether to have outline summary at the right. + * @var bool + */ + var $_outline_right; + + /** + * Outline row level. + * @var integer + */ + var $_outline_row_level; + + /** + * Whether to fit to page when printing or not. + * @var bool + */ + var $_fit_page; + + /** + * Number of pages to fit wide + * @var integer + */ + var $_fit_width; + + /** + * Number of pages to fit high + * @var integer + */ + var $_fit_height; + + /** + * Reference to the total number of strings in the workbook + * @var integer + */ + var $_str_total; + + /** + * Reference to the number of unique strings in the workbook + * @var integer + */ + var $_str_unique; + + /** + * Reference to the array containing all the unique strings in the workbook + * @var array + */ + var $_str_table; + + /** + * Merged cell ranges + * @var array + */ + var $_merged_ranges; + + /** + * Constructor + * + * @param string $name The name of the new worksheet + * @param integer $index The index of the new worksheet + * @param mixed &$activesheet The current activesheet of the workbook we belong to + * @param mixed &$firstsheet The first worksheet in the workbook we belong to + * @param mixed &$url_format The default format for hyperlinks + * @param mixed &$parser The formula parser created for the Workbook + * @access private + */ + function Spreadsheet_Excel_Writer_Worksheet($BIFF_version, $name, + $index, &$activesheet, + &$firstsheet, &$str_total, + &$str_unique, &$str_table, + &$url_format, &$parser) + { + // It needs to call its parent's constructor explicitly + $this->Spreadsheet_Excel_Writer_BIFFwriter(); + $this->_BIFF_version = $BIFF_version; + $rowmax = 65536; // 16384 in Excel 5 + $colmax = 256; + + $this->name = $name; + $this->index = $index; + $this->activesheet = &$activesheet; + $this->firstsheet = &$firstsheet; + $this->_str_total = &$str_total; + $this->_str_unique = &$str_unique; + $this->_str_table = &$str_table; + $this->_url_format = &$url_format; + $this->_parser = &$parser; + + //$this->ext_sheets = array(); + $this->_filehandle = ""; + $this->_using_tmpfile = true; + //$this->fileclosed = 0; + //$this->offset = 0; + $this->_xls_rowmax = $rowmax; + $this->_xls_colmax = $colmax; + $this->_xls_strmax = 255; + $this->_dim_rowmin = $rowmax + 1; + $this->_dim_rowmax = 0; + $this->_dim_colmin = $colmax + 1; + $this->_dim_colmax = 0; + $this->_colinfo = array(); + $this->_selection = array(0,0,0,0); + $this->_panes = array(); + $this->_active_pane = 3; + $this->_frozen = 0; + $this->selected = 0; + + $this->_paper_size = 0x0; + $this->_orientation = 0x1; + $this->_header = ''; + $this->_footer = ''; + $this->_hcenter = 0; + $this->_vcenter = 0; + $this->_margin_head = 0.50; + $this->_margin_foot = 0.50; + $this->_margin_left = 0.75; + $this->_margin_right = 0.75; + $this->_margin_top = 1.00; + $this->_margin_bottom = 1.00; + + $this->title_rowmin = NULL; + $this->title_rowmax = NULL; + $this->title_colmin = NULL; + $this->title_colmax = NULL; + $this->print_rowmin = NULL; + $this->print_rowmax = NULL; + $this->print_colmin = NULL; + $this->print_colmax = NULL; + + $this->_print_gridlines = 1; + $this->_print_headers = 0; + + $this->_fit_page = 0; + $this->_fit_width = 0; + $this->_fit_height = 0; + + $this->_hbreaks = array(); + $this->_vbreaks = array(); + + $this->_protect = 0; + $this->_password = NULL; + + $this->col_sizes = array(); + $this->row_sizes = array(); + + $this->_zoom = 100; + $this->_print_scale = 100; + + $this->_outline_row_level = 0; + $this->_outline_style = 0; + $this->_outline_below = 1; + $this->_outline_right = 1; + $this->_outline_on = 1; + + $this->_merged_ranges = array(); + + $this->_dv = array(); + + $this->_initialize(); + } + + /** + * Open a tmp file to store the majority of the Worksheet data. If this fails, + * for example due to write permissions, store the data in memory. This can be + * slow for large files. + * + * @access private + */ + function _initialize() + { + // Open tmp file for storing Worksheet data + $fh = tmpfile(); + if ( $fh) { + // Store filehandle + $this->_filehandle = $fh; + } + else { + // If tmpfile() fails store data in memory + $this->_using_tmpfile = false; + } + } + + /** + * Add data to the beginning of the workbook (note the reverse order) + * and to the end of the workbook. + * + * @access public + * @see Spreadsheet_Excel_Writer_Workbook::storeWorkbook() + * @param array $sheetnames The array of sheetnames from the Workbook this + * worksheet belongs to + */ + function close($sheetnames) + { + $num_sheets = count($sheetnames); + + /*********************************************** + * Prepend in reverse order!! + */ + + // Prepend the sheet dimensions + $this->_storeDimensions(); + + // Prepend the sheet password + $this->_storePassword(); + + // Prepend the sheet protection + $this->_storeProtect(); + + // Prepend the page setup + $this->_storeSetup(); + + /* FIXME: margins are actually appended */ + // Prepend the bottom margin + $this->_storeMarginBottom(); + + // Prepend the top margin + $this->_storeMarginTop(); + + // Prepend the right margin + $this->_storeMarginRight(); + + // Prepend the left margin + $this->_storeMarginLeft(); + + // Prepend the page vertical centering + $this->_storeVcenter(); + + // Prepend the page horizontal centering + $this->_storeHcenter(); + + // Prepend the page footer + $this->_storeFooter(); + + // Prepend the page header + $this->_storeHeader(); + + // Prepend the vertical page breaks + $this->_storeVbreak(); + + // Prepend the horizontal page breaks + $this->_storeHbreak(); + + // Prepend WSBOOL + $this->_storeWsbool(); + + // Prepend GRIDSET + $this->_storeGridset(); + + // Prepend GUTS + if ($this->_BIFF_version == 0x0500) { + $this->_storeGuts(); + } + + // Prepend PRINTGRIDLINES + $this->_storePrintGridlines(); + + // Prepend PRINTHEADERS + $this->_storePrintHeaders(); + + // Prepend EXTERNSHEET references + if ($this->_BIFF_version == 0x0500) { + for ($i = $num_sheets; $i > 0; $i--) { + $sheetname = $sheetnames[$i-1]; + $this->_storeExternsheet($sheetname); + } + } + + // Prepend the EXTERNCOUNT of external references. + if ($this->_BIFF_version == 0x0500) { + $this->_storeExterncount($num_sheets); + } + + // Prepend the COLINFO records if they exist + if (!empty($this->_colinfo)) + { + for ($i=0; $i < count($this->_colinfo); $i++) { + $this->_storeColinfo($this->_colinfo[$i]); + } + $this->_storeDefcol(); + } + + // Prepend the BOF record + $this->_storeBof(0x0010); + + /* + * End of prepend. Read upwards from here. + ***********************************************/ + + // Append + $this->_storeWindow2(); + $this->_storeZoom(); + if (!empty($this->_panes)) { + $this->_storePanes($this->_panes); + } + $this->_storeSelection($this->_selection); + $this->_storeMergedCells(); + /* TODO: add data validity */ + /*if ($this->_BIFF_version == 0x0600) { + $this->_storeDataValidity(); + }*/ + $this->_storeEof(); + } + + /** + * Retrieve the worksheet name. + * This is usefull when creating worksheets without a name. + * + * @access public + * @return string The worksheet's name + */ + function getName() + { + return $this->name; + } + + /** + * Retrieves data from memory in one chunk, or from disk in $buffer + * sized chunks. + * + * @return string The data + */ + function getData() + { + $buffer = 4096; + + // Return data stored in memory + if (isset($this->_data)) + { + $tmp = $this->_data; + unset($this->_data); + $fh = $this->_filehandle; + if ($this->_using_tmpfile) { + fseek($fh, 0); + } + return $tmp; + } + // Return data stored on disk + if ($this->_using_tmpfile) + { + if ($tmp = fread($this->_filehandle, $buffer)) { + return $tmp; + } + } + + // No data to return + return ''; + } + + /** + * Sets a merged cell range + * + * @access public + * @param integer $first_row First row of the area to merge + * @param integer $first_col First column of the area to merge + * @param integer $last_row Last row of the area to merge + * @param integer $last_col Last column of the area to merge + */ + function setMerge($first_row, $first_col, $last_row, $last_col) + { + if (($last_row < $first_row) or ($last_col < $first_col)) { + return; + } + // don't check rowmin, rowmax, etc... because we don't know when this + // is going to be called + $this->_merged_ranges[] = array($first_row, $first_col, $last_row, $last_col); + } + + /** + * Set this worksheet as a selected worksheet, + * i.e. the worksheet has its tab highlighted. + * + * @access public + */ + function select() + { + $this->selected = 1; + } + + /** + * Set this worksheet as the active worksheet, + * i.e. the worksheet that is displayed when the workbook is opened. + * Also set it as selected. + * + * @access public + */ + function activate() + { + $this->selected = 1; + $this->activesheet = $this->index; + } + + /** + * Set this worksheet as the first visible sheet. + * This is necessary when there are a large number of worksheets and the + * activated worksheet is not visible on the screen. + * + * @access public + */ + function setFirstSheet() + { + $this->firstsheet = $this->index; + } + + /** + * Set the worksheet protection flag + * to prevent accidental modification and to + * hide formulas if the locked and hidden format properties have been set. + * + * @access public + * @param string $password The password to use for protecting the sheet. + */ + function protect($password) + { + $this->_protect = 1; + $this->_password = $this->_encodePassword($password); + } + + /** + * Set the width of a single column or a range of columns. + * + * @access public + * @param integer $firstcol first column on the range + * @param integer $lastcol last column on the range + * @param integer $width width to set + * @param mixed $format The optional XF format to apply to the columns + * @param integer $hidden The optional hidden atribute + * @param integer $level The optional outline level + */ + function setColumn($firstcol, $lastcol, $width, $format = 0, $hidden = 0, $level = 0) + { + $this->_colinfo[] = array($firstcol, $lastcol, $width, &$format, $hidden, $level); + + // Set width to zero if column is hidden + $width = ($hidden) ? 0 : $width; + + for ($col = $firstcol; $col <= $lastcol; $col++) { + $this->col_sizes[$col] = $width; + } + } + + /** + * Set which cell or cells are selected in a worksheet + * + * @access public + * @param integer $first_row first row in the selected quadrant + * @param integer $first_column first column in the selected quadrant + * @param integer $last_row last row in the selected quadrant + * @param integer $last_column last column in the selected quadrant + */ + function setSelection($first_row,$first_column,$last_row,$last_column) + { + $this->_selection = array($first_row,$first_column,$last_row,$last_column); + } + + /** + * Set panes and mark them as frozen. + * + * @access public + * @param array $panes This is the only parameter received and is composed of the following: + * 0 => Vertical split position, + * 1 => Horizontal split position + * 2 => Top row visible + * 3 => Leftmost column visible + * 4 => Active pane + */ + function freezePanes($panes) + { + $this->_frozen = 1; + $this->_panes = $panes; + } + + /** + * Set panes and mark them as unfrozen. + * + * @access public + * @param array $panes This is the only parameter received and is composed of the following: + * 0 => Vertical split position, + * 1 => Horizontal split position + * 2 => Top row visible + * 3 => Leftmost column visible + * 4 => Active pane + */ + function thawPanes($panes) + { + $this->_frozen = 0; + $this->_panes = $panes; + } + + /** + * Set the page orientation as portrait. + * + * @access public + */ + function setPortrait() + { + $this->_orientation = 1; + } + + /** + * Set the page orientation as landscape. + * + * @access public + */ + function setLandscape() + { + $this->_orientation = 0; + } + + /** + * Set the paper type. Ex. 1 = US Letter, 9 = A4 + * + * @access public + * @param integer $size The type of paper size to use + */ + function setPaper($size = 0) + { + $this->_paper_size = $size; + } + + + /** + * Set the page header caption and optional margin. + * + * @access public + * @param string $string The header text + * @param float $margin optional head margin in inches. + */ + function setHeader($string,$margin = 0.50) + { + if (strlen($string) >= 255) { + //carp 'Header string must be less than 255 characters'; + return; + } + $this->_header = $string; + $this->_margin_head = $margin; + } + + /** + * Set the page footer caption and optional margin. + * + * @access public + * @param string $string The footer text + * @param float $margin optional foot margin in inches. + */ + function setFooter($string,$margin = 0.50) + { + if (strlen($string) >= 255) { + //carp 'Footer string must be less than 255 characters'; + return; + } + $this->_footer = $string; + $this->_margin_foot = $margin; + } + + /** + * Center the page horinzontally. + * + * @access public + * @param integer $center the optional value for centering. Defaults to 1 (center). + */ + function centerHorizontally($center = 1) + { + $this->_hcenter = $center; + } + + /** + * Center the page vertically. + * + * @access public + * @param integer $center the optional value for centering. Defaults to 1 (center). + */ + function centerVertically($center = 1) + { + $this->_vcenter = $center; + } + + /** + * Set all the page margins to the same value in inches. + * + * @access public + * @param float $margin The margin to set in inches + */ + function setMargins($margin) + { + $this->setMarginLeft($margin); + $this->setMarginRight($margin); + $this->setMarginTop($margin); + $this->setMarginBottom($margin); + } + + /** + * Set the left and right margins to the same value in inches. + * + * @access public + * @param float $margin The margin to set in inches + */ + function setMargins_LR($margin) + { + $this->setMarginLeft($margin); + $this->setMarginRight($margin); + } + + /** + * Set the top and bottom margins to the same value in inches. + * + * @access public + * @param float $margin The margin to set in inches + */ + function setMargins_TB($margin) + { + $this->setMarginTop($margin); + $this->setMarginBottom($margin); + } + + /** + * Set the left margin in inches. + * + * @access public + * @param float $margin The margin to set in inches + */ + function setMarginLeft($margin = 0.75) + { + $this->_margin_left = $margin; + } + + /** + * Set the right margin in inches. + * + * @access public + * @param float $margin The margin to set in inches + */ + function setMarginRight($margin = 0.75) + { + $this->_margin_right = $margin; + } + + /** + * Set the top margin in inches. + * + * @access public + * @param float $margin The margin to set in inches + */ + function setMarginTop($margin = 1.00) + { + $this->_margin_top = $margin; + } + + /** + * Set the bottom margin in inches. + * + * @access public + * @param float $margin The margin to set in inches + */ + function setMarginBottom($margin = 1.00) + { + $this->_margin_bottom = $margin; + } + + /** + * Set the rows to repeat at the top of each printed page. + * + * @access public + * @param integer $first_row First row to repeat + * @param integer $last_row Last row to repeat. Optional. + */ + function repeatRows($first_row, $last_row = NULL) + { + $this->title_rowmin = $first_row; + if (isset($last_row)) { //Second row is optional + $this->title_rowmax = $last_row; + } + else { + $this->title_rowmax = $first_row; + } + } + + /** + * Set the columns to repeat at the left hand side of each printed page. + * + * @access public + * @param integer $first_col First column to repeat + * @param integer $last_col Last column to repeat. Optional. + */ + function repeatColumns($first_col, $last_col = NULL) + { + $this->title_colmin = $first_col; + if (isset($last_col)) { // Second col is optional + $this->title_colmax = $last_col; + } + else { + $this->title_colmax = $first_col; + } + } + + /** + * Set the area of each worksheet that will be printed. + * + * @access public + * @param integer $first_row First row of the area to print + * @param integer $first_col First column of the area to print + * @param integer $last_row Last row of the area to print + * @param integer $last_col Last column of the area to print + */ + function printArea($first_row, $first_col, $last_row, $last_col) + { + $this->print_rowmin = $first_row; + $this->print_colmin = $first_col; + $this->print_rowmax = $last_row; + $this->print_colmax = $last_col; + } + + + /** + * Set the option to hide gridlines on the printed page. + * + * @access public + */ + function hideGridlines() + { + $this->_print_gridlines = 0; + } + + /** + * Set the option to print the row and column headers on the printed page. + * + * @access public + * @param integer $print Whether to print the headers or not. Defaults to 1 (print). + */ + function printRowColHeaders($print = 1) + { + $this->_print_headers = $print; + } + + /** + * Set the vertical and horizontal number of pages that will define the maximum area printed. + * It doesn't seem to work with OpenOffice. + * + * @access public + * @param integer $width Maximun width of printed area in pages + * @param integer $height Maximun heigth of printed area in pages + * @see setPrintScale() + */ + function fitToPages($width, $height) + { + $this->_fit_page = 1; + $this->_fit_width = $width; + $this->_fit_height = $height; + } + + /** + * Store the horizontal page breaks on a worksheet (for printing). + * The breaks represent the row after which the break is inserted. + * + * @access public + * @param array $breaks Array containing the horizontal page breaks + */ + function setHPagebreaks($breaks) + { + foreach($breaks as $break) { + array_push($this->_hbreaks,$break); + } + } + + /** + * Store the vertical page breaks on a worksheet (for printing). + * The breaks represent the column after which the break is inserted. + * + * @access public + * @param array $breaks Array containing the vertical page breaks + */ + function setVPagebreaks($breaks) + { + foreach($breaks as $break) { + array_push($this->_vbreaks,$break); + } + } + + + /** + * Set the worksheet zoom factor. + * + * @access public + * @param integer $scale The zoom factor + */ + function setZoom($scale = 100) + { + // Confine the scale to Excel's range + if ($scale < 10 or $scale > 400) + { + $this->raiseError("Zoom factor $scale outside range: 10 <= zoom <= 400"); + $scale = 100; + } + + $this->_zoom = floor($scale); + } + + /** + * Set the scale factor for the printed page. + * It turns off the "fit to page" option + * + * @access public + * @param integer $scale The optional scale factor. Defaults to 100 + */ + function setPrintScale($scale = 100) + { + // Confine the scale to Excel's range + if ($scale < 10 or $scale > 400) + { + $this->raiseError("Print scale $scale outside range: 10 <= zoom <= 400"); + $scale = 100; + } + + // Turn off "fit to page" option + $this->_fit_page = 0; + + $this->_print_scale = floor($scale); + } + + /** + * Map to the appropriate write method acording to the token recieved. + * + * @access public + * @param integer $row The row of the cell we are writing to + * @param integer $col The column of the cell we are writing to + * @param mixed $token What we are writing + * @param mixed $format The optional format to apply to the cell + */ + function write($row, $col, $token, $format = 0) + { + // Check for a cell reference in A1 notation and substitute row and column + /*if ($_[0] =~ /^\D/) { + @_ = $this->_substituteCellref(@_); + }*/ + + + // Match number + if (preg_match("/^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/",$token)) { + return $this->writeNumber($row,$col,$token,$format); + } + // Match http or ftp URL + elseif (preg_match("/^[fh]tt?p:\/\//",$token)) { + return $this->writeUrl($row, $col, $token, '', $format); + } + // Match mailto: + elseif (preg_match("/^mailto:/",$token)) { + return $this->writeUrl($row, $col, $token, '', $format); + } + // Match internal or external sheet link + elseif (preg_match("/^(?:in|ex)ternal:/",$token)) { + return $this->writeUrl($row, $col, $token, '', $format); + } + // Match formula + elseif (preg_match("/^=/",$token)) { + return $this->writeFormula($row, $col, $token, $format); + } + // Match formula + elseif (preg_match("/^@/",$token)) { + return $this->writeFormula($row, $col, $token, $format); + } + // Match blank + elseif ($token == '') { + return $this->writeBlank($row,$col,$format); + } + // Default: match string + else { + return $this->writeString($row,$col,$token,$format); + } + } + + /** + * Write an array of values as a row + * + * @access public + * @param integer $row The row we are writing to + * @param integer $col The first col (leftmost col) we are writing to + * @param array $val The array of values to write + * @param mixed $format The optional format to apply to the cell + * @return mixed PEAR_Error on failure + */ + + function writeRow($row, $col, $val, $format=0) + { + $retval = ''; + if (is_array($val)) { + foreach($val as $v) { + if (is_array($v)) { + $this->writeCol($row, $col, $v, $format); + } else { + $this->write($row, $col, $v, $format); + } + $col++; + } + } else { + $retval = new PEAR_Error('$val needs to be an array'); + } + return($retval); + } + + /** + * Write an array of values as a column + * + * @access public + * @param integer $row The first row (uppermost row) we are writing to + * @param integer $col The col we are writing to + * @param array $val The array of values to write + * @param mixed $format The optional format to apply to the cell + * @return mixed PEAR_Error on failure + */ + + function writeCol($row, $col, $val, $format=0) + { + $retval = ''; + if (is_array($val)) { + foreach($val as $v) { + $this->write($row, $col, $v, $format); + $row++; + } + } else { + $retval = new PEAR_Error('$val needs to be an array'); + } + return($retval); + } + + /** + * Returns an index to the XF record in the workbook + * + * @access private + * @param mixed &$format The optional XF format + * @return integer The XF record index + */ + function _XF(&$format) + { + if ($format != 0) { + return($format->getXfIndex()); + } + else { + return(0x0F); + } + } + + + /****************************************************************************** + ******************************************************************************* + * + * Internal methods + */ + + + /** + * Store Worksheet data in memory using the parent's class append() or to a + * temporary file, the default. + * + * @access private + * @param string $data The binary data to append + */ + function _append($data) + { + if ($this->_using_tmpfile) + { + // Add CONTINUE records if necessary + if (strlen($data) > $this->_limit) { + $data = $this->_addContinue($data); + } + fwrite($this->_filehandle,$data); + $this->_datasize += strlen($data); + } + else { + parent::_append($data); + } + } + + /** + * Substitute an Excel cell reference in A1 notation for zero based row and + * column values in an argument list. + * + * Ex: ("A4", "Hello") is converted to (3, 0, "Hello"). + * + * @access private + * @param string $cell The cell reference. Or range of cells. + * @return array + */ + function _substituteCellref($cell) + { + $cell = strtoupper($cell); + + // Convert a column range: 'A:A' or 'B:G' + if (preg_match("/([A-I]?[A-Z]):([A-I]?[A-Z])/",$cell,$match)) { + list($no_use, $col1) = $this->_cellToRowcol($match[1] .'1'); // Add a dummy row + list($no_use, $col2) = $this->_cellToRowcol($match[2] .'1'); // Add a dummy row + return(array($col1, $col2)); + } + + // Convert a cell range: 'A1:B7' + if (preg_match("/\$?([A-I]?[A-Z]\$?\d+):\$?([A-I]?[A-Z]\$?\d+)/",$cell,$match)) { + list($row1, $col1) = $this->_cellToRowcol($match[1]); + list($row2, $col2) = $this->_cellToRowcol($match[2]); + return(array($row1, $col1, $row2, $col2)); + } + + // Convert a cell reference: 'A1' or 'AD2000' + if (preg_match("/\$?([A-I]?[A-Z]\$?\d+)/",$cell)) { + list($row1, $col1) = $this->_cellToRowcol($match[1]); + return(array($row1, $col1)); + } + + // TODO use real error codes + $this->raiseError("Unknown cell reference $cell", 0, PEAR_ERROR_DIE); + } + + /** + * Convert an Excel cell reference in A1 notation to a zero based row and column + * reference; converts C1 to (0, 2). + * + * @access private + * @param string $cell The cell reference. + * @return array containing (row, column) + */ + function _cellToRowcol($cell) + { + preg_match("/\$?([A-I]?[A-Z])\$?(\d+)/",$cell,$match); + $col = $match[1]; + $row = $match[2]; + + // Convert base26 column string to number + $chars = explode('', $col); + $expn = 0; + $col = 0; + + while ($chars) { + $char = array_pop($chars); // LS char first + $col += (ord($char) -ord('A') +1) * pow(26,$expn); + $expn++; + } + + // Convert 1-index to zero-index + $row--; + $col--; + + return(array($row, $col)); + } + + /** + * Based on the algorithm provided by Daniel Rentz of OpenOffice. + * + * @access private + * @param string $plaintext The password to be encoded in plaintext. + * @return string The encoded password + */ + function _encodePassword($plaintext) + { + $password = 0x0000; + $i = 1; // char position + + // split the plain text password in its component characters + $chars = preg_split('//', $plaintext, -1, PREG_SPLIT_NO_EMPTY); + foreach($chars as $char) + { + $value = ord($char) << $i; // shifted ASCII value + $rotated_bits = $value >> 15; // rotated bits beyond bit 15 + $value &= 0x7fff; // first 15 bits + $password ^= ($value | $rotated_bits); + $i++; + } + + $password ^= strlen($plaintext); + $password ^= 0xCE4B; + + return($password); + } + + /** + * This method sets the properties for outlining and grouping. The defaults + * correspond to Excel's defaults. + * + * @param bool $visible + * @param bool $symbols_below + * @param bool $symbols_right + * @param bool $auto_style + */ + function setOutline($visible = true, $symbols_below = true, $symbols_right = true, $auto_style = false) + { + $this->_outline_on = $visible; + $this->_outline_below = $symbols_below; + $this->_outline_right = $symbols_right; + $this->_outline_style = $auto_style; + + // Ensure this is a boolean vale for Window2 + if ($this->_outline_on) { + $this->_outline_on = 1; + } + } + + /****************************************************************************** + ******************************************************************************* + * + * BIFF RECORDS + */ + + + /** + * Write a double to the specified row and column (zero indexed). + * An integer can be written as a double. Excel will display an + * integer. $format is optional. + * + * Returns 0 : normal termination + * -2 : row or column out of range + * + * @access public + * @param integer $row Zero indexed row + * @param integer $col Zero indexed column + * @param float $num The number to write + * @param mixed $format The optional XF format + * @return integer + */ + function writeNumber($row, $col, $num, $format = 0) + { + + + $record = 0x0203; // Record identifier + $length = 0x000E; // Number of bytes to follow + + $xf = $this->_XF($format); // The cell format + + // Check that row and col are valid and store max and min values + if ($row >= $this->_xls_rowmax) + { + return(-2); + } + if ($col >= $this->_xls_colmax) + { + return(-2); + } + if ($row < $this->_dim_rowmin) + { + $this->_dim_rowmin = $row; + } + if ($row > $this->_dim_rowmax) + { + $this->_dim_rowmax = $row; + } + if ($col < $this->_dim_colmin) + { + $this->_dim_colmin = $col; + } + if ($col > $this->_dim_colmax) + { + $this->_dim_colmax = $col; + } + + $header = pack("vv", $record, $length); + $data = pack("vvv", $row, $col, $xf); + $xl_double = pack("d", $num); + if ($this->_byte_order) // if it's Big Endian + { + $xl_double = strrev($xl_double); + } + + $this->_append($header.$data.$xl_double); + return(0); + } + + /** + * Write a string to the specified row and column (zero indexed). + * NOTE: there is an Excel 5 defined limit of 255 characters. + * $format is optional. + * Returns 0 : normal termination + * -2 : row or column out of range + * -3 : long string truncated to 255 chars + * + * @access public + * @param integer $row Zero indexed row + * @param integer $col Zero indexed column + * @param string $str The string to write + * @param mixed $format The XF format for the cell + * @return integer + */ + function writeString($row, $col, $str, $format = 0) + { + + + + if ($this->_BIFF_version == 0x0600) { + return $this->writeStringBIFF8($row, $col, $str, $format); + } + + $strlen = strlen($str); + $record = 0x0204; // Record identifier + $length = 0x0008 + $strlen; // Bytes to follow + $xf = $this->_XF($format); // The cell format + + $str_error = 0; + + // Check that row and col are valid and store max and min values + if ($row >= $this->_xls_rowmax) + { + return(-2); + } + if ($col >= $this->_xls_colmax) + { + return(-2); + } + if ($row < $this->_dim_rowmin) + { + $this->_dim_rowmin = $row; + } + if ($row > $this->_dim_rowmax) + { + $this->_dim_rowmax = $row; + } + if ($col < $this->_dim_colmin) + { + $this->_dim_colmin = $col; + } + if ($col > $this->_dim_colmax) + { + $this->_dim_colmax = $col; + } + + if ($strlen > $this->_xls_strmax) // LABEL must be < 255 chars + { + $str = substr($str, 0, $this->_xls_strmax); + $length = 0x0008 + $this->_xls_strmax; + $strlen = $this->_xls_strmax; + $str_error = -3; + } + + $header = pack("vv", $record, $length); + $data = pack("vvvv", $row, $col, $xf, $strlen); + $this->_append($header.$data.$str); + return($str_error); + } + + function writeStringBIFF8($row, $col, $str, $format = 0) + { + $strlen = strlen($str); + $record = 0x00FD; // Record identifier + $length = 0x000A; // Bytes to follow + $xf = $this->_XF($format); // The cell format + $encoding = 0x0; + + $str_error = 0; + + // Check that row and col are valid and store max and min values + if ($this->_checkRowCol($row, $col) == false) { + return -2; + } + + $str = pack('vC', $strlen, $encoding).$str; + + /* check if string is already present */ + if (!isset($this->_str_table[$str])) { + $this->_str_table[$str] = $this->_str_unique++; + } + $this->_str_total++; + + $header = pack('vv', $record, $length); + $data = pack('vvvV', $row, $col, $xf, $this->_str_table[$str]); + $this->_append($header.$data); + return $str_error; + } + + /** + * Check row and col before writing to a cell, and update the sheet's + * dimensions accordingly + * + * @access private + * @param integer $row Zero indexed row + * @param integer $col Zero indexed column + * @return boolean true for success, false if row and/or col are grester + * then maximums allowed. + */ + function _checkRowCol($row, $col) + { + if ($row >= $this->_xls_rowmax) { + return false; + } + if ($col >= $this->_xls_colmax) { + return false; + } + if ($row < $this->_dim_rowmin) { + $this->_dim_rowmin = $row; + } + if ($row > $this->_dim_rowmax) { + $this->_dim_rowmax = $row; + } + if ($col < $this->_dim_colmin) { + $this->_dim_colmin = $col; + } + if ($col > $this->_dim_colmax) { + $this->_dim_colmax = $col; + } + return true; + } + + /** + * Writes a note associated with the cell given by the row and column. + * NOTE records don't have a length limit. + * + * @access public + * @param integer $row Zero indexed row + * @param integer $col Zero indexed column + * @param string $note The note to write + */ + function writeNote($row, $col, $note) + { + $note_length = strlen($note); + $record = 0x001C; // Record identifier + $max_length = 2048; // Maximun length for a NOTE record + //$length = 0x0006 + $note_length; // Bytes to follow + + // Check that row and col are valid and store max and min values + if ($row >= $this->_xls_rowmax) + { + return(-2); + } + if ($col >= $this->_xls_colmax) + { + return(-2); + } + if ($row < $this->_dim_rowmin) + { + $this->_dim_rowmin = $row; + } + if ($row > $this->_dim_rowmax) + { + $this->_dim_rowmax = $row; + } + if ($col < $this->_dim_colmin) + { + $this->_dim_colmin = $col; + } + if ($col > $this->_dim_colmax) + { + $this->_dim_colmax = $col; + } + + // Length for this record is no more than 2048 + 6 + $length = 0x0006 + min($note_length, 2048); + $header = pack("vv", $record, $length); + $data = pack("vvv", $row, $col, $note_length); + $this->_append($header.$data.substr($note, 0, 2048)); + + for($i = $max_length; $i < $note_length; $i += $max_length) + { + $chunk = substr($note, $i, $max_length); + $length = 0x0006 + strlen($chunk); + $header = pack("vv", $record, $length); + $data = pack("vvv", -1, 0, strlen($chunk)); + $this->_append($header.$data.$chunk); + } + return(0); + } + + /** + * Write a blank cell to the specified row and column (zero indexed). + * A blank cell is used to specify formatting without adding a string + * or a number. + * + * A blank cell without a format serves no purpose. Therefore, we don't write + * a BLANK record unless a format is specified. + * + * Returns 0 : normal termination (including no format) + * -1 : insufficient number of arguments + * -2 : row or column out of range + * + * @access public + * @param integer $row Zero indexed row + * @param integer $col Zero indexed column + * @param mixed $format The XF format + */ + function writeBlank($row, $col, $format) + { + // Don't write a blank cell unless it has a format + if ($format == 0) + { + return(0); + } + + $record = 0x0201; // Record identifier + $length = 0x0006; // Number of bytes to follow + $xf = $this->_XF($format); // The cell format + + // Check that row and col are valid and store max and min values + if ($row >= $this->_xls_rowmax) + { + return(-2); + } + if ($col >= $this->_xls_colmax) + { + return(-2); + } + if ($row < $this->_dim_rowmin) + { + $this->_dim_rowmin = $row; + } + if ($row > $this->_dim_rowmax) + { + $this->_dim_rowmax = $row; + } + if ($col < $this->_dim_colmin) + { + $this->_dim_colmin = $col; + } + if ($col > $this->_dim_colmax) + { + $this->_dim_colmax = $col; + } + + $header = pack("vv", $record, $length); + $data = pack("vvv", $row, $col, $xf); + $this->_append($header.$data); + return 0; + } + + /** + * Write a formula to the specified row and column (zero indexed). + * The textual representation of the formula is passed to the parser in + * Parser.php which returns a packed binary string. + * + * Returns 0 : normal termination + * -1 : formula errors (bad formula) + * -2 : row or column out of range + * + * @access public + * @param integer $row Zero indexed row + * @param integer $col Zero indexed column + * @param string $formula The formula text string + * @param mixed $format The optional XF format + * @return integer + */ + function writeFormula($row, $col, $formula, $format = 0) + { + $record = 0x0006; // Record identifier + + // Excel normally stores the last calculated value of the formula in $num. + // Clearly we are not in a position to calculate this a priori. Instead + // we set $num to zero and set the option flags in $grbit to ensure + // automatic calculation of the formula when the file is opened. + // + $xf = $this->_XF($format); // The cell format + $num = 0x00; // Current value of formula + $grbit = 0x03; // Option flags + $unknown = 0x0000; // Must be zero + + + // Check that row and col are valid and store max and min values + if ($this->_checkRowCol($row, $col) == false) { + return -2; + } + + // Strip the '=' or '@' sign at the beginning of the formula string + if (preg_match("/^=/",$formula)) { + $formula = preg_replace("/(^=)/","",$formula); + } + elseif (preg_match("/^@/",$formula)) { + $formula = preg_replace("/(^@)/","",$formula); + } + else + { + // Error handling + $this->writeString($row, $col, 'Unrecognised character for formula'); + return -1; + } + + // Parse the formula using the parser in Parser.php + $error = $this->_parser->parse($formula); + if ($this->isError($error)) + { + $this->writeString($row, $col, $error->getMessage()); + return -1; + } + + $formula = $this->_parser->toReversePolish(); + if ($this->isError($formula)) + { + $this->writeString($row, $col, $formula->getMessage()); + return -1; + } + + $formlen = strlen($formula); // Length of the binary string + $length = 0x16 + $formlen; // Length of the record data + + $header = pack("vv", $record, $length); + $data = pack("vvvdvVv", $row, $col, $xf, $num, + $grbit, $unknown, $formlen); + + $this->_append($header.$data.$formula); + return 0; + } + + /** + * Write a hyperlink. + * This is comprised of two elements: the visible label and + * the invisible link. The visible label is the same as the link unless an + * alternative string is specified. The label is written using the + * writeString() method. Therefore the 255 characters string limit applies. + * $string and $format are optional. + * + * The hyperlink can be to a http, ftp, mail, internal sheet (not yet), or external + * directory url. + * + * Returns 0 : normal termination + * -2 : row or column out of range + * -3 : long string truncated to 255 chars + * + * @access public + * @param integer $row Row + * @param integer $col Column + * @param string $url URL string + * @param string $string Alternative label + * @param mixed $format The cell format + * @return integer + */ + function writeUrl($row, $col, $url, $string = '', $format = 0) + { + // Add start row and col to arg list + return($this->_writeUrlRange($row, $col, $row, $col, $url, $string, $format)); + } + + /** + * This is the more general form of writeUrl(). It allows a hyperlink to be + * written to a range of cells. This function also decides the type of hyperlink + * to be written. These are either, Web (http, ftp, mailto), Internal + * (Sheet1!A1) or external ('c:\temp\foo.xls#Sheet1!A1'). + * + * @access private + * @see writeUrl() + * @param integer $row1 Start row + * @param integer $col1 Start column + * @param integer $row2 End row + * @param integer $col2 End column + * @param string $url URL string + * @param string $string Alternative label + * @param mixed $format The cell format + * @return integer + */ + + function _writeUrlRange($row1, $col1, $row2, $col2, $url, $string = '', $format = 0) + { + + // Check for internal/external sheet links or default to web link + if (preg_match('[^internal:]', $url)) { + return($this->_writeUrlInternal($row1, $col1, $row2, $col2, $url, $string, $format)); + } + if (preg_match('[^external:]', $url)) { + return($this->_writeUrlExternal($row1, $col1, $row2, $col2, $url, $string, $format)); + } + return($this->_writeUrlWeb($row1, $col1, $row2, $col2, $url, $string, $format)); + } + + + /** + * Used to write http, ftp and mailto hyperlinks. + * The link type ($options) is 0x03 is the same as absolute dir ref without + * sheet. However it is differentiated by the $unknown2 data stream. + * + * @access private + * @see writeUrl() + * @param integer $row1 Start row + * @param integer $col1 Start column + * @param integer $row2 End row + * @param integer $col2 End column + * @param string $url URL string + * @param string $str Alternative label + * @param mixed $format The cell format + * @return integer + */ + function _writeUrlWeb($row1, $col1, $row2, $col2, $url, $str, $format = 0) + { + $record = 0x01B8; // Record identifier + $length = 0x00000; // Bytes to follow + + if ($format == 0) { + $format = $this->_url_format; + } + + // Write the visible label using the writeString() method. + if ($str == '') { + $str = $url; + } + $str_error = $this->writeString($row1, $col1, $str, $format); + if (($str_error == -2) or ($str_error == -3)) { + return $str_error; + } + + // Pack the undocumented parts of the hyperlink stream + $unknown1 = pack("H*", "D0C9EA79F9BACE118C8200AA004BA90B02000000"); + $unknown2 = pack("H*", "E0C9EA79F9BACE118C8200AA004BA90B"); + + // Pack the option flags + $options = pack("V", 0x03); + + // Convert URL to a null terminated wchar string + $url = join("\0", preg_split("''", $url, -1, PREG_SPLIT_NO_EMPTY)); + $url = $url . "\0\0\0"; + + // Pack the length of the URL + $url_len = pack("V", strlen($url)); + + // Calculate the data length + $length = 0x34 + strlen($url); + + // Pack the header data + $header = pack("vv", $record, $length); + $data = pack("vvvv", $row1, $row2, $col1, $col2); + + // Write the packed data + $this->_append( $header. $data. + $unknown1. $options. + $unknown2. $url_len. $url); + return($str_error); + } + + /** + * Used to write internal reference hyperlinks such as "Sheet1!A1". + * + * @access private + * @see writeUrl() + * @param integer $row1 Start row + * @param integer $col1 Start column + * @param integer $row2 End row + * @param integer $col2 End column + * @param string $url URL string + * @param string $str Alternative label + * @param mixed $format The cell format + * @return integer + */ + function _writeUrlInternal($row1, $col1, $row2, $col2, $url, $str, $format = 0) + { + $record = 0x01B8; // Record identifier + $length = 0x00000; // Bytes to follow + + if ($format == 0) { + $format = $this->_url_format; + } + + // Strip URL type + $url = preg_replace('s[^internal:]', '', $url); + + // Write the visible label + if ($str == '') { + $str = $url; + } + $str_error = $this->writeString($row1, $col1, $str, $format); + if (($str_error == -2) or ($str_error == -3)) { + return $str_error; + } + + // Pack the undocumented parts of the hyperlink stream + $unknown1 = pack("H*", "D0C9EA79F9BACE118C8200AA004BA90B02000000"); + + // Pack the option flags + $options = pack("V", 0x08); + + // Convert the URL type and to a null terminated wchar string + $url = join("\0", preg_split("''", $url, -1, PREG_SPLIT_NO_EMPTY)); + $url = $url . "\0\0\0"; + + // Pack the length of the URL as chars (not wchars) + $url_len = pack("V", floor(strlen($url)/2)); + + // Calculate the data length + $length = 0x24 + strlen($url); + + // Pack the header data + $header = pack("vv", $record, $length); + $data = pack("vvvv", $row1, $row2, $col1, $col2); + + // Write the packed data + $this->_append($header. $data. + $unknown1. $options. + $url_len. $url); + return($str_error); + } + + /** + * Write links to external directory names such as 'c:\foo.xls', + * c:\foo.xls#Sheet1!A1', '../../foo.xls'. and '../../foo.xls#Sheet1!A1'. + * + * Note: Excel writes some relative links with the $dir_long string. We ignore + * these cases for the sake of simpler code. + * + * @access private + * @see writeUrl() + * @param integer $row1 Start row + * @param integer $col1 Start column + * @param integer $row2 End row + * @param integer $col2 End column + * @param string $url URL string + * @param string $str Alternative label + * @param mixed $format The cell format + * @return integer + */ + function _writeUrlExternal($row1, $col1, $row2, $col2, $url, $str, $format = 0) + { + // Network drives are different. We will handle them separately + // MS/Novell network drives and shares start with \\ + if (preg_match('[^external:\\\\]', $url)) { + return; //($this->_writeUrlExternal_net($row1, $col1, $row2, $col2, $url, $str, $format)); + } + + $record = 0x01B8; // Record identifier + $length = 0x00000; // Bytes to follow + + if ($format == 0) { + $format = $this->_url_format; + } + + // Strip URL type and change Unix dir separator to Dos style (if needed) + // + $url = preg_replace('[^external:]', '', $url); + $url = preg_replace('[/]', "\\", $url); + + // Write the visible label + if ($str == '') { + $str = preg_replace('[\#]', ' - ', $url); + } + $str_error = $this->writeString($row1, $col1, $str, $format); + if (($str_error == -2) or ($str_error == -3)) { + return $str_error; + } + + // Determine if the link is relative or absolute: + // relative if link contains no dir separator, "somefile.xls" + // relative if link starts with up-dir, "..\..\somefile.xls" + // otherwise, absolute + + $absolute = 0x02; // Bit mask + if (!preg_match('[\\]', $url)) { + $absolute = 0x00; + } + if (preg_match('[^\.\.\\]', $url)) { + $absolute = 0x00; + } + + // Determine if the link contains a sheet reference and change some of the + // parameters accordingly. + // Split the dir name and sheet name (if it exists) + list($dir_long , $sheet) = explode('/\#/', $url); + $link_type = 0x01 | $absolute; + + if (isset($sheet)) { + $link_type |= 0x08; + $sheet_len = pack("V", strlen($sheet) + 0x01); + $sheet = join("\0", explode('', $sheet)); + $sheet .= "\0\0\0"; + } + else { + $sheet_len = ''; + $sheet = ''; + } + + // Pack the link type + $link_type = pack("V", $link_type); + + // Calculate the up-level dir count e.g.. (..\..\..\ == 3) + $up_count = preg_match_all("/\.\.\\/", $dir_long, $useless); + $up_count = pack("v", $up_count); + + // Store the short dos dir name (null terminated) + $dir_short = preg_replace('/\.\.\\/', '', $dir_long) . "\0"; + + // Store the long dir name as a wchar string (non-null terminated) + $dir_long = join("\0", explode('', $dir_long)); + $dir_long = $dir_long . "\0"; + + // Pack the lengths of the dir strings + $dir_short_len = pack("V", strlen($dir_short) ); + $dir_long_len = pack("V", strlen($dir_long) ); + $stream_len = pack("V", strlen($dir_long) + 0x06); + + // Pack the undocumented parts of the hyperlink stream + $unknown1 = pack("H*",'D0C9EA79F9BACE118C8200AA004BA90B02000000' ); + $unknown2 = pack("H*",'0303000000000000C000000000000046' ); + $unknown3 = pack("H*",'FFFFADDE000000000000000000000000000000000000000'); + $unknown4 = pack("v", 0x03 ); + + // Pack the main data stream + $data = pack("vvvv", $row1, $row2, $col1, $col2) . + $unknown1 . + $link_type . + $unknown2 . + $up_count . + $dir_short_len. + $dir_short . + $unknown3 . + $stream_len . + $dir_long_len . + $unknown4 . + $dir_long . + $sheet_len . + $sheet ; + + // Pack the header data + $length = strlen($data); + $header = pack("vv", $record, $length); + + // Write the packed data + $this->_append($header. $data); + return($str_error); + } + + + /** + * This method is used to set the height and format for a row. + * + * @access public + * @param integer $row The row to set + * @param integer $height Height we are giving to the row. + * Use NULL to set XF without setting height + * @param mixed $format XF format we are giving to the row + * @param bool $hidden The optional hidden attribute + * @param integer $level The optional outline level for row, in range [0,7] + */ + function setRow($row, $height, $format = 0, $hidden = false, $level = 0) + { + $record = 0x0208; // Record identifier + $length = 0x0010; // Number of bytes to follow + + $colMic = 0x0000; // First defined column + $colMac = 0x0000; // Last defined column + $irwMac = 0x0000; // Used by Excel to optimise loading + $reserved = 0x0000; // Reserved + $grbit = 0x0000; // Option flags + $ixfe = $this->_XF($format); // XF index + + // Use setRow($row, NULL, $XF) to set XF format without setting height + if ($height != NULL) { + $miyRw = $height * 20; // row height + } + else { + $miyRw = 0xff; // default row height is 256 + } + + $level = max(0, min($level, 7)); // level should be between 0 and 7 + $this->_outline_row_level = max($level, $this->_outline_row_level); + + + // Set the options flags. fUnsynced is used to show that the font and row + // heights are not compatible. This is usually the case for WriteExcel. + // The collapsed flag 0x10 doesn't seem to be used to indicate that a row + // is collapsed. Instead it is used to indicate that the previous row is + // collapsed. The zero height flag, 0x20, is used to collapse a row. + + $grbit |= $level; + if ($hidden) { + $grbit |= 0x0020; + } + $grbit |= 0x0040; // fUnsynced + if ($format) { + $grbit |= 0x0080; + } + $grbit |= 0x0100; + + $header = pack("vv", $record, $length); + $data = pack("vvvvvvvv", $row, $colMic, $colMac, $miyRw, + $irwMac,$reserved, $grbit, $ixfe); + $this->_append($header.$data); + } + + /** + * Writes Excel DIMENSIONS to define the area in which there is data. + * + * @access private + */ + function _storeDimensions() + { + $record = 0x0200; // Record identifier + $row_min = $this->_dim_rowmin; // First row + $row_max = $this->_dim_rowmax + 1; // Last row plus 1 + $col_min = $this->_dim_colmin; // First column + $col_max = $this->_dim_colmax + 1; // Last column plus 1 + $reserved = 0x0000; // Reserved by Excel + + if ($this->_BIFF_version == 0x0500) { + $length = 0x000A; // Number of bytes to follow + $data = pack("vvvvv", $row_min, $row_max, + $col_min, $col_max, $reserved); + } + elseif ($this->_BIFF_version == 0x0600) { + $length = 0x000E; + $data = pack("VVvvv", $row_min, $row_max, + $col_min, $col_max, $reserved); + } + $header = pack("vv", $record, $length); + $this->_prepend($header.$data); + } + + /** + * Write BIFF record Window2. + * + * @access private + */ + function _storeWindow2() + { + $record = 0x023E; // Record identifier + if ($this->_BIFF_version == 0x0500) { + $length = 0x000A; // Number of bytes to follow + } + elseif ($this->_BIFF_version == 0x0600) { + $length = 0x0012; + } + + $grbit = 0x00B6; // Option flags + $rwTop = 0x0000; // Top row visible in window + $colLeft = 0x0000; // Leftmost column visible in window + + + // The options flags that comprise $grbit + $fDspFmla = 0; // 0 - bit + $fDspGrid = 1; // 1 + $fDspRwCol = 1; // 2 + $fFrozen = $this->_frozen; // 3 + $fDspZeros = 1; // 4 + $fDefaultHdr = 1; // 5 + $fArabic = 0; // 6 + $fDspGuts = $this->_outline_on; // 7 + $fFrozenNoSplit = 0; // 0 - bit + $fSelected = $this->selected; // 1 + $fPaged = 1; // 2 + + $grbit = $fDspFmla; + $grbit |= $fDspGrid << 1; + $grbit |= $fDspRwCol << 2; + $grbit |= $fFrozen << 3; + $grbit |= $fDspZeros << 4; + $grbit |= $fDefaultHdr << 5; + $grbit |= $fArabic << 6; + $grbit |= $fDspGuts << 7; + $grbit |= $fFrozenNoSplit << 8; + $grbit |= $fSelected << 9; + $grbit |= $fPaged << 10; + + $header = pack("vv", $record, $length); + $data = pack("vvv", $grbit, $rwTop, $colLeft); + // FIXME !!! + if ($this->_BIFF_version == 0x0500) { + $rgbHdr = 0x00000000; // Row/column heading and gridline color + $data .= pack("V", $rgbHdr); + } + elseif ($this->_BIFF_version == 0x0600) { + $rgbHdr = 0x0040; // Row/column heading and gridline color index + $zoom_factor_page_break = 0x0000; + $zoom_factor_normal = 0x0000; + $data .= pack("vvvvV", $rgbHdr, 0x0000, $zoom_factor_page_break, $zoom_factor_normal, 0x00000000); + } + $this->_append($header.$data); + } + + /** + * Write BIFF record DEFCOLWIDTH if COLINFO records are in use. + * + * @access private + */ + function _storeDefcol() + { + $record = 0x0055; // Record identifier + $length = 0x0002; // Number of bytes to follow + $colwidth = 0x0008; // Default column width + + $header = pack("vv", $record, $length); + $data = pack("v", $colwidth); + $this->_prepend($header.$data); + } + + /** + * Write BIFF record COLINFO to define column widths + * + * Note: The SDK says the record length is 0x0B but Excel writes a 0x0C + * length record. + * + * @access private + * @param array $col_array This is the only parameter received and is composed of the following: + * 0 => First formatted column, + * 1 => Last formatted column, + * 2 => Col width (8.43 is Excel default), + * 3 => The optional XF format of the column, + * 4 => Option flags. + * 5 => Optional outline level + */ + function _storeColinfo($col_array) + { + if (isset($col_array[0])) { + $colFirst = $col_array[0]; + } + if (isset($col_array[1])) { + $colLast = $col_array[1]; + } + if (isset($col_array[2])) { + $coldx = $col_array[2]; + } + else { + $coldx = 8.43; + } + if (isset($col_array[3])) { + $format = $col_array[3]; + } + else { + $format = 0; + } + if (isset($col_array[4])) { + $grbit = $col_array[4]; + } + else { + $grbit = 0; + } + if (isset($col_array[5])) { + $level = $col_array[5]; + } + else { + $level = 0; + } + $record = 0x007D; // Record identifier + $length = 0x000B; // Number of bytes to follow + + $coldx += 0.72; // Fudge. Excel subtracts 0.72 !? + $coldx *= 256; // Convert to units of 1/256 of a char + + $ixfe = $this->_XF($format); + $reserved = 0x00; // Reserved + + $level = max(0, min($level, 7)); + $grbit |= $level << 8; + + $header = pack("vv", $record, $length); + $data = pack("vvvvvC", $colFirst, $colLast, $coldx, + $ixfe, $grbit, $reserved); + $this->_prepend($header.$data); + } + + /** + * Write BIFF record SELECTION. + * + * @access private + * @param array $array array containing ($rwFirst,$colFirst,$rwLast,$colLast) + * @see setSelection() + */ + function _storeSelection($array) + { + list($rwFirst,$colFirst,$rwLast,$colLast) = $array; + $record = 0x001D; // Record identifier + $length = 0x000F; // Number of bytes to follow + + $pnn = $this->_active_pane; // Pane position + $rwAct = $rwFirst; // Active row + $colAct = $colFirst; // Active column + $irefAct = 0; // Active cell ref + $cref = 1; // Number of refs + + if (!isset($rwLast)) { + $rwLast = $rwFirst; // Last row in reference + } + if (!isset($colLast)) { + $colLast = $colFirst; // Last col in reference + } + + // Swap last row/col for first row/col as necessary + if ($rwFirst > $rwLast) + { + list($rwFirst, $rwLast) = array($rwLast, $rwFirst); + } + + if ($colFirst > $colLast) + { + list($colFirst, $colLast) = array($colLast, $colFirst); + } + + $header = pack("vv", $record, $length); + $data = pack("CvvvvvvCC", $pnn, $rwAct, $colAct, + $irefAct, $cref, + $rwFirst, $rwLast, + $colFirst, $colLast); + $this->_append($header.$data); + } + + /** + * Store the MERGEDCELLS record for all ranges of merged cells + * + * @access private + */ + function _storeMergedCells() + { + // if there are no merged cell ranges set, return + if (count($this->_merged_ranges) == 0) { + return; + } + $record = 0x00E5; + $length = 2 + count($this->_merged_ranges) * 8; + + $header = pack('vv', $record, $length); + $data = pack('v', count($this->_merged_ranges)); + foreach ($this->_merged_ranges as $range) { + $data .= pack('vvvv', $range[0], $range[2], $range[1], $range[3]); + } + $this->_append($header.$data); + } + + /** + * Write BIFF record EXTERNCOUNT to indicate the number of external sheet + * references in a worksheet. + * + * Excel only stores references to external sheets that are used in formulas. + * For simplicity we store references to all the sheets in the workbook + * regardless of whether they are used or not. This reduces the overall + * complexity and eliminates the need for a two way dialogue between the formula + * parser the worksheet objects. + * + * @access private + * @param integer $count The number of external sheet references in this worksheet + */ + function _storeExterncount($count) + { + $record = 0x0016; // Record identifier + $length = 0x0002; // Number of bytes to follow + + $header = pack("vv", $record, $length); + $data = pack("v", $count); + $this->_prepend($header.$data); + } + + /** + * Writes the Excel BIFF EXTERNSHEET record. These references are used by + * formulas. A formula references a sheet name via an index. Since we store a + * reference to all of the external worksheets the EXTERNSHEET index is the same + * as the worksheet index. + * + * @access private + * @param string $sheetname The name of a external worksheet + */ + function _storeExternsheet($sheetname) + { + $record = 0x0017; // Record identifier + + // References to the current sheet are encoded differently to references to + // external sheets. + // + if ($this->name == $sheetname) { + $sheetname = ''; + $length = 0x02; // The following 2 bytes + $cch = 1; // The following byte + $rgch = 0x02; // Self reference + } + else { + $length = 0x02 + strlen($sheetname); + $cch = strlen($sheetname); + $rgch = 0x03; // Reference to a sheet in the current workbook + } + + $header = pack("vv", $record, $length); + $data = pack("CC", $cch, $rgch); + $this->_prepend($header.$data.$sheetname); + } + + /** + * Writes the Excel BIFF PANE record. + * The panes can either be frozen or thawed (unfrozen). + * Frozen panes are specified in terms of an integer number of rows and columns. + * Thawed panes are specified in terms of Excel's units for rows and columns. + * + * @access private + * @param array $panes This is the only parameter received and is composed of the following: + * 0 => Vertical split position, + * 1 => Horizontal split position + * 2 => Top row visible + * 3 => Leftmost column visible + * 4 => Active pane + */ + function _storePanes($panes) + { + $y = $panes[0]; + $x = $panes[1]; + $rwTop = $panes[2]; + $colLeft = $panes[3]; + if (count($panes) > 4) { // if Active pane was received + $pnnAct = $panes[4]; + } + else { + $pnnAct = NULL; + } + $record = 0x0041; // Record identifier + $length = 0x000A; // Number of bytes to follow + + // Code specific to frozen or thawed panes. + if ($this->_frozen) + { + // Set default values for $rwTop and $colLeft + if (!isset($rwTop)) { + $rwTop = $y; + } + if (!isset($colLeft)) { + $colLeft = $x; + } + } + else + { + // Set default values for $rwTop and $colLeft + if (!isset($rwTop)) { + $rwTop = 0; + } + if (!isset($colLeft)) { + $colLeft = 0; + } + + // Convert Excel's row and column units to the internal units. + // The default row height is 12.75 + // The default column width is 8.43 + // The following slope and intersection values were interpolated. + // + $y = 20*$y + 255; + $x = 113.879*$x + 390; + } + + + // Determine which pane should be active. There is also the undocumented + // option to override this should it be necessary: may be removed later. + // + if (!isset($pnnAct)) + { + if ($x != 0 and $y != 0) + $pnnAct = 0; // Bottom right + if ($x != 0 and $y == 0) + $pnnAct = 1; // Top right + if ($x == 0 and $y != 0) + $pnnAct = 2; // Bottom left + if ($x == 0 and $y == 0) + $pnnAct = 3; // Top left + } + + $this->_active_pane = $pnnAct; // Used in _storeSelection + + $header = pack("vv", $record, $length); + $data = pack("vvvvv", $x, $y, $rwTop, $colLeft, $pnnAct); + $this->_append($header.$data); + } + + /** + * Store the page setup SETUP BIFF record. + * + * @access private + */ + function _storeSetup() + { + $record = 0x00A1; // Record identifier + $length = 0x0022; // Number of bytes to follow + + $iPaperSize = $this->_paper_size; // Paper size + $iScale = $this->_print_scale; // Print scaling factor + $iPageStart = 0x01; // Starting page number + $iFitWidth = $this->_fit_width; // Fit to number of pages wide + $iFitHeight = $this->_fit_height; // Fit to number of pages high + $grbit = 0x00; // Option flags + $iRes = 0x0258; // Print resolution + $iVRes = 0x0258; // Vertical print resolution + $numHdr = $this->_margin_head; // Header Margin + $numFtr = $this->_margin_foot; // Footer Margin + $iCopies = 0x01; // Number of copies + + $fLeftToRight = 0x0; // Print over then down + $fLandscape = $this->_orientation; // Page orientation + $fNoPls = 0x0; // Setup not read from printer + $fNoColor = 0x0; // Print black and white + $fDraft = 0x0; // Print draft quality + $fNotes = 0x0; // Print notes + $fNoOrient = 0x0; // Orientation not set + $fUsePage = 0x0; // Use custom starting page + + $grbit = $fLeftToRight; + $grbit |= $fLandscape << 1; + $grbit |= $fNoPls << 2; + $grbit |= $fNoColor << 3; + $grbit |= $fDraft << 4; + $grbit |= $fNotes << 5; + $grbit |= $fNoOrient << 6; + $grbit |= $fUsePage << 7; + + $numHdr = pack("d", $numHdr); + $numFtr = pack("d", $numFtr); + if ($this->_byte_order) // if it's Big Endian + { + $numHdr = strrev($numHdr); + $numFtr = strrev($numFtr); + } + + $header = pack("vv", $record, $length); + $data1 = pack("vvvvvvvv", $iPaperSize, + $iScale, + $iPageStart, + $iFitWidth, + $iFitHeight, + $grbit, + $iRes, + $iVRes); + $data2 = $numHdr.$numFtr; + $data3 = pack("v", $iCopies); + $this->_prepend($header.$data1.$data2.$data3); + } + + /** + * Store the header caption BIFF record. + * + * @access private + */ + function _storeHeader() + { + $record = 0x0014; // Record identifier + + $str = $this->_header; // header string + $cch = strlen($str); // Length of header string + if ($this->_BIFF_version == 0x0600) { + $encoding = 0x0; // TODO: Unicode support + $length = 3 + $cch; // Bytes to follow + } + else { + $length = 1 + $cch; // Bytes to follow + } + $header = pack("vv", $record, $length); + if ($this->_BIFF_version == 0x0600) { + $data = pack("vC", $cch, $encoding); + } + else { + $data = pack("C", $cch); + } + + $this->_append($header.$data.$str); + } + + /** + * Store the footer caption BIFF record. + * + * @access private + */ + function _storeFooter() + { + $record = 0x0015; // Record identifier + + $str = $this->_footer; // Footer string + $cch = strlen($str); // Length of footer string + if ($this->_BIFF_version == 0x0600) { + $encoding = 0x0; // TODO: Unicode support + $length = 3 + $cch; // Bytes to follow + } + else { + $length = 1 + $cch; + } + $header = pack("vv", $record, $length); + if ($this->_BIFF_version == 0x0600) { + $data = pack("vC", $cch, $encoding); + } + else { + $data = pack("C", $cch); + } + + $this->_append($header.$data.$str); + } + + /** + * Store the horizontal centering HCENTER BIFF record. + * + * @access private + */ + function _storeHcenter() + { + $record = 0x0083; // Record identifier + $length = 0x0002; // Bytes to follow + + $fHCenter = $this->_hcenter; // Horizontal centering + + $header = pack("vv", $record, $length); + $data = pack("v", $fHCenter); + + $this->_append($header.$data); + } + + /** + * Store the vertical centering VCENTER BIFF record. + * + * @access private + */ + function _storeVcenter() + { + $record = 0x0084; // Record identifier + $length = 0x0002; // Bytes to follow + + $fVCenter = $this->_vcenter; // Horizontal centering + + $header = pack("vv", $record, $length); + $data = pack("v", $fVCenter); + $this->_append($header.$data); + } + + /** + * Store the LEFTMARGIN BIFF record. + * + * @access private + */ + function _storeMarginLeft() + { + $record = 0x0026; // Record identifier + $length = 0x0008; // Bytes to follow + + $margin = $this->_margin_left; // Margin in inches + + $header = pack("vv", $record, $length); + $data = pack("d", $margin); + if ($this->_byte_order) // if it's Big Endian + { + $data = strrev($data); + } + + $this->_append($header.$data); + } + + /** + * Store the RIGHTMARGIN BIFF record. + * + * @access private + */ + function _storeMarginRight() + { + $record = 0x0027; // Record identifier + $length = 0x0008; // Bytes to follow + + $margin = $this->_margin_right; // Margin in inches + + $header = pack("vv", $record, $length); + $data = pack("d", $margin); + if ($this->_byte_order) // if it's Big Endian + { + $data = strrev($data); + } + + $this->_append($header.$data); + } + + /** + * Store the TOPMARGIN BIFF record. + * + * @access private + */ + function _storeMarginTop() + { + $record = 0x0028; // Record identifier + $length = 0x0008; // Bytes to follow + + $margin = $this->_margin_top; // Margin in inches + + $header = pack("vv", $record, $length); + $data = pack("d", $margin); + if ($this->_byte_order) // if it's Big Endian + { + $data = strrev($data); + } + + $this->_append($header.$data); + } + + /** + * Store the BOTTOMMARGIN BIFF record. + * + * @access private + */ + function _storeMarginBottom() + { + $record = 0x0029; // Record identifier + $length = 0x0008; // Bytes to follow + + $margin = $this->_margin_bottom; // Margin in inches + + $header = pack("vv", $record, $length); + $data = pack("d", $margin); + if ($this->_byte_order) // if it's Big Endian + { + $data = strrev($data); + } + + $this->_append($header.$data); + } + + /** + * Merges the area given by its arguments. + * This is an Excel97/2000 method. It is required to perform more complicated + * merging than the normal setAlign('merge'). + * + * @access public + * @param integer $first_row First row of the area to merge + * @param integer $first_col First column of the area to merge + * @param integer $last_row Last row of the area to merge + * @param integer $last_col Last column of the area to merge + */ + function mergeCells($first_row, $first_col, $last_row, $last_col) + { + $record = 0x00E5; // Record identifier + $length = 0x000A; // Bytes to follow + $cref = 1; // Number of refs + + // Swap last row/col for first row/col as necessary + if ($first_row > $last_row) { + list($first_row, $last_row) = array($last_row, $first_row); + } + + if ($first_col > $last_col) { + list($first_col, $last_col) = array($last_col, $first_col); + } + + $header = pack("vv", $record, $length); + $data = pack("vvvvv", $cref, $first_row, $last_row, + $first_col, $last_col); + + $this->_append($header.$data); + } + + /** + * Write the PRINTHEADERS BIFF record. + * + * @access private + */ + function _storePrintHeaders() + { + $record = 0x002a; // Record identifier + $length = 0x0002; // Bytes to follow + + $fPrintRwCol = $this->_print_headers; // Boolean flag + + $header = pack("vv", $record, $length); + $data = pack("v", $fPrintRwCol); + $this->_prepend($header.$data); + } + + /** + * Write the PRINTGRIDLINES BIFF record. Must be used in conjunction with the + * GRIDSET record. + * + * @access private + */ + function _storePrintGridlines() + { + $record = 0x002b; // Record identifier + $length = 0x0002; // Bytes to follow + + $fPrintGrid = $this->_print_gridlines; // Boolean flag + + $header = pack("vv", $record, $length); + $data = pack("v", $fPrintGrid); + $this->_prepend($header.$data); + } + + /** + * Write the GRIDSET BIFF record. Must be used in conjunction with the + * PRINTGRIDLINES record. + * + * @access private + */ + function _storeGridset() + { + $record = 0x0082; // Record identifier + $length = 0x0002; // Bytes to follow + + $fGridSet = !($this->_print_gridlines); // Boolean flag + + $header = pack("vv", $record, $length); + $data = pack("v", $fGridSet); + $this->_prepend($header.$data); + } + + /** + * Write the GUTS BIFF record. This is used to configure the gutter margins + * where Excel outline symbols are displayed. The visibility of the gutters is + * controlled by a flag in WSBOOL. + * + * @see _storeWsbool() + * @access private + */ + function _storeGuts() + { + $record = 0x0080; // Record identifier + $length = 0x0008; // Bytes to follow + + $dxRwGut = 0x0000; // Size of row gutter + $dxColGut = 0x0000; // Size of col gutter + + $row_level = $this->_outline_row_level; + $col_level = 0; + + // Calculate the maximum column outline level. The equivalent calculation + // for the row outline level is carried out in setRow(). + for ($i=0; $i < count($this->_colinfo); $i++) + { + // Skip cols without outline level info. + if (count($col_level) >= 6) { + $col_level = max($this->_colinfo[$i][5], $col_level); + } + } + + // Set the limits for the outline levels (0 <= x <= 7). + $col_level = max(0, min($col_level, 7)); + + // The displayed level is one greater than the max outline levels + if ($row_level) { + $row_level++; + } + if ($col_level) { + $col_level++; + } + + $header = pack("vv", $record, $length); + $data = pack("vvvv", $dxRwGut, $dxColGut, $row_level, $col_level); + + $this->_prepend($header.$data); + } + + + /** + * Write the WSBOOL BIFF record, mainly for fit-to-page. Used in conjunction + * with the SETUP record. + * + * @access private + */ + function _storeWsbool() + { + $record = 0x0081; // Record identifier + $length = 0x0002; // Bytes to follow + $grbit = 0x0000; + + // The only option that is of interest is the flag for fit to page. So we + // set all the options in one go. + // + /*if ($this->_fit_page) { + $grbit = 0x05c1; + } + else { + $grbit = 0x04c1; + }*/ + // Set the option flags + $grbit |= 0x0001; // Auto page breaks visible + if ($this->_outline_style) { + $grbit |= 0x0020; // Auto outline styles + } + if ($this->_outline_below) { + $grbit |= 0x0040; // Outline summary below + } + if ($this->_outline_right) { + $grbit |= 0x0080; // Outline summary right + } + if ($this->_fit_page) { + $grbit |= 0x0100; // Page setup fit to page + } + if ($this->_outline_on) { + $grbit |= 0x0400; // Outline symbols displayed + } + + $header = pack("vv", $record, $length); + $data = pack("v", $grbit); + $this->_prepend($header.$data); + } + + /** + * Write the HORIZONTALPAGEBREAKS BIFF record. + * + * @access private + */ + function _storeHbreak() + { + // Return if the user hasn't specified pagebreaks + if (empty($this->_hbreaks)) { + return; + } + + // Sort and filter array of page breaks + $breaks = $this->_hbreaks; + sort($breaks, SORT_NUMERIC); + if ($breaks[0] == 0) { // don't use first break if it's 0 + array_shift($breaks); + } + + $record = 0x001b; // Record identifier + $cbrk = count($breaks); // Number of page breaks + $length = 2 + 6*$cbrk; // Bytes to follow + + $header = pack("vv", $record, $length); + $data = pack("v", $cbrk); + + // Append each page break + foreach($breaks as $break) { + $data .= pack("vvv", $break, 0x0000, 0x00ff); + } + + $this->_prepend($header.$data); + } + + + /** + * Write the VERTICALPAGEBREAKS BIFF record. + * + * @access private + */ + function _storeVbreak() + { + // Return if the user hasn't specified pagebreaks + if (empty($this->_vbreaks)) { + return; + } + + // 1000 vertical pagebreaks appears to be an internal Excel 5 limit. + // It is slightly higher in Excel 97/200, approx. 1026 + $breaks = array_slice($this->_vbreaks,0,1000); + + // Sort and filter array of page breaks + sort($breaks, SORT_NUMERIC); + if ($breaks[0] == 0) { // don't use first break if it's 0 + array_shift($breaks); + } + + $record = 0x001a; // Record identifier + $cbrk = count($breaks); // Number of page breaks + $length = 2 + 6*$cbrk; // Bytes to follow + + $header = pack("vv", $record, $length); + $data = pack("v", $cbrk); + + // Append each page break + foreach ($breaks as $break) { + $data .= pack("vvv", $break, 0x0000, 0xffff); + } + + $this->_prepend($header.$data); + } + + /** + * Set the Biff PROTECT record to indicate that the worksheet is protected. + * + * @access private + */ + function _storeProtect() + { + // Exit unless sheet protection has been specified + if ($this->_protect == 0) { + return; + } + + $record = 0x0012; // Record identifier + $length = 0x0002; // Bytes to follow + + $fLock = $this->_protect; // Worksheet is protected + + $header = pack("vv", $record, $length); + $data = pack("v", $fLock); + + $this->_prepend($header.$data); + } + + /** + * Write the worksheet PASSWORD record. + * + * @access private + */ + function _storePassword() + { + // Exit unless sheet protection and password have been specified + if (($this->_protect == 0) or (!isset($this->_password))) { + return; + } + + $record = 0x0013; // Record identifier + $length = 0x0002; // Bytes to follow + + $wPassword = $this->_password; // Encoded password + + $header = pack("vv", $record, $length); + $data = pack("v", $wPassword); + + $this->_prepend($header.$data); + } + + + /** + * Insert a 24bit bitmap image in a worksheet. + * + * @access public + * @param integer $row The row we are going to insert the bitmap into + * @param integer $col The column we are going to insert the bitmap into + * @param string $bitmap The bitmap filename + * @param integer $x The horizontal position (offset) of the image inside the cell. + * @param integer $y The vertical position (offset) of the image inside the cell. + * @param integer $scale_x The horizontal scale + * @param integer $scale_y The vertical scale + */ + function insertBitmap($row, $col, $bitmap, $x = 0, $y = 0, $scale_x = 1, $scale_y = 1) + { + $bitmap_array = $this->_processBitmap($bitmap); + if ($this->isError($bitmap_array)) + { + $this->writeString($row, $col, $bitmap_array->getMessage()); + return; + } + list($width, $height, $size, $data) = $bitmap_array; //$this->_processBitmap($bitmap); + + // Scale the frame of the image. + $width *= $scale_x; + $height *= $scale_y; + + // Calculate the vertices of the image and write the OBJ record + $this->_positionImage($col, $row, $x, $y, $width, $height); + + // Write the IMDATA record to store the bitmap data + $record = 0x007f; + $length = 8 + $size; + $cf = 0x09; + $env = 0x01; + $lcb = $size; + + $header = pack("vvvvV", $record, $length, $cf, $env, $lcb); + $this->_append($header.$data); + } + + /** + * Calculate the vertices that define the position of the image as required by + * the OBJ record. + * + * +------------+------------+ + * | A | B | + * +-----+------------+------------+ + * | |(x1,y1) | | + * | 1 |(A1)._______|______ | + * | | | | | + * | | | | | + * +-----+----| BITMAP |-----+ + * | | | | | + * | 2 | |______________. | + * | | | (B2)| + * | | | (x2,y2)| + * +---- +------------+------------+ + * + * Example of a bitmap that covers some of the area from cell A1 to cell B2. + * + * Based on the width and height of the bitmap we need to calculate 8 vars: + * $col_start, $row_start, $col_end, $row_end, $x1, $y1, $x2, $y2. + * The width and height of the cells are also variable and have to be taken into + * account. + * The values of $col_start and $row_start are passed in from the calling + * function. The values of $col_end and $row_end are calculated by subtracting + * the width and height of the bitmap from the width and height of the + * underlying cells. + * The vertices are expressed as a percentage of the underlying cell width as + * follows (rhs values are in pixels): + * + * x1 = X / W *1024 + * y1 = Y / H *256 + * x2 = (X-1) / W *1024 + * y2 = (Y-1) / H *256 + * + * Where: X is distance from the left side of the underlying cell + * Y is distance from the top of the underlying cell + * W is the width of the cell + * H is the height of the cell + * + * @access private + * @note the SDK incorrectly states that the height should be expressed as a + * percentage of 1024. + * @param integer $col_start Col containing upper left corner of object + * @param integer $row_start Row containing top left corner of object + * @param integer $x1 Distance to left side of object + * @param integer $y1 Distance to top of object + * @param integer $width Width of image frame + * @param integer $height Height of image frame + */ + function _positionImage($col_start, $row_start, $x1, $y1, $width, $height) + { + // Initialise end cell to the same as the start cell + $col_end = $col_start; // Col containing lower right corner of object + $row_end = $row_start; // Row containing bottom right corner of object + + // Zero the specified offset if greater than the cell dimensions + if ($x1 >= $this->_sizeCol($col_start)) + { + $x1 = 0; + } + if ($y1 >= $this->_sizeRow($row_start)) + { + $y1 = 0; + } + + $width = $width + $x1 -1; + $height = $height + $y1 -1; + + // Subtract the underlying cell widths to find the end cell of the image + while ($width >= $this->_sizeCol($col_end)) { + $width -= $this->_sizeCol($col_end); + $col_end++; + } + + // Subtract the underlying cell heights to find the end cell of the image + while ($height >= $this->_sizeRow($row_end)) { + $height -= $this->_sizeRow($row_end); + $row_end++; + } + + // Bitmap isn't allowed to start or finish in a hidden cell, i.e. a cell + // with zero eight or width. + // + if ($this->_sizeCol($col_start) == 0) + return; + if ($this->_sizeCol($col_end) == 0) + return; + if ($this->_sizeRow($row_start) == 0) + return; + if ($this->_sizeRow($row_end) == 0) + return; + + // Convert the pixel values to the percentage value expected by Excel + $x1 = $x1 / $this->_sizeCol($col_start) * 1024; + $y1 = $y1 / $this->_sizeRow($row_start) * 256; + $x2 = $width / $this->_sizeCol($col_end) * 1024; // Distance to right side of object + $y2 = $height / $this->_sizeRow($row_end) * 256; // Distance to bottom of object + + $this->_storeObjPicture( $col_start, $x1, + $row_start, $y1, + $col_end, $x2, + $row_end, $y2 + ); + } + + /** + * Convert the width of a cell from user's units to pixels. By interpolation + * the relationship is: y = 7x +5. If the width hasn't been set by the user we + * use the default value. If the col is hidden we use a value of zero. + * + * @access private + * @param integer $col The column + * @return integer The width in pixels + */ + function _sizeCol($col) + { + // Look up the cell value to see if it has been changed + if (isset($this->col_sizes[$col])) { + if ($this->col_sizes[$col] == 0) { + return(0); + } + else { + return(floor(7 * $this->col_sizes[$col] + 5)); + } + } + else { + return(64); + } + } + + /** + * Convert the height of a cell from user's units to pixels. By interpolation + * the relationship is: y = 4/3x. If the height hasn't been set by the user we + * use the default value. If the row is hidden we use a value of zero. (Not + * possible to hide row yet). + * + * @access private + * @param integer $row The row + * @return integer The width in pixels + */ + function _sizeRow($row) + { + // Look up the cell value to see if it has been changed + if (isset($this->row_sizes[$row])) { + if ($this->row_sizes[$row] == 0) { + return(0); + } + else { + return(floor(4/3 * $this->row_sizes[$row])); + } + } + else { + return(17); + } + } + + /** + * Store the OBJ record that precedes an IMDATA record. This could be generalise + * to support other Excel objects. + * + * @access private + * @param integer $colL Column containing upper left corner of object + * @param integer $dxL Distance from left side of cell + * @param integer $rwT Row containing top left corner of object + * @param integer $dyT Distance from top of cell + * @param integer $colR Column containing lower right corner of object + * @param integer $dxR Distance from right of cell + * @param integer $rwB Row containing bottom right corner of object + * @param integer $dyB Distance from bottom of cell + */ + function _storeObjPicture($colL,$dxL,$rwT,$dyT,$colR,$dxR,$rwB,$dyB) + { + $record = 0x005d; // Record identifier + $length = 0x003c; // Bytes to follow + + $cObj = 0x0001; // Count of objects in file (set to 1) + $OT = 0x0008; // Object type. 8 = Picture + $id = 0x0001; // Object ID + $grbit = 0x0614; // Option flags + + $cbMacro = 0x0000; // Length of FMLA structure + $Reserved1 = 0x0000; // Reserved + $Reserved2 = 0x0000; // Reserved + + $icvBack = 0x09; // Background colour + $icvFore = 0x09; // Foreground colour + $fls = 0x00; // Fill pattern + $fAuto = 0x00; // Automatic fill + $icv = 0x08; // Line colour + $lns = 0xff; // Line style + $lnw = 0x01; // Line weight + $fAutoB = 0x00; // Automatic border + $frs = 0x0000; // Frame style + $cf = 0x0009; // Image format, 9 = bitmap + $Reserved3 = 0x0000; // Reserved + $cbPictFmla = 0x0000; // Length of FMLA structure + $Reserved4 = 0x0000; // Reserved + $grbit2 = 0x0001; // Option flags + $Reserved5 = 0x0000; // Reserved + + + $header = pack("vv", $record, $length); + $data = pack("V", $cObj); + $data .= pack("v", $OT); + $data .= pack("v", $id); + $data .= pack("v", $grbit); + $data .= pack("v", $colL); + $data .= pack("v", $dxL); + $data .= pack("v", $rwT); + $data .= pack("v", $dyT); + $data .= pack("v", $colR); + $data .= pack("v", $dxR); + $data .= pack("v", $rwB); + $data .= pack("v", $dyB); + $data .= pack("v", $cbMacro); + $data .= pack("V", $Reserved1); + $data .= pack("v", $Reserved2); + $data .= pack("C", $icvBack); + $data .= pack("C", $icvFore); + $data .= pack("C", $fls); + $data .= pack("C", $fAuto); + $data .= pack("C", $icv); + $data .= pack("C", $lns); + $data .= pack("C", $lnw); + $data .= pack("C", $fAutoB); + $data .= pack("v", $frs); + $data .= pack("V", $cf); + $data .= pack("v", $Reserved3); + $data .= pack("v", $cbPictFmla); + $data .= pack("v", $Reserved4); + $data .= pack("v", $grbit2); + $data .= pack("V", $Reserved5); + + $this->_append($header.$data); + } + + /** + * Convert a 24 bit bitmap into the modified internal format used by Windows. + * This is described in BITMAPCOREHEADER and BITMAPCOREINFO structures in the + * MSDN library. + * + * @access private + * @param string $bitmap The bitmap to process + * @return array Array with data and properties of the bitmap + */ + function _processBitmap($bitmap) + { + // Open file. + $bmp_fd = @fopen($bitmap,"rb"); + if (!$bmp_fd) { + $this->raiseError("Couldn't import $bitmap"); + } + + // Slurp the file into a string. + $data = fread($bmp_fd, filesize($bitmap)); + + // Check that the file is big enough to be a bitmap. + if (strlen($data) <= 0x36) { + $this->raiseError("$bitmap doesn't contain enough data.\n"); + } + + // The first 2 bytes are used to identify the bitmap. + $identity = unpack("A2", $data); + if ($identity[''] != "BM") { + $this->raiseError("$bitmap doesn't appear to be a valid bitmap image.\n"); + } + + // Remove bitmap data: ID. + $data = substr($data, 2); + + // Read and remove the bitmap size. This is more reliable than reading + // the data size at offset 0x22. + // + $size_array = unpack("V", substr($data, 0, 4)); + $size = $size_array['']; + $data = substr($data, 4); + $size -= 0x36; // Subtract size of bitmap header. + $size += 0x0C; // Add size of BIFF header. + + // Remove bitmap data: reserved, offset, header length. + $data = substr($data, 12); + + // Read and remove the bitmap width and height. Verify the sizes. + $width_and_height = unpack("V2", substr($data, 0, 8)); + $width = $width_and_height[1]; + $height = $width_and_height[2]; + $data = substr($data, 8); + if ($width > 0xFFFF) { + $this->raiseError("$bitmap: largest image width supported is 65k.\n"); + } + if ($height > 0xFFFF) { + $this->raiseError("$bitmap: largest image height supported is 65k.\n"); + } + + // Read and remove the bitmap planes and bpp data. Verify them. + $planes_and_bitcount = unpack("v2", substr($data, 0, 4)); + $data = substr($data, 4); + if ($planes_and_bitcount[2] != 24) { // Bitcount + $this->raiseError("$bitmap isn't a 24bit true color bitmap.\n"); + } + if ($planes_and_bitcount[1] != 1) { + $this->raiseError("$bitmap: only 1 plane nupported in bitmap image.\n"); + } + + // Read and remove the bitmap compression. Verify compression. + $compression = unpack("V", substr($data, 0, 4)); + $data = substr($data, 4); + + //$compression = 0; + if ($compression[""] != 0) { + $this->raiseError("$bitmap: compression not supported in bitmap image.\n"); + } + + // Remove bitmap data: data size, hres, vres, colours, imp. colours. + $data = substr($data, 20); + + // Add the BITMAPCOREHEADER data + $header = pack("Vvvvv", 0x000c, $width, $height, 0x01, 0x18); + $data = $header . $data; + + return (array($width, $height, $size, $data)); + } + + /** + * Store the window zoom factor. This should be a reduced fraction but for + * simplicity we will store all fractions with a numerator of 100. + * + * @access private + */ + function _storeZoom() + { + // If scale is 100 we don't need to write a record + if ($this->_zoom == 100) { + return; + } + + $record = 0x00A0; // Record identifier + $length = 0x0004; // Bytes to follow + + $header = pack("vv", $record, $length); + $data = pack("vv", $this->_zoom, 100); + $this->_append($header.$data); + } + + /** + * FIXME: add comments + */ + function setValidation($row1, $col1, $row2, $col2, &$validator) + { + $this->_dv[] = $validator->_getData() . + pack("vvvvv", 1, $row1, $row2, $col1, $col2); + } + + /** + * Store the DVAL and DV records. + * + * @access private + */ + function _storeDataValidity() + { + $record = 0x01b2; // Record identifier + $length = 0x0012; // Bytes to follow + + $grbit = 0x0002; // Prompt box at cell, no cached validity data at DV records + $horPos = 0x00000000; // Horizontal position of prompt box, if fixed position + $verPos = 0x00000000; // Vertical position of prompt box, if fixed position + $objId = 0xffffffff; // Object identifier of drop down arrow object, or -1 if not visible + + $header = pack('vv', $record, $length); + $data = pack('vVVVV', $grbit, $horPos, $verPos, $objId, + count($this->_dv)); + $this->_append($header.$data); + + $record = 0x01be; // Record identifier + foreach($this->_dv as $dv) + { + $length = strlen($dv); // Bytes to follow + $header = pack("vv", $record, $length); + $this->_append($header.$dv); + } + } +} +?> diff --git a/thirdparty/pear/Spreadsheet/package.xml b/thirdparty/pear/Spreadsheet/package.xml new file mode 100644 index 000000000..53fe8ba13 --- /dev/null +++ b/thirdparty/pear/Spreadsheet/package.xml @@ -0,0 +1,61 @@ + + + OLE + Package for reading and writing OLE containers + This package allows reading and writing of OLE (Object Linking and Embedding) files, the format used as container for Excel, Word and other MS file formats. + Documentation for the OLE format can be found at: http://user.cs.tu-berlin.de/~schwartz/pmh/guide.html + + + xnoguer + Xavier Noguer + xnoguer@php.net + lead + + + + 0.5 + 2003-12-14 + PHP + beta + - BC break!!! OLE/OLE.php file moved to OLE.php to comply with PEAR + standards. You will have to change your require('OLE/OLE.php')'s + for require('OLE.php')'s +- If you are using Spreadsheet_Excel_Writer, do not upgrade to this + version yet. A new version of Spreadsheet_Excel_Writer will be + released soon so the BC break won't affect you. +- allowing setting of temp dir for OLE_PPS_File and OLE_PPS_Root objects +- fixed problem when reading files (not reading the whole OLE tree) + + + + + + + + + + 0.4 + 2003-09-25 + beta + -deleting tmp files (Herman Kuiper). +-fixed hardcoded tmp dir (Herman Kuiper). +-fixed pass by reference warning (Herman Kuiper). + + + + 0.3 + 2003-08-21 + beta + -added OLE_PPS_File::init() initialization method. +-better error handling. + + + + 0.2.1 + 2003-05-12 + alpha + Fixing install dir + + + + diff --git a/thirdparty/pear/System.php b/thirdparty/pear/System.php new file mode 100644 index 000000000..910596988 --- /dev/null +++ b/thirdparty/pear/System.php @@ -0,0 +1,540 @@ + | +// +----------------------------------------------------------------------+ +// +// $Id: System.php 6820 2007-06-20 13:35:30Z kevin_fourie $ +// + +require_once 'PEAR.php'; +require_once 'Console/Getopt.php'; + +$GLOBALS['_System_temp_files'] = array(); + +/** +* System offers cross plattform compatible system functions +* +* Static functions for different operations. Should work under +* Unix and Windows. The names and usage has been taken from its respectively +* GNU commands. The functions will return (bool) false on error and will +* trigger the error with the PHP trigger_error() function (you can silence +* the error by prefixing a '@' sign after the function call). +* +* Documentation on this class you can find in: +* http://pear.php.net/manual/ +* +* Example usage: +* if (!@System::rm('-r file1 dir1')) { +* print "could not delete file1 or dir1"; +* } +* +* In case you need to to pass file names with spaces, +* pass the params as an array: +* +* System::rm(array('-r', $file1, $dir1)); +* +* @package System +* @author Tomas V.V.Cox +* @version $Revision: 6820 $ +* @access public +* @see http://pear.php.net/manual/ +*/ +class System +{ + /** + * returns the commandline arguments of a function + * + * @param string $argv the commandline + * @param string $short_options the allowed option short-tags + * @param string $long_options the allowed option long-tags + * @return array the given options and there values + * @access private + */ + function _parseArgs($argv, $short_options, $long_options = null) + { + if (!is_array($argv) && $argv !== null) { + $argv = preg_split('/\s+/', $argv); + } + return Console_Getopt::getopt2($argv, $short_options); + } + + /** + * Output errors with PHP trigger_error(). You can silence the errors + * with prefixing a "@" sign to the function call: @System::mkdir(..); + * + * @param mixed $error a PEAR error or a string with the error message + * @return bool false + * @access private + */ + function raiseError($error) + { + if (PEAR::isError($error)) { + $error = $error->getMessage(); + } + trigger_error($error, E_USER_WARNING); + return false; + } + + /** + * Creates a nested array representing the structure of a directory + * + * System::_dirToStruct('dir1', 0) => + * Array + * ( + * [dirs] => Array + * ( + * [0] => dir1 + * ) + * + * [files] => Array + * ( + * [0] => dir1/file2 + * [1] => dir1/file3 + * ) + * ) + * @param string $sPath Name of the directory + * @param integer $maxinst max. deep of the lookup + * @param integer $aktinst starting deep of the lookup + * @return array the structure of the dir + * @access private + */ + + function _dirToStruct($sPath, $maxinst, $aktinst = 0) + { + $struct = array('dirs' => array(), 'files' => array()); + if (($dir = @opendir($sPath)) === false) { + System::raiseError("Could not open dir $sPath"); + return $struct; // XXX could not open error + } + $struct['dirs'][] = $sPath; // XXX don't add if '.' or '..' ? + $list = array(); + while ($file = readdir($dir)) { + if ($file != '.' && $file != '..') { + $list[] = $file; + } + } + closedir($dir); + sort($list); + if ($aktinst < $maxinst || $maxinst == 0) { + foreach($list as $val) { + $path = $sPath . DIRECTORY_SEPARATOR . $val; + if (is_dir($path)) { + $tmp = System::_dirToStruct($path, $maxinst, $aktinst+1); + $struct = array_merge_recursive($tmp, $struct); + } else { + $struct['files'][] = $path; + } + } + } + return $struct; + } + + /** + * Creates a nested array representing the structure of a directory and files + * + * @param array $files Array listing files and dirs + * @return array + * @see System::_dirToStruct() + */ + function _multipleToStruct($files) + { + $struct = array('dirs' => array(), 'files' => array()); + settype($files, 'array'); + foreach ($files as $file) { + if (is_dir($file)) { + $tmp = System::_dirToStruct($file, 0); + $struct = array_merge_recursive($tmp, $struct); + } else { + $struct['files'][] = $file; + } + } + return $struct; + } + + /** + * The rm command for removing files. + * Supports multiple files and dirs and also recursive deletes + * + * @param string $args the arguments for rm + * @return mixed PEAR_Error or true for success + * @access public + */ + function rm($args) + { + $opts = System::_parseArgs($args, 'rf'); // "f" do nothing but like it :-) + if (PEAR::isError($opts)) { + return System::raiseError($opts); + } + foreach($opts[0] as $opt) { + if ($opt[0] == 'r') { + $do_recursive = true; + } + } + $ret = true; + if (isset($do_recursive)) { + $struct = System::_multipleToStruct($opts[1]); + foreach($struct['files'] as $file) { + if (!@unlink($file)) { + $ret = false; + } + } + foreach($struct['dirs'] as $dir) { + if (!@rmdir($dir)) { + $ret = false; + } + } + } else { + foreach ($opts[1] as $file) { + $delete = (is_dir($file)) ? 'rmdir' : 'unlink'; + if (!@$delete($file)) { + $ret = false; + } + } + } + return $ret; + } + + /** + * Make directories. Note that we use call_user_func('mkdir') to avoid + * a problem with ZE2 calling System::mkDir instead of the native PHP func. + * + * @param string $args the name of the director(y|ies) to create + * @return bool True for success + * @access public + */ + function mkDir($args) + { + $opts = System::_parseArgs($args, 'pm:'); + if (PEAR::isError($opts)) { + return System::raiseError($opts); + } + $mode = 0777; // default mode + foreach($opts[0] as $opt) { + if ($opt[0] == 'p') { + $create_parents = true; + } elseif($opt[0] == 'm') { + // if the mode is clearly an octal number (starts with 0) + // convert it to decimal + if (strlen($opt[1]) && $opt[1]{0} == '0') { + $opt[1] = octdec($opt[1]); + } else { + // convert to int + $opt[1] += 0; + } + $mode = $opt[1]; + } + } + $ret = true; + if (isset($create_parents)) { + foreach($opts[1] as $dir) { + $dirstack = array(); + while (!@is_dir($dir) && $dir != DIRECTORY_SEPARATOR) { + array_unshift($dirstack, $dir); + $dir = dirname($dir); + } + while ($newdir = array_shift($dirstack)) { + if (!call_user_func('mkdir', $newdir, $mode)) { + $ret = false; + } + } + } + } else { + foreach($opts[1] as $dir) { + if (!@is_dir($dir) && !call_user_func('mkdir', $dir, $mode)) { + $ret = false; + } + } + } + return $ret; + } + + /** + * Concatenate files + * + * Usage: + * 1) $var = System::cat('sample.txt test.txt'); + * 2) System::cat('sample.txt test.txt > final.txt'); + * 3) System::cat('sample.txt test.txt >> final.txt'); + * + * Note: as the class use fopen, urls should work also (test that) + * + * @param string $args the arguments + * @return boolean true on success + * @access public + */ + function &cat($args) + { + $ret = null; + $files = array(); + if (!is_array($args)) { + $args = preg_split('/\s+/', $args); + } + for($i=0; $i < count($args); $i++) { + if ($args[$i] == '>') { + $mode = 'wb'; + $outputfile = $args[$i+1]; + break; + } elseif ($args[$i] == '>>') { + $mode = 'ab+'; + $outputfile = $args[$i+1]; + break; + } else { + $files[] = $args[$i]; + } + } + if (isset($mode)) { + if (!$outputfd = fopen($outputfile, $mode)) { + $err = System::raiseError("Could not open $outputfile"); + return $err; + } + $ret = true; + } + foreach ($files as $file) { + if (!$fd = fopen($file, 'r')) { + System::raiseError("Could not open $file"); + continue; + } + while ($cont = fread($fd, 2048)) { + if (isset($outputfd)) { + fwrite($outputfd, $cont); + } else { + $ret .= $cont; + } + } + fclose($fd); + } + if (@is_resource($outputfd)) { + fclose($outputfd); + } + return $ret; + } + + /** + * Creates temporary files or directories. This function will remove + * the created files when the scripts finish its execution. + * + * Usage: + * 1) $tempfile = System::mktemp("prefix"); + * 2) $tempdir = System::mktemp("-d prefix"); + * 3) $tempfile = System::mktemp(); + * 4) $tempfile = System::mktemp("-t /var/tmp prefix"); + * + * prefix -> The string that will be prepended to the temp name + * (defaults to "tmp"). + * -d -> A temporary dir will be created instead of a file. + * -t -> The target dir where the temporary (file|dir) will be created. If + * this param is missing by default the env vars TMP on Windows or + * TMPDIR in Unix will be used. If these vars are also missing + * c:\windows\temp or /tmp will be used. + * + * @param string $args The arguments + * @return mixed the full path of the created (file|dir) or false + * @see System::tmpdir() + * @access public + */ + function mktemp($args = null) + { + static $first_time = true; + $opts = System::_parseArgs($args, 't:d'); + if (PEAR::isError($opts)) { + return System::raiseError($opts); + } + foreach($opts[0] as $opt) { + if($opt[0] == 'd') { + $tmp_is_dir = true; + } elseif($opt[0] == 't') { + $tmpdir = $opt[1]; + } + } + $prefix = (isset($opts[1][0])) ? $opts[1][0] : 'tmp'; + if (!isset($tmpdir)) { + $tmpdir = System::tmpdir(); + } + if (!System::mkDir("-p $tmpdir")) { + return false; + } + $tmp = tempnam($tmpdir, $prefix); + if (isset($tmp_is_dir)) { + unlink($tmp); // be careful possible race condition here + if (!call_user_func('mkdir', $tmp, 0700)) { + return System::raiseError("Unable to create temporary directory $tmpdir"); + } + } + $GLOBALS['_System_temp_files'][] = $tmp; + if ($first_time) { + PEAR::registerShutdownFunc(array('System', '_removeTmpFiles')); + $first_time = false; + } + return $tmp; + } + + /** + * Remove temporary files created my mkTemp. This function is executed + * at script shutdown time + * + * @access private + */ + function _removeTmpFiles() + { + if (count($GLOBALS['_System_temp_files'])) { + $delete = $GLOBALS['_System_temp_files']; + array_unshift($delete, '-r'); + System::rm($delete); + } + } + + /** + * Get the path of the temporal directory set in the system + * by looking in its environments variables. + * Note: php.ini-recommended removes the "E" from the variables_order setting, + * making unavaible the $_ENV array, that s why we do tests with _ENV + * + * @return string The temporal directory on the system + */ + function tmpdir() + { + if (OS_WINDOWS) { + if ($var = isset($_ENV['TEMP']) ? $_ENV['TEMP'] : getenv('TEMP')) { + return $var; + } + if ($var = isset($_ENV['TMP']) ? $_ENV['TMP'] : getenv('TMP')) { + return $var; + } + if ($var = isset($_ENV['windir']) ? $_ENV['windir'] : getenv('windir')) { + return $var; + } + return getenv('SystemRoot') . '\temp'; + } + if ($var = isset($_ENV['TMPDIR']) ? $_ENV['TMPDIR'] : getenv('TMPDIR')) { + return $var; + } + return '/tmp'; + } + + /** + * The "which" command (show the full path of a command) + * + * @param string $program The command to search for + * @return mixed A string with the full path or false if not found + * @author Stig Bakken + */ + function which($program, $fallback = false) + { + // is_executable() is not available on windows + if (OS_WINDOWS) { + $pear_is_executable = 'is_file'; + } else { + $pear_is_executable = 'is_executable'; + } + + // full path given + if (basename($program) != $program) { + return (@$pear_is_executable($program)) ? $program : $fallback; + } + + // XXX FIXME honor safe mode + $path_delim = OS_WINDOWS ? ';' : ':'; + $exe_suffixes = OS_WINDOWS ? array('.exe','.bat','.cmd','.com') : array(''); + $path_elements = explode($path_delim, getenv('PATH')); + foreach ($exe_suffixes as $suff) { + foreach ($path_elements as $dir) { + $file = $dir . DIRECTORY_SEPARATOR . $program . $suff; + if (@is_file($file) && @$pear_is_executable($file)) { + return $file; + } + } + } + return $fallback; + } + + /** + * The "find" command + * + * Usage: + * + * System::find($dir); + * System::find("$dir -type d"); + * System::find("$dir -type f"); + * System::find("$dir -name *.php"); + * System::find("$dir -name *.php -name *.htm*"); + * System::find("$dir -maxdepth 1"); + * + * Params implmented: + * $dir -> Start the search at this directory + * -type d -> return only directories + * -type f -> return only files + * -maxdepth -> max depth of recursion + * -name -> search pattern (bash style). Multiple -name param allowed + * + * @param mixed Either array or string with the command line + * @return array Array of found files + * + */ + function find($args) + { + if (!is_array($args)) { + $args = preg_split('/\s+/', $args, -1, PREG_SPLIT_NO_EMPTY); + } + $dir = array_shift($args); + $patterns = array(); + $depth = 0; + $do_files = $do_dirs = true; + for ($i = 0; $i < count($args); $i++) { + switch ($args[$i]) { + case '-type': + if (in_array($args[$i+1], array('d', 'f'))) { + if ($args[$i+1] == 'd') { + $do_files = false; + } else { + $do_dirs = false; + } + } + $i++; + break; + case '-name': + $patterns[] = "(" . preg_replace(array('/\./', '/\*/'), + array('\.', '.*'), + $args[$i+1]) + . ")"; + $i++; + break; + case '-maxdepth': + $depth = $args[$i+1]; + break; + } + } + $path = System::_dirToStruct($dir, $depth); + if ($do_files && $do_dirs) { + $files = array_merge($path['files'], $path['dirs']); + } elseif ($do_dirs) { + $files = $path['dirs']; + } else { + $files = $path['files']; + } + if (count($patterns)) { + $patterns = implode('|', $patterns); + $ret = array(); + for ($i = 0; $i < count($files); $i++) { + if (preg_match("#^$patterns\$#", $files[$i])) { + $ret[] = $files[$i]; + } + } + return $ret; + } + return $files; + } +} +?> diff --git a/thirdparty/pear/UDDI.php b/thirdparty/pear/UDDI.php new file mode 100644 index 000000000..bb1ba571c --- /dev/null +++ b/thirdparty/pear/UDDI.php @@ -0,0 +1,720 @@ + | +// | Tobias Hauser | +// +----------------------------------------------------------------------+ +// +// $Id$ +/* Original Credits: + + phpUDDI + A PHP class library implementing the Universal Description, + Discovery and Integration API for locating and publishing Web + Services listings in a UBR (UDDI Business Registry). + + Copyright (C) 2002-2004 Lee Reynolds and Jon Stephens + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + or point your web browser to http://www.gnu.org/licenses/lgpl.html. + + Conceived and developed in conjunction with the + authors' work for the book "PHP Web Services" from Wrox Press + Ltd. (ISBN-1861008074) + + Original developers: + Lee Reynolds lee@annasart.com + Jon Stephens jon@hiveminds.info + + Useful Links: + + Wrox Press "Programmer To Programmer" Discussion Groups + Pro PHP: http://p2p.wrox.com/list.asp?list=pro_php + Pro XML: http://p2p.wrox.com/list.asp?list=xml + + HiveMinds Group + http://www.hiveminds.info/ + http://forums.hiveminds.info/ + + Version History: + + 0.1 -- 15 November 2002 -- Basic Proof of concept + 0.2 -- 20 November 2002 -- Base class redefinition to + include public and private methods + 0.3 -- 25 November 2002 -- All UDDI 2.0 Inquiry APIs implemented + 0.3.1 -- 14 March 2004 -- small bugfixes (Christian); license change to LPGL (Lee, Jon) + + Objective for 1.0 release is complete implementation of the UDDI 2.0 API + (http://www.uddi.org/pubs/ProgrammersAPI-V2.04-Published-20020719.pdf). + + Objective for 1.5 release is backwards compatibility with UDDI 1.0. + + Objective for 2.0 release is complete implementation of the UDDI 3.0 API + (http://www.uddi.org/pubs/uddi-v3.00-published-20020719.pdf). + +*/ + +require_once 'PEAR.php'; + +/** + * PEAR::UDDI + * class that implements the UDDI API + * @link http://www.uddi.org/ + * + * pearified version of phpUDDI by Stephens & Reynolds + * + * + * @category Web Services + * @package UDDI + * @version 0.2.0alpha4 + * @author Christian Wenz + * @author Tobias Hauser + * @todo fully implement UDDI 2.0 (and later 1.0, 3.0) + * @todo more helper functions (for analyzing the data returned by querying a UBR) + + +Name: + UDDI.php - UDDI Registry access library (PEARified version) + +Synopsis: + require_once 'UDDI/UDDI.php'; + +Currently, PEAR::UDDI supports 1 function call in one UDDI API. + +Variables supported: + $UDDI::_api + currently 2 values are supported, and they represent 2 of the 6 published APIs by UDDI.org. + 'Inquiry' which represents the search and _query API + 'Publish' which represents the publishing API + + Usage: + + $UDDI::_api = 'Inquiry'; // (default) + $UDDI::_api = 'Publish'; + + + $UDDI::_uddiversion + This is the API version of the UPI spec you want to use + Values are either 1, 2, or 3. + + Usage: + + $UDDI::_uddiversion = 2; + + + Default: + currently, the version default is '1'; + + Note: As stated above, we are aiming for a 1.0 release of this library which implements + the UDDI 2.0 Programming API; we cannot guarantee at this time that any of the API functions + as implemented here will work correctly (or at all) unless you set the version to 2 as shown + under 'Usage' immediately above or by setting the version when you call the UDDI class constructor: + + + $my_uddi = new UDDI('Microsoft', 2); + + + At a later date we will make this class compatible with UDDI Versions 1.0 and 3.0. + + $UDDI::_regarray + We currently support 2 test registry entries. These are 'IBM' and 'Microsoft'. + We also support 2 API interfaces. These are, as noted above, 'Inquiry' and 'Publish'. + + To add live registry entries, or your own test registry, you must append a multiple index array element + to $UDDI::_regarray. The form for this follows: + + array('registry name' => + array('Inquiry' => + array('url' => 'url_for_inquiry', + 'port' => 80), + 'Publish' => + array('url' => 'url_for_publish', + 'port' => 443))); + + Internally this is accessed as + URL = $_regarray['registry_name']['Inquiry']['url'] + , and + port = $_regarray['registry_name']['Inquiry']['port'] + + PLEASE NOTE: You're adding elements to this array, instead of overwriting old ones. + + Usage: + + $UDDI::_regarray = array('private' => + array('Inquiry' => + array('url' =>'url_for_inquiry', + 'port' => 80), + 'Publish' => + array('url' => 'url_for_publishing', + 'port' => 443))); + + + $UDDI::_xmlns + You can modify the XML namespace by reassigning a value to this + + Usage: + + $UDDI::_xmlns = 'new_ns_definition'; + + + Default: + 'urn:uddi-org:api' + + $UDDI::_debug + Turns on debugging by echoing HTTP headers and UDDI queries. + + Usage: + + $UDDI::_debug = true; + + + Default: + false + + $UDDI::_transmit + Turns on _posting of UDDI message to UBR. + + Usage: + + $UDDI::_transmit = false; + + + Default: + true; + + +EXAMPLE: + +This queries IBM's UDDI Registry for the first 50 businesses whose names include +the word "Acme", matches sorted first in ascending order by name, then in descending +order by date last updated. The raw XML that's returned is escaped and echoed to the page. + + +$my_uddi = new UDDI('IBM', 1); +$result = htmlspecialchars($my_uddi->find_business(array('name' => '%Acme%', 'maxRows' => 50, 'findQualifiers' => 'sortByNameAsc,sortByDateAsc'))); +echo "
    $result
    "; +
    + +*/ + + +// {{{ constants +/** + * version of corresponding phpUDDI version + * still included so that moving from phpUDDI to PEAR::UDDI is easier + */ + +define('UDDI_PHP_LIB_VERSION', '0.3.1p'); //suffix p = PEAR :-) + +// }}} +// {{{ UDDI + +/** + * UDDI + * + * class that implements the UDDI API + * + * @package UDDI + * @author Christian Wenz + * @author Tobias Hauser +*/ +class UDDI extends PEAR +{ + // {{{ properties + + /** + * version of package + * @var string $_version + */ + var $_version = '0.2.0alpha4'; + + /** + * list of known registries + * @var array $regarray + */ + + var $_regarray = + array('IBM' => + array('Inquiry' => + array('url' => 'www-3.ibm.com/services/uddi/testregistry/inquiryapi', + 'port' => 80), + 'Publish' => + array('url' => 'https://www-3.ibm.com/services/uddi/testregistry/protect/publishapi', + 'port' => 443)), + + 'Microsoft' => + array('Inquiry' => + array('url' => 'test.uddi.microsoft.com/inquire', + 'port' => 80), + 'Publish' => + array('url' => 'https://test.uddi.microsoft.com/publish', + 'port' => 443))); + + + /** + * which API to use (Inquiry/Publish) + * @var string $_api + */ + var $_api = 'Inquiry'; + + /** + * used XML namespace + * @var string $_xmlns + */ + var $_xmlns = 'urn:uddi-org:api'; + + /** + * used UDDI version + * @var string $_uddiversion + */ + var $_uddiversion = 1; + + /** + * used XML generic version + * @var string $_generic + */ + var $_generic; + + /** + * debug mode + * @var boolean $_debug + */ + var $_debug = false; + + /** + * Turns on _posting of UDDI message to UBR + * @var boolean $_transmit + */ + var $_transmit = true; + + /** + * Host to use + * @var string $_host + */ + var $_host; + + /** + * URL to use + * @var string $_url + */ + var $_url; + + // }}} + // {{{ constructor + + /** + * constructor + * + * @access public + * @param string $registry name of registry to use + * @param integer $version UDDI version to use + */ + function UDDI($registry = 'IBM', $version = 1) + { + $this->splitUrl($registry, $version); + } + + // }}} + // {{{ splitUrl() + + /** + * retrieves information from URL and sets params + * + * @access public + * @param string $registry name of registry to use + * @param integer $version UDDI version to use + */ + function splitUrl($registry, $version) + { + $this->_registry = $registry; + $reg = $this->_regarray[$this->_registry][$this->_api]['url']; + $reg = str_replace('http://', '', $reg); + $pos = strpos($reg, '/') + or PEAR::raiseError("Invalid registry (POS = $pos, URL = '$reg')\n"); + $this->_host = substr($reg, 0, $pos); + $this->_url = substr($reg, $pos, strlen($reg) - 1); + + if ($version > 1) { + $this->_xmlns .= "_v$version"; + } + + $this->_generic = "$version.0"; + } + + // }}} + // {{{ post() + + /** + * assembles HTTP headers and posts these and the UDDI message to the UBR + * + * @access public + * @param string $message the UDDI message to send + * @return string $data data returned from the UBR + */ + function post($message) + { + $msg_length = strlen($message); + $php_version = phpversion(); + $date = str_replace('+0000', 'GMT', gmdate('r', time())); + + $header = ''; + $header .= "POST $this->_url HTTP/1.0\r\n"; + $header .= "Date: $date\r\n"; + $header .= "Content-Type: text/xml; charset=UTF-8\r\n"; + $header .= "User-agent: PEAR::UDDI/$this->_version php/$php_version\r\n"; + $header .= "Host: $this->_host\r\n"; + $header .= "SOAPAction: \"\"\r\n"; + $header .= "Content-Length: $msg_length\r\n\r\n"; + + // echoes HTTP header and UDDI message to page if true + if ($this->_debug) { + echo '
    ' . htmlspecialchars(str_replace('><', ">\n<", $header . $message)) . '
    '; + } + + // sends header and message to UBR if true + if ($this->_transmit) { + $port = $this->_regarray[$this->_registry][$this->_api]['port']; + $fp = fsockopen($this->_host, $port, $errno, $errstr, 5) + or PEAR::raiseError("Couldn't connect to server at $this->_host:$port.
    Error #$errno: $errstr."); + + fputs($fp, $header) + or PEAR::raiseError('Couldn\'t send HTTP headers.'); + fputs($fp, "$message\n\n") + or PEAR::raiseError('Couldn\'t send UDDI message.'); + + $response = ''; + while (!feof($fp)) { + $response .= fgets($fp, 1024) + or PEAR::raiseError('No response from server.'); + } + fclose($fp) + or PEAR::raiseError('Warning: Couldn\'t close HTTP connection.'); + + $response = str_replace('><', ">\n<", $response); + return $response; + } + } + + // }}} + // {{{ query() + + /** + * sends and UDDI query to the registry server + * + * @access public + * @param string $method the UDDI message to send + * @param array $params parameters for the query + * @return string $data response from the registry server + */ + function query($method, $params) + { + $message = $this->assemble($method, $params); + + return $this->post($message); + } + + // }}} + // {{{ assemble() + + /** + * generate XML creating the UDDI query + * + * @access public + * @param string $method the UDDI message to send + * @param array $params parameters for the query + * @return string $data the desired XML query code + */ + function assemble($method, $params) + { + $head = ''; + $head .= ''; + $head .= ''; + + $end = ""; + + $attrib = ''; + $element = ''; + + if (isset($params['discoveryURLs']) && ($params['discoveryURLs'] != '')) { + $element .= '' . $params['discoveryURLs'] . ''; + } + + if (isset($params['bindingKey']) && ($params['bindingKey'] != '')) { + $element .= '' . $params['bindingKey'] . ''; + } + + if (isset($params['businessKey']) && ($params['businessKey'] != '')) { + $element .= '' . $params['businessKey'] . ''; + } + + if (isset($params['serviceKey']) && ($params['serviceKey'] != '')) { + + if ($method == 'find_binding') { + $attrib .= ' serviceKey="' . $params['serviceKey'] . '"'; + } + if ($method == 'get_serviceDetail') { + $element .= '' . $params['serviceKey'] . ''; + } + } + + if (isset($params['tModelKey']) && ($params['tModelKey'] != '')) { + $element .= 'uuid:' . $params['tModelKey'] . ''; + } + + if (isset($params['findQualifiers']) && ($params['findQualifiers'] != '')) { + $element .= ''; + $findQualifiers = explode(',', $params['findQualifiers']); + for ($i = 0; $i < count($findQualifiers); $i++) { + $element .= '' . $findQualifiers[$i] . ''; + } + $element .= ''; + } + + if (isset($params['tModelBag']) && ($params['tModelBag'] != '')) { + $tModelKey = explode(',', $params['tModelBag']); + $element .= ''; + for ($i = 0; $i < count($tModelKey); $i++) { + $element .= 'uuid:' . $tModelKey[$i] . ''; + $element .= ''; + } + } + + if (isset($params['name']) && ($params['name'] != '')) { + $lang = ''; + if (isset($params['lang']) && ($params['lang'] != '')) { + $lang = "xml:lang=\"$lang\""; + } + $element .= '' . $params['name'] . ''; + } + + if (isset($params['identifierBag']) && ($params['identifierBag'] != '')) { + $element .= ''; + $keyedReference = explode(',', $params['identifierBag']); + for ($i = 0; $i < count($keyedReference); $i++) { + $element .= '' . $keyedReference[$i] . ''; + } + $element .= ''; + } + + if (isset($params['categoryBag']) && ($params['categoryBag'] != '')) { + $element .= ''; + $keyedReference = explode(',', $params['identifierBag']); + for ($i = 0; $i'; + } + $element .= ''; + } + + if (isset($params['maxRows']) && ($params['maxRows'] != '')) { + $attrib .= ' maxRows="' . $params['maxRows'] . '"'; + } + + $head .= "<$method $attrib xmlns=\"$this->_xmlns\" generic=\"$this->_generic\">"; + + $message = $head; + $message .= $element; + $message .= $end; + + return $message; + } + + // }}} + // {{{ find_binding() + + /** + * Sends find_binding inquiry to UBR (searchs for bindings within a businessService element) + * + * @access public + * @param array $params parameters for the query + * @return string $data response from the registry server + */ + function find_binding($params) + { + $data = $this->query('find_binding', $params); + return $data; + } + + // }}} + // {{{ find_business() + + /** + * Sends find_business inquiry to UBR (searchs businessEntity elements) + * + * @access public + * @param array $params parameters for the query + * @return string $data response from the registry server + */ + function find_business($params) + { + $data = $this->query('find_business', $params); + return $data; + } + + // }}} + // {{{ find_relatedBusinesses() + + /** + * Sends find_relatedBusinesses inquiry to UBR (searchs for related businessEntity elements for a given businessKey) + * + * @access public + * @param array $params parameters for the query + * @return string $data response from the registry server + */ + function find_relatedBusinesses($params) + { + $data = $this->query('find_relatedBusinesses', $params); + return $data; + } + + // }}} + // {{{ find_service() + + /** + * Sends find_service inquiry to UBR (searchs for businessService elements) + * + * @access public + * @param array $params parameters for the query + * @return string $data response from the registry server + */ + function find_service($params) + { + $data = $this->query('find_service', $params); + return $data; + } + + // }}} + // {{{ find_tModel() + + /** + * Sends find_tModel inquiry to UBR (searchs for tModel elements) + * + * @access public + * @param array $params parameters for the query + * @return string $data response from the registry server + */ + function find_tModel($params) + { + $data = $this->query('find_tModel', $params); + return $data; + } + + // }}} + // {{{ get_bindingDetail() + + /** + * Sends get_bindingDetail inquiry to UBR (returns bindingDetail elements for one or more bindingKey elements) + * + * @access public + * @param array $params parameters for the query + * @return string $data response from the registry server + */ + function get_bindingDetail($params) + { + $data = $this->query('get_bindingDetail', $params); + return $data; + } + + // }}} + // {{{ get_businessDetail() + + /** + * Sends get_businessDetail inquiry to UBR (returns information about one or more businessEntity elements) + * + * @access public + * @param array $params parameters for the query + * @return string $data response from the registry server + */ + function get_businessDetail($params) + { + $data = $this->query('get_businessDetail', $params); + return $data; + } + + // }}} + // {{{ get_businessDetailExt() + + /** + * Sends get_businessDetailExt inquiry to UBR (returns extended information about one or more businessEntity elements) + * + * @access public + * @param array $params parameters for the query + * @return string $data response from the registry server + */ + function get_businessDetailExt($params) + { + $data = $this->query('get_businessDetailExt', $params); + return $data; + } + + // }}} + // {{{ get_serviceDetail() + + /** + * Sends get_serviceDetail inquiry to UBR (returns information about one or more businessService elements) + * + * @access public + * @param array $params parameters for the query + * @return string $data response from the registry server + */ + function get_serviceDetail($params) + { + $data = $this->query('get_serviceDetail', $params); + return $data; + } + + // }}} + // {{{ get_tModelDetail() + + /** + * Sends get_tModelDetail inquiry to UBR (returns information about one or more tModel elements) + * + * @access public + * @param array $params parameters for the query + * @return string $data response from the registry server + */ + function get_tModelDetail($params) + { + $data = $this->query('get_tModelDetail', $params); + return $data; + } + + // }}} + +} + +// }}} + +?> diff --git a/thirdparty/pear/XML/Parser.php b/thirdparty/pear/XML/Parser.php new file mode 100644 index 000000000..7a584253b --- /dev/null +++ b/thirdparty/pear/XML/Parser.php @@ -0,0 +1,684 @@ + | +// | Tomas V.V.Cox | +// | Stephan Schmidt | +// +----------------------------------------------------------------------+ +// +// $Id: Parser.php,v 1.25 2005/03/25 17:13:10 schst Exp $ + +/** + * XML Parser class. + * + * This is an XML parser based on PHP's "xml" extension, + * based on the bundled expat library. + * + * @category XML + * @package XML_Parser + * @author Stig Bakken + * @author Tomas V.V.Cox + * @author Stephan Schmidt + */ + +/** + * uses PEAR's error handling + */ +require_once 'PEAR.php'; + +/** + * resource could not be created + */ +define('XML_PARSER_ERROR_NO_RESOURCE', 200); + +/** + * unsupported mode + */ +define('XML_PARSER_ERROR_UNSUPPORTED_MODE', 201); + +/** + * invalid encoding was given + */ +define('XML_PARSER_ERROR_INVALID_ENCODING', 202); + +/** + * specified file could not be read + */ +define('XML_PARSER_ERROR_FILE_NOT_READABLE', 203); + +/** + * invalid input + */ +define('XML_PARSER_ERROR_INVALID_INPUT', 204); + +/** + * remote file cannot be retrieved in safe mode + */ +define('XML_PARSER_ERROR_REMOTE', 205); + +/** + * XML Parser class. + * + * This is an XML parser based on PHP's "xml" extension, + * based on the bundled expat library. + * + * Notes: + * - It requires PHP 4.0.4pl1 or greater + * - From revision 1.17, the function names used by the 'func' mode + * are in the format "xmltag_$elem", for example: use "xmltag_name" + * to handle the tags of your xml file. + * + * @category XML + * @package XML_Parser + * @author Stig Bakken + * @author Tomas V.V.Cox + * @author Stephan Schmidt + * @todo create XML_Parser_Namespace to parse documents with namespaces + * @todo create XML_Parser_Pull + * @todo Tests that need to be made: + * - mixing character encodings + * - a test using all expat handlers + * - options (folding, output charset) + * - different parsing modes + */ +class XML_Parser extends PEAR +{ + // {{{ properties + + /** + * XML parser handle + * + * @var resource + * @see xml_parser_create() + */ + var $parser; + + /** + * File handle if parsing from a file + * + * @var resource + */ + var $fp; + + /** + * Whether to do case folding + * + * If set to true, all tag and attribute names will + * be converted to UPPER CASE. + * + * @var boolean + */ + var $folding = true; + + /** + * Mode of operation, one of "event" or "func" + * + * @var string + */ + var $mode; + + /** + * Mapping from expat handler function to class method. + * + * @var array + */ + var $handler = array( + 'character_data_handler' => 'cdataHandler', + 'default_handler' => 'defaultHandler', + 'processing_instruction_handler' => 'piHandler', + 'unparsed_entity_decl_handler' => 'unparsedHandler', + 'notation_decl_handler' => 'notationHandler', + 'external_entity_ref_handler' => 'entityrefHandler' + ); + + /** + * source encoding + * + * @var string + */ + var $srcenc; + + /** + * target encoding + * + * @var string + */ + var $tgtenc; + + /** + * handler object + * + * @var object + */ + var $_handlerObj; + + // }}} + // {{{ constructor + + /** + * Creates an XML parser. + * + * This is needed for PHP4 compatibility, it will + * call the constructor, when a new instance is created. + * + * @param string $srcenc source charset encoding, use NULL (default) to use + * whatever the document specifies + * @param string $mode how this parser object should work, "event" for + * startelement/endelement-type events, "func" + * to have it call functions named after elements + * @param string $tgenc a valid target encoding + */ + function XML_Parser($srcenc = null, $mode = 'event', $tgtenc = null) + { + XML_Parser::__construct($srcenc, $mode, $tgtenc); + } + // }}} + + /** + * PHP5 constructor + * + * @param string $srcenc source charset encoding, use NULL (default) to use + * whatever the document specifies + * @param string $mode how this parser object should work, "event" for + * startelement/endelement-type events, "func" + * to have it call functions named after elements + * @param string $tgenc a valid target encoding + */ + function __construct($srcenc = null, $mode = 'event', $tgtenc = null) + { + $this->PEAR('XML_Parser_Error'); + + $this->mode = $mode; + $this->srcenc = $srcenc; + $this->tgtenc = $tgtenc; + } + // }}} + + /** + * Sets the mode of the parser. + * + * Possible modes are: + * - func + * - event + * + * You can set the mode using the second parameter + * in the constructor. + * + * This method is only needed, when switching to a new + * mode at a later point. + * + * @access public + * @param string mode, either 'func' or 'event' + * @return boolean|object true on success, PEAR_Error otherwise + */ + function setMode($mode) + { + if ($mode != 'func' && $mode != 'event') { + $this->raiseError('Unsupported mode given', XML_PARSER_ERROR_UNSUPPORTED_MODE); + } + + $this->mode = $mode; + return true; + } + + /** + * Sets the object, that will handle the XML events + * + * This allows you to create a handler object independent of the + * parser object that you are using and easily switch the underlying + * parser. + * + * If no object will be set, XML_Parser assumes that you + * extend this class and handle the events in $this. + * + * @access public + * @param object object to handle the events + * @return boolean will always return true + * @since v1.2.0beta3 + */ + function setHandlerObj(&$obj) + { + $this->_handlerObj = &$obj; + return true; + } + + /** + * Init the element handlers + * + * @access private + */ + function _initHandlers() + { + if (!is_resource($this->parser)) { + return false; + } + + if (!is_object($this->_handlerObj)) { + $this->_handlerObj = &$this; + } + switch ($this->mode) { + + case 'func': + xml_set_object($this->parser, $this->_handlerObj); + xml_set_element_handler($this->parser, array(&$this, 'funcStartHandler'), array(&$this, 'funcEndHandler')); + break; + + case 'event': + xml_set_object($this->parser, $this->_handlerObj); + xml_set_element_handler($this->parser, 'startHandler', 'endHandler'); + break; + default: + return $this->raiseError('Unsupported mode given', XML_PARSER_ERROR_UNSUPPORTED_MODE); + break; + } + + + /** + * set additional handlers for character data, entities, etc. + */ + foreach ($this->handler as $xml_func => $method) { + if (method_exists($this->_handlerObj, $method)) { + $xml_func = 'xml_set_' . $xml_func; + $xml_func($this->parser, $method); + } + } + } + + // {{{ _create() + + /** + * create the XML parser resource + * + * Has been moved from the constructor to avoid + * problems with object references. + * + * Furthermore it allows us returning an error + * if something fails. + * + * @access private + * @return boolean|object true on success, PEAR_Error otherwise + * + * @see xml_parser_create + */ + function _create() + { + if ($this->srcenc === null) { + $xp = @xml_parser_create(); + } else { + $xp = @xml_parser_create($this->srcenc); + } + if (is_resource($xp)) { + if ($this->tgtenc !== null) { + if (!@xml_parser_set_option($xp, XML_OPTION_TARGET_ENCODING, + $this->tgtenc)) { + return $this->raiseError('invalid target encoding', XML_PARSER_ERROR_INVALID_ENCODING); + } + } + $this->parser = $xp; + $result = $this->_initHandlers($this->mode); + if ($this->isError($result)) { + return $result; + } + xml_parser_set_option($xp, XML_OPTION_CASE_FOLDING, $this->folding); + + return true; + } + return $this->raiseError('Unable to create XML parser resource.', XML_PARSER_ERROR_NO_RESOURCE); + } + + // }}} + // {{{ reset() + + /** + * Reset the parser. + * + * This allows you to use one parser instance + * to parse multiple XML documents. + * + * @access public + * @return boolean|object true on success, PEAR_Error otherwise + */ + function reset() + { + $result = $this->_create(); + if ($this->isError( $result )) { + return $result; + } + return true; + } + + // }}} + // {{{ setInputFile() + + /** + * Sets the input xml file to be parsed + * + * @param string Filename (full path) + * @return resource fopen handle of the given file + * @throws XML_Parser_Error + * @see setInput(), setInputString(), parse() + * @access public + */ + function setInputFile($file) + { + /** + * check, if file is a remote file + */ + if (preg_match('/(http|ftp):///', substr($file, 0, 10))) { + if (!ini_get('allow_url_fopen')) { + return $this->raiseError('Remote files cannot be parsed, as safe mode is enabled.', XML_PARSER_ERROR_REMOTE); + } + } + + $fp = @fopen($file, 'rb'); + if (is_resource($fp)) { + $this->fp = $fp; + return $fp; + } + return $this->raiseError('File could not be opened.', XML_PARSER_ERROR_FILE_NOT_READABLE); + } + + // }}} + // {{{ setInputString() + + /** + * XML_Parser::setInputString() + * + * Sets the xml input from a string + * + * @param string $data a string containing the XML document + * @return null + **/ + function setInputString($data) + { + $this->fp = $data; + return null; + } + + // }}} + // {{{ setInput() + + /** + * Sets the file handle to use with parse(). + * + * You should use setInputFile() or setInputString() if you + * pass a string + * + * @param mixed $fp Can be either a resource returned from fopen(), + * a URL, a local filename or a string. + * @access public + * @see parse() + * @uses setInputString(), setInputFile() + */ + function setInput($fp) + { + if (is_resource($fp)) { + $this->fp = $fp; + return true; + } + // see if it's an absolute URL (has a scheme at the beginning) + elseif (preg_match('/[a-z]+:///', substr($fp, 0, 10))) { + return $this->setInputFile($fp); + } + // see if it's a local file + elseif (file_exists($fp)) { + return $this->setInputFile($fp); + } + // it must be a string + else { + $this->fp = $fp; + return true; + } + + return $this->raiseError('Illegal input format', XML_PARSER_ERROR_INVALID_INPUT); + } + + // }}} + // {{{ parse() + + /** + * Central parsing function. + * + * @return true|object PEAR error returns true on success, or a PEAR_Error otherwise + * @access public + */ + function parse() + { + /** + * reset the parser + */ + $result = $this->reset(); + if ($this->isError($result)) { + return $result; + } + // if $this->fp was fopened previously + if (is_resource($this->fp)) { + + while ($data = fread($this->fp, 4096)) { + if (!$this->_parseString($data, feof($this->fp))) { + $error = &$this->raiseError(); + $this->free(); + return $error; + } + } + // otherwise, $this->fp must be a string + } else { + if (!$this->_parseString($this->fp, true)) { + $error = &$this->raiseError(); + $this->free(); + return $error; + } + } + $this->free(); + + return true; + } + + /** + * XML_Parser::_parseString() + * + * @param string $data + * @param boolean $eof + * @return bool + * @access private + * @see parseString() + **/ + function _parseString($data, $eof = false) + { + return xml_parse($this->parser, $data, $eof); + } + + // }}} + // {{{ parseString() + + /** + * XML_Parser::parseString() + * + * Parses a string. + * + * @param string $data XML data + * @param boolean $eof If set and TRUE, data is the last piece of data sent in this parser + * @throws XML_Parser_Error + * @return Pear Error|true true on success or a PEAR Error + * @see _parseString() + */ + function parseString($data, $eof = false) + { + if (!isset($this->parser) || !is_resource($this->parser)) { + $this->reset(); + } + + if (!$this->_parseString($data, $eof)) { + $error = &$this->raiseError(); + $this->free(); + return $error; + } + + if ($eof === true) { + $this->free(); + } + return true; + } + + /** + * XML_Parser::free() + * + * Free the internal resources associated with the parser + * + * @return null + **/ + function free() + { + if (isset($this->parser) && is_resource($this->parser)) { + xml_parser_free($this->parser); + unset( $this->parser ); + } + if (isset($this->fp) && is_resource($this->fp)) { + fclose($this->fp); + } + unset($this->fp); + return null; + } + + /** + * XML_Parser::raiseError() + * + * Throws a XML_Parser_Error + * + * @param string $msg the error message + * @param integer $ecode the error message code + * @return XML_Parser_Error + **/ + function raiseError($msg = null, $ecode = 0) + { + $msg = !is_null($msg) ? $msg : $this->parser; + $err = &new XML_Parser_Error($msg, $ecode); + return parent::raiseError($err); + } + + // }}} + // {{{ funcStartHandler() + + function funcStartHandler($xp, $elem, $attribs) + { + $func = 'xmltag_' . $elem; + if (strchr($func, '.')) { + $func = str_replace('.', '_', $func); + } + if (method_exists($this->_handlerObj, $func)) { + call_user_func(array(&$this->_handlerObj, $func), $xp, $elem, $attribs); + } elseif (method_exists($this->_handlerObj, 'xmltag')) { + call_user_func(array(&$this->_handlerObj, 'xmltag'), $xp, $elem, $attribs); + } + } + + // }}} + // {{{ funcEndHandler() + + function funcEndHandler($xp, $elem) + { + $func = 'xmltag_' . $elem . '_'; + if (strchr($func, '.')) { + $func = str_replace('.', '_', $func); + } + if (method_exists($this->_handlerObj, $func)) { + call_user_func(array(&$this->_handlerObj, $func), $xp, $elem); + } elseif (method_exists($this->_handlerObj, 'xmltag_')) { + call_user_func(array(&$this->_handlerObj, 'xmltag_'), $xp, $elem); + } + } + + // }}} + // {{{ startHandler() + + /** + * + * @abstract + */ + function startHandler($xp, $elem, &$attribs) + { + return NULL; + } + + // }}} + // {{{ endHandler() + + /** + * + * @abstract + */ + function endHandler($xp, $elem) + { + return NULL; + } + + + // }}}me +} + +/** + * error class, replaces PEAR_Error + * + * An instance of this class will be returned + * if an error occurs inside XML_Parser. + * + * There are three advantages over using the standard PEAR_Error: + * - All messages will be prefixed + * - check for XML_Parser error, using is_a( $error, 'XML_Parser_Error' ) + * - messages can be generated from the xml_parser resource + * + * @package XML_Parser + * @access public + * @see PEAR_Error + */ +class XML_Parser_Error extends PEAR_Error +{ + // {{{ properties + + /** + * prefix for all messages + * + * @var string + */ + var $error_message_prefix = 'XML_Parser: '; + + // }}} + // {{{ constructor() + /** + * construct a new error instance + * + * You may either pass a message or an xml_parser resource as first + * parameter. If a resource has been passed, the last error that + * happened will be retrieved and returned. + * + * @access public + * @param string|resource message or parser resource + * @param integer error code + * @param integer error handling + * @param integer error level + */ + function XML_Parser_Error($msgorparser = 'unknown error', $code = 0, $mode = PEAR_ERROR_RETURN, $level = E_USER_NOTICE) + { + if (is_resource($msgorparser)) { + $code = xml_get_error_code($msgorparser); + $msgorparser = sprintf('%s at XML input line %d', + xml_error_string($code), + xml_get_current_line_number($msgorparser)); + } + $this->PEAR_Error($msgorparser, $code, $mode, $level); + } + // }}} +} +?> \ No newline at end of file diff --git a/thirdparty/pear/catalog b/thirdparty/pear/catalog new file mode 100644 index 000000000..6e0c69d40 --- /dev/null +++ b/thirdparty/pear/catalog @@ -0,0 +1 @@ +PUBLIC "-//PHP Group//DTD PEAR Package 1.0//EN//XML" "package.dtd" diff --git a/thirdparty/pear/class.nusoap_base.php b/thirdparty/pear/class.nusoap_base.php new file mode 100644 index 000000000..8e8e88e9c --- /dev/null +++ b/thirdparty/pear/class.nusoap_base.php @@ -0,0 +1,905 @@ +globalDebugLevel = 9; + +/** +* +* nusoap_base +* +* @author Dietrich Ayala +* @version $Id: class.nusoap_base.php,v 1.43 2005/08/04 01:27:42 snichol Exp $ +* @access public +*/ +class nusoap_base { + /** + * Identification for HTTP headers. + * + * @var string + * @access private + */ + var $title = 'NuSOAP'; + /** + * Version for HTTP headers. + * + * @var string + * @access private + */ + var $version = '0.7.2'; + /** + * CVS revision for HTTP headers. + * + * @var string + * @access private + */ + var $revision = '$Revision: 1.43 $'; + /** + * Current error string (manipulated by getError/setError) + * + * @var string + * @access private + */ + var $error_str = ''; + /** + * Current debug string (manipulated by debug/appendDebug/clearDebug/getDebug/getDebugAsXMLComment) + * + * @var string + * @access private + */ + var $debug_str = ''; + /** + * toggles automatic encoding of special characters as entities + * (should always be true, I think) + * + * @var boolean + * @access private + */ + var $charencoding = true; + /** + * the debug level for this instance + * + * @var integer + * @access private + */ + var $debugLevel; + + /** + * set schema version + * + * @var string + * @access public + */ + var $XMLSchemaVersion = 'http://www.w3.org/2001/XMLSchema'; + + /** + * charset encoding for outgoing messages + * + * @var string + * @access public + */ + var $soap_defencoding = 'ISO-8859-1'; + //var $soap_defencoding = 'UTF-8'; + + /** + * namespaces in an array of prefix => uri + * + * this is "seeded" by a set of constants, but it may be altered by code + * + * @var array + * @access public + */ + var $namespaces = array( + 'SOAP-ENV' => 'http://schemas.xmlsoap.org/soap/envelope/', + 'xsd' => 'http://www.w3.org/2001/XMLSchema', + 'xsi' => 'http://www.w3.org/2001/XMLSchema-instance', + 'SOAP-ENC' => 'http://schemas.xmlsoap.org/soap/encoding/' + ); + + /** + * namespaces used in the current context, e.g. during serialization + * + * @var array + * @access private + */ + var $usedNamespaces = array(); + + /** + * XML Schema types in an array of uri => (array of xml type => php type) + * is this legacy yet? + * no, this is used by the xmlschema class to verify type => namespace mappings. + * @var array + * @access public + */ + var $typemap = array( + 'http://www.w3.org/2001/XMLSchema' => array( + 'string'=>'string','boolean'=>'boolean','float'=>'double','double'=>'double','decimal'=>'double', + 'duration'=>'','dateTime'=>'string','time'=>'string','date'=>'string','gYearMonth'=>'', + 'gYear'=>'','gMonthDay'=>'','gDay'=>'','gMonth'=>'','hexBinary'=>'string','base64Binary'=>'string', + // abstract "any" types + 'anyType'=>'string','anySimpleType'=>'string', + // derived datatypes + 'normalizedString'=>'string','token'=>'string','language'=>'','NMTOKEN'=>'','NMTOKENS'=>'','Name'=>'','NCName'=>'','ID'=>'', + 'IDREF'=>'','IDREFS'=>'','ENTITY'=>'','ENTITIES'=>'','integer'=>'integer','nonPositiveInteger'=>'integer', + 'negativeInteger'=>'integer','long'=>'integer','int'=>'integer','short'=>'integer','byte'=>'integer','nonNegativeInteger'=>'integer', + 'unsignedLong'=>'','unsignedInt'=>'','unsignedShort'=>'','unsignedByte'=>'','positiveInteger'=>''), + 'http://www.w3.org/2000/10/XMLSchema' => array( + 'i4'=>'','int'=>'integer','boolean'=>'boolean','string'=>'string','double'=>'double', + 'float'=>'double','dateTime'=>'string', + 'timeInstant'=>'string','base64Binary'=>'string','base64'=>'string','ur-type'=>'array'), + 'http://www.w3.org/1999/XMLSchema' => array( + 'i4'=>'','int'=>'integer','boolean'=>'boolean','string'=>'string','double'=>'double', + 'float'=>'double','dateTime'=>'string', + 'timeInstant'=>'string','base64Binary'=>'string','base64'=>'string','ur-type'=>'array'), + 'http://soapinterop.org/xsd' => array('SOAPStruct'=>'struct'), + 'http://schemas.xmlsoap.org/soap/encoding/' => array('base64'=>'string','array'=>'array','Array'=>'array'), + 'http://xml.apache.org/xml-soap' => array('Map') + ); + + /** + * XML entities to convert + * + * @var array + * @access public + * @deprecated + * @see expandEntities + */ + var $xmlEntities = array('quot' => '"','amp' => '&', + 'lt' => '<','gt' => '>','apos' => "'"); + + /** + * constructor + * + * @access public + */ + function nusoap_base() { + $this->debugLevel = $GLOBALS['_transient']['static']['nusoap_base']->globalDebugLevel; + } + + /** + * gets the global debug level, which applies to future instances + * + * @return integer Debug level 0-9, where 0 turns off + * @access public + */ + function getGlobalDebugLevel() { + return $GLOBALS['_transient']['static']['nusoap_base']->globalDebugLevel; + } + + /** + * sets the global debug level, which applies to future instances + * + * @param int $level Debug level 0-9, where 0 turns off + * @access public + */ + function setGlobalDebugLevel($level) { + $GLOBALS['_transient']['static']['nusoap_base']->globalDebugLevel = $level; + } + + /** + * gets the debug level for this instance + * + * @return int Debug level 0-9, where 0 turns off + * @access public + */ + function getDebugLevel() { + return $this->debugLevel; + } + + /** + * sets the debug level for this instance + * + * @param int $level Debug level 0-9, where 0 turns off + * @access public + */ + function setDebugLevel($level) { + $this->debugLevel = $level; + } + + /** + * adds debug data to the instance debug string with formatting + * + * @param string $string debug data + * @access private + */ + function debug($string){ + if ($this->debugLevel > 0) { + $this->appendDebug($this->getmicrotime().' '.get_class($this).": $string\n"); + } + } + + /** + * adds debug data to the instance debug string without formatting + * + * @param string $string debug data + * @access public + */ + function appendDebug($string){ + if ($this->debugLevel > 0) { + // it would be nice to use a memory stream here to use + // memory more efficiently + $this->debug_str .= $string; + } + } + + /** + * clears the current debug data for this instance + * + * @access public + */ + function clearDebug() { + // it would be nice to use a memory stream here to use + // memory more efficiently + $this->debug_str = ''; + } + + /** + * gets the current debug data for this instance + * + * @return debug data + * @access public + */ + function &getDebug() { + // it would be nice to use a memory stream here to use + // memory more efficiently + return $this->debug_str; + } + + /** + * gets the current debug data for this instance as an XML comment + * this may change the contents of the debug data + * + * @return debug data as an XML comment + * @access public + */ + function &getDebugAsXMLComment() { + // it would be nice to use a memory stream here to use + // memory more efficiently + while (strpos($this->debug_str, '--')) { + $this->debug_str = str_replace('--', '- -', $this->debug_str); + } + return ""; + } + + /** + * expands entities, e.g. changes '<' to '<'. + * + * @param string $val The string in which to expand entities. + * @access private + */ + function expandEntities($val) { + if ($this->charencoding) { + $val = str_replace('&', '&', $val); + $val = str_replace("'", ''', $val); + $val = str_replace('"', '"', $val); + $val = str_replace('<', '<', $val); + $val = str_replace('>', '>', $val); + } + return $val; + } + + /** + * returns error string if present + * + * @return mixed error string or false + * @access public + */ + function getError(){ + if($this->error_str != ''){ + return $this->error_str; + } + return false; + } + + /** + * sets error string + * + * @return boolean $string error string + * @access private + */ + function setError($str){ + $this->error_str = $str; + } + + /** + * detect if array is a simple array or a struct (associative array) + * + * @param mixed $val The PHP array + * @return string (arraySimple|arrayStruct) + * @access private + */ + function isArraySimpleOrStruct($val) { + $keyList = array_keys($val); + foreach ($keyList as $keyListValue) { + if (!is_int($keyListValue)) { + return 'arrayStruct'; + } + } + return 'arraySimple'; + } + + /** + * serializes PHP values in accordance w/ section 5. Type information is + * not serialized if $use == 'literal'. + * + * @param mixed $val The value to serialize + * @param string $name The name (local part) of the XML element + * @param string $type The XML schema type (local part) for the element + * @param string $name_ns The namespace for the name of the XML element + * @param string $type_ns The namespace for the type of the element + * @param array $attributes The attributes to serialize as name=>value pairs + * @param string $use The WSDL "use" (encoded|literal) + * @return string The serialized element, possibly with child elements + * @access public + */ + function serialize_val($val,$name=false,$type=false,$name_ns=false,$type_ns=false,$attributes=false,$use='encoded'){ + $this->debug("in serialize_val: name=$name, type=$type, name_ns=$name_ns, type_ns=$type_ns, use=$use"); + $this->appendDebug('value=' . $this->varDump($val)); + $this->appendDebug('attributes=' . $this->varDump($attributes)); + + if(is_object($val) && get_class($val) == 'soapval'){ + return $val->serialize($use); + } + // force valid name if necessary + if (is_numeric($name)) { + $name = '__numeric_' . $name; + } elseif (! $name) { + $name = 'noname'; + } + // if name has ns, add ns prefix to name + $xmlns = ''; + if($name_ns){ + $prefix = 'nu'.rand(1000,9999); + $name = $prefix.':'.$name; + $xmlns .= " xmlns:$prefix=\"$name_ns\""; + } + // if type is prefixed, create type prefix + if($type_ns != '' && $type_ns == $this->namespaces['xsd']){ + // need to fix this. shouldn't default to xsd if no ns specified + // w/o checking against typemap + $type_prefix = 'xsd'; + } elseif($type_ns){ + $type_prefix = 'ns'.rand(1000,9999); + $xmlns .= " xmlns:$type_prefix=\"$type_ns\""; + } + // serialize attributes if present + $atts = ''; + if($attributes){ + foreach($attributes as $k => $v){ + $atts .= " $k=\"".$this->expandEntities($v).'"'; + } + } + // serialize null value + if (is_null($val)) { + if ($use == 'literal') { + // TODO: depends on minOccurs + return "<$name$xmlns $atts/>"; + } else { + if (isset($type) && isset($type_prefix)) { + $type_str = " xsi:type=\"$type_prefix:$type\""; + } else { + $type_str = ''; + } + return "<$name$xmlns$type_str $atts xsi:nil=\"true\"/>"; + } + } + // serialize if an xsd built-in primitive type + if($type != '' && isset($this->typemap[$this->XMLSchemaVersion][$type])){ + if (is_bool($val)) { + if ($type == 'boolean') { + $val = $val ? 'true' : 'false'; + } elseif (! $val) { + $val = 0; + } + } else if (is_string($val)) { + $val = $this->expandEntities($val); + } + if ($use == 'literal') { + return "<$name$xmlns $atts>$val"; + } else { + return "<$name$xmlns $atts xsi:type=\"xsd:$type\">$val"; + } + } + // detect type and serialize + $xml = ''; + switch(true) { + case (is_bool($val) || $type == 'boolean'): + if ($type == 'boolean') { + $val = $val ? 'true' : 'false'; + } elseif (! $val) { + $val = 0; + } + if ($use == 'literal') { + $xml .= "<$name$xmlns $atts>$val"; + } else { + $xml .= "<$name$xmlns xsi:type=\"xsd:boolean\"$atts>$val"; + } + break; + case (is_int($val) || is_long($val) || $type == 'int'): + if ($use == 'literal') { + $xml .= "<$name$xmlns $atts>$val"; + } else { + $xml .= "<$name$xmlns xsi:type=\"xsd:int\"$atts>$val"; + } + break; + case (is_float($val)|| is_double($val) || $type == 'float'): + if ($use == 'literal') { + $xml .= "<$name$xmlns $atts>$val"; + } else { + $xml .= "<$name$xmlns xsi:type=\"xsd:float\"$atts>$val"; + } + break; + case (is_string($val) || $type == 'string'): + $val = $this->expandEntities($val); + if ($use == 'literal') { + $xml .= "<$name$xmlns $atts>$val"; + } else { + $xml .= "<$name$xmlns xsi:type=\"xsd:string\"$atts>$val"; + } + break; + case is_object($val): + if (! $name) { + $name = get_class($val); + $this->debug("In serialize_val, used class name $name as element name"); + } else { + $this->debug("In serialize_val, do not override name $name for element name for class " . get_class($val)); + } + foreach(get_object_vars($val) as $k => $v){ + $pXml = isset($pXml) ? $pXml.$this->serialize_val($v,$k,false,false,false,false,$use) : $this->serialize_val($v,$k,false,false,false,false,$use); + } + $xml .= '<'.$name.'>'.$pXml.''; + break; + break; + case (is_array($val) || $type): + // detect if struct or array + $valueType = $this->isArraySimpleOrStruct($val); + if($valueType=='arraySimple' || ereg('^ArrayOf',$type)){ + $i = 0; + if(is_array($val) && count($val)> 0){ + foreach($val as $v){ + if(is_object($v) && get_class($v) == 'soapval'){ + $tt_ns = $v->type_ns; + $tt = $v->type; + } elseif (is_array($v)) { + $tt = $this->isArraySimpleOrStruct($v); + } else { + $tt = gettype($v); + } + $array_types[$tt] = 1; + // TODO: for literal, the name should be $name + $xml .= $this->serialize_val($v,'item',false,false,false,false,$use); + ++$i; + } + if(count($array_types) > 1){ + $array_typename = 'xsd:anyType'; + } elseif(isset($tt) && isset($this->typemap[$this->XMLSchemaVersion][$tt])) { + if ($tt == 'integer') { + $tt = 'int'; + } + $array_typename = 'xsd:'.$tt; + } elseif(isset($tt) && $tt == 'arraySimple'){ + $array_typename = 'SOAP-ENC:Array'; + } elseif(isset($tt) && $tt == 'arrayStruct'){ + $array_typename = 'unnamed_struct_use_soapval'; + } else { + // if type is prefixed, create type prefix + if ($tt_ns != '' && $tt_ns == $this->namespaces['xsd']){ + $array_typename = 'xsd:' . $tt; + } elseif ($tt_ns) { + $tt_prefix = 'ns' . rand(1000, 9999); + $array_typename = "$tt_prefix:$tt"; + $xmlns .= " xmlns:$tt_prefix=\"$tt_ns\""; + } else { + $array_typename = $tt; + } + } + $array_type = $i; + if ($use == 'literal') { + $type_str = ''; + } else if (isset($type) && isset($type_prefix)) { + $type_str = " xsi:type=\"$type_prefix:$type\""; + } else { + $type_str = " xsi:type=\"SOAP-ENC:Array\" SOAP-ENC:arrayType=\"".$array_typename."[$array_type]\""; + } + // empty array + } else { + if ($use == 'literal') { + $type_str = ''; + } else if (isset($type) && isset($type_prefix)) { + $type_str = " xsi:type=\"$type_prefix:$type\""; + } else { + $type_str = " xsi:type=\"SOAP-ENC:Array\" SOAP-ENC:arrayType=\"xsd:anyType[0]\""; + } + } + // TODO: for array in literal, there is no wrapper here + $xml = "<$name$xmlns$type_str$atts>".$xml.""; + } else { + // got a struct + if(isset($type) && isset($type_prefix)){ + $type_str = " xsi:type=\"$type_prefix:$type\""; + } else { + $type_str = ''; + } + if ($use == 'literal') { + $xml .= "<$name$xmlns $atts>"; + } else { + $xml .= "<$name$xmlns$type_str$atts>"; + } + foreach($val as $k => $v){ + // Apache Map + if ($type == 'Map' && $type_ns == 'http://xml.apache.org/xml-soap') { + $xml .= ''; + $xml .= $this->serialize_val($k,'key',false,false,false,false,$use); + $xml .= $this->serialize_val($v,'value',false,false,false,false,$use); + $xml .= ''; + } else { + $xml .= $this->serialize_val($v,$k,false,false,false,false,$use); + } + } + $xml .= ""; + } + break; + default: + $xml .= 'not detected, got '.gettype($val).' for '.$val; + break; + } + return $xml; + } + + /** + * serializes a message + * + * @param string $body the XML of the SOAP body + * @param mixed $headers optional string of XML with SOAP header content, or array of soapval objects for SOAP headers + * @param array $namespaces optional the namespaces used in generating the body and headers + * @param string $style optional (rpc|document) + * @param string $use optional (encoded|literal) + * @param string $encodingStyle optional (usually 'http://schemas.xmlsoap.org/soap/encoding/' for encoded) + * @return string the message + * @access public + */ + function serializeEnvelope($body,$headers=false,$namespaces=array(),$style='rpc',$use='encoded',$encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'){ + // TODO: add an option to automatically run utf8_encode on $body and $headers + // if $this->soap_defencoding is UTF-8. Not doing this automatically allows + // one to send arbitrary UTF-8 characters, not just characters that map to ISO-8859-1 + + $this->debug("In serializeEnvelope length=" . strlen($body) . " body (max 1000 characters)=" . substr($body, 0, 1000) . " style=$style use=$use encodingStyle=$encodingStyle"); + $this->debug("headers:"); + $this->appendDebug($this->varDump($headers)); + $this->debug("namespaces:"); + $this->appendDebug($this->varDump($namespaces)); + + // serialize namespaces + $ns_string = ''; + foreach(array_merge($this->namespaces,$namespaces) as $k => $v){ + $ns_string .= " xmlns:$k=\"$v\""; + } + if($encodingStyle) { + $ns_string = " SOAP-ENV:encodingStyle=\"$encodingStyle\"$ns_string"; + } + + // serialize headers + if($headers){ + if (is_array($headers)) { + $xml = ''; + foreach ($headers as $header) { + $xml .= $this->serialize_val($header, false, false, false, false, false, $use); + } + $headers = $xml; + $this->debug("In serializeEnvelope, serialzied array of headers to $headers"); + } + $headers = "".$headers.""; + } + // serialize envelope + return + 'soap_defencoding .'"?'.">". + '". + $headers. + "". + $body. + "". + ""; + } + + /** + * formats a string to be inserted into an HTML stream + * + * @param string $str The string to format + * @return string The formatted string + * @access public + * @deprecated + */ + function formatDump($str){ + $str = htmlspecialchars($str); + return nl2br($str); + } + + /** + * contracts (changes namespace to prefix) a qualified name + * + * @param string $qname qname + * @return string contracted qname + * @access private + */ + function contractQname($qname){ + // get element namespace + //$this->xdebug("Contract $qname"); + if (strrpos($qname, ':')) { + // get unqualified name + $name = substr($qname, strrpos($qname, ':') + 1); + // get ns + $ns = substr($qname, 0, strrpos($qname, ':')); + $p = $this->getPrefixFromNamespace($ns); + if ($p) { + return $p . ':' . $name; + } + return $qname; + } else { + return $qname; + } + } + + /** + * expands (changes prefix to namespace) a qualified name + * + * @param string $string qname + * @return string expanded qname + * @access private + */ + function expandQname($qname){ + // get element prefix + if(strpos($qname,':') && !ereg('^http://',$qname)){ + // get unqualified name + $name = substr(strstr($qname,':'),1); + // get ns prefix + $prefix = substr($qname,0,strpos($qname,':')); + if(isset($this->namespaces[$prefix])){ + return $this->namespaces[$prefix].':'.$name; + } else { + return $qname; + } + } else { + return $qname; + } + } + + /** + * returns the local part of a prefixed string + * returns the original string, if not prefixed + * + * @param string $str The prefixed string + * @return string The local part + * @access public + */ + function getLocalPart($str){ + if($sstr = strrchr($str,':')){ + // get unqualified name + return substr( $sstr, 1 ); + } else { + return $str; + } + } + + /** + * returns the prefix part of a prefixed string + * returns false, if not prefixed + * + * @param string $str The prefixed string + * @return mixed The prefix or false if there is no prefix + * @access public + */ + function getPrefix($str){ + if($pos = strrpos($str,':')){ + // get prefix + return substr($str,0,$pos); + } + return false; + } + + /** + * pass it a prefix, it returns a namespace + * + * @param string $prefix The prefix + * @return mixed The namespace, false if no namespace has the specified prefix + * @access public + */ + function getNamespaceFromPrefix($prefix){ + if (isset($this->namespaces[$prefix])) { + return $this->namespaces[$prefix]; + } + //$this->setError("No namespace registered for prefix '$prefix'"); + return false; + } + + /** + * returns the prefix for a given namespace (or prefix) + * or false if no prefixes registered for the given namespace + * + * @param string $ns The namespace + * @return mixed The prefix, false if the namespace has no prefixes + * @access public + */ + function getPrefixFromNamespace($ns) { + foreach ($this->namespaces as $p => $n) { + if ($ns == $n || $ns == $p) { + $this->usedNamespaces[$p] = $n; + return $p; + } + } + return false; + } + + /** + * returns the time in ODBC canonical form with microseconds + * + * @return string The time in ODBC canonical form with microseconds + * @access public + */ + function getmicrotime() { + if (function_exists('gettimeofday')) { + $tod = gettimeofday(); + $sec = $tod['sec']; + $usec = $tod['usec']; + } else { + $sec = time(); + $usec = 0; + } + return strftime('%Y-%m-%d %H:%M:%S', $sec) . '.' . sprintf('%06d', $usec); + } + + /** + * Returns a string with the output of var_dump + * + * @param mixed $data The variable to var_dump + * @return string The output of var_dump + * @access public + */ + function varDump($data) { + ob_start(); + var_dump($data); + $ret_val = ob_get_contents(); + ob_end_clean(); + return $ret_val; + } +} + +// XML Schema Datatype Helper Functions + +//xsd:dateTime helpers + +/** +* convert unix timestamp to ISO 8601 compliant date string +* +* @param string $timestamp Unix time stamp +* @access public +*/ +function timestamp_to_iso8601($timestamp,$utc=true){ + $datestr = date('Y-m-d\TH:i:sO',$timestamp); + if($utc){ + $eregStr = + '([0-9]{4})-'. // centuries & years CCYY- + '([0-9]{2})-'. // months MM- + '([0-9]{2})'. // days DD + 'T'. // separator T + '([0-9]{2}):'. // hours hh: + '([0-9]{2}):'. // minutes mm: + '([0-9]{2})(\.[0-9]*)?'. // seconds ss.ss... + '(Z|[+\-][0-9]{2}:?[0-9]{2})?'; // Z to indicate UTC, -/+HH:MM:SS.SS... for local tz's + + if(ereg($eregStr,$datestr,$regs)){ + return sprintf('%04d-%02d-%02dT%02d:%02d:%02dZ',$regs[1],$regs[2],$regs[3],$regs[4],$regs[5],$regs[6]); + } + return false; + } else { + return $datestr; + } +} + +/** +* convert ISO 8601 compliant date string to unix timestamp +* +* @param string $datestr ISO 8601 compliant date string +* @access public +*/ +function iso8601_to_timestamp($datestr){ + $eregStr = + '([0-9]{4})-'. // centuries & years CCYY- + '([0-9]{2})-'. // months MM- + '([0-9]{2})'. // days DD + 'T'. // separator T + '([0-9]{2}):'. // hours hh: + '([0-9]{2}):'. // minutes mm: + '([0-9]{2})(\.[0-9]+)?'. // seconds ss.ss... + '(Z|[+\-][0-9]{2}:?[0-9]{2})?'; // Z to indicate UTC, -/+HH:MM:SS.SS... for local tz's + if(ereg($eregStr,$datestr,$regs)){ + // not utc + if($regs[8] != 'Z'){ + $op = substr($regs[8],0,1); + $h = substr($regs[8],1,2); + $m = substr($regs[8],strlen($regs[8])-2,2); + if($op == '-'){ + $regs[4] = $regs[4] + $h; + $regs[5] = $regs[5] + $m; + } elseif($op == '+'){ + $regs[4] = $regs[4] - $h; + $regs[5] = $regs[5] - $m; + } + } + return strtotime("$regs[1]-$regs[2]-$regs[3] $regs[4]:$regs[5]:$regs[6]Z"); + } else { + return false; + } +} + +/** +* sleeps some number of microseconds +* +* @param string $usec the number of microseconds to sleep +* @access public +* @deprecated +*/ +function usleepWindows($usec) +{ + $start = gettimeofday(); + + do + { + $stop = gettimeofday(); + $timePassed = 1000000 * ($stop['sec'] - $start['sec']) + + $stop['usec'] - $start['usec']; + } + while ($timePassed < $usec); +} + + +?> \ No newline at end of file diff --git a/thirdparty/pear/class.soap_fault.php b/thirdparty/pear/class.soap_fault.php new file mode 100644 index 000000000..47e5ee812 --- /dev/null +++ b/thirdparty/pear/class.soap_fault.php @@ -0,0 +1,86 @@ + +* @version $Id: class.soap_fault.php,v 1.12 2005/07/27 19:24:42 snichol Exp $ +* @access public +*/ +class soap_fault extends nusoap_base { + /** + * The fault code (client|server) + * @var string + * @access private + */ + var $faultcode; + /** + * The fault actor + * @var string + * @access private + */ + var $faultactor; + /** + * The fault string, a description of the fault + * @var string + * @access private + */ + var $faultstring; + /** + * The fault detail, typically a string or array of string + * @var mixed + * @access private + */ + var $faultdetail; + + /** + * constructor + * + * @param string $faultcode (client | server) + * @param string $faultactor only used when msg routed between multiple actors + * @param string $faultstring human readable error message + * @param mixed $faultdetail detail, typically a string or array of string + */ + function soap_fault($faultcode,$faultactor='',$faultstring='',$faultdetail=''){ + parent::nusoap_base(); + $this->faultcode = $faultcode; + $this->faultactor = $faultactor; + $this->faultstring = $faultstring; + $this->faultdetail = $faultdetail; + } + + /** + * serialize a fault + * + * @return string The serialization of the fault instance. + * @access public + */ + function serialize(){ + $ns_string = ''; + foreach($this->namespaces as $k => $v){ + $ns_string .= "\n xmlns:$k=\"$v\""; + } + $return_msg = + 'soap_defencoding.'"?>'. + '\n". + ''. + ''. + $this->serialize_val($this->faultcode, 'faultcode'). + $this->serialize_val($this->faultactor, 'faultactor'). + $this->serialize_val($this->faultstring, 'faultstring'). + $this->serialize_val($this->faultdetail, 'detail'). + ''. + ''. + ''; + return $return_msg; + } +} + + + + +?> \ No newline at end of file diff --git a/thirdparty/pear/class.soap_parser.php b/thirdparty/pear/class.soap_parser.php new file mode 100644 index 000000000..8fd2d792d --- /dev/null +++ b/thirdparty/pear/class.soap_parser.php @@ -0,0 +1,599 @@ + +* @version $Id: class.soap_parser.php,v 1.36 2005/08/04 01:27:42 snichol Exp $ +* @access public +*/ +class soap_parser extends nusoap_base { + + var $xml = ''; + var $xml_encoding = ''; + var $method = ''; + var $root_struct = ''; + var $root_struct_name = ''; + var $root_struct_namespace = ''; + var $root_header = ''; + var $document = ''; // incoming SOAP body (text) + // determines where in the message we are (envelope,header,body,method) + var $status = ''; + var $position = 0; + var $depth = 0; + var $default_namespace = ''; + var $namespaces = array(); + var $message = array(); + var $parent = ''; + var $fault = false; + var $fault_code = ''; + var $fault_str = ''; + var $fault_detail = ''; + var $depth_array = array(); + var $debug_flag = true; + var $soapresponse = NULL; + var $responseHeaders = ''; // incoming SOAP headers (text) + var $body_position = 0; + // for multiref parsing: + // array of id => pos + var $ids = array(); + // array of id => hrefs => pos + var $multirefs = array(); + // toggle for auto-decoding element content + var $decode_utf8 = true; + + /** + * constructor that actually does the parsing + * + * @param string $xml SOAP message + * @param string $encoding character encoding scheme of message + * @param string $method method for which XML is parsed (unused?) + * @param string $decode_utf8 whether to decode UTF-8 to ISO-8859-1 + * @access public + */ + function soap_parser($xml,$encoding='UTF-8',$method='',$decode_utf8=true){ + parent::nusoap_base(); + $this->xml = $xml; + $this->xml_encoding = $encoding; + $this->method = $method; + $this->decode_utf8 = $decode_utf8; + + // Check whether content has been read. + if(!empty($xml)){ + // Check XML encoding + $pos_xml = strpos($xml, '', $pos_xml + 2) - $pos_xml + 1); + if (preg_match("/encoding=[\"']([^\"']*)[\"']/", $xml_decl, $res)) { + $xml_encoding = $res[1]; + if (strtoupper($xml_encoding) != $encoding) { + $err = "Charset from HTTP Content-Type '" . $encoding . "' does not match encoding from XML declaration '" . $xml_encoding . "'"; + $this->debug($err); + if ($encoding != 'ISO-8859-1' || strtoupper($xml_encoding) != 'UTF-8') { + $this->setError($err); + return; + } + // when HTTP says ISO-8859-1 (the default) and XML says UTF-8 (the typical), assume the other endpoint is just sloppy and proceed + } else { + $this->debug('Charset from HTTP Content-Type matches encoding from XML declaration'); + } + } else { + $this->debug('No encoding specified in XML declaration'); + } + } else { + $this->debug('No XML declaration'); + } + $this->debug('Entering soap_parser(), length='.strlen($xml).', encoding='.$encoding); + // Create an XML parser - why not xml_parser_create_ns? + $this->parser = xml_parser_create($this->xml_encoding); + // Set the options for parsing the XML data. + //xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1); + xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, 0); + xml_parser_set_option($this->parser, XML_OPTION_TARGET_ENCODING, $this->xml_encoding); + // Set the object for the parser. + xml_set_object($this->parser, $this); + // Set the element handlers for the parser. + xml_set_element_handler($this->parser, 'start_element','end_element'); + xml_set_character_data_handler($this->parser,'character_data'); + + // Parse the XML file. + if(!xml_parse($this->parser,$xml,true)){ + // Display an error message. + $err = sprintf('XML error parsing SOAP payload on line %d: %s', + xml_get_current_line_number($this->parser), + xml_error_string(xml_get_error_code($this->parser))); + $this->debug($err); + $this->debug("XML payload:\n" . $xml); + $this->setError($err); + } else { + $this->debug('parsed successfully, found root struct: '.$this->root_struct.' of name '.$this->root_struct_name); + // get final value + $this->soapresponse = $this->message[$this->root_struct]['result']; + // get header value: no, because this is documented as XML string +// if($this->root_header != '' && isset($this->message[$this->root_header]['result'])){ +// $this->responseHeaders = $this->message[$this->root_header]['result']; +// } + // resolve hrefs/ids + if(sizeof($this->multirefs) > 0){ + foreach($this->multirefs as $id => $hrefs){ + $this->debug('resolving multirefs for id: '.$id); + $idVal = $this->buildVal($this->ids[$id]); + if (is_array($idVal) && isset($idVal['!id'])) { + unset($idVal['!id']); + } + foreach($hrefs as $refPos => $ref){ + $this->debug('resolving href at pos '.$refPos); + $this->multirefs[$id][$refPos] = $idVal; + } + } + } + } + xml_parser_free($this->parser); + } else { + $this->debug('xml was empty, didn\'t parse!'); + $this->setError('xml was empty, didn\'t parse!'); + } + } + + /** + * start-element handler + * + * @param resource $parser XML parser object + * @param string $name element name + * @param array $attrs associative array of attributes + * @access private + */ + function start_element($parser, $name, $attrs) { + // position in a total number of elements, starting from 0 + // update class level pos + $pos = $this->position++; + // and set mine + $this->message[$pos] = array('pos' => $pos,'children'=>'','cdata'=>''); + // depth = how many levels removed from root? + // set mine as current global depth and increment global depth value + $this->message[$pos]['depth'] = $this->depth++; + + // else add self as child to whoever the current parent is + if($pos != 0){ + $this->message[$this->parent]['children'] .= '|'.$pos; + } + // set my parent + $this->message[$pos]['parent'] = $this->parent; + // set self as current parent + $this->parent = $pos; + // set self as current value for this depth + $this->depth_array[$this->depth] = $pos; + // get element prefix + if(strpos($name,':')){ + // get ns prefix + $prefix = substr($name,0,strpos($name,':')); + // get unqualified name + $name = substr(strstr($name,':'),1); + } + // set status + if($name == 'Envelope'){ + $this->status = 'envelope'; + } elseif($name == 'Header'){ + $this->root_header = $pos; + $this->status = 'header'; + } elseif($name == 'Body'){ + $this->status = 'body'; + $this->body_position = $pos; + // set method + } elseif($this->status == 'body' && $pos == ($this->body_position+1)){ + $this->status = 'method'; + $this->root_struct_name = $name; + $this->root_struct = $pos; + $this->message[$pos]['type'] = 'struct'; + $this->debug("found root struct $this->root_struct_name, pos $this->root_struct"); + } + // set my status + $this->message[$pos]['status'] = $this->status; + // set name + $this->message[$pos]['name'] = htmlspecialchars($name); + // set attrs + $this->message[$pos]['attrs'] = $attrs; + + // loop through atts, logging ns and type declarations + $attstr = ''; + foreach($attrs as $key => $value){ + $key_prefix = $this->getPrefix($key); + $key_localpart = $this->getLocalPart($key); + // if ns declarations, add to class level array of valid namespaces + if($key_prefix == 'xmlns'){ + if(ereg('^http://www.w3.org/[0-9]{4}/XMLSchema$',$value)){ + $this->XMLSchemaVersion = $value; + $this->namespaces['xsd'] = $this->XMLSchemaVersion; + $this->namespaces['xsi'] = $this->XMLSchemaVersion.'-instance'; + } + $this->namespaces[$key_localpart] = $value; + // set method namespace + if($name == $this->root_struct_name){ + $this->methodNamespace = $value; + } + // if it's a type declaration, set type + } elseif($key_localpart == 'type'){ + $value_prefix = $this->getPrefix($value); + $value_localpart = $this->getLocalPart($value); + $this->message[$pos]['type'] = $value_localpart; + $this->message[$pos]['typePrefix'] = $value_prefix; + if(isset($this->namespaces[$value_prefix])){ + $this->message[$pos]['type_namespace'] = $this->namespaces[$value_prefix]; + } else if(isset($attrs['xmlns:'.$value_prefix])) { + $this->message[$pos]['type_namespace'] = $attrs['xmlns:'.$value_prefix]; + } + // should do something here with the namespace of specified type? + } elseif($key_localpart == 'arrayType'){ + $this->message[$pos]['type'] = 'array'; + /* do arrayType ereg here + [1] arrayTypeValue ::= atype asize + [2] atype ::= QName rank* + [3] rank ::= '[' (',')* ']' + [4] asize ::= '[' length~ ']' + [5] length ::= nextDimension* Digit+ + [6] nextDimension ::= Digit+ ',' + */ + $expr = '([A-Za-z0-9_]+):([A-Za-z]+[A-Za-z0-9_]+)\[([0-9]+),?([0-9]*)\]'; + if(ereg($expr,$value,$regs)){ + $this->message[$pos]['typePrefix'] = $regs[1]; + $this->message[$pos]['arrayTypePrefix'] = $regs[1]; + if (isset($this->namespaces[$regs[1]])) { + $this->message[$pos]['arrayTypeNamespace'] = $this->namespaces[$regs[1]]; + } else if (isset($attrs['xmlns:'.$regs[1]])) { + $this->message[$pos]['arrayTypeNamespace'] = $attrs['xmlns:'.$regs[1]]; + } + $this->message[$pos]['arrayType'] = $regs[2]; + $this->message[$pos]['arraySize'] = $regs[3]; + $this->message[$pos]['arrayCols'] = $regs[4]; + } + // specifies nil value (or not) + } elseif ($key_localpart == 'nil'){ + $this->message[$pos]['nil'] = ($value == 'true' || $value == '1'); + // some other attribute + } elseif ($key != 'href' && $key != 'xmlns' && $key_localpart != 'encodingStyle' && $key_localpart != 'root') { + $this->message[$pos]['xattrs']['!' . $key] = $value; + } + + if ($key == 'xmlns') { + $this->default_namespace = $value; + } + // log id + if($key == 'id'){ + $this->ids[$value] = $pos; + } + // root + if($key_localpart == 'root' && $value == 1){ + $this->status = 'method'; + $this->root_struct_name = $name; + $this->root_struct = $pos; + $this->debug("found root struct $this->root_struct_name, pos $pos"); + } + // for doclit + $attstr .= " $key=\"$value\""; + } + // get namespace - must be done after namespace atts are processed + if(isset($prefix)){ + $this->message[$pos]['namespace'] = $this->namespaces[$prefix]; + $this->default_namespace = $this->namespaces[$prefix]; + } else { + $this->message[$pos]['namespace'] = $this->default_namespace; + } + if($this->status == 'header'){ + if ($this->root_header != $pos) { + $this->responseHeaders .= "<" . (isset($prefix) ? $prefix . ':' : '') . "$name$attstr>"; + } + } elseif($this->root_struct_name != ''){ + $this->document .= "<" . (isset($prefix) ? $prefix . ':' : '') . "$name$attstr>"; + } + } + + /** + * end-element handler + * + * @param resource $parser XML parser object + * @param string $name element name + * @access private + */ + function end_element($parser, $name) { + // position of current element is equal to the last value left in depth_array for my depth + $pos = $this->depth_array[$this->depth--]; + + // get element prefix + if(strpos($name,':')){ + // get ns prefix + $prefix = substr($name,0,strpos($name,':')); + // get unqualified name + $name = substr(strstr($name,':'),1); + } + + // build to native type + if(isset($this->body_position) && $pos > $this->body_position){ + // deal w/ multirefs + if(isset($this->message[$pos]['attrs']['href'])){ + // get id + $id = substr($this->message[$pos]['attrs']['href'],1); + // add placeholder to href array + $this->multirefs[$id][$pos] = 'placeholder'; + // add set a reference to it as the result value + $this->message[$pos]['result'] =& $this->multirefs[$id][$pos]; + // build complexType values + } elseif($this->message[$pos]['children'] != ''){ + // if result has already been generated (struct/array) + if(!isset($this->message[$pos]['result'])){ + $this->message[$pos]['result'] = $this->buildVal($pos); + } + // build complexType values of attributes and possibly simpleContent + } elseif (isset($this->message[$pos]['xattrs'])) { + if (isset($this->message[$pos]['nil']) && $this->message[$pos]['nil']) { + $this->message[$pos]['xattrs']['!'] = null; + } elseif (isset($this->message[$pos]['cdata']) && trim($this->message[$pos]['cdata']) != '') { + if (isset($this->message[$pos]['type'])) { + $this->message[$pos]['xattrs']['!'] = $this->decodeSimple($this->message[$pos]['cdata'], $this->message[$pos]['type'], isset($this->message[$pos]['type_namespace']) ? $this->message[$pos]['type_namespace'] : ''); + } else { + $parent = $this->message[$pos]['parent']; + if (isset($this->message[$parent]['type']) && ($this->message[$parent]['type'] == 'array') && isset($this->message[$parent]['arrayType'])) { + $this->message[$pos]['xattrs']['!'] = $this->decodeSimple($this->message[$pos]['cdata'], $this->message[$parent]['arrayType'], isset($this->message[$parent]['arrayTypeNamespace']) ? $this->message[$parent]['arrayTypeNamespace'] : ''); + } else { + $this->message[$pos]['xattrs']['!'] = $this->message[$pos]['cdata']; + } + } + } + $this->message[$pos]['result'] = $this->message[$pos]['xattrs']; + // set value of simpleType (or nil complexType) + } else { + //$this->debug('adding data for scalar value '.$this->message[$pos]['name'].' of value '.$this->message[$pos]['cdata']); + if (isset($this->message[$pos]['nil']) && $this->message[$pos]['nil']) { + $this->message[$pos]['xattrs']['!'] = null; + } elseif (isset($this->message[$pos]['type'])) { + $this->message[$pos]['result'] = $this->decodeSimple($this->message[$pos]['cdata'], $this->message[$pos]['type'], isset($this->message[$pos]['type_namespace']) ? $this->message[$pos]['type_namespace'] : ''); + } else { + $parent = $this->message[$pos]['parent']; + if (isset($this->message[$parent]['type']) && ($this->message[$parent]['type'] == 'array') && isset($this->message[$parent]['arrayType'])) { + $this->message[$pos]['result'] = $this->decodeSimple($this->message[$pos]['cdata'], $this->message[$parent]['arrayType'], isset($this->message[$parent]['arrayTypeNamespace']) ? $this->message[$parent]['arrayTypeNamespace'] : ''); + } else { + $this->message[$pos]['result'] = $this->message[$pos]['cdata']; + } + } + + /* add value to parent's result, if parent is struct/array + $parent = $this->message[$pos]['parent']; + if($this->message[$parent]['type'] != 'map'){ + if(strtolower($this->message[$parent]['type']) == 'array'){ + $this->message[$parent]['result'][] = $this->message[$pos]['result']; + } else { + $this->message[$parent]['result'][$this->message[$pos]['name']] = $this->message[$pos]['result']; + } + } + */ + } + } + + // for doclit + if($this->status == 'header'){ + if ($this->root_header != $pos) { + $this->responseHeaders .= ""; + } + } elseif($pos >= $this->root_struct){ + $this->document .= ""; + } + // switch status + if($pos == $this->root_struct){ + $this->status = 'body'; + $this->root_struct_namespace = $this->message[$pos]['namespace']; + } elseif($name == 'Body'){ + $this->status = 'envelope'; + } elseif($name == 'Header'){ + $this->status = 'envelope'; + } elseif($name == 'Envelope'){ + // + } + // set parent back to my parent + $this->parent = $this->message[$pos]['parent']; + } + + /** + * element content handler + * + * @param resource $parser XML parser object + * @param string $data element content + * @access private + */ + function character_data($parser, $data){ + $pos = $this->depth_array[$this->depth]; + if ($this->xml_encoding=='UTF-8'){ + // TODO: add an option to disable this for folks who want + // raw UTF-8 that, e.g., might not map to iso-8859-1 + // TODO: this can also be handled with xml_parser_set_option($this->parser, XML_OPTION_TARGET_ENCODING, "ISO-8859-1"); + if($this->decode_utf8){ + $data = utf8_decode($data); + } + } + $this->message[$pos]['cdata'] .= $data; + // for doclit + if($this->status == 'header'){ + $this->responseHeaders .= $data; + } else { + $this->document .= $data; + } + } + + /** + * get the parsed message + * + * @return mixed + * @access public + */ + function get_response(){ + return $this->soapresponse; + } + + /** + * get the parsed headers + * + * @return string XML or empty if no headers + * @access public + */ + function getHeaders(){ + return $this->responseHeaders; + } + + /** + * decodes simple types into PHP variables + * + * @param string $value value to decode + * @param string $type XML type to decode + * @param string $typens XML type namespace to decode + * @return mixed PHP value + * @access private + */ + function decodeSimple($value, $type, $typens) { + // TODO: use the namespace! + if ((!isset($type)) || $type == 'string' || $type == 'long' || $type == 'unsignedLong') { + return (string) $value; + } + if ($type == 'int' || $type == 'integer' || $type == 'short' || $type == 'byte') { + return (int) $value; + } + if ($type == 'float' || $type == 'double' || $type == 'decimal') { + return (double) $value; + } + if ($type == 'boolean') { + if (strtolower($value) == 'false' || strtolower($value) == 'f') { + return false; + } + return (boolean) $value; + } + if ($type == 'base64' || $type == 'base64Binary') { + $this->debug('Decode base64 value'); + return base64_decode($value); + } + // obscure numeric types + if ($type == 'nonPositiveInteger' || $type == 'negativeInteger' + || $type == 'nonNegativeInteger' || $type == 'positiveInteger' + || $type == 'unsignedInt' + || $type == 'unsignedShort' || $type == 'unsignedByte') { + return (int) $value; + } + // bogus: parser treats array with no elements as a simple type + if ($type == 'array') { + return array(); + } + // everything else + return (string) $value; + } + + /** + * builds response structures for compound values (arrays/structs) + * and scalars + * + * @param integer $pos position in node tree + * @return mixed PHP value + * @access private + */ + function buildVal($pos){ + if(!isset($this->message[$pos]['type'])){ + $this->message[$pos]['type'] = ''; + } + $this->debug('in buildVal() for '.$this->message[$pos]['name']."(pos $pos) of type ".$this->message[$pos]['type']); + // if there are children... + if($this->message[$pos]['children'] != ''){ + $this->debug('in buildVal, there are children'); + $children = explode('|',$this->message[$pos]['children']); + array_shift($children); // knock off empty + // md array + if(isset($this->message[$pos]['arrayCols']) && $this->message[$pos]['arrayCols'] != ''){ + $r=0; // rowcount + $c=0; // colcount + foreach($children as $child_pos){ + $this->debug("in buildVal, got an MD array element: $r, $c"); + $params[$r][] = $this->message[$child_pos]['result']; + $c++; + if($c == $this->message[$pos]['arrayCols']){ + $c = 0; + $r++; + } + } + // array + } elseif($this->message[$pos]['type'] == 'array' || $this->message[$pos]['type'] == 'Array'){ + $this->debug('in buildVal, adding array '.$this->message[$pos]['name']); + foreach($children as $child_pos){ + $params[] = &$this->message[$child_pos]['result']; + } + // apache Map type: java hashtable + } elseif($this->message[$pos]['type'] == 'Map' && $this->message[$pos]['type_namespace'] == 'http://xml.apache.org/xml-soap'){ + $this->debug('in buildVal, Java Map '.$this->message[$pos]['name']); + foreach($children as $child_pos){ + $kv = explode("|",$this->message[$child_pos]['children']); + $params[$this->message[$kv[1]]['result']] = &$this->message[$kv[2]]['result']; + } + // generic compound type + //} elseif($this->message[$pos]['type'] == 'SOAPStruct' || $this->message[$pos]['type'] == 'struct') { + } else { + // Apache Vector type: treat as an array + $this->debug('in buildVal, adding Java Vector '.$this->message[$pos]['name']); + if ($this->message[$pos]['type'] == 'Vector' && $this->message[$pos]['type_namespace'] == 'http://xml.apache.org/xml-soap') { + $notstruct = 1; + } else { + $notstruct = 0; + } + // + foreach($children as $child_pos){ + if($notstruct){ + $params[] = &$this->message[$child_pos]['result']; + } else { + if (isset($params[$this->message[$child_pos]['name']])) { + // de-serialize repeated element name into an array + if ((!is_array($params[$this->message[$child_pos]['name']])) || (!isset($params[$this->message[$child_pos]['name']][0]))) { + $params[$this->message[$child_pos]['name']] = array($params[$this->message[$child_pos]['name']]); + } + $params[$this->message[$child_pos]['name']][] = &$this->message[$child_pos]['result']; + } else { + $params[$this->message[$child_pos]['name']] = &$this->message[$child_pos]['result']; + } + } + } + } + if (isset($this->message[$pos]['xattrs'])) { + $this->debug('in buildVal, handling attributes'); + foreach ($this->message[$pos]['xattrs'] as $n => $v) { + $params[$n] = $v; + } + } + // handle simpleContent + if (isset($this->message[$pos]['cdata']) && trim($this->message[$pos]['cdata']) != '') { + $this->debug('in buildVal, handling simpleContent'); + if (isset($this->message[$pos]['type'])) { + $params['!'] = $this->decodeSimple($this->message[$pos]['cdata'], $this->message[$pos]['type'], isset($this->message[$pos]['type_namespace']) ? $this->message[$pos]['type_namespace'] : ''); + } else { + $parent = $this->message[$pos]['parent']; + if (isset($this->message[$parent]['type']) && ($this->message[$parent]['type'] == 'array') && isset($this->message[$parent]['arrayType'])) { + $params['!'] = $this->decodeSimple($this->message[$pos]['cdata'], $this->message[$parent]['arrayType'], isset($this->message[$parent]['arrayTypeNamespace']) ? $this->message[$parent]['arrayTypeNamespace'] : ''); + } else { + $params['!'] = $this->message[$pos]['cdata']; + } + } + } + return is_array($params) ? $params : array(); + } else { + $this->debug('in buildVal, no children, building scalar'); + $cdata = isset($this->message[$pos]['cdata']) ? $this->message[$pos]['cdata'] : ''; + if (isset($this->message[$pos]['type'])) { + return $this->decodeSimple($cdata, $this->message[$pos]['type'], isset($this->message[$pos]['type_namespace']) ? $this->message[$pos]['type_namespace'] : ''); + } + $parent = $this->message[$pos]['parent']; + if (isset($this->message[$parent]['type']) && ($this->message[$parent]['type'] == 'array') && isset($this->message[$parent]['arrayType'])) { + return $this->decodeSimple($cdata, $this->message[$parent]['arrayType'], isset($this->message[$parent]['arrayTypeNamespace']) ? $this->message[$parent]['arrayTypeNamespace'] : ''); + } + return $this->message[$pos]['cdata']; + } + } +} + + + + +?> \ No newline at end of file diff --git a/thirdparty/pear/class.soap_server.php b/thirdparty/pear/class.soap_server.php new file mode 100644 index 000000000..4041242a8 --- /dev/null +++ b/thirdparty/pear/class.soap_server.php @@ -0,0 +1,1038 @@ + +* @version $Id: class.soap_server.php,v 1.48 2005/08/04 01:27:42 snichol Exp $ +* @access public +*/ +class soap_server extends nusoap_base { + /** + * HTTP headers of request + * @var array + * @access private + */ + var $headers = array(); + /** + * HTTP request + * @var string + * @access private + */ + var $request = ''; + /** + * SOAP headers from request (incomplete namespace resolution; special characters not escaped) (text) + * @var string + * @access public + */ + var $requestHeaders = ''; + /** + * SOAP body request portion (incomplete namespace resolution; special characters not escaped) (text) + * @var string + * @access public + */ + var $document = ''; + /** + * SOAP payload for request (text) + * @var string + * @access public + */ + var $requestSOAP = ''; + /** + * requested method namespace URI + * @var string + * @access private + */ + var $methodURI = ''; + /** + * name of method requested + * @var string + * @access private + */ + var $methodname = ''; + /** + * method parameters from request + * @var array + * @access private + */ + var $methodparams = array(); + /** + * SOAP Action from request + * @var string + * @access private + */ + var $SOAPAction = ''; + /** + * character set encoding of incoming (request) messages + * @var string + * @access public + */ + var $xml_encoding = ''; + /** + * toggles whether the parser decodes element content w/ utf8_decode() + * @var boolean + * @access public + */ + var $decode_utf8 = true; + + /** + * HTTP headers of response + * @var array + * @access public + */ + var $outgoing_headers = array(); + /** + * HTTP response + * @var string + * @access private + */ + var $response = ''; + /** + * SOAP headers for response (text) + * @var string + * @access public + */ + var $responseHeaders = ''; + /** + * SOAP payload for response (text) + * @var string + * @access private + */ + var $responseSOAP = ''; + /** + * method return value to place in response + * @var mixed + * @access private + */ + var $methodreturn = false; + /** + * whether $methodreturn is a string of literal XML + * @var boolean + * @access public + */ + var $methodreturnisliteralxml = false; + /** + * SOAP fault for response (or false) + * @var mixed + * @access private + */ + var $fault = false; + /** + * text indication of result (for debugging) + * @var string + * @access private + */ + var $result = 'successful'; + + /** + * assoc array of operations => opData; operations are added by the register() + * method or by parsing an external WSDL definition + * @var array + * @access private + */ + var $operations = array(); + /** + * wsdl instance (if one) + * @var mixed + * @access private + */ + var $wsdl = false; + /** + * URL for WSDL (if one) + * @var mixed + * @access private + */ + var $externalWSDLURL = false; + /** + * whether to append debug to response as XML comment + * @var boolean + * @access public + */ + var $debug_flag = false; + + + /** + * constructor + * the optional parameter is a path to a WSDL file that you'd like to bind the server instance to. + * + * @param mixed $wsdl file path or URL (string), or wsdl instance (object) + * @access public + */ + function soap_server($wsdl=false){ + parent::nusoap_base(); + // turn on debugging? + global $debug; + global $HTTP_SERVER_VARS; + + if (isset($_SERVER)) { + $this->debug("_SERVER is defined:"); + $this->appendDebug($this->varDump($_SERVER)); + } elseif (isset($HTTP_SERVER_VARS)) { + $this->debug("HTTP_SERVER_VARS is defined:"); + $this->appendDebug($this->varDump($HTTP_SERVER_VARS)); + } else { + $this->debug("Neither _SERVER nor HTTP_SERVER_VARS is defined."); + } + + if (isset($debug)) { + $this->debug("In soap_server, set debug_flag=$debug based on global flag"); + $this->debug_flag = $debug; + } elseif (isset($_SERVER['QUERY_STRING'])) { + $qs = explode('&', $_SERVER['QUERY_STRING']); + foreach ($qs as $v) { + if (substr($v, 0, 6) == 'debug=') { + $this->debug("In soap_server, set debug_flag=" . substr($v, 6) . " based on query string #1"); + $this->debug_flag = substr($v, 6); + } + } + } elseif (isset($HTTP_SERVER_VARS['QUERY_STRING'])) { + $qs = explode('&', $HTTP_SERVER_VARS['QUERY_STRING']); + foreach ($qs as $v) { + if (substr($v, 0, 6) == 'debug=') { + $this->debug("In soap_server, set debug_flag=" . substr($v, 6) . " based on query string #2"); + $this->debug_flag = substr($v, 6); + } + } + } + + // wsdl + if($wsdl){ + $this->debug("In soap_server, WSDL is specified"); + if (is_object($wsdl) && (get_class($wsdl) == 'wsdl')) { + $this->wsdl = $wsdl; + $this->externalWSDLURL = $this->wsdl->wsdl; + $this->debug('Use existing wsdl instance from ' . $this->externalWSDLURL); + } else { + $this->debug('Create wsdl from ' . $wsdl); + $this->wsdl = new wsdl($wsdl); + $this->externalWSDLURL = $wsdl; + } + $this->appendDebug($this->wsdl->getDebug()); + $this->wsdl->clearDebug(); + if($err = $this->wsdl->getError()){ + die('WSDL ERROR: '.$err); + } + } + } + + /** + * processes request and returns response + * + * @param string $data usually is the value of $HTTP_RAW_POST_DATA + * @access public + */ + function service($data){ + global $HTTP_SERVER_VARS; + + if (isset($_SERVER['QUERY_STRING'])) { + $qs = $_SERVER['QUERY_STRING']; + } elseif (isset($HTTP_SERVER_VARS['QUERY_STRING'])) { + $qs = $HTTP_SERVER_VARS['QUERY_STRING']; + } else { + $qs = ''; + } + $this->debug("In service, query string=$qs"); + + if (ereg('wsdl', $qs) ){ + $this->debug("In service, this is a request for WSDL"); + if($this->externalWSDLURL){ + if (strpos($this->externalWSDLURL,"://")!==false) { // assume URL + header('Location: '.$this->externalWSDLURL); + } else { // assume file + header("Content-Type: text/xml\r\n"); + $fp = fopen($this->externalWSDLURL, 'r'); + fpassthru($fp); + } + } elseif ($this->wsdl) { + header("Content-Type: text/xml; charset=ISO-8859-1\r\n"); + print $this->wsdl->serialize($this->debug_flag); + if ($this->debug_flag) { + $this->debug('wsdl:'); + $this->appendDebug($this->varDump($this->wsdl)); + print $this->getDebugAsXMLComment(); + } + } else { + header("Content-Type: text/html; charset=ISO-8859-1\r\n"); + print "This service does not provide WSDL"; + } + } elseif ($data == '' && $this->wsdl) { + $this->debug("In service, there is no data, so return Web description"); + print $this->wsdl->webDescription(); + } else { + $this->debug("In service, invoke the request"); + $this->parse_request($data); + if (! $this->fault) { + $this->invoke_method(); + } + if (! $this->fault) { + $this->serialize_return(); + } + $this->send_response(); + } + } + + /** + * parses HTTP request headers. + * + * The following fields are set by this function (when successful) + * + * headers + * request + * xml_encoding + * SOAPAction + * + * @access private + */ + function parse_http_headers() { + global $HTTP_SERVER_VARS; + + $this->request = ''; + $this->SOAPAction = ''; + if(function_exists('getallheaders')){ + $this->debug("In parse_http_headers, use getallheaders"); + $headers = getallheaders(); + foreach($headers as $k=>$v){ + $k = strtolower($k); + $this->headers[$k] = $v; + $this->request .= "$k: $v\r\n"; + $this->debug("$k: $v"); + } + // get SOAPAction header + if(isset($this->headers['soapaction'])){ + $this->SOAPAction = str_replace('"','',$this->headers['soapaction']); + } + // get the character encoding of the incoming request + if(isset($this->headers['content-type']) && strpos($this->headers['content-type'],'=')){ + $enc = str_replace('"','',substr(strstr($this->headers["content-type"],'='),1)); + if(preg_match('/(ISO-8859-1|US-ASCII|UTF-8)/',$enc)){ + $this->xml_encoding = strtoupper($enc); + } else { + $this->xml_encoding = 'US-ASCII'; + } + } else { + // should be US-ASCII for HTTP 1.0 or ISO-8859-1 for HTTP 1.1 + $this->xml_encoding = 'ISO-8859-1'; + } + } elseif(isset($_SERVER) && is_array($_SERVER)){ + $this->debug("In parse_http_headers, use _SERVER"); + foreach ($_SERVER as $k => $v) { + if (substr($k, 0, 5) == 'HTTP_') { + $k = str_replace(' ', '-', strtolower(str_replace('_', ' ', substr($k, 5)))); $k = strtolower(substr($k, 5)); + } else { + $k = str_replace(' ', '-', strtolower(str_replace('_', ' ', $k))); $k = strtolower($k); + } + if ($k == 'soapaction') { + // get SOAPAction header + $k = 'SOAPAction'; + $v = str_replace('"', '', $v); + $v = str_replace('\\', '', $v); + $this->SOAPAction = $v; + } else if ($k == 'content-type') { + // get the character encoding of the incoming request + if (strpos($v, '=')) { + $enc = substr(strstr($v, '='), 1); + $enc = str_replace('"', '', $enc); + $enc = str_replace('\\', '', $enc); + if (preg_match('/(ISO-8859-1|US-ASCII|UTF-8)/', $enc)) { + $this->xml_encoding = strtoupper($enc); + } else { + $this->xml_encoding = 'US-ASCII'; + } + } else { + // should be US-ASCII for HTTP 1.0 or ISO-8859-1 for HTTP 1.1 + $this->xml_encoding = 'ISO-8859-1'; + } + } + $this->headers[$k] = $v; + $this->request .= "$k: $v\r\n"; + $this->debug("$k: $v"); + } + } elseif (is_array($HTTP_SERVER_VARS)) { + $this->debug("In parse_http_headers, use HTTP_SERVER_VARS"); + foreach ($HTTP_SERVER_VARS as $k => $v) { + if (substr($k, 0, 5) == 'HTTP_') { + $k = str_replace(' ', '-', strtolower(str_replace('_', ' ', substr($k, 5)))); $k = strtolower(substr($k, 5)); + } else { + $k = str_replace(' ', '-', strtolower(str_replace('_', ' ', $k))); $k = strtolower($k); + } + if ($k == 'soapaction') { + // get SOAPAction header + $k = 'SOAPAction'; + $v = str_replace('"', '', $v); + $v = str_replace('\\', '', $v); + $this->SOAPAction = $v; + } else if ($k == 'content-type') { + // get the character encoding of the incoming request + if (strpos($v, '=')) { + $enc = substr(strstr($v, '='), 1); + $enc = str_replace('"', '', $enc); + $enc = str_replace('\\', '', $enc); + if (preg_match('/(ISO-8859-1|US-ASCII|UTF-8)/', $enc)) { + $this->xml_encoding = strtoupper($enc); + } else { + $this->xml_encoding = 'US-ASCII'; + } + } else { + // should be US-ASCII for HTTP 1.0 or ISO-8859-1 for HTTP 1.1 + $this->xml_encoding = 'ISO-8859-1'; + } + } + $this->headers[$k] = $v; + $this->request .= "$k: $v\r\n"; + $this->debug("$k: $v"); + } + } else { + $this->debug("In parse_http_headers, HTTP headers not accessible"); + $this->setError("HTTP headers not accessible"); + } + } + + /** + * parses a request + * + * The following fields are set by this function (when successful) + * + * headers + * request + * xml_encoding + * SOAPAction + * request + * requestSOAP + * methodURI + * methodname + * methodparams + * requestHeaders + * document + * + * This sets the fault field on error + * + * @param string $data XML string + * @access private + */ + function parse_request($data='') { + $this->debug('entering parse_request()'); + $this->parse_http_headers(); + $this->debug('got character encoding: '.$this->xml_encoding); + // uncompress if necessary + if (isset($this->headers['content-encoding']) && $this->headers['content-encoding'] != '') { + $this->debug('got content encoding: ' . $this->headers['content-encoding']); + if ($this->headers['content-encoding'] == 'deflate' || $this->headers['content-encoding'] == 'gzip') { + // if decoding works, use it. else assume data wasn't gzencoded + if (function_exists('gzuncompress')) { + if ($this->headers['content-encoding'] == 'deflate' && $degzdata = @gzuncompress($data)) { + $data = $degzdata; + } elseif ($this->headers['content-encoding'] == 'gzip' && $degzdata = gzinflate(substr($data, 10))) { + $data = $degzdata; + } else { + $this->fault('Client', 'Errors occurred when trying to decode the data'); + return; + } + } else { + $this->fault('Client', 'This Server does not support compressed data'); + return; + } + } + } + $this->request .= "\r\n".$data; + $data = $this->parseRequest($this->headers, $data); + $this->requestSOAP = $data; + $this->debug('leaving parse_request'); + } + + /** + * invokes a PHP function for the requested SOAP method + * + * The following fields are set by this function (when successful) + * + * methodreturn + * + * Note that the PHP function that is called may also set the following + * fields to affect the response sent to the client + * + * responseHeaders + * outgoing_headers + * + * This sets the fault field on error + * + * @access private + */ + function invoke_method() { + $this->debug('in invoke_method, methodname=' . $this->methodname . ' methodURI=' . $this->methodURI . ' SOAPAction=' . $this->SOAPAction); + + if ($this->wsdl) { + if ($this->opData = $this->wsdl->getOperationData($this->methodname)) { + $this->debug('in invoke_method, found WSDL operation=' . $this->methodname); + $this->appendDebug('opData=' . $this->varDump($this->opData)); + } elseif ($this->opData = $this->wsdl->getOperationDataForSoapAction($this->SOAPAction)) { + // Note: hopefully this case will only be used for doc/lit, since rpc services should have wrapper element + $this->debug('in invoke_method, found WSDL soapAction=' . $this->SOAPAction . ' for operation=' . $this->opData['name']); + $this->appendDebug('opData=' . $this->varDump($this->opData)); + $this->methodname = $this->opData['name']; + } else { + $this->debug('in invoke_method, no WSDL for operation=' . $this->methodname); + $this->fault('Client', "Operation '" . $this->methodname . "' is not defined in the WSDL for this service"); + return; + } + } else { + $this->debug('in invoke_method, no WSDL to validate method'); + } + + // if a . is present in $this->methodname, we see if there is a class in scope, + // which could be referred to. We will also distinguish between two deliminators, + // to allow methods to be called a the class or an instance + $class = ''; + $method = ''; + if (strpos($this->methodname, '..') > 0) { + $delim = '..'; + } else if (strpos($this->methodname, '.') > 0) { + $delim = '.'; + } else { + $delim = ''; + } + + if (strlen($delim) > 0 && substr_count($this->methodname, $delim) == 1 && + class_exists(substr($this->methodname, 0, strpos($this->methodname, $delim)))) { + // get the class and method name + $class = substr($this->methodname, 0, strpos($this->methodname, $delim)); + $method = substr($this->methodname, strpos($this->methodname, $delim) + strlen($delim)); + $this->debug("in invoke_method, class=$class method=$method delim=$delim"); + } + + // does method exist? + if ($class == '') { + if (!function_exists($this->methodname)) { + $this->debug("in invoke_method, function '$this->methodname' not found!"); + $this->result = 'fault: method not found'; + $this->fault('Client',"method '$this->methodname' not defined in service"); + return; + } + } else { + $method_to_compare = (substr(phpversion(), 0, 2) == '4.') ? strtolower($method) : $method; + if (!in_array($method_to_compare, get_class_methods($class))) { + $this->debug("in invoke_method, method '$this->methodname' not found in class '$class'!"); + $this->result = 'fault: method not found'; + $this->fault('Client',"method '$this->methodname' not defined in service"); + return; + } + } + + // evaluate message, getting back parameters + // verify that request parameters match the method's signature + if(! $this->verify_method($this->methodname,$this->methodparams)){ + // debug + $this->debug('ERROR: request not verified against method signature'); + $this->result = 'fault: request failed validation against method signature'; + // return fault + $this->fault('Client',"Operation '$this->methodname' not defined in service."); + return; + } + + // if there are parameters to pass + $this->debug('in invoke_method, params:'); + $this->appendDebug($this->varDump($this->methodparams)); + $this->debug("in invoke_method, calling '$this->methodname'"); + if (!function_exists('call_user_func_array')) { + if ($class == '') { + $this->debug('in invoke_method, calling function using eval()'); + $funcCall = "\$this->methodreturn = $this->methodname("; + } else { + if ($delim == '..') { + $this->debug('in invoke_method, calling class method using eval()'); + $funcCall = "\$this->methodreturn = ".$class."::".$method."("; + } else { + $this->debug('in invoke_method, calling instance method using eval()'); + // generate unique instance name + $instname = "\$inst_".time(); + $funcCall = $instname." = new ".$class."(); "; + $funcCall .= "\$this->methodreturn = ".$instname."->".$method."("; + } + } + if ($this->methodparams) { + foreach ($this->methodparams as $param) { + if (is_array($param)) { + $this->fault('Client', 'NuSOAP does not handle complexType parameters correctly when using eval; call_user_func_array must be available'); + return; + } + $funcCall .= "\"$param\","; + } + $funcCall = substr($funcCall, 0, -1); + } + $funcCall .= ');'; + $this->debug('in invoke_method, function call: '.$funcCall); + @eval($funcCall); + } else { + if ($class == '') { + $this->debug('in invoke_method, calling function using call_user_func_array()'); + $call_arg = "$this->methodname"; // straight assignment changes $this->methodname to lower case after call_user_func_array() + } elseif ($delim == '..') { + $this->debug('in invoke_method, calling class method using call_user_func_array()'); + $call_arg = array ($class, $method); + } else { + $this->debug('in invoke_method, calling instance method using call_user_func_array()'); + $instance = new $class (); + $call_arg = array(&$instance, $method); + } + $this->methodreturn = call_user_func_array($call_arg, $this->methodparams); + } + $this->debug('in invoke_method, methodreturn:'); + $this->appendDebug($this->varDump($this->methodreturn)); + $this->debug("in invoke_method, called method $this->methodname, received $this->methodreturn of type ".gettype($this->methodreturn)); + } + + /** + * serializes the return value from a PHP function into a full SOAP Envelope + * + * The following fields are set by this function (when successful) + * + * responseSOAP + * + * This sets the fault field on error + * + * @access private + */ + function serialize_return() { + $this->debug('Entering serialize_return methodname: ' . $this->methodname . ' methodURI: ' . $this->methodURI); + // if fault + if (isset($this->methodreturn) && (get_class($this->methodreturn) == 'soap_fault')) { + $this->debug('got a fault object from method'); + $this->fault = $this->methodreturn; + return; + } elseif ($this->methodreturnisliteralxml) { + $return_val = $this->methodreturn; + // returned value(s) + } else { + $this->debug('got a(n) '.gettype($this->methodreturn).' from method'); + $this->debug('serializing return value'); + if($this->wsdl){ + // weak attempt at supporting multiple output params + if(sizeof($this->opData['output']['parts']) > 1){ + $opParams = $this->methodreturn; + } else { + // TODO: is this really necessary? + $opParams = array($this->methodreturn); + } + $return_val = $this->wsdl->serializeRPCParameters($this->methodname,'output',$opParams); + $this->appendDebug($this->wsdl->getDebug()); + $this->wsdl->clearDebug(); + if($errstr = $this->wsdl->getError()){ + $this->debug('got wsdl error: '.$errstr); + $this->fault('Server', 'unable to serialize result'); + return; + } + } else { + if (isset($this->methodreturn)) { + $return_val = $this->serialize_val($this->methodreturn, 'return'); + } else { + $return_val = ''; + $this->debug('in absence of WSDL, assume void return for backward compatibility'); + } + } + } + $this->debug('return value:'); + $this->appendDebug($this->varDump($return_val)); + + $this->debug('serializing response'); + if ($this->wsdl) { + $this->debug('have WSDL for serialization: style is ' . $this->opData['style']); + if ($this->opData['style'] == 'rpc') { + $this->debug('style is rpc for serialization: use is ' . $this->opData['output']['use']); + if ($this->opData['output']['use'] == 'literal') { + $payload = '<'.$this->methodname.'Response xmlns="'.$this->methodURI.'">'.$return_val.'methodname."Response>"; + } else { + $payload = 'methodname.'Response xmlns:ns1="'.$this->methodURI.'">'.$return_val.'methodname."Response>"; + } + } else { + $this->debug('style is not rpc for serialization: assume document'); + $payload = $return_val; + } + } else { + $this->debug('do not have WSDL for serialization: assume rpc/encoded'); + $payload = 'methodname.'Response xmlns:ns1="'.$this->methodURI.'">'.$return_val.'methodname."Response>"; + } + $this->result = 'successful'; + if($this->wsdl){ + //if($this->debug_flag){ + $this->appendDebug($this->wsdl->getDebug()); + // } + if (isset($opData['output']['encodingStyle'])) { + $encodingStyle = $opData['output']['encodingStyle']; + } else { + $encodingStyle = ''; + } + // Added: In case we use a WSDL, return a serialized env. WITH the usedNamespaces. + $this->responseSOAP = $this->serializeEnvelope($payload,$this->responseHeaders,$this->wsdl->usedNamespaces,$this->opData['style'],$encodingStyle); + } else { + $this->responseSOAP = $this->serializeEnvelope($payload,$this->responseHeaders); + } + $this->debug("Leaving serialize_return"); + } + + /** + * sends an HTTP response + * + * The following fields are set by this function (when successful) + * + * outgoing_headers + * response + * + * @access private + */ + function send_response() { + $this->debug('Enter send_response'); + if ($this->fault) { + $payload = $this->fault->serialize(); + $this->outgoing_headers[] = "HTTP/1.0 500 Internal Server Error"; + $this->outgoing_headers[] = "Status: 500 Internal Server Error"; + } else { + $payload = $this->responseSOAP; + // Some combinations of PHP+Web server allow the Status + // to come through as a header. Since OK is the default + // just do nothing. + // $this->outgoing_headers[] = "HTTP/1.0 200 OK"; + // $this->outgoing_headers[] = "Status: 200 OK"; + } + // add debug data if in debug mode + if(isset($this->debug_flag) && $this->debug_flag){ + $payload .= $this->getDebugAsXMLComment(); + } + $this->outgoing_headers[] = "Server: $this->title Server v$this->version"; + ereg('\$Revisio' . 'n: ([^ ]+)', $this->revision, $rev); + $this->outgoing_headers[] = "X-SOAP-Server: $this->title/$this->version (".$rev[1].")"; + // Let the Web server decide about this + //$this->outgoing_headers[] = "Connection: Close\r\n"; + $payload = $this->getHTTPBody($payload); + $type = $this->getHTTPContentType(); + $charset = $this->getHTTPContentTypeCharset(); + $this->outgoing_headers[] = "Content-Type: $type" . ($charset ? '; charset=' . $charset : ''); + //begin code to compress payload - by John + // NOTE: there is no way to know whether the Web server will also compress + // this data. + if (strlen($payload) > 1024 && isset($this->headers) && isset($this->headers['accept-encoding'])) { + if (strstr($this->headers['accept-encoding'], 'gzip')) { + if (function_exists('gzencode')) { + if (isset($this->debug_flag) && $this->debug_flag) { + $payload .= ""; + } + $this->outgoing_headers[] = "Content-Encoding: gzip"; + $payload = gzencode($payload); + } else { + if (isset($this->debug_flag) && $this->debug_flag) { + $payload .= ""; + } + } + } elseif (strstr($this->headers['accept-encoding'], 'deflate')) { + // Note: MSIE requires gzdeflate output (no Zlib header and checksum), + // instead of gzcompress output, + // which conflicts with HTTP 1.1 spec (http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.5) + if (function_exists('gzdeflate')) { + if (isset($this->debug_flag) && $this->debug_flag) { + $payload .= ""; + } + $this->outgoing_headers[] = "Content-Encoding: deflate"; + $payload = gzdeflate($payload); + } else { + if (isset($this->debug_flag) && $this->debug_flag) { + $payload .= ""; + } + } + } + } + //end code + $this->outgoing_headers[] = "Content-Length: ".strlen($payload); + reset($this->outgoing_headers); + foreach($this->outgoing_headers as $hdr){ + header($hdr, false); + } + print $payload; + $this->response = join("\r\n",$this->outgoing_headers)."\r\n\r\n".$payload; + } + + /** + * takes the value that was created by parsing the request + * and compares to the method's signature, if available. + * + * @param string $operation The operation to be invoked + * @param array $request The array of parameter values + * @return boolean Whether the operation was found + * @access private + */ + function verify_method($operation,$request){ + if(isset($this->wsdl) && is_object($this->wsdl)){ + if($this->wsdl->getOperationData($operation)){ + return true; + } + } elseif(isset($this->operations[$operation])){ + return true; + } + return false; + } + + /** + * processes SOAP message received from client + * + * @param array $headers The HTTP headers + * @param string $data unprocessed request data from client + * @return mixed value of the message, decoded into a PHP type + * @access private + */ + function parseRequest($headers, $data) { + $this->debug('Entering parseRequest() for data of length ' . strlen($data) . ' and type ' . $headers['content-type']); + if (!strstr($headers['content-type'], 'text/xml')) { + $this->setError('Request not of type text/xml'); + return false; + } + if (strpos($headers['content-type'], '=')) { + $enc = str_replace('"', '', substr(strstr($headers["content-type"], '='), 1)); + $this->debug('Got response encoding: ' . $enc); + if(preg_match('/(ISO-8859-1|US-ASCII|UTF-8)/',$enc)){ + $this->xml_encoding = strtoupper($enc); + } else { + $this->xml_encoding = 'US-ASCII'; + } + } else { + // should be US-ASCII for HTTP 1.0 or ISO-8859-1 for HTTP 1.1 + $this->xml_encoding = 'ISO-8859-1'; + } + $this->debug('Use encoding: ' . $this->xml_encoding . ' when creating soap_parser'); + // parse response, get soap parser obj + $parser = new soap_parser($data,$this->xml_encoding,'',$this->decode_utf8); + // parser debug + $this->debug("parser debug: \n".$parser->getDebug()); + // if fault occurred during message parsing + if($err = $parser->getError()){ + $this->result = 'fault: error in msg parsing: '.$err; + $this->fault('Client',"error in msg parsing:\n".$err); + // else successfully parsed request into soapval object + } else { + // get/set methodname + $this->methodURI = $parser->root_struct_namespace; + $this->methodname = $parser->root_struct_name; + $this->debug('methodname: '.$this->methodname.' methodURI: '.$this->methodURI); + $this->debug('calling parser->get_response()'); + $this->methodparams = $parser->get_response(); + // get SOAP headers + $this->requestHeaders = $parser->getHeaders(); + // add document for doclit support + $this->document = $parser->document; + } + } + + /** + * gets the HTTP body for the current response. + * + * @param string $soapmsg The SOAP payload + * @return string The HTTP body, which includes the SOAP payload + * @access private + */ + function getHTTPBody($soapmsg) { + return $soapmsg; + } + + /** + * gets the HTTP content type for the current response. + * + * Note: getHTTPBody must be called before this. + * + * @return string the HTTP content type for the current response. + * @access private + */ + function getHTTPContentType() { + return 'text/xml'; + } + + /** + * gets the HTTP content type charset for the current response. + * returns false for non-text content types. + * + * Note: getHTTPBody must be called before this. + * + * @return string the HTTP content type charset for the current response. + * @access private + */ + function getHTTPContentTypeCharset() { + return $this->soap_defencoding; + } + + /** + * add a method to the dispatch map (this has been replaced by the register method) + * + * @param string $methodname + * @param string $in array of input values + * @param string $out array of output values + * @access public + * @deprecated + */ + function add_to_map($methodname,$in,$out){ + $this->operations[$methodname] = array('name' => $methodname,'in' => $in,'out' => $out); + } + + /** + * register a service function with the server + * + * @param string $name the name of the PHP function, class.method or class..method + * @param array $in assoc array of input values: key = param name, value = param type + * @param array $out assoc array of output values: key = param name, value = param type + * @param mixed $namespace the element namespace for the method or false + * @param mixed $soapaction the soapaction for the method or false + * @param mixed $style optional (rpc|document) or false Note: when 'document' is specified, parameter and return wrappers are created for you automatically + * @param mixed $use optional (encoded|literal) or false + * @param string $documentation optional Description to include in WSDL + * @param string $encodingStyle optional (usually 'http://schemas.xmlsoap.org/soap/encoding/' for encoded) + * @access public + */ + function register($name,$in=array(),$out=array(),$namespace=false,$soapaction=false,$style=false,$use=false,$documentation='',$encodingStyle=''){ + global $HTTP_SERVER_VARS; + + if($this->externalWSDLURL){ + die('You cannot bind to an external WSDL file, and register methods outside of it! Please choose either WSDL or no WSDL.'); + } + if (! $name) { + die('You must specify a name when you register an operation'); + } + if (!is_array($in)) { + die('You must provide an array for operation inputs'); + } + if (!is_array($out)) { + die('You must provide an array for operation outputs'); + } + if(false == $namespace) { + } + if(false == $soapaction) { + if (isset($_SERVER)) { + $SERVER_NAME = $_SERVER['SERVER_NAME']; + $SCRIPT_NAME = isset($_SERVER['PHP_SELF']) ? $_SERVER['PHP_SELF'] : $_SERVER['SCRIPT_NAME']; + } elseif (isset($HTTP_SERVER_VARS)) { + $SERVER_NAME = $HTTP_SERVER_VARS['SERVER_NAME']; + $SCRIPT_NAME = isset($HTTP_SERVER_VARS['PHP_SELF']) ? $HTTP_SERVER_VARS['PHP_SELF'] : $HTTP_SERVER_VARS['SCRIPT_NAME']; + } else { + $this->setError("Neither _SERVER nor HTTP_SERVER_VARS is available"); + } + $soapaction = "http://$SERVER_NAME$SCRIPT_NAME/$name"; + } + if(false == $style) { + $style = "rpc"; + } + if(false == $use) { + $use = "encoded"; + } + if ($use == 'encoded' && $encodingStyle = '') { + $encodingStyle = 'http://schemas.xmlsoap.org/soap/encoding/'; + } + + $this->operations[$name] = array( + 'name' => $name, + 'in' => $in, + 'out' => $out, + 'namespace' => $namespace, + 'soapaction' => $soapaction, + 'style' => $style); + if($this->wsdl){ + $this->wsdl->addOperation($name,$in,$out,$namespace,$soapaction,$style,$use,$documentation,$encodingStyle); + } + return true; + } + + /** + * Specify a fault to be returned to the client. + * This also acts as a flag to the server that a fault has occured. + * + * @param string $faultcode + * @param string $faultstring + * @param string $faultactor + * @param string $faultdetail + * @access public + */ + function fault($faultcode,$faultstring,$faultactor='',$faultdetail=''){ + if ($faultdetail == '' && $this->debug_flag) { + $faultdetail = $this->getDebug(); + } + $this->fault = new soap_fault($faultcode,$faultactor,$faultstring,$faultdetail); + $this->fault->soap_defencoding = $this->soap_defencoding; + } + + /** + * Sets up wsdl object. + * Acts as a flag to enable internal WSDL generation + * + * @param string $serviceName, name of the service + * @param mixed $namespace optional 'tns' service namespace or false + * @param mixed $endpoint optional URL of service endpoint or false + * @param string $style optional (rpc|document) WSDL style (also specified by operation) + * @param string $transport optional SOAP transport + * @param mixed $schemaTargetNamespace optional 'types' targetNamespace for service schema or false + */ + function configureWSDL($serviceName,$namespace = false,$endpoint = false,$style='rpc', $transport = 'http://schemas.xmlsoap.org/soap/http', $schemaTargetNamespace = false) + { + global $HTTP_SERVER_VARS; + + if (isset($_SERVER)) { + $SERVER_NAME = $_SERVER['SERVER_NAME']; + $SERVER_PORT = $_SERVER['SERVER_PORT']; + $SCRIPT_NAME = isset($_SERVER['PHP_SELF']) ? $_SERVER['PHP_SELF'] : $_SERVER['SCRIPT_NAME']; + $HTTPS = $_SERVER['HTTPS']; + } elseif (isset($HTTP_SERVER_VARS)) { + $SERVER_NAME = $HTTP_SERVER_VARS['SERVER_NAME']; + $SERVER_PORT = $HTTP_SERVER_VARS['SERVER_PORT']; + $SCRIPT_NAME = isset($HTTP_SERVER_VARS['PHP_SELF']) ? $HTTP_SERVER_VARS['PHP_SELF'] : $HTTP_SERVER_VARS['SCRIPT_NAME']; + $HTTPS = $HTTP_SERVER_VARS['HTTPS']; + } else { + $this->setError("Neither _SERVER nor HTTP_SERVER_VARS is available"); + } + if ($SERVER_PORT == 80) { + $SERVER_PORT = ''; + } else { + $SERVER_PORT = ':' . $SERVER_PORT; + } + if(false == $namespace) { + $namespace = "http://$SERVER_NAME/soap/$serviceName"; + } + + if(false == $endpoint) { + if ($HTTPS == '1' || $HTTPS == 'on') { + $SCHEME = 'https'; + } else { + $SCHEME = 'http'; + } + $endpoint = "$SCHEME://$SERVER_NAME$SERVER_PORT$SCRIPT_NAME"; + } + + if(false == $schemaTargetNamespace) { + $schemaTargetNamespace = $namespace; + } + + $this->wsdl = new wsdl; + $this->wsdl->serviceName = $serviceName; + $this->wsdl->endpoint = $endpoint; + $this->wsdl->namespaces['tns'] = $namespace; + $this->wsdl->namespaces['soap'] = 'http://schemas.xmlsoap.org/wsdl/soap/'; + $this->wsdl->namespaces['wsdl'] = 'http://schemas.xmlsoap.org/wsdl/'; + if ($schemaTargetNamespace != $namespace) { + $this->wsdl->namespaces['types'] = $schemaTargetNamespace; + } + $this->wsdl->schemas[$schemaTargetNamespace][0] = new xmlschema('', '', $this->wsdl->namespaces); + $this->wsdl->schemas[$schemaTargetNamespace][0]->schemaTargetNamespace = $schemaTargetNamespace; + $this->wsdl->schemas[$schemaTargetNamespace][0]->imports['http://schemas.xmlsoap.org/soap/encoding/'][0] = array('location' => '', 'loaded' => true); + $this->wsdl->schemas[$schemaTargetNamespace][0]->imports['http://schemas.xmlsoap.org/wsdl/'][0] = array('location' => '', 'loaded' => true); + $this->wsdl->bindings[$serviceName.'Binding'] = array( + 'name'=>$serviceName.'Binding', + 'style'=>$style, + 'transport'=>$transport, + 'portType'=>$serviceName.'PortType'); + $this->wsdl->ports[$serviceName.'Port'] = array( + 'binding'=>$serviceName.'Binding', + 'location'=>$endpoint, + 'bindingType'=>'http://schemas.xmlsoap.org/wsdl/soap/'); + } +} + + + + +?> \ No newline at end of file diff --git a/thirdparty/pear/class.soap_transport_http.php b/thirdparty/pear/class.soap_transport_http.php new file mode 100644 index 000000000..aab485644 --- /dev/null +++ b/thirdparty/pear/class.soap_transport_http.php @@ -0,0 +1,1038 @@ + +* @version $Id: class.soap_transport_http.php,v 1.57 2005/07/27 19:24:42 snichol Exp $ +* @access public +*/ +class soap_transport_http extends nusoap_base { + + var $url = ''; + var $uri = ''; + var $digest_uri = ''; + var $scheme = ''; + var $host = ''; + var $port = ''; + var $path = ''; + var $request_method = 'POST'; + var $protocol_version = '1.0'; + var $encoding = ''; + var $outgoing_headers = array(); + var $incoming_headers = array(); + var $incoming_cookies = array(); + var $outgoing_payload = ''; + var $incoming_payload = ''; + var $useSOAPAction = true; + var $persistentConnection = false; + var $ch = false; // cURL handle + var $username = ''; + var $password = ''; + var $authtype = ''; + var $digestRequest = array(); + var $certRequest = array(); // keys must be cainfofile (optional), sslcertfile, sslkeyfile, passphrase, verifypeer (optional), verifyhost (optional) + // cainfofile: certificate authority file, e.g. '$pathToPemFiles/rootca.pem' + // sslcertfile: SSL certificate file, e.g. '$pathToPemFiles/mycert.pem' + // sslkeyfile: SSL key file, e.g. '$pathToPemFiles/mykey.pem' + // passphrase: SSL key password/passphrase + // verifypeer: default is 1 + // verifyhost: default is 1 + + /** + * constructor + */ + function soap_transport_http($url){ + parent::nusoap_base(); + $this->setURL($url); + ereg('\$Revisio' . 'n: ([^ ]+)', $this->revision, $rev); + $this->outgoing_headers['User-Agent'] = $this->title.'/'.$this->version.' ('.$rev[1].')'; + $this->debug('set User-Agent: ' . $this->outgoing_headers['User-Agent']); + } + + function setURL($url) { + $this->url = $url; + + $u = parse_url($url); + foreach($u as $k => $v){ + $this->debug("$k = $v"); + $this->$k = $v; + } + + // add any GET params to path + if(isset($u['query']) && $u['query'] != ''){ + $this->path .= '?' . $u['query']; + } + + // set default port + if(!isset($u['port'])){ + if($u['scheme'] == 'https'){ + $this->port = 443; + } else { + $this->port = 80; + } + } + + $this->uri = $this->path; + $this->digest_uri = $this->uri; + + // build headers + if (!isset($u['port'])) { + $this->outgoing_headers['Host'] = $this->host; + } else { + $this->outgoing_headers['Host'] = $this->host.':'.$this->port; + } + $this->debug('set Host: ' . $this->outgoing_headers['Host']); + + if (isset($u['user']) && $u['user'] != '') { + $this->setCredentials(urldecode($u['user']), isset($u['pass']) ? urldecode($u['pass']) : ''); + } + } + + function connect($connection_timeout=0,$response_timeout=30){ + // For PHP 4.3 with OpenSSL, change https scheme to ssl, then treat like + // "regular" socket. + // TODO: disabled for now because OpenSSL must be *compiled* in (not just + // loaded), and until PHP5 stream_get_wrappers is not available. +// if ($this->scheme == 'https') { +// if (version_compare(phpversion(), '4.3.0') >= 0) { +// if (extension_loaded('openssl')) { +// $this->scheme = 'ssl'; +// $this->debug('Using SSL over OpenSSL'); +// } +// } +// } + $this->debug("connect connection_timeout $connection_timeout, response_timeout $response_timeout, scheme $this->scheme, host $this->host, port $this->port"); + if ($this->scheme == 'http' || $this->scheme == 'ssl') { + // use persistent connection + if($this->persistentConnection && isset($this->fp) && is_resource($this->fp)){ + if (!feof($this->fp)) { + $this->debug('Re-use persistent connection'); + return true; + } + fclose($this->fp); + $this->debug('Closed persistent connection at EOF'); + } + + // munge host if using OpenSSL + if ($this->scheme == 'ssl') { + $host = 'ssl://' . $this->host; + } else { + $host = $this->host; + } + $this->debug('calling fsockopen with host ' . $host . ' connection_timeout ' . $connection_timeout); + + // open socket + if($connection_timeout > 0){ + $this->fp = @fsockopen( $host, $this->port, $this->errno, $this->error_str, $connection_timeout); + } else { + $this->fp = @fsockopen( $host, $this->port, $this->errno, $this->error_str); + } + + // test pointer + if(!$this->fp) { + $msg = 'Couldn\'t open socket connection to server ' . $this->url; + if ($this->errno) { + $msg .= ', Error ('.$this->errno.'): '.$this->error_str; + } else { + $msg .= ' prior to connect(). This is often a problem looking up the host name.'; + } + $this->debug($msg); + $this->setError($msg); + return false; + } + + // set response timeout + $this->debug('set response timeout to ' . $response_timeout); + socket_set_timeout( $this->fp, $response_timeout); + + $this->debug('socket connected'); + return true; + } else if ($this->scheme == 'https') { + if (!extension_loaded('curl')) { + $this->setError('CURL Extension, or OpenSSL extension w/ PHP version >= 4.3 is required for HTTPS'); + return false; + } + $this->debug('connect using https'); + // init CURL + $this->ch = curl_init(); + // set url + $hostURL = ($this->port != '') ? "https://$this->host:$this->port" : "https://$this->host"; + // add path + $hostURL .= $this->path; + curl_setopt($this->ch, CURLOPT_URL, $hostURL); + // follow location headers (re-directs) + curl_setopt($this->ch, CURLOPT_FOLLOWLOCATION, 1); + // ask for headers in the response output + curl_setopt($this->ch, CURLOPT_HEADER, 1); + // ask for the response output as the return value + curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, 1); + // encode + // We manage this ourselves through headers and encoding +// if(function_exists('gzuncompress')){ +// curl_setopt($this->ch, CURLOPT_ENCODING, 'deflate'); +// } + // persistent connection + if ($this->persistentConnection) { + // The way we send data, we cannot use persistent connections, since + // there will be some "junk" at the end of our request. + //curl_setopt($this->ch, CURL_HTTP_VERSION_1_1, true); + $this->persistentConnection = false; + $this->outgoing_headers['Connection'] = 'close'; + $this->debug('set Connection: ' . $this->outgoing_headers['Connection']); + } + // set timeout + if ($connection_timeout != 0) { + curl_setopt($this->ch, CURLOPT_TIMEOUT, $connection_timeout); + } + // TODO: cURL has added a connection timeout separate from the response timeout + //if ($connection_timeout != 0) { + // curl_setopt($this->ch, CURLOPT_CONNECTIONTIMEOUT, $connection_timeout); + //} + //if ($response_timeout != 0) { + // curl_setopt($this->ch, CURLOPT_TIMEOUT, $response_timeout); + //} + + // recent versions of cURL turn on peer/host checking by default, + // while PHP binaries are not compiled with a default location for the + // CA cert bundle, so disable peer/host checking. +//curl_setopt($this->ch, CURLOPT_CAINFO, 'f:\php-4.3.2-win32\extensions\curl-ca-bundle.crt'); + curl_setopt($this->ch, CURLOPT_SSL_VERIFYPEER, 0); + curl_setopt($this->ch, CURLOPT_SSL_VERIFYHOST, 0); + + // support client certificates (thanks Tobias Boes, Doug Anarino, Eryan Ariobowo) + if ($this->authtype == 'certificate') { + if (isset($this->certRequest['cainfofile'])) { + curl_setopt($this->ch, CURLOPT_CAINFO, $this->certRequest['cainfofile']); + } + if (isset($this->certRequest['verifypeer'])) { + curl_setopt($this->ch, CURLOPT_SSL_VERIFYPEER, $this->certRequest['verifypeer']); + } else { + curl_setopt($this->ch, CURLOPT_SSL_VERIFYPEER, 1); + } + if (isset($this->certRequest['verifyhost'])) { + curl_setopt($this->ch, CURLOPT_SSL_VERIFYHOST, $this->certRequest['verifyhost']); + } else { + curl_setopt($this->ch, CURLOPT_SSL_VERIFYHOST, 1); + } + if (isset($this->certRequest['sslcertfile'])) { + curl_setopt($this->ch, CURLOPT_SSLCERT, $this->certRequest['sslcertfile']); + } + if (isset($this->certRequest['sslkeyfile'])) { + curl_setopt($this->ch, CURLOPT_SSLKEY, $this->certRequest['sslkeyfile']); + } + if (isset($this->certRequest['passphrase'])) { + curl_setopt($this->ch, CURLOPT_SSLKEYPASSWD , $this->certRequest['passphrase']); + } + } + $this->debug('cURL connection set up'); + return true; + } else { + $this->setError('Unknown scheme ' . $this->scheme); + $this->debug('Unknown scheme ' . $this->scheme); + return false; + } + } + + /** + * send the SOAP message via HTTP + * + * @param string $data message data + * @param integer $timeout set connection timeout in seconds + * @param integer $response_timeout set response timeout in seconds + * @param array $cookies cookies to send + * @return string data + * @access public + */ + function send($data, $timeout=0, $response_timeout=30, $cookies=NULL) { + + $this->debug('entered send() with data of length: '.strlen($data)); + + $this->tryagain = true; + $tries = 0; + while ($this->tryagain) { + $this->tryagain = false; + if ($tries++ < 2) { + // make connnection + if (!$this->connect($timeout, $response_timeout)){ + return false; + } + + // send request + if (!$this->sendRequest($data, $cookies)){ + return false; + } + + // get response + $respdata = $this->getResponse(); + } else { + $this->setError('Too many tries to get an OK response'); + } + } + $this->debug('end of send()'); + return $respdata; + } + + + /** + * send the SOAP message via HTTPS 1.0 using CURL + * + * @param string $msg message data + * @param integer $timeout set connection timeout in seconds + * @param integer $response_timeout set response timeout in seconds + * @param array $cookies cookies to send + * @return string data + * @access public + */ + function sendHTTPS($data, $timeout=0, $response_timeout=30, $cookies) { + return $this->send($data, $timeout, $response_timeout, $cookies); + } + + /** + * if authenticating, set user credentials here + * + * @param string $username + * @param string $password + * @param string $authtype (basic, digest, certificate) + * @param array $digestRequest (keys must be nonce, nc, realm, qop) + * @param array $certRequest (keys must be cainfofile (optional), sslcertfile, sslkeyfile, passphrase, verifypeer (optional), verifyhost (optional): see corresponding options in cURL docs) + * @access public + */ + function setCredentials($username, $password, $authtype = 'basic', $digestRequest = array(), $certRequest = array()) { + $this->debug("Set credentials for authtype $authtype"); + // cf. RFC 2617 + if ($authtype == 'basic') { + $this->outgoing_headers['Authorization'] = 'Basic '.base64_encode(str_replace(':','',$username).':'.$password); + } elseif ($authtype == 'digest') { + if (isset($digestRequest['nonce'])) { + $digestRequest['nc'] = isset($digestRequest['nc']) ? $digestRequest['nc']++ : 1; + + // calculate the Digest hashes (calculate code based on digest implementation found at: http://www.rassoc.com/gregr/weblog/stories/2002/07/09/webServicesSecurityHttpDigestAuthenticationWithoutActiveDirectory.html) + + // A1 = unq(username-value) ":" unq(realm-value) ":" passwd + $A1 = $username. ':' . (isset($digestRequest['realm']) ? $digestRequest['realm'] : '') . ':' . $password; + + // H(A1) = MD5(A1) + $HA1 = G::encryptOld($A1); + + // A2 = Method ":" digest-uri-value + $A2 = 'POST:' . $this->digest_uri; + + // H(A2) + $HA2 = G::encryptOld($A2); + + // KD(secret, data) = H(concat(secret, ":", data)) + // if qop == auth: + // request-digest = <"> < KD ( H(A1), unq(nonce-value) + // ":" nc-value + // ":" unq(cnonce-value) + // ":" unq(qop-value) + // ":" H(A2) + // ) <"> + // if qop is missing, + // request-digest = <"> < KD ( H(A1), unq(nonce-value) ":" H(A2) ) > <"> + + $unhashedDigest = ''; + $nonce = isset($digestRequest['nonce']) ? $digestRequest['nonce'] : ''; + $cnonce = $nonce; + if ($digestRequest['qop'] != '') { + $unhashedDigest = $HA1 . ':' . $nonce . ':' . sprintf("%08d", $digestRequest['nc']) . ':' . $cnonce . ':' . $digestRequest['qop'] . ':' . $HA2; + } else { + $unhashedDigest = $HA1 . ':' . $nonce . ':' . $HA2; + } + + $hashedDigest = G::encryptOld($unhashedDigest); + + $this->outgoing_headers['Authorization'] = 'Digest username="' . $username . '", realm="' . $digestRequest['realm'] . '", nonce="' . $nonce . '", uri="' . $this->digest_uri . '", cnonce="' . $cnonce . '", nc=' . sprintf("%08x", $digestRequest['nc']) . ', qop="' . $digestRequest['qop'] . '", response="' . $hashedDigest . '"'; + } + } elseif ($authtype == 'certificate') { + $this->certRequest = $certRequest; + } + $this->username = $username; + $this->password = $password; + $this->authtype = $authtype; + $this->digestRequest = $digestRequest; + + if (isset($this->outgoing_headers['Authorization'])) { + $this->debug('set Authorization: ' . substr($this->outgoing_headers['Authorization'], 0, 12) . '...'); + } else { + $this->debug('Authorization header not set'); + } + } + + /** + * set the soapaction value + * + * @param string $soapaction + * @access public + */ + function setSOAPAction($soapaction) { + $this->outgoing_headers['SOAPAction'] = '"' . $soapaction . '"'; + $this->debug('set SOAPAction: ' . $this->outgoing_headers['SOAPAction']); + } + + /** + * use http encoding + * + * @param string $enc encoding style. supported values: gzip, deflate, or both + * @access public + */ + function setEncoding($enc='gzip, deflate') { + if (function_exists('gzdeflate')) { + $this->protocol_version = '1.1'; + $this->outgoing_headers['Accept-Encoding'] = $enc; + $this->debug('set Accept-Encoding: ' . $this->outgoing_headers['Accept-Encoding']); + if (!isset($this->outgoing_headers['Connection'])) { + $this->outgoing_headers['Connection'] = 'close'; + $this->persistentConnection = false; + $this->debug('set Connection: ' . $this->outgoing_headers['Connection']); + } + set_magic_quotes_runtime(0); + // deprecated + $this->encoding = $enc; + } + } + + /** + * set proxy info here + * + * @param string $proxyhost + * @param string $proxyport + * @param string $proxyusername + * @param string $proxypassword + * @access public + */ + function setProxy($proxyhost, $proxyport, $proxyusername = '', $proxypassword = '') { + $this->uri = $this->url; + $this->host = $proxyhost; + $this->port = $proxyport; + if ($proxyusername != '' && $proxypassword != '') { + $this->outgoing_headers['Proxy-Authorization'] = ' Basic '.base64_encode($proxyusername.':'.$proxypassword); + $this->debug('set Proxy-Authorization: ' . $this->outgoing_headers['Proxy-Authorization']); + } + } + + /** + * decode a string that is encoded w/ "chunked' transfer encoding + * as defined in RFC2068 19.4.6 + * + * @param string $buffer + * @param string $lb + * @returns string + * @access public + * @deprecated + */ + function decodeChunked($buffer, $lb){ + // length := 0 + $length = 0; + $new = ''; + + // read chunk-size, chunk-extension (if any) and CRLF + // get the position of the linebreak + $chunkend = strpos($buffer, $lb); + if ($chunkend == FALSE) { + $this->debug('no linebreak found in decodeChunked'); + return $new; + } + $temp = substr($buffer,0,$chunkend); + $chunk_size = hexdec( trim($temp) ); + $chunkstart = $chunkend + strlen($lb); + // while (chunk-size > 0) { + while ($chunk_size > 0) { + $this->debug("chunkstart: $chunkstart chunk_size: $chunk_size"); + $chunkend = strpos( $buffer, $lb, $chunkstart + $chunk_size); + + // Just in case we got a broken connection + if ($chunkend == FALSE) { + $chunk = substr($buffer,$chunkstart); + // append chunk-data to entity-body + $new .= $chunk; + $length += strlen($chunk); + break; + } + + // read chunk-data and CRLF + $chunk = substr($buffer,$chunkstart,$chunkend-$chunkstart); + // append chunk-data to entity-body + $new .= $chunk; + // length := length + chunk-size + $length += strlen($chunk); + // read chunk-size and CRLF + $chunkstart = $chunkend + strlen($lb); + + $chunkend = strpos($buffer, $lb, $chunkstart) + strlen($lb); + if ($chunkend == FALSE) { + break; //Just in case we got a broken connection + } + $temp = substr($buffer,$chunkstart,$chunkend-$chunkstart); + $chunk_size = hexdec( trim($temp) ); + $chunkstart = $chunkend; + } + return $new; + } + + /* + * Writes payload, including HTTP headers, to $this->outgoing_payload. + */ + function buildPayload($data, $cookie_str = '') { + // add content-length header + $this->outgoing_headers['Content-Length'] = strlen($data); + $this->debug('set Content-Length: ' . $this->outgoing_headers['Content-Length']); + + // start building outgoing payload: + $req = "$this->request_method $this->uri HTTP/$this->protocol_version"; + $this->debug("HTTP request: $req"); + $this->outgoing_payload = "$req\r\n"; + + // loop thru headers, serializing + foreach($this->outgoing_headers as $k => $v){ + $hdr = $k.': '.$v; + $this->debug("HTTP header: $hdr"); + $this->outgoing_payload .= "$hdr\r\n"; + } + + // add any cookies + if ($cookie_str != '') { + $hdr = 'Cookie: '.$cookie_str; + $this->debug("HTTP header: $hdr"); + $this->outgoing_payload .= "$hdr\r\n"; + } + + // header/body separator + $this->outgoing_payload .= "\r\n"; + + // add data + $this->outgoing_payload .= $data; + } + + function sendRequest($data, $cookies = NULL) { + // build cookie string + $cookie_str = $this->getCookiesForRequest($cookies, (($this->scheme == 'ssl') || ($this->scheme == 'https'))); + + // build payload + $this->buildPayload($data, $cookie_str); + + if ($this->scheme == 'http' || $this->scheme == 'ssl') { + // send payload + if(!fputs($this->fp, $this->outgoing_payload, strlen($this->outgoing_payload))) { + $this->setError('couldn\'t write message data to socket'); + $this->debug('couldn\'t write message data to socket'); + return false; + } + $this->debug('wrote data to socket, length = ' . strlen($this->outgoing_payload)); + return true; + } else if ($this->scheme == 'https') { + // set payload + // TODO: cURL does say this should only be the verb, and in fact it + // turns out that the URI and HTTP version are appended to this, which + // some servers refuse to work with + //curl_setopt($this->ch, CURLOPT_CUSTOMREQUEST, $this->outgoing_payload); + foreach($this->outgoing_headers as $k => $v){ + $curl_headers[] = "$k: $v"; + } + if ($cookie_str != '') { + $curl_headers[] = 'Cookie: ' . $cookie_str; + } + curl_setopt($this->ch, CURLOPT_HTTPHEADER, $curl_headers); + if ($this->request_method == "POST") { + curl_setopt($this->ch, CURLOPT_POST, 1); + curl_setopt($this->ch, CURLOPT_POSTFIELDS, $data); + } else { + } + $this->debug('set cURL payload'); + return true; + } + } + + function getResponse(){ + $this->incoming_payload = ''; + + if ($this->scheme == 'http' || $this->scheme == 'ssl') { + // loop until headers have been retrieved + $data = ''; + while (!isset($lb)){ + + // We might EOF during header read. + if(feof($this->fp)) { + $this->incoming_payload = $data; + $this->debug('found no headers before EOF after length ' . strlen($data)); + $this->debug("received before EOF:\n" . $data); + $this->setError('server failed to send headers'); + return false; + } + + $tmp = fgets($this->fp, 256); + $tmplen = strlen($tmp); + $this->debug("read line of $tmplen bytes: " . trim($tmp)); + + if ($tmplen == 0) { + $this->incoming_payload = $data; + $this->debug('socket read of headers timed out after length ' . strlen($data)); + $this->debug("read before timeout: " . $data); + $this->setError('socket read of headers timed out'); + return false; + } + + $data .= $tmp; + $pos = strpos($data,"\r\n\r\n"); + if($pos > 1){ + $lb = "\r\n"; + } else { + $pos = strpos($data,"\n\n"); + if($pos > 1){ + $lb = "\n"; + } + } + // remove 100 header + if(isset($lb) && ereg('^HTTP/1.1 100',$data)){ + unset($lb); + $data = ''; + }// + } + // store header data + $this->incoming_payload .= $data; + $this->debug('found end of headers after length ' . strlen($data)); + // process headers + $header_data = trim(substr($data,0,$pos)); + $header_array = explode($lb,$header_data); + $this->incoming_headers = array(); + $this->incoming_cookies = array(); + foreach($header_array as $header_line){ + $arr = explode(':',$header_line, 2); + if(count($arr) > 1){ + $header_name = strtolower(trim($arr[0])); + $this->incoming_headers[$header_name] = trim($arr[1]); + if ($header_name == 'set-cookie') { + // TODO: allow multiple cookies from parseCookie + $cookie = $this->parseCookie(trim($arr[1])); + if ($cookie) { + $this->incoming_cookies[] = $cookie; + $this->debug('found cookie: ' . $cookie['name'] . ' = ' . $cookie['value']); + } else { + $this->debug('did not find cookie in ' . trim($arr[1])); + } + } + } else if (isset($header_name)) { + // append continuation line to previous header + $this->incoming_headers[$header_name] .= $lb . ' ' . $header_line; + } + } + + // loop until msg has been received + if (isset($this->incoming_headers['transfer-encoding']) && strtolower($this->incoming_headers['transfer-encoding']) == 'chunked') { + $content_length = 2147483647; // ignore any content-length header + $chunked = true; + $this->debug("want to read chunked content"); + } elseif (isset($this->incoming_headers['content-length'])) { + $content_length = $this->incoming_headers['content-length']; + $chunked = false; + $this->debug("want to read content of length $content_length"); + } else { + $content_length = 2147483647; + $chunked = false; + $this->debug("want to read content to EOF"); + } + $data = ''; + do { + if ($chunked) { + $tmp = fgets($this->fp, 256); + $tmplen = strlen($tmp); + $this->debug("read chunk line of $tmplen bytes"); + if ($tmplen == 0) { + $this->incoming_payload = $data; + $this->debug('socket read of chunk length timed out after length ' . strlen($data)); + $this->debug("read before timeout:\n" . $data); + $this->setError('socket read of chunk length timed out'); + return false; + } + $content_length = hexdec(trim($tmp)); + $this->debug("chunk length $content_length"); + } + $strlen = 0; + while (($strlen < $content_length) && (!feof($this->fp))) { + $readlen = min(8192, $content_length - $strlen); + $tmp = fread($this->fp, $readlen); + $tmplen = strlen($tmp); + $this->debug("read buffer of $tmplen bytes"); + if (($tmplen == 0) && (!feof($this->fp))) { + $this->incoming_payload = $data; + $this->debug('socket read of body timed out after length ' . strlen($data)); + $this->debug("read before timeout:\n" . $data); + $this->setError('socket read of body timed out'); + return false; + } + $strlen += $tmplen; + $data .= $tmp; + } + if ($chunked && ($content_length > 0)) { + $tmp = fgets($this->fp, 256); + $tmplen = strlen($tmp); + $this->debug("read chunk terminator of $tmplen bytes"); + if ($tmplen == 0) { + $this->incoming_payload = $data; + $this->debug('socket read of chunk terminator timed out after length ' . strlen($data)); + $this->debug("read before timeout:\n" . $data); + $this->setError('socket read of chunk terminator timed out'); + return false; + } + } + } while ($chunked && ($content_length > 0) && (!feof($this->fp))); + if (feof($this->fp)) { + $this->debug('read to EOF'); + } + $this->debug('read body of length ' . strlen($data)); + $this->incoming_payload .= $data; + $this->debug('received a total of '.strlen($this->incoming_payload).' bytes of data from server'); + + // close filepointer + if( + (isset($this->incoming_headers['connection']) && strtolower($this->incoming_headers['connection']) == 'close') || + (! $this->persistentConnection) || feof($this->fp)){ + fclose($this->fp); + $this->fp = false; + $this->debug('closed socket'); + } + + // connection was closed unexpectedly + if($this->incoming_payload == ''){ + $this->setError('no response from server'); + return false; + } + + // decode transfer-encoding +// if(isset($this->incoming_headers['transfer-encoding']) && strtolower($this->incoming_headers['transfer-encoding']) == 'chunked'){ +// if(!$data = $this->decodeChunked($data, $lb)){ +// $this->setError('Decoding of chunked data failed'); +// return false; +// } + //print "
    \nde-chunked:\n---------------\n$data\n\n---------------\n
    "; + // set decoded payload +// $this->incoming_payload = $header_data.$lb.$lb.$data; +// } + + } else if ($this->scheme == 'https') { + // send and receive + $this->debug('send and receive with cURL'); + $this->incoming_payload = curl_exec($this->ch); + $data = $this->incoming_payload; + + $cErr = curl_error($this->ch); + if ($cErr != '') { + $err = 'cURL ERROR: '.curl_errno($this->ch).': '.$cErr.'
    '; + // TODO: there is a PHP bug that can cause this to SEGV for CURLINFO_CONTENT_TYPE + foreach(curl_getinfo($this->ch) as $k => $v){ + $err .= "$k: $v
    "; + } + $this->debug($err); + $this->setError($err); + curl_close($this->ch); + return false; + } else { + //echo '
    ';
    +			//var_dump(curl_getinfo($this->ch));
    +			//echo '
    '; + } + // close curl + $this->debug('No cURL error, closing cURL'); + curl_close($this->ch); + + // remove 100 header(s) + while (ereg('^HTTP/1.1 100',$data)) { + if ($pos = strpos($data,"\r\n\r\n")) { + $data = ltrim(substr($data,$pos)); + } elseif($pos = strpos($data,"\n\n") ) { + $data = ltrim(substr($data,$pos)); + } + } + + // separate content from HTTP headers + if ($pos = strpos($data,"\r\n\r\n")) { + $lb = "\r\n"; + } elseif( $pos = strpos($data,"\n\n")) { + $lb = "\n"; + } else { + $this->debug('no proper separation of headers and document'); + $this->setError('no proper separation of headers and document'); + return false; + } + $header_data = trim(substr($data,0,$pos)); + $header_array = explode($lb,$header_data); + $data = ltrim(substr($data,$pos)); + $this->debug('found proper separation of headers and document'); + $this->debug('cleaned data, stringlen: '.strlen($data)); + // clean headers + foreach ($header_array as $header_line) { + $arr = explode(':',$header_line,2); + if(count($arr) > 1){ + $header_name = strtolower(trim($arr[0])); + $this->incoming_headers[$header_name] = trim($arr[1]); + if ($header_name == 'set-cookie') { + // TODO: allow multiple cookies from parseCookie + $cookie = $this->parseCookie(trim($arr[1])); + if ($cookie) { + $this->incoming_cookies[] = $cookie; + $this->debug('found cookie: ' . $cookie['name'] . ' = ' . $cookie['value']); + } else { + $this->debug('did not find cookie in ' . trim($arr[1])); + } + } + } else if (isset($header_name)) { + // append continuation line to previous header + $this->incoming_headers[$header_name] .= $lb . ' ' . $header_line; + } + } + } + + $arr = explode(' ', $header_array[0], 3); + $http_version = $arr[0]; + $http_status = intval($arr[1]); + $http_reason = count($arr) > 2 ? $arr[2] : ''; + + // see if we need to resend the request with http digest authentication + if (isset($this->incoming_headers['location']) && $http_status == 301) { + $this->debug("Got 301 $http_reason with Location: " . $this->incoming_headers['location']); + $this->setURL($this->incoming_headers['location']); + $this->tryagain = true; + return false; + } + + // see if we need to resend the request with http digest authentication + if (isset($this->incoming_headers['www-authenticate']) && $http_status == 401) { + $this->debug("Got 401 $http_reason with WWW-Authenticate: " . $this->incoming_headers['www-authenticate']); + if (strstr($this->incoming_headers['www-authenticate'], "Digest ")) { + $this->debug('Server wants digest authentication'); + // remove "Digest " from our elements + $digestString = str_replace('Digest ', '', $this->incoming_headers['www-authenticate']); + + // parse elements into array + $digestElements = explode(',', $digestString); + foreach ($digestElements as $val) { + $tempElement = explode('=', trim($val), 2); + $digestRequest[$tempElement[0]] = str_replace("\"", '', $tempElement[1]); + } + + // should have (at least) qop, realm, nonce + if (isset($digestRequest['nonce'])) { + $this->setCredentials($this->username, $this->password, 'digest', $digestRequest); + $this->tryagain = true; + return false; + } + } + $this->debug('HTTP authentication failed'); + $this->setError('HTTP authentication failed'); + return false; + } + + if ( + ($http_status >= 300 && $http_status <= 307) || + ($http_status >= 400 && $http_status <= 417) || + ($http_status >= 501 && $http_status <= 505) + ) { + $this->setError("Unsupported HTTP response status $http_status $http_reason (soapclient->response has contents of the response)"); + return false; + } + + // decode content-encoding + if(isset($this->incoming_headers['content-encoding']) && $this->incoming_headers['content-encoding'] != ''){ + if(strtolower($this->incoming_headers['content-encoding']) == 'deflate' || strtolower($this->incoming_headers['content-encoding']) == 'gzip'){ + // if decoding works, use it. else assume data wasn't gzencoded + if(function_exists('gzinflate')){ + //$timer->setMarker('starting decoding of gzip/deflated content'); + // IIS 5 requires gzinflate instead of gzuncompress (similar to IE 5 and gzdeflate v. gzcompress) + // this means there are no Zlib headers, although there should be + $this->debug('The gzinflate function exists'); + $datalen = strlen($data); + if ($this->incoming_headers['content-encoding'] == 'deflate') { + if ($degzdata = @gzinflate($data)) { + $data = $degzdata; + $this->debug('The payload has been inflated to ' . strlen($data) . ' bytes'); + if (strlen($data) < $datalen) { + // test for the case that the payload has been compressed twice + $this->debug('The inflated payload is smaller than the gzipped one; try again'); + if ($degzdata = @gzinflate($data)) { + $data = $degzdata; + $this->debug('The payload has been inflated again to ' . strlen($data) . ' bytes'); + } + } + } else { + $this->debug('Error using gzinflate to inflate the payload'); + $this->setError('Error using gzinflate to inflate the payload'); + } + } elseif ($this->incoming_headers['content-encoding'] == 'gzip') { + if ($degzdata = @gzinflate(substr($data, 10))) { // do our best + $data = $degzdata; + $this->debug('The payload has been un-gzipped to ' . strlen($data) . ' bytes'); + if (strlen($data) < $datalen) { + // test for the case that the payload has been compressed twice + $this->debug('The un-gzipped payload is smaller than the gzipped one; try again'); + if ($degzdata = @gzinflate(substr($data, 10))) { + $data = $degzdata; + $this->debug('The payload has been un-gzipped again to ' . strlen($data) . ' bytes'); + } + } + } else { + $this->debug('Error using gzinflate to un-gzip the payload'); + $this->setError('Error using gzinflate to un-gzip the payload'); + } + } + //$timer->setMarker('finished decoding of gzip/deflated content'); + //print "\nde-inflated:\n---------------\n$data\n-------------\n"; + // set decoded payload + $this->incoming_payload = $header_data.$lb.$lb.$data; + } else { + $this->debug('The server sent compressed data. Your php install must have the Zlib extension compiled in to support this.'); + $this->setError('The server sent compressed data. Your php install must have the Zlib extension compiled in to support this.'); + } + } else { + $this->debug('Unsupported Content-Encoding ' . $this->incoming_headers['content-encoding']); + $this->setError('Unsupported Content-Encoding ' . $this->incoming_headers['content-encoding']); + } + } else { + $this->debug('No Content-Encoding header'); + } + + if(strlen($data) == 0){ + $this->debug('no data after headers!'); + $this->setError('no data present after HTTP headers'); + return false; + } + + return $data; + } + + function setContentType($type, $charset = false) { + $this->outgoing_headers['Content-Type'] = $type . ($charset ? '; charset=' . $charset : ''); + $this->debug('set Content-Type: ' . $this->outgoing_headers['Content-Type']); + } + + function usePersistentConnection(){ + if (isset($this->outgoing_headers['Accept-Encoding'])) { + return false; + } + $this->protocol_version = '1.1'; + $this->persistentConnection = true; + $this->outgoing_headers['Connection'] = 'Keep-Alive'; + $this->debug('set Connection: ' . $this->outgoing_headers['Connection']); + return true; + } + + /** + * parse an incoming Cookie into it's parts + * + * @param string $cookie_str content of cookie + * @return array with data of that cookie + * @access private + */ + /* + * TODO: allow a Set-Cookie string to be parsed into multiple cookies + */ + function parseCookie($cookie_str) { + $cookie_str = str_replace('; ', ';', $cookie_str) . ';'; + $data = explode(';', $cookie_str); + $value_str = $data[0]; + + $cookie_param = 'domain='; + $start = strpos($cookie_str, $cookie_param); + if ($start > 0) { + $domain = substr($cookie_str, $start + strlen($cookie_param)); + $domain = substr($domain, 0, strpos($domain, ';')); + } else { + $domain = ''; + } + + $cookie_param = 'expires='; + $start = strpos($cookie_str, $cookie_param); + if ($start > 0) { + $expires = substr($cookie_str, $start + strlen($cookie_param)); + $expires = substr($expires, 0, strpos($expires, ';')); + } else { + $expires = ''; + } + + $cookie_param = 'path='; + $start = strpos($cookie_str, $cookie_param); + if ( $start > 0 ) { + $path = substr($cookie_str, $start + strlen($cookie_param)); + $path = substr($path, 0, strpos($path, ';')); + } else { + $path = '/'; + } + + $cookie_param = ';secure;'; + if (strpos($cookie_str, $cookie_param) !== FALSE) { + $secure = true; + } else { + $secure = false; + } + + $sep_pos = strpos($value_str, '='); + + if ($sep_pos) { + $name = substr($value_str, 0, $sep_pos); + $value = substr($value_str, $sep_pos + 1); + $cookie= array( 'name' => $name, + 'value' => $value, + 'domain' => $domain, + 'path' => $path, + 'expires' => $expires, + 'secure' => $secure + ); + return $cookie; + } + return false; + } + + /** + * sort out cookies for the current request + * + * @param array $cookies array with all cookies + * @param boolean $secure is the send-content secure or not? + * @return string for Cookie-HTTP-Header + * @access private + */ + function getCookiesForRequest($cookies, $secure=false) { + $cookie_str = ''; + if ((! is_null($cookies)) && (is_array($cookies))) { + foreach ($cookies as $cookie) { + if (! is_array($cookie)) { + continue; + } + $this->debug("check cookie for validity: ".$cookie['name'].'='.$cookie['value']); + if ((isset($cookie['expires'])) && (! empty($cookie['expires']))) { + if (strtotime($cookie['expires']) <= time()) { + $this->debug('cookie has expired'); + continue; + } + } + if ((isset($cookie['domain'])) && (! empty($cookie['domain']))) { + $domain = preg_quote($cookie['domain']); + if (! preg_match("'.*$domain$'i", $this->host)) { + $this->debug('cookie has different domain'); + continue; + } + } + if ((isset($cookie['path'])) && (! empty($cookie['path']))) { + $path = preg_quote($cookie['path']); + if (! preg_match("'^$path.*'i", $this->path)) { + $this->debug('cookie is for a different path'); + continue; + } + } + if ((! $secure) && (isset($cookie['secure'])) && ($cookie['secure'])) { + $this->debug('cookie is secure, transport is not'); + continue; + } + $cookie_str .= $cookie['name'] . '=' . $cookie['value'] . '; '; + $this->debug('add cookie to Cookie-String: ' . $cookie['name'] . '=' . $cookie['value']); + } + } + return $cookie_str; + } +} + + +?> diff --git a/thirdparty/pear/class.soap_val.php b/thirdparty/pear/class.soap_val.php new file mode 100644 index 000000000..5a8e12abb --- /dev/null +++ b/thirdparty/pear/class.soap_val.php @@ -0,0 +1,107 @@ + +* @version $Id: class.soap_val.php,v 1.9 2005/07/27 19:24:42 snichol Exp $ +* @access public +*/ +class soapval extends nusoap_base { + /** + * The XML element name + * + * @var string + * @access private + */ + var $name; + /** + * The XML type name (string or false) + * + * @var mixed + * @access private + */ + var $type; + /** + * The PHP value + * + * @var mixed + * @access private + */ + var $value; + /** + * The XML element namespace (string or false) + * + * @var mixed + * @access private + */ + var $element_ns; + /** + * The XML type namespace (string or false) + * + * @var mixed + * @access private + */ + var $type_ns; + /** + * The XML element attributes (array or false) + * + * @var mixed + * @access private + */ + var $attributes; + + /** + * constructor + * + * @param string $name optional name + * @param mixed $type optional type name + * @param mixed $value optional value + * @param mixed $element_ns optional namespace of value + * @param mixed $type_ns optional namespace of type + * @param mixed $attributes associative array of attributes to add to element serialization + * @access public + */ + function soapval($name='soapval',$type=false,$value=-1,$element_ns=false,$type_ns=false,$attributes=false) { + parent::nusoap_base(); + $this->name = $name; + $this->type = $type; + $this->value = $value; + $this->element_ns = $element_ns; + $this->type_ns = $type_ns; + $this->attributes = $attributes; + } + + /** + * return serialized value + * + * @param string $use The WSDL use value (encoded|literal) + * @return string XML data + * @access public + */ + function serialize($use='encoded') { + return $this->serialize_val($this->value,$this->name,$this->type,$this->element_ns,$this->type_ns,$this->attributes,$use); + } + + /** + * decodes a soapval object into a PHP native type + * + * @return mixed + * @access public + */ + function decode(){ + return $this->value; + } +} + + + + +?> \ No newline at end of file diff --git a/thirdparty/pear/class.soapclient.php b/thirdparty/pear/class.soapclient.php new file mode 100644 index 000000000..0d32067a7 --- /dev/null +++ b/thirdparty/pear/class.soapclient.php @@ -0,0 +1,859 @@ +call( string methodname [ ,array parameters] ); +* +* // bye bye client +* unset($soapclient); +* +* @author Dietrich Ayala +* @version $Id: class.soapclient.php,v 1.52 2005/07/27 19:24:42 snichol Exp $ +* @access public +*/ +class soapclient extends nusoap_base { + + var $username = ''; + var $password = ''; + var $authtype = ''; + var $certRequest = array(); + var $requestHeaders = false; // SOAP headers in request (text) + var $responseHeaders = ''; // SOAP headers from response (incomplete namespace resolution) (text) + var $document = ''; // SOAP body response portion (incomplete namespace resolution) (text) + var $endpoint; + var $forceEndpoint = ''; // overrides WSDL endpoint + var $proxyhost = ''; + var $proxyport = ''; + var $proxyusername = ''; + var $proxypassword = ''; + var $xml_encoding = ''; // character set encoding of incoming (response) messages + var $http_encoding = false; + var $timeout = 0; // HTTP connection timeout + var $response_timeout = 30; // HTTP response timeout + var $endpointType = ''; // soap|wsdl, empty for WSDL initialization error + var $persistentConnection = false; + var $defaultRpcParams = false; // This is no longer used + var $request = ''; // HTTP request + var $response = ''; // HTTP response + var $responseData = ''; // SOAP payload of response + var $cookies = array(); // Cookies from response or for request + var $decode_utf8 = true; // toggles whether the parser decodes element content w/ utf8_decode() + var $operations = array(); // WSDL operations, empty for WSDL initialization error + + /* + * fault related variables + */ + /** + * @var fault + * @access public + */ + var $fault; + /** + * @var faultcode + * @access public + */ + var $faultcode; + /** + * @var faultstring + * @access public + */ + var $faultstring; + /** + * @var faultdetail + * @access public + */ + var $faultdetail; + + /** + * constructor + * + * @param mixed $endpoint SOAP server or WSDL URL (string), or wsdl instance (object) + * @param bool $wsdl optional, set to true if using WSDL + * @param int $portName optional portName in WSDL document + * @param string $proxyhost + * @param string $proxyport + * @param string $proxyusername + * @param string $proxypassword + * @param integer $timeout set the connection timeout + * @param integer $response_timeout set the response timeout + * @access public + */ + function soapclient($endpoint,$wsdl = false,$proxyhost = false,$proxyport = false,$proxyusername = false, $proxypassword = false, $timeout = 0, $response_timeout = 30){ + parent::nusoap_base(); + $this->endpoint = $endpoint; + $this->proxyhost = $proxyhost; + $this->proxyport = $proxyport; + $this->proxyusername = $proxyusername; + $this->proxypassword = $proxypassword; + $this->timeout = $timeout; + $this->response_timeout = $response_timeout; + + // make values + if($wsdl){ + if (is_object($endpoint) && (get_class($endpoint) == 'wsdl')) { + $this->wsdl = $endpoint; + $this->endpoint = $this->wsdl->wsdl; + $this->wsdlFile = $this->endpoint; + $this->debug('existing wsdl instance created from ' . $this->endpoint); + } else { + $this->wsdlFile = $this->endpoint; + + // instantiate wsdl object and parse wsdl file + $this->debug('instantiating wsdl class with doc: '.$endpoint); + $this->wsdl =& new wsdl($this->wsdlFile,$this->proxyhost,$this->proxyport,$this->proxyusername,$this->proxypassword,$this->timeout,$this->response_timeout); + } + $this->appendDebug($this->wsdl->getDebug()); + $this->wsdl->clearDebug(); + // catch errors + if($errstr = $this->wsdl->getError()){ + $this->debug('got wsdl error: '.$errstr); + $this->setError('wsdl error: '.$errstr); + } elseif($this->operations = $this->wsdl->getOperations()){ + $this->debug( 'got '.count($this->operations).' operations from wsdl '.$this->wsdlFile); + $this->endpointType = 'wsdl'; + } else { + $this->debug( 'getOperations returned false'); + $this->setError('no operations defined in the WSDL document!'); + } + } else { + $this->debug("instantiate SOAP with endpoint at $endpoint"); + $this->endpointType = 'soap'; + } + } + + /** + * calls method, returns PHP native type + * + * @param string $method SOAP server URL or path + * @param mixed $params An array, associative or simple, of the parameters + * for the method call, or a string that is the XML + * for the call. For rpc style, this call will + * wrap the XML in a tag named after the method, as + * well as the SOAP Envelope and Body. For document + * style, this will only wrap with the Envelope and Body. + * IMPORTANT: when using an array with document style, + * in which case there + * is really one parameter, the root of the fragment + * used in the call, which encloses what programmers + * normally think of parameters. A parameter array + * *must* include the wrapper. + * @param string $namespace optional method namespace (WSDL can override) + * @param string $soapAction optional SOAPAction value (WSDL can override) + * @param mixed $headers optional string of XML with SOAP header content, or array of soapval objects for SOAP headers + * @param boolean $rpcParams optional (no longer used) + * @param string $style optional (rpc|document) the style to use when serializing parameters (WSDL can override) + * @param string $use optional (encoded|literal) the use when serializing parameters (WSDL can override) + * @return mixed response from SOAP call + * @access public + */ + function call($operation,$params=array(),$namespace='http://tempuri.org',$soapAction='',$headers=false,$rpcParams=null,$style='rpc',$use='encoded'){ + $this->operation = $operation; + $this->fault = false; + $this->setError(''); + $this->request = ''; + $this->response = ''; + $this->responseData = ''; + $this->faultstring = ''; + $this->faultcode = ''; + $this->opData = array(); + + $this->debug("call: operation=$operation, namespace=$namespace, soapAction=$soapAction, rpcParams=$rpcParams, style=$style, use=$use, endpointType=$this->endpointType"); + $this->appendDebug('params=' . $this->varDump($params)); + $this->appendDebug('headers=' . $this->varDump($headers)); + if ($headers) { + $this->requestHeaders = $headers; + } + // serialize parameters + if($this->endpointType == 'wsdl' && $opData = $this->getOperationData($operation)){ + // use WSDL for operation + $this->opData = $opData; + $this->debug("found operation"); + $this->appendDebug('opData=' . $this->varDump($opData)); + if (isset($opData['soapAction'])) { + $soapAction = $opData['soapAction']; + } + if (! $this->forceEndpoint) { + $this->endpoint = $opData['endpoint']; + } else { + $this->endpoint = $this->forceEndpoint; + } + $namespace = isset($opData['input']['namespace']) ? $opData['input']['namespace'] : $namespace; + $style = $opData['style']; + $use = $opData['input']['use']; + // add ns to ns array + if($namespace != '' && !isset($this->wsdl->namespaces[$namespace])){ + $nsPrefix = 'ns' . rand(1000, 9999); + $this->wsdl->namespaces[$nsPrefix] = $namespace; + } + $nsPrefix = $this->wsdl->getPrefixFromNamespace($namespace); + // serialize payload + if (is_string($params)) { + $this->debug("serializing param string for WSDL operation $operation"); + $payload = $params; + } elseif (is_array($params)) { + $this->debug("serializing param array for WSDL operation $operation"); + $payload = $this->wsdl->serializeRPCParameters($operation,'input',$params); + } else { + $this->debug('params must be array or string'); + $this->setError('params must be array or string'); + return false; + } + $usedNamespaces = $this->wsdl->usedNamespaces; + if (isset($opData['input']['encodingStyle'])) { + $encodingStyle = $opData['input']['encodingStyle']; + } else { + $encodingStyle = ''; + } + $this->appendDebug($this->wsdl->getDebug()); + $this->wsdl->clearDebug(); + if ($errstr = $this->wsdl->getError()) { + $this->debug('got wsdl error: '.$errstr); + $this->setError('wsdl error: '.$errstr); + return false; + } + } elseif($this->endpointType == 'wsdl') { + // operation not in WSDL + $this->appendDebug($this->wsdl->getDebug()); + $this->wsdl->clearDebug(); + $this->setError( 'operation '.$operation.' not present.'); + $this->debug("operation '$operation' not present."); + return false; + } else { + // no WSDL + //$this->namespaces['ns1'] = $namespace; + $nsPrefix = 'ns' . rand(1000, 9999); + // serialize + $payload = ''; + if (is_string($params)) { + $this->debug("serializing param string for operation $operation"); + $payload = $params; + } elseif (is_array($params)) { + $this->debug("serializing param array for operation $operation"); + foreach($params as $k => $v){ + $payload .= $this->serialize_val($v,$k,false,false,false,false,$use); + } + } else { + $this->debug('params must be array or string'); + $this->setError('params must be array or string'); + return false; + } + $usedNamespaces = array(); + if ($use == 'encoded') { + $encodingStyle = 'http://schemas.xmlsoap.org/soap/encoding/'; + } else { + $encodingStyle = ''; + } + } + // wrap RPC calls with method element + if ($style == 'rpc') { + if ($use == 'literal') { + $this->debug("wrapping RPC request with literal method element"); + if ($namespace) { + $payload = "<$operation xmlns=\"$namespace\">" . $payload . ""; + } else { + $payload = "<$operation>" . $payload . ""; + } + } else { + $this->debug("wrapping RPC request with encoded method element"); + if ($namespace) { + $payload = "<$nsPrefix:$operation xmlns:$nsPrefix=\"$namespace\">" . + $payload . + ""; + } else { + $payload = "<$operation>" . + $payload . + ""; + } + } + } + // serialize envelope + $soapmsg = $this->serializeEnvelope($payload,$this->requestHeaders,$usedNamespaces,$style,$use,$encodingStyle); + $this->debug("endpoint=$this->endpoint, soapAction=$soapAction, namespace=$namespace, style=$style, use=$use, encodingStyle=$encodingStyle"); + $this->debug('SOAP message length=' . strlen($soapmsg) . ' contents (max 1000 bytes)=' . substr($soapmsg, 0, 1000)); + // send + $return = $this->send($this->getHTTPBody($soapmsg),$soapAction,$this->timeout,$this->response_timeout); + if($errstr = $this->getError()){ + $this->debug('Error: '.$errstr); + return false; + } else { + $this->return = $return; + $this->debug('sent message successfully and got a(n) '.gettype($return)); + $this->appendDebug('return=' . $this->varDump($return)); + + // fault? + if(is_array($return) && isset($return['faultcode'])){ + $this->debug('got fault'); + $this->setError($return['faultcode'].': '.$return['faultstring']); + $this->fault = true; + foreach($return as $k => $v){ + $this->$k = $v; + $this->debug("$k = $v
    "); + } + return $return; + } elseif ($style == 'document') { + // NOTE: if the response is defined to have multiple parts (i.e. unwrapped), + // we are only going to return the first part here...sorry about that + return $return; + } else { + // array of return values + if(is_array($return)){ + // multiple 'out' parameters, which we return wrapped up + // in the array + if(sizeof($return) > 1){ + return $return; + } + // single 'out' parameter (normally the return value) + $return = array_shift($return); + $this->debug('return shifted value: '); + $this->appendDebug($this->varDump($return)); + return $return; + // nothing returned (ie, echoVoid) + } else { + return ""; + } + } + } + } + + /** + * get available data pertaining to an operation + * + * @param string $operation operation name + * @return array array of data pertaining to the operation + * @access public + */ + function getOperationData($operation){ + if(isset($this->operations[$operation])){ + return $this->operations[$operation]; + } + $this->debug("No data for operation: $operation"); + } + + /** + * send the SOAP message + * + * Note: if the operation has multiple return values + * the return value of this method will be an array + * of those values. + * + * @param string $msg a SOAPx4 soapmsg object + * @param string $soapaction SOAPAction value + * @param integer $timeout set connection timeout in seconds + * @param integer $response_timeout set response timeout in seconds + * @return mixed native PHP types. + * @access private + */ + function send($msg, $soapaction = '', $timeout=0, $response_timeout=30) { + $this->checkCookies(); + // detect transport + switch(true){ + // http(s) + case ereg('^http',$this->endpoint): + $this->debug('transporting via HTTP'); + if($this->persistentConnection == true && is_object($this->persistentConnection)){ + $http =& $this->persistentConnection; + } else { + $http = new soap_transport_http($this->endpoint); + if ($this->persistentConnection) { + $http->usePersistentConnection(); + } + } + $http->setContentType($this->getHTTPContentType(), $this->getHTTPContentTypeCharset()); + $http->setSOAPAction($soapaction); + if($this->proxyhost && $this->proxyport){ + $http->setProxy($this->proxyhost,$this->proxyport,$this->proxyusername,$this->proxypassword); + } + if($this->authtype != '') { + $http->setCredentials($this->username, $this->password, $this->authtype, array(), $this->certRequest); + } + if($this->http_encoding != ''){ + $http->setEncoding($this->http_encoding); + } + $this->debug('sending message, length='.strlen($msg)); + if(ereg('^http:',$this->endpoint)){ + //if(strpos($this->endpoint,'http:')){ + $this->responseData = $http->send($msg,$timeout,$response_timeout,$this->cookies); + } elseif(ereg('^https',$this->endpoint)){ + //} elseif(strpos($this->endpoint,'https:')){ + //if(phpversion() == '4.3.0-dev'){ + //$response = $http->send($msg,$timeout,$response_timeout); + //$this->request = $http->outgoing_payload; + //$this->response = $http->incoming_payload; + //} else + $this->responseData = $http->sendHTTPS($msg,$timeout,$response_timeout,$this->cookies); + } else { + $this->setError('no http/s in endpoint url'); + } + $this->request = $http->outgoing_payload; + $this->response = $http->incoming_payload; + $this->appendDebug($http->getDebug()); + $this->UpdateCookies($http->incoming_cookies); + + // save transport object if using persistent connections + if ($this->persistentConnection) { + $http->clearDebug(); + if (!is_object($this->persistentConnection)) { + $this->persistentConnection = $http; + } + } + + if($err = $http->getError()){ + $this->setError('HTTP Error: '.$err); + return false; + } elseif($this->getError()){ + return false; + } else { + $this->debug('got response, length='. strlen($this->responseData).' type='.$http->incoming_headers['content-type']); + return $this->parseResponse($http->incoming_headers, $this->responseData); + } + break; + default: + $this->setError('no transport found, or selected transport is not yet supported!'); + return false; + break; + } + } + + /** + * processes SOAP message returned from server + * + * @param array $headers The HTTP headers + * @param string $data unprocessed response data from server + * @return mixed value of the message, decoded into a PHP type + * @access private + */ + function parseResponse($headers, $data) { + $this->debug('Entering parseResponse() for data of length ' . strlen($data) . ' and type ' . $headers['content-type']); + if (!strstr($headers['content-type'], 'text/xml')) { + $this->setError('Response not of type text/xml'); + return false; + } + if (strpos($headers['content-type'], '=')) { + $enc = str_replace('"', '', substr(strstr($headers["content-type"], '='), 1)); + $this->debug('Got response encoding: ' . $enc); + if(preg_match('/(ISO-8859-1|US-ASCII|UTF-8)/',$enc)){ + $this->xml_encoding = strtoupper($enc); + } else { + $this->xml_encoding = 'US-ASCII'; + } + } else { + // should be US-ASCII for HTTP 1.0 or ISO-8859-1 for HTTP 1.1 + $this->xml_encoding = 'ISO-8859-1'; + } + $this->debug('Use encoding: ' . $this->xml_encoding . ' when creating soap_parser'); + $parser = new soap_parser($data,$this->xml_encoding,$this->operation,$this->decode_utf8); + // add parser debug data to our debug + $this->appendDebug($parser->getDebug()); + // if parse errors + if($errstr = $parser->getError()){ + $this->setError( $errstr); + // destroy the parser object + unset($parser); + return false; + } else { + // get SOAP headers + $this->responseHeaders = $parser->getHeaders(); + // get decoded message + $return = $parser->get_response(); + // add document for doclit support + $this->document = $parser->document; + // destroy the parser object + unset($parser); + // return decode message + return $return; + } + } + + /** + * sets the SOAP endpoint, which can override WSDL + * + * @param $endpoint string The endpoint URL to use, or empty string or false to prevent override + * @access public + */ + function setEndpoint($endpoint) { + $this->forceEndpoint = $endpoint; + } + + /** + * set the SOAP headers + * + * @param $headers mixed String of XML with SOAP header content, or array of soapval objects for SOAP headers + * @access public + */ + function setHeaders($headers){ + $this->requestHeaders = $headers; + } + + /** + * get the SOAP response headers (namespace resolution incomplete) + * + * @return string + * @access public + */ + function getHeaders(){ + return $this->responseHeaders; + } + + /** + * set proxy info here + * + * @param string $proxyhost + * @param string $proxyport + * @param string $proxyusername + * @param string $proxypassword + * @access public + */ + function setHTTPProxy($proxyhost, $proxyport, $proxyusername = '', $proxypassword = '') { + $this->proxyhost = $proxyhost; + $this->proxyport = $proxyport; + $this->proxyusername = $proxyusername; + $this->proxypassword = $proxypassword; + } + + /** + * if authenticating, set user credentials here + * + * @param string $username + * @param string $password + * @param string $authtype (basic|digest|certificate) + * @param array $certRequest (keys must be cainfofile (optional), sslcertfile, sslkeyfile, passphrase, verifypeer (optional), verifyhost (optional): see corresponding options in cURL docs) + * @access public + */ + function setCredentials($username, $password, $authtype = 'basic', $certRequest = array()) { + $this->username = $username; + $this->password = $password; + $this->authtype = $authtype; + $this->certRequest = $certRequest; + } + + /** + * use HTTP encoding + * + * @param string $enc + * @access public + */ + function setHTTPEncoding($enc='gzip, deflate'){ + $this->http_encoding = $enc; + } + + /** + * use HTTP persistent connections if possible + * + * @access public + */ + function useHTTPPersistentConnection(){ + $this->persistentConnection = true; + } + + /** + * gets the default RPC parameter setting. + * If true, default is that call params are like RPC even for document style. + * Each call() can override this value. + * + * This is no longer used. + * + * @return boolean + * @access public + * @deprecated + */ + function getDefaultRpcParams() { + return $this->defaultRpcParams; + } + + /** + * sets the default RPC parameter setting. + * If true, default is that call params are like RPC even for document style + * Each call() can override this value. + * + * This is no longer used. + * + * @param boolean $rpcParams + * @access public + * @deprecated + */ + function setDefaultRpcParams($rpcParams) { + $this->defaultRpcParams = $rpcParams; + } + + /** + * dynamically creates an instance of a proxy class, + * allowing user to directly call methods from wsdl + * + * @return object soap_proxy object + * @access public + */ + function getProxy(){ + $r = rand(); + $evalStr = $this->_getProxyClassCode($r); + //$this->debug("proxy class: $evalStr"; + // eval the class + eval($evalStr); + // instantiate proxy object + eval("\$proxy = new soap_proxy_$r('');"); + // transfer current wsdl data to the proxy thereby avoiding parsing the wsdl twice + $proxy->endpointType = 'wsdl'; + $proxy->wsdlFile = $this->wsdlFile; + $proxy->wsdl = $this->wsdl; + $proxy->operations = $this->operations; + $proxy->defaultRpcParams = $this->defaultRpcParams; + // transfer other state + $proxy->username = $this->username; + $proxy->password = $this->password; + $proxy->authtype = $this->authtype; + $proxy->proxyhost = $this->proxyhost; + $proxy->proxyport = $this->proxyport; + $proxy->proxyusername = $this->proxyusername; + $proxy->proxypassword = $this->proxypassword; + $proxy->timeout = $this->timeout; + $proxy->response_timeout = $this->response_timeout; + $proxy->http_encoding = $this->http_encoding; + $proxy->persistentConnection = $this->persistentConnection; + $proxy->requestHeaders = $this->requestHeaders; + $proxy->soap_defencoding = $this->soap_defencoding; + $proxy->endpoint = $this->endpoint; + $proxy->forceEndpoint = $this->forceEndpoint; + return $proxy; + } + + /** + * dynamically creates proxy class code + * + * @return string PHP/NuSOAP code for the proxy class + * @access private + */ + function _getProxyClassCode($r) { + if ($this->endpointType != 'wsdl') { + $evalStr = 'A proxy can only be created for a WSDL client'; + $this->setError($evalStr); + return $evalStr; + } + $evalStr = ''; + foreach ($this->operations as $operation => $opData) { + if ($operation != '') { + // create param string and param comment string + if (sizeof($opData['input']['parts']) > 0) { + $paramStr = ''; + $paramArrayStr = ''; + $paramCommentStr = ''; + foreach ($opData['input']['parts'] as $name => $type) { + $paramStr .= "\$$name, "; + $paramArrayStr .= "'$name' => \$$name, "; + $paramCommentStr .= "$type \$$name, "; + } + $paramStr = substr($paramStr, 0, strlen($paramStr)-2); + $paramArrayStr = substr($paramArrayStr, 0, strlen($paramArrayStr)-2); + $paramCommentStr = substr($paramCommentStr, 0, strlen($paramCommentStr)-2); + } else { + $paramStr = ''; + $paramCommentStr = 'void'; + } + $opData['namespace'] = !isset($opData['namespace']) ? 'http://testuri.com' : $opData['namespace']; + $evalStr .= "// $paramCommentStr + function " . str_replace('.', '__', $operation) . "($paramStr) { + \$params = array($paramArrayStr); + return \$this->call('$operation', \$params, '".$opData['namespace']."', '".(isset($opData['soapAction']) ? $opData['soapAction'] : '')."'); + } + "; + unset($paramStr); + unset($paramCommentStr); + } + } + $evalStr = 'class soap_proxy_'.$r.' extends soapclient { + '.$evalStr.' +}'; + return $evalStr; + } + + /** + * dynamically creates proxy class code + * + * @return string PHP/NuSOAP code for the proxy class + * @access public + */ + function getProxyClassCode() { + $r = rand(); + return $this->_getProxyClassCode($r); + } + + /** + * gets the HTTP body for the current request. + * + * @param string $soapmsg The SOAP payload + * @return string The HTTP body, which includes the SOAP payload + * @access private + */ + function getHTTPBody($soapmsg) { + return $soapmsg; + } + + /** + * gets the HTTP content type for the current request. + * + * Note: getHTTPBody must be called before this. + * + * @return string the HTTP content type for the current request. + * @access private + */ + function getHTTPContentType() { + return 'text/xml'; + } + + /** + * gets the HTTP content type charset for the current request. + * returns false for non-text content types. + * + * Note: getHTTPBody must be called before this. + * + * @return string the HTTP content type charset for the current request. + * @access private + */ + function getHTTPContentTypeCharset() { + return $this->soap_defencoding; + } + + /* + * whether or not parser should decode utf8 element content + * + * @return always returns true + * @access public + */ + function decodeUTF8($bool){ + $this->decode_utf8 = $bool; + return true; + } + + /** + * adds a new Cookie into $this->cookies array + * + * @param string $name Cookie Name + * @param string $value Cookie Value + * @return if cookie-set was successful returns true, else false + * @access public + */ + function setCookie($name, $value) { + if (strlen($name) == 0) { + return false; + } + $this->cookies[] = array('name' => $name, 'value' => $value); + return true; + } + + /** + * gets all Cookies + * + * @return array with all internal cookies + * @access public + */ + function getCookies() { + return $this->cookies; + } + + /** + * checks all Cookies and delete those which are expired + * + * @return always return true + * @access private + */ + function checkCookies() { + if (sizeof($this->cookies) == 0) { + return true; + } + $this->debug('checkCookie: check ' . sizeof($this->cookies) . ' cookies'); + $curr_cookies = $this->cookies; + $this->cookies = array(); + foreach ($curr_cookies as $cookie) { + if (! is_array($cookie)) { + $this->debug('Remove cookie that is not an array'); + continue; + } + if ((isset($cookie['expires'])) && (! empty($cookie['expires']))) { + if (strtotime($cookie['expires']) > time()) { + $this->cookies[] = $cookie; + } else { + $this->debug('Remove expired cookie ' . $cookie['name']); + } + } else { + $this->cookies[] = $cookie; + } + } + $this->debug('checkCookie: '.sizeof($this->cookies).' cookies left in array'); + return true; + } + + /** + * updates the current cookies with a new set + * + * @param array $cookies new cookies with which to update current ones + * @return always return true + * @access private + */ + function UpdateCookies($cookies) { + if (sizeof($this->cookies) == 0) { + // no existing cookies: take whatever is new + if (sizeof($cookies) > 0) { + $this->debug('Setting new cookie(s)'); + $this->cookies = $cookies; + } + return true; + } + if (sizeof($cookies) == 0) { + // no new cookies: keep what we've got + return true; + } + // merge + foreach ($cookies as $newCookie) { + if (!is_array($newCookie)) { + continue; + } + if ((!isset($newCookie['name'])) || (!isset($newCookie['value']))) { + continue; + } + $newName = $newCookie['name']; + + $found = false; + for ($i = 0; $i < count($this->cookies); $i++) { + $cookie = $this->cookies[$i]; + if (!is_array($cookie)) { + continue; + } + if (!isset($cookie['name'])) { + continue; + } + if ($newName != $cookie['name']) { + continue; + } + $newDomain = isset($newCookie['domain']) ? $newCookie['domain'] : 'NODOMAIN'; + $domain = isset($cookie['domain']) ? $cookie['domain'] : 'NODOMAIN'; + if ($newDomain != $domain) { + continue; + } + $newPath = isset($newCookie['path']) ? $newCookie['path'] : 'NOPATH'; + $path = isset($cookie['path']) ? $cookie['path'] : 'NOPATH'; + if ($newPath != $path) { + continue; + } + $this->cookies[$i] = $newCookie; + $found = true; + $this->debug('Update cookie ' . $newName . '=' . $newCookie['value']); + break; + } + if (! $found) { + $this->debug('Add cookie ' . $newName . '=' . $newCookie['value']); + $this->cookies[] = $newCookie; + } + } + return true; + } +} +?> diff --git a/thirdparty/pear/class.wsdl.php b/thirdparty/pear/class.wsdl.php new file mode 100644 index 000000000..2ee8d7d24 --- /dev/null +++ b/thirdparty/pear/class.wsdl.php @@ -0,0 +1,1727 @@ + +* @version $Id: class.wsdl.php,v 1.56 2005/08/04 01:27:42 snichol Exp $ +* @access public +*/ +class wsdl extends nusoap_base { + // URL or filename of the root of this WSDL + var $wsdl; + // define internal arrays of bindings, ports, operations, messages, etc. + var $schemas = array(); + var $currentSchema; + var $message = array(); + var $complexTypes = array(); + var $messages = array(); + var $currentMessage; + var $currentOperation; + var $portTypes = array(); + var $currentPortType; + var $bindings = array(); + var $currentBinding; + var $ports = array(); + var $currentPort; + var $opData = array(); + var $status = ''; + var $documentation = false; + var $endpoint = ''; + // array of wsdl docs to import + var $import = array(); + // parser vars + var $parser; + var $position = 0; + var $depth = 0; + var $depth_array = array(); + // for getting wsdl + var $proxyhost = ''; + var $proxyport = ''; + var $proxyusername = ''; + var $proxypassword = ''; + var $timeout = 0; + var $response_timeout = 30; + + /** + * constructor + * + * @param string $wsdl WSDL document URL + * @param string $proxyhost + * @param string $proxyport + * @param string $proxyusername + * @param string $proxypassword + * @param integer $timeout set the connection timeout + * @param integer $response_timeout set the response timeout + * @access public + */ + function wsdl($wsdl = '',$proxyhost=false,$proxyport=false,$proxyusername=false,$proxypassword=false,$timeout=0,$response_timeout=30){ + parent::nusoap_base(); + $this->wsdl = $wsdl; + $this->proxyhost = $proxyhost; + $this->proxyport = $proxyport; + $this->proxyusername = $proxyusername; + $this->proxypassword = $proxypassword; + $this->timeout = $timeout; + $this->response_timeout = $response_timeout; + + // parse wsdl file + if ($wsdl != "") { + $this->debug('initial wsdl URL: ' . $wsdl); + $this->parseWSDL($wsdl); + } + // imports + // TODO: handle imports more properly, grabbing them in-line and nesting them + $imported_urls = array(); + $imported = 1; + while ($imported > 0) { + $imported = 0; + // Schema imports + foreach ($this->schemas as $ns => $list) { + foreach ($list as $xs) { + $wsdlparts = parse_url($this->wsdl); // this is bogusly simple! + foreach ($xs->imports as $ns2 => $list2) { + for ($ii = 0; $ii < count($list2); $ii++) { + if (! $list2[$ii]['loaded']) { + $this->schemas[$ns]->imports[$ns2][$ii]['loaded'] = true; + $url = $list2[$ii]['location']; + if ($url != '') { + $urlparts = parse_url($url); + if (!isset($urlparts['host'])) { + $url = $wsdlparts['scheme'] . '://' . $wsdlparts['host'] . (isset($wsdlparts['port']) ? ':' .$wsdlparts['port'] : '') . + substr($wsdlparts['path'],0,strrpos($wsdlparts['path'],'/') + 1) .$urlparts['path']; + } + if (! in_array($url, $imported_urls)) { + $this->parseWSDL($url); + $imported++; + $imported_urls[] = $url; + } + } else { + $this->debug("Unexpected scenario: empty URL for unloaded import"); + } + } + } + } + } + } + // WSDL imports + $wsdlparts = parse_url($this->wsdl); // this is bogusly simple! + foreach ($this->import as $ns => $list) { + for ($ii = 0; $ii < count($list); $ii++) { + if (! $list[$ii]['loaded']) { + $this->import[$ns][$ii]['loaded'] = true; + $url = $list[$ii]['location']; + if ($url != '') { + $urlparts = parse_url($url); + if (!isset($urlparts['host'])) { + $url = $wsdlparts['scheme'] . '://' . $wsdlparts['host'] . (isset($wsdlparts['port']) ? ':' . $wsdlparts['port'] : '') . + substr($wsdlparts['path'],0,strrpos($wsdlparts['path'],'/') + 1) .$urlparts['path']; + } + if (! in_array($url, $imported_urls)) { + $this->parseWSDL($url); + $imported++; + $imported_urls[] = $url; + } + } else { + $this->debug("Unexpected scenario: empty URL for unloaded import"); + } + } + } + } + } + // add new data to operation data + foreach($this->bindings as $binding => $bindingData) { + if (isset($bindingData['operations']) && is_array($bindingData['operations'])) { + foreach($bindingData['operations'] as $operation => $data) { + $this->debug('post-parse data gathering for ' . $operation); + $this->bindings[$binding]['operations'][$operation]['input'] = + isset($this->bindings[$binding]['operations'][$operation]['input']) ? + array_merge($this->bindings[$binding]['operations'][$operation]['input'], $this->portTypes[ $bindingData['portType'] ][$operation]['input']) : + $this->portTypes[ $bindingData['portType'] ][$operation]['input']; + $this->bindings[$binding]['operations'][$operation]['output'] = + isset($this->bindings[$binding]['operations'][$operation]['output']) ? + array_merge($this->bindings[$binding]['operations'][$operation]['output'], $this->portTypes[ $bindingData['portType'] ][$operation]['output']) : + $this->portTypes[ $bindingData['portType'] ][$operation]['output']; + if(isset($this->messages[ $this->bindings[$binding]['operations'][$operation]['input']['message'] ])){ + $this->bindings[$binding]['operations'][$operation]['input']['parts'] = $this->messages[ $this->bindings[$binding]['operations'][$operation]['input']['message'] ]; + } + if(isset($this->messages[ $this->bindings[$binding]['operations'][$operation]['output']['message'] ])){ + $this->bindings[$binding]['operations'][$operation]['output']['parts'] = $this->messages[ $this->bindings[$binding]['operations'][$operation]['output']['message'] ]; + } + if (isset($bindingData['style'])) { + $this->bindings[$binding]['operations'][$operation]['style'] = $bindingData['style']; + } + $this->bindings[$binding]['operations'][$operation]['transport'] = isset($bindingData['transport']) ? $bindingData['transport'] : ''; + $this->bindings[$binding]['operations'][$operation]['documentation'] = isset($this->portTypes[ $bindingData['portType'] ][$operation]['documentation']) ? $this->portTypes[ $bindingData['portType'] ][$operation]['documentation'] : ''; + $this->bindings[$binding]['operations'][$operation]['endpoint'] = isset($bindingData['endpoint']) ? $bindingData['endpoint'] : ''; + } + } + } + } + + /** + * parses the wsdl document + * + * @param string $wsdl path or URL + * @access private + */ + function parseWSDL($wsdl = '') + { + if ($wsdl == '') { + $this->debug('no wsdl passed to parseWSDL()!!'); + $this->setError('no wsdl passed to parseWSDL()!!'); + return false; + } + + // parse $wsdl for url format + $wsdl_props = parse_url($wsdl); + + if (isset($wsdl_props['scheme']) && ($wsdl_props['scheme'] == 'http' || $wsdl_props['scheme'] == 'https')) { + $this->debug('getting WSDL http(s) URL ' . $wsdl); + // get wsdl + $tr = new soap_transport_http($wsdl); + $tr->request_method = 'GET'; + $tr->useSOAPAction = false; + if($this->proxyhost && $this->proxyport){ + $tr->setProxy($this->proxyhost,$this->proxyport,$this->proxyusername,$this->proxypassword); + } + $tr->setEncoding('gzip, deflate'); + $wsdl_string = $tr->send('', $this->timeout, $this->response_timeout); + //$this->debug("WSDL request\n" . $tr->outgoing_payload); + //$this->debug("WSDL response\n" . $tr->incoming_payload); + $this->appendDebug($tr->getDebug()); + // catch errors + if($err = $tr->getError() ){ + $errstr = 'HTTP ERROR: '.$err; + $this->debug($errstr); + $this->setError($errstr); + unset($tr); + return false; + } + unset($tr); + $this->debug("got WSDL URL"); + } else { + // $wsdl is not http(s), so treat it as a file URL or plain file path + if (isset($wsdl_props['scheme']) && ($wsdl_props['scheme'] == 'file') && isset($wsdl_props['path'])) { + $path = isset($wsdl_props['host']) ? ($wsdl_props['host'] . ':' . $wsdl_props['path']) : $wsdl_props['path']; + } else { + $path = $wsdl; + } + $this->debug('getting WSDL file ' . $path); + if ($fp = @fopen($path, 'r')) { + $wsdl_string = ''; + while ($data = fread($fp, 32768)) { + $wsdl_string .= $data; + } + fclose($fp); + } else { + $errstr = "Bad path to WSDL file $path"; + $this->debug($errstr); + $this->setError($errstr); + return false; + } + } + $this->debug('Parse WSDL'); + // end new code added + // Create an XML parser. + $this->parser = xml_parser_create(); + // Set the options for parsing the XML data. + // xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1); + xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, 0); + // Set the object for the parser. + xml_set_object($this->parser, $this); + // Set the element handlers for the parser. + xml_set_element_handler($this->parser, 'start_element', 'end_element'); + xml_set_character_data_handler($this->parser, 'character_data'); + // Parse the XML file. + if (!xml_parse($this->parser, $wsdl_string, true)) { + // Display an error message. + $errstr = sprintf( + 'XML error parsing WSDL from %s on line %d: %s', + $wsdl, + xml_get_current_line_number($this->parser), + xml_error_string(xml_get_error_code($this->parser)) + ); + $this->debug($errstr); + $this->debug("XML payload:\n" . $wsdl_string); + $this->setError($errstr); + return false; + } + // free the parser + xml_parser_free($this->parser); + $this->debug('Parsing WSDL done'); + // catch wsdl parse errors + if($this->getError()){ + return false; + } + return true; + } + + /** + * start-element handler + * + * @param string $parser XML parser object + * @param string $name element name + * @param string $attrs associative array of attributes + * @access private + */ + function start_element($parser, $name, $attrs) + { + if ($this->status == 'schema') { + $this->currentSchema->schemaStartElement($parser, $name, $attrs); + $this->appendDebug($this->currentSchema->getDebug()); + $this->currentSchema->clearDebug(); + } elseif (ereg('schema$', $name)) { + $this->debug('Parsing WSDL schema'); + // $this->debug("startElement for $name ($attrs[name]). status = $this->status (".$this->getLocalPart($name).")"); + $this->status = 'schema'; + $this->currentSchema = new xmlschema('', '', $this->namespaces); + $this->currentSchema->schemaStartElement($parser, $name, $attrs); + $this->appendDebug($this->currentSchema->getDebug()); + $this->currentSchema->clearDebug(); + } else { + // position in the total number of elements, starting from 0 + $pos = $this->position++; + $depth = $this->depth++; + // set self as current value for this depth + $this->depth_array[$depth] = $pos; + $this->message[$pos] = array('cdata' => ''); + // process attributes + if (count($attrs) > 0) { + // register namespace declarations + foreach($attrs as $k => $v) { + if (ereg("^xmlns", $k)) { + if ($ns_prefix = substr(strrchr($k, ':'), 1)) { + $this->namespaces[$ns_prefix] = $v; + } else { + $this->namespaces['ns' . (count($this->namespaces) + 1)] = $v; + } + if ($v == 'http://www.w3.org/2001/XMLSchema' || $v == 'http://www.w3.org/1999/XMLSchema' || $v == 'http://www.w3.org/2000/10/XMLSchema') { + $this->XMLSchemaVersion = $v; + $this->namespaces['xsi'] = $v . '-instance'; + } + } + } + // expand each attribute prefix to its namespace + foreach($attrs as $k => $v) { + $k = strpos($k, ':') ? $this->expandQname($k) : $k; + if ($k != 'location' && $k != 'soapAction' && $k != 'namespace') { + $v = strpos($v, ':') ? $this->expandQname($v) : $v; + } + $eAttrs[$k] = $v; + } + $attrs = $eAttrs; + } else { + $attrs = array(); + } + // get element prefix, namespace and name + if (ereg(':', $name)) { + // get ns prefix + $prefix = substr($name, 0, strpos($name, ':')); + // get ns + $namespace = isset($this->namespaces[$prefix]) ? $this->namespaces[$prefix] : ''; + // get unqualified name + $name = substr(strstr($name, ':'), 1); + } + // process attributes, expanding any prefixes to namespaces + // find status, register data + switch ($this->status) { + case 'message': + if ($name == 'part') { + if (isset($attrs['type'])) { + $this->debug("msg " . $this->currentMessage . ": found part $attrs[name]: " . implode(',', $attrs)); + $this->messages[$this->currentMessage][$attrs['name']] = $attrs['type']; + } + if (isset($attrs['element'])) { + $this->debug("msg " . $this->currentMessage . ": found part $attrs[name]: " . implode(',', $attrs)); + $this->messages[$this->currentMessage][$attrs['name']] = $attrs['element']; + } + } + break; + case 'portType': + switch ($name) { + case 'operation': + $this->currentPortOperation = $attrs['name']; + $this->debug("portType $this->currentPortType operation: $this->currentPortOperation"); + if (isset($attrs['parameterOrder'])) { + $this->portTypes[$this->currentPortType][$attrs['name']]['parameterOrder'] = $attrs['parameterOrder']; + } + break; + case 'documentation': + $this->documentation = true; + break; + // merge input/output data + default: + $m = isset($attrs['message']) ? $this->getLocalPart($attrs['message']) : ''; + $this->portTypes[$this->currentPortType][$this->currentPortOperation][$name]['message'] = $m; + break; + } + break; + case 'binding': + switch ($name) { + case 'binding': + // get ns prefix + if (isset($attrs['style'])) { + $this->bindings[$this->currentBinding]['prefix'] = $prefix; + } + $this->bindings[$this->currentBinding] = array_merge($this->bindings[$this->currentBinding], $attrs); + break; + case 'header': + $this->bindings[$this->currentBinding]['operations'][$this->currentOperation][$this->opStatus]['headers'][] = $attrs; + break; + case 'operation': + if (isset($attrs['soapAction'])) { + $this->bindings[$this->currentBinding]['operations'][$this->currentOperation]['soapAction'] = $attrs['soapAction']; + } + if (isset($attrs['style'])) { + $this->bindings[$this->currentBinding]['operations'][$this->currentOperation]['style'] = $attrs['style']; + } + if (isset($attrs['name'])) { + $this->currentOperation = $attrs['name']; + $this->debug("current binding operation: $this->currentOperation"); + $this->bindings[$this->currentBinding]['operations'][$this->currentOperation]['name'] = $attrs['name']; + $this->bindings[$this->currentBinding]['operations'][$this->currentOperation]['binding'] = $this->currentBinding; + $this->bindings[$this->currentBinding]['operations'][$this->currentOperation]['endpoint'] = isset($this->bindings[$this->currentBinding]['endpoint']) ? $this->bindings[$this->currentBinding]['endpoint'] : ''; + } + break; + case 'input': + $this->opStatus = 'input'; + break; + case 'output': + $this->opStatus = 'output'; + break; + case 'body': + if (isset($this->bindings[$this->currentBinding]['operations'][$this->currentOperation][$this->opStatus])) { + $this->bindings[$this->currentBinding]['operations'][$this->currentOperation][$this->opStatus] = array_merge($this->bindings[$this->currentBinding]['operations'][$this->currentOperation][$this->opStatus], $attrs); + } else { + $this->bindings[$this->currentBinding]['operations'][$this->currentOperation][$this->opStatus] = $attrs; + } + break; + } + break; + case 'service': + switch ($name) { + case 'port': + $this->currentPort = $attrs['name']; + $this->debug('current port: ' . $this->currentPort); + $this->ports[$this->currentPort]['binding'] = $this->getLocalPart($attrs['binding']); + + break; + case 'address': + $this->ports[$this->currentPort]['location'] = $attrs['location']; + $this->ports[$this->currentPort]['bindingType'] = $namespace; + $this->bindings[ $this->ports[$this->currentPort]['binding'] ]['bindingType'] = $namespace; + $this->bindings[ $this->ports[$this->currentPort]['binding'] ]['endpoint'] = $attrs['location']; + break; + } + break; + } + // set status + switch ($name) { + case 'import': + if (isset($attrs['location'])) { + $this->import[$attrs['namespace']][] = array('location' => $attrs['location'], 'loaded' => false); + $this->debug('parsing import ' . $attrs['namespace']. ' - ' . $attrs['location'] . ' (' . count($this->import[$attrs['namespace']]).')'); + } else { + $this->import[$attrs['namespace']][] = array('location' => '', 'loaded' => true); + if (! $this->getPrefixFromNamespace($attrs['namespace'])) { + $this->namespaces['ns'.(count($this->namespaces)+1)] = $attrs['namespace']; + } + $this->debug('parsing import ' . $attrs['namespace']. ' - [no location] (' . count($this->import[$attrs['namespace']]).')'); + } + break; + //wait for schema + //case 'types': + // $this->status = 'schema'; + // break; + case 'message': + $this->status = 'message'; + $this->messages[$attrs['name']] = array(); + $this->currentMessage = $attrs['name']; + break; + case 'portType': + $this->status = 'portType'; + $this->portTypes[$attrs['name']] = array(); + $this->currentPortType = $attrs['name']; + break; + case "binding": + if (isset($attrs['name'])) { + // get binding name + if (strpos($attrs['name'], ':')) { + $this->currentBinding = $this->getLocalPart($attrs['name']); + } else { + $this->currentBinding = $attrs['name']; + } + $this->status = 'binding'; + $this->bindings[$this->currentBinding]['portType'] = $this->getLocalPart($attrs['type']); + $this->debug("current binding: $this->currentBinding of portType: " . $attrs['type']); + } + break; + case 'service': + $this->serviceName = $attrs['name']; + $this->status = 'service'; + $this->debug('current service: ' . $this->serviceName); + break; + case 'definitions': + foreach ($attrs as $name => $value) { + $this->wsdl_info[$name] = $value; + } + break; + } + } + } + + /** + * end-element handler + * + * @param string $parser XML parser object + * @param string $name element name + * @access private + */ + function end_element($parser, $name){ + // unset schema status + if (/*ereg('types$', $name) ||*/ ereg('schema$', $name)) { + $this->status = ""; + $this->appendDebug($this->currentSchema->getDebug()); + $this->currentSchema->clearDebug(); + $this->schemas[$this->currentSchema->schemaTargetNamespace][] = $this->currentSchema; + $this->debug('Parsing WSDL schema done'); + } + if ($this->status == 'schema') { + $this->currentSchema->schemaEndElement($parser, $name); + } else { + // bring depth down a notch + $this->depth--; + } + // end documentation + if ($this->documentation) { + //TODO: track the node to which documentation should be assigned; it can be a part, message, etc. + //$this->portTypes[$this->currentPortType][$this->currentPortOperation]['documentation'] = $this->documentation; + $this->documentation = false; + } + } + + /** + * element content handler + * + * @param string $parser XML parser object + * @param string $data element content + * @access private + */ + function character_data($parser, $data) + { + $pos = isset($this->depth_array[$this->depth]) ? $this->depth_array[$this->depth] : 0; + if (isset($this->message[$pos]['cdata'])) { + $this->message[$pos]['cdata'] .= $data; + } + if ($this->documentation) { + $this->documentation .= $data; + } + } + + function getBindingData($binding) + { + if (is_array($this->bindings[$binding])) { + return $this->bindings[$binding]; + } + } + + /** + * returns an assoc array of operation names => operation data + * + * @param string $bindingType eg: soap, smtp, dime (only soap is currently supported) + * @return array + * @access public + */ + function getOperations($bindingType = 'soap') + { + $ops = array(); + if ($bindingType == 'soap') { + $bindingType = 'http://schemas.xmlsoap.org/wsdl/soap/'; + } + // loop thru ports + foreach($this->ports as $port => $portData) { + // binding type of port matches parameter + if ($portData['bindingType'] == $bindingType) { + //$this->debug("getOperations for port $port"); + //$this->debug("port data: " . $this->varDump($portData)); + //$this->debug("bindings: " . $this->varDump($this->bindings[ $portData['binding'] ])); + // merge bindings + if (isset($this->bindings[ $portData['binding'] ]['operations'])) { + $ops = array_merge ($ops, $this->bindings[ $portData['binding'] ]['operations']); + } + } + } + return $ops; + } + + /** + * returns an associative array of data necessary for calling an operation + * + * @param string $operation , name of operation + * @param string $bindingType , type of binding eg: soap + * @return array + * @access public + */ + function getOperationData($operation, $bindingType = 'soap') + { + if ($bindingType == 'soap') { + $bindingType = 'http://schemas.xmlsoap.org/wsdl/soap/'; + } + // loop thru ports + foreach($this->ports as $port => $portData) { + // binding type of port matches parameter + if ($portData['bindingType'] == $bindingType) { + // get binding + //foreach($this->bindings[ $portData['binding'] ]['operations'] as $bOperation => $opData) { + foreach(array_keys($this->bindings[ $portData['binding'] ]['operations']) as $bOperation) { + // note that we could/should also check the namespace here + if ($operation == $bOperation) { + $opData = $this->bindings[ $portData['binding'] ]['operations'][$operation]; + return $opData; + } + } + } + } + } + + /** + * returns an associative array of data necessary for calling an operation + * + * @param string $soapAction soapAction for operation + * @param string $bindingType type of binding eg: soap + * @return array + * @access public + */ + function getOperationDataForSoapAction($soapAction, $bindingType = 'soap') { + if ($bindingType == 'soap') { + $bindingType = 'http://schemas.xmlsoap.org/wsdl/soap/'; + } + // loop thru ports + foreach($this->ports as $port => $portData) { + // binding type of port matches parameter + if ($portData['bindingType'] == $bindingType) { + // loop through operations for the binding + foreach ($this->bindings[ $portData['binding'] ]['operations'] as $bOperation => $opData) { + if ($opData['soapAction'] == $soapAction) { + return $opData; + } + } + } + } + } + + /** + * returns an array of information about a given type + * returns false if no type exists by the given name + * + * typeDef = array( + * 'elements' => array(), // refs to elements array + * 'restrictionBase' => '', + * 'phpType' => '', + * 'order' => '(sequence|all)', + * 'attrs' => array() // refs to attributes array + * ) + * + * @param $type string the type + * @param $ns string namespace (not prefix) of the type + * @return mixed + * @access public + * @see xmlschema + */ + function getTypeDef($type, $ns) { + $this->debug("in getTypeDef: type=$type, ns=$ns"); + if ((! $ns) && isset($this->namespaces['tns'])) { + $ns = $this->namespaces['tns']; + $this->debug("in getTypeDef: type namespace forced to $ns"); + } + if (isset($this->schemas[$ns])) { + $this->debug("in getTypeDef: have schema for namespace $ns"); + for ($i = 0; $i < count($this->schemas[$ns]); $i++) { + $xs = &$this->schemas[$ns][$i]; + $t = $xs->getTypeDef($type); + $this->appendDebug($xs->getDebug()); + $xs->clearDebug(); + if ($t) { + if (!isset($t['phpType'])) { + // get info for type to tack onto the element + $uqType = substr($t['type'], strrpos($t['type'], ':') + 1); + $ns = substr($t['type'], 0, strrpos($t['type'], ':')); + $etype = $this->getTypeDef($uqType, $ns); + if ($etype) { + $this->debug("found type for [element] $type:"); + $this->debug($this->varDump($etype)); + if (isset($etype['phpType'])) { + $t['phpType'] = $etype['phpType']; + } + if (isset($etype['elements'])) { + $t['elements'] = $etype['elements']; + } + if (isset($etype['attrs'])) { + $t['attrs'] = $etype['attrs']; + } + } + } + return $t; + } + } + } else { + $this->debug("in getTypeDef: do not have schema for namespace $ns"); + } + return false; + } + + /** + * prints html description of services + * + * @access private + */ + function webDescription(){ + global $HTTP_SERVER_VARS; + + if (isset($_SERVER)) { + $PHP_SELF = $_SERVER['PHP_SELF']; + } elseif (isset($HTTP_SERVER_VARS)) { + $PHP_SELF = $HTTP_SERVER_VARS['PHP_SELF']; + } else { + $this->setError("Neither _SERVER nor HTTP_SERVER_VARS is available"); + } + + $b = ' + NuSOAP: '.$this->serviceName.' + + + + +
    +

    +
    '.$this->serviceName.'
    + +
    '; + return $b; + } + + /** + * serialize the parsed wsdl + * + * @param mixed $debug whether to put debug=1 in endpoint URL + * @return string serialization of WSDL + * @access public + */ + function serialize($debug = 0) + { + $xml = ''; + $xml .= "\nnamespaces as $k => $v) { + $xml .= " xmlns:$k=\"$v\""; + } + // 10.9.02 - add poulter fix for wsdl and tns declarations + if (isset($this->namespaces['wsdl'])) { + $xml .= " xmlns=\"" . $this->namespaces['wsdl'] . "\""; + } + if (isset($this->namespaces['tns'])) { + $xml .= " targetNamespace=\"" . $this->namespaces['tns'] . "\""; + } + $xml .= '>'; + // imports + if (sizeof($this->import) > 0) { + foreach($this->import as $ns => $list) { + foreach ($list as $ii) { + if ($ii['location'] != '') { + $xml .= ''; + } else { + $xml .= ''; + } + } + } + } + // types + if (count($this->schemas)>=1) { + $xml .= "\n"; + foreach ($this->schemas as $ns => $list) { + foreach ($list as $xs) { + $xml .= $xs->serializeSchema(); + } + } + $xml .= ''; + } + // messages + if (count($this->messages) >= 1) { + foreach($this->messages as $msgName => $msgParts) { + $xml .= "\n'; + if(is_array($msgParts)){ + foreach($msgParts as $partName => $partType) { + // print 'serializing '.$partType.', sv: '.$this->XMLSchemaVersion.'
    '; + if (strpos($partType, ':')) { + $typePrefix = $this->getPrefixFromNamespace($this->getPrefix($partType)); + } elseif (isset($this->typemap[$this->namespaces['xsd']][$partType])) { + // print 'checking typemap: '.$this->XMLSchemaVersion.'
    '; + $typePrefix = 'xsd'; + } else { + foreach($this->typemap as $ns => $types) { + if (isset($types[$partType])) { + $typePrefix = $this->getPrefixFromNamespace($ns); + } + } + if (!isset($typePrefix)) { + die("$partType has no namespace!"); + } + } + $ns = $this->getNamespaceFromPrefix($typePrefix); + $typeDef = $this->getTypeDef($this->getLocalPart($partType), $ns); + if ($typeDef['typeClass'] == 'element') { + $elementortype = 'element'; + } else { + $elementortype = 'type'; + } + $xml .= ''; + } + } + $xml .= '
    '; + } + } + // bindings & porttypes + if (count($this->bindings) >= 1) { + $binding_xml = ''; + $portType_xml = ''; + foreach($this->bindings as $bindingName => $attrs) { + $binding_xml .= "\n'; + $binding_xml .= ''; + $portType_xml .= "\n'; + foreach($attrs['operations'] as $opName => $opParts) { + $binding_xml .= ''; + $binding_xml .= ''; + if (isset($opParts['input']['encodingStyle']) && $opParts['input']['encodingStyle'] != '') { + $enc_style = ' encodingStyle="' . $opParts['input']['encodingStyle'] . '"'; + } else { + $enc_style = ''; + } + $binding_xml .= ''; + if (isset($opParts['output']['encodingStyle']) && $opParts['output']['encodingStyle'] != '') { + $enc_style = ' encodingStyle="' . $opParts['output']['encodingStyle'] . '"'; + } else { + $enc_style = ''; + } + $binding_xml .= ''; + $binding_xml .= ''; + $portType_xml .= ''; + } + $portType_xml .= ''; + $portType_xml .= ''; + $portType_xml .= ''; + } + $portType_xml .= ''; + $binding_xml .= ''; + } + $xml .= $portType_xml . $binding_xml; + } + // services + $xml .= "\nserviceName . '">'; + if (count($this->ports) >= 1) { + foreach($this->ports as $pName => $attrs) { + $xml .= ''; + $xml .= ''; + $xml .= ''; + } + } + $xml .= ''; + return $xml . "\n"; + } + + /** + * serialize PHP values according to a WSDL message definition + * + * TODO + * - multi-ref serialization + * - validate PHP values against type definitions, return errors if invalid + * + * @param string $operation operation name + * @param string $direction (input|output) + * @param mixed $parameters parameter value(s) + * @return mixed parameters serialized as XML or false on error (e.g. operation not found) + * @access public + */ + function serializeRPCParameters($operation, $direction, $parameters) + { + $this->debug("in serializeRPCParameters: operation=$operation, direction=$direction, XMLSchemaVersion=$this->XMLSchemaVersion"); + $this->appendDebug('parameters=' . $this->varDump($parameters)); + + if ($direction != 'input' && $direction != 'output') { + $this->debug('The value of the \$direction argument needs to be either "input" or "output"'); + $this->setError('The value of the \$direction argument needs to be either "input" or "output"'); + return false; + } + if (!$opData = $this->getOperationData($operation)) { + $this->debug('Unable to retrieve WSDL data for operation: ' . $operation); + $this->setError('Unable to retrieve WSDL data for operation: ' . $operation); + return false; + } + $this->debug('opData:'); + $this->appendDebug($this->varDump($opData)); + + // Get encoding style for output and set to current + $encodingStyle = 'http://schemas.xmlsoap.org/soap/encoding/'; + if(($direction == 'input') && isset($opData['output']['encodingStyle']) && ($opData['output']['encodingStyle'] != $encodingStyle)) { + $encodingStyle = $opData['output']['encodingStyle']; + $enc_style = $encodingStyle; + } + + // set input params + $xml = ''; + if (isset($opData[$direction]['parts']) && sizeof($opData[$direction]['parts']) > 0) { + + $use = $opData[$direction]['use']; + $this->debug('have ' . count($opData[$direction]['parts']) . ' part(s) to serialize'); + if (is_array($parameters)) { + $parametersArrayType = $this->isArraySimpleOrStruct($parameters); + $this->debug('have ' . count($parameters) . ' parameter(s) provided as ' . $parametersArrayType . ' to serialize'); + foreach($opData[$direction]['parts'] as $name => $type) { + $this->debug('serializing part "'.$name.'" of type "'.$type.'"'); + // Track encoding style + if (isset($opData[$direction]['encodingStyle']) && $encodingStyle != $opData[$direction]['encodingStyle']) { + $encodingStyle = $opData[$direction]['encodingStyle']; + $enc_style = $encodingStyle; + } else { + $enc_style = false; + } + // NOTE: add error handling here + // if serializeType returns false, then catch global error and fault + if ($parametersArrayType == 'arraySimple') { + $p = array_shift($parameters); + $this->debug('calling serializeType w/indexed param'); + $xml .= $this->serializeType($name, $type, $p, $use, $enc_style); + } elseif (isset($parameters[$name])) { + $this->debug('calling serializeType w/named param'); + $xml .= $this->serializeType($name, $type, $parameters[$name], $use, $enc_style); + } else { + // TODO: only send nillable + $this->debug('calling serializeType w/null param'); + $xml .= $this->serializeType($name, $type, null, $use, $enc_style); + } + } + } else { + $this->debug('no parameters passed.'); + } + } + $this->debug("serializeRPCParameters returning: $xml"); + return $xml; + } + + /** + * serialize a PHP value according to a WSDL message definition + * + * TODO + * - multi-ref serialization + * - validate PHP values against type definitions, return errors if invalid + * + * @param string $ type name + * @param mixed $ param value + * @return mixed new param or false if initial value didn't validate + * @access public + * @deprecated + */ + function serializeParameters($operation, $direction, $parameters) + { + $this->debug("in serializeParameters: operation=$operation, direction=$direction, XMLSchemaVersion=$this->XMLSchemaVersion"); + $this->appendDebug('parameters=' . $this->varDump($parameters)); + + if ($direction != 'input' && $direction != 'output') { + $this->debug('The value of the \$direction argument needs to be either "input" or "output"'); + $this->setError('The value of the \$direction argument needs to be either "input" or "output"'); + return false; + } + if (!$opData = $this->getOperationData($operation)) { + $this->debug('Unable to retrieve WSDL data for operation: ' . $operation); + $this->setError('Unable to retrieve WSDL data for operation: ' . $operation); + return false; + } + $this->debug('opData:'); + $this->appendDebug($this->varDump($opData)); + + // Get encoding style for output and set to current + $encodingStyle = 'http://schemas.xmlsoap.org/soap/encoding/'; + if(($direction == 'input') && isset($opData['output']['encodingStyle']) && ($opData['output']['encodingStyle'] != $encodingStyle)) { + $encodingStyle = $opData['output']['encodingStyle']; + $enc_style = $encodingStyle; + } + + // set input params + $xml = ''; + if (isset($opData[$direction]['parts']) && sizeof($opData[$direction]['parts']) > 0) { + + $use = $opData[$direction]['use']; + $this->debug("use=$use"); + $this->debug('got ' . count($opData[$direction]['parts']) . ' part(s)'); + if (is_array($parameters)) { + $parametersArrayType = $this->isArraySimpleOrStruct($parameters); + $this->debug('have ' . $parametersArrayType . ' parameters'); + foreach($opData[$direction]['parts'] as $name => $type) { + $this->debug('serializing part "'.$name.'" of type "'.$type.'"'); + // Track encoding style + if(isset($opData[$direction]['encodingStyle']) && $encodingStyle != $opData[$direction]['encodingStyle']) { + $encodingStyle = $opData[$direction]['encodingStyle']; + $enc_style = $encodingStyle; + } else { + $enc_style = false; + } + // NOTE: add error handling here + // if serializeType returns false, then catch global error and fault + if ($parametersArrayType == 'arraySimple') { + $p = array_shift($parameters); + $this->debug('calling serializeType w/indexed param'); + $xml .= $this->serializeType($name, $type, $p, $use, $enc_style); + } elseif (isset($parameters[$name])) { + $this->debug('calling serializeType w/named param'); + $xml .= $this->serializeType($name, $type, $parameters[$name], $use, $enc_style); + } else { + // TODO: only send nillable + $this->debug('calling serializeType w/null param'); + $xml .= $this->serializeType($name, $type, null, $use, $enc_style); + } + } + } else { + $this->debug('no parameters passed.'); + } + } + $this->debug("serializeParameters returning: $xml"); + return $xml; + } + + /** + * serializes a PHP value according a given type definition + * + * @param string $name name of value (part or element) + * @param string $type XML schema type of value (type or element) + * @param mixed $value a native PHP value (parameter value) + * @param string $use use for part (encoded|literal) + * @param string $encodingStyle SOAP encoding style for the value (if different than the enclosing style) + * @param boolean $unqualified a kludge for what should be XML namespace form handling + * @return string value serialized as an XML string + * @access private + */ + function serializeType($name, $type, $value, $use='encoded', $encodingStyle=false, $unqualified=false) + { + $this->debug("in serializeType: name=$name, type=$type, use=$use, encodingStyle=$encodingStyle, unqualified=" . ($unqualified ? "unqualified" : "qualified")); + $this->appendDebug("value=" . $this->varDump($value)); + if($use == 'encoded' && $encodingStyle) { + $encodingStyle = ' SOAP-ENV:encodingStyle="' . $encodingStyle . '"'; + } + + // if a soapval has been supplied, let its type override the WSDL + if (is_object($value) && get_class($value) == 'soapval') { + if ($value->type_ns) { + $type = $value->type_ns . ':' . $value->type; + $forceType = true; + $this->debug("in serializeType: soapval overrides type to $type"); + } elseif ($value->type) { + $type = $value->type; + $forceType = true; + $this->debug("in serializeType: soapval overrides type to $type"); + } else { + $forceType = false; + $this->debug("in serializeType: soapval does not override type"); + } + $attrs = $value->attributes; + $value = $value->value; + $this->debug("in serializeType: soapval overrides value to $value"); + if ($attrs) { + if (!is_array($value)) { + $value['!'] = $value; + } + foreach ($attrs as $n => $v) { + $value['!' . $n] = $v; + } + $this->debug("in serializeType: soapval provides attributes"); + } + } else { + $forceType = false; + } + + $xml = ''; + if (strpos($type, ':')) { + $uqType = substr($type, strrpos($type, ':') + 1); + $ns = substr($type, 0, strrpos($type, ':')); + $this->debug("in serializeType: got a prefixed type: $uqType, $ns"); + if ($this->getNamespaceFromPrefix($ns)) { + $ns = $this->getNamespaceFromPrefix($ns); + $this->debug("in serializeType: expanded prefixed type: $uqType, $ns"); + } + + if($ns == $this->XMLSchemaVersion || $ns == 'http://schemas.xmlsoap.org/soap/encoding/'){ + $this->debug('in serializeType: type namespace indicates XML Schema or SOAP Encoding type'); + if ($unqualified && $use == 'literal') { + $elementNS = " xmlns=\"\""; + } else { + $elementNS = ''; + } + if (is_null($value)) { + if ($use == 'literal') { + // TODO: depends on minOccurs + $xml = "<$name$elementNS/>"; + } else { + // TODO: depends on nillable, which should be checked before calling this method + $xml = "<$name$elementNS xsi:nil=\"true\" xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\"/>"; + } + $this->debug("in serializeType: returning: $xml"); + return $xml; + } + if ($uqType == 'boolean') { + if ((is_string($value) && $value == 'false') || (! $value)) { + $value = 'false'; + } else { + $value = 'true'; + } + } + if ($uqType == 'string' && gettype($value) == 'string') { + $value = $this->expandEntities($value); + } + if (($uqType == 'long' || $uqType == 'unsignedLong') && gettype($value) == 'double') { + $value = sprintf("%.0lf", $value); + } + // it's a scalar + // TODO: what about null/nil values? + // check type isn't a custom type extending xmlschema namespace + if (!$this->getTypeDef($uqType, $ns)) { + if ($use == 'literal') { + if ($forceType) { + $xml = "<$name$elementNS xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\">$value"; + } else { + $xml = "<$name$elementNS>$value"; + } + } else { + $xml = "<$name$elementNS xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\"$encodingStyle>$value"; + } + $this->debug("in serializeType: returning: $xml"); + return $xml; + } + $this->debug('custom type extends XML Schema or SOAP Encoding namespace (yuck)'); + } else if ($ns == 'http://xml.apache.org/xml-soap') { + $this->debug('in serializeType: appears to be Apache SOAP type'); + if ($uqType == 'Map') { + $tt_prefix = $this->getPrefixFromNamespace('http://xml.apache.org/xml-soap'); + if (! $tt_prefix) { + $this->debug('in serializeType: Add namespace for Apache SOAP type'); + $tt_prefix = 'ns' . rand(1000, 9999); + $this->namespaces[$tt_prefix] = 'http://xml.apache.org/xml-soap'; + // force this to be added to usedNamespaces + $tt_prefix = $this->getPrefixFromNamespace('http://xml.apache.org/xml-soap'); + } + $contents = ''; + foreach($value as $k => $v) { + $this->debug("serializing map element: key $k, value $v"); + $contents .= ''; + $contents .= $this->serialize_val($k,'key',false,false,false,false,$use); + $contents .= $this->serialize_val($v,'value',false,false,false,false,$use); + $contents .= ''; + } + if ($use == 'literal') { + if ($forceType) { + $xml = "<$name xsi:type=\"" . $tt_prefix . ":$uqType\">$contents"; + } else { + $xml = "<$name>$contents"; + } + } else { + $xml = "<$name xsi:type=\"" . $tt_prefix . ":$uqType\"$encodingStyle>$contents"; + } + $this->debug("in serializeType: returning: $xml"); + return $xml; + } + $this->debug('in serializeType: Apache SOAP type, but only support Map'); + } + } else { + // TODO: should the type be compared to types in XSD, and the namespace + // set to XSD if the type matches? + $this->debug("in serializeType: No namespace for type $type"); + $ns = ''; + $uqType = $type; + } + if(!$typeDef = $this->getTypeDef($uqType, $ns)){ + $this->setError("$type ($uqType) is not a supported type."); + $this->debug("in serializeType: $type ($uqType) is not a supported type."); + return false; + } else { + $this->debug("in serializeType: found typeDef"); + $this->appendDebug('typeDef=' . $this->varDump($typeDef)); + } + $phpType = $typeDef['phpType']; + $this->debug("in serializeType: uqType: $uqType, ns: $ns, phptype: $phpType, arrayType: " . (isset($typeDef['arrayType']) ? $typeDef['arrayType'] : '') ); + // if php type == struct, map value to the element names + if ($phpType == 'struct') { + if (isset($typeDef['typeClass']) && $typeDef['typeClass'] == 'element') { + $elementName = $uqType; + if (isset($typeDef['form']) && ($typeDef['form'] == 'qualified')) { + $elementNS = " xmlns=\"$ns\""; + } else { + $elementNS = " xmlns=\"\""; + } + } else { + $elementName = $name; + if ($unqualified) { + $elementNS = " xmlns=\"\""; + } else { + $elementNS = ''; + } + } + if (is_null($value)) { + if ($use == 'literal') { + // TODO: depends on minOccurs + $xml = "<$elementName$elementNS/>"; + } else { + $xml = "<$elementName$elementNS xsi:nil=\"true\" xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\"/>"; + } + $this->debug("in serializeType: returning: $xml"); + return $xml; + } + if (is_object($value)) { + $value = get_object_vars($value); + } + if (is_array($value)) { + $elementAttrs = $this->serializeComplexTypeAttributes($typeDef, $value, $ns, $uqType); + if ($use == 'literal') { + if ($forceType) { + $xml = "<$elementName$elementNS$elementAttrs xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\">"; + } else { + $xml = "<$elementName$elementNS$elementAttrs>"; + } + } else { + $xml = "<$elementName$elementNS$elementAttrs xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\"$encodingStyle>"; + } + + $xml .= $this->serializeComplexTypeElements($typeDef, $value, $ns, $uqType, $use, $encodingStyle); + $xml .= ""; + } else { + $this->debug("in serializeType: phpType is struct, but value is not an array"); + $this->setError("phpType is struct, but value is not an array: see debug output for details"); + $xml = ''; + } + } elseif ($phpType == 'array') { + if (isset($typeDef['form']) && ($typeDef['form'] == 'qualified')) { + $elementNS = " xmlns=\"$ns\""; + } else { + if ($unqualified) { + $elementNS = " xmlns=\"\""; + } else { + $elementNS = ''; + } + } + if (is_null($value)) { + if ($use == 'literal') { + // TODO: depends on minOccurs + $xml = "<$name$elementNS/>"; + } else { + $xml = "<$name$elementNS xsi:nil=\"true\" xsi:type=\"" . + $this->getPrefixFromNamespace('http://schemas.xmlsoap.org/soap/encoding/') . + ":Array\" " . + $this->getPrefixFromNamespace('http://schemas.xmlsoap.org/soap/encoding/') . + ':arrayType="' . + $this->getPrefixFromNamespace($this->getPrefix($typeDef['arrayType'])) . + ':' . + $this->getLocalPart($typeDef['arrayType'])."[0]\"/>"; + } + $this->debug("in serializeType: returning: $xml"); + return $xml; + } + if (isset($typeDef['multidimensional'])) { + $nv = array(); + foreach($value as $v) { + $cols = ',' . sizeof($v); + $nv = array_merge($nv, $v); + } + $value = $nv; + } else { + $cols = ''; + } + if (is_array($value) && sizeof($value) >= 1) { + $rows = sizeof($value); + $contents = ''; + foreach($value as $k => $v) { + $this->debug("serializing array element: $k, $v of type: $typeDef[arrayType]"); + //if (strpos($typeDef['arrayType'], ':') ) { + if (!in_array($typeDef['arrayType'],$this->typemap['http://www.w3.org/2001/XMLSchema'])) { + $contents .= $this->serializeType('item', $typeDef['arrayType'], $v, $use); + } else { + $contents .= $this->serialize_val($v, 'item', $typeDef['arrayType'], null, $this->XMLSchemaVersion, false, $use); + } + } + } else { + $rows = 0; + $contents = null; + } + // TODO: for now, an empty value will be serialized as a zero element + // array. Revisit this when coding the handling of null/nil values. + if ($use == 'literal') { + $xml = "<$name$elementNS>" + .$contents + .""; + } else { + $xml = "<$name$elementNS xsi:type=\"".$this->getPrefixFromNamespace('http://schemas.xmlsoap.org/soap/encoding/').':Array" '. + $this->getPrefixFromNamespace('http://schemas.xmlsoap.org/soap/encoding/') + .':arrayType="' + .$this->getPrefixFromNamespace($this->getPrefix($typeDef['arrayType'])) + .":".$this->getLocalPart($typeDef['arrayType'])."[$rows$cols]\">" + .$contents + .""; + } + } elseif ($phpType == 'scalar') { + if (isset($typeDef['form']) && ($typeDef['form'] == 'qualified')) { + $elementNS = " xmlns=\"$ns\""; + } else { + if ($unqualified) { + $elementNS = " xmlns=\"\""; + } else { + $elementNS = ''; + } + } + if ($use == 'literal') { + if ($forceType) { + $xml = "<$name$elementNS xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\">$value"; + } else { + $xml = "<$name$elementNS>$value"; + } + } else { + $xml = "<$name$elementNS xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\"$encodingStyle>$value"; + } + } + $this->debug("in serializeType: returning: $xml"); + return $xml; + } + + /** + * serializes the attributes for a complexType + * + * @param array $typeDef our internal representation of an XML schema type (or element) + * @param mixed $value a native PHP value (parameter value) + * @param string $ns the namespace of the type + * @param string $uqType the local part of the type + * @return string value serialized as an XML string + * @access private + */ + function serializeComplexTypeAttributes($typeDef, $value, $ns, $uqType) { + $xml = ''; + if (isset($typeDef['attrs']) && is_array($typeDef['attrs'])) { + $this->debug("serialize attributes for XML Schema type $ns:$uqType"); + if (is_array($value)) { + $xvalue = $value; + } elseif (is_object($value)) { + $xvalue = get_object_vars($value); + } else { + $this->debug("value is neither an array nor an object for XML Schema type $ns:$uqType"); + $xvalue = array(); + } + foreach ($typeDef['attrs'] as $aName => $attrs) { + if (isset($xvalue['!' . $aName])) { + $xname = '!' . $aName; + $this->debug("value provided for attribute $aName with key $xname"); + } elseif (isset($xvalue[$aName])) { + $xname = $aName; + $this->debug("value provided for attribute $aName with key $xname"); + } elseif (isset($attrs['default'])) { + $xname = '!' . $aName; + $xvalue[$xname] = $attrs['default']; + $this->debug('use default value of ' . $xvalue[$aName] . ' for attribute ' . $aName); + } else { + $xname = ''; + $this->debug("no value provided for attribute $aName"); + } + if ($xname) { + $xml .= " $aName=\"" . $this->expandEntities($xvalue[$xname]) . "\""; + } + } + } else { + $this->debug("no attributes to serialize for XML Schema type $ns:$uqType"); + } + if (isset($typeDef['extensionBase'])) { + $ns = $this->getPrefix($typeDef['extensionBase']); + $uqType = $this->getLocalPart($typeDef['extensionBase']); + if ($this->getNamespaceFromPrefix($ns)) { + $ns = $this->getNamespaceFromPrefix($ns); + } + if ($typeDef = $this->getTypeDef($uqType, $ns)) { + $this->debug("serialize attributes for extension base $ns:$uqType"); + $xml .= $this->serializeComplexTypeAttributes($typeDef, $value, $ns, $uqType); + } else { + $this->debug("extension base $ns:$uqType is not a supported type"); + } + } + return $xml; + } + + /** + * serializes the elements for a complexType + * + * @param array $typeDef our internal representation of an XML schema type (or element) + * @param mixed $value a native PHP value (parameter value) + * @param string $ns the namespace of the type + * @param string $uqType the local part of the type + * @param string $use use for part (encoded|literal) + * @param string $encodingStyle SOAP encoding style for the value (if different than the enclosing style) + * @return string value serialized as an XML string + * @access private + */ + function serializeComplexTypeElements($typeDef, $value, $ns, $uqType, $use='encoded', $encodingStyle=false) { + $xml = ''; + if (isset($typeDef['elements']) && is_array($typeDef['elements'])) { + $this->debug("in serializeComplexTypeElements, serialize elements for XML Schema type $ns:$uqType"); + if (is_array($value)) { + $xvalue = $value; + } elseif (is_object($value)) { + $xvalue = get_object_vars($value); + } else { + $this->debug("value is neither an array nor an object for XML Schema type $ns:$uqType"); + $xvalue = array(); + } + // toggle whether all elements are present - ideally should validate against schema + if (count($typeDef['elements']) != count($xvalue)){ + $optionals = true; + } + foreach ($typeDef['elements'] as $eName => $attrs) { + if (!isset($xvalue[$eName])) { + if (isset($attrs['default'])) { + $xvalue[$eName] = $attrs['default']; + $this->debug('use default value of ' . $xvalue[$eName] . ' for element ' . $eName); + } + } + // if user took advantage of a minOccurs=0, then only serialize named parameters + if (isset($optionals) + && (!isset($xvalue[$eName])) + && ( (!isset($attrs['nillable'])) || $attrs['nillable'] != 'true') + ){ + if (isset($attrs['minOccurs']) && $attrs['minOccurs'] <> '0') { + $this->debug("apparent error: no value provided for element $eName with minOccurs=" . $attrs['minOccurs']); + } + // do nothing + $this->debug("no value provided for complexType element $eName and element is not nillable, so serialize nothing"); + } else { + // get value + if (isset($xvalue[$eName])) { + $v = $xvalue[$eName]; + } else { + $v = null; + } + if (isset($attrs['form'])) { + $unqualified = ($attrs['form'] == 'unqualified'); + } else { + $unqualified = false; + } + if (isset($attrs['maxOccurs']) && ($attrs['maxOccurs'] == 'unbounded' || $attrs['maxOccurs'] > 1) && isset($v) && is_array($v) && $this->isArraySimpleOrStruct($v) == 'arraySimple') { + $vv = $v; + foreach ($vv as $k => $v) { + if (isset($attrs['type']) || isset($attrs['ref'])) { + // serialize schema-defined type + $xml .= $this->serializeType($eName, isset($attrs['type']) ? $attrs['type'] : $attrs['ref'], $v, $use, $encodingStyle, $unqualified); + } else { + // serialize generic type (can this ever really happen?) + $this->debug("calling serialize_val() for $v, $eName, false, false, false, false, $use"); + $xml .= $this->serialize_val($v, $eName, false, false, false, false, $use); + } + } + } else { + if (isset($attrs['type']) || isset($attrs['ref'])) { + // serialize schema-defined type + $xml .= $this->serializeType($eName, isset($attrs['type']) ? $attrs['type'] : $attrs['ref'], $v, $use, $encodingStyle, $unqualified); + } else { + // serialize generic type (can this ever really happen?) + $this->debug("calling serialize_val() for $v, $eName, false, false, false, false, $use"); + $xml .= $this->serialize_val($v, $eName, false, false, false, false, $use); + } + } + } + } + } else { + $this->debug("no elements to serialize for XML Schema type $ns:$uqType"); + } + if (isset($typeDef['extensionBase'])) { + $ns = $this->getPrefix($typeDef['extensionBase']); + $uqType = $this->getLocalPart($typeDef['extensionBase']); + if ($this->getNamespaceFromPrefix($ns)) { + $ns = $this->getNamespaceFromPrefix($ns); + } + if ($typeDef = $this->getTypeDef($uqType, $ns)) { + $this->debug("serialize elements for extension base $ns:$uqType"); + $xml .= $this->serializeComplexTypeElements($typeDef, $value, $ns, $uqType, $use, $encodingStyle); + } else { + $this->debug("extension base $ns:$uqType is not a supported type"); + } + } + return $xml; + } + + /** + * adds an XML Schema complex type to the WSDL types + * + * @param string name + * @param string typeClass (complexType|simpleType|attribute) + * @param string phpType: currently supported are array and struct (php assoc array) + * @param string compositor (all|sequence|choice) + * @param string restrictionBase namespace:name (http://schemas.xmlsoap.org/soap/encoding/:Array) + * @param array elements = array ( name => array(name=>'',type=>'') ) + * @param array attrs = array(array('ref'=>'SOAP-ENC:arrayType','wsdl:arrayType'=>'xsd:string[]')) + * @param string arrayType: namespace:name (xsd:string) + * @see xmlschema + * @access public + */ + function addComplexType($name,$typeClass='complexType',$phpType='array',$compositor='',$restrictionBase='',$elements=array(),$attrs=array(),$arrayType='') { + if (count($elements) > 0) { + foreach($elements as $n => $e){ + // expand each element + foreach ($e as $k => $v) { + $k = strpos($k,':') ? $this->expandQname($k) : $k; + $v = strpos($v,':') ? $this->expandQname($v) : $v; + $ee[$k] = $v; + } + $eElements[$n] = $ee; + } + $elements = $eElements; + } + + if (count($attrs) > 0) { + foreach($attrs as $n => $a){ + // expand each attribute + foreach ($a as $k => $v) { + $k = strpos($k,':') ? $this->expandQname($k) : $k; + $v = strpos($v,':') ? $this->expandQname($v) : $v; + $aa[$k] = $v; + } + $eAttrs[$n] = $aa; + } + $attrs = $eAttrs; + } + + $restrictionBase = strpos($restrictionBase,':') ? $this->expandQname($restrictionBase) : $restrictionBase; + $arrayType = strpos($arrayType,':') ? $this->expandQname($arrayType) : $arrayType; + + $typens = isset($this->namespaces['types']) ? $this->namespaces['types'] : $this->namespaces['tns']; + $this->schemas[$typens][0]->addComplexType($name,$typeClass,$phpType,$compositor,$restrictionBase,$elements,$attrs,$arrayType); + } + + /** + * adds an XML Schema simple type to the WSDL types + * + * @param string $name + * @param string $restrictionBase namespace:name (http://schemas.xmlsoap.org/soap/encoding/:Array) + * @param string $typeClass (should always be simpleType) + * @param string $phpType (should always be scalar) + * @param array $enumeration array of values + * @see xmlschema + * @access public + */ + function addSimpleType($name, $restrictionBase='', $typeClass='simpleType', $phpType='scalar', $enumeration=array()) { + $restrictionBase = strpos($restrictionBase,':') ? $this->expandQname($restrictionBase) : $restrictionBase; + + $typens = isset($this->namespaces['types']) ? $this->namespaces['types'] : $this->namespaces['tns']; + $this->schemas[$typens][0]->addSimpleType($name, $restrictionBase, $typeClass, $phpType, $enumeration); + } + + /** + * adds an element to the WSDL types + * + * @param array $attrs attributes that must include name and type + * @see xmlschema + * @access public + */ + function addElement($attrs) { + $typens = isset($this->namespaces['types']) ? $this->namespaces['types'] : $this->namespaces['tns']; + $this->schemas[$typens][0]->addElement($attrs); + } + + /** + * register an operation with the server + * + * @param string $name operation (method) name + * @param array $in assoc array of input values: key = param name, value = param type + * @param array $out assoc array of output values: key = param name, value = param type + * @param string $namespace optional The namespace for the operation + * @param string $soapaction optional The soapaction for the operation + * @param string $style (rpc|document) optional The style for the operation Note: when 'document' is specified, parameter and return wrappers are created for you automatically + * @param string $use (encoded|literal) optional The use for the parameters (cannot mix right now) + * @param string $documentation optional The description to include in the WSDL + * @param string $encodingStyle optional (usually 'http://schemas.xmlsoap.org/soap/encoding/' for encoded) + * @access public + */ + function addOperation($name, $in = false, $out = false, $namespace = false, $soapaction = false, $style = 'rpc', $use = 'encoded', $documentation = '', $encodingStyle = ''){ + if ($use == 'encoded' && $encodingStyle == '') { + $encodingStyle = 'http://schemas.xmlsoap.org/soap/encoding/'; + } + + if ($style == 'document') { + $elements = array(); + foreach ($in as $n => $t) { + $elements[$n] = array('name' => $n, 'type' => $t); + } + $this->addComplexType($name . 'RequestType', 'complexType', 'struct', 'all', '', $elements); + $this->addElement(array('name' => $name, 'type' => $name . 'RequestType')); + $in = array('parameters' => 'tns:' . $name); + + $elements = array(); + foreach ($out as $n => $t) { + $elements[$n] = array('name' => $n, 'type' => $t); + } + $this->addComplexType($name . 'ResponseType', 'complexType', 'struct', 'all', '', $elements); + $this->addElement(array('name' => $name . 'Response', 'type' => $name . 'ResponseType')); + $out = array('parameters' => 'tns:' . $name . 'Response'); + } + + // get binding + $this->bindings[ $this->serviceName . 'Binding' ]['operations'][$name] = + array( + 'name' => $name, + 'binding' => $this->serviceName . 'Binding', + 'endpoint' => $this->endpoint, + 'soapAction' => $soapaction, + 'style' => $style, + 'input' => array( + 'use' => $use, + 'namespace' => $namespace, + 'encodingStyle' => $encodingStyle, + 'message' => $name . 'Request', + 'parts' => $in), + 'output' => array( + 'use' => $use, + 'namespace' => $namespace, + 'encodingStyle' => $encodingStyle, + 'message' => $name . 'Response', + 'parts' => $out), + 'namespace' => $namespace, + 'transport' => 'http://schemas.xmlsoap.org/soap/http', + 'documentation' => $documentation); + // add portTypes + // add messages + if($in) + { + foreach($in as $pName => $pType) + { + if(strpos($pType,':')) { + $pType = $this->getNamespaceFromPrefix($this->getPrefix($pType)).":".$this->getLocalPart($pType); + } + $this->messages[$name.'Request'][$pName] = $pType; + } + } else { + $this->messages[$name.'Request']= '0'; + } + if($out) + { + foreach($out as $pName => $pType) + { + if(strpos($pType,':')) { + $pType = $this->getNamespaceFromPrefix($this->getPrefix($pType)).":".$this->getLocalPart($pType); + } + $this->messages[$name.'Response'][$pName] = $pType; + } + } else { + $this->messages[$name.'Response']= '0'; + } + return true; + } +} + +?> \ No newline at end of file diff --git a/thirdparty/pear/class.wsdlcache.php b/thirdparty/pear/class.wsdlcache.php new file mode 100644 index 000000000..cea4fc208 --- /dev/null +++ b/thirdparty/pear/class.wsdlcache.php @@ -0,0 +1,211 @@ + +* @author Ingo Fischer +* @version $Id: class.wsdlcache.php,v 1.5 2005/05/20 17:58:17 snichol Exp $ +* @access public +*/ +class wsdlcache { + /** + * @var resource + * @access private + */ + var $fplock; + /** + * @var integer + * @access private + */ + var $cache_lifetime; + /** + * @var string + * @access private + */ + var $cache_dir; + /** + * @var string + * @access public + */ + var $debug_str = ''; + + /** + * constructor + * + * @param string $cache_dir directory for cache-files + * @param integer $cache_lifetime lifetime for caching-files in seconds or 0 for unlimited + * @access public + */ + function wsdlcache($cache_dir='.', $cache_lifetime=0) { + $this->fplock = array(); + $this->cache_dir = $cache_dir != '' ? $cache_dir : '.'; + $this->cache_lifetime = $cache_lifetime; + } + + /** + * creates the filename used to cache a wsdl instance + * + * @param string $wsdl The URL of the wsdl instance + * @return string The filename used to cache the instance + * @access private + */ + function createFilename($wsdl) { + if(!class_exists('G')){ + $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); + $docuroot = explode( '/', $realdocuroot ); + array_pop( $docuroot ); + $pathhome = implode( '/', $docuroot ) . '/'; + array_pop( $docuroot ); + $pathTrunk = implode( '/', $docuroot ) . '/'; + require_once($pathTrunk.'gulliver/system/class.g.php'); + } + return $this->cache_dir.'/wsdlcache-' . G::encryptOld($wsdl); + } + + /** + * adds debug data to the class level debug string + * + * @param string $string debug data + * @access private + */ + function debug($string){ + $this->debug_str .= get_class($this).": $string\n"; + } + + /** + * gets a wsdl instance from the cache + * + * @param string $wsdl The URL of the wsdl instance + * @return object wsdl The cached wsdl instance, null if the instance is not in the cache + * @access public + */ + function get($wsdl) { + $filename = $this->createFilename($wsdl); + if ($this->obtainMutex($filename, "r")) { + // check for expired WSDL that must be removed from the cache + if ($this->cache_lifetime > 0) { + if (file_exists($filename) && (time() - filemtime($filename) > $this->cache_lifetime)) { + unlink($filename); + $this->debug("Expired $wsdl ($filename) from cache"); + $this->releaseMutex($filename); + return null; + } + } + // see what there is to return + $fp = @fopen($filename, "r"); + if ($fp) { + $s = implode("", @file($filename)); + fclose($fp); + $this->debug("Got $wsdl ($filename) from cache"); + } else { + $s = null; + $this->debug("$wsdl ($filename) not in cache"); + } + $this->releaseMutex($filename); + return (!is_null($s)) ? unserialize($s) : null; + } else { + $this->debug("Unable to obtain mutex for $filename in get"); + } + return null; + } + + /** + * obtains the local mutex + * + * @param string $filename The Filename of the Cache to lock + * @param string $mode The open-mode ("r" or "w") or the file - affects lock-mode + * @return boolean Lock successfully obtained ?! + * @access private + */ + function obtainMutex($filename, $mode) { + if(!class_exists('G')){ + $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); + $docuroot = explode( '/', $realdocuroot ); + array_pop( $docuroot ); + $pathhome = implode( '/', $docuroot ) . '/'; + array_pop( $docuroot ); + $pathTrunk = implode( '/', $docuroot ) . '/'; + require_once($pathTrunk.'gulliver/system/class.g.php'); + } + if (isset($this->fplock[G::encryptOld($filename)])) { + $this->debug("Lock for $filename already exists"); + return false; + } + $this->fplock[G::encryptOld($filename)] = fopen($filename.".lock", "w"); + if ($mode == "r") { + return flock($this->fplock[G::encryptOld($filename)], LOCK_SH); + } else { + return flock($this->fplock[G::encryptOld($filename)], LOCK_EX); + } + } + + /** + * adds a wsdl instance to the cache + * + * @param object wsdl $wsdl_instance The wsdl instance to add + * @return boolean WSDL successfully cached + * @access public + */ + function put($wsdl_instance) { + $filename = $this->createFilename($wsdl_instance->wsdl); + $s = serialize($wsdl_instance); + if ($this->obtainMutex($filename, "w")) { + $fp = fopen($filename, "w"); + fputs($fp, $s); + fclose($fp); + $this->debug("Put $wsdl_instance->wsdl ($filename) in cache"); + $this->releaseMutex($filename); + return true; + } else { + $this->debug("Unable to obtain mutex for $filename in put"); + } + return false; + } + + /** + * releases the local mutex + * + * @param string $filename The Filename of the Cache to lock + * @return boolean Lock successfully released + * @access private + */ + function releaseMutex($filename) { + if(!class_exists('G')){ + $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); + $docuroot = explode( '/', $realdocuroot ); + array_pop( $docuroot ); + $pathhome = implode( '/', $docuroot ) . '/'; + array_pop( $docuroot ); + $pathTrunk = implode( '/', $docuroot ) . '/'; + require_once($pathTrunk.'gulliver/system/class.g.php'); + } + $ret = flock($this->fplock[G::encryptOld($filename)], LOCK_UN); + fclose($this->fplock[G::encryptOld($filename)]); + unset($this->fplock[G::encryptOld($filename)]); + if (! $ret) { + $this->debug("Not able to release lock for $filename"); + } + return $ret; + } + + /** + * removes a wsdl instance from the cache + * + * @param string $wsdl The URL of the wsdl instance + * @return boolean Whether there was an instance to remove + * @access public + */ + function remove($wsdl) { + $filename = $this->createFilename($wsdl); + // ignore errors obtaining mutex + $this->obtainMutex($filename, "w"); + $ret = unlink($filename); + $this->debug("Removed ($ret) $wsdl ($filename) from cache"); + $this->releaseMutex($filename); + return $ret; + } +} +?> diff --git a/thirdparty/pear/class.xmlschema.php b/thirdparty/pear/class.xmlschema.php new file mode 100644 index 000000000..30d8558d7 --- /dev/null +++ b/thirdparty/pear/class.xmlschema.php @@ -0,0 +1,906 @@ + +* @version $Id: class.xmlschema.php,v 1.39 2005/08/04 01:27:42 snichol Exp $ +* @access public +*/ +class XMLSchema extends nusoap_base { + + // files + var $schema = ''; + var $xml = ''; + // namespaces + var $enclosingNamespaces; + // schema info + var $schemaInfo = array(); + var $schemaTargetNamespace = ''; + // types, elements, attributes defined by the schema + var $attributes = array(); + var $complexTypes = array(); + var $complexTypeStack = array(); + var $currentComplexType = null; + var $elements = array(); + var $elementStack = array(); + var $currentElement = null; + var $simpleTypes = array(); + var $simpleTypeStack = array(); + var $currentSimpleType = null; + // imports + var $imports = array(); + // parser vars + var $parser; + var $position = 0; + var $depth = 0; + var $depth_array = array(); + var $message = array(); + var $defaultNamespace = array(); + + /** + * constructor + * + * @param string $schema schema document URI + * @param string $xml xml document URI + * @param string $namespaces namespaces defined in enclosing XML + * @access public + */ + function XMLSchema($schema='',$xml='',$namespaces=array()){ + parent::nusoap_base(); + $this->debug('xmlschema class instantiated, inside constructor'); + // files + $this->schema = $schema; + $this->xml = $xml; + + // namespaces + $this->enclosingNamespaces = $namespaces; + $this->namespaces = array_merge($this->namespaces, $namespaces); + + // parse schema file + if($schema != ''){ + $this->debug('initial schema file: '.$schema); + $this->parseFile($schema, 'schema'); + } + + // parse xml file + if($xml != ''){ + $this->debug('initial xml file: '.$xml); + $this->parseFile($xml, 'xml'); + } + + } + + /** + * parse an XML file + * + * @param string $xml, path/URL to XML file + * @param string $type, (schema | xml) + * @return boolean + * @access public + */ + function parseFile($xml,$type){ + // parse xml file + if($xml != ""){ + $xmlStr = @join("",@file($xml)); + if($xmlStr == ""){ + $msg = 'Error reading XML from '.$xml; + $this->setError($msg); + $this->debug($msg); + return false; + } else { + $this->debug("parsing $xml"); + $this->parseString($xmlStr,$type); + $this->debug("done parsing $xml"); + return true; + } + } + return false; + } + + /** + * parse an XML string + * + * @param string $xml path or URL + * @param string $type, (schema|xml) + * @access private + */ + function parseString($xml,$type){ + // parse xml string + if($xml != ""){ + + // Create an XML parser. + $this->parser = xml_parser_create(); + // Set the options for parsing the XML data. + xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, 0); + + // Set the object for the parser. + xml_set_object($this->parser, $this); + + // Set the element handlers for the parser. + if($type == "schema"){ + xml_set_element_handler($this->parser, 'schemaStartElement','schemaEndElement'); + xml_set_character_data_handler($this->parser,'schemaCharacterData'); + } elseif($type == "xml"){ + xml_set_element_handler($this->parser, 'xmlStartElement','xmlEndElement'); + xml_set_character_data_handler($this->parser,'xmlCharacterData'); + } + + // Parse the XML file. + if(!xml_parse($this->parser,$xml,true)){ + // Display an error message. + $errstr = sprintf('XML error parsing XML schema on line %d: %s', + xml_get_current_line_number($this->parser), + xml_error_string(xml_get_error_code($this->parser)) + ); + $this->debug($errstr); + $this->debug("XML payload:\n" . $xml); + $this->setError($errstr); + } + + xml_parser_free($this->parser); + } else{ + $this->debug('no xml passed to parseString()!!'); + $this->setError('no xml passed to parseString()!!'); + } + } + + /** + * start-element handler + * + * @param string $parser XML parser object + * @param string $name element name + * @param string $attrs associative array of attributes + * @access private + */ + function schemaStartElement($parser, $name, $attrs) { + + // position in the total number of elements, starting from 0 + $pos = $this->position++; + $depth = $this->depth++; + // set self as current value for this depth + $this->depth_array[$depth] = $pos; + $this->message[$pos] = array('cdata' => ''); + if ($depth > 0) { + $this->defaultNamespace[$pos] = $this->defaultNamespace[$this->depth_array[$depth - 1]]; + } else { + $this->defaultNamespace[$pos] = false; + } + + // get element prefix + if($prefix = $this->getPrefix($name)){ + // get unqualified name + $name = $this->getLocalPart($name); + } else { + $prefix = ''; + } + + // loop thru attributes, expanding, and registering namespace declarations + if(count($attrs) > 0){ + foreach($attrs as $k => $v){ + // if ns declarations, add to class level array of valid namespaces + if(ereg("^xmlns",$k)){ + //$this->xdebug("$k: $v"); + //$this->xdebug('ns_prefix: '.$this->getPrefix($k)); + if($ns_prefix = substr(strrchr($k,':'),1)){ + //$this->xdebug("Add namespace[$ns_prefix] = $v"); + $this->namespaces[$ns_prefix] = $v; + } else { + $this->defaultNamespace[$pos] = $v; + if (! $this->getPrefixFromNamespace($v)) { + $this->namespaces['ns'.(count($this->namespaces)+1)] = $v; + } + } + if($v == 'http://www.w3.org/2001/XMLSchema' || $v == 'http://www.w3.org/1999/XMLSchema' || $v == 'http://www.w3.org/2000/10/XMLSchema'){ + $this->XMLSchemaVersion = $v; + $this->namespaces['xsi'] = $v.'-instance'; + } + } + } + foreach($attrs as $k => $v){ + // expand each attribute + $k = strpos($k,':') ? $this->expandQname($k) : $k; + $v = strpos($v,':') ? $this->expandQname($v) : $v; + $eAttrs[$k] = $v; + } + $attrs = $eAttrs; + } else { + $attrs = array(); + } + // find status, register data + switch($name){ + case 'all': // (optional) compositor content for a complexType + case 'choice': + case 'group': + case 'sequence': + //$this->xdebug("compositor $name for currentComplexType: $this->currentComplexType and currentElement: $this->currentElement"); + $this->complexTypes[$this->currentComplexType]['compositor'] = $name; + //if($name == 'all' || $name == 'sequence'){ + // $this->complexTypes[$this->currentComplexType]['phpType'] = 'struct'; + //} + break; + case 'attribute': // complexType attribute + //$this->xdebug("parsing attribute $attrs[name] $attrs[ref] of value: ".$attrs['http://schemas.xmlsoap.org/wsdl/:arrayType']); + $this->xdebug("parsing attribute:"); + $this->appendDebug($this->varDump($attrs)); + if (!isset($attrs['form'])) { + $attrs['form'] = $this->schemaInfo['attributeFormDefault']; + } + if (isset($attrs['http://schemas.xmlsoap.org/wsdl/:arrayType'])) { + $v = $attrs['http://schemas.xmlsoap.org/wsdl/:arrayType']; + if (!strpos($v, ':')) { + // no namespace in arrayType attribute value... + if ($this->defaultNamespace[$pos]) { + // ...so use the default + $attrs['http://schemas.xmlsoap.org/wsdl/:arrayType'] = $this->defaultNamespace[$pos] . ':' . $attrs['http://schemas.xmlsoap.org/wsdl/:arrayType']; + } + } + } + if(isset($attrs['name'])){ + $this->attributes[$attrs['name']] = $attrs; + $aname = $attrs['name']; + } elseif(isset($attrs['ref']) && $attrs['ref'] == 'http://schemas.xmlsoap.org/soap/encoding/:arrayType'){ + if (isset($attrs['http://schemas.xmlsoap.org/wsdl/:arrayType'])) { + $aname = $attrs['http://schemas.xmlsoap.org/wsdl/:arrayType']; + } else { + $aname = ''; + } + } elseif(isset($attrs['ref'])){ + $aname = $attrs['ref']; + $this->attributes[$attrs['ref']] = $attrs; + } + + if($this->currentComplexType){ // This should *always* be + $this->complexTypes[$this->currentComplexType]['attrs'][$aname] = $attrs; + } + // arrayType attribute + if(isset($attrs['http://schemas.xmlsoap.org/wsdl/:arrayType']) || $this->getLocalPart($aname) == 'arrayType'){ + $this->complexTypes[$this->currentComplexType]['phpType'] = 'array'; + $prefix = $this->getPrefix($aname); + if(isset($attrs['http://schemas.xmlsoap.org/wsdl/:arrayType'])){ + $v = $attrs['http://schemas.xmlsoap.org/wsdl/:arrayType']; + } else { + $v = ''; + } + if(strpos($v,'[,]')){ + $this->complexTypes[$this->currentComplexType]['multidimensional'] = true; + } + $v = substr($v,0,strpos($v,'[')); // clip the [] + if(!strpos($v,':') && isset($this->typemap[$this->XMLSchemaVersion][$v])){ + $v = $this->XMLSchemaVersion.':'.$v; + } + $this->complexTypes[$this->currentComplexType]['arrayType'] = $v; + } + break; + case 'complexContent': // (optional) content for a complexType + break; + case 'complexType': + array_push($this->complexTypeStack, $this->currentComplexType); + if(isset($attrs['name'])){ + $this->xdebug('processing named complexType '.$attrs['name']); + //$this->currentElement = false; + $this->currentComplexType = $attrs['name']; + $this->complexTypes[$this->currentComplexType] = $attrs; + $this->complexTypes[$this->currentComplexType]['typeClass'] = 'complexType'; + // This is for constructs like + // + // + // + // + // + if(isset($attrs['base']) && ereg(':Array$',$attrs['base'])){ + $this->xdebug('complexType is unusual array'); + $this->complexTypes[$this->currentComplexType]['phpType'] = 'array'; + } else { + $this->complexTypes[$this->currentComplexType]['phpType'] = 'struct'; + } + }else{ + $this->xdebug('processing unnamed complexType for element '.$this->currentElement); + $this->currentComplexType = $this->currentElement . '_ContainedType'; + //$this->currentElement = false; + $this->complexTypes[$this->currentComplexType] = $attrs; + $this->complexTypes[$this->currentComplexType]['typeClass'] = 'complexType'; + // This is for constructs like + // + // + // + // + // + if(isset($attrs['base']) && ereg(':Array$',$attrs['base'])){ + $this->xdebug('complexType is unusual array'); + $this->complexTypes[$this->currentComplexType]['phpType'] = 'array'; + } else { + $this->complexTypes[$this->currentComplexType]['phpType'] = 'struct'; + } + } + break; + case 'element': + array_push($this->elementStack, $this->currentElement); + // elements defined as part of a complex type should + // not really be added to $this->elements, but for some + // reason, they are + if (!isset($attrs['form'])) { + $attrs['form'] = $this->schemaInfo['elementFormDefault']; + } + if(isset($attrs['type'])){ + $this->xdebug("processing typed element ".$attrs['name']." of type ".$attrs['type']); + if (! $this->getPrefix($attrs['type'])) { + if ($this->defaultNamespace[$pos]) { + $attrs['type'] = $this->defaultNamespace[$pos] . ':' . $attrs['type']; + $this->xdebug('used default namespace to make type ' . $attrs['type']); + } + } + // This is for constructs like + // + // + // + // + // + if ($this->currentComplexType && $this->complexTypes[$this->currentComplexType]['phpType'] == 'array') { + $this->xdebug('arrayType for unusual array is ' . $attrs['type']); + $this->complexTypes[$this->currentComplexType]['arrayType'] = $attrs['type']; + } + $this->currentElement = $attrs['name']; + $this->elements[ $attrs['name'] ] = $attrs; + $this->elements[ $attrs['name'] ]['typeClass'] = 'element'; + $ename = $attrs['name']; + } elseif(isset($attrs['ref'])){ + $this->xdebug("processing element as ref to ".$attrs['ref']); + $this->currentElement = "ref to ".$attrs['ref']; + $ename = $this->getLocalPart($attrs['ref']); + } else { + $this->xdebug("processing untyped element ".$attrs['name']); + $this->currentElement = $attrs['name']; + $this->elements[ $attrs['name'] ] = $attrs; + $this->elements[ $attrs['name'] ]['typeClass'] = 'element'; + $attrs['type'] = $this->schemaTargetNamespace . ':' . $attrs['name'] . '_ContainedType'; + $this->elements[ $attrs['name'] ]['type'] = $attrs['type']; + $ename = $attrs['name']; + } + if(isset($ename) && $this->currentComplexType){ + $this->complexTypes[$this->currentComplexType]['elements'][$ename] = $attrs; + } + break; + case 'enumeration': // restriction value list member + $this->xdebug('enumeration ' . $attrs['value']); + if ($this->currentSimpleType) { + $this->simpleTypes[$this->currentSimpleType]['enumeration'][] = $attrs['value']; + } elseif ($this->currentComplexType) { + $this->complexTypes[$this->currentComplexType]['enumeration'][] = $attrs['value']; + } + break; + case 'extension': // simpleContent or complexContent type extension + $this->xdebug('extension ' . $attrs['base']); + if ($this->currentComplexType) { + $this->complexTypes[$this->currentComplexType]['extensionBase'] = $attrs['base']; + } + break; + case 'import': + if (isset($attrs['schemaLocation'])) { + //$this->xdebug('import namespace ' . $attrs['namespace'] . ' from ' . $attrs['schemaLocation']); + $this->imports[$attrs['namespace']][] = array('location' => $attrs['schemaLocation'], 'loaded' => false); + } else { + //$this->xdebug('import namespace ' . $attrs['namespace']); + $this->imports[$attrs['namespace']][] = array('location' => '', 'loaded' => true); + if (! $this->getPrefixFromNamespace($attrs['namespace'])) { + $this->namespaces['ns'.(count($this->namespaces)+1)] = $attrs['namespace']; + } + } + break; + case 'list': // simpleType value list + break; + case 'restriction': // simpleType, simpleContent or complexContent value restriction + $this->xdebug('restriction ' . $attrs['base']); + if($this->currentSimpleType){ + $this->simpleTypes[$this->currentSimpleType]['type'] = $attrs['base']; + } elseif($this->currentComplexType){ + $this->complexTypes[$this->currentComplexType]['restrictionBase'] = $attrs['base']; + if(strstr($attrs['base'],':') == ':Array'){ + $this->complexTypes[$this->currentComplexType]['phpType'] = 'array'; + } + } + break; + case 'schema': + $this->schemaInfo = $attrs; + $this->schemaInfo['schemaVersion'] = $this->getNamespaceFromPrefix($prefix); + if (isset($attrs['targetNamespace'])) { + $this->schemaTargetNamespace = $attrs['targetNamespace']; + } + if (!isset($attrs['elementFormDefault'])) { + $this->schemaInfo['elementFormDefault'] = 'unqualified'; + } + if (!isset($attrs['attributeFormDefault'])) { + $this->schemaInfo['attributeFormDefault'] = 'unqualified'; + } + break; + case 'simpleContent': // (optional) content for a complexType + break; + case 'simpleType': + array_push($this->simpleTypeStack, $this->currentSimpleType); + if(isset($attrs['name'])){ + $this->xdebug("processing simpleType for name " . $attrs['name']); + $this->currentSimpleType = $attrs['name']; + $this->simpleTypes[ $attrs['name'] ] = $attrs; + $this->simpleTypes[ $attrs['name'] ]['typeClass'] = 'simpleType'; + $this->simpleTypes[ $attrs['name'] ]['phpType'] = 'scalar'; + } else { + $this->xdebug('processing unnamed simpleType for element '.$this->currentElement); + $this->currentSimpleType = $this->currentElement . '_ContainedType'; + //$this->currentElement = false; + $this->simpleTypes[$this->currentSimpleType] = $attrs; + $this->simpleTypes[$this->currentSimpleType]['phpType'] = 'scalar'; + } + break; + case 'union': // simpleType type list + break; + default: + //$this->xdebug("do not have anything to do for element $name"); + } + } + + /** + * end-element handler + * + * @param string $parser XML parser object + * @param string $name element name + * @access private + */ + function schemaEndElement($parser, $name) { + // bring depth down a notch + $this->depth--; + // position of current element is equal to the last value left in depth_array for my depth + if(isset($this->depth_array[$this->depth])){ + $pos = $this->depth_array[$this->depth]; + } + // get element prefix + if ($prefix = $this->getPrefix($name)){ + // get unqualified name + $name = $this->getLocalPart($name); + } else { + $prefix = ''; + } + // move on... + if($name == 'complexType'){ + $this->xdebug('done processing complexType ' . ($this->currentComplexType ? $this->currentComplexType : '(unknown)')); + $this->currentComplexType = array_pop($this->complexTypeStack); + //$this->currentElement = false; + } + if($name == 'element'){ + $this->xdebug('done processing element ' . ($this->currentElement ? $this->currentElement : '(unknown)')); + $this->currentElement = array_pop($this->elementStack); + } + if($name == 'simpleType'){ + $this->xdebug('done processing simpleType ' . ($this->currentSimpleType ? $this->currentSimpleType : '(unknown)')); + $this->currentSimpleType = array_pop($this->simpleTypeStack); + } + } + + /** + * element content handler + * + * @param string $parser XML parser object + * @param string $data element content + * @access private + */ + function schemaCharacterData($parser, $data){ + $pos = $this->depth_array[$this->depth - 1]; + $this->message[$pos]['cdata'] .= $data; + } + + /** + * serialize the schema + * + * @access public + */ + function serializeSchema(){ + + $schemaPrefix = $this->getPrefixFromNamespace($this->XMLSchemaVersion); + $xml = ''; + // imports + if (sizeof($this->imports) > 0) { + foreach($this->imports as $ns => $list) { + foreach ($list as $ii) { + if ($ii['location'] != '') { + $xml .= " <$schemaPrefix:import location=\"" . $ii['location'] . '" namespace="' . $ns . "\" />\n"; + } else { + $xml .= " <$schemaPrefix:import namespace=\"" . $ns . "\" />\n"; + } + } + } + } + // complex types + foreach($this->complexTypes as $typeName => $attrs){ + $contentStr = ''; + // serialize child elements + if(isset($attrs['elements']) && (count($attrs['elements']) > 0)){ + foreach($attrs['elements'] as $element => $eParts){ + if(isset($eParts['ref'])){ + $contentStr .= " <$schemaPrefix:element ref=\"$element\"/>\n"; + } else { + $contentStr .= " <$schemaPrefix:element name=\"$element\" type=\"" . $this->contractQName($eParts['type']) . "\""; + foreach ($eParts as $aName => $aValue) { + // handle, e.g., abstract, default, form, minOccurs, maxOccurs, nillable + if ($aName != 'name' && $aName != 'type') { + $contentStr .= " $aName=\"$aValue\""; + } + } + $contentStr .= "/>\n"; + } + } + // compositor wraps elements + if (isset($attrs['compositor']) && ($attrs['compositor'] != '')) { + $contentStr = " <$schemaPrefix:$attrs[compositor]>\n".$contentStr." \n"; + } + } + // attributes + if(isset($attrs['attrs']) && (count($attrs['attrs']) >= 1)){ + foreach($attrs['attrs'] as $attr => $aParts){ + $contentStr .= " <$schemaPrefix:attribute"; + foreach ($aParts as $a => $v) { + if ($a == 'ref' || $a == 'type') { + $contentStr .= " $a=\"".$this->contractQName($v).'"'; + } elseif ($a == 'http://schemas.xmlsoap.org/wsdl/:arrayType') { + $this->usedNamespaces['wsdl'] = $this->namespaces['wsdl']; + $contentStr .= ' wsdl:arrayType="'.$this->contractQName($v).'"'; + } else { + $contentStr .= " $a=\"$v\""; + } + } + $contentStr .= "/>\n"; + } + } + // if restriction + if (isset($attrs['restrictionBase']) && $attrs['restrictionBase'] != ''){ + $contentStr = " <$schemaPrefix:restriction base=\"".$this->contractQName($attrs['restrictionBase'])."\">\n".$contentStr." \n"; + // complex or simple content + if ((isset($attrs['elements']) && count($attrs['elements']) > 0) || (isset($attrs['attrs']) && count($attrs['attrs']) > 0)){ + $contentStr = " <$schemaPrefix:complexContent>\n".$contentStr." \n"; + } + } + // finalize complex type + if($contentStr != ''){ + $contentStr = " <$schemaPrefix:complexType name=\"$typeName\">\n".$contentStr." \n"; + } else { + $contentStr = " <$schemaPrefix:complexType name=\"$typeName\"/>\n"; + } + $xml .= $contentStr; + } + // simple types + if(isset($this->simpleTypes) && count($this->simpleTypes) > 0){ + foreach($this->simpleTypes as $typeName => $eParts){ + $xml .= " <$schemaPrefix:simpleType name=\"$typeName\">\n <$schemaPrefix:restriction base=\"".$this->contractQName($eParts['type'])."\"/>\n"; + if (isset($eParts['enumeration'])) { + foreach ($eParts['enumeration'] as $e) { + $xml .= " <$schemaPrefix:enumeration value=\"$e\"/>\n"; + } + } + $xml .= " "; + } + } + // elements + if(isset($this->elements) && count($this->elements) > 0){ + foreach($this->elements as $element => $eParts){ + $xml .= " <$schemaPrefix:element name=\"$element\" type=\"".$this->contractQName($eParts['type'])."\"/>\n"; + } + } + // attributes + if(isset($this->attributes) && count($this->attributes) > 0){ + foreach($this->attributes as $attr => $aParts){ + $xml .= " <$schemaPrefix:attribute name=\"$attr\" type=\"".$this->contractQName($aParts['type'])."\"\n/>"; + } + } + // finish 'er up + $el = "<$schemaPrefix:schema targetNamespace=\"$this->schemaTargetNamespace\"\n"; + foreach (array_diff($this->usedNamespaces, $this->enclosingNamespaces) as $nsp => $ns) { + $el .= " xmlns:$nsp=\"$ns\"\n"; + } + $xml = $el . ">\n".$xml."\n"; + return $xml; + } + + /** + * adds debug data to the clas level debug string + * + * @param string $string debug data + * @access private + */ + function xdebug($string){ + $this->debug('<' . $this->schemaTargetNamespace . '> '.$string); + } + + /** + * get the PHP type of a user defined type in the schema + * PHP type is kind of a misnomer since it actually returns 'struct' for assoc. arrays + * returns false if no type exists, or not w/ the given namespace + * else returns a string that is either a native php type, or 'struct' + * + * @param string $type, name of defined type + * @param string $ns, namespace of type + * @return mixed + * @access public + * @deprecated + */ + function getPHPType($type,$ns){ + if(isset($this->typemap[$ns][$type])){ + //print "found type '$type' and ns $ns in typemap
    "; + return $this->typemap[$ns][$type]; + } elseif(isset($this->complexTypes[$type])){ + //print "getting type '$type' and ns $ns from complexTypes array
    "; + return $this->complexTypes[$type]['phpType']; + } + return false; + } + + /** + * returns an associative array of information about a given type + * returns false if no type exists by the given name + * + * For a complexType typeDef = array( + * 'restrictionBase' => '', + * 'phpType' => '', + * 'compositor' => '(sequence|all)', + * 'elements' => array(), // refs to elements array + * 'attrs' => array() // refs to attributes array + * ... and so on (see addComplexType) + * ) + * + * For simpleType or element, the array has different keys. + * + * @param string + * @return mixed + * @access public + * @see addComplexType + * @see addSimpleType + * @see addElement + */ + function getTypeDef($type){ + //$this->debug("in getTypeDef for type $type"); + if(isset($this->complexTypes[$type])){ + $this->xdebug("in getTypeDef, found complexType $type"); + return $this->complexTypes[$type]; + } elseif(isset($this->simpleTypes[$type])){ + $this->xdebug("in getTypeDef, found simpleType $type"); + if (!isset($this->simpleTypes[$type]['phpType'])) { + // get info for type to tack onto the simple type + // TODO: can this ever really apply (i.e. what is a simpleType really?) + $uqType = substr($this->simpleTypes[$type]['type'], strrpos($this->simpleTypes[$type]['type'], ':') + 1); + $ns = substr($this->simpleTypes[$type]['type'], 0, strrpos($this->simpleTypes[$type]['type'], ':')); + $etype = $this->getTypeDef($uqType); + if ($etype) { + $this->xdebug("in getTypeDef, found type for simpleType $type:"); + $this->xdebug($this->varDump($etype)); + if (isset($etype['phpType'])) { + $this->simpleTypes[$type]['phpType'] = $etype['phpType']; + } + if (isset($etype['elements'])) { + $this->simpleTypes[$type]['elements'] = $etype['elements']; + } + } + } + return $this->simpleTypes[$type]; + } elseif(isset($this->elements[$type])){ + $this->xdebug("in getTypeDef, found element $type"); + if (!isset($this->elements[$type]['phpType'])) { + // get info for type to tack onto the element + $uqType = substr($this->elements[$type]['type'], strrpos($this->elements[$type]['type'], ':') + 1); + $ns = substr($this->elements[$type]['type'], 0, strrpos($this->elements[$type]['type'], ':')); + $etype = $this->getTypeDef($uqType); + if ($etype) { + $this->xdebug("in getTypeDef, found type for element $type:"); + $this->xdebug($this->varDump($etype)); + if (isset($etype['phpType'])) { + $this->elements[$type]['phpType'] = $etype['phpType']; + } + if (isset($etype['elements'])) { + $this->elements[$type]['elements'] = $etype['elements']; + } + } elseif ($ns == 'http://www.w3.org/2001/XMLSchema') { + $this->xdebug("in getTypeDef, element $type is an XSD type"); + $this->elements[$type]['phpType'] = 'scalar'; + } + } + return $this->elements[$type]; + } elseif(isset($this->attributes[$type])){ + $this->xdebug("in getTypeDef, found attribute $type"); + return $this->attributes[$type]; + } elseif (ereg('_ContainedType$', $type)) { + $this->xdebug("in getTypeDef, have an untyped element $type"); + $typeDef['typeClass'] = 'simpleType'; + $typeDef['phpType'] = 'scalar'; + $typeDef['type'] = 'http://www.w3.org/2001/XMLSchema:string'; + return $typeDef; + } + $this->xdebug("in getTypeDef, did not find $type"); + return false; + } + + /** + * returns a sample serialization of a given type, or false if no type by the given name + * + * @param string $type, name of type + * @return mixed + * @access public + * @deprecated + */ + function serializeTypeDef($type){ + //print "in sTD() for type $type
    "; + if($typeDef = $this->getTypeDef($type)){ + $str .= '<'.$type; + if(is_array($typeDef['attrs'])){ + foreach($attrs as $attName => $data){ + $str .= " $attName=\"{type = ".$data['type']."}\""; + } + } + $str .= " xmlns=\"".$this->schema['targetNamespace']."\""; + if(count($typeDef['elements']) > 0){ + $str .= ">"; + foreach($typeDef['elements'] as $element => $eData){ + $str .= $this->serializeTypeDef($element); + } + $str .= ""; + } elseif($typeDef['typeClass'] == 'element') { + $str .= ">"; + } else { + $str .= "/>"; + } + return $str; + } + return false; + } + + /** + * returns HTML form elements that allow a user + * to enter values for creating an instance of the given type. + * + * @param string $name, name for type instance + * @param string $type, name of type + * @return string + * @access public + * @deprecated + */ + function typeToForm($name,$type){ + // get typedef + if($typeDef = $this->getTypeDef($type)){ + // if struct + if($typeDef['phpType'] == 'struct'){ + $buffer .= ''; + foreach($typeDef['elements'] as $child => $childDef){ + $buffer .= " + + "; + } + $buffer .= '
    $childDef[name] (type: ".$this->getLocalPart($childDef['type'])."):
    '; + // if array + } elseif($typeDef['phpType'] == 'array'){ + $buffer .= ''; + for($i=0;$i < 3; $i++){ + $buffer .= " + + "; + } + $buffer .= '
    array item (type: $typeDef[arrayType]):
    '; + // if scalar + } else { + $buffer .= ""; + } + } else { + $buffer .= ""; + } + return $buffer; + } + + /** + * adds a complex type to the schema + * + * example: array + * + * addType( + * 'ArrayOfstring', + * 'complexType', + * 'array', + * '', + * 'SOAP-ENC:Array', + * array('ref'=>'SOAP-ENC:arrayType','wsdl:arrayType'=>'string[]'), + * 'xsd:string' + * ); + * + * example: PHP associative array ( SOAP Struct ) + * + * addType( + * 'SOAPStruct', + * 'complexType', + * 'struct', + * 'all', + * array('myVar'=> array('name'=>'myVar','type'=>'string') + * ); + * + * @param name + * @param typeClass (complexType|simpleType|attribute) + * @param phpType: currently supported are array and struct (php assoc array) + * @param compositor (all|sequence|choice) + * @param restrictionBase namespace:name (http://schemas.xmlsoap.org/soap/encoding/:Array) + * @param elements = array ( name = array(name=>'',type=>'') ) + * @param attrs = array( + * array( + * 'ref' => "http://schemas.xmlsoap.org/soap/encoding/:arrayType", + * "http://schemas.xmlsoap.org/wsdl/:arrayType" => "string[]" + * ) + * ) + * @param arrayType: namespace:name (http://www.w3.org/2001/XMLSchema:string) + * @access public + * @see getTypeDef + */ + function addComplexType($name,$typeClass='complexType',$phpType='array',$compositor='',$restrictionBase='',$elements=array(),$attrs=array(),$arrayType=''){ + $this->complexTypes[$name] = array( + 'name' => $name, + 'typeClass' => $typeClass, + 'phpType' => $phpType, + 'compositor'=> $compositor, + 'restrictionBase' => $restrictionBase, + 'elements' => $elements, + 'attrs' => $attrs, + 'arrayType' => $arrayType + ); + + $this->xdebug("addComplexType $name:"); + $this->appendDebug($this->varDump($this->complexTypes[$name])); + } + + /** + * adds a simple type to the schema + * + * @param string $name + * @param string $restrictionBase namespace:name (http://schemas.xmlsoap.org/soap/encoding/:Array) + * @param string $typeClass (should always be simpleType) + * @param string $phpType (should always be scalar) + * @param array $enumeration array of values + * @access public + * @see xmlschema + * @see getTypeDef + */ + function addSimpleType($name, $restrictionBase='', $typeClass='simpleType', $phpType='scalar', $enumeration=array()) { + $this->simpleTypes[$name] = array( + 'name' => $name, + 'typeClass' => $typeClass, + 'phpType' => $phpType, + 'type' => $restrictionBase, + 'enumeration' => $enumeration + ); + + $this->xdebug("addSimpleType $name:"); + $this->appendDebug($this->varDump($this->simpleTypes[$name])); + } + + /** + * adds an element to the schema + * + * @param array $attrs attributes that must include name and type + * @see xmlschema + * @access public + */ + function addElement($attrs) { + if (! $this->getPrefix($attrs['type'])) { + $attrs['type'] = $this->schemaTargetNamespace . ':' . $attrs['type']; + } + $this->elements[ $attrs['name'] ] = $attrs; + $this->elements[ $attrs['name'] ]['typeClass'] = 'element'; + + $this->xdebug("addElement " . $attrs['name']); + $this->appendDebug($this->varDump($this->elements[ $attrs['name'] ])); + } +} + + + + +?> \ No newline at end of file diff --git a/thirdparty/pear/install-pear.php b/thirdparty/pear/install-pear.php new file mode 100644 index 000000000..1585ee81f --- /dev/null +++ b/thirdparty/pear/install-pear.php @@ -0,0 +1,109 @@ + install_file +$install_files = array(); + +/* +$dp = opendir($pear_dir); +while ($ent = readdir($dp)) { + if (ereg('^package-(.*)\.xml$', $ent, $matches)) { + $install_files[$matches[1]] = $ent; + } +} +closedir($dp); +*/ +foreach ($argv as $arg) { + $bn = basename($arg); + if (ereg('^package-(.*)\.xml$', $bn, $matches) || + ereg('^([A-Za-z0-9_:]+)-.*\.(tar|tgz)$', $bn, $matches)) { + $install_files[$matches[1]] = $arg; + } +} + +$config = &PEAR_Config::singleton(); + +// make sure we use only default values +$config_layers = $config->getLayers(); +foreach ($config_layers as $layer) { + if ($layer == 'default') continue; + $config->removeLayer($layer); +} +$config->set('verbose', 0, 'default'); + +$options = array(); +$install_root = getenv("INSTALL_ROOT"); +$php_dir = $config->get('php_dir'); +if (!empty($install_root)) { + $options['installroot'] = $install_root; + $reg_dir = $install_root . $php_dir; +} else { + $reg_dir = $php_dir; +} + +$reg = &new PEAR_Registry($reg_dir); +$ui = &new PEAR_Frontend_CLI(); +$installer = &new PEAR_Installer($ui); +$installer->registry = &$reg; + +foreach ($install_files as $package => $instfile) { + if ($reg->packageExists($package)) { + $info = $installer->infoFromAny($instfile); + if (PEAR::isError($info)) { + $ui->outputData(sprintf("[PEAR] %s: %s", $package, $info->getMessage())); + continue; + } + $new_ver = $info['version']; + $old_ver = $reg->packageInfo($package, 'version'); + if (version_compare($new_ver, $old_ver, 'gt')) { + $options['upgrade'] = true; + $err = $installer->install($instfile, $options); + if (PEAR::isError($err)) { + $ui->outputData(sprintf("[PEAR] %s: %s", $package, $err->getMessage())); + continue; + } + $ui->outputData(sprintf("[PEAR] %-15s- upgraded: %s", $package, $new_ver)); + } else { + if (@$argv[1] == '--force') { + $options['force'] = true; + $err = $installer->install($instfile, $options); + if (PEAR::isError($err)) { + $ui->outputData(sprintf("[PEAR] %s: %s", $package, $err->getMessage())); + continue; + } + $ui->outputData(sprintf("[PEAR] %-15s- installed: %s", $package, $new_ver)); + } else { + $ui->outputData(sprintf("[PEAR] %-15s- already installed: %s", $package, $old_ver)); + } + } + } else { + $options['nodeps'] = true; + $err = $installer->install($instfile, $options); + if (PEAR::isError($err)) { + $ui->outputData(sprintf("[PEAR] %s: %s", $package, $err->getMessage())); + continue; + } + $new_ver = $reg->packageInfo($package, 'version'); + $ui->outputData(sprintf("[PEAR] %-15s- installed: %s", $package, $new_ver)); + } +} + +?> \ No newline at end of file diff --git a/thirdparty/pear/install-pear.txt b/thirdparty/pear/install-pear.txt new file mode 100644 index 000000000..ec632e8ad --- /dev/null +++ b/thirdparty/pear/install-pear.txt @@ -0,0 +1,11 @@ ++----------------------------------------------------------------------+ +| The installation process is incomplete. The following resources were | +| not installed: | +| | +| Self-contained Extension Support | +| PEAR: PHP Extension and Application Repository | +| | +| To install these components, become the superuser and execute: | +| | +| # make install-su | ++----------------------------------------------------------------------+ diff --git a/thirdparty/pear/json/class.json.php b/thirdparty/pear/json/class.json.php new file mode 100644 index 000000000..a6ae92da9 --- /dev/null +++ b/thirdparty/pear/json/class.json.php @@ -0,0 +1,817 @@ + + * @author Matt Knapp + * @author Brett Stimmerman + * @copyright 2005 Michal Migurski + * @version CVS: $Id: JSON.php,v 1.31 2006/06/28 05:54:17 migurski Exp $ + * @license http://www.opensource.org/licenses/bsd-license.php + * @link http://pear.php.net/pepr/pepr-proposal-show.php?id=198 + */ + +/** + * Marker constant for Services_JSON::decode(), used to flag stack state + */ +if ( !defined('SERVICES_JSON_SLICE')) { + define('SERVICES_JSON_SLICE', 1); +} +/** + * Marker constant for Services_JSON::decode(), used to flag stack state + */ +if ( !defined('SERVICES_JSON_IN_STR')) { +define('SERVICES_JSON_IN_STR', 2); +} +/** + * Marker constant for Services_JSON::decode(), used to flag stack state + */ +if ( !defined('SERVICES_JSON_IN_ARR')) { + define('SERVICES_JSON_IN_ARR', 3); +} +/** + * Marker constant for Services_JSON::decode(), used to flag stack state + */ +if ( !defined('SERVICES_JSON_IN_OBJ')) { + define('SERVICES_JSON_IN_OBJ', 4); +} +/** + * Marker constant for Services_JSON::decode(), used to flag stack state + */ +if ( !defined('SERVICES_JSON_IN_CMT')) { + define('SERVICES_JSON_IN_CMT', 5); +} +/** + * Behavior switch for Services_JSON::decode() + */ +if ( !defined('SERVICES_JSON_LOOSE_TYPE')) { + define('SERVICES_JSON_LOOSE_TYPE', 16); +} +/** + * Behavior switch for Services_JSON::decode() + */ +if ( !defined('SERVICES_JSON_SUPPRESS_ERRORS')) { + define('SERVICES_JSON_SUPPRESS_ERRORS', 32); +} +/** + * Converts to and from JSON format. + * + * Brief example of use: + * + * + * // create a new instance of Services_JSON + * $json = new Services_JSON(); + * + * // convert a complexe value to JSON notation, and send it to the browser + * $value = array('foo', 'bar', array(1, 2, 'baz'), array(3, array(4))); + * $output = $json->encode($value); + * + * print($output); + * // prints: ["foo","bar",[1,2,"baz"],[3,[4]]] + * + * // accept incoming POST data, assumed to be in JSON notation + * $input = file_get_contents('php://input', 1000000); + * $value = $json->decode($input); + * + */ + +if (class_exists ('Services_JSON') ) { + return; +} +class Services_JSON +{ + /** + * constructs a new JSON instance + * + * @param int $use object behavior flags; combine with boolean-OR + * + * possible values: + * - SERVICES_JSON_LOOSE_TYPE: loose typing. + * "{...}" syntax creates associative arrays + * instead of objects in decode(). + * - SERVICES_JSON_SUPPRESS_ERRORS: error suppression. + * Values which can't be encoded (e.g. resources) + * appear as NULL instead of throwing errors. + * By default, a deeply-nested resource will + * bubble up with an error, so all return values + * from encode() should be checked with isError() + */ + function Services_JSON($use = 0) + { + $this->use = $use; + } + + /** + * convert a string from one UTF-16 char to one UTF-8 char + * + * Normally should be handled by mb_convert_encoding, but + * provides a slower PHP-only method for installations + * that lack the multibye string extension. + * + * @param string $utf16 UTF-16 character + * @return string UTF-8 character + * @access private + */ + function utf162utf8($utf16) + { + // oh please oh please oh please oh please oh please + if(function_exists('mb_convert_encoding')) { + return mb_convert_encoding($utf16, 'UTF-8', 'UTF-16'); + } + + $bytes = (ord($utf16{0}) << 8) | ord($utf16{1}); + + switch(true) { + case ((0x7F & $bytes) == $bytes): + // this case should never be reached, because we are in ASCII range + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return chr(0x7F & $bytes); + + case (0x07FF & $bytes) == $bytes: + // return a 2-byte UTF-8 character + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return chr(0xC0 | (($bytes >> 6) & 0x1F)) + . chr(0x80 | ($bytes & 0x3F)); + + case (0xFFFF & $bytes) == $bytes: + // return a 3-byte UTF-8 character + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return chr(0xE0 | (($bytes >> 12) & 0x0F)) + . chr(0x80 | (($bytes >> 6) & 0x3F)) + . chr(0x80 | ($bytes & 0x3F)); + } + + // ignoring UTF-32 for now, sorry + return ''; + } + + /** + * convert a string from one UTF-8 char to one UTF-16 char + * + * Normally should be handled by mb_convert_encoding, but + * provides a slower PHP-only method for installations + * that lack the multibye string extension. + * + * @param string $utf8 UTF-8 character + * @return string UTF-16 character + * @access private + */ + function utf82utf16($utf8) + { + // oh please oh please oh please oh please oh please + if(function_exists('mb_convert_encoding')) { + return mb_convert_encoding($utf8, 'UTF-16', 'UTF-8'); + } + + switch(strlen($utf8)) { + case 1: + // this case should never be reached, because we are in ASCII range + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return $utf8; + + case 2: + // return a UTF-16 character from a 2-byte UTF-8 char + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return chr(0x07 & (ord($utf8{0}) >> 2)) + . chr((0xC0 & (ord($utf8{0}) << 6)) + | (0x3F & ord($utf8{1}))); + + case 3: + // return a UTF-16 character from a 3-byte UTF-8 char + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return chr((0xF0 & (ord($utf8{0}) << 4)) + | (0x0F & (ord($utf8{1}) >> 2))) + . chr((0xC0 & (ord($utf8{1}) << 6)) + | (0x7F & ord($utf8{2}))); + } + + // ignoring UTF-32 for now, sorry + return ''; + } + + /** + * encodes an arbitrary variable into JSON format + * + * @param mixed $var any number, boolean, string, array, or object to be encoded. + * see argument 1 to Services_JSON() above for array-parsing behavior. + * if var is a strng, note that encode() always expects it + * to be in ASCII or UTF-8 format! + * + * @return mixed JSON string representation of input var or an error if a problem occurs + * @access public + */ + function encode($var) + { + switch (gettype($var)) { + case 'boolean': + return $var ? 'true' : 'false'; + + case 'NULL': + return 'null'; + + case 'integer': + return (int) $var; + + case 'double': + case 'float': + return (float) $var; + + case 'string': + // STRINGS ARE EXPECTED TO BE IN ASCII OR UTF-8 FORMAT + $ascii = ''; + $strlen_var = strlen($var); + + /* + * Iterate over every character in the string, + * escaping with a slash or encoding to UTF-8 where necessary + */ + for ($c = 0; $c < $strlen_var; ++$c) { + + $ord_var_c = ord($var{$c}); + + switch (true) { + case $ord_var_c == 0x08: + $ascii .= '\b'; + break; + case $ord_var_c == 0x09: + $ascii .= '\t'; + break; + case $ord_var_c == 0x0A: + $ascii .= '\n'; + break; + case $ord_var_c == 0x0C: + $ascii .= '\f'; + break; + case $ord_var_c == 0x0D: + $ascii .= '\r'; + break; + + case $ord_var_c == 0x22: + case $ord_var_c == 0x2F: + case $ord_var_c == 0x5C: + // double quote, slash, slosh + $ascii .= '\\'.$var{$c}; + break; + + case (($ord_var_c >= 0x20) && ($ord_var_c <= 0x7F)): + // characters U-00000000 - U-0000007F (same as ASCII) + $ascii .= $var{$c}; + break; + + case (($ord_var_c & 0xE0) == 0xC0): + // characters U-00000080 - U-000007FF, mask 110XXXXX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $char = pack('C*', $ord_var_c, ord($var{$c + 1})); + $c += 1; + $utf16 = $this->utf82utf16($char); + $ascii .= sprintf('\u%04s', bin2hex($utf16)); + break; + + case (($ord_var_c & 0xF0) == 0xE0): + // characters U-00000800 - U-0000FFFF, mask 1110XXXX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $char = pack('C*', $ord_var_c, + ord($var{$c + 1}), + ord($var{$c + 2})); + $c += 2; + $utf16 = $this->utf82utf16($char); + $ascii .= sprintf('\u%04s', bin2hex($utf16)); + break; + + case (($ord_var_c & 0xF8) == 0xF0): + // characters U-00010000 - U-001FFFFF, mask 11110XXX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $char = pack('C*', $ord_var_c, + ord($var{$c + 1}), + ord($var{$c + 2}), + ord($var{$c + 3})); + $c += 3; + $utf16 = $this->utf82utf16($char); + $ascii .= sprintf('\u%04s', bin2hex($utf16)); + break; + + case (($ord_var_c & 0xFC) == 0xF8): + // characters U-00200000 - U-03FFFFFF, mask 111110XX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $char = pack('C*', $ord_var_c, + ord($var{$c + 1}), + ord($var{$c + 2}), + ord($var{$c + 3}), + ord($var{$c + 4})); + $c += 4; + $utf16 = $this->utf82utf16($char); + $ascii .= sprintf('\u%04s', bin2hex($utf16)); + break; + + case (($ord_var_c & 0xFE) == 0xFC): + // characters U-04000000 - U-7FFFFFFF, mask 1111110X + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $char = pack('C*', $ord_var_c, + ord($var{$c + 1}), + ord($var{$c + 2}), + ord($var{$c + 3}), + ord($var{$c + 4}), + ord($var{$c + 5})); + $c += 5; + $utf16 = $this->utf82utf16($char); + $ascii .= sprintf('\u%04s', bin2hex($utf16)); + break; + } + } + + return '"'.$ascii.'"'; + + case 'array': + /* + * As per JSON spec if any array key is not an integer + * we must treat the the whole array as an object. We + * also try to catch a sparsely populated associative + * array with numeric keys here because some JS engines + * will create an array with empty indexes up to + * max_index which can cause memory issues and because + * the keys, which may be relevant, will be remapped + * otherwise. + * + * As per the ECMA and JSON specification an object may + * have any string as a property. Unfortunately due to + * a hole in the ECMA specification if the key is a + * ECMA reserved word or starts with a digit the + * parameter is only accessible using ECMAScript's + * bracket notation. + */ + + // treat as a JSON object + if (is_array($var) && count($var) && (array_keys($var) !== range(0, sizeof($var) - 1))) { + $properties = array_map(array($this, 'name_value'), + array_keys($var), + array_values($var)); + + foreach($properties as $property) { + if(Services_JSON::isError($property)) { + return $property; + } + } + + return '{' . join(',', $properties) . '}'; + } + + // treat it like a regular array + $elements = array_map(array($this, 'encode'), $var); + + foreach($elements as $element) { + if(Services_JSON::isError($element)) { + return $element; + } + } + + return '[' . join(',', $elements) . ']'; + + case 'object': + $vars = get_object_vars($var); + + $properties = array_map(array($this, 'name_value'), + array_keys($vars), + array_values($vars)); + + foreach($properties as $property) { + if(Services_JSON::isError($property)) { + return $property; + } + } + + return '{' . join(',', $properties) . '}'; + + default: + return ($this->use & SERVICES_JSON_SUPPRESS_ERRORS) + ? 'null' + : new Services_JSON_Error(gettype($var)." can not be encoded as JSON string"); + } + } + + /** + * array-walking function for use in generating JSON-formatted name-value pairs + * + * @param string $name name of key to use + * @param mixed $value reference to an array element to be encoded + * + * @return string JSON-formatted name-value pair, like '"name":value' + * @access private + */ + function name_value($name, $value) + { + $encoded_value = $this->encode($value); + + if(Services_JSON::isError($encoded_value)) { + return $encoded_value; + } + + return $this->encode(strval($name)) . ':' . $encoded_value; + } + + /** + * reduce a string by removing leading and trailing comments and whitespace + * + * @param $str string string value to strip of comments and whitespace + * + * @return string string value stripped of comments and whitespace + * @access private + */ + function reduce_string($str) + { + $str = preg_replace(array( + + // eliminate single line comments in '// ...' form + '#^\s*//(.+)$#m', + + // eliminate multi-line comments in '/* ... */' form, at start of string + '#^\s*/\*(.+)\*/#Us', + + // eliminate multi-line comments in '/* ... */' form, at end of string + '#/\*(.+)\*/\s*$#Us' + + ), '', $str); + + // eliminate extraneous space + return trim($str); + } + + /** + * decodes a JSON string into appropriate variable + * + * @param string $str JSON-formatted string + * + * @return mixed number, boolean, string, array, or object + * corresponding to given JSON input string. + * See argument 1 to Services_JSON() above for object-output behavior. + * Note that decode() always returns strings + * in ASCII or UTF-8 format! + * @access public + */ + function decode($str) + { + $str = $this->reduce_string($str); + + switch (strtolower($str)) { + case 'true': + return true; + + case 'false': + return false; + + case 'null': + return null; + + default: + $m = array(); + + if (is_numeric($str)) { + // Lookie-loo, it's a number + + // This would work on its own, but I'm trying to be + // good about returning integers where appropriate: + // return (float)$str; + + // Return float or int, as appropriate + return ((float)$str == (integer)$str) + ? (integer)$str + : (float)$str; + + } elseif (preg_match('/^("|\').*(\1)$/s', $str, $m) && $m[1] == $m[2]) { + // STRINGS RETURNED IN UTF-8 FORMAT + $delim = substr($str, 0, 1); + $chrs = substr($str, 1, -1); + $utf8 = ''; + $strlen_chrs = strlen($chrs); + + for ($c = 0; $c < $strlen_chrs; ++$c) { + + $substr_chrs_c_2 = substr($chrs, $c, 2); + $ord_chrs_c = ord($chrs{$c}); + + switch (true) { + case $substr_chrs_c_2 == '\b': + $utf8 .= chr(0x08); + ++$c; + break; + case $substr_chrs_c_2 == '\t': + $utf8 .= chr(0x09); + ++$c; + break; + case $substr_chrs_c_2 == '\n': + $utf8 .= chr(0x0A); + ++$c; + break; + case $substr_chrs_c_2 == '\f': + $utf8 .= chr(0x0C); + ++$c; + break; + case $substr_chrs_c_2 == '\r': + $utf8 .= chr(0x0D); + ++$c; + break; + + case $substr_chrs_c_2 == '\\"': + case $substr_chrs_c_2 == '\\\'': + case $substr_chrs_c_2 == '\\\\': + case $substr_chrs_c_2 == '\\/': + if (($delim == '"' && $substr_chrs_c_2 != '\\\'') || + ($delim == "'" && $substr_chrs_c_2 != '\\"')) { + $utf8 .= $chrs{++$c}; + } + break; + + case preg_match('/\\\u[0-9A-F]{4}/i', substr($chrs, $c, 6)): + // single, escaped unicode character + $utf16 = chr(hexdec(substr($chrs, ($c + 2), 2))) + . chr(hexdec(substr($chrs, ($c + 4), 2))); + $utf8 .= $this->utf162utf8($utf16); + $c += 5; + break; + + case ($ord_chrs_c >= 0x20) && ($ord_chrs_c <= 0x7F): + $utf8 .= $chrs{$c}; + break; + + case ($ord_chrs_c & 0xE0) == 0xC0: + // characters U-00000080 - U-000007FF, mask 110XXXXX + //see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $utf8 .= substr($chrs, $c, 2); + ++$c; + break; + + case ($ord_chrs_c & 0xF0) == 0xE0: + // characters U-00000800 - U-0000FFFF, mask 1110XXXX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $utf8 .= substr($chrs, $c, 3); + $c += 2; + break; + + case ($ord_chrs_c & 0xF8) == 0xF0: + // characters U-00010000 - U-001FFFFF, mask 11110XXX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $utf8 .= substr($chrs, $c, 4); + $c += 3; + break; + + case ($ord_chrs_c & 0xFC) == 0xF8: + // characters U-00200000 - U-03FFFFFF, mask 111110XX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $utf8 .= substr($chrs, $c, 5); + $c += 4; + break; + + case ($ord_chrs_c & 0xFE) == 0xFC: + // characters U-04000000 - U-7FFFFFFF, mask 1111110X + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $utf8 .= substr($chrs, $c, 6); + $c += 5; + break; + + } + + } + + return $utf8; + + } elseif (preg_match('/^\[.*\]$/s', $str) || preg_match('/^\{.*\}$/s', $str)) { + // array, or object notation + + if ($str{0} == '[') { + $stk = array(SERVICES_JSON_IN_ARR); + $arr = array(); + } else { + if ($this->use & SERVICES_JSON_LOOSE_TYPE) { + $stk = array(SERVICES_JSON_IN_OBJ); + $obj = array(); + } else { + $stk = array(SERVICES_JSON_IN_OBJ); + $obj = new stdClass(); + } + } + + array_push($stk, array('what' => SERVICES_JSON_SLICE, + 'where' => 0, + 'delim' => false)); + + $chrs = substr($str, 1, -1); + $chrs = $this->reduce_string($chrs); + + if ($chrs == '') { + if (reset($stk) == SERVICES_JSON_IN_ARR) { + return $arr; + + } else { + return $obj; + + } + } + + //print("\nparsing {$chrs}\n"); + + $strlen_chrs = strlen($chrs); + + for ($c = 0; $c <= $strlen_chrs; ++$c) { + + $top = end($stk); + $substr_chrs_c_2 = substr($chrs, $c, 2); + + if (($c == $strlen_chrs) || (($chrs{$c} == ',') && ($top['what'] == SERVICES_JSON_SLICE))) { + // found a comma that is not inside a string, array, etc., + // OR we've reached the end of the character list + $slice = substr($chrs, $top['where'], ($c - $top['where'])); + array_push($stk, array('what' => SERVICES_JSON_SLICE, 'where' => ($c + 1), 'delim' => false)); + //print("Found split at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n"); + + if (reset($stk) == SERVICES_JSON_IN_ARR) { + // we are in an array, so just push an element onto the stack + array_push($arr, $this->decode($slice)); + + } elseif (reset($stk) == SERVICES_JSON_IN_OBJ) { + // we are in an object, so figure + // out the property name and set an + // element in an associative array, + // for now + $parts = array(); + + if (preg_match('/^\s*(["\'].*[^\\\]["\'])\s*:\s*(\S.*),?$/Uis', $slice, $parts)) { + // "name":value pair + $key = $this->decode($parts[1]); + $val = $this->decode($parts[2]); + + if ($this->use & SERVICES_JSON_LOOSE_TYPE) { + $obj[$key] = $val; + } else { + $obj->$key = $val; + } + } elseif (preg_match('/^\s*(\w+)\s*:\s*(\S.*),?$/Uis', $slice, $parts)) { + // name:value pair, where name is unquoted + $key = $parts[1]; + $val = $this->decode($parts[2]); + + if ($this->use & SERVICES_JSON_LOOSE_TYPE) { + $obj[$key] = $val; + } else { + $obj->$key = $val; + } + } + + } + + } elseif ((($chrs{$c} == '"') || ($chrs{$c} == "'")) && ($top['what'] != SERVICES_JSON_IN_STR)) { + // found a quote, and we are not inside a string + array_push($stk, array('what' => SERVICES_JSON_IN_STR, 'where' => $c, 'delim' => $chrs{$c})); + //print("Found start of string at {$c}\n"); + + } elseif (($chrs{$c} == $top['delim']) && + ($top['what'] == SERVICES_JSON_IN_STR) && + ((strlen(substr($chrs, 0, $c)) - strlen(rtrim(substr($chrs, 0, $c), '\\'))) % 2 != 1)) { + // found a quote, we're in a string, and it's not escaped + // we know that it's not escaped becase there is _not_ an + // odd number of backslashes at the end of the string so far + array_pop($stk); + //print("Found end of string at {$c}: ".substr($chrs, $top['where'], (1 + 1 + $c - $top['where']))."\n"); + + } elseif (($chrs{$c} == '[') && + in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) { + // found a left-bracket, and we are in an array, object, or slice + array_push($stk, array('what' => SERVICES_JSON_IN_ARR, 'where' => $c, 'delim' => false)); + //print("Found start of array at {$c}\n"); + + } elseif (($chrs{$c} == ']') && ($top['what'] == SERVICES_JSON_IN_ARR)) { + // found a right-bracket, and we're in an array + array_pop($stk); + //print("Found end of array at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n"); + + } elseif (($chrs{$c} == '{') && + in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) { + // found a left-brace, and we are in an array, object, or slice + array_push($stk, array('what' => SERVICES_JSON_IN_OBJ, 'where' => $c, 'delim' => false)); + //print("Found start of object at {$c}\n"); + + } elseif (($chrs{$c} == '}') && ($top['what'] == SERVICES_JSON_IN_OBJ)) { + // found a right-brace, and we're in an object + array_pop($stk); + //print("Found end of object at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n"); + + } elseif (($substr_chrs_c_2 == '/*') && + in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) { + // found a comment start, and we are in an array, object, or slice + array_push($stk, array('what' => SERVICES_JSON_IN_CMT, 'where' => $c, 'delim' => false)); + $c++; + //print("Found start of comment at {$c}\n"); + + } elseif (($substr_chrs_c_2 == '*/') && ($top['what'] == SERVICES_JSON_IN_CMT)) { + // found a comment end, and we're in one now + array_pop($stk); + $c++; + + for ($i = $top['where']; $i <= $c; ++$i) + $chrs = substr_replace($chrs, ' ', $i, 1); + + //print("Found end of comment at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n"); + + } + + } + + if (reset($stk) == SERVICES_JSON_IN_ARR) { + return $arr; + + } elseif (reset($stk) == SERVICES_JSON_IN_OBJ) { + return $obj; + + } + + } + } + } + + /** + * @todo Ultimately, this should just call PEAR::isError() + */ + function isError($data, $code = null) + { + if (class_exists('pear')) { + return PEAR::isError($data, $code); + } elseif (is_object($data) && (get_class($data) == 'services_json_error' || + is_subclass_of($data, 'services_json_error'))) { + return true; + } + + return false; + } +} + +if (class_exists('PEAR_Error')) { + + class Services_JSON_Error extends PEAR_Error + { + function Services_JSON_Error($message = 'unknown error', $code = null, + $mode = null, $options = null, $userinfo = null) + { + parent::PEAR_Error($message, $code, $mode, $options, $userinfo); + } + } + +} else { + + /** + * @todo Ultimately, this class shall be descended from PEAR_Error + */ + class Services_JSON_Error + { + function Services_JSON_Error($message = 'unknown error', $code = null, + $mode = null, $options = null, $userinfo = null) + { + + } + } + +} + +?> \ No newline at end of file diff --git a/thirdparty/pear/nusoap.colosa.php b/thirdparty/pear/nusoap.colosa.php new file mode 100644 index 000000000..cf2ec2145 --- /dev/null +++ b/thirdparty/pear/nusoap.colosa.php @@ -0,0 +1,7305 @@ +globalDebugLevel = 9; + +/** +* +* nusoap_base +* +* @author Dietrich Ayala +* @version $Id: nusoap.php,v 1.94 2005/08/04 01:27:42 snichol Exp $ +* @access public +*/ +class nusoap_base_colosa { + /** + * Identification for HTTP headers. + * + * @var string + * @access private + */ + var $title = 'NuSOAP_colosa'; + /** + * Version for HTTP headers. + * + * @var string + * @access private + */ + var $version = '0.7.2'; + /** + * CVS revision for HTTP headers. + * + * @var string + * @access private + */ + var $revision = '$Revision: 1.94 $'; + /** + * Current error string (manipulated by getError/setError) + * + * @var string + * @access private + */ + var $error_str = ''; + /** + * Current debug string (manipulated by debug/appendDebug/clearDebug/getDebug/getDebugAsXMLComment) + * + * @var string + * @access private + */ + var $debug_str = ''; + /** + * toggles automatic encoding of special characters as entities + * (should always be true, I think) + * + * @var boolean + * @access private + */ + var $charencoding = true; + /** + * the debug level for this instance + * + * @var integer + * @access private + */ + var $debugLevel; + + /** + * set schema version + * + * @var string + * @access public + */ + var $XMLSchemaVersion = 'http://www.w3.org/2001/XMLSchema'; + + /** + * charset encoding for outgoing messages + * + * @var string + * @access public + */ + var $soap_defencoding = 'ISO-8859-1'; + //var $soap_defencoding = 'UTF-8'; + + /** + * namespaces in an array of prefix => uri + * + * this is "seeded" by a set of constants, but it may be altered by code + * + * @var array + * @access public + */ + var $namespaces = array( + 'SOAP-ENV' => 'http://schemas.xmlsoap.org/soap/envelope/', + 'xsd' => 'http://www.w3.org/2001/XMLSchema', + 'xsi' => 'http://www.w3.org/2001/XMLSchema-instance', + 'SOAP-ENC' => 'http://schemas.xmlsoap.org/soap/encoding/' + ); + + /** + * namespaces used in the current context, e.g. during serialization + * + * @var array + * @access private + */ + var $usedNamespaces = array(); + + /** + * XML Schema types in an array of uri => (array of xml type => php type) + * is this legacy yet? + * no, this is used by the xmlschema class to verify type => namespace mappings. + * @var array + * @access public + */ + var $typemap = array( + 'http://www.w3.org/2001/XMLSchema' => array( + 'string'=>'string','boolean'=>'boolean','float'=>'double','double'=>'double','decimal'=>'double', + 'duration'=>'','dateTime'=>'string','time'=>'string','date'=>'string','gYearMonth'=>'', + 'gYear'=>'','gMonthDay'=>'','gDay'=>'','gMonth'=>'','hexBinary'=>'string','base64Binary'=>'string', + // abstract "any" types + 'anyType'=>'string','anySimpleType'=>'string', + // derived datatypes + 'normalizedString'=>'string','token'=>'string','language'=>'','NMTOKEN'=>'','NMTOKENS'=>'','Name'=>'','NCName'=>'','ID'=>'', + 'IDREF'=>'','IDREFS'=>'','ENTITY'=>'','ENTITIES'=>'','integer'=>'integer','nonPositiveInteger'=>'integer', + 'negativeInteger'=>'integer','long'=>'integer','int'=>'integer','short'=>'integer','byte'=>'integer','nonNegativeInteger'=>'integer', + 'unsignedLong'=>'','unsignedInt'=>'','unsignedShort'=>'','unsignedByte'=>'','positiveInteger'=>''), + 'http://www.w3.org/2000/10/XMLSchema' => array( + 'i4'=>'','int'=>'integer','boolean'=>'boolean','string'=>'string','double'=>'double', + 'float'=>'double','dateTime'=>'string', + 'timeInstant'=>'string','base64Binary'=>'string','base64'=>'string','ur-type'=>'array'), + 'http://www.w3.org/1999/XMLSchema' => array( + 'i4'=>'','int'=>'integer','boolean'=>'boolean','string'=>'string','double'=>'double', + 'float'=>'double','dateTime'=>'string', + 'timeInstant'=>'string','base64Binary'=>'string','base64'=>'string','ur-type'=>'array'), + 'http://soapinterop.org/xsd' => array('SOAPStruct'=>'struct'), + 'http://schemas.xmlsoap.org/soap/encoding/' => array('base64'=>'string','array'=>'array','Array'=>'array'), + 'http://xml.apache.org/xml-soap' => array('Map') + ); + + /** + * XML entities to convert + * + * @var array + * @access public + * @deprecated + * @see expandEntities + */ + var $xmlEntities = array('quot' => '"','amp' => '&', + 'lt' => '<','gt' => '>','apos' => "'"); + + /** + * constructor + * + * @access public + */ + function nusoap_base_colosa() { + $this->debugLevel = $GLOBALS['_transient']['static']['nusoap_base']->globalDebugLevel; + } + + /** + * gets the global debug level, which applies to future instances + * + * @return integer Debug level 0-9, where 0 turns off + * @access public + */ + function getGlobalDebugLevel() { + return $GLOBALS['_transient']['static']['nusoap_base']->globalDebugLevel; + } + + /** + * sets the global debug level, which applies to future instances + * + * @param int $level Debug level 0-9, where 0 turns off + * @access public + */ + function setGlobalDebugLevel($level) { + $GLOBALS['_transient']['static']['nusoap_base']->globalDebugLevel = $level; + } + + /** + * gets the debug level for this instance + * + * @return int Debug level 0-9, where 0 turns off + * @access public + */ + function getDebugLevel() { + return $this->debugLevel; + } + + /** + * sets the debug level for this instance + * + * @param int $level Debug level 0-9, where 0 turns off + * @access public + */ + function setDebugLevel($level) { + $this->debugLevel = $level; + } + + /** + * adds debug data to the instance debug string with formatting + * + * @param string $string debug data + * @access private + */ + function debug($string){ + if ($this->debugLevel > 0) { + $this->appendDebug($this->getmicrotime().' '.get_class($this).": $string\n"); + } + } + + /** + * adds debug data to the instance debug string without formatting + * + * @param string $string debug data + * @access public + */ + function appendDebug($string){ + if ($this->debugLevel > 0) { + // it would be nice to use a memory stream here to use + // memory more efficiently + $this->debug_str .= $string; + } + } + + /** + * clears the current debug data for this instance + * + * @access public + */ + function clearDebug() { + // it would be nice to use a memory stream here to use + // memory more efficiently + $this->debug_str = ''; + } + + /** + * gets the current debug data for this instance + * + * @return debug data + * @access public + */ + function &getDebug() { + // it would be nice to use a memory stream here to use + // memory more efficiently + return $this->debug_str; + } + + /** + * gets the current debug data for this instance as an XML comment + * this may change the contents of the debug data + * + * @return debug data as an XML comment + * @access public + */ + function &getDebugAsXMLComment() { + // it would be nice to use a memory stream here to use + // memory more efficiently + while (strpos($this->debug_str, '--')) { + $this->debug_str = str_replace('--', '- -', $this->debug_str); + } + return ""; + } + + /** + * expands entities, e.g. changes '<' to '<'. + * + * @param string $val The string in which to expand entities. + * @access private + */ + function expandEntities($val) { + if ($this->charencoding) { + $val = str_replace('&', '&', $val); + $val = str_replace("'", ''', $val); + $val = str_replace('"', '"', $val); + $val = str_replace('<', '<', $val); + $val = str_replace('>', '>', $val); + } + return $val; + } + + /** + * returns error string if present + * + * @return mixed error string or false + * @access public + */ + function getError(){ + if($this->error_str != ''){ + return $this->error_str; + } + return false; + } + + /** + * sets error string + * + * @return boolean $string error string + * @access private + */ + function setError($str){ + $this->error_str = $str; + } + + /** + * detect if array is a simple array or a struct (associative array) + * + * @param mixed $val The PHP array + * @return string (arraySimple|arrayStruct) + * @access private + */ + function isArraySimpleOrStruct($val) { + $keyList = array_keys($val); + foreach ($keyList as $keyListValue) { + if (!is_int($keyListValue)) { + return 'arrayStruct'; + } + } + return 'arraySimple'; + } + + /** + * serializes PHP values in accordance w/ section 5. Type information is + * not serialized if $use == 'literal'. + * + * @param mixed $val The value to serialize + * @param string $name The name (local part) of the XML element + * @param string $type The XML schema type (local part) for the element + * @param string $name_ns The namespace for the name of the XML element + * @param string $type_ns The namespace for the type of the element + * @param array $attributes The attributes to serialize as name=>value pairs + * @param string $use The WSDL "use" (encoded|literal) + * @return string The serialized element, possibly with child elements + * @access public + */ + function serialize_val($val,$name=false,$type=false,$name_ns=false,$type_ns=false,$attributes=false,$use='encoded'){ + $this->debug("in serialize_val: name=$name, type=$type, name_ns=$name_ns, type_ns=$type_ns, use=$use"); + $this->appendDebug('value=' . $this->varDump($val)); + $this->appendDebug('attributes=' . $this->varDump($attributes)); + + if(is_object($val) && get_class($val) == 'soapval'){ + return $val->serialize($use); + } + // force valid name if necessary + if (is_numeric($name)) { + $name = '__numeric_' . $name; + } elseif (! $name) { + $name = 'noname'; + } + // if name has ns, add ns prefix to name + $xmlns = ''; + if($name_ns){ + $prefix = 'nu'.rand(1000,9999); + $name = $prefix.':'.$name; + $xmlns .= " xmlns:$prefix=\"$name_ns\""; + } + // if type is prefixed, create type prefix + if($type_ns != '' && $type_ns == $this->namespaces['xsd']){ + // need to fix this. shouldn't default to xsd if no ns specified + // w/o checking against typemap + $type_prefix = 'xsd'; + } elseif($type_ns){ + $type_prefix = 'ns'.rand(1000,9999); + $xmlns .= " xmlns:$type_prefix=\"$type_ns\""; + } + // serialize attributes if present + $atts = ''; + if($attributes){ + foreach($attributes as $k => $v){ + $atts .= " $k=\"".$this->expandEntities($v).'"'; + } + } + // serialize null value + if (is_null($val)) { + if ($use == 'literal') { + // TODO: depends on minOccurs + return "<$name$xmlns $atts/>"; + } else { + if (isset($type) && isset($type_prefix)) { + $type_str = " xsi:type=\"$type_prefix:$type\""; + } else { + $type_str = ''; + } + return "<$name$xmlns$type_str $atts xsi:nil=\"true\"/>"; + } + } + // serialize if an xsd built-in primitive type + if($type != '' && isset($this->typemap[$this->XMLSchemaVersion][$type])){ + if (is_bool($val)) { + if ($type == 'boolean') { + $val = $val ? 'true' : 'false'; + } elseif (! $val) { + $val = 0; + } + } else if (is_string($val)) { + $val = $this->expandEntities($val); + } + if ($use == 'literal') { + return "<$name$xmlns $atts>$val"; + } else { + return "<$name$xmlns $atts xsi:type=\"xsd:$type\">$val"; + } + } + // detect type and serialize + $xml = ''; + switch(true) { + case (is_bool($val) || $type == 'boolean'): + if ($type == 'boolean') { + $val = $val ? 'true' : 'false'; + } elseif (! $val) { + $val = 0; + } + if ($use == 'literal') { + $xml .= "<$name$xmlns $atts>$val"; + } else { + $xml .= "<$name$xmlns xsi:type=\"xsd:boolean\"$atts>$val"; + } + break; + case (is_int($val) || is_long($val) || $type == 'int'): + if ($use == 'literal') { + $xml .= "<$name$xmlns $atts>$val"; +// $xml .= "<$name$xmlns xsi:type=\"xsd:long\">$val"; + } else { + $xml .= "<$name$xmlns xsi:type=\"xsd:int\">$val"; + } + break; + case (is_float($val)|| is_double($val) || $type == 'float'): + if ($use == 'literal') { + $xml .= "<$name$xmlns $atts>$val"; + } else { + $xml .= "<$name$xmlns xsi:type=\"xsd:float\"$atts>$val"; + } + break; + case (is_string($val) || $type == 'string'): + $val = $this->expandEntities($val); + if ($use == 'literal') { + $xml .= "<$name$xmlns $atts>$val"; + } else { + $xml .= "<$name$xmlns xsi:type=\"xsd:string\"$atts>$val"; + } + break; + case is_object($val): + if (! $name) { + $name = get_class($val); + $this->debug("In serialize_val, used class name $name as element name"); + } else { + $this->debug("In serialize_val, do not override name $name for element name for class " . get_class($val)); + } + foreach(get_object_vars($val) as $k => $v){ + $pXml = isset($pXml) ? $pXml.$this->serialize_val($v,$k,false,false,false,false,$use) : $this->serialize_val($v,$k,false,false,false,false,$use); + } + $xml .= '<'.$name.'>'.$pXml.''; + break; + break; + case (is_array($val) || $type): + // detect if struct or array + $valueType = $this->isArraySimpleOrStruct($val); + if($valueType=='arraySimple' || ereg('^ArrayOf',$type)){ + $i = 0; + if(is_array($val) && count($val)> 0){ + foreach($val as $v){ + if(is_object($v) && get_class($v) == 'soapval'){ + $tt_ns = $v->type_ns; + $tt = $v->type; + } elseif (is_array($v)) { + $tt = $this->isArraySimpleOrStruct($v); + } else { + $tt = gettype($v); + } + $array_types[$tt] = 1; + // TODO: for literal, the name should be $name + $xml .= $this->serialize_val($v,'item',false,false,false,false,$use); + ++$i; + } + if(count($array_types) > 1){ + $array_typename = 'xsd:anyType'; + } elseif(isset($tt) && isset($this->typemap[$this->XMLSchemaVersion][$tt])) { + if ($tt == 'integer') { + $tt = 'int'; + } + $array_typename = 'xsd:'.$tt; + } elseif(isset($tt) && $tt == 'arraySimple'){ + $array_typename = 'SOAP-ENC:Array'; + } elseif(isset($tt) && $tt == 'arrayStruct'){ + $array_typename = 'unnamed_struct_use_soapval'; + } else { + // if type is prefixed, create type prefix + if ($tt_ns != '' && $tt_ns == $this->namespaces['xsd']){ + $array_typename = 'xsd:' . $tt; + } elseif ($tt_ns) { + $tt_prefix = 'ns' . rand(1000, 9999); + $array_typename = "$tt_prefix:$tt"; + $xmlns .= " xmlns:$tt_prefix=\"$tt_ns\""; + } else { + $array_typename = $tt; + } + } + $array_type = $i; + if ($use == 'literal') { + $type_str = ''; + } else if (isset($type) && isset($type_prefix)) { + $type_str = " xsi:type=\"$type_prefix:$type\""; + } else { + $type_str = " xsi:type=\"SOAP-ENC:Array\" SOAP-ENC:arrayType=\"".$array_typename."[$array_type]\""; + } + // empty array + } else { + if ($use == 'literal') { + $type_str = ''; + } else if (isset($type) && isset($type_prefix)) { + $type_str = " xsi:type=\"$type_prefix:$type\""; + } else { + $type_str = " xsi:type=\"SOAP-ENC:Array\" SOAP-ENC:arrayType=\"xsd:anyType[0]\""; + } + } + // TODO: for array in literal, there is no wrapper here + $xml = "<$name$xmlns$type_str$atts>".$xml.""; + } else { + // got a struct + if(isset($type) && isset($type_prefix)){ + $type_str = " xsi:type=\"$type_prefix:$type\""; + } else { + $type_str = ''; + } + if ($use == 'literal') { + $xml .= "<$name$xmlns $atts>"; + } else { + $xml .= "<$name$xmlns$type_str$atts>"; + } + foreach($val as $k => $v){ + // Apache Map + if ($type == 'Map' && $type_ns == 'http://xml.apache.org/xml-soap') { + $xml .= ''; + $xml .= $this->serialize_val($k,'key',false,false,false,false,$use); + $xml .= $this->serialize_val($v,'value',false,false,false,false,$use); + $xml .= ''; + } else { + $xml .= $this->serialize_val($v,$k,false,false,false,false,$use); + } + } + $xml .= ""; + } + break; + default: + $xml .= 'not detected, got '.gettype($val).' for '.$val; + break; + } + return $xml; + } + + /** + * serializes a message + * + * @param string $body the XML of the SOAP body + * @param mixed $headers optional string of XML with SOAP header content, or array of soapval objects for SOAP headers + * @param array $namespaces optional the namespaces used in generating the body and headers + * @param string $style optional (rpc|document) + * @param string $use optional (encoded|literal) + * @param string $encodingStyle optional (usually 'http://schemas.xmlsoap.org/soap/encoding/' for encoded) + * @return string the message + * @access public + */ + function serializeEnvelope($body,$headers=false,$namespaces=array(),$style='rpc',$use='encoded',$encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'){ + // TODO: add an option to automatically run utf8_encode on $body and $headers + // if $this->soap_defencoding is UTF-8. Not doing this automatically allows + // one to send arbitrary UTF-8 characters, not just characters that map to ISO-8859-1 + + $this->debug("In serializeEnvelope length=" . strlen($body) . " body (max 1000 characters)=" . substr($body, 0, 1000) . " style=$style use=$use encodingStyle=$encodingStyle"); + $this->debug("headers:"); + $this->appendDebug($this->varDump($headers)); + $this->debug("namespaces:"); + $this->appendDebug($this->varDump($namespaces)); + + // serialize namespaces + $ns_string = ''; + foreach(array_merge($this->namespaces,$namespaces) as $k => $v){ + $ns_string .= " xmlns:$k=\"$v\""; + } + if($encodingStyle) { + $ns_string = " SOAP-ENV:encodingStyle=\"$encodingStyle\"$ns_string"; + } + + // serialize headers + if($headers){ + if (is_array($headers)) { + $xml = ''; + foreach ($headers as $header) { + $xml .= $this->serialize_val($header, false, false, false, false, false, $use); + } + $headers = $xml; + $this->debug("In serializeEnvelope, serialzied array of headers to $headers"); + } + $headers = "".$headers.""; + } + // serialize envelope + return + 'soap_defencoding .'"?'.">". + '". + $headers. + "". + $body. + "". + ""; + } + + /** + * formats a string to be inserted into an HTML stream + * + * @param string $str The string to format + * @return string The formatted string + * @access public + * @deprecated + */ + function formatDump($str){ + $str = htmlspecialchars($str); + return nl2br($str); + } + + /** + * contracts (changes namespace to prefix) a qualified name + * + * @param string $qname qname + * @return string contracted qname + * @access private + */ + function contractQname($qname){ + // get element namespace + //$this->xdebug("Contract $qname"); + if (strrpos($qname, ':')) { + // get unqualified name + $name = substr($qname, strrpos($qname, ':') + 1); + // get ns + $ns = substr($qname, 0, strrpos($qname, ':')); + $p = $this->getPrefixFromNamespace($ns); + if ($p) { + return $p . ':' . $name; + } + return $qname; + } else { + return $qname; + } + } + + /** + * expands (changes prefix to namespace) a qualified name + * + * @param string $string qname + * @return string expanded qname + * @access private + */ + function expandQname($qname){ + // get element prefix + if(strpos($qname,':') && !ereg('^http://',$qname)){ + // get unqualified name + $name = substr(strstr($qname,':'),1); + // get ns prefix + $prefix = substr($qname,0,strpos($qname,':')); + if(isset($this->namespaces[$prefix])){ + return $this->namespaces[$prefix].':'.$name; + } else { + return $qname; + } + } else { + return $qname; + } + } + + /** + * returns the local part of a prefixed string + * returns the original string, if not prefixed + * + * @param string $str The prefixed string + * @return string The local part + * @access public + */ + function getLocalPart($str){ + if($sstr = strrchr($str,':')){ + // get unqualified name + return substr( $sstr, 1 ); + } else { + return $str; + } + } + + /** + * returns the prefix part of a prefixed string + * returns false, if not prefixed + * + * @param string $str The prefixed string + * @return mixed The prefix or false if there is no prefix + * @access public + */ + function getPrefix($str){ + if($pos = strrpos($str,':')){ + // get prefix + return substr($str,0,$pos); + } + return false; + } + + /** + * pass it a prefix, it returns a namespace + * + * @param string $prefix The prefix + * @return mixed The namespace, false if no namespace has the specified prefix + * @access public + */ + function getNamespaceFromPrefix($prefix){ + if (isset($this->namespaces[$prefix])) { + return $this->namespaces[$prefix]; + } + //$this->setError("No namespace registered for prefix '$prefix'"); + return false; + } + + /** + * returns the prefix for a given namespace (or prefix) + * or false if no prefixes registered for the given namespace + * + * @param string $ns The namespace + * @return mixed The prefix, false if the namespace has no prefixes + * @access public + */ + function getPrefixFromNamespace($ns) { + foreach ($this->namespaces as $p => $n) { + if ($ns == $n || $ns == $p) { + $this->usedNamespaces[$p] = $n; + return $p; + } + } + return false; + } + + /** + * returns the time in ODBC canonical form with microseconds + * + * @return string The time in ODBC canonical form with microseconds + * @access public + */ + function getmicrotime() { + if (function_exists('gettimeofday')) { + $tod = gettimeofday(); + $sec = $tod['sec']; + $usec = $tod['usec']; + } else { + $sec = time(); + $usec = 0; + } + return strftime('%Y-%m-%d %H:%M:%S', $sec) . '.' . sprintf('%06d', $usec); + } + + /** + * Returns a string with the output of var_dump + * + * @param mixed $data The variable to var_dump + * @return string The output of var_dump + * @access public + */ + function varDump($data) { + ob_start(); + + if (!class_exists('G')) { + $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); + $docuroot = explode( '/', $realdocuroot ); + array_pop( $docuroot ); + $pathhome = implode( '/', $docuroot ) . '/'; + array_pop( $docuroot ); + $pathTrunk = implode( '/', $docuroot ) . '/'; + require_once($pathTrunk.'gulliver/system/class.g.php'); + } + G::LoadSystem('inputfilter'); + $filter = new InputFilter(); + $data = $filter->xssFilterHard($data); + + var_dump($data); + $ret_val = ob_get_contents(); + ob_end_clean(); + return $ret_val; + } +} + +// XML Schema Datatype Helper Functions + +//xsd:dateTime helpers + +/** +* convert unix timestamp to ISO 8601 compliant date string +* +* @param string $timestamp Unix time stamp +* @access public +*/ +function timestamp_to_iso8601($timestamp,$utc=true){ + $datestr = date('Y-m-d\TH:i:sO',$timestamp); + if($utc){ + $eregStr = + '([0-9]{4})-'. // centuries & years CCYY- + '([0-9]{2})-'. // months MM- + '([0-9]{2})'. // days DD + 'T'. // separator T + '([0-9]{2}):'. // hours hh: + '([0-9]{2}):'. // minutes mm: + '([0-9]{2})(\.[0-9]*)?'. // seconds ss.ss... + '(Z|[+\-][0-9]{2}:?[0-9]{2})?'; // Z to indicate UTC, -/+HH:MM:SS.SS... for local tz's + + if(ereg($eregStr,$datestr,$regs)){ + return sprintf('%04d-%02d-%02dT%02d:%02d:%02dZ',$regs[1],$regs[2],$regs[3],$regs[4],$regs[5],$regs[6]); + } + return false; + } else { + return $datestr; + } +} + +/** +* convert ISO 8601 compliant date string to unix timestamp +* +* @param string $datestr ISO 8601 compliant date string +* @access public +*/ +function iso8601_to_timestamp($datestr){ + $eregStr = + '([0-9]{4})-'. // centuries & years CCYY- + '([0-9]{2})-'. // months MM- + '([0-9]{2})'. // days DD + 'T'. // separator T + '([0-9]{2}):'. // hours hh: + '([0-9]{2}):'. // minutes mm: + '([0-9]{2})(\.[0-9]+)?'. // seconds ss.ss... + '(Z|[+\-][0-9]{2}:?[0-9]{2})?'; // Z to indicate UTC, -/+HH:MM:SS.SS... for local tz's + if(ereg($eregStr,$datestr,$regs)){ + // not utc + if($regs[8] != 'Z'){ + $op = substr($regs[8],0,1); + $h = substr($regs[8],1,2); + $m = substr($regs[8],strlen($regs[8])-2,2); + if($op == '-'){ + $regs[4] = $regs[4] + $h; + $regs[5] = $regs[5] + $m; + } elseif($op == '+'){ + $regs[4] = $regs[4] - $h; + $regs[5] = $regs[5] - $m; + } + } + return strtotime("$regs[1]-$regs[2]-$regs[3] $regs[4]:$regs[5]:$regs[6]Z"); + } else { + return false; + } +} + +/** +* sleeps some number of microseconds +* +* @param string $usec the number of microseconds to sleep +* @access public +* @deprecated +*/ +function usleepWindows($usec) +{ + $start = gettimeofday(); + + do + { + $stop = gettimeofday(); + $timePassed = 1000000 * ($stop['sec'] - $start['sec']) + + $stop['usec'] - $start['usec']; + } + while ($timePassed < $usec); +} + +?> +* @version $Id: nusoap.php,v 1.94 2005/08/04 01:27:42 snichol Exp $ +* @access public +*/ +class soap_fault_colosa extends nusoap_base_colosa { + /** + * The fault code (client|server) + * @var string + * @access private + */ + var $faultcode; + /** + * The fault actor + * @var string + * @access private + */ + var $faultactor; + /** + * The fault string, a description of the fault + * @var string + * @access private + */ + var $faultstring; + /** + * The fault detail, typically a string or array of string + * @var mixed + * @access private + */ + var $faultdetail; + + /** + * constructor + * + * @param string $faultcode (client | server) + * @param string $faultactor only used when msg routed between multiple actors + * @param string $faultstring human readable error message + * @param mixed $faultdetail detail, typically a string or array of string + */ + function soap_fault_colosa($faultcode,$faultactor='',$faultstring='',$faultdetail=''){ + parent::nusoap_base_colosa(); + $this->faultcode = $faultcode; + $this->faultactor = $faultactor; + $this->faultstring = $faultstring; + $this->faultdetail = $faultdetail; + } + + /** + * serialize a fault + * + * @return string The serialization of the fault instance. + * @access public + */ + function serialize(){ + $ns_string = ''; + foreach($this->namespaces as $k => $v){ + $ns_string .= "\n xmlns:$k=\"$v\""; + } + $return_msg = + 'soap_defencoding.'"?>'. + '\n". + ''. + ''. + $this->serialize_val($this->faultcode, 'faultcode'). + $this->serialize_val($this->faultactor, 'faultactor'). + $this->serialize_val($this->faultstring, 'faultstring'). + $this->serialize_val($this->faultdetail, 'detail'). + ''. + ''. + ''; + return $return_msg; + } +} + + + +?> +* @version $Id: nusoap.php,v 1.94 2005/08/04 01:27:42 snichol Exp $ +* @access public +*/ +class XMLSchema extends nusoap_base_colosa { + + // files + var $schema = ''; + var $xml = ''; + // namespaces + var $enclosingNamespaces; + // schema info + var $schemaInfo = array(); + var $schemaTargetNamespace = ''; + // types, elements, attributes defined by the schema + var $attributes = array(); + var $complexTypes = array(); + var $complexTypeStack = array(); + var $currentComplexType = null; + var $elements = array(); + var $elementStack = array(); + var $currentElement = null; + var $simpleTypes = array(); + var $simpleTypeStack = array(); + var $currentSimpleType = null; + // imports + var $imports = array(); + // parser vars + var $parser; + var $position = 0; + var $depth = 0; + var $depth_array = array(); + var $message = array(); + var $defaultNamespace = array(); + + /** + * constructor + * + * @param string $schema schema document URI + * @param string $xml xml document URI + * @param string $namespaces namespaces defined in enclosing XML + * @access public + */ + function XMLSchema($schema='',$xml='',$namespaces=array()){ + parent::nusoap_base_colosa(); + $this->debug('xmlschema class instantiated, inside constructor'); + // files + $this->schema = $schema; + $this->xml = $xml; + + // namespaces + $this->enclosingNamespaces = $namespaces; + $this->namespaces = array_merge($this->namespaces, $namespaces); + + // parse schema file + if($schema != ''){ + $this->debug('initial schema file: '.$schema); + $this->parseFile($schema, 'schema'); + } + + // parse xml file + if($xml != ''){ + $this->debug('initial xml file: '.$xml); + $this->parseFile($xml, 'xml'); + } + + } + + /** + * parse an XML file + * + * @param string $xml, path/URL to XML file + * @param string $type, (schema | xml) + * @return boolean + * @access public + */ + function parseFile($xml,$type){ + // parse xml file + if($xml != ""){ + $xmlStr = @join("",@file($xml)); + if($xmlStr == ""){ + $msg = 'Error reading XML from '.$xml; + $this->setError($msg); + $this->debug($msg); + return false; + } else { + $this->debug("parsing $xml"); + $this->parseString($xmlStr,$type); + $this->debug("done parsing $xml"); + return true; + } + } + return false; + } + + /** + * parse an XML string + * + * @param string $xml path or URL + * @param string $type, (schema|xml) + * @access private + */ + function parseString($xml,$type){ + // parse xml string + if($xml != ""){ + + // Create an XML parser. + $this->parser = xml_parser_create(); + // Set the options for parsing the XML data. + xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, 0); + + // Set the object for the parser. + xml_set_object($this->parser, $this); + + // Set the element handlers for the parser. + if($type == "schema"){ + xml_set_element_handler($this->parser, 'schemaStartElement','schemaEndElement'); + xml_set_character_data_handler($this->parser,'schemaCharacterData'); + } elseif($type == "xml"){ + xml_set_element_handler($this->parser, 'xmlStartElement','xmlEndElement'); + xml_set_character_data_handler($this->parser,'xmlCharacterData'); + } + + // Parse the XML file. + if(!xml_parse($this->parser,$xml,true)){ + // Display an error message. + $errstr = sprintf('XML error parsing XML schema on line %d: %s', + xml_get_current_line_number($this->parser), + xml_error_string(xml_get_error_code($this->parser)) + ); + $this->debug($errstr); + $this->debug("XML payload:\n" . $xml); + $this->setError($errstr); + } + + xml_parser_free($this->parser); + } else{ + $this->debug('no xml passed to parseString()!!'); + $this->setError('no xml passed to parseString()!!'); + } + } + + /** + * start-element handler + * + * @param string $parser XML parser object + * @param string $name element name + * @param string $attrs associative array of attributes + * @access private + */ + function schemaStartElement($parser, $name, $attrs) { + + // position in the total number of elements, starting from 0 + $pos = $this->position++; + $depth = $this->depth++; + // set self as current value for this depth + $this->depth_array[$depth] = $pos; + $this->message[$pos] = array('cdata' => ''); + if ($depth > 0) { + $this->defaultNamespace[$pos] = $this->defaultNamespace[$this->depth_array[$depth - 1]]; + } else { + $this->defaultNamespace[$pos] = false; + } + + // get element prefix + if($prefix = $this->getPrefix($name)){ + // get unqualified name + $name = $this->getLocalPart($name); + } else { + $prefix = ''; + } + + // loop thru attributes, expanding, and registering namespace declarations + if(count($attrs) > 0){ + foreach($attrs as $k => $v){ + // if ns declarations, add to class level array of valid namespaces + if(ereg("^xmlns",$k)){ + //$this->xdebug("$k: $v"); + //$this->xdebug('ns_prefix: '.$this->getPrefix($k)); + if($ns_prefix = substr(strrchr($k,':'),1)){ + //$this->xdebug("Add namespace[$ns_prefix] = $v"); + $this->namespaces[$ns_prefix] = $v; + } else { + $this->defaultNamespace[$pos] = $v; + if (! $this->getPrefixFromNamespace($v)) { + $this->namespaces['ns'.(count($this->namespaces)+1)] = $v; + } + } + if($v == 'http://www.w3.org/2001/XMLSchema' || $v == 'http://www.w3.org/1999/XMLSchema' || $v == 'http://www.w3.org/2000/10/XMLSchema'){ + $this->XMLSchemaVersion = $v; + $this->namespaces['xsi'] = $v.'-instance'; + } + } + } + foreach($attrs as $k => $v){ + // expand each attribute + $k = strpos($k,':') ? $this->expandQname($k) : $k; + $v = strpos($v,':') ? $this->expandQname($v) : $v; + $eAttrs[$k] = $v; + } + $attrs = $eAttrs; + } else { + $attrs = array(); + } + // find status, register data + switch($name){ + case 'all': // (optional) compositor content for a complexType + case 'choice': + case 'group': + case 'sequence': + //$this->xdebug("compositor $name for currentComplexType: $this->currentComplexType and currentElement: $this->currentElement"); + $this->complexTypes[$this->currentComplexType]['compositor'] = $name; + //if($name == 'all' || $name == 'sequence'){ + // $this->complexTypes[$this->currentComplexType]['phpType'] = 'struct'; + //} + break; + case 'attribute': // complexType attribute + //$this->xdebug("parsing attribute $attrs[name] $attrs[ref] of value: ".$attrs['http://schemas.xmlsoap.org/wsdl/:arrayType']); + $this->xdebug("parsing attribute:"); + $this->appendDebug($this->varDump($attrs)); + if (!isset($attrs['form'])) { + $attrs['form'] = $this->schemaInfo['attributeFormDefault']; + } + if (isset($attrs['http://schemas.xmlsoap.org/wsdl/:arrayType'])) { + $v = $attrs['http://schemas.xmlsoap.org/wsdl/:arrayType']; + if (!strpos($v, ':')) { + // no namespace in arrayType attribute value... + if ($this->defaultNamespace[$pos]) { + // ...so use the default + $attrs['http://schemas.xmlsoap.org/wsdl/:arrayType'] = $this->defaultNamespace[$pos] . ':' . $attrs['http://schemas.xmlsoap.org/wsdl/:arrayType']; + } + } + } + if(isset($attrs['name'])){ + $this->attributes[$attrs['name']] = $attrs; + $aname = $attrs['name']; + } elseif(isset($attrs['ref']) && $attrs['ref'] == 'http://schemas.xmlsoap.org/soap/encoding/:arrayType'){ + if (isset($attrs['http://schemas.xmlsoap.org/wsdl/:arrayType'])) { + $aname = $attrs['http://schemas.xmlsoap.org/wsdl/:arrayType']; + } else { + $aname = ''; + } + } elseif(isset($attrs['ref'])){ + $aname = $attrs['ref']; + $this->attributes[$attrs['ref']] = $attrs; + } + + if($this->currentComplexType){ // This should *always* be + $this->complexTypes[$this->currentComplexType]['attrs'][$aname] = $attrs; + } + // arrayType attribute + if(isset($attrs['http://schemas.xmlsoap.org/wsdl/:arrayType']) || $this->getLocalPart($aname) == 'arrayType'){ + $this->complexTypes[$this->currentComplexType]['phpType'] = 'array'; + $prefix = $this->getPrefix($aname); + if(isset($attrs['http://schemas.xmlsoap.org/wsdl/:arrayType'])){ + $v = $attrs['http://schemas.xmlsoap.org/wsdl/:arrayType']; + } else { + $v = ''; + } + if(strpos($v,'[,]')){ + $this->complexTypes[$this->currentComplexType]['multidimensional'] = true; + } + $v = substr($v,0,strpos($v,'[')); // clip the [] + if(!strpos($v,':') && isset($this->typemap[$this->XMLSchemaVersion][$v])){ + $v = $this->XMLSchemaVersion.':'.$v; + } + $this->complexTypes[$this->currentComplexType]['arrayType'] = $v; + } + break; + case 'complexContent': // (optional) content for a complexType + break; + case 'complexType': + array_push($this->complexTypeStack, $this->currentComplexType); + if(isset($attrs['name'])){ + $this->xdebug('processing named complexType '.$attrs['name']); + //$this->currentElement = false; + $this->currentComplexType = $attrs['name']; + $this->complexTypes[$this->currentComplexType] = $attrs; + $this->complexTypes[$this->currentComplexType]['typeClass'] = 'complexType'; + // This is for constructs like + // + // + // + // + // + if(isset($attrs['base']) && ereg(':Array$',$attrs['base'])){ + $this->xdebug('complexType is unusual array'); + $this->complexTypes[$this->currentComplexType]['phpType'] = 'array'; + } else { + $this->complexTypes[$this->currentComplexType]['phpType'] = 'struct'; + } + }else{ + $this->xdebug('processing unnamed complexType for element '.$this->currentElement); + $this->currentComplexType = $this->currentElement . '_ContainedType'; + //$this->currentElement = false; + $this->complexTypes[$this->currentComplexType] = $attrs; + $this->complexTypes[$this->currentComplexType]['typeClass'] = 'complexType'; + // This is for constructs like + // + // + // + // + // + if(isset($attrs['base']) && ereg(':Array$',$attrs['base'])){ + $this->xdebug('complexType is unusual array'); + $this->complexTypes[$this->currentComplexType]['phpType'] = 'array'; + } else { + $this->complexTypes[$this->currentComplexType]['phpType'] = 'struct'; + } + } + break; + case 'element': + array_push($this->elementStack, $this->currentElement); + // elements defined as part of a complex type should + // not really be added to $this->elements, but for some + // reason, they are + if (!isset($attrs['form'])) { + $attrs['form'] = $this->schemaInfo['elementFormDefault']; + } + if(isset($attrs['type'])){ + $this->xdebug("processing typed element ".$attrs['name']." of type ".$attrs['type']); + if (! $this->getPrefix($attrs['type'])) { + if ($this->defaultNamespace[$pos]) { + $attrs['type'] = $this->defaultNamespace[$pos] . ':' . $attrs['type']; + $this->xdebug('used default namespace to make type ' . $attrs['type']); + } + } + // This is for constructs like + // + // + // + // + // + if ($this->currentComplexType && $this->complexTypes[$this->currentComplexType]['phpType'] == 'array') { + $this->xdebug('arrayType for unusual array is ' . $attrs['type']); + $this->complexTypes[$this->currentComplexType]['arrayType'] = $attrs['type']; + } + $this->currentElement = $attrs['name']; + $this->elements[ $attrs['name'] ] = $attrs; + $this->elements[ $attrs['name'] ]['typeClass'] = 'element'; + $ename = $attrs['name']; + } elseif(isset($attrs['ref'])){ + $this->xdebug("processing element as ref to ".$attrs['ref']); + $this->currentElement = "ref to ".$attrs['ref']; + $ename = $this->getLocalPart($attrs['ref']); + } else { + $this->xdebug("processing untyped element ".$attrs['name']); + $this->currentElement = $attrs['name']; + $this->elements[ $attrs['name'] ] = $attrs; + $this->elements[ $attrs['name'] ]['typeClass'] = 'element'; + $attrs['type'] = $this->schemaTargetNamespace . ':' . $attrs['name'] . '_ContainedType'; + $this->elements[ $attrs['name'] ]['type'] = $attrs['type']; + $ename = $attrs['name']; + } + if(isset($ename) && $this->currentComplexType){ + $this->complexTypes[$this->currentComplexType]['elements'][$ename] = $attrs; + } + break; + case 'enumeration': // restriction value list member + $this->xdebug('enumeration ' . $attrs['value']); + if ($this->currentSimpleType) { + $this->simpleTypes[$this->currentSimpleType]['enumeration'][] = $attrs['value']; + } elseif ($this->currentComplexType) { + $this->complexTypes[$this->currentComplexType]['enumeration'][] = $attrs['value']; + } + break; + case 'extension': // simpleContent or complexContent type extension + $this->xdebug('extension ' . $attrs['base']); + if ($this->currentComplexType) { + $this->complexTypes[$this->currentComplexType]['extensionBase'] = $attrs['base']; + } + break; + case 'import': + if (isset($attrs['schemaLocation'])) { + //$this->xdebug('import namespace ' . $attrs['namespace'] . ' from ' . $attrs['schemaLocation']); + $this->imports[$attrs['namespace']][] = array('location' => $attrs['schemaLocation'], 'loaded' => false); + } else { + //$this->xdebug('import namespace ' . $attrs['namespace']); + $this->imports[$attrs['namespace']][] = array('location' => '', 'loaded' => true); + if (! $this->getPrefixFromNamespace($attrs['namespace'])) { + $this->namespaces['ns'.(count($this->namespaces)+1)] = $attrs['namespace']; + } + } + break; + case 'list': // simpleType value list + break; + case 'restriction': // simpleType, simpleContent or complexContent value restriction + $this->xdebug('restriction ' . $attrs['base']); + if($this->currentSimpleType){ + $this->simpleTypes[$this->currentSimpleType]['type'] = $attrs['base']; + } elseif($this->currentComplexType){ + $this->complexTypes[$this->currentComplexType]['restrictionBase'] = $attrs['base']; + if(strstr($attrs['base'],':') == ':Array'){ + $this->complexTypes[$this->currentComplexType]['phpType'] = 'array'; + } + } + break; + case 'schema': + $this->schemaInfo = $attrs; + $this->schemaInfo['schemaVersion'] = $this->getNamespaceFromPrefix($prefix); + if (isset($attrs['targetNamespace'])) { + $this->schemaTargetNamespace = $attrs['targetNamespace']; + } + if (!isset($attrs['elementFormDefault'])) { + $this->schemaInfo['elementFormDefault'] = 'unqualified'; + } + if (!isset($attrs['attributeFormDefault'])) { + $this->schemaInfo['attributeFormDefault'] = 'unqualified'; + } + break; + case 'simpleContent': // (optional) content for a complexType + break; + case 'simpleType': + array_push($this->simpleTypeStack, $this->currentSimpleType); + if(isset($attrs['name'])){ + $this->xdebug("processing simpleType for name " . $attrs['name']); + $this->currentSimpleType = $attrs['name']; + $this->simpleTypes[ $attrs['name'] ] = $attrs; + $this->simpleTypes[ $attrs['name'] ]['typeClass'] = 'simpleType'; + $this->simpleTypes[ $attrs['name'] ]['phpType'] = 'scalar'; + } else { + $this->xdebug('processing unnamed simpleType for element '.$this->currentElement); + $this->currentSimpleType = $this->currentElement . '_ContainedType'; + //$this->currentElement = false; + $this->simpleTypes[$this->currentSimpleType] = $attrs; + $this->simpleTypes[$this->currentSimpleType]['phpType'] = 'scalar'; + } + break; + case 'union': // simpleType type list + break; + default: + //$this->xdebug("do not have anything to do for element $name"); + } + } + + /** + * end-element handler + * + * @param string $parser XML parser object + * @param string $name element name + * @access private + */ + function schemaEndElement($parser, $name) { + // bring depth down a notch + $this->depth--; + // position of current element is equal to the last value left in depth_array for my depth + if(isset($this->depth_array[$this->depth])){ + $pos = $this->depth_array[$this->depth]; + } + // get element prefix + if ($prefix = $this->getPrefix($name)){ + // get unqualified name + $name = $this->getLocalPart($name); + } else { + $prefix = ''; + } + // move on... + if($name == 'complexType'){ + $this->xdebug('done processing complexType ' . ($this->currentComplexType ? $this->currentComplexType : '(unknown)')); + $this->currentComplexType = array_pop($this->complexTypeStack); + //$this->currentElement = false; + } + if($name == 'element'){ + $this->xdebug('done processing element ' . ($this->currentElement ? $this->currentElement : '(unknown)')); + $this->currentElement = array_pop($this->elementStack); + } + if($name == 'simpleType'){ + $this->xdebug('done processing simpleType ' . ($this->currentSimpleType ? $this->currentSimpleType : '(unknown)')); + $this->currentSimpleType = array_pop($this->simpleTypeStack); + } + } + + /** + * element content handler + * + * @param string $parser XML parser object + * @param string $data element content + * @access private + */ + function schemaCharacterData($parser, $data){ + $pos = $this->depth_array[$this->depth - 1]; + $this->message[$pos]['cdata'] .= $data; + } + + /** + * serialize the schema + * + * @access public + */ + function serializeSchema(){ + + $schemaPrefix = $this->getPrefixFromNamespace($this->XMLSchemaVersion); + $xml = ''; + // imports + if (sizeof($this->imports) > 0) { + foreach($this->imports as $ns => $list) { + foreach ($list as $ii) { + if ($ii['location'] != '') { + $xml .= " <$schemaPrefix:import location=\"" . $ii['location'] . '" namespace="' . $ns . "\" />\n"; + } else { + $xml .= " <$schemaPrefix:import namespace=\"" . $ns . "\" />\n"; + } + } + } + } + // complex types + foreach($this->complexTypes as $typeName => $attrs){ + $contentStr = ''; + // serialize child elements + if(isset($attrs['elements']) && (count($attrs['elements']) > 0)){ + foreach($attrs['elements'] as $element => $eParts){ + if(isset($eParts['ref'])){ + $contentStr .= " <$schemaPrefix:element ref=\"$element\"/>\n"; + } else { + $contentStr .= " <$schemaPrefix:element name=\"$element\" type=\"" . $this->contractQName($eParts['type']) . "\""; + foreach ($eParts as $aName => $aValue) { + // handle, e.g., abstract, default, form, minOccurs, maxOccurs, nillable + if ($aName != 'name' && $aName != 'type') { + $contentStr .= " $aName=\"$aValue\""; + } + } + $contentStr .= "/>\n"; + } + } + // compositor wraps elements + if (isset($attrs['compositor']) && ($attrs['compositor'] != '')) { + $contentStr = " <$schemaPrefix:$attrs[compositor]>\n".$contentStr." \n"; + } + } + // attributes + if(isset($attrs['attrs']) && (count($attrs['attrs']) >= 1)){ + foreach($attrs['attrs'] as $attr => $aParts){ + $contentStr .= " <$schemaPrefix:attribute"; + foreach ($aParts as $a => $v) { + if ($a == 'ref' || $a == 'type') { + $contentStr .= " $a=\"".$this->contractQName($v).'"'; + } elseif ($a == 'http://schemas.xmlsoap.org/wsdl/:arrayType') { + $this->usedNamespaces['wsdl'] = $this->namespaces['wsdl']; + $contentStr .= ' wsdl:arrayType="'.$this->contractQName($v).'"'; + } else { + $contentStr .= " $a=\"$v\""; + } + } + $contentStr .= "/>\n"; + } + } + // if restriction + if (isset($attrs['restrictionBase']) && $attrs['restrictionBase'] != ''){ + $contentStr = " <$schemaPrefix:restriction base=\"".$this->contractQName($attrs['restrictionBase'])."\">\n".$contentStr." \n"; + // complex or simple content + if ((isset($attrs['elements']) && count($attrs['elements']) > 0) || (isset($attrs['attrs']) && count($attrs['attrs']) > 0)){ + $contentStr = " <$schemaPrefix:complexContent>\n".$contentStr." \n"; + } + } + // finalize complex type + if($contentStr != ''){ + $contentStr = " <$schemaPrefix:complexType name=\"$typeName\">\n".$contentStr." \n"; + } else { + $contentStr = " <$schemaPrefix:complexType name=\"$typeName\"/>\n"; + } + $xml .= $contentStr; + } + // simple types + if(isset($this->simpleTypes) && count($this->simpleTypes) > 0){ + foreach($this->simpleTypes as $typeName => $eParts){ + $xml .= " <$schemaPrefix:simpleType name=\"$typeName\">\n <$schemaPrefix:restriction base=\"".$this->contractQName($eParts['type'])."\"/>\n"; + if (isset($eParts['enumeration'])) { + foreach ($eParts['enumeration'] as $e) { + $xml .= " <$schemaPrefix:enumeration value=\"$e\"/>\n"; + } + } + $xml .= " "; + } + } + // elements + if(isset($this->elements) && count($this->elements) > 0){ + foreach($this->elements as $element => $eParts){ + $xml .= " <$schemaPrefix:element name=\"$element\" type=\"".$this->contractQName($eParts['type'])."\"/>\n"; + } + } + // attributes + if(isset($this->attributes) && count($this->attributes) > 0){ + foreach($this->attributes as $attr => $aParts){ + $xml .= " <$schemaPrefix:attribute name=\"$attr\" type=\"".$this->contractQName($aParts['type'])."\"\n/>"; + } + } + // finish 'er up + $el = "<$schemaPrefix:schema targetNamespace=\"$this->schemaTargetNamespace\"\n"; + foreach (array_diff($this->usedNamespaces, $this->enclosingNamespaces) as $nsp => $ns) { + $el .= " xmlns:$nsp=\"$ns\"\n"; + } + $xml = $el . ">\n".$xml."\n"; + return $xml; + } + + /** + * adds debug data to the clas level debug string + * + * @param string $string debug data + * @access private + */ + function xdebug($string){ + $this->debug('<' . $this->schemaTargetNamespace . '> '.$string); + } + + /** + * get the PHP type of a user defined type in the schema + * PHP type is kind of a misnomer since it actually returns 'struct' for assoc. arrays + * returns false if no type exists, or not w/ the given namespace + * else returns a string that is either a native php type, or 'struct' + * + * @param string $type, name of defined type + * @param string $ns, namespace of type + * @return mixed + * @access public + * @deprecated + */ + function getPHPType($type,$ns){ + if(isset($this->typemap[$ns][$type])){ + //print "found type '$type' and ns $ns in typemap
    "; + return $this->typemap[$ns][$type]; + } elseif(isset($this->complexTypes[$type])){ + //print "getting type '$type' and ns $ns from complexTypes array
    "; + return $this->complexTypes[$type]['phpType']; + } + return false; + } + + /** + * returns an associative array of information about a given type + * returns false if no type exists by the given name + * + * For a complexType typeDef = array( + * 'restrictionBase' => '', + * 'phpType' => '', + * 'compositor' => '(sequence|all)', + * 'elements' => array(), // refs to elements array + * 'attrs' => array() // refs to attributes array + * ... and so on (see addComplexType) + * ) + * + * For simpleType or element, the array has different keys. + * + * @param string + * @return mixed + * @access public + * @see addComplexType + * @see addSimpleType + * @see addElement + */ + function getTypeDef($type){ + //$this->debug("in getTypeDef for type $type"); + if(isset($this->complexTypes[$type])){ + $this->xdebug("in getTypeDef, found complexType $type"); + return $this->complexTypes[$type]; + } elseif(isset($this->simpleTypes[$type])){ + $this->xdebug("in getTypeDef, found simpleType $type"); + if (!isset($this->simpleTypes[$type]['phpType'])) { + // get info for type to tack onto the simple type + // TODO: can this ever really apply (i.e. what is a simpleType really?) + $uqType = substr($this->simpleTypes[$type]['type'], strrpos($this->simpleTypes[$type]['type'], ':') + 1); + $ns = substr($this->simpleTypes[$type]['type'], 0, strrpos($this->simpleTypes[$type]['type'], ':')); + $etype = $this->getTypeDef($uqType); + if ($etype) { + $this->xdebug("in getTypeDef, found type for simpleType $type:"); + $this->xdebug($this->varDump($etype)); + if (isset($etype['phpType'])) { + $this->simpleTypes[$type]['phpType'] = $etype['phpType']; + } + if (isset($etype['elements'])) { + $this->simpleTypes[$type]['elements'] = $etype['elements']; + } + } + } + return $this->simpleTypes[$type]; + } elseif(isset($this->elements[$type])){ + $this->xdebug("in getTypeDef, found element $type"); + if (!isset($this->elements[$type]['phpType'])) { + // get info for type to tack onto the element + $uqType = substr($this->elements[$type]['type'], strrpos($this->elements[$type]['type'], ':') + 1); + $ns = substr($this->elements[$type]['type'], 0, strrpos($this->elements[$type]['type'], ':')); + $etype = $this->getTypeDef($uqType); + if ($etype) { + $this->xdebug("in getTypeDef, found type for element $type:"); + $this->xdebug($this->varDump($etype)); + if (isset($etype['phpType'])) { + $this->elements[$type]['phpType'] = $etype['phpType']; + } + if (isset($etype['elements'])) { + $this->elements[$type]['elements'] = $etype['elements']; + } + } elseif ($ns == 'http://www.w3.org/2001/XMLSchema') { + $this->xdebug("in getTypeDef, element $type is an XSD type"); + $this->elements[$type]['phpType'] = 'scalar'; + } + } + return $this->elements[$type]; + } elseif(isset($this->attributes[$type])){ + $this->xdebug("in getTypeDef, found attribute $type"); + return $this->attributes[$type]; + } elseif (ereg('_ContainedType$', $type)) { + $this->xdebug("in getTypeDef, have an untyped element $type"); + $typeDef['typeClass'] = 'simpleType'; + $typeDef['phpType'] = 'scalar'; + $typeDef['type'] = 'http://www.w3.org/2001/XMLSchema:string'; + return $typeDef; + } + $this->xdebug("in getTypeDef, did not find $type"); + return false; + } + + /** + * returns a sample serialization of a given type, or false if no type by the given name + * + * @param string $type, name of type + * @return mixed + * @access public + * @deprecated + */ + function serializeTypeDef($type){ + //print "in sTD() for type $type
    "; + if($typeDef = $this->getTypeDef($type)){ + $str .= '<'.$type; + if(is_array($typeDef['attrs'])){ + foreach($attrs as $attName => $data){ + $str .= " $attName=\"{type = ".$data['type']."}\""; + } + } + $str .= " xmlns=\"".$this->schema['targetNamespace']."\""; + if(count($typeDef['elements']) > 0){ + $str .= ">"; + foreach($typeDef['elements'] as $element => $eData){ + $str .= $this->serializeTypeDef($element); + } + $str .= ""; + } elseif($typeDef['typeClass'] == 'element') { + $str .= ">"; + } else { + $str .= "/>"; + } + return $str; + } + return false; + } + + /** + * returns HTML form elements that allow a user + * to enter values for creating an instance of the given type. + * + * @param string $name, name for type instance + * @param string $type, name of type + * @return string + * @access public + * @deprecated + */ + function typeToForm($name,$type){ + // get typedef + if($typeDef = $this->getTypeDef($type)){ + // if struct + if($typeDef['phpType'] == 'struct'){ + $buffer .= ''; + foreach($typeDef['elements'] as $child => $childDef){ + $buffer .= " + + "; + } + $buffer .= '
    $childDef[name] (type: ".$this->getLocalPart($childDef['type'])."):
    '; + // if array + } elseif($typeDef['phpType'] == 'array'){ + $buffer .= ''; + for($i=0;$i < 3; $i++){ + $buffer .= " + + "; + } + $buffer .= '
    array item (type: $typeDef[arrayType]):
    '; + // if scalar + } else { + $buffer .= ""; + } + } else { + $buffer .= ""; + } + return $buffer; + } + + /** + * adds a complex type to the schema + * + * example: array + * + * addType( + * 'ArrayOfstring', + * 'complexType', + * 'array', + * '', + * 'SOAP-ENC:Array', + * array('ref'=>'SOAP-ENC:arrayType','wsdl:arrayType'=>'string[]'), + * 'xsd:string' + * ); + * + * example: PHP associative array ( SOAP Struct ) + * + * addType( + * 'SOAPStruct', + * 'complexType', + * 'struct', + * 'all', + * array('myVar'=> array('name'=>'myVar','type'=>'string') + * ); + * + * @param name + * @param typeClass (complexType|simpleType|attribute) + * @param phpType: currently supported are array and struct (php assoc array) + * @param compositor (all|sequence|choice) + * @param restrictionBase namespace:name (http://schemas.xmlsoap.org/soap/encoding/:Array) + * @param elements = array ( name = array(name=>'',type=>'') ) + * @param attrs = array( + * array( + * 'ref' => "http://schemas.xmlsoap.org/soap/encoding/:arrayType", + * "http://schemas.xmlsoap.org/wsdl/:arrayType" => "string[]" + * ) + * ) + * @param arrayType: namespace:name (http://www.w3.org/2001/XMLSchema:string) + * @access public + * @see getTypeDef + */ + function addComplexType($name,$typeClass='complexType',$phpType='array',$compositor='',$restrictionBase='',$elements=array(),$attrs=array(),$arrayType=''){ + $this->complexTypes[$name] = array( + 'name' => $name, + 'typeClass' => $typeClass, + 'phpType' => $phpType, + 'compositor'=> $compositor, + 'restrictionBase' => $restrictionBase, + 'elements' => $elements, + 'attrs' => $attrs, + 'arrayType' => $arrayType + ); + + $this->xdebug("addComplexType $name:"); + $this->appendDebug($this->varDump($this->complexTypes[$name])); + } + + /** + * adds a simple type to the schema + * + * @param string $name + * @param string $restrictionBase namespace:name (http://schemas.xmlsoap.org/soap/encoding/:Array) + * @param string $typeClass (should always be simpleType) + * @param string $phpType (should always be scalar) + * @param array $enumeration array of values + * @access public + * @see xmlschema + * @see getTypeDef + */ + function addSimpleType($name, $restrictionBase='', $typeClass='simpleType', $phpType='scalar', $enumeration=array()) { + $this->simpleTypes[$name] = array( + 'name' => $name, + 'typeClass' => $typeClass, + 'phpType' => $phpType, + 'type' => $restrictionBase, + 'enumeration' => $enumeration + ); + + $this->xdebug("addSimpleType $name:"); + $this->appendDebug($this->varDump($this->simpleTypes[$name])); + } + + /** + * adds an element to the schema + * + * @param array $attrs attributes that must include name and type + * @see xmlschema + * @access public + */ + function addElement($attrs) { + if (! $this->getPrefix($attrs['type'])) { + $attrs['type'] = $this->schemaTargetNamespace . ':' . $attrs['type']; + } + $this->elements[ $attrs['name'] ] = $attrs; + $this->elements[ $attrs['name'] ]['typeClass'] = 'element'; + + $this->xdebug("addElement " . $attrs['name']); + $this->appendDebug($this->varDump($this->elements[ $attrs['name'] ])); + } +} + + + +?> +* @version $Id: nusoap.php,v 1.94 2005/08/04 01:27:42 snichol Exp $ +* @access public +*/ +class soapval extends nusoap_base_colosa { + /** + * The XML element name + * + * @var string + * @access private + */ + var $name; + /** + * The XML type name (string or false) + * + * @var mixed + * @access private + */ + var $type; + /** + * The PHP value + * + * @var mixed + * @access private + */ + var $value; + /** + * The XML element namespace (string or false) + * + * @var mixed + * @access private + */ + var $element_ns; + /** + * The XML type namespace (string or false) + * + * @var mixed + * @access private + */ + var $type_ns; + /** + * The XML element attributes (array or false) + * + * @var mixed + * @access private + */ + var $attributes; + + /** + * constructor + * + * @param string $name optional name + * @param mixed $type optional type name + * @param mixed $value optional value + * @param mixed $element_ns optional namespace of value + * @param mixed $type_ns optional namespace of type + * @param mixed $attributes associative array of attributes to add to element serialization + * @access public + */ + function soapval($name='soapval',$type=false,$value=-1,$element_ns=false,$type_ns=false,$attributes=false) { + parent::nusoap_base_colosa(); + $this->name = $name; + $this->type = $type; + $this->value = $value; + $this->element_ns = $element_ns; + $this->type_ns = $type_ns; + $this->attributes = $attributes; + } + + /** + * return serialized value + * + * @param string $use The WSDL use value (encoded|literal) + * @return string XML data + * @access public + */ + function serialize($use='encoded') { + return $this->serialize_val($this->value,$this->name,$this->type,$this->element_ns,$this->type_ns,$this->attributes,$use); + } + + /** + * decodes a soapval object into a PHP native type + * + * @return mixed + * @access public + */ + function decode(){ + return $this->value; + } +} + + + +?> +* @version $Id: nusoap.php,v 1.94 2005/08/04 01:27:42 snichol Exp $ +* @access public +*/ +class soap_transport_http extends nusoap_base_colosa { + + var $url = ''; + var $uri = ''; + var $digest_uri = ''; + var $scheme = ''; + var $host = ''; + var $port = ''; + var $path = ''; + var $request_method = 'POST'; + var $protocol_version = '1.0'; + var $encoding = ''; + var $outgoing_headers = array(); + var $incoming_headers = array(); + var $incoming_cookies = array(); + var $outgoing_payload = ''; + var $incoming_payload = ''; + var $useSOAPAction = true; + var $persistentConnection = false; + var $ch = false; // cURL handle + var $username = ''; + var $password = ''; + var $authtype = ''; + var $digestRequest = array(); + var $certRequest = array(); // keys must be cainfofile (optional), sslcertfile, sslkeyfile, passphrase, verifypeer (optional), verifyhost (optional) + // cainfofile: certificate authority file, e.g. '$pathToPemFiles/rootca.pem' + // sslcertfile: SSL certificate file, e.g. '$pathToPemFiles/mycert.pem' + // sslkeyfile: SSL key file, e.g. '$pathToPemFiles/mykey.pem' + // passphrase: SSL key password/passphrase + // verifypeer: default is 1 + // verifyhost: default is 1 + + /** + * constructor + */ + function soap_transport_http($url){ + parent::nusoap_base_colosa(); + $this->setURL($url); + ereg('\$Revisio' . 'n: ([^ ]+)', $this->revision, $rev); + $this->outgoing_headers['User-Agent'] = $this->title.'/'.$this->version.' ('.$rev[1].')'; + $this->debug('set User-Agent: ' . $this->outgoing_headers['User-Agent']); + } + + function setURL($url) { + $this->url = $url; + + $u = parse_url($url); + foreach($u as $k => $v){ + $this->debug("$k = $v"); + $this->$k = $v; + } + + // add any GET params to path + if(isset($u['query']) && $u['query'] != ''){ + $this->path .= '?' . $u['query']; + } + + // set default port + if(!isset($u['port'])){ + if($u['scheme'] == 'https'){ + $this->port = 443; + } else { + $this->port = 80; + } + } + + $this->uri = $this->path; + $this->digest_uri = $this->uri; + + // build headers + if (!isset($u['port'])) { + $this->outgoing_headers['Host'] = $this->host; + } else { + $this->outgoing_headers['Host'] = $this->host.':'.$this->port; + } + $this->debug('set Host: ' . $this->outgoing_headers['Host']); + + if (isset($u['user']) && $u['user'] != '') { + $this->setCredentials(urldecode($u['user']), isset($u['pass']) ? urldecode($u['pass']) : ''); + } + } + + function connect($connection_timeout=0,$response_timeout=30){ + // For PHP 4.3 with OpenSSL, change https scheme to ssl, then treat like + // "regular" socket. + // TODO: disabled for now because OpenSSL must be *compiled* in (not just + // loaded), and until PHP5 stream_get_wrappers is not available. +// if ($this->scheme == 'https') { +// if (version_compare(phpversion(), '4.3.0') >= 0) { +// if (extension_loaded('openssl')) { +// $this->scheme = 'ssl'; +// $this->debug('Using SSL over OpenSSL'); +// } +// } +// } + $this->debug("connect connection_timeout $connection_timeout, response_timeout $response_timeout, scheme $this->scheme, host $this->host, port $this->port"); + if ($this->scheme == 'http' || $this->scheme == 'ssl') { + // use persistent connection + if($this->persistentConnection && isset($this->fp) && is_resource($this->fp)){ + if (!feof($this->fp)) { + $this->debug('Re-use persistent connection'); + return true; + } + fclose($this->fp); + $this->debug('Closed persistent connection at EOF'); + } + + // munge host if using OpenSSL + if ($this->scheme == 'ssl') { + $host = 'ssl://' . $this->host; + } else { + $host = $this->host; + } + $this->debug('calling fsockopen with host ' . $host . ' connection_timeout ' . $connection_timeout); + + // open socket + if($connection_timeout > 0){ + $this->fp = @fsockopen( $host, $this->port, $this->errno, $this->error_str, $connection_timeout); + } else { + $this->fp = @fsockopen( $host, $this->port, $this->errno, $this->error_str); + } + + // test pointer + if(!$this->fp) { + $msg = 'Couldn\'t open socket connection to server ' . $this->url; + if ($this->errno) { + $msg .= ', Error ('.$this->errno.'): '.$this->error_str; + } else { + $msg .= ' prior to connect(). This is often a problem looking up the host name.'; + } + $this->debug($msg); + $this->setError($msg); + return false; + } + + // set response timeout + $this->debug('set response timeout to ' . $response_timeout); + socket_set_timeout( $this->fp, $response_timeout); + + $this->debug('socket connected'); + return true; + } else if ($this->scheme == 'https') { + if (!extension_loaded('curl')) { + $this->setError('CURL Extension, or OpenSSL extension w/ PHP version >= 4.3 is required for HTTPS'); + return false; + } + $this->debug('connect using https'); + // init CURL + $this->ch = curl_init(); + // set url + $hostURL = ($this->port != '') ? "https://$this->host:$this->port" : "https://$this->host"; + // add path + $hostURL .= $this->path; + curl_setopt($this->ch, CURLOPT_URL, $hostURL); + // follow location headers (re-directs) + curl_setopt($this->ch, CURLOPT_FOLLOWLOCATION, 1); + // ask for headers in the response output + curl_setopt($this->ch, CURLOPT_HEADER, 1); + // ask for the response output as the return value + curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, 1); + // encode + // We manage this ourselves through headers and encoding +// if(function_exists('gzuncompress')){ +// curl_setopt($this->ch, CURLOPT_ENCODING, 'deflate'); +// } + // persistent connection + if ($this->persistentConnection) { + // The way we send data, we cannot use persistent connections, since + // there will be some "junk" at the end of our request. + //curl_setopt($this->ch, CURL_HTTP_VERSION_1_1, true); + $this->persistentConnection = false; + $this->outgoing_headers['Connection'] = 'close'; + $this->debug('set Connection: ' . $this->outgoing_headers['Connection']); + } + // set timeout + if ($connection_timeout != 0) { + curl_setopt($this->ch, CURLOPT_TIMEOUT, $connection_timeout); + } + // TODO: cURL has added a connection timeout separate from the response timeout + //if ($connection_timeout != 0) { + // curl_setopt($this->ch, CURLOPT_CONNECTIONTIMEOUT, $connection_timeout); + //} + //if ($response_timeout != 0) { + // curl_setopt($this->ch, CURLOPT_TIMEOUT, $response_timeout); + //} + + // recent versions of cURL turn on peer/host checking by default, + // while PHP binaries are not compiled with a default location for the + // CA cert bundle, so disable peer/host checking. +//curl_setopt($this->ch, CURLOPT_CAINFO, 'f:\php-4.3.2-win32\extensions\curl-ca-bundle.crt'); + curl_setopt($this->ch, CURLOPT_SSL_VERIFYPEER, 0); + curl_setopt($this->ch, CURLOPT_SSL_VERIFYHOST, 0); + + // support client certificates (thanks Tobias Boes, Doug Anarino, Eryan Ariobowo) + if ($this->authtype == 'certificate') { + if (isset($this->certRequest['cainfofile'])) { + curl_setopt($this->ch, CURLOPT_CAINFO, $this->certRequest['cainfofile']); + } + if (isset($this->certRequest['verifypeer'])) { + curl_setopt($this->ch, CURLOPT_SSL_VERIFYPEER, $this->certRequest['verifypeer']); + } else { + curl_setopt($this->ch, CURLOPT_SSL_VERIFYPEER, 1); + } + if (isset($this->certRequest['verifyhost'])) { + curl_setopt($this->ch, CURLOPT_SSL_VERIFYHOST, $this->certRequest['verifyhost']); + } else { + curl_setopt($this->ch, CURLOPT_SSL_VERIFYHOST, 1); + } + if (isset($this->certRequest['sslcertfile'])) { + curl_setopt($this->ch, CURLOPT_SSLCERT, $this->certRequest['sslcertfile']); + } + if (isset($this->certRequest['sslkeyfile'])) { + curl_setopt($this->ch, CURLOPT_SSLKEY, $this->certRequest['sslkeyfile']); + } + if (isset($this->certRequest['passphrase'])) { + curl_setopt($this->ch, CURLOPT_SSLKEYPASSWD , $this->certRequest['passphrase']); + } + } + $this->debug('cURL connection set up'); + return true; + } else { + $this->setError('Unknown scheme ' . $this->scheme); + $this->debug('Unknown scheme ' . $this->scheme); + return false; + } + } + + /** + * send the SOAP message via HTTP + * + * @param string $data message data + * @param integer $timeout set connection timeout in seconds + * @param integer $response_timeout set response timeout in seconds + * @param array $cookies cookies to send + * @return string data + * @access public + */ + function send($data, $timeout=0, $response_timeout=30, $cookies=NULL) { + + $this->debug('entered send() with data of length: '.strlen($data)); + + $this->tryagain = true; + $tries = 0; + while ($this->tryagain) { + $this->tryagain = false; + if ($tries++ < 2) { + // make connnection + if (!$this->connect($timeout, $response_timeout)){ + return false; + } + + // send request + if (!$this->sendRequest($data, $cookies)){ + return false; + } + + // get response + $respdata = $this->getResponse(); + } else { + $this->setError('Too many tries to get an OK response'); + } + } + $this->debug('end of send()'); + return $respdata; + } + + + /** + * send the SOAP message via HTTPS 1.0 using CURL + * + * @param string $msg message data + * @param integer $timeout set connection timeout in seconds + * @param integer $response_timeout set response timeout in seconds + * @param array $cookies cookies to send + * @return string data + * @access public + */ + function sendHTTPS($data, $timeout=0, $response_timeout=30, $cookies) { + return $this->send($data, $timeout, $response_timeout, $cookies); + } + + /** + * if authenticating, set user credentials here + * + * @param string $username + * @param string $password + * @param string $authtype (basic, digest, certificate) + * @param array $digestRequest (keys must be nonce, nc, realm, qop) + * @param array $certRequest (keys must be cainfofile (optional), sslcertfile, sslkeyfile, passphrase, verifypeer (optional), verifyhost (optional): see corresponding options in cURL docs) + * @access public + */ + function setCredentials($username, $password, $authtype = 'basic', $digestRequest = array(), $certRequest = array()) { + $this->debug("Set credentials for authtype $authtype"); + // cf. RFC 2617 + if ($authtype == 'basic') { + $this->outgoing_headers['Authorization'] = 'Basic '.base64_encode(str_replace(':','',$username).':'.$password); + } elseif ($authtype == 'digest') { + if (isset($digestRequest['nonce'])) { + $digestRequest['nc'] = isset($digestRequest['nc']) ? $digestRequest['nc']++ : 1; + + // calculate the Digest hashes (calculate code based on digest implementation found at: http://www.rassoc.com/gregr/weblog/stories/2002/07/09/webServicesSecurityHttpDigestAuthenticationWithoutActiveDirectory.html) + + // A1 = unq(username-value) ":" unq(realm-value) ":" passwd + $A1 = $username. ':' . (isset($digestRequest['realm']) ? $digestRequest['realm'] : '') . ':' . $password; + + // H(A1) = MD5(A1) + $HA1 = $this->encryptOld($A1); + + // A2 = Method ":" digest-uri-value + $A2 = 'POST:' . $this->digest_uri; + + // H(A2) + $HA2 = $this->encryptOld($A2); + + // KD(secret, data) = H(concat(secret, ":", data)) + // if qop == auth: + // request-digest = <"> < KD ( H(A1), unq(nonce-value) + // ":" nc-value + // ":" unq(cnonce-value) + // ":" unq(qop-value) + // ":" H(A2) + // ) <"> + // if qop is missing, + // request-digest = <"> < KD ( H(A1), unq(nonce-value) ":" H(A2) ) > <"> + + $unhashedDigest = ''; + $nonce = isset($digestRequest['nonce']) ? $digestRequest['nonce'] : ''; + $cnonce = $nonce; + if ($digestRequest['qop'] != '') { + $unhashedDigest = $HA1 . ':' . $nonce . ':' . sprintf("%08d", $digestRequest['nc']) . ':' . $cnonce . ':' . $digestRequest['qop'] . ':' . $HA2; + } else { + $unhashedDigest = $HA1 . ':' . $nonce . ':' . $HA2; + } + + $hashedDigest = $this->encryptOld($unhashedDigest); + + $this->outgoing_headers['Authorization'] = 'Digest username="' . $username . '", realm="' . $digestRequest['realm'] . '", nonce="' . $nonce . '", uri="' . $this->digest_uri . '", cnonce="' . $cnonce . '", nc=' . sprintf("%08x", $digestRequest['nc']) . ', qop="' . $digestRequest['qop'] . '", response="' . $hashedDigest . '"'; + } + } elseif ($authtype == 'certificate') { + $this->certRequest = $certRequest; + } + $this->username = $username; + $this->password = $password; + $this->authtype = $authtype; + $this->digestRequest = $digestRequest; + + if (isset($this->outgoing_headers['Authorization'])) { + $this->debug('set Authorization: ' . substr($this->outgoing_headers['Authorization'], 0, 12) . '...'); + } else { + $this->debug('Authorization header not set'); + } + } + + /** + * set the soapaction value + * + * @param string $soapaction + * @access public + */ + function setSOAPAction($soapaction) { + $this->outgoing_headers['SOAPAction'] = '"' . $soapaction . '"'; + $this->debug('set SOAPAction: ' . $this->outgoing_headers['SOAPAction']); + } + + /** + * use http encoding + * + * @param string $enc encoding style. supported values: gzip, deflate, or both + * @access public + */ + function setEncoding($enc='gzip, deflate') { + if (function_exists('gzdeflate')) { + $this->protocol_version = '1.1'; + $this->outgoing_headers['Accept-Encoding'] = $enc; + $this->debug('set Accept-Encoding: ' . $this->outgoing_headers['Accept-Encoding']); + if (!isset($this->outgoing_headers['Connection'])) { + $this->outgoing_headers['Connection'] = 'close'; + $this->persistentConnection = false; + $this->debug('set Connection: ' . $this->outgoing_headers['Connection']); + } + set_magic_quotes_runtime(0); + // deprecated + $this->encoding = $enc; + } + } + + /** + * set proxy info here + * + * @param string $proxyhost + * @param string $proxyport + * @param string $proxyusername + * @param string $proxypassword + * @access public + */ + function setProxy($proxyhost, $proxyport, $proxyusername = '', $proxypassword = '') { + $this->uri = $this->url; + $this->host = $proxyhost; + $this->port = $proxyport; + if ($proxyusername != '' && $proxypassword != '') { + $this->outgoing_headers['Proxy-Authorization'] = ' Basic '.base64_encode($proxyusername.':'.$proxypassword); + $this->debug('set Proxy-Authorization: ' . $this->outgoing_headers['Proxy-Authorization']); + } + } + + /** + * decode a string that is encoded w/ "chunked' transfer encoding + * as defined in RFC2068 19.4.6 + * + * @param string $buffer + * @param string $lb + * @returns string + * @access public + * @deprecated + */ + function decodeChunked($buffer, $lb){ + // length := 0 + $length = 0; + $new = ''; + + // read chunk-size, chunk-extension (if any) and CRLF + // get the position of the linebreak + $chunkend = strpos($buffer, $lb); + if ($chunkend == FALSE) { + $this->debug('no linebreak found in decodeChunked'); + return $new; + } + $temp = substr($buffer,0,$chunkend); + $chunk_size = hexdec( trim($temp) ); + $chunkstart = $chunkend + strlen($lb); + // while (chunk-size > 0) { + while ($chunk_size > 0) { + $this->debug("chunkstart: $chunkstart chunk_size: $chunk_size"); + $chunkend = strpos( $buffer, $lb, $chunkstart + $chunk_size); + + // Just in case we got a broken connection + if ($chunkend == FALSE) { + $chunk = substr($buffer,$chunkstart); + // append chunk-data to entity-body + $new .= $chunk; + $length += strlen($chunk); + break; + } + + // read chunk-data and CRLF + $chunk = substr($buffer,$chunkstart,$chunkend-$chunkstart); + // append chunk-data to entity-body + $new .= $chunk; + // length := length + chunk-size + $length += strlen($chunk); + // read chunk-size and CRLF + $chunkstart = $chunkend + strlen($lb); + + $chunkend = strpos($buffer, $lb, $chunkstart) + strlen($lb); + if ($chunkend == FALSE) { + break; //Just in case we got a broken connection + } + $temp = substr($buffer,$chunkstart,$chunkend-$chunkstart); + $chunk_size = hexdec( trim($temp) ); + $chunkstart = $chunkend; + } + return $new; + } + + /* + * Writes payload, including HTTP headers, to $this->outgoing_payload. + */ + function buildPayload($data, $cookie_str = '') { + // add content-length header + $this->outgoing_headers['Content-Length'] = strlen($data); + $this->debug('set Content-Length: ' . $this->outgoing_headers['Content-Length']); + + // start building outgoing payload: + $req = "$this->request_method $this->uri HTTP/$this->protocol_version"; + $this->debug("HTTP request: $req"); + $this->outgoing_payload = "$req\r\n"; + + // loop thru headers, serializing + foreach($this->outgoing_headers as $k => $v){ + $hdr = $k.': '.$v; + $this->debug("HTTP header: $hdr"); + $this->outgoing_payload .= "$hdr\r\n"; + } + + // add any cookies + if ($cookie_str != '') { + $hdr = 'Cookie: '.$cookie_str; + $this->debug("HTTP header: $hdr"); + $this->outgoing_payload .= "$hdr\r\n"; + } + + // header/body separator + $this->outgoing_payload .= "\r\n"; + + // add data + $this->outgoing_payload .= $data; + } + + function sendRequest($data, $cookies = NULL) { + // build cookie string + $cookie_str = $this->getCookiesForRequest($cookies, (($this->scheme == 'ssl') || ($this->scheme == 'https'))); + + // build payload + $this->buildPayload($data, $cookie_str); + + if ($this->scheme == 'http' || $this->scheme == 'ssl') { + // send payload + if(!fputs($this->fp, $this->outgoing_payload, strlen($this->outgoing_payload))) { + $this->setError('couldn\'t write message data to socket'); + $this->debug('couldn\'t write message data to socket'); + return false; + } + $this->debug('wrote data to socket, length = ' . strlen($this->outgoing_payload)); + return true; + } else if ($this->scheme == 'https') { + // set payload + // TODO: cURL does say this should only be the verb, and in fact it + // turns out that the URI and HTTP version are appended to this, which + // some servers refuse to work with + //curl_setopt($this->ch, CURLOPT_CUSTOMREQUEST, $this->outgoing_payload); + foreach($this->outgoing_headers as $k => $v){ + $curl_headers[] = "$k: $v"; + } + if ($cookie_str != '') { + $curl_headers[] = 'Cookie: ' . $cookie_str; + } + curl_setopt($this->ch, CURLOPT_HTTPHEADER, $curl_headers); + if ($this->request_method == "POST") { + curl_setopt($this->ch, CURLOPT_POST, 1); + curl_setopt($this->ch, CURLOPT_POSTFIELDS, $data); + } else { + } + $this->debug('set cURL payload'); + return true; + } + } + + function getResponse(){ + $this->incoming_payload = ''; + + if ($this->scheme == 'http' || $this->scheme == 'ssl') { + // loop until headers have been retrieved + $data = ''; + while (!isset($lb)){ + + // We might EOF during header read. + if(feof($this->fp)) { + $this->incoming_payload = $data; + $this->debug('found no headers before EOF after length ' . strlen($data)); + $this->debug("received before EOF:\n" . $data); + $this->setError('server failed to send headers'); + return false; + } + + $tmp = fgets($this->fp, 256); + $tmplen = strlen($tmp); + $this->debug("read line of $tmplen bytes: " . trim($tmp)); + + if ($tmplen == 0) { + $this->incoming_payload = $data; + $this->debug('socket read of headers timed out after length ' . strlen($data)); + $this->debug("read before timeout: " . $data); + $this->setError('socket read of headers timed out'); + return false; + } + + $data .= $tmp; + $pos = strpos($data,"\r\n\r\n"); + if($pos > 1){ + $lb = "\r\n"; + } else { + $pos = strpos($data,"\n\n"); + if($pos > 1){ + $lb = "\n"; + } + } + // remove 100 header + if(isset($lb) && ereg('^HTTP/1.1 100',$data)){ + unset($lb); + $data = ''; + }// + } + // store header data + $this->incoming_payload .= $data; + $this->debug('found end of headers after length ' . strlen($data)); + // process headers + $header_data = trim(substr($data,0,$pos)); + $header_array = explode($lb,$header_data); + $this->incoming_headers = array(); + $this->incoming_cookies = array(); + foreach($header_array as $header_line){ + $arr = explode(':',$header_line, 2); + if(count($arr) > 1){ + $header_name = strtolower(trim($arr[0])); + $this->incoming_headers[$header_name] = trim($arr[1]); + if ($header_name == 'set-cookie') { + // TODO: allow multiple cookies from parseCookie + $cookie = $this->parseCookie(trim($arr[1])); + if ($cookie) { + $this->incoming_cookies[] = $cookie; + $this->debug('found cookie: ' . $cookie['name'] . ' = ' . $cookie['value']); + } else { + $this->debug('did not find cookie in ' . trim($arr[1])); + } + } + } else if (isset($header_name)) { + // append continuation line to previous header + $this->incoming_headers[$header_name] .= $lb . ' ' . $header_line; + } + } + + // loop until msg has been received + if (isset($this->incoming_headers['transfer-encoding']) && strtolower($this->incoming_headers['transfer-encoding']) == 'chunked') { + $content_length = 2147483647; // ignore any content-length header + $chunked = true; + $this->debug("want to read chunked content"); + } elseif (isset($this->incoming_headers['content-length'])) { + $content_length = $this->incoming_headers['content-length']; + $chunked = false; + $this->debug("want to read content of length $content_length"); + } else { + $content_length = 2147483647; + $chunked = false; + $this->debug("want to read content to EOF"); + } + $data = ''; + do { + if ($chunked) { + $tmp = fgets($this->fp, 256); + $tmplen = strlen($tmp); + $this->debug("read chunk line of $tmplen bytes"); + if ($tmplen == 0) { + $this->incoming_payload = $data; + $this->debug('socket read of chunk length timed out after length ' . strlen($data)); + $this->debug("read before timeout:\n" . $data); + $this->setError('socket read of chunk length timed out'); + return false; + } + $content_length = hexdec(trim($tmp)); + $this->debug("chunk length $content_length"); + } + $strlen = 0; + while (($strlen < $content_length) && (!feof($this->fp))) { + $readlen = min(8192, $content_length - $strlen); + $tmp = fread($this->fp, $readlen); + $tmplen = strlen($tmp); + $this->debug("read buffer of $tmplen bytes"); + if (($tmplen == 0) && (!feof($this->fp))) { + $this->incoming_payload = $data; + $this->debug('socket read of body timed out after length ' . strlen($data)); + $this->debug("read before timeout:\n" . $data); + $this->setError('socket read of body timed out'); + return false; + } + $strlen += $tmplen; + $data .= $tmp; + } + if ($chunked && ($content_length > 0)) { + $tmp = fgets($this->fp, 256); + $tmplen = strlen($tmp); + $this->debug("read chunk terminator of $tmplen bytes"); + if ($tmplen == 0) { + $this->incoming_payload = $data; + $this->debug('socket read of chunk terminator timed out after length ' . strlen($data)); + $this->debug("read before timeout:\n" . $data); + $this->setError('socket read of chunk terminator timed out'); + return false; + } + } + } while ($chunked && ($content_length > 0) && (!feof($this->fp))); + if (feof($this->fp)) { + $this->debug('read to EOF'); + } + $this->debug('read body of length ' . strlen($data)); + $this->incoming_payload .= $data; + $this->debug('received a total of '.strlen($this->incoming_payload).' bytes of data from server'); + + // close filepointer + if( + (isset($this->incoming_headers['connection']) && strtolower($this->incoming_headers['connection']) == 'close') || + (! $this->persistentConnection) || feof($this->fp)){ + fclose($this->fp); + $this->fp = false; + $this->debug('closed socket'); + } + + // connection was closed unexpectedly + if($this->incoming_payload == ''){ + $this->setError('no response from server'); + return false; + } + + // decode transfer-encoding +// if(isset($this->incoming_headers['transfer-encoding']) && strtolower($this->incoming_headers['transfer-encoding']) == 'chunked'){ +// if(!$data = $this->decodeChunked($data, $lb)){ +// $this->setError('Decoding of chunked data failed'); +// return false; +// } + //print "
    \nde-chunked:\n---------------\n$data\n\n---------------\n
    "; + // set decoded payload +// $this->incoming_payload = $header_data.$lb.$lb.$data; +// } + + } else if ($this->scheme == 'https') { + // send and receive + $this->debug('send and receive with cURL'); + $this->incoming_payload = curl_exec($this->ch); + $data = $this->incoming_payload; + + $cErr = curl_error($this->ch); + if ($cErr != '') { + $err = 'cURL ERROR: '.curl_errno($this->ch).': '.$cErr.'
    '; + // TODO: there is a PHP bug that can cause this to SEGV for CURLINFO_CONTENT_TYPE + foreach(curl_getinfo($this->ch) as $k => $v){ + $err .= "$k: $v
    "; + } + $this->debug($err); + $this->setError($err); + curl_close($this->ch); + return false; + } else { + //echo '
    ';
    +			//var_dump(curl_getinfo($this->ch));
    +			//echo '
    '; + } + // close curl + $this->debug('No cURL error, closing cURL'); + curl_close($this->ch); + + // remove 100 header(s) + while (ereg('^HTTP/1.1 100',$data)) { + if ($pos = strpos($data,"\r\n\r\n")) { + $data = ltrim(substr($data,$pos)); + } elseif($pos = strpos($data,"\n\n") ) { + $data = ltrim(substr($data,$pos)); + } + } + + // separate content from HTTP headers + if ($pos = strpos($data,"\r\n\r\n")) { + $lb = "\r\n"; + } elseif( $pos = strpos($data,"\n\n")) { + $lb = "\n"; + } else { + $this->debug('no proper separation of headers and document'); + $this->setError('no proper separation of headers and document'); + return false; + } + $header_data = trim(substr($data,0,$pos)); + $header_array = explode($lb,$header_data); + $data = ltrim(substr($data,$pos)); + $this->debug('found proper separation of headers and document'); + $this->debug('cleaned data, stringlen: '.strlen($data)); + // clean headers + foreach ($header_array as $header_line) { + $arr = explode(':',$header_line,2); + if(count($arr) > 1){ + $header_name = strtolower(trim($arr[0])); + $this->incoming_headers[$header_name] = trim($arr[1]); + if ($header_name == 'set-cookie') { + // TODO: allow multiple cookies from parseCookie + $cookie = $this->parseCookie(trim($arr[1])); + if ($cookie) { + $this->incoming_cookies[] = $cookie; + $this->debug('found cookie: ' . $cookie['name'] . ' = ' . $cookie['value']); + } else { + $this->debug('did not find cookie in ' . trim($arr[1])); + } + } + } else if (isset($header_name)) { + // append continuation line to previous header + $this->incoming_headers[$header_name] .= $lb . ' ' . $header_line; + } + } + } + + $arr = explode(' ', $header_array[0], 3); + $http_version = $arr[0]; + $http_status = intval($arr[1]); + $http_reason = count($arr) > 2 ? $arr[2] : ''; + + // see if we need to resend the request with http digest authentication + if (isset($this->incoming_headers['location']) && $http_status == 301) { + $this->debug("Got 301 $http_reason with Location: " . $this->incoming_headers['location']); + $this->setURL($this->incoming_headers['location']); + $this->tryagain = true; + return false; + } + + // see if we need to resend the request with http digest authentication + if (isset($this->incoming_headers['www-authenticate']) && $http_status == 401) { + $this->debug("Got 401 $http_reason with WWW-Authenticate: " . $this->incoming_headers['www-authenticate']); + if (strstr($this->incoming_headers['www-authenticate'], "Digest ")) { + $this->debug('Server wants digest authentication'); + // remove "Digest " from our elements + $digestString = str_replace('Digest ', '', $this->incoming_headers['www-authenticate']); + + // parse elements into array + $digestElements = explode(',', $digestString); + foreach ($digestElements as $val) { + $tempElement = explode('=', trim($val), 2); + $digestRequest[$tempElement[0]] = str_replace("\"", '', $tempElement[1]); + } + + // should have (at least) qop, realm, nonce + if (isset($digestRequest['nonce'])) { + $this->setCredentials($this->username, $this->password, 'digest', $digestRequest); + $this->tryagain = true; + return false; + } + } + $this->debug('HTTP authentication failed'); + $this->setError('HTTP authentication failed'); + return false; + } + + if ( + ($http_status >= 300 && $http_status <= 307) || + ($http_status >= 400 && $http_status <= 417) || + ($http_status >= 501 && $http_status <= 505) + ) { + $this->setError("Unsupported HTTP response status $http_status $http_reason (soapclient->response has contents of the response)"); + return false; + } + + // decode content-encoding + if(isset($this->incoming_headers['content-encoding']) && $this->incoming_headers['content-encoding'] != ''){ + if(strtolower($this->incoming_headers['content-encoding']) == 'deflate' || strtolower($this->incoming_headers['content-encoding']) == 'gzip'){ + // if decoding works, use it. else assume data wasn't gzencoded + if(function_exists('gzinflate')){ + //$timer->setMarker('starting decoding of gzip/deflated content'); + // IIS 5 requires gzinflate instead of gzuncompress (similar to IE 5 and gzdeflate v. gzcompress) + // this means there are no Zlib headers, although there should be + $this->debug('The gzinflate function exists'); + $datalen = strlen($data); + if ($this->incoming_headers['content-encoding'] == 'deflate') { + if ($degzdata = @gzinflate($data)) { + $data = $degzdata; + $this->debug('The payload has been inflated to ' . strlen($data) . ' bytes'); + if (strlen($data) < $datalen) { + // test for the case that the payload has been compressed twice + $this->debug('The inflated payload is smaller than the gzipped one; try again'); + if ($degzdata = @gzinflate($data)) { + $data = $degzdata; + $this->debug('The payload has been inflated again to ' . strlen($data) . ' bytes'); + } + } + } else { + $this->debug('Error using gzinflate to inflate the payload'); + $this->setError('Error using gzinflate to inflate the payload'); + } + } elseif ($this->incoming_headers['content-encoding'] == 'gzip') { + if ($degzdata = @gzinflate(substr($data, 10))) { // do our best + $data = $degzdata; + $this->debug('The payload has been un-gzipped to ' . strlen($data) . ' bytes'); + if (strlen($data) < $datalen) { + // test for the case that the payload has been compressed twice + $this->debug('The un-gzipped payload is smaller than the gzipped one; try again'); + if ($degzdata = @gzinflate(substr($data, 10))) { + $data = $degzdata; + $this->debug('The payload has been un-gzipped again to ' . strlen($data) . ' bytes'); + } + } + } else { + $this->debug('Error using gzinflate to un-gzip the payload'); + $this->setError('Error using gzinflate to un-gzip the payload'); + } + } + //$timer->setMarker('finished decoding of gzip/deflated content'); + //print "\nde-inflated:\n---------------\n$data\n-------------\n"; + // set decoded payload + $this->incoming_payload = $header_data.$lb.$lb.$data; + } else { + $this->debug('The server sent compressed data. Your php install must have the Zlib extension compiled in to support this.'); + $this->setError('The server sent compressed data. Your php install must have the Zlib extension compiled in to support this.'); + } + } else { + $this->debug('Unsupported Content-Encoding ' . $this->incoming_headers['content-encoding']); + $this->setError('Unsupported Content-Encoding ' . $this->incoming_headers['content-encoding']); + } + } else { + $this->debug('No Content-Encoding header'); + } + + if(strlen($data) == 0){ + $this->debug('no data after headers!'); + $this->setError('no data present after HTTP headers'); + return false; + } + + return $data; + } + + function setContentType($type, $charset = false) { + $this->outgoing_headers['Content-Type'] = $type . ($charset ? '; charset=' . $charset : ''); + $this->debug('set Content-Type: ' . $this->outgoing_headers['Content-Type']); + } + + function usePersistentConnection(){ + if (isset($this->outgoing_headers['Accept-Encoding'])) { + return false; + } + $this->protocol_version = '1.1'; + $this->persistentConnection = true; + $this->outgoing_headers['Connection'] = 'Keep-Alive'; + $this->debug('set Connection: ' . $this->outgoing_headers['Connection']); + return true; + } + + /** + * parse an incoming Cookie into it's parts + * + * @param string $cookie_str content of cookie + * @return array with data of that cookie + * @access private + */ + /* + * TODO: allow a Set-Cookie string to be parsed into multiple cookies + */ + function parseCookie($cookie_str) { + $cookie_str = str_replace('; ', ';', $cookie_str) . ';'; + $data = explode(';', $cookie_str); + $value_str = $data[0]; + + $cookie_param = 'domain='; + $start = strpos($cookie_str, $cookie_param); + if ($start > 0) { + $domain = substr($cookie_str, $start + strlen($cookie_param)); + $domain = substr($domain, 0, strpos($domain, ';')); + } else { + $domain = ''; + } + + $cookie_param = 'expires='; + $start = strpos($cookie_str, $cookie_param); + if ($start > 0) { + $expires = substr($cookie_str, $start + strlen($cookie_param)); + $expires = substr($expires, 0, strpos($expires, ';')); + } else { + $expires = ''; + } + + $cookie_param = 'path='; + $start = strpos($cookie_str, $cookie_param); + if ( $start > 0 ) { + $path = substr($cookie_str, $start + strlen($cookie_param)); + $path = substr($path, 0, strpos($path, ';')); + } else { + $path = '/'; + } + + $cookie_param = ';secure;'; + if (strpos($cookie_str, $cookie_param) !== FALSE) { + $secure = true; + } else { + $secure = false; + } + + $sep_pos = strpos($value_str, '='); + + if ($sep_pos) { + $name = substr($value_str, 0, $sep_pos); + $value = substr($value_str, $sep_pos + 1); + $cookie= array( 'name' => $name, + 'value' => $value, + 'domain' => $domain, + 'path' => $path, + 'expires' => $expires, + 'secure' => $secure + ); + return $cookie; + } + return false; + } + + /** + * sort out cookies for the current request + * + * @param array $cookies array with all cookies + * @param boolean $secure is the send-content secure or not? + * @return string for Cookie-HTTP-Header + * @access private + */ + function getCookiesForRequest($cookies, $secure=false) { + $cookie_str = ''; + if ((! is_null($cookies)) && (is_array($cookies))) { + foreach ($cookies as $cookie) { + if (! is_array($cookie)) { + continue; + } + $this->debug("check cookie for validity: ".$cookie['name'].'='.$cookie['value']); + if ((isset($cookie['expires'])) && (! empty($cookie['expires']))) { + if (strtotime($cookie['expires']) <= time()) { + $this->debug('cookie has expired'); + continue; + } + } + if ((isset($cookie['domain'])) && (! empty($cookie['domain']))) { + $domain = preg_quote($cookie['domain']); + if (! preg_match("'.*$domain$'i", $this->host)) { + $this->debug('cookie has different domain'); + continue; + } + } + if ((isset($cookie['path'])) && (! empty($cookie['path']))) { + $path = preg_quote($cookie['path']); + if (! preg_match("'^$path.*'i", $this->path)) { + $this->debug('cookie is for a different path'); + continue; + } + } + if ((! $secure) && (isset($cookie['secure'])) && ($cookie['secure'])) { + $this->debug('cookie is secure, transport is not'); + continue; + } + $cookie_str .= $cookie['name'] . '=' . $cookie['value'] . '; '; + $this->debug('add cookie to Cookie-String: ' . $cookie['name'] . '=' . $cookie['value']); + } + } + return $cookie_str; + } + + public function encryptOld($string) + { + if (!class_exists('G')) { + $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); + $docuroot = explode( '/', $realdocuroot ); + array_pop( $docuroot ); + $pathhome = implode( '/', $docuroot ) . '/'; + array_pop( $docuroot ); + $pathTrunk = implode( '/', $docuroot ) . '/'; + require_once($pathTrunk.'gulliver/system/class.g.php'); + } + return G::encryptOld($string); + } +} + +?> +* @version $Id: nusoap.php,v 1.94 2005/08/04 01:27:42 snichol Exp $ +* @access public +*/ +class soap_server_colosa extends nusoap_base_colosa { + /** + * HTTP headers of request + * @var array + * @access private + */ + var $headers = array(); + /** + * HTTP request + * @var string + * @access private + */ + var $request = ''; + /** + * SOAP headers from request (incomplete namespace resolution; special characters not escaped) (text) + * @var string + * @access public + */ + var $requestHeaders = ''; + /** + * SOAP body request portion (incomplete namespace resolution; special characters not escaped) (text) + * @var string + * @access public + */ + var $document = ''; + /** + * SOAP payload for request (text) + * @var string + * @access public + */ + var $requestSOAP = ''; + /** + * requested method namespace URI + * @var string + * @access private + */ + var $methodURI = ''; + /** + * name of method requested + * @var string + * @access private + */ + var $methodname = ''; + /** + * method parameters from request + * @var array + * @access private + */ + var $methodparams = array(); + /** + * SOAP Action from request + * @var string + * @access private + */ + var $SOAPAction = ''; + /** + * character set encoding of incoming (request) messages + * @var string + * @access public + */ + var $xml_encoding = ''; + /** + * toggles whether the parser decodes element content w/ utf8_decode() + * @var boolean + * @access public + */ + var $decode_utf8 = true; + + /** + * HTTP headers of response + * @var array + * @access public + */ + var $outgoing_headers = array(); + /** + * HTTP response + * @var string + * @access private + */ + var $response = ''; + /** + * SOAP headers for response (text) + * @var string + * @access public + */ + var $responseHeaders = ''; + /** + * SOAP payload for response (text) + * @var string + * @access private + */ + var $responseSOAP = ''; + /** + * method return value to place in response + * @var mixed + * @access private + */ + var $methodreturn = false; + /** + * whether $methodreturn is a string of literal XML + * @var boolean + * @access public + */ + var $methodreturnisliteralxml = false; + /** + * SOAP fault for response (or false) + * @var mixed + * @access private + */ + var $fault = false; + /** + * text indication of result (for debugging) + * @var string + * @access private + */ + var $result = 'successful'; + + /** + * assoc array of operations => opData; operations are added by the register() + * method or by parsing an external WSDL definition + * @var array + * @access private + */ + var $operations = array(); + /** + * wsdl instance (if one) + * @var mixed + * @access private + */ + var $wsdl = false; + /** + * URL for WSDL (if one) + * @var mixed + * @access private + */ + var $externalWSDLURL = false; + /** + * whether to append debug to response as XML comment + * @var boolean + * @access public + */ + var $debug_flag = false; + + + /** + * constructor + * the optional parameter is a path to a WSDL file that you'd like to bind the server instance to. + * + * @param mixed $wsdl file path or URL (string), or wsdl instance (object) + * @access public + */ + function soap_server_colosa($wsdl=false){ + parent::nusoap_base_colosa(); + // turn on debugging? + global $debug; + global $HTTP_SERVER_VARS; + + if (isset($_SERVER)) { + $this->debug("_SERVER is defined:"); + $this->appendDebug($this->varDump($_SERVER)); + } elseif (isset($HTTP_SERVER_VARS)) { + $this->debug("HTTP_SERVER_VARS is defined:"); + $this->appendDebug($this->varDump($HTTP_SERVER_VARS)); + } else { + $this->debug("Neither _SERVER nor HTTP_SERVER_VARS is defined."); + } + + if (isset($debug)) { + $this->debug("In soap_server, set debug_flag=$debug based on global flag"); + $this->debug_flag = $debug; + } elseif (isset($_SERVER['QUERY_STRING'])) { + $qs = explode('&', $_SERVER['QUERY_STRING']); + foreach ($qs as $v) { + if (substr($v, 0, 6) == 'debug=') { + $this->debug("In soap_server, set debug_flag=" . substr($v, 6) . " based on query string #1"); + $this->debug_flag = substr($v, 6); + } + } + } elseif (isset($HTTP_SERVER_VARS['QUERY_STRING'])) { + $qs = explode('&', $HTTP_SERVER_VARS['QUERY_STRING']); + foreach ($qs as $v) { + if (substr($v, 0, 6) == 'debug=') { + $this->debug("In soap_server, set debug_flag=" . substr($v, 6) . " based on query string #2"); + $this->debug_flag = substr($v, 6); + } + } + } + + // wsdl + if($wsdl){ + $this->debug("In soap_server, WSDL is specified"); + if (is_object($wsdl) && (get_class($wsdl) == 'wsdl')) { + $this->wsdl = $wsdl; + $this->externalWSDLURL = $this->wsdl->wsdl; + $this->debug('Use existing wsdl instance from ' . $this->externalWSDLURL); + } else { + $this->debug('Create wsdl from ' . $wsdl); + $this->wsdl = new wsdl($wsdl); + $this->externalWSDLURL = $wsdl; + } + $this->appendDebug($this->wsdl->getDebug()); + $this->wsdl->clearDebug(); + if($err = $this->wsdl->getError()){ + + if (!class_exists('G')) { + $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); + $docuroot = explode( '/', $realdocuroot ); + array_pop( $docuroot ); + $pathhome = implode( '/', $docuroot ) . '/'; + array_pop( $docuroot ); + $pathTrunk = implode( '/', $docuroot ) . '/'; + require_once($pathTrunk.'gulliver/system/class.g.php'); + } + G::LoadSystem('inputfilter'); + $filter = new InputFilter(); + $err = $filter->xssFilterHard($err); + + die('WSDL ERROR: '.$err); + } + } + } + + /** + * processes request and returns response + * + * @param string $data usually is the value of $HTTP_RAW_POST_DATA + * @access public + */ + function service($data){ + global $HTTP_SERVER_VARS; + + if (isset($_SERVER['QUERY_STRING'])) { + $qs = $_SERVER['QUERY_STRING']; + } elseif (isset($HTTP_SERVER_VARS['QUERY_STRING'])) { + $qs = $HTTP_SERVER_VARS['QUERY_STRING']; + } else { + $qs = ''; + } + $this->debug("In service, query string=$qs"); + + if (ereg('wsdl', $qs) ){ + $this->debug("In service, this is a request for WSDL"); + if($this->externalWSDLURL){ + if (strpos($this->externalWSDLURL,"://")!==false) { // assume URL + header('Location: '.$this->externalWSDLURL); + } else { // assume file + header("Content-Type: text/xml\r\n"); + $fp = fopen($this->externalWSDLURL, 'r'); + fpassthru($fp); + } + } elseif ($this->wsdl) { + header("Content-Type: text/xml; charset=ISO-8859-1\r\n"); + print $this->wsdl->serialize($this->debug_flag); + if ($this->debug_flag) { + $this->debug('wsdl:'); + $this->appendDebug($this->varDump($this->wsdl)); + print $this->getDebugAsXMLComment(); + } + } else { + header("Content-Type: text/html; charset=ISO-8859-1\r\n"); + print "This service does not provide WSDL"; + } + } elseif ($data == '' && $this->wsdl) { + $this->debug("In service, there is no data, so return Web description"); + + if (!class_exists('G')) { + $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); + $docuroot = explode( '/', $realdocuroot ); + array_pop( $docuroot ); + $pathhome = implode( '/', $docuroot ) . '/'; + array_pop( $docuroot ); + $pathTrunk = implode( '/', $docuroot ) . '/'; + require_once($pathTrunk.'gulliver/system/class.g.php'); + } + G::LoadSystem('inputfilter'); + $filter = new InputFilter(); + $webDescription = $filter->xssFilterHard($this->wsdl->webDescription()); + + print $webDescription; + } else { + $this->debug("In service, invoke the request"); + $this->parse_request($data); + if (! $this->fault) { + $this->invoke_method(); + } + if (! $this->fault) { + $this->serialize_return(); + } + $this->send_response(); + } + } + + /** + * parses HTTP request headers. + * + * The following fields are set by this function (when successful) + * + * headers + * request + * xml_encoding + * SOAPAction + * + * @access private + */ + function parse_http_headers() { + global $HTTP_SERVER_VARS; + + $this->request = ''; + $this->SOAPAction = ''; + if(function_exists('getallheaders')){ + $this->debug("In parse_http_headers, use getallheaders"); + $headers = getallheaders(); + foreach($headers as $k=>$v){ + $k = strtolower($k); + $this->headers[$k] = $v; + $this->request .= "$k: $v\r\n"; + $this->debug("$k: $v"); + } + // get SOAPAction header + if(isset($this->headers['soapaction'])){ + $this->SOAPAction = str_replace('"','',$this->headers['soapaction']); + } + // get the character encoding of the incoming request + if(isset($this->headers['content-type']) && strpos($this->headers['content-type'],'=')){ + $enc = str_replace('"','',substr(strstr($this->headers["content-type"],'='),1)); + if(preg_match('/(ISO-8859-1|US-ASCII|UTF-8)/',$enc)){ + $this->xml_encoding = strtoupper($enc); + } else { + $this->xml_encoding = 'US-ASCII'; + } + } else { + // should be US-ASCII for HTTP 1.0 or ISO-8859-1 for HTTP 1.1 + $this->xml_encoding = 'ISO-8859-1'; + } + } elseif(isset($_SERVER) && is_array($_SERVER)){ + $this->debug("In parse_http_headers, use _SERVER"); + foreach ($_SERVER as $k => $v) { + if (substr($k, 0, 5) == 'HTTP_') { + $k = str_replace(' ', '-', strtolower(str_replace('_', ' ', substr($k, 5)))); $k = strtolower(substr($k, 5)); + } else { + $k = str_replace(' ', '-', strtolower(str_replace('_', ' ', $k))); $k = strtolower($k); + } + if ($k == 'soapaction') { + // get SOAPAction header + $k = 'SOAPAction'; + $v = str_replace('"', '', $v); + $v = str_replace('\\', '', $v); + $this->SOAPAction = $v; + } else if ($k == 'content-type') { + // get the character encoding of the incoming request + if (strpos($v, '=')) { + $enc = substr(strstr($v, '='), 1); + $enc = str_replace('"', '', $enc); + $enc = str_replace('\\', '', $enc); + if (preg_match('/(ISO-8859-1|US-ASCII|UTF-8)/', $enc)) { + $this->xml_encoding = strtoupper($enc); + } else { + $this->xml_encoding = 'US-ASCII'; + } + } else { + // should be US-ASCII for HTTP 1.0 or ISO-8859-1 for HTTP 1.1 + $this->xml_encoding = 'ISO-8859-1'; + } + } + $this->headers[$k] = $v; + $this->request .= "$k: $v\r\n"; + $this->debug("$k: $v"); + } + } elseif (is_array($HTTP_SERVER_VARS)) { + $this->debug("In parse_http_headers, use HTTP_SERVER_VARS"); + foreach ($HTTP_SERVER_VARS as $k => $v) { + if (substr($k, 0, 5) == 'HTTP_') { + $k = str_replace(' ', '-', strtolower(str_replace('_', ' ', substr($k, 5)))); $k = strtolower(substr($k, 5)); + } else { + $k = str_replace(' ', '-', strtolower(str_replace('_', ' ', $k))); $k = strtolower($k); + } + if ($k == 'soapaction') { + // get SOAPAction header + $k = 'SOAPAction'; + $v = str_replace('"', '', $v); + $v = str_replace('\\', '', $v); + $this->SOAPAction = $v; + } else if ($k == 'content-type') { + // get the character encoding of the incoming request + if (strpos($v, '=')) { + $enc = substr(strstr($v, '='), 1); + $enc = str_replace('"', '', $enc); + $enc = str_replace('\\', '', $enc); + if (preg_match('/(ISO-8859-1|US-ASCII|UTF-8)/', $enc)) { + $this->xml_encoding = strtoupper($enc); + } else { + $this->xml_encoding = 'US-ASCII'; + } + } else { + // should be US-ASCII for HTTP 1.0 or ISO-8859-1 for HTTP 1.1 + $this->xml_encoding = 'ISO-8859-1'; + } + } + $this->headers[$k] = $v; + $this->request .= "$k: $v\r\n"; + $this->debug("$k: $v"); + } + } else { + $this->debug("In parse_http_headers, HTTP headers not accessible"); + $this->setError("HTTP headers not accessible"); + } + } + + /** + * parses a request + * + * The following fields are set by this function (when successful) + * + * headers + * request + * xml_encoding + * SOAPAction + * request + * requestSOAP + * methodURI + * methodname + * methodparams + * requestHeaders + * document + * + * This sets the fault field on error + * + * @param string $data XML string + * @access private + */ + function parse_request($data='') { + $this->debug('entering parse_request()'); + $this->parse_http_headers(); + $this->debug('got character encoding: '.$this->xml_encoding); + // uncompress if necessary + if (isset($this->headers['content-encoding']) && $this->headers['content-encoding'] != '') { + $this->debug('got content encoding: ' . $this->headers['content-encoding']); + if ($this->headers['content-encoding'] == 'deflate' || $this->headers['content-encoding'] == 'gzip') { + // if decoding works, use it. else assume data wasn't gzencoded + if (function_exists('gzuncompress')) { + if ($this->headers['content-encoding'] == 'deflate' && $degzdata = @gzuncompress($data)) { + $data = $degzdata; + } elseif ($this->headers['content-encoding'] == 'gzip' && $degzdata = gzinflate(substr($data, 10))) { + $data = $degzdata; + } else { + $this->fault('Client', 'Errors occurred when trying to decode the data'); + return; + } + } else { + $this->fault('Client', 'This Server does not support compressed data'); + return; + } + } + } + $this->request .= "\r\n".$data; + $data = $this->parseRequest($this->headers, $data); + $this->requestSOAP = $data; + $this->debug('leaving parse_request'); + } + + /** + * invokes a PHP function for the requested SOAP method + * + * The following fields are set by this function (when successful) + * + * methodreturn + * + * Note that the PHP function that is called may also set the following + * fields to affect the response sent to the client + * + * responseHeaders + * outgoing_headers + * + * This sets the fault field on error + * + * @access private + */ + function invoke_method() { + $this->debug('in invoke_method, methodname=' . $this->methodname . ' methodURI=' . $this->methodURI . ' SOAPAction=' . $this->SOAPAction); + + if ($this->wsdl) { + if ($this->opData = $this->wsdl->getOperationData($this->methodname)) { + $this->debug('in invoke_method, found WSDL operation=' . $this->methodname); + $this->appendDebug('opData=' . $this->varDump($this->opData)); + } elseif ($this->opData = $this->wsdl->getOperationDataForSoapAction($this->SOAPAction)) { + // Note: hopefully this case will only be used for doc/lit, since rpc services should have wrapper element + $this->debug('in invoke_method, found WSDL soapAction=' . $this->SOAPAction . ' for operation=' . $this->opData['name']); + $this->appendDebug('opData=' . $this->varDump($this->opData)); + $this->methodname = $this->opData['name']; + } else { + $this->debug('in invoke_method, no WSDL for operation=' . $this->methodname); + $this->fault('Client', "Operation '" . $this->methodname . "' is not defined in the WSDL for this service"); + return; + } + } else { + $this->debug('in invoke_method, no WSDL to validate method'); + } + + // if a . is present in $this->methodname, we see if there is a class in scope, + // which could be referred to. We will also distinguish between two deliminators, + // to allow methods to be called a the class or an instance + $class = ''; + $method = ''; + if (strpos($this->methodname, '..') > 0) { + $delim = '..'; + } else if (strpos($this->methodname, '.') > 0) { + $delim = '.'; + } else { + $delim = ''; + } + + if (strlen($delim) > 0 && substr_count($this->methodname, $delim) == 1 && + class_exists(substr($this->methodname, 0, strpos($this->methodname, $delim)))) { + // get the class and method name + $class = substr($this->methodname, 0, strpos($this->methodname, $delim)); + $method = substr($this->methodname, strpos($this->methodname, $delim) + strlen($delim)); + $this->debug("in invoke_method, class=$class method=$method delim=$delim"); + } + + // does method exist? + if ($class == '') { + if (!function_exists($this->methodname)) { + $this->debug("in invoke_method, function '$this->methodname' not found!"); + $this->result = 'fault: method not found'; + $this->fault('Client',"method '$this->methodname' not defined in service"); + return; + } + } else { + $method_to_compare = (substr(phpversion(), 0, 2) == '4.') ? strtolower($method) : $method; + if (!in_array($method_to_compare, get_class_methods($class))) { + $this->debug("in invoke_method, method '$this->methodname' not found in class '$class'!"); + $this->result = 'fault: method not found'; + $this->fault('Client',"method '$this->methodname' not defined in service"); + return; + } + } + + // evaluate message, getting back parameters + // verify that request parameters match the method's signature + if(! $this->verify_method($this->methodname,$this->methodparams)){ + // debug + $this->debug('ERROR: request not verified against method signature'); + $this->result = 'fault: request failed validation against method signature'; + // return fault + $this->fault('Client',"Operation '$this->methodname' not defined in service."); + return; + } + + // if there are parameters to pass + $this->debug('in invoke_method, params:'); + $this->appendDebug($this->varDump($this->methodparams)); + $this->debug("in invoke_method, calling '$this->methodname'"); + if (!function_exists('call_user_func_array')) { + if ($class == '') { + $this->debug('in invoke_method, calling function using eval()'); + $funcCall = "\$this->methodreturn = $this->methodname("; + } else { + if ($delim == '..') { + $this->debug('in invoke_method, calling class method using eval()'); + $funcCall = "\$this->methodreturn = ".$class."::".$method."("; + } else { + $this->debug('in invoke_method, calling instance method using eval()'); + // generate unique instance name + $instname = "\$inst_".time(); + $funcCall = $instname." = new ".$class."(); "; + $funcCall .= "\$this->methodreturn = ".$instname."->".$method."("; + } + } + if ($this->methodparams) { + foreach ($this->methodparams as $param) { + if (is_array($param)) { + $this->fault('Client', 'NuSOAP does not handle complexType parameters correctly when using eval; call_user_func_array must be available'); + return; + } + $funcCall .= "\"$param\","; + } + $funcCall = substr($funcCall, 0, -1); + } + $funcCall .= ');'; + $this->debug('in invoke_method, function call: '.$funcCall); + @eval($funcCall); + } else { + if ($class == '') { + $this->debug('in invoke_method, calling function using call_user_func_array()'); + $call_arg = "$this->methodname"; // straight assignment changes $this->methodname to lower case after call_user_func_array() + } elseif ($delim == '..') { + $this->debug('in invoke_method, calling class method using call_user_func_array()'); + $call_arg = array ($class, $method); + } else { + $this->debug('in invoke_method, calling instance method using call_user_func_array()'); + $instance = new $class (); + $call_arg = array(&$instance, $method); + } + $this->methodreturn = call_user_func_array($call_arg, $this->methodparams); + } + $this->debug('in invoke_method, methodreturn:'); + $this->appendDebug($this->varDump($this->methodreturn)); + $this->debug("in invoke_method, called method $this->methodname, received $this->methodreturn of type ".gettype($this->methodreturn)); + } + + /** + * serializes the return value from a PHP function into a full SOAP Envelope + * + * The following fields are set by this function (when successful) + * + * responseSOAP + * + * This sets the fault field on error + * + * @access private + */ + function serialize_return() { + $this->debug('Entering serialize_return methodname: ' . $this->methodname . ' methodURI: ' . $this->methodURI); + // if fault + if (isset($this->methodreturn) && (is_object($this->methodreturn) && get_class($this->methodreturn) == 'soap_fault_colosa')) { + $this->debug('got a fault object from method'); + $this->fault = $this->methodreturn; + return; + } elseif ($this->methodreturnisliteralxml) { + $return_val = $this->methodreturn; + // returned value(s) + } else { + $this->debug('got a(n) '.gettype($this->methodreturn).' from method'); + $this->debug('serializing return value'); + if($this->wsdl){ + // weak attempt at supporting multiple output params + if(sizeof($this->opData['output']['parts']) > 1){ + $opParams = $this->methodreturn; + } else { + // TODO: is this really necessary? + $opParams = array($this->methodreturn); + } + $return_val = $this->wsdl->serializeRPCParameters($this->methodname,'output',$opParams); + $this->appendDebug($this->wsdl->getDebug()); + $this->wsdl->clearDebug(); + if($errstr = $this->wsdl->getError()){ + $this->debug('got wsdl error: '.$errstr); + $this->fault('Server', 'unable to serialize result'); + return; + } + } else { + if (isset($this->methodreturn)) { + $return_val = $this->serialize_val($this->methodreturn, 'return'); + } else { + $return_val = ''; + $this->debug('in absence of WSDL, assume void return for backward compatibility'); + } + } + } + $this->debug('return value:'); + $this->appendDebug($this->varDump($return_val)); + + $this->debug('serializing response'); + if ($this->wsdl) { + $this->debug('have WSDL for serialization: style is ' . $this->opData['style']); + if ($this->opData['style'] == 'rpc') { + $this->debug('style is rpc for serialization: use is ' . $this->opData['output']['use']); + if ($this->opData['output']['use'] == 'literal') { + $payload = '<'.$this->methodname.'Response xmlns="'.$this->methodURI.'">'.$return_val.'methodname."Response>"; + } else { + $payload = 'methodname.'Response xmlns:ns1="'.$this->methodURI.'">'.$return_val.'methodname."Response>"; + } + } else { + $this->debug('style is not rpc for serialization: assume document'); + $payload = $return_val; + } + } else { + $this->debug('do not have WSDL for serialization: assume rpc/encoded'); + $payload = 'methodname.'Response xmlns:ns1="'.$this->methodURI.'">'.$return_val.'methodname."Response>"; + } + $this->result = 'successful'; + if($this->wsdl){ + //if($this->debug_flag){ + $this->appendDebug($this->wsdl->getDebug()); + // } + if (isset($opData['output']['encodingStyle'])) { + $encodingStyle = $opData['output']['encodingStyle']; + } else { + $encodingStyle = ''; + } + // Added: In case we use a WSDL, return a serialized env. WITH the usedNamespaces. + $this->responseSOAP = $this->serializeEnvelope($payload,$this->responseHeaders,$this->wsdl->usedNamespaces,$this->opData['style'],$encodingStyle); + } else { + $this->responseSOAP = $this->serializeEnvelope($payload,$this->responseHeaders); + } + $this->debug("Leaving serialize_return"); + } + + /** + * sends an HTTP response + * + * The following fields are set by this function (when successful) + * + * outgoing_headers + * response + * + * @access private + */ + function send_response() { + $this->debug('Enter send_response'); + if ($this->fault) { + $payload = $this->fault->serialize(); + $this->outgoing_headers[] = "HTTP/1.0 500 Internal Server Error"; + $this->outgoing_headers[] = "Status: 500 Internal Server Error"; + } else { + $payload = $this->responseSOAP; + // Some combinations of PHP+Web server allow the Status + // to come through as a header. Since OK is the default + // just do nothing. + // $this->outgoing_headers[] = "HTTP/1.0 200 OK"; + // $this->outgoing_headers[] = "Status: 200 OK"; + } + // add debug data if in debug mode + if(isset($this->debug_flag) && $this->debug_flag){ + $payload .= $this->getDebugAsXMLComment(); + } + $this->outgoing_headers[] = "Server: $this->title Server v$this->version"; + ereg('\$Revisio' . 'n: ([^ ]+)', $this->revision, $rev); + $this->outgoing_headers[] = "X-SOAP-Server: $this->title/$this->version (".$rev[1].")"; + // Let the Web server decide about this + //$this->outgoing_headers[] = "Connection: Close\r\n"; + $payload = $this->getHTTPBody($payload); + $type = $this->getHTTPContentType(); + $charset = $this->getHTTPContentTypeCharset(); + $this->outgoing_headers[] = "Content-Type: $type" . ($charset ? '; charset=' . $charset : ''); + //begin code to compress payload - by John + // NOTE: there is no way to know whether the Web server will also compress + // this data. + if (strlen($payload) > 1024 && isset($this->headers) && isset($this->headers['accept-encoding'])) { + if (strstr($this->headers['accept-encoding'], 'gzip')) { + if (function_exists('gzencode')) { + if (isset($this->debug_flag) && $this->debug_flag) { + $payload .= ""; + } + $this->outgoing_headers[] = "Content-Encoding: gzip"; + $payload = gzencode($payload); + } else { + if (isset($this->debug_flag) && $this->debug_flag) { + $payload .= ""; + } + } + } elseif (strstr($this->headers['accept-encoding'], 'deflate')) { + // Note: MSIE requires gzdeflate output (no Zlib header and checksum), + // instead of gzcompress output, + // which conflicts with HTTP 1.1 spec (http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.5) + if (function_exists('gzdeflate')) { + if (isset($this->debug_flag) && $this->debug_flag) { + $payload .= ""; + } + $this->outgoing_headers[] = "Content-Encoding: deflate"; + $payload = gzdeflate($payload); + } else { + if (isset($this->debug_flag) && $this->debug_flag) { + $payload .= ""; + } + } + } + } + //end code + $this->outgoing_headers[] = "Content-Length: ".strlen($payload); + reset($this->outgoing_headers); + foreach($this->outgoing_headers as $hdr){ + header($hdr, false); + } + print $payload; + $this->response = join("\r\n",$this->outgoing_headers)."\r\n\r\n".$payload; + } + + /** + * takes the value that was created by parsing the request + * and compares to the method's signature, if available. + * + * @param string $operation The operation to be invoked + * @param array $request The array of parameter values + * @return boolean Whether the operation was found + * @access private + */ + function verify_method($operation,$request){ + if(isset($this->wsdl) && is_object($this->wsdl)){ + if($this->wsdl->getOperationData($operation)){ + return true; + } + } elseif(isset($this->operations[$operation])){ + return true; + } + return false; + } + + /** + * processes SOAP message received from client + * + * @param array $headers The HTTP headers + * @param string $data unprocessed request data from client + * @return mixed value of the message, decoded into a PHP type + * @access private + */ + function parseRequest($headers, $data) { + $this->debug('Entering parseRequest() for data of length ' . strlen($data) . ' and type ' . $headers['content-type']); + if (!strstr($headers['content-type'], 'text/xml')) { + $this->setError('Request not of type text/xml'); + return false; + } + if (strpos($headers['content-type'], '=')) { + $enc = str_replace('"', '', substr(strstr($headers["content-type"], '='), 1)); + $this->debug('Got response encoding: ' . $enc); + if(preg_match('/(ISO-8859-1|US-ASCII|UTF-8)/',$enc)){ + $this->xml_encoding = strtoupper($enc); + } else { + $this->xml_encoding = 'US-ASCII'; + } + } else { + // should be US-ASCII for HTTP 1.0 or ISO-8859-1 for HTTP 1.1 + $this->xml_encoding = 'ISO-8859-1'; + } + $this->debug('Use encoding: ' . $this->xml_encoding . ' when creating soap_parser'); + // parse response, get soap parser obj + $parser = new soap_parser_colosa($data,$this->xml_encoding,'',$this->decode_utf8); + // parser debug + $this->debug("parser debug: \n".$parser->getDebug()); + // if fault occurred during message parsing + if($err = $parser->getError()){ + $this->result = 'fault: error in msg parsing: '.$err; + $this->fault('Client',"error in msg parsing:\n".$err); + // else successfully parsed request into soapval object + } else { + // get/set methodname + $this->methodURI = $parser->root_struct_namespace; + $this->methodname = $parser->root_struct_name; + $this->debug('methodname: '.$this->methodname.' methodURI: '.$this->methodURI); + $this->debug('calling parser->get_response()'); + $this->methodparams = $parser->get_response(); + // get SOAP headers + $this->requestHeaders = $parser->getHeaders(); + // add document for doclit support + $this->document = $parser->document; + } + } + + /** + * gets the HTTP body for the current response. + * + * @param string $soapmsg The SOAP payload + * @return string The HTTP body, which includes the SOAP payload + * @access private + */ + function getHTTPBody($soapmsg) { + return $soapmsg; + } + + /** + * gets the HTTP content type for the current response. + * + * Note: getHTTPBody must be called before this. + * + * @return string the HTTP content type for the current response. + * @access private + */ + function getHTTPContentType() { + return 'text/xml'; + } + + /** + * gets the HTTP content type charset for the current response. + * returns false for non-text content types. + * + * Note: getHTTPBody must be called before this. + * + * @return string the HTTP content type charset for the current response. + * @access private + */ + function getHTTPContentTypeCharset() { + return $this->soap_defencoding; + } + + /** + * add a method to the dispatch map (this has been replaced by the register method) + * + * @param string $methodname + * @param string $in array of input values + * @param string $out array of output values + * @access public + * @deprecated + */ + function add_to_map($methodname,$in,$out){ + $this->operations[$methodname] = array('name' => $methodname,'in' => $in,'out' => $out); + } + + /** + * register a service function with the server + * + * @param string $name the name of the PHP function, class.method or class..method + * @param array $in assoc array of input values: key = param name, value = param type + * @param array $out assoc array of output values: key = param name, value = param type + * @param mixed $namespace the element namespace for the method or false + * @param mixed $soapaction the soapaction for the method or false + * @param mixed $style optional (rpc|document) or false Note: when 'document' is specified, parameter and return wrappers are created for you automatically + * @param mixed $use optional (encoded|literal) or false + * @param string $documentation optional Description to include in WSDL + * @param string $encodingStyle optional (usually 'http://schemas.xmlsoap.org/soap/encoding/' for encoded) + * @access public + */ + function register($name,$in=array(),$out=array(),$namespace=false,$soapaction=false,$style=false,$use=false,$documentation='',$encodingStyle=''){ + global $HTTP_SERVER_VARS; + + if($this->externalWSDLURL){ + die('You cannot bind to an external WSDL file, and register methods outside of it! Please choose either WSDL or no WSDL.'); + } + if (! $name) { + die('You must specify a name when you register an operation'); + } + if (!is_array($in)) { + die('You must provide an array for operation inputs'); + } + if (!is_array($out)) { + die('You must provide an array for operation outputs'); + } + if(false == $namespace) { + } + if(false == $soapaction) { + if (isset($_SERVER)) { + $SERVER_NAME = $_SERVER['SERVER_NAME']; + $SCRIPT_NAME = isset($_SERVER['PHP_SELF']) ? $_SERVER['PHP_SELF'] : $_SERVER['SCRIPT_NAME']; + } elseif (isset($HTTP_SERVER_VARS)) { + $SERVER_NAME = $HTTP_SERVER_VARS['SERVER_NAME']; + $SCRIPT_NAME = isset($HTTP_SERVER_VARS['PHP_SELF']) ? $HTTP_SERVER_VARS['PHP_SELF'] : $HTTP_SERVER_VARS['SCRIPT_NAME']; + } else { + $this->setError("Neither _SERVER nor HTTP_SERVER_VARS is available"); + } + $soapaction = "http://$SERVER_NAME$SCRIPT_NAME/$name"; + } + if(false == $style) { + $style = "rpc"; + } + if(false == $use) { + $use = "encoded"; + } + if ($use == 'encoded' && $encodingStyle = '') { + $encodingStyle = 'http://schemas.xmlsoap.org/soap/encoding/'; + } + + $this->operations[$name] = array( + 'name' => $name, + 'in' => $in, + 'out' => $out, + 'namespace' => $namespace, + 'soapaction' => $soapaction, + 'style' => $style); + if($this->wsdl){ + $this->wsdl->addOperation($name,$in,$out,$namespace,$soapaction,$style,$use,$documentation,$encodingStyle); + } + return true; + } + + /** + * Specify a fault to be returned to the client. + * This also acts as a flag to the server that a fault has occured. + * + * @param string $faultcode + * @param string $faultstring + * @param string $faultactor + * @param string $faultdetail + * @access public + */ + function fault($faultcode,$faultstring,$faultactor='',$faultdetail=''){ + if ($faultdetail == '' && $this->debug_flag) { + $faultdetail = $this->getDebug(); + } + $this->fault = new soap_fault_colosa($faultcode,$faultactor,$faultstring,$faultdetail); + $this->fault->soap_defencoding = $this->soap_defencoding; + } + + /** + * Sets up wsdl object. + * Acts as a flag to enable internal WSDL generation + * + * @param string $serviceName, name of the service + * @param mixed $namespace optional 'tns' service namespace or false + * @param mixed $endpoint optional URL of service endpoint or false + * @param string $style optional (rpc|document) WSDL style (also specified by operation) + * @param string $transport optional SOAP transport + * @param mixed $schemaTargetNamespace optional 'types' targetNamespace for service schema or false + */ + function configureWSDL($serviceName,$namespace = false,$endpoint = false,$style='rpc', $transport = 'http://schemas.xmlsoap.org/soap/http', $schemaTargetNamespace = false) + { + global $HTTP_SERVER_VARS; + + if (isset($_SERVER)) { + $SERVER_NAME = $_SERVER['SERVER_NAME']; + $SERVER_PORT = $_SERVER['SERVER_PORT']; + $SCRIPT_NAME = isset($_SERVER['PHP_SELF']) ? $_SERVER['PHP_SELF'] : $_SERVER['SCRIPT_NAME']; + $HTTPS = $_SERVER['HTTPS']; + } elseif (isset($HTTP_SERVER_VARS)) { + $SERVER_NAME = $HTTP_SERVER_VARS['SERVER_NAME']; + $SERVER_PORT = $HTTP_SERVER_VARS['SERVER_PORT']; + $SCRIPT_NAME = isset($HTTP_SERVER_VARS['PHP_SELF']) ? $HTTP_SERVER_VARS['PHP_SELF'] : $HTTP_SERVER_VARS['SCRIPT_NAME']; + $HTTPS = $HTTP_SERVER_VARS['HTTPS']; + } else { + $this->setError("Neither _SERVER nor HTTP_SERVER_VARS is available"); + } + if ($SERVER_PORT == 80) { + $SERVER_PORT = ''; + } else { + $SERVER_PORT = ':' . $SERVER_PORT; + } + if(false == $namespace) { + $namespace = "http://$SERVER_NAME/soap/$serviceName"; + } + + if(false == $endpoint) { + if ($HTTPS == '1' || $HTTPS == 'on') { + $SCHEME = 'https'; + } else { + $SCHEME = 'http'; + } + $endpoint = "$SCHEME://$SERVER_NAME$SERVER_PORT$SCRIPT_NAME"; + } + + if(false == $schemaTargetNamespace) { + $schemaTargetNamespace = $namespace; + } + + $this->wsdl = new wsdl; + $this->wsdl->serviceName = $serviceName; + $this->wsdl->endpoint = $endpoint; + $this->wsdl->namespaces['tns'] = $namespace; + $this->wsdl->namespaces['soap'] = 'http://schemas.xmlsoap.org/wsdl/soap/'; + $this->wsdl->namespaces['wsdl'] = 'http://schemas.xmlsoap.org/wsdl/'; + if ($schemaTargetNamespace != $namespace) { + $this->wsdl->namespaces['types'] = $schemaTargetNamespace; + } + $this->wsdl->schemas[$schemaTargetNamespace][0] = new xmlschema('', '', $this->wsdl->namespaces); + $this->wsdl->schemas[$schemaTargetNamespace][0]->schemaTargetNamespace = $schemaTargetNamespace; + $this->wsdl->schemas[$schemaTargetNamespace][0]->imports['http://schemas.xmlsoap.org/soap/encoding/'][0] = array('location' => '', 'loaded' => true); + $this->wsdl->schemas[$schemaTargetNamespace][0]->imports['http://schemas.xmlsoap.org/wsdl/'][0] = array('location' => '', 'loaded' => true); + $this->wsdl->bindings[$serviceName.'Binding'] = array( + 'name'=>$serviceName.'Binding', + 'style'=>$style, + 'transport'=>$transport, + 'portType'=>$serviceName.'PortType'); + $this->wsdl->ports[$serviceName.'Port'] = array( + 'binding'=>$serviceName.'Binding', + 'location'=>$endpoint, + 'bindingType'=>'http://schemas.xmlsoap.org/wsdl/soap/'); + } +} + + + +?> +* @version $Id: nusoap.php,v 1.94 2005/08/04 01:27:42 snichol Exp $ +* @access public +*/ +class wsdl extends nusoap_base_colosa { + // URL or filename of the root of this WSDL + var $wsdl; + // define internal arrays of bindings, ports, operations, messages, etc. + var $schemas = array(); + var $currentSchema; + var $message = array(); + var $complexTypes = array(); + var $messages = array(); + var $currentMessage; + var $currentOperation; + var $portTypes = array(); + var $currentPortType; + var $bindings = array(); + var $currentBinding; + var $ports = array(); + var $currentPort; + var $opData = array(); + var $status = ''; + var $documentation = false; + var $endpoint = ''; + // array of wsdl docs to import + var $import = array(); + // parser vars + var $parser; + var $position = 0; + var $depth = 0; + var $depth_array = array(); + // for getting wsdl + var $proxyhost = ''; + var $proxyport = ''; + var $proxyusername = ''; + var $proxypassword = ''; + var $timeout = 0; + var $response_timeout = 30; + + /** + * constructor + * + * @param string $wsdl WSDL document URL + * @param string $proxyhost + * @param string $proxyport + * @param string $proxyusername + * @param string $proxypassword + * @param integer $timeout set the connection timeout + * @param integer $response_timeout set the response timeout + * @access public + */ + function wsdl($wsdl = '',$proxyhost=false,$proxyport=false,$proxyusername=false,$proxypassword=false,$timeout=0,$response_timeout=30){ + parent::nusoap_base_colosa(); + $this->wsdl = $wsdl; + $this->proxyhost = $proxyhost; + $this->proxyport = $proxyport; + $this->proxyusername = $proxyusername; + $this->proxypassword = $proxypassword; + $this->timeout = $timeout; + $this->response_timeout = $response_timeout; + + // parse wsdl file + if ($wsdl != "") { + $this->debug('initial wsdl URL: ' . $wsdl); + $this->parseWSDL($wsdl); + } + // imports + // TODO: handle imports more properly, grabbing them in-line and nesting them + $imported_urls = array(); + $imported = 1; + while ($imported > 0) { + $imported = 0; + // Schema imports + foreach ($this->schemas as $ns => $list) { + foreach ($list as $xs) { + $wsdlparts = parse_url($this->wsdl); // this is bogusly simple! + foreach ($xs->imports as $ns2 => $list2) { + for ($ii = 0; $ii < count($list2); $ii++) { + if (! $list2[$ii]['loaded']) { + $this->schemas[$ns]->imports[$ns2][$ii]['loaded'] = true; + $url = $list2[$ii]['location']; + if ($url != '') { + $urlparts = parse_url($url); + if (!isset($urlparts['host'])) { + $url = $wsdlparts['scheme'] . '://' . $wsdlparts['host'] . (isset($wsdlparts['port']) ? ':' .$wsdlparts['port'] : '') . + substr($wsdlparts['path'],0,strrpos($wsdlparts['path'],'/') + 1) .$urlparts['path']; + } + if (! in_array($url, $imported_urls)) { + $this->parseWSDL($url); + $imported++; + $imported_urls[] = $url; + } + } else { + $this->debug("Unexpected scenario: empty URL for unloaded import"); + } + } + } + } + } + } + // WSDL imports + $wsdlparts = parse_url($this->wsdl); // this is bogusly simple! + foreach ($this->import as $ns => $list) { + for ($ii = 0; $ii < count($list); $ii++) { + if (! $list[$ii]['loaded']) { + $this->import[$ns][$ii]['loaded'] = true; + $url = $list[$ii]['location']; + if ($url != '') { + $urlparts = parse_url($url); + if (!isset($urlparts['host'])) { + $url = $wsdlparts['scheme'] . '://' . $wsdlparts['host'] . (isset($wsdlparts['port']) ? ':' . $wsdlparts['port'] : '') . + substr($wsdlparts['path'],0,strrpos($wsdlparts['path'],'/') + 1) .$urlparts['path']; + } + if (! in_array($url, $imported_urls)) { + $this->parseWSDL($url); + $imported++; + $imported_urls[] = $url; + } + } else { + $this->debug("Unexpected scenario: empty URL for unloaded import"); + } + } + } + } + } + // add new data to operation data + foreach($this->bindings as $binding => $bindingData) { + if (isset($bindingData['operations']) && is_array($bindingData['operations'])) { + foreach($bindingData['operations'] as $operation => $data) { + $this->debug('post-parse data gathering for ' . $operation); + $this->bindings[$binding]['operations'][$operation]['input'] = + isset($this->bindings[$binding]['operations'][$operation]['input']) ? + array_merge($this->bindings[$binding]['operations'][$operation]['input'], $this->portTypes[ $bindingData['portType'] ][$operation]['input']) : + $this->portTypes[ $bindingData['portType'] ][$operation]['input']; + $this->bindings[$binding]['operations'][$operation]['output'] = + isset($this->bindings[$binding]['operations'][$operation]['output']) ? + array_merge($this->bindings[$binding]['operations'][$operation]['output'], $this->portTypes[ $bindingData['portType'] ][$operation]['output']) : + $this->portTypes[ $bindingData['portType'] ][$operation]['output']; + if(isset($this->messages[ $this->bindings[$binding]['operations'][$operation]['input']['message'] ])){ + $this->bindings[$binding]['operations'][$operation]['input']['parts'] = $this->messages[ $this->bindings[$binding]['operations'][$operation]['input']['message'] ]; + } + if(isset($this->messages[ $this->bindings[$binding]['operations'][$operation]['output']['message'] ])){ + $this->bindings[$binding]['operations'][$operation]['output']['parts'] = $this->messages[ $this->bindings[$binding]['operations'][$operation]['output']['message'] ]; + } + if (isset($bindingData['style'])) { + $this->bindings[$binding]['operations'][$operation]['style'] = $bindingData['style']; + } + $this->bindings[$binding]['operations'][$operation]['transport'] = isset($bindingData['transport']) ? $bindingData['transport'] : ''; + $this->bindings[$binding]['operations'][$operation]['documentation'] = isset($this->portTypes[ $bindingData['portType'] ][$operation]['documentation']) ? $this->portTypes[ $bindingData['portType'] ][$operation]['documentation'] : ''; + $this->bindings[$binding]['operations'][$operation]['endpoint'] = isset($bindingData['endpoint']) ? $bindingData['endpoint'] : ''; + } + } + } + } + + /** + * parses the wsdl document + * + * @param string $wsdl path or URL + * @access private + */ + function parseWSDL($wsdl = '') + { + if ($wsdl == '') { + $this->debug('no wsdl passed to parseWSDL()!!'); + $this->setError('no wsdl passed to parseWSDL()!!'); + return false; + } + + // parse $wsdl for url format + $wsdl_props = parse_url($wsdl); + + if (isset($wsdl_props['scheme']) && ($wsdl_props['scheme'] == 'http' || $wsdl_props['scheme'] == 'https')) { + $this->debug('getting WSDL http(s) URL ' . $wsdl); + // get wsdl + $tr = new soap_transport_http($wsdl); + $tr->request_method = 'GET'; + $tr->useSOAPAction = false; + if($this->proxyhost && $this->proxyport){ + $tr->setProxy($this->proxyhost,$this->proxyport,$this->proxyusername,$this->proxypassword); + } + $tr->setEncoding('gzip, deflate'); + $wsdl_string = $tr->send('', $this->timeout, $this->response_timeout); + //$this->debug("WSDL request\n" . $tr->outgoing_payload); + //$this->debug("WSDL response\n" . $tr->incoming_payload); + $this->appendDebug($tr->getDebug()); + // catch errors + if($err = $tr->getError() ){ + $errstr = 'HTTP ERROR: '.$err; + $this->debug($errstr); + $this->setError($errstr); + unset($tr); + return false; + } + unset($tr); + $this->debug("got WSDL URL"); + } else { + // $wsdl is not http(s), so treat it as a file URL or plain file path + if (isset($wsdl_props['scheme']) && ($wsdl_props['scheme'] == 'file') && isset($wsdl_props['path'])) { + $path = isset($wsdl_props['host']) ? ($wsdl_props['host'] . ':' . $wsdl_props['path']) : $wsdl_props['path']; + } else { + $path = $wsdl; + } + $this->debug('getting WSDL file ' . $path); + if ($fp = @fopen($path, 'r')) { + $wsdl_string = ''; + while ($data = fread($fp, 32768)) { + $wsdl_string .= $data; + } + fclose($fp); + } else { + $errstr = "Bad path to WSDL file $path"; + $this->debug($errstr); + $this->setError($errstr); + return false; + } + } + $this->debug('Parse WSDL'); + // end new code added + // Create an XML parser. + $this->parser = xml_parser_create(); + // Set the options for parsing the XML data. + // xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1); + xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, 0); + // Set the object for the parser. + xml_set_object($this->parser, $this); + // Set the element handlers for the parser. + xml_set_element_handler($this->parser, 'start_element', 'end_element'); + xml_set_character_data_handler($this->parser, 'character_data'); + // Parse the XML file. + if (!xml_parse($this->parser, $wsdl_string, true)) { + // Display an error message. + $errstr = sprintf( + 'XML error parsing WSDL from %s on line %d: %s', + $wsdl, + xml_get_current_line_number($this->parser), + xml_error_string(xml_get_error_code($this->parser)) + ); + $this->debug($errstr); + $this->debug("XML payload:\n" . $wsdl_string); + $this->setError($errstr); + return false; + } + // free the parser + xml_parser_free($this->parser); + $this->debug('Parsing WSDL done'); + // catch wsdl parse errors + if($this->getError()){ + return false; + } + return true; + } + + /** + * start-element handler + * + * @param string $parser XML parser object + * @param string $name element name + * @param string $attrs associative array of attributes + * @access private + */ + function start_element($parser, $name, $attrs) + { + if ($this->status == 'schema') { + $this->currentSchema->schemaStartElement($parser, $name, $attrs); + $this->appendDebug($this->currentSchema->getDebug()); + $this->currentSchema->clearDebug(); + } elseif (ereg('schema$', $name)) { + $this->debug('Parsing WSDL schema'); + // $this->debug("startElement for $name ($attrs[name]). status = $this->status (".$this->getLocalPart($name).")"); + $this->status = 'schema'; + $this->currentSchema = new xmlschema('', '', $this->namespaces); + $this->currentSchema->schemaStartElement($parser, $name, $attrs); + $this->appendDebug($this->currentSchema->getDebug()); + $this->currentSchema->clearDebug(); + } else { + // position in the total number of elements, starting from 0 + $pos = $this->position++; + $depth = $this->depth++; + // set self as current value for this depth + $this->depth_array[$depth] = $pos; + $this->message[$pos] = array('cdata' => ''); + // process attributes + if (count($attrs) > 0) { + // register namespace declarations + foreach($attrs as $k => $v) { + if (ereg("^xmlns", $k)) { + if ($ns_prefix = substr(strrchr($k, ':'), 1)) { + $this->namespaces[$ns_prefix] = $v; + } else { + $this->namespaces['ns' . (count($this->namespaces) + 1)] = $v; + } + if ($v == 'http://www.w3.org/2001/XMLSchema' || $v == 'http://www.w3.org/1999/XMLSchema' || $v == 'http://www.w3.org/2000/10/XMLSchema') { + $this->XMLSchemaVersion = $v; + $this->namespaces['xsi'] = $v . '-instance'; + } + } + } + // expand each attribute prefix to its namespace + foreach($attrs as $k => $v) { + $k = strpos($k, ':') ? $this->expandQname($k) : $k; + if ($k != 'location' && $k != 'soapAction' && $k != 'namespace') { + $v = strpos($v, ':') ? $this->expandQname($v) : $v; + } + $eAttrs[$k] = $v; + } + $attrs = $eAttrs; + } else { + $attrs = array(); + } + // get element prefix, namespace and name + if (ereg(':', $name)) { + // get ns prefix + $prefix = substr($name, 0, strpos($name, ':')); + // get ns + $namespace = isset($this->namespaces[$prefix]) ? $this->namespaces[$prefix] : ''; + // get unqualified name + $name = substr(strstr($name, ':'), 1); + } + // process attributes, expanding any prefixes to namespaces + // find status, register data + switch ($this->status) { + case 'message': + if ($name == 'part') { + if (isset($attrs['type'])) { + $this->debug("msg " . $this->currentMessage . ": found part $attrs[name]: " . implode(',', $attrs)); + $this->messages[$this->currentMessage][$attrs['name']] = $attrs['type']; + } + if (isset($attrs['element'])) { + $this->debug("msg " . $this->currentMessage . ": found part $attrs[name]: " . implode(',', $attrs)); + $this->messages[$this->currentMessage][$attrs['name']] = $attrs['element']; + } + } + break; + case 'portType': + switch ($name) { + case 'operation': + $this->currentPortOperation = $attrs['name']; + $this->debug("portType $this->currentPortType operation: $this->currentPortOperation"); + if (isset($attrs['parameterOrder'])) { + $this->portTypes[$this->currentPortType][$attrs['name']]['parameterOrder'] = $attrs['parameterOrder']; + } + break; + case 'documentation': + $this->documentation = true; + break; + // merge input/output data + default: + $m = isset($attrs['message']) ? $this->getLocalPart($attrs['message']) : ''; + $this->portTypes[$this->currentPortType][$this->currentPortOperation][$name]['message'] = $m; + break; + } + break; + case 'binding': + switch ($name) { + case 'binding': + // get ns prefix + if (isset($attrs['style'])) { + $this->bindings[$this->currentBinding]['prefix'] = $prefix; + } + $this->bindings[$this->currentBinding] = array_merge($this->bindings[$this->currentBinding], $attrs); + break; + case 'header': + $this->bindings[$this->currentBinding]['operations'][$this->currentOperation][$this->opStatus]['headers'][] = $attrs; + break; + case 'operation': + if (isset($attrs['soapAction'])) { + $this->bindings[$this->currentBinding]['operations'][$this->currentOperation]['soapAction'] = $attrs['soapAction']; + } + if (isset($attrs['style'])) { + $this->bindings[$this->currentBinding]['operations'][$this->currentOperation]['style'] = $attrs['style']; + } + if (isset($attrs['name'])) { + $this->currentOperation = $attrs['name']; + $this->debug("current binding operation: $this->currentOperation"); + $this->bindings[$this->currentBinding]['operations'][$this->currentOperation]['name'] = $attrs['name']; + $this->bindings[$this->currentBinding]['operations'][$this->currentOperation]['binding'] = $this->currentBinding; + $this->bindings[$this->currentBinding]['operations'][$this->currentOperation]['endpoint'] = isset($this->bindings[$this->currentBinding]['endpoint']) ? $this->bindings[$this->currentBinding]['endpoint'] : ''; + } + break; + case 'input': + $this->opStatus = 'input'; + break; + case 'output': + $this->opStatus = 'output'; + break; + case 'body': + if (isset($this->bindings[$this->currentBinding]['operations'][$this->currentOperation][$this->opStatus])) { + $this->bindings[$this->currentBinding]['operations'][$this->currentOperation][$this->opStatus] = array_merge($this->bindings[$this->currentBinding]['operations'][$this->currentOperation][$this->opStatus], $attrs); + } else { + $this->bindings[$this->currentBinding]['operations'][$this->currentOperation][$this->opStatus] = $attrs; + } + break; + } + break; + case 'service': + switch ($name) { + case 'port': + $this->currentPort = $attrs['name']; + $this->debug('current port: ' . $this->currentPort); + $this->ports[$this->currentPort]['binding'] = $this->getLocalPart($attrs['binding']); + + break; + case 'address': + $this->ports[$this->currentPort]['location'] = $attrs['location']; + $this->ports[$this->currentPort]['bindingType'] = $namespace; + $this->bindings[ $this->ports[$this->currentPort]['binding'] ]['bindingType'] = $namespace; + $this->bindings[ $this->ports[$this->currentPort]['binding'] ]['endpoint'] = $attrs['location']; + break; + } + break; + } + // set status + switch ($name) { + case 'import': + if (isset($attrs['location'])) { + $this->import[$attrs['namespace']][] = array('location' => $attrs['location'], 'loaded' => false); + $this->debug('parsing import ' . $attrs['namespace']. ' - ' . $attrs['location'] . ' (' . count($this->import[$attrs['namespace']]).')'); + } else { + $this->import[$attrs['namespace']][] = array('location' => '', 'loaded' => true); + if (! $this->getPrefixFromNamespace($attrs['namespace'])) { + $this->namespaces['ns'.(count($this->namespaces)+1)] = $attrs['namespace']; + } + $this->debug('parsing import ' . $attrs['namespace']. ' - [no location] (' . count($this->import[$attrs['namespace']]).')'); + } + break; + //wait for schema + //case 'types': + // $this->status = 'schema'; + // break; + case 'message': + $this->status = 'message'; + $this->messages[$attrs['name']] = array(); + $this->currentMessage = $attrs['name']; + break; + case 'portType': + $this->status = 'portType'; + $this->portTypes[$attrs['name']] = array(); + $this->currentPortType = $attrs['name']; + break; + case "binding": + if (isset($attrs['name'])) { + // get binding name + if (strpos($attrs['name'], ':')) { + $this->currentBinding = $this->getLocalPart($attrs['name']); + } else { + $this->currentBinding = $attrs['name']; + } + $this->status = 'binding'; + $this->bindings[$this->currentBinding]['portType'] = $this->getLocalPart($attrs['type']); + $this->debug("current binding: $this->currentBinding of portType: " . $attrs['type']); + } + break; + case 'service': + $this->serviceName = $attrs['name']; + $this->status = 'service'; + $this->debug('current service: ' . $this->serviceName); + break; + case 'definitions': + foreach ($attrs as $name => $value) { + $this->wsdl_info[$name] = $value; + } + break; + } + } + } + + /** + * end-element handler + * + * @param string $parser XML parser object + * @param string $name element name + * @access private + */ + function end_element($parser, $name){ + // unset schema status + if (/*ereg('types$', $name) ||*/ ereg('schema$', $name)) { + $this->status = ""; + $this->appendDebug($this->currentSchema->getDebug()); + $this->currentSchema->clearDebug(); + $this->schemas[$this->currentSchema->schemaTargetNamespace][] = $this->currentSchema; + $this->debug('Parsing WSDL schema done'); + } + if ($this->status == 'schema') { + $this->currentSchema->schemaEndElement($parser, $name); + } else { + // bring depth down a notch + $this->depth--; + } + // end documentation + if ($this->documentation) { + //TODO: track the node to which documentation should be assigned; it can be a part, message, etc. + //$this->portTypes[$this->currentPortType][$this->currentPortOperation]['documentation'] = $this->documentation; + $this->documentation = false; + } + } + + /** + * element content handler + * + * @param string $parser XML parser object + * @param string $data element content + * @access private + */ + function character_data($parser, $data) + { + $pos = isset($this->depth_array[$this->depth]) ? $this->depth_array[$this->depth] : 0; + if (isset($this->message[$pos]['cdata'])) { + $this->message[$pos]['cdata'] .= $data; + } + if ($this->documentation) { + $this->documentation .= $data; + } + } + + function getBindingData($binding) + { + if (is_array($this->bindings[$binding])) { + return $this->bindings[$binding]; + } + } + + /** + * returns an assoc array of operation names => operation data + * + * @param string $bindingType eg: soap, smtp, dime (only soap is currently supported) + * @return array + * @access public + */ + function getOperations($bindingType = 'soap') + { + $ops = array(); + if ($bindingType == 'soap') { + $bindingType = 'http://schemas.xmlsoap.org/wsdl/soap/'; + } + // loop thru ports + foreach($this->ports as $port => $portData) { + // binding type of port matches parameter + if ($portData['bindingType'] == $bindingType) { + //$this->debug("getOperations for port $port"); + //$this->debug("port data: " . $this->varDump($portData)); + //$this->debug("bindings: " . $this->varDump($this->bindings[ $portData['binding'] ])); + // merge bindings + if (isset($this->bindings[ $portData['binding'] ]['operations'])) { + $ops = array_merge ($ops, $this->bindings[ $portData['binding'] ]['operations']); + } + } + } + return $ops; + } + + /** + * returns an associative array of data necessary for calling an operation + * + * @param string $operation , name of operation + * @param string $bindingType , type of binding eg: soap + * @return array + * @access public + */ + function getOperationData($operation, $bindingType = 'soap') + { + if ($bindingType == 'soap') { + $bindingType = 'http://schemas.xmlsoap.org/wsdl/soap/'; + } + // loop thru ports + foreach($this->ports as $port => $portData) { + // binding type of port matches parameter + if ($portData['bindingType'] == $bindingType) { + // get binding + //foreach($this->bindings[ $portData['binding'] ]['operations'] as $bOperation => $opData) { + foreach(array_keys($this->bindings[ $portData['binding'] ]['operations']) as $bOperation) { + // note that we could/should also check the namespace here + if ($operation == $bOperation) { + $opData = $this->bindings[ $portData['binding'] ]['operations'][$operation]; + return $opData; + } + } + } + } + } + + /** + * returns an associative array of data necessary for calling an operation + * + * @param string $soapAction soapAction for operation + * @param string $bindingType type of binding eg: soap + * @return array + * @access public + */ + function getOperationDataForSoapAction($soapAction, $bindingType = 'soap') { + if ($bindingType == 'soap') { + $bindingType = 'http://schemas.xmlsoap.org/wsdl/soap/'; + } + // loop thru ports + foreach($this->ports as $port => $portData) { + // binding type of port matches parameter + if ($portData['bindingType'] == $bindingType) { + // loop through operations for the binding + foreach ($this->bindings[ $portData['binding'] ]['operations'] as $bOperation => $opData) { + if ($opData['soapAction'] == $soapAction) { + return $opData; + } + } + } + } + } + + /** + * returns an array of information about a given type + * returns false if no type exists by the given name + * + * typeDef = array( + * 'elements' => array(), // refs to elements array + * 'restrictionBase' => '', + * 'phpType' => '', + * 'order' => '(sequence|all)', + * 'attrs' => array() // refs to attributes array + * ) + * + * @param $type string the type + * @param $ns string namespace (not prefix) of the type + * @return mixed + * @access public + * @see xmlschema + */ + function getTypeDef($type, $ns) { + $this->debug("in getTypeDef: type=$type, ns=$ns"); + if ((! $ns) && isset($this->namespaces['tns'])) { + $ns = $this->namespaces['tns']; + $this->debug("in getTypeDef: type namespace forced to $ns"); + } + if (isset($this->schemas[$ns])) { + $this->debug("in getTypeDef: have schema for namespace $ns"); + for ($i = 0; $i < count($this->schemas[$ns]); $i++) { + $xs = &$this->schemas[$ns][$i]; + $t = $xs->getTypeDef($type); + $this->appendDebug($xs->getDebug()); + $xs->clearDebug(); + if ($t) { + if (!isset($t['phpType'])) { + // get info for type to tack onto the element + $uqType = substr($t['type'], strrpos($t['type'], ':') + 1); + $ns = substr($t['type'], 0, strrpos($t['type'], ':')); + $etype = $this->getTypeDef($uqType, $ns); + if ($etype) { + $this->debug("found type for [element] $type:"); + $this->debug($this->varDump($etype)); + if (isset($etype['phpType'])) { + $t['phpType'] = $etype['phpType']; + } + if (isset($etype['elements'])) { + $t['elements'] = $etype['elements']; + } + if (isset($etype['attrs'])) { + $t['attrs'] = $etype['attrs']; + } + } + } + return $t; + } + } + } else { + $this->debug("in getTypeDef: do not have schema for namespace $ns"); + } + return false; + } + + /** + * prints html description of services + * + * @access private + */ + function webDescription(){ + global $HTTP_SERVER_VARS; + + if (isset($_SERVER)) { + $PHP_SELF = $_SERVER['PHP_SELF']; + } elseif (isset($HTTP_SERVER_VARS)) { + $PHP_SELF = $HTTP_SERVER_VARS['PHP_SELF']; + } else { + $this->setError("Neither _SERVER nor HTTP_SERVER_VARS is available"); + } + + $b = ' + NuSOAP: '.$this->serviceName.' + + + + +
    +

    +
    '.$this->serviceName.'
    + +
    '; + return $b; + } + + /** + * serialize the parsed wsdl + * + * @param mixed $debug whether to put debug=1 in endpoint URL + * @return string serialization of WSDL + * @access public + */ + function serialize($debug = 0) + { + $xml = ''; + $xml .= "\nnamespaces as $k => $v) { + $xml .= " xmlns:$k=\"$v\""; + } + // 10.9.02 - add poulter fix for wsdl and tns declarations + if (isset($this->namespaces['wsdl'])) { + $xml .= " xmlns=\"" . $this->namespaces['wsdl'] . "\""; + } + if (isset($this->namespaces['tns'])) { + $xml .= " targetNamespace=\"" . $this->namespaces['tns'] . "\""; + } + $xml .= '>'; + // imports + if (sizeof($this->import) > 0) { + foreach($this->import as $ns => $list) { + foreach ($list as $ii) { + if ($ii['location'] != '') { + $xml .= ''; + } else { + $xml .= ''; + } + } + } + } + // types + if (count($this->schemas)>=1) { + $xml .= "\n"; + foreach ($this->schemas as $ns => $list) { + foreach ($list as $xs) { + $xml .= $xs->serializeSchema(); + } + } + $xml .= ''; + } + // messages + if (count($this->messages) >= 1) { + foreach($this->messages as $msgName => $msgParts) { + $xml .= "\n'; + if(is_array($msgParts)){ + foreach($msgParts as $partName => $partType) { + // print 'serializing '.$partType.', sv: '.$this->XMLSchemaVersion.'
    '; + if (strpos($partType, ':')) { + $typePrefix = $this->getPrefixFromNamespace($this->getPrefix($partType)); + } elseif (isset($this->typemap[$this->namespaces['xsd']][$partType])) { + // print 'checking typemap: '.$this->XMLSchemaVersion.'
    '; + $typePrefix = 'xsd'; + } else { + foreach($this->typemap as $ns => $types) { + if (isset($types[$partType])) { + $typePrefix = $this->getPrefixFromNamespace($ns); + } + } + if (!isset($typePrefix)) { + die("$partType has no namespace!"); + } + } + $ns = $this->getNamespaceFromPrefix($typePrefix); + $typeDef = $this->getTypeDef($this->getLocalPart($partType), $ns); + if ($typeDef['typeClass'] == 'element') { + $elementortype = 'element'; + } else { + $elementortype = 'type'; + } + $xml .= ''; + } + } + $xml .= '
    '; + } + } + // bindings & porttypes + if (count($this->bindings) >= 1) { + $binding_xml = ''; + $portType_xml = ''; + foreach($this->bindings as $bindingName => $attrs) { + $binding_xml .= "\n'; + $binding_xml .= ''; + $portType_xml .= "\n'; + foreach($attrs['operations'] as $opName => $opParts) { + $binding_xml .= ''; + $binding_xml .= ''; + if (isset($opParts['input']['encodingStyle']) && $opParts['input']['encodingStyle'] != '') { + $enc_style = ' encodingStyle="' . $opParts['input']['encodingStyle'] . '"'; + } else { + $enc_style = ''; + } + $binding_xml .= ''; + if (isset($opParts['output']['encodingStyle']) && $opParts['output']['encodingStyle'] != '') { + $enc_style = ' encodingStyle="' . $opParts['output']['encodingStyle'] . '"'; + } else { + $enc_style = ''; + } + $binding_xml .= ''; + $binding_xml .= ''; + $portType_xml .= ''; + } + $portType_xml .= ''; + $portType_xml .= ''; + $portType_xml .= ''; + } + $portType_xml .= ''; + $binding_xml .= ''; + } + $xml .= $portType_xml . $binding_xml; + } + // services + $xml .= "\nserviceName . '">'; + if (count($this->ports) >= 1) { + foreach($this->ports as $pName => $attrs) { + $xml .= ''; + $uri = explode ( '?' , getenv("REQUEST_URI")); + $location = 'http://' . getenv ( 'SERVER_NAME' ) . $uri[0] ; + $xml .= ''; + // $xml .= ''; + $xml .= ''; + } + } + $xml .= ''; + return $xml . "\n"; + } + + /** + * serialize PHP values according to a WSDL message definition + * + * TODO + * - multi-ref serialization + * - validate PHP values against type definitions, return errors if invalid + * + * @param string $operation operation name + * @param string $direction (input|output) + * @param mixed $parameters parameter value(s) + * @return mixed parameters serialized as XML or false on error (e.g. operation not found) + * @access public + */ + function serializeRPCParameters($operation, $direction, $parameters) + { + $this->debug("in serializeRPCParameters: operation=$operation, direction=$direction, XMLSchemaVersion=$this->XMLSchemaVersion"); + $this->appendDebug('parameters=' . $this->varDump($parameters)); + + if ($direction != 'input' && $direction != 'output') { + $this->debug('The value of the \$direction argument needs to be either "input" or "output"'); + $this->setError('The value of the \$direction argument needs to be either "input" or "output"'); + return false; + } + if (!$opData = $this->getOperationData($operation)) { + $this->debug('Unable to retrieve WSDL data for operation: ' . $operation); + $this->setError('Unable to retrieve WSDL data for operation: ' . $operation); + return false; + } + $this->debug('opData:'); + $this->appendDebug($this->varDump($opData)); + + // Get encoding style for output and set to current + $encodingStyle = 'http://schemas.xmlsoap.org/soap/encoding/'; + if(($direction == 'input') && isset($opData['output']['encodingStyle']) && ($opData['output']['encodingStyle'] != $encodingStyle)) { + $encodingStyle = $opData['output']['encodingStyle']; + $enc_style = $encodingStyle; + } + + // set input params + $xml = ''; + if (isset($opData[$direction]['parts']) && sizeof($opData[$direction]['parts']) > 0) { + + $use = $opData[$direction]['use']; + $this->debug('have ' . count($opData[$direction]['parts']) . ' part(s) to serialize'); + if (is_array($parameters)) { + $parametersArrayType = $this->isArraySimpleOrStruct($parameters); + $this->debug('have ' . count($parameters) . ' parameter(s) provided as ' . $parametersArrayType . ' to serialize'); + foreach($opData[$direction]['parts'] as $name => $type) { + $this->debug('serializing part "'.$name.'" of type "'.$type.'"'); + // Track encoding style + if (isset($opData[$direction]['encodingStyle']) && $encodingStyle != $opData[$direction]['encodingStyle']) { + $encodingStyle = $opData[$direction]['encodingStyle']; + $enc_style = $encodingStyle; + } else { + $enc_style = false; + } + // NOTE: add error handling here + // if serializeType returns false, then catch global error and fault + if ($parametersArrayType == 'arraySimple') { + $p = array_shift($parameters); + $this->debug('calling serializeType w/indexed param'); + $xml .= $this->serializeType($name, $type, $p, $use, $enc_style); + } elseif (isset($parameters[$name])) { + $this->debug('calling serializeType w/named param'); + $xml .= $this->serializeType($name, $type, $parameters[$name], $use, $enc_style); + } else { + // TODO: only send nillable + $this->debug('calling serializeType w/null param'); + $xml .= $this->serializeType($name, $type, null, $use, $enc_style); + } + } + } else { + $this->debug('no parameters passed.'); + } + } + $this->debug("serializeRPCParameters returning: $xml"); + return $xml; + } + + /** + * serialize a PHP value according to a WSDL message definition + * + * TODO + * - multi-ref serialization + * - validate PHP values against type definitions, return errors if invalid + * + * @param string $ type name + * @param mixed $ param value + * @return mixed new param or false if initial value didn't validate + * @access public + * @deprecated + */ + function serializeParameters($operation, $direction, $parameters) + { + $this->debug("in serializeParameters: operation=$operation, direction=$direction, XMLSchemaVersion=$this->XMLSchemaVersion"); + $this->appendDebug('parameters=' . $this->varDump($parameters)); + + if ($direction != 'input' && $direction != 'output') { + $this->debug('The value of the \$direction argument needs to be either "input" or "output"'); + $this->setError('The value of the \$direction argument needs to be either "input" or "output"'); + return false; + } + if (!$opData = $this->getOperationData($operation)) { + $this->debug('Unable to retrieve WSDL data for operation: ' . $operation); + $this->setError('Unable to retrieve WSDL data for operation: ' . $operation); + return false; + } + $this->debug('opData:'); + $this->appendDebug($this->varDump($opData)); + + // Get encoding style for output and set to current + $encodingStyle = 'http://schemas.xmlsoap.org/soap/encoding/'; + if(($direction == 'input') && isset($opData['output']['encodingStyle']) && ($opData['output']['encodingStyle'] != $encodingStyle)) { + $encodingStyle = $opData['output']['encodingStyle']; + $enc_style = $encodingStyle; + } + + // set input params + $xml = ''; + if (isset($opData[$direction]['parts']) && sizeof($opData[$direction]['parts']) > 0) { + + $use = $opData[$direction]['use']; + $this->debug("use=$use"); + $this->debug('got ' . count($opData[$direction]['parts']) . ' part(s)'); + if (is_array($parameters)) { + $parametersArrayType = $this->isArraySimpleOrStruct($parameters); + $this->debug('have ' . $parametersArrayType . ' parameters'); + foreach($opData[$direction]['parts'] as $name => $type) { + $this->debug('serializing part "'.$name.'" of type "'.$type.'"'); + // Track encoding style + if(isset($opData[$direction]['encodingStyle']) && $encodingStyle != $opData[$direction]['encodingStyle']) { + $encodingStyle = $opData[$direction]['encodingStyle']; + $enc_style = $encodingStyle; + } else { + $enc_style = false; + } + // NOTE: add error handling here + // if serializeType returns false, then catch global error and fault + if ($parametersArrayType == 'arraySimple') { + $p = array_shift($parameters); + $this->debug('calling serializeType w/indexed param'); + $xml .= $this->serializeType($name, $type, $p, $use, $enc_style); + } elseif (isset($parameters[$name])) { + $this->debug('calling serializeType w/named param'); + $xml .= $this->serializeType($name, $type, $parameters[$name], $use, $enc_style); + } else { + // TODO: only send nillable + $this->debug('calling serializeType w/null param'); + $xml .= $this->serializeType($name, $type, null, $use, $enc_style); + } + } + } else { + $this->debug('no parameters passed.'); + } + } + $this->debug("serializeParameters returning: $xml"); + return $xml; + } + + /** + * serializes a PHP value according a given type definition + * + * @param string $name name of value (part or element) + * @param string $type XML schema type of value (type or element) + * @param mixed $value a native PHP value (parameter value) + * @param string $use use for part (encoded|literal) + * @param string $encodingStyle SOAP encoding style for the value (if different than the enclosing style) + * @param boolean $unqualified a kludge for what should be XML namespace form handling + * @return string value serialized as an XML string + * @access private + */ + function serializeType($name, $type, $value, $use='encoded', $encodingStyle=false, $unqualified=false) + { + $this->debug("in serializeType: name=$name, type=$type, use=$use, encodingStyle=$encodingStyle, unqualified=" . ($unqualified ? "unqualified" : "qualified")); + $this->appendDebug("value=" . $this->varDump($value)); + if($use == 'encoded' && $encodingStyle) { + $encodingStyle = ' SOAP-ENV:encodingStyle="' . $encodingStyle . '"'; + } + + // if a soapval has been supplied, let its type override the WSDL + if (is_object($value) && get_class($value) == 'soapval') { + if ($value->type_ns) { + $type = $value->type_ns . ':' . $value->type; + $forceType = true; + $this->debug("in serializeType: soapval overrides type to $type"); + } elseif ($value->type) { + $type = $value->type; + $forceType = true; + $this->debug("in serializeType: soapval overrides type to $type"); + } else { + $forceType = false; + $this->debug("in serializeType: soapval does not override type"); + } + $attrs = $value->attributes; + $value = $value->value; + $this->debug("in serializeType: soapval overrides value to $value"); + if ($attrs) { + if (!is_array($value)) { + $value['!'] = $value; + } + foreach ($attrs as $n => $v) { + $value['!' . $n] = $v; + } + $this->debug("in serializeType: soapval provides attributes"); + } + } else { + $forceType = false; + } + + $xml = ''; + if (strpos($type, ':')) { + $uqType = substr($type, strrpos($type, ':') + 1); + $ns = substr($type, 0, strrpos($type, ':')); + $this->debug("in serializeType: got a prefixed type: $uqType, $ns"); + if ($this->getNamespaceFromPrefix($ns)) { + $ns = $this->getNamespaceFromPrefix($ns); + $this->debug("in serializeType: expanded prefixed type: $uqType, $ns"); + } + + if($ns == $this->XMLSchemaVersion || $ns == 'http://schemas.xmlsoap.org/soap/encoding/'){ + $this->debug('in serializeType: type namespace indicates XML Schema or SOAP Encoding type'); + if ($unqualified && $use == 'literal') { + $elementNS = " xmlns=\"\""; + } else { + $elementNS = ''; + } + if (is_null($value)) { + if ($use == 'literal') { + // TODO: depends on minOccurs + $xml = "<$name$elementNS/>"; + } else { + // TODO: depends on nillable, which should be checked before calling this method + $xml = "<$name$elementNS xsi:nil=\"true\" xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\"/>"; + } + $this->debug("in serializeType: returning: $xml"); + return $xml; + } + if ($uqType == 'boolean') { + if ((is_string($value) && $value == 'false') || (! $value)) { + $value = 'false'; + } else { + $value = 'true'; + } + } + if ($uqType == 'string' && gettype($value) == 'string') { + $value = $this->expandEntities($value); + } + if (($uqType == 'long' || $uqType == 'unsignedLong') && gettype($value) == 'double') { + $value = sprintf("%.0lf", $value); + } + // it's a scalar + // TODO: what about null/nil values? + // check type isn't a custom type extending xmlschema namespace + if (!$this->getTypeDef($uqType, $ns)) { + if ($use == 'literal') { + if ($forceType) { + $xml = "<$name$elementNS xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\">$value"; + } else { + $xml = "<$name$elementNS>$value"; + } + } else { + $xml = "<$name$elementNS xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\"$encodingStyle>$value"; + } + $this->debug("in serializeType: returning: $xml"); + return $xml; + } + $this->debug('custom type extends XML Schema or SOAP Encoding namespace (yuck)'); + } else if ($ns == 'http://xml.apache.org/xml-soap') { + $this->debug('in serializeType: appears to be Apache SOAP type'); + if ($uqType == 'Map') { + $tt_prefix = $this->getPrefixFromNamespace('http://xml.apache.org/xml-soap'); + if (! $tt_prefix) { + $this->debug('in serializeType: Add namespace for Apache SOAP type'); + $tt_prefix = 'ns' . rand(1000, 9999); + $this->namespaces[$tt_prefix] = 'http://xml.apache.org/xml-soap'; + // force this to be added to usedNamespaces + $tt_prefix = $this->getPrefixFromNamespace('http://xml.apache.org/xml-soap'); + } + $contents = ''; + foreach($value as $k => $v) { + $this->debug("serializing map element: key $k, value $v"); + $contents .= ''; + $contents .= $this->serialize_val($k,'key',false,false,false,false,$use); + $contents .= $this->serialize_val($v,'value',false,false,false,false,$use); + $contents .= ''; + } + if ($use == 'literal') { + if ($forceType) { + $xml = "<$name xsi:type=\"" . $tt_prefix . ":$uqType\">$contents"; + } else { + $xml = "<$name>$contents"; + } + } else { + $xml = "<$name xsi:type=\"" . $tt_prefix . ":$uqType\"$encodingStyle>$contents"; + } + $this->debug("in serializeType: returning: $xml"); + return $xml; + } + $this->debug('in serializeType: Apache SOAP type, but only support Map'); + } + } else { + // TODO: should the type be compared to types in XSD, and the namespace + // set to XSD if the type matches? + $this->debug("in serializeType: No namespace for type $type"); + $ns = ''; + $uqType = $type; + } + if(!$typeDef = $this->getTypeDef($uqType, $ns)){ + $this->setError("$type ($uqType) is not a supported type."); + $this->debug("in serializeType: $type ($uqType) is not a supported type."); + return false; + } else { + $this->debug("in serializeType: found typeDef"); + $this->appendDebug('typeDef=' . $this->varDump($typeDef)); + } + $phpType = $typeDef['phpType']; + $this->debug("in serializeType: uqType: $uqType, ns: $ns, phptype: $phpType, arrayType: " . (isset($typeDef['arrayType']) ? $typeDef['arrayType'] : '') ); + // if php type == struct, map value to the element names + if ($phpType == 'struct') { + if (isset($typeDef['typeClass']) && $typeDef['typeClass'] == 'element') { + $elementName = $uqType; + if (isset($typeDef['form']) && ($typeDef['form'] == 'qualified')) { + $elementNS = " xmlns=\"$ns\""; + } else { + $elementNS = " xmlns=\"\""; + } + } else { + $elementName = $name; + if ($unqualified) { + $elementNS = " xmlns=\"\""; + } else { + $elementNS = ''; + } + } + if (is_null($value)) { + if ($use == 'literal') { + // TODO: depends on minOccurs + $xml = "<$elementName$elementNS/>"; + } else { + $xml = "<$elementName$elementNS xsi:nil=\"true\" xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\"/>"; + } + $this->debug("in serializeType: returning: $xml"); + return $xml; + } + if (is_object($value)) { + $value = get_object_vars($value); + } + if (is_array($value)) { + $elementAttrs = $this->serializeComplexTypeAttributes($typeDef, $value, $ns, $uqType); + if ($use == 'literal') { + if ($forceType) { + $xml = "<$elementName$elementNS$elementAttrs xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\">"; + } else { + $xml = "<$elementName$elementNS$elementAttrs>"; + } + } else { + $xml = "<$elementName$elementNS$elementAttrs xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\"$encodingStyle>"; + } + + $xml .= $this->serializeComplexTypeElements($typeDef, $value, $ns, $uqType, $use, $encodingStyle); + $xml .= ""; + } else { + $this->debug("in serializeType: phpType is struct, but value is not an array"); + $this->setError("phpType is struct, but value is not an array: see debug output for details"); + $xml = ''; + } + } elseif ($phpType == 'array') { + if (isset($typeDef['form']) && ($typeDef['form'] == 'qualified')) { + $elementNS = " xmlns=\"$ns\""; + } else { + if ($unqualified) { + $elementNS = " xmlns=\"\""; + } else { + $elementNS = ''; + } + } + if (is_null($value)) { + if ($use == 'literal') { + // TODO: depends on minOccurs + $xml = "<$name$elementNS/>"; + } else { + $xml = "<$name$elementNS xsi:nil=\"true\" xsi:type=\"" . + $this->getPrefixFromNamespace('http://schemas.xmlsoap.org/soap/encoding/') . + ":Array\" " . + $this->getPrefixFromNamespace('http://schemas.xmlsoap.org/soap/encoding/') . + ':arrayType="' . + $this->getPrefixFromNamespace($this->getPrefix($typeDef['arrayType'])) . + ':' . + $this->getLocalPart($typeDef['arrayType'])."[0]\"/>"; + } + $this->debug("in serializeType: returning: $xml"); + return $xml; + } + if (isset($typeDef['multidimensional'])) { + $nv = array(); + foreach($value as $v) { + $cols = ',' . sizeof($v); + $nv = array_merge($nv, $v); + } + $value = $nv; + } else { + $cols = ''; + } + if (is_array($value) && sizeof($value) >= 1) { + $rows = sizeof($value); + $contents = ''; + foreach($value as $k => $v) { + $this->debug("serializing array element: $k, $v of type: $typeDef[arrayType]"); + //if (strpos($typeDef['arrayType'], ':') ) { + if (!in_array($typeDef['arrayType'],$this->typemap['http://www.w3.org/2001/XMLSchema'])) { + $contents .= $this->serializeType('item', $typeDef['arrayType'], $v, $use); + } else { + $contents .= $this->serialize_val($v, 'item', $typeDef['arrayType'], null, $this->XMLSchemaVersion, false, $use); + } + } + } else { + $rows = 0; + $contents = null; + } + // TODO: for now, an empty value will be serialized as a zero element + // array. Revisit this when coding the handling of null/nil values. + if ($use == 'literal') { + $xml = "<$name$elementNS>" + .$contents + .""; + } else { + $xml = "<$name$elementNS xsi:type=\"".$this->getPrefixFromNamespace('http://schemas.xmlsoap.org/soap/encoding/').':Array" '. + $this->getPrefixFromNamespace('http://schemas.xmlsoap.org/soap/encoding/') + .':arrayType="' + .$this->getPrefixFromNamespace($this->getPrefix($typeDef['arrayType'])) + .":".$this->getLocalPart($typeDef['arrayType'])."[$rows$cols]\">" + .$contents + .""; + } + } elseif ($phpType == 'scalar') { + if (isset($typeDef['form']) && ($typeDef['form'] == 'qualified')) { + $elementNS = " xmlns=\"$ns\""; + } else { + if ($unqualified) { + $elementNS = " xmlns=\"\""; + } else { + $elementNS = ''; + } + } + if ($use == 'literal') { + if ($forceType) { + $xml = "<$name$elementNS xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\">$value"; + } else { + $xml = "<$name$elementNS>$value"; + } + } else { + $xml = "<$name$elementNS xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\"$encodingStyle>$value"; + } + } + $this->debug("in serializeType: returning: $xml"); + return $xml; + } + + /** + * serializes the attributes for a complexType + * + * @param array $typeDef our internal representation of an XML schema type (or element) + * @param mixed $value a native PHP value (parameter value) + * @param string $ns the namespace of the type + * @param string $uqType the local part of the type + * @return string value serialized as an XML string + * @access private + */ + function serializeComplexTypeAttributes($typeDef, $value, $ns, $uqType) { + $xml = ''; + if (isset($typeDef['attrs']) && is_array($typeDef['attrs'])) { + $this->debug("serialize attributes for XML Schema type $ns:$uqType"); + if (is_array($value)) { + $xvalue = $value; + } elseif (is_object($value)) { + $xvalue = get_object_vars($value); + } else { + $this->debug("value is neither an array nor an object for XML Schema type $ns:$uqType"); + $xvalue = array(); + } + foreach ($typeDef['attrs'] as $aName => $attrs) { + if (isset($xvalue['!' . $aName])) { + $xname = '!' . $aName; + $this->debug("value provided for attribute $aName with key $xname"); + } elseif (isset($xvalue[$aName])) { + $xname = $aName; + $this->debug("value provided for attribute $aName with key $xname"); + } elseif (isset($attrs['default'])) { + $xname = '!' . $aName; + $xvalue[$xname] = $attrs['default']; + $this->debug('use default value of ' . $xvalue[$aName] . ' for attribute ' . $aName); + } else { + $xname = ''; + $this->debug("no value provided for attribute $aName"); + } + if ($xname) { + $xml .= " $aName=\"" . $this->expandEntities($xvalue[$xname]) . "\""; + } + } + } else { + $this->debug("no attributes to serialize for XML Schema type $ns:$uqType"); + } + if (isset($typeDef['extensionBase'])) { + $ns = $this->getPrefix($typeDef['extensionBase']); + $uqType = $this->getLocalPart($typeDef['extensionBase']); + if ($this->getNamespaceFromPrefix($ns)) { + $ns = $this->getNamespaceFromPrefix($ns); + } + if ($typeDef = $this->getTypeDef($uqType, $ns)) { + $this->debug("serialize attributes for extension base $ns:$uqType"); + $xml .= $this->serializeComplexTypeAttributes($typeDef, $value, $ns, $uqType); + } else { + $this->debug("extension base $ns:$uqType is not a supported type"); + } + } + return $xml; + } + + /** + * serializes the elements for a complexType + * + * @param array $typeDef our internal representation of an XML schema type (or element) + * @param mixed $value a native PHP value (parameter value) + * @param string $ns the namespace of the type + * @param string $uqType the local part of the type + * @param string $use use for part (encoded|literal) + * @param string $encodingStyle SOAP encoding style for the value (if different than the enclosing style) + * @return string value serialized as an XML string + * @access private + */ + function serializeComplexTypeElements($typeDef, $value, $ns, $uqType, $use='encoded', $encodingStyle=false) { + $xml = ''; + if (isset($typeDef['elements']) && is_array($typeDef['elements'])) { + $this->debug("in serializeComplexTypeElements, serialize elements for XML Schema type $ns:$uqType"); + if (is_array($value)) { + $xvalue = $value; + } elseif (is_object($value)) { + $xvalue = get_object_vars($value); + } else { + $this->debug("value is neither an array nor an object for XML Schema type $ns:$uqType"); + $xvalue = array(); + } + // toggle whether all elements are present - ideally should validate against schema + if (count($typeDef['elements']) != count($xvalue)){ + $optionals = true; + } + foreach ($typeDef['elements'] as $eName => $attrs) { + if (!isset($xvalue[$eName])) { + if (isset($attrs['default'])) { + $xvalue[$eName] = $attrs['default']; + $this->debug('use default value of ' . $xvalue[$eName] . ' for element ' . $eName); + } + } + // if user took advantage of a minOccurs=0, then only serialize named parameters + if (isset($optionals) + && (!isset($xvalue[$eName])) + && ( (!isset($attrs['nillable'])) || $attrs['nillable'] != 'true') + ){ + if (isset($attrs['minOccurs']) && $attrs['minOccurs'] <> '0') { + $this->debug("apparent error: no value provided for element $eName with minOccurs=" . $attrs['minOccurs']); + } + // do nothing + $this->debug("no value provided for complexType element $eName and element is not nillable, so serialize nothing"); + } else { + // get value + if (isset($xvalue[$eName])) { + $v = $xvalue[$eName]; + } else { + $v = null; + } + if (isset($attrs['form'])) { + $unqualified = ($attrs['form'] == 'unqualified'); + } else { + $unqualified = false; + } + if (isset($attrs['maxOccurs']) && ($attrs['maxOccurs'] == 'unbounded' || $attrs['maxOccurs'] > 1) && isset($v) && is_array($v) && $this->isArraySimpleOrStruct($v) == 'arraySimple') { + $vv = $v; + foreach ($vv as $k => $v) { + if (isset($attrs['type']) || isset($attrs['ref'])) { + // serialize schema-defined type + $xml .= $this->serializeType($eName, isset($attrs['type']) ? $attrs['type'] : $attrs['ref'], $v, $use, $encodingStyle, $unqualified); + } else { + // serialize generic type (can this ever really happen?) + $this->debug("calling serialize_val() for $v, $eName, false, false, false, false, $use"); + $xml .= $this->serialize_val($v, $eName, false, false, false, false, $use); + } + } + } else { + if (isset($attrs['type']) || isset($attrs['ref'])) { + // serialize schema-defined type + $xml .= $this->serializeType($eName, isset($attrs['type']) ? $attrs['type'] : $attrs['ref'], $v, $use, $encodingStyle, $unqualified); + } else { + // serialize generic type (can this ever really happen?) + $this->debug("calling serialize_val() for $v, $eName, false, false, false, false, $use"); + $xml .= $this->serialize_val($v, $eName, false, false, false, false, $use); + } + } + } + } + } else { + $this->debug("no elements to serialize for XML Schema type $ns:$uqType"); + } + if (isset($typeDef['extensionBase'])) { + $ns = $this->getPrefix($typeDef['extensionBase']); + $uqType = $this->getLocalPart($typeDef['extensionBase']); + if ($this->getNamespaceFromPrefix($ns)) { + $ns = $this->getNamespaceFromPrefix($ns); + } + if ($typeDef = $this->getTypeDef($uqType, $ns)) { + $this->debug("serialize elements for extension base $ns:$uqType"); + $xml .= $this->serializeComplexTypeElements($typeDef, $value, $ns, $uqType, $use, $encodingStyle); + } else { + $this->debug("extension base $ns:$uqType is not a supported type"); + } + } + return $xml; + } + + /** + * adds an XML Schema complex type to the WSDL types + * + * @param string name + * @param string typeClass (complexType|simpleType|attribute) + * @param string phpType: currently supported are array and struct (php assoc array) + * @param string compositor (all|sequence|choice) + * @param string restrictionBase namespace:name (http://schemas.xmlsoap.org/soap/encoding/:Array) + * @param array elements = array ( name => array(name=>'',type=>'') ) + * @param array attrs = array(array('ref'=>'SOAP-ENC:arrayType','wsdl:arrayType'=>'xsd:string[]')) + * @param string arrayType: namespace:name (xsd:string) + * @see xmlschema + * @access public + */ + function addComplexType($name,$typeClass='complexType',$phpType='array',$compositor='',$restrictionBase='',$elements=array(),$attrs=array(),$arrayType='') { + if (count($elements) > 0) { + foreach($elements as $n => $e){ + // expand each element + foreach ($e as $k => $v) { + $k = strpos($k,':') ? $this->expandQname($k) : $k; + $v = strpos($v,':') ? $this->expandQname($v) : $v; + $ee[$k] = $v; + } + $eElements[$n] = $ee; + } + $elements = $eElements; + } + + if (count($attrs) > 0) { + foreach($attrs as $n => $a){ + // expand each attribute + foreach ($a as $k => $v) { + $k = strpos($k,':') ? $this->expandQname($k) : $k; + $v = strpos($v,':') ? $this->expandQname($v) : $v; + $aa[$k] = $v; + } + $eAttrs[$n] = $aa; + } + $attrs = $eAttrs; + } + + $restrictionBase = strpos($restrictionBase,':') ? $this->expandQname($restrictionBase) : $restrictionBase; + $arrayType = strpos($arrayType,':') ? $this->expandQname($arrayType) : $arrayType; + + $typens = isset($this->namespaces['types']) ? $this->namespaces['types'] : $this->namespaces['tns']; + $this->schemas[$typens][0]->addComplexType($name,$typeClass,$phpType,$compositor,$restrictionBase,$elements,$attrs,$arrayType); + } + + /** + * adds an XML Schema simple type to the WSDL types + * + * @param string $name + * @param string $restrictionBase namespace:name (http://schemas.xmlsoap.org/soap/encoding/:Array) + * @param string $typeClass (should always be simpleType) + * @param string $phpType (should always be scalar) + * @param array $enumeration array of values + * @see xmlschema + * @access public + */ + function addSimpleType($name, $restrictionBase='', $typeClass='simpleType', $phpType='scalar', $enumeration=array()) { + $restrictionBase = strpos($restrictionBase,':') ? $this->expandQname($restrictionBase) : $restrictionBase; + + $typens = isset($this->namespaces['types']) ? $this->namespaces['types'] : $this->namespaces['tns']; + $this->schemas[$typens][0]->addSimpleType($name, $restrictionBase, $typeClass, $phpType, $enumeration); + } + + /** + * adds an element to the WSDL types + * + * @param array $attrs attributes that must include name and type + * @see xmlschema + * @access public + */ + function addElement($attrs) { + $typens = isset($this->namespaces['types']) ? $this->namespaces['types'] : $this->namespaces['tns']; + $this->schemas[$typens][0]->addElement($attrs); + } + + /** + * register an operation with the server + * + * @param string $name operation (method) name + * @param array $in assoc array of input values: key = param name, value = param type + * @param array $out assoc array of output values: key = param name, value = param type + * @param string $namespace optional The namespace for the operation + * @param string $soapaction optional The soapaction for the operation + * @param string $style (rpc|document) optional The style for the operation Note: when 'document' is specified, parameter and return wrappers are created for you automatically + * @param string $use (encoded|literal) optional The use for the parameters (cannot mix right now) + * @param string $documentation optional The description to include in the WSDL + * @param string $encodingStyle optional (usually 'http://schemas.xmlsoap.org/soap/encoding/' for encoded) + * @access public + */ + function addOperation($name, $in = false, $out = false, $namespace = false, $soapaction = false, $style = 'rpc', $use = 'encoded', $documentation = '', $encodingStyle = ''){ + if ($use == 'encoded' && $encodingStyle == '') { + $encodingStyle = 'http://schemas.xmlsoap.org/soap/encoding/'; + } + + if ($style == 'document') { + $elements = array(); + foreach ($in as $n => $t) { + $elements[$n] = array('name' => $n, 'type' => $t); + } + $this->addComplexType($name . 'RequestType', 'complexType', 'struct', 'all', '', $elements); + $this->addElement(array('name' => $name, 'type' => $name . 'RequestType')); + $in = array('parameters' => 'tns:' . $name); + + $elements = array(); + foreach ($out as $n => $t) { + $elements[$n] = array('name' => $n, 'type' => $t); + } + $this->addComplexType($name . 'ResponseType', 'complexType', 'struct', 'all', '', $elements); + $this->addElement(array('name' => $name . 'Response', 'type' => $name . 'ResponseType')); + $out = array('parameters' => 'tns:' . $name . 'Response'); + } + + // get binding + $this->bindings[ $this->serviceName . 'Binding' ]['operations'][$name] = + array( + 'name' => $name, + 'binding' => $this->serviceName . 'Binding', + 'endpoint' => $this->endpoint, + 'soapAction' => $soapaction, + 'style' => $style, + 'input' => array( + 'use' => $use, + 'namespace' => $namespace, + 'encodingStyle' => $encodingStyle, + 'message' => $name . 'Request', + 'parts' => $in), + 'output' => array( + 'use' => $use, + 'namespace' => $namespace, + 'encodingStyle' => $encodingStyle, + 'message' => $name . 'Response', + 'parts' => $out), + 'namespace' => $namespace, + 'transport' => 'http://schemas.xmlsoap.org/soap/http', + 'documentation' => $documentation); + // add portTypes + // add messages + if($in) + { + foreach($in as $pName => $pType) + { + if(strpos($pType,':')) { + $pType = $this->getNamespaceFromPrefix($this->getPrefix($pType)).":".$this->getLocalPart($pType); + } + $this->messages[$name.'Request'][$pName] = $pType; + } + } else { + $this->messages[$name.'Request']= '0'; + } + if($out) + { + foreach($out as $pName => $pType) + { + if(strpos($pType,':')) { + $pType = $this->getNamespaceFromPrefix($this->getPrefix($pType)).":".$this->getLocalPart($pType); + } + $this->messages[$name.'Response'][$pName] = $pType; + } + } else { + $this->messages[$name.'Response']= '0'; + } + return true; + } +} +?> +* @version $Id: nusoap.php,v 1.94 2005/08/04 01:27:42 snichol Exp $ +* @access public +*/ +class soap_parser_colosa extends nusoap_base_colosa { + + var $xml = ''; + var $xml_encoding = ''; + var $method = ''; + var $root_struct = ''; + var $root_struct_name = ''; + var $root_struct_namespace = ''; + var $root_header = ''; + var $document = ''; // incoming SOAP body (text) + // determines where in the message we are (envelope,header,body,method) + var $status = ''; + var $position = 0; + var $depth = 0; + var $default_namespace = ''; + var $namespaces = array(); + var $message = array(); + var $parent = ''; + var $fault = false; + var $fault_code = ''; + var $fault_str = ''; + var $fault_detail = ''; + var $depth_array = array(); + var $debug_flag = true; + var $soapresponse = NULL; + var $responseHeaders = ''; // incoming SOAP headers (text) + var $body_position = 0; + // for multiref parsing: + // array of id => pos + var $ids = array(); + // array of id => hrefs => pos + var $multirefs = array(); + // toggle for auto-decoding element content + var $decode_utf8 = true; + + /** + * constructor that actually does the parsing + * + * @param string $xml SOAP message + * @param string $encoding character encoding scheme of message + * @param string $method method for which XML is parsed (unused?) + * @param string $decode_utf8 whether to decode UTF-8 to ISO-8859-1 + * @access public + */ + function soap_parser_colosa($xml,$encoding='UTF-8',$method='',$decode_utf8=true){ + parent::nusoap_base_colosa(); + $this->xml = $xml; + $this->xml_encoding = $encoding; + $this->method = $method; + $this->decode_utf8 = $decode_utf8; + + // Check whether content has been read. + if(!empty($xml)){ + // Check XML encoding + $pos_xml = strpos($xml, '', $pos_xml + 2) - $pos_xml + 1); + if (preg_match("/encoding=[\"']([^\"']*)[\"']/", $xml_decl, $res)) { + $xml_encoding = $res[1]; + if (strtoupper($xml_encoding) != $encoding) { + $err = "Charset from HTTP Content-Type '" . $encoding . "' does not match encoding from XML declaration '" . $xml_encoding . "'"; + $this->debug($err); + if ($encoding != 'ISO-8859-1' || strtoupper($xml_encoding) != 'UTF-8') { + $this->setError($err); + return; + } + // when HTTP says ISO-8859-1 (the default) and XML says UTF-8 (the typical), assume the other endpoint is just sloppy and proceed + } else { + $this->debug('Charset from HTTP Content-Type matches encoding from XML declaration'); + } + } else { + $this->debug('No encoding specified in XML declaration'); + } + } else { + $this->debug('No XML declaration'); + } + $this->debug('Entering soap_parser(), length='.strlen($xml).', encoding='.$encoding); + // Create an XML parser - why not xml_parser_create_ns? + $this->parser = xml_parser_create($this->xml_encoding); + // Set the options for parsing the XML data. + //xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1); + xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, 0); + xml_parser_set_option($this->parser, XML_OPTION_TARGET_ENCODING, $this->xml_encoding); + // Set the object for the parser. + xml_set_object($this->parser, $this); + // Set the element handlers for the parser. + xml_set_element_handler($this->parser, 'start_element','end_element'); + xml_set_character_data_handler($this->parser,'character_data'); + + // Parse the XML file. + if(!xml_parse($this->parser,$xml,true)){ + // Display an error message. + $err = sprintf('XML error parsing SOAP payload on line %d: %s', + xml_get_current_line_number($this->parser), + xml_error_string(xml_get_error_code($this->parser))); + $this->debug($err); + $this->debug("XML payload:\n" . $xml); + $this->setError($err); + } else { + $this->debug('parsed successfully, found root struct: '.$this->root_struct.' of name '.$this->root_struct_name); + // get final value + $this->soapresponse = $this->message[$this->root_struct]['result']; + // get header value: no, because this is documented as XML string +// if($this->root_header != '' && isset($this->message[$this->root_header]['result'])){ +// $this->responseHeaders = $this->message[$this->root_header]['result']; +// } + // resolve hrefs/ids + if(sizeof($this->multirefs) > 0){ + foreach($this->multirefs as $id => $hrefs){ + $this->debug('resolving multirefs for id: '.$id); + $idVal = $this->buildVal($this->ids[$id]); + if (is_array($idVal) && isset($idVal['!id'])) { + unset($idVal['!id']); + } + foreach($hrefs as $refPos => $ref){ + $this->debug('resolving href at pos '.$refPos); + $this->multirefs[$id][$refPos] = $idVal; + } + } + } + } + xml_parser_free($this->parser); + } else { + $this->debug('xml was empty, didn\'t parse!'); + $this->setError('xml was empty, didn\'t parse!'); + } + } + + /** + * start-element handler + * + * @param resource $parser XML parser object + * @param string $name element name + * @param array $attrs associative array of attributes + * @access private + */ + function start_element($parser, $name, $attrs) { + // position in a total number of elements, starting from 0 + // update class level pos + $pos = $this->position++; + // and set mine + $this->message[$pos] = array('pos' => $pos,'children'=>'','cdata'=>''); + // depth = how many levels removed from root? + // set mine as current global depth and increment global depth value + $this->message[$pos]['depth'] = $this->depth++; + + // else add self as child to whoever the current parent is + if($pos != 0){ + $this->message[$this->parent]['children'] .= '|'.$pos; + } + // set my parent + $this->message[$pos]['parent'] = $this->parent; + // set self as current parent + $this->parent = $pos; + // set self as current value for this depth + $this->depth_array[$this->depth] = $pos; + // get element prefix + if(strpos($name,':')){ + // get ns prefix + $prefix = substr($name,0,strpos($name,':')); + // get unqualified name + $name = substr(strstr($name,':'),1); + } + // set status + if($name == 'Envelope'){ + $this->status = 'envelope'; + } elseif($name == 'Header'){ + $this->root_header = $pos; + $this->status = 'header'; + } elseif($name == 'Body'){ + $this->status = 'body'; + $this->body_position = $pos; + // set method + } elseif($this->status == 'body' && $pos == ($this->body_position+1)){ + $this->status = 'method'; + $this->root_struct_name = $name; + $this->root_struct = $pos; + $this->message[$pos]['type'] = 'struct'; + $this->debug("found root struct $this->root_struct_name, pos $this->root_struct"); + } + // set my status + $this->message[$pos]['status'] = $this->status; + // set name + $this->message[$pos]['name'] = htmlspecialchars($name); + // set attrs + $this->message[$pos]['attrs'] = $attrs; + + // loop through atts, logging ns and type declarations + $attstr = ''; + foreach($attrs as $key => $value){ + $key_prefix = $this->getPrefix($key); + $key_localpart = $this->getLocalPart($key); + // if ns declarations, add to class level array of valid namespaces + if($key_prefix == 'xmlns'){ + if(ereg('^http://www.w3.org/[0-9]{4}/XMLSchema$',$value)){ + $this->XMLSchemaVersion = $value; + $this->namespaces['xsd'] = $this->XMLSchemaVersion; + $this->namespaces['xsi'] = $this->XMLSchemaVersion.'-instance'; + } + $this->namespaces[$key_localpart] = $value; + // set method namespace + if($name == $this->root_struct_name){ + $this->methodNamespace = $value; + } + // if it's a type declaration, set type + } elseif($key_localpart == 'type'){ + $value_prefix = $this->getPrefix($value); + $value_localpart = $this->getLocalPart($value); + $this->message[$pos]['type'] = $value_localpart; + $this->message[$pos]['typePrefix'] = $value_prefix; + if(isset($this->namespaces[$value_prefix])){ + $this->message[$pos]['type_namespace'] = $this->namespaces[$value_prefix]; + } else if(isset($attrs['xmlns:'.$value_prefix])) { + $this->message[$pos]['type_namespace'] = $attrs['xmlns:'.$value_prefix]; + } + // should do something here with the namespace of specified type? + } elseif($key_localpart == 'arrayType'){ + $this->message[$pos]['type'] = 'array'; + /* do arrayType ereg here + [1] arrayTypeValue ::= atype asize + [2] atype ::= QName rank* + [3] rank ::= '[' (',')* ']' + [4] asize ::= '[' length~ ']' + [5] length ::= nextDimension* Digit+ + [6] nextDimension ::= Digit+ ',' + */ + $expr = '([A-Za-z0-9_]+):([A-Za-z]+[A-Za-z0-9_]+)\[([0-9]+),?([0-9]*)\]'; + if(ereg($expr,$value,$regs)){ + $this->message[$pos]['typePrefix'] = $regs[1]; + $this->message[$pos]['arrayTypePrefix'] = $regs[1]; + if (isset($this->namespaces[$regs[1]])) { + $this->message[$pos]['arrayTypeNamespace'] = $this->namespaces[$regs[1]]; + } else if (isset($attrs['xmlns:'.$regs[1]])) { + $this->message[$pos]['arrayTypeNamespace'] = $attrs['xmlns:'.$regs[1]]; + } + $this->message[$pos]['arrayType'] = $regs[2]; + $this->message[$pos]['arraySize'] = $regs[3]; + $this->message[$pos]['arrayCols'] = $regs[4]; + } + // specifies nil value (or not) + } elseif ($key_localpart == 'nil'){ + $this->message[$pos]['nil'] = ($value == 'true' || $value == '1'); + // some other attribute + } elseif ($key != 'href' && $key != 'xmlns' && $key_localpart != 'encodingStyle' && $key_localpart != 'root') { + $this->message[$pos]['xattrs']['!' . $key] = $value; + } + + if ($key == 'xmlns') { + $this->default_namespace = $value; + } + // log id + if($key == 'id'){ + $this->ids[$value] = $pos; + } + // root + if($key_localpart == 'root' && $value == 1){ + $this->status = 'method'; + $this->root_struct_name = $name; + $this->root_struct = $pos; + $this->debug("found root struct $this->root_struct_name, pos $pos"); + } + // for doclit + $attstr .= " $key=\"$value\""; + } + // get namespace - must be done after namespace atts are processed + if(isset($prefix)){ + $this->message[$pos]['namespace'] = $this->namespaces[$prefix]; + $this->default_namespace = $this->namespaces[$prefix]; + } else { + $this->message[$pos]['namespace'] = $this->default_namespace; + } + if($this->status == 'header'){ + if ($this->root_header != $pos) { + $this->responseHeaders .= "<" . (isset($prefix) ? $prefix . ':' : '') . "$name$attstr>"; + } + } elseif($this->root_struct_name != ''){ + $this->document .= "<" . (isset($prefix) ? $prefix . ':' : '') . "$name$attstr>"; + } + } + + /** + * end-element handler + * + * @param resource $parser XML parser object + * @param string $name element name + * @access private + */ + function end_element($parser, $name) { + // position of current element is equal to the last value left in depth_array for my depth + $pos = $this->depth_array[$this->depth--]; + + // get element prefix + if(strpos($name,':')){ + // get ns prefix + $prefix = substr($name,0,strpos($name,':')); + // get unqualified name + $name = substr(strstr($name,':'),1); + } + + // build to native type + if(isset($this->body_position) && $pos > $this->body_position){ + // deal w/ multirefs + if(isset($this->message[$pos]['attrs']['href'])){ + // get id + $id = substr($this->message[$pos]['attrs']['href'],1); + // add placeholder to href array + $this->multirefs[$id][$pos] = 'placeholder'; + // add set a reference to it as the result value + $this->message[$pos]['result'] =& $this->multirefs[$id][$pos]; + // build complexType values + } elseif($this->message[$pos]['children'] != ''){ + // if result has already been generated (struct/array) + if(!isset($this->message[$pos]['result'])){ + $this->message[$pos]['result'] = $this->buildVal($pos); + } + // build complexType values of attributes and possibly simpleContent + } elseif (isset($this->message[$pos]['xattrs'])) { + if (isset($this->message[$pos]['nil']) && $this->message[$pos]['nil']) { + $this->message[$pos]['xattrs']['!'] = null; + } elseif (isset($this->message[$pos]['cdata']) && trim($this->message[$pos]['cdata']) != '') { + if (isset($this->message[$pos]['type'])) { + $this->message[$pos]['xattrs']['!'] = $this->decodeSimple($this->message[$pos]['cdata'], $this->message[$pos]['type'], isset($this->message[$pos]['type_namespace']) ? $this->message[$pos]['type_namespace'] : ''); + } else { + $parent = $this->message[$pos]['parent']; + if (isset($this->message[$parent]['type']) && ($this->message[$parent]['type'] == 'array') && isset($this->message[$parent]['arrayType'])) { + $this->message[$pos]['xattrs']['!'] = $this->decodeSimple($this->message[$pos]['cdata'], $this->message[$parent]['arrayType'], isset($this->message[$parent]['arrayTypeNamespace']) ? $this->message[$parent]['arrayTypeNamespace'] : ''); + } else { + $this->message[$pos]['xattrs']['!'] = $this->message[$pos]['cdata']; + } + } + } + $this->message[$pos]['result'] = $this->message[$pos]['xattrs']; + // set value of simpleType (or nil complexType) + } else { + //$this->debug('adding data for scalar value '.$this->message[$pos]['name'].' of value '.$this->message[$pos]['cdata']); + if (isset($this->message[$pos]['nil']) && $this->message[$pos]['nil']) { + $this->message[$pos]['xattrs']['!'] = null; + } elseif (isset($this->message[$pos]['type'])) { + $this->message[$pos]['result'] = $this->decodeSimple($this->message[$pos]['cdata'], $this->message[$pos]['type'], isset($this->message[$pos]['type_namespace']) ? $this->message[$pos]['type_namespace'] : ''); + } else { + $parent = $this->message[$pos]['parent']; + if (isset($this->message[$parent]['type']) && ($this->message[$parent]['type'] == 'array') && isset($this->message[$parent]['arrayType'])) { + $this->message[$pos]['result'] = $this->decodeSimple($this->message[$pos]['cdata'], $this->message[$parent]['arrayType'], isset($this->message[$parent]['arrayTypeNamespace']) ? $this->message[$parent]['arrayTypeNamespace'] : ''); + } else { + $this->message[$pos]['result'] = $this->message[$pos]['cdata']; + } + } + + /* add value to parent's result, if parent is struct/array + $parent = $this->message[$pos]['parent']; + if($this->message[$parent]['type'] != 'map'){ + if(strtolower($this->message[$parent]['type']) == 'array'){ + $this->message[$parent]['result'][] = $this->message[$pos]['result']; + } else { + $this->message[$parent]['result'][$this->message[$pos]['name']] = $this->message[$pos]['result']; + } + } + */ + } + } + + // for doclit + if($this->status == 'header'){ + if ($this->root_header != $pos) { + $this->responseHeaders .= ""; + } + } elseif($pos >= $this->root_struct){ + $this->document .= ""; + } + // switch status + if($pos == $this->root_struct){ + $this->status = 'body'; + $this->root_struct_namespace = $this->message[$pos]['namespace']; + } elseif($name == 'Body'){ + $this->status = 'envelope'; + } elseif($name == 'Header'){ + $this->status = 'envelope'; + } elseif($name == 'Envelope'){ + // + } + // set parent back to my parent + $this->parent = $this->message[$pos]['parent']; + } + + /** + * element content handler + * + * @param resource $parser XML parser object + * @param string $data element content + * @access private + */ + function character_data($parser, $data){ + $pos = $this->depth_array[$this->depth]; + if ($this->xml_encoding=='UTF-8'){ + // TODO: add an option to disable this for folks who want + // raw UTF-8 that, e.g., might not map to iso-8859-1 + // TODO: this can also be handled with xml_parser_set_option($this->parser, XML_OPTION_TARGET_ENCODING, "ISO-8859-1"); + if($this->decode_utf8){ + $data = utf8_decode($data); + } + } + $this->message[$pos]['cdata'] .= $data; + // for doclit + if($this->status == 'header'){ + $this->responseHeaders .= $data; + } else { + $this->document .= $data; + } + } + + /** + * get the parsed message + * + * @return mixed + * @access public + */ + function get_response(){ + return $this->soapresponse; + } + + /** + * get the parsed headers + * + * @return string XML or empty if no headers + * @access public + */ + function getHeaders(){ + return $this->responseHeaders; + } + + /** + * decodes simple types into PHP variables + * + * @param string $value value to decode + * @param string $type XML type to decode + * @param string $typens XML type namespace to decode + * @return mixed PHP value + * @access private + */ + function decodeSimple($value, $type, $typens) { + // TODO: use the namespace! + if ((!isset($type)) || $type == 'string' || $type == 'long' || $type == 'unsignedLong') { + return (string) $value; + } + if ($type == 'int' || $type == 'integer' || $type == 'short' || $type == 'byte') { + return (int) $value; + } + if ($type == 'float' || $type == 'double' || $type == 'decimal') { + return (double) $value; + } + if ($type == 'boolean') { + if (strtolower($value) == 'false' || strtolower($value) == 'f') { + return false; + } + return (boolean) $value; + } + if ($type == 'base64' || $type == 'base64Binary') { + $this->debug('Decode base64 value'); + return base64_decode($value); + } + // obscure numeric types + if ($type == 'nonPositiveInteger' || $type == 'negativeInteger' + || $type == 'nonNegativeInteger' || $type == 'positiveInteger' + || $type == 'unsignedInt' + || $type == 'unsignedShort' || $type == 'unsignedByte') { + return (int) $value; + } + // bogus: parser treats array with no elements as a simple type + if ($type == 'array') { + return array(); + } + // everything else + return (string) $value; + } + + /** + * builds response structures for compound values (arrays/structs) + * and scalars + * + * @param integer $pos position in node tree + * @return mixed PHP value + * @access private + */ + function buildVal($pos){ + if(!isset($this->message[$pos]['type'])){ + $this->message[$pos]['type'] = ''; + } + $this->debug('in buildVal() for '.$this->message[$pos]['name']."(pos $pos) of type ".$this->message[$pos]['type']); + // if there are children... + if($this->message[$pos]['children'] != ''){ + $this->debug('in buildVal, there are children'); + $children = explode('|',$this->message[$pos]['children']); + array_shift($children); // knock off empty + // md array + if(isset($this->message[$pos]['arrayCols']) && $this->message[$pos]['arrayCols'] != ''){ + $r=0; // rowcount + $c=0; // colcount + foreach($children as $child_pos){ + $this->debug("in buildVal, got an MD array element: $r, $c"); + $params[$r][] = $this->message[$child_pos]['result']; + $c++; + if($c == $this->message[$pos]['arrayCols']){ + $c = 0; + $r++; + } + } + // array + } elseif($this->message[$pos]['type'] == 'array' || $this->message[$pos]['type'] == 'Array'){ + $this->debug('in buildVal, adding array '.$this->message[$pos]['name']); + foreach($children as $child_pos){ + $params[] = &$this->message[$child_pos]['result']; + } + // apache Map type: java hashtable + } elseif($this->message[$pos]['type'] == 'Map' && $this->message[$pos]['type_namespace'] == 'http://xml.apache.org/xml-soap'){ + $this->debug('in buildVal, Java Map '.$this->message[$pos]['name']); + foreach($children as $child_pos){ + $kv = explode("|",$this->message[$child_pos]['children']); + $params[$this->message[$kv[1]]['result']] = &$this->message[$kv[2]]['result']; + } + // generic compound type + //} elseif($this->message[$pos]['type'] == 'SOAPStruct' || $this->message[$pos]['type'] == 'struct') { + } else { + // Apache Vector type: treat as an array + $this->debug('in buildVal, adding Java Vector '.$this->message[$pos]['name']); + if ($this->message[$pos]['type'] == 'Vector' && $this->message[$pos]['type_namespace'] == 'http://xml.apache.org/xml-soap') { + $notstruct = 1; + } else { + $notstruct = 0; + } + // + foreach($children as $child_pos){ + if($notstruct){ + $params[] = &$this->message[$child_pos]['result']; + } else { + if (isset($params[$this->message[$child_pos]['name']])) { + // de-serialize repeated element name into an array + if ((!is_array($params[$this->message[$child_pos]['name']])) || (!isset($params[$this->message[$child_pos]['name']][0]))) { + $params[$this->message[$child_pos]['name']] = array($params[$this->message[$child_pos]['name']]); + } + $params[$this->message[$child_pos]['name']][] = &$this->message[$child_pos]['result']; + } else { + $params[$this->message[$child_pos]['name']] = &$this->message[$child_pos]['result']; + } + } + } + } + if (isset($this->message[$pos]['xattrs'])) { + $this->debug('in buildVal, handling attributes'); + foreach ($this->message[$pos]['xattrs'] as $n => $v) { + $params[$n] = $v; + } + } + // handle simpleContent + if (isset($this->message[$pos]['cdata']) && trim($this->message[$pos]['cdata']) != '') { + $this->debug('in buildVal, handling simpleContent'); + if (isset($this->message[$pos]['type'])) { + $params['!'] = $this->decodeSimple($this->message[$pos]['cdata'], $this->message[$pos]['type'], isset($this->message[$pos]['type_namespace']) ? $this->message[$pos]['type_namespace'] : ''); + } else { + $parent = $this->message[$pos]['parent']; + if (isset($this->message[$parent]['type']) && ($this->message[$parent]['type'] == 'array') && isset($this->message[$parent]['arrayType'])) { + $params['!'] = $this->decodeSimple($this->message[$pos]['cdata'], $this->message[$parent]['arrayType'], isset($this->message[$parent]['arrayTypeNamespace']) ? $this->message[$parent]['arrayTypeNamespace'] : ''); + } else { + $params['!'] = $this->message[$pos]['cdata']; + } + } + } + return is_array($params) ? $params : array(); + } else { + $this->debug('in buildVal, no children, building scalar'); + $cdata = isset($this->message[$pos]['cdata']) ? $this->message[$pos]['cdata'] : ''; + if (isset($this->message[$pos]['type'])) { + return $this->decodeSimple($cdata, $this->message[$pos]['type'], isset($this->message[$pos]['type_namespace']) ? $this->message[$pos]['type_namespace'] : ''); + } + $parent = $this->message[$pos]['parent']; + if (isset($this->message[$parent]['type']) && ($this->message[$parent]['type'] == 'array') && isset($this->message[$parent]['arrayType'])) { + return $this->decodeSimple($cdata, $this->message[$parent]['arrayType'], isset($this->message[$parent]['arrayTypeNamespace']) ? $this->message[$parent]['arrayTypeNamespace'] : ''); + } + return $this->message[$pos]['cdata']; + } + } +} + + + +?>call( string methodname [ ,array parameters] ); +* +* // bye bye client +* unset($soapclient); +* +* @author Dietrich Ayala +* @version $Id: nusoap.php,v 1.94 2005/08/04 01:27:42 snichol Exp $ +* @access public +*/ +class soapclient_colosa extends nusoap_base_colosa { + + var $username = ''; + var $password = ''; + var $authtype = ''; + var $certRequest = array(); + var $requestHeaders = false; // SOAP headers in request (text) + var $responseHeaders = ''; // SOAP headers from response (incomplete namespace resolution) (text) + var $document = ''; // SOAP body response portion (incomplete namespace resolution) (text) + var $endpoint; + var $forceEndpoint = ''; // overrides WSDL endpoint + var $proxyhost = ''; + var $proxyport = ''; + var $proxyusername = ''; + var $proxypassword = ''; + var $xml_encoding = ''; // character set encoding of incoming (response) messages + var $http_encoding = false; + var $timeout = 0; // HTTP connection timeout + var $response_timeout = 30; // HTTP response timeout + var $endpointType = ''; // soap|wsdl, empty for WSDL initialization error + var $persistentConnection = false; + var $defaultRpcParams = false; // This is no longer used + var $request = ''; // HTTP request + var $response = ''; // HTTP response + var $responseData = ''; // SOAP payload of response + var $cookies = array(); // Cookies from response or for request + var $decode_utf8 = true; // toggles whether the parser decodes element content w/ utf8_decode() + var $operations = array(); // WSDL operations, empty for WSDL initialization error + + /* + * fault related variables + */ + /** + * @var fault + * @access public + */ + var $fault; + /** + * @var faultcode + * @access public + */ + var $faultcode; + /** + * @var faultstring + * @access public + */ + var $faultstring; + /** + * @var faultdetail + * @access public + */ + var $faultdetail; + + /** + * constructor + * + * @param mixed $endpoint SOAP server or WSDL URL (string), or wsdl instance (object) + * @param bool $wsdl optional, set to true if using WSDL + * @param int $portName optional portName in WSDL document + * @param string $proxyhost + * @param string $proxyport + * @param string $proxyusername + * @param string $proxypassword + * @param integer $timeout set the connection timeout + * @param integer $response_timeout set the response timeout + * @access public + */ + function soapclient_colosa($endpoint,$wsdl = false,$proxyhost = false,$proxyport = false,$proxyusername = false, $proxypassword = false, $timeout = 0, $response_timeout = 30){ + parent::nusoap_base_colosa(); + $this->endpoint = $endpoint; + $this->proxyhost = $proxyhost; + $this->proxyport = $proxyport; + $this->proxyusername = $proxyusername; + $this->proxypassword = $proxypassword; + $this->timeout = $timeout; + $this->response_timeout = $response_timeout; + + // make values + if($wsdl){ + if (is_object($endpoint) && (get_class($endpoint) == 'wsdl')) { + $this->wsdl = $endpoint; + $this->endpoint = $this->wsdl->wsdl; + $this->wsdlFile = $this->endpoint; + $this->debug('existing wsdl instance created from ' . $this->endpoint); + } else { + $this->wsdlFile = $this->endpoint; + + // instantiate wsdl object and parse wsdl file + $this->debug('instantiating wsdl class with doc: '.$endpoint); + $this->wsdl =& new wsdl($this->wsdlFile,$this->proxyhost,$this->proxyport,$this->proxyusername,$this->proxypassword,$this->timeout,$this->response_timeout); + } + $this->appendDebug($this->wsdl->getDebug()); + $this->wsdl->clearDebug(); + // catch errors + if($errstr = $this->wsdl->getError()){ + $this->debug('got wsdl error: '.$errstr); + $this->setError('wsdl error: '.$errstr); + } elseif($this->operations = $this->wsdl->getOperations()){ + $this->debug( 'got '.count($this->operations).' operations from wsdl '.$this->wsdlFile); + $this->endpointType = 'wsdl'; + } else { + $this->debug( 'getOperations returned false'); + $this->setError('no operations defined in the WSDL document!'); + } + } else { + $this->debug("instantiate SOAP with endpoint at $endpoint"); + $this->endpointType = 'soap'; + } + } + + /** + * calls method, returns PHP native type + * + * @param string $method SOAP server URL or path + * @param mixed $params An array, associative or simple, of the parameters + * for the method call, or a string that is the XML + * for the call. For rpc style, this call will + * wrap the XML in a tag named after the method, as + * well as the SOAP Envelope and Body. For document + * style, this will only wrap with the Envelope and Body. + * IMPORTANT: when using an array with document style, + * in which case there + * is really one parameter, the root of the fragment + * used in the call, which encloses what programmers + * normally think of parameters. A parameter array + * *must* include the wrapper. + * @param string $namespace optional method namespace (WSDL can override) + * @param string $soapAction optional SOAPAction value (WSDL can override) + * @param mixed $headers optional string of XML with SOAP header content, or array of soapval objects for SOAP headers + * @param boolean $rpcParams optional (no longer used) + * @param string $style optional (rpc|document) the style to use when serializing parameters (WSDL can override) + * @param string $use optional (encoded|literal) the use when serializing parameters (WSDL can override) + * @return mixed response from SOAP call + * @access public + */ + function call($operation,$params=array(),$namespace='http://tempuri.org',$soapAction='',$headers=false,$rpcParams=null,$style='rpc',$use='encoded'){ + $this->operation = $operation; + $this->fault = false; + $this->setError(''); + $this->request = ''; + $this->response = ''; + $this->responseData = ''; + $this->faultstring = ''; + $this->faultcode = ''; + $this->opData = array(); + + $this->debug("call: operation=$operation, namespace=$namespace, soapAction=$soapAction, rpcParams=$rpcParams, style=$style, use=$use, endpointType=$this->endpointType"); + $this->appendDebug('params=' . $this->varDump($params)); + $this->appendDebug('headers=' . $this->varDump($headers)); + if ($headers) { + $this->requestHeaders = $headers; + } + // serialize parameters + if($this->endpointType == 'wsdl' && $opData = $this->getOperationData($operation)){ + // use WSDL for operation + $this->opData = $opData; + $this->debug("found operation"); + $this->appendDebug('opData=' . $this->varDump($opData)); + if (isset($opData['soapAction'])) { + $soapAction = $opData['soapAction']; + } + if (! $this->forceEndpoint) { + $this->endpoint = $opData['endpoint']; + } else { + $this->endpoint = $this->forceEndpoint; + } + $namespace = isset($opData['input']['namespace']) ? $opData['input']['namespace'] : $namespace; + $style = $opData['style']; + $use = $opData['input']['use']; + // add ns to ns array + if($namespace != '' && !isset($this->wsdl->namespaces[$namespace])){ + $nsPrefix = 'ns' . rand(1000, 9999); + $this->wsdl->namespaces[$nsPrefix] = $namespace; + } + $nsPrefix = $this->wsdl->getPrefixFromNamespace($namespace); + // serialize payload + if (is_string($params)) { + $this->debug("serializing param string for WSDL operation $operation"); + $payload = $params; + } elseif (is_array($params)) { + $this->debug("serializing param array for WSDL operation $operation"); + $payload = $this->wsdl->serializeRPCParameters($operation,'input',$params); + } else { + $this->debug('params must be array or string'); + $this->setError('params must be array or string'); + return false; + } + $usedNamespaces = $this->wsdl->usedNamespaces; + if (isset($opData['input']['encodingStyle'])) { + $encodingStyle = $opData['input']['encodingStyle']; + } else { + $encodingStyle = ''; + } + $this->appendDebug($this->wsdl->getDebug()); + $this->wsdl->clearDebug(); + if ($errstr = $this->wsdl->getError()) { + $this->debug('got wsdl error: '.$errstr); + $this->setError('wsdl error: '.$errstr); + return false; + } + } elseif($this->endpointType == 'wsdl') { + // operation not in WSDL + $this->appendDebug($this->wsdl->getDebug()); + $this->wsdl->clearDebug(); + $this->setError( 'operation '.$operation.' not present.'); + $this->debug("operation '$operation' not present."); + return false; + } else { + // no WSDL + //$this->namespaces['ns1'] = $namespace; + $nsPrefix = 'ns' . rand(1000, 9999); + // serialize + $payload = ''; + if (is_string($params)) { + $this->debug("serializing param string for operation $operation"); + $payload = $params; + } elseif (is_array($params)) { + $this->debug("serializing param array for operation $operation"); + foreach($params as $k => $v){ + $payload .= $this->serialize_val($v,$k,false,false,false,false,$use); + } + } else { + $this->debug('params must be array or string'); + $this->setError('params must be array or string'); + return false; + } + $usedNamespaces = array(); + if ($use == 'encoded') { + $encodingStyle = 'http://schemas.xmlsoap.org/soap/encoding/'; + } else { + $encodingStyle = ''; + } + } + // wrap RPC calls with method element + if ($style == 'rpc') { + if ($use == 'literal') { + $this->debug("wrapping RPC request with literal method element"); + if ($namespace) { + $payload = "<$operation xmlns=\"$namespace\">" . $payload . ""; + } else { + $payload = "<$operation>" . $payload . ""; + } + } else { + $this->debug("wrapping RPC request with encoded method element"); + if ($namespace) { + $payload = "<$nsPrefix:$operation xmlns:$nsPrefix=\"$namespace\">" . + $payload . + ""; + } else { + $payload = "<$operation>" . + $payload . + ""; + } + } + } + // serialize envelope + $soapmsg = $this->serializeEnvelope($payload,$this->requestHeaders,$usedNamespaces,$style,$use,$encodingStyle); + $this->debug("endpoint=$this->endpoint, soapAction=$soapAction, namespace=$namespace, style=$style, use=$use, encodingStyle=$encodingStyle"); + $this->debug('SOAP message length=' . strlen($soapmsg) . ' contents (max 1000 bytes)=' . substr($soapmsg, 0, 1000)); + // send + $return = $this->send($this->getHTTPBody($soapmsg),$soapAction,$this->timeout,$this->response_timeout); + if($errstr = $this->getError()){ + $this->debug('Error: '.$errstr); + return false; + } else { + $this->return = $return; + $this->debug('sent message successfully and got a(n) '.gettype($return)); + $this->appendDebug('return=' . $this->varDump($return)); + + // fault? + if(is_array($return) && isset($return['faultcode'])){ + $this->debug('got fault'); + $this->setError($return['faultcode'].': '.$return['faultstring']); + $this->fault = true; + foreach($return as $k => $v){ + $this->$k = $v; + $this->debug("$k = $v
    "); + } + return $return; + } elseif ($style == 'document') { + // NOTE: if the response is defined to have multiple parts (i.e. unwrapped), + // we are only going to return the first part here...sorry about that + return $return; + } else { + // array of return values + if(is_array($return)){ + // multiple 'out' parameters, which we return wrapped up + // in the array + if(sizeof($return) > 1){ + return $return; + } + // single 'out' parameter (normally the return value) + $return = array_shift($return); + $this->debug('return shifted value: '); + $this->appendDebug($this->varDump($return)); + return $return; + // nothing returned (ie, echoVoid) + } else { + return ""; + } + } + } + } + + /** + * get available data pertaining to an operation + * + * @param string $operation operation name + * @return array array of data pertaining to the operation + * @access public + */ + function getOperationData($operation){ + if(isset($this->operations[$operation])){ + return $this->operations[$operation]; + } + $this->debug("No data for operation: $operation"); + } + + /** + * send the SOAP message + * + * Note: if the operation has multiple return values + * the return value of this method will be an array + * of those values. + * + * @param string $msg a SOAPx4 soapmsg object + * @param string $soapaction SOAPAction value + * @param integer $timeout set connection timeout in seconds + * @param integer $response_timeout set response timeout in seconds + * @return mixed native PHP types. + * @access private + */ + function send($msg, $soapaction = '', $timeout=0, $response_timeout=30) { + $this->checkCookies(); + // detect transport + switch(true){ + // http(s) + case ereg('^http',$this->endpoint): + $this->debug('transporting via HTTP'); + if($this->persistentConnection == true && is_object($this->persistentConnection)){ + $http =& $this->persistentConnection; + } else { + $http = new soap_transport_http($this->endpoint); + if ($this->persistentConnection) { + $http->usePersistentConnection(); + } + } + $http->setContentType($this->getHTTPContentType(), $this->getHTTPContentTypeCharset()); + $http->setSOAPAction($soapaction); + if($this->proxyhost && $this->proxyport){ + $http->setProxy($this->proxyhost,$this->proxyport,$this->proxyusername,$this->proxypassword); + } + if($this->authtype != '') { + $http->setCredentials($this->username, $this->password, $this->authtype, array(), $this->certRequest); + } + if($this->http_encoding != ''){ + $http->setEncoding($this->http_encoding); + } + $this->debug('sending message, length='.strlen($msg)); + if(ereg('^http:',$this->endpoint)){ + //if(strpos($this->endpoint,'http:')){ + $this->responseData = $http->send($msg,$timeout,$response_timeout,$this->cookies); + } elseif(ereg('^https',$this->endpoint)){ + //} elseif(strpos($this->endpoint,'https:')){ + //if(phpversion() == '4.3.0-dev'){ + //$response = $http->send($msg,$timeout,$response_timeout); + //$this->request = $http->outgoing_payload; + //$this->response = $http->incoming_payload; + //} else + $this->responseData = $http->sendHTTPS($msg,$timeout,$response_timeout,$this->cookies); + } else { + $this->setError('no http/s in endpoint url'); + } + $this->request = $http->outgoing_payload; + $this->response = $http->incoming_payload; + $this->appendDebug($http->getDebug()); + $this->UpdateCookies($http->incoming_cookies); + + // save transport object if using persistent connections + if ($this->persistentConnection) { + $http->clearDebug(); + if (!is_object($this->persistentConnection)) { + $this->persistentConnection = $http; + } + } + + if($err = $http->getError()){ + $this->setError('HTTP Error: '.$err); + return false; + } elseif($this->getError()){ + return false; + } else { + $this->debug('got response, length='. strlen($this->responseData).' type='.$http->incoming_headers['content-type']); + return $this->parseResponse($http->incoming_headers, $this->responseData); + } + break; + default: + $this->setError('no transport found, or selected transport is not yet supported!'); + return false; + break; + } + } + + /** + * processes SOAP message returned from server + * + * @param array $headers The HTTP headers + * @param string $data unprocessed response data from server + * @return mixed value of the message, decoded into a PHP type + * @access private + */ + function parseResponse($headers, $data) { + $this->debug('Entering parseResponse() for data of length ' . strlen($data) . ' and type ' . $headers['content-type']); +//by onti +/* + if (!strstr($headers['content-type'], 'text/xml')) { + $this->setError('Response not of type text/xml'); + return false; + } + */ + if (strpos($headers['content-type'], '=')) { + $enc = str_replace('"', '', substr(strstr($headers["content-type"], '='), 1)); + $this->debug('Got response encoding: ' . $enc); + if(preg_match('/(ISO-8859-1|US-ASCII|UTF-8)/',$enc)){ + $this->xml_encoding = strtoupper($enc); + } else { + $this->xml_encoding = 'US-ASCII'; + } + } else { + // should be US-ASCII for HTTP 1.0 or ISO-8859-1 for HTTP 1.1 + $this->xml_encoding = 'ISO-8859-1'; + } + $this->debug('Use encoding: ' . $this->xml_encoding . ' when creating soap_parser'); + $parser = new soap_parser_colosa($data,$this->xml_encoding,$this->operation,$this->decode_utf8); + // add parser debug data to our debug + $this->appendDebug($parser->getDebug()); + // if parse errors + if($errstr = $parser->getError()){ + $this->setError( $errstr); + // destroy the parser object + unset($parser); + return false; + } else { + // get SOAP headers + $this->responseHeaders = $parser->getHeaders(); + // get decoded message + $return = $parser->get_response(); + // add document for doclit support + $this->document = $parser->document; + // destroy the parser object + unset($parser); + // return decode message + return $return; + } + } + + /** + * sets the SOAP endpoint, which can override WSDL + * + * @param $endpoint string The endpoint URL to use, or empty string or false to prevent override + * @access public + */ + function setEndpoint($endpoint) { + $this->forceEndpoint = $endpoint; + } + + /** + * set the SOAP headers + * + * @param $headers mixed String of XML with SOAP header content, or array of soapval objects for SOAP headers + * @access public + */ + function setHeaders($headers){ + $this->requestHeaders = $headers; + } + + /** + * get the SOAP response headers (namespace resolution incomplete) + * + * @return string + * @access public + */ + function getHeaders(){ + return $this->responseHeaders; + } + + /** + * set proxy info here + * + * @param string $proxyhost + * @param string $proxyport + * @param string $proxyusername + * @param string $proxypassword + * @access public + */ + function setHTTPProxy($proxyhost, $proxyport, $proxyusername = '', $proxypassword = '') { + $this->proxyhost = $proxyhost; + $this->proxyport = $proxyport; + $this->proxyusername = $proxyusername; + $this->proxypassword = $proxypassword; + } + + /** + * if authenticating, set user credentials here + * + * @param string $username + * @param string $password + * @param string $authtype (basic|digest|certificate) + * @param array $certRequest (keys must be cainfofile (optional), sslcertfile, sslkeyfile, passphrase, verifypeer (optional), verifyhost (optional): see corresponding options in cURL docs) + * @access public + */ + function setCredentials($username, $password, $authtype = 'basic', $certRequest = array()) { + $this->username = $username; + $this->password = $password; + $this->authtype = $authtype; + $this->certRequest = $certRequest; + } + + /** + * use HTTP encoding + * + * @param string $enc + * @access public + */ + function setHTTPEncoding($enc='gzip, deflate'){ + $this->http_encoding = $enc; + } + + /** + * use HTTP persistent connections if possible + * + * @access public + */ + function useHTTPPersistentConnection(){ + $this->persistentConnection = true; + } + + /** + * gets the default RPC parameter setting. + * If true, default is that call params are like RPC even for document style. + * Each call() can override this value. + * + * This is no longer used. + * + * @return boolean + * @access public + * @deprecated + */ + function getDefaultRpcParams() { + return $this->defaultRpcParams; + } + + /** + * sets the default RPC parameter setting. + * If true, default is that call params are like RPC even for document style + * Each call() can override this value. + * + * This is no longer used. + * + * @param boolean $rpcParams + * @access public + * @deprecated + */ + function setDefaultRpcParams($rpcParams) { + $this->defaultRpcParams = $rpcParams; + } + + /** + * dynamically creates an instance of a proxy class, + * allowing user to directly call methods from wsdl + * + * @return object soap_proxy object + * @access public + */ + function getProxy(){ + $r = rand(); + $evalStr = $this->_getProxyClassCode($r); + //$this->debug("proxy class: $evalStr"; + // eval the class + eval($evalStr); + // instantiate proxy object + eval("\$proxy = new soap_proxy_$r('');"); + // transfer current wsdl data to the proxy thereby avoiding parsing the wsdl twice + $proxy->endpointType = 'wsdl'; + $proxy->wsdlFile = $this->wsdlFile; + $proxy->wsdl = $this->wsdl; + $proxy->operations = $this->operations; + $proxy->defaultRpcParams = $this->defaultRpcParams; + // transfer other state + $proxy->username = $this->username; + $proxy->password = $this->password; + $proxy->authtype = $this->authtype; + $proxy->proxyhost = $this->proxyhost; + $proxy->proxyport = $this->proxyport; + $proxy->proxyusername = $this->proxyusername; + $proxy->proxypassword = $this->proxypassword; + $proxy->timeout = $this->timeout; + $proxy->response_timeout = $this->response_timeout; + $proxy->http_encoding = $this->http_encoding; + $proxy->persistentConnection = $this->persistentConnection; + $proxy->requestHeaders = $this->requestHeaders; + $proxy->soap_defencoding = $this->soap_defencoding; + $proxy->endpoint = $this->endpoint; + $proxy->forceEndpoint = $this->forceEndpoint; + return $proxy; + } + + /** + * dynamically creates proxy class code + * + * @return string PHP/NuSOAP code for the proxy class + * @access private + */ + function _getProxyClassCode($r) { + if ($this->endpointType != 'wsdl') { + $evalStr = 'A proxy can only be created for a WSDL client'; + $this->setError($evalStr); + return $evalStr; + } + $evalStr = ''; + foreach ($this->operations as $operation => $opData) { + if ($operation != '') { + // create param string and param comment string + if (sizeof($opData['input']['parts']) > 0) { + $paramStr = ''; + $paramArrayStr = ''; + $paramCommentStr = ''; + foreach ($opData['input']['parts'] as $name => $type) { + $paramStr .= "\$$name, "; + $paramArrayStr .= "'$name' => \$$name, "; + $paramCommentStr .= "$type \$$name, "; + } + $paramStr = substr($paramStr, 0, strlen($paramStr)-2); + $paramArrayStr = substr($paramArrayStr, 0, strlen($paramArrayStr)-2); + $paramCommentStr = substr($paramCommentStr, 0, strlen($paramCommentStr)-2); + } else { + $paramStr = ''; + $paramCommentStr = 'void'; + } + $opData['namespace'] = !isset($opData['namespace']) ? 'http://testuri.com' : $opData['namespace']; + $evalStr .= "// $paramCommentStr + function " . str_replace('.', '__', $operation) . "($paramStr) { + \$params = array($paramArrayStr); + return \$this->call('$operation', \$params, '".$opData['namespace']."', '".(isset($opData['soapAction']) ? $opData['soapAction'] : '')."'); + } + "; + unset($paramStr); + unset($paramCommentStr); + } + } + $evalStr = 'class soap_proxy_'.$r.' extends soapclient { + '.$evalStr.' +}'; + return $evalStr; + } + + /** + * dynamically creates proxy class code + * + * @return string PHP/NuSOAP code for the proxy class + * @access public + */ + function getProxyClassCode() { + $r = rand(); + return $this->_getProxyClassCode($r); + } + + /** + * gets the HTTP body for the current request. + * + * @param string $soapmsg The SOAP payload + * @return string The HTTP body, which includes the SOAP payload + * @access private + */ + function getHTTPBody($soapmsg) { + return $soapmsg; + } + + /** + * gets the HTTP content type for the current request. + * + * Note: getHTTPBody must be called before this. + * + * @return string the HTTP content type for the current request. + * @access private + */ + function getHTTPContentType() { + return 'text/xml'; + } + + /** + * gets the HTTP content type charset for the current request. + * returns false for non-text content types. + * + * Note: getHTTPBody must be called before this. + * + * @return string the HTTP content type charset for the current request. + * @access private + */ + function getHTTPContentTypeCharset() { + return $this->soap_defencoding; + } + + /* + * whether or not parser should decode utf8 element content + * + * @return always returns true + * @access public + */ + function decodeUTF8($bool){ + $this->decode_utf8 = $bool; + return true; + } + + /** + * adds a new Cookie into $this->cookies array + * + * @param string $name Cookie Name + * @param string $value Cookie Value + * @return if cookie-set was successful returns true, else false + * @access public + */ + function setCookie($name, $value) { + if (strlen($name) == 0) { + return false; + } + $this->cookies[] = array('name' => $name, 'value' => $value); + return true; + } + + /** + * gets all Cookies + * + * @return array with all internal cookies + * @access public + */ + function getCookies() { + return $this->cookies; + } + + /** + * checks all Cookies and delete those which are expired + * + * @return always return true + * @access private + */ + function checkCookies() { + if (sizeof($this->cookies) == 0) { + return true; + } + $this->debug('checkCookie: check ' . sizeof($this->cookies) . ' cookies'); + $curr_cookies = $this->cookies; + $this->cookies = array(); + foreach ($curr_cookies as $cookie) { + if (! is_array($cookie)) { + $this->debug('Remove cookie that is not an array'); + continue; + } + if ((isset($cookie['expires'])) && (! empty($cookie['expires']))) { + if (strtotime($cookie['expires']) > time()) { + $this->cookies[] = $cookie; + } else { + $this->debug('Remove expired cookie ' . $cookie['name']); + } + } else { + $this->cookies[] = $cookie; + } + } + $this->debug('checkCookie: '.sizeof($this->cookies).' cookies left in array'); + return true; + } + + /** + * updates the current cookies with a new set + * + * @param array $cookies new cookies with which to update current ones + * @return always return true + * @access private + */ + function UpdateCookies($cookies) { + if (sizeof($this->cookies) == 0) { + // no existing cookies: take whatever is new + if (sizeof($cookies) > 0) { + $this->debug('Setting new cookie(s)'); + $this->cookies = $cookies; + } + return true; + } + if (sizeof($cookies) == 0) { + // no new cookies: keep what we've got + return true; + } + // merge + foreach ($cookies as $newCookie) { + if (!is_array($newCookie)) { + continue; + } + if ((!isset($newCookie['name'])) || (!isset($newCookie['value']))) { + continue; + } + $newName = $newCookie['name']; + + $found = false; + for ($i = 0; $i < count($this->cookies); $i++) { + $cookie = $this->cookies[$i]; + if (!is_array($cookie)) { + continue; + } + if (!isset($cookie['name'])) { + continue; + } + if ($newName != $cookie['name']) { + continue; + } + $newDomain = isset($newCookie['domain']) ? $newCookie['domain'] : 'NODOMAIN'; + $domain = isset($cookie['domain']) ? $cookie['domain'] : 'NODOMAIN'; + if ($newDomain != $domain) { + continue; + } + $newPath = isset($newCookie['path']) ? $newCookie['path'] : 'NOPATH'; + $path = isset($cookie['path']) ? $cookie['path'] : 'NOPATH'; + if ($newPath != $path) { + continue; + } + $this->cookies[$i] = $newCookie; + $found = true; + $this->debug('Update cookie ' . $newName . '=' . $newCookie['value']); + break; + } + if (! $found) { + $this->debug('Add cookie ' . $newName . '=' . $newCookie['value']); + $this->cookies[] = $newCookie; + } + } + return true; + } +} +?> diff --git a/thirdparty/pear/nusoap.php b/thirdparty/pear/nusoap.php new file mode 100644 index 000000000..89dc51e11 --- /dev/null +++ b/thirdparty/pear/nusoap.php @@ -0,0 +1,7302 @@ +globalDebugLevel = 9; + +/** +* +* nusoap_base +* +* @author Dietrich Ayala +* @version $Id: nusoap.php,v 1.94 2005/08/04 01:27:42 snichol Exp $ +* @access public +*/ +class nusoap_base { + /** + * Identification for HTTP headers. + * + * @var string + * @access private + */ + var $title = 'NuSOAP'; + /** + * Version for HTTP headers. + * + * @var string + * @access private + */ + var $version = '0.7.2'; + /** + * CVS revision for HTTP headers. + * + * @var string + * @access private + */ + var $revision = '$Revision: 1.94 $'; + /** + * Current error string (manipulated by getError/setError) + * + * @var string + * @access private + */ + var $error_str = ''; + /** + * Current debug string (manipulated by debug/appendDebug/clearDebug/getDebug/getDebugAsXMLComment) + * + * @var string + * @access private + */ + var $debug_str = ''; + /** + * toggles automatic encoding of special characters as entities + * (should always be true, I think) + * + * @var boolean + * @access private + */ + var $charencoding = true; + /** + * the debug level for this instance + * + * @var integer + * @access private + */ + var $debugLevel; + + /** + * set schema version + * + * @var string + * @access public + */ + var $XMLSchemaVersion = 'http://www.w3.org/2001/XMLSchema'; + + /** + * charset encoding for outgoing messages + * + * @var string + * @access public + */ + var $soap_defencoding = 'ISO-8859-1'; + //var $soap_defencoding = 'UTF-8'; + + /** + * namespaces in an array of prefix => uri + * + * this is "seeded" by a set of constants, but it may be altered by code + * + * @var array + * @access public + */ + var $namespaces = array( + 'SOAP-ENV' => 'http://schemas.xmlsoap.org/soap/envelope/', + 'xsd' => 'http://www.w3.org/2001/XMLSchema', + 'xsi' => 'http://www.w3.org/2001/XMLSchema-instance', + 'SOAP-ENC' => 'http://schemas.xmlsoap.org/soap/encoding/' + ); + + /** + * namespaces used in the current context, e.g. during serialization + * + * @var array + * @access private + */ + var $usedNamespaces = array(); + + /** + * XML Schema types in an array of uri => (array of xml type => php type) + * is this legacy yet? + * no, this is used by the xmlschema class to verify type => namespace mappings. + * @var array + * @access public + */ + var $typemap = array( + 'http://www.w3.org/2001/XMLSchema' => array( + 'string'=>'string','boolean'=>'boolean','float'=>'double','double'=>'double','decimal'=>'double', + 'duration'=>'','dateTime'=>'string','time'=>'string','date'=>'string','gYearMonth'=>'', + 'gYear'=>'','gMonthDay'=>'','gDay'=>'','gMonth'=>'','hexBinary'=>'string','base64Binary'=>'string', + // abstract "any" types + 'anyType'=>'string','anySimpleType'=>'string', + // derived datatypes + 'normalizedString'=>'string','token'=>'string','language'=>'','NMTOKEN'=>'','NMTOKENS'=>'','Name'=>'','NCName'=>'','ID'=>'', + 'IDREF'=>'','IDREFS'=>'','ENTITY'=>'','ENTITIES'=>'','integer'=>'integer','nonPositiveInteger'=>'integer', + 'negativeInteger'=>'integer','long'=>'integer','int'=>'integer','short'=>'integer','byte'=>'integer','nonNegativeInteger'=>'integer', + 'unsignedLong'=>'','unsignedInt'=>'','unsignedShort'=>'','unsignedByte'=>'','positiveInteger'=>''), + 'http://www.w3.org/2000/10/XMLSchema' => array( + 'i4'=>'','int'=>'integer','boolean'=>'boolean','string'=>'string','double'=>'double', + 'float'=>'double','dateTime'=>'string', + 'timeInstant'=>'string','base64Binary'=>'string','base64'=>'string','ur-type'=>'array'), + 'http://www.w3.org/1999/XMLSchema' => array( + 'i4'=>'','int'=>'integer','boolean'=>'boolean','string'=>'string','double'=>'double', + 'float'=>'double','dateTime'=>'string', + 'timeInstant'=>'string','base64Binary'=>'string','base64'=>'string','ur-type'=>'array'), + 'http://soapinterop.org/xsd' => array('SOAPStruct'=>'struct'), + 'http://schemas.xmlsoap.org/soap/encoding/' => array('base64'=>'string','array'=>'array','Array'=>'array'), + 'http://xml.apache.org/xml-soap' => array('Map') + ); + + /** + * XML entities to convert + * + * @var array + * @access public + * @deprecated + * @see expandEntities + */ + var $xmlEntities = array('quot' => '"','amp' => '&', + 'lt' => '<','gt' => '>','apos' => "'"); + + /** + * constructor + * + * @access public + */ + function nusoap_base() { + $this->debugLevel = $GLOBALS['_transient']['static']['nusoap_base']->globalDebugLevel; + } + + /** + * gets the global debug level, which applies to future instances + * + * @return integer Debug level 0-9, where 0 turns off + * @access public + */ + function getGlobalDebugLevel() { + return $GLOBALS['_transient']['static']['nusoap_base']->globalDebugLevel; + } + + /** + * sets the global debug level, which applies to future instances + * + * @param int $level Debug level 0-9, where 0 turns off + * @access public + */ + function setGlobalDebugLevel($level) { + $GLOBALS['_transient']['static']['nusoap_base']->globalDebugLevel = $level; + } + + /** + * gets the debug level for this instance + * + * @return int Debug level 0-9, where 0 turns off + * @access public + */ + function getDebugLevel() { + return $this->debugLevel; + } + + /** + * sets the debug level for this instance + * + * @param int $level Debug level 0-9, where 0 turns off + * @access public + */ + function setDebugLevel($level) { + $this->debugLevel = $level; + } + + /** + * adds debug data to the instance debug string with formatting + * + * @param string $string debug data + * @access private + */ + function debug($string){ + if ($this->debugLevel > 0) { + $this->appendDebug($this->getmicrotime().' '.get_class($this).": $string\n"); + } + } + + /** + * adds debug data to the instance debug string without formatting + * + * @param string $string debug data + * @access public + */ + function appendDebug($string){ + if ($this->debugLevel > 0) { + // it would be nice to use a memory stream here to use + // memory more efficiently + $this->debug_str .= $string; + } + } + + /** + * clears the current debug data for this instance + * + * @access public + */ + function clearDebug() { + // it would be nice to use a memory stream here to use + // memory more efficiently + $this->debug_str = ''; + } + + /** + * gets the current debug data for this instance + * + * @return debug data + * @access public + */ + function &getDebug() { + // it would be nice to use a memory stream here to use + // memory more efficiently + return $this->debug_str; + } + + /** + * gets the current debug data for this instance as an XML comment + * this may change the contents of the debug data + * + * @return debug data as an XML comment + * @access public + */ + function &getDebugAsXMLComment() { + // it would be nice to use a memory stream here to use + // memory more efficiently + while (strpos($this->debug_str, '--')) { + $this->debug_str = str_replace('--', '- -', $this->debug_str); + } + return ""; + } + + /** + * expands entities, e.g. changes '<' to '<'. + * + * @param string $val The string in which to expand entities. + * @access private + */ + function expandEntities($val) { + if ($this->charencoding) { + $val = str_replace('&', '&', $val); + $val = str_replace("'", ''', $val); + $val = str_replace('"', '"', $val); + $val = str_replace('<', '<', $val); + $val = str_replace('>', '>', $val); + } + return $val; + } + + /** + * returns error string if present + * + * @return mixed error string or false + * @access public + */ + function getError(){ + if($this->error_str != ''){ + return $this->error_str; + } + return false; + } + + /** + * sets error string + * + * @return boolean $string error string + * @access private + */ + function setError($str){ + $this->error_str = $str; + } + + /** + * detect if array is a simple array or a struct (associative array) + * + * @param mixed $val The PHP array + * @return string (arraySimple|arrayStruct) + * @access private + */ + function isArraySimpleOrStruct($val) { + $keyList = array_keys($val); + foreach ($keyList as $keyListValue) { + if (!is_int($keyListValue)) { + return 'arrayStruct'; + } + } + return 'arraySimple'; + } + + /** + * serializes PHP values in accordance w/ section 5. Type information is + * not serialized if $use == 'literal'. + * + * @param mixed $val The value to serialize + * @param string $name The name (local part) of the XML element + * @param string $type The XML schema type (local part) for the element + * @param string $name_ns The namespace for the name of the XML element + * @param string $type_ns The namespace for the type of the element + * @param array $attributes The attributes to serialize as name=>value pairs + * @param string $use The WSDL "use" (encoded|literal) + * @return string The serialized element, possibly with child elements + * @access public + */ + function serialize_val($val,$name=false,$type=false,$name_ns=false,$type_ns=false,$attributes=false,$use='encoded'){ + $this->debug("in serialize_val: name=$name, type=$type, name_ns=$name_ns, type_ns=$type_ns, use=$use"); + $this->appendDebug('value=' . $this->varDump($val)); + $this->appendDebug('attributes=' . $this->varDump($attributes)); + + if(is_object($val) && get_class($val) == 'soapval'){ + return $val->serialize($use); + } + // force valid name if necessary + if (is_numeric($name)) { + $name = '__numeric_' . $name; + } elseif (! $name) { + $name = 'noname'; + } + // if name has ns, add ns prefix to name + $xmlns = ''; + if($name_ns){ + $prefix = 'nu'.rand(1000,9999); + $name = $prefix.':'.$name; + $xmlns .= " xmlns:$prefix=\"$name_ns\""; + } + // if type is prefixed, create type prefix + if($type_ns != '' && $type_ns == $this->namespaces['xsd']){ + // need to fix this. shouldn't default to xsd if no ns specified + // w/o checking against typemap + $type_prefix = 'xsd'; + } elseif($type_ns){ + $type_prefix = 'ns'.rand(1000,9999); + $xmlns .= " xmlns:$type_prefix=\"$type_ns\""; + } + // serialize attributes if present + $atts = ''; + if($attributes){ + foreach($attributes as $k => $v){ + $atts .= " $k=\"".$this->expandEntities($v).'"'; + } + } + // serialize null value + if (is_null($val)) { + if ($use == 'literal') { + // TODO: depends on minOccurs + return "<$name$xmlns $atts/>"; + } else { + if (isset($type) && isset($type_prefix)) { + $type_str = " xsi:type=\"$type_prefix:$type\""; + } else { + $type_str = ''; + } + return "<$name$xmlns$type_str $atts xsi:nil=\"true\"/>"; + } + } + // serialize if an xsd built-in primitive type + if($type != '' && isset($this->typemap[$this->XMLSchemaVersion][$type])){ + if (is_bool($val)) { + if ($type == 'boolean') { + $val = $val ? 'true' : 'false'; + } elseif (! $val) { + $val = 0; + } + } else if (is_string($val)) { + $val = $this->expandEntities($val); + } + if ($use == 'literal') { + return "<$name$xmlns $atts>$val"; + } else { + return "<$name$xmlns $atts xsi:type=\"xsd:$type\">$val"; + } + } + // detect type and serialize + $xml = ''; + switch(true) { + case (is_bool($val) || $type == 'boolean'): + if ($type == 'boolean') { + $val = $val ? 'true' : 'false'; + } elseif (! $val) { + $val = 0; + } + if ($use == 'literal') { + $xml .= "<$name$xmlns $atts>$val"; + } else { + $xml .= "<$name$xmlns xsi:type=\"xsd:boolean\"$atts>$val"; + } + break; + case (is_int($val) || is_long($val) || $type == 'int'): + if ($use == 'literal') { + $xml .= "<$name$xmlns $atts>$val"; + } else { + $xml .= "<$name$xmlns xsi:type=\"xsd:int\"$atts>$val"; + } + break; + case (is_float($val)|| is_double($val) || $type == 'float'): + if ($use == 'literal') { + $xml .= "<$name$xmlns $atts>$val"; + } else { + $xml .= "<$name$xmlns xsi:type=\"xsd:float\"$atts>$val"; + } + break; + case (is_string($val) || $type == 'string'): + $val = $this->expandEntities($val); + if ($use == 'literal') { + $xml .= "<$name$xmlns $atts>$val"; + } else { + $xml .= "<$name$xmlns xsi:type=\"xsd:string\"$atts>$val"; + } + break; + case is_object($val): + if (! $name) { + $name = get_class($val); + $this->debug("In serialize_val, used class name $name as element name"); + } else { + $this->debug("In serialize_val, do not override name $name for element name for class " . get_class($val)); + } + foreach(get_object_vars($val) as $k => $v){ + $pXml = isset($pXml) ? $pXml.$this->serialize_val($v,$k,false,false,false,false,$use) : $this->serialize_val($v,$k,false,false,false,false,$use); + } + $xml .= '<'.$name.'>'.$pXml.''; + break; + break; + case (is_array($val) || $type): + // detect if struct or array + $valueType = $this->isArraySimpleOrStruct($val); + if($valueType=='arraySimple' || ereg('^ArrayOf',$type)){ + $i = 0; + if(is_array($val) && count($val)> 0){ + foreach($val as $v){ + if(is_object($v) && get_class($v) == 'soapval'){ + $tt_ns = $v->type_ns; + $tt = $v->type; + } elseif (is_array($v)) { + $tt = $this->isArraySimpleOrStruct($v); + } else { + $tt = gettype($v); + } + $array_types[$tt] = 1; + // TODO: for literal, the name should be $name + $xml .= $this->serialize_val($v,'item',false,false,false,false,$use); + ++$i; + } + if(count($array_types) > 1){ + $array_typename = 'xsd:anyType'; + } elseif(isset($tt) && isset($this->typemap[$this->XMLSchemaVersion][$tt])) { + if ($tt == 'integer') { + $tt = 'int'; + } + $array_typename = 'xsd:'.$tt; + } elseif(isset($tt) && $tt == 'arraySimple'){ + $array_typename = 'SOAP-ENC:Array'; + } elseif(isset($tt) && $tt == 'arrayStruct'){ + $array_typename = 'unnamed_struct_use_soapval'; + } else { + // if type is prefixed, create type prefix + if ($tt_ns != '' && $tt_ns == $this->namespaces['xsd']){ + $array_typename = 'xsd:' . $tt; + } elseif ($tt_ns) { + $tt_prefix = 'ns' . rand(1000, 9999); + $array_typename = "$tt_prefix:$tt"; + $xmlns .= " xmlns:$tt_prefix=\"$tt_ns\""; + } else { + $array_typename = $tt; + } + } + $array_type = $i; + if ($use == 'literal') { + $type_str = ''; + } else if (isset($type) && isset($type_prefix)) { + $type_str = " xsi:type=\"$type_prefix:$type\""; + } else { + $type_str = " xsi:type=\"SOAP-ENC:Array\" SOAP-ENC:arrayType=\"".$array_typename."[$array_type]\""; + } + // empty array + } else { + if ($use == 'literal') { + $type_str = ''; + } else if (isset($type) && isset($type_prefix)) { + $type_str = " xsi:type=\"$type_prefix:$type\""; + } else { + $type_str = " xsi:type=\"SOAP-ENC:Array\" SOAP-ENC:arrayType=\"xsd:anyType[0]\""; + } + } + // TODO: for array in literal, there is no wrapper here + $xml = "<$name$xmlns$type_str$atts>".$xml.""; + } else { + // got a struct + if(isset($type) && isset($type_prefix)){ + $type_str = " xsi:type=\"$type_prefix:$type\""; + } else { + $type_str = ''; + } + if ($use == 'literal') { + $xml .= "<$name$xmlns $atts>"; + } else { + $xml .= "<$name$xmlns$type_str$atts>"; + } + foreach($val as $k => $v){ + // Apache Map + if ($type == 'Map' && $type_ns == 'http://xml.apache.org/xml-soap') { + $xml .= ''; + $xml .= $this->serialize_val($k,'key',false,false,false,false,$use); + $xml .= $this->serialize_val($v,'value',false,false,false,false,$use); + $xml .= ''; + } else { + $xml .= $this->serialize_val($v,$k,false,false,false,false,$use); + } + } + $xml .= ""; + } + break; + default: + $xml .= 'not detected, got '.gettype($val).' for '.$val; + break; + } + return $xml; + } + + /** + * serializes a message + * + * @param string $body the XML of the SOAP body + * @param mixed $headers optional string of XML with SOAP header content, or array of soapval objects for SOAP headers + * @param array $namespaces optional the namespaces used in generating the body and headers + * @param string $style optional (rpc|document) + * @param string $use optional (encoded|literal) + * @param string $encodingStyle optional (usually 'http://schemas.xmlsoap.org/soap/encoding/' for encoded) + * @return string the message + * @access public + */ + function serializeEnvelope($body,$headers=false,$namespaces=array(),$style='rpc',$use='encoded',$encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'){ + // TODO: add an option to automatically run utf8_encode on $body and $headers + // if $this->soap_defencoding is UTF-8. Not doing this automatically allows + // one to send arbitrary UTF-8 characters, not just characters that map to ISO-8859-1 + + $this->debug("In serializeEnvelope length=" . strlen($body) . " body (max 1000 characters)=" . substr($body, 0, 1000) . " style=$style use=$use encodingStyle=$encodingStyle"); + $this->debug("headers:"); + $this->appendDebug($this->varDump($headers)); + $this->debug("namespaces:"); + $this->appendDebug($this->varDump($namespaces)); + + // serialize namespaces + $ns_string = ''; + foreach(array_merge($this->namespaces,$namespaces) as $k => $v){ + $ns_string .= " xmlns:$k=\"$v\""; + } + if($encodingStyle) { + $ns_string = " SOAP-ENV:encodingStyle=\"$encodingStyle\"$ns_string"; + } + + // serialize headers + if($headers){ + if (is_array($headers)) { + $xml = ''; + foreach ($headers as $header) { + $xml .= $this->serialize_val($header, false, false, false, false, false, $use); + } + $headers = $xml; + $this->debug("In serializeEnvelope, serialzied array of headers to $headers"); + } + $headers = "".$headers.""; + } + // serialize envelope + return + 'soap_defencoding .'"?'.">". + '". + $headers. + "". + $body. + "". + ""; + } + + /** + * formats a string to be inserted into an HTML stream + * + * @param string $str The string to format + * @return string The formatted string + * @access public + * @deprecated + */ + function formatDump($str){ + $str = htmlspecialchars($str); + return nl2br($str); + } + + /** + * contracts (changes namespace to prefix) a qualified name + * + * @param string $qname qname + * @return string contracted qname + * @access private + */ + function contractQname($qname){ + // get element namespace + //$this->xdebug("Contract $qname"); + if (strrpos($qname, ':')) { + // get unqualified name + $name = substr($qname, strrpos($qname, ':') + 1); + // get ns + $ns = substr($qname, 0, strrpos($qname, ':')); + $p = $this->getPrefixFromNamespace($ns); + if ($p) { + return $p . ':' . $name; + } + return $qname; + } else { + return $qname; + } + } + + /** + * expands (changes prefix to namespace) a qualified name + * + * @param string $string qname + * @return string expanded qname + * @access private + */ + function expandQname($qname){ + // get element prefix + if(strpos($qname,':') && !ereg('^http://',$qname)){ + // get unqualified name + $name = substr(strstr($qname,':'),1); + // get ns prefix + $prefix = substr($qname,0,strpos($qname,':')); + if(isset($this->namespaces[$prefix])){ + return $this->namespaces[$prefix].':'.$name; + } else { + return $qname; + } + } else { + return $qname; + } + } + + /** + * returns the local part of a prefixed string + * returns the original string, if not prefixed + * + * @param string $str The prefixed string + * @return string The local part + * @access public + */ + function getLocalPart($str){ + if($sstr = strrchr($str,':')){ + // get unqualified name + return substr( $sstr, 1 ); + } else { + return $str; + } + } + + /** + * returns the prefix part of a prefixed string + * returns false, if not prefixed + * + * @param string $str The prefixed string + * @return mixed The prefix or false if there is no prefix + * @access public + */ + function getPrefix($str){ + if($pos = strrpos($str,':')){ + // get prefix + return substr($str,0,$pos); + } + return false; + } + + /** + * pass it a prefix, it returns a namespace + * + * @param string $prefix The prefix + * @return mixed The namespace, false if no namespace has the specified prefix + * @access public + */ + function getNamespaceFromPrefix($prefix){ + if (isset($this->namespaces[$prefix])) { + return $this->namespaces[$prefix]; + } + //$this->setError("No namespace registered for prefix '$prefix'"); + return false; + } + + /** + * returns the prefix for a given namespace (or prefix) + * or false if no prefixes registered for the given namespace + * + * @param string $ns The namespace + * @return mixed The prefix, false if the namespace has no prefixes + * @access public + */ + function getPrefixFromNamespace($ns) { + foreach ($this->namespaces as $p => $n) { + if ($ns == $n || $ns == $p) { + $this->usedNamespaces[$p] = $n; + return $p; + } + } + return false; + } + + /** + * returns the time in ODBC canonical form with microseconds + * + * @return string The time in ODBC canonical form with microseconds + * @access public + */ + function getmicrotime() { + if (function_exists('gettimeofday')) { + $tod = gettimeofday(); + $sec = $tod['sec']; + $usec = $tod['usec']; + } else { + $sec = time(); + $usec = 0; + } + return strftime('%Y-%m-%d %H:%M:%S', $sec) . '.' . sprintf('%06d', $usec); + } + + /** + * Returns a string with the output of var_dump + * + * @param mixed $data The variable to var_dump + * @return string The output of var_dump + * @access public + */ + function varDump($data) { + ob_start(); + + if (!class_exists('G')) { + $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); + $docuroot = explode( '/', $realdocuroot ); + array_pop( $docuroot ); + $pathhome = implode( '/', $docuroot ) . '/'; + array_pop( $docuroot ); + $pathTrunk = implode( '/', $docuroot ) . '/'; + require_once($pathTrunk.'gulliver/system/class.g.php'); + } + G::LoadSystem('inputfilter'); + $filter = new InputFilter(); + $data = $filter->xssFilterHard($data); + + var_dump($data); + $ret_val = ob_get_contents(); + ob_end_clean(); + return $ret_val; + } +} + +// XML Schema Datatype Helper Functions + +//xsd:dateTime helpers + +/** +* convert unix timestamp to ISO 8601 compliant date string +* +* @param string $timestamp Unix time stamp +* @access public +*/ +function timestamp_to_iso8601($timestamp,$utc=true){ + $datestr = date('Y-m-d\TH:i:sO',$timestamp); + if($utc){ + $eregStr = + '([0-9]{4})-'. // centuries & years CCYY- + '([0-9]{2})-'. // months MM- + '([0-9]{2})'. // days DD + 'T'. // separator T + '([0-9]{2}):'. // hours hh: + '([0-9]{2}):'. // minutes mm: + '([0-9]{2})(\.[0-9]*)?'. // seconds ss.ss... + '(Z|[+\-][0-9]{2}:?[0-9]{2})?'; // Z to indicate UTC, -/+HH:MM:SS.SS... for local tz's + + if(ereg($eregStr,$datestr,$regs)){ + return sprintf('%04d-%02d-%02dT%02d:%02d:%02dZ',$regs[1],$regs[2],$regs[3],$regs[4],$regs[5],$regs[6]); + } + return false; + } else { + return $datestr; + } +} + +/** +* convert ISO 8601 compliant date string to unix timestamp +* +* @param string $datestr ISO 8601 compliant date string +* @access public +*/ +function iso8601_to_timestamp($datestr){ + $eregStr = + '([0-9]{4})-'. // centuries & years CCYY- + '([0-9]{2})-'. // months MM- + '([0-9]{2})'. // days DD + 'T'. // separator T + '([0-9]{2}):'. // hours hh: + '([0-9]{2}):'. // minutes mm: + '([0-9]{2})(\.[0-9]+)?'. // seconds ss.ss... + '(Z|[+\-][0-9]{2}:?[0-9]{2})?'; // Z to indicate UTC, -/+HH:MM:SS.SS... for local tz's + if(ereg($eregStr,$datestr,$regs)){ + // not utc + if($regs[8] != 'Z'){ + $op = substr($regs[8],0,1); + $h = substr($regs[8],1,2); + $m = substr($regs[8],strlen($regs[8])-2,2); + if($op == '-'){ + $regs[4] = $regs[4] + $h; + $regs[5] = $regs[5] + $m; + } elseif($op == '+'){ + $regs[4] = $regs[4] - $h; + $regs[5] = $regs[5] - $m; + } + } + return strtotime("$regs[1]-$regs[2]-$regs[3] $regs[4]:$regs[5]:$regs[6]Z"); + } else { + return false; + } +} + +/** +* sleeps some number of microseconds +* +* @param string $usec the number of microseconds to sleep +* @access public +* @deprecated +*/ +function usleepWindows($usec) +{ + $start = gettimeofday(); + + do + { + $stop = gettimeofday(); + $timePassed = 1000000 * ($stop['sec'] - $start['sec']) + + $stop['usec'] - $start['usec']; + } + while ($timePassed < $usec); +} + +?> +* @version $Id: nusoap.php,v 1.94 2005/08/04 01:27:42 snichol Exp $ +* @access public +*/ +class soap_fault extends nusoap_base { + /** + * The fault code (client|server) + * @var string + * @access private + */ + var $faultcode; + /** + * The fault actor + * @var string + * @access private + */ + var $faultactor; + /** + * The fault string, a description of the fault + * @var string + * @access private + */ + var $faultstring; + /** + * The fault detail, typically a string or array of string + * @var mixed + * @access private + */ + var $faultdetail; + + /** + * constructor + * + * @param string $faultcode (client | server) + * @param string $faultactor only used when msg routed between multiple actors + * @param string $faultstring human readable error message + * @param mixed $faultdetail detail, typically a string or array of string + */ + function soap_fault($faultcode,$faultactor='',$faultstring='',$faultdetail=''){ + parent::nusoap_base(); + $this->faultcode = $faultcode; + $this->faultactor = $faultactor; + $this->faultstring = $faultstring; + $this->faultdetail = $faultdetail; + } + + /** + * serialize a fault + * + * @return string The serialization of the fault instance. + * @access public + */ + function serialize(){ + $ns_string = ''; + foreach($this->namespaces as $k => $v){ + $ns_string .= "\n xmlns:$k=\"$v\""; + } + $return_msg = + 'soap_defencoding.'"?>'. + '\n". + ''. + ''. + $this->serialize_val($this->faultcode, 'faultcode'). + $this->serialize_val($this->faultactor, 'faultactor'). + $this->serialize_val($this->faultstring, 'faultstring'). + $this->serialize_val($this->faultdetail, 'detail'). + ''. + ''. + ''; + return $return_msg; + } +} + + + +?> +* @version $Id: nusoap.php,v 1.94 2005/08/04 01:27:42 snichol Exp $ +* @access public +*/ +class XMLSchema extends nusoap_base { + + // files + var $schema = ''; + var $xml = ''; + // namespaces + var $enclosingNamespaces; + // schema info + var $schemaInfo = array(); + var $schemaTargetNamespace = ''; + // types, elements, attributes defined by the schema + var $attributes = array(); + var $complexTypes = array(); + var $complexTypeStack = array(); + var $currentComplexType = null; + var $elements = array(); + var $elementStack = array(); + var $currentElement = null; + var $simpleTypes = array(); + var $simpleTypeStack = array(); + var $currentSimpleType = null; + // imports + var $imports = array(); + // parser vars + var $parser; + var $position = 0; + var $depth = 0; + var $depth_array = array(); + var $message = array(); + var $defaultNamespace = array(); + + /** + * constructor + * + * @param string $schema schema document URI + * @param string $xml xml document URI + * @param string $namespaces namespaces defined in enclosing XML + * @access public + */ + function XMLSchema($schema='',$xml='',$namespaces=array()){ + parent::nusoap_base(); + $this->debug('xmlschema class instantiated, inside constructor'); + // files + $this->schema = $schema; + $this->xml = $xml; + + // namespaces + $this->enclosingNamespaces = $namespaces; + $this->namespaces = array_merge($this->namespaces, $namespaces); + + // parse schema file + if($schema != ''){ + $this->debug('initial schema file: '.$schema); + $this->parseFile($schema, 'schema'); + } + + // parse xml file + if($xml != ''){ + $this->debug('initial xml file: '.$xml); + $this->parseFile($xml, 'xml'); + } + + } + + /** + * parse an XML file + * + * @param string $xml, path/URL to XML file + * @param string $type, (schema | xml) + * @return boolean + * @access public + */ + function parseFile($xml,$type){ + // parse xml file + if($xml != ""){ + $xmlStr = @join("",@file($xml)); + if($xmlStr == ""){ + $msg = 'Error reading XML from '.$xml; + $this->setError($msg); + $this->debug($msg); + return false; + } else { + $this->debug("parsing $xml"); + $this->parseString($xmlStr,$type); + $this->debug("done parsing $xml"); + return true; + } + } + return false; + } + + /** + * parse an XML string + * + * @param string $xml path or URL + * @param string $type, (schema|xml) + * @access private + */ + function parseString($xml,$type){ + // parse xml string + if($xml != ""){ + + // Create an XML parser. + $this->parser = xml_parser_create(); + // Set the options for parsing the XML data. + xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, 0); + + // Set the object for the parser. + xml_set_object($this->parser, $this); + + // Set the element handlers for the parser. + if($type == "schema"){ + xml_set_element_handler($this->parser, 'schemaStartElement','schemaEndElement'); + xml_set_character_data_handler($this->parser,'schemaCharacterData'); + } elseif($type == "xml"){ + xml_set_element_handler($this->parser, 'xmlStartElement','xmlEndElement'); + xml_set_character_data_handler($this->parser,'xmlCharacterData'); + } + + // Parse the XML file. + if(!xml_parse($this->parser,$xml,true)){ + // Display an error message. + $errstr = sprintf('XML error parsing XML schema on line %d: %s', + xml_get_current_line_number($this->parser), + xml_error_string(xml_get_error_code($this->parser)) + ); + $this->debug($errstr); + $this->debug("XML payload:\n" . $xml); + $this->setError($errstr); + } + + xml_parser_free($this->parser); + } else{ + $this->debug('no xml passed to parseString()!!'); + $this->setError('no xml passed to parseString()!!'); + } + } + + /** + * start-element handler + * + * @param string $parser XML parser object + * @param string $name element name + * @param string $attrs associative array of attributes + * @access private + */ + function schemaStartElement($parser, $name, $attrs) { + + // position in the total number of elements, starting from 0 + $pos = $this->position++; + $depth = $this->depth++; + // set self as current value for this depth + $this->depth_array[$depth] = $pos; + $this->message[$pos] = array('cdata' => ''); + if ($depth > 0) { + $this->defaultNamespace[$pos] = $this->defaultNamespace[$this->depth_array[$depth - 1]]; + } else { + $this->defaultNamespace[$pos] = false; + } + + // get element prefix + if($prefix = $this->getPrefix($name)){ + // get unqualified name + $name = $this->getLocalPart($name); + } else { + $prefix = ''; + } + + // loop thru attributes, expanding, and registering namespace declarations + if(count($attrs) > 0){ + foreach($attrs as $k => $v){ + // if ns declarations, add to class level array of valid namespaces + if(ereg("^xmlns",$k)){ + //$this->xdebug("$k: $v"); + //$this->xdebug('ns_prefix: '.$this->getPrefix($k)); + if($ns_prefix = substr(strrchr($k,':'),1)){ + //$this->xdebug("Add namespace[$ns_prefix] = $v"); + $this->namespaces[$ns_prefix] = $v; + } else { + $this->defaultNamespace[$pos] = $v; + if (! $this->getPrefixFromNamespace($v)) { + $this->namespaces['ns'.(count($this->namespaces)+1)] = $v; + } + } + if($v == 'http://www.w3.org/2001/XMLSchema' || $v == 'http://www.w3.org/1999/XMLSchema' || $v == 'http://www.w3.org/2000/10/XMLSchema'){ + $this->XMLSchemaVersion = $v; + $this->namespaces['xsi'] = $v.'-instance'; + } + } + } + foreach($attrs as $k => $v){ + // expand each attribute + $k = strpos($k,':') ? $this->expandQname($k) : $k; + $v = strpos($v,':') ? $this->expandQname($v) : $v; + $eAttrs[$k] = $v; + } + $attrs = $eAttrs; + } else { + $attrs = array(); + } + // find status, register data + switch($name){ + case 'all': // (optional) compositor content for a complexType + case 'choice': + case 'group': + case 'sequence': + //$this->xdebug("compositor $name for currentComplexType: $this->currentComplexType and currentElement: $this->currentElement"); + $this->complexTypes[$this->currentComplexType]['compositor'] = $name; + //if($name == 'all' || $name == 'sequence'){ + // $this->complexTypes[$this->currentComplexType]['phpType'] = 'struct'; + //} + break; + case 'attribute': // complexType attribute + //$this->xdebug("parsing attribute $attrs[name] $attrs[ref] of value: ".$attrs['http://schemas.xmlsoap.org/wsdl/:arrayType']); + $this->xdebug("parsing attribute:"); + $this->appendDebug($this->varDump($attrs)); + if (!isset($attrs['form'])) { + $attrs['form'] = $this->schemaInfo['attributeFormDefault']; + } + if (isset($attrs['http://schemas.xmlsoap.org/wsdl/:arrayType'])) { + $v = $attrs['http://schemas.xmlsoap.org/wsdl/:arrayType']; + if (!strpos($v, ':')) { + // no namespace in arrayType attribute value... + if ($this->defaultNamespace[$pos]) { + // ...so use the default + $attrs['http://schemas.xmlsoap.org/wsdl/:arrayType'] = $this->defaultNamespace[$pos] . ':' . $attrs['http://schemas.xmlsoap.org/wsdl/:arrayType']; + } + } + } + if(isset($attrs['name'])){ + $this->attributes[$attrs['name']] = $attrs; + $aname = $attrs['name']; + } elseif(isset($attrs['ref']) && $attrs['ref'] == 'http://schemas.xmlsoap.org/soap/encoding/:arrayType'){ + if (isset($attrs['http://schemas.xmlsoap.org/wsdl/:arrayType'])) { + $aname = $attrs['http://schemas.xmlsoap.org/wsdl/:arrayType']; + } else { + $aname = ''; + } + } elseif(isset($attrs['ref'])){ + $aname = $attrs['ref']; + $this->attributes[$attrs['ref']] = $attrs; + } + + if($this->currentComplexType){ // This should *always* be + $this->complexTypes[$this->currentComplexType]['attrs'][$aname] = $attrs; + } + // arrayType attribute + if(isset($attrs['http://schemas.xmlsoap.org/wsdl/:arrayType']) || $this->getLocalPart($aname) == 'arrayType'){ + $this->complexTypes[$this->currentComplexType]['phpType'] = 'array'; + $prefix = $this->getPrefix($aname); + if(isset($attrs['http://schemas.xmlsoap.org/wsdl/:arrayType'])){ + $v = $attrs['http://schemas.xmlsoap.org/wsdl/:arrayType']; + } else { + $v = ''; + } + if(strpos($v,'[,]')){ + $this->complexTypes[$this->currentComplexType]['multidimensional'] = true; + } + $v = substr($v,0,strpos($v,'[')); // clip the [] + if(!strpos($v,':') && isset($this->typemap[$this->XMLSchemaVersion][$v])){ + $v = $this->XMLSchemaVersion.':'.$v; + } + $this->complexTypes[$this->currentComplexType]['arrayType'] = $v; + } + break; + case 'complexContent': // (optional) content for a complexType + break; + case 'complexType': + array_push($this->complexTypeStack, $this->currentComplexType); + if(isset($attrs['name'])){ + $this->xdebug('processing named complexType '.$attrs['name']); + //$this->currentElement = false; + $this->currentComplexType = $attrs['name']; + $this->complexTypes[$this->currentComplexType] = $attrs; + $this->complexTypes[$this->currentComplexType]['typeClass'] = 'complexType'; + // This is for constructs like + // + // + // + // + // + if(isset($attrs['base']) && ereg(':Array$',$attrs['base'])){ + $this->xdebug('complexType is unusual array'); + $this->complexTypes[$this->currentComplexType]['phpType'] = 'array'; + } else { + $this->complexTypes[$this->currentComplexType]['phpType'] = 'struct'; + } + }else{ + $this->xdebug('processing unnamed complexType for element '.$this->currentElement); + $this->currentComplexType = $this->currentElement . '_ContainedType'; + //$this->currentElement = false; + $this->complexTypes[$this->currentComplexType] = $attrs; + $this->complexTypes[$this->currentComplexType]['typeClass'] = 'complexType'; + // This is for constructs like + // + // + // + // + // + if(isset($attrs['base']) && ereg(':Array$',$attrs['base'])){ + $this->xdebug('complexType is unusual array'); + $this->complexTypes[$this->currentComplexType]['phpType'] = 'array'; + } else { + $this->complexTypes[$this->currentComplexType]['phpType'] = 'struct'; + } + } + break; + case 'element': + array_push($this->elementStack, $this->currentElement); + // elements defined as part of a complex type should + // not really be added to $this->elements, but for some + // reason, they are + if (!isset($attrs['form'])) { + $attrs['form'] = $this->schemaInfo['elementFormDefault']; + } + if(isset($attrs['type'])){ + $this->xdebug("processing typed element ".$attrs['name']." of type ".$attrs['type']); + if (! $this->getPrefix($attrs['type'])) { + if ($this->defaultNamespace[$pos]) { + $attrs['type'] = $this->defaultNamespace[$pos] . ':' . $attrs['type']; + $this->xdebug('used default namespace to make type ' . $attrs['type']); + } + } + // This is for constructs like + // + // + // + // + // + if ($this->currentComplexType && $this->complexTypes[$this->currentComplexType]['phpType'] == 'array') { + $this->xdebug('arrayType for unusual array is ' . $attrs['type']); + $this->complexTypes[$this->currentComplexType]['arrayType'] = $attrs['type']; + } + $this->currentElement = $attrs['name']; + $this->elements[ $attrs['name'] ] = $attrs; + $this->elements[ $attrs['name'] ]['typeClass'] = 'element'; + $ename = $attrs['name']; + } elseif(isset($attrs['ref'])){ + $this->xdebug("processing element as ref to ".$attrs['ref']); + $this->currentElement = "ref to ".$attrs['ref']; + $ename = $this->getLocalPart($attrs['ref']); + } else { + $this->xdebug("processing untyped element ".$attrs['name']); + $this->currentElement = $attrs['name']; + $this->elements[ $attrs['name'] ] = $attrs; + $this->elements[ $attrs['name'] ]['typeClass'] = 'element'; + $attrs['type'] = $this->schemaTargetNamespace . ':' . $attrs['name'] . '_ContainedType'; + $this->elements[ $attrs['name'] ]['type'] = $attrs['type']; + $ename = $attrs['name']; + } + if(isset($ename) && $this->currentComplexType){ + $this->complexTypes[$this->currentComplexType]['elements'][$ename] = $attrs; + } + break; + case 'enumeration': // restriction value list member + $this->xdebug('enumeration ' . $attrs['value']); + if ($this->currentSimpleType) { + $this->simpleTypes[$this->currentSimpleType]['enumeration'][] = $attrs['value']; + } elseif ($this->currentComplexType) { + $this->complexTypes[$this->currentComplexType]['enumeration'][] = $attrs['value']; + } + break; + case 'extension': // simpleContent or complexContent type extension + $this->xdebug('extension ' . $attrs['base']); + if ($this->currentComplexType) { + $this->complexTypes[$this->currentComplexType]['extensionBase'] = $attrs['base']; + } + break; + case 'import': + if (isset($attrs['schemaLocation'])) { + //$this->xdebug('import namespace ' . $attrs['namespace'] . ' from ' . $attrs['schemaLocation']); + $this->imports[$attrs['namespace']][] = array('location' => $attrs['schemaLocation'], 'loaded' => false); + } else { + //$this->xdebug('import namespace ' . $attrs['namespace']); + $this->imports[$attrs['namespace']][] = array('location' => '', 'loaded' => true); + if (! $this->getPrefixFromNamespace($attrs['namespace'])) { + $this->namespaces['ns'.(count($this->namespaces)+1)] = $attrs['namespace']; + } + } + break; + case 'list': // simpleType value list + break; + case 'restriction': // simpleType, simpleContent or complexContent value restriction + $this->xdebug('restriction ' . $attrs['base']); + if($this->currentSimpleType){ + $this->simpleTypes[$this->currentSimpleType]['type'] = $attrs['base']; + } elseif($this->currentComplexType){ + $this->complexTypes[$this->currentComplexType]['restrictionBase'] = $attrs['base']; + if(strstr($attrs['base'],':') == ':Array'){ + $this->complexTypes[$this->currentComplexType]['phpType'] = 'array'; + } + } + break; + case 'schema': + $this->schemaInfo = $attrs; + $this->schemaInfo['schemaVersion'] = $this->getNamespaceFromPrefix($prefix); + if (isset($attrs['targetNamespace'])) { + $this->schemaTargetNamespace = $attrs['targetNamespace']; + } + if (!isset($attrs['elementFormDefault'])) { + $this->schemaInfo['elementFormDefault'] = 'unqualified'; + } + if (!isset($attrs['attributeFormDefault'])) { + $this->schemaInfo['attributeFormDefault'] = 'unqualified'; + } + break; + case 'simpleContent': // (optional) content for a complexType + break; + case 'simpleType': + array_push($this->simpleTypeStack, $this->currentSimpleType); + if(isset($attrs['name'])){ + $this->xdebug("processing simpleType for name " . $attrs['name']); + $this->currentSimpleType = $attrs['name']; + $this->simpleTypes[ $attrs['name'] ] = $attrs; + $this->simpleTypes[ $attrs['name'] ]['typeClass'] = 'simpleType'; + $this->simpleTypes[ $attrs['name'] ]['phpType'] = 'scalar'; + } else { + $this->xdebug('processing unnamed simpleType for element '.$this->currentElement); + $this->currentSimpleType = $this->currentElement . '_ContainedType'; + //$this->currentElement = false; + $this->simpleTypes[$this->currentSimpleType] = $attrs; + $this->simpleTypes[$this->currentSimpleType]['phpType'] = 'scalar'; + } + break; + case 'union': // simpleType type list + break; + default: + //$this->xdebug("do not have anything to do for element $name"); + } + } + + /** + * end-element handler + * + * @param string $parser XML parser object + * @param string $name element name + * @access private + */ + function schemaEndElement($parser, $name) { + // bring depth down a notch + $this->depth--; + // position of current element is equal to the last value left in depth_array for my depth + if(isset($this->depth_array[$this->depth])){ + $pos = $this->depth_array[$this->depth]; + } + // get element prefix + if ($prefix = $this->getPrefix($name)){ + // get unqualified name + $name = $this->getLocalPart($name); + } else { + $prefix = ''; + } + // move on... + if($name == 'complexType'){ + $this->xdebug('done processing complexType ' . ($this->currentComplexType ? $this->currentComplexType : '(unknown)')); + $this->currentComplexType = array_pop($this->complexTypeStack); + //$this->currentElement = false; + } + if($name == 'element'){ + $this->xdebug('done processing element ' . ($this->currentElement ? $this->currentElement : '(unknown)')); + $this->currentElement = array_pop($this->elementStack); + } + if($name == 'simpleType'){ + $this->xdebug('done processing simpleType ' . ($this->currentSimpleType ? $this->currentSimpleType : '(unknown)')); + $this->currentSimpleType = array_pop($this->simpleTypeStack); + } + } + + /** + * element content handler + * + * @param string $parser XML parser object + * @param string $data element content + * @access private + */ + function schemaCharacterData($parser, $data){ + $pos = $this->depth_array[$this->depth - 1]; + $this->message[$pos]['cdata'] .= $data; + } + + /** + * serialize the schema + * + * @access public + */ + function serializeSchema(){ + + $schemaPrefix = $this->getPrefixFromNamespace($this->XMLSchemaVersion); + $xml = ''; + // imports + if (sizeof($this->imports) > 0) { + foreach($this->imports as $ns => $list) { + foreach ($list as $ii) { + if ($ii['location'] != '') { + $xml .= " <$schemaPrefix:import location=\"" . $ii['location'] . '" namespace="' . $ns . "\" />\n"; + } else { + $xml .= " <$schemaPrefix:import namespace=\"" . $ns . "\" />\n"; + } + } + } + } + // complex types + foreach($this->complexTypes as $typeName => $attrs){ + $contentStr = ''; + // serialize child elements + if(isset($attrs['elements']) && (count($attrs['elements']) > 0)){ + foreach($attrs['elements'] as $element => $eParts){ + if(isset($eParts['ref'])){ + $contentStr .= " <$schemaPrefix:element ref=\"$element\"/>\n"; + } else { + $contentStr .= " <$schemaPrefix:element name=\"$element\" type=\"" . $this->contractQName($eParts['type']) . "\""; + foreach ($eParts as $aName => $aValue) { + // handle, e.g., abstract, default, form, minOccurs, maxOccurs, nillable + if ($aName != 'name' && $aName != 'type') { + $contentStr .= " $aName=\"$aValue\""; + } + } + $contentStr .= "/>\n"; + } + } + // compositor wraps elements + if (isset($attrs['compositor']) && ($attrs['compositor'] != '')) { + $contentStr = " <$schemaPrefix:$attrs[compositor]>\n".$contentStr." \n"; + } + } + // attributes + if(isset($attrs['attrs']) && (count($attrs['attrs']) >= 1)){ + foreach($attrs['attrs'] as $attr => $aParts){ + $contentStr .= " <$schemaPrefix:attribute"; + foreach ($aParts as $a => $v) { + if ($a == 'ref' || $a == 'type') { + $contentStr .= " $a=\"".$this->contractQName($v).'"'; + } elseif ($a == 'http://schemas.xmlsoap.org/wsdl/:arrayType') { + $this->usedNamespaces['wsdl'] = $this->namespaces['wsdl']; + $contentStr .= ' wsdl:arrayType="'.$this->contractQName($v).'"'; + } else { + $contentStr .= " $a=\"$v\""; + } + } + $contentStr .= "/>\n"; + } + } + // if restriction + if (isset($attrs['restrictionBase']) && $attrs['restrictionBase'] != ''){ + $contentStr = " <$schemaPrefix:restriction base=\"".$this->contractQName($attrs['restrictionBase'])."\">\n".$contentStr." \n"; + // complex or simple content + if ((isset($attrs['elements']) && count($attrs['elements']) > 0) || (isset($attrs['attrs']) && count($attrs['attrs']) > 0)){ + $contentStr = " <$schemaPrefix:complexContent>\n".$contentStr." \n"; + } + } + // finalize complex type + if($contentStr != ''){ + $contentStr = " <$schemaPrefix:complexType name=\"$typeName\">\n".$contentStr." \n"; + } else { + $contentStr = " <$schemaPrefix:complexType name=\"$typeName\"/>\n"; + } + $xml .= $contentStr; + } + // simple types + if(isset($this->simpleTypes) && count($this->simpleTypes) > 0){ + foreach($this->simpleTypes as $typeName => $eParts){ + $xml .= " <$schemaPrefix:simpleType name=\"$typeName\">\n <$schemaPrefix:restriction base=\"".$this->contractQName($eParts['type'])."\"/>\n"; + if (isset($eParts['enumeration'])) { + foreach ($eParts['enumeration'] as $e) { + $xml .= " <$schemaPrefix:enumeration value=\"$e\"/>\n"; + } + } + $xml .= " "; + } + } + // elements + if(isset($this->elements) && count($this->elements) > 0){ + foreach($this->elements as $element => $eParts){ + $xml .= " <$schemaPrefix:element name=\"$element\" type=\"".$this->contractQName($eParts['type'])."\"/>\n"; + } + } + // attributes + if(isset($this->attributes) && count($this->attributes) > 0){ + foreach($this->attributes as $attr => $aParts){ + $xml .= " <$schemaPrefix:attribute name=\"$attr\" type=\"".$this->contractQName($aParts['type'])."\"\n/>"; + } + } + // finish 'er up + $el = "<$schemaPrefix:schema targetNamespace=\"$this->schemaTargetNamespace\"\n"; + foreach (array_diff($this->usedNamespaces, $this->enclosingNamespaces) as $nsp => $ns) { + $el .= " xmlns:$nsp=\"$ns\"\n"; + } + $xml = $el . ">\n".$xml."\n"; + return $xml; + } + + /** + * adds debug data to the clas level debug string + * + * @param string $string debug data + * @access private + */ + function xdebug($string){ + $this->debug('<' . $this->schemaTargetNamespace . '> '.$string); + } + + /** + * get the PHP type of a user defined type in the schema + * PHP type is kind of a misnomer since it actually returns 'struct' for assoc. arrays + * returns false if no type exists, or not w/ the given namespace + * else returns a string that is either a native php type, or 'struct' + * + * @param string $type, name of defined type + * @param string $ns, namespace of type + * @return mixed + * @access public + * @deprecated + */ + function getPHPType($type,$ns){ + if(isset($this->typemap[$ns][$type])){ + //print "found type '$type' and ns $ns in typemap
    "; + return $this->typemap[$ns][$type]; + } elseif(isset($this->complexTypes[$type])){ + //print "getting type '$type' and ns $ns from complexTypes array
    "; + return $this->complexTypes[$type]['phpType']; + } + return false; + } + + /** + * returns an associative array of information about a given type + * returns false if no type exists by the given name + * + * For a complexType typeDef = array( + * 'restrictionBase' => '', + * 'phpType' => '', + * 'compositor' => '(sequence|all)', + * 'elements' => array(), // refs to elements array + * 'attrs' => array() // refs to attributes array + * ... and so on (see addComplexType) + * ) + * + * For simpleType or element, the array has different keys. + * + * @param string + * @return mixed + * @access public + * @see addComplexType + * @see addSimpleType + * @see addElement + */ + function getTypeDef($type){ + //$this->debug("in getTypeDef for type $type"); + if(isset($this->complexTypes[$type])){ + $this->xdebug("in getTypeDef, found complexType $type"); + return $this->complexTypes[$type]; + } elseif(isset($this->simpleTypes[$type])){ + $this->xdebug("in getTypeDef, found simpleType $type"); + if (!isset($this->simpleTypes[$type]['phpType'])) { + // get info for type to tack onto the simple type + // TODO: can this ever really apply (i.e. what is a simpleType really?) + $uqType = substr($this->simpleTypes[$type]['type'], strrpos($this->simpleTypes[$type]['type'], ':') + 1); + $ns = substr($this->simpleTypes[$type]['type'], 0, strrpos($this->simpleTypes[$type]['type'], ':')); + $etype = $this->getTypeDef($uqType); + if ($etype) { + $this->xdebug("in getTypeDef, found type for simpleType $type:"); + $this->xdebug($this->varDump($etype)); + if (isset($etype['phpType'])) { + $this->simpleTypes[$type]['phpType'] = $etype['phpType']; + } + if (isset($etype['elements'])) { + $this->simpleTypes[$type]['elements'] = $etype['elements']; + } + } + } + return $this->simpleTypes[$type]; + } elseif(isset($this->elements[$type])){ + $this->xdebug("in getTypeDef, found element $type"); + if (!isset($this->elements[$type]['phpType'])) { + // get info for type to tack onto the element + $uqType = substr($this->elements[$type]['type'], strrpos($this->elements[$type]['type'], ':') + 1); + $ns = substr($this->elements[$type]['type'], 0, strrpos($this->elements[$type]['type'], ':')); + $etype = $this->getTypeDef($uqType); + if ($etype) { + $this->xdebug("in getTypeDef, found type for element $type:"); + $this->xdebug($this->varDump($etype)); + if (isset($etype['phpType'])) { + $this->elements[$type]['phpType'] = $etype['phpType']; + } + if (isset($etype['elements'])) { + $this->elements[$type]['elements'] = $etype['elements']; + } + } elseif ($ns == 'http://www.w3.org/2001/XMLSchema') { + $this->xdebug("in getTypeDef, element $type is an XSD type"); + $this->elements[$type]['phpType'] = 'scalar'; + } + } + return $this->elements[$type]; + } elseif(isset($this->attributes[$type])){ + $this->xdebug("in getTypeDef, found attribute $type"); + return $this->attributes[$type]; + } elseif (ereg('_ContainedType$', $type)) { + $this->xdebug("in getTypeDef, have an untyped element $type"); + $typeDef['typeClass'] = 'simpleType'; + $typeDef['phpType'] = 'scalar'; + $typeDef['type'] = 'http://www.w3.org/2001/XMLSchema:string'; + return $typeDef; + } + $this->xdebug("in getTypeDef, did not find $type"); + return false; + } + + /** + * returns a sample serialization of a given type, or false if no type by the given name + * + * @param string $type, name of type + * @return mixed + * @access public + * @deprecated + */ + function serializeTypeDef($type){ + //print "in sTD() for type $type
    "; + if($typeDef = $this->getTypeDef($type)){ + $str .= '<'.$type; + if(is_array($typeDef['attrs'])){ + foreach($attrs as $attName => $data){ + $str .= " $attName=\"{type = ".$data['type']."}\""; + } + } + $str .= " xmlns=\"".$this->schema['targetNamespace']."\""; + if(count($typeDef['elements']) > 0){ + $str .= ">"; + foreach($typeDef['elements'] as $element => $eData){ + $str .= $this->serializeTypeDef($element); + } + $str .= ""; + } elseif($typeDef['typeClass'] == 'element') { + $str .= ">"; + } else { + $str .= "/>"; + } + return $str; + } + return false; + } + + /** + * returns HTML form elements that allow a user + * to enter values for creating an instance of the given type. + * + * @param string $name, name for type instance + * @param string $type, name of type + * @return string + * @access public + * @deprecated + */ + function typeToForm($name,$type){ + // get typedef + if($typeDef = $this->getTypeDef($type)){ + // if struct + if($typeDef['phpType'] == 'struct'){ + $buffer .= ''; + foreach($typeDef['elements'] as $child => $childDef){ + $buffer .= " + + "; + } + $buffer .= '
    $childDef[name] (type: ".$this->getLocalPart($childDef['type'])."):
    '; + // if array + } elseif($typeDef['phpType'] == 'array'){ + $buffer .= ''; + for($i=0;$i < 3; $i++){ + $buffer .= " + + "; + } + $buffer .= '
    array item (type: $typeDef[arrayType]):
    '; + // if scalar + } else { + $buffer .= ""; + } + } else { + $buffer .= ""; + } + return $buffer; + } + + /** + * adds a complex type to the schema + * + * example: array + * + * addType( + * 'ArrayOfstring', + * 'complexType', + * 'array', + * '', + * 'SOAP-ENC:Array', + * array('ref'=>'SOAP-ENC:arrayType','wsdl:arrayType'=>'string[]'), + * 'xsd:string' + * ); + * + * example: PHP associative array ( SOAP Struct ) + * + * addType( + * 'SOAPStruct', + * 'complexType', + * 'struct', + * 'all', + * array('myVar'=> array('name'=>'myVar','type'=>'string') + * ); + * + * @param name + * @param typeClass (complexType|simpleType|attribute) + * @param phpType: currently supported are array and struct (php assoc array) + * @param compositor (all|sequence|choice) + * @param restrictionBase namespace:name (http://schemas.xmlsoap.org/soap/encoding/:Array) + * @param elements = array ( name = array(name=>'',type=>'') ) + * @param attrs = array( + * array( + * 'ref' => "http://schemas.xmlsoap.org/soap/encoding/:arrayType", + * "http://schemas.xmlsoap.org/wsdl/:arrayType" => "string[]" + * ) + * ) + * @param arrayType: namespace:name (http://www.w3.org/2001/XMLSchema:string) + * @access public + * @see getTypeDef + */ + function addComplexType($name,$typeClass='complexType',$phpType='array',$compositor='',$restrictionBase='',$elements=array(),$attrs=array(),$arrayType=''){ + $this->complexTypes[$name] = array( + 'name' => $name, + 'typeClass' => $typeClass, + 'phpType' => $phpType, + 'compositor'=> $compositor, + 'restrictionBase' => $restrictionBase, + 'elements' => $elements, + 'attrs' => $attrs, + 'arrayType' => $arrayType + ); + + $this->xdebug("addComplexType $name:"); + $this->appendDebug($this->varDump($this->complexTypes[$name])); + } + + /** + * adds a simple type to the schema + * + * @param string $name + * @param string $restrictionBase namespace:name (http://schemas.xmlsoap.org/soap/encoding/:Array) + * @param string $typeClass (should always be simpleType) + * @param string $phpType (should always be scalar) + * @param array $enumeration array of values + * @access public + * @see xmlschema + * @see getTypeDef + */ + function addSimpleType($name, $restrictionBase='', $typeClass='simpleType', $phpType='scalar', $enumeration=array()) { + $this->simpleTypes[$name] = array( + 'name' => $name, + 'typeClass' => $typeClass, + 'phpType' => $phpType, + 'type' => $restrictionBase, + 'enumeration' => $enumeration + ); + + $this->xdebug("addSimpleType $name:"); + $this->appendDebug($this->varDump($this->simpleTypes[$name])); + } + + /** + * adds an element to the schema + * + * @param array $attrs attributes that must include name and type + * @see xmlschema + * @access public + */ + function addElement($attrs) { + if (! $this->getPrefix($attrs['type'])) { + $attrs['type'] = $this->schemaTargetNamespace . ':' . $attrs['type']; + } + $this->elements[ $attrs['name'] ] = $attrs; + $this->elements[ $attrs['name'] ]['typeClass'] = 'element'; + + $this->xdebug("addElement " . $attrs['name']); + $this->appendDebug($this->varDump($this->elements[ $attrs['name'] ])); + } +} + + + +?> +* @version $Id: nusoap.php,v 1.94 2005/08/04 01:27:42 snichol Exp $ +* @access public +*/ +class soapval extends nusoap_base { + /** + * The XML element name + * + * @var string + * @access private + */ + var $name; + /** + * The XML type name (string or false) + * + * @var mixed + * @access private + */ + var $type; + /** + * The PHP value + * + * @var mixed + * @access private + */ + var $value; + /** + * The XML element namespace (string or false) + * + * @var mixed + * @access private + */ + var $element_ns; + /** + * The XML type namespace (string or false) + * + * @var mixed + * @access private + */ + var $type_ns; + /** + * The XML element attributes (array or false) + * + * @var mixed + * @access private + */ + var $attributes; + + /** + * constructor + * + * @param string $name optional name + * @param mixed $type optional type name + * @param mixed $value optional value + * @param mixed $element_ns optional namespace of value + * @param mixed $type_ns optional namespace of type + * @param mixed $attributes associative array of attributes to add to element serialization + * @access public + */ + function soapval($name='soapval',$type=false,$value=-1,$element_ns=false,$type_ns=false,$attributes=false) { + parent::nusoap_base(); + $this->name = $name; + $this->type = $type; + $this->value = $value; + $this->element_ns = $element_ns; + $this->type_ns = $type_ns; + $this->attributes = $attributes; + } + + /** + * return serialized value + * + * @param string $use The WSDL use value (encoded|literal) + * @return string XML data + * @access public + */ + function serialize($use='encoded') { + return $this->serialize_val($this->value,$this->name,$this->type,$this->element_ns,$this->type_ns,$this->attributes,$use); + } + + /** + * decodes a soapval object into a PHP native type + * + * @return mixed + * @access public + */ + function decode(){ + return $this->value; + } +} + + + +?> +* @version $Id: nusoap.php,v 1.94 2005/08/04 01:27:42 snichol Exp $ +* @access public +*/ +class soap_transport_http extends nusoap_base { + + var $url = ''; + var $uri = ''; + var $digest_uri = ''; + var $scheme = ''; + var $host = ''; + var $port = ''; + var $path = ''; + var $request_method = 'POST'; + var $protocol_version = '1.0'; + var $encoding = ''; + var $outgoing_headers = array(); + var $incoming_headers = array(); + var $incoming_cookies = array(); + var $outgoing_payload = ''; + var $incoming_payload = ''; + var $useSOAPAction = true; + var $persistentConnection = false; + var $ch = false; // cURL handle + var $username = ''; + var $password = ''; + var $authtype = ''; + var $digestRequest = array(); + var $certRequest = array(); // keys must be cainfofile (optional), sslcertfile, sslkeyfile, passphrase, verifypeer (optional), verifyhost (optional) + // cainfofile: certificate authority file, e.g. '$pathToPemFiles/rootca.pem' + // sslcertfile: SSL certificate file, e.g. '$pathToPemFiles/mycert.pem' + // sslkeyfile: SSL key file, e.g. '$pathToPemFiles/mykey.pem' + // passphrase: SSL key password/passphrase + // verifypeer: default is 1 + // verifyhost: default is 1 + + /** + * constructor + */ + function soap_transport_http($url){ + parent::nusoap_base(); + $this->setURL($url); + ereg('\$Revisio' . 'n: ([^ ]+)', $this->revision, $rev); + $this->outgoing_headers['User-Agent'] = $this->title.'/'.$this->version.' ('.$rev[1].')'; + $this->debug('set User-Agent: ' . $this->outgoing_headers['User-Agent']); + } + + function setURL($url) { + $this->url = $url; + + $u = parse_url($url); + foreach($u as $k => $v){ + $this->debug("$k = $v"); + $this->$k = $v; + } + + // add any GET params to path + if(isset($u['query']) && $u['query'] != ''){ + $this->path .= '?' . $u['query']; + } + + // set default port + if(!isset($u['port'])){ + if($u['scheme'] == 'https'){ + $this->port = 443; + } else { + $this->port = 80; + } + } + + $this->uri = $this->path; + $this->digest_uri = $this->uri; + + // build headers + if (!isset($u['port'])) { + $this->outgoing_headers['Host'] = $this->host; + } else { + $this->outgoing_headers['Host'] = $this->host.':'.$this->port; + } + $this->debug('set Host: ' . $this->outgoing_headers['Host']); + + if (isset($u['user']) && $u['user'] != '') { + $this->setCredentials(urldecode($u['user']), isset($u['pass']) ? urldecode($u['pass']) : ''); + } + } + + function connect($connection_timeout=0,$response_timeout=30){ + // For PHP 4.3 with OpenSSL, change https scheme to ssl, then treat like + // "regular" socket. + // TODO: disabled for now because OpenSSL must be *compiled* in (not just + // loaded), and until PHP5 stream_get_wrappers is not available. +// if ($this->scheme == 'https') { +// if (version_compare(phpversion(), '4.3.0') >= 0) { +// if (extension_loaded('openssl')) { +// $this->scheme = 'ssl'; +// $this->debug('Using SSL over OpenSSL'); +// } +// } +// } + $this->debug("connect connection_timeout $connection_timeout, response_timeout $response_timeout, scheme $this->scheme, host $this->host, port $this->port"); + if ($this->scheme == 'http' || $this->scheme == 'ssl') { + // use persistent connection + if($this->persistentConnection && isset($this->fp) && is_resource($this->fp)){ + if (!feof($this->fp)) { + $this->debug('Re-use persistent connection'); + return true; + } + fclose($this->fp); + $this->debug('Closed persistent connection at EOF'); + } + + // munge host if using OpenSSL + if ($this->scheme == 'ssl') { + $host = 'ssl://' . $this->host; + } else { + $host = $this->host; + } + $this->debug('calling fsockopen with host ' . $host . ' connection_timeout ' . $connection_timeout); + + // open socket + if($connection_timeout > 0){ + $this->fp = @fsockopen( $host, $this->port, $this->errno, $this->error_str, $connection_timeout); + } else { + $this->fp = @fsockopen( $host, $this->port, $this->errno, $this->error_str); + } + + // test pointer + if(!$this->fp) { + $msg = 'Couldn\'t open socket connection to server ' . $this->url; + if ($this->errno) { + $msg .= ', Error ('.$this->errno.'): '.$this->error_str; + } else { + $msg .= ' prior to connect(). This is often a problem looking up the host name.'; + } + $this->debug($msg); + $this->setError($msg); + return false; + } + + // set response timeout + $this->debug('set response timeout to ' . $response_timeout); + socket_set_timeout( $this->fp, $response_timeout); + + $this->debug('socket connected'); + return true; + } else if ($this->scheme == 'https') { + if (!extension_loaded('curl')) { + $this->setError('CURL Extension, or OpenSSL extension w/ PHP version >= 4.3 is required for HTTPS'); + return false; + } + $this->debug('connect using https'); + // init CURL + $this->ch = curl_init(); + // set url + $hostURL = ($this->port != '') ? "https://$this->host:$this->port" : "https://$this->host"; + // add path + $hostURL .= $this->path; + curl_setopt($this->ch, CURLOPT_URL, $hostURL); + // follow location headers (re-directs) + curl_setopt($this->ch, CURLOPT_FOLLOWLOCATION, 1); + // ask for headers in the response output + curl_setopt($this->ch, CURLOPT_HEADER, 1); + // ask for the response output as the return value + curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, 1); + // encode + // We manage this ourselves through headers and encoding +// if(function_exists('gzuncompress')){ +// curl_setopt($this->ch, CURLOPT_ENCODING, 'deflate'); +// } + // persistent connection + if ($this->persistentConnection) { + // The way we send data, we cannot use persistent connections, since + // there will be some "junk" at the end of our request. + //curl_setopt($this->ch, CURL_HTTP_VERSION_1_1, true); + $this->persistentConnection = false; + $this->outgoing_headers['Connection'] = 'close'; + $this->debug('set Connection: ' . $this->outgoing_headers['Connection']); + } + // set timeout + if ($connection_timeout != 0) { + curl_setopt($this->ch, CURLOPT_TIMEOUT, $connection_timeout); + } + // TODO: cURL has added a connection timeout separate from the response timeout + //if ($connection_timeout != 0) { + // curl_setopt($this->ch, CURLOPT_CONNECTIONTIMEOUT, $connection_timeout); + //} + //if ($response_timeout != 0) { + // curl_setopt($this->ch, CURLOPT_TIMEOUT, $response_timeout); + //} + + // recent versions of cURL turn on peer/host checking by default, + // while PHP binaries are not compiled with a default location for the + // CA cert bundle, so disable peer/host checking. +//curl_setopt($this->ch, CURLOPT_CAINFO, 'f:\php-4.3.2-win32\extensions\curl-ca-bundle.crt'); + curl_setopt($this->ch, CURLOPT_SSL_VERIFYPEER, 0); + curl_setopt($this->ch, CURLOPT_SSL_VERIFYHOST, 0); + + // support client certificates (thanks Tobias Boes, Doug Anarino, Eryan Ariobowo) + if ($this->authtype == 'certificate') { + //added by Onti + $this->debug('authtype == certificate'); + if (isset($this->certRequest['cainfofile'])) { + curl_setopt($this->ch, CURLOPT_CAINFO, $this->certRequest['cainfofile']); + } + if (isset($this->certRequest['verifypeer'])) { + curl_setopt($this->ch, CURLOPT_SSL_VERIFYPEER, $this->certRequest['verifypeer']); + } else { + curl_setopt($this->ch, CURLOPT_SSL_VERIFYPEER, 1); + } + if (isset($this->certRequest['verifyhost'])) { + curl_setopt($this->ch, CURLOPT_SSL_VERIFYHOST, $this->certRequest['verifyhost']); + } else { + curl_setopt($this->ch, CURLOPT_SSL_VERIFYHOST, 1); + } + if (isset($this->certRequest['sslcertfile'])) { + curl_setopt($this->ch, CURLOPT_SSLCERT, $this->certRequest['sslcertfile']); + } + if (isset($this->certRequest['sslkeyfile'])) { + curl_setopt($this->ch, CURLOPT_SSLKEY, $this->certRequest['sslkeyfile']); + } + if (isset($this->certRequest['passphrase'])) { + curl_setopt($this->ch, CURLOPT_SSLKEYPASSWD , $this->certRequest['passphrase']); + } + curl_setopt($this->ch, CURLOPT_VERBOSE , 1 ); + //$handle = fopen('/home/xfer/curl.log', "ab+"); + //fwrite ($handle, date('Y-m-d H:i:s')."\n\n"); + //curl_setopt($this->ch, CURLOPT_STDERR, $handle ); + } + $this->debug('cURL connection set up'); + return true; + } else { + $this->setError('Unknown scheme ' . $this->scheme); + $this->debug('Unknown scheme ' . $this->scheme); + return false; + } + } + + /** + * send the SOAP message via HTTP + * + * @param string $data message data + * @param integer $timeout set connection timeout in seconds + * @param integer $response_timeout set response timeout in seconds + * @param array $cookies cookies to send + * @return string data + * @access public + */ + function send($data, $timeout=0, $response_timeout=30, $cookies=NULL) { + + $this->debug('entered send() with data of length: '.strlen($data)); + + $this->tryagain = true; + $tries = 0; + while ($this->tryagain) { + $this->tryagain = false; + if ($tries++ < 2) { + // make connnection + if (!$this->connect($timeout, $response_timeout)){ + return false; + } + + // send request + if (!$this->sendRequest($data, $cookies)){ + return false; + } + + // get response + $respdata = $this->getResponse(); + } else { + $this->setError('Too many tries to get an OK response'); + } + } + $this->debug('end of send()'); + return $respdata; + } + + + /** + * send the SOAP message via HTTPS 1.0 using CURL + * + * @param string $msg message data + * @param integer $timeout set connection timeout in seconds + * @param integer $response_timeout set response timeout in seconds + * @param array $cookies cookies to send + * @return string data + * @access public + */ + function sendHTTPS($data, $timeout=0, $response_timeout=30, $cookies) { + return $this->send($data, $timeout, $response_timeout, $cookies); + } + + /** + * if authenticating, set user credentials here + * + * @param string $username + * @param string $password + * @param string $authtype (basic, digest, certificate) + * @param array $digestRequest (keys must be nonce, nc, realm, qop) + * @param array $certRequest (keys must be cainfofile (optional), sslcertfile, sslkeyfile, passphrase, verifypeer (optional), verifyhost (optional): see corresponding options in cURL docs) + * @access public + */ + function setCredentials($username, $password, $authtype = 'basic', $digestRequest = array(), $certRequest = array()) { + $this->debug("Set credentials for authtype $authtype"); + // cf. RFC 2617 + if ($authtype == 'basic') { + $this->outgoing_headers['Authorization'] = 'Basic '.base64_encode(str_replace(':','',$username).':'.$password); + } elseif ($authtype == 'digest') { + if (isset($digestRequest['nonce'])) { + $digestRequest['nc'] = isset($digestRequest['nc']) ? $digestRequest['nc']++ : 1; + + // calculate the Digest hashes (calculate code based on digest implementation found at: http://www.rassoc.com/gregr/weblog/stories/2002/07/09/webServicesSecurityHttpDigestAuthenticationWithoutActiveDirectory.html) + + // A1 = unq(username-value) ":" unq(realm-value) ":" passwd + $A1 = $username. ':' . (isset($digestRequest['realm']) ? $digestRequest['realm'] : '') . ':' . $password; + + // H(A1) = MD5(A1) + $HA1 = $this->encryptOld($A1); + + // A2 = Method ":" digest-uri-value + $A2 = 'POST:' . $this->digest_uri; + + // H(A2) + $HA2 = $this->encryptOld($A2); + + // KD(secret, data) = H(concat(secret, ":", data)) + // if qop == auth: + // request-digest = <"> < KD ( H(A1), unq(nonce-value) + // ":" nc-value + // ":" unq(cnonce-value) + // ":" unq(qop-value) + // ":" H(A2) + // ) <"> + // if qop is missing, + // request-digest = <"> < KD ( H(A1), unq(nonce-value) ":" H(A2) ) > <"> + + $unhashedDigest = ''; + $nonce = isset($digestRequest['nonce']) ? $digestRequest['nonce'] : ''; + $cnonce = $nonce; + if ($digestRequest['qop'] != '') { + $unhashedDigest = $HA1 . ':' . $nonce . ':' . sprintf("%08d", $digestRequest['nc']) . ':' . $cnonce . ':' . $digestRequest['qop'] . ':' . $HA2; + } else { + $unhashedDigest = $HA1 . ':' . $nonce . ':' . $HA2; + } + + $hashedDigest = $this->encryptOld($unhashedDigest); + + $this->outgoing_headers['Authorization'] = 'Digest username="' . $username . '", realm="' . $digestRequest['realm'] . '", nonce="' . $nonce . '", uri="' . $this->digest_uri . '", cnonce="' . $cnonce . '", nc=' . sprintf("%08x", $digestRequest['nc']) . ', qop="' . $digestRequest['qop'] . '", response="' . $hashedDigest . '"'; + } + } elseif ($authtype == 'certificate') { + $this->certRequest = $certRequest; + } + $this->username = $username; + $this->password = $password; + $this->authtype = $authtype; + $this->digestRequest = $digestRequest; + + if (isset($this->outgoing_headers['Authorization'])) { + $this->debug('set Authorization: ' . substr($this->outgoing_headers['Authorization'], 0, 12) . '...'); + } else { + $this->debug('Authorization header not set'); + } + } + + /** + * set the soapaction value + * + * @param string $soapaction + * @access public + */ + function setSOAPAction($soapaction) { + $this->outgoing_headers['SOAPAction'] = '"' . $soapaction . '"'; + $this->debug('set SOAPAction: ' . $this->outgoing_headers['SOAPAction']); + } + + /** + * use http encoding + * + * @param string $enc encoding style. supported values: gzip, deflate, or both + * @access public + */ + function setEncoding($enc='gzip, deflate') { + if (function_exists('gzdeflate')) { + $this->protocol_version = '1.1'; + $this->outgoing_headers['Accept-Encoding'] = $enc; + $this->debug('set Accept-Encoding: ' . $this->outgoing_headers['Accept-Encoding']); + if (!isset($this->outgoing_headers['Connection'])) { + $this->outgoing_headers['Connection'] = 'close'; + $this->persistentConnection = false; + $this->debug('set Connection: ' . $this->outgoing_headers['Connection']); + } + set_magic_quotes_runtime(0); + // deprecated + $this->encoding = $enc; + } + } + + /** + * set proxy info here + * + * @param string $proxyhost + * @param string $proxyport + * @param string $proxyusername + * @param string $proxypassword + * @access public + */ + function setProxy($proxyhost, $proxyport, $proxyusername = '', $proxypassword = '') { + $this->uri = $this->url; + $this->host = $proxyhost; + $this->port = $proxyport; + if ($proxyusername != '' && $proxypassword != '') { + $this->outgoing_headers['Proxy-Authorization'] = ' Basic '.base64_encode($proxyusername.':'.$proxypassword); + $this->debug('set Proxy-Authorization: ' . $this->outgoing_headers['Proxy-Authorization']); + } + } + + /** + * decode a string that is encoded w/ "chunked' transfer encoding + * as defined in RFC2068 19.4.6 + * + * @param string $buffer + * @param string $lb + * @returns string + * @access public + * @deprecated + */ + function decodeChunked($buffer, $lb){ + // length := 0 + $length = 0; + $new = ''; + + // read chunk-size, chunk-extension (if any) and CRLF + // get the position of the linebreak + $chunkend = strpos($buffer, $lb); + if ($chunkend == FALSE) { + $this->debug('no linebreak found in decodeChunked'); + return $new; + } + $temp = substr($buffer,0,$chunkend); + $chunk_size = hexdec( trim($temp) ); + $chunkstart = $chunkend + strlen($lb); + // while (chunk-size > 0) { + while ($chunk_size > 0) { + $this->debug("chunkstart: $chunkstart chunk_size: $chunk_size"); + $chunkend = strpos( $buffer, $lb, $chunkstart + $chunk_size); + + // Just in case we got a broken connection + if ($chunkend == FALSE) { + $chunk = substr($buffer,$chunkstart); + // append chunk-data to entity-body + $new .= $chunk; + $length += strlen($chunk); + break; + } + + // read chunk-data and CRLF + $chunk = substr($buffer,$chunkstart,$chunkend-$chunkstart); + // append chunk-data to entity-body + $new .= $chunk; + // length := length + chunk-size + $length += strlen($chunk); + // read chunk-size and CRLF + $chunkstart = $chunkend + strlen($lb); + + $chunkend = strpos($buffer, $lb, $chunkstart) + strlen($lb); + if ($chunkend == FALSE) { + break; //Just in case we got a broken connection + } + $temp = substr($buffer,$chunkstart,$chunkend-$chunkstart); + $chunk_size = hexdec( trim($temp) ); + $chunkstart = $chunkend; + } + return $new; + } + + /* + * Writes payload, including HTTP headers, to $this->outgoing_payload. + */ + function buildPayload($data, $cookie_str = '') { + // add content-length header + $this->outgoing_headers['Content-Length'] = strlen($data); + $this->debug('set Content-Length: ' . $this->outgoing_headers['Content-Length']); + + // start building outgoing payload: + $req = "$this->request_method $this->uri HTTP/$this->protocol_version"; + $this->debug("HTTP request: $req"); + $this->outgoing_payload = "$req\r\n"; + + // loop thru headers, serializing + foreach($this->outgoing_headers as $k => $v){ + $hdr = $k.': '.$v; + $this->debug("HTTP header: $hdr"); + $this->outgoing_payload .= "$hdr\r\n"; + } + + // add any cookies + if ($cookie_str != '') { + $hdr = 'Cookie: '.$cookie_str; + $this->debug("HTTP header: $hdr"); + $this->outgoing_payload .= "$hdr\r\n"; + } + + // header/body separator + $this->outgoing_payload .= "\r\n"; + + // add data + $this->outgoing_payload .= $data; + } + + function sendRequest($data, $cookies = NULL) { + // build cookie string + $cookie_str = $this->getCookiesForRequest($cookies, (($this->scheme == 'ssl') || ($this->scheme == 'https'))); + + // build payload + $this->buildPayload($data, $cookie_str); + + if ($this->scheme == 'http' || $this->scheme == 'ssl') { + // send payload + if(!fputs($this->fp, $this->outgoing_payload, strlen($this->outgoing_payload))) { + $this->setError('couldn\'t write message data to socket'); + $this->debug('couldn\'t write message data to socket'); + return false; + } + $this->debug('wrote data to socket, length = ' . strlen($this->outgoing_payload)); + return true; + } else if ($this->scheme == 'https') { + // set payload + // TODO: cURL does say this should only be the verb, and in fact it + // turns out that the URI and HTTP version are appended to this, which + // some servers refuse to work with + //curl_setopt($this->ch, CURLOPT_CUSTOMREQUEST, $this->outgoing_payload); + foreach($this->outgoing_headers as $k => $v){ + $curl_headers[] = "$k: $v"; + } + if ($cookie_str != '') { + $curl_headers[] = 'Cookie: ' . $cookie_str; + } + curl_setopt($this->ch, CURLOPT_HTTPHEADER, $curl_headers); + if ($this->request_method == "POST") { + curl_setopt($this->ch, CURLOPT_POST, 1); + curl_setopt($this->ch, CURLOPT_POSTFIELDS, $data); + } else { + } + $this->debug('set cURL payload'); + return true; + } + } + + function getResponse(){ + $this->incoming_payload = ''; + + if ($this->scheme == 'http' || $this->scheme == 'ssl') { + // loop until headers have been retrieved + $data = ''; + while (!isset($lb)){ + + // We might EOF during header read. + if(feof($this->fp)) { + $this->incoming_payload = $data; + $this->debug('found no headers before EOF after length ' . strlen($data)); + $this->debug("received before EOF:\n" . $data); + $this->setError('server failed to send headers'); + return false; + } + + $tmp = fgets($this->fp, 256); + $tmplen = strlen($tmp); + $this->debug("read line of $tmplen bytes: " . trim($tmp)); + + if ($tmplen == 0) { + $this->incoming_payload = $data; + $this->debug('socket read of headers timed out after length ' . strlen($data)); + $this->debug("read before timeout: " . $data); + $this->setError('socket read of headers timed out'); + return false; + } + + $data .= $tmp; + $pos = strpos($data,"\r\n\r\n"); + if($pos > 1){ + $lb = "\r\n"; + } else { + $pos = strpos($data,"\n\n"); + if($pos > 1){ + $lb = "\n"; + } + } + // remove 100 header + if(isset($lb) && ereg('^HTTP/1.1 100',$data)){ + unset($lb); + $data = ''; + }// + } + // store header data + $this->incoming_payload .= $data; + $this->debug('found end of headers after length ' . strlen($data)); + // process headers + $header_data = trim(substr($data,0,$pos)); + $header_array = explode($lb,$header_data); + $this->incoming_headers = array(); + $this->incoming_cookies = array(); + foreach($header_array as $header_line){ + $arr = explode(':',$header_line, 2); + if(count($arr) > 1){ + $header_name = strtolower(trim($arr[0])); + $this->incoming_headers[$header_name] = trim($arr[1]); + if ($header_name == 'set-cookie') { + // TODO: allow multiple cookies from parseCookie + $cookie = $this->parseCookie(trim($arr[1])); + if ($cookie) { + $this->incoming_cookies[] = $cookie; + $this->debug('found cookie: ' . $cookie['name'] . ' = ' . $cookie['value']); + } else { + $this->debug('did not find cookie in ' . trim($arr[1])); + } + } + } else if (isset($header_name)) { + // append continuation line to previous header + $this->incoming_headers[$header_name] .= $lb . ' ' . $header_line; + } + } + + // loop until msg has been received + if (isset($this->incoming_headers['transfer-encoding']) && strtolower($this->incoming_headers['transfer-encoding']) == 'chunked') { + $content_length = 2147483647; // ignore any content-length header + $chunked = true; + $this->debug("want to read chunked content"); + } elseif (isset($this->incoming_headers['content-length'])) { + $content_length = $this->incoming_headers['content-length']; + $chunked = false; + $this->debug("want to read content of length $content_length"); + } else { + $content_length = 2147483647; + $chunked = false; + $this->debug("want to read content to EOF"); + } + $data = ''; + do { + if ($chunked) { + $tmp = fgets($this->fp, 256); + $tmplen = strlen($tmp); + $this->debug("read chunk line of $tmplen bytes"); + if ($tmplen == 0) { + $this->incoming_payload = $data; + $this->debug('socket read of chunk length timed out after length ' . strlen($data)); + $this->debug("read before timeout:\n" . $data); + $this->setError('socket read of chunk length timed out'); + return false; + } + $content_length = hexdec(trim($tmp)); + $this->debug("chunk length $content_length"); + } + $strlen = 0; + while (($strlen < $content_length) && (!feof($this->fp))) { + $readlen = min(8192, $content_length - $strlen); + $tmp = fread($this->fp, $readlen); + $tmplen = strlen($tmp); + $this->debug("read buffer of $tmplen bytes"); + if (($tmplen == 0) && (!feof($this->fp))) { + $this->incoming_payload = $data; + $this->debug('socket read of body timed out after length ' . strlen($data)); + $this->debug("read before timeout:\n" . $data); + $this->setError('socket read of body timed out'); + return false; + } + $strlen += $tmplen; + $data .= $tmp; + } + if ($chunked && ($content_length > 0)) { + $tmp = fgets($this->fp, 256); + $tmplen = strlen($tmp); + $this->debug("read chunk terminator of $tmplen bytes"); + if ($tmplen == 0) { + $this->incoming_payload = $data; + $this->debug('socket read of chunk terminator timed out after length ' . strlen($data)); + $this->debug("read before timeout:\n" . $data); + $this->setError('socket read of chunk terminator timed out'); + return false; + } + } + } while ($chunked && ($content_length > 0) && (!feof($this->fp))); + if (feof($this->fp)) { + $this->debug('read to EOF'); + } + $this->debug('read body of length ' . strlen($data)); + $this->incoming_payload .= $data; + $this->debug('received a total of '.strlen($this->incoming_payload).' bytes of data from server'); + + // close filepointer + if( + (isset($this->incoming_headers['connection']) && strtolower($this->incoming_headers['connection']) == 'close') || + (! $this->persistentConnection) || feof($this->fp)){ + fclose($this->fp); + $this->fp = false; + $this->debug('closed socket'); + } + + // connection was closed unexpectedly + if($this->incoming_payload == ''){ + $this->setError('no response from server'); + return false; + } + + // decode transfer-encoding +// if(isset($this->incoming_headers['transfer-encoding']) && strtolower($this->incoming_headers['transfer-encoding']) == 'chunked'){ +// if(!$data = $this->decodeChunked($data, $lb)){ +// $this->setError('Decoding of chunked data failed'); +// return false; +// } + //print "
    \nde-chunked:\n---------------\n$data\n\n---------------\n
    "; + // set decoded payload +// $this->incoming_payload = $header_data.$lb.$lb.$data; +// } + + } else if ($this->scheme == 'https') { + // send and receive + $this->debug('send and receive with cURL'); + $this->incoming_payload = curl_exec($this->ch); + $data = $this->incoming_payload; + + $cErr = curl_error($this->ch); + if ($cErr != '') { + $err = 'cURL ERROR: '.curl_errno($this->ch).': '.$cErr.'
    '; + // TODO: there is a PHP bug that can cause this to SEGV for CURLINFO_CONTENT_TYPE + foreach(curl_getinfo($this->ch) as $k => $v){ + $err .= "$k: $v
    "; + } + $this->debug($err); + $this->setError($err); + curl_close($this->ch); + return false; + } else { + //echo '
    ';
    +			//var_dump(curl_getinfo($this->ch));
    +			//echo '
    '; + } + // close curl + $this->debug('No cURL error, closing cURL'); + curl_close($this->ch); + + // remove 100 header(s) + while (ereg('^HTTP/1.1 100',$data)) { + if ($pos = strpos($data,"\r\n\r\n")) { + $data = ltrim(substr($data,$pos)); + } elseif($pos = strpos($data,"\n\n") ) { + $data = ltrim(substr($data,$pos)); + } + } + + // separate content from HTTP headers + if ($pos = strpos($data,"\r\n\r\n")) { + $lb = "\r\n"; + } elseif( $pos = strpos($data,"\n\n")) { + $lb = "\n"; + } else { + $this->debug('no proper separation of headers and document'); + $this->setError('no proper separation of headers and document'); + return false; + } + $header_data = trim(substr($data,0,$pos)); + $header_array = explode($lb,$header_data); + $data = ltrim(substr($data,$pos)); + $this->debug('found proper separation of headers and document'); + $this->debug('cleaned data, stringlen: '.strlen($data)); + // clean headers + foreach ($header_array as $header_line) { + $arr = explode(':',$header_line,2); + if(count($arr) > 1){ + $header_name = strtolower(trim($arr[0])); + $this->incoming_headers[$header_name] = trim($arr[1]); + if ($header_name == 'set-cookie') { + // TODO: allow multiple cookies from parseCookie + $cookie = $this->parseCookie(trim($arr[1])); + if ($cookie) { + $this->incoming_cookies[] = $cookie; + $this->debug('found cookie: ' . $cookie['name'] . ' = ' . $cookie['value']); + } else { + $this->debug('did not find cookie in ' . trim($arr[1])); + } + } + } else if (isset($header_name)) { + // append continuation line to previous header + $this->incoming_headers[$header_name] .= $lb . ' ' . $header_line; + } + } + } + + $arr = explode(' ', $header_array[0], 3); + $http_version = $arr[0]; + $http_status = intval($arr[1]); + $http_reason = count($arr) > 2 ? $arr[2] : ''; + + // see if we need to resend the request with http digest authentication + if (isset($this->incoming_headers['location']) && $http_status == 301) { + $this->debug("Got 301 $http_reason with Location: " . $this->incoming_headers['location']); + $this->setURL($this->incoming_headers['location']); + $this->tryagain = true; + return false; + } + + // see if we need to resend the request with http digest authentication + if (isset($this->incoming_headers['www-authenticate']) && $http_status == 401) { + $this->debug("Got 401 $http_reason with WWW-Authenticate: " . $this->incoming_headers['www-authenticate']); + if (strstr($this->incoming_headers['www-authenticate'], "Digest ")) { + $this->debug('Server wants digest authentication'); + // remove "Digest " from our elements + $digestString = str_replace('Digest ', '', $this->incoming_headers['www-authenticate']); + + // parse elements into array + $digestElements = explode(',', $digestString); + foreach ($digestElements as $val) { + $tempElement = explode('=', trim($val), 2); + $digestRequest[$tempElement[0]] = str_replace("\"", '', $tempElement[1]); + } + + // should have (at least) qop, realm, nonce + if (isset($digestRequest['nonce'])) { + $this->setCredentials($this->username, $this->password, 'digest', $digestRequest); + $this->tryagain = true; + return false; + } + } + $this->debug('HTTP authentication failed'); + $this->setError('HTTP authentication failed'); + return false; + } + + if ( + ($http_status >= 300 && $http_status <= 307) || + ($http_status >= 400 && $http_status <= 417) || + ($http_status >= 501 && $http_status <= 505) + ) { + $this->setError("Unsupported HTTP response status $http_status $http_reason (soapclient->response has contents of the response)"); + return false; + } + + // decode content-encoding + if(isset($this->incoming_headers['content-encoding']) && $this->incoming_headers['content-encoding'] != ''){ + if(strtolower($this->incoming_headers['content-encoding']) == 'deflate' || strtolower($this->incoming_headers['content-encoding']) == 'gzip'){ + // if decoding works, use it. else assume data wasn't gzencoded + if(function_exists('gzinflate')){ + //$timer->setMarker('starting decoding of gzip/deflated content'); + // IIS 5 requires gzinflate instead of gzuncompress (similar to IE 5 and gzdeflate v. gzcompress) + // this means there are no Zlib headers, although there should be + $this->debug('The gzinflate function exists'); + $datalen = strlen($data); + if ($this->incoming_headers['content-encoding'] == 'deflate') { + if ($degzdata = @gzinflate($data)) { + $data = $degzdata; + $this->debug('The payload has been inflated to ' . strlen($data) . ' bytes'); + if (strlen($data) < $datalen) { + // test for the case that the payload has been compressed twice + $this->debug('The inflated payload is smaller than the gzipped one; try again'); + if ($degzdata = @gzinflate($data)) { + $data = $degzdata; + $this->debug('The payload has been inflated again to ' . strlen($data) . ' bytes'); + } + } + } else { + $this->debug('Error using gzinflate to inflate the payload'); + $this->setError('Error using gzinflate to inflate the payload'); + } + } elseif ($this->incoming_headers['content-encoding'] == 'gzip') { + if ($degzdata = @gzinflate(substr($data, 10))) { // do our best + $data = $degzdata; + $this->debug('The payload has been un-gzipped to ' . strlen($data) . ' bytes'); + if (strlen($data) < $datalen) { + // test for the case that the payload has been compressed twice + $this->debug('The un-gzipped payload is smaller than the gzipped one; try again'); + if ($degzdata = @gzinflate(substr($data, 10))) { + $data = $degzdata; + $this->debug('The payload has been un-gzipped again to ' . strlen($data) . ' bytes'); + } + } + } else { + $this->debug('Error using gzinflate to un-gzip the payload'); + $this->setError('Error using gzinflate to un-gzip the payload'); + } + } + //$timer->setMarker('finished decoding of gzip/deflated content'); + //print "\nde-inflated:\n---------------\n$data\n-------------\n"; + // set decoded payload + $this->incoming_payload = $header_data.$lb.$lb.$data; + } else { + $this->debug('The server sent compressed data. Your php install must have the Zlib extension compiled in to support this.'); + $this->setError('The server sent compressed data. Your php install must have the Zlib extension compiled in to support this.'); + } + } else { + $this->debug('Unsupported Content-Encoding ' . $this->incoming_headers['content-encoding']); + $this->setError('Unsupported Content-Encoding ' . $this->incoming_headers['content-encoding']); + } + } else { + $this->debug('No Content-Encoding header'); + } + + if(strlen($data) == 0){ + $this->debug('no data after headers!'); + $this->setError('no data present after HTTP headers'); + return false; + } + + return $data; + } + + function setContentType($type, $charset = false) { + $this->outgoing_headers['Content-Type'] = $type . ($charset ? '; charset=' . $charset : ''); + $this->debug('set Content-Type: ' . $this->outgoing_headers['Content-Type']); + } + + function usePersistentConnection(){ + if (isset($this->outgoing_headers['Accept-Encoding'])) { + return false; + } + $this->protocol_version = '1.1'; + $this->persistentConnection = true; + $this->outgoing_headers['Connection'] = 'Keep-Alive'; + $this->debug('set Connection: ' . $this->outgoing_headers['Connection']); + return true; + } + + /** + * parse an incoming Cookie into it's parts + * + * @param string $cookie_str content of cookie + * @return array with data of that cookie + * @access private + */ + /* + * TODO: allow a Set-Cookie string to be parsed into multiple cookies + */ + function parseCookie($cookie_str) { + $cookie_str = str_replace('; ', ';', $cookie_str) . ';'; + $data = explode(';', $cookie_str); + $value_str = $data[0]; + + $cookie_param = 'domain='; + $start = strpos($cookie_str, $cookie_param); + if ($start > 0) { + $domain = substr($cookie_str, $start + strlen($cookie_param)); + $domain = substr($domain, 0, strpos($domain, ';')); + } else { + $domain = ''; + } + + $cookie_param = 'expires='; + $start = strpos($cookie_str, $cookie_param); + if ($start > 0) { + $expires = substr($cookie_str, $start + strlen($cookie_param)); + $expires = substr($expires, 0, strpos($expires, ';')); + } else { + $expires = ''; + } + + $cookie_param = 'path='; + $start = strpos($cookie_str, $cookie_param); + if ( $start > 0 ) { + $path = substr($cookie_str, $start + strlen($cookie_param)); + $path = substr($path, 0, strpos($path, ';')); + } else { + $path = '/'; + } + + $cookie_param = ';secure;'; + if (strpos($cookie_str, $cookie_param) !== FALSE) { + $secure = true; + } else { + $secure = false; + } + + $sep_pos = strpos($value_str, '='); + + if ($sep_pos) { + $name = substr($value_str, 0, $sep_pos); + $value = substr($value_str, $sep_pos + 1); + $cookie= array( 'name' => $name, + 'value' => $value, + 'domain' => $domain, + 'path' => $path, + 'expires' => $expires, + 'secure' => $secure + ); + return $cookie; + } + return false; + } + + /** + * sort out cookies for the current request + * + * @param array $cookies array with all cookies + * @param boolean $secure is the send-content secure or not? + * @return string for Cookie-HTTP-Header + * @access private + */ + function getCookiesForRequest($cookies, $secure=false) { + $cookie_str = ''; + if ((! is_null($cookies)) && (is_array($cookies))) { + foreach ($cookies as $cookie) { + if (! is_array($cookie)) { + continue; + } + $this->debug("check cookie for validity: ".$cookie['name'].'='.$cookie['value']); + if ((isset($cookie['expires'])) && (! empty($cookie['expires']))) { + if (strtotime($cookie['expires']) <= time()) { + $this->debug('cookie has expired'); + continue; + } + } + if ((isset($cookie['domain'])) && (! empty($cookie['domain']))) { + $domain = preg_quote($cookie['domain']); + if (! preg_match("'.*$domain$'i", $this->host)) { + $this->debug('cookie has different domain'); + continue; + } + } + if ((isset($cookie['path'])) && (! empty($cookie['path']))) { + $path = preg_quote($cookie['path']); + if (! preg_match("'^$path.*'i", $this->path)) { + $this->debug('cookie is for a different path'); + continue; + } + } + if ((! $secure) && (isset($cookie['secure'])) && ($cookie['secure'])) { + $this->debug('cookie is secure, transport is not'); + continue; + } + $cookie_str .= $cookie['name'] . '=' . $cookie['value'] . '; '; + $this->debug('add cookie to Cookie-String: ' . $cookie['name'] . '=' . $cookie['value']); + } + } + return $cookie_str; + } + + public function encryptOld($string) + { + if (!class_exists('G')) { + $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); + $docuroot = explode( '/', $realdocuroot ); + array_pop( $docuroot ); + $pathhome = implode( '/', $docuroot ) . '/'; + array_pop( $docuroot ); + $pathTrunk = implode( '/', $docuroot ) . '/'; + require_once($pathTrunk.'gulliver/system/class.g.php'); + } + return G::encryptOld($string); + } +} + +?> +* @version $Id: nusoap.php,v 1.94 2005/08/04 01:27:42 snichol Exp $ +* @access public +*/ +class soap_server extends nusoap_base { + /** + * HTTP headers of request + * @var array + * @access private + */ + var $headers = array(); + /** + * HTTP request + * @var string + * @access private + */ + var $request = ''; + /** + * SOAP headers from request (incomplete namespace resolution; special characters not escaped) (text) + * @var string + * @access public + */ + var $requestHeaders = ''; + /** + * SOAP body request portion (incomplete namespace resolution; special characters not escaped) (text) + * @var string + * @access public + */ + var $document = ''; + /** + * SOAP payload for request (text) + * @var string + * @access public + */ + var $requestSOAP = ''; + /** + * requested method namespace URI + * @var string + * @access private + */ + var $methodURI = ''; + /** + * name of method requested + * @var string + * @access private + */ + var $methodname = ''; + /** + * method parameters from request + * @var array + * @access private + */ + var $methodparams = array(); + /** + * SOAP Action from request + * @var string + * @access private + */ + var $SOAPAction = ''; + /** + * character set encoding of incoming (request) messages + * @var string + * @access public + */ + var $xml_encoding = ''; + /** + * toggles whether the parser decodes element content w/ utf8_decode() + * @var boolean + * @access public + */ + var $decode_utf8 = true; + + /** + * HTTP headers of response + * @var array + * @access public + */ + var $outgoing_headers = array(); + /** + * HTTP response + * @var string + * @access private + */ + var $response = ''; + /** + * SOAP headers for response (text) + * @var string + * @access public + */ + var $responseHeaders = ''; + /** + * SOAP payload for response (text) + * @var string + * @access private + */ + var $responseSOAP = ''; + /** + * method return value to place in response + * @var mixed + * @access private + */ + var $methodreturn = false; + /** + * whether $methodreturn is a string of literal XML + * @var boolean + * @access public + */ + var $methodreturnisliteralxml = false; + /** + * SOAP fault for response (or false) + * @var mixed + * @access private + */ + var $fault = false; + /** + * text indication of result (for debugging) + * @var string + * @access private + */ + var $result = 'successful'; + + /** + * assoc array of operations => opData; operations are added by the register() + * method or by parsing an external WSDL definition + * @var array + * @access private + */ + var $operations = array(); + /** + * wsdl instance (if one) + * @var mixed + * @access private + */ + var $wsdl = false; + /** + * URL for WSDL (if one) + * @var mixed + * @access private + */ + var $externalWSDLURL = false; + /** + * whether to append debug to response as XML comment + * @var boolean + * @access public + */ + var $debug_flag = false; + + + /** + * constructor + * the optional parameter is a path to a WSDL file that you'd like to bind the server instance to. + * + * @param mixed $wsdl file path or URL (string), or wsdl instance (object) + * @access public + */ + function soap_server($wsdl=false){ + parent::nusoap_base(); + // turn on debugging? + global $debug; + global $HTTP_SERVER_VARS; + + if (isset($_SERVER)) { + $this->debug("_SERVER is defined:"); + $this->appendDebug($this->varDump($_SERVER)); + } elseif (isset($HTTP_SERVER_VARS)) { + $this->debug("HTTP_SERVER_VARS is defined:"); + $this->appendDebug($this->varDump($HTTP_SERVER_VARS)); + } else { + $this->debug("Neither _SERVER nor HTTP_SERVER_VARS is defined."); + } + + if (isset($debug)) { + $this->debug("In soap_server, set debug_flag=$debug based on global flag"); + $this->debug_flag = $debug; + } elseif (isset($_SERVER['QUERY_STRING'])) { + $qs = explode('&', $_SERVER['QUERY_STRING']); + foreach ($qs as $v) { + if (substr($v, 0, 6) == 'debug=') { + $this->debug("In soap_server, set debug_flag=" . substr($v, 6) . " based on query string #1"); + $this->debug_flag = substr($v, 6); + } + } + } elseif (isset($HTTP_SERVER_VARS['QUERY_STRING'])) { + $qs = explode('&', $HTTP_SERVER_VARS['QUERY_STRING']); + foreach ($qs as $v) { + if (substr($v, 0, 6) == 'debug=') { + $this->debug("In soap_server, set debug_flag=" . substr($v, 6) . " based on query string #2"); + $this->debug_flag = substr($v, 6); + } + } + } + + // wsdl + if($wsdl){ + $this->debug("In soap_server, WSDL is specified"); + if (is_object($wsdl) && (get_class($wsdl) == 'wsdl')) { + $this->wsdl = $wsdl; + $this->externalWSDLURL = $this->wsdl->wsdl; + $this->debug('Use existing wsdl instance from ' . $this->externalWSDLURL); + } else { + $this->debug('Create wsdl from ' . $wsdl); + $this->wsdl = new wsdl($wsdl); + $this->externalWSDLURL = $wsdl; + } + $this->appendDebug($this->wsdl->getDebug()); + $this->wsdl->clearDebug(); + if($err = $this->wsdl->getError()){ + + if (!class_exists('G')) { + $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); + $docuroot = explode( '/', $realdocuroot ); + array_pop( $docuroot ); + $pathhome = implode( '/', $docuroot ) . '/'; + array_pop( $docuroot ); + $pathTrunk = implode( '/', $docuroot ) . '/'; + require_once($pathTrunk.'gulliver/system/class.g.php'); + } + G::LoadSystem('inputfilter'); + $filter = new InputFilter(); + $err = $filter->xssFilterHard($err); + + die('WSDL ERROR: '.$err); + } + } + } + + /** + * processes request and returns response + * + * @param string $data usually is the value of $HTTP_RAW_POST_DATA + * @access public + */ + function service($data){ + global $HTTP_SERVER_VARS; + + if (isset($_SERVER['QUERY_STRING'])) { + $qs = $_SERVER['QUERY_STRING']; + } elseif (isset($HTTP_SERVER_VARS['QUERY_STRING'])) { + $qs = $HTTP_SERVER_VARS['QUERY_STRING']; + } else { + $qs = ''; + } + $this->debug("In service, query string=$qs"); + + if (ereg('wsdl', $qs) ){ + $this->debug("In service, this is a request for WSDL"); + if($this->externalWSDLURL){ + if (strpos($this->externalWSDLURL,"://")!==false) { // assume URL + header('Location: '.$this->externalWSDLURL); + } else { // assume file + header("Content-Type: text/xml\r\n"); + $fp = fopen($this->externalWSDLURL, 'r'); + fpassthru($fp); + } + } elseif ($this->wsdl) { + header("Content-Type: text/xml; charset=ISO-8859-1\r\n"); + print $this->wsdl->serialize($this->debug_flag); + if ($this->debug_flag) { + $this->debug('wsdl:'); + $this->appendDebug($this->varDump($this->wsdl)); + print $this->getDebugAsXMLComment(); + } + } else { + header("Content-Type: text/html; charset=ISO-8859-1\r\n"); + print "This service does not provide WSDL"; + } + } elseif ($data == '' && $this->wsdl) { + $this->debug("In service, there is no data, so return Web description"); + + if (!class_exists('G')) { + $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); + $docuroot = explode( '/', $realdocuroot ); + array_pop( $docuroot ); + $pathhome = implode( '/', $docuroot ) . '/'; + array_pop( $docuroot ); + $pathTrunk = implode( '/', $docuroot ) . '/'; + require_once($pathTrunk.'gulliver/system/class.g.php'); + } + G::LoadSystem('inputfilter'); + $filter = new InputFilter(); + $webDescription = $filter->xssFilterHard($this->wsdl->webDescription()); + + print $webDescription; + } else { + $this->debug("In service, invoke the request"); + $this->parse_request($data); + if (! $this->fault) { + $this->invoke_method(); + } + if (! $this->fault) { + $this->serialize_return(); + } + $this->send_response(); + } + } + + /** + * parses HTTP request headers. + * + * The following fields are set by this function (when successful) + * + * headers + * request + * xml_encoding + * SOAPAction + * + * @access private + */ + function parse_http_headers() { + global $HTTP_SERVER_VARS; + + $this->request = ''; + $this->SOAPAction = ''; + if(function_exists('getallheaders')){ + $this->debug("In parse_http_headers, use getallheaders"); + $headers = getallheaders(); + foreach($headers as $k=>$v){ + $k = strtolower($k); + $this->headers[$k] = $v; + $this->request .= "$k: $v\r\n"; + $this->debug("$k: $v"); + } + // get SOAPAction header + if(isset($this->headers['soapaction'])){ + $this->SOAPAction = str_replace('"','',$this->headers['soapaction']); + } + // get the character encoding of the incoming request + if(isset($this->headers['content-type']) && strpos($this->headers['content-type'],'=')){ + $enc = str_replace('"','',substr(strstr($this->headers["content-type"],'='),1)); + if(preg_match('/(ISO-8859-1|US-ASCII|UTF-8)/',$enc)){ + $this->xml_encoding = strtoupper($enc); + } else { + $this->xml_encoding = 'US-ASCII'; + } + } else { + // should be US-ASCII for HTTP 1.0 or ISO-8859-1 for HTTP 1.1 + $this->xml_encoding = 'ISO-8859-1'; + } + } elseif(isset($_SERVER) && is_array($_SERVER)){ + $this->debug("In parse_http_headers, use _SERVER"); + foreach ($_SERVER as $k => $v) { + if (substr($k, 0, 5) == 'HTTP_') { + $k = str_replace(' ', '-', strtolower(str_replace('_', ' ', substr($k, 5)))); $k = strtolower(substr($k, 5)); + } else { + $k = str_replace(' ', '-', strtolower(str_replace('_', ' ', $k))); $k = strtolower($k); + } + if ($k == 'soapaction') { + // get SOAPAction header + $k = 'SOAPAction'; + $v = str_replace('"', '', $v); + $v = str_replace('\\', '', $v); + $this->SOAPAction = $v; + } else if ($k == 'content-type') { + // get the character encoding of the incoming request + if (strpos($v, '=')) { + $enc = substr(strstr($v, '='), 1); + $enc = str_replace('"', '', $enc); + $enc = str_replace('\\', '', $enc); + if (preg_match('/(ISO-8859-1|US-ASCII|UTF-8)/', $enc)) { + $this->xml_encoding = strtoupper($enc); + } else { + $this->xml_encoding = 'US-ASCII'; + } + } else { + // should be US-ASCII for HTTP 1.0 or ISO-8859-1 for HTTP 1.1 + $this->xml_encoding = 'ISO-8859-1'; + } + } + $this->headers[$k] = $v; + $this->request .= "$k: $v\r\n"; + $this->debug("$k: $v"); + } + } elseif (is_array($HTTP_SERVER_VARS)) { + $this->debug("In parse_http_headers, use HTTP_SERVER_VARS"); + foreach ($HTTP_SERVER_VARS as $k => $v) { + if (substr($k, 0, 5) == 'HTTP_') { + $k = str_replace(' ', '-', strtolower(str_replace('_', ' ', substr($k, 5)))); $k = strtolower(substr($k, 5)); + } else { + $k = str_replace(' ', '-', strtolower(str_replace('_', ' ', $k))); $k = strtolower($k); + } + if ($k == 'soapaction') { + // get SOAPAction header + $k = 'SOAPAction'; + $v = str_replace('"', '', $v); + $v = str_replace('\\', '', $v); + $this->SOAPAction = $v; + } else if ($k == 'content-type') { + // get the character encoding of the incoming request + if (strpos($v, '=')) { + $enc = substr(strstr($v, '='), 1); + $enc = str_replace('"', '', $enc); + $enc = str_replace('\\', '', $enc); + if (preg_match('/(ISO-8859-1|US-ASCII|UTF-8)/', $enc)) { + $this->xml_encoding = strtoupper($enc); + } else { + $this->xml_encoding = 'US-ASCII'; + } + } else { + // should be US-ASCII for HTTP 1.0 or ISO-8859-1 for HTTP 1.1 + $this->xml_encoding = 'ISO-8859-1'; + } + } + $this->headers[$k] = $v; + $this->request .= "$k: $v\r\n"; + $this->debug("$k: $v"); + } + } else { + $this->debug("In parse_http_headers, HTTP headers not accessible"); + $this->setError("HTTP headers not accessible"); + } + } + + /** + * parses a request + * + * The following fields are set by this function (when successful) + * + * headers + * request + * xml_encoding + * SOAPAction + * request + * requestSOAP + * methodURI + * methodname + * methodparams + * requestHeaders + * document + * + * This sets the fault field on error + * + * @param string $data XML string + * @access private + */ + function parse_request($data='') { + $this->debug('entering parse_request()'); + $this->parse_http_headers(); + $this->debug('got character encoding: '.$this->xml_encoding); + // uncompress if necessary + if (isset($this->headers['content-encoding']) && $this->headers['content-encoding'] != '') { + $this->debug('got content encoding: ' . $this->headers['content-encoding']); + if ($this->headers['content-encoding'] == 'deflate' || $this->headers['content-encoding'] == 'gzip') { + // if decoding works, use it. else assume data wasn't gzencoded + if (function_exists('gzuncompress')) { + if ($this->headers['content-encoding'] == 'deflate' && $degzdata = @gzuncompress($data)) { + $data = $degzdata; + } elseif ($this->headers['content-encoding'] == 'gzip' && $degzdata = gzinflate(substr($data, 10))) { + $data = $degzdata; + } else { + $this->fault('Client', 'Errors occurred when trying to decode the data'); + return; + } + } else { + $this->fault('Client', 'This Server does not support compressed data'); + return; + } + } + } + $this->request .= "\r\n".$data; + $data = $this->parseRequest($this->headers, $data); + $this->requestSOAP = $data; + $this->debug('leaving parse_request'); + } + + /** + * invokes a PHP function for the requested SOAP method + * + * The following fields are set by this function (when successful) + * + * methodreturn + * + * Note that the PHP function that is called may also set the following + * fields to affect the response sent to the client + * + * responseHeaders + * outgoing_headers + * + * This sets the fault field on error + * + * @access private + */ + function invoke_method() { + $this->debug('in invoke_method, methodname=' . $this->methodname . ' methodURI=' . $this->methodURI . ' SOAPAction=' . $this->SOAPAction); + + if ($this->wsdl) { + if ($this->opData = $this->wsdl->getOperationData($this->methodname)) { + $this->debug('in invoke_method, found WSDL operation=' . $this->methodname); + $this->appendDebug('opData=' . $this->varDump($this->opData)); + } elseif ($this->opData = $this->wsdl->getOperationDataForSoapAction($this->SOAPAction)) { + // Note: hopefully this case will only be used for doc/lit, since rpc services should have wrapper element + $this->debug('in invoke_method, found WSDL soapAction=' . $this->SOAPAction . ' for operation=' . $this->opData['name']); + $this->appendDebug('opData=' . $this->varDump($this->opData)); + $this->methodname = $this->opData['name']; + } else { + $this->debug('in invoke_method, no WSDL for operation=' . $this->methodname); + $this->fault('Client', "Operation '" . $this->methodname . "' is not defined in the WSDL for this service"); + return; + } + } else { + $this->debug('in invoke_method, no WSDL to validate method'); + } + + // if a . is present in $this->methodname, we see if there is a class in scope, + // which could be referred to. We will also distinguish between two deliminators, + // to allow methods to be called a the class or an instance + $class = ''; + $method = ''; + if (strpos($this->methodname, '..') > 0) { + $delim = '..'; + } else if (strpos($this->methodname, '.') > 0) { + $delim = '.'; + } else { + $delim = ''; + } + + if (strlen($delim) > 0 && substr_count($this->methodname, $delim) == 1 && + class_exists(substr($this->methodname, 0, strpos($this->methodname, $delim)))) { + // get the class and method name + $class = substr($this->methodname, 0, strpos($this->methodname, $delim)); + $method = substr($this->methodname, strpos($this->methodname, $delim) + strlen($delim)); + $this->debug("in invoke_method, class=$class method=$method delim=$delim"); + } + + // does method exist? + if ($class == '') { + if (!function_exists($this->methodname)) { + $this->debug("in invoke_method, function '$this->methodname' not found!"); + $this->result = 'fault: method not found'; + $this->fault('Client',"method '$this->methodname' not defined in service"); + return; + } + } else { + $method_to_compare = (substr(phpversion(), 0, 2) == '4.') ? strtolower($method) : $method; + if (!in_array($method_to_compare, get_class_methods($class))) { + $this->debug("in invoke_method, method '$this->methodname' not found in class '$class'!"); + $this->result = 'fault: method not found'; + $this->fault('Client',"method '$this->methodname' not defined in service"); + return; + } + } + + // evaluate message, getting back parameters + // verify that request parameters match the method's signature + if(! $this->verify_method($this->methodname,$this->methodparams)){ + // debug + $this->debug('ERROR: request not verified against method signature'); + $this->result = 'fault: request failed validation against method signature'; + // return fault + $this->fault('Client',"Operation '$this->methodname' not defined in service."); + return; + } + + // if there are parameters to pass + $this->debug('in invoke_method, params:'); + $this->appendDebug($this->varDump($this->methodparams)); + $this->debug("in invoke_method, calling '$this->methodname'"); + if (!function_exists('call_user_func_array')) { + if ($class == '') { + $this->debug('in invoke_method, calling function using eval()'); + $funcCall = "\$this->methodreturn = $this->methodname("; + } else { + if ($delim == '..') { + $this->debug('in invoke_method, calling class method using eval()'); + $funcCall = "\$this->methodreturn = ".$class."::".$method."("; + } else { + $this->debug('in invoke_method, calling instance method using eval()'); + // generate unique instance name + $instname = "\$inst_".time(); + $funcCall = $instname." = new ".$class."(); "; + $funcCall .= "\$this->methodreturn = ".$instname."->".$method."("; + } + } + if ($this->methodparams) { + foreach ($this->methodparams as $param) { + if (is_array($param)) { + $this->fault('Client', 'NuSOAP does not handle complexType parameters correctly when using eval; call_user_func_array must be available'); + return; + } + $funcCall .= "\"$param\","; + } + $funcCall = substr($funcCall, 0, -1); + } + $funcCall .= ');'; + $this->debug('in invoke_method, function call: '.$funcCall); + @eval($funcCall); + } else { + if ($class == '') { + $this->debug('in invoke_method, calling function using call_user_func_array()'); + $call_arg = "$this->methodname"; // straight assignment changes $this->methodname to lower case after call_user_func_array() + } elseif ($delim == '..') { + $this->debug('in invoke_method, calling class method using call_user_func_array()'); + $call_arg = array ($class, $method); + } else { + $this->debug('in invoke_method, calling instance method using call_user_func_array()'); + $instance = new $class (); + $call_arg = array(&$instance, $method); + } + $this->methodreturn = call_user_func_array($call_arg, $this->methodparams); + } + $this->debug('in invoke_method, methodreturn:'); + $this->appendDebug($this->varDump($this->methodreturn)); + $this->debug("in invoke_method, called method $this->methodname, received $this->methodreturn of type ".gettype($this->methodreturn)); + } + + /** + * serializes the return value from a PHP function into a full SOAP Envelope + * + * The following fields are set by this function (when successful) + * + * responseSOAP + * + * This sets the fault field on error + * + * @access private + */ + function serialize_return() { + $this->debug('Entering serialize_return methodname: ' . $this->methodname . ' methodURI: ' . $this->methodURI); + // if fault + if (isset($this->methodreturn) && (get_class($this->methodreturn) == 'soap_fault')) { + $this->debug('got a fault object from method'); + $this->fault = $this->methodreturn; + return; + } elseif ($this->methodreturnisliteralxml) { + $return_val = $this->methodreturn; + // returned value(s) + } else { + $this->debug('got a(n) '.gettype($this->methodreturn).' from method'); + $this->debug('serializing return value'); + if($this->wsdl){ + // weak attempt at supporting multiple output params + if(sizeof($this->opData['output']['parts']) > 1){ + $opParams = $this->methodreturn; + } else { + // TODO: is this really necessary? + $opParams = array($this->methodreturn); + } + $return_val = $this->wsdl->serializeRPCParameters($this->methodname,'output',$opParams); + $this->appendDebug($this->wsdl->getDebug()); + $this->wsdl->clearDebug(); + if($errstr = $this->wsdl->getError()){ + $this->debug('got wsdl error: '.$errstr); + $this->fault('Server', 'unable to serialize result'); + return; + } + } else { + if (isset($this->methodreturn)) { + $return_val = $this->serialize_val($this->methodreturn, 'return'); + } else { + $return_val = ''; + $this->debug('in absence of WSDL, assume void return for backward compatibility'); + } + } + } + $this->debug('return value:'); + $this->appendDebug($this->varDump($return_val)); + + $this->debug('serializing response'); + if ($this->wsdl) { + $this->debug('have WSDL for serialization: style is ' . $this->opData['style']); + if ($this->opData['style'] == 'rpc') { + $this->debug('style is rpc for serialization: use is ' . $this->opData['output']['use']); + if ($this->opData['output']['use'] == 'literal') { + $payload = '<'.$this->methodname.'Response xmlns="'.$this->methodURI.'">'.$return_val.'methodname."Response>"; + } else { + $payload = 'methodname.'Response xmlns:ns1="'.$this->methodURI.'">'.$return_val.'methodname."Response>"; + } + } else { + $this->debug('style is not rpc for serialization: assume document'); + $payload = $return_val; + } + } else { + $this->debug('do not have WSDL for serialization: assume rpc/encoded'); + $payload = 'methodname.'Response xmlns:ns1="'.$this->methodURI.'">'.$return_val.'methodname."Response>"; + } + $this->result = 'successful'; + if($this->wsdl){ + //if($this->debug_flag){ + $this->appendDebug($this->wsdl->getDebug()); + // } + if (isset($opData['output']['encodingStyle'])) { + $encodingStyle = $opData['output']['encodingStyle']; + } else { + $encodingStyle = ''; + } + // Added: In case we use a WSDL, return a serialized env. WITH the usedNamespaces. + $this->responseSOAP = $this->serializeEnvelope($payload,$this->responseHeaders,$this->wsdl->usedNamespaces,$this->opData['style'],$encodingStyle); + } else { + $this->responseSOAP = $this->serializeEnvelope($payload,$this->responseHeaders); + } + $this->debug("Leaving serialize_return"); + } + + /** + * sends an HTTP response + * + * The following fields are set by this function (when successful) + * + * outgoing_headers + * response + * + * @access private + */ + function send_response() { + $this->debug('Enter send_response'); + if ($this->fault) { + $payload = $this->fault->serialize(); + $this->outgoing_headers[] = "HTTP/1.0 500 Internal Server Error"; + $this->outgoing_headers[] = "Status: 500 Internal Server Error"; + } else { + $payload = $this->responseSOAP; + // Some combinations of PHP+Web server allow the Status + // to come through as a header. Since OK is the default + // just do nothing. + // $this->outgoing_headers[] = "HTTP/1.0 200 OK"; + // $this->outgoing_headers[] = "Status: 200 OK"; + } + // add debug data if in debug mode + if(isset($this->debug_flag) && $this->debug_flag){ + $payload .= $this->getDebugAsXMLComment(); + } + $this->outgoing_headers[] = "Server: $this->title Server v$this->version"; + ereg('\$Revisio' . 'n: ([^ ]+)', $this->revision, $rev); + $this->outgoing_headers[] = "X-SOAP-Server: $this->title/$this->version (".$rev[1].")"; + // Let the Web server decide about this + //$this->outgoing_headers[] = "Connection: Close\r\n"; + $payload = $this->getHTTPBody($payload); + $type = $this->getHTTPContentType(); + $charset = $this->getHTTPContentTypeCharset(); + $this->outgoing_headers[] = "Content-Type: $type" . ($charset ? '; charset=' . $charset : ''); + //begin code to compress payload - by John + // NOTE: there is no way to know whether the Web server will also compress + // this data. + if (strlen($payload) > 1024 && isset($this->headers) && isset($this->headers['accept-encoding'])) { + if (strstr($this->headers['accept-encoding'], 'gzip')) { + if (function_exists('gzencode')) { + if (isset($this->debug_flag) && $this->debug_flag) { + $payload .= ""; + } + $this->outgoing_headers[] = "Content-Encoding: gzip"; + $payload = gzencode($payload); + } else { + if (isset($this->debug_flag) && $this->debug_flag) { + $payload .= ""; + } + } + } elseif (strstr($this->headers['accept-encoding'], 'deflate')) { + // Note: MSIE requires gzdeflate output (no Zlib header and checksum), + // instead of gzcompress output, + // which conflicts with HTTP 1.1 spec (http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.5) + if (function_exists('gzdeflate')) { + if (isset($this->debug_flag) && $this->debug_flag) { + $payload .= ""; + } + $this->outgoing_headers[] = "Content-Encoding: deflate"; + $payload = gzdeflate($payload); + } else { + if (isset($this->debug_flag) && $this->debug_flag) { + $payload .= ""; + } + } + } + } + //end code + $this->outgoing_headers[] = "Content-Length: ".strlen($payload); + reset($this->outgoing_headers); + foreach($this->outgoing_headers as $hdr){ + header($hdr, false); + } + print $payload; + $this->response = join("\r\n",$this->outgoing_headers)."\r\n\r\n".$payload; + } + + /** + * takes the value that was created by parsing the request + * and compares to the method's signature, if available. + * + * @param string $operation The operation to be invoked + * @param array $request The array of parameter values + * @return boolean Whether the operation was found + * @access private + */ + function verify_method($operation,$request){ + if(isset($this->wsdl) && is_object($this->wsdl)){ + if($this->wsdl->getOperationData($operation)){ + return true; + } + } elseif(isset($this->operations[$operation])){ + return true; + } + return false; + } + + /** + * processes SOAP message received from client + * + * @param array $headers The HTTP headers + * @param string $data unprocessed request data from client + * @return mixed value of the message, decoded into a PHP type + * @access private + */ + function parseRequest($headers, $data) { + $this->debug('Entering parseRequest() for data of length ' . strlen($data) . ' and type ' . $headers['content-type']); + if (!strstr($headers['content-type'], 'text/xml')) { + $this->setError('Request not of type text/xml'); + return false; + } + if (strpos($headers['content-type'], '=')) { + $enc = str_replace('"', '', substr(strstr($headers["content-type"], '='), 1)); + $this->debug('Got response encoding: ' . $enc); + if(preg_match('/(ISO-8859-1|US-ASCII|UTF-8)/',$enc)){ + $this->xml_encoding = strtoupper($enc); + } else { + $this->xml_encoding = 'US-ASCII'; + } + } else { + // should be US-ASCII for HTTP 1.0 or ISO-8859-1 for HTTP 1.1 + $this->xml_encoding = 'ISO-8859-1'; + } + $this->debug('Use encoding: ' . $this->xml_encoding . ' when creating soap_parser'); + // parse response, get soap parser obj + $parser = new soap_parser($data,$this->xml_encoding,'',$this->decode_utf8); + // parser debug + $this->debug("parser debug: \n".$parser->getDebug()); + // if fault occurred during message parsing + if($err = $parser->getError()){ + $this->result = 'fault: error in msg parsing: '.$err; + $this->fault('Client',"error in msg parsing:\n".$err); + // else successfully parsed request into soapval object + } else { + // get/set methodname + $this->methodURI = $parser->root_struct_namespace; + $this->methodname = $parser->root_struct_name; + $this->debug('methodname: '.$this->methodname.' methodURI: '.$this->methodURI); + $this->debug('calling parser->get_response()'); + $this->methodparams = $parser->get_response(); + // get SOAP headers + $this->requestHeaders = $parser->getHeaders(); + // add document for doclit support + $this->document = $parser->document; + } + } + + /** + * gets the HTTP body for the current response. + * + * @param string $soapmsg The SOAP payload + * @return string The HTTP body, which includes the SOAP payload + * @access private + */ + function getHTTPBody($soapmsg) { + return $soapmsg; + } + + /** + * gets the HTTP content type for the current response. + * + * Note: getHTTPBody must be called before this. + * + * @return string the HTTP content type for the current response. + * @access private + */ + function getHTTPContentType() { + return 'text/xml'; + } + + /** + * gets the HTTP content type charset for the current response. + * returns false for non-text content types. + * + * Note: getHTTPBody must be called before this. + * + * @return string the HTTP content type charset for the current response. + * @access private + */ + function getHTTPContentTypeCharset() { + return $this->soap_defencoding; + } + + /** + * add a method to the dispatch map (this has been replaced by the register method) + * + * @param string $methodname + * @param string $in array of input values + * @param string $out array of output values + * @access public + * @deprecated + */ + function add_to_map($methodname,$in,$out){ + $this->operations[$methodname] = array('name' => $methodname,'in' => $in,'out' => $out); + } + + /** + * register a service function with the server + * + * @param string $name the name of the PHP function, class.method or class..method + * @param array $in assoc array of input values: key = param name, value = param type + * @param array $out assoc array of output values: key = param name, value = param type + * @param mixed $namespace the element namespace for the method or false + * @param mixed $soapaction the soapaction for the method or false + * @param mixed $style optional (rpc|document) or false Note: when 'document' is specified, parameter and return wrappers are created for you automatically + * @param mixed $use optional (encoded|literal) or false + * @param string $documentation optional Description to include in WSDL + * @param string $encodingStyle optional (usually 'http://schemas.xmlsoap.org/soap/encoding/' for encoded) + * @access public + */ + function register($name,$in=array(),$out=array(),$namespace=false,$soapaction=false,$style=false,$use=false,$documentation='',$encodingStyle=''){ + global $HTTP_SERVER_VARS; + + if($this->externalWSDLURL){ + die('You cannot bind to an external WSDL file, and register methods outside of it! Please choose either WSDL or no WSDL.'); + } + if (! $name) { + die('You must specify a name when you register an operation'); + } + if (!is_array($in)) { + die('You must provide an array for operation inputs'); + } + if (!is_array($out)) { + die('You must provide an array for operation outputs'); + } + if(false == $namespace) { + } + if(false == $soapaction) { + if (isset($_SERVER)) { + $SERVER_NAME = $_SERVER['SERVER_NAME']; + $SCRIPT_NAME = isset($_SERVER['PHP_SELF']) ? $_SERVER['PHP_SELF'] : $_SERVER['SCRIPT_NAME']; + } elseif (isset($HTTP_SERVER_VARS)) { + $SERVER_NAME = $HTTP_SERVER_VARS['SERVER_NAME']; + $SCRIPT_NAME = isset($HTTP_SERVER_VARS['PHP_SELF']) ? $HTTP_SERVER_VARS['PHP_SELF'] : $HTTP_SERVER_VARS['SCRIPT_NAME']; + } else { + $this->setError("Neither _SERVER nor HTTP_SERVER_VARS is available"); + } + $soapaction = "http://$SERVER_NAME$SCRIPT_NAME/$name"; + } + if(false == $style) { + $style = "rpc"; + } + if(false == $use) { + $use = "encoded"; + } + if ($use == 'encoded' && $encodingStyle = '') { + $encodingStyle = 'http://schemas.xmlsoap.org/soap/encoding/'; + } + + $this->operations[$name] = array( + 'name' => $name, + 'in' => $in, + 'out' => $out, + 'namespace' => $namespace, + 'soapaction' => $soapaction, + 'style' => $style); + if($this->wsdl){ + $this->wsdl->addOperation($name,$in,$out,$namespace,$soapaction,$style,$use,$documentation,$encodingStyle); + } + return true; + } + + /** + * Specify a fault to be returned to the client. + * This also acts as a flag to the server that a fault has occured. + * + * @param string $faultcode + * @param string $faultstring + * @param string $faultactor + * @param string $faultdetail + * @access public + */ + function fault($faultcode,$faultstring,$faultactor='',$faultdetail=''){ + if ($faultdetail == '' && $this->debug_flag) { + $faultdetail = $this->getDebug(); + } + $this->fault = new soap_fault($faultcode,$faultactor,$faultstring,$faultdetail); + $this->fault->soap_defencoding = $this->soap_defencoding; + } + + /** + * Sets up wsdl object. + * Acts as a flag to enable internal WSDL generation + * + * @param string $serviceName, name of the service + * @param mixed $namespace optional 'tns' service namespace or false + * @param mixed $endpoint optional URL of service endpoint or false + * @param string $style optional (rpc|document) WSDL style (also specified by operation) + * @param string $transport optional SOAP transport + * @param mixed $schemaTargetNamespace optional 'types' targetNamespace for service schema or false + */ + function configureWSDL($serviceName,$namespace = false,$endpoint = false,$style='rpc', $transport = 'http://schemas.xmlsoap.org/soap/http', $schemaTargetNamespace = false) + { + global $HTTP_SERVER_VARS; + + if (isset($_SERVER)) { + $SERVER_NAME = $_SERVER['SERVER_NAME']; + $SERVER_PORT = $_SERVER['SERVER_PORT']; + $SCRIPT_NAME = isset($_SERVER['PHP_SELF']) ? $_SERVER['PHP_SELF'] : $_SERVER['SCRIPT_NAME']; + $HTTPS = $_SERVER['HTTPS']; + } elseif (isset($HTTP_SERVER_VARS)) { + $SERVER_NAME = $HTTP_SERVER_VARS['SERVER_NAME']; + $SERVER_PORT = $HTTP_SERVER_VARS['SERVER_PORT']; + $SCRIPT_NAME = isset($HTTP_SERVER_VARS['PHP_SELF']) ? $HTTP_SERVER_VARS['PHP_SELF'] : $HTTP_SERVER_VARS['SCRIPT_NAME']; + $HTTPS = $HTTP_SERVER_VARS['HTTPS']; + } else { + $this->setError("Neither _SERVER nor HTTP_SERVER_VARS is available"); + } + if ($SERVER_PORT == 80) { + $SERVER_PORT = ''; + } else { + $SERVER_PORT = ':' . $SERVER_PORT; + } + if(false == $namespace) { + $namespace = "http://$SERVER_NAME/soap/$serviceName"; + } + + if(false == $endpoint) { + if ($HTTPS == '1' || $HTTPS == 'on') { + $SCHEME = 'https'; + } else { + $SCHEME = 'http'; + } + $endpoint = "$SCHEME://$SERVER_NAME$SERVER_PORT$SCRIPT_NAME"; + } + + if(false == $schemaTargetNamespace) { + $schemaTargetNamespace = $namespace; + } + + $this->wsdl = new wsdl; + $this->wsdl->serviceName = $serviceName; + $this->wsdl->endpoint = $endpoint; + $this->wsdl->namespaces['tns'] = $namespace; + $this->wsdl->namespaces['soap'] = 'http://schemas.xmlsoap.org/wsdl/soap/'; + $this->wsdl->namespaces['wsdl'] = 'http://schemas.xmlsoap.org/wsdl/'; + if ($schemaTargetNamespace != $namespace) { + $this->wsdl->namespaces['types'] = $schemaTargetNamespace; + } + $this->wsdl->schemas[$schemaTargetNamespace][0] = new xmlschema('', '', $this->wsdl->namespaces); + $this->wsdl->schemas[$schemaTargetNamespace][0]->schemaTargetNamespace = $schemaTargetNamespace; + $this->wsdl->schemas[$schemaTargetNamespace][0]->imports['http://schemas.xmlsoap.org/soap/encoding/'][0] = array('location' => '', 'loaded' => true); + $this->wsdl->schemas[$schemaTargetNamespace][0]->imports['http://schemas.xmlsoap.org/wsdl/'][0] = array('location' => '', 'loaded' => true); + $this->wsdl->bindings[$serviceName.'Binding'] = array( + 'name'=>$serviceName.'Binding', + 'style'=>$style, + 'transport'=>$transport, + 'portType'=>$serviceName.'PortType'); + $this->wsdl->ports[$serviceName.'Port'] = array( + 'binding'=>$serviceName.'Binding', + 'location'=>$endpoint, + 'bindingType'=>'http://schemas.xmlsoap.org/wsdl/soap/'); + } +} + + + +?> +* @version $Id: nusoap.php,v 1.94 2005/08/04 01:27:42 snichol Exp $ +* @access public +*/ +class wsdl extends nusoap_base { + // URL or filename of the root of this WSDL + var $wsdl; + // define internal arrays of bindings, ports, operations, messages, etc. + var $schemas = array(); + var $currentSchema; + var $message = array(); + var $complexTypes = array(); + var $messages = array(); + var $currentMessage; + var $currentOperation; + var $portTypes = array(); + var $currentPortType; + var $bindings = array(); + var $currentBinding; + var $ports = array(); + var $currentPort; + var $opData = array(); + var $status = ''; + var $documentation = false; + var $endpoint = ''; + // array of wsdl docs to import + var $import = array(); + // parser vars + var $parser; + var $position = 0; + var $depth = 0; + var $depth_array = array(); + // for getting wsdl + var $proxyhost = ''; + var $proxyport = ''; + var $proxyusername = ''; + var $proxypassword = ''; + var $timeout = 0; + var $response_timeout = 30; + + /** + * constructor + * + * @param string $wsdl WSDL document URL + * @param string $proxyhost + * @param string $proxyport + * @param string $proxyusername + * @param string $proxypassword + * @param integer $timeout set the connection timeout + * @param integer $response_timeout set the response timeout + * @access public + */ + function wsdl($wsdl = '',$proxyhost=false,$proxyport=false,$proxyusername=false,$proxypassword=false,$timeout=0,$response_timeout=30){ + parent::nusoap_base(); + $this->wsdl = $wsdl; + $this->proxyhost = $proxyhost; + $this->proxyport = $proxyport; + $this->proxyusername = $proxyusername; + $this->proxypassword = $proxypassword; + $this->timeout = $timeout; + $this->response_timeout = $response_timeout; + + // parse wsdl file + if ($wsdl != "") { + $this->debug('initial wsdl URL: ' . $wsdl); + $this->parseWSDL($wsdl); + } + // imports + // TODO: handle imports more properly, grabbing them in-line and nesting them + $imported_urls = array(); + $imported = 1; + while ($imported > 0) { + $imported = 0; + // Schema imports + foreach ($this->schemas as $ns => $list) { + foreach ($list as $xs) { + $wsdlparts = parse_url($this->wsdl); // this is bogusly simple! + foreach ($xs->imports as $ns2 => $list2) { + for ($ii = 0; $ii < count($list2); $ii++) { + if (! $list2[$ii]['loaded']) { + $this->schemas[$ns]->imports[$ns2][$ii]['loaded'] = true; + $url = $list2[$ii]['location']; + if ($url != '') { + $urlparts = parse_url($url); + if (!isset($urlparts['host'])) { + $url = $wsdlparts['scheme'] . '://' . $wsdlparts['host'] . (isset($wsdlparts['port']) ? ':' .$wsdlparts['port'] : '') . + substr($wsdlparts['path'],0,strrpos($wsdlparts['path'],'/') + 1) .$urlparts['path']; + } + if (! in_array($url, $imported_urls)) { + $this->parseWSDL($url); + $imported++; + $imported_urls[] = $url; + } + } else { + $this->debug("Unexpected scenario: empty URL for unloaded import"); + } + } + } + } + } + } + // WSDL imports + $wsdlparts = parse_url($this->wsdl); // this is bogusly simple! + foreach ($this->import as $ns => $list) { + for ($ii = 0; $ii < count($list); $ii++) { + if (! $list[$ii]['loaded']) { + $this->import[$ns][$ii]['loaded'] = true; + $url = $list[$ii]['location']; + if ($url != '') { + $urlparts = parse_url($url); + if (!isset($urlparts['host'])) { + $url = $wsdlparts['scheme'] . '://' . $wsdlparts['host'] . (isset($wsdlparts['port']) ? ':' . $wsdlparts['port'] : '') . + substr($wsdlparts['path'],0,strrpos($wsdlparts['path'],'/') + 1) .$urlparts['path']; + } + if (! in_array($url, $imported_urls)) { + $this->parseWSDL($url); + $imported++; + $imported_urls[] = $url; + } + } else { + $this->debug("Unexpected scenario: empty URL for unloaded import"); + } + } + } + } + } + // add new data to operation data + foreach($this->bindings as $binding => $bindingData) { + if (isset($bindingData['operations']) && is_array($bindingData['operations'])) { + foreach($bindingData['operations'] as $operation => $data) { + $this->debug('post-parse data gathering for ' . $operation); + $this->bindings[$binding]['operations'][$operation]['input'] = + isset($this->bindings[$binding]['operations'][$operation]['input']) ? + array_merge($this->bindings[$binding]['operations'][$operation]['input'], $this->portTypes[ $bindingData['portType'] ][$operation]['input']) : + $this->portTypes[ $bindingData['portType'] ][$operation]['input']; + $this->bindings[$binding]['operations'][$operation]['output'] = + isset($this->bindings[$binding]['operations'][$operation]['output']) ? + array_merge($this->bindings[$binding]['operations'][$operation]['output'], $this->portTypes[ $bindingData['portType'] ][$operation]['output']) : + $this->portTypes[ $bindingData['portType'] ][$operation]['output']; + if(isset($this->messages[ $this->bindings[$binding]['operations'][$operation]['input']['message'] ])){ + $this->bindings[$binding]['operations'][$operation]['input']['parts'] = $this->messages[ $this->bindings[$binding]['operations'][$operation]['input']['message'] ]; + } + if(isset($this->messages[ $this->bindings[$binding]['operations'][$operation]['output']['message'] ])){ + $this->bindings[$binding]['operations'][$operation]['output']['parts'] = $this->messages[ $this->bindings[$binding]['operations'][$operation]['output']['message'] ]; + } + if (isset($bindingData['style'])) { + $this->bindings[$binding]['operations'][$operation]['style'] = $bindingData['style']; + } + $this->bindings[$binding]['operations'][$operation]['transport'] = isset($bindingData['transport']) ? $bindingData['transport'] : ''; + $this->bindings[$binding]['operations'][$operation]['documentation'] = isset($this->portTypes[ $bindingData['portType'] ][$operation]['documentation']) ? $this->portTypes[ $bindingData['portType'] ][$operation]['documentation'] : ''; + $this->bindings[$binding]['operations'][$operation]['endpoint'] = isset($bindingData['endpoint']) ? $bindingData['endpoint'] : ''; + } + } + } + } + + /** + * parses the wsdl document + * + * @param string $wsdl path or URL + * @access private + */ + function parseWSDL($wsdl = '') + { + if ($wsdl == '') { + $this->debug('no wsdl passed to parseWSDL()!!'); + $this->setError('no wsdl passed to parseWSDL()!!'); + return false; + } + + // parse $wsdl for url format + $wsdl_props = parse_url($wsdl); + + if (isset($wsdl_props['scheme']) && ($wsdl_props['scheme'] == 'http' || $wsdl_props['scheme'] == 'https')) { + $this->debug('getting WSDL http(s) URL ' . $wsdl); + // get wsdl + $tr = new soap_transport_http($wsdl); + $tr->request_method = 'GET'; + $tr->useSOAPAction = false; + if($this->proxyhost && $this->proxyport){ + $tr->setProxy($this->proxyhost,$this->proxyport,$this->proxyusername,$this->proxypassword); + } + $tr->setEncoding('gzip, deflate'); + $wsdl_string = $tr->send('', $this->timeout, $this->response_timeout); + //$this->debug("WSDL request\n" . $tr->outgoing_payload); + //$this->debug("WSDL response\n" . $tr->incoming_payload); + $this->appendDebug($tr->getDebug()); + // catch errors + if($err = $tr->getError() ){ + $errstr = 'HTTP ERROR: '.$err; + $this->debug($errstr); + $this->setError($errstr); + unset($tr); + return false; + } + unset($tr); + $this->debug("got WSDL URL"); + } else { + // $wsdl is not http(s), so treat it as a file URL or plain file path + if (isset($wsdl_props['scheme']) && ($wsdl_props['scheme'] == 'file') && isset($wsdl_props['path'])) { + $path = isset($wsdl_props['host']) ? ($wsdl_props['host'] . ':' . $wsdl_props['path']) : $wsdl_props['path']; + } else { + $path = $wsdl; + } + $this->debug('getting WSDL file ' . $path); + if ($fp = @fopen($path, 'r')) { + $wsdl_string = ''; + while ($data = fread($fp, 32768)) { + $wsdl_string .= $data; + } + fclose($fp); + } else { + $errstr = "Bad path to WSDL file $path"; + $this->debug($errstr); + $this->setError($errstr); + return false; + } + } + $this->debug('Parse WSDL'); + // end new code added + // Create an XML parser. + $this->parser = xml_parser_create(); + // Set the options for parsing the XML data. + // xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1); + xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, 0); + // Set the object for the parser. + xml_set_object($this->parser, $this); + // Set the element handlers for the parser. + xml_set_element_handler($this->parser, 'start_element', 'end_element'); + xml_set_character_data_handler($this->parser, 'character_data'); + // Parse the XML file. + if (!xml_parse($this->parser, $wsdl_string, true)) { + // Display an error message. + $errstr = sprintf( + 'XML error parsing WSDL from %s on line %d: %s', + $wsdl, + xml_get_current_line_number($this->parser), + xml_error_string(xml_get_error_code($this->parser)) + ); + $this->debug($errstr); + $this->debug("XML payload:\n" . $wsdl_string); + $this->setError($errstr); + return false; + } + // free the parser + xml_parser_free($this->parser); + $this->debug('Parsing WSDL done'); + // catch wsdl parse errors + if($this->getError()){ + return false; + } + return true; + } + + /** + * start-element handler + * + * @param string $parser XML parser object + * @param string $name element name + * @param string $attrs associative array of attributes + * @access private + */ + function start_element($parser, $name, $attrs) + { + if ($this->status == 'schema') { + $this->currentSchema->schemaStartElement($parser, $name, $attrs); + $this->appendDebug($this->currentSchema->getDebug()); + $this->currentSchema->clearDebug(); + } elseif (ereg('schema$', $name)) { + $this->debug('Parsing WSDL schema'); + // $this->debug("startElement for $name ($attrs[name]). status = $this->status (".$this->getLocalPart($name).")"); + $this->status = 'schema'; + $this->currentSchema = new xmlschema('', '', $this->namespaces); + $this->currentSchema->schemaStartElement($parser, $name, $attrs); + $this->appendDebug($this->currentSchema->getDebug()); + $this->currentSchema->clearDebug(); + } else { + // position in the total number of elements, starting from 0 + $pos = $this->position++; + $depth = $this->depth++; + // set self as current value for this depth + $this->depth_array[$depth] = $pos; + $this->message[$pos] = array('cdata' => ''); + // process attributes + if (count($attrs) > 0) { + // register namespace declarations + foreach($attrs as $k => $v) { + if (ereg("^xmlns", $k)) { + if ($ns_prefix = substr(strrchr($k, ':'), 1)) { + $this->namespaces[$ns_prefix] = $v; + } else { + $this->namespaces['ns' . (count($this->namespaces) + 1)] = $v; + } + if ($v == 'http://www.w3.org/2001/XMLSchema' || $v == 'http://www.w3.org/1999/XMLSchema' || $v == 'http://www.w3.org/2000/10/XMLSchema') { + $this->XMLSchemaVersion = $v; + $this->namespaces['xsi'] = $v . '-instance'; + } + } + } + // expand each attribute prefix to its namespace + foreach($attrs as $k => $v) { + $k = strpos($k, ':') ? $this->expandQname($k) : $k; + if ($k != 'location' && $k != 'soapAction' && $k != 'namespace') { + $v = strpos($v, ':') ? $this->expandQname($v) : $v; + } + $eAttrs[$k] = $v; + } + $attrs = $eAttrs; + } else { + $attrs = array(); + } + // get element prefix, namespace and name + if (ereg(':', $name)) { + // get ns prefix + $prefix = substr($name, 0, strpos($name, ':')); + // get ns + $namespace = isset($this->namespaces[$prefix]) ? $this->namespaces[$prefix] : ''; + // get unqualified name + $name = substr(strstr($name, ':'), 1); + } + // process attributes, expanding any prefixes to namespaces + // find status, register data + switch ($this->status) { + case 'message': + if ($name == 'part') { + if (isset($attrs['type'])) { + $this->debug("msg " . $this->currentMessage . ": found part $attrs[name]: " . implode(',', $attrs)); + $this->messages[$this->currentMessage][$attrs['name']] = $attrs['type']; + } + if (isset($attrs['element'])) { + $this->debug("msg " . $this->currentMessage . ": found part $attrs[name]: " . implode(',', $attrs)); + $this->messages[$this->currentMessage][$attrs['name']] = $attrs['element']; + } + } + break; + case 'portType': + switch ($name) { + case 'operation': + $this->currentPortOperation = $attrs['name']; + $this->debug("portType $this->currentPortType operation: $this->currentPortOperation"); + if (isset($attrs['parameterOrder'])) { + $this->portTypes[$this->currentPortType][$attrs['name']]['parameterOrder'] = $attrs['parameterOrder']; + } + break; + case 'documentation': + $this->documentation = true; + break; + // merge input/output data + default: + $m = isset($attrs['message']) ? $this->getLocalPart($attrs['message']) : ''; + $this->portTypes[$this->currentPortType][$this->currentPortOperation][$name]['message'] = $m; + break; + } + break; + case 'binding': + switch ($name) { + case 'binding': + // get ns prefix + if (isset($attrs['style'])) { + $this->bindings[$this->currentBinding]['prefix'] = $prefix; + } + $this->bindings[$this->currentBinding] = array_merge($this->bindings[$this->currentBinding], $attrs); + break; + case 'header': + $this->bindings[$this->currentBinding]['operations'][$this->currentOperation][$this->opStatus]['headers'][] = $attrs; + break; + case 'operation': + if (isset($attrs['soapAction'])) { + $this->bindings[$this->currentBinding]['operations'][$this->currentOperation]['soapAction'] = $attrs['soapAction']; + } + if (isset($attrs['style'])) { + $this->bindings[$this->currentBinding]['operations'][$this->currentOperation]['style'] = $attrs['style']; + } + if (isset($attrs['name'])) { + $this->currentOperation = $attrs['name']; + $this->debug("current binding operation: $this->currentOperation"); + $this->bindings[$this->currentBinding]['operations'][$this->currentOperation]['name'] = $attrs['name']; + $this->bindings[$this->currentBinding]['operations'][$this->currentOperation]['binding'] = $this->currentBinding; + $this->bindings[$this->currentBinding]['operations'][$this->currentOperation]['endpoint'] = isset($this->bindings[$this->currentBinding]['endpoint']) ? $this->bindings[$this->currentBinding]['endpoint'] : ''; + } + break; + case 'input': + $this->opStatus = 'input'; + break; + case 'output': + $this->opStatus = 'output'; + break; + case 'body': + if (isset($this->bindings[$this->currentBinding]['operations'][$this->currentOperation][$this->opStatus])) { + $this->bindings[$this->currentBinding]['operations'][$this->currentOperation][$this->opStatus] = array_merge($this->bindings[$this->currentBinding]['operations'][$this->currentOperation][$this->opStatus], $attrs); + } else { + $this->bindings[$this->currentBinding]['operations'][$this->currentOperation][$this->opStatus] = $attrs; + } + break; + } + break; + case 'service': + switch ($name) { + case 'port': + $this->currentPort = $attrs['name']; + $this->debug('current port: ' . $this->currentPort); + $this->ports[$this->currentPort]['binding'] = $this->getLocalPart($attrs['binding']); + + break; + case 'address': + $this->ports[$this->currentPort]['location'] = $attrs['location']; + $this->ports[$this->currentPort]['bindingType'] = $namespace; + $this->bindings[ $this->ports[$this->currentPort]['binding'] ]['bindingType'] = $namespace; + $this->bindings[ $this->ports[$this->currentPort]['binding'] ]['endpoint'] = $attrs['location']; + break; + } + break; + } + // set status + switch ($name) { + case 'import': + if (isset($attrs['location'])) { + $this->import[$attrs['namespace']][] = array('location' => $attrs['location'], 'loaded' => false); + $this->debug('parsing import ' . $attrs['namespace']. ' - ' . $attrs['location'] . ' (' . count($this->import[$attrs['namespace']]).')'); + } else { + $this->import[$attrs['namespace']][] = array('location' => '', 'loaded' => true); + if (! $this->getPrefixFromNamespace($attrs['namespace'])) { + $this->namespaces['ns'.(count($this->namespaces)+1)] = $attrs['namespace']; + } + $this->debug('parsing import ' . $attrs['namespace']. ' - [no location] (' . count($this->import[$attrs['namespace']]).')'); + } + break; + //wait for schema + //case 'types': + // $this->status = 'schema'; + // break; + case 'message': + $this->status = 'message'; + $this->messages[$attrs['name']] = array(); + $this->currentMessage = $attrs['name']; + break; + case 'portType': + $this->status = 'portType'; + $this->portTypes[$attrs['name']] = array(); + $this->currentPortType = $attrs['name']; + break; + case "binding": + if (isset($attrs['name'])) { + // get binding name + if (strpos($attrs['name'], ':')) { + $this->currentBinding = $this->getLocalPart($attrs['name']); + } else { + $this->currentBinding = $attrs['name']; + } + $this->status = 'binding'; + $this->bindings[$this->currentBinding]['portType'] = $this->getLocalPart($attrs['type']); + $this->debug("current binding: $this->currentBinding of portType: " . $attrs['type']); + } + break; + case 'service': + $this->serviceName = $attrs['name']; + $this->status = 'service'; + $this->debug('current service: ' . $this->serviceName); + break; + case 'definitions': + foreach ($attrs as $name => $value) { + $this->wsdl_info[$name] = $value; + } + break; + } + } + } + + /** + * end-element handler + * + * @param string $parser XML parser object + * @param string $name element name + * @access private + */ + function end_element($parser, $name){ + // unset schema status + if (/*ereg('types$', $name) ||*/ ereg('schema$', $name)) { + $this->status = ""; + $this->appendDebug($this->currentSchema->getDebug()); + $this->currentSchema->clearDebug(); + $this->schemas[$this->currentSchema->schemaTargetNamespace][] = $this->currentSchema; + $this->debug('Parsing WSDL schema done'); + } + if ($this->status == 'schema') { + $this->currentSchema->schemaEndElement($parser, $name); + } else { + // bring depth down a notch + $this->depth--; + } + // end documentation + if ($this->documentation) { + //TODO: track the node to which documentation should be assigned; it can be a part, message, etc. + //$this->portTypes[$this->currentPortType][$this->currentPortOperation]['documentation'] = $this->documentation; + $this->documentation = false; + } + } + + /** + * element content handler + * + * @param string $parser XML parser object + * @param string $data element content + * @access private + */ + function character_data($parser, $data) + { + $pos = isset($this->depth_array[$this->depth]) ? $this->depth_array[$this->depth] : 0; + if (isset($this->message[$pos]['cdata'])) { + $this->message[$pos]['cdata'] .= $data; + } + if ($this->documentation) { + $this->documentation .= $data; + } + } + + function getBindingData($binding) + { + if (is_array($this->bindings[$binding])) { + return $this->bindings[$binding]; + } + } + + /** + * returns an assoc array of operation names => operation data + * + * @param string $bindingType eg: soap, smtp, dime (only soap is currently supported) + * @return array + * @access public + */ + function getOperations($bindingType = 'soap') + { + $ops = array(); + if ($bindingType == 'soap') { + $bindingType = 'http://schemas.xmlsoap.org/wsdl/soap/'; + } + // loop thru ports + foreach($this->ports as $port => $portData) { + // binding type of port matches parameter + if ($portData['bindingType'] == $bindingType) { + //$this->debug("getOperations for port $port"); + //$this->debug("port data: " . $this->varDump($portData)); + //$this->debug("bindings: " . $this->varDump($this->bindings[ $portData['binding'] ])); + // merge bindings + if (isset($this->bindings[ $portData['binding'] ]['operations'])) { + $ops = array_merge ($ops, $this->bindings[ $portData['binding'] ]['operations']); + } + } + } + return $ops; + } + + /** + * returns an associative array of data necessary for calling an operation + * + * @param string $operation , name of operation + * @param string $bindingType , type of binding eg: soap + * @return array + * @access public + */ + function getOperationData($operation, $bindingType = 'soap') + { + if ($bindingType == 'soap') { + $bindingType = 'http://schemas.xmlsoap.org/wsdl/soap/'; + } + // loop thru ports + foreach($this->ports as $port => $portData) { + // binding type of port matches parameter + if ($portData['bindingType'] == $bindingType) { + // get binding + //foreach($this->bindings[ $portData['binding'] ]['operations'] as $bOperation => $opData) { + foreach(array_keys($this->bindings[ $portData['binding'] ]['operations']) as $bOperation) { + // note that we could/should also check the namespace here + if ($operation == $bOperation) { + $opData = $this->bindings[ $portData['binding'] ]['operations'][$operation]; + return $opData; + } + } + } + } + } + + /** + * returns an associative array of data necessary for calling an operation + * + * @param string $soapAction soapAction for operation + * @param string $bindingType type of binding eg: soap + * @return array + * @access public + */ + function getOperationDataForSoapAction($soapAction, $bindingType = 'soap') { + if ($bindingType == 'soap') { + $bindingType = 'http://schemas.xmlsoap.org/wsdl/soap/'; + } + // loop thru ports + foreach($this->ports as $port => $portData) { + // binding type of port matches parameter + if ($portData['bindingType'] == $bindingType) { + // loop through operations for the binding + foreach ($this->bindings[ $portData['binding'] ]['operations'] as $bOperation => $opData) { + if ($opData['soapAction'] == $soapAction) { + return $opData; + } + } + } + } + } + + /** + * returns an array of information about a given type + * returns false if no type exists by the given name + * + * typeDef = array( + * 'elements' => array(), // refs to elements array + * 'restrictionBase' => '', + * 'phpType' => '', + * 'order' => '(sequence|all)', + * 'attrs' => array() // refs to attributes array + * ) + * + * @param $type string the type + * @param $ns string namespace (not prefix) of the type + * @return mixed + * @access public + * @see xmlschema + */ + function getTypeDef($type, $ns) { + $this->debug("in getTypeDef: type=$type, ns=$ns"); + if ((! $ns) && isset($this->namespaces['tns'])) { + $ns = $this->namespaces['tns']; + $this->debug("in getTypeDef: type namespace forced to $ns"); + } + if (isset($this->schemas[$ns])) { + $this->debug("in getTypeDef: have schema for namespace $ns"); + for ($i = 0; $i < count($this->schemas[$ns]); $i++) { + $xs = &$this->schemas[$ns][$i]; + $t = $xs->getTypeDef($type); + $this->appendDebug($xs->getDebug()); + $xs->clearDebug(); + if ($t) { + if (!isset($t['phpType'])) { + // get info for type to tack onto the element + $uqType = substr($t['type'], strrpos($t['type'], ':') + 1); + $ns = substr($t['type'], 0, strrpos($t['type'], ':')); + $etype = $this->getTypeDef($uqType, $ns); + if ($etype) { + $this->debug("found type for [element] $type:"); + $this->debug($this->varDump($etype)); + if (isset($etype['phpType'])) { + $t['phpType'] = $etype['phpType']; + } + if (isset($etype['elements'])) { + $t['elements'] = $etype['elements']; + } + if (isset($etype['attrs'])) { + $t['attrs'] = $etype['attrs']; + } + } + } + return $t; + } + } + } else { + $this->debug("in getTypeDef: do not have schema for namespace $ns"); + } + return false; + } + + /** + * prints html description of services + * + * @access private + */ + function webDescription(){ + global $HTTP_SERVER_VARS; + + if (isset($_SERVER)) { + $PHP_SELF = $_SERVER['PHP_SELF']; + } elseif (isset($HTTP_SERVER_VARS)) { + $PHP_SELF = $HTTP_SERVER_VARS['PHP_SELF']; + } else { + $this->setError("Neither _SERVER nor HTTP_SERVER_VARS is available"); + } + + $b = ' + NuSOAP: '.$this->serviceName.' + + + + +
    +

    +
    '.$this->serviceName.'
    + +
    '; + return $b; + } + + /** + * serialize the parsed wsdl + * + * @param mixed $debug whether to put debug=1 in endpoint URL + * @return string serialization of WSDL + * @access public + */ + function serialize($debug = 0) + { + $xml = ''; + $xml .= "\nnamespaces as $k => $v) { + $xml .= " xmlns:$k=\"$v\""; + } + // 10.9.02 - add poulter fix for wsdl and tns declarations + if (isset($this->namespaces['wsdl'])) { + $xml .= " xmlns=\"" . $this->namespaces['wsdl'] . "\""; + } + if (isset($this->namespaces['tns'])) { + $xml .= " targetNamespace=\"" . $this->namespaces['tns'] . "\""; + } + $xml .= '>'; + // imports + if (sizeof($this->import) > 0) { + foreach($this->import as $ns => $list) { + foreach ($list as $ii) { + if ($ii['location'] != '') { + $xml .= ''; + } else { + $xml .= ''; + } + } + } + } + // types + if (count($this->schemas)>=1) { + $xml .= "\n"; + foreach ($this->schemas as $ns => $list) { + foreach ($list as $xs) { + $xml .= $xs->serializeSchema(); + } + } + $xml .= ''; + } + // messages + if (count($this->messages) >= 1) { + foreach($this->messages as $msgName => $msgParts) { + $xml .= "\n'; + if(is_array($msgParts)){ + foreach($msgParts as $partName => $partType) { + // print 'serializing '.$partType.', sv: '.$this->XMLSchemaVersion.'
    '; + if (strpos($partType, ':')) { + $typePrefix = $this->getPrefixFromNamespace($this->getPrefix($partType)); + } elseif (isset($this->typemap[$this->namespaces['xsd']][$partType])) { + // print 'checking typemap: '.$this->XMLSchemaVersion.'
    '; + $typePrefix = 'xsd'; + } else { + foreach($this->typemap as $ns => $types) { + if (isset($types[$partType])) { + $typePrefix = $this->getPrefixFromNamespace($ns); + } + } + if (!isset($typePrefix)) { + die("$partType has no namespace!"); + } + } + $ns = $this->getNamespaceFromPrefix($typePrefix); + $typeDef = $this->getTypeDef($this->getLocalPart($partType), $ns); + if ($typeDef['typeClass'] == 'element') { + $elementortype = 'element'; + } else { + $elementortype = 'type'; + } + $xml .= ''; + } + } + $xml .= '
    '; + } + } + // bindings & porttypes + if (count($this->bindings) >= 1) { + $binding_xml = ''; + $portType_xml = ''; + foreach($this->bindings as $bindingName => $attrs) { + $binding_xml .= "\n'; + $binding_xml .= ''; + $portType_xml .= "\n'; + foreach($attrs['operations'] as $opName => $opParts) { + $binding_xml .= ''; + $binding_xml .= ''; + if (isset($opParts['input']['encodingStyle']) && $opParts['input']['encodingStyle'] != '') { + $enc_style = ' encodingStyle="' . $opParts['input']['encodingStyle'] . '"'; + } else { + $enc_style = ''; + } + $binding_xml .= ''; + if (isset($opParts['output']['encodingStyle']) && $opParts['output']['encodingStyle'] != '') { + $enc_style = ' encodingStyle="' . $opParts['output']['encodingStyle'] . '"'; + } else { + $enc_style = ''; + } + $binding_xml .= ''; + $binding_xml .= ''; + $portType_xml .= ''; + } + $portType_xml .= ''; + $portType_xml .= ''; + $portType_xml .= ''; + } + $portType_xml .= ''; + $binding_xml .= ''; + } + $xml .= $portType_xml . $binding_xml; + } + // services + $xml .= "\nserviceName . '">'; + if (count($this->ports) >= 1) { + foreach($this->ports as $pName => $attrs) { + $xml .= ''; + $xml .= ''; + $xml .= ''; + } + } + $xml .= ''; + return $xml . "\n"; + } + + /** + * serialize PHP values according to a WSDL message definition + * + * TODO + * - multi-ref serialization + * - validate PHP values against type definitions, return errors if invalid + * + * @param string $operation operation name + * @param string $direction (input|output) + * @param mixed $parameters parameter value(s) + * @return mixed parameters serialized as XML or false on error (e.g. operation not found) + * @access public + */ + function serializeRPCParameters($operation, $direction, $parameters) + { + $this->debug("in serializeRPCParameters: operation=$operation, direction=$direction, XMLSchemaVersion=$this->XMLSchemaVersion"); + $this->appendDebug('parameters=' . $this->varDump($parameters)); + + if ($direction != 'input' && $direction != 'output') { + $this->debug('The value of the \$direction argument needs to be either "input" or "output"'); + $this->setError('The value of the \$direction argument needs to be either "input" or "output"'); + return false; + } + if (!$opData = $this->getOperationData($operation)) { + $this->debug('Unable to retrieve WSDL data for operation: ' . $operation); + $this->setError('Unable to retrieve WSDL data for operation: ' . $operation); + return false; + } + $this->debug('opData:'); + $this->appendDebug($this->varDump($opData)); + + // Get encoding style for output and set to current + $encodingStyle = 'http://schemas.xmlsoap.org/soap/encoding/'; + if(($direction == 'input') && isset($opData['output']['encodingStyle']) && ($opData['output']['encodingStyle'] != $encodingStyle)) { + $encodingStyle = $opData['output']['encodingStyle']; + $enc_style = $encodingStyle; + } + + // set input params + $xml = ''; + if (isset($opData[$direction]['parts']) && sizeof($opData[$direction]['parts']) > 0) { + + $use = $opData[$direction]['use']; + $this->debug('have ' . count($opData[$direction]['parts']) . ' part(s) to serialize'); + if (is_array($parameters)) { + $parametersArrayType = $this->isArraySimpleOrStruct($parameters); + $this->debug('have ' . count($parameters) . ' parameter(s) provided as ' . $parametersArrayType . ' to serialize'); + foreach($opData[$direction]['parts'] as $name => $type) { + $this->debug('serializing part "'.$name.'" of type "'.$type.'"'); + // Track encoding style + if (isset($opData[$direction]['encodingStyle']) && $encodingStyle != $opData[$direction]['encodingStyle']) { + $encodingStyle = $opData[$direction]['encodingStyle']; + $enc_style = $encodingStyle; + } else { + $enc_style = false; + } + // NOTE: add error handling here + // if serializeType returns false, then catch global error and fault + if ($parametersArrayType == 'arraySimple') { + $p = array_shift($parameters); + $this->debug('calling serializeType w/indexed param'); + $xml .= $this->serializeType($name, $type, $p, $use, $enc_style); + } elseif (isset($parameters[$name])) { + $this->debug('calling serializeType w/named param'); + $xml .= $this->serializeType($name, $type, $parameters[$name], $use, $enc_style); + } else { + // TODO: only send nillable + $this->debug('calling serializeType w/null param'); + $xml .= $this->serializeType($name, $type, null, $use, $enc_style); + } + } + } else { + $this->debug('no parameters passed.'); + } + } + $this->debug("serializeRPCParameters returning: $xml"); + return $xml; + } + + /** + * serialize a PHP value according to a WSDL message definition + * + * TODO + * - multi-ref serialization + * - validate PHP values against type definitions, return errors if invalid + * + * @param string $ type name + * @param mixed $ param value + * @return mixed new param or false if initial value didn't validate + * @access public + * @deprecated + */ + function serializeParameters($operation, $direction, $parameters) + { + $this->debug("in serializeParameters: operation=$operation, direction=$direction, XMLSchemaVersion=$this->XMLSchemaVersion"); + $this->appendDebug('parameters=' . $this->varDump($parameters)); + + if ($direction != 'input' && $direction != 'output') { + $this->debug('The value of the \$direction argument needs to be either "input" or "output"'); + $this->setError('The value of the \$direction argument needs to be either "input" or "output"'); + return false; + } + if (!$opData = $this->getOperationData($operation)) { + $this->debug('Unable to retrieve WSDL data for operation: ' . $operation); + $this->setError('Unable to retrieve WSDL data for operation: ' . $operation); + return false; + } + $this->debug('opData:'); + $this->appendDebug($this->varDump($opData)); + + // Get encoding style for output and set to current + $encodingStyle = 'http://schemas.xmlsoap.org/soap/encoding/'; + if(($direction == 'input') && isset($opData['output']['encodingStyle']) && ($opData['output']['encodingStyle'] != $encodingStyle)) { + $encodingStyle = $opData['output']['encodingStyle']; + $enc_style = $encodingStyle; + } + + // set input params + $xml = ''; + if (isset($opData[$direction]['parts']) && sizeof($opData[$direction]['parts']) > 0) { + + $use = $opData[$direction]['use']; + $this->debug("use=$use"); + $this->debug('got ' . count($opData[$direction]['parts']) . ' part(s)'); + if (is_array($parameters)) { + $parametersArrayType = $this->isArraySimpleOrStruct($parameters); + $this->debug('have ' . $parametersArrayType . ' parameters'); + foreach($opData[$direction]['parts'] as $name => $type) { + $this->debug('serializing part "'.$name.'" of type "'.$type.'"'); + // Track encoding style + if(isset($opData[$direction]['encodingStyle']) && $encodingStyle != $opData[$direction]['encodingStyle']) { + $encodingStyle = $opData[$direction]['encodingStyle']; + $enc_style = $encodingStyle; + } else { + $enc_style = false; + } + // NOTE: add error handling here + // if serializeType returns false, then catch global error and fault + if ($parametersArrayType == 'arraySimple') { + $p = array_shift($parameters); + $this->debug('calling serializeType w/indexed param'); + $xml .= $this->serializeType($name, $type, $p, $use, $enc_style); + } elseif (isset($parameters[$name])) { + $this->debug('calling serializeType w/named param'); + $xml .= $this->serializeType($name, $type, $parameters[$name], $use, $enc_style); + } else { + // TODO: only send nillable + $this->debug('calling serializeType w/null param'); + $xml .= $this->serializeType($name, $type, null, $use, $enc_style); + } + } + } else { + $this->debug('no parameters passed.'); + } + } + $this->debug("serializeParameters returning: $xml"); + return $xml; + } + + /** + * serializes a PHP value according a given type definition + * + * @param string $name name of value (part or element) + * @param string $type XML schema type of value (type or element) + * @param mixed $value a native PHP value (parameter value) + * @param string $use use for part (encoded|literal) + * @param string $encodingStyle SOAP encoding style for the value (if different than the enclosing style) + * @param boolean $unqualified a kludge for what should be XML namespace form handling + * @return string value serialized as an XML string + * @access private + */ + function serializeType($name, $type, $value, $use='encoded', $encodingStyle=false, $unqualified=false) + { + $this->debug("in serializeType: name=$name, type=$type, use=$use, encodingStyle=$encodingStyle, unqualified=" . ($unqualified ? "unqualified" : "qualified")); + $this->appendDebug("value=" . $this->varDump($value)); + if($use == 'encoded' && $encodingStyle) { + $encodingStyle = ' SOAP-ENV:encodingStyle="' . $encodingStyle . '"'; + } + + // if a soapval has been supplied, let its type override the WSDL + if (is_object($value) && get_class($value) == 'soapval') { + if ($value->type_ns) { + $type = $value->type_ns . ':' . $value->type; + $forceType = true; + $this->debug("in serializeType: soapval overrides type to $type"); + } elseif ($value->type) { + $type = $value->type; + $forceType = true; + $this->debug("in serializeType: soapval overrides type to $type"); + } else { + $forceType = false; + $this->debug("in serializeType: soapval does not override type"); + } + $attrs = $value->attributes; + $value = $value->value; + $this->debug("in serializeType: soapval overrides value to $value"); + if ($attrs) { + if (!is_array($value)) { + $value['!'] = $value; + } + foreach ($attrs as $n => $v) { + $value['!' . $n] = $v; + } + $this->debug("in serializeType: soapval provides attributes"); + } + } else { + $forceType = false; + } + + $xml = ''; + if (strpos($type, ':')) { + $uqType = substr($type, strrpos($type, ':') + 1); + $ns = substr($type, 0, strrpos($type, ':')); + $this->debug("in serializeType: got a prefixed type: $uqType, $ns"); + if ($this->getNamespaceFromPrefix($ns)) { + $ns = $this->getNamespaceFromPrefix($ns); + $this->debug("in serializeType: expanded prefixed type: $uqType, $ns"); + } + + if($ns == $this->XMLSchemaVersion || $ns == 'http://schemas.xmlsoap.org/soap/encoding/'){ + $this->debug('in serializeType: type namespace indicates XML Schema or SOAP Encoding type'); + if ($unqualified && $use == 'literal') { + $elementNS = " xmlns=\"\""; + } else { + $elementNS = ''; + } + if (is_null($value)) { + if ($use == 'literal') { + // TODO: depends on minOccurs + $xml = "<$name$elementNS/>"; + } else { + // TODO: depends on nillable, which should be checked before calling this method + $xml = "<$name$elementNS xsi:nil=\"true\" xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\"/>"; + } + $this->debug("in serializeType: returning: $xml"); + return $xml; + } + if ($uqType == 'boolean') { + if ((is_string($value) && $value == 'false') || (! $value)) { + $value = 'false'; + } else { + $value = 'true'; + } + } + if ($uqType == 'string' && gettype($value) == 'string') { + $value = $this->expandEntities($value); + } + if (($uqType == 'long' || $uqType == 'unsignedLong') && gettype($value) == 'double') { + $value = sprintf("%.0lf", $value); + } + // it's a scalar + // TODO: what about null/nil values? + // check type isn't a custom type extending xmlschema namespace + if (!$this->getTypeDef($uqType, $ns)) { + if ($use == 'literal') { + if ($forceType) { + $xml = "<$name$elementNS xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\">$value"; + } else { + $xml = "<$name$elementNS>$value"; + } + } else { + $xml = "<$name$elementNS xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\"$encodingStyle>$value"; + } + $this->debug("in serializeType: returning: $xml"); + return $xml; + } + $this->debug('custom type extends XML Schema or SOAP Encoding namespace (yuck)'); + } else if ($ns == 'http://xml.apache.org/xml-soap') { + $this->debug('in serializeType: appears to be Apache SOAP type'); + if ($uqType == 'Map') { + $tt_prefix = $this->getPrefixFromNamespace('http://xml.apache.org/xml-soap'); + if (! $tt_prefix) { + $this->debug('in serializeType: Add namespace for Apache SOAP type'); + $tt_prefix = 'ns' . rand(1000, 9999); + $this->namespaces[$tt_prefix] = 'http://xml.apache.org/xml-soap'; + // force this to be added to usedNamespaces + $tt_prefix = $this->getPrefixFromNamespace('http://xml.apache.org/xml-soap'); + } + $contents = ''; + foreach($value as $k => $v) { + $this->debug("serializing map element: key $k, value $v"); + $contents .= ''; + $contents .= $this->serialize_val($k,'key',false,false,false,false,$use); + $contents .= $this->serialize_val($v,'value',false,false,false,false,$use); + $contents .= ''; + } + if ($use == 'literal') { + if ($forceType) { + $xml = "<$name xsi:type=\"" . $tt_prefix . ":$uqType\">$contents"; + } else { + $xml = "<$name>$contents"; + } + } else { + $xml = "<$name xsi:type=\"" . $tt_prefix . ":$uqType\"$encodingStyle>$contents"; + } + $this->debug("in serializeType: returning: $xml"); + return $xml; + } + $this->debug('in serializeType: Apache SOAP type, but only support Map'); + } + } else { + // TODO: should the type be compared to types in XSD, and the namespace + // set to XSD if the type matches? + $this->debug("in serializeType: No namespace for type $type"); + $ns = ''; + $uqType = $type; + } + if(!$typeDef = $this->getTypeDef($uqType, $ns)){ + $this->setError("$type ($uqType) is not a supported type."); + $this->debug("in serializeType: $type ($uqType) is not a supported type."); + return false; + } else { + $this->debug("in serializeType: found typeDef"); + $this->appendDebug('typeDef=' . $this->varDump($typeDef)); + } + $phpType = $typeDef['phpType']; + $this->debug("in serializeType: uqType: $uqType, ns: $ns, phptype: $phpType, arrayType: " . (isset($typeDef['arrayType']) ? $typeDef['arrayType'] : '') ); + // if php type == struct, map value to the element names + if ($phpType == 'struct') { + if (isset($typeDef['typeClass']) && $typeDef['typeClass'] == 'element') { + $elementName = $uqType; + if (isset($typeDef['form']) && ($typeDef['form'] == 'qualified')) { + $elementNS = " xmlns=\"$ns\""; + } else { + $elementNS = " xmlns=\"\""; + } + } else { + $elementName = $name; + if ($unqualified) { + $elementNS = " xmlns=\"\""; + } else { + $elementNS = ''; + } + } + if (is_null($value)) { + if ($use == 'literal') { + // TODO: depends on minOccurs + $xml = "<$elementName$elementNS/>"; + } else { + $xml = "<$elementName$elementNS xsi:nil=\"true\" xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\"/>"; + } + $this->debug("in serializeType: returning: $xml"); + return $xml; + } + if (is_object($value)) { + $value = get_object_vars($value); + } + if (is_array($value)) { + $elementAttrs = $this->serializeComplexTypeAttributes($typeDef, $value, $ns, $uqType); + if ($use == 'literal') { + if ($forceType) { + $xml = "<$elementName$elementNS$elementAttrs xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\">"; + } else { + $xml = "<$elementName$elementNS$elementAttrs>"; + } + } else { + $xml = "<$elementName$elementNS$elementAttrs xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\"$encodingStyle>"; + } + + $xml .= $this->serializeComplexTypeElements($typeDef, $value, $ns, $uqType, $use, $encodingStyle); + $xml .= ""; + } else { + $this->debug("in serializeType: phpType is struct, but value is not an array"); + $this->setError("phpType is struct, but value is not an array: see debug output for details"); + $xml = ''; + } + } elseif ($phpType == 'array') { + if (isset($typeDef['form']) && ($typeDef['form'] == 'qualified')) { + $elementNS = " xmlns=\"$ns\""; + } else { + if ($unqualified) { + $elementNS = " xmlns=\"\""; + } else { + $elementNS = ''; + } + } + if (is_null($value)) { + if ($use == 'literal') { + // TODO: depends on minOccurs + $xml = "<$name$elementNS/>"; + } else { + $xml = "<$name$elementNS xsi:nil=\"true\" xsi:type=\"" . + $this->getPrefixFromNamespace('http://schemas.xmlsoap.org/soap/encoding/') . + ":Array\" " . + $this->getPrefixFromNamespace('http://schemas.xmlsoap.org/soap/encoding/') . + ':arrayType="' . + $this->getPrefixFromNamespace($this->getPrefix($typeDef['arrayType'])) . + ':' . + $this->getLocalPart($typeDef['arrayType'])."[0]\"/>"; + } + $this->debug("in serializeType: returning: $xml"); + return $xml; + } + if (isset($typeDef['multidimensional'])) { + $nv = array(); + foreach($value as $v) { + $cols = ',' . sizeof($v); + $nv = array_merge($nv, $v); + } + $value = $nv; + } else { + $cols = ''; + } + if (is_array($value) && sizeof($value) >= 1) { + $rows = sizeof($value); + $contents = ''; + foreach($value as $k => $v) { + $this->debug("serializing array element: $k, $v of type: $typeDef[arrayType]"); + //if (strpos($typeDef['arrayType'], ':') ) { + if (!in_array($typeDef['arrayType'],$this->typemap['http://www.w3.org/2001/XMLSchema'])) { + $contents .= $this->serializeType('item', $typeDef['arrayType'], $v, $use); + } else { + $contents .= $this->serialize_val($v, 'item', $typeDef['arrayType'], null, $this->XMLSchemaVersion, false, $use); + } + } + } else { + $rows = 0; + $contents = null; + } + // TODO: for now, an empty value will be serialized as a zero element + // array. Revisit this when coding the handling of null/nil values. + if ($use == 'literal') { + $xml = "<$name$elementNS>" + .$contents + .""; + } else { + $xml = "<$name$elementNS xsi:type=\"".$this->getPrefixFromNamespace('http://schemas.xmlsoap.org/soap/encoding/').':Array" '. + $this->getPrefixFromNamespace('http://schemas.xmlsoap.org/soap/encoding/') + .':arrayType="' + .$this->getPrefixFromNamespace($this->getPrefix($typeDef['arrayType'])) + .":".$this->getLocalPart($typeDef['arrayType'])."[$rows$cols]\">" + .$contents + .""; + } + } elseif ($phpType == 'scalar') { + if (isset($typeDef['form']) && ($typeDef['form'] == 'qualified')) { + $elementNS = " xmlns=\"$ns\""; + } else { + if ($unqualified) { + $elementNS = " xmlns=\"\""; + } else { + $elementNS = ''; + } + } + if ($use == 'literal') { + if ($forceType) { + $xml = "<$name$elementNS xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\">$value"; + } else { + $xml = "<$name$elementNS>$value"; + } + } else { + $xml = "<$name$elementNS xsi:type=\"" . $this->getPrefixFromNamespace($ns) . ":$uqType\"$encodingStyle>$value"; + } + } + $this->debug("in serializeType: returning: $xml"); + return $xml; + } + + /** + * serializes the attributes for a complexType + * + * @param array $typeDef our internal representation of an XML schema type (or element) + * @param mixed $value a native PHP value (parameter value) + * @param string $ns the namespace of the type + * @param string $uqType the local part of the type + * @return string value serialized as an XML string + * @access private + */ + function serializeComplexTypeAttributes($typeDef, $value, $ns, $uqType) { + $xml = ''; + if (isset($typeDef['attrs']) && is_array($typeDef['attrs'])) { + $this->debug("serialize attributes for XML Schema type $ns:$uqType"); + if (is_array($value)) { + $xvalue = $value; + } elseif (is_object($value)) { + $xvalue = get_object_vars($value); + } else { + $this->debug("value is neither an array nor an object for XML Schema type $ns:$uqType"); + $xvalue = array(); + } + foreach ($typeDef['attrs'] as $aName => $attrs) { + if (isset($xvalue['!' . $aName])) { + $xname = '!' . $aName; + $this->debug("value provided for attribute $aName with key $xname"); + } elseif (isset($xvalue[$aName])) { + $xname = $aName; + $this->debug("value provided for attribute $aName with key $xname"); + } elseif (isset($attrs['default'])) { + $xname = '!' . $aName; + $xvalue[$xname] = $attrs['default']; + $this->debug('use default value of ' . $xvalue[$aName] . ' for attribute ' . $aName); + } else { + $xname = ''; + $this->debug("no value provided for attribute $aName"); + } + if ($xname) { + $xml .= " $aName=\"" . $this->expandEntities($xvalue[$xname]) . "\""; + } + } + } else { + $this->debug("no attributes to serialize for XML Schema type $ns:$uqType"); + } + if (isset($typeDef['extensionBase'])) { + $ns = $this->getPrefix($typeDef['extensionBase']); + $uqType = $this->getLocalPart($typeDef['extensionBase']); + if ($this->getNamespaceFromPrefix($ns)) { + $ns = $this->getNamespaceFromPrefix($ns); + } + if ($typeDef = $this->getTypeDef($uqType, $ns)) { + $this->debug("serialize attributes for extension base $ns:$uqType"); + $xml .= $this->serializeComplexTypeAttributes($typeDef, $value, $ns, $uqType); + } else { + $this->debug("extension base $ns:$uqType is not a supported type"); + } + } + return $xml; + } + + /** + * serializes the elements for a complexType + * + * @param array $typeDef our internal representation of an XML schema type (or element) + * @param mixed $value a native PHP value (parameter value) + * @param string $ns the namespace of the type + * @param string $uqType the local part of the type + * @param string $use use for part (encoded|literal) + * @param string $encodingStyle SOAP encoding style for the value (if different than the enclosing style) + * @return string value serialized as an XML string + * @access private + */ + function serializeComplexTypeElements($typeDef, $value, $ns, $uqType, $use='encoded', $encodingStyle=false) { + $xml = ''; + if (isset($typeDef['elements']) && is_array($typeDef['elements'])) { + $this->debug("in serializeComplexTypeElements, serialize elements for XML Schema type $ns:$uqType"); + if (is_array($value)) { + $xvalue = $value; + } elseif (is_object($value)) { + $xvalue = get_object_vars($value); + } else { + $this->debug("value is neither an array nor an object for XML Schema type $ns:$uqType"); + $xvalue = array(); + } + // toggle whether all elements are present - ideally should validate against schema + if (count($typeDef['elements']) != count($xvalue)){ + $optionals = true; + } + foreach ($typeDef['elements'] as $eName => $attrs) { + if (!isset($xvalue[$eName])) { + if (isset($attrs['default'])) { + $xvalue[$eName] = $attrs['default']; + $this->debug('use default value of ' . $xvalue[$eName] . ' for element ' . $eName); + } + } + // if user took advantage of a minOccurs=0, then only serialize named parameters + if (isset($optionals) + && (!isset($xvalue[$eName])) + && ( (!isset($attrs['nillable'])) || $attrs['nillable'] != 'true') + ){ + if (isset($attrs['minOccurs']) && $attrs['minOccurs'] <> '0') { + $this->debug("apparent error: no value provided for element $eName with minOccurs=" . $attrs['minOccurs']); + } + // do nothing + $this->debug("no value provided for complexType element $eName and element is not nillable, so serialize nothing"); + } else { + // get value + if (isset($xvalue[$eName])) { + $v = $xvalue[$eName]; + } else { + $v = null; + } + if (isset($attrs['form'])) { + $unqualified = ($attrs['form'] == 'unqualified'); + } else { + $unqualified = false; + } + if (isset($attrs['maxOccurs']) && ($attrs['maxOccurs'] == 'unbounded' || $attrs['maxOccurs'] > 1) && isset($v) && is_array($v) && $this->isArraySimpleOrStruct($v) == 'arraySimple') { + $vv = $v; + foreach ($vv as $k => $v) { + if (isset($attrs['type']) || isset($attrs['ref'])) { + // serialize schema-defined type + $xml .= $this->serializeType($eName, isset($attrs['type']) ? $attrs['type'] : $attrs['ref'], $v, $use, $encodingStyle, $unqualified); + } else { + // serialize generic type (can this ever really happen?) + $this->debug("calling serialize_val() for $v, $eName, false, false, false, false, $use"); + $xml .= $this->serialize_val($v, $eName, false, false, false, false, $use); + } + } + } else { + if (isset($attrs['type']) || isset($attrs['ref'])) { + // serialize schema-defined type + $xml .= $this->serializeType($eName, isset($attrs['type']) ? $attrs['type'] : $attrs['ref'], $v, $use, $encodingStyle, $unqualified); + } else { + // serialize generic type (can this ever really happen?) + $this->debug("calling serialize_val() for $v, $eName, false, false, false, false, $use"); + $xml .= $this->serialize_val($v, $eName, false, false, false, false, $use); + } + } + } + } + } else { + $this->debug("no elements to serialize for XML Schema type $ns:$uqType"); + } + if (isset($typeDef['extensionBase'])) { + $ns = $this->getPrefix($typeDef['extensionBase']); + $uqType = $this->getLocalPart($typeDef['extensionBase']); + if ($this->getNamespaceFromPrefix($ns)) { + $ns = $this->getNamespaceFromPrefix($ns); + } + if ($typeDef = $this->getTypeDef($uqType, $ns)) { + $this->debug("serialize elements for extension base $ns:$uqType"); + $xml .= $this->serializeComplexTypeElements($typeDef, $value, $ns, $uqType, $use, $encodingStyle); + } else { + $this->debug("extension base $ns:$uqType is not a supported type"); + } + } + return $xml; + } + + /** + * adds an XML Schema complex type to the WSDL types + * + * @param string name + * @param string typeClass (complexType|simpleType|attribute) + * @param string phpType: currently supported are array and struct (php assoc array) + * @param string compositor (all|sequence|choice) + * @param string restrictionBase namespace:name (http://schemas.xmlsoap.org/soap/encoding/:Array) + * @param array elements = array ( name => array(name=>'',type=>'') ) + * @param array attrs = array(array('ref'=>'SOAP-ENC:arrayType','wsdl:arrayType'=>'xsd:string[]')) + * @param string arrayType: namespace:name (xsd:string) + * @see xmlschema + * @access public + */ + function addComplexType($name,$typeClass='complexType',$phpType='array',$compositor='',$restrictionBase='',$elements=array(),$attrs=array(),$arrayType='') { + if (count($elements) > 0) { + foreach($elements as $n => $e){ + // expand each element + foreach ($e as $k => $v) { + $k = strpos($k,':') ? $this->expandQname($k) : $k; + $v = strpos($v,':') ? $this->expandQname($v) : $v; + $ee[$k] = $v; + } + $eElements[$n] = $ee; + } + $elements = $eElements; + } + + if (count($attrs) > 0) { + foreach($attrs as $n => $a){ + // expand each attribute + foreach ($a as $k => $v) { + $k = strpos($k,':') ? $this->expandQname($k) : $k; + $v = strpos($v,':') ? $this->expandQname($v) : $v; + $aa[$k] = $v; + } + $eAttrs[$n] = $aa; + } + $attrs = $eAttrs; + } + + $restrictionBase = strpos($restrictionBase,':') ? $this->expandQname($restrictionBase) : $restrictionBase; + $arrayType = strpos($arrayType,':') ? $this->expandQname($arrayType) : $arrayType; + + $typens = isset($this->namespaces['types']) ? $this->namespaces['types'] : $this->namespaces['tns']; + $this->schemas[$typens][0]->addComplexType($name,$typeClass,$phpType,$compositor,$restrictionBase,$elements,$attrs,$arrayType); + } + + /** + * adds an XML Schema simple type to the WSDL types + * + * @param string $name + * @param string $restrictionBase namespace:name (http://schemas.xmlsoap.org/soap/encoding/:Array) + * @param string $typeClass (should always be simpleType) + * @param string $phpType (should always be scalar) + * @param array $enumeration array of values + * @see xmlschema + * @access public + */ + function addSimpleType($name, $restrictionBase='', $typeClass='simpleType', $phpType='scalar', $enumeration=array()) { + $restrictionBase = strpos($restrictionBase,':') ? $this->expandQname($restrictionBase) : $restrictionBase; + + $typens = isset($this->namespaces['types']) ? $this->namespaces['types'] : $this->namespaces['tns']; + $this->schemas[$typens][0]->addSimpleType($name, $restrictionBase, $typeClass, $phpType, $enumeration); + } + + /** + * adds an element to the WSDL types + * + * @param array $attrs attributes that must include name and type + * @see xmlschema + * @access public + */ + function addElement($attrs) { + $typens = isset($this->namespaces['types']) ? $this->namespaces['types'] : $this->namespaces['tns']; + $this->schemas[$typens][0]->addElement($attrs); + } + + /** + * register an operation with the server + * + * @param string $name operation (method) name + * @param array $in assoc array of input values: key = param name, value = param type + * @param array $out assoc array of output values: key = param name, value = param type + * @param string $namespace optional The namespace for the operation + * @param string $soapaction optional The soapaction for the operation + * @param string $style (rpc|document) optional The style for the operation Note: when 'document' is specified, parameter and return wrappers are created for you automatically + * @param string $use (encoded|literal) optional The use for the parameters (cannot mix right now) + * @param string $documentation optional The description to include in the WSDL + * @param string $encodingStyle optional (usually 'http://schemas.xmlsoap.org/soap/encoding/' for encoded) + * @access public + */ + function addOperation($name, $in = false, $out = false, $namespace = false, $soapaction = false, $style = 'rpc', $use = 'encoded', $documentation = '', $encodingStyle = ''){ + if ($use == 'encoded' && $encodingStyle == '') { + $encodingStyle = 'http://schemas.xmlsoap.org/soap/encoding/'; + } + + if ($style == 'document') { + $elements = array(); + foreach ($in as $n => $t) { + $elements[$n] = array('name' => $n, 'type' => $t); + } + $this->addComplexType($name . 'RequestType', 'complexType', 'struct', 'all', '', $elements); + $this->addElement(array('name' => $name, 'type' => $name . 'RequestType')); + $in = array('parameters' => 'tns:' . $name); + + $elements = array(); + foreach ($out as $n => $t) { + $elements[$n] = array('name' => $n, 'type' => $t); + } + $this->addComplexType($name . 'ResponseType', 'complexType', 'struct', 'all', '', $elements); + $this->addElement(array('name' => $name . 'Response', 'type' => $name . 'ResponseType')); + $out = array('parameters' => 'tns:' . $name . 'Response'); + } + + // get binding + $this->bindings[ $this->serviceName . 'Binding' ]['operations'][$name] = + array( + 'name' => $name, + 'binding' => $this->serviceName . 'Binding', + 'endpoint' => $this->endpoint, + 'soapAction' => $soapaction, + 'style' => $style, + 'input' => array( + 'use' => $use, + 'namespace' => $namespace, + 'encodingStyle' => $encodingStyle, + 'message' => $name . 'Request', + 'parts' => $in), + 'output' => array( + 'use' => $use, + 'namespace' => $namespace, + 'encodingStyle' => $encodingStyle, + 'message' => $name . 'Response', + 'parts' => $out), + 'namespace' => $namespace, + 'transport' => 'http://schemas.xmlsoap.org/soap/http', + 'documentation' => $documentation); + // add portTypes + // add messages + if($in) + { + foreach($in as $pName => $pType) + { + if(strpos($pType,':')) { + $pType = $this->getNamespaceFromPrefix($this->getPrefix($pType)).":".$this->getLocalPart($pType); + } + $this->messages[$name.'Request'][$pName] = $pType; + } + } else { + $this->messages[$name.'Request']= '0'; + } + if($out) + { + foreach($out as $pName => $pType) + { + if(strpos($pType,':')) { + $pType = $this->getNamespaceFromPrefix($this->getPrefix($pType)).":".$this->getLocalPart($pType); + } + $this->messages[$name.'Response'][$pName] = $pType; + } + } else { + $this->messages[$name.'Response']= '0'; + } + return true; + } +} +?> +* @version $Id: nusoap.php,v 1.94 2005/08/04 01:27:42 snichol Exp $ +* @access public +*/ +class soap_parser extends nusoap_base { + + var $xml = ''; + var $xml_encoding = ''; + var $method = ''; + var $root_struct = ''; + var $root_struct_name = ''; + var $root_struct_namespace = ''; + var $root_header = ''; + var $document = ''; // incoming SOAP body (text) + // determines where in the message we are (envelope,header,body,method) + var $status = ''; + var $position = 0; + var $depth = 0; + var $default_namespace = ''; + var $namespaces = array(); + var $message = array(); + var $parent = ''; + var $fault = false; + var $fault_code = ''; + var $fault_str = ''; + var $fault_detail = ''; + var $depth_array = array(); + var $debug_flag = true; + var $soapresponse = NULL; + var $responseHeaders = ''; // incoming SOAP headers (text) + var $body_position = 0; + // for multiref parsing: + // array of id => pos + var $ids = array(); + // array of id => hrefs => pos + var $multirefs = array(); + // toggle for auto-decoding element content + var $decode_utf8 = true; + + /** + * constructor that actually does the parsing + * + * @param string $xml SOAP message + * @param string $encoding character encoding scheme of message + * @param string $method method for which XML is parsed (unused?) + * @param string $decode_utf8 whether to decode UTF-8 to ISO-8859-1 + * @access public + */ + function soap_parser($xml,$encoding='UTF-8',$method='',$decode_utf8=true){ + parent::nusoap_base(); + $this->xml = $xml; + $this->xml_encoding = $encoding; + $this->method = $method; + $this->decode_utf8 = $decode_utf8; + + // Check whether content has been read. + if(!empty($xml)){ + // Check XML encoding + $pos_xml = strpos($xml, '', $pos_xml + 2) - $pos_xml + 1); + if (preg_match("/encoding=[\"']([^\"']*)[\"']/", $xml_decl, $res)) { + $xml_encoding = $res[1]; + if (strtoupper($xml_encoding) != $encoding) { + $err = "Charset from HTTP Content-Type '" . $encoding . "' does not match encoding from XML declaration '" . $xml_encoding . "'"; + $this->debug($err); + if ($encoding != 'ISO-8859-1' || strtoupper($xml_encoding) != 'UTF-8') { + $this->setError($err); + return; + } + // when HTTP says ISO-8859-1 (the default) and XML says UTF-8 (the typical), assume the other endpoint is just sloppy and proceed + } else { + $this->debug('Charset from HTTP Content-Type matches encoding from XML declaration'); + } + } else { + $this->debug('No encoding specified in XML declaration'); + } + } else { + $this->debug('No XML declaration'); + } + $this->debug('Entering soap_parser(), length='.strlen($xml).', encoding='.$encoding); + // Create an XML parser - why not xml_parser_create_ns? + $this->parser = xml_parser_create($this->xml_encoding); + // Set the options for parsing the XML data. + //xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1); + xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, 0); + xml_parser_set_option($this->parser, XML_OPTION_TARGET_ENCODING, $this->xml_encoding); + // Set the object for the parser. + xml_set_object($this->parser, $this); + // Set the element handlers for the parser. + xml_set_element_handler($this->parser, 'start_element','end_element'); + xml_set_character_data_handler($this->parser,'character_data'); + + // Parse the XML file. + if(!xml_parse($this->parser,$xml,true)){ + // Display an error message. + $err = sprintf('XML error parsing SOAP payload on line %d: %s', + xml_get_current_line_number($this->parser), + xml_error_string(xml_get_error_code($this->parser))); + $this->debug($err); + $this->debug("XML payload:\n" . $xml); + $this->setError($err); + } else { + $this->debug('parsed successfully, found root struct: '.$this->root_struct.' of name '.$this->root_struct_name); + // get final value + $this->soapresponse = $this->message[$this->root_struct]['result']; + // get header value: no, because this is documented as XML string +// if($this->root_header != '' && isset($this->message[$this->root_header]['result'])){ +// $this->responseHeaders = $this->message[$this->root_header]['result']; +// } + // resolve hrefs/ids + if(sizeof($this->multirefs) > 0){ + foreach($this->multirefs as $id => $hrefs){ + $this->debug('resolving multirefs for id: '.$id); + $idVal = $this->buildVal($this->ids[$id]); + if (is_array($idVal) && isset($idVal['!id'])) { + unset($idVal['!id']); + } + foreach($hrefs as $refPos => $ref){ + $this->debug('resolving href at pos '.$refPos); + $this->multirefs[$id][$refPos] = $idVal; + } + } + } + } + xml_parser_free($this->parser); + } else { + $this->debug('xml was empty, didn\'t parse!'); + $this->setError('xml was empty, didn\'t parse!'); + } + } + + /** + * start-element handler + * + * @param resource $parser XML parser object + * @param string $name element name + * @param array $attrs associative array of attributes + * @access private + */ + function start_element($parser, $name, $attrs) { + // position in a total number of elements, starting from 0 + // update class level pos + $pos = $this->position++; + // and set mine + $this->message[$pos] = array('pos' => $pos,'children'=>'','cdata'=>''); + // depth = how many levels removed from root? + // set mine as current global depth and increment global depth value + $this->message[$pos]['depth'] = $this->depth++; + + // else add self as child to whoever the current parent is + if($pos != 0){ + $this->message[$this->parent]['children'] .= '|'.$pos; + } + // set my parent + $this->message[$pos]['parent'] = $this->parent; + // set self as current parent + $this->parent = $pos; + // set self as current value for this depth + $this->depth_array[$this->depth] = $pos; + // get element prefix + if(strpos($name,':')){ + // get ns prefix + $prefix = substr($name,0,strpos($name,':')); + // get unqualified name + $name = substr(strstr($name,':'),1); + } + // set status + if($name == 'Envelope'){ + $this->status = 'envelope'; + } elseif($name == 'Header'){ + $this->root_header = $pos; + $this->status = 'header'; + } elseif($name == 'Body'){ + $this->status = 'body'; + $this->body_position = $pos; + // set method + } elseif($this->status == 'body' && $pos == ($this->body_position+1)){ + $this->status = 'method'; + $this->root_struct_name = $name; + $this->root_struct = $pos; + $this->message[$pos]['type'] = 'struct'; + $this->debug("found root struct $this->root_struct_name, pos $this->root_struct"); + } + // set my status + $this->message[$pos]['status'] = $this->status; + // set name + $this->message[$pos]['name'] = htmlspecialchars($name); + // set attrs + $this->message[$pos]['attrs'] = $attrs; + + // loop through atts, logging ns and type declarations + $attstr = ''; + foreach($attrs as $key => $value){ + $key_prefix = $this->getPrefix($key); + $key_localpart = $this->getLocalPart($key); + // if ns declarations, add to class level array of valid namespaces + if($key_prefix == 'xmlns'){ + if(ereg('^http://www.w3.org/[0-9]{4}/XMLSchema$',$value)){ + $this->XMLSchemaVersion = $value; + $this->namespaces['xsd'] = $this->XMLSchemaVersion; + $this->namespaces['xsi'] = $this->XMLSchemaVersion.'-instance'; + } + $this->namespaces[$key_localpart] = $value; + // set method namespace + if($name == $this->root_struct_name){ + $this->methodNamespace = $value; + } + // if it's a type declaration, set type + } elseif($key_localpart == 'type'){ + $value_prefix = $this->getPrefix($value); + $value_localpart = $this->getLocalPart($value); + $this->message[$pos]['type'] = $value_localpart; + $this->message[$pos]['typePrefix'] = $value_prefix; + if(isset($this->namespaces[$value_prefix])){ + $this->message[$pos]['type_namespace'] = $this->namespaces[$value_prefix]; + } else if(isset($attrs['xmlns:'.$value_prefix])) { + $this->message[$pos]['type_namespace'] = $attrs['xmlns:'.$value_prefix]; + } + // should do something here with the namespace of specified type? + } elseif($key_localpart == 'arrayType'){ + $this->message[$pos]['type'] = 'array'; + /* do arrayType ereg here + [1] arrayTypeValue ::= atype asize + [2] atype ::= QName rank* + [3] rank ::= '[' (',')* ']' + [4] asize ::= '[' length~ ']' + [5] length ::= nextDimension* Digit+ + [6] nextDimension ::= Digit+ ',' + */ + $expr = '([A-Za-z0-9_]+):([A-Za-z]+[A-Za-z0-9_]+)\[([0-9]+),?([0-9]*)\]'; + if(ereg($expr,$value,$regs)){ + $this->message[$pos]['typePrefix'] = $regs[1]; + $this->message[$pos]['arrayTypePrefix'] = $regs[1]; + if (isset($this->namespaces[$regs[1]])) { + $this->message[$pos]['arrayTypeNamespace'] = $this->namespaces[$regs[1]]; + } else if (isset($attrs['xmlns:'.$regs[1]])) { + $this->message[$pos]['arrayTypeNamespace'] = $attrs['xmlns:'.$regs[1]]; + } + $this->message[$pos]['arrayType'] = $regs[2]; + $this->message[$pos]['arraySize'] = $regs[3]; + $this->message[$pos]['arrayCols'] = $regs[4]; + } + // specifies nil value (or not) + } elseif ($key_localpart == 'nil'){ + $this->message[$pos]['nil'] = ($value == 'true' || $value == '1'); + // some other attribute + } elseif ($key != 'href' && $key != 'xmlns' && $key_localpart != 'encodingStyle' && $key_localpart != 'root') { + $this->message[$pos]['xattrs']['!' . $key] = $value; + } + + if ($key == 'xmlns') { + $this->default_namespace = $value; + } + // log id + if($key == 'id'){ + $this->ids[$value] = $pos; + } + // root + if($key_localpart == 'root' && $value == 1){ + $this->status = 'method'; + $this->root_struct_name = $name; + $this->root_struct = $pos; + $this->debug("found root struct $this->root_struct_name, pos $pos"); + } + // for doclit + $attstr .= " $key=\"$value\""; + } + // get namespace - must be done after namespace atts are processed + if(isset($prefix)){ + $this->message[$pos]['namespace'] = $this->namespaces[$prefix]; + $this->default_namespace = $this->namespaces[$prefix]; + } else { + $this->message[$pos]['namespace'] = $this->default_namespace; + } + if($this->status == 'header'){ + if ($this->root_header != $pos) { + $this->responseHeaders .= "<" . (isset($prefix) ? $prefix . ':' : '') . "$name$attstr>"; + } + } elseif($this->root_struct_name != ''){ + $this->document .= "<" . (isset($prefix) ? $prefix . ':' : '') . "$name$attstr>"; + } + } + + /** + * end-element handler + * + * @param resource $parser XML parser object + * @param string $name element name + * @access private + */ + function end_element($parser, $name) { + // position of current element is equal to the last value left in depth_array for my depth + $pos = $this->depth_array[$this->depth--]; + + // get element prefix + if(strpos($name,':')){ + // get ns prefix + $prefix = substr($name,0,strpos($name,':')); + // get unqualified name + $name = substr(strstr($name,':'),1); + } + + // build to native type + if(isset($this->body_position) && $pos > $this->body_position){ + // deal w/ multirefs + if(isset($this->message[$pos]['attrs']['href'])){ + // get id + $id = substr($this->message[$pos]['attrs']['href'],1); + // add placeholder to href array + $this->multirefs[$id][$pos] = 'placeholder'; + // add set a reference to it as the result value + $this->message[$pos]['result'] =& $this->multirefs[$id][$pos]; + // build complexType values + } elseif($this->message[$pos]['children'] != ''){ + // if result has already been generated (struct/array) + if(!isset($this->message[$pos]['result'])){ + $this->message[$pos]['result'] = $this->buildVal($pos); + } + // build complexType values of attributes and possibly simpleContent + } elseif (isset($this->message[$pos]['xattrs'])) { + if (isset($this->message[$pos]['nil']) && $this->message[$pos]['nil']) { + $this->message[$pos]['xattrs']['!'] = null; + } elseif (isset($this->message[$pos]['cdata']) && trim($this->message[$pos]['cdata']) != '') { + if (isset($this->message[$pos]['type'])) { + $this->message[$pos]['xattrs']['!'] = $this->decodeSimple($this->message[$pos]['cdata'], $this->message[$pos]['type'], isset($this->message[$pos]['type_namespace']) ? $this->message[$pos]['type_namespace'] : ''); + } else { + $parent = $this->message[$pos]['parent']; + if (isset($this->message[$parent]['type']) && ($this->message[$parent]['type'] == 'array') && isset($this->message[$parent]['arrayType'])) { + $this->message[$pos]['xattrs']['!'] = $this->decodeSimple($this->message[$pos]['cdata'], $this->message[$parent]['arrayType'], isset($this->message[$parent]['arrayTypeNamespace']) ? $this->message[$parent]['arrayTypeNamespace'] : ''); + } else { + $this->message[$pos]['xattrs']['!'] = $this->message[$pos]['cdata']; + } + } + } + $this->message[$pos]['result'] = $this->message[$pos]['xattrs']; + // set value of simpleType (or nil complexType) + } else { + //$this->debug('adding data for scalar value '.$this->message[$pos]['name'].' of value '.$this->message[$pos]['cdata']); + if (isset($this->message[$pos]['nil']) && $this->message[$pos]['nil']) { + $this->message[$pos]['xattrs']['!'] = null; + } elseif (isset($this->message[$pos]['type'])) { + $this->message[$pos]['result'] = $this->decodeSimple($this->message[$pos]['cdata'], $this->message[$pos]['type'], isset($this->message[$pos]['type_namespace']) ? $this->message[$pos]['type_namespace'] : ''); + } else { + $parent = $this->message[$pos]['parent']; + if (isset($this->message[$parent]['type']) && ($this->message[$parent]['type'] == 'array') && isset($this->message[$parent]['arrayType'])) { + $this->message[$pos]['result'] = $this->decodeSimple($this->message[$pos]['cdata'], $this->message[$parent]['arrayType'], isset($this->message[$parent]['arrayTypeNamespace']) ? $this->message[$parent]['arrayTypeNamespace'] : ''); + } else { + $this->message[$pos]['result'] = $this->message[$pos]['cdata']; + } + } + + /* add value to parent's result, if parent is struct/array + $parent = $this->message[$pos]['parent']; + if($this->message[$parent]['type'] != 'map'){ + if(strtolower($this->message[$parent]['type']) == 'array'){ + $this->message[$parent]['result'][] = $this->message[$pos]['result']; + } else { + $this->message[$parent]['result'][$this->message[$pos]['name']] = $this->message[$pos]['result']; + } + } + */ + } + } + + // for doclit + if($this->status == 'header'){ + if ($this->root_header != $pos) { + $this->responseHeaders .= ""; + } + } elseif($pos >= $this->root_struct){ + $this->document .= ""; + } + // switch status + if($pos == $this->root_struct){ + $this->status = 'body'; + $this->root_struct_namespace = $this->message[$pos]['namespace']; + } elseif($name == 'Body'){ + $this->status = 'envelope'; + } elseif($name == 'Header'){ + $this->status = 'envelope'; + } elseif($name == 'Envelope'){ + // + } + // set parent back to my parent + $this->parent = $this->message[$pos]['parent']; + } + + /** + * element content handler + * + * @param resource $parser XML parser object + * @param string $data element content + * @access private + */ + function character_data($parser, $data){ + $pos = $this->depth_array[$this->depth]; + if ($this->xml_encoding=='UTF-8'){ + // TODO: add an option to disable this for folks who want + // raw UTF-8 that, e.g., might not map to iso-8859-1 + // TODO: this can also be handled with xml_parser_set_option($this->parser, XML_OPTION_TARGET_ENCODING, "ISO-8859-1"); + if($this->decode_utf8){ + $data = utf8_decode($data); + } + } + $this->message[$pos]['cdata'] .= $data; + // for doclit + if($this->status == 'header'){ + $this->responseHeaders .= $data; + } else { + $this->document .= $data; + } + } + + /** + * get the parsed message + * + * @return mixed + * @access public + */ + function get_response(){ + return $this->soapresponse; + } + + /** + * get the parsed headers + * + * @return string XML or empty if no headers + * @access public + */ + function getHeaders(){ + return $this->responseHeaders; + } + + /** + * decodes simple types into PHP variables + * + * @param string $value value to decode + * @param string $type XML type to decode + * @param string $typens XML type namespace to decode + * @return mixed PHP value + * @access private + */ + function decodeSimple($value, $type, $typens) { + // TODO: use the namespace! + if ((!isset($type)) || $type == 'string' || $type == 'long' || $type == 'unsignedLong') { + return (string) $value; + } + if ($type == 'int' || $type == 'integer' || $type == 'short' || $type == 'byte') { + return (int) $value; + } + if ($type == 'float' || $type == 'double' || $type == 'decimal') { + return (double) $value; + } + if ($type == 'boolean') { + if (strtolower($value) == 'false' || strtolower($value) == 'f') { + return false; + } + return (boolean) $value; + } + if ($type == 'base64' || $type == 'base64Binary') { + $this->debug('Decode base64 value'); + return base64_decode($value); + } + // obscure numeric types + if ($type == 'nonPositiveInteger' || $type == 'negativeInteger' + || $type == 'nonNegativeInteger' || $type == 'positiveInteger' + || $type == 'unsignedInt' + || $type == 'unsignedShort' || $type == 'unsignedByte') { + return (int) $value; + } + // bogus: parser treats array with no elements as a simple type + if ($type == 'array') { + return array(); + } + // everything else + return (string) $value; + } + + /** + * builds response structures for compound values (arrays/structs) + * and scalars + * + * @param integer $pos position in node tree + * @return mixed PHP value + * @access private + */ + function buildVal($pos){ + if(!isset($this->message[$pos]['type'])){ + $this->message[$pos]['type'] = ''; + } + $this->debug('in buildVal() for '.$this->message[$pos]['name']."(pos $pos) of type ".$this->message[$pos]['type']); + // if there are children... + if($this->message[$pos]['children'] != ''){ + $this->debug('in buildVal, there are children'); + $children = explode('|',$this->message[$pos]['children']); + array_shift($children); // knock off empty + // md array + if(isset($this->message[$pos]['arrayCols']) && $this->message[$pos]['arrayCols'] != ''){ + $r=0; // rowcount + $c=0; // colcount + foreach($children as $child_pos){ + $this->debug("in buildVal, got an MD array element: $r, $c"); + $params[$r][] = $this->message[$child_pos]['result']; + $c++; + if($c == $this->message[$pos]['arrayCols']){ + $c = 0; + $r++; + } + } + // array + } elseif($this->message[$pos]['type'] == 'array' || $this->message[$pos]['type'] == 'Array'){ + $this->debug('in buildVal, adding array '.$this->message[$pos]['name']); + foreach($children as $child_pos){ + $params[] = &$this->message[$child_pos]['result']; + } + // apache Map type: java hashtable + } elseif($this->message[$pos]['type'] == 'Map' && $this->message[$pos]['type_namespace'] == 'http://xml.apache.org/xml-soap'){ + $this->debug('in buildVal, Java Map '.$this->message[$pos]['name']); + foreach($children as $child_pos){ + $kv = explode("|",$this->message[$child_pos]['children']); + $params[$this->message[$kv[1]]['result']] = &$this->message[$kv[2]]['result']; + } + // generic compound type + //} elseif($this->message[$pos]['type'] == 'SOAPStruct' || $this->message[$pos]['type'] == 'struct') { + } else { + // Apache Vector type: treat as an array + $this->debug('in buildVal, adding Java Vector '.$this->message[$pos]['name']); + if ($this->message[$pos]['type'] == 'Vector' && $this->message[$pos]['type_namespace'] == 'http://xml.apache.org/xml-soap') { + $notstruct = 1; + } else { + $notstruct = 0; + } + // + foreach($children as $child_pos){ + if($notstruct){ + $params[] = &$this->message[$child_pos]['result']; + } else { + if (isset($params[$this->message[$child_pos]['name']])) { + // de-serialize repeated element name into an array + if ((!is_array($params[$this->message[$child_pos]['name']])) || (!isset($params[$this->message[$child_pos]['name']][0]))) { + $params[$this->message[$child_pos]['name']] = array($params[$this->message[$child_pos]['name']]); + } + $params[$this->message[$child_pos]['name']][] = &$this->message[$child_pos]['result']; + } else { + $params[$this->message[$child_pos]['name']] = &$this->message[$child_pos]['result']; + } + } + } + } + if (isset($this->message[$pos]['xattrs'])) { + $this->debug('in buildVal, handling attributes'); + foreach ($this->message[$pos]['xattrs'] as $n => $v) { + $params[$n] = $v; + } + } + // handle simpleContent + if (isset($this->message[$pos]['cdata']) && trim($this->message[$pos]['cdata']) != '') { + $this->debug('in buildVal, handling simpleContent'); + if (isset($this->message[$pos]['type'])) { + $params['!'] = $this->decodeSimple($this->message[$pos]['cdata'], $this->message[$pos]['type'], isset($this->message[$pos]['type_namespace']) ? $this->message[$pos]['type_namespace'] : ''); + } else { + $parent = $this->message[$pos]['parent']; + if (isset($this->message[$parent]['type']) && ($this->message[$parent]['type'] == 'array') && isset($this->message[$parent]['arrayType'])) { + $params['!'] = $this->decodeSimple($this->message[$pos]['cdata'], $this->message[$parent]['arrayType'], isset($this->message[$parent]['arrayTypeNamespace']) ? $this->message[$parent]['arrayTypeNamespace'] : ''); + } else { + $params['!'] = $this->message[$pos]['cdata']; + } + } + } + return is_array($params) ? $params : array(); + } else { + $this->debug('in buildVal, no children, building scalar'); + $cdata = isset($this->message[$pos]['cdata']) ? $this->message[$pos]['cdata'] : ''; + if (isset($this->message[$pos]['type'])) { + return $this->decodeSimple($cdata, $this->message[$pos]['type'], isset($this->message[$pos]['type_namespace']) ? $this->message[$pos]['type_namespace'] : ''); + } + $parent = $this->message[$pos]['parent']; + if (isset($this->message[$parent]['type']) && ($this->message[$parent]['type'] == 'array') && isset($this->message[$parent]['arrayType'])) { + return $this->decodeSimple($cdata, $this->message[$parent]['arrayType'], isset($this->message[$parent]['arrayTypeNamespace']) ? $this->message[$parent]['arrayTypeNamespace'] : ''); + } + return $this->message[$pos]['cdata']; + } + } +} + + + +?>call( string methodname [ ,array parameters] ); +* +* // bye bye client +* unset($soapclient); +* +* @author Dietrich Ayala +* @version $Id: nusoap.php,v 1.94 2005/08/04 01:27:42 snichol Exp $ +* @access public +*/ +class soapclient extends nusoap_base { + + var $username = ''; + var $password = ''; + var $authtype = ''; + var $certRequest = array(); + var $requestHeaders = false; // SOAP headers in request (text) + var $responseHeaders = ''; // SOAP headers from response (incomplete namespace resolution) (text) + var $document = ''; // SOAP body response portion (incomplete namespace resolution) (text) + var $endpoint; + var $forceEndpoint = ''; // overrides WSDL endpoint + var $proxyhost = ''; + var $proxyport = ''; + var $proxyusername = ''; + var $proxypassword = ''; + var $xml_encoding = ''; // character set encoding of incoming (response) messages + var $http_encoding = false; + var $timeout = 0; // HTTP connection timeout + var $response_timeout = 30; // HTTP response timeout + var $endpointType = ''; // soap|wsdl, empty for WSDL initialization error + var $persistentConnection = false; + var $defaultRpcParams = false; // This is no longer used + var $request = ''; // HTTP request + var $response = ''; // HTTP response + var $responseData = ''; // SOAP payload of response + var $cookies = array(); // Cookies from response or for request + var $decode_utf8 = true; // toggles whether the parser decodes element content w/ utf8_decode() + var $operations = array(); // WSDL operations, empty for WSDL initialization error + + /* + * fault related variables + */ + /** + * @var fault + * @access public + */ + var $fault; + /** + * @var faultcode + * @access public + */ + var $faultcode; + /** + * @var faultstring + * @access public + */ + var $faultstring; + /** + * @var faultdetail + * @access public + */ + var $faultdetail; + + /** + * constructor + * + * @param mixed $endpoint SOAP server or WSDL URL (string), or wsdl instance (object) + * @param bool $wsdl optional, set to true if using WSDL + * @param int $portName optional portName in WSDL document + * @param string $proxyhost + * @param string $proxyport + * @param string $proxyusername + * @param string $proxypassword + * @param integer $timeout set the connection timeout + * @param integer $response_timeout set the response timeout + * @access public + */ + function soapclient($endpoint,$wsdl = false,$proxyhost = false,$proxyport = false,$proxyusername = false, $proxypassword = false, $timeout = 0, $response_timeout = 30){ + parent::nusoap_base(); + $this->endpoint = $endpoint; + $this->proxyhost = $proxyhost; + $this->proxyport = $proxyport; + $this->proxyusername = $proxyusername; + $this->proxypassword = $proxypassword; + $this->timeout = $timeout; + $this->response_timeout = $response_timeout; + + // make values + if($wsdl){ + if (is_object($endpoint) && (get_class($endpoint) == 'wsdl')) { + $this->wsdl = $endpoint; + $this->endpoint = $this->wsdl->wsdl; + $this->wsdlFile = $this->endpoint; + $this->debug('existing wsdl instance created from ' . $this->endpoint); + } else { + $this->wsdlFile = $this->endpoint; + + // instantiate wsdl object and parse wsdl file + $this->debug('instantiating wsdl class with doc: '.$endpoint); + $this->wsdl =& new wsdl($this->wsdlFile,$this->proxyhost,$this->proxyport,$this->proxyusername,$this->proxypassword,$this->timeout,$this->response_timeout); + } + $this->appendDebug($this->wsdl->getDebug()); + $this->wsdl->clearDebug(); + // catch errors + if($errstr = $this->wsdl->getError()){ + $this->debug('got wsdl error: '.$errstr); + $this->setError('wsdl error: '.$errstr); + } elseif($this->operations = $this->wsdl->getOperations()){ + $this->debug( 'got '.count($this->operations).' operations from wsdl '.$this->wsdlFile); + $this->endpointType = 'wsdl'; + } else { + $this->debug( 'getOperations returned false'); + $this->setError('no operations defined in the WSDL document!'); + } + } else { + $this->debug("instantiate SOAP with endpoint at $endpoint"); + $this->endpointType = 'soap'; + } + } + + /** + * calls method, returns PHP native type + * + * @param string $method SOAP server URL or path + * @param mixed $params An array, associative or simple, of the parameters + * for the method call, or a string that is the XML + * for the call. For rpc style, this call will + * wrap the XML in a tag named after the method, as + * well as the SOAP Envelope and Body. For document + * style, this will only wrap with the Envelope and Body. + * IMPORTANT: when using an array with document style, + * in which case there + * is really one parameter, the root of the fragment + * used in the call, which encloses what programmers + * normally think of parameters. A parameter array + * *must* include the wrapper. + * @param string $namespace optional method namespace (WSDL can override) + * @param string $soapAction optional SOAPAction value (WSDL can override) + * @param mixed $headers optional string of XML with SOAP header content, or array of soapval objects for SOAP headers + * @param boolean $rpcParams optional (no longer used) + * @param string $style optional (rpc|document) the style to use when serializing parameters (WSDL can override) + * @param string $use optional (encoded|literal) the use when serializing parameters (WSDL can override) + * @return mixed response from SOAP call + * @access public + */ + function call($operation,$params=array(),$namespace='http://tempuri.org',$soapAction='',$headers=false,$rpcParams=null,$style='rpc',$use='encoded'){ + $this->operation = $operation; + $this->fault = false; + $this->setError(''); + $this->request = ''; + $this->response = ''; + $this->responseData = ''; + $this->faultstring = ''; + $this->faultcode = ''; + $this->opData = array(); + + $this->debug("call: operation=$operation, namespace=$namespace, soapAction=$soapAction, rpcParams=$rpcParams, style=$style, use=$use, endpointType=$this->endpointType"); + $this->appendDebug('params=' . $this->varDump($params)); + $this->appendDebug('headers=' . $this->varDump($headers)); + if ($headers) { + $this->requestHeaders = $headers; + } + // serialize parameters + if($this->endpointType == 'wsdl' && $opData = $this->getOperationData($operation)){ + // use WSDL for operation + $this->opData = $opData; + $this->debug("found operation"); + $this->appendDebug('opData=' . $this->varDump($opData)); + if (isset($opData['soapAction'])) { + $soapAction = $opData['soapAction']; + } + if (! $this->forceEndpoint) { + $this->endpoint = $opData['endpoint']; + } else { + $this->endpoint = $this->forceEndpoint; + } + $namespace = isset($opData['input']['namespace']) ? $opData['input']['namespace'] : $namespace; + $style = $opData['style']; + $use = $opData['input']['use']; + // add ns to ns array + if($namespace != '' && !isset($this->wsdl->namespaces[$namespace])){ + $nsPrefix = 'ns' . rand(1000, 9999); + $this->wsdl->namespaces[$nsPrefix] = $namespace; + } + $nsPrefix = $this->wsdl->getPrefixFromNamespace($namespace); + // serialize payload + if (is_string($params)) { + $this->debug("serializing param string for WSDL operation $operation"); + $payload = $params; + } elseif (is_array($params)) { + $this->debug("serializing param array for WSDL operation $operation"); + $payload = $this->wsdl->serializeRPCParameters($operation,'input',$params); + } else { + $this->debug('params must be array or string'); + $this->setError('params must be array or string'); + return false; + } + $usedNamespaces = $this->wsdl->usedNamespaces; + if (isset($opData['input']['encodingStyle'])) { + $encodingStyle = $opData['input']['encodingStyle']; + } else { + $encodingStyle = ''; + } + $this->appendDebug($this->wsdl->getDebug()); + $this->wsdl->clearDebug(); + if ($errstr = $this->wsdl->getError()) { + $this->debug('got wsdl error: '.$errstr); + $this->setError('wsdl error: '.$errstr); + return false; + } + } elseif($this->endpointType == 'wsdl') { + // operation not in WSDL + $this->appendDebug($this->wsdl->getDebug()); + $this->wsdl->clearDebug(); + $this->setError( 'operation '.$operation.' not present.'); + $this->debug("operation '$operation' not present."); + return false; + } else { + // no WSDL + //$this->namespaces['ns1'] = $namespace; + $nsPrefix = 'ns' . rand(1000, 9999); + // serialize + $payload = ''; + if (is_string($params)) { + $this->debug("serializing param string for operation $operation"); + $payload = $params; + } elseif (is_array($params)) { + $this->debug("serializing param array for operation $operation"); + foreach($params as $k => $v){ + $payload .= $this->serialize_val($v,$k,false,false,false,false,$use); + } + } else { + $this->debug('params must be array or string'); + $this->setError('params must be array or string'); + return false; + } + $usedNamespaces = array(); + if ($use == 'encoded') { + $encodingStyle = 'http://schemas.xmlsoap.org/soap/encoding/'; + } else { + $encodingStyle = ''; + } + } + // wrap RPC calls with method element + if ($style == 'rpc') { + if ($use == 'literal') { + $this->debug("wrapping RPC request with literal method element"); + if ($namespace) { + $payload = "<$operation xmlns=\"$namespace\">" . $payload . ""; + } else { + $payload = "<$operation>" . $payload . ""; + } + } else { + $this->debug("wrapping RPC request with encoded method element"); + if ($namespace) { + $payload = "<$nsPrefix:$operation xmlns:$nsPrefix=\"$namespace\">" . + $payload . + ""; + } else { + $payload = "<$operation>" . + $payload . + ""; + } + } + } + // serialize envelope + $soapmsg = $this->serializeEnvelope($payload,$this->requestHeaders,$usedNamespaces,$style,$use,$encodingStyle); + $this->debug("endpoint=$this->endpoint, soapAction=$soapAction, namespace=$namespace, style=$style, use=$use, encodingStyle=$encodingStyle"); + $this->debug('SOAP message length=' . strlen($soapmsg) . ' contents (max 1000 bytes)=' . substr($soapmsg, 0, 1000)); + // send + $return = $this->send($this->getHTTPBody($soapmsg),$soapAction,$this->timeout,$this->response_timeout); + if($errstr = $this->getError()){ + $this->debug('Error: '.$errstr); + return false; + } else { + $this->return = $return; + $this->debug('sent message successfully and got a(n) '.gettype($return)); + $this->appendDebug('return=' . $this->varDump($return)); + + // fault? + if(is_array($return) && isset($return['faultcode'])){ + $this->debug('got fault'); + $this->setError($return['faultcode'].': '.$return['faultstring']); + $this->fault = true; + foreach($return as $k => $v){ + $this->$k = $v; + $this->debug("$k = $v
    "); + } + return $return; + } elseif ($style == 'document') { + // NOTE: if the response is defined to have multiple parts (i.e. unwrapped), + // we are only going to return the first part here...sorry about that + return $return; + } else { + // array of return values + if(is_array($return)){ + // multiple 'out' parameters, which we return wrapped up + // in the array + if(sizeof($return) > 1){ + return $return; + } + // single 'out' parameter (normally the return value) + $return = array_shift($return); + $this->debug('return shifted value: '); + $this->appendDebug($this->varDump($return)); + return $return; + // nothing returned (ie, echoVoid) + } else { + return ""; + } + } + } + } + + /** + * get available data pertaining to an operation + * + * @param string $operation operation name + * @return array array of data pertaining to the operation + * @access public + */ + function getOperationData($operation){ + if(isset($this->operations[$operation])){ + return $this->operations[$operation]; + } + $this->debug("No data for operation: $operation"); + } + + /** + * send the SOAP message + * + * Note: if the operation has multiple return values + * the return value of this method will be an array + * of those values. + * + * @param string $msg a SOAPx4 soapmsg object + * @param string $soapaction SOAPAction value + * @param integer $timeout set connection timeout in seconds + * @param integer $response_timeout set response timeout in seconds + * @return mixed native PHP types. + * @access private + */ + function send($msg, $soapaction = '', $timeout=0, $response_timeout=30) { + $this->checkCookies(); + // detect transport + switch(true){ + // http(s) + case ereg('^http',$this->endpoint): + $this->debug('transporting via HTTP'); + if($this->persistentConnection == true && is_object($this->persistentConnection)){ + $http =& $this->persistentConnection; + } else { + $http = new soap_transport_http($this->endpoint); + if ($this->persistentConnection) { + $http->usePersistentConnection(); + } + } + $http->setContentType($this->getHTTPContentType(), $this->getHTTPContentTypeCharset()); + $http->setSOAPAction($soapaction); + if($this->proxyhost && $this->proxyport){ + $http->setProxy($this->proxyhost,$this->proxyport,$this->proxyusername,$this->proxypassword); + } + if($this->authtype != '') { + $http->setCredentials($this->username, $this->password, $this->authtype, array(), $this->certRequest); + } + if($this->http_encoding != ''){ + $http->setEncoding($this->http_encoding); + } + $this->debug('sending message, length='.strlen($msg)); + if(ereg('^http:',$this->endpoint)){ + //if(strpos($this->endpoint,'http:')){ + $this->responseData = $http->send($msg,$timeout,$response_timeout,$this->cookies); + } elseif(ereg('^https',$this->endpoint)){ + //} elseif(strpos($this->endpoint,'https:')){ + //if(phpversion() == '4.3.0-dev'){ + //$response = $http->send($msg,$timeout,$response_timeout); + //$this->request = $http->outgoing_payload; + //$this->response = $http->incoming_payload; + //} else + $this->responseData = $http->sendHTTPS($msg,$timeout,$response_timeout,$this->cookies); + } else { + $this->setError('no http/s in endpoint url'); + } + $this->request = $http->outgoing_payload; + $this->response = $http->incoming_payload; + $this->appendDebug($http->getDebug()); + $this->UpdateCookies($http->incoming_cookies); + + // save transport object if using persistent connections + if ($this->persistentConnection) { + $http->clearDebug(); + if (!is_object($this->persistentConnection)) { + $this->persistentConnection = $http; + } + } + + if($err = $http->getError()){ + $this->setError('HTTP Error: '.$err); + return false; + } elseif($this->getError()){ + return false; + } else { + $this->debug('got response, length='. strlen($this->responseData).' type='.$http->incoming_headers['content-type']); + return $this->parseResponse($http->incoming_headers, $this->responseData); + } + break; + default: + $this->setError('no transport found, or selected transport is not yet supported!'); + return false; + break; + } + } + + /** + * processes SOAP message returned from server + * + * @param array $headers The HTTP headers + * @param string $data unprocessed response data from server + * @return mixed value of the message, decoded into a PHP type + * @access private + */ + function parseResponse($headers, $data) { + $this->debug('Entering parseResponse() for data of length ' . strlen($data) . ' and type ' . $headers['content-type']); + if (!strstr($headers['content-type'], 'text/xml')) { + $this->setError('Response not of type text/xml'); + return false; + } + if (strpos($headers['content-type'], '=')) { + $enc = str_replace('"', '', substr(strstr($headers["content-type"], '='), 1)); + $this->debug('Got response encoding: ' . $enc); + if(preg_match('/(ISO-8859-1|US-ASCII|UTF-8)/',$enc)){ + $this->xml_encoding = strtoupper($enc); + } else { + $this->xml_encoding = 'US-ASCII'; + } + } else { + // should be US-ASCII for HTTP 1.0 or ISO-8859-1 for HTTP 1.1 + $this->xml_encoding = 'ISO-8859-1'; + } + $this->debug('Use encoding: ' . $this->xml_encoding . ' when creating soap_parser'); + $parser = new soap_parser($data,$this->xml_encoding,$this->operation,$this->decode_utf8); + // add parser debug data to our debug + $this->appendDebug($parser->getDebug()); + // if parse errors + if($errstr = $parser->getError()){ + $this->setError( $errstr); + // destroy the parser object + unset($parser); + return false; + } else { + // get SOAP headers + $this->responseHeaders = $parser->getHeaders(); + // get decoded message + $return = $parser->get_response(); + // add document for doclit support + $this->document = $parser->document; + // destroy the parser object + unset($parser); + // return decode message + return $return; + } + } + + /** + * sets the SOAP endpoint, which can override WSDL + * + * @param $endpoint string The endpoint URL to use, or empty string or false to prevent override + * @access public + */ + function setEndpoint($endpoint) { + $this->forceEndpoint = $endpoint; + } + + /** + * set the SOAP headers + * + * @param $headers mixed String of XML with SOAP header content, or array of soapval objects for SOAP headers + * @access public + */ + function setHeaders($headers){ + $this->requestHeaders = $headers; + } + + /** + * get the SOAP response headers (namespace resolution incomplete) + * + * @return string + * @access public + */ + function getHeaders(){ + return $this->responseHeaders; + } + + /** + * set proxy info here + * + * @param string $proxyhost + * @param string $proxyport + * @param string $proxyusername + * @param string $proxypassword + * @access public + */ + function setHTTPProxy($proxyhost, $proxyport, $proxyusername = '', $proxypassword = '') { + $this->proxyhost = $proxyhost; + $this->proxyport = $proxyport; + $this->proxyusername = $proxyusername; + $this->proxypassword = $proxypassword; + } + + /** + * if authenticating, set user credentials here + * + * @param string $username + * @param string $password + * @param string $authtype (basic|digest|certificate) + * @param array $certRequest (keys must be cainfofile (optional), sslcertfile, sslkeyfile, passphrase, verifypeer (optional), verifyhost (optional): see corresponding options in cURL docs) + * @access public + */ + function setCredentials($username, $password, $authtype = 'basic', $certRequest = array()) { + $this->username = $username; + $this->password = $password; + $this->authtype = $authtype; + $this->certRequest = $certRequest; + } + + /** + * use HTTP encoding + * + * @param string $enc + * @access public + */ + function setHTTPEncoding($enc='gzip, deflate'){ + $this->http_encoding = $enc; + } + + /** + * use HTTP persistent connections if possible + * + * @access public + */ + function useHTTPPersistentConnection(){ + $this->persistentConnection = true; + } + + /** + * gets the default RPC parameter setting. + * If true, default is that call params are like RPC even for document style. + * Each call() can override this value. + * + * This is no longer used. + * + * @return boolean + * @access public + * @deprecated + */ + function getDefaultRpcParams() { + return $this->defaultRpcParams; + } + + /** + * sets the default RPC parameter setting. + * If true, default is that call params are like RPC even for document style + * Each call() can override this value. + * + * This is no longer used. + * + * @param boolean $rpcParams + * @access public + * @deprecated + */ + function setDefaultRpcParams($rpcParams) { + $this->defaultRpcParams = $rpcParams; + } + + /** + * dynamically creates an instance of a proxy class, + * allowing user to directly call methods from wsdl + * + * @return object soap_proxy object + * @access public + */ + function getProxy(){ + $r = rand(); + $evalStr = $this->_getProxyClassCode($r); + //$this->debug("proxy class: $evalStr"; + // eval the class + eval($evalStr); + // instantiate proxy object + eval("\$proxy = new soap_proxy_$r('');"); + // transfer current wsdl data to the proxy thereby avoiding parsing the wsdl twice + $proxy->endpointType = 'wsdl'; + $proxy->wsdlFile = $this->wsdlFile; + $proxy->wsdl = $this->wsdl; + $proxy->operations = $this->operations; + $proxy->defaultRpcParams = $this->defaultRpcParams; + // transfer other state + $proxy->username = $this->username; + $proxy->password = $this->password; + $proxy->authtype = $this->authtype; + $proxy->proxyhost = $this->proxyhost; + $proxy->proxyport = $this->proxyport; + $proxy->proxyusername = $this->proxyusername; + $proxy->proxypassword = $this->proxypassword; + $proxy->timeout = $this->timeout; + $proxy->response_timeout = $this->response_timeout; + $proxy->http_encoding = $this->http_encoding; + $proxy->persistentConnection = $this->persistentConnection; + $proxy->requestHeaders = $this->requestHeaders; + $proxy->soap_defencoding = $this->soap_defencoding; + $proxy->endpoint = $this->endpoint; + $proxy->forceEndpoint = $this->forceEndpoint; + return $proxy; + } + + /** + * dynamically creates proxy class code + * + * @return string PHP/NuSOAP code for the proxy class + * @access private + */ + function _getProxyClassCode($r) { + if ($this->endpointType != 'wsdl') { + $evalStr = 'A proxy can only be created for a WSDL client'; + $this->setError($evalStr); + return $evalStr; + } + $evalStr = ''; + foreach ($this->operations as $operation => $opData) { + if ($operation != '') { + // create param string and param comment string + if (sizeof($opData['input']['parts']) > 0) { + $paramStr = ''; + $paramArrayStr = ''; + $paramCommentStr = ''; + foreach ($opData['input']['parts'] as $name => $type) { + $paramStr .= "\$$name, "; + $paramArrayStr .= "'$name' => \$$name, "; + $paramCommentStr .= "$type \$$name, "; + } + $paramStr = substr($paramStr, 0, strlen($paramStr)-2); + $paramArrayStr = substr($paramArrayStr, 0, strlen($paramArrayStr)-2); + $paramCommentStr = substr($paramCommentStr, 0, strlen($paramCommentStr)-2); + } else { + $paramStr = ''; + $paramCommentStr = 'void'; + } + $opData['namespace'] = !isset($opData['namespace']) ? 'http://testuri.com' : $opData['namespace']; + $evalStr .= "// $paramCommentStr + function " . str_replace('.', '__', $operation) . "($paramStr) { + \$params = array($paramArrayStr); + return \$this->call('$operation', \$params, '".$opData['namespace']."', '".(isset($opData['soapAction']) ? $opData['soapAction'] : '')."'); + } + "; + unset($paramStr); + unset($paramCommentStr); + } + } + $evalStr = 'class soap_proxy_'.$r.' extends soapclient { + '.$evalStr.' +}'; + return $evalStr; + } + + /** + * dynamically creates proxy class code + * + * @return string PHP/NuSOAP code for the proxy class + * @access public + */ + function getProxyClassCode() { + $r = rand(); + return $this->_getProxyClassCode($r); + } + + /** + * gets the HTTP body for the current request. + * + * @param string $soapmsg The SOAP payload + * @return string The HTTP body, which includes the SOAP payload + * @access private + */ + function getHTTPBody($soapmsg) { + return $soapmsg; + } + + /** + * gets the HTTP content type for the current request. + * + * Note: getHTTPBody must be called before this. + * + * @return string the HTTP content type for the current request. + * @access private + */ + function getHTTPContentType() { + return 'text/xml'; + } + + /** + * gets the HTTP content type charset for the current request. + * returns false for non-text content types. + * + * Note: getHTTPBody must be called before this. + * + * @return string the HTTP content type charset for the current request. + * @access private + */ + function getHTTPContentTypeCharset() { + return $this->soap_defencoding; + } + + /* + * whether or not parser should decode utf8 element content + * + * @return always returns true + * @access public + */ + function decodeUTF8($bool){ + $this->decode_utf8 = $bool; + return true; + } + + /** + * adds a new Cookie into $this->cookies array + * + * @param string $name Cookie Name + * @param string $value Cookie Value + * @return if cookie-set was successful returns true, else false + * @access public + */ + function setCookie($name, $value) { + if (strlen($name) == 0) { + return false; + } + $this->cookies[] = array('name' => $name, 'value' => $value); + return true; + } + + /** + * gets all Cookies + * + * @return array with all internal cookies + * @access public + */ + function getCookies() { + return $this->cookies; + } + + /** + * checks all Cookies and delete those which are expired + * + * @return always return true + * @access private + */ + function checkCookies() { + if (sizeof($this->cookies) == 0) { + return true; + } + $this->debug('checkCookie: check ' . sizeof($this->cookies) . ' cookies'); + $curr_cookies = $this->cookies; + $this->cookies = array(); + foreach ($curr_cookies as $cookie) { + if (! is_array($cookie)) { + $this->debug('Remove cookie that is not an array'); + continue; + } + if ((isset($cookie['expires'])) && (! empty($cookie['expires']))) { + if (strtotime($cookie['expires']) > time()) { + $this->cookies[] = $cookie; + } else { + $this->debug('Remove expired cookie ' . $cookie['name']); + } + } else { + $this->cookies[] = $cookie; + } + } + $this->debug('checkCookie: '.sizeof($this->cookies).' cookies left in array'); + return true; + } + + /** + * updates the current cookies with a new set + * + * @param array $cookies new cookies with which to update current ones + * @return always return true + * @access private + */ + function UpdateCookies($cookies) { + if (sizeof($this->cookies) == 0) { + // no existing cookies: take whatever is new + if (sizeof($cookies) > 0) { + $this->debug('Setting new cookie(s)'); + $this->cookies = $cookies; + } + return true; + } + if (sizeof($cookies) == 0) { + // no new cookies: keep what we've got + return true; + } + // merge + foreach ($cookies as $newCookie) { + if (!is_array($newCookie)) { + continue; + } + if ((!isset($newCookie['name'])) || (!isset($newCookie['value']))) { + continue; + } + $newName = $newCookie['name']; + + $found = false; + for ($i = 0; $i < count($this->cookies); $i++) { + $cookie = $this->cookies[$i]; + if (!is_array($cookie)) { + continue; + } + if (!isset($cookie['name'])) { + continue; + } + if ($newName != $cookie['name']) { + continue; + } + $newDomain = isset($newCookie['domain']) ? $newCookie['domain'] : 'NODOMAIN'; + $domain = isset($cookie['domain']) ? $cookie['domain'] : 'NODOMAIN'; + if ($newDomain != $domain) { + continue; + } + $newPath = isset($newCookie['path']) ? $newCookie['path'] : 'NOPATH'; + $path = isset($cookie['path']) ? $cookie['path'] : 'NOPATH'; + if ($newPath != $path) { + continue; + } + $this->cookies[$i] = $newCookie; + $found = true; + $this->debug('Update cookie ' . $newName . '=' . $newCookie['value']); + break; + } + if (! $found) { + $this->debug('Add cookie ' . $newName . '=' . $newCookie['value']); + $this->cookies[] = $newCookie; + } + } + return true; + } +} +?> diff --git a/thirdparty/pear/nusoapmime.php b/thirdparty/pear/nusoapmime.php new file mode 100644 index 000000000..39cc6c201 --- /dev/null +++ b/thirdparty/pear/nusoapmime.php @@ -0,0 +1,506 @@ + +* @author Thanks to Guillaume and Henning Reich for posting great attachment code to the mail list +* @version $Id: nusoapmime.php,v 1.7 2005/07/27 19:24:42 snichol Exp $ +* @access public +*/ +class soapclientmime extends soapclient { + /** + * @var array Each array element in the return is an associative array with keys + * data, filename, contenttype, cid + * @access private + */ + var $requestAttachments = array(); + /** + * @var array Each array element in the return is an associative array with keys + * data, filename, contenttype, cid + * @access private + */ + var $responseAttachments; + /** + * @var string + * @access private + */ + var $mimeContentType; + + /** + * adds a MIME attachment to the current request. + * + * If the $data parameter contains an empty string, this method will read + * the contents of the file named by the $filename parameter. + * + * If the $cid parameter is false, this method will generate the cid. + * + * @param string $data The data of the attachment + * @param string $filename The filename of the attachment (default is empty string) + * @param string $contenttype The MIME Content-Type of the attachment (default is application/octet-stream) + * @param string $cid The content-id (cid) of the attachment (default is false) + * @return string The content-id (cid) of the attachment + * @access public + */ + function addAttachment($data, $filename = '', $contenttype = 'application/octet-stream', $cid = false) { + if (! $cid) { + $cid = $this->encryptOld(uniqid(time())); + } + + $info['data'] = $data; + $info['filename'] = $filename; + $info['contenttype'] = $contenttype; + $info['cid'] = $cid; + + $this->requestAttachments[] = $info; + + return $cid; + } + + /** + * clears the MIME attachments for the current request. + * + * @access public + */ + function clearAttachments() { + $this->requestAttachments = array(); + } + + /** + * gets the MIME attachments from the current response. + * + * Each array element in the return is an associative array with keys + * data, filename, contenttype, cid. These keys correspond to the parameters + * for addAttachment. + * + * @return array The attachments. + * @access public + */ + function getAttachments() { + return $this->responseAttachments; + } + + /** + * gets the HTTP body for the current request. + * + * @param string $soapmsg The SOAP payload + * @return string The HTTP body, which includes the SOAP payload + * @access private + */ + function getHTTPBody($soapmsg) { + if (count($this->requestAttachments) > 0) { + $params['content_type'] = 'multipart/related; type=text/xml'; + $mimeMessage =& new Mail_mimePart('', $params); + unset($params); + + $params['content_type'] = 'text/xml'; + $params['encoding'] = '8bit'; + $params['charset'] = $this->soap_defencoding; + $mimeMessage->addSubpart($soapmsg, $params); + + foreach ($this->requestAttachments as $att) { + unset($params); + + $params['content_type'] = $att['contenttype']; + $params['encoding'] = 'base64'; + $params['disposition'] = 'attachment'; + $params['dfilename'] = $att['filename']; + $params['cid'] = $att['cid']; + + if ($att['data'] == '' && $att['filename'] <> '') { + if ($fd = fopen($att['filename'], 'rb')) { + $data = fread($fd, filesize($att['filename'])); + fclose($fd); + } else { + $data = ''; + } + $mimeMessage->addSubpart($data, $params); + } else { + $mimeMessage->addSubpart($att['data'], $params); + } + } + + $output = $mimeMessage->encode(); + $mimeHeaders = $output['headers']; + + foreach ($mimeHeaders as $k => $v) { + $this->debug("MIME header $k: $v"); + if (strtolower($k) == 'content-type') { + // PHP header() seems to strip leading whitespace starting + // the second line, so force everything to one line + $this->mimeContentType = str_replace("\r\n", " ", $v); + } + } + + return $output['body']; + } + + return parent::getHTTPBody($soapmsg); + } + + /** + * gets the HTTP content type for the current request. + * + * Note: getHTTPBody must be called before this. + * + * @return string the HTTP content type for the current request. + * @access private + */ + function getHTTPContentType() { + if (count($this->requestAttachments) > 0) { + return $this->mimeContentType; + } + return parent::getHTTPContentType(); + } + + /** + * gets the HTTP content type charset for the current request. + * returns false for non-text content types. + * + * Note: getHTTPBody must be called before this. + * + * @return string the HTTP content type charset for the current request. + * @access private + */ + function getHTTPContentTypeCharset() { + if (count($this->requestAttachments) > 0) { + return false; + } + return parent::getHTTPContentTypeCharset(); + } + + /** + * processes SOAP message returned from server + * + * @param array $headers The HTTP headers + * @param string $data unprocessed response data from server + * @return mixed value of the message, decoded into a PHP type + * @access private + */ + function parseResponse($headers, $data) { + $this->debug('Entering parseResponse() for payload of length ' . strlen($data) . ' and type of ' . $headers['content-type']); + $this->responseAttachments = array(); + if (strstr($headers['content-type'], 'multipart/related')) { + $this->debug('Decode multipart/related'); + $input = ''; + foreach ($headers as $k => $v) { + $input .= "$k: $v\r\n"; + } + $params['input'] = $input . "\r\n" . $data; + $params['include_bodies'] = true; + $params['decode_bodies'] = true; + $params['decode_headers'] = true; + + $structure = Mail_mimeDecode::decode($params); + + foreach ($structure->parts as $part) { + if (!isset($part->disposition)) { + $this->debug('Have root part of type ' . $part->headers['content-type']); + $return = parent::parseResponse($part->headers, $part->body); + } else { + $this->debug('Have an attachment of type ' . $part->headers['content-type']); + $info['data'] = $part->body; + $info['filename'] = isset($part->d_parameters['filename']) ? $part->d_parameters['filename'] : ''; + $info['contenttype'] = $part->headers['content-type']; + $info['cid'] = $part->headers['content-id']; + $this->responseAttachments[] = $info; + } + } + + if (isset($return)) { + return $return; + } + + $this->setError('No root part found in multipart/related content'); + return; + } + $this->debug('Not multipart/related'); + return parent::parseResponse($headers, $data); + } + + public function encryptOld($string) + { + if (!class_exists('G')) { + $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); + $docuroot = explode( '/', $realdocuroot ); + array_pop( $docuroot ); + $pathhome = implode( '/', $docuroot ) . '/'; + array_pop( $docuroot ); + $pathTrunk = implode( '/', $docuroot ) . '/'; + require_once($pathTrunk.'gulliver/system/class.g.php'); + } + return G::encryptOld($string); + } +} + +/** +* nusoapservermime server supporting MIME attachments defined at +* http://www.w3.org/TR/SOAP-attachments. It depends on the PEAR Mail_MIME library. +* +* @author Scott Nichol +* @author Thanks to Guillaume and Henning Reich for posting great attachment code to the mail list +* @version $Id: nusoapmime.php,v 1.7 2005/07/27 19:24:42 snichol Exp $ +* @access public +*/ +class nusoapservermime extends soap_server { + /** + * @var array Each array element in the return is an associative array with keys + * data, filename, contenttype, cid + * @access private + */ + var $requestAttachments = array(); + /** + * @var array Each array element in the return is an associative array with keys + * data, filename, contenttype, cid + * @access private + */ + var $responseAttachments; + /** + * @var string + * @access private + */ + var $mimeContentType; + + /** + * adds a MIME attachment to the current response. + * + * If the $data parameter contains an empty string, this method will read + * the contents of the file named by the $filename parameter. + * + * If the $cid parameter is false, this method will generate the cid. + * + * @param string $data The data of the attachment + * @param string $filename The filename of the attachment (default is empty string) + * @param string $contenttype The MIME Content-Type of the attachment (default is application/octet-stream) + * @param string $cid The content-id (cid) of the attachment (default is false) + * @return string The content-id (cid) of the attachment + * @access public + */ + function addAttachment($data, $filename = '', $contenttype = 'application/octet-stream', $cid = false) { + if (! $cid) { + $cid = $this->encryptOldNusoap(uniqid(time())); + } + + $info['data'] = $data; + $info['filename'] = $filename; + $info['contenttype'] = $contenttype; + $info['cid'] = $cid; + + $this->responseAttachments[] = $info; + + return $cid; + } + + /** + * clears the MIME attachments for the current response. + * + * @access public + */ + function clearAttachments() { + $this->responseAttachments = array(); + } + + /** + * gets the MIME attachments from the current request. + * + * Each array element in the return is an associative array with keys + * data, filename, contenttype, cid. These keys correspond to the parameters + * for addAttachment. + * + * @return array The attachments. + * @access public + */ + function getAttachments() { + return $this->requestAttachments; + } + + /** + * gets the HTTP body for the current response. + * + * @param string $soapmsg The SOAP payload + * @return string The HTTP body, which includes the SOAP payload + * @access private + */ + function getHTTPBody($soapmsg) { + if (count($this->responseAttachments) > 0) { + $params['content_type'] = 'multipart/related; type=text/xml'; + $mimeMessage =& new Mail_mimePart('', $params); + unset($params); + + $params['content_type'] = 'text/xml'; + $params['encoding'] = '8bit'; + $params['charset'] = $this->soap_defencoding; + $mimeMessage->addSubpart($soapmsg, $params); + + foreach ($this->responseAttachments as $att) { + unset($params); + + $params['content_type'] = $att['contenttype']; + $params['encoding'] = 'base64'; + $params['disposition'] = 'attachment'; + $params['dfilename'] = $att['filename']; + $params['cid'] = $att['cid']; + + if ($att['data'] == '' && $att['filename'] <> '') { + if ($fd = fopen($att['filename'], 'rb')) { + $data = fread($fd, filesize($att['filename'])); + fclose($fd); + } else { + $data = ''; + } + $mimeMessage->addSubpart($data, $params); + } else { + $mimeMessage->addSubpart($att['data'], $params); + } + } + + $output = $mimeMessage->encode(); + $mimeHeaders = $output['headers']; + + foreach ($mimeHeaders as $k => $v) { + $this->debug("MIME header $k: $v"); + if (strtolower($k) == 'content-type') { + // PHP header() seems to strip leading whitespace starting + // the second line, so force everything to one line + $this->mimeContentType = str_replace("\r\n", " ", $v); + } + } + + return $output['body']; + } + + return parent::getHTTPBody($soapmsg); + } + + /** + * gets the HTTP content type for the current response. + * + * Note: getHTTPBody must be called before this. + * + * @return string the HTTP content type for the current response. + * @access private + */ + function getHTTPContentType() { + if (count($this->responseAttachments) > 0) { + return $this->mimeContentType; + } + return parent::getHTTPContentType(); + } + + /** + * gets the HTTP content type charset for the current response. + * returns false for non-text content types. + * + * Note: getHTTPBody must be called before this. + * + * @return string the HTTP content type charset for the current response. + * @access private + */ + function getHTTPContentTypeCharset() { + if (count($this->responseAttachments) > 0) { + return false; + } + return parent::getHTTPContentTypeCharset(); + } + + /** + * processes SOAP message received from client + * + * @param array $headers The HTTP headers + * @param string $data unprocessed request data from client + * @return mixed value of the message, decoded into a PHP type + * @access private + */ + function parseRequest($headers, $data) { + $this->debug('Entering parseRequest() for payload of length ' . strlen($data) . ' and type of ' . $headers['content-type']); + $this->requestAttachments = array(); + if (strstr($headers['content-type'], 'multipart/related')) { + $this->debug('Decode multipart/related'); + $input = ''; + foreach ($headers as $k => $v) { + $input .= "$k: $v\r\n"; + } + $params['input'] = $input . "\r\n" . $data; + $params['include_bodies'] = true; + $params['decode_bodies'] = true; + $params['decode_headers'] = true; + + $structure = Mail_mimeDecode::decode($params); + + foreach ($structure->parts as $part) { + if (!isset($part->disposition)) { + $this->debug('Have root part of type ' . $part->headers['content-type']); + $return = parent::parseRequest($part->headers, $part->body); + } else { + $this->debug('Have an attachment of type ' . $part->headers['content-type']); + $info['data'] = $part->body; + $info['filename'] = isset($part->d_parameters['filename']) ? $part->d_parameters['filename'] : ''; + $info['contenttype'] = $part->headers['content-type']; + $info['cid'] = $part->headers['content-id']; + $this->requestAttachments[] = $info; + } + } + + if (isset($return)) { + return $return; + } + + $this->setError('No root part found in multipart/related content'); + return; + } + $this->debug('Not multipart/related'); + return parent::parseRequest($headers, $data); + } + + public function encryptOldNusoap($string) + { + if (!class_exists('G')) { + $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); + $docuroot = explode( '/', $realdocuroot ); + array_pop( $docuroot ); + $pathhome = implode( '/', $docuroot ) . '/'; + array_pop( $docuroot ); + $pathTrunk = implode( '/', $docuroot ) . '/'; + require_once($pathTrunk.'gulliver/system/class.g.php'); + } + return G::encryptOld($string); + } +} +?> diff --git a/thirdparty/pear/package-Archive_Tar.xml b/thirdparty/pear/package-Archive_Tar.xml new file mode 100644 index 000000000..64ee07b5c --- /dev/null +++ b/thirdparty/pear/package-Archive_Tar.xml @@ -0,0 +1,60 @@ + + + + Archive_Tar + Tar file management class + This class provides handling of tar files in PHP. +It supports creating, listing, extracting and adding to tar files. +Gzip support is available if PHP has the zlib extension built-in or +loaded. + + PHP License + + + vblavet + lead + Vincent Blavet + vincent@blavet.net + + + ssb + helper + Stig Sther Bakken + stig@php.net + + + + 0.9 + 2002-05-27 + + * Auto-detect gzip'ed files + + stable + + + + + + + + + + 0.4 + 2002-05-20 + Windows bugfix: use forward slashes inside archives + stable + + + 0.2 + 2002-02-18 + From initial commit to stable + stable + + + 0.3 + 2002-04-13 + Windows bugfix: used wrong directory separators + stable + + + diff --git a/thirdparty/pear/package-Console_Getopt.xml b/thirdparty/pear/package-Console_Getopt.xml new file mode 100644 index 000000000..1bc3eb02d --- /dev/null +++ b/thirdparty/pear/package-Console_Getopt.xml @@ -0,0 +1,63 @@ + + + + + Console_Getopt + Command-line option parser + This is a PHP implementation of "getopt" supporting both +short and long options. + PHP License + + + andrei + lead + Andrei Zmievski + andrei@php.net + + + ssb + developer + Stig Bakken + stig@php.net + + + + 1.0 + 2002-09-13 + Stable release + stable + + + + + + + + + 0.11 + 2002-05-26 + POSIX getopt compatibility fix: treat first element of args + array as command name + + beta + + + + + + + + 0.10 + 2002-05-12 + Packaging fix + beta + + + 0.9 + 2002-05-12 + Initial release + beta + + + diff --git a/thirdparty/pear/package-PEAR.xml b/thirdparty/pear/package-PEAR.xml new file mode 100644 index 000000000..ad739feae --- /dev/null +++ b/thirdparty/pear/package-PEAR.xml @@ -0,0 +1,342 @@ + + + + PEAR + PEAR Base System + The PEAR package contains: + * the PEAR base class + * the PEAR_Error error handling mechanism + * the PEAR installer, for creating, distributing + and installing packages + + PHP License + + + ssb + lead + Stig Sther Bakken + stig@php.net + + + cox + developer + Tomas V.V.Cox + cox@idecnet.com + + + mj + helper + Martin Jansen + mj@php.net + + + pajoye + developer + Pierre-Alain Joye + pajoye@pearfr.org + + + + 1.1 + stable + 2003-01-10 + +PEAR BASE CLASS: + +* PEAR_Error now supports exceptions when using Zend Engine 2. Set the + error mode to PEAR_ERROR_EXCEPTION to make PEAR_Error throw itself + as an exception (invoke PEAR errors with raiseError() or throwError() + just like before). + +PEAR INSTALLER: + +* Packaging and validation now parses PHP source code (unless + ext/tokenizer is disabled) and does some coding standard conformance + checks. Specifically, the names of classes and functions are + checked to ensure that they are prefixed with the package name. If + your package has symbols that should be without this prefix, you can + override this warning by explicitly adding a "provides" entry in + your package.xml file. See the package.xml file for this release + for an example (OS_Guess, System and md5_file). + + All classes and non-private (not underscore-prefixed) methods and + functions are now registered during "pear package". + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Archive_Tar + Console_Getopt + + + + + 1.0.1 + stable + 2003-01-10 + + * PEAR_Error class has call backtrace available by + calling getBacktrace(). Available if used with + PHP 4.3 or newer. + + * PEAR_Config class uses getenv() rather than $_ENV + to read environment variables. + + * System::which() Windows fix, now looks for + exe/bat/cmd/com suffixes rather than just exe + + * Added "pear cvsdiff" command + + * Windows output buffering bugfix for "pear" command + + * Multiple drives installation now works on windows + + * pear.bat uses ENV variables, allowing the installation + of many PEAR (windows) + + + + Archive_Tar + Console_Getopt + + + + 1.0 + stable + 2002-12-27 + + * set default cache_ttl to 1 hour + * added "clear-cache" command + + + + Archive_Tar + Console_Getopt + + + + 1.0b3 + stable + 2002-12-13 + + * fixed "info" shortcut (conflicted with "install") + * added "php_bin" config parameter + * all "non-personal" config parameters now use + environment variables for defaults (very useful + to override the default php_dir on Windows!) + + + + Archive_Tar + Console_Getopt + + + + 1.0b2 + stable + 2002-11-26 + +Changes, Installer: +* --force option no longer ignores errors, use + --ignore-errors instead +* installer transactions: failed installs abort + cleanly, without leaving half-installed packages + around + + + + 1.0b1 + stable + 2002-10-12 + +New Features, Installer: +* new command: "pear makerpm" +* new command: "pear search" +* new command: "pear upgrade-all" +* new command: "pear config-help" +* new command: "pear sign" +* Windows support for "pear build" (requires + msdev) +* new dependency type: "zend" +* XML-RPC results may now be cached (see + cache_dir and cache_ttl config) +* HTTP proxy authorization support +* install/upgrade install-root support + +Bugfixes, Installer: +* fix for XML-RPC bug that made some remote + commands fail +* fix problems under Windows with + DIRECTORY_SEPARATOR +* lots of other minor fixes +* --force option did not work for "pear install + Package" +* http downloader used "4.2.1" rather than + "PHP/4.2.1" as user agent +* bending over a little more to figure out how + PHP is installed +* "platform" file attribute was not included + during "pear package" + +New Features, PEAR Library: +* added PEAR::loadExtension($ext) +* added PEAR::delExpect() +* System::mkTemp() now cleans up at shutdown +* defined PEAR_ZE2 constant (boolean) +* added PEAR::throwError() with a simpler API + than raiseError() + +Bugfixes, PEAR Library: +* ZE2 compatibility fixes +* use getenv() as fallback for $_ENV + + + + Archive_Tar + Console_Getopt + + + + 0.90 + beta + 2002-05-28 + +* fix: "help" command was broken +* new command: "info" +* new command: "config-help" +* un-indent multi-line data from xml description files +* new command: "build" +* fix: config-set did not work with "set" parameters +* disable magic_quotes_runtime +* "install" now builds and installs C extensions +* added PEAR::delExpect() +* System class no longer inherits PEAR +* grouped PEAR_Config parameters +* add --nobuild option to install/upgrade commands +* new and more generic Frontend API + + + + Archive_Tar + Console_Getopt + + + + 0.10 + beta + 2002-05-26 + +Lots of stuff this time. 0.9 was not actually self-hosting, even +though it claimed to be. This version finally is self-hosting +(really!), meaning you can upgrade the installer with the command +"pear upgrade PEAR". + +* new config paramers: http_proxy and umask +* HTTP proxy support when downloading packages +* generalized command handling code +* and fixed the bug that would not let commands have the + same options as "pear" itself +* added long options to every command +* added command shortcuts ("pear help shortcuts") +* added stub for Gtk installer +* some phpdoc fixes +* added class dependency detector (using ext/tokenizer) +* dependency handling fixes +* added OS_Guess class for detecting OS +* install files with the "platform" attribute set + only on matching operating systems +* PEAR_Remote now falls back to the XML_RPC package + if xmlrpc-epi is not available +* renamed command: package-list -> list +* new command: package-dependencies +* lots of minor fixes + + + + Archive_Tar + Console_Getopt + + + + 0.9 + beta + 2002-04-07 + +First package release. Commands implemented: + remote-package-info + list-upgrades + list-remote-packages + download + config-show + config-get + config-set + list-installed + shell-test + install + uninstall + upgrade + package + package-list + package-info + login + logout + + + + diff --git a/thirdparty/pear/package.dtd b/thirdparty/pear/package.dtd new file mode 100644 index 000000000..3567564a4 --- /dev/null +++ b/thirdparty/pear/package.dtd @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/pear/template.spec b/thirdparty/pear/template.spec new file mode 100644 index 000000000..dc6c66550 --- /dev/null +++ b/thirdparty/pear/template.spec @@ -0,0 +1,44 @@ +Summary: PEAR: @summary@ +Name: @rpm_package@ +Version: @version@ +Release: 1 +License: @release_license@ +Group: Development/Libraries +Source: http://@master_server@/get/@package@-%{version}.tgz +BuildRoot: %{_tmppath}/%{name}-root +URL: http://@master_server@/ +Prefix: %{_prefix} +Docdir: @doc_dir@/@package@ +BuildArchitectures: @arch@ +@extra_headers@ + +%description +@description@ + +%prep +#rm -rf Console_Getopt-%{version} package.xml +#mkdir -p Console_Getopt-%{version} +#ln -s Console_Getopt-%{version}/package.xml package.xml +%setup -q -D -n @package@-%{version} +mv ../package.xml . + +%build +echo BuildRoot=%{buildroot} + +%post +pear uninstall --nodeps -r @package@ + +%postun +pear install --nodeps -r @rpm_xml_dir@/@package@.xml + +%install +rm -rf %{buildroot}/* +pear -q install -R %{buildroot} -n package.xml +mkdir -p %{buildroot}@rpm_xml_dir@ +cp -p package.xml %{buildroot}@rpm_xml_dir@/@package@.xml + +%files +%defattr(-,root,root) +%doc @doc_files@ +@files@ +@rpm_xml_dir@/@package@.xml diff --git a/gulliver/thirdparty/phing/BuildEvent.php b/thirdparty/phing/BuildEvent.php similarity index 100% rename from gulliver/thirdparty/phing/BuildEvent.php rename to thirdparty/phing/BuildEvent.php diff --git a/gulliver/thirdparty/phing/BuildException.php b/thirdparty/phing/BuildException.php similarity index 100% rename from gulliver/thirdparty/phing/BuildException.php rename to thirdparty/phing/BuildException.php diff --git a/gulliver/thirdparty/phing/BuildListener.php b/thirdparty/phing/BuildListener.php similarity index 100% rename from gulliver/thirdparty/phing/BuildListener.php rename to thirdparty/phing/BuildListener.php diff --git a/gulliver/thirdparty/phing/IntrospectionHelper.php b/thirdparty/phing/IntrospectionHelper.php similarity index 100% rename from gulliver/thirdparty/phing/IntrospectionHelper.php rename to thirdparty/phing/IntrospectionHelper.php diff --git a/gulliver/thirdparty/phing/Phing.php b/thirdparty/phing/Phing.php similarity index 100% rename from gulliver/thirdparty/phing/Phing.php rename to thirdparty/phing/Phing.php diff --git a/gulliver/thirdparty/phing/Project.php b/thirdparty/phing/Project.php similarity index 100% rename from gulliver/thirdparty/phing/Project.php rename to thirdparty/phing/Project.php diff --git a/gulliver/thirdparty/phing/ProjectComponent.php b/thirdparty/phing/ProjectComponent.php similarity index 100% rename from gulliver/thirdparty/phing/ProjectComponent.php rename to thirdparty/phing/ProjectComponent.php diff --git a/gulliver/thirdparty/phing/RuntimeConfigurable.php b/thirdparty/phing/RuntimeConfigurable.php similarity index 100% rename from gulliver/thirdparty/phing/RuntimeConfigurable.php rename to thirdparty/phing/RuntimeConfigurable.php diff --git a/gulliver/thirdparty/phing/Target.php b/thirdparty/phing/Target.php similarity index 100% rename from gulliver/thirdparty/phing/Target.php rename to thirdparty/phing/Target.php diff --git a/gulliver/thirdparty/phing/Task.php b/thirdparty/phing/Task.php similarity index 100% rename from gulliver/thirdparty/phing/Task.php rename to thirdparty/phing/Task.php diff --git a/gulliver/thirdparty/phing/TaskAdapter.php b/thirdparty/phing/TaskAdapter.php similarity index 100% rename from gulliver/thirdparty/phing/TaskAdapter.php rename to thirdparty/phing/TaskAdapter.php diff --git a/gulliver/thirdparty/phing/TaskContainer.php b/thirdparty/phing/TaskContainer.php similarity index 100% rename from gulliver/thirdparty/phing/TaskContainer.php rename to thirdparty/phing/TaskContainer.php diff --git a/gulliver/thirdparty/phing/TaskPhing.php b/thirdparty/phing/TaskPhing.php similarity index 100% rename from gulliver/thirdparty/phing/TaskPhing.php rename to thirdparty/phing/TaskPhing.php diff --git a/gulliver/thirdparty/phing/UnknownElement.php b/thirdparty/phing/UnknownElement.php similarity index 100% rename from gulliver/thirdparty/phing/UnknownElement.php rename to thirdparty/phing/UnknownElement.php diff --git a/gulliver/thirdparty/phing/filters/BaseFilterReader.php b/thirdparty/phing/filters/BaseFilterReader.php similarity index 100% rename from gulliver/thirdparty/phing/filters/BaseFilterReader.php rename to thirdparty/phing/filters/BaseFilterReader.php diff --git a/gulliver/thirdparty/phing/filters/BaseParamFilterReader.php b/thirdparty/phing/filters/BaseParamFilterReader.php similarity index 100% rename from gulliver/thirdparty/phing/filters/BaseParamFilterReader.php rename to thirdparty/phing/filters/BaseParamFilterReader.php diff --git a/gulliver/thirdparty/phing/filters/ChainableReader.php b/thirdparty/phing/filters/ChainableReader.php similarity index 100% rename from gulliver/thirdparty/phing/filters/ChainableReader.php rename to thirdparty/phing/filters/ChainableReader.php diff --git a/gulliver/thirdparty/phing/filters/ExpandProperties.php b/thirdparty/phing/filters/ExpandProperties.php similarity index 100% rename from gulliver/thirdparty/phing/filters/ExpandProperties.php rename to thirdparty/phing/filters/ExpandProperties.php diff --git a/gulliver/thirdparty/phing/filters/HeadFilter.php b/thirdparty/phing/filters/HeadFilter.php similarity index 100% rename from gulliver/thirdparty/phing/filters/HeadFilter.php rename to thirdparty/phing/filters/HeadFilter.php diff --git a/gulliver/thirdparty/phing/filters/LineContains.php b/thirdparty/phing/filters/LineContains.php similarity index 100% rename from gulliver/thirdparty/phing/filters/LineContains.php rename to thirdparty/phing/filters/LineContains.php diff --git a/gulliver/thirdparty/phing/filters/LineContainsRegexp.php b/thirdparty/phing/filters/LineContainsRegexp.php similarity index 100% rename from gulliver/thirdparty/phing/filters/LineContainsRegexp.php rename to thirdparty/phing/filters/LineContainsRegexp.php diff --git a/gulliver/thirdparty/phing/filters/PrefixLines.php b/thirdparty/phing/filters/PrefixLines.php similarity index 100% rename from gulliver/thirdparty/phing/filters/PrefixLines.php rename to thirdparty/phing/filters/PrefixLines.php diff --git a/gulliver/thirdparty/phing/filters/ReplaceRegexp.php b/thirdparty/phing/filters/ReplaceRegexp.php similarity index 100% rename from gulliver/thirdparty/phing/filters/ReplaceRegexp.php rename to thirdparty/phing/filters/ReplaceRegexp.php diff --git a/gulliver/thirdparty/phing/filters/ReplaceTokens.php b/thirdparty/phing/filters/ReplaceTokens.php similarity index 100% rename from gulliver/thirdparty/phing/filters/ReplaceTokens.php rename to thirdparty/phing/filters/ReplaceTokens.php diff --git a/gulliver/thirdparty/phing/filters/StripLineBreaks.php b/thirdparty/phing/filters/StripLineBreaks.php similarity index 100% rename from gulliver/thirdparty/phing/filters/StripLineBreaks.php rename to thirdparty/phing/filters/StripLineBreaks.php diff --git a/gulliver/thirdparty/phing/filters/StripLineComments.php b/thirdparty/phing/filters/StripLineComments.php similarity index 100% rename from gulliver/thirdparty/phing/filters/StripLineComments.php rename to thirdparty/phing/filters/StripLineComments.php diff --git a/gulliver/thirdparty/phing/filters/StripPhpComments.php b/thirdparty/phing/filters/StripPhpComments.php similarity index 100% rename from gulliver/thirdparty/phing/filters/StripPhpComments.php rename to thirdparty/phing/filters/StripPhpComments.php diff --git a/gulliver/thirdparty/phing/filters/TabToSpaces.php b/thirdparty/phing/filters/TabToSpaces.php similarity index 100% rename from gulliver/thirdparty/phing/filters/TabToSpaces.php rename to thirdparty/phing/filters/TabToSpaces.php diff --git a/gulliver/thirdparty/phing/filters/TailFilter.php b/thirdparty/phing/filters/TailFilter.php similarity index 100% rename from gulliver/thirdparty/phing/filters/TailFilter.php rename to thirdparty/phing/filters/TailFilter.php diff --git a/gulliver/thirdparty/phing/filters/TidyFilter.php b/thirdparty/phing/filters/TidyFilter.php similarity index 100% rename from gulliver/thirdparty/phing/filters/TidyFilter.php rename to thirdparty/phing/filters/TidyFilter.php diff --git a/gulliver/thirdparty/phing/filters/TranslateGettext.php b/thirdparty/phing/filters/TranslateGettext.php similarity index 100% rename from gulliver/thirdparty/phing/filters/TranslateGettext.php rename to thirdparty/phing/filters/TranslateGettext.php diff --git a/gulliver/thirdparty/phing/filters/XsltFilter.php b/thirdparty/phing/filters/XsltFilter.php similarity index 100% rename from gulliver/thirdparty/phing/filters/XsltFilter.php rename to thirdparty/phing/filters/XsltFilter.php diff --git a/gulliver/thirdparty/phing/filters/util/ChainReaderHelper.php b/thirdparty/phing/filters/util/ChainReaderHelper.php similarity index 100% rename from gulliver/thirdparty/phing/filters/util/ChainReaderHelper.php rename to thirdparty/phing/filters/util/ChainReaderHelper.php diff --git a/gulliver/thirdparty/phing/filters/util/IniFileTokenReader.php b/thirdparty/phing/filters/util/IniFileTokenReader.php similarity index 100% rename from gulliver/thirdparty/phing/filters/util/IniFileTokenReader.php rename to thirdparty/phing/filters/util/IniFileTokenReader.php diff --git a/gulliver/thirdparty/phing/input/DefaultInputHandler.php b/thirdparty/phing/input/DefaultInputHandler.php similarity index 100% rename from gulliver/thirdparty/phing/input/DefaultInputHandler.php rename to thirdparty/phing/input/DefaultInputHandler.php diff --git a/gulliver/thirdparty/phing/input/InputHandler.php b/thirdparty/phing/input/InputHandler.php similarity index 100% rename from gulliver/thirdparty/phing/input/InputHandler.php rename to thirdparty/phing/input/InputHandler.php diff --git a/gulliver/thirdparty/phing/input/InputRequest.php b/thirdparty/phing/input/InputRequest.php similarity index 100% rename from gulliver/thirdparty/phing/input/InputRequest.php rename to thirdparty/phing/input/InputRequest.php diff --git a/gulliver/thirdparty/phing/input/MultipleChoiceInputRequest.php b/thirdparty/phing/input/MultipleChoiceInputRequest.php similarity index 100% rename from gulliver/thirdparty/phing/input/MultipleChoiceInputRequest.php rename to thirdparty/phing/input/MultipleChoiceInputRequest.php diff --git a/gulliver/thirdparty/phing/input/PropertyFileInputHandler.php b/thirdparty/phing/input/PropertyFileInputHandler.php similarity index 100% rename from gulliver/thirdparty/phing/input/PropertyFileInputHandler.php rename to thirdparty/phing/input/PropertyFileInputHandler.php diff --git a/gulliver/thirdparty/phing/input/YesNoInputRequest.php b/thirdparty/phing/input/YesNoInputRequest.php similarity index 100% rename from gulliver/thirdparty/phing/input/YesNoInputRequest.php rename to thirdparty/phing/input/YesNoInputRequest.php diff --git a/gulliver/thirdparty/phing/lib/Capsule.php b/thirdparty/phing/lib/Capsule.php similarity index 100% rename from gulliver/thirdparty/phing/lib/Capsule.php rename to thirdparty/phing/lib/Capsule.php diff --git a/gulliver/thirdparty/phing/lib/Zip.php b/thirdparty/phing/lib/Zip.php similarity index 100% rename from gulliver/thirdparty/phing/lib/Zip.php rename to thirdparty/phing/lib/Zip.php diff --git a/gulliver/thirdparty/phing/listener/AnsiColorLogger.php b/thirdparty/phing/listener/AnsiColorLogger.php similarity index 100% rename from gulliver/thirdparty/phing/listener/AnsiColorLogger.php rename to thirdparty/phing/listener/AnsiColorLogger.php diff --git a/gulliver/thirdparty/phing/listener/BuildLogger.php b/thirdparty/phing/listener/BuildLogger.php similarity index 100% rename from gulliver/thirdparty/phing/listener/BuildLogger.php rename to thirdparty/phing/listener/BuildLogger.php diff --git a/gulliver/thirdparty/phing/listener/DefaultLogger.php b/thirdparty/phing/listener/DefaultLogger.php similarity index 100% rename from gulliver/thirdparty/phing/listener/DefaultLogger.php rename to thirdparty/phing/listener/DefaultLogger.php diff --git a/gulliver/thirdparty/phing/listener/NoBannerLogger.php b/thirdparty/phing/listener/NoBannerLogger.php similarity index 100% rename from gulliver/thirdparty/phing/listener/NoBannerLogger.php rename to thirdparty/phing/listener/NoBannerLogger.php diff --git a/gulliver/thirdparty/phing/listener/PearLogger.php b/thirdparty/phing/listener/PearLogger.php similarity index 100% rename from gulliver/thirdparty/phing/listener/PearLogger.php rename to thirdparty/phing/listener/PearLogger.php diff --git a/gulliver/thirdparty/phing/listener/XmlLogger.php b/thirdparty/phing/listener/XmlLogger.php similarity index 100% rename from gulliver/thirdparty/phing/listener/XmlLogger.php rename to thirdparty/phing/listener/XmlLogger.php diff --git a/gulliver/thirdparty/phing/listener/defaults.properties b/thirdparty/phing/listener/defaults.properties similarity index 100% rename from gulliver/thirdparty/phing/listener/defaults.properties rename to thirdparty/phing/listener/defaults.properties diff --git a/gulliver/thirdparty/phing/mappers/FileNameMapper.php b/thirdparty/phing/mappers/FileNameMapper.php similarity index 100% rename from gulliver/thirdparty/phing/mappers/FileNameMapper.php rename to thirdparty/phing/mappers/FileNameMapper.php diff --git a/gulliver/thirdparty/phing/mappers/FlattenMapper.php b/thirdparty/phing/mappers/FlattenMapper.php similarity index 100% rename from gulliver/thirdparty/phing/mappers/FlattenMapper.php rename to thirdparty/phing/mappers/FlattenMapper.php diff --git a/gulliver/thirdparty/phing/mappers/GlobMapper.php b/thirdparty/phing/mappers/GlobMapper.php similarity index 100% rename from gulliver/thirdparty/phing/mappers/GlobMapper.php rename to thirdparty/phing/mappers/GlobMapper.php diff --git a/gulliver/thirdparty/phing/mappers/IdentityMapper.php b/thirdparty/phing/mappers/IdentityMapper.php similarity index 100% rename from gulliver/thirdparty/phing/mappers/IdentityMapper.php rename to thirdparty/phing/mappers/IdentityMapper.php diff --git a/gulliver/thirdparty/phing/mappers/MergeMapper.php b/thirdparty/phing/mappers/MergeMapper.php similarity index 100% rename from gulliver/thirdparty/phing/mappers/MergeMapper.php rename to thirdparty/phing/mappers/MergeMapper.php diff --git a/gulliver/thirdparty/phing/mappers/RegexpMapper.php b/thirdparty/phing/mappers/RegexpMapper.php similarity index 100% rename from gulliver/thirdparty/phing/mappers/RegexpMapper.php rename to thirdparty/phing/mappers/RegexpMapper.php diff --git a/gulliver/thirdparty/phing/parser/AbstractHandler.php b/thirdparty/phing/parser/AbstractHandler.php similarity index 100% rename from gulliver/thirdparty/phing/parser/AbstractHandler.php rename to thirdparty/phing/parser/AbstractHandler.php diff --git a/gulliver/thirdparty/phing/parser/AbstractSAXParser.php b/thirdparty/phing/parser/AbstractSAXParser.php similarity index 100% rename from gulliver/thirdparty/phing/parser/AbstractSAXParser.php rename to thirdparty/phing/parser/AbstractSAXParser.php diff --git a/gulliver/thirdparty/phing/parser/DataTypeHandler.php b/thirdparty/phing/parser/DataTypeHandler.php similarity index 100% rename from gulliver/thirdparty/phing/parser/DataTypeHandler.php rename to thirdparty/phing/parser/DataTypeHandler.php diff --git a/gulliver/thirdparty/phing/parser/ExpatParseException.php b/thirdparty/phing/parser/ExpatParseException.php similarity index 100% rename from gulliver/thirdparty/phing/parser/ExpatParseException.php rename to thirdparty/phing/parser/ExpatParseException.php diff --git a/gulliver/thirdparty/phing/parser/ExpatParser.php b/thirdparty/phing/parser/ExpatParser.php similarity index 100% rename from gulliver/thirdparty/phing/parser/ExpatParser.php rename to thirdparty/phing/parser/ExpatParser.php diff --git a/gulliver/thirdparty/phing/parser/Location.php b/thirdparty/phing/parser/Location.php similarity index 100% rename from gulliver/thirdparty/phing/parser/Location.php rename to thirdparty/phing/parser/Location.php diff --git a/gulliver/thirdparty/phing/parser/NestedElementHandler.php b/thirdparty/phing/parser/NestedElementHandler.php similarity index 100% rename from gulliver/thirdparty/phing/parser/NestedElementHandler.php rename to thirdparty/phing/parser/NestedElementHandler.php diff --git a/gulliver/thirdparty/phing/parser/ProjectConfigurator.php b/thirdparty/phing/parser/ProjectConfigurator.php similarity index 100% rename from gulliver/thirdparty/phing/parser/ProjectConfigurator.php rename to thirdparty/phing/parser/ProjectConfigurator.php diff --git a/gulliver/thirdparty/phing/parser/ProjectHandler.php b/thirdparty/phing/parser/ProjectHandler.php similarity index 100% rename from gulliver/thirdparty/phing/parser/ProjectHandler.php rename to thirdparty/phing/parser/ProjectHandler.php diff --git a/gulliver/thirdparty/phing/parser/RootHandler.php b/thirdparty/phing/parser/RootHandler.php similarity index 100% rename from gulliver/thirdparty/phing/parser/RootHandler.php rename to thirdparty/phing/parser/RootHandler.php diff --git a/gulliver/thirdparty/phing/parser/TargetHandler.php b/thirdparty/phing/parser/TargetHandler.php similarity index 100% rename from gulliver/thirdparty/phing/parser/TargetHandler.php rename to thirdparty/phing/parser/TargetHandler.php diff --git a/gulliver/thirdparty/phing/parser/TaskHandler.php b/thirdparty/phing/parser/TaskHandler.php similarity index 100% rename from gulliver/thirdparty/phing/parser/TaskHandler.php rename to thirdparty/phing/parser/TaskHandler.php diff --git a/gulliver/thirdparty/phing/system/io/BufferedReader.php b/thirdparty/phing/system/io/BufferedReader.php similarity index 100% rename from gulliver/thirdparty/phing/system/io/BufferedReader.php rename to thirdparty/phing/system/io/BufferedReader.php diff --git a/gulliver/thirdparty/phing/system/io/BufferedWriter.php b/thirdparty/phing/system/io/BufferedWriter.php similarity index 100% rename from gulliver/thirdparty/phing/system/io/BufferedWriter.php rename to thirdparty/phing/system/io/BufferedWriter.php diff --git a/gulliver/thirdparty/phing/system/io/ConsoleReader.php b/thirdparty/phing/system/io/ConsoleReader.php similarity index 100% rename from gulliver/thirdparty/phing/system/io/ConsoleReader.php rename to thirdparty/phing/system/io/ConsoleReader.php diff --git a/gulliver/thirdparty/phing/system/io/FileReader.php b/thirdparty/phing/system/io/FileReader.php similarity index 100% rename from gulliver/thirdparty/phing/system/io/FileReader.php rename to thirdparty/phing/system/io/FileReader.php diff --git a/gulliver/thirdparty/phing/system/io/FileSystem.php b/thirdparty/phing/system/io/FileSystem.php similarity index 100% rename from gulliver/thirdparty/phing/system/io/FileSystem.php rename to thirdparty/phing/system/io/FileSystem.php diff --git a/gulliver/thirdparty/phing/system/io/FileWriter.php b/thirdparty/phing/system/io/FileWriter.php similarity index 100% rename from gulliver/thirdparty/phing/system/io/FileWriter.php rename to thirdparty/phing/system/io/FileWriter.php diff --git a/gulliver/thirdparty/phing/system/io/FilterReader.php b/thirdparty/phing/system/io/FilterReader.php similarity index 100% rename from gulliver/thirdparty/phing/system/io/FilterReader.php rename to thirdparty/phing/system/io/FilterReader.php diff --git a/gulliver/thirdparty/phing/system/io/IOException.php b/thirdparty/phing/system/io/IOException.php similarity index 100% rename from gulliver/thirdparty/phing/system/io/IOException.php rename to thirdparty/phing/system/io/IOException.php diff --git a/gulliver/thirdparty/phing/system/io/PhingFile.php b/thirdparty/phing/system/io/PhingFile.php similarity index 100% rename from gulliver/thirdparty/phing/system/io/PhingFile.php rename to thirdparty/phing/system/io/PhingFile.php diff --git a/gulliver/thirdparty/phing/system/io/Reader.php b/thirdparty/phing/system/io/Reader.php similarity index 100% rename from gulliver/thirdparty/phing/system/io/Reader.php rename to thirdparty/phing/system/io/Reader.php diff --git a/gulliver/thirdparty/phing/system/io/StringReader.php b/thirdparty/phing/system/io/StringReader.php similarity index 100% rename from gulliver/thirdparty/phing/system/io/StringReader.php rename to thirdparty/phing/system/io/StringReader.php diff --git a/gulliver/thirdparty/phing/system/io/TokenReader.php b/thirdparty/phing/system/io/TokenReader.php similarity index 100% rename from gulliver/thirdparty/phing/system/io/TokenReader.php rename to thirdparty/phing/system/io/TokenReader.php diff --git a/gulliver/thirdparty/phing/system/io/UnixFileSystem.php b/thirdparty/phing/system/io/UnixFileSystem.php similarity index 100% rename from gulliver/thirdparty/phing/system/io/UnixFileSystem.php rename to thirdparty/phing/system/io/UnixFileSystem.php diff --git a/gulliver/thirdparty/phing/system/io/Win32FileSystem.php b/thirdparty/phing/system/io/Win32FileSystem.php similarity index 100% rename from gulliver/thirdparty/phing/system/io/Win32FileSystem.php rename to thirdparty/phing/system/io/Win32FileSystem.php diff --git a/gulliver/thirdparty/phing/system/io/WinNTFileSystem.php b/thirdparty/phing/system/io/WinNTFileSystem.php similarity index 100% rename from gulliver/thirdparty/phing/system/io/WinNTFileSystem.php rename to thirdparty/phing/system/io/WinNTFileSystem.php diff --git a/gulliver/thirdparty/phing/system/io/Writer.php b/thirdparty/phing/system/io/Writer.php similarity index 100% rename from gulliver/thirdparty/phing/system/io/Writer.php rename to thirdparty/phing/system/io/Writer.php diff --git a/gulliver/thirdparty/phing/system/lang/Character.php b/thirdparty/phing/system/lang/Character.php similarity index 100% rename from gulliver/thirdparty/phing/system/lang/Character.php rename to thirdparty/phing/system/lang/Character.php diff --git a/gulliver/thirdparty/phing/system/lang/EventObject.php b/thirdparty/phing/system/lang/EventObject.php similarity index 100% rename from gulliver/thirdparty/phing/system/lang/EventObject.php rename to thirdparty/phing/system/lang/EventObject.php diff --git a/gulliver/thirdparty/phing/system/lang/FileNotFoundException.php b/thirdparty/phing/system/lang/FileNotFoundException.php similarity index 100% rename from gulliver/thirdparty/phing/system/lang/FileNotFoundException.php rename to thirdparty/phing/system/lang/FileNotFoundException.php diff --git a/gulliver/thirdparty/phing/system/lang/NullPointerException.php b/thirdparty/phing/system/lang/NullPointerException.php similarity index 100% rename from gulliver/thirdparty/phing/system/lang/NullPointerException.php rename to thirdparty/phing/system/lang/NullPointerException.php diff --git a/gulliver/thirdparty/phing/system/lang/SecurityException.php b/thirdparty/phing/system/lang/SecurityException.php similarity index 100% rename from gulliver/thirdparty/phing/system/lang/SecurityException.php rename to thirdparty/phing/system/lang/SecurityException.php diff --git a/gulliver/thirdparty/phing/system/util/Message.php b/thirdparty/phing/system/util/Message.php similarity index 100% rename from gulliver/thirdparty/phing/system/util/Message.php rename to thirdparty/phing/system/util/Message.php diff --git a/gulliver/thirdparty/phing/system/util/Properties.php b/thirdparty/phing/system/util/Properties.php similarity index 100% rename from gulliver/thirdparty/phing/system/util/Properties.php rename to thirdparty/phing/system/util/Properties.php diff --git a/gulliver/thirdparty/phing/system/util/Register.php b/thirdparty/phing/system/util/Register.php similarity index 100% rename from gulliver/thirdparty/phing/system/util/Register.php rename to thirdparty/phing/system/util/Register.php diff --git a/gulliver/thirdparty/phing/system/util/Timer.php b/thirdparty/phing/system/util/Timer.php similarity index 100% rename from gulliver/thirdparty/phing/system/util/Timer.php rename to thirdparty/phing/system/util/Timer.php diff --git a/gulliver/thirdparty/phing/tasks/defaults.properties b/thirdparty/phing/tasks/defaults.properties similarity index 100% rename from gulliver/thirdparty/phing/tasks/defaults.properties rename to thirdparty/phing/tasks/defaults.properties diff --git a/gulliver/thirdparty/phing/tasks/ext/CapsuleTask.php b/thirdparty/phing/tasks/ext/CapsuleTask.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/ext/CapsuleTask.php rename to thirdparty/phing/tasks/ext/CapsuleTask.php diff --git a/gulliver/thirdparty/phing/tasks/ext/CreoleSQLExecTask.php b/thirdparty/phing/tasks/ext/CreoleSQLExecTask.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/ext/CreoleSQLExecTask.php rename to thirdparty/phing/tasks/ext/CreoleSQLExecTask.php diff --git a/gulliver/thirdparty/phing/tasks/ext/CreoleTask.php b/thirdparty/phing/tasks/ext/CreoleTask.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/ext/CreoleTask.php rename to thirdparty/phing/tasks/ext/CreoleTask.php diff --git a/gulliver/thirdparty/phing/tasks/ext/ExtractBaseTask.php b/thirdparty/phing/tasks/ext/ExtractBaseTask.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/ext/ExtractBaseTask.php rename to thirdparty/phing/tasks/ext/ExtractBaseTask.php diff --git a/gulliver/thirdparty/phing/tasks/ext/MailTask.php b/thirdparty/phing/tasks/ext/MailTask.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/ext/MailTask.php rename to thirdparty/phing/tasks/ext/MailTask.php diff --git a/gulliver/thirdparty/phing/tasks/ext/PackageAsPathTask.php b/thirdparty/phing/tasks/ext/PackageAsPathTask.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/ext/PackageAsPathTask.php rename to thirdparty/phing/tasks/ext/PackageAsPathTask.php diff --git a/gulliver/thirdparty/phing/tasks/ext/PearPackageTask.php b/thirdparty/phing/tasks/ext/PearPackageTask.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/ext/PearPackageTask.php rename to thirdparty/phing/tasks/ext/PearPackageTask.php diff --git a/gulliver/thirdparty/phing/tasks/ext/PhpLintTask.php b/thirdparty/phing/tasks/ext/PhpLintTask.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/ext/PhpLintTask.php rename to thirdparty/phing/tasks/ext/PhpLintTask.php diff --git a/gulliver/thirdparty/phing/tasks/ext/SmartyTask.php b/thirdparty/phing/tasks/ext/SmartyTask.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/ext/SmartyTask.php rename to thirdparty/phing/tasks/ext/SmartyTask.php diff --git a/gulliver/thirdparty/phing/tasks/ext/TarTask.php b/thirdparty/phing/tasks/ext/TarTask.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/ext/TarTask.php rename to thirdparty/phing/tasks/ext/TarTask.php diff --git a/gulliver/thirdparty/phing/tasks/ext/UntarTask.php b/thirdparty/phing/tasks/ext/UntarTask.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/ext/UntarTask.php rename to thirdparty/phing/tasks/ext/UntarTask.php diff --git a/gulliver/thirdparty/phing/tasks/ext/UnzipTask.php b/thirdparty/phing/tasks/ext/UnzipTask.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/ext/UnzipTask.php rename to thirdparty/phing/tasks/ext/UnzipTask.php diff --git a/gulliver/thirdparty/phing/tasks/ext/XmlLintTask.php b/thirdparty/phing/tasks/ext/XmlLintTask.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/ext/XmlLintTask.php rename to thirdparty/phing/tasks/ext/XmlLintTask.php diff --git a/gulliver/thirdparty/phing/tasks/ext/ZendCodeAnalyzerTask.php b/thirdparty/phing/tasks/ext/ZendCodeAnalyzerTask.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/ext/ZendCodeAnalyzerTask.php rename to thirdparty/phing/tasks/ext/ZendCodeAnalyzerTask.php diff --git a/gulliver/thirdparty/phing/tasks/ext/ZipTask.php b/thirdparty/phing/tasks/ext/ZipTask.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/ext/ZipTask.php rename to thirdparty/phing/tasks/ext/ZipTask.php diff --git a/gulliver/thirdparty/phing/tasks/ext/coverage/CoverageMerger.php b/thirdparty/phing/tasks/ext/coverage/CoverageMerger.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/ext/coverage/CoverageMerger.php rename to thirdparty/phing/tasks/ext/coverage/CoverageMerger.php diff --git a/gulliver/thirdparty/phing/tasks/ext/coverage/CoverageMergerTask.php b/thirdparty/phing/tasks/ext/coverage/CoverageMergerTask.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/ext/coverage/CoverageMergerTask.php rename to thirdparty/phing/tasks/ext/coverage/CoverageMergerTask.php diff --git a/gulliver/thirdparty/phing/tasks/ext/coverage/CoverageReportTask.php b/thirdparty/phing/tasks/ext/coverage/CoverageReportTask.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/ext/coverage/CoverageReportTask.php rename to thirdparty/phing/tasks/ext/coverage/CoverageReportTask.php diff --git a/gulliver/thirdparty/phing/tasks/ext/coverage/CoverageReportTransformer.php b/thirdparty/phing/tasks/ext/coverage/CoverageReportTransformer.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/ext/coverage/CoverageReportTransformer.php rename to thirdparty/phing/tasks/ext/coverage/CoverageReportTransformer.php diff --git a/gulliver/thirdparty/phing/tasks/ext/coverage/CoverageSetupTask.php b/thirdparty/phing/tasks/ext/coverage/CoverageSetupTask.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/ext/coverage/CoverageSetupTask.php rename to thirdparty/phing/tasks/ext/coverage/CoverageSetupTask.php diff --git a/gulliver/thirdparty/phing/tasks/ext/ioncube/IoncubeComment.php b/thirdparty/phing/tasks/ext/ioncube/IoncubeComment.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/ext/ioncube/IoncubeComment.php rename to thirdparty/phing/tasks/ext/ioncube/IoncubeComment.php diff --git a/gulliver/thirdparty/phing/tasks/ext/ioncube/IoncubeEncoderTask.php b/thirdparty/phing/tasks/ext/ioncube/IoncubeEncoderTask.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/ext/ioncube/IoncubeEncoderTask.php rename to thirdparty/phing/tasks/ext/ioncube/IoncubeEncoderTask.php diff --git a/gulliver/thirdparty/phing/tasks/ext/ioncube/IoncubeLicenseTask.php b/thirdparty/phing/tasks/ext/ioncube/IoncubeLicenseTask.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/ext/ioncube/IoncubeLicenseTask.php rename to thirdparty/phing/tasks/ext/ioncube/IoncubeLicenseTask.php diff --git a/gulliver/thirdparty/phing/tasks/ext/pearpackage/Fileset.php b/thirdparty/phing/tasks/ext/pearpackage/Fileset.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/ext/pearpackage/Fileset.php rename to thirdparty/phing/tasks/ext/pearpackage/Fileset.php diff --git a/gulliver/thirdparty/phing/tasks/ext/phpdoc/PHPDocumentorTask.php b/thirdparty/phing/tasks/ext/phpdoc/PHPDocumentorTask.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/ext/phpdoc/PHPDocumentorTask.php rename to thirdparty/phing/tasks/ext/phpdoc/PHPDocumentorTask.php diff --git a/gulliver/thirdparty/phing/tasks/ext/phpunit2/BatchTest.php b/thirdparty/phing/tasks/ext/phpunit2/BatchTest.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/ext/phpunit2/BatchTest.php rename to thirdparty/phing/tasks/ext/phpunit2/BatchTest.php diff --git a/gulliver/thirdparty/phing/tasks/ext/phpunit2/FormatterElement.php b/thirdparty/phing/tasks/ext/phpunit2/FormatterElement.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/ext/phpunit2/FormatterElement.php rename to thirdparty/phing/tasks/ext/phpunit2/FormatterElement.php diff --git a/gulliver/thirdparty/phing/tasks/ext/phpunit2/PHPUnit2ReportTask.php b/thirdparty/phing/tasks/ext/phpunit2/PHPUnit2ReportTask.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/ext/phpunit2/PHPUnit2ReportTask.php rename to thirdparty/phing/tasks/ext/phpunit2/PHPUnit2ReportTask.php diff --git a/gulliver/thirdparty/phing/tasks/ext/phpunit2/PHPUnit2ResultFormatter.php b/thirdparty/phing/tasks/ext/phpunit2/PHPUnit2ResultFormatter.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/ext/phpunit2/PHPUnit2ResultFormatter.php rename to thirdparty/phing/tasks/ext/phpunit2/PHPUnit2ResultFormatter.php diff --git a/gulliver/thirdparty/phing/tasks/ext/phpunit2/PHPUnit2Task.php b/thirdparty/phing/tasks/ext/phpunit2/PHPUnit2Task.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/ext/phpunit2/PHPUnit2Task.php rename to thirdparty/phing/tasks/ext/phpunit2/PHPUnit2Task.php diff --git a/gulliver/thirdparty/phing/tasks/ext/phpunit2/PHPUnit2TestRunner.php b/thirdparty/phing/tasks/ext/phpunit2/PHPUnit2TestRunner.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/ext/phpunit2/PHPUnit2TestRunner.php rename to thirdparty/phing/tasks/ext/phpunit2/PHPUnit2TestRunner.php diff --git a/gulliver/thirdparty/phing/tasks/ext/phpunit2/PHPUnit2Util.php b/thirdparty/phing/tasks/ext/phpunit2/PHPUnit2Util.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/ext/phpunit2/PHPUnit2Util.php rename to thirdparty/phing/tasks/ext/phpunit2/PHPUnit2Util.php diff --git a/gulliver/thirdparty/phing/tasks/ext/phpunit2/PlainPHPUnit2ResultFormatter.php b/thirdparty/phing/tasks/ext/phpunit2/PlainPHPUnit2ResultFormatter.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/ext/phpunit2/PlainPHPUnit2ResultFormatter.php rename to thirdparty/phing/tasks/ext/phpunit2/PlainPHPUnit2ResultFormatter.php diff --git a/gulliver/thirdparty/phing/tasks/ext/phpunit2/SummaryPHPUnit2ResultFormatter.php b/thirdparty/phing/tasks/ext/phpunit2/SummaryPHPUnit2ResultFormatter.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/ext/phpunit2/SummaryPHPUnit2ResultFormatter.php rename to thirdparty/phing/tasks/ext/phpunit2/SummaryPHPUnit2ResultFormatter.php diff --git a/gulliver/thirdparty/phing/tasks/ext/phpunit2/XMLPHPUnit2ResultFormatter.php b/thirdparty/phing/tasks/ext/phpunit2/XMLPHPUnit2ResultFormatter.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/ext/phpunit2/XMLPHPUnit2ResultFormatter.php rename to thirdparty/phing/tasks/ext/phpunit2/XMLPHPUnit2ResultFormatter.php diff --git a/gulliver/thirdparty/phing/tasks/ext/simpletest/SimpleTestCountResultFormatter.php b/thirdparty/phing/tasks/ext/simpletest/SimpleTestCountResultFormatter.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/ext/simpletest/SimpleTestCountResultFormatter.php rename to thirdparty/phing/tasks/ext/simpletest/SimpleTestCountResultFormatter.php diff --git a/gulliver/thirdparty/phing/tasks/ext/simpletest/SimpleTestFormatterElement.php b/thirdparty/phing/tasks/ext/simpletest/SimpleTestFormatterElement.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/ext/simpletest/SimpleTestFormatterElement.php rename to thirdparty/phing/tasks/ext/simpletest/SimpleTestFormatterElement.php diff --git a/gulliver/thirdparty/phing/tasks/ext/simpletest/SimpleTestPlainResultFormatter.php b/thirdparty/phing/tasks/ext/simpletest/SimpleTestPlainResultFormatter.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/ext/simpletest/SimpleTestPlainResultFormatter.php rename to thirdparty/phing/tasks/ext/simpletest/SimpleTestPlainResultFormatter.php diff --git a/gulliver/thirdparty/phing/tasks/ext/simpletest/SimpleTestResultFormatter.php b/thirdparty/phing/tasks/ext/simpletest/SimpleTestResultFormatter.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/ext/simpletest/SimpleTestResultFormatter.php rename to thirdparty/phing/tasks/ext/simpletest/SimpleTestResultFormatter.php diff --git a/gulliver/thirdparty/phing/tasks/ext/simpletest/SimpleTestSummaryResultFormatter.php b/thirdparty/phing/tasks/ext/simpletest/SimpleTestSummaryResultFormatter.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/ext/simpletest/SimpleTestSummaryResultFormatter.php rename to thirdparty/phing/tasks/ext/simpletest/SimpleTestSummaryResultFormatter.php diff --git a/gulliver/thirdparty/phing/tasks/ext/simpletest/SimpleTestTask.php b/thirdparty/phing/tasks/ext/simpletest/SimpleTestTask.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/ext/simpletest/SimpleTestTask.php rename to thirdparty/phing/tasks/ext/simpletest/SimpleTestTask.php diff --git a/gulliver/thirdparty/phing/tasks/ext/svn/SvnBaseTask.php b/thirdparty/phing/tasks/ext/svn/SvnBaseTask.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/ext/svn/SvnBaseTask.php rename to thirdparty/phing/tasks/ext/svn/SvnBaseTask.php diff --git a/gulliver/thirdparty/phing/tasks/ext/svn/SvnExportTask.php b/thirdparty/phing/tasks/ext/svn/SvnExportTask.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/ext/svn/SvnExportTask.php rename to thirdparty/phing/tasks/ext/svn/SvnExportTask.php diff --git a/gulliver/thirdparty/phing/tasks/ext/svn/SvnLastRevisionTask.php b/thirdparty/phing/tasks/ext/svn/SvnLastRevisionTask.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/ext/svn/SvnLastRevisionTask.php rename to thirdparty/phing/tasks/ext/svn/SvnLastRevisionTask.php diff --git a/gulliver/thirdparty/phing/tasks/system/AdhocTask.php b/thirdparty/phing/tasks/system/AdhocTask.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/system/AdhocTask.php rename to thirdparty/phing/tasks/system/AdhocTask.php diff --git a/gulliver/thirdparty/phing/tasks/system/AdhocTaskdefTask.php b/thirdparty/phing/tasks/system/AdhocTaskdefTask.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/system/AdhocTaskdefTask.php rename to thirdparty/phing/tasks/system/AdhocTaskdefTask.php diff --git a/gulliver/thirdparty/phing/tasks/system/AdhocTypedefTask.php b/thirdparty/phing/tasks/system/AdhocTypedefTask.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/system/AdhocTypedefTask.php rename to thirdparty/phing/tasks/system/AdhocTypedefTask.php diff --git a/gulliver/thirdparty/phing/tasks/system/AppendTask.php b/thirdparty/phing/tasks/system/AppendTask.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/system/AppendTask.php rename to thirdparty/phing/tasks/system/AppendTask.php diff --git a/gulliver/thirdparty/phing/tasks/system/AvailableTask.php b/thirdparty/phing/tasks/system/AvailableTask.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/system/AvailableTask.php rename to thirdparty/phing/tasks/system/AvailableTask.php diff --git a/gulliver/thirdparty/phing/tasks/system/ChmodTask.php b/thirdparty/phing/tasks/system/ChmodTask.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/system/ChmodTask.php rename to thirdparty/phing/tasks/system/ChmodTask.php diff --git a/gulliver/thirdparty/phing/tasks/system/ConditionTask.php b/thirdparty/phing/tasks/system/ConditionTask.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/system/ConditionTask.php rename to thirdparty/phing/tasks/system/ConditionTask.php diff --git a/gulliver/thirdparty/phing/tasks/system/CopyTask.php b/thirdparty/phing/tasks/system/CopyTask.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/system/CopyTask.php rename to thirdparty/phing/tasks/system/CopyTask.php diff --git a/gulliver/thirdparty/phing/tasks/system/CvsPassTask.php b/thirdparty/phing/tasks/system/CvsPassTask.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/system/CvsPassTask.php rename to thirdparty/phing/tasks/system/CvsPassTask.php diff --git a/gulliver/thirdparty/phing/tasks/system/CvsTask.php b/thirdparty/phing/tasks/system/CvsTask.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/system/CvsTask.php rename to thirdparty/phing/tasks/system/CvsTask.php diff --git a/gulliver/thirdparty/phing/tasks/system/DeleteTask.php b/thirdparty/phing/tasks/system/DeleteTask.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/system/DeleteTask.php rename to thirdparty/phing/tasks/system/DeleteTask.php diff --git a/gulliver/thirdparty/phing/tasks/system/EchoTask.php b/thirdparty/phing/tasks/system/EchoTask.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/system/EchoTask.php rename to thirdparty/phing/tasks/system/EchoTask.php diff --git a/gulliver/thirdparty/phing/tasks/system/ExecTask.php b/thirdparty/phing/tasks/system/ExecTask.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/system/ExecTask.php rename to thirdparty/phing/tasks/system/ExecTask.php diff --git a/gulliver/thirdparty/phing/tasks/system/ExitTask.php b/thirdparty/phing/tasks/system/ExitTask.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/system/ExitTask.php rename to thirdparty/phing/tasks/system/ExitTask.php diff --git a/gulliver/thirdparty/phing/tasks/system/ForeachTask.php b/thirdparty/phing/tasks/system/ForeachTask.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/system/ForeachTask.php rename to thirdparty/phing/tasks/system/ForeachTask.php diff --git a/gulliver/thirdparty/phing/tasks/system/IfTask.php b/thirdparty/phing/tasks/system/IfTask.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/system/IfTask.php rename to thirdparty/phing/tasks/system/IfTask.php diff --git a/gulliver/thirdparty/phing/tasks/system/IncludePathTask.php b/thirdparty/phing/tasks/system/IncludePathTask.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/system/IncludePathTask.php rename to thirdparty/phing/tasks/system/IncludePathTask.php diff --git a/gulliver/thirdparty/phing/tasks/system/InputTask.php b/thirdparty/phing/tasks/system/InputTask.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/system/InputTask.php rename to thirdparty/phing/tasks/system/InputTask.php diff --git a/gulliver/thirdparty/phing/tasks/system/MatchingTask.php b/thirdparty/phing/tasks/system/MatchingTask.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/system/MatchingTask.php rename to thirdparty/phing/tasks/system/MatchingTask.php diff --git a/gulliver/thirdparty/phing/tasks/system/MkdirTask.php b/thirdparty/phing/tasks/system/MkdirTask.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/system/MkdirTask.php rename to thirdparty/phing/tasks/system/MkdirTask.php diff --git a/gulliver/thirdparty/phing/tasks/system/MoveTask.php b/thirdparty/phing/tasks/system/MoveTask.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/system/MoveTask.php rename to thirdparty/phing/tasks/system/MoveTask.php diff --git a/gulliver/thirdparty/phing/tasks/system/PhingCallTask.php b/thirdparty/phing/tasks/system/PhingCallTask.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/system/PhingCallTask.php rename to thirdparty/phing/tasks/system/PhingCallTask.php diff --git a/gulliver/thirdparty/phing/tasks/system/PhingTask.php b/thirdparty/phing/tasks/system/PhingTask.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/system/PhingTask.php rename to thirdparty/phing/tasks/system/PhingTask.php diff --git a/gulliver/thirdparty/phing/tasks/system/PhpEvalTask.php b/thirdparty/phing/tasks/system/PhpEvalTask.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/system/PhpEvalTask.php rename to thirdparty/phing/tasks/system/PhpEvalTask.php diff --git a/gulliver/thirdparty/phing/tasks/system/PropertyPromptTask.php b/thirdparty/phing/tasks/system/PropertyPromptTask.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/system/PropertyPromptTask.php rename to thirdparty/phing/tasks/system/PropertyPromptTask.php diff --git a/gulliver/thirdparty/phing/tasks/system/PropertyTask.php b/thirdparty/phing/tasks/system/PropertyTask.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/system/PropertyTask.php rename to thirdparty/phing/tasks/system/PropertyTask.php diff --git a/gulliver/thirdparty/phing/tasks/system/ReflexiveTask.php b/thirdparty/phing/tasks/system/ReflexiveTask.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/system/ReflexiveTask.php rename to thirdparty/phing/tasks/system/ReflexiveTask.php diff --git a/gulliver/thirdparty/phing/tasks/system/ResolvePathTask.php b/thirdparty/phing/tasks/system/ResolvePathTask.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/system/ResolvePathTask.php rename to thirdparty/phing/tasks/system/ResolvePathTask.php diff --git a/gulliver/thirdparty/phing/tasks/system/SequentialTask.php b/thirdparty/phing/tasks/system/SequentialTask.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/system/SequentialTask.php rename to thirdparty/phing/tasks/system/SequentialTask.php diff --git a/gulliver/thirdparty/phing/tasks/system/TaskdefTask.php b/thirdparty/phing/tasks/system/TaskdefTask.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/system/TaskdefTask.php rename to thirdparty/phing/tasks/system/TaskdefTask.php diff --git a/gulliver/thirdparty/phing/tasks/system/TouchTask.php b/thirdparty/phing/tasks/system/TouchTask.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/system/TouchTask.php rename to thirdparty/phing/tasks/system/TouchTask.php diff --git a/gulliver/thirdparty/phing/tasks/system/TstampTask.php b/thirdparty/phing/tasks/system/TstampTask.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/system/TstampTask.php rename to thirdparty/phing/tasks/system/TstampTask.php diff --git a/gulliver/thirdparty/phing/tasks/system/TypedefTask.php b/thirdparty/phing/tasks/system/TypedefTask.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/system/TypedefTask.php rename to thirdparty/phing/tasks/system/TypedefTask.php diff --git a/gulliver/thirdparty/phing/tasks/system/UpToDateTask.php b/thirdparty/phing/tasks/system/UpToDateTask.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/system/UpToDateTask.php rename to thirdparty/phing/tasks/system/UpToDateTask.php diff --git a/gulliver/thirdparty/phing/tasks/system/WarnTask.php b/thirdparty/phing/tasks/system/WarnTask.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/system/WarnTask.php rename to thirdparty/phing/tasks/system/WarnTask.php diff --git a/gulliver/thirdparty/phing/tasks/system/XsltTask.php b/thirdparty/phing/tasks/system/XsltTask.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/system/XsltTask.php rename to thirdparty/phing/tasks/system/XsltTask.php diff --git a/gulliver/thirdparty/phing/tasks/system/condition/AndCondition.php b/thirdparty/phing/tasks/system/condition/AndCondition.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/system/condition/AndCondition.php rename to thirdparty/phing/tasks/system/condition/AndCondition.php diff --git a/gulliver/thirdparty/phing/tasks/system/condition/Condition.php b/thirdparty/phing/tasks/system/condition/Condition.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/system/condition/Condition.php rename to thirdparty/phing/tasks/system/condition/Condition.php diff --git a/gulliver/thirdparty/phing/tasks/system/condition/ConditionBase.php b/thirdparty/phing/tasks/system/condition/ConditionBase.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/system/condition/ConditionBase.php rename to thirdparty/phing/tasks/system/condition/ConditionBase.php diff --git a/gulliver/thirdparty/phing/tasks/system/condition/ContainsCondition.php b/thirdparty/phing/tasks/system/condition/ContainsCondition.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/system/condition/ContainsCondition.php rename to thirdparty/phing/tasks/system/condition/ContainsCondition.php diff --git a/gulliver/thirdparty/phing/tasks/system/condition/EqualsCondition.php b/thirdparty/phing/tasks/system/condition/EqualsCondition.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/system/condition/EqualsCondition.php rename to thirdparty/phing/tasks/system/condition/EqualsCondition.php diff --git a/gulliver/thirdparty/phing/tasks/system/condition/IsFalseCondition.php b/thirdparty/phing/tasks/system/condition/IsFalseCondition.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/system/condition/IsFalseCondition.php rename to thirdparty/phing/tasks/system/condition/IsFalseCondition.php diff --git a/gulliver/thirdparty/phing/tasks/system/condition/IsSetCondition.php b/thirdparty/phing/tasks/system/condition/IsSetCondition.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/system/condition/IsSetCondition.php rename to thirdparty/phing/tasks/system/condition/IsSetCondition.php diff --git a/gulliver/thirdparty/phing/tasks/system/condition/IsTrueCondition.php b/thirdparty/phing/tasks/system/condition/IsTrueCondition.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/system/condition/IsTrueCondition.php rename to thirdparty/phing/tasks/system/condition/IsTrueCondition.php diff --git a/gulliver/thirdparty/phing/tasks/system/condition/NotCondition.php b/thirdparty/phing/tasks/system/condition/NotCondition.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/system/condition/NotCondition.php rename to thirdparty/phing/tasks/system/condition/NotCondition.php diff --git a/gulliver/thirdparty/phing/tasks/system/condition/OrCondition.php b/thirdparty/phing/tasks/system/condition/OrCondition.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/system/condition/OrCondition.php rename to thirdparty/phing/tasks/system/condition/OrCondition.php diff --git a/gulliver/thirdparty/phing/tasks/system/condition/OsCondition.php b/thirdparty/phing/tasks/system/condition/OsCondition.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/system/condition/OsCondition.php rename to thirdparty/phing/tasks/system/condition/OsCondition.php diff --git a/gulliver/thirdparty/phing/tasks/system/condition/ReferenceExistsCondition.php b/thirdparty/phing/tasks/system/condition/ReferenceExistsCondition.php similarity index 100% rename from gulliver/thirdparty/phing/tasks/system/condition/ReferenceExistsCondition.php rename to thirdparty/phing/tasks/system/condition/ReferenceExistsCondition.php diff --git a/gulliver/thirdparty/phing/types/AbstractFileSet.php b/thirdparty/phing/types/AbstractFileSet.php similarity index 100% rename from gulliver/thirdparty/phing/types/AbstractFileSet.php rename to thirdparty/phing/types/AbstractFileSet.php diff --git a/gulliver/thirdparty/phing/types/Commandline.php b/thirdparty/phing/types/Commandline.php similarity index 100% rename from gulliver/thirdparty/phing/types/Commandline.php rename to thirdparty/phing/types/Commandline.php diff --git a/gulliver/thirdparty/phing/types/DataType.php b/thirdparty/phing/types/DataType.php similarity index 100% rename from gulliver/thirdparty/phing/types/DataType.php rename to thirdparty/phing/types/DataType.php diff --git a/gulliver/thirdparty/phing/types/Description.php b/thirdparty/phing/types/Description.php similarity index 100% rename from gulliver/thirdparty/phing/types/Description.php rename to thirdparty/phing/types/Description.php diff --git a/gulliver/thirdparty/phing/types/DirSet.php b/thirdparty/phing/types/DirSet.php similarity index 100% rename from gulliver/thirdparty/phing/types/DirSet.php rename to thirdparty/phing/types/DirSet.php diff --git a/gulliver/thirdparty/phing/types/FileList.php b/thirdparty/phing/types/FileList.php similarity index 100% rename from gulliver/thirdparty/phing/types/FileList.php rename to thirdparty/phing/types/FileList.php diff --git a/gulliver/thirdparty/phing/types/FileSet.php b/thirdparty/phing/types/FileSet.php similarity index 100% rename from gulliver/thirdparty/phing/types/FileSet.php rename to thirdparty/phing/types/FileSet.php diff --git a/gulliver/thirdparty/phing/types/FilterChain.php b/thirdparty/phing/types/FilterChain.php similarity index 100% rename from gulliver/thirdparty/phing/types/FilterChain.php rename to thirdparty/phing/types/FilterChain.php diff --git a/gulliver/thirdparty/phing/types/Mapper.php b/thirdparty/phing/types/Mapper.php similarity index 100% rename from gulliver/thirdparty/phing/types/Mapper.php rename to thirdparty/phing/types/Mapper.php diff --git a/gulliver/thirdparty/phing/types/Parameter.php b/thirdparty/phing/types/Parameter.php similarity index 100% rename from gulliver/thirdparty/phing/types/Parameter.php rename to thirdparty/phing/types/Parameter.php diff --git a/gulliver/thirdparty/phing/types/Parameterizable.php b/thirdparty/phing/types/Parameterizable.php similarity index 100% rename from gulliver/thirdparty/phing/types/Parameterizable.php rename to thirdparty/phing/types/Parameterizable.php diff --git a/gulliver/thirdparty/phing/types/Path.php b/thirdparty/phing/types/Path.php similarity index 100% rename from gulliver/thirdparty/phing/types/Path.php rename to thirdparty/phing/types/Path.php diff --git a/gulliver/thirdparty/phing/types/PatternSet.php b/thirdparty/phing/types/PatternSet.php similarity index 100% rename from gulliver/thirdparty/phing/types/PatternSet.php rename to thirdparty/phing/types/PatternSet.php diff --git a/gulliver/thirdparty/phing/types/PhingFilterReader.php b/thirdparty/phing/types/PhingFilterReader.php similarity index 100% rename from gulliver/thirdparty/phing/types/PhingFilterReader.php rename to thirdparty/phing/types/PhingFilterReader.php diff --git a/gulliver/thirdparty/phing/types/Reference.php b/thirdparty/phing/types/Reference.php similarity index 100% rename from gulliver/thirdparty/phing/types/Reference.php rename to thirdparty/phing/types/Reference.php diff --git a/gulliver/thirdparty/phing/types/RegularExpression.php b/thirdparty/phing/types/RegularExpression.php similarity index 100% rename from gulliver/thirdparty/phing/types/RegularExpression.php rename to thirdparty/phing/types/RegularExpression.php diff --git a/gulliver/thirdparty/phing/types/TokenReader.php b/thirdparty/phing/types/TokenReader.php similarity index 100% rename from gulliver/thirdparty/phing/types/TokenReader.php rename to thirdparty/phing/types/TokenReader.php diff --git a/gulliver/thirdparty/phing/types/TokenSource.php b/thirdparty/phing/types/TokenSource.php similarity index 100% rename from gulliver/thirdparty/phing/types/TokenSource.php rename to thirdparty/phing/types/TokenSource.php diff --git a/gulliver/thirdparty/phing/types/defaults.properties b/thirdparty/phing/types/defaults.properties similarity index 100% rename from gulliver/thirdparty/phing/types/defaults.properties rename to thirdparty/phing/types/defaults.properties diff --git a/gulliver/thirdparty/phing/types/selectors/AndSelector.php b/thirdparty/phing/types/selectors/AndSelector.php similarity index 100% rename from gulliver/thirdparty/phing/types/selectors/AndSelector.php rename to thirdparty/phing/types/selectors/AndSelector.php diff --git a/gulliver/thirdparty/phing/types/selectors/BaseExtendSelector.php b/thirdparty/phing/types/selectors/BaseExtendSelector.php similarity index 100% rename from gulliver/thirdparty/phing/types/selectors/BaseExtendSelector.php rename to thirdparty/phing/types/selectors/BaseExtendSelector.php diff --git a/gulliver/thirdparty/phing/types/selectors/BaseSelector.php b/thirdparty/phing/types/selectors/BaseSelector.php similarity index 100% rename from gulliver/thirdparty/phing/types/selectors/BaseSelector.php rename to thirdparty/phing/types/selectors/BaseSelector.php diff --git a/gulliver/thirdparty/phing/types/selectors/BaseSelectorContainer.php b/thirdparty/phing/types/selectors/BaseSelectorContainer.php similarity index 100% rename from gulliver/thirdparty/phing/types/selectors/BaseSelectorContainer.php rename to thirdparty/phing/types/selectors/BaseSelectorContainer.php diff --git a/gulliver/thirdparty/phing/types/selectors/ContainsRegexpSelector.php b/thirdparty/phing/types/selectors/ContainsRegexpSelector.php similarity index 100% rename from gulliver/thirdparty/phing/types/selectors/ContainsRegexpSelector.php rename to thirdparty/phing/types/selectors/ContainsRegexpSelector.php diff --git a/gulliver/thirdparty/phing/types/selectors/ContainsSelector.php b/thirdparty/phing/types/selectors/ContainsSelector.php similarity index 100% rename from gulliver/thirdparty/phing/types/selectors/ContainsSelector.php rename to thirdparty/phing/types/selectors/ContainsSelector.php diff --git a/gulliver/thirdparty/phing/types/selectors/DateSelector.php b/thirdparty/phing/types/selectors/DateSelector.php similarity index 100% rename from gulliver/thirdparty/phing/types/selectors/DateSelector.php rename to thirdparty/phing/types/selectors/DateSelector.php diff --git a/gulliver/thirdparty/phing/types/selectors/DependSelector.php b/thirdparty/phing/types/selectors/DependSelector.php similarity index 100% rename from gulliver/thirdparty/phing/types/selectors/DependSelector.php rename to thirdparty/phing/types/selectors/DependSelector.php diff --git a/gulliver/thirdparty/phing/types/selectors/DepthSelector.php b/thirdparty/phing/types/selectors/DepthSelector.php similarity index 100% rename from gulliver/thirdparty/phing/types/selectors/DepthSelector.php rename to thirdparty/phing/types/selectors/DepthSelector.php diff --git a/gulliver/thirdparty/phing/types/selectors/ExtendFileSelector.php b/thirdparty/phing/types/selectors/ExtendFileSelector.php similarity index 100% rename from gulliver/thirdparty/phing/types/selectors/ExtendFileSelector.php rename to thirdparty/phing/types/selectors/ExtendFileSelector.php diff --git a/gulliver/thirdparty/phing/types/selectors/ExtendSelector.php b/thirdparty/phing/types/selectors/ExtendSelector.php similarity index 100% rename from gulliver/thirdparty/phing/types/selectors/ExtendSelector.php rename to thirdparty/phing/types/selectors/ExtendSelector.php diff --git a/gulliver/thirdparty/phing/types/selectors/FileSelector.php b/thirdparty/phing/types/selectors/FileSelector.php similarity index 100% rename from gulliver/thirdparty/phing/types/selectors/FileSelector.php rename to thirdparty/phing/types/selectors/FileSelector.php diff --git a/gulliver/thirdparty/phing/types/selectors/FilenameSelector.php b/thirdparty/phing/types/selectors/FilenameSelector.php similarity index 100% rename from gulliver/thirdparty/phing/types/selectors/FilenameSelector.php rename to thirdparty/phing/types/selectors/FilenameSelector.php diff --git a/gulliver/thirdparty/phing/types/selectors/MajoritySelector.php b/thirdparty/phing/types/selectors/MajoritySelector.php similarity index 100% rename from gulliver/thirdparty/phing/types/selectors/MajoritySelector.php rename to thirdparty/phing/types/selectors/MajoritySelector.php diff --git a/gulliver/thirdparty/phing/types/selectors/NoneSelector.php b/thirdparty/phing/types/selectors/NoneSelector.php similarity index 100% rename from gulliver/thirdparty/phing/types/selectors/NoneSelector.php rename to thirdparty/phing/types/selectors/NoneSelector.php diff --git a/gulliver/thirdparty/phing/types/selectors/NotSelector.php b/thirdparty/phing/types/selectors/NotSelector.php similarity index 100% rename from gulliver/thirdparty/phing/types/selectors/NotSelector.php rename to thirdparty/phing/types/selectors/NotSelector.php diff --git a/gulliver/thirdparty/phing/types/selectors/OrSelector.php b/thirdparty/phing/types/selectors/OrSelector.php similarity index 100% rename from gulliver/thirdparty/phing/types/selectors/OrSelector.php rename to thirdparty/phing/types/selectors/OrSelector.php diff --git a/gulliver/thirdparty/phing/types/selectors/PresentSelector.php b/thirdparty/phing/types/selectors/PresentSelector.php similarity index 100% rename from gulliver/thirdparty/phing/types/selectors/PresentSelector.php rename to thirdparty/phing/types/selectors/PresentSelector.php diff --git a/gulliver/thirdparty/phing/types/selectors/SelectSelector.php b/thirdparty/phing/types/selectors/SelectSelector.php similarity index 100% rename from gulliver/thirdparty/phing/types/selectors/SelectSelector.php rename to thirdparty/phing/types/selectors/SelectSelector.php diff --git a/gulliver/thirdparty/phing/types/selectors/SelectorContainer.php b/thirdparty/phing/types/selectors/SelectorContainer.php similarity index 100% rename from gulliver/thirdparty/phing/types/selectors/SelectorContainer.php rename to thirdparty/phing/types/selectors/SelectorContainer.php diff --git a/gulliver/thirdparty/phing/types/selectors/SelectorScanner.php b/thirdparty/phing/types/selectors/SelectorScanner.php similarity index 100% rename from gulliver/thirdparty/phing/types/selectors/SelectorScanner.php rename to thirdparty/phing/types/selectors/SelectorScanner.php diff --git a/gulliver/thirdparty/phing/types/selectors/SelectorUtils.php b/thirdparty/phing/types/selectors/SelectorUtils.php similarity index 100% rename from gulliver/thirdparty/phing/types/selectors/SelectorUtils.php rename to thirdparty/phing/types/selectors/SelectorUtils.php diff --git a/gulliver/thirdparty/phing/types/selectors/SizeSelector.php b/thirdparty/phing/types/selectors/SizeSelector.php similarity index 100% rename from gulliver/thirdparty/phing/types/selectors/SizeSelector.php rename to thirdparty/phing/types/selectors/SizeSelector.php diff --git a/gulliver/thirdparty/phing/types/selectors/TypeSelector.php b/thirdparty/phing/types/selectors/TypeSelector.php similarity index 100% rename from gulliver/thirdparty/phing/types/selectors/TypeSelector.php rename to thirdparty/phing/types/selectors/TypeSelector.php diff --git a/gulliver/thirdparty/phing/util/DirectoryScanner.php b/thirdparty/phing/util/DirectoryScanner.php similarity index 100% rename from gulliver/thirdparty/phing/util/DirectoryScanner.php rename to thirdparty/phing/util/DirectoryScanner.php diff --git a/gulliver/thirdparty/phing/util/ExtendedFileStream.php b/thirdparty/phing/util/ExtendedFileStream.php similarity index 100% rename from gulliver/thirdparty/phing/util/ExtendedFileStream.php rename to thirdparty/phing/util/ExtendedFileStream.php diff --git a/gulliver/thirdparty/phing/util/FileUtils.php b/thirdparty/phing/util/FileUtils.php similarity index 100% rename from gulliver/thirdparty/phing/util/FileUtils.php rename to thirdparty/phing/util/FileUtils.php diff --git a/gulliver/thirdparty/phing/util/LogWriter.php b/thirdparty/phing/util/LogWriter.php similarity index 100% rename from gulliver/thirdparty/phing/util/LogWriter.php rename to thirdparty/phing/util/LogWriter.php diff --git a/gulliver/thirdparty/phing/util/PathTokenizer.php b/thirdparty/phing/util/PathTokenizer.php similarity index 100% rename from gulliver/thirdparty/phing/util/PathTokenizer.php rename to thirdparty/phing/util/PathTokenizer.php diff --git a/gulliver/thirdparty/phing/util/SourceFileScanner.php b/thirdparty/phing/util/SourceFileScanner.php similarity index 100% rename from gulliver/thirdparty/phing/util/SourceFileScanner.php rename to thirdparty/phing/util/SourceFileScanner.php diff --git a/gulliver/thirdparty/phing/util/StringHelper.php b/thirdparty/phing/util/StringHelper.php similarity index 100% rename from gulliver/thirdparty/phing/util/StringHelper.php rename to thirdparty/phing/util/StringHelper.php diff --git a/gulliver/thirdparty/phing/util/regexp/PregEngine.php b/thirdparty/phing/util/regexp/PregEngine.php similarity index 100% rename from gulliver/thirdparty/phing/util/regexp/PregEngine.php rename to thirdparty/phing/util/regexp/PregEngine.php diff --git a/gulliver/thirdparty/phing/util/regexp/Regexp.php b/thirdparty/phing/util/regexp/Regexp.php similarity index 100% rename from gulliver/thirdparty/phing/util/regexp/Regexp.php rename to thirdparty/phing/util/regexp/Regexp.php diff --git a/gulliver/thirdparty/phing/util/regexp/RegexpEngine.php b/thirdparty/phing/util/regexp/RegexpEngine.php similarity index 100% rename from gulliver/thirdparty/phing/util/regexp/RegexpEngine.php rename to thirdparty/phing/util/regexp/RegexpEngine.php diff --git a/gulliver/thirdparty/phpmailer/class.phpmailer.php b/thirdparty/phpmailer/class.phpmailer.php similarity index 100% rename from gulliver/thirdparty/phpmailer/class.phpmailer.php rename to thirdparty/phpmailer/class.phpmailer.php diff --git a/gulliver/thirdparty/phpmailer/class.pop3.php b/thirdparty/phpmailer/class.pop3.php similarity index 100% rename from gulliver/thirdparty/phpmailer/class.pop3.php rename to thirdparty/phpmailer/class.pop3.php diff --git a/gulliver/thirdparty/phpmailer/class.smtp.php b/thirdparty/phpmailer/class.smtp.php similarity index 100% rename from gulliver/thirdparty/phpmailer/class.smtp.php rename to thirdparty/phpmailer/class.smtp.php diff --git a/gulliver/thirdparty/phpmailer/extras/class.html2text.inc b/thirdparty/phpmailer/extras/class.html2text.inc similarity index 100% rename from gulliver/thirdparty/phpmailer/extras/class.html2text.inc rename to thirdparty/phpmailer/extras/class.html2text.inc diff --git a/gulliver/thirdparty/phpmailer/extras/htmlfilter.php b/thirdparty/phpmailer/extras/htmlfilter.php similarity index 100% rename from gulliver/thirdparty/phpmailer/extras/htmlfilter.php rename to thirdparty/phpmailer/extras/htmlfilter.php diff --git a/gulliver/thirdparty/phpmailer/extras/ntlm_sasl_client.php b/thirdparty/phpmailer/extras/ntlm_sasl_client.php similarity index 100% rename from gulliver/thirdparty/phpmailer/extras/ntlm_sasl_client.php rename to thirdparty/phpmailer/extras/ntlm_sasl_client.php diff --git a/gulliver/thirdparty/phpmailer/language/phpmailer.lang-ar.php b/thirdparty/phpmailer/language/phpmailer.lang-ar.php similarity index 100% rename from gulliver/thirdparty/phpmailer/language/phpmailer.lang-ar.php rename to thirdparty/phpmailer/language/phpmailer.lang-ar.php diff --git a/gulliver/thirdparty/phpmailer/language/phpmailer.lang-br.php b/thirdparty/phpmailer/language/phpmailer.lang-br.php similarity index 100% rename from gulliver/thirdparty/phpmailer/language/phpmailer.lang-br.php rename to thirdparty/phpmailer/language/phpmailer.lang-br.php diff --git a/gulliver/thirdparty/phpmailer/language/phpmailer.lang-ca.php b/thirdparty/phpmailer/language/phpmailer.lang-ca.php similarity index 100% rename from gulliver/thirdparty/phpmailer/language/phpmailer.lang-ca.php rename to thirdparty/phpmailer/language/phpmailer.lang-ca.php diff --git a/gulliver/thirdparty/phpmailer/language/phpmailer.lang-ch.php b/thirdparty/phpmailer/language/phpmailer.lang-ch.php similarity index 100% rename from gulliver/thirdparty/phpmailer/language/phpmailer.lang-ch.php rename to thirdparty/phpmailer/language/phpmailer.lang-ch.php diff --git a/gulliver/thirdparty/phpmailer/language/phpmailer.lang-cz.php b/thirdparty/phpmailer/language/phpmailer.lang-cz.php similarity index 100% rename from gulliver/thirdparty/phpmailer/language/phpmailer.lang-cz.php rename to thirdparty/phpmailer/language/phpmailer.lang-cz.php diff --git a/gulliver/thirdparty/phpmailer/language/phpmailer.lang-de.php b/thirdparty/phpmailer/language/phpmailer.lang-de.php similarity index 100% rename from gulliver/thirdparty/phpmailer/language/phpmailer.lang-de.php rename to thirdparty/phpmailer/language/phpmailer.lang-de.php diff --git a/gulliver/thirdparty/phpmailer/language/phpmailer.lang-dk.php b/thirdparty/phpmailer/language/phpmailer.lang-dk.php similarity index 100% rename from gulliver/thirdparty/phpmailer/language/phpmailer.lang-dk.php rename to thirdparty/phpmailer/language/phpmailer.lang-dk.php diff --git a/gulliver/thirdparty/phpmailer/language/phpmailer.lang-en.php b/thirdparty/phpmailer/language/phpmailer.lang-en.php similarity index 100% rename from gulliver/thirdparty/phpmailer/language/phpmailer.lang-en.php rename to thirdparty/phpmailer/language/phpmailer.lang-en.php diff --git a/gulliver/thirdparty/phpmailer/language/phpmailer.lang-es.php b/thirdparty/phpmailer/language/phpmailer.lang-es.php similarity index 100% rename from gulliver/thirdparty/phpmailer/language/phpmailer.lang-es.php rename to thirdparty/phpmailer/language/phpmailer.lang-es.php diff --git a/gulliver/thirdparty/phpmailer/language/phpmailer.lang-et.php b/thirdparty/phpmailer/language/phpmailer.lang-et.php similarity index 100% rename from gulliver/thirdparty/phpmailer/language/phpmailer.lang-et.php rename to thirdparty/phpmailer/language/phpmailer.lang-et.php diff --git a/gulliver/thirdparty/phpmailer/language/phpmailer.lang-fi.php b/thirdparty/phpmailer/language/phpmailer.lang-fi.php similarity index 100% rename from gulliver/thirdparty/phpmailer/language/phpmailer.lang-fi.php rename to thirdparty/phpmailer/language/phpmailer.lang-fi.php diff --git a/gulliver/thirdparty/phpmailer/language/phpmailer.lang-fo.php b/thirdparty/phpmailer/language/phpmailer.lang-fo.php similarity index 100% rename from gulliver/thirdparty/phpmailer/language/phpmailer.lang-fo.php rename to thirdparty/phpmailer/language/phpmailer.lang-fo.php diff --git a/gulliver/thirdparty/phpmailer/language/phpmailer.lang-fr.php b/thirdparty/phpmailer/language/phpmailer.lang-fr.php similarity index 100% rename from gulliver/thirdparty/phpmailer/language/phpmailer.lang-fr.php rename to thirdparty/phpmailer/language/phpmailer.lang-fr.php diff --git a/gulliver/thirdparty/phpmailer/language/phpmailer.lang-hu.php b/thirdparty/phpmailer/language/phpmailer.lang-hu.php similarity index 100% rename from gulliver/thirdparty/phpmailer/language/phpmailer.lang-hu.php rename to thirdparty/phpmailer/language/phpmailer.lang-hu.php diff --git a/gulliver/thirdparty/phpmailer/language/phpmailer.lang-it.php b/thirdparty/phpmailer/language/phpmailer.lang-it.php similarity index 100% rename from gulliver/thirdparty/phpmailer/language/phpmailer.lang-it.php rename to thirdparty/phpmailer/language/phpmailer.lang-it.php diff --git a/gulliver/thirdparty/phpmailer/language/phpmailer.lang-ja.php b/thirdparty/phpmailer/language/phpmailer.lang-ja.php similarity index 100% rename from gulliver/thirdparty/phpmailer/language/phpmailer.lang-ja.php rename to thirdparty/phpmailer/language/phpmailer.lang-ja.php diff --git a/gulliver/thirdparty/phpmailer/language/phpmailer.lang-nl.php b/thirdparty/phpmailer/language/phpmailer.lang-nl.php similarity index 100% rename from gulliver/thirdparty/phpmailer/language/phpmailer.lang-nl.php rename to thirdparty/phpmailer/language/phpmailer.lang-nl.php diff --git a/gulliver/thirdparty/phpmailer/language/phpmailer.lang-no.php b/thirdparty/phpmailer/language/phpmailer.lang-no.php similarity index 100% rename from gulliver/thirdparty/phpmailer/language/phpmailer.lang-no.php rename to thirdparty/phpmailer/language/phpmailer.lang-no.php diff --git a/gulliver/thirdparty/phpmailer/language/phpmailer.lang-pl.php b/thirdparty/phpmailer/language/phpmailer.lang-pl.php similarity index 100% rename from gulliver/thirdparty/phpmailer/language/phpmailer.lang-pl.php rename to thirdparty/phpmailer/language/phpmailer.lang-pl.php diff --git a/gulliver/thirdparty/phpmailer/language/phpmailer.lang-ro.php b/thirdparty/phpmailer/language/phpmailer.lang-ro.php similarity index 100% rename from gulliver/thirdparty/phpmailer/language/phpmailer.lang-ro.php rename to thirdparty/phpmailer/language/phpmailer.lang-ro.php diff --git a/gulliver/thirdparty/phpmailer/language/phpmailer.lang-ru.php b/thirdparty/phpmailer/language/phpmailer.lang-ru.php similarity index 100% rename from gulliver/thirdparty/phpmailer/language/phpmailer.lang-ru.php rename to thirdparty/phpmailer/language/phpmailer.lang-ru.php diff --git a/gulliver/thirdparty/phpmailer/language/phpmailer.lang-se.php b/thirdparty/phpmailer/language/phpmailer.lang-se.php similarity index 100% rename from gulliver/thirdparty/phpmailer/language/phpmailer.lang-se.php rename to thirdparty/phpmailer/language/phpmailer.lang-se.php diff --git a/gulliver/thirdparty/phpmailer/language/phpmailer.lang-sk.php b/thirdparty/phpmailer/language/phpmailer.lang-sk.php similarity index 100% rename from gulliver/thirdparty/phpmailer/language/phpmailer.lang-sk.php rename to thirdparty/phpmailer/language/phpmailer.lang-sk.php diff --git a/gulliver/thirdparty/phpmailer/language/phpmailer.lang-tr.php b/thirdparty/phpmailer/language/phpmailer.lang-tr.php similarity index 100% rename from gulliver/thirdparty/phpmailer/language/phpmailer.lang-tr.php rename to thirdparty/phpmailer/language/phpmailer.lang-tr.php diff --git a/gulliver/thirdparty/phpmailer/language/phpmailer.lang-zh.php b/thirdparty/phpmailer/language/phpmailer.lang-zh.php similarity index 100% rename from gulliver/thirdparty/phpmailer/language/phpmailer.lang-zh.php rename to thirdparty/phpmailer/language/phpmailer.lang-zh.php diff --git a/gulliver/thirdparty/phpmailer/language/phpmailer.lang-zh_cn.php b/thirdparty/phpmailer/language/phpmailer.lang-zh_cn.php similarity index 100% rename from gulliver/thirdparty/phpmailer/language/phpmailer.lang-zh_cn.php rename to thirdparty/phpmailer/language/phpmailer.lang-zh_cn.php diff --git a/gulliver/thirdparty/propel-generator/CHANGELOG b/thirdparty/propel-generator/CHANGELOG similarity index 100% rename from gulliver/thirdparty/propel-generator/CHANGELOG rename to thirdparty/propel-generator/CHANGELOG diff --git a/gulliver/thirdparty/propel-generator/INSTALL b/thirdparty/propel-generator/INSTALL similarity index 100% rename from gulliver/thirdparty/propel-generator/INSTALL rename to thirdparty/propel-generator/INSTALL diff --git a/gulliver/thirdparty/propel-generator/LICENSE b/thirdparty/propel-generator/LICENSE similarity index 100% rename from gulliver/thirdparty/propel-generator/LICENSE rename to thirdparty/propel-generator/LICENSE diff --git a/gulliver/thirdparty/propel-generator/bin/propel-gen b/thirdparty/propel-generator/bin/propel-gen similarity index 100% rename from gulliver/thirdparty/propel-generator/bin/propel-gen rename to thirdparty/propel-generator/bin/propel-gen diff --git a/gulliver/thirdparty/propel-generator/bin/propel-gen.bat b/thirdparty/propel-generator/bin/propel-gen.bat similarity index 100% rename from gulliver/thirdparty/propel-generator/bin/propel-gen.bat rename to thirdparty/propel-generator/bin/propel-gen.bat diff --git a/gulliver/thirdparty/propel-generator/build-propel.xml b/thirdparty/propel-generator/build-propel.xml similarity index 100% rename from gulliver/thirdparty/propel-generator/build-propel.xml rename to thirdparty/propel-generator/build-propel.xml diff --git a/gulliver/thirdparty/propel-generator/build.properties-sample b/thirdparty/propel-generator/build.properties-sample similarity index 100% rename from gulliver/thirdparty/propel-generator/build.properties-sample rename to thirdparty/propel-generator/build.properties-sample diff --git a/gulliver/thirdparty/propel-generator/build.xml b/thirdparty/propel-generator/build.xml similarity index 100% rename from gulliver/thirdparty/propel-generator/build.xml rename to thirdparty/propel-generator/build.xml diff --git a/gulliver/thirdparty/propel-generator/build.xml-local b/thirdparty/propel-generator/build.xml-local similarity index 97% rename from gulliver/thirdparty/propel-generator/build.xml-local rename to thirdparty/propel-generator/build.xml-local index 5fdfe8ea4..d4d4e4c74 100644 --- a/gulliver/thirdparty/propel-generator/build.xml-local +++ b/thirdparty/propel-generator/build.xml-local @@ -1,124 +1,124 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gulliver/thirdparty/propel-generator/classes/propel/engine/EngineException.php b/thirdparty/propel-generator/classes/propel/engine/EngineException.php similarity index 100% rename from gulliver/thirdparty/propel-generator/classes/propel/engine/EngineException.php rename to thirdparty/propel-generator/classes/propel/engine/EngineException.php diff --git a/gulliver/thirdparty/propel-generator/classes/propel/engine/builder/DataModelBuilder.php b/thirdparty/propel-generator/classes/propel/engine/builder/DataModelBuilder.php similarity index 100% rename from gulliver/thirdparty/propel-generator/classes/propel/engine/builder/DataModelBuilder.php rename to thirdparty/propel-generator/classes/propel/engine/builder/DataModelBuilder.php diff --git a/gulliver/thirdparty/propel-generator/classes/propel/engine/builder/om/ClassTools.php b/thirdparty/propel-generator/classes/propel/engine/builder/om/ClassTools.php similarity index 100% rename from gulliver/thirdparty/propel-generator/classes/propel/engine/builder/om/ClassTools.php rename to thirdparty/propel-generator/classes/propel/engine/builder/om/ClassTools.php diff --git a/gulliver/thirdparty/propel-generator/classes/propel/engine/builder/om/OMBuilder.php b/thirdparty/propel-generator/classes/propel/engine/builder/om/OMBuilder.php similarity index 100% rename from gulliver/thirdparty/propel-generator/classes/propel/engine/builder/om/OMBuilder.php rename to thirdparty/propel-generator/classes/propel/engine/builder/om/OMBuilder.php diff --git a/gulliver/thirdparty/propel-generator/classes/propel/engine/builder/om/ObjectBuilder.php b/thirdparty/propel-generator/classes/propel/engine/builder/om/ObjectBuilder.php similarity index 100% rename from gulliver/thirdparty/propel-generator/classes/propel/engine/builder/om/ObjectBuilder.php rename to thirdparty/propel-generator/classes/propel/engine/builder/om/ObjectBuilder.php diff --git a/gulliver/thirdparty/propel-generator/classes/propel/engine/builder/om/PeerBuilder.php b/thirdparty/propel-generator/classes/propel/engine/builder/om/PeerBuilder.php similarity index 100% rename from gulliver/thirdparty/propel-generator/classes/propel/engine/builder/om/PeerBuilder.php rename to thirdparty/propel-generator/classes/propel/engine/builder/om/PeerBuilder.php diff --git a/gulliver/thirdparty/propel-generator/classes/propel/engine/builder/om/php5/PHP5BasicObjectBuilder.php b/thirdparty/propel-generator/classes/propel/engine/builder/om/php5/PHP5BasicObjectBuilder.php similarity index 100% rename from gulliver/thirdparty/propel-generator/classes/propel/engine/builder/om/php5/PHP5BasicObjectBuilder.php rename to thirdparty/propel-generator/classes/propel/engine/builder/om/php5/PHP5BasicObjectBuilder.php diff --git a/gulliver/thirdparty/propel-generator/classes/propel/engine/builder/om/php5/PHP5BasicPeerBuilder.php b/thirdparty/propel-generator/classes/propel/engine/builder/om/php5/PHP5BasicPeerBuilder.php similarity index 100% rename from gulliver/thirdparty/propel-generator/classes/propel/engine/builder/om/php5/PHP5BasicPeerBuilder.php rename to thirdparty/propel-generator/classes/propel/engine/builder/om/php5/PHP5BasicPeerBuilder.php diff --git a/gulliver/thirdparty/propel-generator/classes/propel/engine/builder/om/php5/PHP5ComplexObjectBuilder.php b/thirdparty/propel-generator/classes/propel/engine/builder/om/php5/PHP5ComplexObjectBuilder.php similarity index 100% rename from gulliver/thirdparty/propel-generator/classes/propel/engine/builder/om/php5/PHP5ComplexObjectBuilder.php rename to thirdparty/propel-generator/classes/propel/engine/builder/om/php5/PHP5ComplexObjectBuilder.php diff --git a/gulliver/thirdparty/propel-generator/classes/propel/engine/builder/om/php5/PHP5ComplexPeerBuilder.php b/thirdparty/propel-generator/classes/propel/engine/builder/om/php5/PHP5ComplexPeerBuilder.php similarity index 100% rename from gulliver/thirdparty/propel-generator/classes/propel/engine/builder/om/php5/PHP5ComplexPeerBuilder.php rename to thirdparty/propel-generator/classes/propel/engine/builder/om/php5/PHP5ComplexPeerBuilder.php diff --git a/gulliver/thirdparty/propel-generator/classes/propel/engine/builder/om/php5/PHP5ExtensionNodeBuilder.php b/thirdparty/propel-generator/classes/propel/engine/builder/om/php5/PHP5ExtensionNodeBuilder.php similarity index 100% rename from gulliver/thirdparty/propel-generator/classes/propel/engine/builder/om/php5/PHP5ExtensionNodeBuilder.php rename to thirdparty/propel-generator/classes/propel/engine/builder/om/php5/PHP5ExtensionNodeBuilder.php diff --git a/gulliver/thirdparty/propel-generator/classes/propel/engine/builder/om/php5/PHP5ExtensionNodePeerBuilder.php b/thirdparty/propel-generator/classes/propel/engine/builder/om/php5/PHP5ExtensionNodePeerBuilder.php similarity index 100% rename from gulliver/thirdparty/propel-generator/classes/propel/engine/builder/om/php5/PHP5ExtensionNodePeerBuilder.php rename to thirdparty/propel-generator/classes/propel/engine/builder/om/php5/PHP5ExtensionNodePeerBuilder.php diff --git a/gulliver/thirdparty/propel-generator/classes/propel/engine/builder/om/php5/PHP5ExtensionObjectBuilder.php b/thirdparty/propel-generator/classes/propel/engine/builder/om/php5/PHP5ExtensionObjectBuilder.php similarity index 100% rename from gulliver/thirdparty/propel-generator/classes/propel/engine/builder/om/php5/PHP5ExtensionObjectBuilder.php rename to thirdparty/propel-generator/classes/propel/engine/builder/om/php5/PHP5ExtensionObjectBuilder.php diff --git a/gulliver/thirdparty/propel-generator/classes/propel/engine/builder/om/php5/PHP5ExtensionPeerBuilder.php b/thirdparty/propel-generator/classes/propel/engine/builder/om/php5/PHP5ExtensionPeerBuilder.php similarity index 100% rename from gulliver/thirdparty/propel-generator/classes/propel/engine/builder/om/php5/PHP5ExtensionPeerBuilder.php rename to thirdparty/propel-generator/classes/propel/engine/builder/om/php5/PHP5ExtensionPeerBuilder.php diff --git a/gulliver/thirdparty/propel-generator/classes/propel/engine/builder/om/php5/PHP5InterfaceBuilder.php b/thirdparty/propel-generator/classes/propel/engine/builder/om/php5/PHP5InterfaceBuilder.php similarity index 100% rename from gulliver/thirdparty/propel-generator/classes/propel/engine/builder/om/php5/PHP5InterfaceBuilder.php rename to thirdparty/propel-generator/classes/propel/engine/builder/om/php5/PHP5InterfaceBuilder.php diff --git a/gulliver/thirdparty/propel-generator/classes/propel/engine/builder/om/php5/PHP5MapBuilderBuilder.php b/thirdparty/propel-generator/classes/propel/engine/builder/om/php5/PHP5MapBuilderBuilder.php similarity index 100% rename from gulliver/thirdparty/propel-generator/classes/propel/engine/builder/om/php5/PHP5MapBuilderBuilder.php rename to thirdparty/propel-generator/classes/propel/engine/builder/om/php5/PHP5MapBuilderBuilder.php diff --git a/gulliver/thirdparty/propel-generator/classes/propel/engine/builder/om/php5/PHP5MultiExtendObjectBuilder.php b/thirdparty/propel-generator/classes/propel/engine/builder/om/php5/PHP5MultiExtendObjectBuilder.php similarity index 100% rename from gulliver/thirdparty/propel-generator/classes/propel/engine/builder/om/php5/PHP5MultiExtendObjectBuilder.php rename to thirdparty/propel-generator/classes/propel/engine/builder/om/php5/PHP5MultiExtendObjectBuilder.php diff --git a/gulliver/thirdparty/propel-generator/classes/propel/engine/builder/om/php5/PHP5NodeBuilder.php b/thirdparty/propel-generator/classes/propel/engine/builder/om/php5/PHP5NodeBuilder.php similarity index 100% rename from gulliver/thirdparty/propel-generator/classes/propel/engine/builder/om/php5/PHP5NodeBuilder.php rename to thirdparty/propel-generator/classes/propel/engine/builder/om/php5/PHP5NodeBuilder.php diff --git a/gulliver/thirdparty/propel-generator/classes/propel/engine/builder/om/php5/PHP5NodePeerBuilder.php b/thirdparty/propel-generator/classes/propel/engine/builder/om/php5/PHP5NodePeerBuilder.php similarity index 100% rename from gulliver/thirdparty/propel-generator/classes/propel/engine/builder/om/php5/PHP5NodePeerBuilder.php rename to thirdparty/propel-generator/classes/propel/engine/builder/om/php5/PHP5NodePeerBuilder.php diff --git a/gulliver/thirdparty/propel-generator/classes/propel/engine/builder/sql/DDLBuilder.php b/thirdparty/propel-generator/classes/propel/engine/builder/sql/DDLBuilder.php similarity index 100% rename from gulliver/thirdparty/propel-generator/classes/propel/engine/builder/sql/DDLBuilder.php rename to thirdparty/propel-generator/classes/propel/engine/builder/sql/DDLBuilder.php diff --git a/gulliver/thirdparty/propel-generator/classes/propel/engine/builder/sql/DataSQLBuilder.php b/thirdparty/propel-generator/classes/propel/engine/builder/sql/DataSQLBuilder.php similarity index 100% rename from gulliver/thirdparty/propel-generator/classes/propel/engine/builder/sql/DataSQLBuilder.php rename to thirdparty/propel-generator/classes/propel/engine/builder/sql/DataSQLBuilder.php diff --git a/gulliver/thirdparty/propel-generator/classes/propel/engine/builder/sql/mssql/MssqlDDLBuilder.php b/thirdparty/propel-generator/classes/propel/engine/builder/sql/mssql/MssqlDDLBuilder.php similarity index 100% rename from gulliver/thirdparty/propel-generator/classes/propel/engine/builder/sql/mssql/MssqlDDLBuilder.php rename to thirdparty/propel-generator/classes/propel/engine/builder/sql/mssql/MssqlDDLBuilder.php diff --git a/gulliver/thirdparty/propel-generator/classes/propel/engine/builder/sql/mssql/MssqlDataSQLBuilder.php b/thirdparty/propel-generator/classes/propel/engine/builder/sql/mssql/MssqlDataSQLBuilder.php similarity index 100% rename from gulliver/thirdparty/propel-generator/classes/propel/engine/builder/sql/mssql/MssqlDataSQLBuilder.php rename to thirdparty/propel-generator/classes/propel/engine/builder/sql/mssql/MssqlDataSQLBuilder.php diff --git a/gulliver/thirdparty/propel-generator/classes/propel/engine/builder/sql/mysql/MysqlDDLBuilder.php b/thirdparty/propel-generator/classes/propel/engine/builder/sql/mysql/MysqlDDLBuilder.php similarity index 100% rename from gulliver/thirdparty/propel-generator/classes/propel/engine/builder/sql/mysql/MysqlDDLBuilder.php rename to thirdparty/propel-generator/classes/propel/engine/builder/sql/mysql/MysqlDDLBuilder.php diff --git a/gulliver/thirdparty/propel-generator/classes/propel/engine/builder/sql/mysql/MysqlDataSQLBuilder.php b/thirdparty/propel-generator/classes/propel/engine/builder/sql/mysql/MysqlDataSQLBuilder.php similarity index 100% rename from gulliver/thirdparty/propel-generator/classes/propel/engine/builder/sql/mysql/MysqlDataSQLBuilder.php rename to thirdparty/propel-generator/classes/propel/engine/builder/sql/mysql/MysqlDataSQLBuilder.php diff --git a/gulliver/thirdparty/propel-generator/classes/propel/engine/builder/sql/mysqli/MysqliDDLBuilder.php b/thirdparty/propel-generator/classes/propel/engine/builder/sql/mysqli/MysqliDDLBuilder.php similarity index 100% rename from gulliver/thirdparty/propel-generator/classes/propel/engine/builder/sql/mysqli/MysqliDDLBuilder.php rename to thirdparty/propel-generator/classes/propel/engine/builder/sql/mysqli/MysqliDDLBuilder.php diff --git a/gulliver/thirdparty/propel-generator/classes/propel/engine/builder/sql/mysqli/MysqliDataSQLBuilder.php b/thirdparty/propel-generator/classes/propel/engine/builder/sql/mysqli/MysqliDataSQLBuilder.php similarity index 100% rename from gulliver/thirdparty/propel-generator/classes/propel/engine/builder/sql/mysqli/MysqliDataSQLBuilder.php rename to thirdparty/propel-generator/classes/propel/engine/builder/sql/mysqli/MysqliDataSQLBuilder.php diff --git a/gulliver/thirdparty/propel-generator/classes/propel/engine/builder/sql/oracle/OracleDDLBuilder.php b/thirdparty/propel-generator/classes/propel/engine/builder/sql/oracle/OracleDDLBuilder.php similarity index 100% rename from gulliver/thirdparty/propel-generator/classes/propel/engine/builder/sql/oracle/OracleDDLBuilder.php rename to thirdparty/propel-generator/classes/propel/engine/builder/sql/oracle/OracleDDLBuilder.php diff --git a/gulliver/thirdparty/propel-generator/classes/propel/engine/builder/sql/oracle/OracleDataSQLBuilder.php b/thirdparty/propel-generator/classes/propel/engine/builder/sql/oracle/OracleDataSQLBuilder.php similarity index 100% rename from gulliver/thirdparty/propel-generator/classes/propel/engine/builder/sql/oracle/OracleDataSQLBuilder.php rename to thirdparty/propel-generator/classes/propel/engine/builder/sql/oracle/OracleDataSQLBuilder.php diff --git a/gulliver/thirdparty/propel-generator/classes/propel/engine/builder/sql/pgsql/PgsqlDDLBuilder.php b/thirdparty/propel-generator/classes/propel/engine/builder/sql/pgsql/PgsqlDDLBuilder.php similarity index 100% rename from gulliver/thirdparty/propel-generator/classes/propel/engine/builder/sql/pgsql/PgsqlDDLBuilder.php rename to thirdparty/propel-generator/classes/propel/engine/builder/sql/pgsql/PgsqlDDLBuilder.php diff --git a/gulliver/thirdparty/propel-generator/classes/propel/engine/builder/sql/pgsql/PgsqlDataSQLBuilder.php b/thirdparty/propel-generator/classes/propel/engine/builder/sql/pgsql/PgsqlDataSQLBuilder.php similarity index 100% rename from gulliver/thirdparty/propel-generator/classes/propel/engine/builder/sql/pgsql/PgsqlDataSQLBuilder.php rename to thirdparty/propel-generator/classes/propel/engine/builder/sql/pgsql/PgsqlDataSQLBuilder.php diff --git a/gulliver/thirdparty/propel-generator/classes/propel/engine/builder/sql/sqlite/SqliteDDLBuilder.php b/thirdparty/propel-generator/classes/propel/engine/builder/sql/sqlite/SqliteDDLBuilder.php similarity index 100% rename from gulliver/thirdparty/propel-generator/classes/propel/engine/builder/sql/sqlite/SqliteDDLBuilder.php rename to thirdparty/propel-generator/classes/propel/engine/builder/sql/sqlite/SqliteDDLBuilder.php diff --git a/gulliver/thirdparty/propel-generator/classes/propel/engine/builder/sql/sqlite/SqliteDataSQLBuilder.php b/thirdparty/propel-generator/classes/propel/engine/builder/sql/sqlite/SqliteDataSQLBuilder.php similarity index 100% rename from gulliver/thirdparty/propel-generator/classes/propel/engine/builder/sql/sqlite/SqliteDataSQLBuilder.php rename to thirdparty/propel-generator/classes/propel/engine/builder/sql/sqlite/SqliteDataSQLBuilder.php diff --git a/gulliver/thirdparty/propel-generator/classes/propel/engine/database/model/AppData.php b/thirdparty/propel-generator/classes/propel/engine/database/model/AppData.php similarity index 100% rename from gulliver/thirdparty/propel-generator/classes/propel/engine/database/model/AppData.php rename to thirdparty/propel-generator/classes/propel/engine/database/model/AppData.php diff --git a/gulliver/thirdparty/propel-generator/classes/propel/engine/database/model/Column.php b/thirdparty/propel-generator/classes/propel/engine/database/model/Column.php similarity index 100% rename from gulliver/thirdparty/propel-generator/classes/propel/engine/database/model/Column.php rename to thirdparty/propel-generator/classes/propel/engine/database/model/Column.php diff --git a/gulliver/thirdparty/propel-generator/classes/propel/engine/database/model/ConstraintNameGenerator.php b/thirdparty/propel-generator/classes/propel/engine/database/model/ConstraintNameGenerator.php similarity index 100% rename from gulliver/thirdparty/propel-generator/classes/propel/engine/database/model/ConstraintNameGenerator.php rename to thirdparty/propel-generator/classes/propel/engine/database/model/ConstraintNameGenerator.php diff --git a/gulliver/thirdparty/propel-generator/classes/propel/engine/database/model/Database.php b/thirdparty/propel-generator/classes/propel/engine/database/model/Database.php similarity index 99% rename from gulliver/thirdparty/propel-generator/classes/propel/engine/database/model/Database.php rename to thirdparty/propel-generator/classes/propel/engine/database/model/Database.php index 7fe778f67..e40010daf 100644 --- a/gulliver/thirdparty/propel-generator/classes/propel/engine/database/model/Database.php +++ b/thirdparty/propel-generator/classes/propel/engine/database/model/Database.php @@ -279,9 +279,9 @@ class Database extends XMLElement { { if ($data instanceof Table) { $tbl = $data; // alias - $tbl->setDatabase($this); - if (isset($this->tablesByName[$tbl->getName()])) { - throw new EngineException("Duplicate table declared: " . $tbl->getName()); + $tbl->setDatabase($this); + if (isset($this->tablesByName[$tbl->getName()])) { + throw new EngineException("Duplicate table declared: " . $tbl->getName()); } $this->tableList[] = $tbl; $this->tablesByName[ $tbl->getName() ] = $tbl; diff --git a/gulliver/thirdparty/propel-generator/classes/propel/engine/database/model/DatabasePropel.php b/thirdparty/propel-generator/classes/propel/engine/database/model/DatabasePropel.php similarity index 100% rename from gulliver/thirdparty/propel-generator/classes/propel/engine/database/model/DatabasePropel.php rename to thirdparty/propel-generator/classes/propel/engine/database/model/DatabasePropel.php diff --git a/gulliver/thirdparty/propel-generator/classes/propel/engine/database/model/Domain.php b/thirdparty/propel-generator/classes/propel/engine/database/model/Domain.php similarity index 100% rename from gulliver/thirdparty/propel-generator/classes/propel/engine/database/model/Domain.php rename to thirdparty/propel-generator/classes/propel/engine/database/model/Domain.php diff --git a/gulliver/thirdparty/propel-generator/classes/propel/engine/database/model/ForeignKey.php b/thirdparty/propel-generator/classes/propel/engine/database/model/ForeignKey.php similarity index 100% rename from gulliver/thirdparty/propel-generator/classes/propel/engine/database/model/ForeignKey.php rename to thirdparty/propel-generator/classes/propel/engine/database/model/ForeignKey.php diff --git a/gulliver/thirdparty/propel-generator/classes/propel/engine/database/model/IDMethod.php b/thirdparty/propel-generator/classes/propel/engine/database/model/IDMethod.php similarity index 100% rename from gulliver/thirdparty/propel-generator/classes/propel/engine/database/model/IDMethod.php rename to thirdparty/propel-generator/classes/propel/engine/database/model/IDMethod.php diff --git a/gulliver/thirdparty/propel-generator/classes/propel/engine/database/model/IdMethodParameter.php b/thirdparty/propel-generator/classes/propel/engine/database/model/IdMethodParameter.php similarity index 100% rename from gulliver/thirdparty/propel-generator/classes/propel/engine/database/model/IdMethodParameter.php rename to thirdparty/propel-generator/classes/propel/engine/database/model/IdMethodParameter.php diff --git a/gulliver/thirdparty/propel-generator/classes/propel/engine/database/model/Index.php b/thirdparty/propel-generator/classes/propel/engine/database/model/Index.php similarity index 100% rename from gulliver/thirdparty/propel-generator/classes/propel/engine/database/model/Index.php rename to thirdparty/propel-generator/classes/propel/engine/database/model/Index.php diff --git a/gulliver/thirdparty/propel-generator/classes/propel/engine/database/model/Inheritance.php b/thirdparty/propel-generator/classes/propel/engine/database/model/Inheritance.php similarity index 100% rename from gulliver/thirdparty/propel-generator/classes/propel/engine/database/model/Inheritance.php rename to thirdparty/propel-generator/classes/propel/engine/database/model/Inheritance.php diff --git a/gulliver/thirdparty/propel-generator/classes/propel/engine/database/model/NameFactory.php b/thirdparty/propel-generator/classes/propel/engine/database/model/NameFactory.php similarity index 100% rename from gulliver/thirdparty/propel-generator/classes/propel/engine/database/model/NameFactory.php rename to thirdparty/propel-generator/classes/propel/engine/database/model/NameFactory.php diff --git a/gulliver/thirdparty/propel-generator/classes/propel/engine/database/model/NameGenerator.php b/thirdparty/propel-generator/classes/propel/engine/database/model/NameGenerator.php similarity index 100% rename from gulliver/thirdparty/propel-generator/classes/propel/engine/database/model/NameGenerator.php rename to thirdparty/propel-generator/classes/propel/engine/database/model/NameGenerator.php diff --git a/gulliver/thirdparty/propel-generator/classes/propel/engine/database/model/PhpNameGenerator.php b/thirdparty/propel-generator/classes/propel/engine/database/model/PhpNameGenerator.php similarity index 100% rename from gulliver/thirdparty/propel-generator/classes/propel/engine/database/model/PhpNameGenerator.php rename to thirdparty/propel-generator/classes/propel/engine/database/model/PhpNameGenerator.php diff --git a/gulliver/thirdparty/propel-generator/classes/propel/engine/database/model/PropelTypes.php b/thirdparty/propel-generator/classes/propel/engine/database/model/PropelTypes.php similarity index 100% rename from gulliver/thirdparty/propel-generator/classes/propel/engine/database/model/PropelTypes.php rename to thirdparty/propel-generator/classes/propel/engine/database/model/PropelTypes.php diff --git a/gulliver/thirdparty/propel-generator/classes/propel/engine/database/model/Rule.php b/thirdparty/propel-generator/classes/propel/engine/database/model/Rule.php similarity index 100% rename from gulliver/thirdparty/propel-generator/classes/propel/engine/database/model/Rule.php rename to thirdparty/propel-generator/classes/propel/engine/database/model/Rule.php diff --git a/gulliver/thirdparty/propel-generator/classes/propel/engine/database/model/Table.php b/thirdparty/propel-generator/classes/propel/engine/database/model/Table.php similarity index 100% rename from gulliver/thirdparty/propel-generator/classes/propel/engine/database/model/Table.php rename to thirdparty/propel-generator/classes/propel/engine/database/model/Table.php diff --git a/gulliver/thirdparty/propel-generator/classes/propel/engine/database/model/Unique.php b/thirdparty/propel-generator/classes/propel/engine/database/model/Unique.php similarity index 100% rename from gulliver/thirdparty/propel-generator/classes/propel/engine/database/model/Unique.php rename to thirdparty/propel-generator/classes/propel/engine/database/model/Unique.php diff --git a/gulliver/thirdparty/propel-generator/classes/propel/engine/database/model/Validator.php b/thirdparty/propel-generator/classes/propel/engine/database/model/Validator.php similarity index 100% rename from gulliver/thirdparty/propel-generator/classes/propel/engine/database/model/Validator.php rename to thirdparty/propel-generator/classes/propel/engine/database/model/Validator.php diff --git a/gulliver/thirdparty/propel-generator/classes/propel/engine/database/model/XMLElement.php b/thirdparty/propel-generator/classes/propel/engine/database/model/XMLElement.php similarity index 100% rename from gulliver/thirdparty/propel-generator/classes/propel/engine/database/model/XMLElement.php rename to thirdparty/propel-generator/classes/propel/engine/database/model/XMLElement.php diff --git a/gulliver/thirdparty/propel-generator/classes/propel/engine/database/transform/XmlToAppData.php b/thirdparty/propel-generator/classes/propel/engine/database/transform/XmlToAppData.php similarity index 100% rename from gulliver/thirdparty/propel-generator/classes/propel/engine/database/transform/XmlToAppData.php rename to thirdparty/propel-generator/classes/propel/engine/database/transform/XmlToAppData.php diff --git a/gulliver/thirdparty/propel-generator/classes/propel/engine/database/transform/XmlToData.php b/thirdparty/propel-generator/classes/propel/engine/database/transform/XmlToData.php similarity index 100% rename from gulliver/thirdparty/propel-generator/classes/propel/engine/database/transform/XmlToData.php rename to thirdparty/propel-generator/classes/propel/engine/database/transform/XmlToData.php diff --git a/gulliver/thirdparty/propel-generator/classes/propel/engine/platform/DefaultPlatform.php b/thirdparty/propel-generator/classes/propel/engine/platform/DefaultPlatform.php similarity index 100% rename from gulliver/thirdparty/propel-generator/classes/propel/engine/platform/DefaultPlatform.php rename to thirdparty/propel-generator/classes/propel/engine/platform/DefaultPlatform.php diff --git a/gulliver/thirdparty/propel-generator/classes/propel/engine/platform/MssqlPlatform.php b/thirdparty/propel-generator/classes/propel/engine/platform/MssqlPlatform.php similarity index 100% rename from gulliver/thirdparty/propel-generator/classes/propel/engine/platform/MssqlPlatform.php rename to thirdparty/propel-generator/classes/propel/engine/platform/MssqlPlatform.php diff --git a/gulliver/thirdparty/propel-generator/classes/propel/engine/platform/MysqlPlatform.php b/thirdparty/propel-generator/classes/propel/engine/platform/MysqlPlatform.php similarity index 100% rename from gulliver/thirdparty/propel-generator/classes/propel/engine/platform/MysqlPlatform.php rename to thirdparty/propel-generator/classes/propel/engine/platform/MysqlPlatform.php diff --git a/gulliver/thirdparty/propel-generator/classes/propel/engine/platform/MysqliPlatform.php b/thirdparty/propel-generator/classes/propel/engine/platform/MysqliPlatform.php similarity index 100% rename from gulliver/thirdparty/propel-generator/classes/propel/engine/platform/MysqliPlatform.php rename to thirdparty/propel-generator/classes/propel/engine/platform/MysqliPlatform.php diff --git a/gulliver/thirdparty/propel-generator/classes/propel/engine/platform/OraclePlatform.php b/thirdparty/propel-generator/classes/propel/engine/platform/OraclePlatform.php similarity index 100% rename from gulliver/thirdparty/propel-generator/classes/propel/engine/platform/OraclePlatform.php rename to thirdparty/propel-generator/classes/propel/engine/platform/OraclePlatform.php diff --git a/gulliver/thirdparty/propel-generator/classes/propel/engine/platform/PgsqlPlatform.php b/thirdparty/propel-generator/classes/propel/engine/platform/PgsqlPlatform.php similarity index 100% rename from gulliver/thirdparty/propel-generator/classes/propel/engine/platform/PgsqlPlatform.php rename to thirdparty/propel-generator/classes/propel/engine/platform/PgsqlPlatform.php diff --git a/gulliver/thirdparty/propel-generator/classes/propel/engine/platform/Platform.php b/thirdparty/propel-generator/classes/propel/engine/platform/Platform.php similarity index 100% rename from gulliver/thirdparty/propel-generator/classes/propel/engine/platform/Platform.php rename to thirdparty/propel-generator/classes/propel/engine/platform/Platform.php diff --git a/gulliver/thirdparty/propel-generator/classes/propel/engine/platform/SqlitePlatform.php b/thirdparty/propel-generator/classes/propel/engine/platform/SqlitePlatform.php similarity index 100% rename from gulliver/thirdparty/propel-generator/classes/propel/engine/platform/SqlitePlatform.php rename to thirdparty/propel-generator/classes/propel/engine/platform/SqlitePlatform.php diff --git a/gulliver/thirdparty/propel-generator/classes/propel/phing/AbstractPropelDataModelTask.php b/thirdparty/propel-generator/classes/propel/phing/AbstractPropelDataModelTask.php similarity index 100% rename from gulliver/thirdparty/propel-generator/classes/propel/phing/AbstractPropelDataModelTask.php rename to thirdparty/propel-generator/classes/propel/phing/AbstractPropelDataModelTask.php diff --git a/gulliver/thirdparty/propel-generator/classes/propel/phing/PropelCreoleTransformTask.php b/thirdparty/propel-generator/classes/propel/phing/PropelCreoleTransformTask.php similarity index 100% rename from gulliver/thirdparty/propel-generator/classes/propel/phing/PropelCreoleTransformTask.php rename to thirdparty/propel-generator/classes/propel/phing/PropelCreoleTransformTask.php diff --git a/gulliver/thirdparty/propel-generator/classes/propel/phing/PropelDataDTDTask.php b/thirdparty/propel-generator/classes/propel/phing/PropelDataDTDTask.php similarity index 100% rename from gulliver/thirdparty/propel-generator/classes/propel/phing/PropelDataDTDTask.php rename to thirdparty/propel-generator/classes/propel/phing/PropelDataDTDTask.php diff --git a/gulliver/thirdparty/propel-generator/classes/propel/phing/PropelDataDumpTask.php b/thirdparty/propel-generator/classes/propel/phing/PropelDataDumpTask.php similarity index 100% rename from gulliver/thirdparty/propel-generator/classes/propel/phing/PropelDataDumpTask.php rename to thirdparty/propel-generator/classes/propel/phing/PropelDataDumpTask.php diff --git a/gulliver/thirdparty/propel-generator/classes/propel/phing/PropelDataModelTask.php b/thirdparty/propel-generator/classes/propel/phing/PropelDataModelTask.php similarity index 100% rename from gulliver/thirdparty/propel-generator/classes/propel/phing/PropelDataModelTask.php rename to thirdparty/propel-generator/classes/propel/phing/PropelDataModelTask.php diff --git a/gulliver/thirdparty/propel-generator/classes/propel/phing/PropelDataSQLTask.php b/thirdparty/propel-generator/classes/propel/phing/PropelDataSQLTask.php similarity index 100% rename from gulliver/thirdparty/propel-generator/classes/propel/phing/PropelDataSQLTask.php rename to thirdparty/propel-generator/classes/propel/phing/PropelDataSQLTask.php diff --git a/gulliver/thirdparty/propel-generator/classes/propel/phing/PropelGraphvizTask.php b/thirdparty/propel-generator/classes/propel/phing/PropelGraphvizTask.php similarity index 100% rename from gulliver/thirdparty/propel-generator/classes/propel/phing/PropelGraphvizTask.php rename to thirdparty/propel-generator/classes/propel/phing/PropelGraphvizTask.php diff --git a/gulliver/thirdparty/propel-generator/classes/propel/phing/PropelOMTask.php b/thirdparty/propel-generator/classes/propel/phing/PropelOMTask.php similarity index 100% rename from gulliver/thirdparty/propel-generator/classes/propel/phing/PropelOMTask.php rename to thirdparty/propel-generator/classes/propel/phing/PropelOMTask.php diff --git a/gulliver/thirdparty/propel-generator/classes/propel/phing/PropelOldOMTask.php b/thirdparty/propel-generator/classes/propel/phing/PropelOldOMTask.php similarity index 100% rename from gulliver/thirdparty/propel-generator/classes/propel/phing/PropelOldOMTask.php rename to thirdparty/propel-generator/classes/propel/phing/PropelOldOMTask.php diff --git a/gulliver/thirdparty/propel-generator/classes/propel/phing/PropelOldSQLTask.php b/thirdparty/propel-generator/classes/propel/phing/PropelOldSQLTask.php similarity index 100% rename from gulliver/thirdparty/propel-generator/classes/propel/phing/PropelOldSQLTask.php rename to thirdparty/propel-generator/classes/propel/phing/PropelOldSQLTask.php diff --git a/gulliver/thirdparty/propel-generator/classes/propel/phing/PropelSQLExec.php b/thirdparty/propel-generator/classes/propel/phing/PropelSQLExec.php similarity index 100% rename from gulliver/thirdparty/propel-generator/classes/propel/phing/PropelSQLExec.php rename to thirdparty/propel-generator/classes/propel/phing/PropelSQLExec.php diff --git a/gulliver/thirdparty/propel-generator/classes/propel/phing/PropelSQLTask.php b/thirdparty/propel-generator/classes/propel/phing/PropelSQLTask.php similarity index 100% rename from gulliver/thirdparty/propel-generator/classes/propel/phing/PropelSQLTask.php rename to thirdparty/propel-generator/classes/propel/phing/PropelSQLTask.php diff --git a/gulliver/thirdparty/propel-generator/default.properties b/thirdparty/propel-generator/default.properties similarity index 100% rename from gulliver/thirdparty/propel-generator/default.properties rename to thirdparty/propel-generator/default.properties diff --git a/gulliver/thirdparty/propel-generator/pear/BuildPropelGenPEARPackageTask.php b/thirdparty/propel-generator/pear/BuildPropelGenPEARPackageTask.php similarity index 100% rename from gulliver/thirdparty/propel-generator/pear/BuildPropelGenPEARPackageTask.php rename to thirdparty/propel-generator/pear/BuildPropelGenPEARPackageTask.php diff --git a/gulliver/thirdparty/propel-generator/pear/build-pear-package.xml b/thirdparty/propel-generator/pear/build-pear-package.xml similarity index 100% rename from gulliver/thirdparty/propel-generator/pear/build-pear-package.xml rename to thirdparty/propel-generator/pear/build-pear-package.xml diff --git a/gulliver/thirdparty/propel-generator/pear/build.properties b/thirdparty/propel-generator/pear/build.properties similarity index 100% rename from gulliver/thirdparty/propel-generator/pear/build.properties rename to thirdparty/propel-generator/pear/build.properties diff --git a/gulliver/thirdparty/propel-generator/pear/pear-build.xml b/thirdparty/propel-generator/pear/pear-build.xml similarity index 100% rename from gulliver/thirdparty/propel-generator/pear/pear-build.xml rename to thirdparty/propel-generator/pear/pear-build.xml diff --git a/gulliver/thirdparty/propel-generator/pear/pear-propel-gen b/thirdparty/propel-generator/pear/pear-propel-gen similarity index 97% rename from gulliver/thirdparty/propel-generator/pear/pear-propel-gen rename to thirdparty/propel-generator/pear/pear-propel-gen index 160f9e93f..c32a947ec 100644 --- a/gulliver/thirdparty/propel-generator/pear/pear-propel-gen +++ b/thirdparty/propel-generator/pear/pear-propel-gen @@ -1,21 +1,21 @@ -#!/bin/sh - -# ------------------------------------------------------------------------ -# The phing build script for Unix based systems -# $Id: pear-propel-gen,v 1.2 2004/10/17 13:24:09 hlellelid Exp $ -# ------------------------------------------------------------------------ - -# Change this to reflect your environment if the default value doesn't work -export PHING_COMMAND="phing" - -# ------------------------------------------------------------------------- -# Do not change anything below this line unless you know what you're doing. -# ------------------------------------------------------------------------- - -# (currently this is not reached) -if (test -z "$PHING_COMMAND") ; then - echo "WARNING: PHP_COMMAND environment not set. (Assuming phing on PATH)" - export PHING_COMMAND=php -fi - -$PHING_COMMAND -f @DATA-DIR@/propel_generator/pear-build.xml -Dproject.dir=$* +#!/bin/sh + +# ------------------------------------------------------------------------ +# The phing build script for Unix based systems +# $Id: pear-propel-gen,v 1.2 2004/10/17 13:24:09 hlellelid Exp $ +# ------------------------------------------------------------------------ + +# Change this to reflect your environment if the default value doesn't work +export PHING_COMMAND="phing" + +# ------------------------------------------------------------------------- +# Do not change anything below this line unless you know what you're doing. +# ------------------------------------------------------------------------- + +# (currently this is not reached) +if (test -z "$PHING_COMMAND") ; then + echo "WARNING: PHP_COMMAND environment not set. (Assuming phing on PATH)" + export PHING_COMMAND=php +fi + +$PHING_COMMAND -f @DATA-DIR@/propel_generator/pear-build.xml -Dproject.dir=$* diff --git a/gulliver/thirdparty/propel-generator/pear/pear-propel-gen.bat b/thirdparty/propel-generator/pear/pear-propel-gen.bat similarity index 97% rename from gulliver/thirdparty/propel-generator/pear/pear-propel-gen.bat rename to thirdparty/propel-generator/pear/pear-propel-gen.bat index a6ccd430f..e8fb47f9c 100644 --- a/gulliver/thirdparty/propel-generator/pear/pear-propel-gen.bat +++ b/thirdparty/propel-generator/pear/pear-propel-gen.bat @@ -1,24 +1,24 @@ -@ECHO OFF - -::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: -:: The propel-gen build script for Windows based systems -:: $Id: pear-propel-gen.bat,v 1.2 2004/10/17 13:24:09 hlellelid Exp $ -::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: - -::---------------------------------------------------------------------------------- -:: Please set following to the "phing" script. By default this is expected to be -:: on your path. (You don't need to modify this file if that is the case.) - - SET phingScript=phing - -::--------------------------------------------------------------------------------- -::--------------------------------------------------------------------------------- -:: Do not modify below this line!! (Unless you know what your doing :) -::--------------------------------------------------------------------------------- -::--------------------------------------------------------------------------------- - -"%phingScript%" -f @DATA-DIR@\propel_generator\pear-build.xml -Dproject.dir=%* -GOTO :EOF - -:PAUSE_END +@ECHO OFF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: The propel-gen build script for Windows based systems +:: $Id: pear-propel-gen.bat,v 1.2 2004/10/17 13:24:09 hlellelid Exp $ +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +::---------------------------------------------------------------------------------- +:: Please set following to the "phing" script. By default this is expected to be +:: on your path. (You don't need to modify this file if that is the case.) + + SET phingScript=phing + +::--------------------------------------------------------------------------------- +::--------------------------------------------------------------------------------- +:: Do not modify below this line!! (Unless you know what your doing :) +::--------------------------------------------------------------------------------- +::--------------------------------------------------------------------------------- + +"%phingScript%" -f @DATA-DIR@\propel_generator\pear-build.xml -Dproject.dir=%* +GOTO :EOF + +:PAUSE_END PAUSE \ No newline at end of file diff --git a/gulliver/thirdparty/propel-generator/resources/dtd/database.dtd b/thirdparty/propel-generator/resources/dtd/database.dtd similarity index 96% rename from gulliver/thirdparty/propel-generator/resources/dtd/database.dtd rename to thirdparty/propel-generator/resources/dtd/database.dtd index f2daa5853..b384f75d6 100644 --- a/gulliver/thirdparty/propel-generator/resources/dtd/database.dtd +++ b/thirdparty/propel-generator/resources/dtd/database.dtd @@ -1,164 +1,164 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gulliver/thirdparty/propel-generator/resources/xsd/custom_datatypes.xsd b/thirdparty/propel-generator/resources/xsd/custom_datatypes.xsd similarity index 100% rename from gulliver/thirdparty/propel-generator/resources/xsd/custom_datatypes.xsd rename to thirdparty/propel-generator/resources/xsd/custom_datatypes.xsd diff --git a/gulliver/thirdparty/propel-generator/resources/xsd/database.xsd b/thirdparty/propel-generator/resources/xsd/database.xsd similarity index 100% rename from gulliver/thirdparty/propel-generator/resources/xsd/database.xsd rename to thirdparty/propel-generator/resources/xsd/database.xsd diff --git a/gulliver/thirdparty/propel-generator/resources/xsl/database.xsl b/thirdparty/propel-generator/resources/xsl/database.xsl similarity index 100% rename from gulliver/thirdparty/propel-generator/resources/xsl/database.xsl rename to thirdparty/propel-generator/resources/xsl/database.xsl diff --git a/gulliver/thirdparty/propel-generator/templates/README b/thirdparty/propel-generator/templates/README similarity index 98% rename from gulliver/thirdparty/propel-generator/templates/README rename to thirdparty/propel-generator/templates/README index e0bf81d94..8a2937dec 100644 --- a/gulliver/thirdparty/propel-generator/templates/README +++ b/thirdparty/propel-generator/templates/README @@ -1,5 +1,5 @@ -This directory contains PHP templates which are used to build SQL files and object -model (OM) classes. The PHP templates are called from the -propel.phing.PropelDataModelTask class. The templates are managed by the Capsule -engine, which simply provides a mechanism for placing values in the template context +This directory contains PHP templates which are used to build SQL files and object +model (OM) classes. The PHP templates are called from the +propel.phing.PropelDataModelTask class. The templates are managed by the Capsule +engine, which simply provides a mechanism for placing values in the template context and buffering output, etc. \ No newline at end of file diff --git a/gulliver/thirdparty/propel-generator/templates/conf/Control.tpl b/thirdparty/propel-generator/templates/conf/Control.tpl similarity index 100% rename from gulliver/thirdparty/propel-generator/templates/conf/Control.tpl rename to thirdparty/propel-generator/templates/conf/Control.tpl diff --git a/gulliver/thirdparty/propel-generator/templates/conf/xml.tpl b/thirdparty/propel-generator/templates/conf/xml.tpl similarity index 100% rename from gulliver/thirdparty/propel-generator/templates/conf/xml.tpl rename to thirdparty/propel-generator/templates/conf/xml.tpl diff --git a/gulliver/thirdparty/propel-generator/templates/data/dtd/dataset.tpl b/thirdparty/propel-generator/templates/data/dtd/dataset.tpl similarity index 93% rename from gulliver/thirdparty/propel-generator/templates/data/dtd/dataset.tpl rename to thirdparty/propel-generator/templates/data/dtd/dataset.tpl index e1969d279..877deede5 100644 --- a/gulliver/thirdparty/propel-generator/templates/data/dtd/dataset.tpl +++ b/thirdparty/propel-generator/templates/data/dtd/dataset.tpl @@ -1,13 +1,13 @@ -getPhpName() ?>* -)> - - +getPhpName() ?>* +)> + + diff --git a/gulliver/thirdparty/propel-generator/templates/data/dtd/table.tpl b/thirdparty/propel-generator/templates/data/dtd/table.tpl similarity index 97% rename from gulliver/thirdparty/propel-generator/templates/data/dtd/table.tpl rename to thirdparty/propel-generator/templates/data/dtd/table.tpl index 941257571..71e3bb171 100644 --- a/gulliver/thirdparty/propel-generator/templates/data/dtd/table.tpl +++ b/thirdparty/propel-generator/templates/data/dtd/table.tpl @@ -1,6 +1,6 @@ -getPhpName() ?> EMPTY> -getPhpName() ?> -getColumns() as $col) { ?> - getPhpName() ?> CDATA isNotNull()) { ?>#REQUIREDIMPLIED -> - +getPhpName() ?> EMPTY> +getPhpName() ?> +getColumns() as $col) { ?> + getPhpName() ?> CDATA isNotNull()) { ?>#REQUIREDIMPLIED +> + diff --git a/gulliver/thirdparty/propel-generator/templates/data/dump/bottom.tpl b/thirdparty/propel-generator/templates/data/dump/bottom.tpl similarity index 100% rename from gulliver/thirdparty/propel-generator/templates/data/dump/bottom.tpl rename to thirdparty/propel-generator/templates/data/dump/bottom.tpl diff --git a/gulliver/thirdparty/propel-generator/templates/data/dump/row.tpl b/thirdparty/propel-generator/templates/data/dump/row.tpl similarity index 100% rename from gulliver/thirdparty/propel-generator/templates/data/dump/row.tpl rename to thirdparty/propel-generator/templates/data/dump/row.tpl diff --git a/gulliver/thirdparty/propel-generator/templates/data/dump/top.tpl b/thirdparty/propel-generator/templates/data/dump/top.tpl similarity index 100% rename from gulliver/thirdparty/propel-generator/templates/data/dump/top.tpl rename to thirdparty/propel-generator/templates/data/dump/top.tpl diff --git a/gulliver/thirdparty/propel-generator/templates/om/php4/ExtensionNode.tpl b/thirdparty/propel-generator/templates/om/php4/ExtensionNode.tpl similarity index 100% rename from gulliver/thirdparty/propel-generator/templates/om/php4/ExtensionNode.tpl rename to thirdparty/propel-generator/templates/om/php4/ExtensionNode.tpl diff --git a/gulliver/thirdparty/propel-generator/templates/om/php4/ExtensionNodePeer.tpl b/thirdparty/propel-generator/templates/om/php4/ExtensionNodePeer.tpl similarity index 100% rename from gulliver/thirdparty/propel-generator/templates/om/php4/ExtensionNodePeer.tpl rename to thirdparty/propel-generator/templates/om/php4/ExtensionNodePeer.tpl diff --git a/gulliver/thirdparty/propel-generator/templates/om/php4/ExtensionObject.tpl b/thirdparty/propel-generator/templates/om/php4/ExtensionObject.tpl similarity index 100% rename from gulliver/thirdparty/propel-generator/templates/om/php4/ExtensionObject.tpl rename to thirdparty/propel-generator/templates/om/php4/ExtensionObject.tpl diff --git a/gulliver/thirdparty/propel-generator/templates/om/php4/ExtensionPeer.tpl b/thirdparty/propel-generator/templates/om/php4/ExtensionPeer.tpl similarity index 100% rename from gulliver/thirdparty/propel-generator/templates/om/php4/ExtensionPeer.tpl rename to thirdparty/propel-generator/templates/om/php4/ExtensionPeer.tpl diff --git a/gulliver/thirdparty/propel-generator/templates/om/php4/Interface.tpl b/thirdparty/propel-generator/templates/om/php4/Interface.tpl similarity index 100% rename from gulliver/thirdparty/propel-generator/templates/om/php4/Interface.tpl rename to thirdparty/propel-generator/templates/om/php4/Interface.tpl diff --git a/gulliver/thirdparty/propel-generator/templates/om/php4/MapBuilder.tpl b/thirdparty/propel-generator/templates/om/php4/MapBuilder.tpl similarity index 100% rename from gulliver/thirdparty/propel-generator/templates/om/php4/MapBuilder.tpl rename to thirdparty/propel-generator/templates/om/php4/MapBuilder.tpl diff --git a/gulliver/thirdparty/propel-generator/templates/om/php4/MultiExtendObject.tpl b/thirdparty/propel-generator/templates/om/php4/MultiExtendObject.tpl similarity index 100% rename from gulliver/thirdparty/propel-generator/templates/om/php4/MultiExtendObject.tpl rename to thirdparty/propel-generator/templates/om/php4/MultiExtendObject.tpl diff --git a/gulliver/thirdparty/propel-generator/templates/om/php4/Node.tpl b/thirdparty/propel-generator/templates/om/php4/Node.tpl similarity index 99% rename from gulliver/thirdparty/propel-generator/templates/om/php4/Node.tpl rename to thirdparty/propel-generator/templates/om/php4/Node.tpl index 64beaff2b..d2e192457 100644 --- a/gulliver/thirdparty/propel-generator/templates/om/php4/Node.tpl +++ b/thirdparty/propel-generator/templates/om/php4/Node.tpl @@ -283,7 +283,7 @@ class getPhpName() ?>Node /*implements Iterator } else if ($querydb) { - $db =& Propel::getDb(getPhpName() ?>Peer::DATABASE_NAME()); + $db =& Propel::getDb(getPhpName() ?>Peer::DATABASE_NAME()); $criteria =& new Criteria(getPhpName() ?>Peer::DATABASE_NAME()); $criteria->add(getPhpName() ?>NodePeer::NPATH_COLNAME(), $this->getNodePath() . getPhpName() ?>NodePeer::NPATH_SEP() . '%', @@ -291,8 +291,8 @@ class getPhpName() ?>Node /*implements Iterator $criteria->addAnd(getPhpName() ?>NodePeer::NPATH_COLNAME(), $this->getNodePath() . getPhpName() ?>NodePeer::NPATH_SEP() . '%' . getPhpName() ?>NodePeer::NPATH_SEP() . '%', Criteria::NOT_LIKE()); - $criteria->addAsColumn('npathlen', $db->strLength(getPhpName() ?>NodePeer::NPATH_COLNAME())); - $criteria->addDescendingOrderByColumn('npathlen'); + $criteria->addAsColumn('npathlen', $db->strLength(getPhpName() ?>NodePeer::NPATH_COLNAME())); + $criteria->addDescendingOrderByColumn('npathlen'); $criteria->addDescendingOrderByColumn(getPhpName() ?>NodePeer::NPATH_COLNAME()); $lastObj =& getPhpName() ?>Peer::doSelectOne($criteria, Param::set($con)); diff --git a/gulliver/thirdparty/propel-generator/templates/om/php4/NodePeer.tpl b/thirdparty/propel-generator/templates/om/php4/NodePeer.tpl similarity index 99% rename from gulliver/thirdparty/propel-generator/templates/om/php4/NodePeer.tpl rename to thirdparty/propel-generator/templates/om/php4/NodePeer.tpl index 356776763..dbcb8c3c1 100644 --- a/gulliver/thirdparty/propel-generator/templates/om/php4/NodePeer.tpl +++ b/thirdparty/propel-generator/templates/om/php4/NodePeer.tpl @@ -43,7 +43,7 @@ require_once 'getPhpName() * Base static class for performing query operations on the tree contained by the * 'getPhpName() ?>' table. * - + * This class was autogenerated by Propel on: * * [] @@ -429,8 +429,8 @@ class getPhpName() ?>NodePeer $criteria->addSelectColumn($npathR); // Sort by node path to speed up tree construction in populateNodes() - $criteria->addAsColumn('npathlen', $db->strLength($npathL)); - $criteria->addAscendingOrderByColumn('npathlen'); + $criteria->addAsColumn('npathlen', $db->strLength($npathL)); + $criteria->addAscendingOrderByColumn('npathlen'); $criteria->addAscendingOrderByColumn($npathL); } else @@ -439,8 +439,8 @@ class getPhpName() ?>NodePeer $criteria->addSelectColumn(getPhpName() ?>NodePeer::NPATH_COLNAME()); // Sort by node path to speed up tree construction in populateNodes() - $criteria->addAsColumn('npathlen', $db->strLength(getPhpName() ?>NodePeer::NPATH_COLNAME())); - $criteria->addAscendingOrderByColumn('npathlen'); + $criteria->addAsColumn('npathlen', $db->strLength(getPhpName() ?>NodePeer::NPATH_COLNAME())); + $criteria->addAscendingOrderByColumn('npathlen'); $criteria->addAscendingOrderByColumn(getPhpName() ?>NodePeer::NPATH_COLNAME()); } diff --git a/gulliver/thirdparty/propel-generator/templates/om/php4/Object.tpl b/thirdparty/propel-generator/templates/om/php4/Object.tpl similarity index 96% rename from gulliver/thirdparty/propel-generator/templates/om/php4/Object.tpl rename to thirdparty/propel-generator/templates/om/php4/Object.tpl index 55dcb0509..4cc5d7c0a 100644 --- a/gulliver/thirdparty/propel-generator/templates/om/php4/Object.tpl +++ b/thirdparty/propel-generator/templates/om/php4/Object.tpl @@ -1,1938 +1,1938 @@ -getDatabase(); -if ($table->getPackage()) { - $package = $table->getPackage(); -} else { - $package = $targetPackage; -} - -$parentClass = ClassTools::getBaseClass($table); -?> - -require_once ''; - -isAlias()) -{ - // If any columns in table are BLOB or CLOB then we need to make - // sure those classes are included so we can do things like - // if ($v instanceof Lob) etc. - $includes_lobs = false; - - foreach ($table->getColumns() as $col) { - if ($col->isLob()) { - $includes_lobs = true; - break; - } - } - - if($includes_lobs) - { -?> -include_once 'creole/util/Clob.php'; -include_once 'creole/util/Blob.php'; - - -include_once 'propel/util/Criteria.php'; -getForeignKeys() as $fk) -{ - $tblFK = $table->getDatabase()->getTable($fk->getForeignTableName()); - $className = $tblFK->getPhpName(); - if ($tblFK->getInterface()) { - $className = $tblFK->getInterface(); - } - - $tblFKPackage = ($tblFK->getPackage() ? $tblFK->getPackage() : $package); - $tblFKPackagePath = strtr($tblFKPackage, '.', '/'); - if ($tblFKPackagePath != "") { - $tblFKPackagePath .= '/'; - } -?> - -// (on-demand) include_once ''; -// (on-demand) include_once 'getPhpName() . 'Peer') ?>'; -getForeignKeys() as $fk) */ -?> - -include_once 'getPhpName() . 'Peer') ?>'; - -/** - * Base class that represents a row from the 'getName() ?>' table. - * - * getDescription() ?> - * - - * This class was autogenerated by Propel on: - * - * [] - * - - * You should not use this class directly. It should not even be - * extended; all references should be to getPhpName() ?> class. - * - * @package - */ -class getPhpName() ?> extends -{ - /** - * The Peer class. - * Instance provides a convenient way of calling static methods on a class - * that calling code may not be able to identify. - * @var getPhpName() ?>Peer - */ - var $peer; - -isAlias()) -{ - foreach ($table->getColumns() as $col) - { - $cptype = $col->getPhpNative(); - $clo=strtolower($col->getName()); - $defVal = ""; - if (($val = $col->getPhpDefaultValue()) !== null) { - settype($val, $cptype); - $defaultValue = var_export($val, true); - $defVal = " = " . $defaultValue; - } -?> - /** - * The value for the field. - * @var - */ - var $; - -isLazyLoad()) { -?> - /** - * Whether the lazy-loaded value has been loaded from database. - * This is necessary to avoid repeated lookups if column is NULL. - * @var boolean - */ - var $_isLoaded = false; - -isLazyLoad()) */ - } /* foreach ($table->getColumns() as $col) */ - - foreach ($table->getColumns() as $col) - { - $cfc=$col->getPhpName(); - $clo=strtolower($col->getName()); - $cptype = $col->getPhpNative(); - - $defaultValue = null; - if (($val = $col->getPhpDefaultValue()) !== null) { - settype($val, $cptype); - $defaultValue = var_export($val, true); - } - - if ($col->getType() === PropelTypes::DATE || $col->getType() === PropelTypes::TIME || $col->getType() === PropelTypes::TIMESTAMP) - { - // these default values are based on the Creole defaults - // the date and time default formats are locale-sensitive - if ($col->getType() === PropelTypes::DATE) { - $defaultfmt = '%x'; - } elseif ($col->getType() === PropelTypes::TIME) { - $defaultfmt = '%X'; - } elseif ($col->getType() === PropelTypes::TIMESTAMP) { - $defaultfmt = 'Y-m-d H:i:s'; - } -?> - /** - * Get the [optionally formatted] `` value. - * getDescription() ?> - * - * @param string $format The date/time format string (either date()-style or strftime()-style). - * If format is NULL, then the integer unix timestamp will be returned. - * @return mixed Formatted date/time value as string or integer unix timestamp (if format is NULL) on success, - * PropelException, if unable to convert the date/time to timestamp. - */ - function get($format = '') - { -isLazyLoad()) { -?> - if (! $this->_isLoaded && $this-> === null && !$this->isNew()) { - if (($e = $this->load()) !== true) { - return $e; - } - } -isLazyLoad) */ -?> - if ($this-> === null || $this-> === '') { - return null; - } elseif (!is_int($this->)) { - // a non-timestamp value was set externally, so we convert it - $ts = strtotime($this->); - if ($ts === -1) { - return new PropelException(PROPEL_ERROR_INVALID, "Unable to parse value of as date/time value: " . $this->); - } - } else { - $ts = $this->; - } - if ($format === null) { - return $ts; - } elseif (strpos($format, '%') !== false) { - return strftime($format, $ts); - } else { - return date($format, $ts); - } - } - -getType() != DATE | TIME | TIMESTAMP */ -?> - /** - * Get the column value. - * getDescription() ?> - * - * @return - */ - function get() - { -isLazyLoad()) - { -?> - if (! $this->_isLoaded && $this-> === null && !$this->isNew()) { - if (($e = $this->load()) !== true) { - return $e; - } - } - -isLazyLoad */ -?> - return $this->; - } -getType() != DATE | TIME | TIMESTAMP */ -?> - -isLazyLoad()) - { -?> - /** - * Load the value for the [lazy-load] `` column. - * - * This method performs an additional query to return the value for - * the `` column, since it is not populated by - * the hydrate() method. - * - * @return void - * @returns mixed boolean TRUE on success, PropelException - any underlying error will be wrapped and re-thrown. - */ - function load() - { - $c = $this->buildPkeyCriteria(); - $c->addSelectColumn(getPhpName()) ?>()); - - $rs =& getPhpName()?>Peer::doSelectRS($c); - - if (Propel::isError($e =& $rs) || Propel::isError($e = $rs->next())) { - return new PropelException(PROPEL_ERROR, "Error loading value for `` column on demand.", $e); - } - -getType())); - $clo = strtolower($col->getName()); - switch($col->getType()) - { - case PropelTypes::DATE: - case PropelTypes::TIME: - case PropelTypes::TIMESTAMP: -?> - $this-> = $rs->get(1, null); - - $this-> = $rs->get(1); -getType */ -?> - if (Propel::isError($this->)) { - return new PropelException(PROPEL_ERROR, "Error loading value for `` column on demand.", $this->); - } - - $this->_isLoaded = true; - - return true; - } - -isLazyLoad */ - - if (! $table->isReadOnly()) - { - $throwsClause = ""; - if ($complexObjectModel) - { - if ($col->isForeignKey()) { - $throwsClause = "@throws PropelException"; - } - if (count($col->getReferrers()) > 0 ) { - if ($throwsClause == "") { - $throwsClause = "@throws PropelException"; - } - } - } - if ($col->getType() === PropelTypes::DATE || $col->getType() === PropelTypes::TIME || $col->getType() === PropelTypes::TIMESTAMP) { - $throwsClause = "@throws PropelException - If passed [not-null] date/time is in an invalid format."; - } -?> - /** - * Set the value of `` - * getDescription() ?> - * - * @param $v new value - * @return void - * - */ - function set($v) - { -isLazyLoad()) - { -?> - // explicitly set the is-loaded flag to true for this lazy load col; - // it doesn't matter if the value is actually set or not (logic below) as - // any attempt to set the value means that no db lookup should be performed - // when the get() method is called. - $this->_isLoaded = true; -isLazyLoad */ - - if ($addSaveMethod) - { - if ($col->isLob()) - { - // Setting of LOB columns gets some special handling - if ($col->getPropelType() === PropelTypes::BLOB || $col->getPropelType() === PropelTypes::LONGVARBINARY ) { - $lobClass = "Blob"; - } else { - $lobClass = "Clob"; - } -?> - // if the passed in parameter is the *same* object that - // is stored internally then we use the Lob->isModified() - // method to know whether contents changed. - if (is_a($v, 'Lob') && $v === $this->) { - $changed = $v->isModified(); - } else { - $changed = ($this-> !== $v); - } - if ($changed) { - if ( ! is_a($v, 'Lob') ) { - $obj = new (); - $obj->setContents($v); - } else { - $obj =& $v; - } - $this-> = $obj; - $this->modifiedColumns[] = getPhpName()) ?>(); - } -getType() === PropelTypes::DATE || $col->getType() === PropelTypes::TIME || $col->getType() === PropelTypes::TIMESTAMP) - { - // Setting a DATE/TIME value gets some special handling. -?> - if ($v !== null && !is_int($v)) { - $ts = strtotime($v); - if ($ts === -1) { - return new PropelException(PROPEL_ERROR_INVALID, "Unable to parse date/time value for from input: " . var_export($v, true)); - } - } else { - $ts = $v; - } - - if ($this-> !== $ts || $ts === ) { - $this-> = $ts; - $this->modifiedColumns[] = getPhpName()) ?>(); - } - - if ($this-> !== $v || $v === ) { - $this-> = $v; - $this->modifiedColumns[] = getPhpName()) ?>(); - } - - - $this-> =& $v; - -isForeignKey()) - { - $tblFK = $table->getDatabase()->getTable($col->getRelatedTableName()); - $colFK = $tblFK->getColumn($col->getRelatedColumnName()); - if ($col->isMultipleFK() || $col->getRelatedTableName() == $table->getName()) { - $relCol = ""; - foreach ($col->getForeignKey()->getLocalColumns() as $columnName) { - $column = $table->getColumn($columnName); - $relCol .= $column->getPhpName(); - } - if ($relCol != "") { - $relCol = "RelatedBy".$relCol; - } - $varName = "a".$tblFK->getPhpName() . $relCol; - } else { - $varName = "a".$tblFK->getPhpName(); - } -?> - if ($this-> !== null && $this->->getgetPhpName() ?>() !== $v) { - /* - * Save a reference to null instead of null directly as this would - * overwrite a previous stored getPhpName() ?> object. - */ - $this-> =& Propel::null(); - } -isForeignKey) */ - - foreach ($col->getReferrers() as $fk) - { - // used to be getLocalForeignMapping() which did not work. - $flmap = $fk->getForeignLocalMapping(); - $fkColName = $flmap[$col->getName()]; - $tblFK = $fk->getTable(); - if ( $tblFK->getName() != $table->getName() ) - { - $colFK = $tblFK->getColumn($fkColName); - if ($colFK->isMultipleFK()) { - $collName = "coll" . $tblFK->getPhpName() . "sRelatedBy" . $colFK->getPhpName(); - } else { - $collName = "coll" . $tblFK->getPhpName() . "s"; - } -?> - - // update associated getPhpName() ?> - - if ($this-> !== null) { - for ($i=0,$size=count($this->); $i < $size; $i++) { - $this->[$i]->setgetPhpName()?>($v); - } - } - - } - -isReadOnly() */ - } /* foreach ($table->getColumns() as $col) */ -?> - /** - * Hydrates (populates) the object variables with values from the database resultset. - * - * An offset (1-based "start column") is specified so that objects can be hydrated - * with a subset of the columns in the resultset rows. This is needed, for example, - * for results of JOIN queries where the resultset row includes columns from two or - * more tables. - * - * @param ResultSet $rs The ResultSet class with cursor advanced to desired record pos. - * @param int $startcol 1-based offset column which indicates which restultset column to start with. - * @return int next starting column - * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. - */ - function hydrate(&$rs, $startcol = 1) - { - assert('is_a($rs, "ResultSet")'); - -getColumns() as $col) - { - if (! $col->isLazyLoad()) - { - $affix = CreoleTypes::getAffix(CreoleTypes::getCreoleCode($col->getType())); - $clo = strtolower($col->getName()); - switch($col->getType()) - { - case PropelTypes::DATE: - case PropelTypes::TIME: - case PropelTypes::TIMESTAMP: -?> - if (Creole::isError($value = $rs->get($startcol + , null))) { - return new PropelException(PROPEL_ERROR_DB, "Error populating getPhpName()?> object", $value); - } - - $this-> = $value; - - if (Creole::isError($value = $rs->get($startcol + ))) { - return new PropelException(PROPEL_ERROR_DB, "Error populating object", $value); - } - - $this-> = $value; -isLazyLoad() */ - } /* foreach ($table->getColumns() as $col) */ - - if ($addSaveMethod) - { -?> - $this->resetModified(); - - $this->setNew(false); - return $startcol + ; - } - - /** - * Builds a Criteria object containing the primary key for this object. - * - * Unlike buildCriteria() this method includes the primary key values regardless - * of whether or not they have been modified. - * - * @return Criteria The Criteria object containing value(s) for primary key(s). - */ - function &buildPkeyCriteria() - { - $criteria = new Criteria(getPhpName()?>Peer::DATABASE_NAME()); -getColumns() as $col) - { - $clo = strtolower($col->getName()); - if ($col->isPrimaryKey()) - { -?> - $criteria->add(getPhpName()) ?>(), $this->); -isPrimaryKey */ - } /* foreach ($table->getColumns() as $col) */ -?> - return $criteria; - } - - /** - * Build a Criteria object containing the values of all modified columns in this object. - * - * @return Criteria The Criteria object containing all modified values. - */ - function &buildCriteria() - { - $criteria = new Criteria(getPhpName()?>Peer::DATABASE_NAME()); - -getColumns() as $col) - { - $clo = strtolower($col->getName()); -?> - if ($this->isColumnModified(getPhpName()) ?>())) { - $criteria->add(getPhpName()) ?>(), $this->); - } - - - return $criteria; - } - -isAlias */ - -// association code -if ($complexObjectModel) -{ - $pVars = array(); // Array of object set method names for later reference. - $aVars = array(); // Array of object field names for later reference. - - foreach ($table->getForeignKeys() as $fk) - { - $tblFK = $table->getDatabase()->getTable($fk->getForeignTableName()); - $className = $tblFK->getPhpName(); - - $tblFKPackage = ($tblFK->getPackage() ? $tblFK->getPackage() : $package); - $tblFKPackagePath = strtr($tblFKPackage, '.', '/'); - if ($tblFKPackagePath != "") { - $tblFKPackagePath .= '/'; - } - - $relCol = ""; - foreach ($fk->getLocalColumns() as $columnName) { - $column = $table->getColumn($columnName); - if ($column->isMultipleFK() || $fk->getForeignTableName() == $table->getName()) { - $relCol .= $column->getPhpName(); - } - } - - if ($relCol != "") { - $relCol = "RelatedBy" . $relCol; - } - - $pVarName = $className . $relCol; - $varName = "a" . $pVarName; - $retVal = ($pVars[] = $pVarName); - $retVal = ($aVars[] = $varName); -?> - /** - * @var - */ - var $; - - /** - * Declares an association between this object and a object - * - * @param $v - * @return void - * @throws PropelException - */ - function set(&$v) - { -getLocalColumns() as $columnName) - { - $column = $table->getColumn($columnName); - $lfmap = $fk->getLocalForeignMapping(); - $colFKName = $lfmap[$columnName]; - $colFK = $tblFK->getColumn($colFKName); -?> - if ($v === null) { - $this->setgetPhpName() ?>(getPhpDefaultValue()) ?>); - } else { - $this->setgetPhpName() ?>($v->getgetPhpName() ?>()); - } - - - $this-> =& $v; - } - -getLocalColumns() as $columnName) - { - $column = $table->getColumn($columnName); - $cptype = $column->getPhpNative(); - $clo = strtolower($column->getName()); - if ($cptype == "integer" || $cptype == "float" || $cptype == "double") { - $conditional .= $and . "\$this->". $clo ." > 0"; - } elseif($cptype == "string") { - $conditional .= $and . "(\$this->" . $clo ." !== \"\" && \$this->".$clo." !== null)"; - } else { - $conditional .= $and . "\$this->" . $clo ." !== null"; - } - $arglist .= $comma . "\$this->" . $clo; - $and = " && "; - $comma = ", "; - $argsize = $argsize + 1; - } - - $pCollName = $table->getPhpName() . 's' . $relCol; -?> - /** - * Get the associated object - * - * @return The associated object. - * @throws PropelException - */ - function & get() - { - // include the Peer class - include_once 'Peer.php'; - - if ($this-> === null && ()) - { -isAlias()) - { - if ($argsize > 1) { -?> - $ =& Peer::retrieveByPK(); - - $ =& Peer::retrieveByPK(); - 1) */ - } - else - { - if ($argsize > 1) { -?> - $ =& Peer::retrieveByPK(); - - $ =& Peer::retrieveByPK(); -isAlias -?> - if (Propel::isError($)) { return $; } - - $this-> =& $; - - /* The following can be used instead of the line above to - guarantee the related object contains a reference - to this object, but this level of coupling - may be undesirable in many circumstances. - As it can lead to a db query with many results that may - never be used. - $obj = Peer::retrieveByPK(); - $obj->add($this); - */ - } - - return $this->; - } - - /** - * Provides convenient way to set a relationship based on a - * key. e.g. - * $bar->setFooKey($foo->getPrimaryKey()) - * -getLocalColumns()) > 1) { -?> - * Note: It is important that the xml schema used to create this class - * maintains consistency in the order of related columns between - * getName() ?> and getName() ?>. - * If for some reason this is impossible, this method should be - * overridden in getPhpName() ?>. - - * @return void - * @throws PropelException - */ - function setKey($key) - { -getLocalColumns()) > 1) - { - $i = 0; - foreach ($fk->getLocalColumns() as $colName) - { - $col = $table->getColumn($colName); - $fktype = $col->getPhpNative(); -?> - $this->setgetPhpName() ?>( () $key[] ); -getLocalColumns(); - $colName = $lcols[0]; - $col = $table->getColumn($colName); - $fktype = $col->getPhpNative(); -?> - $this->setgetPhpName() ?>( () $key); - - } - -getReferrers() as $fk) - { - $tblFK = $fk->getTable(); - $tblFKPackage = ($tblFK->getPackage() ? $tblFK->getPackage() : $package); - $tblFKPackagePath = strtr($tblFKPackage, '.', '/'); - if ($tblFKPackagePath != "") { - $tblFKPackagePath .= '/'; - } - - $className = $tblFK->getPhpName(); - $relatedByCol = ""; - foreach ($fk->getLocalColumns() as $columnName) { - $column = $tblFK->getColumn($columnName); - if ($column->isMultipleFK() || $tblFK->getName() == $table->getName()) { - // if there are seeral foreign keys that point to the same table - // then we need to generate methods like getAuthorRelatedByColName() - // instead of just getAuthor(). Currently we are doing the same - // for self-referential foreign keys, to avoid confusion. - $relatedByCol .= $column->getPhpName(); - } - } - - if ($relatedByCol == "") { - $suffix = ""; - $relCol = $className . "s"; - $relColMs = $className; - } else { - $suffix = "RelatedBy" . $relatedByCol; - $relCol= $className . "sRelatedBy" . $relatedByCol; - $relColMs= $className . "RelatedBy" . $relatedByCol; - } - $collName = "coll" . $relCol; -?> - /** - * Collection to store aggregation of - * @var array - */ - var $; - - /** - * Temporary storage of to save a possible db hit in - * the event objects are add to the collection, but the - * complete collection is never requested. - * @return void - */ - function init() - { - if ($this-> === null) { - $this-> = array(); - } - } - - /** - * Method called to associate a getPhpName() ?> object to this object - * through the foreign key attribute - * - * @param $l $className - * @return void - * @throws PropelException - */ - function add(/**/ &$l) - { - $this->[] =& $l; - $l->setgetPhpName() . $suffix ?>($this); - } - - /** - * The criteria used to select the current contents of . - * @var Criteria - */ - var $lastCriteria = null; - - /** - * Returns the number of related - * - * @param Criteria $criteria - * @param boolean $distinct - * @throws PropelException - */ - function count($criteria = null, $distinct = false) - { - // include the Peer class - include_once 'Peer.php'; - if ($criteria === null) { - $criteria = new Criteria(); - } -getForeignColumns() as $columnName) { - $column = $table->getColumn($columnName); - // used to be getLocalForeignMapping() but that didn't seem to work - // (maybe a problem in translation of HashTable code to PHP). - $flmap = $fk->getForeignLocalMapping(); - $colFKName = $flmap[$columnName]; - $colFK = $tblFK->getColumn($colFKName); -?> - $criteria->add((), $this->getgetPhpName() ?>() ); -getForeignColumns() -?> - return Peer::doCount($criteria, $distinct); - } - - /** - * If this collection has already been initialized with - * an identical criteria, it returns the collection. - * Otherwise if this getPhpName() ?> has previously - * been saved, it will retrieve related ${relCol} from storage. - * If this getPhpName() ?> is new, it will return - * an empty collection or the current collection, the criteria - * is ignored on a new object. - * - * @param Criteria $criteria - * @throws PropelException - */ - function & get($criteria = null) - { - // include the Peer class - include_once 'Peer.php'; - - if ($criteria === null) { - $criteria = new Criteria(); - } - - if ($this-> === null) - { - if ($this->isNew()) { - $this-> = array(); - } else { -getForeignColumns() as $columnName) - { - $column = $table->getColumn($columnName); - // used to be getLocalForeignMapping() but that didn't seem to work - // (maybe a problem in translation of HashTable code to PHP). - $flmap = $fk->getForeignLocalMapping(); - $colFKName = $flmap[$columnName]; - $colFK = $tblFK->getColumn($colFKName); -?> - $criteria->add((), $this->getgetPhpName() ?>() ); -getForeignColumns()) */ -?> - - $ =& Peer::doSelect($criteria); - if (Propel::isError($)) { return $; } - - $this-> =& $; - } - } else { - // criteria has no effect for a new object - if (!$this->isNew()) - { - // the following code is to determine if a new query is - // called for. If the criteria is the same as the last - // one, just return the collection. -getForeignColumns() as $columnName) - { - $column = $table->getColumn($columnName); - $flmap = $fk->getForeignLocalMapping(); - $colFKName = $flmap[$columnName]; - $colFK = $tblFK->getColumn($colFKName); -?> - $criteria->add((), $this->getgetPhpName() ?>()); - -getForeignColumns()) */ -?> - if (!isset($this->lastCriteria) || !$this->lastCriteria->equals($criteria)) - { - $ =& Peer::doSelect($criteria); - if (Propel::isError($)) { return $; } - - $this-> =& $; - } - } - } - - $this->lastCriteria = $criteria; - - return $this->; - } - -getForeignKeys() as $dummyFK) { - $countFK = $countFK + 1; - } - -// ------------------------------------------------------------ -// - if ($countFK >= 1) - { - $lastTable = ""; - foreach ($tblFK->getForeignKeys() as $fk2) - { - // Add join methods if the fk2 table is not this table or - // the fk2 table references this table multiple times. - - $doJoinGet = true; - if ( $fk2->getForeignTableName() == $table->getName() ) { - $doJoinGet = false; - } - - foreach ($fk2->getLocalColumns() as $columnName) { - $column = $tblFK->getColumn($columnName); - if ($column->isMultipleFK()) { - $doJoinGet = true; - } - } - - $tblFK2 = $table->getDatabase()->getTable($fk2->getForeignTableName()); - $doJoinGet = !$tblFK2->isForReferenceOnly(); - $relatedByCol2 = ""; - foreach ($fk2->getLocalColumns() as $columnName) { - $column = $tblFK->getColumn($columnName); - if ($column->isMultipleFK()) { - $relatedByCol2 .= $column->getPhpName(); - } - } - - $fkClassName = $tblFK2->getPhpName(); - - // do not generate code for self-referencing fk's, it would be - // good to do, but it is just not implemented yet. - if ($className == $fkClassName) { - // $doJoinGet = false; -- SELF REFERENCING FKs UNDER TESTING - } - - if ($relatedByCol2 == "") { - $relCol2 = $fkClassName; - } else { - $relCol2 = $fkClassName . "RelatedBy". $relatedByCol2; - } - - if ( $relatedByCol == "") { - // nothing? - } else { - if ( $relatedByCol == $relatedByCol2 ) { - $doJoinGet = false; - } - } - - if ($doJoinGet) - { -?> - /** - * If this collection has already been initialized with - * an identical criteria, it returns the collection. - * Otherwise if this getPhpName() ?> is new, it will return - * an empty collection; or if this getPhpName() ?> has previously - * been saved, it will retrieve related from storage. - * - * This method is protected by default in order to keep the public - * api reasonable. You can provide public methods for those you - * actually need in getPhpName() ?>. - */ - function & getJoin($criteria = null) - { - // include the Peer class - include_once 'Peer.php'; - - if ($criteria === null) { - $criteria = new Criteria(); - } - - if ($this-> === null) { - if ($this->isNew()) { - $this-> = array(); - } else { -getForeignColumns() as $columnName) - { - $column = $table->getColumn($columnName); - $flMap = $fk->getForeignLocalMapping(); - $colFKName = $flMap[$columnName]; - $colFK = $tblFK->getColumn($colFKName); -?> - $criteria->add((), $this->getgetPhpName() ?>()); -getForeignColumns()) */ -?> - - $ =& Peer::doSelectJoin($criteria); - if (Propel::isError($)) { return $; } - - $this-> =& $; - } - } else { - // the following code is to determine if a new query is - // called for. If the criteria is the same as the last - // one, just return the collection. -getForeignColumns() as $columnName) - { - $column = $table->getColumn($columnName); - $flMap = $fk->getForeignLocalMapping(); - $colFKName = $flMap[$columnName]; - $colFK = $tblFK->getColumn($colFKName); -?> - $criteria->add((), $this->getgetPhpName() ?>()); - -getForeignColumns()) */ -?> - if (!isset($this->lastCriteria) || !$this->lastCriteria->equals($criteria)) - { - $ =& Peer::doSelectJoin($criteria); - if (Propel::isError($)) { return $; } - - $this-> =& $; - } - } - $this->lastCriteria = $criteria; - - return $this->; - } - -getForeignKeys() as $fk2) {*/ - } /* if countFK >= 1 */ - } /*ends foreach over table->getReferrers() */ -} /* the if(complexObjectModel) */ - -// -// add GenericAccessors or GenericMutators? -// -if (!$table->isAlias() && ($addGenericAccessors || ($addGenericMutators && !$table->isReadOnly()))) -{ - $tableColumns = $table->getColumns(); - $tablePhpname = $table->getPhpName(); -?> - /** - * Generate a list of field names. - * - * @return array A list of field names - */ - function & getFieldNames($type = TYPE_FIELDNAME) - { - static $fieldNames = array( - TYPE_PHPNAME => array ('getPhpName(); ?>', ), - TYPE_COLNAME => array ('getName() . '.' . strtoupper($col->getName()) ?>', ), - TYPE_FIELDNAME => array ('getName(); ?>', ), - TYPE_NUM => array ( $col) { echo $num; ?>, ) - ); - - if (!isset($fieldNames[$type])) { - return new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants TYPE_PHPNAME, TYPE_COLNAME, TYPE_FIELDNAME, TYPE_NUM. ' . $type . ' was given.'); - } - - return $fieldNames[$type]; - } - - /** - * Translates a fieldname to another type - * - * @param string $name field name - * @param string $fromType One of the class type constants TYPE_PHPNAME, - * TYPE_COLNAME, TYPE_FIELDNAME, TYPE_NUM - * @param string $toType One of the class type constants - * @return string translated name of the field. - */ - function translateFieldName($name, $fromType, $toType) - { - static $fieldKeys = array ( - TYPE_PHPNAME => array ( $col) { ?>'getPhpName(); ?>' => , ), - TYPE_COLNAME => array ( $col) { ?>'getName() . '.' . strtoupper($col->getName()) ?>' => , ), - TYPE_FIELDNAME => array ( $col) { ?>'getName(); ?>' => , ), - TYPE_NUM => array ( $col) { echo $num; ?>, ) - ); - - $toNames =& $this->getFieldNames($toType); - $key = $fieldKeys[$fromType][$name]; - - if ($key === false) { - return new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r($fromNames, true)); - } - - return $toNames[$key]; - } - - - /** - * Retrieves a field from the object by name passed in as a string. - * - * @param string $name name - * @param string $type The type of fieldname the $name is of: - * one of the class type constants TYPE_PHPNAME, - * TYPE_COLNAME, TYPE_FIELDNAME, TYPE_NUM - * @return mixed Value of field. - */ - function & getByName($name, $type = TYPE_COLNAME) - { - $pos = $this->translateFieldName($name, $type, TYPE_NUM); - return $this->getByPosition($pos); - } - - /** - * Retrieves a field from the object by Position as specified - * in the xml schema. Zero-based. - * - * @param int $pos position in xml schema - * @return mixed Value of field at $pos - */ - function & getByPosition($pos) - { - switch($pos) - { -getColumns() as $col) - { - $cfc = $col->getPhpName(); - $cptype = $col->getPhpNative();// not safe to use it because some methods may return objects (Blob) -?> - case : - return $this->get(); - break; - - default: - return null; - } // switch() - } - - /** - * Exports the object as an array. - * - * You can specify the key type of the array by passing one of the class - * type constants. - * - * @param string $keyType One of the class type constants TYPE_PHPNAME, - * TYPE_COLNAME, TYPE_FIELDNAME, TYPE_NUM - * @return an associative array containing the field names (as keys) and field values - */ - function & toArray($keyType = TYPE_PHPNAME) - { - $keys =& $this->getFieldNames($keyType); - $result = array( -getColumns() as $num => $col) { -?> - $keys[] => $this->getgetPhpName() ?>(), - - ); - return $result; - } - - - - -isReadOnly()) { ?> - - /** - * Sets a field value from the object by name passed in as a string. - * - * @param string $name peer name - * @param mixed $value field value - * @param string $type The type of fieldname the $name is of: - * one of the class type constants TYPE_PHPNAME, - * TYPE_COLNAME, TYPE_FIELDNAME, TYPE_NUM - * @return void - */ - function setByName($name, &$value, $type = TYPE_COLNAME) - { - $names =& $this->getFieldnames($type); - $pos = array_search($name, $names); - return $this->setByPosition($pos, $value); - } - - /** - * Sets a field from the object by Position as specified - * in the xml schema. Zero-based. - * - * @param int $pos position in xml schema - * @param mixed $value field value - * @return void - */ - function setByPosition($pos, &$value) - { - switch($pos) - { -getColumns() as $col) - { - $cfc = $col->getPhpName(); - $cptype = $col->getPhpNative(); -?> - case : - $this->set($value); - break; - - } // switch() - } - - /** - * Populates the object using an array. - * - * This is particularly useful when populating an object from one of the - * request arrays (e.g. $_POST). This method goes through the column - * names, checking to see whether a matching key exists in populated - * array. If so the setByName() method is called for that column. - * - * You can specify the key type of the array by additionally passing one - * of the class type constants TYPE_PHPNAME, TYPE_COLNAME, TYPE_FIELDNAME, - * TYPE_NUM. The default key type is the (peer) column name (e.g. - * 'book.AUTHOR_ID') - * - * @param array $arr An array to populate the object from. - * @param string $keyType The type of keys the array uses. - * @return void - */ - function fromArray(&$arr, $keyType = TYPE_COLNAME) - { - $keys =& $this->getFieldNames($keyType); -getColumns() as $num => $col) { - $cfc = $col->getPhpName(); - $cptype = $col->getPhpNative(); -?> - if (array_key_exists($keys[], $arr)) $this->set($arr[$keys[]]); - - } - - - -isAlias() && isset($addSaveMethod) && $addSaveMethod && ! $table->isReadOnly()) { ?> - - /** - * Removes this object from datastore and sets delete attribute. - * - * @return mixed TRUE on success, PropelException on failure. - * @throws PropelException - * @see BaseObject::setDeleted() - * @see BaseObject::isDeleted() - */ - function delete() - { - if ($this->isDeleted()) { - return new PropelException(PROPEL_ERROR, "This object has already been deleted."); - } - - $con =& Propel::getConnection(getPhpName() ?>Peer::DATABASE_NAME()); - if (Propel::isError($con)) { return $con; } - - $e = $con->begin(); - if (Creole::isError($e)) { $con->rollback(); return new PropelException(PROPEL_ERROR_DB, $e); } - - $e = getPhpName() ?>Peer::doDelete($this, Param::set($con)); - if (Propel::isError($e)) { $con->rollback(); return $e; } - - $this->setDeleted(true); - - $e = $con->commit(); - if (Creole::isError($e)) { $con->rollback(); return new PropelException(PROPEL_ERROR_DB, $e); } - - return true; - } - - - - /** - * flag to prevent endless save loop, if this object is referenced - * by another object which falls in this transaction. - * @var boolean - */ - var $alreadyInSave = false; - - /** - * Stores the object in the database. If the object is new, - * it inserts it; otherwise an update is performed. This method - * wraps the doSave() worker method in a transaction. - * - * @return mixed TRUE on success, PropelException on failure. - */ - function save() - { - if ($this->isDeleted()) { - return new PropelException(PROPEL_ERROR, "You cannot save an object that has been deleted."); - } - - $con =& Propel::getConnection(getPhpName() ?>Peer::DATABASE_NAME()); - if (Propel::isError($con)) { return $con; } - - $e = $con->begin(); - if (Creole::isError($e)) { $con->rollback(); return new PropelException(PROPEL_ERROR_DB, $e); } - - $e = $this->doSave(Param::set($con)); - if (Propel::isError($e)) { $con->rollback(); return $e; } - - $e = $con->commit(); - if (Creole::isError($e)) { $con->rollback(); return new PropelException(PROPEL_ERROR_DB, $e); } - - return true; - } - - - /** - * Stores the object in the database. If the object is new, - * it inserts it; otherwise an update is performed. - * - * @return void - * @throws PropelException - */ - - function doSave($con = null) - - function save() - - { - if ($this->isDeleted()) { - return new PropelException(PROPEL_ERROR, "You cannot save an object that has been deleted."); - } - - $con =& Propel::getConnection(getPhpName() ?>Peer::DATABASE_NAME()); - if (Propel::isError($con)) { return $con; } - - - /* [MA] temporarily check */ - Propel::assertParam($con, 'getPhpName(); ?>', 'save', 1); - - if (! $this->alreadyInSave) { - $this->alreadyInSave = true; - - - // We call the save method on the following object(s) if they - // were passed to this object by their coresponding set - // method. This object relates to these object(s) by a - // foreign key reference. - - if ($this-> !== null) { - if ($this->->isModified()) { - if (Propel::isError($e = $this->->save())) { - return $e; - } - } - $this->set($this->); - } - - - // If this object has been modified, then save it to the database. - if ($this->isModified()) { - if ($this->isNew()) { - $pk = getPhpName() ?>Peer::doInsert($this, $conParam::set($con)); - if (Propel::isError($pk)) { return $pk; } -getIdMethod() != "none") { - if (count($pks = $table->getPrimaryKey())) { - foreach ($pks as $pk) { - if ($pk->isAutoIncrement()) { -?> - $this->setgetPhpName();?>( $pk ); //[IMV] update autoincrement primary key - - $this->setNew(false); - } - else { - $e = getPhpName() ?>Peer::doUpdate($this, $conParam::set($con)); - if (Propel::isError($e)) { return $e; } - } - $this->resetModified(); // [HL] After being saved an object is no longer 'modified' - } - -getReferrers() as $fk) - { - $tblFK = $fk->getTable(); - if ( $tblFK->getName() != $table->getName() ) - { - $className = $tblFK->getPhpName(); - $relCol = ""; - foreach ($fk->getLocalColumns() as $columnName) { - $column = $tblFK->getColumn($columnName); - if ($column->isMultipleFK()) { - $relCol .= $column->getPhpName(); - } - } - - if ($relCol == "") { - $relCol = $className . "s"; - } else { - $relCol = $className . "sRelatedBy" . $relCol; - } - - $collName = "coll" . $relCol; -?> - if ($this-> !== null) { - for ($i=0,$size=count($this->); $i < $size; $i++) { - if (Propel::isError($e = $this->[$i]->save())) { - return $e; - } - } - } - - - $this->alreadyInSave = false; - } - - - return true; - } - -isAlias && isset .... */ - -if (! $table->isAlias() && ! $table->isReadOnly()) -{ -?> - /** - * Validates the objects modified field values. - - * This includes all objects related to this table. - - * - * If $columns is either a column name or an array of column names - * only those columns are validated. - * - * @param mixed $columns Column name or an array of column names. - * - * @return mixed true if all columns pass validation - * or an array of ValidationFailed objects for columns that fail. - */ - function & validate($columns = null) - { - if ($columns) - { - return getPhpName()?>Peer::doValidate($this, $columns); - } - - - return getPhpName()?>Peer::doValidate($this); - - return $this->doValidate(); - - } - - - /** - * flag to prevent endless validation loop, if this object is referenced - * by another object which falls in this transaction. - * @var boolean - */ - var $alreadyInValidation = false; - - /** - * This function performs the validation work for complex object models. - * - * In addition to checking the current object, all related objects will - * also be validated. If all pass then true is returned; otherwise - * an aggreagated array of ValidationFailed objects will be returned. - * - * @return mixed true if all validations pass; array of ValidationFailed objets otherwise. - */ - function & doValidate() - { - if (! $this->alreadyInValidation) - { - $this->alreadyInValidation = true; - $retval = null; - $failureMap = array(); - - - // We call the validate method on the following object(s) if they - // were passed to this object by their coresponding set - // method. This object relates to these object(s) by a - // foreign key reference. - - if ($this-> !== null) { - if (($retval = $this->->validate()) !== true) { - $failureMap = array_merge($failureMap, $retval); - } - } - - - if (($retval = getPhpName()?>Peer::doValidate($this)) !== true) { - $failureMap = array_merge($failureMap, $retval); - } - -getReferrers() as $fk) - { - $tblFK = $fk->getTable(); - if ( $tblFK->getName() != $table->getName() ) - { - $className = $tblFK->getPhpName(); - $relCol = ""; - foreach ($fk->getLocalColumns() as $columnName) { - $column = $tblFK->getColumn($columnName); - if ($column->isMultipleFK()) { - $relCol .= $column->getPhpName(); - } - } - - if ($relCol == "") { - $relCol = $className . "s"; - } else { - $relCol = $className . "sRelatedBy" . $relCol; - } - - $collName = "coll" . $relCol; -?> - if ($this-> !== null) { - for ($i=0,$size=count($this->); $i < $size; $i++) { - if (($retval = $this->[$i]->validate()) !== true) { - $failureMap = array_merge($failureMap, $retval); - } - } - } - - - $this->alreadyInValidation = false; - return (!empty($failureMap) ? $failureMap : true); - } - - return true; - } - -isAlias()) -{ - if (! $table->isReadOnly()) - { - $throwsClause = "@throws PropelException"; - if (count($table->getPrimaryKey()) == 1) - { - $pkeys = $table->getPrimaryKey(); - $col = $pkeys[0]; - $clo=strtolower($col->getName()); - $cptype= $col->getPhpNative(); -?> - /** - * Set the PrimaryKey. - * - * @param mixed Primary key. - * @return void - * - */ - function setPrimaryKey($key) - { - $this->setgetPhpName() ?>($key); - } - -getPrimaryKey()) > 1) - { -?> - var $pks = array(); - - /** - * Set the PrimaryKey. - * - * @param array $keys The elements of the composite key (order must match the order in XML file). - * @return void - * @throws PropelException - */ - function setPrimaryKey($keys) - { -getPrimaryKey() as $pk) - { - $pktype = $pk->getPhpNative(); -?> - $this->setgetPhpName() ?>($keys[]); -getPrimaryKey() as $pk) */ -?> - } - -getPrimaryKey()) == 1) */ -?> - - /** - * Dummy primary key setter. - * For now this function needs to exist because it's mandated in the Persistent - * interface, and because other methods will attempt to set the primary key. - * - * This should be removed in favor of more complex template work. - */ - function setPrimaryKey($pk) - { - // do nothing, because this doesn't support primary keys - } -getPrimaryKey()) == 1) */ - } /* if ! $table->isReadOnly() */ -?> - - /** - * Returns an id that differentiates this object from others - * of its class. - * @return getPrimaryKey()) === 0) { echo "null"; } elseif (count($table->getPrimaryKey()) > 1) { echo "array"; } else { $pkeys = $table->getPrimaryKey(); echo $pkeys[0]->getPhpType(); } ?> - */ - function getPrimaryKey() - { -getPrimaryKey()) == 1) { -?> - return $this->getgetPrimaryKey(); echo $pkeys[0]->getPhpName()?>(); -getPrimaryKey()) > 1) { - $i = 0; - foreach ($table->getPrimaryKey() as $pk) { -?> - $this->pks[] = $this->getgetPhpName() ?>(); -getPrimaryKey() as $pk) */ -?> - return $this->pks; - - - return null; - - } - -isAbstract()) - { -?> - /** - * Makes a copy of this object. - * It creates a new object filling in the simple attributes, but skipping any primary - * keys that are defined for the table. - * - - * If desired, this method can also make copies of all associated (fkey referrers) - * objects. - * - * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. - * - - * @return getPhpName() ?> Clone of current object. - * @throws PropelException - */ - function copy($deepCopy = false) - { - $copyObj = new getPhpName() ?>(); -getColumns() as $pkcol) { - if ($pkcol->isPrimaryKey()) { - $pkcols[] = $pkcol->getName(); - } - } - - foreach ($table->getColumns() as $col) - { - if (!in_array($col->getName(), $pkcols)) { -?> - $copyObj->setgetPhpName()?>($this->getName()) ?>); -getReferrers()) > 0) - { -?> - - if ($deepCopy) { - // important: setNew(false) because this affects the behavior of - // the getter/setter methods for fkey referrer objects. - $copyObj->setNew(false); -getReferrers() as $fk) - { - $tblFK = $fk->getTable(); - if ( $tblFK->getName() != $table->getName() ) - { - $className = $tblFK->getPhpName(); - $relCol = ""; - foreach ($fk->getLocalColumns() as $columnName) { - $column = $tblFK->getColumn($columnName); - if ($column->isMultipleFK()) { - $relCol .= $column->getPhpName(); - } - } - - if ($relCol == "") { - $pCollName = $className . "s"; - $pCollNameNoS = $className; - } else { - $pCollName = $className . "sRelatedBy".$relCol; - $pCollNameNoS = $className . "RelatedBy".$relCol; - } -?> - - foreach($this->get() as $relObj) { - $copyObj->add($relObj->copy()); - } - - } /* if ($deepCopy) */ - 0 ) */ -?> - - $copyObj->setNew(true); -getColumns() as $col) - { - if ($col->isPrimaryKey()) - { - $coldefval = $col->getDefaultValue(); - // This seems to work pretty well for getting - // the right value (including NULL) - $coldefval = var_export($coldefval, true); -?> - $copyObj->setgetPhpName()?>(); // this is a pkey column, so set to default value -isPrimaryKey - } // foreach -?> - - return $copyObj; - } - -isAbstract()) */ -?> - /** - * Returns a peer instance associated with this om. Since Peer classes - * are not to have any instance attributes, this method returns the - * same instance for all member of this class. The method could therefore - * be static, but this would prevent one from overriding the behavior. - * - * @return getPhpName() ?>Peer - */ - function & getPeer() - { - static $instance; - - if ($instance === null) { - $instance = new getPhpName()?>Peer(); - } - - return $instance; - } -isAlias */ -?> - -} +getDatabase(); +if ($table->getPackage()) { + $package = $table->getPackage(); +} else { + $package = $targetPackage; +} + +$parentClass = ClassTools::getBaseClass($table); +?> + +require_once ''; + +isAlias()) +{ + // If any columns in table are BLOB or CLOB then we need to make + // sure those classes are included so we can do things like + // if ($v instanceof Lob) etc. + $includes_lobs = false; + + foreach ($table->getColumns() as $col) { + if ($col->isLob()) { + $includes_lobs = true; + break; + } + } + + if($includes_lobs) + { +?> +include_once 'creole/util/Clob.php'; +include_once 'creole/util/Blob.php'; + + +include_once 'propel/util/Criteria.php'; +getForeignKeys() as $fk) +{ + $tblFK = $table->getDatabase()->getTable($fk->getForeignTableName()); + $className = $tblFK->getPhpName(); + if ($tblFK->getInterface()) { + $className = $tblFK->getInterface(); + } + + $tblFKPackage = ($tblFK->getPackage() ? $tblFK->getPackage() : $package); + $tblFKPackagePath = strtr($tblFKPackage, '.', '/'); + if ($tblFKPackagePath != "") { + $tblFKPackagePath .= '/'; + } +?> + +// (on-demand) include_once ''; +// (on-demand) include_once 'getPhpName() . 'Peer') ?>'; +getForeignKeys() as $fk) */ +?> + +include_once 'getPhpName() . 'Peer') ?>'; + +/** + * Base class that represents a row from the 'getName() ?>' table. + * + * getDescription() ?> + * + + * This class was autogenerated by Propel on: + * + * [] + * + + * You should not use this class directly. It should not even be + * extended; all references should be to getPhpName() ?> class. + * + * @package + */ +class getPhpName() ?> extends +{ + /** + * The Peer class. + * Instance provides a convenient way of calling static methods on a class + * that calling code may not be able to identify. + * @var getPhpName() ?>Peer + */ + var $peer; + +isAlias()) +{ + foreach ($table->getColumns() as $col) + { + $cptype = $col->getPhpNative(); + $clo=strtolower($col->getName()); + $defVal = ""; + if (($val = $col->getPhpDefaultValue()) !== null) { + settype($val, $cptype); + $defaultValue = var_export($val, true); + $defVal = " = " . $defaultValue; + } +?> + /** + * The value for the field. + * @var + */ + var $; + +isLazyLoad()) { +?> + /** + * Whether the lazy-loaded value has been loaded from database. + * This is necessary to avoid repeated lookups if column is NULL. + * @var boolean + */ + var $_isLoaded = false; + +isLazyLoad()) */ + } /* foreach ($table->getColumns() as $col) */ + + foreach ($table->getColumns() as $col) + { + $cfc=$col->getPhpName(); + $clo=strtolower($col->getName()); + $cptype = $col->getPhpNative(); + + $defaultValue = null; + if (($val = $col->getPhpDefaultValue()) !== null) { + settype($val, $cptype); + $defaultValue = var_export($val, true); + } + + if ($col->getType() === PropelTypes::DATE || $col->getType() === PropelTypes::TIME || $col->getType() === PropelTypes::TIMESTAMP) + { + // these default values are based on the Creole defaults + // the date and time default formats are locale-sensitive + if ($col->getType() === PropelTypes::DATE) { + $defaultfmt = '%x'; + } elseif ($col->getType() === PropelTypes::TIME) { + $defaultfmt = '%X'; + } elseif ($col->getType() === PropelTypes::TIMESTAMP) { + $defaultfmt = 'Y-m-d H:i:s'; + } +?> + /** + * Get the [optionally formatted] `` value. + * getDescription() ?> + * + * @param string $format The date/time format string (either date()-style or strftime()-style). + * If format is NULL, then the integer unix timestamp will be returned. + * @return mixed Formatted date/time value as string or integer unix timestamp (if format is NULL) on success, + * PropelException, if unable to convert the date/time to timestamp. + */ + function get($format = '') + { +isLazyLoad()) { +?> + if (! $this->_isLoaded && $this-> === null && !$this->isNew()) { + if (($e = $this->load()) !== true) { + return $e; + } + } +isLazyLoad) */ +?> + if ($this-> === null || $this-> === '') { + return null; + } elseif (!is_int($this->)) { + // a non-timestamp value was set externally, so we convert it + $ts = strtotime($this->); + if ($ts === -1) { + return new PropelException(PROPEL_ERROR_INVALID, "Unable to parse value of as date/time value: " . $this->); + } + } else { + $ts = $this->; + } + if ($format === null) { + return $ts; + } elseif (strpos($format, '%') !== false) { + return strftime($format, $ts); + } else { + return date($format, $ts); + } + } + +getType() != DATE | TIME | TIMESTAMP */ +?> + /** + * Get the column value. + * getDescription() ?> + * + * @return + */ + function get() + { +isLazyLoad()) + { +?> + if (! $this->_isLoaded && $this-> === null && !$this->isNew()) { + if (($e = $this->load()) !== true) { + return $e; + } + } + +isLazyLoad */ +?> + return $this->; + } +getType() != DATE | TIME | TIMESTAMP */ +?> + +isLazyLoad()) + { +?> + /** + * Load the value for the [lazy-load] `` column. + * + * This method performs an additional query to return the value for + * the `` column, since it is not populated by + * the hydrate() method. + * + * @return void + * @returns mixed boolean TRUE on success, PropelException - any underlying error will be wrapped and re-thrown. + */ + function load() + { + $c = $this->buildPkeyCriteria(); + $c->addSelectColumn(getPhpName()) ?>()); + + $rs =& getPhpName()?>Peer::doSelectRS($c); + + if (Propel::isError($e =& $rs) || Propel::isError($e = $rs->next())) { + return new PropelException(PROPEL_ERROR, "Error loading value for `` column on demand.", $e); + } + +getType())); + $clo = strtolower($col->getName()); + switch($col->getType()) + { + case PropelTypes::DATE: + case PropelTypes::TIME: + case PropelTypes::TIMESTAMP: +?> + $this-> = $rs->get(1, null); + + $this-> = $rs->get(1); +getType */ +?> + if (Propel::isError($this->)) { + return new PropelException(PROPEL_ERROR, "Error loading value for `` column on demand.", $this->); + } + + $this->_isLoaded = true; + + return true; + } + +isLazyLoad */ + + if (! $table->isReadOnly()) + { + $throwsClause = ""; + if ($complexObjectModel) + { + if ($col->isForeignKey()) { + $throwsClause = "@throws PropelException"; + } + if (count($col->getReferrers()) > 0 ) { + if ($throwsClause == "") { + $throwsClause = "@throws PropelException"; + } + } + } + if ($col->getType() === PropelTypes::DATE || $col->getType() === PropelTypes::TIME || $col->getType() === PropelTypes::TIMESTAMP) { + $throwsClause = "@throws PropelException - If passed [not-null] date/time is in an invalid format."; + } +?> + /** + * Set the value of `` + * getDescription() ?> + * + * @param $v new value + * @return void + * + */ + function set($v) + { +isLazyLoad()) + { +?> + // explicitly set the is-loaded flag to true for this lazy load col; + // it doesn't matter if the value is actually set or not (logic below) as + // any attempt to set the value means that no db lookup should be performed + // when the get() method is called. + $this->_isLoaded = true; +isLazyLoad */ + + if ($addSaveMethod) + { + if ($col->isLob()) + { + // Setting of LOB columns gets some special handling + if ($col->getPropelType() === PropelTypes::BLOB || $col->getPropelType() === PropelTypes::LONGVARBINARY ) { + $lobClass = "Blob"; + } else { + $lobClass = "Clob"; + } +?> + // if the passed in parameter is the *same* object that + // is stored internally then we use the Lob->isModified() + // method to know whether contents changed. + if (is_a($v, 'Lob') && $v === $this->) { + $changed = $v->isModified(); + } else { + $changed = ($this-> !== $v); + } + if ($changed) { + if ( ! is_a($v, 'Lob') ) { + $obj = new (); + $obj->setContents($v); + } else { + $obj =& $v; + } + $this-> = $obj; + $this->modifiedColumns[] = getPhpName()) ?>(); + } +getType() === PropelTypes::DATE || $col->getType() === PropelTypes::TIME || $col->getType() === PropelTypes::TIMESTAMP) + { + // Setting a DATE/TIME value gets some special handling. +?> + if ($v !== null && !is_int($v)) { + $ts = strtotime($v); + if ($ts === -1) { + return new PropelException(PROPEL_ERROR_INVALID, "Unable to parse date/time value for from input: " . var_export($v, true)); + } + } else { + $ts = $v; + } + + if ($this-> !== $ts || $ts === ) { + $this-> = $ts; + $this->modifiedColumns[] = getPhpName()) ?>(); + } + + if ($this-> !== $v || $v === ) { + $this-> = $v; + $this->modifiedColumns[] = getPhpName()) ?>(); + } + + + $this-> =& $v; + +isForeignKey()) + { + $tblFK = $table->getDatabase()->getTable($col->getRelatedTableName()); + $colFK = $tblFK->getColumn($col->getRelatedColumnName()); + if ($col->isMultipleFK() || $col->getRelatedTableName() == $table->getName()) { + $relCol = ""; + foreach ($col->getForeignKey()->getLocalColumns() as $columnName) { + $column = $table->getColumn($columnName); + $relCol .= $column->getPhpName(); + } + if ($relCol != "") { + $relCol = "RelatedBy".$relCol; + } + $varName = "a".$tblFK->getPhpName() . $relCol; + } else { + $varName = "a".$tblFK->getPhpName(); + } +?> + if ($this-> !== null && $this->->getgetPhpName() ?>() !== $v) { + /* + * Save a reference to null instead of null directly as this would + * overwrite a previous stored getPhpName() ?> object. + */ + $this-> =& Propel::null(); + } +isForeignKey) */ + + foreach ($col->getReferrers() as $fk) + { + // used to be getLocalForeignMapping() which did not work. + $flmap = $fk->getForeignLocalMapping(); + $fkColName = $flmap[$col->getName()]; + $tblFK = $fk->getTable(); + if ( $tblFK->getName() != $table->getName() ) + { + $colFK = $tblFK->getColumn($fkColName); + if ($colFK->isMultipleFK()) { + $collName = "coll" . $tblFK->getPhpName() . "sRelatedBy" . $colFK->getPhpName(); + } else { + $collName = "coll" . $tblFK->getPhpName() . "s"; + } +?> + + // update associated getPhpName() ?> + + if ($this-> !== null) { + for ($i=0,$size=count($this->); $i < $size; $i++) { + $this->[$i]->setgetPhpName()?>($v); + } + } + + } + +isReadOnly() */ + } /* foreach ($table->getColumns() as $col) */ +?> + /** + * Hydrates (populates) the object variables with values from the database resultset. + * + * An offset (1-based "start column") is specified so that objects can be hydrated + * with a subset of the columns in the resultset rows. This is needed, for example, + * for results of JOIN queries where the resultset row includes columns from two or + * more tables. + * + * @param ResultSet $rs The ResultSet class with cursor advanced to desired record pos. + * @param int $startcol 1-based offset column which indicates which restultset column to start with. + * @return int next starting column + * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. + */ + function hydrate(&$rs, $startcol = 1) + { + assert('is_a($rs, "ResultSet")'); + +getColumns() as $col) + { + if (! $col->isLazyLoad()) + { + $affix = CreoleTypes::getAffix(CreoleTypes::getCreoleCode($col->getType())); + $clo = strtolower($col->getName()); + switch($col->getType()) + { + case PropelTypes::DATE: + case PropelTypes::TIME: + case PropelTypes::TIMESTAMP: +?> + if (Creole::isError($value = $rs->get($startcol + , null))) { + return new PropelException(PROPEL_ERROR_DB, "Error populating getPhpName()?> object", $value); + } + + $this-> = $value; + + if (Creole::isError($value = $rs->get($startcol + ))) { + return new PropelException(PROPEL_ERROR_DB, "Error populating object", $value); + } + + $this-> = $value; +isLazyLoad() */ + } /* foreach ($table->getColumns() as $col) */ + + if ($addSaveMethod) + { +?> + $this->resetModified(); + + $this->setNew(false); + return $startcol + ; + } + + /** + * Builds a Criteria object containing the primary key for this object. + * + * Unlike buildCriteria() this method includes the primary key values regardless + * of whether or not they have been modified. + * + * @return Criteria The Criteria object containing value(s) for primary key(s). + */ + function &buildPkeyCriteria() + { + $criteria = new Criteria(getPhpName()?>Peer::DATABASE_NAME()); +getColumns() as $col) + { + $clo = strtolower($col->getName()); + if ($col->isPrimaryKey()) + { +?> + $criteria->add(getPhpName()) ?>(), $this->); +isPrimaryKey */ + } /* foreach ($table->getColumns() as $col) */ +?> + return $criteria; + } + + /** + * Build a Criteria object containing the values of all modified columns in this object. + * + * @return Criteria The Criteria object containing all modified values. + */ + function &buildCriteria() + { + $criteria = new Criteria(getPhpName()?>Peer::DATABASE_NAME()); + +getColumns() as $col) + { + $clo = strtolower($col->getName()); +?> + if ($this->isColumnModified(getPhpName()) ?>())) { + $criteria->add(getPhpName()) ?>(), $this->); + } + + + return $criteria; + } + +isAlias */ + +// association code +if ($complexObjectModel) +{ + $pVars = array(); // Array of object set method names for later reference. + $aVars = array(); // Array of object field names for later reference. + + foreach ($table->getForeignKeys() as $fk) + { + $tblFK = $table->getDatabase()->getTable($fk->getForeignTableName()); + $className = $tblFK->getPhpName(); + + $tblFKPackage = ($tblFK->getPackage() ? $tblFK->getPackage() : $package); + $tblFKPackagePath = strtr($tblFKPackage, '.', '/'); + if ($tblFKPackagePath != "") { + $tblFKPackagePath .= '/'; + } + + $relCol = ""; + foreach ($fk->getLocalColumns() as $columnName) { + $column = $table->getColumn($columnName); + if ($column->isMultipleFK() || $fk->getForeignTableName() == $table->getName()) { + $relCol .= $column->getPhpName(); + } + } + + if ($relCol != "") { + $relCol = "RelatedBy" . $relCol; + } + + $pVarName = $className . $relCol; + $varName = "a" . $pVarName; + $retVal = ($pVars[] = $pVarName); + $retVal = ($aVars[] = $varName); +?> + /** + * @var + */ + var $; + + /** + * Declares an association between this object and a object + * + * @param $v + * @return void + * @throws PropelException + */ + function set(&$v) + { +getLocalColumns() as $columnName) + { + $column = $table->getColumn($columnName); + $lfmap = $fk->getLocalForeignMapping(); + $colFKName = $lfmap[$columnName]; + $colFK = $tblFK->getColumn($colFKName); +?> + if ($v === null) { + $this->setgetPhpName() ?>(getPhpDefaultValue()) ?>); + } else { + $this->setgetPhpName() ?>($v->getgetPhpName() ?>()); + } + + + $this-> =& $v; + } + +getLocalColumns() as $columnName) + { + $column = $table->getColumn($columnName); + $cptype = $column->getPhpNative(); + $clo = strtolower($column->getName()); + if ($cptype == "integer" || $cptype == "float" || $cptype == "double") { + $conditional .= $and . "\$this->". $clo ." > 0"; + } elseif($cptype == "string") { + $conditional .= $and . "(\$this->" . $clo ." !== \"\" && \$this->".$clo." !== null)"; + } else { + $conditional .= $and . "\$this->" . $clo ." !== null"; + } + $arglist .= $comma . "\$this->" . $clo; + $and = " && "; + $comma = ", "; + $argsize = $argsize + 1; + } + + $pCollName = $table->getPhpName() . 's' . $relCol; +?> + /** + * Get the associated object + * + * @return The associated object. + * @throws PropelException + */ + function & get() + { + // include the Peer class + include_once 'Peer.php'; + + if ($this-> === null && ()) + { +isAlias()) + { + if ($argsize > 1) { +?> + $ =& Peer::retrieveByPK(); + + $ =& Peer::retrieveByPK(); + 1) */ + } + else + { + if ($argsize > 1) { +?> + $ =& Peer::retrieveByPK(); + + $ =& Peer::retrieveByPK(); +isAlias +?> + if (Propel::isError($)) { return $; } + + $this-> =& $; + + /* The following can be used instead of the line above to + guarantee the related object contains a reference + to this object, but this level of coupling + may be undesirable in many circumstances. + As it can lead to a db query with many results that may + never be used. + $obj = Peer::retrieveByPK(); + $obj->add($this); + */ + } + + return $this->; + } + + /** + * Provides convenient way to set a relationship based on a + * key. e.g. + * $bar->setFooKey($foo->getPrimaryKey()) + * +getLocalColumns()) > 1) { +?> + * Note: It is important that the xml schema used to create this class + * maintains consistency in the order of related columns between + * getName() ?> and getName() ?>. + * If for some reason this is impossible, this method should be + * overridden in getPhpName() ?>. + + * @return void + * @throws PropelException + */ + function setKey($key) + { +getLocalColumns()) > 1) + { + $i = 0; + foreach ($fk->getLocalColumns() as $colName) + { + $col = $table->getColumn($colName); + $fktype = $col->getPhpNative(); +?> + $this->setgetPhpName() ?>( () $key[] ); +getLocalColumns(); + $colName = $lcols[0]; + $col = $table->getColumn($colName); + $fktype = $col->getPhpNative(); +?> + $this->setgetPhpName() ?>( () $key); + + } + +getReferrers() as $fk) + { + $tblFK = $fk->getTable(); + $tblFKPackage = ($tblFK->getPackage() ? $tblFK->getPackage() : $package); + $tblFKPackagePath = strtr($tblFKPackage, '.', '/'); + if ($tblFKPackagePath != "") { + $tblFKPackagePath .= '/'; + } + + $className = $tblFK->getPhpName(); + $relatedByCol = ""; + foreach ($fk->getLocalColumns() as $columnName) { + $column = $tblFK->getColumn($columnName); + if ($column->isMultipleFK() || $tblFK->getName() == $table->getName()) { + // if there are seeral foreign keys that point to the same table + // then we need to generate methods like getAuthorRelatedByColName() + // instead of just getAuthor(). Currently we are doing the same + // for self-referential foreign keys, to avoid confusion. + $relatedByCol .= $column->getPhpName(); + } + } + + if ($relatedByCol == "") { + $suffix = ""; + $relCol = $className . "s"; + $relColMs = $className; + } else { + $suffix = "RelatedBy" . $relatedByCol; + $relCol= $className . "sRelatedBy" . $relatedByCol; + $relColMs= $className . "RelatedBy" . $relatedByCol; + } + $collName = "coll" . $relCol; +?> + /** + * Collection to store aggregation of + * @var array + */ + var $; + + /** + * Temporary storage of to save a possible db hit in + * the event objects are add to the collection, but the + * complete collection is never requested. + * @return void + */ + function init() + { + if ($this-> === null) { + $this-> = array(); + } + } + + /** + * Method called to associate a getPhpName() ?> object to this object + * through the foreign key attribute + * + * @param $l $className + * @return void + * @throws PropelException + */ + function add(/**/ &$l) + { + $this->[] =& $l; + $l->setgetPhpName() . $suffix ?>($this); + } + + /** + * The criteria used to select the current contents of . + * @var Criteria + */ + var $lastCriteria = null; + + /** + * Returns the number of related + * + * @param Criteria $criteria + * @param boolean $distinct + * @throws PropelException + */ + function count($criteria = null, $distinct = false) + { + // include the Peer class + include_once 'Peer.php'; + if ($criteria === null) { + $criteria = new Criteria(); + } +getForeignColumns() as $columnName) { + $column = $table->getColumn($columnName); + // used to be getLocalForeignMapping() but that didn't seem to work + // (maybe a problem in translation of HashTable code to PHP). + $flmap = $fk->getForeignLocalMapping(); + $colFKName = $flmap[$columnName]; + $colFK = $tblFK->getColumn($colFKName); +?> + $criteria->add((), $this->getgetPhpName() ?>() ); +getForeignColumns() +?> + return Peer::doCount($criteria, $distinct); + } + + /** + * If this collection has already been initialized with + * an identical criteria, it returns the collection. + * Otherwise if this getPhpName() ?> has previously + * been saved, it will retrieve related ${relCol} from storage. + * If this getPhpName() ?> is new, it will return + * an empty collection or the current collection, the criteria + * is ignored on a new object. + * + * @param Criteria $criteria + * @throws PropelException + */ + function & get($criteria = null) + { + // include the Peer class + include_once 'Peer.php'; + + if ($criteria === null) { + $criteria = new Criteria(); + } + + if ($this-> === null) + { + if ($this->isNew()) { + $this-> = array(); + } else { +getForeignColumns() as $columnName) + { + $column = $table->getColumn($columnName); + // used to be getLocalForeignMapping() but that didn't seem to work + // (maybe a problem in translation of HashTable code to PHP). + $flmap = $fk->getForeignLocalMapping(); + $colFKName = $flmap[$columnName]; + $colFK = $tblFK->getColumn($colFKName); +?> + $criteria->add((), $this->getgetPhpName() ?>() ); +getForeignColumns()) */ +?> + + $ =& Peer::doSelect($criteria); + if (Propel::isError($)) { return $; } + + $this-> =& $; + } + } else { + // criteria has no effect for a new object + if (!$this->isNew()) + { + // the following code is to determine if a new query is + // called for. If the criteria is the same as the last + // one, just return the collection. +getForeignColumns() as $columnName) + { + $column = $table->getColumn($columnName); + $flmap = $fk->getForeignLocalMapping(); + $colFKName = $flmap[$columnName]; + $colFK = $tblFK->getColumn($colFKName); +?> + $criteria->add((), $this->getgetPhpName() ?>()); + +getForeignColumns()) */ +?> + if (!isset($this->lastCriteria) || !$this->lastCriteria->equals($criteria)) + { + $ =& Peer::doSelect($criteria); + if (Propel::isError($)) { return $; } + + $this-> =& $; + } + } + } + + $this->lastCriteria = $criteria; + + return $this->; + } + +getForeignKeys() as $dummyFK) { + $countFK = $countFK + 1; + } + +// ------------------------------------------------------------ +// + if ($countFK >= 1) + { + $lastTable = ""; + foreach ($tblFK->getForeignKeys() as $fk2) + { + // Add join methods if the fk2 table is not this table or + // the fk2 table references this table multiple times. + + $doJoinGet = true; + if ( $fk2->getForeignTableName() == $table->getName() ) { + $doJoinGet = false; + } + + foreach ($fk2->getLocalColumns() as $columnName) { + $column = $tblFK->getColumn($columnName); + if ($column->isMultipleFK()) { + $doJoinGet = true; + } + } + + $tblFK2 = $table->getDatabase()->getTable($fk2->getForeignTableName()); + $doJoinGet = !$tblFK2->isForReferenceOnly(); + $relatedByCol2 = ""; + foreach ($fk2->getLocalColumns() as $columnName) { + $column = $tblFK->getColumn($columnName); + if ($column->isMultipleFK()) { + $relatedByCol2 .= $column->getPhpName(); + } + } + + $fkClassName = $tblFK2->getPhpName(); + + // do not generate code for self-referencing fk's, it would be + // good to do, but it is just not implemented yet. + if ($className == $fkClassName) { + // $doJoinGet = false; -- SELF REFERENCING FKs UNDER TESTING + } + + if ($relatedByCol2 == "") { + $relCol2 = $fkClassName; + } else { + $relCol2 = $fkClassName . "RelatedBy". $relatedByCol2; + } + + if ( $relatedByCol == "") { + // nothing? + } else { + if ( $relatedByCol == $relatedByCol2 ) { + $doJoinGet = false; + } + } + + if ($doJoinGet) + { +?> + /** + * If this collection has already been initialized with + * an identical criteria, it returns the collection. + * Otherwise if this getPhpName() ?> is new, it will return + * an empty collection; or if this getPhpName() ?> has previously + * been saved, it will retrieve related from storage. + * + * This method is protected by default in order to keep the public + * api reasonable. You can provide public methods for those you + * actually need in getPhpName() ?>. + */ + function & getJoin($criteria = null) + { + // include the Peer class + include_once 'Peer.php'; + + if ($criteria === null) { + $criteria = new Criteria(); + } + + if ($this-> === null) { + if ($this->isNew()) { + $this-> = array(); + } else { +getForeignColumns() as $columnName) + { + $column = $table->getColumn($columnName); + $flMap = $fk->getForeignLocalMapping(); + $colFKName = $flMap[$columnName]; + $colFK = $tblFK->getColumn($colFKName); +?> + $criteria->add((), $this->getgetPhpName() ?>()); +getForeignColumns()) */ +?> + + $ =& Peer::doSelectJoin($criteria); + if (Propel::isError($)) { return $; } + + $this-> =& $; + } + } else { + // the following code is to determine if a new query is + // called for. If the criteria is the same as the last + // one, just return the collection. +getForeignColumns() as $columnName) + { + $column = $table->getColumn($columnName); + $flMap = $fk->getForeignLocalMapping(); + $colFKName = $flMap[$columnName]; + $colFK = $tblFK->getColumn($colFKName); +?> + $criteria->add((), $this->getgetPhpName() ?>()); + +getForeignColumns()) */ +?> + if (!isset($this->lastCriteria) || !$this->lastCriteria->equals($criteria)) + { + $ =& Peer::doSelectJoin($criteria); + if (Propel::isError($)) { return $; } + + $this-> =& $; + } + } + $this->lastCriteria = $criteria; + + return $this->; + } + +getForeignKeys() as $fk2) {*/ + } /* if countFK >= 1 */ + } /*ends foreach over table->getReferrers() */ +} /* the if(complexObjectModel) */ + +// +// add GenericAccessors or GenericMutators? +// +if (!$table->isAlias() && ($addGenericAccessors || ($addGenericMutators && !$table->isReadOnly()))) +{ + $tableColumns = $table->getColumns(); + $tablePhpname = $table->getPhpName(); +?> + /** + * Generate a list of field names. + * + * @return array A list of field names + */ + function & getFieldNames($type = TYPE_FIELDNAME) + { + static $fieldNames = array( + TYPE_PHPNAME => array ('getPhpName(); ?>', ), + TYPE_COLNAME => array ('getName() . '.' . strtoupper($col->getName()) ?>', ), + TYPE_FIELDNAME => array ('getName(); ?>', ), + TYPE_NUM => array ( $col) { echo $num; ?>, ) + ); + + if (!isset($fieldNames[$type])) { + return new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants TYPE_PHPNAME, TYPE_COLNAME, TYPE_FIELDNAME, TYPE_NUM. ' . $type . ' was given.'); + } + + return $fieldNames[$type]; + } + + /** + * Translates a fieldname to another type + * + * @param string $name field name + * @param string $fromType One of the class type constants TYPE_PHPNAME, + * TYPE_COLNAME, TYPE_FIELDNAME, TYPE_NUM + * @param string $toType One of the class type constants + * @return string translated name of the field. + */ + function translateFieldName($name, $fromType, $toType) + { + static $fieldKeys = array ( + TYPE_PHPNAME => array ( $col) { ?>'getPhpName(); ?>' => , ), + TYPE_COLNAME => array ( $col) { ?>'getName() . '.' . strtoupper($col->getName()) ?>' => , ), + TYPE_FIELDNAME => array ( $col) { ?>'getName(); ?>' => , ), + TYPE_NUM => array ( $col) { echo $num; ?>, ) + ); + + $toNames =& $this->getFieldNames($toType); + $key = $fieldKeys[$fromType][$name]; + + if ($key === false) { + return new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r($fromNames, true)); + } + + return $toNames[$key]; + } + + + /** + * Retrieves a field from the object by name passed in as a string. + * + * @param string $name name + * @param string $type The type of fieldname the $name is of: + * one of the class type constants TYPE_PHPNAME, + * TYPE_COLNAME, TYPE_FIELDNAME, TYPE_NUM + * @return mixed Value of field. + */ + function & getByName($name, $type = TYPE_COLNAME) + { + $pos = $this->translateFieldName($name, $type, TYPE_NUM); + return $this->getByPosition($pos); + } + + /** + * Retrieves a field from the object by Position as specified + * in the xml schema. Zero-based. + * + * @param int $pos position in xml schema + * @return mixed Value of field at $pos + */ + function & getByPosition($pos) + { + switch($pos) + { +getColumns() as $col) + { + $cfc = $col->getPhpName(); + $cptype = $col->getPhpNative();// not safe to use it because some methods may return objects (Blob) +?> + case : + return $this->get(); + break; + + default: + return null; + } // switch() + } + + /** + * Exports the object as an array. + * + * You can specify the key type of the array by passing one of the class + * type constants. + * + * @param string $keyType One of the class type constants TYPE_PHPNAME, + * TYPE_COLNAME, TYPE_FIELDNAME, TYPE_NUM + * @return an associative array containing the field names (as keys) and field values + */ + function & toArray($keyType = TYPE_PHPNAME) + { + $keys =& $this->getFieldNames($keyType); + $result = array( +getColumns() as $num => $col) { +?> + $keys[] => $this->getgetPhpName() ?>(), + + ); + return $result; + } + + + + +isReadOnly()) { ?> + + /** + * Sets a field value from the object by name passed in as a string. + * + * @param string $name peer name + * @param mixed $value field value + * @param string $type The type of fieldname the $name is of: + * one of the class type constants TYPE_PHPNAME, + * TYPE_COLNAME, TYPE_FIELDNAME, TYPE_NUM + * @return void + */ + function setByName($name, &$value, $type = TYPE_COLNAME) + { + $names =& $this->getFieldnames($type); + $pos = array_search($name, $names); + return $this->setByPosition($pos, $value); + } + + /** + * Sets a field from the object by Position as specified + * in the xml schema. Zero-based. + * + * @param int $pos position in xml schema + * @param mixed $value field value + * @return void + */ + function setByPosition($pos, &$value) + { + switch($pos) + { +getColumns() as $col) + { + $cfc = $col->getPhpName(); + $cptype = $col->getPhpNative(); +?> + case : + $this->set($value); + break; + + } // switch() + } + + /** + * Populates the object using an array. + * + * This is particularly useful when populating an object from one of the + * request arrays (e.g. $_POST). This method goes through the column + * names, checking to see whether a matching key exists in populated + * array. If so the setByName() method is called for that column. + * + * You can specify the key type of the array by additionally passing one + * of the class type constants TYPE_PHPNAME, TYPE_COLNAME, TYPE_FIELDNAME, + * TYPE_NUM. The default key type is the (peer) column name (e.g. + * 'book.AUTHOR_ID') + * + * @param array $arr An array to populate the object from. + * @param string $keyType The type of keys the array uses. + * @return void + */ + function fromArray(&$arr, $keyType = TYPE_COLNAME) + { + $keys =& $this->getFieldNames($keyType); +getColumns() as $num => $col) { + $cfc = $col->getPhpName(); + $cptype = $col->getPhpNative(); +?> + if (array_key_exists($keys[], $arr)) $this->set($arr[$keys[]]); + + } + + + +isAlias() && isset($addSaveMethod) && $addSaveMethod && ! $table->isReadOnly()) { ?> + + /** + * Removes this object from datastore and sets delete attribute. + * + * @return mixed TRUE on success, PropelException on failure. + * @throws PropelException + * @see BaseObject::setDeleted() + * @see BaseObject::isDeleted() + */ + function delete() + { + if ($this->isDeleted()) { + return new PropelException(PROPEL_ERROR, "This object has already been deleted."); + } + + $con =& Propel::getConnection(getPhpName() ?>Peer::DATABASE_NAME()); + if (Propel::isError($con)) { return $con; } + + $e = $con->begin(); + if (Creole::isError($e)) { $con->rollback(); return new PropelException(PROPEL_ERROR_DB, $e); } + + $e = getPhpName() ?>Peer::doDelete($this, Param::set($con)); + if (Propel::isError($e)) { $con->rollback(); return $e; } + + $this->setDeleted(true); + + $e = $con->commit(); + if (Creole::isError($e)) { $con->rollback(); return new PropelException(PROPEL_ERROR_DB, $e); } + + return true; + } + + + + /** + * flag to prevent endless save loop, if this object is referenced + * by another object which falls in this transaction. + * @var boolean + */ + var $alreadyInSave = false; + + /** + * Stores the object in the database. If the object is new, + * it inserts it; otherwise an update is performed. This method + * wraps the doSave() worker method in a transaction. + * + * @return mixed TRUE on success, PropelException on failure. + */ + function save() + { + if ($this->isDeleted()) { + return new PropelException(PROPEL_ERROR, "You cannot save an object that has been deleted."); + } + + $con =& Propel::getConnection(getPhpName() ?>Peer::DATABASE_NAME()); + if (Propel::isError($con)) { return $con; } + + $e = $con->begin(); + if (Creole::isError($e)) { $con->rollback(); return new PropelException(PROPEL_ERROR_DB, $e); } + + $e = $this->doSave(Param::set($con)); + if (Propel::isError($e)) { $con->rollback(); return $e; } + + $e = $con->commit(); + if (Creole::isError($e)) { $con->rollback(); return new PropelException(PROPEL_ERROR_DB, $e); } + + return true; + } + + + /** + * Stores the object in the database. If the object is new, + * it inserts it; otherwise an update is performed. + * + * @return void + * @throws PropelException + */ + + function doSave($con = null) + + function save() + + { + if ($this->isDeleted()) { + return new PropelException(PROPEL_ERROR, "You cannot save an object that has been deleted."); + } + + $con =& Propel::getConnection(getPhpName() ?>Peer::DATABASE_NAME()); + if (Propel::isError($con)) { return $con; } + + + /* [MA] temporarily check */ + Propel::assertParam($con, 'getPhpName(); ?>', 'save', 1); + + if (! $this->alreadyInSave) { + $this->alreadyInSave = true; + + + // We call the save method on the following object(s) if they + // were passed to this object by their coresponding set + // method. This object relates to these object(s) by a + // foreign key reference. + + if ($this-> !== null) { + if ($this->->isModified()) { + if (Propel::isError($e = $this->->save())) { + return $e; + } + } + $this->set($this->); + } + + + // If this object has been modified, then save it to the database. + if ($this->isModified()) { + if ($this->isNew()) { + $pk = getPhpName() ?>Peer::doInsert($this, $conParam::set($con)); + if (Propel::isError($pk)) { return $pk; } +getIdMethod() != "none") { + if (count($pks = $table->getPrimaryKey())) { + foreach ($pks as $pk) { + if ($pk->isAutoIncrement()) { +?> + $this->setgetPhpName();?>( $pk ); //[IMV] update autoincrement primary key + + $this->setNew(false); + } + else { + $e = getPhpName() ?>Peer::doUpdate($this, $conParam::set($con)); + if (Propel::isError($e)) { return $e; } + } + $this->resetModified(); // [HL] After being saved an object is no longer 'modified' + } + +getReferrers() as $fk) + { + $tblFK = $fk->getTable(); + if ( $tblFK->getName() != $table->getName() ) + { + $className = $tblFK->getPhpName(); + $relCol = ""; + foreach ($fk->getLocalColumns() as $columnName) { + $column = $tblFK->getColumn($columnName); + if ($column->isMultipleFK()) { + $relCol .= $column->getPhpName(); + } + } + + if ($relCol == "") { + $relCol = $className . "s"; + } else { + $relCol = $className . "sRelatedBy" . $relCol; + } + + $collName = "coll" . $relCol; +?> + if ($this-> !== null) { + for ($i=0,$size=count($this->); $i < $size; $i++) { + if (Propel::isError($e = $this->[$i]->save())) { + return $e; + } + } + } + + + $this->alreadyInSave = false; + } + + + return true; + } + +isAlias && isset .... */ + +if (! $table->isAlias() && ! $table->isReadOnly()) +{ +?> + /** + * Validates the objects modified field values. + + * This includes all objects related to this table. + + * + * If $columns is either a column name or an array of column names + * only those columns are validated. + * + * @param mixed $columns Column name or an array of column names. + * + * @return mixed true if all columns pass validation + * or an array of ValidationFailed objects for columns that fail. + */ + function & validate($columns = null) + { + if ($columns) + { + return getPhpName()?>Peer::doValidate($this, $columns); + } + + + return getPhpName()?>Peer::doValidate($this); + + return $this->doValidate(); + + } + + + /** + * flag to prevent endless validation loop, if this object is referenced + * by another object which falls in this transaction. + * @var boolean + */ + var $alreadyInValidation = false; + + /** + * This function performs the validation work for complex object models. + * + * In addition to checking the current object, all related objects will + * also be validated. If all pass then true is returned; otherwise + * an aggreagated array of ValidationFailed objects will be returned. + * + * @return mixed true if all validations pass; array of ValidationFailed objets otherwise. + */ + function & doValidate() + { + if (! $this->alreadyInValidation) + { + $this->alreadyInValidation = true; + $retval = null; + $failureMap = array(); + + + // We call the validate method on the following object(s) if they + // were passed to this object by their coresponding set + // method. This object relates to these object(s) by a + // foreign key reference. + + if ($this-> !== null) { + if (($retval = $this->->validate()) !== true) { + $failureMap = array_merge($failureMap, $retval); + } + } + + + if (($retval = getPhpName()?>Peer::doValidate($this)) !== true) { + $failureMap = array_merge($failureMap, $retval); + } + +getReferrers() as $fk) + { + $tblFK = $fk->getTable(); + if ( $tblFK->getName() != $table->getName() ) + { + $className = $tblFK->getPhpName(); + $relCol = ""; + foreach ($fk->getLocalColumns() as $columnName) { + $column = $tblFK->getColumn($columnName); + if ($column->isMultipleFK()) { + $relCol .= $column->getPhpName(); + } + } + + if ($relCol == "") { + $relCol = $className . "s"; + } else { + $relCol = $className . "sRelatedBy" . $relCol; + } + + $collName = "coll" . $relCol; +?> + if ($this-> !== null) { + for ($i=0,$size=count($this->); $i < $size; $i++) { + if (($retval = $this->[$i]->validate()) !== true) { + $failureMap = array_merge($failureMap, $retval); + } + } + } + + + $this->alreadyInValidation = false; + return (!empty($failureMap) ? $failureMap : true); + } + + return true; + } + +isAlias()) +{ + if (! $table->isReadOnly()) + { + $throwsClause = "@throws PropelException"; + if (count($table->getPrimaryKey()) == 1) + { + $pkeys = $table->getPrimaryKey(); + $col = $pkeys[0]; + $clo=strtolower($col->getName()); + $cptype= $col->getPhpNative(); +?> + /** + * Set the PrimaryKey. + * + * @param mixed Primary key. + * @return void + * + */ + function setPrimaryKey($key) + { + $this->setgetPhpName() ?>($key); + } + +getPrimaryKey()) > 1) + { +?> + var $pks = array(); + + /** + * Set the PrimaryKey. + * + * @param array $keys The elements of the composite key (order must match the order in XML file). + * @return void + * @throws PropelException + */ + function setPrimaryKey($keys) + { +getPrimaryKey() as $pk) + { + $pktype = $pk->getPhpNative(); +?> + $this->setgetPhpName() ?>($keys[]); +getPrimaryKey() as $pk) */ +?> + } + +getPrimaryKey()) == 1) */ +?> + + /** + * Dummy primary key setter. + * For now this function needs to exist because it's mandated in the Persistent + * interface, and because other methods will attempt to set the primary key. + * + * This should be removed in favor of more complex template work. + */ + function setPrimaryKey($pk) + { + // do nothing, because this doesn't support primary keys + } +getPrimaryKey()) == 1) */ + } /* if ! $table->isReadOnly() */ +?> + + /** + * Returns an id that differentiates this object from others + * of its class. + * @return getPrimaryKey()) === 0) { echo "null"; } elseif (count($table->getPrimaryKey()) > 1) { echo "array"; } else { $pkeys = $table->getPrimaryKey(); echo $pkeys[0]->getPhpType(); } ?> + */ + function getPrimaryKey() + { +getPrimaryKey()) == 1) { +?> + return $this->getgetPrimaryKey(); echo $pkeys[0]->getPhpName()?>(); +getPrimaryKey()) > 1) { + $i = 0; + foreach ($table->getPrimaryKey() as $pk) { +?> + $this->pks[] = $this->getgetPhpName() ?>(); +getPrimaryKey() as $pk) */ +?> + return $this->pks; + + + return null; + + } + +isAbstract()) + { +?> + /** + * Makes a copy of this object. + * It creates a new object filling in the simple attributes, but skipping any primary + * keys that are defined for the table. + * + + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * + + * @return getPhpName() ?> Clone of current object. + * @throws PropelException + */ + function copy($deepCopy = false) + { + $copyObj = new getPhpName() ?>(); +getColumns() as $pkcol) { + if ($pkcol->isPrimaryKey()) { + $pkcols[] = $pkcol->getName(); + } + } + + foreach ($table->getColumns() as $col) + { + if (!in_array($col->getName(), $pkcols)) { +?> + $copyObj->setgetPhpName()?>($this->getName()) ?>); +getReferrers()) > 0) + { +?> + + if ($deepCopy) { + // important: setNew(false) because this affects the behavior of + // the getter/setter methods for fkey referrer objects. + $copyObj->setNew(false); +getReferrers() as $fk) + { + $tblFK = $fk->getTable(); + if ( $tblFK->getName() != $table->getName() ) + { + $className = $tblFK->getPhpName(); + $relCol = ""; + foreach ($fk->getLocalColumns() as $columnName) { + $column = $tblFK->getColumn($columnName); + if ($column->isMultipleFK()) { + $relCol .= $column->getPhpName(); + } + } + + if ($relCol == "") { + $pCollName = $className . "s"; + $pCollNameNoS = $className; + } else { + $pCollName = $className . "sRelatedBy".$relCol; + $pCollNameNoS = $className . "RelatedBy".$relCol; + } +?> + + foreach($this->get() as $relObj) { + $copyObj->add($relObj->copy()); + } + + } /* if ($deepCopy) */ + 0 ) */ +?> + + $copyObj->setNew(true); +getColumns() as $col) + { + if ($col->isPrimaryKey()) + { + $coldefval = $col->getDefaultValue(); + // This seems to work pretty well for getting + // the right value (including NULL) + $coldefval = var_export($coldefval, true); +?> + $copyObj->setgetPhpName()?>(); // this is a pkey column, so set to default value +isPrimaryKey + } // foreach +?> + + return $copyObj; + } + +isAbstract()) */ +?> + /** + * Returns a peer instance associated with this om. Since Peer classes + * are not to have any instance attributes, this method returns the + * same instance for all member of this class. The method could therefore + * be static, but this would prevent one from overriding the behavior. + * + * @return getPhpName() ?>Peer + */ + function & getPeer() + { + static $instance; + + if ($instance === null) { + $instance = new getPhpName()?>Peer(); + } + + return $instance; + } +isAlias */ +?> + +} diff --git a/gulliver/thirdparty/propel-generator/templates/om/php4/Peer.tpl b/thirdparty/propel-generator/templates/om/php4/Peer.tpl similarity index 100% rename from gulliver/thirdparty/propel-generator/templates/om/php4/Peer.tpl rename to thirdparty/propel-generator/templates/om/php4/Peer.tpl diff --git a/gulliver/thirdparty/propel-generator/templates/om/php5/ExtensionNode.tpl b/thirdparty/propel-generator/templates/om/php5/ExtensionNode.tpl similarity index 100% rename from gulliver/thirdparty/propel-generator/templates/om/php5/ExtensionNode.tpl rename to thirdparty/propel-generator/templates/om/php5/ExtensionNode.tpl diff --git a/gulliver/thirdparty/propel-generator/templates/om/php5/ExtensionNodePeer.tpl b/thirdparty/propel-generator/templates/om/php5/ExtensionNodePeer.tpl similarity index 100% rename from gulliver/thirdparty/propel-generator/templates/om/php5/ExtensionNodePeer.tpl rename to thirdparty/propel-generator/templates/om/php5/ExtensionNodePeer.tpl diff --git a/gulliver/thirdparty/propel-generator/templates/om/php5/ExtensionObject.tpl b/thirdparty/propel-generator/templates/om/php5/ExtensionObject.tpl similarity index 100% rename from gulliver/thirdparty/propel-generator/templates/om/php5/ExtensionObject.tpl rename to thirdparty/propel-generator/templates/om/php5/ExtensionObject.tpl diff --git a/gulliver/thirdparty/propel-generator/templates/om/php5/ExtensionPeer.tpl b/thirdparty/propel-generator/templates/om/php5/ExtensionPeer.tpl similarity index 100% rename from gulliver/thirdparty/propel-generator/templates/om/php5/ExtensionPeer.tpl rename to thirdparty/propel-generator/templates/om/php5/ExtensionPeer.tpl diff --git a/gulliver/thirdparty/propel-generator/templates/om/php5/Interface.tpl b/thirdparty/propel-generator/templates/om/php5/Interface.tpl similarity index 100% rename from gulliver/thirdparty/propel-generator/templates/om/php5/Interface.tpl rename to thirdparty/propel-generator/templates/om/php5/Interface.tpl diff --git a/gulliver/thirdparty/propel-generator/templates/om/php5/MapBuilder.tpl b/thirdparty/propel-generator/templates/om/php5/MapBuilder.tpl similarity index 100% rename from gulliver/thirdparty/propel-generator/templates/om/php5/MapBuilder.tpl rename to thirdparty/propel-generator/templates/om/php5/MapBuilder.tpl diff --git a/gulliver/thirdparty/propel-generator/templates/om/php5/MultiExtendObject.tpl b/thirdparty/propel-generator/templates/om/php5/MultiExtendObject.tpl similarity index 100% rename from gulliver/thirdparty/propel-generator/templates/om/php5/MultiExtendObject.tpl rename to thirdparty/propel-generator/templates/om/php5/MultiExtendObject.tpl diff --git a/gulliver/thirdparty/propel-generator/templates/om/php5/Node.tpl b/thirdparty/propel-generator/templates/om/php5/Node.tpl similarity index 100% rename from gulliver/thirdparty/propel-generator/templates/om/php5/Node.tpl rename to thirdparty/propel-generator/templates/om/php5/Node.tpl diff --git a/gulliver/thirdparty/propel-generator/templates/om/php5/NodePeer.tpl b/thirdparty/propel-generator/templates/om/php5/NodePeer.tpl similarity index 100% rename from gulliver/thirdparty/propel-generator/templates/om/php5/NodePeer.tpl rename to thirdparty/propel-generator/templates/om/php5/NodePeer.tpl diff --git a/gulliver/thirdparty/propel-generator/templates/om/php5/Object.tpl b/thirdparty/propel-generator/templates/om/php5/Object.tpl similarity index 96% rename from gulliver/thirdparty/propel-generator/templates/om/php5/Object.tpl rename to thirdparty/propel-generator/templates/om/php5/Object.tpl index f12b2a9d1..b3f5d545b 100644 --- a/gulliver/thirdparty/propel-generator/templates/om/php5/Object.tpl +++ b/thirdparty/propel-generator/templates/om/php5/Object.tpl @@ -1,1841 +1,1841 @@ -getDatabase(); -if ($table->getPackage()) { - $package = $table->getPackage(); -} else { - $package = $targetPackage; -} - -$parentClass = ClassTools::getBaseClass($table); -?> - -require_once ''; - - -require_once ''; - -isAlias()) { - - // If any columns in table are BLOB or CLOB then we need to make - // sure those classes are included so we can do things like - // if ($v instanceof Lob) etc. - - $includes_lobs = false; - foreach ($table->getColumns() as $col) { - if ($col->isLob()) { - $includes_lobs = true; - break; - } - } - - if($includes_lobs) { ?> -include_once 'creole/util/Clob.php'; -include_once 'creole/util/Blob.php'; - - -include_once 'propel/util/Criteria.php'; -getForeignKeys() as $fk) { - $tblFK = $table->getDatabase()->getTable($fk->getForeignTableName()); - $className = $tblFK->getPhpName(); - if ($tblFK->getInterface()) { - $className = $tblFK->getInterface(); - } - - $tblFKPackage = ($tblFK->getPackage() ? $tblFK->getPackage() : $package); - $tblFKPackagePath = strtr($tblFKPackage, '.', '/'); - if ($tblFKPackagePath != "") { - $tblFKPackagePath .= '/'; - } ?> - -// (on-demand) include_once ''; -// (on-demand) include_once 'getPhpName() . 'Peer') ?>'; - - -include_once 'getPhpName() . 'Peer') ?>'; - -/** - * Base class that represents a row from the 'getName() ?>' table. - * - * getDescription() ?> - * - - * This class was autogenerated by Propel on: - * - * [] - * - - * You should not use this class directly. It should not even be - * extended; all references should be to getPhpName() ?> class. - * - * @package - */ -abstract class getPhpName() ?> extends implements { - - /** - * The Peer class. - * Instance provides a convenient way of calling static methods on a class - * that calling code may not be able to identify. - * @var getPhpName() ?>Peer - */ - protected static $peer; -isAlias()) { - foreach ($table->getColumns() as $col) { - $cptype = $col->getPhpNative(); - $clo=strtolower($col->getName()); - $defVal = ""; - if (($val = $col->getPhpDefaultValue()) !== null) { - settype($val, $cptype); - $defaultValue = var_export($val, true); - $defVal = " = " . $defaultValue; - } -?> - - /** - * The value for the field. - * @var - */ - protected $; -isLazyLoad()) { ?> - - /** - * Whether the lazy-loaded value has been loaded from database. - * This is necessary to avoid repeated lookups if column is NULL. - * @var boolean - */ - protected $_isLoaded = false; -getColumns() as $col) { - - $cfc=$col->getPhpName(); - $clo=strtolower($col->getName()); - $cptype = $col->getPhpNative(); - - $defaultValue = null; - if (($val = $col->getPhpDefaultValue()) !== null) { - settype($val, $cptype); - $defaultValue = var_export($val, true); - } - - if ($col->getType() === PropelTypes::DATE || $col->getType() === PropelTypes::TIME || $col->getType() === PropelTypes::TIMESTAMP) { - // these default values are based on the Creole defaults - // the date and time default formats are locale-sensitive - if ($col->getType() === PropelTypes::DATE) { - $defaultfmt = '%x'; - } elseif ($col->getType() === PropelTypes::TIME) { - $defaultfmt = '%X'; - } elseif ($col->getType() === PropelTypes::TIMESTAMP) { - $defaultfmt = 'Y-m-d H:i:s'; - } -?> - - /** - * Get the [optionally formatted] `` column value. - * getDescription() ?> - * @param string $format The date/time format string (either date()-style or strftime()-style). - * If format is NULL, then the integer unix timestamp will be returned. - * @return mixed Formatted date/time value as string or integer unix timestamp (if format is NULL). - * @throws PropelException - if unable to convert the date/time to timestamp. - */ - public function get($format = ''isLazyLoad()) echo ', $con = null'; ?>) - { -isLazyLoad()) { ?> - if (!$this->_isLoaded && $this-> === null && !$this->isNew()) { - $this->load($con); - } - - if ($this-> === null || $this-> === '') { - return null; - } elseif (!is_int($this->)) { - // a non-timestamp value was set externally, so we convert it - $ts = strtotime($this->); - if ($ts === -1) { - throw new PropelException("Unable to parse value of as date/time value: " . var_export($this->, true)); - } - } else { - $ts = $this->; - } - if ($format === null) { - return $ts; - } elseif (strpos($format, '%') !== false) { - return strftime($format, $ts); - } else { - return date($format, $ts); - } - } - - /** - * Get the column value. - * getDescription() ?> - * @return - */ - public function get(isLazyLoad()) echo '$con = null'; ?>) - { -isLazyLoad()) { ?> - if (!$this->_isLoaded && $this-> === null && !$this->isNew()) { - $this->load($con); - } - - return $this->; - } - - -isLazyLoad()) { ?> - /** - * Load the value for the [lazy-load] `` column. - * - * This method performs an additional query to return the value for - * the `` column, since it is not populated by - * the hydrate() method. - * - * @param Connection - * @return void - * @throws PropelException - any underlying error will be wrapped and re-thrown. - */ - protected function load($con = null) - { - $c = $this->buildPkeyCriteria(); - $c->addSelectColumn(getPhpName()) ?>); - try { - $rs = getPhpName()?>Peer::doSelectRS($c, $con); - $rs->next(); -getType())); - $clo = strtolower($col->getName()); - switch($col->getType()) { - - case PropelTypes::DATE: - case PropelTypes::TIME: - case PropelTypes::TIMESTAMP: - ?> - $this-> = $rs->get(1, null); - - $this-> = $rs->get(1); - - $this->_isLoaded = true; - } catch (Exception $e) { - throw new PropelException("Error loading value for `` column on demand.", $e); - } - } - - -isReadOnly()) { - - - $throwsClause = ""; - if ($complexObjectModel) { - if ($col->isForeignKey()) { - $throwsClause = "@throws PropelException"; - } - if (count($col->getReferrers()) > 0 ) { - if ($throwsClause == "") { - $throwsClause = "@throws PropelException"; - } - } - } - if ($col->getType() === PropelTypes::DATE || $col->getType() === PropelTypes::TIME || $col->getType() === PropelTypes::TIMESTAMP) { - $throwsClause = "@throws PropelException - If passed [not-null] date/time is in an invalid format."; - } - - ?> - - /** - * Set the value of `` column. - * getDescription() ?> - * @param getType() === PropelTypes::DATE || $col->getType() === PropelTypes::TIME || $col->getType() === PropelTypes::TIMESTAMP) ? 'mixed' : $cptype ?> $v new value - * @return void - * - */ - public function set($v) - { -isLazyLoad()) { ?> - // explicitly set the is-loaded flag to true for this lazy load col; - // it doesn't matter if the value is actually set or not (logic below) as - // any attempt to set the value means that no db lookup should be performed - // when the get() method is called. - $this->_isLoaded = true; - -isLob()) { - // Setting of LOB columns gets some special handling - - if ($col->getPropelType() === PropelTypes::BLOB || $col->getPropelType() === PropelTypes::LONGVARBINARY ) { - $lobClass = "Blob"; - } else { - $lobClass = "Clob"; - } - ?> - // if the passed in parameter is the *same* object that - // is stored internally then we use the Lob->isModified() - // method to know whether contents changed. - if ($v instanceof Lob && $v === $this->) { - $changed = $v->isModified(); - } else { - $changed = ($this-> !== $v); - } - if ($changed) { - if ( !($v instanceof Lob) ) { - $obj = new (); - $obj->setContents($v); - } else { - $obj = $v; - } - $this-> = $obj; - $this->modifiedColumns[] = getPhpName()) ?>; - } -getType() === PropelTypes::DATE || $col->getType() === PropelTypes::TIME || $col->getType() === PropelTypes::TIMESTAMP) { - // Setting a DATE/TIME value gets some special handling. -?> - if ($v !== null && !is_int($v)) { - $ts = strtotime($v); - if ($ts === -1) { - throw new PropelException("Unable to parse date/time value for from input: " . var_export($v, true)); - } - } else { - $ts = $v; - } - if ($this-> !== $ts || $ts === ) { - $this-> = $ts; - $this->modifiedColumns[] = getPhpName()) ?>; - } - - if ($this-> !== $v || $v === ) { - $this-> = $v; - $this->modifiedColumns[] = getPhpName()) ?>; - } - - $this-> = $v; -isForeignKey()) { - $tblFK = $table->getDatabase()->getTable($col->getRelatedTableName()); - $colFK = $tblFK->getColumn($col->getRelatedColumnName()); - if ($col->isMultipleFK() || $col->getRelatedTableName() == $table->getName()) { - $relCol = ""; - foreach ($col->getForeignKey()->getLocalColumns() as $columnName) { - $column = $table->getColumn($columnName); - $relCol .= $column->getPhpName(); - } - if ($relCol != "") { - $relCol = "RelatedBy".$relCol; - } - $varName = "a".$tblFK->getPhpName() . $relCol; - } else { - $varName = "a".$tblFK->getPhpName(); - } - - ?> - - if ($this-> !== null && $this->->getgetPhpName() ?>() !== $v) { - $this-> = null; - } - getReferrers() as $fk) { - // used to be getLocalForeignMapping() which did not work. - $flmap = $fk->getForeignLocalMapping(); - $fkColName = $flmap[$col->getName()]; - $tblFK = $fk->getTable(); - if ( $tblFK->getName() != $table->getName() ) { - $colFK = $tblFK->getColumn($fkColName); - if ($colFK->isMultipleFK()) { - $collName = "coll" . $tblFK->getPhpName() . "sRelatedBy" . $colFK->getPhpName(); - } else { - $collName = "coll" . $tblFK->getPhpName() . "s"; - } - ?> - - // update associated getPhpName() ?> - - if ($this-> !== null) { - for ($i=0,$size=count($this->); $i < $size; $i++) { - $this->[$i]->setgetPhpName()?>($v); - } - } - - - - - } - -isReadOnly() */ - } /* foreach col */ -?> - - - /** - * Hydrates (populates) the object variables with values from the database resultset. - * - * An offset (1-based "start column") is specified so that objects can be hydrated - * with a subset of the columns in the resultset rows. This is needed, for example, - * for results of JOIN queries where the resultset row includes columns from two or - * more tables. - * - * @param ResultSet $rs The ResultSet class with cursor advanced to desired record pos. - * @param int $startcol 1-based offset column which indicates which restultset column to start with. - * @return int next starting column - * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. - */ - public function hydrate(ResultSet $rs, $startcol = 1) - { - try { -getColumns() as $col) { - if(!$col->isLazyLoad()) { - $affix = CreoleTypes::getAffix(CreoleTypes::getCreoleCode($col->getType())); - $clo = strtolower($col->getName()); - switch($col->getType()) { - - case PropelTypes::DATE: - case PropelTypes::TIME: - case PropelTypes::TIMESTAMP: - ?> - $this-> = $rs->get($startcol + , null); - - $this-> = $rs->get($startcol + ); -isLazyLoad() - } /* foreach */ - ?> - - $this->resetModified(); - - $this->setNew(false); - - return $startcol + ; - - } catch (Exception $e) { - throw new PropelException("Error populating getPhpName()?> object", $e); - } - - } - - /** - * Builds a Criteria object containing the primary key for this object. - * - * Unlike buildCriteria() this method includes the primary key values regardless - * of whether or not they have been modified. - * - * @return Criteria The Criteria object containing value(s) for primary key(s). - */ - public function buildPkeyCriteria() - { - $criteria = new Criteria(getPhpName()?>Peer::DATABASE_NAME); -getColumns() as $col) { - $clo = strtolower($col->getName()); - if ($col->isPrimaryKey()) { ?> - $criteria->add(getPhpName()) ?>, $this->); - - return $criteria; - } - - /** - * Build a Criteria object containing the values of all modified columns in this object. - * - * @return Criteria The Criteria object containing all modified values. - */ - public function buildCriteria() - { - $criteria = new Criteria(getPhpName()?>Peer::DATABASE_NAME); -getColumns() as $col) { - $clo = strtolower($col->getName()); - ?> - if ($this->isColumnModified(getPhpName()) ?>)) $criteria->add(getPhpName()) ?>, $this->); - - return $criteria; - } - -isAlias */ ?> - -getForeignKeys() as $fk) { - - $tblFK = $table->getDatabase()->getTable($fk->getForeignTableName()); - $className = $tblFK->getPhpName(); - - $tblFKPackage = ($tblFK->getPackage() ? $tblFK->getPackage() : $package); - $tblFKPackagePath = strtr($tblFKPackage, '.', '/'); - if ($tblFKPackagePath != "") { - $tblFKPackagePath .= '/'; - } - - $relCol = ""; - foreach ($fk->getLocalColumns() as $columnName) { - $column = $table->getColumn($columnName); - if ($column->isMultipleFK() || $fk->getForeignTableName() == $table->getName()) { - $relCol .= $column->getPhpName(); - } - } - - if ($relCol != "") { - $relCol = "RelatedBy" . $relCol; - } - - $pVarName = $className . $relCol; - $varName = "a" . $pVarName; - $retVal = ($pVars[] = $pVarName); - $retVal = ($aVars[] = $varName); -?> - - /** - * @var - */ - protected $; - - /** - * Declares an association between this object and a object - * - * @param $v - * @return void - * @throws PropelException - */ - public function set($v) - { -getLocalColumns() as $columnName) { - $column = $table->getColumn($columnName); - $lfmap = $fk->getLocalForeignMapping(); - $colFKName = $lfmap[$columnName]; - $colFK = $tblFK->getColumn($colFKName); ?> - - if ($v === null) { - $this->setgetPhpName() ?>(getPhpDefaultValue()) ?>); - } else { - $this->setgetPhpName() ?>($v->getgetPhpName() ?>()); - } - - - $this-> = $v; - } - -getLocalColumns() as $columnName) { - $column = $table->getColumn($columnName); - $cptype = $column->getPhpNative(); - $clo = strtolower($column->getName()); - if ($cptype == "integer" || $cptype == "float" || $cptype == "double") { - $conditional .= $and . "\$this->". $clo ." > 0"; - } elseif($cptype == "string") { - $conditional .= $and . "(\$this->" . $clo ." !== \"\" && \$this->".$clo." !== null)"; - } else { - $conditional .= $and . "\$this->" . $clo ." !== null"; - } - $arglist .= $comma . "\$this->" . $clo; - $and = " && "; - $comma = ", "; - $argsize = $argsize + 1; - } - - $pCollName = $table->getPhpName() . 's' . $relCol; -?> - - /** - * Get the associated object - * - * @param Connection Optional Connection object. - * @return The associated object. - * @throws PropelException - */ - public function get($con = null) - { - // include the Peer class - include_once 'Peer.php'; - - if ($this-> === null && ()) { -isAlias()) { - if ($argsize > 1) { -?> - - $this-> = Peer::retrieveByPK(, $con); - - - $this-> = Peer::retrieveByPK(, $con); - 1) { ?> - - $this-> = Peer::retrieveByPK(, $con); - - - $this-> = Peer::retrieveByPK(, $con); - isAlias ?> - - /* The following can be used instead of the line above to - guarantee the related object contains a reference - to this object, but this level of coupling - may be undesirable in many circumstances. - As it can lead to a db query with many results that may - never be used. - $obj = Peer::retrieveByPK(, $con); - $obj->add($this); - */ - } - return $this->; - } - - /** - * Provides convenient way to set a relationship based on a - * key. e.g. - * $bar->setFooKey($foo->getPrimaryKey()) - * -getLocalColumns()) > 1) { ?> - * Note: It is important that the xml schema used to create this class - * maintains consistency in the order of related columns between - * getName() ?> and getName() ?>. - * If for some reason this is impossible, this method should be - * overridden in getPhpName() ?>. - - * @return void - * @throws PropelException - */ - public function setKey($key) - { -getLocalColumns()) > 1) { - $i = 0; - foreach ($fk->getLocalColumns() as $colName) { - $col = $table->getColumn($colName); - $fktype = $col->getPhpNative(); -?> - - $this->setgetPhpName() ?>( () $key[] ); -getLocalColumns(); - $colName = $lcols[0]; - $col = $table->getColumn($colName); - $fktype = $col->getPhpNative(); -?> - - $this->setgetPhpName() ?>( () $key); - - - } -getReferrers() as $fk) { - $tblFK = $fk->getTable(); - $tblFKPackage = ($tblFK->getPackage() ? $tblFK->getPackage() : $package); - $tblFKPackagePath = strtr($tblFKPackage, '.', '/'); - if ($tblFKPackagePath != "") { - $tblFKPackagePath .= '/'; - } - - $className = $tblFK->getPhpName(); - $relatedByCol = ""; - foreach ($fk->getLocalColumns() as $columnName) { - $column = $tblFK->getColumn($columnName); - if ($column->isMultipleFK() || $tblFK->getName() == $table->getName()) { - // if there are seeral foreign keys that point to the same table - // then we need to generate methods like getAuthorRelatedByColName() - // instead of just getAuthor(). Currently we are doing the same - // for self-referential foreign keys, to avoid confusion. - $relatedByCol .= $column->getPhpName(); - } - } - - if ($relatedByCol == "") { - $suffix = ""; - $relCol = $className . "s"; - $relColMs = $className; - } else { - $suffix = "RelatedBy" . $relatedByCol; - $relCol= $className . "sRelatedBy" . $relatedByCol; - $relColMs= $className . "RelatedBy" . $relatedByCol; - } - $collName = "coll" . $relCol; -?> - - /** - * Collection to store aggregation of - * @var array - */ - protected $; - - /** - * Temporary storage of to save a possible db hit in - * the event objects are add to the collection, but the - * complete collection is never requested. - * @return void - */ - public function init() - { - if ($this-> === null) { - $this-> = array(); - } - } - - /** - * Method called to associate a getPhpName() ?> object to this object - * through the foreign key attribute - * - * @param $l $className - * @return void - * @throws PropelException - */ - public function add( $l) - { - $this->[] = $l; - $l->setgetPhpName() . $suffix ?>($this); - } - - /** - * The criteria used to select the current contents of . - * @var Criteria - */ - private $lastCriteria = null; - - /** - * Returns the number of related - * - * @param Criteria $criteria - * @param boolean $distinct - * @param Connection $con - * @throws PropelException - */ - public function count($criteria = null, $distinct = false, $con = null) - { - // include the Peer class - include_once 'Peer.php'; - if ($criteria === null) { - $criteria = new Criteria(); - } -getForeignColumns() as $columnName) { - $column = $table->getColumn($columnName); - // used to be getLocalForeignMapping() but that didn't seem to work - // (maybe a problem in translation of HashTable code to PHP). - $flmap = $fk->getForeignLocalMapping(); - $colFKName = $flmap[$columnName]; - $colFK = $tblFK->getColumn($colFKName); -?> - $criteria->add(, $this->getgetPhpName() ?>() ); -getForeignColumns() -?> - return Peer::doCount($criteria, $distinct, $con); - } - - /** - * If this collection has already been initialized with - * an identical criteria, it returns the collection. - * Otherwise if this getPhpName() ?> has previously - * been saved, it will retrieve related from storage. - * If this getPhpName() ?> is new, it will return - * an empty collection or the current collection, the criteria - * is ignored on a new object. - * - * @param Connection $con - * @param Criteria $criteria - * @throws PropelException - */ - public function get($criteria = null, $con = null) - { - // include the Peer class - include_once 'Peer.php'; - if ($criteria === null) { - $criteria = new Criteria(); - } - - if ($this-> === null) { - if ($this->isNew()) { - $this-> = array(); - } else { -getForeignColumns() as $columnName) { - $column = $table->getColumn($columnName); - // used to be getLocalForeignMapping() but that didn't seem to work - // (maybe a problem in translation of HashTable code to PHP). - $flmap = $fk->getForeignLocalMapping(); - $colFKName = $flmap[$columnName]; - $colFK = $tblFK->getColumn($colFKName); -?> - - $criteria->add(, $this->getgetPhpName() ?>() ); -getForeignColumns() -?> - - $this-> = Peer::doSelect($criteria, $con); - } - } else { - // criteria has no effect for a new object - if (!$this->isNew()) { - // the following code is to determine if a new query is - // called for. If the criteria is the same as the last - // one, just return the collection. -getForeignColumns() as $columnName) { - $column = $table->getColumn($columnName); - $flmap = $fk->getForeignLocalMapping(); - $colFKName = $flmap[$columnName]; - $colFK = $tblFK->getColumn($colFKName); -?> - - $criteria->add(, $this->getgetPhpName() ?>()); -getForeignColumns() -?> - - if (!isset($this->lastCriteria) || !$this->lastCriteria->equals($criteria)) { - $this-> = Peer::doSelect($criteria, $con); - } - } - } - $this->lastCriteria = $criteria; - - return $this->; - } - -getForeignKeys() as $dummyFK) { - $countFK = $countFK + 1; - } - -// ------------------------------------------------------------ -// - - if ($countFK >= 1) { - $lastTable = ""; - foreach ($tblFK->getForeignKeys() as $fk2) { - // Add join methods if the fk2 table is not this table or - // the fk2 table references this table multiple times. - - $doJoinGet = true; - if ( $fk2->getForeignTableName() == $table->getName() ) { - $doJoinGet = false; - } - - foreach ($fk2->getLocalColumns() as $columnName) { - $column = $tblFK->getColumn($columnName); - if ($column->isMultipleFK()) { - $doJoinGet = true; - } - } - - $tblFK2 = $table->getDatabase()->getTable($fk2->getForeignTableName()); - $doJoinGet = !$tblFK2->isForReferenceOnly(); - $relatedByCol2 = ""; - foreach ($fk2->getLocalColumns() as $columnName) { - $column = $tblFK->getColumn($columnName); - if ($column->isMultipleFK()) { - $relatedByCol2 .= $column->getPhpName(); - } - } - - $fkClassName = $tblFK2->getPhpName(); - - // do not generate code for self-referencing fk's, it would be - // good to do, but it is just not implemented yet. - if ($className == $fkClassName) { - // $doJoinGet = false; -- SELF REFERENCING FKs UNDER TESTING - } - - if ($relatedByCol2 == "") { - $relCol2 = $fkClassName; - } else { - $relCol2 = $fkClassName . "RelatedBy". $relatedByCol2; - } - - if ( $relatedByCol == "") { - // nothing? - } else { - if ( $relatedByCol == $relatedByCol2 ) { - $doJoinGet = false; - } - } - - if ($doJoinGet) { -?> - - /** - * If this collection has already been initialized with - * an identical criteria, it returns the collection. - * Otherwise if this getPhpName() ?> is new, it will return - * an empty collection; or if this getPhpName() ?> has previously - * been saved, it will retrieve related from storage. - * - * This method is protected by default in order to keep the public - * api reasonable. You can provide public methods for those you - * actually need in getPhpName() ?>. - */ - public function getJoin($criteria = null, $con = null) - { - // include the Peer class - include_once 'Peer.php'; - if ($criteria === null) { - $criteria = new Criteria(); - } - - if ($this-> === null) { - if ($this->isNew()) { - $this-> = array(); - } else { -getForeignColumns() as $columnName) { - $column = $table->getColumn($columnName); - $flMap = $fk->getForeignLocalMapping(); - $colFKName = $flMap[$columnName]; - $colFK = $tblFK->getColumn($colFKName); -?> - $criteria->add(, $this->getgetPhpName() ?>()); -getForeignColumns() -?> - $this-> = Peer::doSelectJoin($criteria, $con); - } - } else { - // the following code is to determine if a new query is - // called for. If the criteria is the same as the last - // one, just return the collection. -getForeignColumns() as $columnName) { - $column = $table->getColumn($columnName); - $flMap = $fk->getForeignLocalMapping(); - $colFKName = $flMap[$columnName]; - $colFK = $tblFK->getColumn($colFKName); -?> - $criteria->add(, $this->getgetPhpName() ?>()); -getForeignColumns() */ -?> - if (!isset($this->lastCriteria) || !$this->lastCriteria->equals($criteria)) { - $this-> = Peer::doSelectJoin($criteria, $con); - } - } - $this->lastCriteria = $criteria; - - return $this->; - } -getForeignKeys() as $fk2) { */ - } /* end if countFK >= 1 */ - - } /*ends foreach over table->getReferrers() */ - -} /* the if(complexObjectModel) */ - -// -// add GenericAccessors or GenericMutators? -// -if (!$table->isAlias() && ($addGenericAccessors || ($addGenericMutators && !$table->isReadOnly()))) -{ -?> - - /** - * phpname type - * e.g. 'AuthorId' - */ - const TYPE_PHPNAME = 'phpName'; - - /** - * column (peer) name type - * e.g. 'book.AUTHOR_ID' - */ - const TYPE_COLNAME = 'colName'; - - /** - * column fieldname type - * e.g. 'author_id' - */ - const TYPE_FIELDNAME = 'fieldName'; - - /** - * num type - * simply the numerical array index, e.g. 4 - */ - const TYPE_NUM = 'num'; -getColumns(); - $tablePhpname = $table->getPhpName(); -?> - - /** - * holds an array of fieldnames - * - * first dimension keys are the type constants - * e.g. self::$fieldNames[self::TYPE_PHPNAME][0] = 'Id' - */ - private static $fieldNames = array ( - getPhpName() ?>::TYPE_PHPNAME => array ('getPhpName(); ?>', ), - getPhpName() ?>::TYPE_COLNAME => array (, ), - getPhpName() ?>::TYPE_FIELDNAME => array ('getName(); ?>', ), - getPhpName() ?>::TYPE_NUM => array ( $col) { echo $num; ?>, ) - ); - - /** - * holds an array of keys for quick access to the fieldnames array - * - * first dimension keys are the type constants - * e.g. self::$fieldNames[self::TYPE_PHPNAME]['Id'] = 0 - */ - private static $fieldKeys = array ( - getPhpName() ?>::TYPE_PHPNAME => array ( $col) { ?>'getPhpName(); ?>' => , ), - getPhpName() ?>::TYPE_COLNAME => array ( $col) { ?> => , ), - getPhpName() ?>::TYPE_FIELDNAME => array ( $col) { ?>'getName(); ?>' => , ), - getPhpName() ?>::TYPE_NUM => array ( $col) { echo $num; ?>, ) - ); - - /** - * Returns an array of of field names. - * - * @param string $type The type of fieldnames to return: - * One of the class type constants TYPE_PHPNAME, - * TYPE_COLNAME, TYPE_FIELDNAME, TYPE_NUM - * @return array A list of field names - */ - - static public function getFieldNames($type = self::TYPE_FIELDNAME) - { - if (!isset(self::$fieldNames[$type])) { - throw new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants TYPE_PHPNAME, TYPE_COLNAME, TYPE_FIELDNAME, TYPE_NUM. ' . $type . ' was given.'); - } - return self::$fieldNames[$type]; - } - - /** - * Translates a fieldname to another type - * - * @param string $name field name - * @param string $fromType One of the class type constants TYPE_PHPNAME, - * TYPE_COLNAME, TYPE_FIELDNAME, TYPE_NUM - * @param string $toType One of the class type constants - * @return string translated name of the field. - */ - static public function translateFieldName($name, $fromType, $toType) - { - $toNames = self::getFieldNames($toType); - $key = self::$fieldKeys[$fromType][$name]; - if ($key === false) { - throw new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r($fromNames, true)); - } - return $toNames[$key]; - } - - - /** - * Retrieves a field from the object by name passed in as a string. - * - * @param string $name name - * @param string $type The type of fieldname the $name is of: - * one of the class type constants TYPE_PHPNAME, - * TYPE_COLNAME, TYPE_FIELDNAME, TYPE_NUM - * @return mixed Value of field. - */ - public function getByName($name, $type = self::TYPE_COLNAME) - { - $names = self::getFieldNames($type); - $pos = self::translateFieldName($name, $type, self::TYPE_NUM); - return $this->getByPosition($pos); - } - - /** - * Retrieves a field from the object by Position as specified in the xml schema. - * Zero-based. - * - * @param int $pos position in xml schema - * @return mixed Value of field at $pos - */ - public function getByPosition($pos) - { - switch($pos) { -getColumns() as $col) { - $cfc = $col->getPhpName(); - $cptype = $col->getPhpNative();// not safe to use it because some methods may return objects (Blob) -?> - case : - return $this->get(); - break; - - default: - return null; - } // switch() - } - - /** - * Exports the object as an array. - * - * You can specify the key type of the array by passing one of the class - * type constants. - * - * @param string $keyType One of the class type constants TYPE_PHPNAME, - * TYPE_COLNAME, TYPE_FIELDNAME, TYPE_NUM - * @return an associative array containing the field names (as keys) and field values - */ - public function toArray($keyType = self::TYPE_PHPNAME) - { - $keys = self::getFieldNames($keyType); - $result = array( -getColumns() as $num => $col) { -?> - $keys[] => $this->getgetPhpName(); ?>(), - - ); - return $result; - } - - - -isReadOnly()) { ?> - - /** - * Sets a field from the object by name passed in as a string. - * - * @param string $name peer name - * @param mixed $value field value - * @param string $type The type of fieldname the $name is of: - * one of the class type constants TYPE_PHPNAME, - * TYPE_COLNAME, TYPE_FIELDNAME, TYPE_NUM - * @return void - */ - public function setByName($name, $value, $type = self::TYPE_COLNAME) - { - $names = $this->getFieldnames($type); - $pos = array_search($name, $names); - return $this->setByPosition($pos, $value); - } - - /** - * Sets a field from the object by Position as specified in the xml schema. - * Zero-based. - * - * @param int $pos position in xml schema - * @param mixed $value field value - * @return void - */ - public function setByPosition($pos, $value) - { - switch($pos) { -getColumns() as $col) { - $cfc = $col->getPhpName(); - $cptype = $col->getPhpNative(); -?> - case : - $this->set($value); - break; - - } // switch() - } - - /** - * Populates the object using an array. - * - * This method is just an alias for populateFromArray() - * - * @param array $arr An array to populate the object from. - * @param string $keyType The type of keys the array uses: - * one of the class type constants TYPE_PHPNAME, - * TYPE_COLNAME, TYPE_FIELDNAME, TYPE_NUM - * @return void - */ - public function fromArray($arr, $keyType = self::TYPE_COLNAME) - { - return $this->populateFromArray($arr, $keyType); - } - - /** - * Populates the object using an array. - * - * This is particularly useful when populating an object from one of the - * request arrays (e.g. $_POST). This method goes through the column - * names, checking to see whether a matching key exists in populated - * array. If so the setByName() method is called for that column. - * - * You can specify the key type of the array by additionally passing one - * of the class type constants TYPE_PHPNAME, TYPE_COLNAME, TYPE_FIELDNAME, - * TYPE_NUM. The default key type is the (peer) column name (e.g. - * 'book.AUTHOR_ID') - * - * @param array $arr An array to populate the object from. - * @param string $keyType The type of keys the array uses. - * @return void - */ - public function populateFromArray($arr, $keyType = self::TYPE_COLNAME) - { - $keys = self::getFieldNames($keyType); -getColumns() as $num => $col) { - $cfc = $col->getPhpName(); - $cptype = $col->getPhpNative(); -?> - if (array_key_exists($keys[], $arr)) $this->set($arr[$keys[]]); - - } - - - -isAlias() && isset($addSaveMethod) && $addSaveMethod && !$table->isReadOnly()) { ?> - - /** - * Removes this object from datastore and sets delete attribute. - * - * @param Connection $con - * @return void - * @throws PropelException - * @see BaseObject::setDeleted() - * @see BaseObject::isDeleted() - */ - public function delete($con = null) - { - if ($this->isDeleted()) { - throw new PropelException("This object has already been deleted."); - } - - if ($con === null) - $con = Propel::getConnection(getPhpName()?>Peer::DATABASE_NAME); - - try { - $con->begin(); - getPhpName() ?>Peer::doDelete($this, $con); - $this->setDeleted(true); - $con->commit(); - } catch (PropelException $e) { - $con->rollback(); - throw $e; - } - } - - - - /** - * flag to prevent endless save loop, if this object is referenced - * by another object which falls in this transaction. - * @var boolean - */ - private $alreadyInSave = false; - - /** - * Stores the object in the database. If the object is new, - * it inserts it; otherwise an update is performed. This method - * wraps the doSave() worker method in a transaction. - * - * @param Connection $con - * @return void - * @throws PropelException - */ - public function save($con = null) - { - if ($this->isDeleted()) { - throw new PropelException("You cannot save an object that has been deleted."); - } - - if ($con === null) - $con = Propel::getConnection(getPhpName()?>Peer::DATABASE_NAME); - - try { - $con->begin(); - $this->doSave($con); - $con->commit(); - } catch (PropelException $e) { - $con->rollback(); - throw $e; - } - } - - - /** - * Stores the object in the database. If the object is new, - * it inserts it; otherwise an update is performed. - * - * @param Connection $con - * @return void - * @throws PropelException - */ - - protected function doSave($con) - public function save($con = null) - { - - if ($this->isDeleted()) { - throw new PropelException("You cannot save an object that has been deleted."); - } - - if ($con === null) { - $con = Propel::getConnection(getPhpName() ?>Peer::DATABASE_NAME); - } - - - if (!$this->alreadyInSave) { - $this->alreadyInSave = true; - - - // We call the save method on the following object(s) if they - // were passed to this object by their coresponding set - // method. This object relates to these object(s) by a - // foreign key reference. - - if ($this-> !== null) { - if ($this->->isModified()) $this->->save($con); - $this->set($this->); - } - - - // If this object has been modified, then save it to the database. - if ($this->isModified()) { - if ($this->isNew()) { - $pk = getPhpName() ?>Peer::doInsert($this, $con); -getIdMethod() != "none") { - - if (count($pks = $table->getPrimaryKey())) { - foreach ($pks as $pk) { - if ($pk->isAutoIncrement()) { -?> - $this->setgetPhpName();?>( $pk ); //[IMV] update autoincrement primary key - - $this->setNew(false); - } else { - getPhpName() ?>Peer::doUpdate($this, $con); - } - $this->resetModified(); // [HL] After being saved an object is no longer 'modified' - } -getReferrers() as $fk) { - $tblFK = $fk->getTable(); - if ( $tblFK->getName() != $table->getName() ) { - $className = $tblFK->getPhpName(); - $relCol = ""; - foreach ($fk->getLocalColumns() as $columnName) { - $column = $tblFK->getColumn($columnName); - if ($column->isMultipleFK()) { - $relCol .= $column->getPhpName(); - } - } - - if ($relCol == "") { - $relCol = $className . "s"; - } else { - $relCol = $className . "sRelatedBy" . $relCol; - } - - $collName = "coll" . $relCol; -?> - if ($this-> !== null) { - for ($i=0,$size=count($this->); $i < $size; $i++) { - $this->[$i]->save($con); - } - } - - - - $this->alreadyInSave = false; - } - - } -isAlias && isset .... */ -?> - -isAlias() && !$table->isReadOnly()) { -?> - /** - * Validates the objects modified field values. - - * This includes all objects related to this table. - - * - * If $columns is either a column name or an array of column names - * only those columns are validated. - * - * @param mixed $columns Column name or an array of column names. - * - * @return mixed true if all columns pass validation - * or an array of ValidationFailed objects for columns that fail. - */ - public function validate($columns = null) - { - if ($columns) - { - return getPhpName()?>Peer::doValidate($this, $columns); - } - - - return getPhpName()?>Peer::doValidate($this); - - return $this->doValidate(); - - } - - - /** - * flag to prevent endless validation loop, if this object is referenced - * by another object which falls in this transaction. - * @var boolean - */ - protected $alreadyInValidation = false; - - /** - * This function performs the validation work for complex object models. - * - * In addition to checking the current object, all related objects will - * also be validated. If all pass then true is returned; otherwise - * an aggreagated array of ValidationFailed objects will be returned. - * - * @return mixed true if all validations pass; array of ValidationFailed objets otherwise. - */ - protected function doValidate() - { - if (! $this->alreadyInValidation) { - $this->alreadyInValidation = true; - $retval = null; - - $failureMap = array(); - - - // We call the validate method on the following object(s) if they - // were passed to this object by their coresponding set - // method. This object relates to these object(s) by a - // foreign key reference. - - if ($this-> !== null) { - if (($retval = $this->->validate()) !== true) { - $failureMap = array_merge($failureMap, $retval); - } - } - - - if (($retval = getPhpName()?>Peer::doValidate($this)) !== true) { - $failureMap = array_merge($failureMap, $retval); - } - -getReferrers() as $fk) { - $tblFK = $fk->getTable(); - if ( $tblFK->getName() != $table->getName() ) { - $className = $tblFK->getPhpName(); - $relCol = ""; - foreach ($fk->getLocalColumns() as $columnName) { - $column = $tblFK->getColumn($columnName); - if ($column->isMultipleFK()) { - $relCol .= $column->getPhpName(); - } - } - - if ($relCol == "") { - $relCol = $className . "s"; - } else { - $relCol = $className . "sRelatedBy" . $relCol; - } - - $collName = "coll" . $relCol; -?> - if ($this-> !== null) { - for ($i=0,$size=count($this->); $i < $size; $i++) { - if (($retval = $this->[$i]->validate()) !== true) { - $failureMap = array_merge($failureMap, $retval); - } - } - } - - - $this->alreadyInValidation = false; - } - - return (!empty($failureMap) ? $failureMap : true); - } - - - -isAlias()) { - - if (!$table->isReadOnly()) { - - $throwsClause = "@throws PropelException"; - - if (count($table->getPrimaryKey()) == 1) { - $pkeys = $table->getPrimaryKey(); - $col = $pkeys[0]; - $clo=strtolower($col->getName()); - $cptype= $col->getPhpNative(); -?> - /** - * Set the PrimaryKey. - * - * @param mixed Primary key. - * @return void - * - */ - public function setPrimaryKey($key) - { - $this->setgetPhpName() ?>($key); - } - -getPrimaryKey()) > 1) { /* if(count($table->getPrimaryKey()) == 1) */ -?> - - private $pks = array(); - - /** - * Set the PrimaryKey. - * - * @param array $keys The elements of the composite key (order must match the order in XML file). - * @return void - * @throws PropelException - */ - public function setPrimaryKey($keys) - { -getPrimaryKey() as $pk) { - $pktype = $pk->getPhpNative(); -?> - - $this->setgetPhpName() ?>($keys[]); -getPrimaryKey() */ -?> - - } - -getPrimaryKey()) == 1) */ -?> - - /** - * Dummy primary key setter. - * - * This function only exists to preserve backwards compatibility. It is no longer - * needed or required by the Persistent interface. It will be removed in next BC-breaking - * release of Propel. - * - * @deprecated - */ - public function setPrimaryKey($pk) - { - // do nothing, because this object doesn't have any primary keys - } -getPrimaryKey()) == 1) */ - - } /* !table->isReadOnly() */ -?> - - /** - * Returns an id that differentiates this object from others - * of its class. - * @return getPrimaryKey()) === 0) { echo "null"; } elseif (count($table->getPrimaryKey()) > 1) { echo "array"; } else { $pkeys = $table->getPrimaryKey(); echo $pkeys[0]->getPhpType(); } ?> - */ - public function getPrimaryKey() - { -getPrimaryKey()) == 1) { -?> - - return $this->getgetPrimaryKey(); echo $pkeys[0]->getPhpName()?>(); -getPrimaryKey()) > 1) { /* if (count($table->getPrimaryKey()) == 1) { */ - $i = 0; - foreach ($table->getPrimaryKey() as $pk) { -?> - $this->pks[] = $this->getgetPhpName() ?>(); - - return $this->pks; -getPrimaryKey()) == 1) { */ -?> - - return null; -getPrimaryKey()) == 1) { */ -?> - - } - -isAbstract()) { -?> - - /** - * Makes a copy of this object that will be inserted as a new row in table when saved. - * It creates a new object filling in the simple attributes, but skipping any primary - * keys that are defined for the table. - * - * If desired, this method can also make copies of all associated (fkey referrers) - * objects. - * - * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. - * - * @return getPhpName() ?> Clone of current object. - * @throws PropelException - */ - public function copy($deepCopy = false) - { - $clazz = get_class($this); - $copyObj = new $clazz(); -getColumns() as $pkcol) { - if ($pkcol->isPrimaryKey()) { - $pkcols[] = $pkcol->getName(); - } - } - - foreach ($table->getColumns() as $col) { - - if (!in_array($col->getName(), $pkcols)) { -?> - $copyObj->setgetPhpName()?>($this->getName()) ?>); -getReferrers()) > 0) { -?> - - if ($deepCopy) { - // important: setNew(false) because this affects the behavior of - // the getter/setter methods for fkey referrer objects. - $copyObj->setNew(false); -getReferrers() as $fk) { - $tblFK = $fk->getTable(); - if ( $tblFK->getName() != $table->getName() ) { - $className = $tblFK->getPhpName(); - $relCol = ""; - foreach ($fk->getLocalColumns() as $columnName) { - $column = $tblFK->getColumn($columnName); - if ($column->isMultipleFK()) { - $relCol .= $column->getPhpName(); - } - } - - if ($relCol == "") { - $pCollName = $className . "s"; - $pCollNameNoS = $className; - } else { - $pCollName = $className . "sRelatedBy".$relCol; - $pCollNameNoS = $className . "RelatedBy".$relCol; - } -?> - - foreach($this->get() as $relObj) { - $copyObj->add($relObj->copy()); - } - - } // if ($deepCopy) - 0 ) */ -?> - - $copyObj->setNew(true); - -getColumns() as $col) { - if ($col->isPrimaryKey()) { - $coldefval = $col->getPhpDefaultValue(); - - // This seems to work pretty well for getting - // the right value (including NULL) - $coldefval = var_export($coldefval, true); -?> - $copyObj->setgetPhpName()?>(); // this is a pkey column, so set to default value -isPrimaryKey - } // foreach -?> - - return $copyObj; - } - -isAbstract()) */ -?> - - /** - * returns a peer instance associated with this om. Since Peer classes - * are not to have any instance attributes, this method returns the - * same instance for all member of this class. The method could therefore - * be static, but this would prevent one from overriding the behavior. - * @return getPhpName() ?>Peer - */ - public function getPeer() - { - if (self::$peer === null) { - self::$peer = new getPhpName() ?>Peer(); - } - return self::$peer; - } -isAlias */ -?> - -} +getDatabase(); +if ($table->getPackage()) { + $package = $table->getPackage(); +} else { + $package = $targetPackage; +} + +$parentClass = ClassTools::getBaseClass($table); +?> + +require_once ''; + + +require_once ''; + +isAlias()) { + + // If any columns in table are BLOB or CLOB then we need to make + // sure those classes are included so we can do things like + // if ($v instanceof Lob) etc. + + $includes_lobs = false; + foreach ($table->getColumns() as $col) { + if ($col->isLob()) { + $includes_lobs = true; + break; + } + } + + if($includes_lobs) { ?> +include_once 'creole/util/Clob.php'; +include_once 'creole/util/Blob.php'; + + +include_once 'propel/util/Criteria.php'; +getForeignKeys() as $fk) { + $tblFK = $table->getDatabase()->getTable($fk->getForeignTableName()); + $className = $tblFK->getPhpName(); + if ($tblFK->getInterface()) { + $className = $tblFK->getInterface(); + } + + $tblFKPackage = ($tblFK->getPackage() ? $tblFK->getPackage() : $package); + $tblFKPackagePath = strtr($tblFKPackage, '.', '/'); + if ($tblFKPackagePath != "") { + $tblFKPackagePath .= '/'; + } ?> + +// (on-demand) include_once ''; +// (on-demand) include_once 'getPhpName() . 'Peer') ?>'; + + +include_once 'getPhpName() . 'Peer') ?>'; + +/** + * Base class that represents a row from the 'getName() ?>' table. + * + * getDescription() ?> + * + + * This class was autogenerated by Propel on: + * + * [] + * + + * You should not use this class directly. It should not even be + * extended; all references should be to getPhpName() ?> class. + * + * @package + */ +abstract class getPhpName() ?> extends implements { + + /** + * The Peer class. + * Instance provides a convenient way of calling static methods on a class + * that calling code may not be able to identify. + * @var getPhpName() ?>Peer + */ + protected static $peer; +isAlias()) { + foreach ($table->getColumns() as $col) { + $cptype = $col->getPhpNative(); + $clo=strtolower($col->getName()); + $defVal = ""; + if (($val = $col->getPhpDefaultValue()) !== null) { + settype($val, $cptype); + $defaultValue = var_export($val, true); + $defVal = " = " . $defaultValue; + } +?> + + /** + * The value for the field. + * @var + */ + protected $; +isLazyLoad()) { ?> + + /** + * Whether the lazy-loaded value has been loaded from database. + * This is necessary to avoid repeated lookups if column is NULL. + * @var boolean + */ + protected $_isLoaded = false; +getColumns() as $col) { + + $cfc=$col->getPhpName(); + $clo=strtolower($col->getName()); + $cptype = $col->getPhpNative(); + + $defaultValue = null; + if (($val = $col->getPhpDefaultValue()) !== null) { + settype($val, $cptype); + $defaultValue = var_export($val, true); + } + + if ($col->getType() === PropelTypes::DATE || $col->getType() === PropelTypes::TIME || $col->getType() === PropelTypes::TIMESTAMP) { + // these default values are based on the Creole defaults + // the date and time default formats are locale-sensitive + if ($col->getType() === PropelTypes::DATE) { + $defaultfmt = '%x'; + } elseif ($col->getType() === PropelTypes::TIME) { + $defaultfmt = '%X'; + } elseif ($col->getType() === PropelTypes::TIMESTAMP) { + $defaultfmt = 'Y-m-d H:i:s'; + } +?> + + /** + * Get the [optionally formatted] `` column value. + * getDescription() ?> + * @param string $format The date/time format string (either date()-style or strftime()-style). + * If format is NULL, then the integer unix timestamp will be returned. + * @return mixed Formatted date/time value as string or integer unix timestamp (if format is NULL). + * @throws PropelException - if unable to convert the date/time to timestamp. + */ + public function get($format = ''isLazyLoad()) echo ', $con = null'; ?>) + { +isLazyLoad()) { ?> + if (!$this->_isLoaded && $this-> === null && !$this->isNew()) { + $this->load($con); + } + + if ($this-> === null || $this-> === '') { + return null; + } elseif (!is_int($this->)) { + // a non-timestamp value was set externally, so we convert it + $ts = strtotime($this->); + if ($ts === -1) { + throw new PropelException("Unable to parse value of as date/time value: " . var_export($this->, true)); + } + } else { + $ts = $this->; + } + if ($format === null) { + return $ts; + } elseif (strpos($format, '%') !== false) { + return strftime($format, $ts); + } else { + return date($format, $ts); + } + } + + /** + * Get the column value. + * getDescription() ?> + * @return + */ + public function get(isLazyLoad()) echo '$con = null'; ?>) + { +isLazyLoad()) { ?> + if (!$this->_isLoaded && $this-> === null && !$this->isNew()) { + $this->load($con); + } + + return $this->; + } + + +isLazyLoad()) { ?> + /** + * Load the value for the [lazy-load] `` column. + * + * This method performs an additional query to return the value for + * the `` column, since it is not populated by + * the hydrate() method. + * + * @param Connection + * @return void + * @throws PropelException - any underlying error will be wrapped and re-thrown. + */ + protected function load($con = null) + { + $c = $this->buildPkeyCriteria(); + $c->addSelectColumn(getPhpName()) ?>); + try { + $rs = getPhpName()?>Peer::doSelectRS($c, $con); + $rs->next(); +getType())); + $clo = strtolower($col->getName()); + switch($col->getType()) { + + case PropelTypes::DATE: + case PropelTypes::TIME: + case PropelTypes::TIMESTAMP: + ?> + $this-> = $rs->get(1, null); + + $this-> = $rs->get(1); + + $this->_isLoaded = true; + } catch (Exception $e) { + throw new PropelException("Error loading value for `` column on demand.", $e); + } + } + + +isReadOnly()) { + + + $throwsClause = ""; + if ($complexObjectModel) { + if ($col->isForeignKey()) { + $throwsClause = "@throws PropelException"; + } + if (count($col->getReferrers()) > 0 ) { + if ($throwsClause == "") { + $throwsClause = "@throws PropelException"; + } + } + } + if ($col->getType() === PropelTypes::DATE || $col->getType() === PropelTypes::TIME || $col->getType() === PropelTypes::TIMESTAMP) { + $throwsClause = "@throws PropelException - If passed [not-null] date/time is in an invalid format."; + } + + ?> + + /** + * Set the value of `` column. + * getDescription() ?> + * @param getType() === PropelTypes::DATE || $col->getType() === PropelTypes::TIME || $col->getType() === PropelTypes::TIMESTAMP) ? 'mixed' : $cptype ?> $v new value + * @return void + * + */ + public function set($v) + { +isLazyLoad()) { ?> + // explicitly set the is-loaded flag to true for this lazy load col; + // it doesn't matter if the value is actually set or not (logic below) as + // any attempt to set the value means that no db lookup should be performed + // when the get() method is called. + $this->_isLoaded = true; + +isLob()) { + // Setting of LOB columns gets some special handling + + if ($col->getPropelType() === PropelTypes::BLOB || $col->getPropelType() === PropelTypes::LONGVARBINARY ) { + $lobClass = "Blob"; + } else { + $lobClass = "Clob"; + } + ?> + // if the passed in parameter is the *same* object that + // is stored internally then we use the Lob->isModified() + // method to know whether contents changed. + if ($v instanceof Lob && $v === $this->) { + $changed = $v->isModified(); + } else { + $changed = ($this-> !== $v); + } + if ($changed) { + if ( !($v instanceof Lob) ) { + $obj = new (); + $obj->setContents($v); + } else { + $obj = $v; + } + $this-> = $obj; + $this->modifiedColumns[] = getPhpName()) ?>; + } +getType() === PropelTypes::DATE || $col->getType() === PropelTypes::TIME || $col->getType() === PropelTypes::TIMESTAMP) { + // Setting a DATE/TIME value gets some special handling. +?> + if ($v !== null && !is_int($v)) { + $ts = strtotime($v); + if ($ts === -1) { + throw new PropelException("Unable to parse date/time value for from input: " . var_export($v, true)); + } + } else { + $ts = $v; + } + if ($this-> !== $ts || $ts === ) { + $this-> = $ts; + $this->modifiedColumns[] = getPhpName()) ?>; + } + + if ($this-> !== $v || $v === ) { + $this-> = $v; + $this->modifiedColumns[] = getPhpName()) ?>; + } + + $this-> = $v; +isForeignKey()) { + $tblFK = $table->getDatabase()->getTable($col->getRelatedTableName()); + $colFK = $tblFK->getColumn($col->getRelatedColumnName()); + if ($col->isMultipleFK() || $col->getRelatedTableName() == $table->getName()) { + $relCol = ""; + foreach ($col->getForeignKey()->getLocalColumns() as $columnName) { + $column = $table->getColumn($columnName); + $relCol .= $column->getPhpName(); + } + if ($relCol != "") { + $relCol = "RelatedBy".$relCol; + } + $varName = "a".$tblFK->getPhpName() . $relCol; + } else { + $varName = "a".$tblFK->getPhpName(); + } + + ?> + + if ($this-> !== null && $this->->getgetPhpName() ?>() !== $v) { + $this-> = null; + } + getReferrers() as $fk) { + // used to be getLocalForeignMapping() which did not work. + $flmap = $fk->getForeignLocalMapping(); + $fkColName = $flmap[$col->getName()]; + $tblFK = $fk->getTable(); + if ( $tblFK->getName() != $table->getName() ) { + $colFK = $tblFK->getColumn($fkColName); + if ($colFK->isMultipleFK()) { + $collName = "coll" . $tblFK->getPhpName() . "sRelatedBy" . $colFK->getPhpName(); + } else { + $collName = "coll" . $tblFK->getPhpName() . "s"; + } + ?> + + // update associated getPhpName() ?> + + if ($this-> !== null) { + for ($i=0,$size=count($this->); $i < $size; $i++) { + $this->[$i]->setgetPhpName()?>($v); + } + } + + + + + } + +isReadOnly() */ + } /* foreach col */ +?> + + + /** + * Hydrates (populates) the object variables with values from the database resultset. + * + * An offset (1-based "start column") is specified so that objects can be hydrated + * with a subset of the columns in the resultset rows. This is needed, for example, + * for results of JOIN queries where the resultset row includes columns from two or + * more tables. + * + * @param ResultSet $rs The ResultSet class with cursor advanced to desired record pos. + * @param int $startcol 1-based offset column which indicates which restultset column to start with. + * @return int next starting column + * @throws PropelException - Any caught Exception will be rewrapped as a PropelException. + */ + public function hydrate(ResultSet $rs, $startcol = 1) + { + try { +getColumns() as $col) { + if(!$col->isLazyLoad()) { + $affix = CreoleTypes::getAffix(CreoleTypes::getCreoleCode($col->getType())); + $clo = strtolower($col->getName()); + switch($col->getType()) { + + case PropelTypes::DATE: + case PropelTypes::TIME: + case PropelTypes::TIMESTAMP: + ?> + $this-> = $rs->get($startcol + , null); + + $this-> = $rs->get($startcol + ); +isLazyLoad() + } /* foreach */ + ?> + + $this->resetModified(); + + $this->setNew(false); + + return $startcol + ; + + } catch (Exception $e) { + throw new PropelException("Error populating getPhpName()?> object", $e); + } + + } + + /** + * Builds a Criteria object containing the primary key for this object. + * + * Unlike buildCriteria() this method includes the primary key values regardless + * of whether or not they have been modified. + * + * @return Criteria The Criteria object containing value(s) for primary key(s). + */ + public function buildPkeyCriteria() + { + $criteria = new Criteria(getPhpName()?>Peer::DATABASE_NAME); +getColumns() as $col) { + $clo = strtolower($col->getName()); + if ($col->isPrimaryKey()) { ?> + $criteria->add(getPhpName()) ?>, $this->); + + return $criteria; + } + + /** + * Build a Criteria object containing the values of all modified columns in this object. + * + * @return Criteria The Criteria object containing all modified values. + */ + public function buildCriteria() + { + $criteria = new Criteria(getPhpName()?>Peer::DATABASE_NAME); +getColumns() as $col) { + $clo = strtolower($col->getName()); + ?> + if ($this->isColumnModified(getPhpName()) ?>)) $criteria->add(getPhpName()) ?>, $this->); + + return $criteria; + } + +isAlias */ ?> + +getForeignKeys() as $fk) { + + $tblFK = $table->getDatabase()->getTable($fk->getForeignTableName()); + $className = $tblFK->getPhpName(); + + $tblFKPackage = ($tblFK->getPackage() ? $tblFK->getPackage() : $package); + $tblFKPackagePath = strtr($tblFKPackage, '.', '/'); + if ($tblFKPackagePath != "") { + $tblFKPackagePath .= '/'; + } + + $relCol = ""; + foreach ($fk->getLocalColumns() as $columnName) { + $column = $table->getColumn($columnName); + if ($column->isMultipleFK() || $fk->getForeignTableName() == $table->getName()) { + $relCol .= $column->getPhpName(); + } + } + + if ($relCol != "") { + $relCol = "RelatedBy" . $relCol; + } + + $pVarName = $className . $relCol; + $varName = "a" . $pVarName; + $retVal = ($pVars[] = $pVarName); + $retVal = ($aVars[] = $varName); +?> + + /** + * @var + */ + protected $; + + /** + * Declares an association between this object and a object + * + * @param $v + * @return void + * @throws PropelException + */ + public function set($v) + { +getLocalColumns() as $columnName) { + $column = $table->getColumn($columnName); + $lfmap = $fk->getLocalForeignMapping(); + $colFKName = $lfmap[$columnName]; + $colFK = $tblFK->getColumn($colFKName); ?> + + if ($v === null) { + $this->setgetPhpName() ?>(getPhpDefaultValue()) ?>); + } else { + $this->setgetPhpName() ?>($v->getgetPhpName() ?>()); + } + + + $this-> = $v; + } + +getLocalColumns() as $columnName) { + $column = $table->getColumn($columnName); + $cptype = $column->getPhpNative(); + $clo = strtolower($column->getName()); + if ($cptype == "integer" || $cptype == "float" || $cptype == "double") { + $conditional .= $and . "\$this->". $clo ." > 0"; + } elseif($cptype == "string") { + $conditional .= $and . "(\$this->" . $clo ." !== \"\" && \$this->".$clo." !== null)"; + } else { + $conditional .= $and . "\$this->" . $clo ." !== null"; + } + $arglist .= $comma . "\$this->" . $clo; + $and = " && "; + $comma = ", "; + $argsize = $argsize + 1; + } + + $pCollName = $table->getPhpName() . 's' . $relCol; +?> + + /** + * Get the associated object + * + * @param Connection Optional Connection object. + * @return The associated object. + * @throws PropelException + */ + public function get($con = null) + { + // include the Peer class + include_once 'Peer.php'; + + if ($this-> === null && ()) { +isAlias()) { + if ($argsize > 1) { +?> + + $this-> = Peer::retrieveByPK(, $con); + + + $this-> = Peer::retrieveByPK(, $con); + 1) { ?> + + $this-> = Peer::retrieveByPK(, $con); + + + $this-> = Peer::retrieveByPK(, $con); + isAlias ?> + + /* The following can be used instead of the line above to + guarantee the related object contains a reference + to this object, but this level of coupling + may be undesirable in many circumstances. + As it can lead to a db query with many results that may + never be used. + $obj = Peer::retrieveByPK(, $con); + $obj->add($this); + */ + } + return $this->; + } + + /** + * Provides convenient way to set a relationship based on a + * key. e.g. + * $bar->setFooKey($foo->getPrimaryKey()) + * +getLocalColumns()) > 1) { ?> + * Note: It is important that the xml schema used to create this class + * maintains consistency in the order of related columns between + * getName() ?> and getName() ?>. + * If for some reason this is impossible, this method should be + * overridden in getPhpName() ?>. + + * @return void + * @throws PropelException + */ + public function setKey($key) + { +getLocalColumns()) > 1) { + $i = 0; + foreach ($fk->getLocalColumns() as $colName) { + $col = $table->getColumn($colName); + $fktype = $col->getPhpNative(); +?> + + $this->setgetPhpName() ?>( () $key[] ); +getLocalColumns(); + $colName = $lcols[0]; + $col = $table->getColumn($colName); + $fktype = $col->getPhpNative(); +?> + + $this->setgetPhpName() ?>( () $key); + + + } +getReferrers() as $fk) { + $tblFK = $fk->getTable(); + $tblFKPackage = ($tblFK->getPackage() ? $tblFK->getPackage() : $package); + $tblFKPackagePath = strtr($tblFKPackage, '.', '/'); + if ($tblFKPackagePath != "") { + $tblFKPackagePath .= '/'; + } + + $className = $tblFK->getPhpName(); + $relatedByCol = ""; + foreach ($fk->getLocalColumns() as $columnName) { + $column = $tblFK->getColumn($columnName); + if ($column->isMultipleFK() || $tblFK->getName() == $table->getName()) { + // if there are seeral foreign keys that point to the same table + // then we need to generate methods like getAuthorRelatedByColName() + // instead of just getAuthor(). Currently we are doing the same + // for self-referential foreign keys, to avoid confusion. + $relatedByCol .= $column->getPhpName(); + } + } + + if ($relatedByCol == "") { + $suffix = ""; + $relCol = $className . "s"; + $relColMs = $className; + } else { + $suffix = "RelatedBy" . $relatedByCol; + $relCol= $className . "sRelatedBy" . $relatedByCol; + $relColMs= $className . "RelatedBy" . $relatedByCol; + } + $collName = "coll" . $relCol; +?> + + /** + * Collection to store aggregation of + * @var array + */ + protected $; + + /** + * Temporary storage of to save a possible db hit in + * the event objects are add to the collection, but the + * complete collection is never requested. + * @return void + */ + public function init() + { + if ($this-> === null) { + $this-> = array(); + } + } + + /** + * Method called to associate a getPhpName() ?> object to this object + * through the foreign key attribute + * + * @param $l $className + * @return void + * @throws PropelException + */ + public function add( $l) + { + $this->[] = $l; + $l->setgetPhpName() . $suffix ?>($this); + } + + /** + * The criteria used to select the current contents of . + * @var Criteria + */ + private $lastCriteria = null; + + /** + * Returns the number of related + * + * @param Criteria $criteria + * @param boolean $distinct + * @param Connection $con + * @throws PropelException + */ + public function count($criteria = null, $distinct = false, $con = null) + { + // include the Peer class + include_once 'Peer.php'; + if ($criteria === null) { + $criteria = new Criteria(); + } +getForeignColumns() as $columnName) { + $column = $table->getColumn($columnName); + // used to be getLocalForeignMapping() but that didn't seem to work + // (maybe a problem in translation of HashTable code to PHP). + $flmap = $fk->getForeignLocalMapping(); + $colFKName = $flmap[$columnName]; + $colFK = $tblFK->getColumn($colFKName); +?> + $criteria->add(, $this->getgetPhpName() ?>() ); +getForeignColumns() +?> + return Peer::doCount($criteria, $distinct, $con); + } + + /** + * If this collection has already been initialized with + * an identical criteria, it returns the collection. + * Otherwise if this getPhpName() ?> has previously + * been saved, it will retrieve related from storage. + * If this getPhpName() ?> is new, it will return + * an empty collection or the current collection, the criteria + * is ignored on a new object. + * + * @param Connection $con + * @param Criteria $criteria + * @throws PropelException + */ + public function get($criteria = null, $con = null) + { + // include the Peer class + include_once 'Peer.php'; + if ($criteria === null) { + $criteria = new Criteria(); + } + + if ($this-> === null) { + if ($this->isNew()) { + $this-> = array(); + } else { +getForeignColumns() as $columnName) { + $column = $table->getColumn($columnName); + // used to be getLocalForeignMapping() but that didn't seem to work + // (maybe a problem in translation of HashTable code to PHP). + $flmap = $fk->getForeignLocalMapping(); + $colFKName = $flmap[$columnName]; + $colFK = $tblFK->getColumn($colFKName); +?> + + $criteria->add(, $this->getgetPhpName() ?>() ); +getForeignColumns() +?> + + $this-> = Peer::doSelect($criteria, $con); + } + } else { + // criteria has no effect for a new object + if (!$this->isNew()) { + // the following code is to determine if a new query is + // called for. If the criteria is the same as the last + // one, just return the collection. +getForeignColumns() as $columnName) { + $column = $table->getColumn($columnName); + $flmap = $fk->getForeignLocalMapping(); + $colFKName = $flmap[$columnName]; + $colFK = $tblFK->getColumn($colFKName); +?> + + $criteria->add(, $this->getgetPhpName() ?>()); +getForeignColumns() +?> + + if (!isset($this->lastCriteria) || !$this->lastCriteria->equals($criteria)) { + $this-> = Peer::doSelect($criteria, $con); + } + } + } + $this->lastCriteria = $criteria; + + return $this->; + } + +getForeignKeys() as $dummyFK) { + $countFK = $countFK + 1; + } + +// ------------------------------------------------------------ +// + + if ($countFK >= 1) { + $lastTable = ""; + foreach ($tblFK->getForeignKeys() as $fk2) { + // Add join methods if the fk2 table is not this table or + // the fk2 table references this table multiple times. + + $doJoinGet = true; + if ( $fk2->getForeignTableName() == $table->getName() ) { + $doJoinGet = false; + } + + foreach ($fk2->getLocalColumns() as $columnName) { + $column = $tblFK->getColumn($columnName); + if ($column->isMultipleFK()) { + $doJoinGet = true; + } + } + + $tblFK2 = $table->getDatabase()->getTable($fk2->getForeignTableName()); + $doJoinGet = !$tblFK2->isForReferenceOnly(); + $relatedByCol2 = ""; + foreach ($fk2->getLocalColumns() as $columnName) { + $column = $tblFK->getColumn($columnName); + if ($column->isMultipleFK()) { + $relatedByCol2 .= $column->getPhpName(); + } + } + + $fkClassName = $tblFK2->getPhpName(); + + // do not generate code for self-referencing fk's, it would be + // good to do, but it is just not implemented yet. + if ($className == $fkClassName) { + // $doJoinGet = false; -- SELF REFERENCING FKs UNDER TESTING + } + + if ($relatedByCol2 == "") { + $relCol2 = $fkClassName; + } else { + $relCol2 = $fkClassName . "RelatedBy". $relatedByCol2; + } + + if ( $relatedByCol == "") { + // nothing? + } else { + if ( $relatedByCol == $relatedByCol2 ) { + $doJoinGet = false; + } + } + + if ($doJoinGet) { +?> + + /** + * If this collection has already been initialized with + * an identical criteria, it returns the collection. + * Otherwise if this getPhpName() ?> is new, it will return + * an empty collection; or if this getPhpName() ?> has previously + * been saved, it will retrieve related from storage. + * + * This method is protected by default in order to keep the public + * api reasonable. You can provide public methods for those you + * actually need in getPhpName() ?>. + */ + public function getJoin($criteria = null, $con = null) + { + // include the Peer class + include_once 'Peer.php'; + if ($criteria === null) { + $criteria = new Criteria(); + } + + if ($this-> === null) { + if ($this->isNew()) { + $this-> = array(); + } else { +getForeignColumns() as $columnName) { + $column = $table->getColumn($columnName); + $flMap = $fk->getForeignLocalMapping(); + $colFKName = $flMap[$columnName]; + $colFK = $tblFK->getColumn($colFKName); +?> + $criteria->add(, $this->getgetPhpName() ?>()); +getForeignColumns() +?> + $this-> = Peer::doSelectJoin($criteria, $con); + } + } else { + // the following code is to determine if a new query is + // called for. If the criteria is the same as the last + // one, just return the collection. +getForeignColumns() as $columnName) { + $column = $table->getColumn($columnName); + $flMap = $fk->getForeignLocalMapping(); + $colFKName = $flMap[$columnName]; + $colFK = $tblFK->getColumn($colFKName); +?> + $criteria->add(, $this->getgetPhpName() ?>()); +getForeignColumns() */ +?> + if (!isset($this->lastCriteria) || !$this->lastCriteria->equals($criteria)) { + $this-> = Peer::doSelectJoin($criteria, $con); + } + } + $this->lastCriteria = $criteria; + + return $this->; + } +getForeignKeys() as $fk2) { */ + } /* end if countFK >= 1 */ + + } /*ends foreach over table->getReferrers() */ + +} /* the if(complexObjectModel) */ + +// +// add GenericAccessors or GenericMutators? +// +if (!$table->isAlias() && ($addGenericAccessors || ($addGenericMutators && !$table->isReadOnly()))) +{ +?> + + /** + * phpname type + * e.g. 'AuthorId' + */ + const TYPE_PHPNAME = 'phpName'; + + /** + * column (peer) name type + * e.g. 'book.AUTHOR_ID' + */ + const TYPE_COLNAME = 'colName'; + + /** + * column fieldname type + * e.g. 'author_id' + */ + const TYPE_FIELDNAME = 'fieldName'; + + /** + * num type + * simply the numerical array index, e.g. 4 + */ + const TYPE_NUM = 'num'; +getColumns(); + $tablePhpname = $table->getPhpName(); +?> + + /** + * holds an array of fieldnames + * + * first dimension keys are the type constants + * e.g. self::$fieldNames[self::TYPE_PHPNAME][0] = 'Id' + */ + private static $fieldNames = array ( + getPhpName() ?>::TYPE_PHPNAME => array ('getPhpName(); ?>', ), + getPhpName() ?>::TYPE_COLNAME => array (, ), + getPhpName() ?>::TYPE_FIELDNAME => array ('getName(); ?>', ), + getPhpName() ?>::TYPE_NUM => array ( $col) { echo $num; ?>, ) + ); + + /** + * holds an array of keys for quick access to the fieldnames array + * + * first dimension keys are the type constants + * e.g. self::$fieldNames[self::TYPE_PHPNAME]['Id'] = 0 + */ + private static $fieldKeys = array ( + getPhpName() ?>::TYPE_PHPNAME => array ( $col) { ?>'getPhpName(); ?>' => , ), + getPhpName() ?>::TYPE_COLNAME => array ( $col) { ?> => , ), + getPhpName() ?>::TYPE_FIELDNAME => array ( $col) { ?>'getName(); ?>' => , ), + getPhpName() ?>::TYPE_NUM => array ( $col) { echo $num; ?>, ) + ); + + /** + * Returns an array of of field names. + * + * @param string $type The type of fieldnames to return: + * One of the class type constants TYPE_PHPNAME, + * TYPE_COLNAME, TYPE_FIELDNAME, TYPE_NUM + * @return array A list of field names + */ + + static public function getFieldNames($type = self::TYPE_FIELDNAME) + { + if (!isset(self::$fieldNames[$type])) { + throw new PropelException('Method getFieldNames() expects the parameter $type to be one of the class constants TYPE_PHPNAME, TYPE_COLNAME, TYPE_FIELDNAME, TYPE_NUM. ' . $type . ' was given.'); + } + return self::$fieldNames[$type]; + } + + /** + * Translates a fieldname to another type + * + * @param string $name field name + * @param string $fromType One of the class type constants TYPE_PHPNAME, + * TYPE_COLNAME, TYPE_FIELDNAME, TYPE_NUM + * @param string $toType One of the class type constants + * @return string translated name of the field. + */ + static public function translateFieldName($name, $fromType, $toType) + { + $toNames = self::getFieldNames($toType); + $key = self::$fieldKeys[$fromType][$name]; + if ($key === false) { + throw new PropelException("'$name' could not be found in the field names of type '$fromType'. These are: " . print_r($fromNames, true)); + } + return $toNames[$key]; + } + + + /** + * Retrieves a field from the object by name passed in as a string. + * + * @param string $name name + * @param string $type The type of fieldname the $name is of: + * one of the class type constants TYPE_PHPNAME, + * TYPE_COLNAME, TYPE_FIELDNAME, TYPE_NUM + * @return mixed Value of field. + */ + public function getByName($name, $type = self::TYPE_COLNAME) + { + $names = self::getFieldNames($type); + $pos = self::translateFieldName($name, $type, self::TYPE_NUM); + return $this->getByPosition($pos); + } + + /** + * Retrieves a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @return mixed Value of field at $pos + */ + public function getByPosition($pos) + { + switch($pos) { +getColumns() as $col) { + $cfc = $col->getPhpName(); + $cptype = $col->getPhpNative();// not safe to use it because some methods may return objects (Blob) +?> + case : + return $this->get(); + break; + + default: + return null; + } // switch() + } + + /** + * Exports the object as an array. + * + * You can specify the key type of the array by passing one of the class + * type constants. + * + * @param string $keyType One of the class type constants TYPE_PHPNAME, + * TYPE_COLNAME, TYPE_FIELDNAME, TYPE_NUM + * @return an associative array containing the field names (as keys) and field values + */ + public function toArray($keyType = self::TYPE_PHPNAME) + { + $keys = self::getFieldNames($keyType); + $result = array( +getColumns() as $num => $col) { +?> + $keys[] => $this->getgetPhpName(); ?>(), + + ); + return $result; + } + + + +isReadOnly()) { ?> + + /** + * Sets a field from the object by name passed in as a string. + * + * @param string $name peer name + * @param mixed $value field value + * @param string $type The type of fieldname the $name is of: + * one of the class type constants TYPE_PHPNAME, + * TYPE_COLNAME, TYPE_FIELDNAME, TYPE_NUM + * @return void + */ + public function setByName($name, $value, $type = self::TYPE_COLNAME) + { + $names = $this->getFieldnames($type); + $pos = array_search($name, $names); + return $this->setByPosition($pos, $value); + } + + /** + * Sets a field from the object by Position as specified in the xml schema. + * Zero-based. + * + * @param int $pos position in xml schema + * @param mixed $value field value + * @return void + */ + public function setByPosition($pos, $value) + { + switch($pos) { +getColumns() as $col) { + $cfc = $col->getPhpName(); + $cptype = $col->getPhpNative(); +?> + case : + $this->set($value); + break; + + } // switch() + } + + /** + * Populates the object using an array. + * + * This method is just an alias for populateFromArray() + * + * @param array $arr An array to populate the object from. + * @param string $keyType The type of keys the array uses: + * one of the class type constants TYPE_PHPNAME, + * TYPE_COLNAME, TYPE_FIELDNAME, TYPE_NUM + * @return void + */ + public function fromArray($arr, $keyType = self::TYPE_COLNAME) + { + return $this->populateFromArray($arr, $keyType); + } + + /** + * Populates the object using an array. + * + * This is particularly useful when populating an object from one of the + * request arrays (e.g. $_POST). This method goes through the column + * names, checking to see whether a matching key exists in populated + * array. If so the setByName() method is called for that column. + * + * You can specify the key type of the array by additionally passing one + * of the class type constants TYPE_PHPNAME, TYPE_COLNAME, TYPE_FIELDNAME, + * TYPE_NUM. The default key type is the (peer) column name (e.g. + * 'book.AUTHOR_ID') + * + * @param array $arr An array to populate the object from. + * @param string $keyType The type of keys the array uses. + * @return void + */ + public function populateFromArray($arr, $keyType = self::TYPE_COLNAME) + { + $keys = self::getFieldNames($keyType); +getColumns() as $num => $col) { + $cfc = $col->getPhpName(); + $cptype = $col->getPhpNative(); +?> + if (array_key_exists($keys[], $arr)) $this->set($arr[$keys[]]); + + } + + + +isAlias() && isset($addSaveMethod) && $addSaveMethod && !$table->isReadOnly()) { ?> + + /** + * Removes this object from datastore and sets delete attribute. + * + * @param Connection $con + * @return void + * @throws PropelException + * @see BaseObject::setDeleted() + * @see BaseObject::isDeleted() + */ + public function delete($con = null) + { + if ($this->isDeleted()) { + throw new PropelException("This object has already been deleted."); + } + + if ($con === null) + $con = Propel::getConnection(getPhpName()?>Peer::DATABASE_NAME); + + try { + $con->begin(); + getPhpName() ?>Peer::doDelete($this, $con); + $this->setDeleted(true); + $con->commit(); + } catch (PropelException $e) { + $con->rollback(); + throw $e; + } + } + + + + /** + * flag to prevent endless save loop, if this object is referenced + * by another object which falls in this transaction. + * @var boolean + */ + private $alreadyInSave = false; + + /** + * Stores the object in the database. If the object is new, + * it inserts it; otherwise an update is performed. This method + * wraps the doSave() worker method in a transaction. + * + * @param Connection $con + * @return void + * @throws PropelException + */ + public function save($con = null) + { + if ($this->isDeleted()) { + throw new PropelException("You cannot save an object that has been deleted."); + } + + if ($con === null) + $con = Propel::getConnection(getPhpName()?>Peer::DATABASE_NAME); + + try { + $con->begin(); + $this->doSave($con); + $con->commit(); + } catch (PropelException $e) { + $con->rollback(); + throw $e; + } + } + + + /** + * Stores the object in the database. If the object is new, + * it inserts it; otherwise an update is performed. + * + * @param Connection $con + * @return void + * @throws PropelException + */ + + protected function doSave($con) + public function save($con = null) + { + + if ($this->isDeleted()) { + throw new PropelException("You cannot save an object that has been deleted."); + } + + if ($con === null) { + $con = Propel::getConnection(getPhpName() ?>Peer::DATABASE_NAME); + } + + + if (!$this->alreadyInSave) { + $this->alreadyInSave = true; + + + // We call the save method on the following object(s) if they + // were passed to this object by their coresponding set + // method. This object relates to these object(s) by a + // foreign key reference. + + if ($this-> !== null) { + if ($this->->isModified()) $this->->save($con); + $this->set($this->); + } + + + // If this object has been modified, then save it to the database. + if ($this->isModified()) { + if ($this->isNew()) { + $pk = getPhpName() ?>Peer::doInsert($this, $con); +getIdMethod() != "none") { + + if (count($pks = $table->getPrimaryKey())) { + foreach ($pks as $pk) { + if ($pk->isAutoIncrement()) { +?> + $this->setgetPhpName();?>( $pk ); //[IMV] update autoincrement primary key + + $this->setNew(false); + } else { + getPhpName() ?>Peer::doUpdate($this, $con); + } + $this->resetModified(); // [HL] After being saved an object is no longer 'modified' + } +getReferrers() as $fk) { + $tblFK = $fk->getTable(); + if ( $tblFK->getName() != $table->getName() ) { + $className = $tblFK->getPhpName(); + $relCol = ""; + foreach ($fk->getLocalColumns() as $columnName) { + $column = $tblFK->getColumn($columnName); + if ($column->isMultipleFK()) { + $relCol .= $column->getPhpName(); + } + } + + if ($relCol == "") { + $relCol = $className . "s"; + } else { + $relCol = $className . "sRelatedBy" . $relCol; + } + + $collName = "coll" . $relCol; +?> + if ($this-> !== null) { + for ($i=0,$size=count($this->); $i < $size; $i++) { + $this->[$i]->save($con); + } + } + + + + $this->alreadyInSave = false; + } + + } +isAlias && isset .... */ +?> + +isAlias() && !$table->isReadOnly()) { +?> + /** + * Validates the objects modified field values. + + * This includes all objects related to this table. + + * + * If $columns is either a column name or an array of column names + * only those columns are validated. + * + * @param mixed $columns Column name or an array of column names. + * + * @return mixed true if all columns pass validation + * or an array of ValidationFailed objects for columns that fail. + */ + public function validate($columns = null) + { + if ($columns) + { + return getPhpName()?>Peer::doValidate($this, $columns); + } + + + return getPhpName()?>Peer::doValidate($this); + + return $this->doValidate(); + + } + + + /** + * flag to prevent endless validation loop, if this object is referenced + * by another object which falls in this transaction. + * @var boolean + */ + protected $alreadyInValidation = false; + + /** + * This function performs the validation work for complex object models. + * + * In addition to checking the current object, all related objects will + * also be validated. If all pass then true is returned; otherwise + * an aggreagated array of ValidationFailed objects will be returned. + * + * @return mixed true if all validations pass; array of ValidationFailed objets otherwise. + */ + protected function doValidate() + { + if (! $this->alreadyInValidation) { + $this->alreadyInValidation = true; + $retval = null; + + $failureMap = array(); + + + // We call the validate method on the following object(s) if they + // were passed to this object by their coresponding set + // method. This object relates to these object(s) by a + // foreign key reference. + + if ($this-> !== null) { + if (($retval = $this->->validate()) !== true) { + $failureMap = array_merge($failureMap, $retval); + } + } + + + if (($retval = getPhpName()?>Peer::doValidate($this)) !== true) { + $failureMap = array_merge($failureMap, $retval); + } + +getReferrers() as $fk) { + $tblFK = $fk->getTable(); + if ( $tblFK->getName() != $table->getName() ) { + $className = $tblFK->getPhpName(); + $relCol = ""; + foreach ($fk->getLocalColumns() as $columnName) { + $column = $tblFK->getColumn($columnName); + if ($column->isMultipleFK()) { + $relCol .= $column->getPhpName(); + } + } + + if ($relCol == "") { + $relCol = $className . "s"; + } else { + $relCol = $className . "sRelatedBy" . $relCol; + } + + $collName = "coll" . $relCol; +?> + if ($this-> !== null) { + for ($i=0,$size=count($this->); $i < $size; $i++) { + if (($retval = $this->[$i]->validate()) !== true) { + $failureMap = array_merge($failureMap, $retval); + } + } + } + + + $this->alreadyInValidation = false; + } + + return (!empty($failureMap) ? $failureMap : true); + } + + + +isAlias()) { + + if (!$table->isReadOnly()) { + + $throwsClause = "@throws PropelException"; + + if (count($table->getPrimaryKey()) == 1) { + $pkeys = $table->getPrimaryKey(); + $col = $pkeys[0]; + $clo=strtolower($col->getName()); + $cptype= $col->getPhpNative(); +?> + /** + * Set the PrimaryKey. + * + * @param mixed Primary key. + * @return void + * + */ + public function setPrimaryKey($key) + { + $this->setgetPhpName() ?>($key); + } + +getPrimaryKey()) > 1) { /* if(count($table->getPrimaryKey()) == 1) */ +?> + + private $pks = array(); + + /** + * Set the PrimaryKey. + * + * @param array $keys The elements of the composite key (order must match the order in XML file). + * @return void + * @throws PropelException + */ + public function setPrimaryKey($keys) + { +getPrimaryKey() as $pk) { + $pktype = $pk->getPhpNative(); +?> + + $this->setgetPhpName() ?>($keys[]); +getPrimaryKey() */ +?> + + } + +getPrimaryKey()) == 1) */ +?> + + /** + * Dummy primary key setter. + * + * This function only exists to preserve backwards compatibility. It is no longer + * needed or required by the Persistent interface. It will be removed in next BC-breaking + * release of Propel. + * + * @deprecated + */ + public function setPrimaryKey($pk) + { + // do nothing, because this object doesn't have any primary keys + } +getPrimaryKey()) == 1) */ + + } /* !table->isReadOnly() */ +?> + + /** + * Returns an id that differentiates this object from others + * of its class. + * @return getPrimaryKey()) === 0) { echo "null"; } elseif (count($table->getPrimaryKey()) > 1) { echo "array"; } else { $pkeys = $table->getPrimaryKey(); echo $pkeys[0]->getPhpType(); } ?> + */ + public function getPrimaryKey() + { +getPrimaryKey()) == 1) { +?> + + return $this->getgetPrimaryKey(); echo $pkeys[0]->getPhpName()?>(); +getPrimaryKey()) > 1) { /* if (count($table->getPrimaryKey()) == 1) { */ + $i = 0; + foreach ($table->getPrimaryKey() as $pk) { +?> + $this->pks[] = $this->getgetPhpName() ?>(); + + return $this->pks; +getPrimaryKey()) == 1) { */ +?> + + return null; +getPrimaryKey()) == 1) { */ +?> + + } + +isAbstract()) { +?> + + /** + * Makes a copy of this object that will be inserted as a new row in table when saved. + * It creates a new object filling in the simple attributes, but skipping any primary + * keys that are defined for the table. + * + * If desired, this method can also make copies of all associated (fkey referrers) + * objects. + * + * @param boolean $deepCopy Whether to also copy all rows that refer (by fkey) to the current row. + * + * @return getPhpName() ?> Clone of current object. + * @throws PropelException + */ + public function copy($deepCopy = false) + { + $clazz = get_class($this); + $copyObj = new $clazz(); +getColumns() as $pkcol) { + if ($pkcol->isPrimaryKey()) { + $pkcols[] = $pkcol->getName(); + } + } + + foreach ($table->getColumns() as $col) { + + if (!in_array($col->getName(), $pkcols)) { +?> + $copyObj->setgetPhpName()?>($this->getName()) ?>); +getReferrers()) > 0) { +?> + + if ($deepCopy) { + // important: setNew(false) because this affects the behavior of + // the getter/setter methods for fkey referrer objects. + $copyObj->setNew(false); +getReferrers() as $fk) { + $tblFK = $fk->getTable(); + if ( $tblFK->getName() != $table->getName() ) { + $className = $tblFK->getPhpName(); + $relCol = ""; + foreach ($fk->getLocalColumns() as $columnName) { + $column = $tblFK->getColumn($columnName); + if ($column->isMultipleFK()) { + $relCol .= $column->getPhpName(); + } + } + + if ($relCol == "") { + $pCollName = $className . "s"; + $pCollNameNoS = $className; + } else { + $pCollName = $className . "sRelatedBy".$relCol; + $pCollNameNoS = $className . "RelatedBy".$relCol; + } +?> + + foreach($this->get() as $relObj) { + $copyObj->add($relObj->copy()); + } + + } // if ($deepCopy) + 0 ) */ +?> + + $copyObj->setNew(true); + +getColumns() as $col) { + if ($col->isPrimaryKey()) { + $coldefval = $col->getPhpDefaultValue(); + + // This seems to work pretty well for getting + // the right value (including NULL) + $coldefval = var_export($coldefval, true); +?> + $copyObj->setgetPhpName()?>(); // this is a pkey column, so set to default value +isPrimaryKey + } // foreach +?> + + return $copyObj; + } + +isAbstract()) */ +?> + + /** + * returns a peer instance associated with this om. Since Peer classes + * are not to have any instance attributes, this method returns the + * same instance for all member of this class. The method could therefore + * be static, but this would prevent one from overriding the behavior. + * @return getPhpName() ?>Peer + */ + public function getPeer() + { + if (self::$peer === null) { + self::$peer = new getPhpName() ?>Peer(); + } + return self::$peer; + } +isAlias */ +?> + +} diff --git a/gulliver/thirdparty/propel-generator/templates/om/php5/Peer.tpl b/thirdparty/propel-generator/templates/om/php5/Peer.tpl similarity index 100% rename from gulliver/thirdparty/propel-generator/templates/om/php5/Peer.tpl rename to thirdparty/propel-generator/templates/om/php5/Peer.tpl diff --git a/gulliver/thirdparty/propel-generator/templates/sql/base/mssql/columns.tpl b/thirdparty/propel-generator/templates/sql/base/mssql/columns.tpl similarity index 100% rename from gulliver/thirdparty/propel-generator/templates/sql/base/mssql/columns.tpl rename to thirdparty/propel-generator/templates/sql/base/mssql/columns.tpl diff --git a/gulliver/thirdparty/propel-generator/templates/sql/base/mssql/drop.tpl b/thirdparty/propel-generator/templates/sql/base/mssql/drop.tpl similarity index 100% rename from gulliver/thirdparty/propel-generator/templates/sql/base/mssql/drop.tpl rename to thirdparty/propel-generator/templates/sql/base/mssql/drop.tpl diff --git a/gulliver/thirdparty/propel-generator/templates/sql/base/mssql/foreignkey.tpl b/thirdparty/propel-generator/templates/sql/base/mssql/foreignkey.tpl similarity index 100% rename from gulliver/thirdparty/propel-generator/templates/sql/base/mssql/foreignkey.tpl rename to thirdparty/propel-generator/templates/sql/base/mssql/foreignkey.tpl diff --git a/gulliver/thirdparty/propel-generator/templates/sql/base/mssql/index.tpl b/thirdparty/propel-generator/templates/sql/base/mssql/index.tpl similarity index 100% rename from gulliver/thirdparty/propel-generator/templates/sql/base/mssql/index.tpl rename to thirdparty/propel-generator/templates/sql/base/mssql/index.tpl diff --git a/gulliver/thirdparty/propel-generator/templates/sql/base/mssql/primarykey.tpl b/thirdparty/propel-generator/templates/sql/base/mssql/primarykey.tpl similarity index 100% rename from gulliver/thirdparty/propel-generator/templates/sql/base/mssql/primarykey.tpl rename to thirdparty/propel-generator/templates/sql/base/mssql/primarykey.tpl diff --git a/gulliver/thirdparty/propel-generator/templates/sql/base/mssql/table.tpl b/thirdparty/propel-generator/templates/sql/base/mssql/table.tpl similarity index 100% rename from gulliver/thirdparty/propel-generator/templates/sql/base/mssql/table.tpl rename to thirdparty/propel-generator/templates/sql/base/mssql/table.tpl diff --git a/gulliver/thirdparty/propel-generator/templates/sql/base/mssql/tablefk.tpl b/thirdparty/propel-generator/templates/sql/base/mssql/tablefk.tpl similarity index 100% rename from gulliver/thirdparty/propel-generator/templates/sql/base/mssql/tablefk.tpl rename to thirdparty/propel-generator/templates/sql/base/mssql/tablefk.tpl diff --git a/gulliver/thirdparty/propel-generator/templates/sql/base/mssql/unique.tpl b/thirdparty/propel-generator/templates/sql/base/mssql/unique.tpl similarity index 100% rename from gulliver/thirdparty/propel-generator/templates/sql/base/mssql/unique.tpl rename to thirdparty/propel-generator/templates/sql/base/mssql/unique.tpl diff --git a/gulliver/thirdparty/propel-generator/templates/sql/base/mysql/columns.tpl b/thirdparty/propel-generator/templates/sql/base/mysql/columns.tpl similarity index 100% rename from gulliver/thirdparty/propel-generator/templates/sql/base/mysql/columns.tpl rename to thirdparty/propel-generator/templates/sql/base/mysql/columns.tpl diff --git a/gulliver/thirdparty/propel-generator/templates/sql/base/mysql/database-end.tpl b/thirdparty/propel-generator/templates/sql/base/mysql/database-end.tpl similarity index 100% rename from gulliver/thirdparty/propel-generator/templates/sql/base/mysql/database-end.tpl rename to thirdparty/propel-generator/templates/sql/base/mysql/database-end.tpl diff --git a/gulliver/thirdparty/propel-generator/templates/sql/base/mysql/database-start.tpl b/thirdparty/propel-generator/templates/sql/base/mysql/database-start.tpl similarity index 100% rename from gulliver/thirdparty/propel-generator/templates/sql/base/mysql/database-start.tpl rename to thirdparty/propel-generator/templates/sql/base/mysql/database-start.tpl diff --git a/gulliver/thirdparty/propel-generator/templates/sql/base/mysql/drop.tpl b/thirdparty/propel-generator/templates/sql/base/mysql/drop.tpl similarity index 100% rename from gulliver/thirdparty/propel-generator/templates/sql/base/mysql/drop.tpl rename to thirdparty/propel-generator/templates/sql/base/mysql/drop.tpl diff --git a/gulliver/thirdparty/propel-generator/templates/sql/base/mysql/foreignkey.tpl b/thirdparty/propel-generator/templates/sql/base/mysql/foreignkey.tpl similarity index 100% rename from gulliver/thirdparty/propel-generator/templates/sql/base/mysql/foreignkey.tpl rename to thirdparty/propel-generator/templates/sql/base/mysql/foreignkey.tpl diff --git a/gulliver/thirdparty/propel-generator/templates/sql/base/mysql/index.tpl b/thirdparty/propel-generator/templates/sql/base/mysql/index.tpl similarity index 100% rename from gulliver/thirdparty/propel-generator/templates/sql/base/mysql/index.tpl rename to thirdparty/propel-generator/templates/sql/base/mysql/index.tpl diff --git a/gulliver/thirdparty/propel-generator/templates/sql/base/mysql/primarykey.tpl b/thirdparty/propel-generator/templates/sql/base/mysql/primarykey.tpl similarity index 100% rename from gulliver/thirdparty/propel-generator/templates/sql/base/mysql/primarykey.tpl rename to thirdparty/propel-generator/templates/sql/base/mysql/primarykey.tpl diff --git a/gulliver/thirdparty/propel-generator/templates/sql/base/mysql/table.tpl b/thirdparty/propel-generator/templates/sql/base/mysql/table.tpl similarity index 100% rename from gulliver/thirdparty/propel-generator/templates/sql/base/mysql/table.tpl rename to thirdparty/propel-generator/templates/sql/base/mysql/table.tpl diff --git a/gulliver/thirdparty/propel-generator/templates/sql/base/mysql/tablefk.tpl b/thirdparty/propel-generator/templates/sql/base/mysql/tablefk.tpl similarity index 100% rename from gulliver/thirdparty/propel-generator/templates/sql/base/mysql/tablefk.tpl rename to thirdparty/propel-generator/templates/sql/base/mysql/tablefk.tpl diff --git a/gulliver/thirdparty/propel-generator/templates/sql/base/mysql/unique.tpl b/thirdparty/propel-generator/templates/sql/base/mysql/unique.tpl similarity index 100% rename from gulliver/thirdparty/propel-generator/templates/sql/base/mysql/unique.tpl rename to thirdparty/propel-generator/templates/sql/base/mysql/unique.tpl diff --git a/gulliver/thirdparty/propel-generator/templates/sql/base/oracle/columns.tpl b/thirdparty/propel-generator/templates/sql/base/oracle/columns.tpl similarity index 100% rename from gulliver/thirdparty/propel-generator/templates/sql/base/oracle/columns.tpl rename to thirdparty/propel-generator/templates/sql/base/oracle/columns.tpl diff --git a/gulliver/thirdparty/propel-generator/templates/sql/base/oracle/drop.tpl b/thirdparty/propel-generator/templates/sql/base/oracle/drop.tpl similarity index 100% rename from gulliver/thirdparty/propel-generator/templates/sql/base/oracle/drop.tpl rename to thirdparty/propel-generator/templates/sql/base/oracle/drop.tpl diff --git a/gulliver/thirdparty/propel-generator/templates/sql/base/oracle/foreignkey.tpl b/thirdparty/propel-generator/templates/sql/base/oracle/foreignkey.tpl similarity index 100% rename from gulliver/thirdparty/propel-generator/templates/sql/base/oracle/foreignkey.tpl rename to thirdparty/propel-generator/templates/sql/base/oracle/foreignkey.tpl diff --git a/gulliver/thirdparty/propel-generator/templates/sql/base/oracle/index.tpl b/thirdparty/propel-generator/templates/sql/base/oracle/index.tpl similarity index 100% rename from gulliver/thirdparty/propel-generator/templates/sql/base/oracle/index.tpl rename to thirdparty/propel-generator/templates/sql/base/oracle/index.tpl diff --git a/gulliver/thirdparty/propel-generator/templates/sql/base/oracle/primarykey.tpl b/thirdparty/propel-generator/templates/sql/base/oracle/primarykey.tpl similarity index 100% rename from gulliver/thirdparty/propel-generator/templates/sql/base/oracle/primarykey.tpl rename to thirdparty/propel-generator/templates/sql/base/oracle/primarykey.tpl diff --git a/gulliver/thirdparty/propel-generator/templates/sql/base/oracle/sequence.tpl b/thirdparty/propel-generator/templates/sql/base/oracle/sequence.tpl similarity index 100% rename from gulliver/thirdparty/propel-generator/templates/sql/base/oracle/sequence.tpl rename to thirdparty/propel-generator/templates/sql/base/oracle/sequence.tpl diff --git a/gulliver/thirdparty/propel-generator/templates/sql/base/oracle/table.tpl b/thirdparty/propel-generator/templates/sql/base/oracle/table.tpl similarity index 100% rename from gulliver/thirdparty/propel-generator/templates/sql/base/oracle/table.tpl rename to thirdparty/propel-generator/templates/sql/base/oracle/table.tpl diff --git a/gulliver/thirdparty/propel-generator/templates/sql/base/oracle/tablefk.tpl b/thirdparty/propel-generator/templates/sql/base/oracle/tablefk.tpl similarity index 100% rename from gulliver/thirdparty/propel-generator/templates/sql/base/oracle/tablefk.tpl rename to thirdparty/propel-generator/templates/sql/base/oracle/tablefk.tpl diff --git a/gulliver/thirdparty/propel-generator/templates/sql/base/oracle/unique.tpl b/thirdparty/propel-generator/templates/sql/base/oracle/unique.tpl similarity index 100% rename from gulliver/thirdparty/propel-generator/templates/sql/base/oracle/unique.tpl rename to thirdparty/propel-generator/templates/sql/base/oracle/unique.tpl diff --git a/gulliver/thirdparty/propel-generator/templates/sql/base/pgsql/columns.tpl b/thirdparty/propel-generator/templates/sql/base/pgsql/columns.tpl similarity index 95% rename from gulliver/thirdparty/propel-generator/templates/sql/base/pgsql/columns.tpl rename to thirdparty/propel-generator/templates/sql/base/pgsql/columns.tpl index 9d9cce277..8cbdd42cc 100644 --- a/gulliver/thirdparty/propel-generator/templates/sql/base/pgsql/columns.tpl +++ b/thirdparty/propel-generator/templates/sql/base/pgsql/columns.tpl @@ -1,13 +1,13 @@ -getColumns() as $col) { - $entry = $col->getSqlString(); - - // collapse spaces - $entry = preg_replace('/[\s]+/', ' ', $entry); - - // ' ,' -> ',' - $entry = preg_replace('/[\s]*,[\s]*/', ',', $entry); -?> - , +getColumns() as $col) { + $entry = $col->getSqlString(); + + // collapse spaces + $entry = preg_replace('/[\s]+/', ' ', $entry); + + // ' ,' -> ',' + $entry = preg_replace('/[\s]*,[\s]*/', ',', $entry); +?> + , \ No newline at end of file diff --git a/gulliver/thirdparty/propel-generator/templates/sql/base/pgsql/drop.tpl b/thirdparty/propel-generator/templates/sql/base/pgsql/drop.tpl similarity index 97% rename from gulliver/thirdparty/propel-generator/templates/sql/base/pgsql/drop.tpl rename to thirdparty/propel-generator/templates/sql/base/pgsql/drop.tpl index 229181d83..8106043b0 100644 --- a/gulliver/thirdparty/propel-generator/templates/sql/base/pgsql/drop.tpl +++ b/thirdparty/propel-generator/templates/sql/base/pgsql/drop.tpl @@ -1,4 +1,4 @@ -DROP TABLE getName() ?> CASCADE; -getIdMethod() == "native") { ?> -DROP SEQUENCE getSequenceName() ?>; - +DROP TABLE getName() ?> CASCADE; +getIdMethod() == "native") { ?> +DROP SEQUENCE getSequenceName() ?>; + diff --git a/gulliver/thirdparty/propel-generator/templates/sql/base/pgsql/foreignkey.tpl b/thirdparty/propel-generator/templates/sql/base/pgsql/foreignkey.tpl similarity index 97% rename from gulliver/thirdparty/propel-generator/templates/sql/base/pgsql/foreignkey.tpl rename to thirdparty/propel-generator/templates/sql/base/pgsql/foreignkey.tpl index 3a7d220bb..8ebb8e6ba 100644 --- a/gulliver/thirdparty/propel-generator/templates/sql/base/pgsql/foreignkey.tpl +++ b/thirdparty/propel-generator/templates/sql/base/pgsql/foreignkey.tpl @@ -1,20 +1,20 @@ -getForeignKeys() as $fk) { ?> -ALTER TABLE getName() ?> - ADD CONSTRAINT getName() ?> FOREIGN KEY (getLocalColumnNames() ?>) - REFERENCES getForeignTableName() ?> (getForeignColumnNames() ?>) -hasOnUpdate()) { ?> - ON UPDATE getOnUpdate() ?> - -hasOnDelete()) { ?> - ON DELETE getOnDelete() ?> - -; - +getForeignKeys() as $fk) { ?> +ALTER TABLE getName() ?> + ADD CONSTRAINT getName() ?> FOREIGN KEY (getLocalColumnNames() ?>) + REFERENCES getForeignTableName() ?> (getForeignColumnNames() ?>) +hasOnUpdate()) { ?> + ON UPDATE getOnUpdate() ?> + +hasOnDelete()) { ?> + ON DELETE getOnDelete() ?> + +; + diff --git a/gulliver/thirdparty/propel-generator/templates/sql/base/pgsql/index.tpl b/thirdparty/propel-generator/templates/sql/base/pgsql/index.tpl similarity index 99% rename from gulliver/thirdparty/propel-generator/templates/sql/base/pgsql/index.tpl rename to thirdparty/propel-generator/templates/sql/base/pgsql/index.tpl index 30c00e79c..8c37f6177 100644 --- a/gulliver/thirdparty/propel-generator/templates/sql/base/pgsql/index.tpl +++ b/thirdparty/propel-generator/templates/sql/base/pgsql/index.tpl @@ -1,3 +1,3 @@ -getIndices() as $index) { ?> -CREATE getIsUnique()) { ?>UNIQUE INDEX getName() ?> ON getName() ?> (getColumnList()?>); +getIndices() as $index) { ?> +CREATE getIsUnique()) { ?>UNIQUE INDEX getName() ?> ON getName() ?> (getColumnList()?>); \ No newline at end of file diff --git a/gulliver/thirdparty/propel-generator/templates/sql/base/pgsql/primarykey.tpl b/thirdparty/propel-generator/templates/sql/base/pgsql/primarykey.tpl similarity index 97% rename from gulliver/thirdparty/propel-generator/templates/sql/base/pgsql/primarykey.tpl rename to thirdparty/propel-generator/templates/sql/base/pgsql/primarykey.tpl index 9992a84d9..fca20e7de 100644 --- a/gulliver/thirdparty/propel-generator/templates/sql/base/pgsql/primarykey.tpl +++ b/thirdparty/propel-generator/templates/sql/base/pgsql/primarykey.tpl @@ -1,3 +1,3 @@ -hasPrimaryKey()) { ?> - PRIMARY KEY (printPrimaryKey() ?>), - +hasPrimaryKey()) { ?> + PRIMARY KEY (printPrimaryKey() ?>), + diff --git a/gulliver/thirdparty/propel-generator/templates/sql/base/pgsql/sequence.tpl b/thirdparty/propel-generator/templates/sql/base/pgsql/sequence.tpl similarity index 97% rename from gulliver/thirdparty/propel-generator/templates/sql/base/pgsql/sequence.tpl rename to thirdparty/propel-generator/templates/sql/base/pgsql/sequence.tpl index dc3686af7..c2dbf4452 100644 --- a/gulliver/thirdparty/propel-generator/templates/sql/base/pgsql/sequence.tpl +++ b/thirdparty/propel-generator/templates/sql/base/pgsql/sequence.tpl @@ -1,3 +1,3 @@ -getIdMethod() == "native") { ?> -CREATE SEQUENCE getSequenceName() ?>; - +getIdMethod() == "native") { ?> +CREATE SEQUENCE getSequenceName() ?>; + diff --git a/gulliver/thirdparty/propel-generator/templates/sql/base/pgsql/table.tpl b/thirdparty/propel-generator/templates/sql/base/pgsql/table.tpl similarity index 96% rename from gulliver/thirdparty/propel-generator/templates/sql/base/pgsql/table.tpl rename to thirdparty/propel-generator/templates/sql/base/pgsql/table.tpl index 34cb98098..e30d57292 100644 --- a/gulliver/thirdparty/propel-generator/templates/sql/base/pgsql/table.tpl +++ b/thirdparty/propel-generator/templates/sql/base/pgsql/table.tpl @@ -1,55 +1,55 @@ - ------------------------------------------------------------------------------ --- getName() ?> ------------------------------------------------------------------------------ -parse("$basepath/drop.tpl"); -$sequence = $generator->parse("$basepath/sequence.tpl"); -if (!empty($sequence)) { - echo $sequence; -} -?> - -CREATE TABLE getName() ?> -( - parse("$basepath/columns.tpl"); - $pk = trim($generator->parse("$basepath/primarykey.tpl")); - $unique = $generator->parse("$basepath/unique.tpl"); - $index = trim($generator->parse("$basepath/index.tpl")); - - if ( empty($pk) && empty($unique)) { - echo preg_replace('/[ ,]+[\s]*$/', '', $cols); - } else { - echo $cols; - } - - if (empty($unique) && !empty($pk)) { - echo preg_replace('/[ ,]+[\s]*$/', '', $pk); - } else { - echo $pk; - } - - if (!empty($unique)) { - echo preg_replace('/[ ,]+[\s]*$/', '', $unique); - } -?> -); - - -COMMENT ON TABLE getName() ?> IS 'escapeText($table->getDescription()) ?>'; - -getColumns() as $col) { - if( $col->getDescription() != '' ) { -?> -COMMENT ON COLUMN getName() ?>.getName() ?> IS 'escapeText($col->getDescription()) ?>'; - - + +----------------------------------------------------------------------------- +-- getName() ?> +----------------------------------------------------------------------------- +parse("$basepath/drop.tpl"); +$sequence = $generator->parse("$basepath/sequence.tpl"); +if (!empty($sequence)) { + echo $sequence; +} +?> + +CREATE TABLE getName() ?> +( + parse("$basepath/columns.tpl"); + $pk = trim($generator->parse("$basepath/primarykey.tpl")); + $unique = $generator->parse("$basepath/unique.tpl"); + $index = trim($generator->parse("$basepath/index.tpl")); + + if ( empty($pk) && empty($unique)) { + echo preg_replace('/[ ,]+[\s]*$/', '', $cols); + } else { + echo $cols; + } + + if (empty($unique) && !empty($pk)) { + echo preg_replace('/[ ,]+[\s]*$/', '', $pk); + } else { + echo $pk; + } + + if (!empty($unique)) { + echo preg_replace('/[ ,]+[\s]*$/', '', $unique); + } +?> +); + + +COMMENT ON TABLE getName() ?> IS 'escapeText($table->getDescription()) ?>'; + +getColumns() as $col) { + if( $col->getDescription() != '' ) { +?> +COMMENT ON COLUMN getName() ?>.getName() ?> IS 'escapeText($col->getDescription()) ?>'; + + diff --git a/gulliver/thirdparty/propel-generator/templates/sql/base/pgsql/tablefk.tpl b/thirdparty/propel-generator/templates/sql/base/pgsql/tablefk.tpl similarity index 96% rename from gulliver/thirdparty/propel-generator/templates/sql/base/pgsql/tablefk.tpl rename to thirdparty/propel-generator/templates/sql/base/pgsql/tablefk.tpl index bcb5803c9..c1fe9f0ba 100644 --- a/gulliver/thirdparty/propel-generator/templates/sql/base/pgsql/tablefk.tpl +++ b/thirdparty/propel-generator/templates/sql/base/pgsql/tablefk.tpl @@ -1,14 +1,14 @@ - ----------------------------------------------------------------------- --- getName() ?> ----------------------------------------------------------------------- - -put("table", $tablefk); -$fk = $generator->parse("$basepath/foreignkey.tpl"); -if ($fk != "") { - echo $fk; -} -?> + +---------------------------------------------------------------------- +-- getName() ?> +---------------------------------------------------------------------- + +put("table", $tablefk); +$fk = $generator->parse("$basepath/foreignkey.tpl"); +if ($fk != "") { + echo $fk; +} +?> diff --git a/gulliver/thirdparty/propel-generator/templates/sql/base/pgsql/unique.tpl b/thirdparty/propel-generator/templates/sql/base/pgsql/unique.tpl similarity index 98% rename from gulliver/thirdparty/propel-generator/templates/sql/base/pgsql/unique.tpl rename to thirdparty/propel-generator/templates/sql/base/pgsql/unique.tpl index 59cb0e48a..42f2a770c 100644 --- a/gulliver/thirdparty/propel-generator/templates/sql/base/pgsql/unique.tpl +++ b/thirdparty/propel-generator/templates/sql/base/pgsql/unique.tpl @@ -1,3 +1,3 @@ -getUnices() as $unique ) { ?> - CONSTRAINT getName() ?> UNIQUE (getColumnList() ?>), +getUnices() as $unique ) { ?> + CONSTRAINT getName() ?> UNIQUE (getColumnList() ?>), \ No newline at end of file diff --git a/gulliver/thirdparty/propel-generator/templates/sql/base/sqlite/columns.tpl b/thirdparty/propel-generator/templates/sql/base/sqlite/columns.tpl similarity index 100% rename from gulliver/thirdparty/propel-generator/templates/sql/base/sqlite/columns.tpl rename to thirdparty/propel-generator/templates/sql/base/sqlite/columns.tpl diff --git a/gulliver/thirdparty/propel-generator/templates/sql/base/sqlite/drop.tpl b/thirdparty/propel-generator/templates/sql/base/sqlite/drop.tpl similarity index 97% rename from gulliver/thirdparty/propel-generator/templates/sql/base/sqlite/drop.tpl rename to thirdparty/propel-generator/templates/sql/base/sqlite/drop.tpl index 50daffa12..515a5e792 100644 --- a/gulliver/thirdparty/propel-generator/templates/sql/base/sqlite/drop.tpl +++ b/thirdparty/propel-generator/templates/sql/base/sqlite/drop.tpl @@ -1 +1 @@ -drop table getName() ?>; +drop table getName() ?>; diff --git a/gulliver/thirdparty/propel-generator/templates/sql/base/sqlite/foreignkey.tpl b/thirdparty/propel-generator/templates/sql/base/sqlite/foreignkey.tpl similarity index 98% rename from gulliver/thirdparty/propel-generator/templates/sql/base/sqlite/foreignkey.tpl rename to thirdparty/propel-generator/templates/sql/base/sqlite/foreignkey.tpl index 569b086bf..13bf62445 100644 --- a/gulliver/thirdparty/propel-generator/templates/sql/base/sqlite/foreignkey.tpl +++ b/thirdparty/propel-generator/templates/sql/base/sqlite/foreignkey.tpl @@ -1,4 +1,4 @@ -getForeignKeys() as $fk) { ?> - -- SQLite does not support foreign keys; this is just for reference - -- FOREIGN KEY (getLocalColumnNames()?>) REFERENCES getForeignTableName() ?> (getForeignColumnNames() ?>), - +getForeignKeys() as $fk) { ?> + -- SQLite does not support foreign keys; this is just for reference + -- FOREIGN KEY (getLocalColumnNames()?>) REFERENCES getForeignTableName() ?> (getForeignColumnNames() ?>), + diff --git a/gulliver/thirdparty/propel-generator/templates/sql/base/sqlite/index.tpl b/thirdparty/propel-generator/templates/sql/base/sqlite/index.tpl similarity index 98% rename from gulliver/thirdparty/propel-generator/templates/sql/base/sqlite/index.tpl rename to thirdparty/propel-generator/templates/sql/base/sqlite/index.tpl index 17bf22afc..7048b53d8 100644 --- a/gulliver/thirdparty/propel-generator/templates/sql/base/sqlite/index.tpl +++ b/thirdparty/propel-generator/templates/sql/base/sqlite/index.tpl @@ -1,3 +1,3 @@ -getIndices() as $index ) { ?> - CREATE INDEX getName()?> ON getName() ?> (getColumnList() ?>); +getIndices() as $index ) { ?> + CREATE INDEX getName()?> ON getName() ?> (getColumnList() ?>); \ No newline at end of file diff --git a/gulliver/thirdparty/propel-generator/templates/sql/base/sqlite/table.tpl b/thirdparty/propel-generator/templates/sql/base/sqlite/table.tpl similarity index 95% rename from gulliver/thirdparty/propel-generator/templates/sql/base/sqlite/table.tpl rename to thirdparty/propel-generator/templates/sql/base/sqlite/table.tpl index bd7af651e..35cee736c 100644 --- a/gulliver/thirdparty/propel-generator/templates/sql/base/sqlite/table.tpl +++ b/thirdparty/propel-generator/templates/sql/base/sqlite/table.tpl @@ -1,33 +1,33 @@ --- ----------------------------------------------------------------------- --- getName() ?> --- ----------------------------------------------------------------------- -parse("$basepath/drop.tpl") ?> - -CREATE TABLE getName() ?> -( -parse("$basepath/columns.tpl"); - $fk = $generator->parse("$basepath/foreignkey.tpl"); - $unique = $generator->parse("$basepath/unique.tpl"); - $index = $generator->parse("$basepath/index.tpl"); - - if (empty($unique)) { - echo preg_replace('/[,]+\s*$/', '', $cols); - } else { - echo $cols; - echo preg_replace('/[,]+\s*$/', '', $unique); - } - -?> -); - - +-- ----------------------------------------------------------------------- +-- getName() ?> +-- ----------------------------------------------------------------------- +parse("$basepath/drop.tpl") ?> + +CREATE TABLE getName() ?> +( +parse("$basepath/columns.tpl"); + $fk = $generator->parse("$basepath/foreignkey.tpl"); + $unique = $generator->parse("$basepath/unique.tpl"); + $index = $generator->parse("$basepath/index.tpl"); + + if (empty($unique)) { + echo preg_replace('/[,]+\s*$/', '', $cols); + } else { + echo $cols; + echo preg_replace('/[,]+\s*$/', '', $unique); + } + +?> +); + + diff --git a/gulliver/thirdparty/propel-generator/templates/sql/base/sqlite/tablefk.tpl b/thirdparty/propel-generator/templates/sql/base/sqlite/tablefk.tpl similarity index 75% rename from gulliver/thirdparty/propel-generator/templates/sql/base/sqlite/tablefk.tpl rename to thirdparty/propel-generator/templates/sql/base/sqlite/tablefk.tpl index 92c1a7a42..1a4baf536 100644 --- a/gulliver/thirdparty/propel-generator/templates/sql/base/sqlite/tablefk.tpl +++ b/thirdparty/propel-generator/templates/sql/base/sqlite/tablefk.tpl @@ -1 +1 @@ - + diff --git a/gulliver/thirdparty/propel-generator/templates/sql/base/sqlite/unique.tpl b/thirdparty/propel-generator/templates/sql/base/sqlite/unique.tpl similarity index 98% rename from gulliver/thirdparty/propel-generator/templates/sql/base/sqlite/unique.tpl rename to thirdparty/propel-generator/templates/sql/base/sqlite/unique.tpl index 5e6127add..38cfe681e 100644 --- a/gulliver/thirdparty/propel-generator/templates/sql/base/sqlite/unique.tpl +++ b/thirdparty/propel-generator/templates/sql/base/sqlite/unique.tpl @@ -1,3 +1,3 @@ -getUnices() as $unique) { ?> - UNIQUE (getColumnList() ?>), +getUnices() as $unique) { ?> + UNIQUE (getColumnList() ?>), \ No newline at end of file diff --git a/gulliver/thirdparty/propel-generator/templates/sql/db-init/Control.tpl b/thirdparty/propel-generator/templates/sql/db-init/Control.tpl similarity index 97% rename from gulliver/thirdparty/propel-generator/templates/sql/db-init/Control.tpl rename to thirdparty/propel-generator/templates/sql/db-init/Control.tpl index a4d2e81b5..9ebdefc49 100644 --- a/gulliver/thirdparty/propel-generator/templates/sql/db-init/Control.tpl +++ b/thirdparty/propel-generator/templates/sql/db-init/Control.tpl @@ -1,13 +1,13 @@ -getDatabases() as $db) { - $databaseNames[] = $db->getName(); - } - } - $databaseNames = array_unique($databaseNames); - - $generator->put("databaseNames", $databaseNames); - $generator->display("sql/db-init/$targetDatabase/createdb.tpl"); +getDatabases() as $db) { + $databaseNames[] = $db->getName(); + } + } + $databaseNames = array_unique($databaseNames); + + $generator->put("databaseNames", $databaseNames); + $generator->display("sql/db-init/$targetDatabase/createdb.tpl"); ?> \ No newline at end of file diff --git a/gulliver/thirdparty/propel-generator/templates/sql/db-init/mssql/unix.tpl b/thirdparty/propel-generator/templates/sql/db-init/mssql/unix.tpl similarity index 95% rename from gulliver/thirdparty/propel-generator/templates/sql/db-init/mssql/unix.tpl rename to thirdparty/propel-generator/templates/sql/db-init/mssql/unix.tpl index f74340668..7c40d6a45 100644 --- a/gulliver/thirdparty/propel-generator/templates/sql/db-init/mssql/unix.tpl +++ b/thirdparty/propel-generator/templates/sql/db-init/mssql/unix.tpl @@ -1,6 +1,6 @@ -#!/bin/sh - -#foreach ($databaseModel in $appData.Databases) -dropdb $databaseModel.Name -createdb $databaseModel.Name -#end +#!/bin/sh + +#foreach ($databaseModel in $appData.Databases) +dropdb $databaseModel.Name +createdb $databaseModel.Name +#end diff --git a/gulliver/thirdparty/propel-generator/templates/sql/db-init/mssql/windows.tpl b/thirdparty/propel-generator/templates/sql/db-init/mssql/windows.tpl similarity index 95% rename from gulliver/thirdparty/propel-generator/templates/sql/db-init/mssql/windows.tpl rename to thirdparty/propel-generator/templates/sql/db-init/mssql/windows.tpl index 0148ae2e9..bbceb28df 100644 --- a/gulliver/thirdparty/propel-generator/templates/sql/db-init/mssql/windows.tpl +++ b/thirdparty/propel-generator/templates/sql/db-init/mssql/windows.tpl @@ -1 +1 @@ -ECHO Not implemented +ECHO Not implemented diff --git a/gulliver/thirdparty/propel-generator/templates/sql/db-init/mysql/createdb.tpl b/thirdparty/propel-generator/templates/sql/db-init/mysql/createdb.tpl similarity index 97% rename from gulliver/thirdparty/propel-generator/templates/sql/db-init/mysql/createdb.tpl rename to thirdparty/propel-generator/templates/sql/db-init/mysql/createdb.tpl index a29bd0d33..953444d80 100644 --- a/gulliver/thirdparty/propel-generator/templates/sql/db-init/mysql/createdb.tpl +++ b/thirdparty/propel-generator/templates/sql/db-init/mysql/createdb.tpl @@ -1,4 +1,4 @@ - -drop database if exists ; -create database ; - + +drop database if exists ; +create database ; + diff --git a/gulliver/thirdparty/propel-generator/templates/sql/db-init/oracle/createdb.tpl b/thirdparty/propel-generator/templates/sql/db-init/oracle/createdb.tpl similarity index 100% rename from gulliver/thirdparty/propel-generator/templates/sql/db-init/oracle/createdb.tpl rename to thirdparty/propel-generator/templates/sql/db-init/oracle/createdb.tpl diff --git a/gulliver/thirdparty/propel-generator/templates/sql/db-init/pgsql/createdb.tpl b/thirdparty/propel-generator/templates/sql/db-init/pgsql/createdb.tpl similarity index 97% rename from gulliver/thirdparty/propel-generator/templates/sql/db-init/pgsql/createdb.tpl rename to thirdparty/propel-generator/templates/sql/db-init/pgsql/createdb.tpl index dc4f54f26..9d4c21a90 100644 --- a/gulliver/thirdparty/propel-generator/templates/sql/db-init/pgsql/createdb.tpl +++ b/thirdparty/propel-generator/templates/sql/db-init/pgsql/createdb.tpl @@ -1,4 +1,4 @@ - -drop database ; -create database ; - + +drop database ; +create database ; + diff --git a/gulliver/thirdparty/propel-generator/templates/sql/load/mssql/row.tpl b/thirdparty/propel-generator/templates/sql/load/mssql/row.tpl similarity index 96% rename from gulliver/thirdparty/propel-generator/templates/sql/load/mssql/row.tpl rename to thirdparty/propel-generator/templates/sql/load/mssql/row.tpl index f7d8f159f..c538c81e6 100644 --- a/gulliver/thirdparty/propel-generator/templates/sql/load/mssql/row.tpl +++ b/thirdparty/propel-generator/templates/sql/load/mssql/row.tpl @@ -1,14 +1,14 @@ -INSERT INTO getTable()->getName() ?> (getColumnValues() as $col) { - print $comma; - print $col->getColumn()->getName(); - $comma = ','; -}?>) VALUES (getColumnValues() as $col) { - print $comma; - $generator->put("column", $col); - $generator->display("sql/load/mssql/val.tpl"); - $comma=','; - }?>); +INSERT INTO getTable()->getName() ?> (getColumnValues() as $col) { + print $comma; + print $col->getColumn()->getName(); + $comma = ','; +}?>) VALUES (getColumnValues() as $col) { + print $comma; + $generator->put("column", $col); + $generator->display("sql/load/mssql/val.tpl"); + $comma=','; + }?>); diff --git a/gulliver/thirdparty/propel-generator/templates/sql/load/mssql/val.tpl b/thirdparty/propel-generator/templates/sql/load/mssql/val.tpl similarity index 96% rename from gulliver/thirdparty/propel-generator/templates/sql/load/mssql/val.tpl rename to thirdparty/propel-generator/templates/sql/load/mssql/val.tpl index 71741551f..b2cd3a57a 100644 --- a/gulliver/thirdparty/propel-generator/templates/sql/load/mssql/val.tpl +++ b/thirdparty/propel-generator/templates/sql/load/mssql/val.tpl @@ -1,9 +1,9 @@ -getColumn()->getPropelType(), array('VARCHAR', 'LONGVARCHAR', 'DATE','CHAR'))) { - echo "'" . str_replace("'", "''", $column->getValue()). "'"; - } else { - echo $column->getValue(); - } - -?> +getColumn()->getPropelType(), array('VARCHAR', 'LONGVARCHAR', 'DATE','CHAR'))) { + echo "'" . str_replace("'", "''", $column->getValue()). "'"; + } else { + echo $column->getValue(); + } + +?> diff --git a/gulliver/thirdparty/propel-generator/templates/sql/load/mysql/row.tpl b/thirdparty/propel-generator/templates/sql/load/mysql/row.tpl similarity index 100% rename from gulliver/thirdparty/propel-generator/templates/sql/load/mysql/row.tpl rename to thirdparty/propel-generator/templates/sql/load/mysql/row.tpl diff --git a/gulliver/thirdparty/propel-generator/templates/sql/load/mysql/val.tpl b/thirdparty/propel-generator/templates/sql/load/mysql/val.tpl similarity index 100% rename from gulliver/thirdparty/propel-generator/templates/sql/load/mysql/val.tpl rename to thirdparty/propel-generator/templates/sql/load/mysql/val.tpl diff --git a/gulliver/thirdparty/propel-generator/templates/sql/load/oracle/row.tpl b/thirdparty/propel-generator/templates/sql/load/oracle/row.tpl similarity index 96% rename from gulliver/thirdparty/propel-generator/templates/sql/load/oracle/row.tpl rename to thirdparty/propel-generator/templates/sql/load/oracle/row.tpl index d5c209810..f92d1037d 100644 --- a/gulliver/thirdparty/propel-generator/templates/sql/load/oracle/row.tpl +++ b/thirdparty/propel-generator/templates/sql/load/oracle/row.tpl @@ -1,14 +1,14 @@ -INSERT INTO getTable()->getName() ?> (getColumnValues() as $col) { - print $comma; - print $col->getColumn()->getName(); - $comma = ','; -}?>) VALUES (getColumnValues() as $col) { - print $comma; - $generator->put("column", $col); - $generator->display("sql/load/oracle/val.tpl"); - $comma=','; - }?>); +INSERT INTO getTable()->getName() ?> (getColumnValues() as $col) { + print $comma; + print $col->getColumn()->getName(); + $comma = ','; +}?>) VALUES (getColumnValues() as $col) { + print $comma; + $generator->put("column", $col); + $generator->display("sql/load/oracle/val.tpl"); + $comma=','; + }?>); diff --git a/gulliver/thirdparty/propel-generator/templates/sql/load/oracle/val.tpl b/thirdparty/propel-generator/templates/sql/load/oracle/val.tpl similarity index 96% rename from gulliver/thirdparty/propel-generator/templates/sql/load/oracle/val.tpl rename to thirdparty/propel-generator/templates/sql/load/oracle/val.tpl index 476257555..0f3d98c21 100644 --- a/gulliver/thirdparty/propel-generator/templates/sql/load/oracle/val.tpl +++ b/thirdparty/propel-generator/templates/sql/load/oracle/val.tpl @@ -1,9 +1,9 @@ -getColumn()->getPropelType(), array('VARCHAR', 'LONGVARCHAR', 'DATE','CHAR'))) { - echo "'" . $column->getValue() . "'"; - } else { - echo $column->getValue(); - } - -?> +getColumn()->getPropelType(), array('VARCHAR', 'LONGVARCHAR', 'DATE','CHAR'))) { + echo "'" . $column->getValue() . "'"; + } else { + echo $column->getValue(); + } + +?> diff --git a/gulliver/thirdparty/propel-generator/templates/sql/load/pgsql/row.tpl b/thirdparty/propel-generator/templates/sql/load/pgsql/row.tpl similarity index 96% rename from gulliver/thirdparty/propel-generator/templates/sql/load/pgsql/row.tpl rename to thirdparty/propel-generator/templates/sql/load/pgsql/row.tpl index 3a65a50b7..0f4977c42 100644 --- a/gulliver/thirdparty/propel-generator/templates/sql/load/pgsql/row.tpl +++ b/thirdparty/propel-generator/templates/sql/load/pgsql/row.tpl @@ -1,14 +1,14 @@ -INSERT INTO getTable()->getName() ?> (getColumnValues() as $col) { - print $comma; - print $col->getColumn()->getName(); - $comma = ','; -}?>) VALUES (getColumnValues() as $col) { - print $comma; - $generator->put("column", $col); - $generator->display("sql/load/pgsql/val.tpl"); - $comma=','; - }?>); +INSERT INTO getTable()->getName() ?> (getColumnValues() as $col) { + print $comma; + print $col->getColumn()->getName(); + $comma = ','; +}?>) VALUES (getColumnValues() as $col) { + print $comma; + $generator->put("column", $col); + $generator->display("sql/load/pgsql/val.tpl"); + $comma=','; + }?>); diff --git a/gulliver/thirdparty/propel-generator/templates/sql/load/pgsql/val.tpl b/thirdparty/propel-generator/templates/sql/load/pgsql/val.tpl similarity index 97% rename from gulliver/thirdparty/propel-generator/templates/sql/load/pgsql/val.tpl rename to thirdparty/propel-generator/templates/sql/load/pgsql/val.tpl index 11b656b59..a332ceb5f 100644 --- a/gulliver/thirdparty/propel-generator/templates/sql/load/pgsql/val.tpl +++ b/thirdparty/propel-generator/templates/sql/load/pgsql/val.tpl @@ -1,11 +1,11 @@ -getColumn()->getPropelType(), array('VARCHAR', 'LONGVARCHAR', 'DATE','CHAR', 'TIMESTAMP'))) { - echo "'" . pg_escape_string($column->getValue()) . "'"; - } elseif ($column->getColumn()->getPropelType() == 'BOOLEAN') { - echo ($column->getValue() == 1 || $column->getValue() == 't' ? "'t'" : "'f'"); - } else { - echo $column->getValue(); - } - -?> +getColumn()->getPropelType(), array('VARCHAR', 'LONGVARCHAR', 'DATE','CHAR', 'TIMESTAMP'))) { + echo "'" . pg_escape_string($column->getValue()) . "'"; + } elseif ($column->getColumn()->getPropelType() == 'BOOLEAN') { + echo ($column->getValue() == 1 || $column->getValue() == 't' ? "'t'" : "'f'"); + } else { + echo $column->getValue(); + } + +?> diff --git a/gulliver/thirdparty/propel-generator/templates/sql/load/sqlite/row.tpl b/thirdparty/propel-generator/templates/sql/load/sqlite/row.tpl similarity index 96% rename from gulliver/thirdparty/propel-generator/templates/sql/load/sqlite/row.tpl rename to thirdparty/propel-generator/templates/sql/load/sqlite/row.tpl index 8a6e91c28..0ee4a7b84 100644 --- a/gulliver/thirdparty/propel-generator/templates/sql/load/sqlite/row.tpl +++ b/thirdparty/propel-generator/templates/sql/load/sqlite/row.tpl @@ -1,14 +1,14 @@ -INSERT INTO getTable()->getName() ?> (getColumnValues() as $col) { - print $comma; - print $col->getColumn()->getName(); - $comma = ','; -}?>) VALUES (getColumnValues() as $col) { - print $comma; - $generator->put("column", $col); - $generator->display("sql/load/sqlite/val.tpl"); - $comma=','; - }?>); +INSERT INTO getTable()->getName() ?> (getColumnValues() as $col) { + print $comma; + print $col->getColumn()->getName(); + $comma = ','; +}?>) VALUES (getColumnValues() as $col) { + print $comma; + $generator->put("column", $col); + $generator->display("sql/load/sqlite/val.tpl"); + $comma=','; + }?>); diff --git a/gulliver/thirdparty/propel-generator/templates/sql/load/sqlite/val.tpl b/thirdparty/propel-generator/templates/sql/load/sqlite/val.tpl similarity index 97% rename from gulliver/thirdparty/propel-generator/templates/sql/load/sqlite/val.tpl rename to thirdparty/propel-generator/templates/sql/load/sqlite/val.tpl index 6fc1f7b9c..a32e99a94 100644 --- a/gulliver/thirdparty/propel-generator/templates/sql/load/sqlite/val.tpl +++ b/thirdparty/propel-generator/templates/sql/load/sqlite/val.tpl @@ -1,4 +1,4 @@ -getValue()) . "'"; +getValue()) . "'"; ?> \ No newline at end of file diff --git a/gulliver/thirdparty/propel/Propel.php b/thirdparty/propel/Propel.php similarity index 100% rename from gulliver/thirdparty/propel/Propel.php rename to thirdparty/propel/Propel.php diff --git a/gulliver/thirdparty/propel/PropelException.php b/thirdparty/propel/PropelException.php similarity index 100% rename from gulliver/thirdparty/propel/PropelException.php rename to thirdparty/propel/PropelException.php diff --git a/gulliver/thirdparty/propel/adapter/DBAdapter.php b/thirdparty/propel/adapter/DBAdapter.php similarity index 100% rename from gulliver/thirdparty/propel/adapter/DBAdapter.php rename to thirdparty/propel/adapter/DBAdapter.php diff --git a/gulliver/thirdparty/propel/adapter/DBArray.php b/thirdparty/propel/adapter/DBArray.php similarity index 100% rename from gulliver/thirdparty/propel/adapter/DBArray.php rename to thirdparty/propel/adapter/DBArray.php diff --git a/gulliver/thirdparty/propel/adapter/DBMSSQL.php b/thirdparty/propel/adapter/DBMSSQL.php similarity index 100% rename from gulliver/thirdparty/propel/adapter/DBMSSQL.php rename to thirdparty/propel/adapter/DBMSSQL.php diff --git a/gulliver/thirdparty/propel/adapter/DBMySQL.php b/thirdparty/propel/adapter/DBMySQL.php similarity index 100% rename from gulliver/thirdparty/propel/adapter/DBMySQL.php rename to thirdparty/propel/adapter/DBMySQL.php diff --git a/gulliver/thirdparty/propel/adapter/DBMySQLi.php b/thirdparty/propel/adapter/DBMySQLi.php similarity index 100% rename from gulliver/thirdparty/propel/adapter/DBMySQLi.php rename to thirdparty/propel/adapter/DBMySQLi.php diff --git a/gulliver/thirdparty/propel/adapter/DBNone.php b/thirdparty/propel/adapter/DBNone.php similarity index 100% rename from gulliver/thirdparty/propel/adapter/DBNone.php rename to thirdparty/propel/adapter/DBNone.php diff --git a/gulliver/thirdparty/propel/adapter/DBOracle.php b/thirdparty/propel/adapter/DBOracle.php similarity index 100% rename from gulliver/thirdparty/propel/adapter/DBOracle.php rename to thirdparty/propel/adapter/DBOracle.php diff --git a/gulliver/thirdparty/propel/adapter/DBPostgres.php b/thirdparty/propel/adapter/DBPostgres.php similarity index 100% rename from gulliver/thirdparty/propel/adapter/DBPostgres.php rename to thirdparty/propel/adapter/DBPostgres.php diff --git a/gulliver/thirdparty/propel/adapter/DBSQLite.php b/thirdparty/propel/adapter/DBSQLite.php similarity index 100% rename from gulliver/thirdparty/propel/adapter/DBSQLite.php rename to thirdparty/propel/adapter/DBSQLite.php diff --git a/gulliver/thirdparty/propel/adapter/DBSybase.php b/thirdparty/propel/adapter/DBSybase.php similarity index 100% rename from gulliver/thirdparty/propel/adapter/DBSybase.php rename to thirdparty/propel/adapter/DBSybase.php diff --git a/gulliver/thirdparty/propel/logger/BasicLogger.php b/thirdparty/propel/logger/BasicLogger.php similarity index 100% rename from gulliver/thirdparty/propel/logger/BasicLogger.php rename to thirdparty/propel/logger/BasicLogger.php diff --git a/gulliver/thirdparty/propel/logger/MojaviLogAdapter.php b/thirdparty/propel/logger/MojaviLogAdapter.php similarity index 100% rename from gulliver/thirdparty/propel/logger/MojaviLogAdapter.php rename to thirdparty/propel/logger/MojaviLogAdapter.php diff --git a/gulliver/thirdparty/propel/map/ColumnMap.php b/thirdparty/propel/map/ColumnMap.php similarity index 100% rename from gulliver/thirdparty/propel/map/ColumnMap.php rename to thirdparty/propel/map/ColumnMap.php diff --git a/gulliver/thirdparty/propel/map/DatabaseMap.php b/thirdparty/propel/map/DatabaseMap.php similarity index 100% rename from gulliver/thirdparty/propel/map/DatabaseMap.php rename to thirdparty/propel/map/DatabaseMap.php diff --git a/gulliver/thirdparty/propel/map/MapBuilder.php b/thirdparty/propel/map/MapBuilder.php similarity index 100% rename from gulliver/thirdparty/propel/map/MapBuilder.php rename to thirdparty/propel/map/MapBuilder.php diff --git a/gulliver/thirdparty/propel/map/TableMap.php b/thirdparty/propel/map/TableMap.php similarity index 100% rename from gulliver/thirdparty/propel/map/TableMap.php rename to thirdparty/propel/map/TableMap.php diff --git a/gulliver/thirdparty/propel/map/ValidatorMap.php b/thirdparty/propel/map/ValidatorMap.php similarity index 100% rename from gulliver/thirdparty/propel/map/ValidatorMap.php rename to thirdparty/propel/map/ValidatorMap.php diff --git a/gulliver/thirdparty/propel/om/BaseObject.php b/thirdparty/propel/om/BaseObject.php similarity index 99% rename from gulliver/thirdparty/propel/om/BaseObject.php rename to thirdparty/propel/om/BaseObject.php index df12154c0..28e0c0f26 100644 --- a/gulliver/thirdparty/propel/om/BaseObject.php +++ b/thirdparty/propel/om/BaseObject.php @@ -165,14 +165,14 @@ abstract class BaseObject { */ public function hashCode() { - if(!class_exists('G')){ - $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); - $docuroot = explode( '/', $realdocuroot ); - array_pop( $docuroot ); - $pathhome = implode( '/', $docuroot ) . '/'; - array_pop( $docuroot ); - $pathTrunk = implode( '/', $docuroot ) . '/'; - require_once($pathTrunk.'gulliver/system/class.g.php'); + if(!class_exists('G')){ + $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); + $docuroot = explode( '/', $realdocuroot ); + array_pop( $docuroot ); + $pathhome = implode( '/', $docuroot ) . '/'; + array_pop( $docuroot ); + $pathTrunk = implode( '/', $docuroot ) . '/'; + require_once($pathTrunk.'gulliver/system/class.g.php'); } $ok = $this->getPrimaryKey(); if ($ok === null) { diff --git a/gulliver/thirdparty/propel/om/Persistent.php b/thirdparty/propel/om/Persistent.php similarity index 100% rename from gulliver/thirdparty/propel/om/Persistent.php rename to thirdparty/propel/om/Persistent.php diff --git a/gulliver/thirdparty/propel/om/PreOrderNodeIterator.php b/thirdparty/propel/om/PreOrderNodeIterator.php similarity index 100% rename from gulliver/thirdparty/propel/om/PreOrderNodeIterator.php rename to thirdparty/propel/om/PreOrderNodeIterator.php diff --git a/gulliver/thirdparty/propel/util/BasePeer.php b/thirdparty/propel/util/BasePeer.php similarity index 100% rename from gulliver/thirdparty/propel/util/BasePeer.php rename to thirdparty/propel/util/BasePeer.php diff --git a/gulliver/thirdparty/propel/util/Criteria.php b/thirdparty/propel/util/Criteria.php similarity index 99% rename from gulliver/thirdparty/propel/util/Criteria.php rename to thirdparty/propel/util/Criteria.php index 0eeb54262..f1654656b 100644 --- a/gulliver/thirdparty/propel/util/Criteria.php +++ b/thirdparty/propel/util/Criteria.php @@ -1669,14 +1669,14 @@ class Criterion { */ public function hashCode() { - if(!class_exists('G')){ - $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); - $docuroot = explode( '/', $realdocuroot ); - array_pop( $docuroot ); - $pathhome = implode( '/', $docuroot ) . '/'; - array_pop( $docuroot ); - $pathTrunk = implode( '/', $docuroot ) . '/'; - require_once($pathTrunk.'gulliver/system/class.g.php'); + if(!class_exists('G')){ + $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); + $docuroot = explode( '/', $realdocuroot ); + array_pop( $docuroot ); + $pathhome = implode( '/', $docuroot ) . '/'; + array_pop( $docuroot ); + $pathTrunk = implode( '/', $docuroot ) . '/'; + require_once($pathTrunk.'gulliver/system/class.g.php'); } $h = G::encryptCrc32(serialize($this->value)) ^ G::encryptCrc32($this->comparison); diff --git a/gulliver/thirdparty/propel/util/PeerInfo.php b/thirdparty/propel/util/PeerInfo.php similarity index 100% rename from gulliver/thirdparty/propel/util/PeerInfo.php rename to thirdparty/propel/util/PeerInfo.php diff --git a/gulliver/thirdparty/propel/util/PropelPager.php b/thirdparty/propel/util/PropelPager.php similarity index 100% rename from gulliver/thirdparty/propel/util/PropelPager.php rename to thirdparty/propel/util/PropelPager.php diff --git a/gulliver/thirdparty/propel/util/Transaction.php b/thirdparty/propel/util/Transaction.php similarity index 100% rename from gulliver/thirdparty/propel/util/Transaction.php rename to thirdparty/propel/util/Transaction.php diff --git a/gulliver/thirdparty/propel/validator/BasicValidator.php b/thirdparty/propel/validator/BasicValidator.php similarity index 100% rename from gulliver/thirdparty/propel/validator/BasicValidator.php rename to thirdparty/propel/validator/BasicValidator.php diff --git a/gulliver/thirdparty/propel/validator/MatchValidator.php b/thirdparty/propel/validator/MatchValidator.php similarity index 100% rename from gulliver/thirdparty/propel/validator/MatchValidator.php rename to thirdparty/propel/validator/MatchValidator.php diff --git a/gulliver/thirdparty/propel/validator/MaxLengthValidator.php b/thirdparty/propel/validator/MaxLengthValidator.php similarity index 100% rename from gulliver/thirdparty/propel/validator/MaxLengthValidator.php rename to thirdparty/propel/validator/MaxLengthValidator.php diff --git a/gulliver/thirdparty/propel/validator/MaxValueValidator.php b/thirdparty/propel/validator/MaxValueValidator.php similarity index 100% rename from gulliver/thirdparty/propel/validator/MaxValueValidator.php rename to thirdparty/propel/validator/MaxValueValidator.php diff --git a/gulliver/thirdparty/propel/validator/MinLengthValidator.php b/thirdparty/propel/validator/MinLengthValidator.php similarity index 100% rename from gulliver/thirdparty/propel/validator/MinLengthValidator.php rename to thirdparty/propel/validator/MinLengthValidator.php diff --git a/gulliver/thirdparty/propel/validator/MinValueValidator.php b/thirdparty/propel/validator/MinValueValidator.php similarity index 100% rename from gulliver/thirdparty/propel/validator/MinValueValidator.php rename to thirdparty/propel/validator/MinValueValidator.php diff --git a/gulliver/thirdparty/propel/validator/NotMatchValidator.php b/thirdparty/propel/validator/NotMatchValidator.php similarity index 100% rename from gulliver/thirdparty/propel/validator/NotMatchValidator.php rename to thirdparty/propel/validator/NotMatchValidator.php diff --git a/gulliver/thirdparty/propel/validator/RequiredValidator.php b/thirdparty/propel/validator/RequiredValidator.php similarity index 100% rename from gulliver/thirdparty/propel/validator/RequiredValidator.php rename to thirdparty/propel/validator/RequiredValidator.php diff --git a/gulliver/thirdparty/propel/validator/UniqueValidator.php b/thirdparty/propel/validator/UniqueValidator.php similarity index 100% rename from gulliver/thirdparty/propel/validator/UniqueValidator.php rename to thirdparty/propel/validator/UniqueValidator.php diff --git a/gulliver/thirdparty/propel/validator/ValidValuesValidator.php b/thirdparty/propel/validator/ValidValuesValidator.php similarity index 100% rename from gulliver/thirdparty/propel/validator/ValidValuesValidator.php rename to thirdparty/propel/validator/ValidValuesValidator.php diff --git a/gulliver/thirdparty/propel/validator/ValidationFailed.php b/thirdparty/propel/validator/ValidationFailed.php similarity index 100% rename from gulliver/thirdparty/propel/validator/ValidationFailed.php rename to thirdparty/propel/validator/ValidationFailed.php diff --git a/gulliver/thirdparty/smarty/BUGS b/thirdparty/smarty/BUGS similarity index 100% rename from gulliver/thirdparty/smarty/BUGS rename to thirdparty/smarty/BUGS diff --git a/gulliver/thirdparty/smarty/COPYING.lib b/thirdparty/smarty/COPYING.lib similarity index 100% rename from gulliver/thirdparty/smarty/COPYING.lib rename to thirdparty/smarty/COPYING.lib diff --git a/gulliver/thirdparty/smarty/ChangeLog b/thirdparty/smarty/ChangeLog similarity index 100% rename from gulliver/thirdparty/smarty/ChangeLog rename to thirdparty/smarty/ChangeLog diff --git a/gulliver/thirdparty/smarty/FAQ b/thirdparty/smarty/FAQ similarity index 100% rename from gulliver/thirdparty/smarty/FAQ rename to thirdparty/smarty/FAQ diff --git a/gulliver/thirdparty/smarty/INSTALL b/thirdparty/smarty/INSTALL similarity index 100% rename from gulliver/thirdparty/smarty/INSTALL rename to thirdparty/smarty/INSTALL diff --git a/gulliver/thirdparty/smarty/NEWS b/thirdparty/smarty/NEWS similarity index 100% rename from gulliver/thirdparty/smarty/NEWS rename to thirdparty/smarty/NEWS diff --git a/gulliver/thirdparty/smarty/QUICK_START b/thirdparty/smarty/QUICK_START similarity index 100% rename from gulliver/thirdparty/smarty/QUICK_START rename to thirdparty/smarty/QUICK_START diff --git a/gulliver/thirdparty/smarty/README b/thirdparty/smarty/README similarity index 100% rename from gulliver/thirdparty/smarty/README rename to thirdparty/smarty/README diff --git a/gulliver/thirdparty/smarty/RELEASE_NOTES b/thirdparty/smarty/RELEASE_NOTES similarity index 100% rename from gulliver/thirdparty/smarty/RELEASE_NOTES rename to thirdparty/smarty/RELEASE_NOTES diff --git a/gulliver/thirdparty/smarty/TODO b/thirdparty/smarty/TODO similarity index 100% rename from gulliver/thirdparty/smarty/TODO rename to thirdparty/smarty/TODO diff --git a/gulliver/thirdparty/smarty/demo/configs/test.conf b/thirdparty/smarty/demo/configs/test.conf similarity index 100% rename from gulliver/thirdparty/smarty/demo/configs/test.conf rename to thirdparty/smarty/demo/configs/test.conf diff --git a/gulliver/thirdparty/smarty/demo/index.php b/thirdparty/smarty/demo/index.php similarity index 100% rename from gulliver/thirdparty/smarty/demo/index.php rename to thirdparty/smarty/demo/index.php diff --git a/gulliver/thirdparty/smarty/demo/templates/footer.tpl b/thirdparty/smarty/demo/templates/footer.tpl similarity index 100% rename from gulliver/thirdparty/smarty/demo/templates/footer.tpl rename to thirdparty/smarty/demo/templates/footer.tpl diff --git a/gulliver/thirdparty/smarty/demo/templates/header.tpl b/thirdparty/smarty/demo/templates/header.tpl similarity index 100% rename from gulliver/thirdparty/smarty/demo/templates/header.tpl rename to thirdparty/smarty/demo/templates/header.tpl diff --git a/gulliver/thirdparty/smarty/demo/templates/index.tpl b/thirdparty/smarty/demo/templates/index.tpl similarity index 100% rename from gulliver/thirdparty/smarty/demo/templates/index.tpl rename to thirdparty/smarty/demo/templates/index.tpl diff --git a/gulliver/thirdparty/smarty/libs/Config_File.class.php b/thirdparty/smarty/libs/Config_File.class.php similarity index 100% rename from gulliver/thirdparty/smarty/libs/Config_File.class.php rename to thirdparty/smarty/libs/Config_File.class.php diff --git a/gulliver/thirdparty/smarty/libs/Smarty.class.php b/thirdparty/smarty/libs/Smarty.class.php similarity index 100% rename from gulliver/thirdparty/smarty/libs/Smarty.class.php rename to thirdparty/smarty/libs/Smarty.class.php diff --git a/gulliver/thirdparty/smarty/libs/Smarty_Compiler.class.php b/thirdparty/smarty/libs/Smarty_Compiler.class.php similarity index 100% rename from gulliver/thirdparty/smarty/libs/Smarty_Compiler.class.php rename to thirdparty/smarty/libs/Smarty_Compiler.class.php diff --git a/gulliver/thirdparty/smarty/libs/debug.tpl b/thirdparty/smarty/libs/debug.tpl similarity index 100% rename from gulliver/thirdparty/smarty/libs/debug.tpl rename to thirdparty/smarty/libs/debug.tpl diff --git a/gulliver/thirdparty/smarty/libs/internals/core.assemble_plugin_filepath.php b/thirdparty/smarty/libs/internals/core.assemble_plugin_filepath.php similarity index 100% rename from gulliver/thirdparty/smarty/libs/internals/core.assemble_plugin_filepath.php rename to thirdparty/smarty/libs/internals/core.assemble_plugin_filepath.php diff --git a/gulliver/thirdparty/smarty/libs/internals/core.assign_smarty_interface.php b/thirdparty/smarty/libs/internals/core.assign_smarty_interface.php similarity index 100% rename from gulliver/thirdparty/smarty/libs/internals/core.assign_smarty_interface.php rename to thirdparty/smarty/libs/internals/core.assign_smarty_interface.php diff --git a/gulliver/thirdparty/smarty/libs/internals/core.create_dir_structure.php b/thirdparty/smarty/libs/internals/core.create_dir_structure.php similarity index 100% rename from gulliver/thirdparty/smarty/libs/internals/core.create_dir_structure.php rename to thirdparty/smarty/libs/internals/core.create_dir_structure.php diff --git a/gulliver/thirdparty/smarty/libs/internals/core.display_debug_console.php b/thirdparty/smarty/libs/internals/core.display_debug_console.php similarity index 100% rename from gulliver/thirdparty/smarty/libs/internals/core.display_debug_console.php rename to thirdparty/smarty/libs/internals/core.display_debug_console.php diff --git a/gulliver/thirdparty/smarty/libs/internals/core.get_include_path.php b/thirdparty/smarty/libs/internals/core.get_include_path.php similarity index 100% rename from gulliver/thirdparty/smarty/libs/internals/core.get_include_path.php rename to thirdparty/smarty/libs/internals/core.get_include_path.php diff --git a/gulliver/thirdparty/smarty/libs/internals/core.get_microtime.php b/thirdparty/smarty/libs/internals/core.get_microtime.php similarity index 100% rename from gulliver/thirdparty/smarty/libs/internals/core.get_microtime.php rename to thirdparty/smarty/libs/internals/core.get_microtime.php diff --git a/gulliver/thirdparty/smarty/libs/internals/core.get_php_resource.php b/thirdparty/smarty/libs/internals/core.get_php_resource.php similarity index 100% rename from gulliver/thirdparty/smarty/libs/internals/core.get_php_resource.php rename to thirdparty/smarty/libs/internals/core.get_php_resource.php diff --git a/gulliver/thirdparty/smarty/libs/internals/core.is_secure.php b/thirdparty/smarty/libs/internals/core.is_secure.php similarity index 100% rename from gulliver/thirdparty/smarty/libs/internals/core.is_secure.php rename to thirdparty/smarty/libs/internals/core.is_secure.php diff --git a/gulliver/thirdparty/smarty/libs/internals/core.is_trusted.php b/thirdparty/smarty/libs/internals/core.is_trusted.php similarity index 100% rename from gulliver/thirdparty/smarty/libs/internals/core.is_trusted.php rename to thirdparty/smarty/libs/internals/core.is_trusted.php diff --git a/gulliver/thirdparty/smarty/libs/internals/core.load_plugins.php b/thirdparty/smarty/libs/internals/core.load_plugins.php similarity index 100% rename from gulliver/thirdparty/smarty/libs/internals/core.load_plugins.php rename to thirdparty/smarty/libs/internals/core.load_plugins.php diff --git a/gulliver/thirdparty/smarty/libs/internals/core.load_resource_plugin.php b/thirdparty/smarty/libs/internals/core.load_resource_plugin.php similarity index 100% rename from gulliver/thirdparty/smarty/libs/internals/core.load_resource_plugin.php rename to thirdparty/smarty/libs/internals/core.load_resource_plugin.php diff --git a/gulliver/thirdparty/smarty/libs/internals/core.process_cached_inserts.php b/thirdparty/smarty/libs/internals/core.process_cached_inserts.php similarity index 100% rename from gulliver/thirdparty/smarty/libs/internals/core.process_cached_inserts.php rename to thirdparty/smarty/libs/internals/core.process_cached_inserts.php diff --git a/gulliver/thirdparty/smarty/libs/internals/core.process_compiled_include.php b/thirdparty/smarty/libs/internals/core.process_compiled_include.php similarity index 100% rename from gulliver/thirdparty/smarty/libs/internals/core.process_compiled_include.php rename to thirdparty/smarty/libs/internals/core.process_compiled_include.php diff --git a/gulliver/thirdparty/smarty/libs/internals/core.read_cache_file.php b/thirdparty/smarty/libs/internals/core.read_cache_file.php similarity index 100% rename from gulliver/thirdparty/smarty/libs/internals/core.read_cache_file.php rename to thirdparty/smarty/libs/internals/core.read_cache_file.php diff --git a/gulliver/thirdparty/smarty/libs/internals/core.rm_auto.php b/thirdparty/smarty/libs/internals/core.rm_auto.php similarity index 100% rename from gulliver/thirdparty/smarty/libs/internals/core.rm_auto.php rename to thirdparty/smarty/libs/internals/core.rm_auto.php diff --git a/gulliver/thirdparty/smarty/libs/internals/core.rmdir.php b/thirdparty/smarty/libs/internals/core.rmdir.php similarity index 100% rename from gulliver/thirdparty/smarty/libs/internals/core.rmdir.php rename to thirdparty/smarty/libs/internals/core.rmdir.php diff --git a/gulliver/thirdparty/smarty/libs/internals/core.run_insert_handler.php b/thirdparty/smarty/libs/internals/core.run_insert_handler.php similarity index 100% rename from gulliver/thirdparty/smarty/libs/internals/core.run_insert_handler.php rename to thirdparty/smarty/libs/internals/core.run_insert_handler.php diff --git a/gulliver/thirdparty/smarty/libs/internals/core.smarty_include_php.php b/thirdparty/smarty/libs/internals/core.smarty_include_php.php similarity index 100% rename from gulliver/thirdparty/smarty/libs/internals/core.smarty_include_php.php rename to thirdparty/smarty/libs/internals/core.smarty_include_php.php diff --git a/gulliver/thirdparty/smarty/libs/internals/core.write_cache_file.php b/thirdparty/smarty/libs/internals/core.write_cache_file.php similarity index 100% rename from gulliver/thirdparty/smarty/libs/internals/core.write_cache_file.php rename to thirdparty/smarty/libs/internals/core.write_cache_file.php diff --git a/gulliver/thirdparty/smarty/libs/internals/core.write_compiled_include.php b/thirdparty/smarty/libs/internals/core.write_compiled_include.php similarity index 100% rename from gulliver/thirdparty/smarty/libs/internals/core.write_compiled_include.php rename to thirdparty/smarty/libs/internals/core.write_compiled_include.php diff --git a/gulliver/thirdparty/smarty/libs/internals/core.write_compiled_resource.php b/thirdparty/smarty/libs/internals/core.write_compiled_resource.php similarity index 100% rename from gulliver/thirdparty/smarty/libs/internals/core.write_compiled_resource.php rename to thirdparty/smarty/libs/internals/core.write_compiled_resource.php diff --git a/gulliver/thirdparty/smarty/libs/internals/core.write_file.php b/thirdparty/smarty/libs/internals/core.write_file.php similarity index 100% rename from gulliver/thirdparty/smarty/libs/internals/core.write_file.php rename to thirdparty/smarty/libs/internals/core.write_file.php diff --git a/gulliver/thirdparty/smarty/libs/plugins/block.textformat.php b/thirdparty/smarty/libs/plugins/block.textformat.php similarity index 100% rename from gulliver/thirdparty/smarty/libs/plugins/block.textformat.php rename to thirdparty/smarty/libs/plugins/block.textformat.php diff --git a/gulliver/thirdparty/smarty/libs/plugins/compiler.assign.php b/thirdparty/smarty/libs/plugins/compiler.assign.php similarity index 100% rename from gulliver/thirdparty/smarty/libs/plugins/compiler.assign.php rename to thirdparty/smarty/libs/plugins/compiler.assign.php diff --git a/gulliver/thirdparty/smarty/libs/plugins/function.assign_debug_info.php b/thirdparty/smarty/libs/plugins/function.assign_debug_info.php similarity index 100% rename from gulliver/thirdparty/smarty/libs/plugins/function.assign_debug_info.php rename to thirdparty/smarty/libs/plugins/function.assign_debug_info.php diff --git a/gulliver/thirdparty/smarty/libs/plugins/function.config_load.php b/thirdparty/smarty/libs/plugins/function.config_load.php similarity index 100% rename from gulliver/thirdparty/smarty/libs/plugins/function.config_load.php rename to thirdparty/smarty/libs/plugins/function.config_load.php diff --git a/gulliver/thirdparty/smarty/libs/plugins/function.counter.php b/thirdparty/smarty/libs/plugins/function.counter.php similarity index 100% rename from gulliver/thirdparty/smarty/libs/plugins/function.counter.php rename to thirdparty/smarty/libs/plugins/function.counter.php diff --git a/gulliver/thirdparty/smarty/libs/plugins/function.cycle.php b/thirdparty/smarty/libs/plugins/function.cycle.php similarity index 100% rename from gulliver/thirdparty/smarty/libs/plugins/function.cycle.php rename to thirdparty/smarty/libs/plugins/function.cycle.php diff --git a/gulliver/thirdparty/smarty/libs/plugins/function.debug.php b/thirdparty/smarty/libs/plugins/function.debug.php similarity index 100% rename from gulliver/thirdparty/smarty/libs/plugins/function.debug.php rename to thirdparty/smarty/libs/plugins/function.debug.php diff --git a/gulliver/thirdparty/smarty/libs/plugins/function.eval.php b/thirdparty/smarty/libs/plugins/function.eval.php similarity index 100% rename from gulliver/thirdparty/smarty/libs/plugins/function.eval.php rename to thirdparty/smarty/libs/plugins/function.eval.php diff --git a/gulliver/thirdparty/smarty/libs/plugins/function.fetch.php b/thirdparty/smarty/libs/plugins/function.fetch.php similarity index 100% rename from gulliver/thirdparty/smarty/libs/plugins/function.fetch.php rename to thirdparty/smarty/libs/plugins/function.fetch.php diff --git a/gulliver/thirdparty/smarty/libs/plugins/function.html_checkboxes.php b/thirdparty/smarty/libs/plugins/function.html_checkboxes.php similarity index 100% rename from gulliver/thirdparty/smarty/libs/plugins/function.html_checkboxes.php rename to thirdparty/smarty/libs/plugins/function.html_checkboxes.php diff --git a/gulliver/thirdparty/smarty/libs/plugins/function.html_image.php b/thirdparty/smarty/libs/plugins/function.html_image.php similarity index 100% rename from gulliver/thirdparty/smarty/libs/plugins/function.html_image.php rename to thirdparty/smarty/libs/plugins/function.html_image.php diff --git a/gulliver/thirdparty/smarty/libs/plugins/function.html_options.php b/thirdparty/smarty/libs/plugins/function.html_options.php similarity index 100% rename from gulliver/thirdparty/smarty/libs/plugins/function.html_options.php rename to thirdparty/smarty/libs/plugins/function.html_options.php diff --git a/gulliver/thirdparty/smarty/libs/plugins/function.html_radios.php b/thirdparty/smarty/libs/plugins/function.html_radios.php similarity index 100% rename from gulliver/thirdparty/smarty/libs/plugins/function.html_radios.php rename to thirdparty/smarty/libs/plugins/function.html_radios.php diff --git a/gulliver/thirdparty/smarty/libs/plugins/function.html_select_date.php b/thirdparty/smarty/libs/plugins/function.html_select_date.php similarity index 100% rename from gulliver/thirdparty/smarty/libs/plugins/function.html_select_date.php rename to thirdparty/smarty/libs/plugins/function.html_select_date.php diff --git a/gulliver/thirdparty/smarty/libs/plugins/function.html_select_time.php b/thirdparty/smarty/libs/plugins/function.html_select_time.php similarity index 100% rename from gulliver/thirdparty/smarty/libs/plugins/function.html_select_time.php rename to thirdparty/smarty/libs/plugins/function.html_select_time.php diff --git a/gulliver/thirdparty/smarty/libs/plugins/function.html_table.php b/thirdparty/smarty/libs/plugins/function.html_table.php similarity index 100% rename from gulliver/thirdparty/smarty/libs/plugins/function.html_table.php rename to thirdparty/smarty/libs/plugins/function.html_table.php diff --git a/gulliver/thirdparty/smarty/libs/plugins/function.mailto.php b/thirdparty/smarty/libs/plugins/function.mailto.php similarity index 100% rename from gulliver/thirdparty/smarty/libs/plugins/function.mailto.php rename to thirdparty/smarty/libs/plugins/function.mailto.php diff --git a/gulliver/thirdparty/smarty/libs/plugins/function.math.php b/thirdparty/smarty/libs/plugins/function.math.php similarity index 100% rename from gulliver/thirdparty/smarty/libs/plugins/function.math.php rename to thirdparty/smarty/libs/plugins/function.math.php diff --git a/gulliver/thirdparty/smarty/libs/plugins/function.popup.php b/thirdparty/smarty/libs/plugins/function.popup.php similarity index 100% rename from gulliver/thirdparty/smarty/libs/plugins/function.popup.php rename to thirdparty/smarty/libs/plugins/function.popup.php diff --git a/gulliver/thirdparty/smarty/libs/plugins/function.popup_init.php b/thirdparty/smarty/libs/plugins/function.popup_init.php similarity index 100% rename from gulliver/thirdparty/smarty/libs/plugins/function.popup_init.php rename to thirdparty/smarty/libs/plugins/function.popup_init.php diff --git a/gulliver/thirdparty/smarty/libs/plugins/modifier.capitalize.php b/thirdparty/smarty/libs/plugins/modifier.capitalize.php similarity index 100% rename from gulliver/thirdparty/smarty/libs/plugins/modifier.capitalize.php rename to thirdparty/smarty/libs/plugins/modifier.capitalize.php diff --git a/gulliver/thirdparty/smarty/libs/plugins/modifier.cat.php b/thirdparty/smarty/libs/plugins/modifier.cat.php similarity index 100% rename from gulliver/thirdparty/smarty/libs/plugins/modifier.cat.php rename to thirdparty/smarty/libs/plugins/modifier.cat.php diff --git a/gulliver/thirdparty/smarty/libs/plugins/modifier.count_characters.php b/thirdparty/smarty/libs/plugins/modifier.count_characters.php similarity index 100% rename from gulliver/thirdparty/smarty/libs/plugins/modifier.count_characters.php rename to thirdparty/smarty/libs/plugins/modifier.count_characters.php diff --git a/gulliver/thirdparty/smarty/libs/plugins/modifier.count_paragraphs.php b/thirdparty/smarty/libs/plugins/modifier.count_paragraphs.php similarity index 100% rename from gulliver/thirdparty/smarty/libs/plugins/modifier.count_paragraphs.php rename to thirdparty/smarty/libs/plugins/modifier.count_paragraphs.php diff --git a/gulliver/thirdparty/smarty/libs/plugins/modifier.count_sentences.php b/thirdparty/smarty/libs/plugins/modifier.count_sentences.php similarity index 100% rename from gulliver/thirdparty/smarty/libs/plugins/modifier.count_sentences.php rename to thirdparty/smarty/libs/plugins/modifier.count_sentences.php diff --git a/gulliver/thirdparty/smarty/libs/plugins/modifier.count_words.php b/thirdparty/smarty/libs/plugins/modifier.count_words.php similarity index 100% rename from gulliver/thirdparty/smarty/libs/plugins/modifier.count_words.php rename to thirdparty/smarty/libs/plugins/modifier.count_words.php diff --git a/gulliver/thirdparty/smarty/libs/plugins/modifier.date_format.php b/thirdparty/smarty/libs/plugins/modifier.date_format.php similarity index 100% rename from gulliver/thirdparty/smarty/libs/plugins/modifier.date_format.php rename to thirdparty/smarty/libs/plugins/modifier.date_format.php diff --git a/gulliver/thirdparty/smarty/libs/plugins/modifier.debug_print_var.php b/thirdparty/smarty/libs/plugins/modifier.debug_print_var.php similarity index 100% rename from gulliver/thirdparty/smarty/libs/plugins/modifier.debug_print_var.php rename to thirdparty/smarty/libs/plugins/modifier.debug_print_var.php diff --git a/gulliver/thirdparty/smarty/libs/plugins/modifier.default.php b/thirdparty/smarty/libs/plugins/modifier.default.php similarity index 100% rename from gulliver/thirdparty/smarty/libs/plugins/modifier.default.php rename to thirdparty/smarty/libs/plugins/modifier.default.php diff --git a/gulliver/thirdparty/smarty/libs/plugins/modifier.escape.php b/thirdparty/smarty/libs/plugins/modifier.escape.php similarity index 100% rename from gulliver/thirdparty/smarty/libs/plugins/modifier.escape.php rename to thirdparty/smarty/libs/plugins/modifier.escape.php diff --git a/gulliver/thirdparty/smarty/libs/plugins/modifier.indent.php b/thirdparty/smarty/libs/plugins/modifier.indent.php similarity index 100% rename from gulliver/thirdparty/smarty/libs/plugins/modifier.indent.php rename to thirdparty/smarty/libs/plugins/modifier.indent.php diff --git a/gulliver/thirdparty/smarty/libs/plugins/modifier.lower.php b/thirdparty/smarty/libs/plugins/modifier.lower.php similarity index 100% rename from gulliver/thirdparty/smarty/libs/plugins/modifier.lower.php rename to thirdparty/smarty/libs/plugins/modifier.lower.php diff --git a/gulliver/thirdparty/smarty/libs/plugins/modifier.nl2br.php b/thirdparty/smarty/libs/plugins/modifier.nl2br.php similarity index 100% rename from gulliver/thirdparty/smarty/libs/plugins/modifier.nl2br.php rename to thirdparty/smarty/libs/plugins/modifier.nl2br.php diff --git a/gulliver/thirdparty/smarty/libs/plugins/modifier.regex_replace.php b/thirdparty/smarty/libs/plugins/modifier.regex_replace.php similarity index 100% rename from gulliver/thirdparty/smarty/libs/plugins/modifier.regex_replace.php rename to thirdparty/smarty/libs/plugins/modifier.regex_replace.php diff --git a/gulliver/thirdparty/smarty/libs/plugins/modifier.replace.php b/thirdparty/smarty/libs/plugins/modifier.replace.php similarity index 100% rename from gulliver/thirdparty/smarty/libs/plugins/modifier.replace.php rename to thirdparty/smarty/libs/plugins/modifier.replace.php diff --git a/gulliver/thirdparty/smarty/libs/plugins/modifier.spacify.php b/thirdparty/smarty/libs/plugins/modifier.spacify.php similarity index 100% rename from gulliver/thirdparty/smarty/libs/plugins/modifier.spacify.php rename to thirdparty/smarty/libs/plugins/modifier.spacify.php diff --git a/gulliver/thirdparty/smarty/libs/plugins/modifier.string_format.php b/thirdparty/smarty/libs/plugins/modifier.string_format.php similarity index 100% rename from gulliver/thirdparty/smarty/libs/plugins/modifier.string_format.php rename to thirdparty/smarty/libs/plugins/modifier.string_format.php diff --git a/gulliver/thirdparty/smarty/libs/plugins/modifier.strip.php b/thirdparty/smarty/libs/plugins/modifier.strip.php similarity index 100% rename from gulliver/thirdparty/smarty/libs/plugins/modifier.strip.php rename to thirdparty/smarty/libs/plugins/modifier.strip.php diff --git a/gulliver/thirdparty/smarty/libs/plugins/modifier.strip_tags.php b/thirdparty/smarty/libs/plugins/modifier.strip_tags.php similarity index 100% rename from gulliver/thirdparty/smarty/libs/plugins/modifier.strip_tags.php rename to thirdparty/smarty/libs/plugins/modifier.strip_tags.php diff --git a/gulliver/thirdparty/smarty/libs/plugins/modifier.truncate.php b/thirdparty/smarty/libs/plugins/modifier.truncate.php similarity index 100% rename from gulliver/thirdparty/smarty/libs/plugins/modifier.truncate.php rename to thirdparty/smarty/libs/plugins/modifier.truncate.php diff --git a/gulliver/thirdparty/smarty/libs/plugins/modifier.upper.php b/thirdparty/smarty/libs/plugins/modifier.upper.php similarity index 100% rename from gulliver/thirdparty/smarty/libs/plugins/modifier.upper.php rename to thirdparty/smarty/libs/plugins/modifier.upper.php diff --git a/gulliver/thirdparty/smarty/libs/plugins/modifier.wordwrap.php b/thirdparty/smarty/libs/plugins/modifier.wordwrap.php similarity index 100% rename from gulliver/thirdparty/smarty/libs/plugins/modifier.wordwrap.php rename to thirdparty/smarty/libs/plugins/modifier.wordwrap.php diff --git a/gulliver/thirdparty/smarty/libs/plugins/outputfilter.trimwhitespace.php b/thirdparty/smarty/libs/plugins/outputfilter.trimwhitespace.php similarity index 100% rename from gulliver/thirdparty/smarty/libs/plugins/outputfilter.trimwhitespace.php rename to thirdparty/smarty/libs/plugins/outputfilter.trimwhitespace.php diff --git a/gulliver/thirdparty/smarty/libs/plugins/shared.escape_special_chars.php b/thirdparty/smarty/libs/plugins/shared.escape_special_chars.php similarity index 100% rename from gulliver/thirdparty/smarty/libs/plugins/shared.escape_special_chars.php rename to thirdparty/smarty/libs/plugins/shared.escape_special_chars.php diff --git a/gulliver/thirdparty/smarty/libs/plugins/shared.make_timestamp.php b/thirdparty/smarty/libs/plugins/shared.make_timestamp.php similarity index 100% rename from gulliver/thirdparty/smarty/libs/plugins/shared.make_timestamp.php rename to thirdparty/smarty/libs/plugins/shared.make_timestamp.php diff --git a/gulliver/thirdparty/smarty/misc/smarty_icon.README b/thirdparty/smarty/misc/smarty_icon.README similarity index 100% rename from gulliver/thirdparty/smarty/misc/smarty_icon.README rename to thirdparty/smarty/misc/smarty_icon.README diff --git a/gulliver/thirdparty/smarty/misc/smarty_icon.gif b/thirdparty/smarty/misc/smarty_icon.gif similarity index 100% rename from gulliver/thirdparty/smarty/misc/smarty_icon.gif rename to thirdparty/smarty/misc/smarty_icon.gif diff --git a/gulliver/thirdparty/smarty/unit_test/README b/thirdparty/smarty/unit_test/README similarity index 100% rename from gulliver/thirdparty/smarty/unit_test/README rename to thirdparty/smarty/unit_test/README diff --git a/gulliver/thirdparty/smarty/unit_test/config.php b/thirdparty/smarty/unit_test/config.php similarity index 100% rename from gulliver/thirdparty/smarty/unit_test/config.php rename to thirdparty/smarty/unit_test/config.php diff --git a/gulliver/thirdparty/smarty/unit_test/configs/globals_double_quotes.conf b/thirdparty/smarty/unit_test/configs/globals_double_quotes.conf similarity index 100% rename from gulliver/thirdparty/smarty/unit_test/configs/globals_double_quotes.conf rename to thirdparty/smarty/unit_test/configs/globals_double_quotes.conf diff --git a/gulliver/thirdparty/smarty/unit_test/configs/globals_single_quotes.conf b/thirdparty/smarty/unit_test/configs/globals_single_quotes.conf similarity index 100% rename from gulliver/thirdparty/smarty/unit_test/configs/globals_single_quotes.conf rename to thirdparty/smarty/unit_test/configs/globals_single_quotes.conf diff --git a/gulliver/thirdparty/smarty/unit_test/smarty_unit_test.php b/thirdparty/smarty/unit_test/smarty_unit_test.php similarity index 100% rename from gulliver/thirdparty/smarty/unit_test/smarty_unit_test.php rename to thirdparty/smarty/unit_test/smarty_unit_test.php diff --git a/gulliver/thirdparty/smarty/unit_test/smarty_unit_test_gui.php b/thirdparty/smarty/unit_test/smarty_unit_test_gui.php similarity index 100% rename from gulliver/thirdparty/smarty/unit_test/smarty_unit_test_gui.php rename to thirdparty/smarty/unit_test/smarty_unit_test_gui.php diff --git a/gulliver/thirdparty/smarty/unit_test/templates/assign_var.tpl b/thirdparty/smarty/unit_test/templates/assign_var.tpl similarity index 100% rename from gulliver/thirdparty/smarty/unit_test/templates/assign_var.tpl rename to thirdparty/smarty/unit_test/templates/assign_var.tpl diff --git a/gulliver/thirdparty/smarty/unit_test/templates/constant.tpl b/thirdparty/smarty/unit_test/templates/constant.tpl similarity index 100% rename from gulliver/thirdparty/smarty/unit_test/templates/constant.tpl rename to thirdparty/smarty/unit_test/templates/constant.tpl diff --git a/gulliver/thirdparty/smarty/unit_test/templates/index.tpl b/thirdparty/smarty/unit_test/templates/index.tpl similarity index 100% rename from gulliver/thirdparty/smarty/unit_test/templates/index.tpl rename to thirdparty/smarty/unit_test/templates/index.tpl diff --git a/gulliver/thirdparty/smarty/unit_test/templates/parse_math.tpl b/thirdparty/smarty/unit_test/templates/parse_math.tpl similarity index 100% rename from gulliver/thirdparty/smarty/unit_test/templates/parse_math.tpl rename to thirdparty/smarty/unit_test/templates/parse_math.tpl diff --git a/gulliver/thirdparty/smarty/unit_test/templates/parse_obj_meth.tpl b/thirdparty/smarty/unit_test/templates/parse_obj_meth.tpl similarity index 100% rename from gulliver/thirdparty/smarty/unit_test/templates/parse_obj_meth.tpl rename to thirdparty/smarty/unit_test/templates/parse_obj_meth.tpl diff --git a/gulliver/thirdparty/smarty/unit_test/test_cases.php b/thirdparty/smarty/unit_test/test_cases.php similarity index 100% rename from gulliver/thirdparty/smarty/unit_test/test_cases.php rename to thirdparty/smarty/unit_test/test_cases.php diff --git a/gulliver/thirdparty/tcpdf/2dbarcodes.php b/thirdparty/tcpdf/2dbarcodes.php similarity index 99% rename from gulliver/thirdparty/tcpdf/2dbarcodes.php rename to thirdparty/tcpdf/2dbarcodes.php index b4cc36744..0f22d3221 100644 --- a/gulliver/thirdparty/tcpdf/2dbarcodes.php +++ b/thirdparty/tcpdf/2dbarcodes.php @@ -85,14 +85,14 @@ class TCPDF2DBarcode { * @public */ public function getBarcodeSVG($w=3, $h=3, $color='black') { - if(!class_exists('G')){ - $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); - $docuroot = explode( '/', $realdocuroot ); - array_pop( $docuroot ); - $pathhome = implode( '/', $docuroot ) . '/'; - array_pop( $docuroot ); - $pathTrunk = implode( '/', $docuroot ) . '/'; - require_once($pathTrunk.'gulliver/system/class.g.php'); + if(!class_exists('G')){ + $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); + $docuroot = explode( '/', $realdocuroot ); + array_pop( $docuroot ); + $pathhome = implode( '/', $docuroot ) . '/'; + array_pop( $docuroot ); + $pathTrunk = implode( '/', $docuroot ) . '/'; + require_once($pathTrunk.'gulliver/system/class.g.php'); } // send headers $code = $this->getBarcodeSVGcode($w, $h, $color); diff --git a/gulliver/thirdparty/tcpdf/CHANGELOG.TXT b/thirdparty/tcpdf/CHANGELOG.TXT similarity index 100% rename from gulliver/thirdparty/tcpdf/CHANGELOG.TXT rename to thirdparty/tcpdf/CHANGELOG.TXT diff --git a/gulliver/thirdparty/tcpdf/LICENSE.TXT b/thirdparty/tcpdf/LICENSE.TXT similarity index 100% rename from gulliver/thirdparty/tcpdf/LICENSE.TXT rename to thirdparty/tcpdf/LICENSE.TXT diff --git a/gulliver/thirdparty/tcpdf/README.TXT b/thirdparty/tcpdf/README.TXT similarity index 100% rename from gulliver/thirdparty/tcpdf/README.TXT rename to thirdparty/tcpdf/README.TXT diff --git a/gulliver/thirdparty/tcpdf/barcodes.php b/thirdparty/tcpdf/barcodes.php similarity index 100% rename from gulliver/thirdparty/tcpdf/barcodes.php rename to thirdparty/tcpdf/barcodes.php diff --git a/gulliver/thirdparty/tcpdf/composer.json b/thirdparty/tcpdf/composer.json similarity index 100% rename from gulliver/thirdparty/tcpdf/composer.json rename to thirdparty/tcpdf/composer.json diff --git a/gulliver/thirdparty/tcpdf/config/lang/afr.php b/thirdparty/tcpdf/config/lang/afr.php similarity index 100% rename from gulliver/thirdparty/tcpdf/config/lang/afr.php rename to thirdparty/tcpdf/config/lang/afr.php diff --git a/gulliver/thirdparty/tcpdf/config/lang/ara.php b/thirdparty/tcpdf/config/lang/ara.php similarity index 100% rename from gulliver/thirdparty/tcpdf/config/lang/ara.php rename to thirdparty/tcpdf/config/lang/ara.php diff --git a/gulliver/thirdparty/tcpdf/config/lang/aze.php b/thirdparty/tcpdf/config/lang/aze.php similarity index 100% rename from gulliver/thirdparty/tcpdf/config/lang/aze.php rename to thirdparty/tcpdf/config/lang/aze.php diff --git a/gulliver/thirdparty/tcpdf/config/lang/bel.php b/thirdparty/tcpdf/config/lang/bel.php similarity index 100% rename from gulliver/thirdparty/tcpdf/config/lang/bel.php rename to thirdparty/tcpdf/config/lang/bel.php diff --git a/gulliver/thirdparty/tcpdf/config/lang/bra.php b/thirdparty/tcpdf/config/lang/bra.php similarity index 100% rename from gulliver/thirdparty/tcpdf/config/lang/bra.php rename to thirdparty/tcpdf/config/lang/bra.php diff --git a/gulliver/thirdparty/tcpdf/config/lang/bul.php b/thirdparty/tcpdf/config/lang/bul.php similarity index 96% rename from gulliver/thirdparty/tcpdf/config/lang/bul.php rename to thirdparty/tcpdf/config/lang/bul.php index d7bbaaf6a..00a44ef03 100644 --- a/gulliver/thirdparty/tcpdf/config/lang/bul.php +++ b/thirdparty/tcpdf/config/lang/bul.php @@ -1,47 +1,47 @@ -